diff --git a/Makefile b/Makefile
index b98227b3cdace7fdabf7849386a91eb3f134a01a..12b9f0834fd93f385735da38d444435d4a92d5c9 100644
--- a/Makefile
+++ b/Makefile
@@ -19,10 +19,8 @@ SERVICERECOVERING=$(shell find $(PKGDIR) -name "recovering_middleware.go" -type
 
 # Генерация grpc-клиентов для go
 proto: protoc-check protoc-gen-go-check $(PROTOGOFILES)
-	echo "Generated all protobuf Go files"
-	echo $(ALLPROTO)
-	echo $(PROTODIR)
-	find $(PROTODIR) -name '*.proto'
+	@echo "Generate Go from proto files"
+	@find $(PROTODIR) -name '*.proto'
 
 %.pb.go: %.proto
 	@protoc -I=$(PROTODIR) --experimental_allow_proto3_optional --go_out=$(DSTDIR) --go-grpc_out=$(DSTDIR) --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative "$<"
diff --git a/Taskfile.yaml b/Taskfile.yaml
index 244b11e774703bd26b17efaeadb51d279456384e..8a16d687681a42527f9dca01dd01fef0790c0aca 100644
--- a/Taskfile.yaml
+++ b/Taskfile.yaml
@@ -1,5 +1,10 @@
 version: '3'
 
+
+vars:
+  PROTODIR: perxis-proto/proto
+  PBDIR: pb
+
 tasks:
   mocks:
     deps:
@@ -12,3 +17,32 @@ tasks:
     cmds:
       - mockery --all --dir proto --output proto/mocks
 
+
+  proto:
+    sources:
+     - '{{ .PROTODIR }}/**/*.proto'
+#    generates:
+#      - '{{ .PBDIR }}/*.go'
+    ignore_error: true # Игнорировать ошибки, из-за status/status.proto
+#    silent: true
+    cmds:
+      - for: sources
+        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
+
+
+  proto_file:
+    sources:
+      - '{{ .FILE }}'
+    cmds:
+      - '[ "{{.FILE}}" != "perxis-proto/proto/status/status.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 }}
+    silent: true
\ No newline at end of file
diff --git a/pkg/collections/mocks/CollectionCreatedObserver.go b/pkg/collections/mocks/CollectionCreatedObserver.go
new file mode 100644
index 0000000000000000000000000000000000000000..55b38993e7a3ed0d92c4d7f16047834caeb4ef3e
--- /dev/null
+++ b/pkg/collections/mocks/CollectionCreatedObserver.go
@@ -0,0 +1,54 @@
+// Code generated by mockery v2.33.3. DO NOT EDIT.
+
+package mocks
+
+import (
+	context "context"
+
+	collections "git.perx.ru/perxis/perxis-go/pkg/collections"
+
+	mock "github.com/stretchr/testify/mock"
+)
+
+// CollectionCreatedObserver is an autogenerated mock type for the CollectionCreatedObserver type
+type CollectionCreatedObserver struct {
+	mock.Mock
+}
+
+// OnCollectionCreated provides a mock function with given fields: ctx, coll
+func (_m *CollectionCreatedObserver) OnCollectionCreated(ctx context.Context, coll *collections.Collection) (string, error) {
+	ret := _m.Called(ctx, coll)
+
+	var r0 string
+	var r1 error
+	if rf, ok := ret.Get(0).(func(context.Context, *collections.Collection) (string, error)); ok {
+		return rf(ctx, coll)
+	}
+	if rf, ok := ret.Get(0).(func(context.Context, *collections.Collection) string); ok {
+		r0 = rf(ctx, coll)
+	} else {
+		r0 = ret.Get(0).(string)
+	}
+
+	if rf, ok := ret.Get(1).(func(context.Context, *collections.Collection) error); ok {
+		r1 = rf(ctx, coll)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// NewCollectionCreatedObserver creates a new instance of CollectionCreatedObserver. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
+// The first argument is typically a *testing.T value.
+func NewCollectionCreatedObserver(t interface {
+	mock.TestingT
+	Cleanup(func())
+}) *CollectionCreatedObserver {
+	mock := &CollectionCreatedObserver{}
+	mock.Mock.Test(t)
+
+	t.Cleanup(func() { mock.AssertExpectations(t) })
+
+	return mock
+}
diff --git a/pkg/collections/mocks/CollectionDeletedObserver.go b/pkg/collections/mocks/CollectionDeletedObserver.go
new file mode 100644
index 0000000000000000000000000000000000000000..a529def57ce8131e20ad9d03fc00d4038b318fff
--- /dev/null
+++ b/pkg/collections/mocks/CollectionDeletedObserver.go
@@ -0,0 +1,54 @@
+// Code generated by mockery v2.33.3. DO NOT EDIT.
+
+package mocks
+
+import (
+	context "context"
+
+	collections "git.perx.ru/perxis/perxis-go/pkg/collections"
+
+	mock "github.com/stretchr/testify/mock"
+)
+
+// CollectionDeletedObserver is an autogenerated mock type for the CollectionDeletedObserver type
+type CollectionDeletedObserver struct {
+	mock.Mock
+}
+
+// OnCollectionDeleted provides a mock function with given fields: ctx, coll
+func (_m *CollectionDeletedObserver) OnCollectionDeleted(ctx context.Context, coll *collections.Collection) (string, error) {
+	ret := _m.Called(ctx, coll)
+
+	var r0 string
+	var r1 error
+	if rf, ok := ret.Get(0).(func(context.Context, *collections.Collection) (string, error)); ok {
+		return rf(ctx, coll)
+	}
+	if rf, ok := ret.Get(0).(func(context.Context, *collections.Collection) string); ok {
+		r0 = rf(ctx, coll)
+	} else {
+		r0 = ret.Get(0).(string)
+	}
+
+	if rf, ok := ret.Get(1).(func(context.Context, *collections.Collection) error); ok {
+		r1 = rf(ctx, coll)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// NewCollectionDeletedObserver creates a new instance of CollectionDeletedObserver. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
+// The first argument is typically a *testing.T value.
+func NewCollectionDeletedObserver(t interface {
+	mock.TestingT
+	Cleanup(func())
+}) *CollectionDeletedObserver {
+	mock := &CollectionDeletedObserver{}
+	mock.Mock.Test(t)
+
+	t.Cleanup(func() { mock.AssertExpectations(t) })
+
+	return mock
+}
diff --git a/pkg/collections/mocks/CollectionPreUpdateObserver.go b/pkg/collections/mocks/CollectionPreUpdateObserver.go
new file mode 100644
index 0000000000000000000000000000000000000000..6d1fa2f25c1bb46e8143495a368ac44650375b79
--- /dev/null
+++ b/pkg/collections/mocks/CollectionPreUpdateObserver.go
@@ -0,0 +1,54 @@
+// Code generated by mockery v2.33.3. DO NOT EDIT.
+
+package mocks
+
+import (
+	context "context"
+
+	collections "git.perx.ru/perxis/perxis-go/pkg/collections"
+
+	mock "github.com/stretchr/testify/mock"
+)
+
+// CollectionPreUpdateObserver is an autogenerated mock type for the CollectionPreUpdateObserver type
+type CollectionPreUpdateObserver struct {
+	mock.Mock
+}
+
+// OnCollectionPreUpdate provides a mock function with given fields: ctx, before, coll
+func (_m *CollectionPreUpdateObserver) OnCollectionPreUpdate(ctx context.Context, before *collections.Collection, coll *collections.Collection) (string, error) {
+	ret := _m.Called(ctx, before, coll)
+
+	var r0 string
+	var r1 error
+	if rf, ok := ret.Get(0).(func(context.Context, *collections.Collection, *collections.Collection) (string, error)); ok {
+		return rf(ctx, before, coll)
+	}
+	if rf, ok := ret.Get(0).(func(context.Context, *collections.Collection, *collections.Collection) string); ok {
+		r0 = rf(ctx, before, coll)
+	} else {
+		r0 = ret.Get(0).(string)
+	}
+
+	if rf, ok := ret.Get(1).(func(context.Context, *collections.Collection, *collections.Collection) error); ok {
+		r1 = rf(ctx, before, coll)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// NewCollectionPreUpdateObserver creates a new instance of CollectionPreUpdateObserver. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
+// The first argument is typically a *testing.T value.
+func NewCollectionPreUpdateObserver(t interface {
+	mock.TestingT
+	Cleanup(func())
+}) *CollectionPreUpdateObserver {
+	mock := &CollectionPreUpdateObserver{}
+	mock.Mock.Test(t)
+
+	t.Cleanup(func() { mock.AssertExpectations(t) })
+
+	return mock
+}
diff --git a/pkg/collections/mocks/CollectionSetSchemaObserver.go b/pkg/collections/mocks/CollectionSetSchemaObserver.go
new file mode 100644
index 0000000000000000000000000000000000000000..5453aef6abf21f03075b5be16fd2e252e736d0e2
--- /dev/null
+++ b/pkg/collections/mocks/CollectionSetSchemaObserver.go
@@ -0,0 +1,54 @@
+// Code generated by mockery v2.33.3. DO NOT EDIT.
+
+package mocks
+
+import (
+	context "context"
+
+	collections "git.perx.ru/perxis/perxis-go/pkg/collections"
+
+	mock "github.com/stretchr/testify/mock"
+)
+
+// CollectionSetSchemaObserver is an autogenerated mock type for the CollectionSetSchemaObserver type
+type CollectionSetSchemaObserver struct {
+	mock.Mock
+}
+
+// OnCollectionSetSchema provides a mock function with given fields: ctx, before, coll
+func (_m *CollectionSetSchemaObserver) OnCollectionSetSchema(ctx context.Context, before *collections.Collection, coll *collections.Collection) (string, error) {
+	ret := _m.Called(ctx, before, coll)
+
+	var r0 string
+	var r1 error
+	if rf, ok := ret.Get(0).(func(context.Context, *collections.Collection, *collections.Collection) (string, error)); ok {
+		return rf(ctx, before, coll)
+	}
+	if rf, ok := ret.Get(0).(func(context.Context, *collections.Collection, *collections.Collection) string); ok {
+		r0 = rf(ctx, before, coll)
+	} else {
+		r0 = ret.Get(0).(string)
+	}
+
+	if rf, ok := ret.Get(1).(func(context.Context, *collections.Collection, *collections.Collection) error); ok {
+		r1 = rf(ctx, before, coll)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// NewCollectionSetSchemaObserver creates a new instance of CollectionSetSchemaObserver. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
+// The first argument is typically a *testing.T value.
+func NewCollectionSetSchemaObserver(t interface {
+	mock.TestingT
+	Cleanup(func())
+}) *CollectionSetSchemaObserver {
+	mock := &CollectionSetSchemaObserver{}
+	mock.Mock.Test(t)
+
+	t.Cleanup(func() { mock.AssertExpectations(t) })
+
+	return mock
+}
diff --git a/pkg/collections/mocks/CollectionUpdatedObserver.go b/pkg/collections/mocks/CollectionUpdatedObserver.go
new file mode 100644
index 0000000000000000000000000000000000000000..4a0dc34dd9abeab91d1e2219d75fddceecc1fa5b
--- /dev/null
+++ b/pkg/collections/mocks/CollectionUpdatedObserver.go
@@ -0,0 +1,54 @@
+// Code generated by mockery v2.33.3. DO NOT EDIT.
+
+package mocks
+
+import (
+	context "context"
+
+	collections "git.perx.ru/perxis/perxis-go/pkg/collections"
+
+	mock "github.com/stretchr/testify/mock"
+)
+
+// CollectionUpdatedObserver is an autogenerated mock type for the CollectionUpdatedObserver type
+type CollectionUpdatedObserver struct {
+	mock.Mock
+}
+
+// OnCollectionUpdated provides a mock function with given fields: ctx, before, after
+func (_m *CollectionUpdatedObserver) OnCollectionUpdated(ctx context.Context, before *collections.Collection, after *collections.Collection) (string, error) {
+	ret := _m.Called(ctx, before, after)
+
+	var r0 string
+	var r1 error
+	if rf, ok := ret.Get(0).(func(context.Context, *collections.Collection, *collections.Collection) (string, error)); ok {
+		return rf(ctx, before, after)
+	}
+	if rf, ok := ret.Get(0).(func(context.Context, *collections.Collection, *collections.Collection) string); ok {
+		r0 = rf(ctx, before, after)
+	} else {
+		r0 = ret.Get(0).(string)
+	}
+
+	if rf, ok := ret.Get(1).(func(context.Context, *collections.Collection, *collections.Collection) error); ok {
+		r1 = rf(ctx, before, after)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// NewCollectionUpdatedObserver creates a new instance of CollectionUpdatedObserver. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
+// The first argument is typically a *testing.T value.
+func NewCollectionUpdatedObserver(t interface {
+	mock.TestingT
+	Cleanup(func())
+}) *CollectionUpdatedObserver {
+	mock := &CollectionUpdatedObserver{}
+	mock.Mock.Test(t)
+
+	t.Cleanup(func() { mock.AssertExpectations(t) })
+
+	return mock
+}
diff --git a/pkg/extension/action.go b/pkg/extension/action.go
index 9e4247c03e42e743ddd3710dd916d1a39635c52d..d4839a8adf4698545007e296fc0c17d311de8969 100644
--- a/pkg/extension/action.go
+++ b/pkg/extension/action.go
@@ -6,11 +6,6 @@ import (
 	"github.com/mitchellh/mapstructure"
 )
 
-const (
-	ActionsCollectionID   = "space_actions"
-	ActionsCollectionName = "Настройки/Действия"
-)
-
 type (
 	ActionKind    = pb.Action_Kind
 	ResponseState = pb.ActionResponse_State
diff --git a/pkg/extension/client.go b/pkg/extension/client.go
index fc7276552f11ff086934e8d524541c77249d6d22..f2076c1b933365beaa7dc88808a3354502adedc9 100644
--- a/pkg/extension/client.go
+++ b/pkg/extension/client.go
@@ -3,18 +3,21 @@ package extension
 import (
 	"context"
 
-	"git.perx.ru/perxis/perxis-go/pkg/errors"
+	"git.perx.ru/perxis/perxis-go/pkg/operation"
 	pb "git.perx.ru/perxis/perxis-go/proto/extensions"
 	"google.golang.org/grpc"
 )
 
+// Client описывает клиент для расширений
 type Client struct {
-	client pb.ExtensionClient
+	client    pb.ExtensionServiceClient
+	opsClient operation.Client
 }
 
 func NewClient(conn *grpc.ClientConn) *Client {
 	return &Client{
-		client: pb.NewExtensionClient(conn),
+		client:    pb.NewExtensionServiceClient(conn),
+		opsClient: operation.NewClient(conn),
 	}
 }
 
@@ -22,61 +25,78 @@ func (c Client) GetDescriptor() *ExtensionDescriptor {
 	return nil
 }
 
-type results interface {
-	GetResults() []*RequestResult
-}
-
-func getErrors(out results, err, wrapErr error) error {
+func (c Client) wait(ctx context.Context, fn func(context.Context) (*operation.Proto, error)) error {
+	pbOperation, err := fn(ctx)
 	if err != nil {
 		return err
 	}
 
-	res := out.GetResults()
+	op := operation.Wrap(c.opsClient, pbOperation)
+	if err = op.Wait(ctx); err != nil {
+		return err
+	}
 
-	var errs []error
-	for _, r := range res {
-		if r.State == RequestError {
-			err := errors.New(r.GetError())
-			if msg := r.GetMsg(); msg != "" {
-				err = errors.WithDetail(err, msg)
-			}
-			errs = append(errs, ExtensionError(err, r.Extension))
-		}
+	return op.Error()
+}
 
-		if r.UpdateAvailable {
-			errs = append(errs, ExtensionError(ErrUpdateAvailable, r.Extension))
-		}
+func (c *Client) InstallOperation(ctx context.Context, req *InstallRequest) (*operation.Operation, error) {
+	pbOperation, err := c.client.Install(ctx, req)
+	if err != nil {
+		return nil, err
 	}
+	return operation.Wrap(c.opsClient, pbOperation), nil
+}
 
-	if len(errs) > 0 {
-		return errors.WithErrors(wrapErr, errs...)
+func (c *Client) Install(ctx context.Context, req *InstallRequest) error {
+	op, err := c.InstallOperation(ctx, req)
+	if err != nil {
+		return err
 	}
-
-	return nil
+	if err := op.Wait(ctx); err != nil {
+		return err
+	}
+	return op.Error()
 }
 
-func (c Client) Install(ctx context.Context, in *InstallRequest) error {
-	out, err := c.client.Install(ctx, in)
-	return getErrors(out, err, ErrInstall)
+func (c *Client) UninstallOperation(ctx context.Context, req *UninstallRequest) (*operation.Operation, error) {
+	pbOperation, err := c.client.Uninstall(ctx, req)
+	if err != nil {
+		return nil, err
+	}
+	return operation.Wrap(c.opsClient, pbOperation), nil
 }
 
-func (c Client) Check(ctx context.Context, in *CheckRequest) error {
-	out, err := c.client.Check(ctx, in)
-	return getErrors(out, err, ErrCheck)
+func (c *Client) Uninstall(ctx context.Context, req *UninstallRequest) error {
+	op, err := c.UninstallOperation(ctx, req)
+	if err != nil {
+		return err
+	}
+	if err := op.Wait(ctx); err != nil {
+		return err
+	}
+	return op.Error()
 }
 
-func (c Client) Update(ctx context.Context, in *UpdateRequest) error {
-	out, err := c.client.Update(ctx, in)
-	return getErrors(out, err, ErrUpdate)
+func (c *Client) CheckOperation(ctx context.Context, req *CheckRequest) (*operation.Operation, error) {
+	pbOperation, err := c.client.Check(ctx, req)
+	if err != nil {
+		return nil, err
+	}
+	return operation.Wrap(c.opsClient, pbOperation), nil
 }
 
-func (c Client) Uninstall(ctx context.Context, in *UninstallRequest) error {
-	out, err := c.client.Uninstall(ctx, in)
-	return getErrors(out, err, ErrUninstall)
+func (c *Client) Check(ctx context.Context, req *CheckRequest) error {
+	op, err := c.CheckOperation(ctx, req)
+	if err != nil {
+		return err
+	}
+	if err := op.Wait(ctx); err != nil {
+		return err
+	}
+	return op.Error()
 }
 
 func (c Client) Action(ctx context.Context, in *ActionRequest) (*ActionResponse, error) {
 	out, err := c.client.Action(ctx, in)
 	return out, err
-	//return ActionResponseFromPB(out), err
 }
diff --git a/pkg/extension/extension.go b/pkg/extension/extension.go
index fb8044c7a2f4c76b775840c5628319196a0493ae..1166b9d3f87d0ab711702b8b4335c32658a76d8c 100644
--- a/pkg/extension/extension.go
+++ b/pkg/extension/extension.go
@@ -11,12 +11,6 @@ import (
 )
 
 const (
-	RequestOK    = pb.ExtensionRequestResult_OK
-	RequestError = pb.ExtensionRequestResult_ERROR
-
-	ExtensionsCollectionID   = "space_extensions"
-	ExtensionsCollectionName = "Настройки/Расширения"
-
 	StatePending    = pb.SpaceExtensions_PENDING
 	StateInstalled  = pb.SpaceExtensions_INSTALLED
 	StateInProgress = pb.SpaceExtensions_IN_PROGRESS
@@ -26,15 +20,9 @@ const (
 )
 
 type (
-	InstallRequest    = pb.InstallRequest
-	InstallResponse   = pb.InstallResponse
-	CheckRequest      = pb.CheckRequest
-	CheckResponse     = pb.CheckResponse
-	UpdateRequest     = pb.UpdateRequest
-	UpdateResponse    = pb.UpdateResponse
-	UninstallRequest  = pb.UninstallRequest
-	UninstallResponse = pb.UninstallResponse
-	RequestResult     = pb.ExtensionRequestResult
+	InstallRequest   = pb.InstallRequest
+	CheckRequest     = pb.CheckRequest
+	UninstallRequest = pb.UninstallRequest
 
 	ExtensionDescriptor  = pb.ExtensionDescriptor
 	SpaceExtensionsState = pb.SpaceExtensions_State
@@ -71,9 +59,6 @@ type Extension interface {
 	// Check вызывается для проверки состояния расширения
 	Check(ctx context.Context, in *CheckRequest) error
 
-	// Update вызывается для обновления вресии расширения
-	Update(ctx context.Context, in *UpdateRequest) error
-
 	// Uninstall вызывается для удаления расширения из пространства
 	Uninstall(ctx context.Context, in *UninstallRequest) error
 
@@ -82,7 +67,7 @@ type Extension interface {
 }
 
 func CheckInstalled(ctx context.Context, content *content.Content, spaceID, envID, extension string) (bool, error) {
-	res, _, err := content.Items.Find(ctx, spaceID, envID, ExtensionsCollectionID,
+	res, _, err := content.Items.Find(ctx, spaceID, envID, StatusCollectionID,
 		&items.Filter{Q: []string{fmt.Sprintf("extension == '%s'", extension)}})
 
 	if err != nil {
diff --git a/pkg/extension/schema.go b/pkg/extension/schema.go
new file mode 100644
index 0000000000000000000000000000000000000000..3e47823172d9ed67060cf60d798de3ba33d17d52
--- /dev/null
+++ b/pkg/extension/schema.go
@@ -0,0 +1,125 @@
+package extension
+
+import (
+	"git.perx.ru/perxis/perxis-go/pkg/collections"
+	"git.perx.ru/perxis/perxis-go/pkg/references"
+	"git.perx.ru/perxis/perxis-go/pkg/schema"
+	"git.perx.ru/perxis/perxis-go/pkg/schema/field"
+	"git.perx.ru/perxis/perxis-go/pkg/schema/validate"
+	pb "git.perx.ru/perxis/perxis-go/proto/extensions"
+)
+
+const (
+	StatusCollectionID   = "space_extensions"
+	StatusCollectionName = "Настройки/Расширения"
+
+	ActionsCollectionID   = "space_actions"
+	ActionsCollectionName = "Настройки/Действия"
+)
+
+// NewActionsCollection - создает коллекцию для хранения действий расширений в пространстве
+func NewActionsCollection(spaceID, envID string) *collections.Collection {
+	return &collections.Collection{
+		ID:      ActionsCollectionID,
+		SpaceID: spaceID,
+		EnvID:   envID,
+		Name:    ActionsCollectionName,
+		Schema:  getActionsSchema(),
+		Hidden:  true,
+	}
+}
+
+func getActionsSchema() *schema.Schema {
+	enum := make([]validate.EnumOpt, len(pb.Action_Kind_name))
+	for v, n := range pb.Action_Kind_name {
+		enum[v] = validate.EnumOpt{Name: n, Value: float64(v)}
+	}
+
+	action := schema.New(
+		"extension", field.String(validate.Required()).SetTitle("Расширение").SetTextSearch(true),
+		"action", field.String(validate.Required()).SetTitle("Действия").SetTextSearch(true),
+		"name", field.String().SetTitle("Название").SetTextSearch(true),
+		"description", field.String().SetTitle("Описание"),
+		"icon", field.String().SetTitle("Название иконки"),
+		"image", references.Field([]string{"media"}).SetTitle("Изображение").
+			WithUI(&field.UI{Widget: "Media"}),
+		"groups", field.Array(field.String().SetAdditionalValues()).SetTitle("Группы").
+			SetDescription("Группировка действий в пользовательском интерфейсе").
+			WithUI(&field.UI{Widget: "SelectList"}),
+		"kind", field.Number(
+			field.NumberFormatInt,
+			validate.Enum(enum...),
+		).SetTitle("Р’РёРґ").WithUI(&field.UI{Widget: "Select"}),
+		"classes", field.Array(field.String().SetAdditionalValues()).SetTitle("Класс").
+			WithUI(&field.UI{Widget: "SelectList"}).
+			SetDescription("Классы данных, к которым применимо действие").
+			SetIndexed(true),
+		"refs", field.Array(references.Field(nil)).SetTitle("Ссылки").
+			WithUI(&field.UI{Widget: "BlockList"}),
+		"params_collection", field.String().SetTitle("Коллекция параметров").
+			SetDescription("ID коллекции для хранения параметров действия").WithUI(&field.UI{Widget: "Collection"}),
+		"navigation_action", field.Bool().SetTitle("Навигация").
+			SetDescription("Выполняется переход пользователя в пользовательском интерфейсе").
+			WithUI(&field.UI{Widget: "Checkbox"}),
+		"navigation_route", field.String().SetTitle("Путь в интерфейсе"),
+	)
+
+	// Includes
+	action.SetIncludes(
+		field.Include{Ref: "hoop_item_options", Optional: true},
+	)
+
+	//UI
+	action.Field.UI.ListView = &field.View{Options: map[string]interface{}{
+		"fields":    []string{"action", "name", "extension", "kind"},
+		"sort":      []string{"action"},
+		"page_size": 50,
+	}}
+
+	action.Field.UI.Options["title"] = "name"
+	action.Field.UI.Options["subtitle"] = "action"
+	action.Field.UI.Options["collection_icon"] = "SettingOutlined/RocketOutlined"
+
+	return action
+}
+
+// NewStatusCollection - создает коллекцию для хранения статусов расширений в пространстве
+func NewStatusCollection(spaceID, envID string) *collections.Collection {
+	sch := schema.New(
+		"id", field.String(validate.Required()).SetUnique(true).SetTitle("Расширение"),
+		"title", field.String().SetTitle("Название"),
+		"version", field.String().SetTitle("Установленная версия"),
+		"status_error", field.String().SetTitle("Ошибка"),
+		"status_msg", field.String().SetTitle("Сообщение"),
+		"extension_state", field.Number(
+			field.NumberFormatInt,
+			validate.Enum(
+				validate.EnumOpt{Name: StateInstalled.String(), Value: float64(StateInstalled)},
+				validate.EnumOpt{Name: StateFail.String(), Value: float64(StateFail)},
+				validate.EnumOpt{Name: StatePending.String(), Value: float64(StatePending)},
+				validate.EnumOpt{Name: StateInProgress.String(), Value: float64(StateInProgress)},
+			),
+		).SetTitle("Состояние").WithUI(&field.UI{Widget: "Select"}),
+	)
+
+	//UI
+	sch.Field.UI.ListView = &field.View{Options: map[string]interface{}{
+		"fields":    []string{"id", "title", "updated_at", "updated_by"},
+		"sort":      []string{"title"},
+		"page_size": 50,
+	}}
+
+	sch.Field.UI.Options["title"] = "title"
+	sch.Field.UI.Options["subtitle"] = "id"
+	sch.Field.UI.Options["key"] = "id"
+	sch.Field.UI.Options["collection_icon"] = "SettingOutlined/ApiOutlined"
+
+	return &collections.Collection{
+		ID:      StatusCollectionID,
+		SpaceID: spaceID,
+		EnvID:   envID,
+		Name:    StatusCollectionName,
+		Schema:  sch,
+		Hidden:  true,
+	}
+}
diff --git a/pkg/extension/server.go b/pkg/extension/server.go
index f9b603f50ffb6109f89551a7e3b92b5c355761d4..2d509d7620113ae7d04db9ee7900dc297cf347d2 100644
--- a/pkg/extension/server.go
+++ b/pkg/extension/server.go
@@ -2,85 +2,106 @@ package extension
 
 import (
 	"context"
+	"strings"
 
 	"git.perx.ru/perxis/perxis-go/pkg/action"
 	"git.perx.ru/perxis/perxis-go/pkg/errors"
+	"git.perx.ru/perxis/perxis-go/pkg/operation"
 	pb "git.perx.ru/perxis/perxis-go/proto/extensions"
+	"google.golang.org/protobuf/proto"
 )
 
 type Server struct {
-	services map[string]Extension
-	pb.UnimplementedExtensionServer
+	extensions map[string]Extension
+	operations operation.Service
+	pb.UnimplementedExtensionServiceServer
 }
 
 func NewServer(svc ...Extension) *Server {
 	srv := &Server{
-		services: make(map[string]Extension, len(svc)),
+		extensions: make(map[string]Extension, len(svc)),
 	}
 	for _, s := range svc {
-		srv.services[s.GetDescriptor().Extension] = s
+		srv.extensions[s.GetDescriptor().Extension] = s
 	}
+	srv.operations = operation.NewDefaultService()
 	return srv
 }
 
-func getResult(ext string, err error) *RequestResult {
-	res := new(RequestResult)
-	res.Extension = ext
-	res.State = RequestOK
-
-	if err != nil {
-		res.State = RequestError
-		res.Error = err.Error()
-		errs := errors.GetErrors(err)
-		if errs == nil {
-			errs = append(errs, err)
-		}
-		for _, e := range errs {
-			res.Msg += errors.GetDetail(e) + "\n"
+func (s *Server) getExtensions(ctx context.Context, extensions []string) ([]Extension, error) {
+	var res []Extension
+	for _, ext := range extensions {
+		e, ok := s.extensions[ext]
+		if !ok {
+			return nil, errors.Wrap(ErrUnknownExtension, ext)
 		}
+
+		res = append(res, e)
 	}
-	return res
+	return res, nil
 }
 
-func (srv *Server) getResults(extensions []string, fn func(svc Extension) error) []*RequestResult {
+func (s *Server) Install(ctx context.Context, req *InstallRequest) (*operation.Proto, error) {
+	exts, err := s.getExtensions(ctx, req.Extensions)
+	if err != nil {
+		return nil, err
+	}
 
-	var results []*RequestResult
+	desc := "Install extensions " + strings.Join(req.Extensions, ", ")
+	op, err := s.operations.Create(ctx, desc,
+		func(ctx context.Context) (proto.Message, error) {
+			for _, ext := range exts {
+				if err := ext.Install(ctx, req); err != nil {
+					return nil, errors.Wrap(err, ext.GetDescriptor().Extension)
+				}
+			}
+			return nil, nil
+		})
 
-	for _, e := range extensions {
-		svc, ok := srv.services[e]
-		if !ok {
-			results = append(results, getResult(e, ErrUnknownExtension))
-			continue
-		}
+	return op.Proto(), err
+}
 
-		err := fn(svc)
-		results = append(results, getResult(e, err))
+func (s *Server) Uninstall(ctx context.Context, req *UninstallRequest) (*operation.Proto, error) {
+	exts, err := s.getExtensions(ctx, req.Extensions)
+	if err != nil {
+		return nil, err
 	}
 
-	return results
-}
+	desc := "Uninstall extensions " + strings.Join(req.Extensions, ", ")
+	op, err := s.operations.Create(ctx, desc,
+		func(ctx context.Context) (proto.Message, error) {
+			for _, ext := range exts {
+				if err := ext.Uninstall(ctx, req); err != nil {
+					return nil, errors.Wrap(err, ext.GetDescriptor().Extension)
+				}
+			}
+			return nil, nil
+		})
 
-func (srv *Server) Install(ctx context.Context, request *InstallRequest) (*InstallResponse, error) {
-	res := srv.getResults(request.Extensions, func(svc Extension) error { return svc.Install(ctx, request) })
-	return &InstallResponse{Results: res}, nil
+	return op.Proto(), err
 }
 
-func (srv *Server) Check(ctx context.Context, request *CheckRequest) (*CheckResponse, error) {
-	res := srv.getResults(request.Extensions, func(svc Extension) error { return svc.Check(ctx, request) })
-	return &CheckResponse{Results: res}, nil
-}
+func (s *Server) Check(ctx context.Context, req *CheckRequest) (*operation.Proto, error) {
+	exts, err := s.getExtensions(ctx, req.Extensions)
+	if err != nil {
+		return nil, err
+	}
 
-func (srv *Server) Uninstall(ctx context.Context, request *UninstallRequest) (*UninstallResponse, error) {
-	res := srv.getResults(request.Extensions, func(svc Extension) error { return svc.Uninstall(ctx, request) })
-	return &UninstallResponse{Results: res}, nil
-}
+	desc := "Check extensions " + strings.Join(req.Extensions, ", ")
+	op, err := s.operations.Create(ctx, desc,
+		func(ctx context.Context) (proto.Message, error) {
+			for _, ext := range exts {
+				if err := ext.Check(ctx, req); err != nil {
+					return nil, errors.Wrap(err, ext.GetDescriptor().Extension)
+				}
+			}
+			return nil, nil
+		})
 
-func (srv *Server) Update(ctx context.Context, request *UpdateRequest) (*UpdateResponse, error) {
-	res := srv.getResults(request.Extensions, func(svc Extension) error { return svc.Update(ctx, request) })
-	return &UpdateResponse{Results: res}, nil
+	return op.Proto(), err
 }
 
-func (srv *Server) Action(ctx context.Context, in *pb.ActionRequest) (*pb.ActionResponse, error) {
+func (s *Server) Action(ctx context.Context, in *pb.ActionRequest) (*pb.ActionResponse, error) {
 	actionURL, err := action.NewURL(in.Action)
 	if err != nil {
 		return nil, err
@@ -93,7 +114,7 @@ func (srv *Server) Action(ctx context.Context, in *pb.ActionRequest) (*pb.Action
 		return nil, errors.New("extension ID required")
 	}
 
-	svc, ok := srv.services[ext]
+	svc, ok := s.extensions[in.Extension]
 	if !ok {
 		return nil, ErrUnknownExtension
 	}
@@ -113,9 +134,9 @@ func (srv *Server) Action(ctx context.Context, in *pb.ActionRequest) (*pb.Action
 	return out, nil
 }
 
-func (srv *Server) Start() error {
+func (s *Server) Start() error {
 	var errs []error
-	for _, svc := range srv.services {
+	for _, svc := range s.extensions {
 		if r, ok := svc.(Runnable); ok {
 			if err := r.Start(); err != nil {
 				errs = append(errs, err)
@@ -130,9 +151,9 @@ func (srv *Server) Start() error {
 	return nil
 }
 
-func (srv *Server) Stop() error {
+func (s *Server) Stop() error {
 	var errs []error
-	for _, svc := range srv.services {
+	for _, svc := range s.extensions {
 		if r, ok := svc.(Runnable); ok {
 			if err := r.Stop(); err != nil {
 				errs = append(errs, err)
diff --git a/pkg/extension/service/extension.go b/pkg/extension/service/extension.go
index 6d9608ab6877acdc94bfcad0bd62e5fa21eef181..370e56529f1581db74f7dd9a2df4b7ba0b5138bf 100644
--- a/pkg/extension/service/extension.go
+++ b/pkg/extension/service/extension.go
@@ -147,10 +147,6 @@ func (s *Extension) Check(ctx context.Context, in *extension.CheckRequest) error
 	return s.GetSetup(in.SpaceId, in.EnvId).Check(ctx)
 }
 
-func (s *Extension) Update(ctx context.Context, in *extension.UpdateRequest) error {
-	return s.GetSetup(in.SpaceId, in.EnvId).WithForce(in.Force).Install(ctx)
-}
-
 func (s *Extension) Uninstall(ctx context.Context, in *extension.UninstallRequest) error {
 	return s.GetSetup(in.SpaceId, in.EnvId).WithForce(in.Force).WithRemove(in.Remove).Uninstall(ctx)
 }
diff --git a/pkg/extension/storage.go b/pkg/extension/storage.go
new file mode 100644
index 0000000000000000000000000000000000000000..20e213b94be2f33ee261992c890f013a3e20ce0d
--- /dev/null
+++ b/pkg/extension/storage.go
@@ -0,0 +1,82 @@
+package extension
+
+import (
+	"context"
+
+	pb "git.perx.ru/perxis/perxis-go/proto/extensions"
+
+	"git.perx.ru/perxis/perxis-go/pkg/content"
+	"git.perx.ru/perxis/perxis-go/pkg/items"
+)
+
+type Status = pb.GetExtensionsResponse_Status
+
+// Storage описывает интерфейс хранилища состояний расширений
+type Storage interface {
+	GetStatus(ctx context.Context, spaceID, envID string, extension string) (*Status, error)
+	SetStatus(ctx context.Context, spaceID, envID string, extension string, status *Status) error
+	DeleteStatus(ctx context.Context, spaceID, envID string, extension string) error
+}
+
+type storage struct {
+	content *content.Content
+}
+
+func NewStorage(content *content.Content) Storage {
+	return &storage{content: content}
+}
+
+// GetStatus возвращает состояние расширения в пространстве
+func (s *storage) GetStatus(ctx context.Context, spaceID, envID string, extension string) (*Status, error) {
+	res, err := s.content.Items.Get(ctx, spaceID, envID, StatusCollectionID, extension)
+
+	if err != nil {
+		return nil, err
+	}
+
+	d := res.Data
+
+	msg, _ := d["status_msg"].(string)
+	errmsg, _ := d["status_error"].(string)
+	ver, _ := d["version"].(string)
+
+	return &Status{
+		Msg:              msg,
+		Error:            errmsg,
+		Installed:        true,
+		InstalledVersion: ver,
+	}, nil
+}
+
+// SetStatus устанавливает состояние расширения в пространстве
+func (s *storage) SetStatus(ctx context.Context, spaceID, envID string, extension string, status *Status) error {
+	item := &items.Item{
+		ID:           extension,
+		SpaceID:      spaceID,
+		EnvID:        envID,
+		CollectionID: StatusCollectionID,
+	}
+
+	item.Set("version", status.InstalledVersion)
+	item.Set("status_msg", status.Msg)
+	item.Set("status_error", status.Error)
+
+	i, _ := s.content.Items.Get(ctx, spaceID, envID, StatusCollectionID, extension)
+	if i == nil {
+		_, err := s.content.Items.Create(ctx, i)
+		return err
+	}
+
+	return s.content.Items.Update(ctx, i)
+}
+
+// DeleteStatus удаляет состояние расширения в пространстве (при удалении расширения)
+func (s *storage) DeleteStatus(ctx context.Context, spaceID, envID string, extension string) error {
+	item := &items.Item{
+		ID:           extension,
+		SpaceID:      spaceID,
+		EnvID:        envID,
+		CollectionID: StatusCollectionID,
+	}
+	return s.content.Items.Delete(ctx, item)
+}
diff --git a/pkg/items/mocks/Decoder.go b/pkg/items/mocks/Decoder.go
new file mode 100644
index 0000000000000000000000000000000000000000..b1dbd9aa526cf4fe4a62d29f652c3e2a513924b3
--- /dev/null
+++ b/pkg/items/mocks/Decoder.go
@@ -0,0 +1,41 @@
+// Code generated by mockery v2.33.3. DO NOT EDIT.
+
+package mocks
+
+import (
+	items "git.perx.ru/perxis/perxis-go/pkg/items"
+	mock "github.com/stretchr/testify/mock"
+)
+
+// Decoder is an autogenerated mock type for the Decoder type
+type Decoder struct {
+	mock.Mock
+}
+
+// Decode provides a mock function with given fields: value, item
+func (_m *Decoder) Decode(value interface{}, item *items.Item) error {
+	ret := _m.Called(value, item)
+
+	var r0 error
+	if rf, ok := ret.Get(0).(func(interface{}, *items.Item) error); ok {
+		r0 = rf(value, item)
+	} else {
+		r0 = ret.Error(0)
+	}
+
+	return r0
+}
+
+// NewDecoder creates a new instance of Decoder. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
+// The first argument is typically a *testing.T value.
+func NewDecoder(t interface {
+	mock.TestingT
+	Cleanup(func())
+}) *Decoder {
+	mock := &Decoder{}
+	mock.Mock.Test(t)
+
+	t.Cleanup(func() { mock.AssertExpectations(t) })
+
+	return mock
+}
diff --git a/pkg/items/mocks/Encoder.go b/pkg/items/mocks/Encoder.go
new file mode 100644
index 0000000000000000000000000000000000000000..c19203b2448930eb75e62195837a1b22cd9cfe42
--- /dev/null
+++ b/pkg/items/mocks/Encoder.go
@@ -0,0 +1,53 @@
+// Code generated by mockery v2.33.3. DO NOT EDIT.
+
+package mocks
+
+import (
+	items "git.perx.ru/perxis/perxis-go/pkg/items"
+	mock "github.com/stretchr/testify/mock"
+)
+
+// Encoder is an autogenerated mock type for the Encoder type
+type Encoder struct {
+	mock.Mock
+}
+
+// Encode provides a mock function with given fields: item
+func (_m *Encoder) Encode(item *items.Item) (interface{}, error) {
+	ret := _m.Called(item)
+
+	var r0 interface{}
+	var r1 error
+	if rf, ok := ret.Get(0).(func(*items.Item) (interface{}, error)); ok {
+		return rf(item)
+	}
+	if rf, ok := ret.Get(0).(func(*items.Item) interface{}); ok {
+		r0 = rf(item)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(interface{})
+		}
+	}
+
+	if rf, ok := ret.Get(1).(func(*items.Item) error); ok {
+		r1 = rf(item)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// NewEncoder creates a new instance of Encoder. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
+// The first argument is typically a *testing.T value.
+func NewEncoder(t interface {
+	mock.TestingT
+	Cleanup(func())
+}) *Encoder {
+	mock := &Encoder{}
+	mock.Mock.Test(t)
+
+	t.Cleanup(func() { mock.AssertExpectations(t) })
+
+	return mock
+}
diff --git a/pkg/operation/operation.go b/pkg/operation/operation.go
index ae2731ec0d3c3908b14de7df7467578819c07e02..fdecd1ed4f65a80aec3b370c472b9c27255e50f7 100644
--- a/pkg/operation/operation.go
+++ b/pkg/operation/operation.go
@@ -20,6 +20,10 @@ const DefaultPollInterval = time.Second
 type Client = common.OperationServiceClient
 type Proto = common.Operation
 
+func NewClient(conn *grpc.ClientConn) Client {
+	return common.NewOperationServiceClient(conn)
+}
+
 // Operation обертка над `common.Operation` для работы с продолжительными операциями.
 // Позволяет получить результат операции, проверить статус, отменить операцию
 type Operation struct {
@@ -27,9 +31,7 @@ type Operation struct {
 	client Client
 
 	retention  time.Duration
-	cancelFunc func(ctx context.Context)
-
-	newTimer func(time.Duration) (func() <-chan time.Time, func() bool)
+	cancelFunc func()
 }
 
 // New создает новую операцию
@@ -49,9 +51,8 @@ func Wrap(client Client, proto *Proto) *Operation {
 	}
 
 	return &Operation{
-		proto:    proto,
-		client:   client,
-		newTimer: time.NewTimer(),
+		proto:  proto,
+		client: client,
 	}
 }
 
@@ -113,6 +114,19 @@ func (o *Operation) SetCreatedAt(t time.Time) {
 	o.proto.CreatedAt = timestamppb.New(t)
 }
 
+// IsExpired возвращает true если операция просрочена
+func (o *Operation) IsExpired() bool {
+	createdAt := o.CreatedAt()
+	if o.retention != 0 && !createdAt.IsZero() && time.Since(createdAt) > o.retention {
+		return true
+	}
+	return false
+}
+
+func (o *Operation) SetModifiedAt(t time.Time) {
+	o.proto.ModifiedAt = timestamppb.New(t)
+}
+
 // SetResponse устанавливает результат операции
 func (o *Operation) SetResponse(m proto.Message) error {
 	resp, err := anypb.New(m)
@@ -126,14 +140,13 @@ func (o *Operation) SetResponse(m proto.Message) error {
 }
 
 // SetCancelFunc устанавливает функцию отмены операции
-func (o *Operation) SetCancelFunc(cancelFunc func(ctx context.Context)) {
+func (o *Operation) SetCancelFunc(cancelFunc func()) {
 	o.cancelFunc = cancelFunc
 }
 
 // SetError устанавливает ошибку операции
 func (o *Operation) SetError(err error) {
 	o.proto.Result = &common.Operation_Error{Error: err.Error()}
-	o.proto.Done = true
 }
 
 // Error возвращает ошибку операции
@@ -144,20 +157,15 @@ func (o *Operation) Error() error {
 	return nil
 }
 
+func (o *Operation) SetDone(done bool) {
+	o.proto.Done = done
+}
+
 // SetRetention устанавливает время хранения операции
 func (o *Operation) SetRetention(retention time.Duration) {
 	o.retention = retention
 }
 
-// IsExpired возвращает true если операция просрочена
-func (o *Operation) IsExpired() bool {
-	createdAt := o.CreatedAt()
-	if o.retention != 0 && !createdAt.IsZero() && time.Since(createdAt) > o.retention {
-		return true
-	}
-	return false
-}
-
 // Cancel отменяет операцию
 func (o *Operation) Cancel() error {
 	req := &common.CancelOperationRequest{OperationId: o.Id()}
@@ -182,15 +190,13 @@ func (o *Operation) Poll(ctx context.Context, opts ...grpc.CallOption) error {
 
 // Wait ожидает завершения операции
 func (o *Operation) Wait(ctx context.Context, opts ...grpc.CallOption) error {
-	return o.waitInterval(ctx, DefaultPollInterval, opts...)
+	return o.WaitInterval(ctx, DefaultPollInterval, opts...)
 }
 
 // waitInterval ожидает завершения операции с указанным интервалом опроса
-func (o *Operation) waitInterval(ctx context.Context, pollInterval time.Duration, opts ...grpc.CallOption) error {
+func (o *Operation) WaitInterval(ctx context.Context, pollInterval time.Duration, opts ...grpc.CallOption) error {
 	for !o.IsDone() {
-		err := o.Poll(ctx, opts...)
-
-		if err != nil {
+		if err := o.Poll(ctx, opts...); err != nil {
 			return errors.Wrap(err, "operation poll fail")
 		}
 
@@ -199,11 +205,11 @@ func (o *Operation) waitInterval(ctx context.Context, pollInterval time.Duration
 		}
 
 		interval := pollInterval
-		wait, stop := o.newTimer(interval)
+		timer := time.NewTimer(interval)
 		select {
-		case <-wait():
+		case <-timer.C:
 		case <-ctx.Done():
-			stop()
+			timer.Stop()
 			return errors.Wrap(ctx.Err(), "operation wait timeout")
 		}
 	}
diff --git a/pkg/operation/operation_test.go b/pkg/operation/operation_test.go
index e769214556d16b91b24974de90bef8ab20554a0c..3c42657bf206cdc5f1b638325c55fa18260c90c5 100644
--- a/pkg/operation/operation_test.go
+++ b/pkg/operation/operation_test.go
@@ -6,6 +6,10 @@ import (
 	"testing"
 	"time"
 
+	"github.com/stretchr/testify/require"
+
+	"git.perx.ru/perxis/perxis-go/proto/common"
+
 	"github.com/stretchr/testify/mock"
 
 	"git.perx.ru/perxis/perxis-go/proto/mocks"
@@ -30,21 +34,61 @@ func TestOperation(t *testing.T) {
 }
 
 func TestOperation_Wait(t *testing.T) {
-	count := 0
+	var count int
 	client := &mocks.OperationServiceClient{}
-	client.On("Get", mock.Anything, mock.Anything, mock.Anything).Run(func(args mock.Arguments) {
-		fmt.Println(count)
+	call := client.On("Get", mock.Anything, mock.Anything, mock.Anything)
+	call.Run(func(args mock.Arguments) {
+		r := args.Get(1).(*common.GetOperationRequest)
+		require.Equal(t, "test", r.OperationId)
+		p := &Proto{
+			Id:          "test",
+			Description: fmt.Sprintf("count=%d", count),
+		}
+
+		if count == 10 {
+			p.Done = true
+		}
+
+		call.Return(p, nil)
 		count++
-	}).Return(&Proto{Id: "test"}, nil)
+	})
+
+	t.Run("Ok", func(t *testing.T) {
+		count = 0
+		op := Wrap(client, &Proto{
+			Id: "test",
+		})
+
+		ctx, cancel := context.WithTimeout(context.Background(), time.Second)
+		defer cancel()
 
-	op := Wrap(client, &Proto{
-		Id: "test",
+		err := op.WaitInterval(ctx, time.Millisecond*10)
+		assert.NoError(t, err)
 	})
-	assert.NotNil(t, op)
 
-	ctx, cancel := context.WithTimeout(context.Background(), time.Second)
-	defer cancel()
+	t.Run("Timeout", func(t *testing.T) {
+		count = 0
+		op := Wrap(client, &Proto{
+			Id: "test",
+		})
+
+		ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond*30)
+		defer cancel()
+
+		err := op.WaitInterval(ctx, time.Millisecond*10)
+		assert.ErrorIs(t, err, context.DeadlineExceeded)
+	})
 
-	assert.Error(t, op.Wait(ctx))
-	mock.AssertExpectationsForObjects(t, client)
+	t.Run("Cancel", func(t *testing.T) {
+		count = 0
+		op := Wrap(client, &Proto{
+			Id: "test",
+		})
+
+		ctx, cancel := context.WithTimeout(context.Background(), time.Second)
+		time.AfterFunc(time.Millisecond*30, cancel)
+
+		err := op.WaitInterval(ctx, time.Millisecond*10)
+		assert.ErrorIs(t, err, context.Canceled)
+	})
 }
diff --git a/pkg/operation/service.go b/pkg/operation/service.go
index 2bf8282899167d10cd7e21e319da9fcc75d692a1..93de883a3520dedc2450aa3b135cc705b6efbc88 100644
--- a/pkg/operation/service.go
+++ b/pkg/operation/service.go
@@ -5,7 +5,9 @@ import (
 	"sync"
 	"time"
 
+	"git.perx.ru/perxis/perxis-go/pkg/auth"
 	"git.perx.ru/perxis/perxis-go/pkg/errors"
+	"google.golang.org/protobuf/proto"
 )
 
 const (
@@ -13,10 +15,22 @@ const (
 	DefaultCleanupInterval = time.Minute
 )
 
+// Service интерфейс сервиса для работы с продолжительными операциями
 type Service interface {
+
+	// Create создает новую операцию и запускает ее в фоне
+	Create(ctx context.Context, desc string, fn func(ctx context.Context) (proto.Message, error)) (*Operation, error)
+
+	// Set сохраняет операцию в хранилище
 	Set(ctx context.Context, op *Operation) error
+
+	// Get возвращает операцию по ее идентификатору
 	Get(ctx context.Context, id string) (*Operation, error)
+
+	// Cancel отменяет операцию по ее идентификатору
 	Cancel(ctx context.Context, id string) (*Operation, error)
+
+	// Cleanup удаляет просроченные операции
 	Cleanup()
 }
 
@@ -71,9 +85,8 @@ func (s *service) Set(_ context.Context, op *Operation) error {
 	}
 
 	s.mu.Lock()
-	defer s.mu.Unlock()
-
 	s.ops[op.Id()] = op
+	s.mu.Unlock()
 
 	s.CleanupIfNeeded()
 	return nil
@@ -92,7 +105,7 @@ func (s *service) Get(_ context.Context, id string) (*Operation, error) {
 
 // Cancel отменяет операцию по ее идентификатору
 func (s *service) Cancel(ctx context.Context, id string) (*Operation, error) {
-	s.mu.Lock()
+	s.mu.RLock()
 	defer s.mu.Unlock()
 	op, ok := s.ops[id]
 	if !ok {
@@ -100,8 +113,36 @@ func (s *service) Cancel(ctx context.Context, id string) (*Operation, error) {
 	}
 
 	if op.cancelFunc != nil {
-		op.cancelFunc(ctx)
+		op.cancelFunc()
 	}
 
 	return op, nil
 }
+
+func (s *service) Create(ctx context.Context, desc string, fn func(ctx context.Context) (proto.Message, error)) (*Operation, error) {
+	principal := auth.GetPrincipal(ctx)
+	op := New(&Proto{
+		Description: desc,
+		CreatedBy:   principal.GetID(ctx),
+	})
+
+	// Создаем новый контекст для фоновой операции без Deadline
+	opCtx, cancel := context.WithCancel(auth.WithPrincipal(context.Background(), principal))
+	op.SetCancelFunc(cancel)
+	s.Set(opCtx, op)
+
+	go func() {
+		response, err := fn(opCtx)
+		if err != nil {
+			op.SetError(err)
+		}
+		if response != nil {
+			op.SetResponse(response)
+		}
+		op.SetModifiedAt(time.Now())
+		op.SetDone(true)
+		s.Set(opCtx, op)
+	}()
+
+	return op, nil
+}
diff --git a/proto/clients/clients.pb.go b/proto/clients/clients.pb.go
index 4c75762d6119e199e3113a4086a198f102ef09aa..a492dbad2bd2bfa0dd320e869f28f9b1ea5146fd 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.31.0
-// 	protoc        v4.23.4
+// 	protoc        v4.24.3
 // source: clients/clients.proto
 
 package clients
diff --git a/proto/clients/clients_grpc.pb.go b/proto/clients/clients_grpc.pb.go
index 9b701db881a10acc1021de4e49cbf3b5ff4acd8a..f8fdf0cda264fa6e99aa20ecf495050dc1231fc7 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             v4.23.4
+// - protoc             v4.24.3
 // source: clients/clients.proto
 
 package clients
diff --git a/proto/collaborators/collaborators.pb.go b/proto/collaborators/collaborators.pb.go
index 0e35a00e51a759c48db1aae8e683f04083e7c672..e07247b5dce02708390f23a576462dcb965b772d 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.29.0
-// 	protoc        v3.21.12
+// 	protoc-gen-go v1.31.0
+// 	protoc        v4.24.3
 // source: collaborators/collaborators.proto
 
 package collaborators
diff --git a/proto/collaborators/collaborators_grpc.pb.go b/proto/collaborators/collaborators_grpc.pb.go
index 71a9d8a059f7851368d6a4467e2962657ef648a4..47ff522c1b57c72665fbca4741f698e6bb97b80f 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.3.0
-// - protoc             v3.21.12
+// - protoc             v4.24.3
 // source: collaborators/collaborators.proto
 
 package collaborators
diff --git a/proto/collections/collections.pb.go b/proto/collections/collections.pb.go
index 71712728599d799f2bbeb975196a8fc75b77e042..225e67abf5eb63d4fd92fbe1593ebb6d645f6280 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.31.0
-// 	protoc        v4.23.4
+// 	protoc        v4.24.3
 // source: collections/collections.proto
 
 package collections
diff --git a/proto/collections/collections_grpc.pb.go b/proto/collections/collections_grpc.pb.go
index eef27369eed0b0501ee45365e6195e4c52ea85c5..f0ccc6b2725c15048c8bfa812a5ea6f42aa8e2e4 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             v4.23.4
+// - protoc             v4.24.3
 // source: collections/collections.proto
 
 package collections
diff --git a/proto/common/common.pb.go b/proto/common/common.pb.go
index c0c2391032978279a1e7fa3c46d5bc1d9bb11eb6..770194bc62fe07eb05880a41f5ecc0e8d34c2e69 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.29.0
-// 	protoc        v3.21.12
+// 	protoc-gen-go v1.31.0
+// 	protoc        v4.24.3
 // source: common/common.proto
 
 package common
diff --git a/proto/delivery/delivery.pb.go b/proto/delivery/delivery.pb.go
index 142adddfaed2fc36900ff4e056b8df6396ec83df..a8673b3e6f8ded57f397a25ca78ae7538d3351ee 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.29.0
-// 	protoc        v3.21.12
+// 	protoc-gen-go v1.31.0
+// 	protoc        v4.24.3
 // source: delivery/delivery.proto
 
 package delivery
diff --git a/proto/delivery/delivery_grpc.pb.go b/proto/delivery/delivery_grpc.pb.go
index 9be07eae1c2e3938c618692fd0a7a80ba68ee432..3840ca0fc32236f38b8c92eac59c56994996be23 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.3.0
-// - protoc             v3.21.12
+// - protoc             v4.24.3
 // source: delivery/delivery.proto
 
 package delivery
diff --git a/proto/environments/environments.pb.go b/proto/environments/environments.pb.go
index cec837936e68784f4edc1615f8139194fb1e7027..8dd2d620cd51e0df031c738d8409585481974062 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.31.0
-// 	protoc        v4.23.4
+// 	protoc        v4.24.3
 // source: environments/environments.proto
 
 package environments
diff --git a/proto/environments/environments_grpc.pb.go b/proto/environments/environments_grpc.pb.go
index c71798565954f2f7cfc10b170fa34e31c1ae6abe..63268a0ba508b1e00b189a7588573fd12c47c0fb 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             v4.23.4
+// - protoc             v4.24.3
 // source: environments/environments.proto
 
 package environments
diff --git a/proto/extensions/extension.pb.go b/proto/extensions/extension.pb.go
index a74f1cea28680560beea1a8e6a08db8c70342ecf..fb16b2260731d272b9c53e7d685af14f9734a67a 100644
--- a/proto/extensions/extension.pb.go
+++ b/proto/extensions/extension.pb.go
@@ -11,7 +11,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
 // 	protoc-gen-go v1.31.0
-// 	protoc        v4.23.4
+// 	protoc        v4.24.3
 // source: extensions/extension.proto
 
 package extensions
@@ -96,165 +96,6 @@ func (Target) EnumDescriptor() ([]byte, []int) {
 	return file_extensions_extension_proto_rawDescGZIP(), []int{0}
 }
 
-type ExtensionRequestResult_State int32
-
-const (
-	ExtensionRequestResult_OK                  ExtensionRequestResult_State = 0 // Запрос завершен
-	ExtensionRequestResult_ERROR               ExtensionRequestResult_State = 1 // Возникла ошибка
-	ExtensionRequestResult_PENDING             ExtensionRequestResult_State = 2 // Запрос ожидает выполнения
-	ExtensionRequestResult_IN_PROGRESS         ExtensionRequestResult_State = 3 // Запрос выполняется
-	ExtensionRequestResult_PARAMETERS_REQUIRED ExtensionRequestResult_State = 4 // Требуются дополнительные данные для выполнения запроса
-)
-
-// Enum value maps for ExtensionRequestResult_State.
-var (
-	ExtensionRequestResult_State_name = map[int32]string{
-		0: "OK",
-		1: "ERROR",
-		2: "PENDING",
-		3: "IN_PROGRESS",
-		4: "PARAMETERS_REQUIRED",
-	}
-	ExtensionRequestResult_State_value = map[string]int32{
-		"OK":                  0,
-		"ERROR":               1,
-		"PENDING":             2,
-		"IN_PROGRESS":         3,
-		"PARAMETERS_REQUIRED": 4,
-	}
-)
-
-func (x ExtensionRequestResult_State) Enum() *ExtensionRequestResult_State {
-	p := new(ExtensionRequestResult_State)
-	*p = x
-	return p
-}
-
-func (x ExtensionRequestResult_State) String() string {
-	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
-}
-
-func (ExtensionRequestResult_State) Descriptor() protoreflect.EnumDescriptor {
-	return file_extensions_extension_proto_enumTypes[1].Descriptor()
-}
-
-func (ExtensionRequestResult_State) Type() protoreflect.EnumType {
-	return &file_extensions_extension_proto_enumTypes[1]
-}
-
-func (x ExtensionRequestResult_State) Number() protoreflect.EnumNumber {
-	return protoreflect.EnumNumber(x)
-}
-
-// Deprecated: Use ExtensionRequestResult_State.Descriptor instead.
-func (ExtensionRequestResult_State) EnumDescriptor() ([]byte, []int) {
-	return file_extensions_extension_proto_rawDescGZIP(), []int{1, 0}
-}
-
-type ActionResponse_State int32
-
-const (
-	ActionResponse_DONE                ActionResponse_State = 0 // Запрос завершен
-	ActionResponse_ERROR               ActionResponse_State = 1 // Возникла ошибка
-	ActionResponse_PENDING             ActionResponse_State = 2 // Запрос ожидает выполнения
-	ActionResponse_IN_PROGRESS         ActionResponse_State = 3 // Запрос выполняется
-	ActionResponse_PARAMETERS_REQUIRED ActionResponse_State = 4 // Требуются дополнительные данные для выполнения запроса
-)
-
-// Enum value maps for ActionResponse_State.
-var (
-	ActionResponse_State_name = map[int32]string{
-		0: "DONE",
-		1: "ERROR",
-		2: "PENDING",
-		3: "IN_PROGRESS",
-		4: "PARAMETERS_REQUIRED",
-	}
-	ActionResponse_State_value = map[string]int32{
-		"DONE":                0,
-		"ERROR":               1,
-		"PENDING":             2,
-		"IN_PROGRESS":         3,
-		"PARAMETERS_REQUIRED": 4,
-	}
-)
-
-func (x ActionResponse_State) Enum() *ActionResponse_State {
-	p := new(ActionResponse_State)
-	*p = x
-	return p
-}
-
-func (x ActionResponse_State) String() string {
-	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
-}
-
-func (ActionResponse_State) Descriptor() protoreflect.EnumDescriptor {
-	return file_extensions_extension_proto_enumTypes[2].Descriptor()
-}
-
-func (ActionResponse_State) Type() protoreflect.EnumType {
-	return &file_extensions_extension_proto_enumTypes[2]
-}
-
-func (x ActionResponse_State) Number() protoreflect.EnumNumber {
-	return protoreflect.EnumNumber(x)
-}
-
-// Deprecated: Use ActionResponse_State.Descriptor instead.
-func (ActionResponse_State) EnumDescriptor() ([]byte, []int) {
-	return file_extensions_extension_proto_rawDescGZIP(), []int{10, 0}
-}
-
-type ActionResponse_Format int32
-
-const (
-	ActionResponse_PLAIN    ActionResponse_Format = 0
-	ActionResponse_HTML     ActionResponse_Format = 1
-	ActionResponse_MARKDOWN ActionResponse_Format = 2
-)
-
-// Enum value maps for ActionResponse_Format.
-var (
-	ActionResponse_Format_name = map[int32]string{
-		0: "PLAIN",
-		1: "HTML",
-		2: "MARKDOWN",
-	}
-	ActionResponse_Format_value = map[string]int32{
-		"PLAIN":    0,
-		"HTML":     1,
-		"MARKDOWN": 2,
-	}
-)
-
-func (x ActionResponse_Format) Enum() *ActionResponse_Format {
-	p := new(ActionResponse_Format)
-	*p = x
-	return p
-}
-
-func (x ActionResponse_Format) String() string {
-	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
-}
-
-func (ActionResponse_Format) Descriptor() protoreflect.EnumDescriptor {
-	return file_extensions_extension_proto_enumTypes[3].Descriptor()
-}
-
-func (ActionResponse_Format) Type() protoreflect.EnumType {
-	return &file_extensions_extension_proto_enumTypes[3]
-}
-
-func (x ActionResponse_Format) Number() protoreflect.EnumNumber {
-	return protoreflect.EnumNumber(x)
-}
-
-// Deprecated: Use ActionResponse_Format.Descriptor instead.
-func (ActionResponse_Format) EnumDescriptor() ([]byte, []int) {
-	return file_extensions_extension_proto_rawDescGZIP(), []int{10, 1}
-}
-
 // Kind описывает c какой сущность системы связано действие и что требуется передать в качестве параметров
 // Интерфейс загружает пользовательские действия и отображает их в интерфейсе в зависимости от ActionType.
 type Action_Kind int32
@@ -311,823 +152,20 @@ func (x Action_Kind) String() string {
 }
 
 func (Action_Kind) Descriptor() protoreflect.EnumDescriptor {
-	return file_extensions_extension_proto_enumTypes[4].Descriptor()
-}
-
-func (Action_Kind) Type() protoreflect.EnumType {
-	return &file_extensions_extension_proto_enumTypes[4]
-}
-
-func (x Action_Kind) Number() protoreflect.EnumNumber {
-	return protoreflect.EnumNumber(x)
-}
-
-// Deprecated: Use Action_Kind.Descriptor instead.
-func (Action_Kind) EnumDescriptor() ([]byte, []int) {
-	return file_extensions_extension_proto_rawDescGZIP(), []int{11, 0}
-}
-
-type InstallRequest struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	Extensions []string `protobuf:"bytes,10000,rep,name=extensions,proto3" json:"extensions,omitempty"`          // Список расширений для установки
-	SpaceId    string   `protobuf:"bytes,10010,opt,name=space_id,json=spaceId,proto3" json:"space_id,omitempty"` // Пространство для установки расширений
-	EnvId      string   `protobuf:"bytes,10020,opt,name=env_id,json=envId,proto3" json:"env_id,omitempty"`       // Идентификатор окружения для установки (по умолчанию master)
-	Force      bool     `protobuf:"varint,10100,opt,name=force,proto3" json:"force,omitempty"`                   // Игнорировать и автоматически исправлять ошибки установки
-}
-
-func (x *InstallRequest) Reset() {
-	*x = InstallRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_extensions_extension_proto_msgTypes[0]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *InstallRequest) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*InstallRequest) ProtoMessage() {}
-
-func (x *InstallRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_extensions_extension_proto_msgTypes[0]
-	if protoimpl.UnsafeEnabled && x != nil {
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		if ms.LoadMessageInfo() == nil {
-			ms.StoreMessageInfo(mi)
-		}
-		return ms
-	}
-	return mi.MessageOf(x)
-}
-
-// Deprecated: Use InstallRequest.ProtoReflect.Descriptor instead.
-func (*InstallRequest) Descriptor() ([]byte, []int) {
-	return file_extensions_extension_proto_rawDescGZIP(), []int{0}
-}
-
-func (x *InstallRequest) GetExtensions() []string {
-	if x != nil {
-		return x.Extensions
-	}
-	return nil
-}
-
-func (x *InstallRequest) GetSpaceId() string {
-	if x != nil {
-		return x.SpaceId
-	}
-	return ""
-}
-
-func (x *InstallRequest) GetEnvId() string {
-	if x != nil {
-		return x.EnvId
-	}
-	return ""
-}
-
-func (x *InstallRequest) GetForce() bool {
-	if x != nil {
-		return x.Force
-	}
-	return false
-}
-
-type ExtensionRequestResult struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	State           ExtensionRequestResult_State `protobuf:"varint,10000,opt,name=state,proto3,enum=extensions.ExtensionRequestResult_State" json:"state,omitempty"` // Состояние расширение
-	Extension       string                       `protobuf:"bytes,10100,opt,name=extension,proto3" json:"extension,omitempty"`                                       // Имя расширения
-	Msg             string                       `protobuf:"bytes,10200,opt,name=msg,proto3" json:"msg,omitempty"`                                                   // Сообщение
-	Error           string                       `protobuf:"bytes,10300,opt,name=error,proto3" json:"error,omitempty"`                                               // Ошибка (state == ERROR)
-	UpdateAvailable bool                         `protobuf:"varint,10400,opt,name=update_available,json=updateAvailable,proto3" json:"update_available,omitempty"`   // Доступно обновление
-}
-
-func (x *ExtensionRequestResult) Reset() {
-	*x = ExtensionRequestResult{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_extensions_extension_proto_msgTypes[1]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *ExtensionRequestResult) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*ExtensionRequestResult) ProtoMessage() {}
-
-func (x *ExtensionRequestResult) ProtoReflect() protoreflect.Message {
-	mi := &file_extensions_extension_proto_msgTypes[1]
-	if protoimpl.UnsafeEnabled && x != nil {
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		if ms.LoadMessageInfo() == nil {
-			ms.StoreMessageInfo(mi)
-		}
-		return ms
-	}
-	return mi.MessageOf(x)
-}
-
-// Deprecated: Use ExtensionRequestResult.ProtoReflect.Descriptor instead.
-func (*ExtensionRequestResult) Descriptor() ([]byte, []int) {
-	return file_extensions_extension_proto_rawDescGZIP(), []int{1}
-}
-
-func (x *ExtensionRequestResult) GetState() ExtensionRequestResult_State {
-	if x != nil {
-		return x.State
-	}
-	return ExtensionRequestResult_OK
-}
-
-func (x *ExtensionRequestResult) GetExtension() string {
-	if x != nil {
-		return x.Extension
-	}
-	return ""
-}
-
-func (x *ExtensionRequestResult) GetMsg() string {
-	if x != nil {
-		return x.Msg
-	}
-	return ""
-}
-
-func (x *ExtensionRequestResult) GetError() string {
-	if x != nil {
-		return x.Error
-	}
-	return ""
-}
-
-func (x *ExtensionRequestResult) GetUpdateAvailable() bool {
-	if x != nil {
-		return x.UpdateAvailable
-	}
-	return false
-}
-
-type InstallResponse struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	Results []*ExtensionRequestResult `protobuf:"bytes,10000,rep,name=results,proto3" json:"results,omitempty"` // Список состояний расширений после установки
-}
-
-func (x *InstallResponse) Reset() {
-	*x = InstallResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_extensions_extension_proto_msgTypes[2]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *InstallResponse) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*InstallResponse) ProtoMessage() {}
-
-func (x *InstallResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_extensions_extension_proto_msgTypes[2]
-	if protoimpl.UnsafeEnabled && x != nil {
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		if ms.LoadMessageInfo() == nil {
-			ms.StoreMessageInfo(mi)
-		}
-		return ms
-	}
-	return mi.MessageOf(x)
-}
-
-// Deprecated: Use InstallResponse.ProtoReflect.Descriptor instead.
-func (*InstallResponse) Descriptor() ([]byte, []int) {
-	return file_extensions_extension_proto_rawDescGZIP(), []int{2}
-}
-
-func (x *InstallResponse) GetResults() []*ExtensionRequestResult {
-	if x != nil {
-		return x.Results
-	}
-	return nil
-}
-
-type UninstallRequest struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	Extensions []string `protobuf:"bytes,10000,rep,name=extensions,proto3" json:"extensions,omitempty"`          // Список расширений для удаления
-	SpaceId    string   `protobuf:"bytes,10010,opt,name=space_id,json=spaceId,proto3" json:"space_id,omitempty"` // Пространство для удаления расширений
-	EnvId      string   `protobuf:"bytes,10020,opt,name=env_id,json=envId,proto3" json:"env_id,omitempty"`       // Идентификатор окружения для установки (по умолчанию master)
-	Remove     bool     `protobuf:"varint,10100,opt,name=remove,proto3" json:"remove,omitempty"`                 // Удалить все коллекции и данные
-	Force      bool     `protobuf:"varint,10200,opt,name=force,proto3" json:"force,omitempty"`                   // Удалять расширения вне зависимости от возможных ошибок, без учета зависимостей
-}
-
-func (x *UninstallRequest) Reset() {
-	*x = UninstallRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_extensions_extension_proto_msgTypes[3]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *UninstallRequest) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*UninstallRequest) ProtoMessage() {}
-
-func (x *UninstallRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_extensions_extension_proto_msgTypes[3]
-	if protoimpl.UnsafeEnabled && x != nil {
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		if ms.LoadMessageInfo() == nil {
-			ms.StoreMessageInfo(mi)
-		}
-		return ms
-	}
-	return mi.MessageOf(x)
-}
-
-// Deprecated: Use UninstallRequest.ProtoReflect.Descriptor instead.
-func (*UninstallRequest) Descriptor() ([]byte, []int) {
-	return file_extensions_extension_proto_rawDescGZIP(), []int{3}
-}
-
-func (x *UninstallRequest) GetExtensions() []string {
-	if x != nil {
-		return x.Extensions
-	}
-	return nil
-}
-
-func (x *UninstallRequest) GetSpaceId() string {
-	if x != nil {
-		return x.SpaceId
-	}
-	return ""
-}
-
-func (x *UninstallRequest) GetEnvId() string {
-	if x != nil {
-		return x.EnvId
-	}
-	return ""
-}
-
-func (x *UninstallRequest) GetRemove() bool {
-	if x != nil {
-		return x.Remove
-	}
-	return false
-}
-
-func (x *UninstallRequest) GetForce() bool {
-	if x != nil {
-		return x.Force
-	}
-	return false
-}
-
-type UninstallResponse struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	Results []*ExtensionRequestResult `protobuf:"bytes,10000,rep,name=results,proto3" json:"results,omitempty"` // Список состояний расширений после удаления
-}
-
-func (x *UninstallResponse) Reset() {
-	*x = UninstallResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_extensions_extension_proto_msgTypes[4]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *UninstallResponse) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*UninstallResponse) ProtoMessage() {}
-
-func (x *UninstallResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_extensions_extension_proto_msgTypes[4]
-	if protoimpl.UnsafeEnabled && x != nil {
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		if ms.LoadMessageInfo() == nil {
-			ms.StoreMessageInfo(mi)
-		}
-		return ms
-	}
-	return mi.MessageOf(x)
-}
-
-// Deprecated: Use UninstallResponse.ProtoReflect.Descriptor instead.
-func (*UninstallResponse) Descriptor() ([]byte, []int) {
-	return file_extensions_extension_proto_rawDescGZIP(), []int{4}
-}
-
-func (x *UninstallResponse) GetResults() []*ExtensionRequestResult {
-	if x != nil {
-		return x.Results
-	}
-	return nil
-}
-
-type UpdateRequest struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	Extensions []string `protobuf:"bytes,10000,rep,name=extensions,proto3" json:"extensions,omitempty"`          // Список расширений для удаления
-	SpaceId    string   `protobuf:"bytes,10010,opt,name=space_id,json=spaceId,proto3" json:"space_id,omitempty"` // Пространство для удаления расширений
-	EnvId      string   `protobuf:"bytes,10020,opt,name=env_id,json=envId,proto3" json:"env_id,omitempty"`       // Идентификатор окружения для установки (по умолчанию master)
-	Force      bool     `protobuf:"varint,10100,opt,name=force,proto3" json:"force,omitempty"`                   // Выполнять обновление и автоматически исправлять ошибки
-}
-
-func (x *UpdateRequest) Reset() {
-	*x = UpdateRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_extensions_extension_proto_msgTypes[5]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *UpdateRequest) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*UpdateRequest) ProtoMessage() {}
-
-func (x *UpdateRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_extensions_extension_proto_msgTypes[5]
-	if protoimpl.UnsafeEnabled && x != nil {
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		if ms.LoadMessageInfo() == nil {
-			ms.StoreMessageInfo(mi)
-		}
-		return ms
-	}
-	return mi.MessageOf(x)
-}
-
-// Deprecated: Use UpdateRequest.ProtoReflect.Descriptor instead.
-func (*UpdateRequest) Descriptor() ([]byte, []int) {
-	return file_extensions_extension_proto_rawDescGZIP(), []int{5}
-}
-
-func (x *UpdateRequest) GetExtensions() []string {
-	if x != nil {
-		return x.Extensions
-	}
-	return nil
-}
-
-func (x *UpdateRequest) GetSpaceId() string {
-	if x != nil {
-		return x.SpaceId
-	}
-	return ""
-}
-
-func (x *UpdateRequest) GetEnvId() string {
-	if x != nil {
-		return x.EnvId
-	}
-	return ""
-}
-
-func (x *UpdateRequest) GetForce() bool {
-	if x != nil {
-		return x.Force
-	}
-	return false
-}
-
-type UpdateResponse struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	Results []*ExtensionRequestResult `protobuf:"bytes,10000,rep,name=results,proto3" json:"results,omitempty"` // Список состояний расширений после удаления
-}
-
-func (x *UpdateResponse) Reset() {
-	*x = UpdateResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_extensions_extension_proto_msgTypes[6]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *UpdateResponse) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*UpdateResponse) ProtoMessage() {}
-
-func (x *UpdateResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_extensions_extension_proto_msgTypes[6]
-	if protoimpl.UnsafeEnabled && x != nil {
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		if ms.LoadMessageInfo() == nil {
-			ms.StoreMessageInfo(mi)
-		}
-		return ms
-	}
-	return mi.MessageOf(x)
-}
-
-// Deprecated: Use UpdateResponse.ProtoReflect.Descriptor instead.
-func (*UpdateResponse) Descriptor() ([]byte, []int) {
-	return file_extensions_extension_proto_rawDescGZIP(), []int{6}
-}
-
-func (x *UpdateResponse) GetResults() []*ExtensionRequestResult {
-	if x != nil {
-		return x.Results
-	}
-	return nil
-}
-
-type CheckRequest struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	Extensions []string `protobuf:"bytes,10000,rep,name=extensions,proto3" json:"extensions,omitempty"`          // Список расширений для удаления
-	SpaceId    string   `protobuf:"bytes,10010,opt,name=space_id,json=spaceId,proto3" json:"space_id,omitempty"` // Пространство для удаления расширений
-	EnvId      string   `protobuf:"bytes,10020,opt,name=env_id,json=envId,proto3" json:"env_id,omitempty"`       // Идентификатор окружения для установки (по умолчанию master)
-}
-
-func (x *CheckRequest) Reset() {
-	*x = CheckRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_extensions_extension_proto_msgTypes[7]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *CheckRequest) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*CheckRequest) ProtoMessage() {}
-
-func (x *CheckRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_extensions_extension_proto_msgTypes[7]
-	if protoimpl.UnsafeEnabled && x != nil {
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		if ms.LoadMessageInfo() == nil {
-			ms.StoreMessageInfo(mi)
-		}
-		return ms
-	}
-	return mi.MessageOf(x)
-}
-
-// Deprecated: Use CheckRequest.ProtoReflect.Descriptor instead.
-func (*CheckRequest) Descriptor() ([]byte, []int) {
-	return file_extensions_extension_proto_rawDescGZIP(), []int{7}
-}
-
-func (x *CheckRequest) GetExtensions() []string {
-	if x != nil {
-		return x.Extensions
-	}
-	return nil
-}
-
-func (x *CheckRequest) GetSpaceId() string {
-	if x != nil {
-		return x.SpaceId
-	}
-	return ""
-}
-
-func (x *CheckRequest) GetEnvId() string {
-	if x != nil {
-		return x.EnvId
-	}
-	return ""
-}
-
-type CheckResponse struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	Results []*ExtensionRequestResult `protobuf:"bytes,10000,rep,name=results,proto3" json:"results,omitempty"` // Список состояний расширений
-}
-
-func (x *CheckResponse) Reset() {
-	*x = CheckResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_extensions_extension_proto_msgTypes[8]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *CheckResponse) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*CheckResponse) ProtoMessage() {}
-
-func (x *CheckResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_extensions_extension_proto_msgTypes[8]
-	if protoimpl.UnsafeEnabled && x != nil {
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		if ms.LoadMessageInfo() == nil {
-			ms.StoreMessageInfo(mi)
-		}
-		return ms
-	}
-	return mi.MessageOf(x)
-}
-
-// Deprecated: Use CheckResponse.ProtoReflect.Descriptor instead.
-func (*CheckResponse) Descriptor() ([]byte, []int) {
-	return file_extensions_extension_proto_rawDescGZIP(), []int{8}
-}
-
-func (x *CheckResponse) GetResults() []*ExtensionRequestResult {
-	if x != nil {
-		return x.Results
-	}
-	return nil
-}
-
-// ActionRequest - запрос на выполнение действия к расширению (или менеджеру расширений)
-type ActionRequest struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	Extension    string   `protobuf:"bytes,1000,opt,name=extension,proto3" json:"extension,omitempty"`
-	Action       string   `protobuf:"bytes,10100,opt,name=action,proto3" json:"action,omitempty"`
-	SpaceId      string   `protobuf:"bytes,10500,opt,name=space_id,json=spaceId,proto3" json:"space_id,omitempty"`
-	EnvId        string   `protobuf:"bytes,10510,opt,name=env_id,json=envId,proto3" json:"env_id,omitempty"`
-	CollectionId string   `protobuf:"bytes,10520,opt,name=collection_id,json=collectionId,proto3" json:"collection_id,omitempty"`
-	ItemId       string   `protobuf:"bytes,10530,opt,name=item_id,json=itemId,proto3" json:"item_id,omitempty"`
-	ItemIds      []string `protobuf:"bytes,10540,rep,name=item_ids,json=itemIds,proto3" json:"item_ids,omitempty"`
-	// Поля к которым применимо действие. В случае если действие выполняется из списка записей, содержит перечень
-	// полей которые пользователь выбрал для отображения в интерфейсе.
-	Fields   []string          `protobuf:"bytes,10550,rep,name=fields,proto3" json:"fields,omitempty"`
-	Metadata map[string]string `protobuf:"bytes,11000,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
-	// Ссылки на записи используемые для выполнения действия (назначение ссылок зависит от действия и расширения)
-	Refs []*references.Reference `protobuf:"bytes,11010,rep,name=refs,proto3" json:"refs,omitempty"`
-	// Ссылка на документ с параметрами выполнения Action.
-	// Чтобы при выполнении действия открывалась форма параметров, необходимо указать `Action.params_collection`
-	Params *references.Reference `protobuf:"bytes,11020,opt,name=params,proto3" json:"params,omitempty"`
-}
-
-func (x *ActionRequest) Reset() {
-	*x = ActionRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_extensions_extension_proto_msgTypes[9]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *ActionRequest) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*ActionRequest) ProtoMessage() {}
-
-func (x *ActionRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_extensions_extension_proto_msgTypes[9]
-	if protoimpl.UnsafeEnabled && x != nil {
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		if ms.LoadMessageInfo() == nil {
-			ms.StoreMessageInfo(mi)
-		}
-		return ms
-	}
-	return mi.MessageOf(x)
-}
-
-// Deprecated: Use ActionRequest.ProtoReflect.Descriptor instead.
-func (*ActionRequest) Descriptor() ([]byte, []int) {
-	return file_extensions_extension_proto_rawDescGZIP(), []int{9}
-}
-
-func (x *ActionRequest) GetExtension() string {
-	if x != nil {
-		return x.Extension
-	}
-	return ""
-}
-
-func (x *ActionRequest) GetAction() string {
-	if x != nil {
-		return x.Action
-	}
-	return ""
-}
-
-func (x *ActionRequest) GetSpaceId() string {
-	if x != nil {
-		return x.SpaceId
-	}
-	return ""
-}
-
-func (x *ActionRequest) GetEnvId() string {
-	if x != nil {
-		return x.EnvId
-	}
-	return ""
-}
-
-func (x *ActionRequest) GetCollectionId() string {
-	if x != nil {
-		return x.CollectionId
-	}
-	return ""
-}
-
-func (x *ActionRequest) GetItemId() string {
-	if x != nil {
-		return x.ItemId
-	}
-	return ""
-}
-
-func (x *ActionRequest) GetItemIds() []string {
-	if x != nil {
-		return x.ItemIds
-	}
-	return nil
-}
-
-func (x *ActionRequest) GetFields() []string {
-	if x != nil {
-		return x.Fields
-	}
-	return nil
-}
-
-func (x *ActionRequest) GetMetadata() map[string]string {
-	if x != nil {
-		return x.Metadata
-	}
-	return nil
-}
-
-func (x *ActionRequest) GetRefs() []*references.Reference {
-	if x != nil {
-		return x.Refs
-	}
-	return nil
-}
-
-func (x *ActionRequest) GetParams() *references.Reference {
-	if x != nil {
-		return x.Params
-	}
-	return nil
-}
-
-type ActionResponse struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	State    ActionResponse_State    `protobuf:"varint,10000,opt,name=state,proto3,enum=extensions.ActionResponse_State" json:"state,omitempty"`                                                         // Состояние расширение
-	Target   Target                  `protobuf:"varint,10010,opt,name=target,proto3,enum=extensions.Target" json:"target,omitempty"`                                                                     // Как открывать результат выполнения действия в пользовательском интерфейсе (переопределяет значение в Action)
-	Format   ActionResponse_Format   `protobuf:"varint,10050,opt,name=format,proto3,enum=extensions.ActionResponse_Format" json:"format,omitempty"`                                                      // Формат полей msg  и error
-	Msg      string                  `protobuf:"bytes,10100,opt,name=msg,proto3" json:"msg,omitempty"`                                                                                                   // Сообщение о выполнении действия
-	Title    string                  `protobuf:"bytes,10110,opt,name=title,proto3" json:"title,omitempty"`                                                                                               // Текст для отображения в интерфейсе
-	Image    string                  `protobuf:"bytes,10140,opt,name=image,proto3" json:"image,omitempty"`                                                                                               // Изображение для отображения в интерфейсе (шапке окна)
-	Error    string                  `protobuf:"bytes,10200,opt,name=error,proto3" json:"error,omitempty"`                                                                                               // Сообщение в случае ошибки (дополнительно к msg)
-	Next     []*Action               `protobuf:"bytes,10300,rep,name=next,proto3" json:"next,omitempty"`                                                                                                 // Следующие возможные действия. Интерфейс отображает как варианты дальнейших действий пользователя
-	Metadata map[string]string       `protobuf:"bytes,10400,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Метаданные запроса
-	Refs     []*references.Reference `protobuf:"bytes,10320,rep,name=refs,proto3" json:"refs,omitempty"`                                                                                                 // Ссылки на записи (назначение ссылок зависит от действия и расширения)
-}
-
-func (x *ActionResponse) Reset() {
-	*x = ActionResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_extensions_extension_proto_msgTypes[10]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *ActionResponse) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*ActionResponse) ProtoMessage() {}
-
-func (x *ActionResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_extensions_extension_proto_msgTypes[10]
-	if protoimpl.UnsafeEnabled && x != nil {
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		if ms.LoadMessageInfo() == nil {
-			ms.StoreMessageInfo(mi)
-		}
-		return ms
-	}
-	return mi.MessageOf(x)
-}
-
-// Deprecated: Use ActionResponse.ProtoReflect.Descriptor instead.
-func (*ActionResponse) Descriptor() ([]byte, []int) {
-	return file_extensions_extension_proto_rawDescGZIP(), []int{10}
-}
-
-func (x *ActionResponse) GetState() ActionResponse_State {
-	if x != nil {
-		return x.State
-	}
-	return ActionResponse_DONE
-}
-
-func (x *ActionResponse) GetTarget() Target {
-	if x != nil {
-		return x.Target
-	}
-	return Target_DEFAULT
-}
-
-func (x *ActionResponse) GetFormat() ActionResponse_Format {
-	if x != nil {
-		return x.Format
-	}
-	return ActionResponse_PLAIN
-}
-
-func (x *ActionResponse) GetMsg() string {
-	if x != nil {
-		return x.Msg
-	}
-	return ""
-}
-
-func (x *ActionResponse) GetTitle() string {
-	if x != nil {
-		return x.Title
-	}
-	return ""
-}
-
-func (x *ActionResponse) GetImage() string {
-	if x != nil {
-		return x.Image
-	}
-	return ""
-}
-
-func (x *ActionResponse) GetError() string {
-	if x != nil {
-		return x.Error
-	}
-	return ""
-}
-
-func (x *ActionResponse) GetNext() []*Action {
-	if x != nil {
-		return x.Next
-	}
-	return nil
+	return file_extensions_extension_proto_enumTypes[1].Descriptor()
 }
 
-func (x *ActionResponse) GetMetadata() map[string]string {
-	if x != nil {
-		return x.Metadata
-	}
-	return nil
+func (Action_Kind) Type() protoreflect.EnumType {
+	return &file_extensions_extension_proto_enumTypes[1]
 }
 
-func (x *ActionResponse) GetRefs() []*references.Reference {
-	if x != nil {
-		return x.Refs
-	}
-	return nil
+func (x Action_Kind) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use Action_Kind.Descriptor instead.
+func (Action_Kind) EnumDescriptor() ([]byte, []int) {
+	return file_extensions_extension_proto_rawDescGZIP(), []int{0, 0}
 }
 
 // *
@@ -1222,7 +260,7 @@ type Action struct {
 func (x *Action) Reset() {
 	*x = Action{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_extensions_extension_proto_msgTypes[11]
+		mi := &file_extensions_extension_proto_msgTypes[0]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1235,7 +273,7 @@ func (x *Action) String() string {
 func (*Action) ProtoMessage() {}
 
 func (x *Action) ProtoReflect() protoreflect.Message {
-	mi := &file_extensions_extension_proto_msgTypes[11]
+	mi := &file_extensions_extension_proto_msgTypes[0]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1248,7 +286,7 @@ func (x *Action) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use Action.ProtoReflect.Descriptor instead.
 func (*Action) Descriptor() ([]byte, []int) {
-	return file_extensions_extension_proto_rawDescGZIP(), []int{11}
+	return file_extensions_extension_proto_rawDescGZIP(), []int{0}
 }
 
 func (x *Action) GetExtension() string {
@@ -1377,6 +415,139 @@ func (x *Action) GetConfirm() bool {
 	return false
 }
 
+// ActionRequest - запрос на выполнение действия к расширению (или менеджеру расширений)
+type ActionRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Extension    string   `protobuf:"bytes,1000,opt,name=extension,proto3" json:"extension,omitempty"`
+	Action       string   `protobuf:"bytes,10100,opt,name=action,proto3" json:"action,omitempty"`
+	SpaceId      string   `protobuf:"bytes,10500,opt,name=space_id,json=spaceId,proto3" json:"space_id,omitempty"`
+	EnvId        string   `protobuf:"bytes,10510,opt,name=env_id,json=envId,proto3" json:"env_id,omitempty"`
+	CollectionId string   `protobuf:"bytes,10520,opt,name=collection_id,json=collectionId,proto3" json:"collection_id,omitempty"`
+	ItemId       string   `protobuf:"bytes,10530,opt,name=item_id,json=itemId,proto3" json:"item_id,omitempty"`
+	ItemIds      []string `protobuf:"bytes,10540,rep,name=item_ids,json=itemIds,proto3" json:"item_ids,omitempty"`
+	// Поля к которым применимо действие. В случае если действие выполняется из списка записей, содержит перечень
+	// полей которые пользователь выбрал для отображения в интерфейсе.
+	Fields   []string          `protobuf:"bytes,10550,rep,name=fields,proto3" json:"fields,omitempty"`
+	Metadata map[string]string `protobuf:"bytes,11000,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+	// Ссылки на записи используемые для выполнения действия (назначение ссылок зависит от действия и расширения)
+	Refs []*references.Reference `protobuf:"bytes,11010,rep,name=refs,proto3" json:"refs,omitempty"`
+	// Ссылка на документ с параметрами выполнения Action.
+	// Чтобы при выполнении действия открывалась форма параметров, необходимо указать `Action.params_collection`
+	Params *references.Reference `protobuf:"bytes,11020,opt,name=params,proto3" json:"params,omitempty"`
+}
+
+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)
+	}
+}
+
+func (x *ActionRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ActionRequest) ProtoMessage() {}
+
+func (x *ActionRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_extensions_extension_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ActionRequest.ProtoReflect.Descriptor instead.
+func (*ActionRequest) Descriptor() ([]byte, []int) {
+	return file_extensions_extension_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *ActionRequest) GetExtension() string {
+	if x != nil {
+		return x.Extension
+	}
+	return ""
+}
+
+func (x *ActionRequest) GetAction() string {
+	if x != nil {
+		return x.Action
+	}
+	return ""
+}
+
+func (x *ActionRequest) GetSpaceId() string {
+	if x != nil {
+		return x.SpaceId
+	}
+	return ""
+}
+
+func (x *ActionRequest) GetEnvId() string {
+	if x != nil {
+		return x.EnvId
+	}
+	return ""
+}
+
+func (x *ActionRequest) GetCollectionId() string {
+	if x != nil {
+		return x.CollectionId
+	}
+	return ""
+}
+
+func (x *ActionRequest) GetItemId() string {
+	if x != nil {
+		return x.ItemId
+	}
+	return ""
+}
+
+func (x *ActionRequest) GetItemIds() []string {
+	if x != nil {
+		return x.ItemIds
+	}
+	return nil
+}
+
+func (x *ActionRequest) GetFields() []string {
+	if x != nil {
+		return x.Fields
+	}
+	return nil
+}
+
+func (x *ActionRequest) GetMetadata() map[string]string {
+	if x != nil {
+		return x.Metadata
+	}
+	return nil
+}
+
+func (x *ActionRequest) GetRefs() []*references.Reference {
+	if x != nil {
+		return x.Refs
+	}
+	return nil
+}
+
+func (x *ActionRequest) GetParams() *references.Reference {
+	if x != nil {
+		return x.Params
+	}
+	return nil
+}
+
 var File_extensions_extension_proto protoreflect.FileDescriptor
 
 var file_extensions_extension_proto_rawDesc = []byte{
@@ -1384,230 +555,99 @@ var file_extensions_extension_proto_rawDesc = []byte{
 	0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0a, 0x65, 0x78,
 	0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x1b, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65,
 	0x6e, 0x63, 0x65, 0x73, 0x2f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x2e,
-	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x7c, 0x0a, 0x0e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c,
-	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e,
-	0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x90, 0x4e, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78,
-	0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x70, 0x61, 0x63,
-	0x65, 0x5f, 0x69, 0x64, 0x18, 0x9a, 0x4e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x70, 0x61,
-	0x63, 0x65, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x6e, 0x76, 0x5f, 0x69, 0x64, 0x18, 0xa4,
-	0x4e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x05,
-	0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0xf4, 0x4e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f,
-	0x72, 0x63, 0x65, 0x22, 0xa1, 0x02, 0x0a, 0x16, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f,
-	0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x3f,
-	0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x90, 0x4e, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x28,
-	0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45, 0x78, 0x74, 0x65,
-	0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x75,
-	0x6c, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12,
-	0x1d, 0x0a, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0xf4, 0x4e, 0x20,
-	0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x11,
-	0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0xd8, 0x4f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73,
-	0x67, 0x12, 0x15, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xbc, 0x50, 0x20, 0x01, 0x28,
-	0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x2a, 0x0a, 0x10, 0x75, 0x70, 0x64, 0x61,
-	0x74, 0x65, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0xa0, 0x51, 0x20,
-	0x01, 0x28, 0x08, 0x52, 0x0f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x76, 0x61, 0x69, 0x6c,
-	0x61, 0x62, 0x6c, 0x65, 0x22, 0x51, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x06, 0x0a,
-	0x02, 0x4f, 0x4b, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x01,
-	0x12, 0x0b, 0x0a, 0x07, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x0f, 0x0a,
-	0x0b, 0x49, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, 0x03, 0x12, 0x17,
-	0x0a, 0x13, 0x50, 0x41, 0x52, 0x41, 0x4d, 0x45, 0x54, 0x45, 0x52, 0x53, 0x5f, 0x52, 0x45, 0x51,
-	0x55, 0x49, 0x52, 0x45, 0x44, 0x10, 0x04, 0x22, 0x50, 0x0a, 0x0f, 0x49, 0x6e, 0x73, 0x74, 0x61,
-	0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x07, 0x72, 0x65,
-	0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x90, 0x4e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x65,
-	0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73,
-	0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74,
-	0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x97, 0x01, 0x0a, 0x10, 0x55, 0x6e,
-	0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f,
-	0x0a, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x90, 0x4e, 0x20,
-	0x03, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12,
-	0x1a, 0x0a, 0x08, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x9a, 0x4e, 0x20, 0x01,
-	0x28, 0x09, 0x52, 0x07, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x65,
-	0x6e, 0x76, 0x5f, 0x69, 0x64, 0x18, 0xa4, 0x4e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e,
-	0x76, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0xf4, 0x4e,
-	0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x15, 0x0a, 0x05,
-	0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0xd8, 0x4f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f,
-	0x72, 0x63, 0x65, 0x22, 0x52, 0x0a, 0x11, 0x55, 0x6e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c,
-	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75,
-	0x6c, 0x74, 0x73, 0x18, 0x90, 0x4e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x65, 0x78, 0x74,
-	0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f,
-	0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x07,
-	0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x7b, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, 0x74,
-	0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x65,
-	0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x90, 0x4e, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x65,
-	0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x70, 0x61,
-	0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x9a, 0x4e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x70,
-	0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x6e, 0x76, 0x5f, 0x69, 0x64, 0x18,
-	0xa4, 0x4e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x15, 0x0a,
-	0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0xf4, 0x4e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66,
-	0x6f, 0x72, 0x63, 0x65, 0x22, 0x4f, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65,
-	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74,
-	0x73, 0x18, 0x90, 0x4e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e,
-	0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52,
-	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x07, 0x72, 0x65,
-	0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x63, 0x0a, 0x0c, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65,
-	0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69,
-	0x6f, 0x6e, 0x73, 0x18, 0x90, 0x4e, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65,
-	0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f,
-	0x69, 0x64, 0x18, 0x9a, 0x4e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x70, 0x61, 0x63, 0x65,
-	0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x6e, 0x76, 0x5f, 0x69, 0x64, 0x18, 0xa4, 0x4e, 0x20,
-	0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x22, 0x4e, 0x0a, 0x0d, 0x43, 0x68,
-	0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x07, 0x72,
-	0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x90, 0x4e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e,
-	0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e,
-	0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c,
-	0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0xdf, 0x03, 0x0a, 0x0d, 0x41,
-	0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x09,
-	0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x06, 0x61,
-	0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xf4, 0x4e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x63,
-	0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64,
-	0x18, 0x84, 0x52, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64,
-	0x12, 0x16, 0x0a, 0x06, 0x65, 0x6e, 0x76, 0x5f, 0x69, 0x64, 0x18, 0x8e, 0x52, 0x20, 0x01, 0x28,
-	0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6f, 0x6c, 0x6c,
-	0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x98, 0x52, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x18,
-	0x0a, 0x07, 0x69, 0x74, 0x65, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0xa2, 0x52, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x06, 0x69, 0x74, 0x65, 0x6d, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x74, 0x65, 0x6d,
-	0x5f, 0x69, 0x64, 0x73, 0x18, 0xac, 0x52, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x69, 0x74, 0x65,
-	0x6d, 0x49, 0x64, 0x73, 0x12, 0x17, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0xb6,
-	0x52, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x44, 0x0a,
-	0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0xf8, 0x55, 0x20, 0x03, 0x28, 0x0b,
-	0x32, 0x27, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x41, 0x63,
-	0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x61,
-	0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64,
-	0x61, 0x74, 0x61, 0x12, 0x32, 0x0a, 0x04, 0x72, 0x65, 0x66, 0x73, 0x18, 0x82, 0x56, 0x20, 0x03,
-	0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x72, 0x65, 0x66,
-	0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63,
-	0x65, 0x52, 0x04, 0x72, 0x65, 0x66, 0x73, 0x12, 0x36, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d,
-	0x73, 0x18, 0x8c, 0x56, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65,
-	0x6e, 0x74, 0x2e, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x2e, 0x52, 0x65,
-	0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x1a,
-	0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79,
-	0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b,
-	0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
-	0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xed, 0x04, 0x0a,
-	0x0e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
-	0x37, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x90, 0x4e, 0x20, 0x01, 0x28, 0x0e, 0x32,
-	0x20, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x41, 0x63, 0x74,
-	0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74,
-	0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2b, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67,
-	0x65, 0x74, 0x18, 0x9a, 0x4e, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x65, 0x78, 0x74, 0x65,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xab, 0x06, 0x0a, 0x06, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+	0x12, 0x1d, 0x0a, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x90, 0x4e,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12,
+	0x17, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xf4, 0x4e, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67,
+	0x65, 0x74, 0x18, 0xfe, 0x4e, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x65, 0x78, 0x74, 0x65,
 	0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74,
-	0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x3a, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18,
-	0xc2, 0x4e, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69,
-	0x6f, 0x6e, 0x73, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
-	0x73, 0x65, 0x2e, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61,
-	0x74, 0x12, 0x11, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0xf4, 0x4e, 0x20, 0x01, 0x28, 0x09, 0x52,
-	0x03, 0x6d, 0x73, 0x67, 0x12, 0x15, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0xfe, 0x4e,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x15, 0x0a, 0x05, 0x69,
-	0x6d, 0x61, 0x67, 0x65, 0x18, 0x9c, 0x4f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x69, 0x6d, 0x61,
-	0x67, 0x65, 0x12, 0x15, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xd8, 0x4f, 0x20, 0x01,
-	0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x27, 0x0a, 0x04, 0x6e, 0x65, 0x78,
-	0x74, 0x18, 0xbc, 0x50, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e,
-	0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x04, 0x6e, 0x65,
-	0x78, 0x74, 0x12, 0x45, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0xa0,
-	0x51, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f,
-	0x6e, 0x73, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
-	0x65, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52,
-	0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x32, 0x0a, 0x04, 0x72, 0x65, 0x66,
-	0x73, 0x18, 0xd0, 0x50, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65,
-	0x6e, 0x74, 0x2e, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x2e, 0x52, 0x65,
-	0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x04, 0x72, 0x65, 0x66, 0x73, 0x1a, 0x3b, 0x0a,
-	0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10,
-	0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79,
-	0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
-	0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x53, 0x0a, 0x05, 0x53, 0x74,
-	0x61, 0x74, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x09, 0x0a,
-	0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x45, 0x4e, 0x44,
-	0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x47,
-	0x52, 0x45, 0x53, 0x53, 0x10, 0x03, 0x12, 0x17, 0x0a, 0x13, 0x50, 0x41, 0x52, 0x41, 0x4d, 0x45,
-	0x54, 0x45, 0x52, 0x53, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x10, 0x04, 0x22,
-	0x2b, 0x0a, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x09, 0x0a, 0x05, 0x50, 0x4c, 0x41,
-	0x49, 0x4e, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x54, 0x4d, 0x4c, 0x10, 0x01, 0x12, 0x0c,
-	0x0a, 0x08, 0x4d, 0x41, 0x52, 0x4b, 0x44, 0x4f, 0x57, 0x4e, 0x10, 0x02, 0x22, 0xab, 0x06, 0x0a,
-	0x06, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e,
-	0x73, 0x69, 0x6f, 0x6e, 0x18, 0x90, 0x4e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x78, 0x74,
-	0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e,
-	0x18, 0xf4, 0x4e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12,
-	0x2b, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0xfe, 0x4e, 0x20, 0x01, 0x28, 0x0e,
-	0x32, 0x12, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x54, 0x61,
-	0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x17, 0x0a, 0x06,
-	0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x88, 0x4f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70,
-	0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x13, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0xd8, 0x4f,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0b, 0x64, 0x65,
-	0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xe2, 0x4f, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x13, 0x0a,
-	0x04, 0x69, 0x63, 0x6f, 0x6e, 0x18, 0xec, 0x4f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x63,
-	0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0xf6, 0x4f, 0x20, 0x01,
+	0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x17, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18,
+	0x88, 0x4f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x13,
+	0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0xd8, 0x4f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e,
+	0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69,
+	0x6f, 0x6e, 0x18, 0xe2, 0x4f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72,
+	0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x13, 0x0a, 0x04, 0x69, 0x63, 0x6f, 0x6e, 0x18, 0xec,
+	0x4f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x63, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x05, 0x69,
+	0x6d, 0x61, 0x67, 0x65, 0x18, 0xf6, 0x4f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x63, 0x6f,
+	0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73,
+	0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67,
+	0x65, 0x12, 0x17, 0x0a, 0x06, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, 0x80, 0x50, 0x20, 0x03,
+	0x28, 0x09, 0x52, 0x06, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x2c, 0x0a, 0x04, 0x6b, 0x69,
+	0x6e, 0x64, 0x18, 0xbc, 0x50, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x65, 0x78, 0x74, 0x65,
+	0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4b, 0x69,
+	0x6e, 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x19, 0x0a, 0x07, 0x63, 0x6c, 0x61, 0x73,
+	0x73, 0x65, 0x73, 0x18, 0xc6, 0x50, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6c, 0x61, 0x73,
+	0x73, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x04, 0x72, 0x65, 0x66, 0x73, 0x18, 0xd0, 0x50, 0x20, 0x03,
 	0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x72, 0x65, 0x66,
 	0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63,
-	0x65, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x17, 0x0a, 0x06, 0x67, 0x72, 0x6f, 0x75,
-	0x70, 0x73, 0x18, 0x80, 0x50, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x67, 0x72, 0x6f, 0x75, 0x70,
-	0x73, 0x12, 0x2c, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0xbc, 0x50, 0x20, 0x01, 0x28, 0x0e,
-	0x32, 0x17, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x41, 0x63,
-	0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12,
-	0x19, 0x0a, 0x07, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x18, 0xc6, 0x50, 0x20, 0x03, 0x28,
-	0x09, 0x52, 0x07, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x04, 0x72, 0x65,
-	0x66, 0x73, 0x18, 0xd0, 0x50, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x63, 0x6f, 0x6e, 0x74,
-	0x65, 0x6e, 0x74, 0x2e, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x2e, 0x52,
-	0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x04, 0x72, 0x65, 0x66, 0x73, 0x12, 0x2c,
-	0x0a, 0x11, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74,
-	0x69, 0x6f, 0x6e, 0x18, 0xda, 0x50, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x70, 0x61, 0x72, 0x61,
-	0x6d, 0x73, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x07,
-	0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0xa0, 0x51, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19,
-	0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x41, 0x63, 0x74, 0x69,
-	0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65,
-	0x73, 0x74, 0x12, 0x2c, 0x0a, 0x11, 0x6e, 0x61, 0x76, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e,
-	0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x84, 0x52, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10,
-	0x6e, 0x61, 0x76, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e,
-	0x12, 0x2a, 0x0a, 0x10, 0x6e, 0x61, 0x76, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72,
-	0x6f, 0x75, 0x74, 0x65, 0x18, 0x8e, 0x52, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6e, 0x61, 0x76,
-	0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x12, 0x19, 0x0a, 0x07,
-	0x61, 0x75, 0x74, 0x6f, 0x72, 0x75, 0x6e, 0x18, 0x98, 0x52, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07,
-	0x61, 0x75, 0x74, 0x6f, 0x72, 0x75, 0x6e, 0x12, 0x19, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69,
-	0x72, 0x6d, 0x18, 0xa2, 0x52, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69,
-	0x72, 0x6d, 0x22, 0x95, 0x01, 0x0a, 0x04, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x0b, 0x0a, 0x07, 0x44,
-	0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x53, 0x50, 0x41, 0x43,
-	0x45, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x45, 0x4e, 0x56, 0x49, 0x52, 0x4f, 0x4e, 0x4d, 0x45,
-	0x4e, 0x54, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x43, 0x4f, 0x4c, 0x4c, 0x45, 0x43, 0x54, 0x49,
-	0x4f, 0x4e, 0x10, 0x03, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x54, 0x45, 0x4d, 0x10, 0x04, 0x12, 0x09,
-	0x0a, 0x05, 0x49, 0x54, 0x45, 0x4d, 0x53, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x45, 0x56,
-	0x49, 0x53, 0x49, 0x4f, 0x4e, 0x10, 0x06, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x52, 0x45, 0x41, 0x54,
-	0x45, 0x10, 0x07, 0x12, 0x0e, 0x0a, 0x09, 0x4d, 0x41, 0x49, 0x4e, 0x5f, 0x4d, 0x45, 0x4e, 0x55,
-	0x10, 0x90, 0x4e, 0x12, 0x15, 0x0a, 0x10, 0x4d, 0x41, 0x49, 0x4e, 0x5f, 0x4d, 0x45, 0x4e, 0x55,
-	0x5f, 0x42, 0x4f, 0x54, 0x54, 0x4f, 0x4d, 0x10, 0x9a, 0x4e, 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,
-	0x12, 0x0a, 0x0a, 0x06, 0x44, 0x52, 0x41, 0x57, 0x45, 0x52, 0x10, 0x05, 0x12, 0x10, 0x0a, 0x0c,
-	0x4e, 0x4f, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x06, 0x12, 0x09,
-	0x0a, 0x05, 0x42, 0x4c, 0x41, 0x4e, 0x4b, 0x10, 0x07, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e,
-	0x45, 0x10, 0x64, 0x32, 0xe3, 0x02, 0x0a, 0x09, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f,
-	0x6e, 0x12, 0x44, 0x0a, 0x07, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x12, 0x1a, 0x2e, 0x65,
-	0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c,
-	0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e,
-	0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x73,
-	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x05, 0x43, 0x68, 0x65, 0x63, 0x6b,
-	0x12, 0x18, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x43, 0x68,
-	0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x65, 0x78, 0x74,
-	0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73,
-	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74,
-	0x65, 0x12, 0x19, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x55,
-	0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x65,
-	0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65,
-	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4a, 0x0a, 0x09, 0x55, 0x6e,
-	0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x12, 0x1c, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73,
-	0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x52, 0x65,
-	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f,
-	0x6e, 0x73, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70,
-	0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x06, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e,
-	0x12, 0x19, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x41, 0x63,
-	0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x65, 0x78,
-	0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52,
-	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x3a, 0x5a, 0x38, 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, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x3b, 0x65, 0x78, 0x74, 0x65, 0x6e,
-	0x73, 0x69, 0x6f, 0x6e, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x65, 0x52, 0x04, 0x72, 0x65, 0x66, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x70, 0x61, 0x72, 0x61, 0x6d,
+	0x73, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xda, 0x50, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x10, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x43, 0x6f, 0x6c, 0x6c, 0x65,
+	0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x18, 0xa0, 0x51, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73,
+	0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x11, 0x6e,
+	0x61, 0x76, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+	0x18, 0x84, 0x52, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x6e, 0x61, 0x76, 0x69, 0x67, 0x61, 0x74,
+	0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x10, 0x6e, 0x61, 0x76,
+	0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x18, 0x8e, 0x52,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6e, 0x61, 0x76, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+	0x52, 0x6f, 0x75, 0x74, 0x65, 0x12, 0x19, 0x0a, 0x07, 0x61, 0x75, 0x74, 0x6f, 0x72, 0x75, 0x6e,
+	0x18, 0x98, 0x52, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x75, 0x74, 0x6f, 0x72, 0x75, 0x6e,
+	0x12, 0x19, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x18, 0xa2, 0x52, 0x20, 0x01,
+	0x28, 0x08, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x22, 0x95, 0x01, 0x0a, 0x04,
+	0x4b, 0x69, 0x6e, 0x64, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10,
+	0x00, 0x12, 0x09, 0x0a, 0x05, 0x53, 0x50, 0x41, 0x43, 0x45, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b,
+	0x45, 0x4e, 0x56, 0x49, 0x52, 0x4f, 0x4e, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x02, 0x12, 0x0e, 0x0a,
+	0x0a, 0x43, 0x4f, 0x4c, 0x4c, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x03, 0x12, 0x08, 0x0a,
+	0x04, 0x49, 0x54, 0x45, 0x4d, 0x10, 0x04, 0x12, 0x09, 0x0a, 0x05, 0x49, 0x54, 0x45, 0x4d, 0x53,
+	0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x45, 0x56, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x10, 0x06,
+	0x12, 0x0a, 0x0a, 0x06, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x10, 0x07, 0x12, 0x0e, 0x0a, 0x09,
+	0x4d, 0x41, 0x49, 0x4e, 0x5f, 0x4d, 0x45, 0x4e, 0x55, 0x10, 0x90, 0x4e, 0x12, 0x15, 0x0a, 0x10,
+	0x4d, 0x41, 0x49, 0x4e, 0x5f, 0x4d, 0x45, 0x4e, 0x55, 0x5f, 0x42, 0x4f, 0x54, 0x54, 0x4f, 0x4d,
+	0x10, 0x9a, 0x4e, 0x22, 0xdf, 0x03, 0x0a, 0x0d, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69,
+	0x6f, 0x6e, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e,
+	0x73, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xf4,
+	0x4e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a,
+	0x08, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x84, 0x52, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x07, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x6e, 0x76,
+	0x5f, 0x69, 0x64, 0x18, 0x8e, 0x52, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49,
+	0x64, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f,
+	0x69, 0x64, 0x18, 0x98, 0x52, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65,
+	0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x69, 0x74, 0x65, 0x6d, 0x5f,
+	0x69, 0x64, 0x18, 0xa2, 0x52, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x69, 0x74, 0x65, 0x6d, 0x49,
+	0x64, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x74, 0x65, 0x6d, 0x5f, 0x69, 0x64, 0x73, 0x18, 0xac, 0x52,
+	0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x69, 0x74, 0x65, 0x6d, 0x49, 0x64, 0x73, 0x12, 0x17, 0x0a,
+	0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0xb6, 0x52, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06,
+	0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x44, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61,
+	0x74, 0x61, 0x18, 0xf8, 0x55, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x65, 0x78, 0x74, 0x65,
+	0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74,
+	0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x32, 0x0a, 0x04,
+	0x72, 0x65, 0x66, 0x73, 0x18, 0x82, 0x56, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x63, 0x6f,
+	0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73,
+	0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x04, 0x72, 0x65, 0x66, 0x73,
+	0x12, 0x36, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x8c, 0x56, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x1d, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x72, 0x65, 0x66, 0x65,
+	0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65,
+	0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61,
+	0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76,
+	0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75,
+	0x65, 0x3a, 0x02, 0x38, 0x01, 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, 0x12, 0x0a, 0x0a, 0x06, 0x44,
+	0x52, 0x41, 0x57, 0x45, 0x52, 0x10, 0x05, 0x12, 0x10, 0x0a, 0x0c, 0x4e, 0x4f, 0x54, 0x49, 0x46,
+	0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x06, 0x12, 0x09, 0x0a, 0x05, 0x42, 0x4c, 0x41,
+	0x4e, 0x4b, 0x10, 0x07, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x64, 0x42, 0x3a,
+	0x5a, 0x38, 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, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x3b,
+	0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x33,
 }
 
 var (
@@ -1622,65 +662,30 @@ func file_extensions_extension_proto_rawDescGZIP() []byte {
 	return file_extensions_extension_proto_rawDescData
 }
 
-var file_extensions_extension_proto_enumTypes = make([]protoimpl.EnumInfo, 5)
-var file_extensions_extension_proto_msgTypes = make([]protoimpl.MessageInfo, 14)
+var file_extensions_extension_proto_enumTypes = make([]protoimpl.EnumInfo, 2)
+var file_extensions_extension_proto_msgTypes = make([]protoimpl.MessageInfo, 3)
 var file_extensions_extension_proto_goTypes = []interface{}{
-	(Target)(0),                       // 0: extensions.Target
-	(ExtensionRequestResult_State)(0), // 1: extensions.ExtensionRequestResult.State
-	(ActionResponse_State)(0),         // 2: extensions.ActionResponse.State
-	(ActionResponse_Format)(0),        // 3: extensions.ActionResponse.Format
-	(Action_Kind)(0),                  // 4: extensions.Action.Kind
-	(*InstallRequest)(nil),            // 5: extensions.InstallRequest
-	(*ExtensionRequestResult)(nil),    // 6: extensions.ExtensionRequestResult
-	(*InstallResponse)(nil),           // 7: extensions.InstallResponse
-	(*UninstallRequest)(nil),          // 8: extensions.UninstallRequest
-	(*UninstallResponse)(nil),         // 9: extensions.UninstallResponse
-	(*UpdateRequest)(nil),             // 10: extensions.UpdateRequest
-	(*UpdateResponse)(nil),            // 11: extensions.UpdateResponse
-	(*CheckRequest)(nil),              // 12: extensions.CheckRequest
-	(*CheckResponse)(nil),             // 13: extensions.CheckResponse
-	(*ActionRequest)(nil),             // 14: extensions.ActionRequest
-	(*ActionResponse)(nil),            // 15: extensions.ActionResponse
-	(*Action)(nil),                    // 16: extensions.Action
-	nil,                               // 17: extensions.ActionRequest.MetadataEntry
-	nil,                               // 18: extensions.ActionResponse.MetadataEntry
-	(*references.Reference)(nil),      // 19: content.references.Reference
+	(Target)(0),                  // 0: extensions.Target
+	(Action_Kind)(0),             // 1: extensions.Action.Kind
+	(*Action)(nil),               // 2: extensions.Action
+	(*ActionRequest)(nil),        // 3: extensions.ActionRequest
+	nil,                          // 4: extensions.ActionRequest.MetadataEntry
+	(*references.Reference)(nil), // 5: content.references.Reference
 }
 var file_extensions_extension_proto_depIdxs = []int32{
-	1,  // 0: extensions.ExtensionRequestResult.state:type_name -> extensions.ExtensionRequestResult.State
-	6,  // 1: extensions.InstallResponse.results:type_name -> extensions.ExtensionRequestResult
-	6,  // 2: extensions.UninstallResponse.results:type_name -> extensions.ExtensionRequestResult
-	6,  // 3: extensions.UpdateResponse.results:type_name -> extensions.ExtensionRequestResult
-	6,  // 4: extensions.CheckResponse.results:type_name -> extensions.ExtensionRequestResult
-	17, // 5: extensions.ActionRequest.metadata:type_name -> extensions.ActionRequest.MetadataEntry
-	19, // 6: extensions.ActionRequest.refs:type_name -> content.references.Reference
-	19, // 7: extensions.ActionRequest.params:type_name -> content.references.Reference
-	2,  // 8: extensions.ActionResponse.state:type_name -> extensions.ActionResponse.State
-	0,  // 9: extensions.ActionResponse.target:type_name -> extensions.Target
-	3,  // 10: extensions.ActionResponse.format:type_name -> extensions.ActionResponse.Format
-	16, // 11: extensions.ActionResponse.next:type_name -> extensions.Action
-	18, // 12: extensions.ActionResponse.metadata:type_name -> extensions.ActionResponse.MetadataEntry
-	19, // 13: extensions.ActionResponse.refs:type_name -> content.references.Reference
-	0,  // 14: extensions.Action.target:type_name -> extensions.Target
-	19, // 15: extensions.Action.image:type_name -> content.references.Reference
-	4,  // 16: extensions.Action.kind:type_name -> extensions.Action.Kind
-	19, // 17: extensions.Action.refs:type_name -> content.references.Reference
-	14, // 18: extensions.Action.request:type_name -> extensions.ActionRequest
-	5,  // 19: extensions.Extension.Install:input_type -> extensions.InstallRequest
-	12, // 20: extensions.Extension.Check:input_type -> extensions.CheckRequest
-	10, // 21: extensions.Extension.Update:input_type -> extensions.UpdateRequest
-	8,  // 22: extensions.Extension.Uninstall:input_type -> extensions.UninstallRequest
-	14, // 23: extensions.Extension.Action:input_type -> extensions.ActionRequest
-	7,  // 24: extensions.Extension.Install:output_type -> extensions.InstallResponse
-	13, // 25: extensions.Extension.Check:output_type -> extensions.CheckResponse
-	11, // 26: extensions.Extension.Update:output_type -> extensions.UpdateResponse
-	9,  // 27: extensions.Extension.Uninstall:output_type -> extensions.UninstallResponse
-	15, // 28: extensions.Extension.Action:output_type -> extensions.ActionResponse
-	24, // [24:29] is the sub-list for method output_type
-	19, // [19:24] is the sub-list for method input_type
-	19, // [19:19] is the sub-list for extension type_name
-	19, // [19:19] is the sub-list for extension extendee
-	0,  // [0:19] is the sub-list for field type_name
+	0, // 0: extensions.Action.target:type_name -> extensions.Target
+	5, // 1: extensions.Action.image:type_name -> content.references.Reference
+	1, // 2: extensions.Action.kind:type_name -> extensions.Action.Kind
+	5, // 3: extensions.Action.refs:type_name -> content.references.Reference
+	3, // 4: extensions.Action.request:type_name -> extensions.ActionRequest
+	4, // 5: extensions.ActionRequest.metadata:type_name -> extensions.ActionRequest.MetadataEntry
+	5, // 6: extensions.ActionRequest.refs:type_name -> content.references.Reference
+	5, // 7: extensions.ActionRequest.params:type_name -> content.references.Reference
+	8, // [8:8] is the sub-list for method output_type
+	8, // [8:8] is the sub-list for method input_type
+	8, // [8:8] is the sub-list for extension type_name
+	8, // [8:8] is the sub-list for extension extendee
+	0, // [0:8] is the sub-list for field type_name
 }
 
 func init() { file_extensions_extension_proto_init() }
@@ -1690,7 +695,7 @@ func file_extensions_extension_proto_init() {
 	}
 	if !protoimpl.UnsafeEnabled {
 		file_extensions_extension_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*InstallRequest); i {
+			switch v := v.(*Action); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -1702,102 +707,6 @@ func file_extensions_extension_proto_init() {
 			}
 		}
 		file_extensions_extension_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*ExtensionRequestResult); 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].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*InstallResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_extensions_extension_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
-			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_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*UninstallResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_extensions_extension_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*UpdateRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_extensions_extension_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*UpdateResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_extensions_extension_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
-			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_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*CheckResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_extensions_extension_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*ActionRequest); i {
 			case 0:
 				return &v.state
@@ -1809,40 +718,16 @@ func file_extensions_extension_proto_init() {
 				return nil
 			}
 		}
-		file_extensions_extension_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*ActionResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_extensions_extension_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Action); 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{
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_extensions_extension_proto_rawDesc,
-			NumEnums:      5,
-			NumMessages:   14,
+			NumEnums:      2,
+			NumMessages:   3,
 			NumExtensions: 0,
-			NumServices:   1,
+			NumServices:   0,
 		},
 		GoTypes:           file_extensions_extension_proto_goTypes,
 		DependencyIndexes: file_extensions_extension_proto_depIdxs,
diff --git a/proto/extensions/extension_grpc.pb.go b/proto/extensions/extension_grpc.pb.go
deleted file mode 100644
index 784527d37db21be2337aa3406ef3dd83eb87e940..0000000000000000000000000000000000000000
--- a/proto/extensions/extension_grpc.pb.go
+++ /dev/null
@@ -1,319 +0,0 @@
-//*
-//# Расширения (Extensions)
-//
-//Расширения представляют собой отдельные сервисы предоставляющие дополнительные возможности для пользователей. Сервис
-//может предоставлять несколько расширений одновременно.
-//
-//Для координации взаимодействия используется сервис менеджер расширений (Extension Manager). Для предоставления своих функций в систему сервис должен
-//зарегистрироваться на контроллере.
-//
-
-// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
-// versions:
-// - protoc-gen-go-grpc v1.3.0
-// - protoc             v4.23.4
-// source: extensions/extension.proto
-
-package extensions
-
-import (
-	context "context"
-	grpc "google.golang.org/grpc"
-	codes "google.golang.org/grpc/codes"
-	status "google.golang.org/grpc/status"
-)
-
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the grpc package it is being compiled against.
-// Requires gRPC-Go v1.32.0 or later.
-const _ = grpc.SupportPackageIsVersion7
-
-const (
-	Extension_Install_FullMethodName   = "/extensions.Extension/Install"
-	Extension_Check_FullMethodName     = "/extensions.Extension/Check"
-	Extension_Update_FullMethodName    = "/extensions.Extension/Update"
-	Extension_Uninstall_FullMethodName = "/extensions.Extension/Uninstall"
-	Extension_Action_FullMethodName    = "/extensions.Extension/Action"
-)
-
-// ExtensionClient is the client API for Extension service.
-//
-// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
-type ExtensionClient interface {
-	// Для установки расширения выполняется запрос к сервису с указанием расширений которые должны быть установлены. Если
-	// расширение уже установлено процесс возвращает ошибку.
-	Install(ctx context.Context, in *InstallRequest, opts ...grpc.CallOption) (*InstallResponse, error)
-	// Можно запросить проверку статуса установки для расширения. При этом расширение проверяет наличие необходимых данных в
-	// пространстве или наличие новой версии расширения и сообщает об этом. Никаких действий с данными пространства не
-	// производится.
-	Check(ctx context.Context, in *CheckRequest, opts ...grpc.CallOption) (*CheckResponse, error)
-	// Сервис выполняет необходимые действия с данными и миграции для соответствия нужной версии расширения.
-	// Если расширение не установлено процесс обновления возвращает ошибку.
-	Update(ctx context.Context, in *UpdateRequest, opts ...grpc.CallOption) (*UpdateResponse, error)
-	// Удаление расширения из пространства.
-	Uninstall(ctx context.Context, in *UninstallRequest, opts ...grpc.CallOption) (*UninstallResponse, error)
-	// Пользовательские Действия (Actions)
-	//
-	// Пользовательские действия позволяют расширить функционал пользовательского интерфейса путем
-	// добавления в интерфейс элементов взаимодействуя с которыми пользователь может вызывать реакцию на
-	// сервере или переход в интерфейсе.
-	//
-	// Пользовательские действия добавляются при установке расширений в системную коллекции `System/Actions`.
-	// Коллекция создается автоматически менеджером расширений. При установке так же отображается меню `Действия`
-	// доступное для всех пользователей.
-	//
-	// Примеры пользовательских действий:
-	//   - "Собрать сайт" - добавляется Perxis.Web для сборки сайта, доступна пользователю через меню,
-	//     параметры space_id, env_id. При вызове выполняется запрос на сервер ProcessAction.
-	//   - "Посмотреть задачи" - добавляется Tasks для перехода на коллекцию задач. Отображается в меню,
-	//     параметры space_id, env_id.
-	//
-	// Приложения так же могут использовать действия для вызова обработки в других приложениях при
-	// необходимости.
-	Action(ctx context.Context, in *ActionRequest, opts ...grpc.CallOption) (*ActionResponse, error)
-}
-
-type extensionClient struct {
-	cc grpc.ClientConnInterface
-}
-
-func NewExtensionClient(cc grpc.ClientConnInterface) ExtensionClient {
-	return &extensionClient{cc}
-}
-
-func (c *extensionClient) Install(ctx context.Context, in *InstallRequest, opts ...grpc.CallOption) (*InstallResponse, error) {
-	out := new(InstallResponse)
-	err := c.cc.Invoke(ctx, Extension_Install_FullMethodName, in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-func (c *extensionClient) Check(ctx context.Context, in *CheckRequest, opts ...grpc.CallOption) (*CheckResponse, error) {
-	out := new(CheckResponse)
-	err := c.cc.Invoke(ctx, Extension_Check_FullMethodName, in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-func (c *extensionClient) Update(ctx context.Context, in *UpdateRequest, opts ...grpc.CallOption) (*UpdateResponse, error) {
-	out := new(UpdateResponse)
-	err := c.cc.Invoke(ctx, Extension_Update_FullMethodName, in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-func (c *extensionClient) Uninstall(ctx context.Context, in *UninstallRequest, opts ...grpc.CallOption) (*UninstallResponse, error) {
-	out := new(UninstallResponse)
-	err := c.cc.Invoke(ctx, Extension_Uninstall_FullMethodName, in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-func (c *extensionClient) Action(ctx context.Context, in *ActionRequest, opts ...grpc.CallOption) (*ActionResponse, error) {
-	out := new(ActionResponse)
-	err := c.cc.Invoke(ctx, Extension_Action_FullMethodName, in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-// ExtensionServer is the server API for Extension service.
-// All implementations must embed UnimplementedExtensionServer
-// for forward compatibility
-type ExtensionServer interface {
-	// Для установки расширения выполняется запрос к сервису с указанием расширений которые должны быть установлены. Если
-	// расширение уже установлено процесс возвращает ошибку.
-	Install(context.Context, *InstallRequest) (*InstallResponse, error)
-	// Можно запросить проверку статуса установки для расширения. При этом расширение проверяет наличие необходимых данных в
-	// пространстве или наличие новой версии расширения и сообщает об этом. Никаких действий с данными пространства не
-	// производится.
-	Check(context.Context, *CheckRequest) (*CheckResponse, error)
-	// Сервис выполняет необходимые действия с данными и миграции для соответствия нужной версии расширения.
-	// Если расширение не установлено процесс обновления возвращает ошибку.
-	Update(context.Context, *UpdateRequest) (*UpdateResponse, error)
-	// Удаление расширения из пространства.
-	Uninstall(context.Context, *UninstallRequest) (*UninstallResponse, error)
-	// Пользовательские Действия (Actions)
-	//
-	// Пользовательские действия позволяют расширить функционал пользовательского интерфейса путем
-	// добавления в интерфейс элементов взаимодействуя с которыми пользователь может вызывать реакцию на
-	// сервере или переход в интерфейсе.
-	//
-	// Пользовательские действия добавляются при установке расширений в системную коллекции `System/Actions`.
-	// Коллекция создается автоматически менеджером расширений. При установке так же отображается меню `Действия`
-	// доступное для всех пользователей.
-	//
-	// Примеры пользовательских действий:
-	//   - "Собрать сайт" - добавляется Perxis.Web для сборки сайта, доступна пользователю через меню,
-	//     параметры space_id, env_id. При вызове выполняется запрос на сервер ProcessAction.
-	//   - "Посмотреть задачи" - добавляется Tasks для перехода на коллекцию задач. Отображается в меню,
-	//     параметры space_id, env_id.
-	//
-	// Приложения так же могут использовать действия для вызова обработки в других приложениях при
-	// необходимости.
-	Action(context.Context, *ActionRequest) (*ActionResponse, error)
-	mustEmbedUnimplementedExtensionServer()
-}
-
-// UnimplementedExtensionServer must be embedded to have forward compatible implementations.
-type UnimplementedExtensionServer struct {
-}
-
-func (UnimplementedExtensionServer) Install(context.Context, *InstallRequest) (*InstallResponse, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method Install not implemented")
-}
-func (UnimplementedExtensionServer) Check(context.Context, *CheckRequest) (*CheckResponse, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method Check not implemented")
-}
-func (UnimplementedExtensionServer) Update(context.Context, *UpdateRequest) (*UpdateResponse, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method Update not implemented")
-}
-func (UnimplementedExtensionServer) Uninstall(context.Context, *UninstallRequest) (*UninstallResponse, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method Uninstall not implemented")
-}
-func (UnimplementedExtensionServer) Action(context.Context, *ActionRequest) (*ActionResponse, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method Action not implemented")
-}
-func (UnimplementedExtensionServer) mustEmbedUnimplementedExtensionServer() {}
-
-// UnsafeExtensionServer may be embedded to opt out of forward compatibility for this service.
-// Use of this interface is not recommended, as added methods to ExtensionServer will
-// result in compilation errors.
-type UnsafeExtensionServer interface {
-	mustEmbedUnimplementedExtensionServer()
-}
-
-func RegisterExtensionServer(s grpc.ServiceRegistrar, srv ExtensionServer) {
-	s.RegisterService(&Extension_ServiceDesc, srv)
-}
-
-func _Extension_Install_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(InstallRequest)
-	if err := dec(in); err != nil {
-		return nil, err
-	}
-	if interceptor == nil {
-		return srv.(ExtensionServer).Install(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: Extension_Install_FullMethodName,
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(ExtensionServer).Install(ctx, req.(*InstallRequest))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-func _Extension_Check_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(CheckRequest)
-	if err := dec(in); err != nil {
-		return nil, err
-	}
-	if interceptor == nil {
-		return srv.(ExtensionServer).Check(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: Extension_Check_FullMethodName,
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(ExtensionServer).Check(ctx, req.(*CheckRequest))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-func _Extension_Update_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(UpdateRequest)
-	if err := dec(in); err != nil {
-		return nil, err
-	}
-	if interceptor == nil {
-		return srv.(ExtensionServer).Update(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: Extension_Update_FullMethodName,
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(ExtensionServer).Update(ctx, req.(*UpdateRequest))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-func _Extension_Uninstall_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(UninstallRequest)
-	if err := dec(in); err != nil {
-		return nil, err
-	}
-	if interceptor == nil {
-		return srv.(ExtensionServer).Uninstall(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: Extension_Uninstall_FullMethodName,
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(ExtensionServer).Uninstall(ctx, req.(*UninstallRequest))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-func _Extension_Action_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(ActionRequest)
-	if err := dec(in); err != nil {
-		return nil, err
-	}
-	if interceptor == nil {
-		return srv.(ExtensionServer).Action(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: Extension_Action_FullMethodName,
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(ExtensionServer).Action(ctx, req.(*ActionRequest))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-// Extension_ServiceDesc is the grpc.ServiceDesc for Extension service.
-// It's only intended for direct use with grpc.RegisterService,
-// and not to be introspected or modified (even as a copy)
-var Extension_ServiceDesc = grpc.ServiceDesc{
-	ServiceName: "extensions.Extension",
-	HandlerType: (*ExtensionServer)(nil),
-	Methods: []grpc.MethodDesc{
-		{
-			MethodName: "Install",
-			Handler:    _Extension_Install_Handler,
-		},
-		{
-			MethodName: "Check",
-			Handler:    _Extension_Check_Handler,
-		},
-		{
-			MethodName: "Update",
-			Handler:    _Extension_Update_Handler,
-		},
-		{
-			MethodName: "Uninstall",
-			Handler:    _Extension_Uninstall_Handler,
-		},
-		{
-			MethodName: "Action",
-			Handler:    _Extension_Action_Handler,
-		},
-	},
-	Streams:  []grpc.StreamDesc{},
-	Metadata: "extensions/extension.proto",
-}
diff --git a/proto/extensions/extension_service.pb.go b/proto/extensions/extension_service.pb.go
index f4d0b11103c6cafa6097cb2cd7074b88e6467aed..f8f4cd445770862142c6c7d30463fe26189ec1d0 100644
--- a/proto/extensions/extension_service.pb.go
+++ b/proto/extensions/extension_service.pb.go
@@ -84,7 +84,7 @@ func (x ActionResponse_State) Number() protoreflect.EnumNumber {
 
 // Deprecated: Use ActionResponse_State.Descriptor instead.
 func (ActionResponse_State) EnumDescriptor() ([]byte, []int) {
-	return file_extensions_extension_service_proto_rawDescGZIP(), []int{4, 0}
+	return file_extensions_extension_service_proto_rawDescGZIP(), []int{3, 0}
 }
 
 type ActionResponse_Format int32
@@ -133,7 +133,7 @@ func (x ActionResponse_Format) Number() protoreflect.EnumNumber {
 
 // Deprecated: Use ActionResponse_Format.Descriptor instead.
 func (ActionResponse_Format) EnumDescriptor() ([]byte, []int) {
-	return file_extensions_extension_service_proto_rawDescGZIP(), []int{4, 1}
+	return file_extensions_extension_service_proto_rawDescGZIP(), []int{3, 1}
 }
 
 // InstallRequest - запрос на установку расширений
@@ -216,56 +216,6 @@ func (x *InstallRequest) GetUpdate() bool {
 	return false
 }
 
-// ExtensionList - возвращает список состояний расширений в результате выполнения операции `common.Operation`
-// (СЃРј. `common.OperationService`)
-// В методах Install, Uninstall, Check возвращается список состояний расширений в результате выполнения операции
-type ExtensionList struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	Results []*Extension `protobuf:"bytes,10000,rep,name=results,proto3" json:"results,omitempty"` // Список состояний расширений
-}
-
-func (x *ExtensionList) Reset() {
-	*x = ExtensionList{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_extensions_extension_service_proto_msgTypes[1]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *ExtensionList) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*ExtensionList) ProtoMessage() {}
-
-func (x *ExtensionList) ProtoReflect() protoreflect.Message {
-	mi := &file_extensions_extension_service_proto_msgTypes[1]
-	if protoimpl.UnsafeEnabled && x != nil {
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		if ms.LoadMessageInfo() == nil {
-			ms.StoreMessageInfo(mi)
-		}
-		return ms
-	}
-	return mi.MessageOf(x)
-}
-
-// Deprecated: Use ExtensionList.ProtoReflect.Descriptor instead.
-func (*ExtensionList) Descriptor() ([]byte, []int) {
-	return file_extensions_extension_service_proto_rawDescGZIP(), []int{1}
-}
-
-func (x *ExtensionList) GetResults() []*Extension {
-	if x != nil {
-		return x.Results
-	}
-	return nil
-}
-
 // UninstallRequest - запрос на удаление расширений
 type UninstallRequest struct {
 	state         protoimpl.MessageState
@@ -282,7 +232,7 @@ type UninstallRequest struct {
 func (x *UninstallRequest) Reset() {
 	*x = UninstallRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_extensions_extension_service_proto_msgTypes[2]
+		mi := &file_extensions_extension_service_proto_msgTypes[1]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -295,7 +245,7 @@ func (x *UninstallRequest) String() string {
 func (*UninstallRequest) ProtoMessage() {}
 
 func (x *UninstallRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_extensions_extension_service_proto_msgTypes[2]
+	mi := &file_extensions_extension_service_proto_msgTypes[1]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -308,7 +258,7 @@ func (x *UninstallRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use UninstallRequest.ProtoReflect.Descriptor instead.
 func (*UninstallRequest) Descriptor() ([]byte, []int) {
-	return file_extensions_extension_service_proto_rawDescGZIP(), []int{2}
+	return file_extensions_extension_service_proto_rawDescGZIP(), []int{1}
 }
 
 func (x *UninstallRequest) GetExtensions() []string {
@@ -360,7 +310,7 @@ type CheckRequest struct {
 func (x *CheckRequest) Reset() {
 	*x = CheckRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_extensions_extension_service_proto_msgTypes[3]
+		mi := &file_extensions_extension_service_proto_msgTypes[2]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -373,7 +323,7 @@ func (x *CheckRequest) String() string {
 func (*CheckRequest) ProtoMessage() {}
 
 func (x *CheckRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_extensions_extension_service_proto_msgTypes[3]
+	mi := &file_extensions_extension_service_proto_msgTypes[2]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -386,7 +336,7 @@ func (x *CheckRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use CheckRequest.ProtoReflect.Descriptor instead.
 func (*CheckRequest) Descriptor() ([]byte, []int) {
-	return file_extensions_extension_service_proto_rawDescGZIP(), []int{3}
+	return file_extensions_extension_service_proto_rawDescGZIP(), []int{2}
 }
 
 func (x *CheckRequest) GetExtensions() []string {
@@ -430,7 +380,7 @@ type ActionResponse struct {
 func (x *ActionResponse) Reset() {
 	*x = ActionResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_extensions_extension_service_proto_msgTypes[4]
+		mi := &file_extensions_extension_service_proto_msgTypes[3]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -443,7 +393,7 @@ func (x *ActionResponse) String() string {
 func (*ActionResponse) ProtoMessage() {}
 
 func (x *ActionResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_extensions_extension_service_proto_msgTypes[4]
+	mi := &file_extensions_extension_service_proto_msgTypes[3]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -456,7 +406,7 @@ func (x *ActionResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use ActionResponse.ProtoReflect.Descriptor instead.
 func (*ActionResponse) Descriptor() ([]byte, []int) {
-	return file_extensions_extension_service_proto_rawDescGZIP(), []int{4}
+	return file_extensions_extension_service_proto_rawDescGZIP(), []int{3}
 }
 
 func (x *ActionResponse) GetState() ActionResponse_State {
@@ -549,87 +499,83 @@ var file_extensions_extension_service_proto_rawDesc = []byte{
 	0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x05, 0x66, 0x6f, 0x72,
 	0x63, 0x65, 0x18, 0xf4, 0x4e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65,
 	0x12, 0x17, 0x0a, 0x06, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0xd8, 0x4f, 0x20, 0x01, 0x28,
-	0x08, 0x52, 0x06, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x22, 0x41, 0x0a, 0x0d, 0x45, 0x78, 0x74,
-	0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x30, 0x0a, 0x07, 0x72, 0x65,
-	0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x90, 0x4e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x65,
-	0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73,
-	0x69, 0x6f, 0x6e, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x97, 0x01, 0x0a,
-	0x10, 0x55, 0x6e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
-	0x74, 0x12, 0x1f, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18,
-	0x90, 0x4e, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f,
-	0x6e, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x9a,
-	0x4e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x16,
-	0x0a, 0x06, 0x65, 0x6e, 0x76, 0x5f, 0x69, 0x64, 0x18, 0xa4, 0x4e, 0x20, 0x01, 0x28, 0x09, 0x52,
-	0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65,
-	0x18, 0xf4, 0x4e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12,
-	0x15, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0xd8, 0x4f, 0x20, 0x01, 0x28, 0x08, 0x52,
-	0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x63, 0x0a, 0x0c, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52,
-	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73,
-	0x69, 0x6f, 0x6e, 0x73, 0x18, 0x90, 0x4e, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x74,
-	0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x70, 0x61, 0x63, 0x65,
-	0x5f, 0x69, 0x64, 0x18, 0x9a, 0x4e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x70, 0x61, 0x63,
-	0x65, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x6e, 0x76, 0x5f, 0x69, 0x64, 0x18, 0xa4, 0x4e,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x22, 0xed, 0x04, 0x0a, 0x0e,
-	0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37,
-	0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x90, 0x4e, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20,
-	0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x41, 0x63, 0x74, 0x69,
-	0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65,
-	0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2b, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65,
-	0x74, 0x18, 0x9a, 0x4e, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e,
-	0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61,
-	0x72, 0x67, 0x65, 0x74, 0x12, 0x3a, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0xc2,
-	0x4e, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f,
-	0x6e, 0x73, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
-	0x65, 0x2e, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74,
-	0x12, 0x11, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0xf4, 0x4e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03,
-	0x6d, 0x73, 0x67, 0x12, 0x15, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0xfe, 0x4e, 0x20,
-	0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x15, 0x0a, 0x05, 0x69, 0x6d,
-	0x61, 0x67, 0x65, 0x18, 0x9c, 0x4f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67,
-	0x65, 0x12, 0x15, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xd8, 0x4f, 0x20, 0x01, 0x28,
-	0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x27, 0x0a, 0x04, 0x6e, 0x65, 0x78, 0x74,
-	0x18, 0xbc, 0x50, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73,
-	0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x04, 0x6e, 0x65, 0x78,
-	0x74, 0x12, 0x45, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0xa0, 0x51,
-	0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e,
-	0x73, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
-	0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08,
-	0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x32, 0x0a, 0x04, 0x72, 0x65, 0x66, 0x73,
-	0x18, 0xd0, 0x50, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
-	0x74, 0x2e, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x66,
-	0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x04, 0x72, 0x65, 0x66, 0x73, 0x1a, 0x3b, 0x0a, 0x0d,
-	0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a,
-	0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12,
-	0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05,
-	0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x53, 0x0a, 0x05, 0x53, 0x74, 0x61,
-	0x74, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05,
-	0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x45, 0x4e, 0x44, 0x49,
-	0x4e, 0x47, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52,
-	0x45, 0x53, 0x53, 0x10, 0x03, 0x12, 0x17, 0x0a, 0x13, 0x50, 0x41, 0x52, 0x41, 0x4d, 0x45, 0x54,
-	0x45, 0x52, 0x53, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x10, 0x04, 0x22, 0x2b,
-	0x0a, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x09, 0x0a, 0x05, 0x50, 0x4c, 0x41, 0x49,
-	0x4e, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x54, 0x4d, 0x4c, 0x10, 0x01, 0x12, 0x0c, 0x0a,
-	0x08, 0x4d, 0x41, 0x52, 0x4b, 0x44, 0x4f, 0x57, 0x4e, 0x10, 0x02, 0x32, 0x89, 0x02, 0x0a, 0x10,
-	0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
-	0x12, 0x3a, 0x0a, 0x07, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x12, 0x1a, 0x2e, 0x65, 0x78,
-	0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c,
-	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,
-	0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x09,
-	0x55, 0x6e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x12, 0x1c, 0x2e, 0x65, 0x78, 0x74, 0x65,
-	0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c,
-	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,
-	0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x00, 0x12, 0x36, 0x0a, 0x05,
-	0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x18, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f,
-	0x6e, 0x73, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
-	0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69,
-	0x6f, 0x6e, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x06, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19,
-	0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x41, 0x63, 0x74, 0x69,
-	0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x65, 0x78, 0x74, 0x65,
-	0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73,
-	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x3a, 0x5a, 0x38, 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, 0x78,
-	0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x3b, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69,
-	0x6f, 0x6e, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x08, 0x52, 0x06, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x22, 0x97, 0x01, 0x0a, 0x10, 0x55, 0x6e,
+	0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f,
+	0x0a, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x90, 0x4e, 0x20,
+	0x03, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12,
+	0x1a, 0x0a, 0x08, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x9a, 0x4e, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x07, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x65,
+	0x6e, 0x76, 0x5f, 0x69, 0x64, 0x18, 0xa4, 0x4e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e,
+	0x76, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0xf4, 0x4e,
+	0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x15, 0x0a, 0x05,
+	0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0xd8, 0x4f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f,
+	0x72, 0x63, 0x65, 0x22, 0x63, 0x0a, 0x0c, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e,
+	0x73, 0x18, 0x90, 0x4e, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73,
+	0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64,
+	0x18, 0x9a, 0x4e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64,
+	0x12, 0x16, 0x0a, 0x06, 0x65, 0x6e, 0x76, 0x5f, 0x69, 0x64, 0x18, 0xa4, 0x4e, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x22, 0xed, 0x04, 0x0a, 0x0e, 0x41, 0x63, 0x74,
+	0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x05, 0x73,
+	0x74, 0x61, 0x74, 0x65, 0x18, 0x90, 0x4e, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x65, 0x78,
+	0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73,
+	0x74, 0x61, 0x74, 0x65, 0x12, 0x2b, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x9a,
+	0x4e, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f,
+	0x6e, 0x73, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65,
+	0x74, 0x12, 0x3a, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0xc2, 0x4e, 0x20, 0x01,
+	0x28, 0x0e, 0x32, 0x21, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e,
+	0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x46,
+	0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x11, 0x0a,
+	0x03, 0x6d, 0x73, 0x67, 0x18, 0xf4, 0x4e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67,
+	0x12, 0x15, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0xfe, 0x4e, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x15, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65,
+	0x18, 0x9c, 0x4f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x15,
+	0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xd8, 0x4f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05,
+	0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x27, 0x0a, 0x04, 0x6e, 0x65, 0x78, 0x74, 0x18, 0xbc, 0x50,
+	0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e,
+	0x73, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x04, 0x6e, 0x65, 0x78, 0x74, 0x12, 0x45,
+	0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0xa0, 0x51, 0x20, 0x03, 0x28,
+	0x0b, 0x32, 0x28, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x41,
+	0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4d, 0x65,
+	0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74,
+	0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x32, 0x0a, 0x04, 0x72, 0x65, 0x66, 0x73, 0x18, 0xd0, 0x50,
+	0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x72,
+	0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65,
+	0x6e, 0x63, 0x65, 0x52, 0x04, 0x72, 0x65, 0x66, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74,
+	0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65,
+	0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05,
+	0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c,
+	0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x53, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12,
+	0x08, 0x0a, 0x04, 0x44, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52,
+	0x4f, 0x52, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10,
+	0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53,
+	0x10, 0x03, 0x12, 0x17, 0x0a, 0x13, 0x50, 0x41, 0x52, 0x41, 0x4d, 0x45, 0x54, 0x45, 0x52, 0x53,
+	0x5f, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x10, 0x04, 0x22, 0x2b, 0x0a, 0x06, 0x46,
+	0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x09, 0x0a, 0x05, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x10, 0x00,
+	0x12, 0x08, 0x0a, 0x04, 0x48, 0x54, 0x4d, 0x4c, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x4d, 0x41,
+	0x52, 0x4b, 0x44, 0x4f, 0x57, 0x4e, 0x10, 0x02, 0x32, 0x89, 0x02, 0x0a, 0x10, 0x45, 0x78, 0x74,
+	0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x3a, 0x0a,
+	0x07, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x12, 0x1a, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e,
+	0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4f, 0x70,
+	0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x09, 0x55, 0x6e, 0x69,
+	0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x12, 0x1c, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69,
+	0x6f, 0x6e, 0x73, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4f, 0x70,
+	0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x00, 0x12, 0x36, 0x0a, 0x05, 0x43, 0x68, 0x65,
+	0x63, 0x6b, 0x12, 0x18, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e,
+	0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x63,
+	0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22,
+	0x00, 0x12, 0x41, 0x0a, 0x06, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x2e, 0x65, 0x78,
+	0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69,
+	0x6f, 0x6e, 0x73, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x73, 0x65, 0x22, 0x00, 0x42, 0x3a, 0x5a, 0x38, 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, 0x78, 0x74, 0x65, 0x6e,
+	0x73, 0x69, 0x6f, 0x6e, 0x73, 0x3b, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73,
+	0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
@@ -645,44 +591,41 @@ func file_extensions_extension_service_proto_rawDescGZIP() []byte {
 }
 
 var file_extensions_extension_service_proto_enumTypes = make([]protoimpl.EnumInfo, 2)
-var file_extensions_extension_service_proto_msgTypes = make([]protoimpl.MessageInfo, 6)
+var file_extensions_extension_service_proto_msgTypes = make([]protoimpl.MessageInfo, 5)
 var file_extensions_extension_service_proto_goTypes = []interface{}{
 	(ActionResponse_State)(0),    // 0: extensions.ActionResponse.State
 	(ActionResponse_Format)(0),   // 1: extensions.ActionResponse.Format
 	(*InstallRequest)(nil),       // 2: extensions.InstallRequest
-	(*ExtensionList)(nil),        // 3: extensions.ExtensionList
-	(*UninstallRequest)(nil),     // 4: extensions.UninstallRequest
-	(*CheckRequest)(nil),         // 5: extensions.CheckRequest
-	(*ActionResponse)(nil),       // 6: extensions.ActionResponse
-	nil,                          // 7: extensions.ActionResponse.MetadataEntry
-	(*Extension)(nil),            // 8: extensions.Extension
-	(Target)(0),                  // 9: extensions.Target
-	(*Action)(nil),               // 10: extensions.Action
-	(*references.Reference)(nil), // 11: content.references.Reference
-	(*ActionRequest)(nil),        // 12: extensions.ActionRequest
-	(*common.Operation)(nil),     // 13: common.Operation
+	(*UninstallRequest)(nil),     // 3: extensions.UninstallRequest
+	(*CheckRequest)(nil),         // 4: extensions.CheckRequest
+	(*ActionResponse)(nil),       // 5: extensions.ActionResponse
+	nil,                          // 6: extensions.ActionResponse.MetadataEntry
+	(Target)(0),                  // 7: extensions.Target
+	(*Action)(nil),               // 8: extensions.Action
+	(*references.Reference)(nil), // 9: content.references.Reference
+	(*ActionRequest)(nil),        // 10: extensions.ActionRequest
+	(*common.Operation)(nil),     // 11: common.Operation
 }
 var file_extensions_extension_service_proto_depIdxs = []int32{
-	8,  // 0: extensions.ExtensionList.results:type_name -> extensions.Extension
-	0,  // 1: extensions.ActionResponse.state:type_name -> extensions.ActionResponse.State
-	9,  // 2: extensions.ActionResponse.target:type_name -> extensions.Target
-	1,  // 3: extensions.ActionResponse.format:type_name -> extensions.ActionResponse.Format
-	10, // 4: extensions.ActionResponse.next:type_name -> extensions.Action
-	7,  // 5: extensions.ActionResponse.metadata:type_name -> extensions.ActionResponse.MetadataEntry
-	11, // 6: extensions.ActionResponse.refs:type_name -> content.references.Reference
-	2,  // 7: extensions.ExtensionService.Install:input_type -> extensions.InstallRequest
-	4,  // 8: extensions.ExtensionService.Uninstall:input_type -> extensions.UninstallRequest
-	5,  // 9: extensions.ExtensionService.Check:input_type -> extensions.CheckRequest
-	12, // 10: extensions.ExtensionService.Action:input_type -> extensions.ActionRequest
-	13, // 11: extensions.ExtensionService.Install:output_type -> common.Operation
-	13, // 12: extensions.ExtensionService.Uninstall:output_type -> common.Operation
-	13, // 13: extensions.ExtensionService.Check:output_type -> common.Operation
-	6,  // 14: extensions.ExtensionService.Action:output_type -> extensions.ActionResponse
-	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
+	0,  // 0: extensions.ActionResponse.state:type_name -> extensions.ActionResponse.State
+	7,  // 1: extensions.ActionResponse.target:type_name -> extensions.Target
+	1,  // 2: extensions.ActionResponse.format:type_name -> extensions.ActionResponse.Format
+	8,  // 3: extensions.ActionResponse.next:type_name -> extensions.Action
+	6,  // 4: extensions.ActionResponse.metadata:type_name -> extensions.ActionResponse.MetadataEntry
+	9,  // 5: extensions.ActionResponse.refs:type_name -> content.references.Reference
+	2,  // 6: extensions.ExtensionService.Install:input_type -> extensions.InstallRequest
+	3,  // 7: extensions.ExtensionService.Uninstall:input_type -> extensions.UninstallRequest
+	4,  // 8: extensions.ExtensionService.Check:input_type -> extensions.CheckRequest
+	10, // 9: extensions.ExtensionService.Action:input_type -> extensions.ActionRequest
+	11, // 10: extensions.ExtensionService.Install:output_type -> common.Operation
+	11, // 11: extensions.ExtensionService.Uninstall:output_type -> common.Operation
+	11, // 12: extensions.ExtensionService.Check:output_type -> common.Operation
+	5,  // 13: extensions.ExtensionService.Action:output_type -> extensions.ActionResponse
+	10, // [10:14] is the sub-list for method output_type
+	6,  // [6:10] 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
 }
 
 func init() { file_extensions_extension_service_proto_init() }
@@ -705,18 +648,6 @@ func file_extensions_extension_service_proto_init() {
 			}
 		}
 		file_extensions_extension_service_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*ExtensionList); 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 interface{}, i int) interface{} {
 			switch v := v.(*UninstallRequest); i {
 			case 0:
 				return &v.state
@@ -728,7 +659,7 @@ func file_extensions_extension_service_proto_init() {
 				return nil
 			}
 		}
-		file_extensions_extension_service_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+		file_extensions_extension_service_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*CheckRequest); i {
 			case 0:
 				return &v.state
@@ -740,7 +671,7 @@ func file_extensions_extension_service_proto_init() {
 				return nil
 			}
 		}
-		file_extensions_extension_service_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+		file_extensions_extension_service_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*ActionResponse); i {
 			case 0:
 				return &v.state
@@ -759,7 +690,7 @@ func file_extensions_extension_service_proto_init() {
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_extensions_extension_service_proto_rawDesc,
 			NumEnums:      2,
-			NumMessages:   6,
+			NumMessages:   5,
 			NumExtensions: 0,
 			NumServices:   1,
 		},
diff --git a/proto/extensions/manager.pb.go b/proto/extensions/manager.pb.go
index cb5b209259d642794eb201b9bb60bbf60c87d3f9..0b19b498061cf31c8918a210259340f666de9431 100644
--- a/proto/extensions/manager.pb.go
+++ b/proto/extensions/manager.pb.go
@@ -28,7 +28,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
 // 	protoc-gen-go v1.31.0
-// 	protoc        v4.23.4
+// 	protoc        v4.24.3
 // source: extensions/manager.proto
 
 package extensions
@@ -96,10 +96,120 @@ func (x SpaceExtensions_State) Number() protoreflect.EnumNumber {
 
 // Deprecated: Use SpaceExtensions_State.Descriptor instead.
 func (SpaceExtensions_State) EnumDescriptor() ([]byte, []int) {
-	return file_extensions_manager_proto_rawDescGZIP(), []int{8, 0}
+	return file_extensions_manager_proto_rawDescGZIP(), []int{10, 0}
 }
 
-// ServiceDescription описание сервиса
+type GetExtensionsRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Extensions []string `protobuf:"bytes,1,rep,name=extensions,proto3" json:"extensions,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"`       // Идентификатор окружения
+}
+
+func (x *GetExtensionsRequest) Reset() {
+	*x = GetExtensionsRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_extensions_manager_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetExtensionsRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetExtensionsRequest) ProtoMessage() {}
+
+func (x *GetExtensionsRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_extensions_manager_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use GetExtensionsRequest.ProtoReflect.Descriptor instead.
+func (*GetExtensionsRequest) Descriptor() ([]byte, []int) {
+	return file_extensions_manager_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *GetExtensionsRequest) GetExtensions() []string {
+	if x != nil {
+		return x.Extensions
+	}
+	return nil
+}
+
+func (x *GetExtensionsRequest) GetSpaceId() string {
+	if x != nil {
+		return x.SpaceId
+	}
+	return ""
+}
+
+func (x *GetExtensionsRequest) GetEnvId() string {
+	if x != nil {
+		return x.EnvId
+	}
+	return ""
+}
+
+type GetExtensionsResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Status []*GetExtensionsResponse_Status `protobuf:"bytes,1,rep,name=status,proto3" json:"status,omitempty"`
+}
+
+func (x *GetExtensionsResponse) Reset() {
+	*x = GetExtensionsResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_extensions_manager_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetExtensionsResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetExtensionsResponse) ProtoMessage() {}
+
+func (x *GetExtensionsResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_extensions_manager_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use GetExtensionsResponse.ProtoReflect.Descriptor instead.
+func (*GetExtensionsResponse) Descriptor() ([]byte, []int) {
+	return file_extensions_manager_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *GetExtensionsResponse) GetStatus() []*GetExtensionsResponse_Status {
+	if x != nil {
+		return x.Status
+	}
+	return nil
+}
+
+// ServiceDescription описание расширения (возвращается сервисом при регистрации)
 type ExtensionDescriptor struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -118,7 +228,7 @@ type ExtensionDescriptor struct {
 func (x *ExtensionDescriptor) Reset() {
 	*x = ExtensionDescriptor{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_extensions_manager_proto_msgTypes[0]
+		mi := &file_extensions_manager_proto_msgTypes[2]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -131,7 +241,7 @@ func (x *ExtensionDescriptor) String() string {
 func (*ExtensionDescriptor) ProtoMessage() {}
 
 func (x *ExtensionDescriptor) ProtoReflect() protoreflect.Message {
-	mi := &file_extensions_manager_proto_msgTypes[0]
+	mi := &file_extensions_manager_proto_msgTypes[2]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -144,7 +254,7 @@ func (x *ExtensionDescriptor) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use ExtensionDescriptor.ProtoReflect.Descriptor instead.
 func (*ExtensionDescriptor) Descriptor() ([]byte, []int) {
-	return file_extensions_manager_proto_rawDescGZIP(), []int{0}
+	return file_extensions_manager_proto_rawDescGZIP(), []int{2}
 }
 
 func (x *ExtensionDescriptor) GetExtension() string {
@@ -214,7 +324,7 @@ type RegisterExtensionsRequest struct {
 func (x *RegisterExtensionsRequest) Reset() {
 	*x = RegisterExtensionsRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_extensions_manager_proto_msgTypes[1]
+		mi := &file_extensions_manager_proto_msgTypes[3]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -227,7 +337,7 @@ func (x *RegisterExtensionsRequest) String() string {
 func (*RegisterExtensionsRequest) ProtoMessage() {}
 
 func (x *RegisterExtensionsRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_extensions_manager_proto_msgTypes[1]
+	mi := &file_extensions_manager_proto_msgTypes[3]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -240,7 +350,7 @@ func (x *RegisterExtensionsRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use RegisterExtensionsRequest.ProtoReflect.Descriptor instead.
 func (*RegisterExtensionsRequest) Descriptor() ([]byte, []int) {
-	return file_extensions_manager_proto_rawDescGZIP(), []int{1}
+	return file_extensions_manager_proto_rawDescGZIP(), []int{3}
 }
 
 func (x *RegisterExtensionsRequest) GetExtensions() []*ExtensionDescriptor {
@@ -259,7 +369,7 @@ type RegisterExtensionsResponse struct {
 func (x *RegisterExtensionsResponse) Reset() {
 	*x = RegisterExtensionsResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_extensions_manager_proto_msgTypes[2]
+		mi := &file_extensions_manager_proto_msgTypes[4]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -272,7 +382,7 @@ func (x *RegisterExtensionsResponse) String() string {
 func (*RegisterExtensionsResponse) ProtoMessage() {}
 
 func (x *RegisterExtensionsResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_extensions_manager_proto_msgTypes[2]
+	mi := &file_extensions_manager_proto_msgTypes[4]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -285,7 +395,7 @@ func (x *RegisterExtensionsResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use RegisterExtensionsResponse.ProtoReflect.Descriptor instead.
 func (*RegisterExtensionsResponse) Descriptor() ([]byte, []int) {
-	return file_extensions_manager_proto_rawDescGZIP(), []int{2}
+	return file_extensions_manager_proto_rawDescGZIP(), []int{4}
 }
 
 type UnregisterExtensionsRequest struct {
@@ -299,7 +409,7 @@ type UnregisterExtensionsRequest struct {
 func (x *UnregisterExtensionsRequest) Reset() {
 	*x = UnregisterExtensionsRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_extensions_manager_proto_msgTypes[3]
+		mi := &file_extensions_manager_proto_msgTypes[5]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -312,7 +422,7 @@ func (x *UnregisterExtensionsRequest) String() string {
 func (*UnregisterExtensionsRequest) ProtoMessage() {}
 
 func (x *UnregisterExtensionsRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_extensions_manager_proto_msgTypes[3]
+	mi := &file_extensions_manager_proto_msgTypes[5]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -325,7 +435,7 @@ func (x *UnregisterExtensionsRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use UnregisterExtensionsRequest.ProtoReflect.Descriptor instead.
 func (*UnregisterExtensionsRequest) Descriptor() ([]byte, []int) {
-	return file_extensions_manager_proto_rawDescGZIP(), []int{3}
+	return file_extensions_manager_proto_rawDescGZIP(), []int{5}
 }
 
 func (x *UnregisterExtensionsRequest) GetExtensions() []*ExtensionDescriptor {
@@ -344,7 +454,7 @@ type UnregisterExtensionsResponse struct {
 func (x *UnregisterExtensionsResponse) Reset() {
 	*x = UnregisterExtensionsResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_extensions_manager_proto_msgTypes[4]
+		mi := &file_extensions_manager_proto_msgTypes[6]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -357,7 +467,7 @@ func (x *UnregisterExtensionsResponse) String() string {
 func (*UnregisterExtensionsResponse) ProtoMessage() {}
 
 func (x *UnregisterExtensionsResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_extensions_manager_proto_msgTypes[4]
+	mi := &file_extensions_manager_proto_msgTypes[6]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -370,7 +480,7 @@ func (x *UnregisterExtensionsResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use UnregisterExtensionsResponse.ProtoReflect.Descriptor instead.
 func (*UnregisterExtensionsResponse) Descriptor() ([]byte, []int) {
-	return file_extensions_manager_proto_rawDescGZIP(), []int{4}
+	return file_extensions_manager_proto_rawDescGZIP(), []int{6}
 }
 
 type ListExtensionsFilter struct {
@@ -384,7 +494,7 @@ type ListExtensionsFilter struct {
 func (x *ListExtensionsFilter) Reset() {
 	*x = ListExtensionsFilter{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_extensions_manager_proto_msgTypes[5]
+		mi := &file_extensions_manager_proto_msgTypes[7]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -397,7 +507,7 @@ func (x *ListExtensionsFilter) String() string {
 func (*ListExtensionsFilter) ProtoMessage() {}
 
 func (x *ListExtensionsFilter) ProtoReflect() protoreflect.Message {
-	mi := &file_extensions_manager_proto_msgTypes[5]
+	mi := &file_extensions_manager_proto_msgTypes[7]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -410,7 +520,7 @@ func (x *ListExtensionsFilter) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use ListExtensionsFilter.ProtoReflect.Descriptor instead.
 func (*ListExtensionsFilter) Descriptor() ([]byte, []int) {
-	return file_extensions_manager_proto_rawDescGZIP(), []int{5}
+	return file_extensions_manager_proto_rawDescGZIP(), []int{7}
 }
 
 func (x *ListExtensionsFilter) GetExtension() []string {
@@ -431,7 +541,7 @@ type ListExtensionsRequest struct {
 func (x *ListExtensionsRequest) Reset() {
 	*x = ListExtensionsRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_extensions_manager_proto_msgTypes[6]
+		mi := &file_extensions_manager_proto_msgTypes[8]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -444,7 +554,7 @@ func (x *ListExtensionsRequest) String() string {
 func (*ListExtensionsRequest) ProtoMessage() {}
 
 func (x *ListExtensionsRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_extensions_manager_proto_msgTypes[6]
+	mi := &file_extensions_manager_proto_msgTypes[8]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -457,7 +567,7 @@ func (x *ListExtensionsRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use ListExtensionsRequest.ProtoReflect.Descriptor instead.
 func (*ListExtensionsRequest) Descriptor() ([]byte, []int) {
-	return file_extensions_manager_proto_rawDescGZIP(), []int{6}
+	return file_extensions_manager_proto_rawDescGZIP(), []int{8}
 }
 
 func (x *ListExtensionsRequest) GetFilter() *ListExtensionsFilter {
@@ -478,7 +588,7 @@ type ListExtensionsResponse struct {
 func (x *ListExtensionsResponse) Reset() {
 	*x = ListExtensionsResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_extensions_manager_proto_msgTypes[7]
+		mi := &file_extensions_manager_proto_msgTypes[9]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -491,7 +601,7 @@ func (x *ListExtensionsResponse) String() string {
 func (*ListExtensionsResponse) ProtoMessage() {}
 
 func (x *ListExtensionsResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_extensions_manager_proto_msgTypes[7]
+	mi := &file_extensions_manager_proto_msgTypes[9]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -504,7 +614,7 @@ func (x *ListExtensionsResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use ListExtensionsResponse.ProtoReflect.Descriptor instead.
 func (*ListExtensionsResponse) Descriptor() ([]byte, []int) {
-	return file_extensions_manager_proto_rawDescGZIP(), []int{7}
+	return file_extensions_manager_proto_rawDescGZIP(), []int{9}
 }
 
 func (x *ListExtensionsResponse) GetExtensions() []*ExtensionDescriptor {
@@ -514,6 +624,8 @@ func (x *ListExtensionsResponse) GetExtensions() []*ExtensionDescriptor {
 	return nil
 }
 
+// Описание коллекций
+// space_extensions (Пространство/Расширения)
 type SpaceExtensions struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -531,7 +643,7 @@ type SpaceExtensions struct {
 func (x *SpaceExtensions) Reset() {
 	*x = SpaceExtensions{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_extensions_manager_proto_msgTypes[8]
+		mi := &file_extensions_manager_proto_msgTypes[10]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -544,7 +656,7 @@ func (x *SpaceExtensions) String() string {
 func (*SpaceExtensions) ProtoMessage() {}
 
 func (x *SpaceExtensions) ProtoReflect() protoreflect.Message {
-	mi := &file_extensions_manager_proto_msgTypes[8]
+	mi := &file_extensions_manager_proto_msgTypes[10]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -557,7 +669,7 @@ func (x *SpaceExtensions) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use SpaceExtensions.ProtoReflect.Descriptor instead.
 func (*SpaceExtensions) Descriptor() ([]byte, []int) {
-	return file_extensions_manager_proto_rawDescGZIP(), []int{8}
+	return file_extensions_manager_proto_rawDescGZIP(), []int{10}
 }
 
 func (x *SpaceExtensions) GetExtension() string {
@@ -609,109 +721,247 @@ func (x *SpaceExtensions) GetStatusMsg() string {
 	return ""
 }
 
+type GetExtensionsResponse_Status struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Extension        string `protobuf:"bytes,10100,opt,name=extension,proto3" json:"extension,omitempty"`                                       // Имя расширения
+	Msg              string `protobuf:"bytes,10200,opt,name=msg,proto3" json:"msg,omitempty"`                                                   // Сообщение
+	Error            string `protobuf:"bytes,10300,opt,name=error,proto3" json:"error,omitempty"`                                               // Ошибка (state == ERROR)
+	NotFound         bool   `protobuf:"varint,10350,opt,name=not_found,json=notFound,proto3" json:"not_found,omitempty"`                        // Расширение не найдено
+	Installed        bool   `protobuf:"varint,10400,opt,name=installed,proto3" json:"installed,omitempty"`                                      // Расширение установлено
+	UpdateAvailable  bool   `protobuf:"varint,10500,opt,name=update_available,json=updateAvailable,proto3" json:"update_available,omitempty"`   // Доступно обновление
+	InstalledVersion string `protobuf:"bytes,10510,opt,name=installed_version,json=installedVersion,proto3" json:"installed_version,omitempty"` // Установленная версия расширения
+	AvailableVersion string `protobuf:"bytes,10520,opt,name=available_version,json=availableVersion,proto3" json:"available_version,omitempty"` // Доступная версия расширения
+}
+
+func (x *GetExtensionsResponse_Status) Reset() {
+	*x = GetExtensionsResponse_Status{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_extensions_manager_proto_msgTypes[11]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetExtensionsResponse_Status) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetExtensionsResponse_Status) ProtoMessage() {}
+
+func (x *GetExtensionsResponse_Status) ProtoReflect() protoreflect.Message {
+	mi := &file_extensions_manager_proto_msgTypes[11]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use GetExtensionsResponse_Status.ProtoReflect.Descriptor instead.
+func (*GetExtensionsResponse_Status) Descriptor() ([]byte, []int) {
+	return file_extensions_manager_proto_rawDescGZIP(), []int{1, 0}
+}
+
+func (x *GetExtensionsResponse_Status) GetExtension() string {
+	if x != nil {
+		return x.Extension
+	}
+	return ""
+}
+
+func (x *GetExtensionsResponse_Status) GetMsg() string {
+	if x != nil {
+		return x.Msg
+	}
+	return ""
+}
+
+func (x *GetExtensionsResponse_Status) GetError() string {
+	if x != nil {
+		return x.Error
+	}
+	return ""
+}
+
+func (x *GetExtensionsResponse_Status) GetNotFound() bool {
+	if x != nil {
+		return x.NotFound
+	}
+	return false
+}
+
+func (x *GetExtensionsResponse_Status) GetInstalled() bool {
+	if x != nil {
+		return x.Installed
+	}
+	return false
+}
+
+func (x *GetExtensionsResponse_Status) GetUpdateAvailable() bool {
+	if x != nil {
+		return x.UpdateAvailable
+	}
+	return false
+}
+
+func (x *GetExtensionsResponse_Status) GetInstalledVersion() string {
+	if x != nil {
+		return x.InstalledVersion
+	}
+	return ""
+}
+
+func (x *GetExtensionsResponse_Status) GetAvailableVersion() string {
+	if x != nil {
+		return x.AvailableVersion
+	}
+	return ""
+}
+
 var File_extensions_manager_proto protoreflect.FileDescriptor
 
 var file_extensions_manager_proto_rawDesc = []byte{
 	0x0a, 0x18, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6d, 0x61, 0x6e,
 	0x61, 0x67, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0a, 0x65, 0x78, 0x74, 0x65,
-	0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xea, 0x02, 0x0a, 0x13, 0x45, 0x78, 0x74, 0x65, 0x6e,
-	0x73, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x12, 0x1d,
-	0x0a, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x90, 0x4e, 0x20, 0x01,
-	0x28, 0x09, 0x52, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x15, 0x0a,
-	0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x9a, 0x4e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74,
-	0x69, 0x74, 0x6c, 0x65, 0x12, 0x21, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,
-	0x69, 0x6f, 0x6e, 0x18, 0xa4, 0x4e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63,
-	0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69,
-	0x6f, 0x6e, 0x18, 0xf4, 0x4e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69,
-	0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x65,
-	0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xfe, 0x4e, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x12, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70,
-	0x74, 0x69, 0x6f, 0x6e, 0x12, 0x13, 0x0a, 0x04, 0x64, 0x65, 0x70, 0x73, 0x18, 0xd8, 0x4f, 0x20,
-	0x03, 0x28, 0x09, 0x52, 0x04, 0x64, 0x65, 0x70, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c,
-	0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x49, 0x0a, 0x08, 0x6d,
-	0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e,
-	0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e,
-	0x73, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x4d,
-	0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65,
-	0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61,
-	0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c,
-	0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a,
-	0x02, 0x38, 0x01, 0x22, 0x5c, 0x0a, 0x19, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45,
-	0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
-	0x12, 0x3f, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01,
-	0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e,
-	0x73, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x73, 0x63, 0x72,
-	0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e,
-	0x73, 0x22, 0x1c, 0x0a, 0x1a, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x74,
-	0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
-	0x5e, 0x0a, 0x1b, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x74,
-	0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3f,
+	0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x68, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x45, 0x78, 0x74,
+	0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e,
 	0x0a, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03,
-	0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e,
-	0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70,
-	0x74, 0x6f, 0x72, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22,
-	0x1e, 0x0a, 0x1c, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x74,
-	0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
-	0x34, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e,
-	0x73, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e,
-	0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x65, 0x78, 0x74, 0x65,
-	0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x74,
-	0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38,
-	0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20,
-	0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74,
-	0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72,
-	0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0x59, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74,
-	0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
-	0x73, 0x65, 0x12, 0x3f, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73,
-	0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69,
-	0x6f, 0x6e, 0x73, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x73,
-	0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69,
-	0x6f, 0x6e, 0x73, 0x22, 0xb5, 0x02, 0x0a, 0x0f, 0x53, 0x70, 0x61, 0x63, 0x65, 0x45, 0x78, 0x74,
-	0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1d, 0x0a, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e,
-	0x73, 0x69, 0x6f, 0x6e, 0x18, 0x90, 0x4e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x78, 0x74,
-	0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x15, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18,
-	0x9a, 0x4e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x19, 0x0a,
-	0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0xf4, 0x4e, 0x20, 0x01, 0x28, 0x09, 0x52,
-	0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x13, 0x0a, 0x04, 0x64, 0x65, 0x70, 0x73,
-	0x18, 0xd8, 0x4f, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x64, 0x65, 0x70, 0x73, 0x12, 0x38, 0x0a,
-	0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0xbc, 0x50, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e,
-	0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x70, 0x61, 0x63, 0x65,
-	0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65,
-	0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x74, 0x75,
-	0x73, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xa0, 0x51, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b,
-	0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x73,
-	0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x84, 0x52, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x09, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, 0x73, 0x67, 0x22, 0x3e, 0x0a, 0x05, 0x53,
-	0x74, 0x61, 0x74, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10,
-	0x00, 0x12, 0x0d, 0x0a, 0x09, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4c, 0x4c, 0x45, 0x44, 0x10, 0x01,
-	0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x10,
-	0x02, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x41, 0x49, 0x4c, 0x10, 0x03, 0x32, 0xc1, 0x02, 0x0a, 0x10,
-	0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72,
-	0x12, 0x65, 0x0a, 0x12, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65,
-	0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x25, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69,
-	0x6f, 0x6e, 0x73, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65,
-	0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e,
-	0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73,
-	0x74, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73,
-	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6b, 0x0a, 0x14, 0x55, 0x6e, 0x72, 0x65, 0x67,
-	0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12,
-	0x27, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x55, 0x6e, 0x72,
-	0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e,
-	0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e,
-	0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72,
-	0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
-	0x73, 0x65, 0x22, 0x00, 0x12, 0x59, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x74, 0x65,
-	0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x21, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69,
-	0x6f, 0x6e, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f,
-	0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x65, 0x78, 0x74, 0x65,
-	0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e,
-	0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42,
-	0x3a, 0x5a, 0x38, 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, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73,
-	0x3b, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f,
-	0x74, 0x6f, 0x33,
+	0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 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, 0x15, 0x0a, 0x06, 0x65, 0x6e, 0x76,
+	0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64,
+	0x22, 0xf2, 0x02, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f,
+	0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x06, 0x73, 0x74,
+	0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x65, 0x78, 0x74,
+	0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e,
+	0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x74,
+	0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x1a, 0x96, 0x02, 0x0a,
+	0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1d, 0x0a, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e,
+	0x73, 0x69, 0x6f, 0x6e, 0x18, 0xf4, 0x4e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x78, 0x74,
+	0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x11, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0xd8, 0x4f,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x12, 0x15, 0x0a, 0x05, 0x65, 0x72, 0x72,
+	0x6f, 0x72, 0x18, 0xbc, 0x50, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72,
+	0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x6f, 0x74, 0x5f, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0xee, 0x50,
+	0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6e, 0x6f, 0x74, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x1d,
+	0x0a, 0x09, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x18, 0xa0, 0x51, 0x20, 0x01,
+	0x28, 0x08, 0x52, 0x09, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x12, 0x2a, 0x0a,
+	0x10, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c,
+	0x65, 0x18, 0x84, 0x52, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65,
+	0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x69, 0x6e, 0x73,
+	0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x8e,
+	0x52, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64,
+	0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x0a, 0x11, 0x61, 0x76, 0x61, 0x69, 0x6c,
+	0x61, 0x62, 0x6c, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x98, 0x52, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x10, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x65,
+	0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xea, 0x02, 0x0a, 0x13, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73,
+	0x69, 0x6f, 0x6e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x12, 0x1d, 0x0a,
+	0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x90, 0x4e, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x15, 0x0a, 0x05,
+	0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x9a, 0x4e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69,
+	0x74, 0x6c, 0x65, 0x12, 0x21, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69,
+	0x6f, 0x6e, 0x18, 0xa4, 0x4e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72,
+	0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f,
+	0x6e, 0x18, 0xf4, 0x4e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f,
+	0x6e, 0x12, 0x30, 0x0a, 0x13, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x65, 0x73,
+	0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xfe, 0x4e, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x12, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,
+	0x69, 0x6f, 0x6e, 0x12, 0x13, 0x0a, 0x04, 0x64, 0x65, 0x70, 0x73, 0x18, 0xd8, 0x4f, 0x20, 0x03,
+	0x28, 0x09, 0x52, 0x04, 0x64, 0x65, 0x70, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18,
+	0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x49, 0x0a, 0x08, 0x6d, 0x65,
+	0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x65,
+	0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73,
+	0x69, 0x6f, 0x6e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x4d, 0x65,
+	0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74,
+	0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74,
+	0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75,
+	0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02,
+	0x38, 0x01, 0x22, 0x5c, 0x0a, 0x19, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78,
+	0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,
+	0x3f, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20,
+	0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73,
+	0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69,
+	0x70, 0x74, 0x6f, 0x72, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73,
+	0x22, 0x1c, 0x0a, 0x1a, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65,
+	0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5e,
+	0x0a, 0x1b, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65,
+	0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a,
+	0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28,
+	0x0b, 0x32, 0x1f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45,
+	0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,
+	0x6f, 0x72, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x1e,
+	0x0a, 0x1c, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65,
+	0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x34,
+	0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73,
+	0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73,
+	0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e,
+	0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x74, 0x65,
+	0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a,
+	0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e,
+	0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45,
+	0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52,
+	0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0x59, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x45,
+	0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x12, 0x3f, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18,
+	0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f,
+	0x6e, 0x73, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x73, 0x63,
+	0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f,
+	0x6e, 0x73, 0x22, 0xb5, 0x02, 0x0a, 0x0f, 0x53, 0x70, 0x61, 0x63, 0x65, 0x45, 0x78, 0x74, 0x65,
+	0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1d, 0x0a, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73,
+	0x69, 0x6f, 0x6e, 0x18, 0x90, 0x4e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x78, 0x74, 0x65,
+	0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x15, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x9a,
+	0x4e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x19, 0x0a, 0x07,
+	0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0xf4, 0x4e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07,
+	0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x13, 0x0a, 0x04, 0x64, 0x65, 0x70, 0x73, 0x18,
+	0xd8, 0x4f, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x64, 0x65, 0x70, 0x73, 0x12, 0x38, 0x0a, 0x05,
+	0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0xbc, 0x50, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x65,
+	0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x70, 0x61, 0x63, 0x65, 0x45,
+	0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52,
+	0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73,
+	0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xa0, 0x51, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73,
+	0x74, 0x61, 0x74, 0x75, 0x73, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x74,
+	0x61, 0x74, 0x75, 0x73, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x84, 0x52, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x09, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, 0x73, 0x67, 0x22, 0x3e, 0x0a, 0x05, 0x53, 0x74,
+	0x61, 0x74, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x00,
+	0x12, 0x0d, 0x0a, 0x09, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4c, 0x4c, 0x45, 0x44, 0x10, 0x01, 0x12,
+	0x0f, 0x0a, 0x0b, 0x49, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, 0x02,
+	0x12, 0x08, 0x0a, 0x04, 0x46, 0x41, 0x49, 0x4c, 0x10, 0x03, 0x32, 0x99, 0x03, 0x0a, 0x10, 0x45,
+	0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x12,
+	0x65, 0x0a, 0x12, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e,
+	0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x25, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f,
+	0x6e, 0x73, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e,
+	0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x65,
+	0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74,
+	0x65, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70,
+	0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6b, 0x0a, 0x14, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69,
+	0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x27,
+	0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x55, 0x6e, 0x72, 0x65,
+	0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73,
+	0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45,
+	0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x22, 0x00, 0x12, 0x59, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e,
+	0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x21, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f,
+	0x6e, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e,
+	0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e,
+	0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73,
+	0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x56,
+	0x0a, 0x0d, 0x47, 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12,
+	0x20, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x47, 0x65, 0x74,
+	0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+	0x74, 0x1a, 0x21, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x47,
+	0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70,
+	0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x3a, 0x5a, 0x38, 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, 0x78, 0x74,
+	0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x3b, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f,
+	0x6e, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
@@ -727,38 +977,44 @@ func file_extensions_manager_proto_rawDescGZIP() []byte {
 }
 
 var file_extensions_manager_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
-var file_extensions_manager_proto_msgTypes = make([]protoimpl.MessageInfo, 10)
+var file_extensions_manager_proto_msgTypes = make([]protoimpl.MessageInfo, 13)
 var file_extensions_manager_proto_goTypes = []interface{}{
 	(SpaceExtensions_State)(0),           // 0: extensions.SpaceExtensions.State
-	(*ExtensionDescriptor)(nil),          // 1: extensions.ExtensionDescriptor
-	(*RegisterExtensionsRequest)(nil),    // 2: extensions.RegisterExtensionsRequest
-	(*RegisterExtensionsResponse)(nil),   // 3: extensions.RegisterExtensionsResponse
-	(*UnregisterExtensionsRequest)(nil),  // 4: extensions.UnregisterExtensionsRequest
-	(*UnregisterExtensionsResponse)(nil), // 5: extensions.UnregisterExtensionsResponse
-	(*ListExtensionsFilter)(nil),         // 6: extensions.ListExtensionsFilter
-	(*ListExtensionsRequest)(nil),        // 7: extensions.ListExtensionsRequest
-	(*ListExtensionsResponse)(nil),       // 8: extensions.ListExtensionsResponse
-	(*SpaceExtensions)(nil),              // 9: extensions.SpaceExtensions
-	nil,                                  // 10: extensions.ExtensionDescriptor.MetadataEntry
+	(*GetExtensionsRequest)(nil),         // 1: extensions.GetExtensionsRequest
+	(*GetExtensionsResponse)(nil),        // 2: extensions.GetExtensionsResponse
+	(*ExtensionDescriptor)(nil),          // 3: extensions.ExtensionDescriptor
+	(*RegisterExtensionsRequest)(nil),    // 4: extensions.RegisterExtensionsRequest
+	(*RegisterExtensionsResponse)(nil),   // 5: extensions.RegisterExtensionsResponse
+	(*UnregisterExtensionsRequest)(nil),  // 6: extensions.UnregisterExtensionsRequest
+	(*UnregisterExtensionsResponse)(nil), // 7: extensions.UnregisterExtensionsResponse
+	(*ListExtensionsFilter)(nil),         // 8: extensions.ListExtensionsFilter
+	(*ListExtensionsRequest)(nil),        // 9: extensions.ListExtensionsRequest
+	(*ListExtensionsResponse)(nil),       // 10: extensions.ListExtensionsResponse
+	(*SpaceExtensions)(nil),              // 11: extensions.SpaceExtensions
+	(*GetExtensionsResponse_Status)(nil), // 12: extensions.GetExtensionsResponse.Status
+	nil,                                  // 13: extensions.ExtensionDescriptor.MetadataEntry
 }
 var file_extensions_manager_proto_depIdxs = []int32{
-	10, // 0: extensions.ExtensionDescriptor.metadata:type_name -> extensions.ExtensionDescriptor.MetadataEntry
-	1,  // 1: extensions.RegisterExtensionsRequest.extensions:type_name -> extensions.ExtensionDescriptor
-	1,  // 2: extensions.UnregisterExtensionsRequest.extensions:type_name -> extensions.ExtensionDescriptor
-	6,  // 3: extensions.ListExtensionsRequest.filter:type_name -> extensions.ListExtensionsFilter
-	1,  // 4: extensions.ListExtensionsResponse.extensions:type_name -> extensions.ExtensionDescriptor
-	0,  // 5: extensions.SpaceExtensions.state:type_name -> extensions.SpaceExtensions.State
-	2,  // 6: extensions.ExtensionManager.RegisterExtensions:input_type -> extensions.RegisterExtensionsRequest
-	4,  // 7: extensions.ExtensionManager.UnregisterExtensions:input_type -> extensions.UnregisterExtensionsRequest
-	7,  // 8: extensions.ExtensionManager.ListExtensions:input_type -> extensions.ListExtensionsRequest
-	3,  // 9: extensions.ExtensionManager.RegisterExtensions:output_type -> extensions.RegisterExtensionsResponse
-	5,  // 10: extensions.ExtensionManager.UnregisterExtensions:output_type -> extensions.UnregisterExtensionsResponse
-	8,  // 11: extensions.ExtensionManager.ListExtensions:output_type -> extensions.ListExtensionsResponse
-	9,  // [9:12] is the sub-list for method output_type
-	6,  // [6:9] 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
+	12, // 0: extensions.GetExtensionsResponse.status:type_name -> extensions.GetExtensionsResponse.Status
+	13, // 1: extensions.ExtensionDescriptor.metadata:type_name -> extensions.ExtensionDescriptor.MetadataEntry
+	3,  // 2: extensions.RegisterExtensionsRequest.extensions:type_name -> extensions.ExtensionDescriptor
+	3,  // 3: extensions.UnregisterExtensionsRequest.extensions:type_name -> extensions.ExtensionDescriptor
+	8,  // 4: extensions.ListExtensionsRequest.filter:type_name -> extensions.ListExtensionsFilter
+	3,  // 5: extensions.ListExtensionsResponse.extensions:type_name -> extensions.ExtensionDescriptor
+	0,  // 6: extensions.SpaceExtensions.state:type_name -> extensions.SpaceExtensions.State
+	4,  // 7: extensions.ExtensionManager.RegisterExtensions:input_type -> extensions.RegisterExtensionsRequest
+	6,  // 8: extensions.ExtensionManager.UnregisterExtensions:input_type -> extensions.UnregisterExtensionsRequest
+	9,  // 9: extensions.ExtensionManager.ListExtensions:input_type -> extensions.ListExtensionsRequest
+	1,  // 10: extensions.ExtensionManager.GetExtensions:input_type -> extensions.GetExtensionsRequest
+	5,  // 11: extensions.ExtensionManager.RegisterExtensions:output_type -> extensions.RegisterExtensionsResponse
+	7,  // 12: extensions.ExtensionManager.UnregisterExtensions:output_type -> extensions.UnregisterExtensionsResponse
+	10, // 13: extensions.ExtensionManager.ListExtensions:output_type -> extensions.ListExtensionsResponse
+	2,  // 14: extensions.ExtensionManager.GetExtensions:output_type -> extensions.GetExtensionsResponse
+	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_extensions_manager_proto_init() }
@@ -768,7 +1024,7 @@ func file_extensions_manager_proto_init() {
 	}
 	if !protoimpl.UnsafeEnabled {
 		file_extensions_manager_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*ExtensionDescriptor); i {
+			switch v := v.(*GetExtensionsRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -780,7 +1036,7 @@ func file_extensions_manager_proto_init() {
 			}
 		}
 		file_extensions_manager_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*RegisterExtensionsRequest); i {
+			switch v := v.(*GetExtensionsResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -792,7 +1048,7 @@ func file_extensions_manager_proto_init() {
 			}
 		}
 		file_extensions_manager_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*RegisterExtensionsResponse); i {
+			switch v := v.(*ExtensionDescriptor); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -804,7 +1060,7 @@ func file_extensions_manager_proto_init() {
 			}
 		}
 		file_extensions_manager_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*UnregisterExtensionsRequest); i {
+			switch v := v.(*RegisterExtensionsRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -816,7 +1072,7 @@ func file_extensions_manager_proto_init() {
 			}
 		}
 		file_extensions_manager_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*UnregisterExtensionsResponse); i {
+			switch v := v.(*RegisterExtensionsResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -828,7 +1084,7 @@ func file_extensions_manager_proto_init() {
 			}
 		}
 		file_extensions_manager_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*ListExtensionsFilter); i {
+			switch v := v.(*UnregisterExtensionsRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -840,7 +1096,7 @@ func file_extensions_manager_proto_init() {
 			}
 		}
 		file_extensions_manager_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*ListExtensionsRequest); i {
+			switch v := v.(*UnregisterExtensionsResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -852,7 +1108,7 @@ func file_extensions_manager_proto_init() {
 			}
 		}
 		file_extensions_manager_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*ListExtensionsResponse); i {
+			switch v := v.(*ListExtensionsFilter); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -864,6 +1120,30 @@ func file_extensions_manager_proto_init() {
 			}
 		}
 		file_extensions_manager_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
+			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_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
+			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_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*SpaceExtensions); i {
 			case 0:
 				return &v.state
@@ -875,6 +1155,18 @@ func file_extensions_manager_proto_init() {
 				return nil
 			}
 		}
+		file_extensions_manager_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetExtensionsResponse_Status); 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{
@@ -882,7 +1174,7 @@ func file_extensions_manager_proto_init() {
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_extensions_manager_proto_rawDesc,
 			NumEnums:      1,
-			NumMessages:   10,
+			NumMessages:   13,
 			NumExtensions: 0,
 			NumServices:   1,
 		},
diff --git a/proto/extensions/manager_grpc.pb.go b/proto/extensions/manager_grpc.pb.go
index aa5a5105bffb683691d866f65127857d5453192c..635cc20ec63212d3514ae351109b40ee7952ce7a 100644
--- a/proto/extensions/manager_grpc.pb.go
+++ b/proto/extensions/manager_grpc.pb.go
@@ -28,7 +28,7 @@
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
 // versions:
 // - protoc-gen-go-grpc v1.3.0
-// - protoc             v4.23.4
+// - protoc             v4.24.3
 // source: extensions/manager.proto
 
 package extensions
@@ -49,6 +49,7 @@ const (
 	ExtensionManager_RegisterExtensions_FullMethodName   = "/extensions.ExtensionManager/RegisterExtensions"
 	ExtensionManager_UnregisterExtensions_FullMethodName = "/extensions.ExtensionManager/UnregisterExtensions"
 	ExtensionManager_ListExtensions_FullMethodName       = "/extensions.ExtensionManager/ListExtensions"
+	ExtensionManager_GetExtensions_FullMethodName        = "/extensions.ExtensionManager/GetExtensions"
 )
 
 // ExtensionManagerClient is the client API for ExtensionManager service.
@@ -71,6 +72,8 @@ type ExtensionManagerClient interface {
 	UnregisterExtensions(ctx context.Context, in *UnregisterExtensionsRequest, opts ...grpc.CallOption) (*UnregisterExtensionsResponse, error)
 	// Получить список зарегистрированных сервисов
 	ListExtensions(ctx context.Context, in *ListExtensionsRequest, opts ...grpc.CallOption) (*ListExtensionsResponse, error)
+	// GetExtensionStatus - получить статус расширения
+	GetExtensions(ctx context.Context, in *GetExtensionsRequest, opts ...grpc.CallOption) (*GetExtensionsResponse, error)
 }
 
 type extensionManagerClient struct {
@@ -108,6 +111,15 @@ func (c *extensionManagerClient) ListExtensions(ctx context.Context, in *ListExt
 	return out, nil
 }
 
+func (c *extensionManagerClient) GetExtensions(ctx context.Context, in *GetExtensionsRequest, opts ...grpc.CallOption) (*GetExtensionsResponse, error) {
+	out := new(GetExtensionsResponse)
+	err := c.cc.Invoke(ctx, ExtensionManager_GetExtensions_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
 // ExtensionManagerServer is the server API for ExtensionManager service.
 // All implementations must embed UnimplementedExtensionManagerServer
 // for forward compatibility
@@ -128,6 +140,8 @@ type ExtensionManagerServer interface {
 	UnregisterExtensions(context.Context, *UnregisterExtensionsRequest) (*UnregisterExtensionsResponse, error)
 	// Получить список зарегистрированных сервисов
 	ListExtensions(context.Context, *ListExtensionsRequest) (*ListExtensionsResponse, error)
+	// GetExtensionStatus - получить статус расширения
+	GetExtensions(context.Context, *GetExtensionsRequest) (*GetExtensionsResponse, error)
 	mustEmbedUnimplementedExtensionManagerServer()
 }
 
@@ -144,6 +158,9 @@ func (UnimplementedExtensionManagerServer) UnregisterExtensions(context.Context,
 func (UnimplementedExtensionManagerServer) ListExtensions(context.Context, *ListExtensionsRequest) (*ListExtensionsResponse, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method ListExtensions not implemented")
 }
+func (UnimplementedExtensionManagerServer) GetExtensions(context.Context, *GetExtensionsRequest) (*GetExtensionsResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetExtensions not implemented")
+}
 func (UnimplementedExtensionManagerServer) mustEmbedUnimplementedExtensionManagerServer() {}
 
 // UnsafeExtensionManagerServer may be embedded to opt out of forward compatibility for this service.
@@ -211,6 +228,24 @@ func _ExtensionManager_ListExtensions_Handler(srv interface{}, ctx context.Conte
 	return interceptor(ctx, in, info, handler)
 }
 
+func _ExtensionManager_GetExtensions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetExtensionsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ExtensionManagerServer).GetExtensions(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ExtensionManager_GetExtensions_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ExtensionManagerServer).GetExtensions(ctx, req.(*GetExtensionsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
 // ExtensionManager_ServiceDesc is the grpc.ServiceDesc for ExtensionManager service.
 // It's only intended for direct use with grpc.RegisterService,
 // and not to be introspected or modified (even as a copy)
@@ -230,6 +265,10 @@ var ExtensionManager_ServiceDesc = grpc.ServiceDesc{
 			MethodName: "ListExtensions",
 			Handler:    _ExtensionManager_ListExtensions_Handler,
 		},
+		{
+			MethodName: "GetExtensions",
+			Handler:    _ExtensionManager_GetExtensions_Handler,
+		},
 	},
 	Streams:  []grpc.StreamDesc{},
 	Metadata: "extensions/manager.proto",
diff --git a/proto/extensions/manager_service.pb.go b/proto/extensions/manager_service.pb.go
new file mode 100644
index 0000000000000000000000000000000000000000..7091339cb953ba2fd88bef31d8f4942f901b9b7f
--- /dev/null
+++ b/proto/extensions/manager_service.pb.go
@@ -0,0 +1,1191 @@
+//*
+//
+//# Менеджер расширений
+//
+//Реализует функционал по координации расширений в системе и служит единой точкой доступа для работы с расширениями:
+//- Регистрирует все расширения в едином реестре
+//- Предоставляет доступ к реестру расширений на получение доступных расширений в системе
+//- Контролирует процесс установки расширения, устанавливает все необходимые зависимости в правильном порядке
+//- Контролирует создание системной коллекции `system_extensions` (System/Extensions) и создание/удалений в ней установленных расширений
+//- Контролирует создание системной коллекции `system_actions` (System/Actions). Выполняет удаление всех действий связанных
+//с расширением при его удалении.
+//- Выполняет переадресацию запросов на действия для расширений
+//
+//Менеджер расширений для контроля установленных расширений использует системные коллекции. При обращении к сервису контента
+//используются системный уровень прав для создания необходимых коллекций и получения данных:
+//1. `system_extensions` (System Extensions) - доступна только системным пользователям
+//2. `system_actions` (System Actions) - по умолчанию доступна только системным пользователям, настройки доступа на чтение
+//выдаются пользователям вручную. В зависимости от пользователя в интерфейсе отображаются те или иные доступные действия.
+//
+//Проверка наличия коллекций и создание в случае их отсутствия выполняется в момент установки расширений. После установки
+//расширения в коллекцию `system_extensions` добавляется запись об установленном расширении. Действия добавляются в
+//коллекцию `system_actions` расширениями по собственному усмотрению при установке.
+//
+//Для обращения к расширениям используются права текущего пользователя запрашивающего операцию. Если пользователь не
+//обладает необходимыми правами для выполнения действия то операция вернет ошибку.
+//
+
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.31.0
+// 	protoc        v4.24.3
+// source: extensions/manager_service.proto
+
+package extensions
+
+import (
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+type SpaceExtensions_State int32
+
+const (
+	SpaceExtensions_PENDING     SpaceExtensions_State = 0
+	SpaceExtensions_INSTALLED   SpaceExtensions_State = 1
+	SpaceExtensions_IN_PROGRESS SpaceExtensions_State = 2
+	SpaceExtensions_FAIL        SpaceExtensions_State = 3
+)
+
+// Enum value maps for SpaceExtensions_State.
+var (
+	SpaceExtensions_State_name = map[int32]string{
+		0: "PENDING",
+		1: "INSTALLED",
+		2: "IN_PROGRESS",
+		3: "FAIL",
+	}
+	SpaceExtensions_State_value = map[string]int32{
+		"PENDING":     0,
+		"INSTALLED":   1,
+		"IN_PROGRESS": 2,
+		"FAIL":        3,
+	}
+)
+
+func (x SpaceExtensions_State) Enum() *SpaceExtensions_State {
+	p := new(SpaceExtensions_State)
+	*p = x
+	return p
+}
+
+func (x SpaceExtensions_State) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (SpaceExtensions_State) Descriptor() protoreflect.EnumDescriptor {
+	return file_extensions_manager_service_proto_enumTypes[0].Descriptor()
+}
+
+func (SpaceExtensions_State) Type() protoreflect.EnumType {
+	return &file_extensions_manager_service_proto_enumTypes[0]
+}
+
+func (x SpaceExtensions_State) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use SpaceExtensions_State.Descriptor instead.
+func (SpaceExtensions_State) EnumDescriptor() ([]byte, []int) {
+	return file_extensions_manager_service_proto_rawDescGZIP(), []int{10, 0}
+}
+
+type GetExtensionsRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Extensions []string `protobuf:"bytes,1,rep,name=extensions,proto3" json:"extensions,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"`       // Идентификатор окружения
+}
+
+func (x *GetExtensionsRequest) Reset() {
+	*x = GetExtensionsRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_extensions_manager_service_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetExtensionsRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetExtensionsRequest) ProtoMessage() {}
+
+func (x *GetExtensionsRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_extensions_manager_service_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use GetExtensionsRequest.ProtoReflect.Descriptor instead.
+func (*GetExtensionsRequest) Descriptor() ([]byte, []int) {
+	return file_extensions_manager_service_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *GetExtensionsRequest) GetExtensions() []string {
+	if x != nil {
+		return x.Extensions
+	}
+	return nil
+}
+
+func (x *GetExtensionsRequest) GetSpaceId() string {
+	if x != nil {
+		return x.SpaceId
+	}
+	return ""
+}
+
+func (x *GetExtensionsRequest) GetEnvId() string {
+	if x != nil {
+		return x.EnvId
+	}
+	return ""
+}
+
+type GetExtensionsResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Status []*GetExtensionsResponse_Status `protobuf:"bytes,1,rep,name=status,proto3" json:"status,omitempty"`
+}
+
+func (x *GetExtensionsResponse) Reset() {
+	*x = GetExtensionsResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_extensions_manager_service_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetExtensionsResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetExtensionsResponse) ProtoMessage() {}
+
+func (x *GetExtensionsResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_extensions_manager_service_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use GetExtensionsResponse.ProtoReflect.Descriptor instead.
+func (*GetExtensionsResponse) Descriptor() ([]byte, []int) {
+	return file_extensions_manager_service_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *GetExtensionsResponse) GetStatus() []*GetExtensionsResponse_Status {
+	if x != nil {
+		return x.Status
+	}
+	return nil
+}
+
+// ServiceDescription описание расширения (возвращается сервисом при регистрации)
+type ExtensionDescriptor struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Extension          string            `protobuf:"bytes,10000,opt,name=extension,proto3" json:"extension,omitempty"`                                                                                   // Имя расширения
+	Title              string            `protobuf:"bytes,10010,opt,name=title,proto3" json:"title,omitempty"`                                                                                           // Название расширения
+	Description        string            `protobuf:"bytes,10020,opt,name=description,proto3" json:"description,omitempty"`                                                                               // Описание расширения
+	Version            string            `protobuf:"bytes,10100,opt,name=version,proto3" json:"version,omitempty"`                                                                                       // Версия расширения
+	VersionDescription string            `protobuf:"bytes,10110,opt,name=version_description,json=versionDescription,proto3" json:"version_description,omitempty"`                                       // Описание версии
+	Deps               []string          `protobuf:"bytes,10200,rep,name=deps,proto3" json:"deps,omitempty"`                                                                                             // Зависимости от других расширений
+	Url                string            `protobuf:"bytes,5,opt,name=url,proto3" json:"url,omitempty"`                                                                                                   // Адрес для внутри сети, коммуникация между сервисами
+	Metadata           map[string]string `protobuf:"bytes,6,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Метаданные сервиса, смотрите документацию по сервису
+}
+
+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)
+	}
+}
+
+func (x *ExtensionDescriptor) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ExtensionDescriptor) ProtoMessage() {}
+
+func (x *ExtensionDescriptor) ProtoReflect() protoreflect.Message {
+	mi := &file_extensions_manager_service_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ExtensionDescriptor.ProtoReflect.Descriptor instead.
+func (*ExtensionDescriptor) Descriptor() ([]byte, []int) {
+	return file_extensions_manager_service_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *ExtensionDescriptor) GetExtension() string {
+	if x != nil {
+		return x.Extension
+	}
+	return ""
+}
+
+func (x *ExtensionDescriptor) GetTitle() string {
+	if x != nil {
+		return x.Title
+	}
+	return ""
+}
+
+func (x *ExtensionDescriptor) GetDescription() string {
+	if x != nil {
+		return x.Description
+	}
+	return ""
+}
+
+func (x *ExtensionDescriptor) GetVersion() string {
+	if x != nil {
+		return x.Version
+	}
+	return ""
+}
+
+func (x *ExtensionDescriptor) GetVersionDescription() string {
+	if x != nil {
+		return x.VersionDescription
+	}
+	return ""
+}
+
+func (x *ExtensionDescriptor) GetDeps() []string {
+	if x != nil {
+		return x.Deps
+	}
+	return nil
+}
+
+func (x *ExtensionDescriptor) GetUrl() string {
+	if x != nil {
+		return x.Url
+	}
+	return ""
+}
+
+func (x *ExtensionDescriptor) GetMetadata() map[string]string {
+	if x != nil {
+		return x.Metadata
+	}
+	return nil
+}
+
+type RegisterExtensionsRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Extensions []*ExtensionDescriptor `protobuf:"bytes,1,rep,name=extensions,proto3" json:"extensions,omitempty"`
+}
+
+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)
+	}
+}
+
+func (x *RegisterExtensionsRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*RegisterExtensionsRequest) ProtoMessage() {}
+
+func (x *RegisterExtensionsRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_extensions_manager_service_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use RegisterExtensionsRequest.ProtoReflect.Descriptor instead.
+func (*RegisterExtensionsRequest) Descriptor() ([]byte, []int) {
+	return file_extensions_manager_service_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *RegisterExtensionsRequest) GetExtensions() []*ExtensionDescriptor {
+	if x != nil {
+		return x.Extensions
+	}
+	return nil
+}
+
+type RegisterExtensionsResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+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)
+	}
+}
+
+func (x *RegisterExtensionsResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*RegisterExtensionsResponse) ProtoMessage() {}
+
+func (x *RegisterExtensionsResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_extensions_manager_service_proto_msgTypes[4]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use RegisterExtensionsResponse.ProtoReflect.Descriptor instead.
+func (*RegisterExtensionsResponse) Descriptor() ([]byte, []int) {
+	return file_extensions_manager_service_proto_rawDescGZIP(), []int{4}
+}
+
+type UnregisterExtensionsRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Extensions []*ExtensionDescriptor `protobuf:"bytes,1,rep,name=extensions,proto3" json:"extensions,omitempty"`
+}
+
+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)
+	}
+}
+
+func (x *UnregisterExtensionsRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*UnregisterExtensionsRequest) ProtoMessage() {}
+
+func (x *UnregisterExtensionsRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_extensions_manager_service_proto_msgTypes[5]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use UnregisterExtensionsRequest.ProtoReflect.Descriptor instead.
+func (*UnregisterExtensionsRequest) Descriptor() ([]byte, []int) {
+	return file_extensions_manager_service_proto_rawDescGZIP(), []int{5}
+}
+
+func (x *UnregisterExtensionsRequest) GetExtensions() []*ExtensionDescriptor {
+	if x != nil {
+		return x.Extensions
+	}
+	return nil
+}
+
+type UnregisterExtensionsResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+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)
+	}
+}
+
+func (x *UnregisterExtensionsResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*UnregisterExtensionsResponse) ProtoMessage() {}
+
+func (x *UnregisterExtensionsResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_extensions_manager_service_proto_msgTypes[6]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use UnregisterExtensionsResponse.ProtoReflect.Descriptor instead.
+func (*UnregisterExtensionsResponse) Descriptor() ([]byte, []int) {
+	return file_extensions_manager_service_proto_rawDescGZIP(), []int{6}
+}
+
+type ListExtensionsFilter struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Extension []string `protobuf:"bytes,1,rep,name=extension,proto3" json:"extension,omitempty"` // Список имен сервисов для получения результатов. Список может содержать регулярные выражения.
+}
+
+func (x *ListExtensionsFilter) Reset() {
+	*x = ListExtensionsFilter{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_extensions_manager_service_proto_msgTypes[7]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ListExtensionsFilter) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ListExtensionsFilter) ProtoMessage() {}
+
+func (x *ListExtensionsFilter) ProtoReflect() protoreflect.Message {
+	mi := &file_extensions_manager_service_proto_msgTypes[7]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ListExtensionsFilter.ProtoReflect.Descriptor instead.
+func (*ListExtensionsFilter) Descriptor() ([]byte, []int) {
+	return file_extensions_manager_service_proto_rawDescGZIP(), []int{7}
+}
+
+func (x *ListExtensionsFilter) GetExtension() []string {
+	if x != nil {
+		return x.Extension
+	}
+	return nil
+}
+
+type ListExtensionsRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Filter *ListExtensionsFilter `protobuf:"bytes,1,opt,name=filter,proto3" json:"filter,omitempty"`
+}
+
+func (x *ListExtensionsRequest) Reset() {
+	*x = ListExtensionsRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_extensions_manager_service_proto_msgTypes[8]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ListExtensionsRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ListExtensionsRequest) ProtoMessage() {}
+
+func (x *ListExtensionsRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_extensions_manager_service_proto_msgTypes[8]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ListExtensionsRequest.ProtoReflect.Descriptor instead.
+func (*ListExtensionsRequest) Descriptor() ([]byte, []int) {
+	return file_extensions_manager_service_proto_rawDescGZIP(), []int{8}
+}
+
+func (x *ListExtensionsRequest) GetFilter() *ListExtensionsFilter {
+	if x != nil {
+		return x.Filter
+	}
+	return nil
+}
+
+type ListExtensionsResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Extensions []*ExtensionDescriptor `protobuf:"bytes,1,rep,name=extensions,proto3" json:"extensions,omitempty"`
+}
+
+func (x *ListExtensionsResponse) Reset() {
+	*x = ListExtensionsResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_extensions_manager_service_proto_msgTypes[9]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ListExtensionsResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ListExtensionsResponse) ProtoMessage() {}
+
+func (x *ListExtensionsResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_extensions_manager_service_proto_msgTypes[9]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ListExtensionsResponse.ProtoReflect.Descriptor instead.
+func (*ListExtensionsResponse) Descriptor() ([]byte, []int) {
+	return file_extensions_manager_service_proto_rawDescGZIP(), []int{9}
+}
+
+func (x *ListExtensionsResponse) GetExtensions() []*ExtensionDescriptor {
+	if x != nil {
+		return x.Extensions
+	}
+	return nil
+}
+
+// Описание коллекций
+// space_extensions (Пространство/Расширения)
+type SpaceExtensions struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Extension   string                `protobuf:"bytes,10000,opt,name=extension,proto3" json:"extension,omitempty"`
+	Title       string                `protobuf:"bytes,10010,opt,name=title,proto3" json:"title,omitempty"`
+	Version     string                `protobuf:"bytes,10100,opt,name=version,proto3" json:"version,omitempty"`
+	Deps        []string              `protobuf:"bytes,10200,rep,name=deps,proto3" json:"deps,omitempty"`
+	State       SpaceExtensions_State `protobuf:"varint,10300,opt,name=state,proto3,enum=extensions.SpaceExtensions_State" json:"state,omitempty"`
+	StatusError string                `protobuf:"bytes,10400,opt,name=status_error,json=statusError,proto3" json:"status_error,omitempty"` // Сообщение к ошибке
+	StatusMsg   string                `protobuf:"bytes,10500,opt,name=status_msg,json=statusMsg,proto3" json:"status_msg,omitempty"`       // Сообщение к статусу
+}
+
+func (x *SpaceExtensions) Reset() {
+	*x = SpaceExtensions{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_extensions_manager_service_proto_msgTypes[10]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SpaceExtensions) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SpaceExtensions) ProtoMessage() {}
+
+func (x *SpaceExtensions) ProtoReflect() protoreflect.Message {
+	mi := &file_extensions_manager_service_proto_msgTypes[10]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use SpaceExtensions.ProtoReflect.Descriptor instead.
+func (*SpaceExtensions) Descriptor() ([]byte, []int) {
+	return file_extensions_manager_service_proto_rawDescGZIP(), []int{10}
+}
+
+func (x *SpaceExtensions) GetExtension() string {
+	if x != nil {
+		return x.Extension
+	}
+	return ""
+}
+
+func (x *SpaceExtensions) GetTitle() string {
+	if x != nil {
+		return x.Title
+	}
+	return ""
+}
+
+func (x *SpaceExtensions) GetVersion() string {
+	if x != nil {
+		return x.Version
+	}
+	return ""
+}
+
+func (x *SpaceExtensions) GetDeps() []string {
+	if x != nil {
+		return x.Deps
+	}
+	return nil
+}
+
+func (x *SpaceExtensions) GetState() SpaceExtensions_State {
+	if x != nil {
+		return x.State
+	}
+	return SpaceExtensions_PENDING
+}
+
+func (x *SpaceExtensions) GetStatusError() string {
+	if x != nil {
+		return x.StatusError
+	}
+	return ""
+}
+
+func (x *SpaceExtensions) GetStatusMsg() string {
+	if x != nil {
+		return x.StatusMsg
+	}
+	return ""
+}
+
+type GetExtensionsResponse_Status struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Extension        string `protobuf:"bytes,10100,opt,name=extension,proto3" json:"extension,omitempty"`                                       // Имя расширения
+	Msg              string `protobuf:"bytes,10200,opt,name=msg,proto3" json:"msg,omitempty"`                                                   // Сообщение
+	Error            string `protobuf:"bytes,10300,opt,name=error,proto3" json:"error,omitempty"`                                               // Ошибка (state == ERROR)
+	NotFound         bool   `protobuf:"varint,10350,opt,name=not_found,json=notFound,proto3" json:"not_found,omitempty"`                        // Расширение не найдено
+	Installed        bool   `protobuf:"varint,10400,opt,name=installed,proto3" json:"installed,omitempty"`                                      // Расширение установлено
+	UpdateAvailable  bool   `protobuf:"varint,10500,opt,name=update_available,json=updateAvailable,proto3" json:"update_available,omitempty"`   // Доступно обновление
+	InstalledVersion string `protobuf:"bytes,10510,opt,name=installed_version,json=installedVersion,proto3" json:"installed_version,omitempty"` // Установленная версия расширения
+	AvailableVersion string `protobuf:"bytes,10520,opt,name=available_version,json=availableVersion,proto3" json:"available_version,omitempty"` // Доступная версия расширения
+}
+
+func (x *GetExtensionsResponse_Status) Reset() {
+	*x = GetExtensionsResponse_Status{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_extensions_manager_service_proto_msgTypes[11]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetExtensionsResponse_Status) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetExtensionsResponse_Status) ProtoMessage() {}
+
+func (x *GetExtensionsResponse_Status) ProtoReflect() protoreflect.Message {
+	mi := &file_extensions_manager_service_proto_msgTypes[11]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use GetExtensionsResponse_Status.ProtoReflect.Descriptor instead.
+func (*GetExtensionsResponse_Status) Descriptor() ([]byte, []int) {
+	return file_extensions_manager_service_proto_rawDescGZIP(), []int{1, 0}
+}
+
+func (x *GetExtensionsResponse_Status) GetExtension() string {
+	if x != nil {
+		return x.Extension
+	}
+	return ""
+}
+
+func (x *GetExtensionsResponse_Status) GetMsg() string {
+	if x != nil {
+		return x.Msg
+	}
+	return ""
+}
+
+func (x *GetExtensionsResponse_Status) GetError() string {
+	if x != nil {
+		return x.Error
+	}
+	return ""
+}
+
+func (x *GetExtensionsResponse_Status) GetNotFound() bool {
+	if x != nil {
+		return x.NotFound
+	}
+	return false
+}
+
+func (x *GetExtensionsResponse_Status) GetInstalled() bool {
+	if x != nil {
+		return x.Installed
+	}
+	return false
+}
+
+func (x *GetExtensionsResponse_Status) GetUpdateAvailable() bool {
+	if x != nil {
+		return x.UpdateAvailable
+	}
+	return false
+}
+
+func (x *GetExtensionsResponse_Status) GetInstalledVersion() string {
+	if x != nil {
+		return x.InstalledVersion
+	}
+	return ""
+}
+
+func (x *GetExtensionsResponse_Status) GetAvailableVersion() string {
+	if x != nil {
+		return x.AvailableVersion
+	}
+	return ""
+}
+
+var File_extensions_manager_service_proto protoreflect.FileDescriptor
+
+var file_extensions_manager_service_proto_rawDesc = []byte{
+	0x0a, 0x20, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6d, 0x61, 0x6e,
+	0x61, 0x67, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x12, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x68,
+	0x0a, 0x14, 0x47, 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73,
+	0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65,
+	0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 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, 0x15, 0x0a, 0x06, 0x65, 0x6e, 0x76, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x22, 0xf2, 0x02, 0x0a, 0x15, 0x47, 0x65, 0x74,
+	0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x73, 0x65, 0x12, 0x40, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x03,
+	0x28, 0x0b, 0x32, 0x28, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e,
+	0x47, 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74,
+	0x61, 0x74, 0x75, 0x73, 0x1a, 0x96, 0x02, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12,
+	0x1d, 0x0a, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0xf4, 0x4e, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x11,
+	0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0xd8, 0x4f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73,
+	0x67, 0x12, 0x15, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xbc, 0x50, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x6f, 0x74, 0x5f,
+	0x66, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0xee, 0x50, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6e, 0x6f,
+	0x74, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x1d, 0x0a, 0x09, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c,
+	0x6c, 0x65, 0x64, 0x18, 0xa0, 0x51, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x6e, 0x73, 0x74,
+	0x61, 0x6c, 0x6c, 0x65, 0x64, 0x12, 0x2a, 0x0a, 0x10, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f,
+	0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x84, 0x52, 0x20, 0x01, 0x28, 0x08,
+	0x52, 0x0f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c,
+	0x65, 0x12, 0x2c, 0x0a, 0x11, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x5f, 0x76,
+	0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x8e, 0x52, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x69,
+	0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12,
+	0x2c, 0x0a, 0x11, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x76, 0x65, 0x72,
+	0x73, 0x69, 0x6f, 0x6e, 0x18, 0x98, 0x52, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x61, 0x76, 0x61,
+	0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xea, 0x02,
+	0x0a, 0x13, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x73, 0x63, 0x72,
+	0x69, 0x70, 0x74, 0x6f, 0x72, 0x12, 0x1d, 0x0a, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69,
+	0x6f, 0x6e, 0x18, 0x90, 0x4e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e,
+	0x73, 0x69, 0x6f, 0x6e, 0x12, 0x15, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x9a, 0x4e,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x21, 0x0a, 0x0b, 0x64,
+	0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xa4, 0x4e, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19,
+	0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0xf4, 0x4e, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x76, 0x65, 0x72,
+	0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e,
+	0x18, 0xfe, 0x4e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e,
+	0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x13, 0x0a, 0x04, 0x64,
+	0x65, 0x70, 0x73, 0x18, 0xd8, 0x4f, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x64, 0x65, 0x70, 0x73,
+	0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75,
+	0x72, 0x6c, 0x12, 0x49, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x06,
+	0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e,
+	0x73, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x73, 0x63, 0x72,
+	0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e,
+	0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a,
+	0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10,
+	0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79,
+	0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x5c, 0x0a, 0x19, 0x52, 0x65,
+	0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e,
+	0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x65, 0x78,
+	0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69,
+	0x6f, 0x6e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x0a, 0x65, 0x78,
+	0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x1c, 0x0a, 0x1a, 0x52, 0x65, 0x67, 0x69,
+	0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65,
+	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5e, 0x0a, 0x1b, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69,
+	0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69,
+	0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x65, 0x78, 0x74, 0x65,
+	0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e,
+	0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65,
+	0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x1e, 0x0a, 0x1c, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69,
+	0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65,
+	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x34, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78,
+	0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x1c,
+	0x0a, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28,
+	0x09, 0x52, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x15,
+	0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f,
+	0x6e, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e,
+	0x73, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22,
+	0x59, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e,
+	0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x0a, 0x65, 0x78, 0x74,
+	0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e,
+	0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e,
+	0x73, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x0a,
+	0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xb5, 0x02, 0x0a, 0x0f, 0x53,
+	0x70, 0x61, 0x63, 0x65, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1d,
+	0x0a, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x90, 0x4e, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x15, 0x0a,
+	0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x9a, 0x4e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74,
+	0x69, 0x74, 0x6c, 0x65, 0x12, 0x19, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18,
+	0xf4, 0x4e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12,
+	0x13, 0x0a, 0x04, 0x64, 0x65, 0x70, 0x73, 0x18, 0xd8, 0x4f, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04,
+	0x64, 0x65, 0x70, 0x73, 0x12, 0x38, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0xbc, 0x50,
+	0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e,
+	0x73, 0x2e, 0x53, 0x70, 0x61, 0x63, 0x65, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e,
+	0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x22,
+	0x0a, 0x0c, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xa0,
+	0x51, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x45, 0x72, 0x72,
+	0x6f, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x6d, 0x73, 0x67,
+	0x18, 0x84, 0x52, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d,
+	0x73, 0x67, 0x22, 0x3e, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x50,
+	0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x49, 0x4e, 0x53, 0x54,
+	0x41, 0x4c, 0x4c, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x4e, 0x5f, 0x50, 0x52,
+	0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x41, 0x49, 0x4c,
+	0x10, 0x03, 0x32, 0xa0, 0x03, 0x0a, 0x17, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e,
+	0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x65,
+	0x0a, 0x12, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73,
+	0x69, 0x6f, 0x6e, 0x73, 0x12, 0x25, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e,
+	0x73, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73,
+	0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x65, 0x78,
+	0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65,
+	0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f,
+	0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6b, 0x0a, 0x14, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73,
+	0x74, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x27, 0x2e,
+	0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x55, 0x6e, 0x72, 0x65, 0x67,
+	0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69,
+	0x6f, 0x6e, 0x73, 0x2e, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78,
+	0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x22, 0x00, 0x12, 0x59, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73,
+	0x69, 0x6f, 0x6e, 0x73, 0x12, 0x21, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e,
+	0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73,
+	0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69,
+	0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x56, 0x0a,
+	0x0d, 0x47, 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x20,
+	0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x45,
+	0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x1a, 0x21, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x47, 0x65,
+	0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f,
+	0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x3a, 0x5a, 0x38, 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, 0x78, 0x74, 0x65,
+	0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x3b, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e,
+	0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_extensions_manager_service_proto_rawDescOnce sync.Once
+	file_extensions_manager_service_proto_rawDescData = file_extensions_manager_service_proto_rawDesc
+)
+
+func file_extensions_manager_service_proto_rawDescGZIP() []byte {
+	file_extensions_manager_service_proto_rawDescOnce.Do(func() {
+		file_extensions_manager_service_proto_rawDescData = protoimpl.X.CompressGZIP(file_extensions_manager_service_proto_rawDescData)
+	})
+	return file_extensions_manager_service_proto_rawDescData
+}
+
+var file_extensions_manager_service_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
+var file_extensions_manager_service_proto_msgTypes = make([]protoimpl.MessageInfo, 13)
+var file_extensions_manager_service_proto_goTypes = []interface{}{
+	(SpaceExtensions_State)(0),           // 0: extensions.SpaceExtensions.State
+	(*GetExtensionsRequest)(nil),         // 1: extensions.GetExtensionsRequest
+	(*GetExtensionsResponse)(nil),        // 2: extensions.GetExtensionsResponse
+	(*ExtensionDescriptor)(nil),          // 3: extensions.ExtensionDescriptor
+	(*RegisterExtensionsRequest)(nil),    // 4: extensions.RegisterExtensionsRequest
+	(*RegisterExtensionsResponse)(nil),   // 5: extensions.RegisterExtensionsResponse
+	(*UnregisterExtensionsRequest)(nil),  // 6: extensions.UnregisterExtensionsRequest
+	(*UnregisterExtensionsResponse)(nil), // 7: extensions.UnregisterExtensionsResponse
+	(*ListExtensionsFilter)(nil),         // 8: extensions.ListExtensionsFilter
+	(*ListExtensionsRequest)(nil),        // 9: extensions.ListExtensionsRequest
+	(*ListExtensionsResponse)(nil),       // 10: extensions.ListExtensionsResponse
+	(*SpaceExtensions)(nil),              // 11: extensions.SpaceExtensions
+	(*GetExtensionsResponse_Status)(nil), // 12: extensions.GetExtensionsResponse.Status
+	nil,                                  // 13: extensions.ExtensionDescriptor.MetadataEntry
+}
+var file_extensions_manager_service_proto_depIdxs = []int32{
+	12, // 0: extensions.GetExtensionsResponse.status:type_name -> extensions.GetExtensionsResponse.Status
+	13, // 1: extensions.ExtensionDescriptor.metadata:type_name -> extensions.ExtensionDescriptor.MetadataEntry
+	3,  // 2: extensions.RegisterExtensionsRequest.extensions:type_name -> extensions.ExtensionDescriptor
+	3,  // 3: extensions.UnregisterExtensionsRequest.extensions:type_name -> extensions.ExtensionDescriptor
+	8,  // 4: extensions.ListExtensionsRequest.filter:type_name -> extensions.ListExtensionsFilter
+	3,  // 5: extensions.ListExtensionsResponse.extensions:type_name -> extensions.ExtensionDescriptor
+	0,  // 6: extensions.SpaceExtensions.state:type_name -> extensions.SpaceExtensions.State
+	4,  // 7: extensions.ExtensionManagerService.RegisterExtensions:input_type -> extensions.RegisterExtensionsRequest
+	6,  // 8: extensions.ExtensionManagerService.UnregisterExtensions:input_type -> extensions.UnregisterExtensionsRequest
+	9,  // 9: extensions.ExtensionManagerService.ListExtensions:input_type -> extensions.ListExtensionsRequest
+	1,  // 10: extensions.ExtensionManagerService.GetExtensions:input_type -> extensions.GetExtensionsRequest
+	5,  // 11: extensions.ExtensionManagerService.RegisterExtensions:output_type -> extensions.RegisterExtensionsResponse
+	7,  // 12: extensions.ExtensionManagerService.UnregisterExtensions:output_type -> extensions.UnregisterExtensionsResponse
+	10, // 13: extensions.ExtensionManagerService.ListExtensions:output_type -> extensions.ListExtensionsResponse
+	2,  // 14: extensions.ExtensionManagerService.GetExtensions:output_type -> extensions.GetExtensionsResponse
+	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_extensions_manager_service_proto_init() }
+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 interface{}, i int) interface{} {
+			switch v := v.(*GetExtensionsRequest); 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 interface{}, i int) interface{} {
+			switch v := v.(*GetExtensionsResponse); 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 interface{}, i int) interface{} {
+			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 interface{}, i int) interface{} {
+			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 interface{}, i int) interface{} {
+			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 interface{}, i int) interface{} {
+			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 interface{}, i int) interface{} {
+			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 interface{}, i int) interface{} {
+			switch v := v.(*ListExtensionsFilter); 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 interface{}, i int) interface{} {
+			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[9].Exporter = func(v interface{}, i int) interface{} {
+			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[10].Exporter = func(v interface{}, i int) interface{} {
+			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[11].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetExtensionsResponse_Status); 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{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_extensions_manager_service_proto_rawDesc,
+			NumEnums:      1,
+			NumMessages:   13,
+			NumExtensions: 0,
+			NumServices:   1,
+		},
+		GoTypes:           file_extensions_manager_service_proto_goTypes,
+		DependencyIndexes: file_extensions_manager_service_proto_depIdxs,
+		EnumInfos:         file_extensions_manager_service_proto_enumTypes,
+		MessageInfos:      file_extensions_manager_service_proto_msgTypes,
+	}.Build()
+	File_extensions_manager_service_proto = out.File
+	file_extensions_manager_service_proto_rawDesc = nil
+	file_extensions_manager_service_proto_goTypes = nil
+	file_extensions_manager_service_proto_depIdxs = nil
+}
diff --git a/proto/extensions/manager_service_grpc.pb.go b/proto/extensions/manager_service_grpc.pb.go
new file mode 100644
index 0000000000000000000000000000000000000000..5d83652ff60c8210214501e0da0a1aa8fc23bcf3
--- /dev/null
+++ b/proto/extensions/manager_service_grpc.pb.go
@@ -0,0 +1,276 @@
+//*
+//
+//# Менеджер расширений
+//
+//Реализует функционал по координации расширений в системе и служит единой точкой доступа для работы с расширениями:
+//- Регистрирует все расширения в едином реестре
+//- Предоставляет доступ к реестру расширений на получение доступных расширений в системе
+//- Контролирует процесс установки расширения, устанавливает все необходимые зависимости в правильном порядке
+//- Контролирует создание системной коллекции `system_extensions` (System/Extensions) и создание/удалений в ней установленных расширений
+//- Контролирует создание системной коллекции `system_actions` (System/Actions). Выполняет удаление всех действий связанных
+//с расширением при его удалении.
+//- Выполняет переадресацию запросов на действия для расширений
+//
+//Менеджер расширений для контроля установленных расширений использует системные коллекции. При обращении к сервису контента
+//используются системный уровень прав для создания необходимых коллекций и получения данных:
+//1. `system_extensions` (System Extensions) - доступна только системным пользователям
+//2. `system_actions` (System Actions) - по умолчанию доступна только системным пользователям, настройки доступа на чтение
+//выдаются пользователям вручную. В зависимости от пользователя в интерфейсе отображаются те или иные доступные действия.
+//
+//Проверка наличия коллекций и создание в случае их отсутствия выполняется в момент установки расширений. После установки
+//расширения в коллекцию `system_extensions` добавляется запись об установленном расширении. Действия добавляются в
+//коллекцию `system_actions` расширениями по собственному усмотрению при установке.
+//
+//Для обращения к расширениям используются права текущего пользователя запрашивающего операцию. Если пользователь не
+//обладает необходимыми правами для выполнения действия то операция вернет ошибку.
+//
+
+// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+// versions:
+// - protoc-gen-go-grpc v1.3.0
+// - protoc             v4.24.3
+// source: extensions/manager_service.proto
+
+package extensions
+
+import (
+	context "context"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+// Requires gRPC-Go v1.32.0 or later.
+const _ = grpc.SupportPackageIsVersion7
+
+const (
+	ExtensionManagerService_RegisterExtensions_FullMethodName   = "/extensions.ExtensionManagerService/RegisterExtensions"
+	ExtensionManagerService_UnregisterExtensions_FullMethodName = "/extensions.ExtensionManagerService/UnregisterExtensions"
+	ExtensionManagerService_ListExtensions_FullMethodName       = "/extensions.ExtensionManagerService/ListExtensions"
+	ExtensionManagerService_GetExtensions_FullMethodName        = "/extensions.ExtensionManagerService/GetExtensions"
+)
+
+// ExtensionManagerServiceClient is the client API for ExtensionManagerService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
+type ExtensionManagerServiceClient interface {
+	// ##  Регистрация расширений
+	//
+	// Регистрация\Дерегистрация происходить через сервис менеджера расширений (Extension Manager). В процессе регистрации сервис сообщает
+	// о поддерживаемых сервисом действиях (Actions) и версии сервиса и зависимостях:
+	// 1. Действия (Actions) - перечень действия которые обрабатываются сервисом. Включает в себя как системные действия,
+	// так и пользовательские, которые могут быть использованы в интерфейсе;
+	// 2. Имя сервиса/расширения - название сервиса внутри системы;
+	// 3. Версия сервиса - сервис сообщает текущую версию сервиса. Контроллер сообщает пользователю о возможности обновления
+	// расширения при смене версии;
+	// 4. Описание версии - содержит информацию об изменениях в последних версиях расширения;
+	// 5. Зависимости - перечень расширений которые необходимы сервису для функционирования. При установке сервиса
+	// все расширения от которых он зависит, будут так же установлены.
+	RegisterExtensions(ctx context.Context, in *RegisterExtensionsRequest, opts ...grpc.CallOption) (*RegisterExtensionsResponse, error)
+	UnregisterExtensions(ctx context.Context, in *UnregisterExtensionsRequest, opts ...grpc.CallOption) (*UnregisterExtensionsResponse, error)
+	// Получить список зарегистрированных сервисов
+	ListExtensions(ctx context.Context, in *ListExtensionsRequest, opts ...grpc.CallOption) (*ListExtensionsResponse, error)
+	// GetExtensionStatus - получить статус расширения
+	GetExtensions(ctx context.Context, in *GetExtensionsRequest, opts ...grpc.CallOption) (*GetExtensionsResponse, error)
+}
+
+type extensionManagerServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewExtensionManagerServiceClient(cc grpc.ClientConnInterface) ExtensionManagerServiceClient {
+	return &extensionManagerServiceClient{cc}
+}
+
+func (c *extensionManagerServiceClient) RegisterExtensions(ctx context.Context, in *RegisterExtensionsRequest, opts ...grpc.CallOption) (*RegisterExtensionsResponse, error) {
+	out := new(RegisterExtensionsResponse)
+	err := c.cc.Invoke(ctx, ExtensionManagerService_RegisterExtensions_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *extensionManagerServiceClient) UnregisterExtensions(ctx context.Context, in *UnregisterExtensionsRequest, opts ...grpc.CallOption) (*UnregisterExtensionsResponse, error) {
+	out := new(UnregisterExtensionsResponse)
+	err := c.cc.Invoke(ctx, ExtensionManagerService_UnregisterExtensions_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *extensionManagerServiceClient) ListExtensions(ctx context.Context, in *ListExtensionsRequest, opts ...grpc.CallOption) (*ListExtensionsResponse, error) {
+	out := new(ListExtensionsResponse)
+	err := c.cc.Invoke(ctx, ExtensionManagerService_ListExtensions_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *extensionManagerServiceClient) GetExtensions(ctx context.Context, in *GetExtensionsRequest, opts ...grpc.CallOption) (*GetExtensionsResponse, error) {
+	out := new(GetExtensionsResponse)
+	err := c.cc.Invoke(ctx, ExtensionManagerService_GetExtensions_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// ExtensionManagerServiceServer is the server API for ExtensionManagerService service.
+// All implementations must embed UnimplementedExtensionManagerServiceServer
+// for forward compatibility
+type ExtensionManagerServiceServer interface {
+	// ##  Регистрация расширений
+	//
+	// Регистрация\Дерегистрация происходить через сервис менеджера расширений (Extension Manager). В процессе регистрации сервис сообщает
+	// о поддерживаемых сервисом действиях (Actions) и версии сервиса и зависимостях:
+	// 1. Действия (Actions) - перечень действия которые обрабатываются сервисом. Включает в себя как системные действия,
+	// так и пользовательские, которые могут быть использованы в интерфейсе;
+	// 2. Имя сервиса/расширения - название сервиса внутри системы;
+	// 3. Версия сервиса - сервис сообщает текущую версию сервиса. Контроллер сообщает пользователю о возможности обновления
+	// расширения при смене версии;
+	// 4. Описание версии - содержит информацию об изменениях в последних версиях расширения;
+	// 5. Зависимости - перечень расширений которые необходимы сервису для функционирования. При установке сервиса
+	// все расширения от которых он зависит, будут так же установлены.
+	RegisterExtensions(context.Context, *RegisterExtensionsRequest) (*RegisterExtensionsResponse, error)
+	UnregisterExtensions(context.Context, *UnregisterExtensionsRequest) (*UnregisterExtensionsResponse, error)
+	// Получить список зарегистрированных сервисов
+	ListExtensions(context.Context, *ListExtensionsRequest) (*ListExtensionsResponse, error)
+	// GetExtensionStatus - получить статус расширения
+	GetExtensions(context.Context, *GetExtensionsRequest) (*GetExtensionsResponse, error)
+	mustEmbedUnimplementedExtensionManagerServiceServer()
+}
+
+// UnimplementedExtensionManagerServiceServer must be embedded to have forward compatible implementations.
+type UnimplementedExtensionManagerServiceServer struct {
+}
+
+func (UnimplementedExtensionManagerServiceServer) RegisterExtensions(context.Context, *RegisterExtensionsRequest) (*RegisterExtensionsResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method RegisterExtensions not implemented")
+}
+func (UnimplementedExtensionManagerServiceServer) UnregisterExtensions(context.Context, *UnregisterExtensionsRequest) (*UnregisterExtensionsResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method UnregisterExtensions not implemented")
+}
+func (UnimplementedExtensionManagerServiceServer) ListExtensions(context.Context, *ListExtensionsRequest) (*ListExtensionsResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ListExtensions not implemented")
+}
+func (UnimplementedExtensionManagerServiceServer) GetExtensions(context.Context, *GetExtensionsRequest) (*GetExtensionsResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetExtensions not implemented")
+}
+func (UnimplementedExtensionManagerServiceServer) mustEmbedUnimplementedExtensionManagerServiceServer() {
+}
+
+// UnsafeExtensionManagerServiceServer may be embedded to opt out of forward compatibility for this service.
+// Use of this interface is not recommended, as added methods to ExtensionManagerServiceServer will
+// result in compilation errors.
+type UnsafeExtensionManagerServiceServer interface {
+	mustEmbedUnimplementedExtensionManagerServiceServer()
+}
+
+func RegisterExtensionManagerServiceServer(s grpc.ServiceRegistrar, srv ExtensionManagerServiceServer) {
+	s.RegisterService(&ExtensionManagerService_ServiceDesc, srv)
+}
+
+func _ExtensionManagerService_RegisterExtensions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(RegisterExtensionsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ExtensionManagerServiceServer).RegisterExtensions(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ExtensionManagerService_RegisterExtensions_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ExtensionManagerServiceServer).RegisterExtensions(ctx, req.(*RegisterExtensionsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ExtensionManagerService_UnregisterExtensions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(UnregisterExtensionsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ExtensionManagerServiceServer).UnregisterExtensions(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ExtensionManagerService_UnregisterExtensions_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ExtensionManagerServiceServer).UnregisterExtensions(ctx, req.(*UnregisterExtensionsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ExtensionManagerService_ListExtensions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ListExtensionsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ExtensionManagerServiceServer).ListExtensions(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ExtensionManagerService_ListExtensions_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ExtensionManagerServiceServer).ListExtensions(ctx, req.(*ListExtensionsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ExtensionManagerService_GetExtensions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetExtensionsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ExtensionManagerServiceServer).GetExtensions(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: ExtensionManagerService_GetExtensions_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ExtensionManagerServiceServer).GetExtensions(ctx, req.(*GetExtensionsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+// ExtensionManagerService_ServiceDesc is the grpc.ServiceDesc for ExtensionManagerService service.
+// It's only intended for direct use with grpc.RegisterService,
+// and not to be introspected or modified (even as a copy)
+var ExtensionManagerService_ServiceDesc = grpc.ServiceDesc{
+	ServiceName: "extensions.ExtensionManagerService",
+	HandlerType: (*ExtensionManagerServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "RegisterExtensions",
+			Handler:    _ExtensionManagerService_RegisterExtensions_Handler,
+		},
+		{
+			MethodName: "UnregisterExtensions",
+			Handler:    _ExtensionManagerService_UnregisterExtensions_Handler,
+		},
+		{
+			MethodName: "ListExtensions",
+			Handler:    _ExtensionManagerService_ListExtensions_Handler,
+		},
+		{
+			MethodName: "GetExtensions",
+			Handler:    _ExtensionManagerService_GetExtensions_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "extensions/manager_service.proto",
+}
diff --git a/proto/files/files.pb.go b/proto/files/files.pb.go
index aa4c401790f2198c902b0bf2ab2b04f81c37390e..8f93164f9b2f1957fd62aca0fe29a7cdc62d4b29 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.29.0
-// 	protoc        v3.21.12
+// 	protoc-gen-go v1.31.0
+// 	protoc        v4.24.3
 // source: files/files.proto
 
 package files
diff --git a/proto/files/files_grpc.pb.go b/proto/files/files_grpc.pb.go
index ee2444091e3d3fa32ee913d3ea76a3de24588c79..234e28599a99f74e704121aeda9e82a9f37005b4 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.3.0
-// - protoc             v3.21.12
+// - protoc             v4.24.3
 // source: files/files.proto
 
 package files
diff --git a/proto/images/images.pb.go b/proto/images/images.pb.go
index 0142bf158096fa9dcb535aabc323e9e405dee60f..4f95cb6da087725f8af05fbca35955d9e02c7608 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.29.0
-// 	protoc        v3.21.12
+// 	protoc-gen-go v1.31.0
+// 	protoc        v4.24.3
 // source: images/images.proto
 
 package images
diff --git a/proto/images/images_grpc.pb.go b/proto/images/images_grpc.pb.go
index 94d3cef36b1c51b7b0256d54a4fc26936cc9fcec..272c6580743f491a78834708bdcacfef2a166f86 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.3.0
-// - protoc             v3.21.12
+// - protoc             v4.24.3
 // source: images/images.proto
 
 package images
diff --git a/proto/invitations/invitations.pb.go b/proto/invitations/invitations.pb.go
index 7ebe5e43aa3cd9463ba7c00c3e60fbdafc262db8..1e9fd729c0ffba1903d60f70ba8f89041684b11d 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.29.0
-// 	protoc        v3.21.12
+// 	protoc-gen-go v1.31.0
+// 	protoc        v4.24.3
 // source: invitations/invitations.proto
 
 package invitations
diff --git a/proto/invitations/invitations_grpc.pb.go b/proto/invitations/invitations_grpc.pb.go
index cb7a47924a439fae10ca3dbc8ae37951e9b8a09b..d5137fec4deee51fb509d7ee0ba9e0c235f57668 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.3.0
-// - protoc             v3.21.12
+// - protoc             v4.24.3
 // source: invitations/invitations.proto
 
 package invitations
diff --git a/proto/items/items.pb.go b/proto/items/items.pb.go
index c334f0d43f428774856cfddcc36a59a4b834a91b..577d218baf66aae7881a4d084307e47bec73f44b 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.30.0
-// 	protoc        v3.21.12
+// 	protoc-gen-go v1.31.0
+// 	protoc        v4.24.3
 // source: items/items.proto
 
 package items
diff --git a/proto/items/items_grpc.pb.go b/proto/items/items_grpc.pb.go
index 7c7d321a9b1a57290a874dc8723679e9b6e755f2..b246b7627a8bbbdaaba51165e9f7b7e936691a11 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.3.0
-// - protoc             v3.21.12
+// - protoc             v4.24.3
 // source: items/items.proto
 
 package items
diff --git a/proto/locales/locales.pb.go b/proto/locales/locales.pb.go
index b4976bef329f5416bf10bd25f2dc2d8559b15d97..6ed197b9a1d42660f0211daaaba01f7334ff93df 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.29.0
-// 	protoc        v3.21.12
+// 	protoc-gen-go v1.31.0
+// 	protoc        v4.24.3
 // source: locales/locales.proto
 
 package locales
diff --git a/proto/locales/locales_grpc.pb.go b/proto/locales/locales_grpc.pb.go
index 6d2cc59bfb68665cb229a72830e646c7eb0aa30d..d8f5e712b8b06e5646d56020c1e0cb06ae24545f 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.3.0
-// - protoc             v3.21.12
+// - protoc             v4.24.3
 // source: locales/locales.proto
 
 package locales
diff --git a/proto/members/members.pb.go b/proto/members/members.pb.go
index f64cccf98ba400727fa1fa8e621978fb9b2133c2..a939a3f8189f6f100b61a4ad070a3c4fb30fb023 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.29.0
-// 	protoc        v3.21.12
+// 	protoc-gen-go v1.31.0
+// 	protoc        v4.24.3
 // source: members/members.proto
 
 package members
diff --git a/proto/members/members_grpc.pb.go b/proto/members/members_grpc.pb.go
index 8e8a103fd6254175c04f60df28c710ea72e3a060..c0216bfe1d7c10c12a4d02d32b5ba6774cfcd59c 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.3.0
-// - protoc             v3.21.12
+// - protoc             v4.24.3
 // source: members/members.proto
 
 package members
diff --git a/proto/organizations/organizations.pb.go b/proto/organizations/organizations.pb.go
index fa19fd7b92e181a9bac136d55a0a9805cb68f3c0..b744640573280053557944e9cbd93a43b0be7b46 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.29.0
-// 	protoc        v3.21.12
+// 	protoc-gen-go v1.31.0
+// 	protoc        v4.24.3
 // source: organizations/organizations.proto
 
 package organizations
diff --git a/proto/organizations/organizations_grpc.pb.go b/proto/organizations/organizations_grpc.pb.go
index 5e49e478a36c39bc65d5f48b559c63f04dcbed1a..dc737ac9a2eb95cb6c977f537216942dfd4164d7 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.3.0
-// - protoc             v3.21.12
+// - protoc             v4.24.3
 // source: organizations/organizations.proto
 
 package organizations
diff --git a/proto/references/references.pb.go b/proto/references/references.pb.go
index 3ed0a65b0a7aa010299850c3315ad745e939442b..64895f9fa4b2e475dbc9444ee9998fc3d4204699 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.31.0
-// 	protoc        v4.23.4
+// 	protoc        v4.24.3
 // source: references/references.proto
 
 package references
diff --git a/proto/references/references_grpc.pb.go b/proto/references/references_grpc.pb.go
index 61a8dbdb68a115dbf67c8f6211227b58c7d363cf..750571cede9b697ed3392cd96941b2db54934fcb 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.3.0
-// - protoc             v4.23.4
+// - protoc             v4.24.3
 // source: references/references.proto
 
 package references
@@ -31,14 +31,14 @@ type ReferencesClient interface {
 	Get(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (*GetResponse, error)
 	// Publish принимает список ссылок на записи и публикует их с учетом вложенных ссылок.
 	//
-	// - В случае если флаг `recursive` установлен в true, то будут рекурсивно опубликованы
-	//   все записи на которые ссылаются найденные записи.
-	// - Если флаг `recursive` установлен в false, то будут опубликованы записи
-	//   только из списка `references` в случае если они не содержат не опубликованных
-	//   ссылок. В противном случае возвращается список не опубликованных записей `unpublished`
-	//   которые требуют публикации. Список `published` при этом будет пустым. В случае если флаг
-	//   `force` установлен в true, то записи будут опубликованы даже если они содержат
-	//   не опубликованные ссылки.
+	//   - В случае если флаг `recursive` установлен в true, то будут рекурсивно опубликованы
+	//     все записи на которые ссылаются найденные записи.
+	//   - Если флаг `recursive` установлен в false, то будут опубликованы записи
+	//     только из списка `references` в случае если они не содержат не опубликованных
+	//     ссылок. В противном случае возвращается список не опубликованных записей `unpublished`
+	//     которые требуют публикации. Список `published` при этом будет пустым. В случае если флаг
+	//     `force` установлен в true, то записи будут опубликованы даже если они содержат
+	//     не опубликованные ссылки.
 	Publish(ctx context.Context, in *PublishRequest, opts ...grpc.CallOption) (*PublishResponse, error)
 }
 
@@ -76,14 +76,14 @@ type ReferencesServer interface {
 	Get(context.Context, *GetRequest) (*GetResponse, error)
 	// Publish принимает список ссылок на записи и публикует их с учетом вложенных ссылок.
 	//
-	// - В случае если флаг `recursive` установлен в true, то будут рекурсивно опубликованы
-	//   все записи на которые ссылаются найденные записи.
-	// - Если флаг `recursive` установлен в false, то будут опубликованы записи
-	//   только из списка `references` в случае если они не содержат не опубликованных
-	//   ссылок. В противном случае возвращается список не опубликованных записей `unpublished`
-	//   которые требуют публикации. Список `published` при этом будет пустым. В случае если флаг
-	//   `force` установлен в true, то записи будут опубликованы даже если они содержат
-	//   не опубликованные ссылки.
+	//   - В случае если флаг `recursive` установлен в true, то будут рекурсивно опубликованы
+	//     все записи на которые ссылаются найденные записи.
+	//   - Если флаг `recursive` установлен в false, то будут опубликованы записи
+	//     только из списка `references` в случае если они не содержат не опубликованных
+	//     ссылок. В противном случае возвращается список не опубликованных записей `unpublished`
+	//     которые требуют публикации. Список `published` при этом будет пустым. В случае если флаг
+	//     `force` установлен в true, то записи будут опубликованы даже если они содержат
+	//     не опубликованные ссылки.
 	Publish(context.Context, *PublishRequest) (*PublishResponse, error)
 	mustEmbedUnimplementedReferencesServer()
 }
diff --git a/proto/roles/roles.pb.go b/proto/roles/roles.pb.go
index 56a202a4fbe3cec46e1b6221bceb1050b031d373..0d70814977a6b765b8377739bd3f43704b98ec02 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.29.0
-// 	protoc        v3.21.12
+// 	protoc-gen-go v1.31.0
+// 	protoc        v4.24.3
 // source: roles/roles.proto
 
 package roles
diff --git a/proto/roles/roles_grpc.pb.go b/proto/roles/roles_grpc.pb.go
index 596c13fb4a72989aa5b4334908fc45c5fa97fcc6..13000eb2e08429aa6fcc93d5e133d4e3012c05ff 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.3.0
-// - protoc             v3.21.12
+// - protoc             v4.24.3
 // source: roles/roles.proto
 
 package roles
diff --git a/proto/spaces/spaces.pb.go b/proto/spaces/spaces.pb.go
index 6fb15d8af880c6a8cd39704cee97c860d210fbac..d5c57b12ed99209be6e6bfeb15e5627c7eb58b40 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.31.0
-// 	protoc        v4.23.4
+// 	protoc        v4.24.3
 // source: spaces/spaces.proto
 
 package spaces
diff --git a/proto/spaces/spaces_grpc.pb.go b/proto/spaces/spaces_grpc.pb.go
index f62bfa6dc1670c60e95a2d98a1db13275f43a3fe..18aa43b307fd40ad17480082c2cc104dea50ed9c 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.3.0
-// - protoc             v4.23.4
+// - protoc             v4.24.3
 // source: spaces/spaces.proto
 
 package spaces
diff --git a/proto/users/users.pb.go b/proto/users/users.pb.go
index 8ab0e5ce776aa5aade419ce8e8adc81ee8df5d18..18f49f1a3c2e75c911a5f783e9f008da8d9c4c79 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.29.0
-// 	protoc        v3.21.12
+// 	protoc-gen-go v1.31.0
+// 	protoc        v4.24.3
 // source: users/users.proto
 
 package users
diff --git a/proto/users/users_grpc.pb.go b/proto/users/users_grpc.pb.go
index 8229c3b7e1b390aacdcd127a71efa166c138a494..30a2b84431e53679e4b92f0f3db43ffc8d0e190c 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.3.0
-// - protoc             v3.21.12
+// - protoc             v4.24.3
 // source: users/users.proto
 
 package users
diff --git a/proto/versions/account/versions.pb.go b/proto/versions/account/versions.pb.go
index c9e0a8db89275bd866540cd39cd3e8444642caa3..9db5b3d2864ba0de22a950db158d66c3f488a36c 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.29.0
-// 	protoc        v3.21.12
+// 	protoc-gen-go v1.31.0
+// 	protoc        v4.24.3
 // source: versions/account/versions.proto
 
 package account
diff --git a/proto/versions/account/versions_grpc.pb.go b/proto/versions/account/versions_grpc.pb.go
index 2d017713cdd8731f90283b3596d6c391dc7acd49..6d3fd60aff0ad0692c3a2ec698607ee4c59b9f97 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.3.0
-// - protoc             v3.21.12
+// - protoc             v4.24.3
 // source: versions/account/versions.proto
 
 package account
diff --git a/proto/versions/content/versions.pb.go b/proto/versions/content/versions.pb.go
index ad5fdb6eb88f9898488b5875d51939edd55853b7..c399b1a29d2e793d7918eaa456670d4b2a6d02ce 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.29.0
-// 	protoc        v3.21.12
+// 	protoc-gen-go v1.31.0
+// 	protoc        v4.24.3
 // source: versions/content/versions.proto
 
 package content
diff --git a/proto/versions/content/versions_grpc.pb.go b/proto/versions/content/versions_grpc.pb.go
index f106e46d75acdbf07e54757730a3e078b3159ef4..25198d3383a04d58c15a85d83673445386e347b2 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.3.0
-// - protoc             v3.21.12
+// - protoc             v4.24.3
 // source: versions/content/versions.proto
 
 package content