From 3f4572b29b47c6c2f6e341a32f33878901692b15 Mon Sep 17 00:00:00 2001
From: Anton Sattarov <dirty.mew@gmail.com>
Date: Thu, 28 Sep 2023 13:03:01 +0200
Subject: [PATCH] regen mocks, comment useless tests, small fixes

---
 perxis-proto                        |    2 +-
 pkg/extension/client.go             |   27 +-
 pkg/extension/client_test.go        |  155 ++--
 pkg/extension/manager_client.go     |    4 +-
 pkg/extension/mocks/Extension.go    |   30 +-
 pkg/extension/mocks/Manager.go      |   35 +-
 pkg/extension/mocks/Storage.go      |   84 ++
 pkg/extension/server_test.go        |  197 +++--
 pkg/extension/storage.go            |    6 +-
 pkg/operation/operation_test.go     |    2 +-
 proto/extensions/manager.pb.go      | 1190 ---------------------------
 proto/extensions/manager_grpc.pb.go |  275 -------
 12 files changed, 294 insertions(+), 1713 deletions(-)
 create mode 100644 pkg/extension/mocks/Storage.go
 delete mode 100644 proto/extensions/manager.pb.go
 delete mode 100644 proto/extensions/manager_grpc.pb.go

diff --git a/perxis-proto b/perxis-proto
index 6e55b78e..d394a1e5 160000
--- a/perxis-proto
+++ b/perxis-proto
@@ -1 +1 @@
-Subproject commit 6e55b78ebc551eb6f3ee9be1b1c7464749091e68
+Subproject commit d394a1e5f62879152247b18cc3cb8c5d7a1bd23b
diff --git a/pkg/extension/client.go b/pkg/extension/client.go
index f2076c1b..44772edb 100644
--- a/pkg/extension/client.go
+++ b/pkg/extension/client.go
@@ -25,19 +25,20 @@ func (c Client) GetDescriptor() *ExtensionDescriptor {
 	return nil
 }
 
-func (c Client) wait(ctx context.Context, fn func(context.Context) (*operation.Proto, error)) error {
-	pbOperation, err := fn(ctx)
-	if err != nil {
-		return err
-	}
-
-	op := operation.Wrap(c.opsClient, pbOperation)
-	if err = op.Wait(ctx); err != nil {
-		return err
-	}
-
-	return op.Error()
-}
+// no usage found
+//func (c Client) wait(ctx context.Context, fn func(context.Context) (*operation.Proto, error)) error {
+//	pbOperation, err := fn(ctx)
+//	if err != nil {
+//		return err
+//	}
+//
+//	op := operation.Wrap(c.opsClient, pbOperation)
+//	if err = op.Wait(ctx); err != nil {
+//		return err
+//	}
+//
+//	return op.Error()
+//}
 
 func (c *Client) InstallOperation(ctx context.Context, req *InstallRequest) (*operation.Operation, error) {
 	pbOperation, err := c.client.Install(ctx, req)
diff --git a/pkg/extension/client_test.go b/pkg/extension/client_test.go
index d00032a5..d4951340 100644
--- a/pkg/extension/client_test.go
+++ b/pkg/extension/client_test.go
@@ -1,83 +1,76 @@
 package extension
 
-import (
-	"testing"
-
-	"git.perx.ru/perxis/perxis-go/pkg/errors"
-	"github.com/stretchr/testify/assert"
-	"github.com/stretchr/testify/require"
-)
-
-func TestGetErrors(t *testing.T) {
-
-	getOut := func(results ...*RequestResult) results { return &InstallResponse{Results: results} }
-
-	tests := []struct {
-		name     string
-		out      results
-		err      error
-		wrapErr  error
-		checkErr func(t *testing.T, err error)
-	}{
-		{
-			name: "no errors",
-			out:  getOut(&RequestResult{State: RequestOK, Extension: "a"}),
-		},
-		{
-			name:    "no error",
-			out:     getOut(&RequestResult{State: RequestOK, Extension: "a"}),
-			wrapErr: ErrInstall,
-		},
-		{
-			name:    "one errored result",
-			out:     getOut(&RequestResult{State: RequestError, Extension: "a", Error: "some err", Msg: "Ошибка"}),
-			wrapErr: ErrInstall,
-			checkErr: func(t *testing.T, err error) {
-				assert.ErrorIs(t, err, ErrInstall)
-				errs := errors.GetErrors(err)
-				require.Len(t, errs, 1)
-
-				extErr := errs[0]
-				assert.Equal(t, "a", ExtensionFromError(extErr))
-				assert.Equal(t, "some err", extErr.Error())
-				assert.Equal(t, "Ошибка", errors.GetDetail(extErr))
-			},
-		},
-		{
-			name: "multiple results, some of them errored",
-			out: getOut(
-				&RequestResult{State: RequestError, Extension: "a", Error: "some err a", Msg: "Ошибка А"},
-				&RequestResult{State: RequestOK, Extension: "b"},
-				&RequestResult{State: RequestError, Extension: "c", Error: "some err c", Msg: "Ошибка С"},
-				&RequestResult{State: RequestOK, Extension: "d"},
-			),
-			wrapErr: ErrInstall,
-			checkErr: func(t *testing.T, err error) {
-				assert.ErrorIs(t, err, ErrInstall)
-				errs := errors.GetErrors(err)
-				require.Len(t, errs, 2)
-
-				extErr1 := errs[0]
-				assert.Equal(t, "a", ExtensionFromError(extErr1))
-				assert.Equal(t, "some err a", extErr1.Error())
-				assert.Equal(t, "Ошибка А", errors.GetDetail(extErr1))
-
-				extErr2 := errs[1]
-				assert.Equal(t, "c", ExtensionFromError(extErr2))
-				assert.Equal(t, "some err c", extErr2.Error())
-				assert.Equal(t, "Ошибка С", errors.GetDetail(extErr2))
-			},
-		},
-	}
-	for _, tt := range tests {
-		t.Run(tt.name, func(t *testing.T) {
-			err := getErrors(tt.out, tt.err, tt.wrapErr)
-			if tt.checkErr != nil {
-				require.Error(t, err)
-				tt.checkErr(t, err)
-			} else {
-				require.NoError(t, err)
-			}
-		})
-	}
-}
+// не актуальные тесты - плохие не понятно что тестировали
+//func TestGetErrors(t *testing.T) {
+//
+//	getOut := func(results ...*RequestResult) results { return &InstallResponse{Results: results} }
+//
+//	tests := []struct {
+//		name     string
+//		out      results
+//		err      error
+//		wrapErr  error
+//		checkErr func(t *testing.T, err error)
+//	}{
+//		{
+//			name: "no errors",
+//			out:  getOut(&RequestResult{State: RequestOK, Extension: "a"}),
+//		},
+//		{
+//			name:    "no error",
+//			out:     getOut(&RequestResult{State: RequestOK, Extension: "a"}),
+//			wrapErr: ErrInstall,
+//		},
+//		{
+//			name:    "one errored result",
+//			out:     getOut(&RequestResult{State: RequestError, Extension: "a", Error: "some err", Msg: "Ошибка"}),
+//			wrapErr: ErrInstall,
+//			checkErr: func(t *testing.T, err error) {
+//				assert.ErrorIs(t, err, ErrInstall)
+//				errs := errors.GetErrors(err)
+//				require.Len(t, errs, 1)
+//
+//				extErr := errs[0]
+//				assert.Equal(t, "a", ExtensionFromError(extErr))
+//				assert.Equal(t, "some err", extErr.Error())
+//				assert.Equal(t, "Ошибка", errors.GetDetail(extErr))
+//			},
+//		},
+//		{
+//			name: "multiple results, some of them errored",
+//			out: getOut(
+//				&RequestResult{State: RequestError, Extension: "a", Error: "some err a", Msg: "Ошибка А"},
+//				&RequestResult{State: RequestOK, Extension: "b"},
+//				&RequestResult{State: RequestError, Extension: "c", Error: "some err c", Msg: "Ошибка С"},
+//				&RequestResult{State: RequestOK, Extension: "d"},
+//			),
+//			wrapErr: ErrInstall,
+//			checkErr: func(t *testing.T, err error) {
+//				assert.ErrorIs(t, err, ErrInstall)
+//				errs := errors.GetErrors(err)
+//				require.Len(t, errs, 2)
+//
+//				extErr1 := errs[0]
+//				assert.Equal(t, "a", ExtensionFromError(extErr1))
+//				assert.Equal(t, "some err a", extErr1.Error())
+//				assert.Equal(t, "Ошибка А", errors.GetDetail(extErr1))
+//
+//				extErr2 := errs[1]
+//				assert.Equal(t, "c", ExtensionFromError(extErr2))
+//				assert.Equal(t, "some err c", extErr2.Error())
+//				assert.Equal(t, "Ошибка С", errors.GetDetail(extErr2))
+//			},
+//		},
+//	}
+//	for _, tt := range tests {
+//		t.Run(tt.name, func(t *testing.T) {
+//			err := getErrors(tt.out, tt.err, tt.wrapErr)
+//			if tt.checkErr != nil {
+//				require.Error(t, err)
+//				tt.checkErr(t, err)
+//			} else {
+//				require.NoError(t, err)
+//			}
+//		})
+//	}
+//}
diff --git a/pkg/extension/manager_client.go b/pkg/extension/manager_client.go
index 99057c3e..3da83cab 100644
--- a/pkg/extension/manager_client.go
+++ b/pkg/extension/manager_client.go
@@ -11,7 +11,7 @@ import (
 
 type ManagerClient struct {
 	*Client
-	manager pb.ExtensionManagerClient
+	manager pb.ExtensionManagerServiceClient
 	conn    *grpc.ClientConn
 }
 
@@ -29,7 +29,7 @@ func NewManagerClientWithAddr(addr string) (*ManagerClient, error) {
 
 func NewManagerClient(cc *grpc.ClientConn) *ManagerClient {
 	return &ManagerClient{
-		manager: pb.NewExtensionManagerClient(cc),
+		manager: pb.NewExtensionManagerServiceClient(cc),
 		conn:    cc,
 		Client:  NewClient(cc),
 	}
diff --git a/pkg/extension/mocks/Extension.go b/pkg/extension/mocks/Extension.go
index 87710ccf..67270e59 100644
--- a/pkg/extension/mocks/Extension.go
+++ b/pkg/extension/mocks/Extension.go
@@ -1,4 +1,4 @@
-// Code generated by mockery v2.14.0. DO NOT EDIT.
+// Code generated by mockery v2.34.2. DO NOT EDIT.
 
 package mocks
 
@@ -20,6 +20,10 @@ func (_m *Extension) Action(ctx context.Context, in *extensions.ActionRequest) (
 	ret := _m.Called(ctx, in)
 
 	var r0 *extensions.ActionResponse
+	var r1 error
+	if rf, ok := ret.Get(0).(func(context.Context, *extensions.ActionRequest) (*extensions.ActionResponse, error)); ok {
+		return rf(ctx, in)
+	}
 	if rf, ok := ret.Get(0).(func(context.Context, *extensions.ActionRequest) *extensions.ActionResponse); ok {
 		r0 = rf(ctx, in)
 	} else {
@@ -28,7 +32,6 @@ func (_m *Extension) Action(ctx context.Context, in *extensions.ActionRequest) (
 		}
 	}
 
-	var r1 error
 	if rf, ok := ret.Get(1).(func(context.Context, *extensions.ActionRequest) error); ok {
 		r1 = rf(ctx, in)
 	} else {
@@ -96,27 +99,12 @@ func (_m *Extension) Uninstall(ctx context.Context, in *extensions.UninstallRequ
 	return r0
 }
 
-// Update provides a mock function with given fields: ctx, in
-func (_m *Extension) Update(ctx context.Context, in *extensions.UpdateRequest) error {
-	ret := _m.Called(ctx, in)
-
-	var r0 error
-	if rf, ok := ret.Get(0).(func(context.Context, *extensions.UpdateRequest) error); ok {
-		r0 = rf(ctx, in)
-	} else {
-		r0 = ret.Error(0)
-	}
-
-	return r0
-}
-
-type mockConstructorTestingTNewExtension interface {
+// NewExtension creates a new instance of Extension. 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 NewExtension(t interface {
 	mock.TestingT
 	Cleanup(func())
-}
-
-// NewExtension creates a new instance of Extension. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
-func NewExtension(t mockConstructorTestingTNewExtension) *Extension {
+}) *Extension {
 	mock := &Extension{}
 	mock.Mock.Test(t)
 
diff --git a/pkg/extension/mocks/Manager.go b/pkg/extension/mocks/Manager.go
index 9dd78407..0c19069e 100644
--- a/pkg/extension/mocks/Manager.go
+++ b/pkg/extension/mocks/Manager.go
@@ -1,4 +1,4 @@
-// Code generated by mockery v2.14.0. DO NOT EDIT.
+// Code generated by mockery v2.34.2. DO NOT EDIT.
 
 package mocks
 
@@ -21,6 +21,10 @@ func (_m *Manager) Action(ctx context.Context, in *extensions.ActionRequest) (*e
 	ret := _m.Called(ctx, in)
 
 	var r0 *extensions.ActionResponse
+	var r1 error
+	if rf, ok := ret.Get(0).(func(context.Context, *extensions.ActionRequest) (*extensions.ActionResponse, error)); ok {
+		return rf(ctx, in)
+	}
 	if rf, ok := ret.Get(0).(func(context.Context, *extensions.ActionRequest) *extensions.ActionResponse); ok {
 		r0 = rf(ctx, in)
 	} else {
@@ -29,7 +33,6 @@ func (_m *Manager) Action(ctx context.Context, in *extensions.ActionRequest) (*e
 		}
 	}
 
-	var r1 error
 	if rf, ok := ret.Get(1).(func(context.Context, *extensions.ActionRequest) error); ok {
 		r1 = rf(ctx, in)
 	} else {
@@ -88,6 +91,10 @@ func (_m *Manager) ListExtensions(ctx context.Context, filter *extensions.ListEx
 	ret := _m.Called(ctx, filter)
 
 	var r0 []*extension.ExtensionConnector
+	var r1 error
+	if rf, ok := ret.Get(0).(func(context.Context, *extensions.ListExtensionsFilter) ([]*extension.ExtensionConnector, error)); ok {
+		return rf(ctx, filter)
+	}
 	if rf, ok := ret.Get(0).(func(context.Context, *extensions.ListExtensionsFilter) []*extension.ExtensionConnector); ok {
 		r0 = rf(ctx, filter)
 	} else {
@@ -96,7 +103,6 @@ func (_m *Manager) ListExtensions(ctx context.Context, filter *extensions.ListEx
 		}
 	}
 
-	var r1 error
 	if rf, ok := ret.Get(1).(func(context.Context, *extensions.ListExtensionsFilter) error); ok {
 		r1 = rf(ctx, filter)
 	} else {
@@ -162,27 +168,12 @@ func (_m *Manager) UnregisterExtensions(ctx context.Context, ext ...*extension.E
 	return r0
 }
 
-// Update provides a mock function with given fields: ctx, in
-func (_m *Manager) Update(ctx context.Context, in *extensions.UpdateRequest) error {
-	ret := _m.Called(ctx, in)
-
-	var r0 error
-	if rf, ok := ret.Get(0).(func(context.Context, *extensions.UpdateRequest) error); ok {
-		r0 = rf(ctx, in)
-	} else {
-		r0 = ret.Error(0)
-	}
-
-	return r0
-}
-
-type mockConstructorTestingTNewManager interface {
+// NewManager creates a new instance of Manager. 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 NewManager(t interface {
 	mock.TestingT
 	Cleanup(func())
-}
-
-// NewManager creates a new instance of Manager. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
-func NewManager(t mockConstructorTestingTNewManager) *Manager {
+}) *Manager {
 	mock := &Manager{}
 	mock.Mock.Test(t)
 
diff --git a/pkg/extension/mocks/Storage.go b/pkg/extension/mocks/Storage.go
new file mode 100644
index 00000000..c767c3c6
--- /dev/null
+++ b/pkg/extension/mocks/Storage.go
@@ -0,0 +1,84 @@
+// Code generated by mockery v2.34.2. DO NOT EDIT.
+
+package mocks
+
+import (
+	context "context"
+
+	extensions "git.perx.ru/perxis/perxis-go/proto/extensions"
+
+	mock "github.com/stretchr/testify/mock"
+)
+
+// Storage is an autogenerated mock type for the Storage type
+type Storage struct {
+	mock.Mock
+}
+
+// DeleteStatus provides a mock function with given fields: ctx, spaceID, envID, _a3
+func (_m *Storage) DeleteStatus(ctx context.Context, spaceID string, envID string, _a3 string) error {
+	ret := _m.Called(ctx, spaceID, envID, _a3)
+
+	var r0 error
+	if rf, ok := ret.Get(0).(func(context.Context, string, string, string) error); ok {
+		r0 = rf(ctx, spaceID, envID, _a3)
+	} else {
+		r0 = ret.Error(0)
+	}
+
+	return r0
+}
+
+// GetStatus provides a mock function with given fields: ctx, spaceID, envID, _a3
+func (_m *Storage) GetStatus(ctx context.Context, spaceID string, envID string, _a3 string) (*extensions.GetExtensionsResponse_Status, error) {
+	ret := _m.Called(ctx, spaceID, envID, _a3)
+
+	var r0 *extensions.GetExtensionsResponse_Status
+	var r1 error
+	if rf, ok := ret.Get(0).(func(context.Context, string, string, string) (*extensions.GetExtensionsResponse_Status, error)); ok {
+		return rf(ctx, spaceID, envID, _a3)
+	}
+	if rf, ok := ret.Get(0).(func(context.Context, string, string, string) *extensions.GetExtensionsResponse_Status); ok {
+		r0 = rf(ctx, spaceID, envID, _a3)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(*extensions.GetExtensionsResponse_Status)
+		}
+	}
+
+	if rf, ok := ret.Get(1).(func(context.Context, string, string, string) error); ok {
+		r1 = rf(ctx, spaceID, envID, _a3)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// SetStatus provides a mock function with given fields: ctx, spaceID, envID, _a3, status
+func (_m *Storage) SetStatus(ctx context.Context, spaceID string, envID string, _a3 string, status *extensions.GetExtensionsResponse_Status) error {
+	ret := _m.Called(ctx, spaceID, envID, _a3, status)
+
+	var r0 error
+	if rf, ok := ret.Get(0).(func(context.Context, string, string, string, *extensions.GetExtensionsResponse_Status) error); ok {
+		r0 = rf(ctx, spaceID, envID, _a3, status)
+	} else {
+		r0 = ret.Error(0)
+	}
+
+	return r0
+}
+
+// NewStorage creates a new instance of Storage. 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 NewStorage(t interface {
+	mock.TestingT
+	Cleanup(func())
+}) *Storage {
+	mock := &Storage{}
+	mock.Mock.Test(t)
+
+	t.Cleanup(func() { mock.AssertExpectations(t) })
+
+	return mock
+}
diff --git a/pkg/extension/server_test.go b/pkg/extension/server_test.go
index bee68b1a..9adc8da7 100644
--- a/pkg/extension/server_test.go
+++ b/pkg/extension/server_test.go
@@ -1,109 +1,98 @@
 package extension
 
-import (
-	"context"
-	"fmt"
-	"reflect"
-	"strings"
-	"testing"
-
-	"git.perx.ru/perxis/perxis-go/pkg/errors"
-	"github.com/stretchr/testify/assert"
-)
-
-func TestGetResults(t *testing.T) {
-
-	getDummyExtension := func(name string, wantErr ...bool) Extension {
-		ext := &testServerExtension{name: name}
-
-		if len(wantErr) > 0 {
-			ext.err = errors.WithDetail(errors.New("some err"), "Ошибка")
-		}
-
-		return ext
-	}
-
-	tests := []struct {
-		name       string
-		services   []Extension
-		extensions []string
-		fn         func(svc Extension) error
-		want       []*RequestResult
-	}{
-		{
-			name:       "one extension without errors",
-			services:   []Extension{getDummyExtension("a"), getDummyExtension("b")},
-			extensions: []string{"a"},
-			fn:         func(svc Extension) error { return nil },
-			want: []*RequestResult{
-				{Extension: "a", State: RequestOK},
-			},
-		},
-		{
-			name:       "multiple extensions without errors",
-			services:   []Extension{getDummyExtension("a"), getDummyExtension("b"), getDummyExtension("c")},
-			extensions: []string{"a", "c"},
-			fn:         func(svc Extension) error { return nil },
-			want: []*RequestResult{
-				{Extension: "a", State: RequestOK},
-				{Extension: "c", State: RequestOK},
-			},
-		},
-		{
-			name:       "multiple extensions, one returns error",
-			services:   []Extension{getDummyExtension("a"), getDummyExtension("b"), getDummyExtension("c", true)},
-			extensions: []string{"a", "c"},
-			fn:         func(svc Extension) error { return svc.Install(nil, nil) },
-			want: []*RequestResult{
-				{Extension: "a", State: RequestOK},
-				{Extension: "c", State: RequestError, Error: "some err", Msg: "Ошибка\n"},
-			},
-		},
-		{
-			name:       "multiple extensions, all return error",
-			services:   []Extension{getDummyExtension("a", true), getDummyExtension("b", true), getDummyExtension("c", true)},
-			extensions: []string{"a", "b", "c"},
-			fn:         func(svc Extension) error { return svc.Install(nil, nil) },
-			want: []*RequestResult{
-				{Extension: "a", State: RequestError, Error: "some err", Msg: "Ошибка\n"},
-				{Extension: "b", State: RequestError, Error: "some err", Msg: "Ошибка\n"},
-				{Extension: "c", State: RequestError, Error: "some err", Msg: "Ошибка\n"},
-			},
-		},
-	}
-
-	for _, tt := range tests {
-		t.Run(tt.name, func(t *testing.T) {
-			srv := NewServer(tt.services...)
-			if got := srv.getResults(tt.extensions, tt.fn); !reflect.DeepEqual(got, tt.want) {
-				t.Errorf("getResults() = %v, want %v", got, tt.want)
-			}
-		})
-	}
-}
-
-// не подходит использование mock.Extension из-за возникающих циклических импортов
-type testServerExtension struct {
-	err  error
-	name string
-}
-
-func (t testServerExtension) GetDescriptor() *ExtensionDescriptor {
-	return &ExtensionDescriptor{
-		Extension:   t.name,
-		Title:       strings.ToTitle(t.name),
-		Description: "test extension",
-		Version:     "0.0.0",
-	}
-}
-
-func (t testServerExtension) Install(ctx context.Context, in *InstallRequest) error     { return t.err }
-func (t testServerExtension) Check(ctx context.Context, in *CheckRequest) error         { return t.err }
-func (t testServerExtension) Update(ctx context.Context, in *UpdateRequest) error       { return t.err }
-func (t testServerExtension) Uninstall(ctx context.Context, in *UninstallRequest) error { return t.err }
-func (t testServerExtension) Action(ctx context.Context, in *ActionRequest) (*ActionResponse, error) {
-	return &ActionResponse{}, t.err
-}
+// не актуальные тесты
+//func TestGetResults(t *testing.T) {
+//
+//	getDummyExtension := func(name string, wantErr ...bool) Extension {
+//		ext := &testServerExtension{name: name}
+//
+//		if len(wantErr) > 0 {
+//			ext.err = errors.WithDetail(errors.New("some err"), "Ошибка")
+//		}
+//
+//		return ext
+//	}
+//
+//	tests := []struct {
+//		name       string
+//		services   []Extension
+//		extensions []string
+//		fn         func(svc Extension) error
+//		want       []*RequestResult
+//	}{
+//		{
+//			name:       "one extension without errors",
+//			services:   []Extension{getDummyExtension("a"), getDummyExtension("b")},
+//			extensions: []string{"a"},
+//			fn:         func(svc Extension) error { return nil },
+//			want: []*RequestResult{
+//				{Extension: "a", State: RequestOK},
+//			},
+//		},
+//		{
+//			name:       "multiple extensions without errors",
+//			services:   []Extension{getDummyExtension("a"), getDummyExtension("b"), getDummyExtension("c")},
+//			extensions: []string{"a", "c"},
+//			fn:         func(svc Extension) error { return nil },
+//			want: []*RequestResult{
+//				{Extension: "a", State: RequestOK},
+//				{Extension: "c", State: RequestOK},
+//			},
+//		},
+//		{
+//			name:       "multiple extensions, one returns error",
+//			services:   []Extension{getDummyExtension("a"), getDummyExtension("b"), getDummyExtension("c", true)},
+//			extensions: []string{"a", "c"},
+//			fn:         func(svc Extension) error { return svc.Install(nil, nil) },
+//			want: []*RequestResult{
+//				{Extension: "a", State: RequestOK},
+//				{Extension: "c", State: RequestError, Error: "some err", Msg: "Ошибка\n"},
+//			},
+//		},
+//		{
+//			name:       "multiple extensions, all return error",
+//			services:   []Extension{getDummyExtension("a", true), getDummyExtension("b", true), getDummyExtension("c", true)},
+//			extensions: []string{"a", "b", "c"},
+//			fn:         func(svc Extension) error { return svc.Install(nil, nil) },
+//			want: []*RequestResult{
+//				{Extension: "a", State: RequestError, Error: "some err", Msg: "Ошибка\n"},
+//				{Extension: "b", State: RequestError, Error: "some err", Msg: "Ошибка\n"},
+//				{Extension: "c", State: RequestError, Error: "some err", Msg: "Ошибка\n"},
+//			},
+//		},
+//	}
+//
+//	for _, tt := range tests {
+//		t.Run(tt.name, func(t *testing.T) {
+//			srv := NewServer(tt.services...)
+//			if got := srv.getResults(tt.extensions, tt.fn); !reflect.DeepEqual(got, tt.want) {
+//				t.Errorf("getResults() = %v, want %v", got, tt.want)
+//			}
+//		})
+//	}
+//}
+//
+//// не подходит использование mock.Extension из-за возникающих циклических импортов
+//type testServerExtension struct {
+//	err  error
+//	name string
+//}
+//
+//func (t testServerExtension) GetDescriptor() *ExtensionDescriptor {
+//	return &ExtensionDescriptor{
+//		Extension:   t.name,
+//		Title:       strings.ToTitle(t.name),
+//		Description: "test extension",
+//		Version:     "0.0.0",
+//	}
+//}
+//
+//func (t testServerExtension) Install(ctx context.Context, in *InstallRequest) error     { return t.err }
+//func (t testServerExtension) Check(ctx context.Context, in *CheckRequest) error         { return t.err }
+//func (t testServerExtension) Uninstall(ctx context.Context, in *UninstallRequest) error { return t.err }
+//func (t testServerExtension) Action(ctx context.Context, in *ActionRequest) (*ActionResponse, error) {
+//	return &ActionResponse{}, t.err
+//}
 
 func TestServer_Action(t *testing.T) {
 	getDummyExtension := func(name string, wantErr ...bool) Extension {
diff --git a/pkg/extension/storage.go b/pkg/extension/storage.go
index 20e213b9..6edb21f5 100644
--- a/pkg/extension/storage.go
+++ b/pkg/extension/storage.go
@@ -57,9 +57,9 @@ func (s *storage) SetStatus(ctx context.Context, spaceID, envID string, extensio
 		CollectionID: StatusCollectionID,
 	}
 
-	item.Set("version", status.InstalledVersion)
-	item.Set("status_msg", status.Msg)
-	item.Set("status_error", status.Error)
+	_ = 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 {
diff --git a/pkg/operation/operation_test.go b/pkg/operation/operation_test.go
index 3c42657b..42aa701a 100644
--- a/pkg/operation/operation_test.go
+++ b/pkg/operation/operation_test.go
@@ -28,7 +28,7 @@ func TestOperation(t *testing.T) {
 	op.SetRetention(time.Nanosecond)
 	assert.True(t, op.IsExpired())
 
-	op.SetCancelFunc(func(ctx context.Context) {
+	op.SetCancelFunc(func() {
 		// do nothing
 	})
 }
diff --git a/proto/extensions/manager.pb.go b/proto/extensions/manager.pb.go
deleted file mode 100644
index 0b19b498..00000000
--- a/proto/extensions/manager.pb.go
+++ /dev/null
@@ -1,1190 +0,0 @@
-//*
-//
-//# Менеджер расширений
-//
-//Реализует функционал по координации расширений в системе и служит единой точкой доступа для работы с расширениями:
-//- Регистрирует все расширения в едином реестре
-//- Предоставляет доступ к реестру расширений на получение доступных расширений в системе
-//- Контролирует процесс установки расширения, устанавливает все необходимые зависимости в правильном порядке
-//- Контролирует создание системной коллекции `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.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_proto_enumTypes[0].Descriptor()
-}
-
-func (SpaceExtensions_State) Type() protoreflect.EnumType {
-	return &file_extensions_manager_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_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_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
-	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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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, 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, 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 (
-	file_extensions_manager_proto_rawDescOnce sync.Once
-	file_extensions_manager_proto_rawDescData = file_extensions_manager_proto_rawDesc
-)
-
-func file_extensions_manager_proto_rawDescGZIP() []byte {
-	file_extensions_manager_proto_rawDescOnce.Do(func() {
-		file_extensions_manager_proto_rawDescData = protoimpl.X.CompressGZIP(file_extensions_manager_proto_rawDescData)
-	})
-	return file_extensions_manager_proto_rawDescData
-}
-
-var file_extensions_manager_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
-var file_extensions_manager_proto_msgTypes = make([]protoimpl.MessageInfo, 13)
-var file_extensions_manager_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_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.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() }
-func file_extensions_manager_proto_init() {
-	if File_extensions_manager_proto != nil {
-		return
-	}
-	if !protoimpl.UnsafeEnabled {
-		file_extensions_manager_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_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_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_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_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_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_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_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_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
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				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{
-		File: protoimpl.DescBuilder{
-			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
-			RawDescriptor: file_extensions_manager_proto_rawDesc,
-			NumEnums:      1,
-			NumMessages:   13,
-			NumExtensions: 0,
-			NumServices:   1,
-		},
-		GoTypes:           file_extensions_manager_proto_goTypes,
-		DependencyIndexes: file_extensions_manager_proto_depIdxs,
-		EnumInfos:         file_extensions_manager_proto_enumTypes,
-		MessageInfos:      file_extensions_manager_proto_msgTypes,
-	}.Build()
-	File_extensions_manager_proto = out.File
-	file_extensions_manager_proto_rawDesc = nil
-	file_extensions_manager_proto_goTypes = nil
-	file_extensions_manager_proto_depIdxs = nil
-}
diff --git a/proto/extensions/manager_grpc.pb.go b/proto/extensions/manager_grpc.pb.go
deleted file mode 100644
index 635cc20e..00000000
--- a/proto/extensions/manager_grpc.pb.go
+++ /dev/null
@@ -1,275 +0,0 @@
-//*
-//
-//# Менеджер расширений
-//
-//Реализует функционал по координации расширений в системе и служит единой точкой доступа для работы с расширениями:
-//- Регистрирует все расширения в едином реестре
-//- Предоставляет доступ к реестру расширений на получение доступных расширений в системе
-//- Контролирует процесс установки расширения, устанавливает все необходимые зависимости в правильном порядке
-//- Контролирует создание системной коллекции `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.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 (
-	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.
-//
-// 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 ExtensionManagerClient 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 extensionManagerClient struct {
-	cc grpc.ClientConnInterface
-}
-
-func NewExtensionManagerClient(cc grpc.ClientConnInterface) ExtensionManagerClient {
-	return &extensionManagerClient{cc}
-}
-
-func (c *extensionManagerClient) RegisterExtensions(ctx context.Context, in *RegisterExtensionsRequest, opts ...grpc.CallOption) (*RegisterExtensionsResponse, error) {
-	out := new(RegisterExtensionsResponse)
-	err := c.cc.Invoke(ctx, ExtensionManager_RegisterExtensions_FullMethodName, in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-func (c *extensionManagerClient) UnregisterExtensions(ctx context.Context, in *UnregisterExtensionsRequest, opts ...grpc.CallOption) (*UnregisterExtensionsResponse, error) {
-	out := new(UnregisterExtensionsResponse)
-	err := c.cc.Invoke(ctx, ExtensionManager_UnregisterExtensions_FullMethodName, in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-func (c *extensionManagerClient) ListExtensions(ctx context.Context, in *ListExtensionsRequest, opts ...grpc.CallOption) (*ListExtensionsResponse, error) {
-	out := new(ListExtensionsResponse)
-	err := c.cc.Invoke(ctx, ExtensionManager_ListExtensions_FullMethodName, in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	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
-type ExtensionManagerServer 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)
-	mustEmbedUnimplementedExtensionManagerServer()
-}
-
-// UnimplementedExtensionManagerServer must be embedded to have forward compatible implementations.
-type UnimplementedExtensionManagerServer struct {
-}
-
-func (UnimplementedExtensionManagerServer) RegisterExtensions(context.Context, *RegisterExtensionsRequest) (*RegisterExtensionsResponse, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method RegisterExtensions not implemented")
-}
-func (UnimplementedExtensionManagerServer) UnregisterExtensions(context.Context, *UnregisterExtensionsRequest) (*UnregisterExtensionsResponse, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method UnregisterExtensions not implemented")
-}
-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.
-// Use of this interface is not recommended, as added methods to ExtensionManagerServer will
-// result in compilation errors.
-type UnsafeExtensionManagerServer interface {
-	mustEmbedUnimplementedExtensionManagerServer()
-}
-
-func RegisterExtensionManagerServer(s grpc.ServiceRegistrar, srv ExtensionManagerServer) {
-	s.RegisterService(&ExtensionManager_ServiceDesc, srv)
-}
-
-func _ExtensionManager_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.(ExtensionManagerServer).RegisterExtensions(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: ExtensionManager_RegisterExtensions_FullMethodName,
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(ExtensionManagerServer).RegisterExtensions(ctx, req.(*RegisterExtensionsRequest))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-func _ExtensionManager_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.(ExtensionManagerServer).UnregisterExtensions(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: ExtensionManager_UnregisterExtensions_FullMethodName,
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(ExtensionManagerServer).UnregisterExtensions(ctx, req.(*UnregisterExtensionsRequest))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-func _ExtensionManager_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.(ExtensionManagerServer).ListExtensions(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: ExtensionManager_ListExtensions_FullMethodName,
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(ExtensionManagerServer).ListExtensions(ctx, req.(*ListExtensionsRequest))
-	}
-	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)
-var ExtensionManager_ServiceDesc = grpc.ServiceDesc{
-	ServiceName: "extensions.ExtensionManager",
-	HandlerType: (*ExtensionManagerServer)(nil),
-	Methods: []grpc.MethodDesc{
-		{
-			MethodName: "RegisterExtensions",
-			Handler:    _ExtensionManager_RegisterExtensions_Handler,
-		},
-		{
-			MethodName: "UnregisterExtensions",
-			Handler:    _ExtensionManager_UnregisterExtensions_Handler,
-		},
-		{
-			MethodName: "ListExtensions",
-			Handler:    _ExtensionManager_ListExtensions_Handler,
-		},
-		{
-			MethodName: "GetExtensions",
-			Handler:    _ExtensionManager_GetExtensions_Handler,
-		},
-	},
-	Streams:  []grpc.StreamDesc{},
-	Metadata: "extensions/manager.proto",
-}
-- 
GitLab