diff --git a/backend/controller/console/console.go b/backend/controller/console/console.go index f31f766032..5ebdb2b8f0 100644 --- a/backend/controller/console/console.go +++ b/backend/controller/console/console.go @@ -12,6 +12,7 @@ import ( "google.golang.org/protobuf/types/known/durationpb" "google.golang.org/protobuf/types/known/timestamppb" + "github.com/TBD54566975/ftl/backend/controller/admin" "github.com/TBD54566975/ftl/backend/controller/dal" dalmodel "github.com/TBD54566975/ftl/backend/controller/dal/model" "github.com/TBD54566975/ftl/backend/controller/timeline" @@ -29,14 +30,16 @@ import ( type ConsoleService struct { dal *dal.DAL timeline *timeline.Service + admin *admin.AdminService } var _ pbconsoleconnect.ConsoleServiceHandler = (*ConsoleService)(nil) -func NewService(dal *dal.DAL, timeline *timeline.Service) *ConsoleService { +func NewService(dal *dal.DAL, timeline *timeline.Service, admin *admin.AdminService) *ConsoleService { return &ConsoleService{ dal: dal, timeline: timeline, + admin: admin, } } @@ -890,6 +893,35 @@ func eventDALToProto(event timeline.Event) *pbconsole.Event { } } +func (c *ConsoleService) GetConfig(ctx context.Context, req *connect.Request[pbconsole.GetConfigRequest]) (*connect.Response[pbconsole.GetConfigResponse], error) { + resp, err := c.admin.ConfigGet(ctx, connect.NewRequest(&ftlv1.GetConfigRequest{ + Ref: &ftlv1.ConfigRef{ + Module: req.Msg.Module, + Name: req.Msg.Name, + }, + })) + if err != nil { + return nil, fmt.Errorf("failed to get config: %w", err) + } + return connect.NewResponse(&pbconsole.GetConfigResponse{ + Value: resp.Msg.Value, + }), nil +} + +func (c *ConsoleService) SetConfig(ctx context.Context, req *connect.Request[pbconsole.SetConfigRequest]) (*connect.Response[pbconsole.SetConfigResponse], error) { + _, err := c.admin.ConfigSet(ctx, connect.NewRequest(&ftlv1.SetConfigRequest{ + Ref: &ftlv1.ConfigRef{ + Module: req.Msg.Module, + Name: req.Msg.Name, + }, + Value: req.Msg.Value, + })) + if err != nil { + return nil, fmt.Errorf("failed to set config: %w", err) + } + return connect.NewResponse(&pbconsole.SetConfigResponse{}), nil +} + func graph(sch *schema.Schema) map[string][]string { out := make(map[string][]string) for _, module := range sch.Modules { diff --git a/backend/controller/controller.go b/backend/controller/controller.go index f0fbeb69ad..528388bc47 100644 --- a/backend/controller/controller.go +++ b/backend/controller/controller.go @@ -168,7 +168,7 @@ func Start( logger.Debugf("Advertising as %s", config.Advertise) admin := admin.NewAdminService(cm, sm, svc.dal) - console := console.NewService(svc.dal, svc.timeline) + console := console.NewService(svc.dal, svc.timeline, admin) ingressHandler := otelhttp.NewHandler(http.Handler(svc), "ftl.ingress") if len(config.AllowOrigins) > 0 { diff --git a/backend/protos/xyz/block/ftl/v1/console/console.pb.go b/backend/protos/xyz/block/ftl/v1/console/console.pb.go index c24f0b6424..529e93ee6a 100644 --- a/backend/protos/xyz/block/ftl/v1/console/console.pb.go +++ b/backend/protos/xyz/block/ftl/v1/console/console.pb.go @@ -2442,6 +2442,210 @@ func (x *GetEventsResponse) GetCursor() int64 { return 0 } +type GetConfigRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Module *string `protobuf:"bytes,2,opt,name=module,proto3,oneof" json:"module,omitempty"` +} + +func (x *GetConfigRequest) Reset() { + *x = GetConfigRequest{} + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[30] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetConfigRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetConfigRequest) ProtoMessage() {} + +func (x *GetConfigRequest) ProtoReflect() protoreflect.Message { + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[30] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetConfigRequest.ProtoReflect.Descriptor instead. +func (*GetConfigRequest) Descriptor() ([]byte, []int) { + return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{30} +} + +func (x *GetConfigRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *GetConfigRequest) GetModule() string { + if x != nil && x.Module != nil { + return *x.Module + } + return "" +} + +type GetConfigResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Value []byte `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` +} + +func (x *GetConfigResponse) Reset() { + *x = GetConfigResponse{} + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[31] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetConfigResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetConfigResponse) ProtoMessage() {} + +func (x *GetConfigResponse) ProtoReflect() protoreflect.Message { + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[31] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetConfigResponse.ProtoReflect.Descriptor instead. +func (*GetConfigResponse) Descriptor() ([]byte, []int) { + return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{31} +} + +func (x *GetConfigResponse) GetValue() []byte { + if x != nil { + return x.Value + } + return nil +} + +type SetConfigRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Module *string `protobuf:"bytes,2,opt,name=module,proto3,oneof" json:"module,omitempty"` + Value []byte `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` +} + +func (x *SetConfigRequest) Reset() { + *x = SetConfigRequest{} + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[32] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SetConfigRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SetConfigRequest) ProtoMessage() {} + +func (x *SetConfigRequest) ProtoReflect() protoreflect.Message { + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[32] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SetConfigRequest.ProtoReflect.Descriptor instead. +func (*SetConfigRequest) Descriptor() ([]byte, []int) { + return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{32} +} + +func (x *SetConfigRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *SetConfigRequest) GetModule() string { + if x != nil && x.Module != nil { + return *x.Module + } + return "" +} + +func (x *SetConfigRequest) GetValue() []byte { + if x != nil { + return x.Value + } + return nil +} + +type SetConfigResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Value []byte `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` +} + +func (x *SetConfigResponse) Reset() { + *x = SetConfigResponse{} + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[33] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SetConfigResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SetConfigResponse) ProtoMessage() {} + +func (x *SetConfigResponse) ProtoReflect() protoreflect.Message { + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[33] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SetConfigResponse.ProtoReflect.Descriptor instead. +func (*SetConfigResponse) Descriptor() ([]byte, []int) { + return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{33} +} + +func (x *SetConfigResponse) GetValue() []byte { + if x != nil { + return x.Value + } + return nil +} + // Limit the number of events returned. type EventsQuery_LimitFilter struct { state protoimpl.MessageState @@ -2453,7 +2657,7 @@ type EventsQuery_LimitFilter struct { func (x *EventsQuery_LimitFilter) Reset() { *x = EventsQuery_LimitFilter{} - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[31] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2465,7 +2669,7 @@ func (x *EventsQuery_LimitFilter) String() string { func (*EventsQuery_LimitFilter) ProtoMessage() {} func (x *EventsQuery_LimitFilter) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[31] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[35] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2499,7 +2703,7 @@ type EventsQuery_LogLevelFilter struct { func (x *EventsQuery_LogLevelFilter) Reset() { *x = EventsQuery_LogLevelFilter{} - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[32] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2511,7 +2715,7 @@ func (x *EventsQuery_LogLevelFilter) String() string { func (*EventsQuery_LogLevelFilter) ProtoMessage() {} func (x *EventsQuery_LogLevelFilter) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[32] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[36] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2545,7 +2749,7 @@ type EventsQuery_DeploymentFilter struct { func (x *EventsQuery_DeploymentFilter) Reset() { *x = EventsQuery_DeploymentFilter{} - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[33] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2557,7 +2761,7 @@ func (x *EventsQuery_DeploymentFilter) String() string { func (*EventsQuery_DeploymentFilter) ProtoMessage() {} func (x *EventsQuery_DeploymentFilter) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[33] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[37] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2591,7 +2795,7 @@ type EventsQuery_RequestFilter struct { func (x *EventsQuery_RequestFilter) Reset() { *x = EventsQuery_RequestFilter{} - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[34] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2603,7 +2807,7 @@ func (x *EventsQuery_RequestFilter) String() string { func (*EventsQuery_RequestFilter) ProtoMessage() {} func (x *EventsQuery_RequestFilter) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[34] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[38] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2637,7 +2841,7 @@ type EventsQuery_EventTypeFilter struct { func (x *EventsQuery_EventTypeFilter) Reset() { *x = EventsQuery_EventTypeFilter{} - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[35] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2649,7 +2853,7 @@ func (x *EventsQuery_EventTypeFilter) String() string { func (*EventsQuery_EventTypeFilter) ProtoMessage() {} func (x *EventsQuery_EventTypeFilter) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[35] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[39] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2686,7 +2890,7 @@ type EventsQuery_TimeFilter struct { func (x *EventsQuery_TimeFilter) Reset() { *x = EventsQuery_TimeFilter{} - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[36] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2698,7 +2902,7 @@ func (x *EventsQuery_TimeFilter) String() string { func (*EventsQuery_TimeFilter) ProtoMessage() {} func (x *EventsQuery_TimeFilter) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[36] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[40] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2742,7 +2946,7 @@ type EventsQuery_IDFilter struct { func (x *EventsQuery_IDFilter) Reset() { *x = EventsQuery_IDFilter{} - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[37] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2754,7 +2958,7 @@ func (x *EventsQuery_IDFilter) String() string { func (*EventsQuery_IDFilter) ProtoMessage() {} func (x *EventsQuery_IDFilter) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[37] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[41] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2797,7 +3001,7 @@ type EventsQuery_CallFilter struct { func (x *EventsQuery_CallFilter) Reset() { *x = EventsQuery_CallFilter{} - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[38] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2809,7 +3013,7 @@ func (x *EventsQuery_CallFilter) String() string { func (*EventsQuery_CallFilter) ProtoMessage() {} func (x *EventsQuery_CallFilter) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[38] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[42] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2857,7 +3061,7 @@ type EventsQuery_ModuleFilter struct { func (x *EventsQuery_ModuleFilter) Reset() { *x = EventsQuery_ModuleFilter{} - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[39] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2869,7 +3073,7 @@ func (x *EventsQuery_ModuleFilter) String() string { func (*EventsQuery_ModuleFilter) ProtoMessage() {} func (x *EventsQuery_ModuleFilter) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[39] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[43] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2922,7 +3126,7 @@ type EventsQuery_Filter struct { func (x *EventsQuery_Filter) Reset() { *x = EventsQuery_Filter{} - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[40] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2934,7 +3138,7 @@ func (x *EventsQuery_Filter) String() string { func (*EventsQuery_Filter) ProtoMessage() {} func (x *EventsQuery_Filter) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[40] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[44] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3636,81 +3840,111 @@ var file_xyz_block_ftl_v1_console_console_proto_rawDesc = []byte{ 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x88, 0x01, - 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x2a, 0xa5, 0x02, 0x0a, - 0x09, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x12, 0x45, 0x56, - 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, - 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x4c, 0x4f, 0x47, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x4c, 0x10, 0x02, 0x12, 0x21, 0x0a, 0x1d, 0x45, - 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, - 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x44, 0x10, 0x03, 0x12, 0x21, - 0x0a, 0x1d, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x45, 0x50, - 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x44, 0x10, - 0x04, 0x12, 0x16, 0x0a, 0x12, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x49, 0x4e, 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, 0x05, 0x12, 0x1d, 0x0a, 0x19, 0x45, 0x56, 0x45, - 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x52, 0x4f, 0x4e, 0x5f, 0x53, 0x43, 0x48, - 0x45, 0x44, 0x55, 0x4c, 0x45, 0x44, 0x10, 0x06, 0x12, 0x1c, 0x0a, 0x18, 0x45, 0x56, 0x45, 0x4e, - 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x53, 0x59, 0x4e, 0x43, 0x5f, 0x45, 0x58, 0x45, - 0x43, 0x55, 0x54, 0x45, 0x10, 0x07, 0x12, 0x1d, 0x0a, 0x19, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x55, 0x42, 0x53, 0x55, 0x42, 0x5f, 0x50, 0x55, 0x42, 0x4c, - 0x49, 0x53, 0x48, 0x10, 0x08, 0x12, 0x1d, 0x0a, 0x19, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x50, 0x55, 0x42, 0x53, 0x55, 0x42, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x55, - 0x4d, 0x45, 0x10, 0x09, 0x2a, 0x85, 0x01, 0x0a, 0x15, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x45, 0x78, - 0x65, 0x63, 0x75, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x24, - 0x0a, 0x20, 0x41, 0x53, 0x59, 0x4e, 0x43, 0x5f, 0x45, 0x58, 0x45, 0x43, 0x55, 0x54, 0x45, 0x5f, - 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, - 0x57, 0x4e, 0x10, 0x00, 0x12, 0x21, 0x0a, 0x1d, 0x41, 0x53, 0x59, 0x4e, 0x43, 0x5f, 0x45, 0x58, - 0x45, 0x43, 0x55, 0x54, 0x45, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x43, 0x52, 0x4f, 0x4e, 0x10, 0x01, 0x12, 0x23, 0x0a, 0x1f, 0x41, 0x53, 0x59, 0x4e, 0x43, - 0x5f, 0x45, 0x58, 0x45, 0x43, 0x55, 0x54, 0x45, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x50, 0x55, 0x42, 0x53, 0x55, 0x42, 0x10, 0x02, 0x2a, 0x88, 0x01, 0x0a, - 0x08, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x15, 0x0a, 0x11, 0x4c, 0x4f, 0x47, - 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, - 0x12, 0x13, 0x0a, 0x0f, 0x4c, 0x4f, 0x47, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x54, 0x52, - 0x41, 0x43, 0x45, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x4c, 0x4f, 0x47, 0x5f, 0x4c, 0x45, 0x56, - 0x45, 0x4c, 0x5f, 0x44, 0x45, 0x42, 0x55, 0x47, 0x10, 0x05, 0x12, 0x12, 0x0a, 0x0e, 0x4c, 0x4f, - 0x47, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x10, 0x09, 0x12, 0x12, - 0x0a, 0x0e, 0x4c, 0x4f, 0x47, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x57, 0x41, 0x52, 0x4e, - 0x10, 0x0d, 0x12, 0x13, 0x0a, 0x0f, 0x4c, 0x4f, 0x47, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, - 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x11, 0x32, 0x8b, 0x04, 0x0a, 0x0e, 0x43, 0x6f, 0x6e, 0x73, - 0x6f, 0x6c, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x4a, 0x0a, 0x04, 0x50, 0x69, - 0x6e, 0x67, 0x12, 0x1d, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, - 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1e, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, - 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x67, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x64, - 0x75, 0x6c, 0x65, 0x73, 0x12, 0x2b, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0x4e, 0x0a, 0x10, + 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x06, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, + 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x29, 0x0a, 0x11, + 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x64, 0x0a, 0x10, 0x53, 0x65, 0x74, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x1b, 0x0a, 0x06, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x00, 0x52, 0x06, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x29, 0x0a, + 0x11, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2a, 0xa5, 0x02, 0x0a, 0x09, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x12, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x12, + 0x0a, 0x0e, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4c, 0x4f, 0x47, + 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x43, 0x41, 0x4c, 0x4c, 0x10, 0x02, 0x12, 0x21, 0x0a, 0x1d, 0x45, 0x56, 0x45, 0x4e, 0x54, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, + 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x44, 0x10, 0x03, 0x12, 0x21, 0x0a, 0x1d, 0x45, 0x56, + 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, + 0x45, 0x4e, 0x54, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x44, 0x10, 0x04, 0x12, 0x16, 0x0a, + 0x12, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x47, 0x52, + 0x45, 0x53, 0x53, 0x10, 0x05, 0x12, 0x1d, 0x0a, 0x19, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x43, 0x52, 0x4f, 0x4e, 0x5f, 0x53, 0x43, 0x48, 0x45, 0x44, 0x55, 0x4c, + 0x45, 0x44, 0x10, 0x06, 0x12, 0x1c, 0x0a, 0x18, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x41, 0x53, 0x59, 0x4e, 0x43, 0x5f, 0x45, 0x58, 0x45, 0x43, 0x55, 0x54, 0x45, + 0x10, 0x07, 0x12, 0x1d, 0x0a, 0x19, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x50, 0x55, 0x42, 0x53, 0x55, 0x42, 0x5f, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x53, 0x48, 0x10, + 0x08, 0x12, 0x1d, 0x0a, 0x19, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x50, 0x55, 0x42, 0x53, 0x55, 0x42, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x55, 0x4d, 0x45, 0x10, 0x09, + 0x2a, 0x85, 0x01, 0x0a, 0x15, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x24, 0x0a, 0x20, 0x41, 0x53, + 0x59, 0x4e, 0x43, 0x5f, 0x45, 0x58, 0x45, 0x43, 0x55, 0x54, 0x45, 0x5f, 0x45, 0x56, 0x45, 0x4e, + 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, + 0x12, 0x21, 0x0a, 0x1d, 0x41, 0x53, 0x59, 0x4e, 0x43, 0x5f, 0x45, 0x58, 0x45, 0x43, 0x55, 0x54, + 0x45, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x52, 0x4f, + 0x4e, 0x10, 0x01, 0x12, 0x23, 0x0a, 0x1f, 0x41, 0x53, 0x59, 0x4e, 0x43, 0x5f, 0x45, 0x58, 0x45, + 0x43, 0x55, 0x54, 0x45, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x50, 0x55, 0x42, 0x53, 0x55, 0x42, 0x10, 0x02, 0x2a, 0x88, 0x01, 0x0a, 0x08, 0x4c, 0x6f, 0x67, + 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x15, 0x0a, 0x11, 0x4c, 0x4f, 0x47, 0x5f, 0x4c, 0x45, 0x56, + 0x45, 0x4c, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, + 0x4c, 0x4f, 0x47, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x54, 0x52, 0x41, 0x43, 0x45, 0x10, + 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x4c, 0x4f, 0x47, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x44, + 0x45, 0x42, 0x55, 0x47, 0x10, 0x05, 0x12, 0x12, 0x0a, 0x0e, 0x4c, 0x4f, 0x47, 0x5f, 0x4c, 0x45, + 0x56, 0x45, 0x4c, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x10, 0x09, 0x12, 0x12, 0x0a, 0x0e, 0x4c, 0x4f, + 0x47, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x57, 0x41, 0x52, 0x4e, 0x10, 0x0d, 0x12, 0x13, + 0x0a, 0x0f, 0x4c, 0x4f, 0x47, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, + 0x52, 0x10, 0x11, 0x32, 0xd7, 0x05, 0x0a, 0x0e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x4a, 0x0a, 0x04, 0x50, 0x69, 0x6e, 0x67, 0x12, 0x1d, + 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, + 0x31, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, + 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, + 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, + 0x02, 0x01, 0x12, 0x67, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, + 0x12, 0x2b, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, + 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x4d, + 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, + 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, + 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x75, + 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x72, 0x0a, 0x0d, 0x53, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x2e, 0x2e, 0x78, + 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, + 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x6f, + 0x64, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x78, + 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, + 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x6f, + 0x64, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, + 0x6f, 0x0a, 0x0c, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, + 0x2d, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, + 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, + 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, + 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, + 0x12, 0x5f, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x25, 0x2e, + 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, + 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x1a, 0x2b, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, - 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x2c, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, - 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x47, 0x65, 0x74, - 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x72, 0x0a, 0x0d, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, - 0x12, 0x2e, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, - 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x53, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2f, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, - 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x53, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x30, 0x01, 0x12, 0x6f, 0x0a, 0x0c, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x73, 0x12, 0x2d, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, - 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x53, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, - 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x53, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x30, 0x01, 0x12, 0x5f, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x73, 0x12, 0x25, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, - 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x73, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x2b, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, - 0x6f, 0x6c, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x50, 0x50, 0x01, 0x5a, 0x4c, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x54, 0x42, 0x44, 0x35, 0x34, 0x35, 0x36, 0x36, 0x39, 0x37, - 0x35, 0x2f, 0x66, 0x74, 0x6c, 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2f, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x78, 0x79, 0x7a, 0x2f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2f, 0x66, - 0x74, 0x6c, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x3b, 0x70, 0x62, - 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x47, 0x65, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x64, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2a, + 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, + 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x78, 0x79, 0x7a, + 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, + 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x64, 0x0a, 0x09, 0x53, 0x65, 0x74, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2a, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, + 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2b, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, + 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x53, 0x65, 0x74, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x50, 0x50, + 0x01, 0x5a, 0x4c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x54, 0x42, + 0x44, 0x35, 0x34, 0x35, 0x36, 0x36, 0x39, 0x37, 0x35, 0x2f, 0x66, 0x74, 0x6c, 0x2f, 0x62, 0x61, + 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x78, 0x79, 0x7a, + 0x2f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2f, 0x66, 0x74, 0x6c, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, + 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x3b, 0x70, 0x62, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -3726,7 +3960,7 @@ func file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP() []byte { } var file_xyz_block_ftl_v1_console_console_proto_enumTypes = make([]protoimpl.EnumInfo, 4) -var file_xyz_block_ftl_v1_console_console_proto_msgTypes = make([]protoimpl.MessageInfo, 41) +var file_xyz_block_ftl_v1_console_console_proto_msgTypes = make([]protoimpl.MessageInfo, 45) var file_xyz_block_ftl_v1_console_console_proto_goTypes = []any{ (EventType)(0), // 0: xyz.block.ftl.v1.console.EventType (AsyncExecuteEventType)(0), // 1: xyz.block.ftl.v1.console.AsyncExecuteEventType @@ -3762,73 +3996,77 @@ var file_xyz_block_ftl_v1_console_console_proto_goTypes = []any{ (*StreamEventsResponse)(nil), // 31: xyz.block.ftl.v1.console.StreamEventsResponse (*Event)(nil), // 32: xyz.block.ftl.v1.console.Event (*GetEventsResponse)(nil), // 33: xyz.block.ftl.v1.console.GetEventsResponse - nil, // 34: xyz.block.ftl.v1.console.LogEvent.AttributesEntry - (*EventsQuery_LimitFilter)(nil), // 35: xyz.block.ftl.v1.console.EventsQuery.LimitFilter - (*EventsQuery_LogLevelFilter)(nil), // 36: xyz.block.ftl.v1.console.EventsQuery.LogLevelFilter - (*EventsQuery_DeploymentFilter)(nil), // 37: xyz.block.ftl.v1.console.EventsQuery.DeploymentFilter - (*EventsQuery_RequestFilter)(nil), // 38: xyz.block.ftl.v1.console.EventsQuery.RequestFilter - (*EventsQuery_EventTypeFilter)(nil), // 39: xyz.block.ftl.v1.console.EventsQuery.EventTypeFilter - (*EventsQuery_TimeFilter)(nil), // 40: xyz.block.ftl.v1.console.EventsQuery.TimeFilter - (*EventsQuery_IDFilter)(nil), // 41: xyz.block.ftl.v1.console.EventsQuery.IDFilter - (*EventsQuery_CallFilter)(nil), // 42: xyz.block.ftl.v1.console.EventsQuery.CallFilter - (*EventsQuery_ModuleFilter)(nil), // 43: xyz.block.ftl.v1.console.EventsQuery.ModuleFilter - (*EventsQuery_Filter)(nil), // 44: xyz.block.ftl.v1.console.EventsQuery.Filter - (*timestamppb.Timestamp)(nil), // 45: google.protobuf.Timestamp - (*schema.Ref)(nil), // 46: xyz.block.ftl.v1.schema.Ref - (*durationpb.Duration)(nil), // 47: google.protobuf.Duration - (*schema.Config)(nil), // 48: xyz.block.ftl.v1.schema.Config - (*schema.Data)(nil), // 49: xyz.block.ftl.v1.schema.Data - (*schema.Database)(nil), // 50: xyz.block.ftl.v1.schema.Database - (*schema.Enum)(nil), // 51: xyz.block.ftl.v1.schema.Enum - (*schema.Topic)(nil), // 52: xyz.block.ftl.v1.schema.Topic - (*schema.TypeAlias)(nil), // 53: xyz.block.ftl.v1.schema.TypeAlias - (*schema.Secret)(nil), // 54: xyz.block.ftl.v1.schema.Secret - (*schema.Subscription)(nil), // 55: xyz.block.ftl.v1.schema.Subscription - (*schema.Verb)(nil), // 56: xyz.block.ftl.v1.schema.Verb - (*v1.PingRequest)(nil), // 57: xyz.block.ftl.v1.PingRequest - (*v1.PingResponse)(nil), // 58: xyz.block.ftl.v1.PingResponse + (*GetConfigRequest)(nil), // 34: xyz.block.ftl.v1.console.GetConfigRequest + (*GetConfigResponse)(nil), // 35: xyz.block.ftl.v1.console.GetConfigResponse + (*SetConfigRequest)(nil), // 36: xyz.block.ftl.v1.console.SetConfigRequest + (*SetConfigResponse)(nil), // 37: xyz.block.ftl.v1.console.SetConfigResponse + nil, // 38: xyz.block.ftl.v1.console.LogEvent.AttributesEntry + (*EventsQuery_LimitFilter)(nil), // 39: xyz.block.ftl.v1.console.EventsQuery.LimitFilter + (*EventsQuery_LogLevelFilter)(nil), // 40: xyz.block.ftl.v1.console.EventsQuery.LogLevelFilter + (*EventsQuery_DeploymentFilter)(nil), // 41: xyz.block.ftl.v1.console.EventsQuery.DeploymentFilter + (*EventsQuery_RequestFilter)(nil), // 42: xyz.block.ftl.v1.console.EventsQuery.RequestFilter + (*EventsQuery_EventTypeFilter)(nil), // 43: xyz.block.ftl.v1.console.EventsQuery.EventTypeFilter + (*EventsQuery_TimeFilter)(nil), // 44: xyz.block.ftl.v1.console.EventsQuery.TimeFilter + (*EventsQuery_IDFilter)(nil), // 45: xyz.block.ftl.v1.console.EventsQuery.IDFilter + (*EventsQuery_CallFilter)(nil), // 46: xyz.block.ftl.v1.console.EventsQuery.CallFilter + (*EventsQuery_ModuleFilter)(nil), // 47: xyz.block.ftl.v1.console.EventsQuery.ModuleFilter + (*EventsQuery_Filter)(nil), // 48: xyz.block.ftl.v1.console.EventsQuery.Filter + (*timestamppb.Timestamp)(nil), // 49: google.protobuf.Timestamp + (*schema.Ref)(nil), // 50: xyz.block.ftl.v1.schema.Ref + (*durationpb.Duration)(nil), // 51: google.protobuf.Duration + (*schema.Config)(nil), // 52: xyz.block.ftl.v1.schema.Config + (*schema.Data)(nil), // 53: xyz.block.ftl.v1.schema.Data + (*schema.Database)(nil), // 54: xyz.block.ftl.v1.schema.Database + (*schema.Enum)(nil), // 55: xyz.block.ftl.v1.schema.Enum + (*schema.Topic)(nil), // 56: xyz.block.ftl.v1.schema.Topic + (*schema.TypeAlias)(nil), // 57: xyz.block.ftl.v1.schema.TypeAlias + (*schema.Secret)(nil), // 58: xyz.block.ftl.v1.schema.Secret + (*schema.Subscription)(nil), // 59: xyz.block.ftl.v1.schema.Subscription + (*schema.Verb)(nil), // 60: xyz.block.ftl.v1.schema.Verb + (*v1.PingRequest)(nil), // 61: xyz.block.ftl.v1.PingRequest + (*v1.PingResponse)(nil), // 62: xyz.block.ftl.v1.PingResponse } var file_xyz_block_ftl_v1_console_console_proto_depIdxs = []int32{ - 45, // 0: xyz.block.ftl.v1.console.LogEvent.time_stamp:type_name -> google.protobuf.Timestamp - 34, // 1: xyz.block.ftl.v1.console.LogEvent.attributes:type_name -> xyz.block.ftl.v1.console.LogEvent.AttributesEntry - 45, // 2: xyz.block.ftl.v1.console.CallEvent.time_stamp:type_name -> google.protobuf.Timestamp - 46, // 3: xyz.block.ftl.v1.console.CallEvent.source_verb_ref:type_name -> xyz.block.ftl.v1.schema.Ref - 46, // 4: xyz.block.ftl.v1.console.CallEvent.destination_verb_ref:type_name -> xyz.block.ftl.v1.schema.Ref - 47, // 5: xyz.block.ftl.v1.console.CallEvent.duration:type_name -> google.protobuf.Duration - 46, // 6: xyz.block.ftl.v1.console.IngressEvent.verb_ref:type_name -> xyz.block.ftl.v1.schema.Ref - 45, // 7: xyz.block.ftl.v1.console.IngressEvent.time_stamp:type_name -> google.protobuf.Timestamp - 47, // 8: xyz.block.ftl.v1.console.IngressEvent.duration:type_name -> google.protobuf.Duration - 46, // 9: xyz.block.ftl.v1.console.CronScheduledEvent.verb_ref:type_name -> xyz.block.ftl.v1.schema.Ref - 45, // 10: xyz.block.ftl.v1.console.CronScheduledEvent.time_stamp:type_name -> google.protobuf.Timestamp - 47, // 11: xyz.block.ftl.v1.console.CronScheduledEvent.duration:type_name -> google.protobuf.Duration - 45, // 12: xyz.block.ftl.v1.console.CronScheduledEvent.scheduled_at:type_name -> google.protobuf.Timestamp - 46, // 13: xyz.block.ftl.v1.console.AsyncExecuteEvent.verb_ref:type_name -> xyz.block.ftl.v1.schema.Ref - 45, // 14: xyz.block.ftl.v1.console.AsyncExecuteEvent.time_stamp:type_name -> google.protobuf.Timestamp - 47, // 15: xyz.block.ftl.v1.console.AsyncExecuteEvent.duration:type_name -> google.protobuf.Duration + 49, // 0: xyz.block.ftl.v1.console.LogEvent.time_stamp:type_name -> google.protobuf.Timestamp + 38, // 1: xyz.block.ftl.v1.console.LogEvent.attributes:type_name -> xyz.block.ftl.v1.console.LogEvent.AttributesEntry + 49, // 2: xyz.block.ftl.v1.console.CallEvent.time_stamp:type_name -> google.protobuf.Timestamp + 50, // 3: xyz.block.ftl.v1.console.CallEvent.source_verb_ref:type_name -> xyz.block.ftl.v1.schema.Ref + 50, // 4: xyz.block.ftl.v1.console.CallEvent.destination_verb_ref:type_name -> xyz.block.ftl.v1.schema.Ref + 51, // 5: xyz.block.ftl.v1.console.CallEvent.duration:type_name -> google.protobuf.Duration + 50, // 6: xyz.block.ftl.v1.console.IngressEvent.verb_ref:type_name -> xyz.block.ftl.v1.schema.Ref + 49, // 7: xyz.block.ftl.v1.console.IngressEvent.time_stamp:type_name -> google.protobuf.Timestamp + 51, // 8: xyz.block.ftl.v1.console.IngressEvent.duration:type_name -> google.protobuf.Duration + 50, // 9: xyz.block.ftl.v1.console.CronScheduledEvent.verb_ref:type_name -> xyz.block.ftl.v1.schema.Ref + 49, // 10: xyz.block.ftl.v1.console.CronScheduledEvent.time_stamp:type_name -> google.protobuf.Timestamp + 51, // 11: xyz.block.ftl.v1.console.CronScheduledEvent.duration:type_name -> google.protobuf.Duration + 49, // 12: xyz.block.ftl.v1.console.CronScheduledEvent.scheduled_at:type_name -> google.protobuf.Timestamp + 50, // 13: xyz.block.ftl.v1.console.AsyncExecuteEvent.verb_ref:type_name -> xyz.block.ftl.v1.schema.Ref + 49, // 14: xyz.block.ftl.v1.console.AsyncExecuteEvent.time_stamp:type_name -> google.protobuf.Timestamp + 51, // 15: xyz.block.ftl.v1.console.AsyncExecuteEvent.duration:type_name -> google.protobuf.Duration 1, // 16: xyz.block.ftl.v1.console.AsyncExecuteEvent.async_event_type:type_name -> xyz.block.ftl.v1.console.AsyncExecuteEventType - 46, // 17: xyz.block.ftl.v1.console.PubSubPublishEvent.verb_ref:type_name -> xyz.block.ftl.v1.schema.Ref - 45, // 18: xyz.block.ftl.v1.console.PubSubPublishEvent.time_stamp:type_name -> google.protobuf.Timestamp - 47, // 19: xyz.block.ftl.v1.console.PubSubPublishEvent.duration:type_name -> google.protobuf.Duration - 45, // 20: xyz.block.ftl.v1.console.PubSubConsumeEvent.time_stamp:type_name -> google.protobuf.Timestamp - 47, // 21: xyz.block.ftl.v1.console.PubSubConsumeEvent.duration:type_name -> google.protobuf.Duration - 48, // 22: xyz.block.ftl.v1.console.Config.config:type_name -> xyz.block.ftl.v1.schema.Config - 46, // 23: xyz.block.ftl.v1.console.Config.references:type_name -> xyz.block.ftl.v1.schema.Ref - 49, // 24: xyz.block.ftl.v1.console.Data.data:type_name -> xyz.block.ftl.v1.schema.Data - 46, // 25: xyz.block.ftl.v1.console.Data.references:type_name -> xyz.block.ftl.v1.schema.Ref - 50, // 26: xyz.block.ftl.v1.console.Database.database:type_name -> xyz.block.ftl.v1.schema.Database - 46, // 27: xyz.block.ftl.v1.console.Database.references:type_name -> xyz.block.ftl.v1.schema.Ref - 51, // 28: xyz.block.ftl.v1.console.Enum.enum:type_name -> xyz.block.ftl.v1.schema.Enum - 46, // 29: xyz.block.ftl.v1.console.Enum.references:type_name -> xyz.block.ftl.v1.schema.Ref - 52, // 30: xyz.block.ftl.v1.console.Topic.topic:type_name -> xyz.block.ftl.v1.schema.Topic - 46, // 31: xyz.block.ftl.v1.console.Topic.references:type_name -> xyz.block.ftl.v1.schema.Ref - 53, // 32: xyz.block.ftl.v1.console.TypeAlias.typealias:type_name -> xyz.block.ftl.v1.schema.TypeAlias - 46, // 33: xyz.block.ftl.v1.console.TypeAlias.references:type_name -> xyz.block.ftl.v1.schema.Ref - 54, // 34: xyz.block.ftl.v1.console.Secret.secret:type_name -> xyz.block.ftl.v1.schema.Secret - 46, // 35: xyz.block.ftl.v1.console.Secret.references:type_name -> xyz.block.ftl.v1.schema.Ref - 55, // 36: xyz.block.ftl.v1.console.Subscription.subscription:type_name -> xyz.block.ftl.v1.schema.Subscription - 46, // 37: xyz.block.ftl.v1.console.Subscription.references:type_name -> xyz.block.ftl.v1.schema.Ref - 56, // 38: xyz.block.ftl.v1.console.Verb.verb:type_name -> xyz.block.ftl.v1.schema.Verb - 46, // 39: xyz.block.ftl.v1.console.Verb.references:type_name -> xyz.block.ftl.v1.schema.Ref + 50, // 17: xyz.block.ftl.v1.console.PubSubPublishEvent.verb_ref:type_name -> xyz.block.ftl.v1.schema.Ref + 49, // 18: xyz.block.ftl.v1.console.PubSubPublishEvent.time_stamp:type_name -> google.protobuf.Timestamp + 51, // 19: xyz.block.ftl.v1.console.PubSubPublishEvent.duration:type_name -> google.protobuf.Duration + 49, // 20: xyz.block.ftl.v1.console.PubSubConsumeEvent.time_stamp:type_name -> google.protobuf.Timestamp + 51, // 21: xyz.block.ftl.v1.console.PubSubConsumeEvent.duration:type_name -> google.protobuf.Duration + 52, // 22: xyz.block.ftl.v1.console.Config.config:type_name -> xyz.block.ftl.v1.schema.Config + 50, // 23: xyz.block.ftl.v1.console.Config.references:type_name -> xyz.block.ftl.v1.schema.Ref + 53, // 24: xyz.block.ftl.v1.console.Data.data:type_name -> xyz.block.ftl.v1.schema.Data + 50, // 25: xyz.block.ftl.v1.console.Data.references:type_name -> xyz.block.ftl.v1.schema.Ref + 54, // 26: xyz.block.ftl.v1.console.Database.database:type_name -> xyz.block.ftl.v1.schema.Database + 50, // 27: xyz.block.ftl.v1.console.Database.references:type_name -> xyz.block.ftl.v1.schema.Ref + 55, // 28: xyz.block.ftl.v1.console.Enum.enum:type_name -> xyz.block.ftl.v1.schema.Enum + 50, // 29: xyz.block.ftl.v1.console.Enum.references:type_name -> xyz.block.ftl.v1.schema.Ref + 56, // 30: xyz.block.ftl.v1.console.Topic.topic:type_name -> xyz.block.ftl.v1.schema.Topic + 50, // 31: xyz.block.ftl.v1.console.Topic.references:type_name -> xyz.block.ftl.v1.schema.Ref + 57, // 32: xyz.block.ftl.v1.console.TypeAlias.typealias:type_name -> xyz.block.ftl.v1.schema.TypeAlias + 50, // 33: xyz.block.ftl.v1.console.TypeAlias.references:type_name -> xyz.block.ftl.v1.schema.Ref + 58, // 34: xyz.block.ftl.v1.console.Secret.secret:type_name -> xyz.block.ftl.v1.schema.Secret + 50, // 35: xyz.block.ftl.v1.console.Secret.references:type_name -> xyz.block.ftl.v1.schema.Ref + 59, // 36: xyz.block.ftl.v1.console.Subscription.subscription:type_name -> xyz.block.ftl.v1.schema.Subscription + 50, // 37: xyz.block.ftl.v1.console.Subscription.references:type_name -> xyz.block.ftl.v1.schema.Ref + 60, // 38: xyz.block.ftl.v1.console.Verb.verb:type_name -> xyz.block.ftl.v1.schema.Verb + 50, // 39: xyz.block.ftl.v1.console.Verb.references:type_name -> xyz.block.ftl.v1.schema.Ref 21, // 40: xyz.block.ftl.v1.console.Module.verbs:type_name -> xyz.block.ftl.v1.console.Verb 14, // 41: xyz.block.ftl.v1.console.Module.data:type_name -> xyz.block.ftl.v1.console.Data 19, // 42: xyz.block.ftl.v1.console.Module.secrets:type_name -> xyz.block.ftl.v1.console.Secret @@ -3842,12 +4080,12 @@ var file_xyz_block_ftl_v1_console_console_proto_depIdxs = []int32{ 22, // 50: xyz.block.ftl.v1.console.GetModulesResponse.modules:type_name -> xyz.block.ftl.v1.console.Module 24, // 51: xyz.block.ftl.v1.console.GetModulesResponse.topology:type_name -> xyz.block.ftl.v1.console.Topology 22, // 52: xyz.block.ftl.v1.console.StreamModulesResponse.modules:type_name -> xyz.block.ftl.v1.console.Module - 44, // 53: xyz.block.ftl.v1.console.EventsQuery.filters:type_name -> xyz.block.ftl.v1.console.EventsQuery.Filter + 48, // 53: xyz.block.ftl.v1.console.EventsQuery.filters:type_name -> xyz.block.ftl.v1.console.EventsQuery.Filter 3, // 54: xyz.block.ftl.v1.console.EventsQuery.order:type_name -> xyz.block.ftl.v1.console.EventsQuery.Order - 47, // 55: xyz.block.ftl.v1.console.StreamEventsRequest.update_interval:type_name -> google.protobuf.Duration + 51, // 55: xyz.block.ftl.v1.console.StreamEventsRequest.update_interval:type_name -> google.protobuf.Duration 29, // 56: xyz.block.ftl.v1.console.StreamEventsRequest.query:type_name -> xyz.block.ftl.v1.console.EventsQuery 32, // 57: xyz.block.ftl.v1.console.StreamEventsResponse.events:type_name -> xyz.block.ftl.v1.console.Event - 45, // 58: xyz.block.ftl.v1.console.Event.time_stamp:type_name -> google.protobuf.Timestamp + 49, // 58: xyz.block.ftl.v1.console.Event.time_stamp:type_name -> google.protobuf.Timestamp 4, // 59: xyz.block.ftl.v1.console.Event.log:type_name -> xyz.block.ftl.v1.console.LogEvent 5, // 60: xyz.block.ftl.v1.console.Event.call:type_name -> xyz.block.ftl.v1.console.CallEvent 6, // 61: xyz.block.ftl.v1.console.Event.deployment_created:type_name -> xyz.block.ftl.v1.console.DeploymentCreatedEvent @@ -3860,29 +4098,33 @@ var file_xyz_block_ftl_v1_console_console_proto_depIdxs = []int32{ 32, // 68: xyz.block.ftl.v1.console.GetEventsResponse.events:type_name -> xyz.block.ftl.v1.console.Event 2, // 69: xyz.block.ftl.v1.console.EventsQuery.LogLevelFilter.log_level:type_name -> xyz.block.ftl.v1.console.LogLevel 0, // 70: xyz.block.ftl.v1.console.EventsQuery.EventTypeFilter.event_types:type_name -> xyz.block.ftl.v1.console.EventType - 45, // 71: xyz.block.ftl.v1.console.EventsQuery.TimeFilter.older_than:type_name -> google.protobuf.Timestamp - 45, // 72: xyz.block.ftl.v1.console.EventsQuery.TimeFilter.newer_than:type_name -> google.protobuf.Timestamp - 35, // 73: xyz.block.ftl.v1.console.EventsQuery.Filter.limit:type_name -> xyz.block.ftl.v1.console.EventsQuery.LimitFilter - 36, // 74: xyz.block.ftl.v1.console.EventsQuery.Filter.log_level:type_name -> xyz.block.ftl.v1.console.EventsQuery.LogLevelFilter - 37, // 75: xyz.block.ftl.v1.console.EventsQuery.Filter.deployments:type_name -> xyz.block.ftl.v1.console.EventsQuery.DeploymentFilter - 38, // 76: xyz.block.ftl.v1.console.EventsQuery.Filter.requests:type_name -> xyz.block.ftl.v1.console.EventsQuery.RequestFilter - 39, // 77: xyz.block.ftl.v1.console.EventsQuery.Filter.event_types:type_name -> xyz.block.ftl.v1.console.EventsQuery.EventTypeFilter - 40, // 78: xyz.block.ftl.v1.console.EventsQuery.Filter.time:type_name -> xyz.block.ftl.v1.console.EventsQuery.TimeFilter - 41, // 79: xyz.block.ftl.v1.console.EventsQuery.Filter.id:type_name -> xyz.block.ftl.v1.console.EventsQuery.IDFilter - 42, // 80: xyz.block.ftl.v1.console.EventsQuery.Filter.call:type_name -> xyz.block.ftl.v1.console.EventsQuery.CallFilter - 43, // 81: xyz.block.ftl.v1.console.EventsQuery.Filter.module:type_name -> xyz.block.ftl.v1.console.EventsQuery.ModuleFilter - 57, // 82: xyz.block.ftl.v1.console.ConsoleService.Ping:input_type -> xyz.block.ftl.v1.PingRequest + 49, // 71: xyz.block.ftl.v1.console.EventsQuery.TimeFilter.older_than:type_name -> google.protobuf.Timestamp + 49, // 72: xyz.block.ftl.v1.console.EventsQuery.TimeFilter.newer_than:type_name -> google.protobuf.Timestamp + 39, // 73: xyz.block.ftl.v1.console.EventsQuery.Filter.limit:type_name -> xyz.block.ftl.v1.console.EventsQuery.LimitFilter + 40, // 74: xyz.block.ftl.v1.console.EventsQuery.Filter.log_level:type_name -> xyz.block.ftl.v1.console.EventsQuery.LogLevelFilter + 41, // 75: xyz.block.ftl.v1.console.EventsQuery.Filter.deployments:type_name -> xyz.block.ftl.v1.console.EventsQuery.DeploymentFilter + 42, // 76: xyz.block.ftl.v1.console.EventsQuery.Filter.requests:type_name -> xyz.block.ftl.v1.console.EventsQuery.RequestFilter + 43, // 77: xyz.block.ftl.v1.console.EventsQuery.Filter.event_types:type_name -> xyz.block.ftl.v1.console.EventsQuery.EventTypeFilter + 44, // 78: xyz.block.ftl.v1.console.EventsQuery.Filter.time:type_name -> xyz.block.ftl.v1.console.EventsQuery.TimeFilter + 45, // 79: xyz.block.ftl.v1.console.EventsQuery.Filter.id:type_name -> xyz.block.ftl.v1.console.EventsQuery.IDFilter + 46, // 80: xyz.block.ftl.v1.console.EventsQuery.Filter.call:type_name -> xyz.block.ftl.v1.console.EventsQuery.CallFilter + 47, // 81: xyz.block.ftl.v1.console.EventsQuery.Filter.module:type_name -> xyz.block.ftl.v1.console.EventsQuery.ModuleFilter + 61, // 82: xyz.block.ftl.v1.console.ConsoleService.Ping:input_type -> xyz.block.ftl.v1.PingRequest 25, // 83: xyz.block.ftl.v1.console.ConsoleService.GetModules:input_type -> xyz.block.ftl.v1.console.GetModulesRequest 27, // 84: xyz.block.ftl.v1.console.ConsoleService.StreamModules:input_type -> xyz.block.ftl.v1.console.StreamModulesRequest 30, // 85: xyz.block.ftl.v1.console.ConsoleService.StreamEvents:input_type -> xyz.block.ftl.v1.console.StreamEventsRequest 29, // 86: xyz.block.ftl.v1.console.ConsoleService.GetEvents:input_type -> xyz.block.ftl.v1.console.EventsQuery - 58, // 87: xyz.block.ftl.v1.console.ConsoleService.Ping:output_type -> xyz.block.ftl.v1.PingResponse - 26, // 88: xyz.block.ftl.v1.console.ConsoleService.GetModules:output_type -> xyz.block.ftl.v1.console.GetModulesResponse - 28, // 89: xyz.block.ftl.v1.console.ConsoleService.StreamModules:output_type -> xyz.block.ftl.v1.console.StreamModulesResponse - 31, // 90: xyz.block.ftl.v1.console.ConsoleService.StreamEvents:output_type -> xyz.block.ftl.v1.console.StreamEventsResponse - 33, // 91: xyz.block.ftl.v1.console.ConsoleService.GetEvents:output_type -> xyz.block.ftl.v1.console.GetEventsResponse - 87, // [87:92] is the sub-list for method output_type - 82, // [82:87] is the sub-list for method input_type + 34, // 87: xyz.block.ftl.v1.console.ConsoleService.GetConfig:input_type -> xyz.block.ftl.v1.console.GetConfigRequest + 36, // 88: xyz.block.ftl.v1.console.ConsoleService.SetConfig:input_type -> xyz.block.ftl.v1.console.SetConfigRequest + 62, // 89: xyz.block.ftl.v1.console.ConsoleService.Ping:output_type -> xyz.block.ftl.v1.PingResponse + 26, // 90: xyz.block.ftl.v1.console.ConsoleService.GetModules:output_type -> xyz.block.ftl.v1.console.GetModulesResponse + 28, // 91: xyz.block.ftl.v1.console.ConsoleService.StreamModules:output_type -> xyz.block.ftl.v1.console.StreamModulesResponse + 31, // 92: xyz.block.ftl.v1.console.ConsoleService.StreamEvents:output_type -> xyz.block.ftl.v1.console.StreamEventsResponse + 33, // 93: xyz.block.ftl.v1.console.ConsoleService.GetEvents:output_type -> xyz.block.ftl.v1.console.GetEventsResponse + 35, // 94: xyz.block.ftl.v1.console.ConsoleService.GetConfig:output_type -> xyz.block.ftl.v1.console.GetConfigResponse + 37, // 95: xyz.block.ftl.v1.console.ConsoleService.SetConfig:output_type -> xyz.block.ftl.v1.console.SetConfigResponse + 89, // [89:96] is the sub-list for method output_type + 82, // [82:89] is the sub-list for method input_type 82, // [82:82] is the sub-list for extension type_name 82, // [82:82] is the sub-list for extension extendee 0, // [0:82] is the sub-list for field type_name @@ -3914,11 +4156,13 @@ func file_xyz_block_ftl_v1_console_console_proto_init() { (*Event_PubsubConsume)(nil), } file_xyz_block_ftl_v1_console_console_proto_msgTypes[29].OneofWrappers = []any{} - file_xyz_block_ftl_v1_console_console_proto_msgTypes[36].OneofWrappers = []any{} - file_xyz_block_ftl_v1_console_console_proto_msgTypes[37].OneofWrappers = []any{} - file_xyz_block_ftl_v1_console_console_proto_msgTypes[38].OneofWrappers = []any{} - file_xyz_block_ftl_v1_console_console_proto_msgTypes[39].OneofWrappers = []any{} - file_xyz_block_ftl_v1_console_console_proto_msgTypes[40].OneofWrappers = []any{ + file_xyz_block_ftl_v1_console_console_proto_msgTypes[30].OneofWrappers = []any{} + file_xyz_block_ftl_v1_console_console_proto_msgTypes[32].OneofWrappers = []any{} + file_xyz_block_ftl_v1_console_console_proto_msgTypes[40].OneofWrappers = []any{} + file_xyz_block_ftl_v1_console_console_proto_msgTypes[41].OneofWrappers = []any{} + file_xyz_block_ftl_v1_console_console_proto_msgTypes[42].OneofWrappers = []any{} + file_xyz_block_ftl_v1_console_console_proto_msgTypes[43].OneofWrappers = []any{} + file_xyz_block_ftl_v1_console_console_proto_msgTypes[44].OneofWrappers = []any{ (*EventsQuery_Filter_Limit)(nil), (*EventsQuery_Filter_LogLevel)(nil), (*EventsQuery_Filter_Deployments)(nil), @@ -3935,7 +4179,7 @@ func file_xyz_block_ftl_v1_console_console_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_xyz_block_ftl_v1_console_console_proto_rawDesc, NumEnums: 4, - NumMessages: 41, + NumMessages: 45, NumExtensions: 0, NumServices: 1, }, diff --git a/backend/protos/xyz/block/ftl/v1/console/console.proto b/backend/protos/xyz/block/ftl/v1/console/console.proto index 4886dbaff5..17eee8774c 100644 --- a/backend/protos/xyz/block/ftl/v1/console/console.proto +++ b/backend/protos/xyz/block/ftl/v1/console/console.proto @@ -324,6 +324,25 @@ message GetEventsResponse { optional int64 cursor = 2; } +message GetConfigRequest { + string name = 1; + optional string module = 2; +} + +message GetConfigResponse { + bytes value = 1; +} + +message SetConfigRequest { + string name = 1; + optional string module = 2; + bytes value = 3; +} + +message SetConfigResponse { + bytes value = 1; +} + service ConsoleService { // Ping service for readiness. rpc Ping(PingRequest) returns (PingResponse) { @@ -334,4 +353,7 @@ service ConsoleService { rpc StreamModules(StreamModulesRequest) returns (stream StreamModulesResponse); rpc StreamEvents(StreamEventsRequest) returns (stream StreamEventsResponse); rpc GetEvents(EventsQuery) returns (GetEventsResponse); + + rpc GetConfig(GetConfigRequest) returns (GetConfigResponse); + rpc SetConfig(SetConfigRequest) returns (SetConfigResponse); } diff --git a/backend/protos/xyz/block/ftl/v1/console/pbconsoleconnect/console.connect.go b/backend/protos/xyz/block/ftl/v1/console/pbconsoleconnect/console.connect.go index e33d036cb8..405e2216ae 100644 --- a/backend/protos/xyz/block/ftl/v1/console/pbconsoleconnect/console.connect.go +++ b/backend/protos/xyz/block/ftl/v1/console/pbconsoleconnect/console.connect.go @@ -48,6 +48,12 @@ const ( // ConsoleServiceGetEventsProcedure is the fully-qualified name of the ConsoleService's GetEvents // RPC. ConsoleServiceGetEventsProcedure = "/xyz.block.ftl.v1.console.ConsoleService/GetEvents" + // ConsoleServiceGetConfigProcedure is the fully-qualified name of the ConsoleService's GetConfig + // RPC. + ConsoleServiceGetConfigProcedure = "/xyz.block.ftl.v1.console.ConsoleService/GetConfig" + // ConsoleServiceSetConfigProcedure is the fully-qualified name of the ConsoleService's SetConfig + // RPC. + ConsoleServiceSetConfigProcedure = "/xyz.block.ftl.v1.console.ConsoleService/SetConfig" ) // ConsoleServiceClient is a client for the xyz.block.ftl.v1.console.ConsoleService service. @@ -58,6 +64,8 @@ type ConsoleServiceClient interface { StreamModules(context.Context, *connect.Request[console.StreamModulesRequest]) (*connect.ServerStreamForClient[console.StreamModulesResponse], error) StreamEvents(context.Context, *connect.Request[console.StreamEventsRequest]) (*connect.ServerStreamForClient[console.StreamEventsResponse], error) GetEvents(context.Context, *connect.Request[console.EventsQuery]) (*connect.Response[console.GetEventsResponse], error) + GetConfig(context.Context, *connect.Request[console.GetConfigRequest]) (*connect.Response[console.GetConfigResponse], error) + SetConfig(context.Context, *connect.Request[console.SetConfigRequest]) (*connect.Response[console.SetConfigResponse], error) } // NewConsoleServiceClient constructs a client for the xyz.block.ftl.v1.console.ConsoleService @@ -96,6 +104,16 @@ func NewConsoleServiceClient(httpClient connect.HTTPClient, baseURL string, opts baseURL+ConsoleServiceGetEventsProcedure, opts..., ), + getConfig: connect.NewClient[console.GetConfigRequest, console.GetConfigResponse]( + httpClient, + baseURL+ConsoleServiceGetConfigProcedure, + opts..., + ), + setConfig: connect.NewClient[console.SetConfigRequest, console.SetConfigResponse]( + httpClient, + baseURL+ConsoleServiceSetConfigProcedure, + opts..., + ), } } @@ -106,6 +124,8 @@ type consoleServiceClient struct { streamModules *connect.Client[console.StreamModulesRequest, console.StreamModulesResponse] streamEvents *connect.Client[console.StreamEventsRequest, console.StreamEventsResponse] getEvents *connect.Client[console.EventsQuery, console.GetEventsResponse] + getConfig *connect.Client[console.GetConfigRequest, console.GetConfigResponse] + setConfig *connect.Client[console.SetConfigRequest, console.SetConfigResponse] } // Ping calls xyz.block.ftl.v1.console.ConsoleService.Ping. @@ -133,6 +153,16 @@ func (c *consoleServiceClient) GetEvents(ctx context.Context, req *connect.Reque return c.getEvents.CallUnary(ctx, req) } +// GetConfig calls xyz.block.ftl.v1.console.ConsoleService.GetConfig. +func (c *consoleServiceClient) GetConfig(ctx context.Context, req *connect.Request[console.GetConfigRequest]) (*connect.Response[console.GetConfigResponse], error) { + return c.getConfig.CallUnary(ctx, req) +} + +// SetConfig calls xyz.block.ftl.v1.console.ConsoleService.SetConfig. +func (c *consoleServiceClient) SetConfig(ctx context.Context, req *connect.Request[console.SetConfigRequest]) (*connect.Response[console.SetConfigResponse], error) { + return c.setConfig.CallUnary(ctx, req) +} + // ConsoleServiceHandler is an implementation of the xyz.block.ftl.v1.console.ConsoleService // service. type ConsoleServiceHandler interface { @@ -142,6 +172,8 @@ type ConsoleServiceHandler interface { StreamModules(context.Context, *connect.Request[console.StreamModulesRequest], *connect.ServerStream[console.StreamModulesResponse]) error StreamEvents(context.Context, *connect.Request[console.StreamEventsRequest], *connect.ServerStream[console.StreamEventsResponse]) error GetEvents(context.Context, *connect.Request[console.EventsQuery]) (*connect.Response[console.GetEventsResponse], error) + GetConfig(context.Context, *connect.Request[console.GetConfigRequest]) (*connect.Response[console.GetConfigResponse], error) + SetConfig(context.Context, *connect.Request[console.SetConfigRequest]) (*connect.Response[console.SetConfigResponse], error) } // NewConsoleServiceHandler builds an HTTP handler from the service implementation. It returns the @@ -176,6 +208,16 @@ func NewConsoleServiceHandler(svc ConsoleServiceHandler, opts ...connect.Handler svc.GetEvents, opts..., ) + consoleServiceGetConfigHandler := connect.NewUnaryHandler( + ConsoleServiceGetConfigProcedure, + svc.GetConfig, + opts..., + ) + consoleServiceSetConfigHandler := connect.NewUnaryHandler( + ConsoleServiceSetConfigProcedure, + svc.SetConfig, + opts..., + ) return "/xyz.block.ftl.v1.console.ConsoleService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { switch r.URL.Path { case ConsoleServicePingProcedure: @@ -188,6 +230,10 @@ func NewConsoleServiceHandler(svc ConsoleServiceHandler, opts ...connect.Handler consoleServiceStreamEventsHandler.ServeHTTP(w, r) case ConsoleServiceGetEventsProcedure: consoleServiceGetEventsHandler.ServeHTTP(w, r) + case ConsoleServiceGetConfigProcedure: + consoleServiceGetConfigHandler.ServeHTTP(w, r) + case ConsoleServiceSetConfigProcedure: + consoleServiceSetConfigHandler.ServeHTTP(w, r) default: http.NotFound(w, r) } @@ -216,3 +262,11 @@ func (UnimplementedConsoleServiceHandler) StreamEvents(context.Context, *connect func (UnimplementedConsoleServiceHandler) GetEvents(context.Context, *connect.Request[console.EventsQuery]) (*connect.Response[console.GetEventsResponse], error) { return nil, connect.NewError(connect.CodeUnimplemented, errors.New("xyz.block.ftl.v1.console.ConsoleService.GetEvents is not implemented")) } + +func (UnimplementedConsoleServiceHandler) GetConfig(context.Context, *connect.Request[console.GetConfigRequest]) (*connect.Response[console.GetConfigResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("xyz.block.ftl.v1.console.ConsoleService.GetConfig is not implemented")) +} + +func (UnimplementedConsoleServiceHandler) SetConfig(context.Context, *connect.Request[console.SetConfigRequest]) (*connect.Response[console.SetConfigResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("xyz.block.ftl.v1.console.ConsoleService.SetConfig is not implemented")) +} diff --git a/frontend/console/src/components/Button.tsx b/frontend/console/src/components/Button.tsx index aa51cd1fda..8c301cee52 100644 --- a/frontend/console/src/components/Button.tsx +++ b/frontend/console/src/components/Button.tsx @@ -9,6 +9,7 @@ interface ButtonProps extends ButtonHTMLAttributes { variant?: 'primary' | 'secondary' fullWidth?: boolean title?: string + disabled?: boolean } const sizeClasses: Record = { @@ -19,13 +20,13 @@ const sizeClasses: Record = { xl: 'rounded-md px-3.5 py-2.5 text-sm', } -export const Button = ({ children, size = 'md', variant = 'primary', fullWidth = false, className, title, ...props }: ButtonProps) => { +export const Button = ({ children, size = 'md', variant = 'primary', fullWidth = false, className, title, disabled = false, ...props }: ButtonProps) => { const baseClasses = 'font-semibold shadow-sm focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2' const variantClasses = { primary: - 'bg-indigo-600 dark:bg-indigo-500 text-white hover:bg-indigo-500 dark:hover:bg-indigo-400 focus-visible:outline-indigo-600 dark:focus-visible:outline-indigo-500', + 'bg-indigo-600 dark:bg-indigo-500 text-white hover:bg-indigo-500 dark:hover:bg-indigo-400 focus-visible:outline-indigo-600 dark:focus-visible:outline-indigo-500 disabled:bg-indigo-200/50 dark:disabled:bg-indigo-500/20 disabled:cursor-not-allowed disabled:hover:bg-indigo-200', secondary: - 'bg-white text-gray-900 ring-1 ring-inset ring-gray-300 hover:bg-gray-50 focus-visible:outline-gray-600 dark:bg-white/10 dark:text-white dark:hover:bg-white/20 dark:ring-0', + 'bg-white text-gray-900 ring-1 ring-inset ring-gray-300 hover:bg-gray-50 focus-visible:outline-gray-600 dark:bg-white/10 dark:text-white dark:hover:bg-white/20 dark:ring-0 disabled:bg-gray-100 disabled:text-gray-400 dark:disabled:bg-white/5 dark:disabled:text-gray-500 disabled:cursor-not-allowed disabled:hover:bg-gray-100', } return ( @@ -33,6 +34,7 @@ export const Button = ({ children, size = 'md', variant = 'primary', fullWidth = type='button' className={classNames(baseClasses, sizeClasses[size], variantClasses[variant], fullWidth ? 'w-full' : '', className)} title={title} + disabled={disabled} {...props} > {children} diff --git a/frontend/console/src/components/ResizablePanels.tsx b/frontend/console/src/components/ResizablePanels.tsx index 003a66a8a9..86c3d5c0b9 100644 --- a/frontend/console/src/components/ResizablePanels.tsx +++ b/frontend/console/src/components/ResizablePanels.tsx @@ -12,8 +12,9 @@ interface ResizablePanelsProps { topBarHeight?: number rightPanelHeader: React.ReactNode rightPanelPanels: ExpandablePanelProps[] - bottomPanelContent: React.ReactNode + bottomPanelContent?: React.ReactNode mainContent: React.ReactNode + storageKeyPrefix?: string } export const ResizablePanels: React.FC = ({ @@ -25,9 +26,10 @@ export const ResizablePanels: React.FC = ({ rightPanelPanels, bottomPanelContent, mainContent, + storageKeyPrefix = 'default', }) => { - const [rightPanelWidth, setRightPanelWidth] = useLocalStorage('rightPanelWidth', initialRightPanelWidth) - const [bottomPanelHeight, setBottomPanelHeight] = useLocalStorage('bottomPanelHeight', initialBottomPanelHeight) + const [rightPanelWidth, setRightPanelWidth] = useLocalStorage(`${storageKeyPrefix}_rightPanelWidth`, initialRightPanelWidth) + const [bottomPanelHeight, setBottomPanelHeight] = useLocalStorage(`${storageKeyPrefix}_bottomPanelHeight`, initialBottomPanelHeight) const [isDraggingHorizontal, setIsDraggingHorizontal] = useState(false) const [isDraggingVertical, setIsDraggingVertical] = useState(false) @@ -72,7 +74,12 @@ export const ResizablePanels: React.FC = ({ onMouseLeave={stopDragging} >
-
+
{mainContent}
= ({ style={{ width: '3px', cursor: 'col-resize' }} />
-
-
- {bottomPanelContent} -
+ {bottomPanelContent && ( + <> +
+
+ {bottomPanelContent} +
+ + )}
) } diff --git a/frontend/console/src/features/modules/decls/ConfigPanel.tsx b/frontend/console/src/features/modules/decls/ConfigPanel.tsx index 9a97c11be8..30679ffdc8 100644 --- a/frontend/console/src/features/modules/decls/ConfigPanel.tsx +++ b/frontend/console/src/features/modules/decls/ConfigPanel.tsx @@ -1,25 +1,89 @@ +import { useContext, useEffect, useState } from 'react' +import { Button } from '../../../components/Button' +import { CodeEditor } from '../../../components/CodeEditor' +import { ResizablePanels } from '../../../components/ResizablePanels' +import { useClient } from '../../../hooks/use-client' +import { ConsoleService } from '../../../protos/xyz/block/ftl/v1/console/console_connect' import type { Config } from '../../../protos/xyz/block/ftl/v1/console/console_pb' -import { Schema } from '../schema/Schema' +import { NotificationType, NotificationsContext } from '../../../providers/notifications-provider' +import { DeclDefaultPanels } from './DeclDefaultPanels' import { PanelHeader } from './PanelHeader' -import { References } from './References' export const ConfigPanel = ({ value, schema, moduleName, declName }: { value: Config; schema: string; moduleName: string; declName: string }) => { + const client = useClient(ConsoleService) + const [configValue, setConfigValue] = useState('') + const [isLoading, setIsLoading] = useState(false) + const notification = useContext(NotificationsContext) + + useEffect(() => { + handleGetConfig() + }, [moduleName, declName]) + + const handleGetConfig = () => { + setIsLoading(true) + client.getConfig({ module: moduleName, name: declName }).then((resp) => { + setConfigValue(new TextDecoder().decode(resp.value)) + setIsLoading(false) + }) + } + + const handleSetConfig = () => { + setIsLoading(true) + client + .setConfig({ + module: moduleName, + name: declName, + value: new TextEncoder().encode(configValue), + }) + .then(() => { + setIsLoading(false) + notification?.showNotification({ + title: 'Config updated', + message: 'Config updated successfully', + type: NotificationType.Success, + }) + }) + .catch((error) => { + setIsLoading(false) + notification?.showNotification({ + title: 'Failed to update config', + message: error.message, + type: NotificationType.Error, + }) + }) + } + if (!value || !schema) { - return + return null } const decl = value.config if (!decl) { - return + return null } + return ( -
- - Config: {moduleName}.{declName} - -
- -
- +
+ +
+ + +
+ + +
+
+
+ } + rightPanelHeader={undefined} + rightPanelPanels={DeclDefaultPanels(schema, value.references)} + storageKeyPrefix='configPanel' + />
) } diff --git a/frontend/console/src/features/modules/decls/DataPanel.tsx b/frontend/console/src/features/modules/decls/DataPanel.tsx index 2bdbf33349..72a54cccb9 100644 --- a/frontend/console/src/features/modules/decls/DataPanel.tsx +++ b/frontend/console/src/features/modules/decls/DataPanel.tsx @@ -1,3 +1,4 @@ +import { ResizablePanels } from '../../../components/ResizablePanels' import type { Data } from '../../../protos/xyz/block/ftl/v1/console/console_pb' import { Schema } from '../schema/Schema' import { PanelHeader } from './PanelHeader' @@ -11,17 +12,30 @@ export const DataPanel = ({ value, schema, moduleName, declName }: { value: Data if (!decl) { return } - const maybeTypeParams = decl.typeParameters.length === 0 ? '' : `<${decl.typeParameters.map((p) => p.name).join(', ')}>` + return ( -
- - data: {moduleName}.{declName} - {maybeTypeParams} - -
- -
- +
+ +
+ +
+ +
+
+
+ } + rightPanelHeader={undefined} + rightPanelPanels={[ + { + title: 'References', + expanded: true, + children: , + }, + ]} + storageKeyPrefix='dataPanel' + />
) } diff --git a/frontend/console/src/features/modules/decls/DatabasePanel.tsx b/frontend/console/src/features/modules/decls/DatabasePanel.tsx index 7122a472a5..947d433ad4 100644 --- a/frontend/console/src/features/modules/decls/DatabasePanel.tsx +++ b/frontend/console/src/features/modules/decls/DatabasePanel.tsx @@ -6,9 +6,7 @@ import { References } from './References' export const DatabasePanel = ({ value, schema, moduleName, declName }: { value: Database; schema: string; moduleName: string; declName: string }) => { return (
- - Database: {moduleName}.{declName} - +
diff --git a/frontend/console/src/features/modules/decls/DeclDefaultPanels.tsx b/frontend/console/src/features/modules/decls/DeclDefaultPanels.tsx new file mode 100644 index 0000000000..8034804050 --- /dev/null +++ b/frontend/console/src/features/modules/decls/DeclDefaultPanels.tsx @@ -0,0 +1,22 @@ +import type { Ref } from '../../../protos/xyz/block/ftl/v1/schema/schema_pb' +import type { ExpandablePanelProps } from '../../console/ExpandablePanel' +import { Schema } from '../schema/Schema' +import { References } from './References' + +export const DeclDefaultPanels = (schema: string, references: Ref[]) => { + const panels = [] as ExpandablePanelProps[] + + panels.push({ + title: 'Schema', + expanded: true, + children: , + }) + + panels.push({ + title: 'References', + expanded: true, + children: , + }) + + return panels +} diff --git a/frontend/console/src/features/modules/decls/EnumPanel.tsx b/frontend/console/src/features/modules/decls/EnumPanel.tsx index 819aeafb8f..77b2f8fa7c 100644 --- a/frontend/console/src/features/modules/decls/EnumPanel.tsx +++ b/frontend/console/src/features/modules/decls/EnumPanel.tsx @@ -14,9 +14,7 @@ export const EnumPanel = ({ value, schema, moduleName, declName }: { value: Enum } return (
- - {enumType(decl)} Enum: {moduleName}.{declName} - +
diff --git a/frontend/console/src/features/modules/decls/PanelHeader.tsx b/frontend/console/src/features/modules/decls/PanelHeader.tsx index 2e0e884334..69f2a31213 100644 --- a/frontend/console/src/features/modules/decls/PanelHeader.tsx +++ b/frontend/console/src/features/modules/decls/PanelHeader.tsx @@ -1,16 +1,18 @@ -import type { ReactNode } from 'react' import { Badge } from '../../../components/Badge' -export const PanelHeader = ({ children, exported, comments }: { children?: ReactNode; exported: boolean; comments?: string[] }) => { +export const PanelHeader = ({ title, declRef, exported, comments }: { title?: string; declRef?: string; exported: boolean; comments?: string[] }) => { return ( -
- {exported && ( -
- -
- )} - {children} - {comments && comments.length > 0 &&

{comments.join(' ')}

} +
+
+ {title} + {exported && ( +
+ +
+ )} +
+ {declRef && {declRef}} + {comments && comments.length > 0 &&

{comments.join(' ')}

}
) } diff --git a/frontend/console/src/features/modules/decls/References.tsx b/frontend/console/src/features/modules/decls/References.tsx index e4f90e919a..811caae450 100644 --- a/frontend/console/src/features/modules/decls/References.tsx +++ b/frontend/console/src/features/modules/decls/References.tsx @@ -3,12 +3,11 @@ import { DeclLink } from './DeclLink' export const References = ({ references }: { references: Ref[] }) => { return ( -
- Referenced By: +
{references.length === 0 ? ' None' : references.map((r, i) => ( -
+
))} diff --git a/frontend/console/src/features/modules/decls/SecretPanel.tsx b/frontend/console/src/features/modules/decls/SecretPanel.tsx index 1b9d05189c..a829831f04 100644 --- a/frontend/console/src/features/modules/decls/SecretPanel.tsx +++ b/frontend/console/src/features/modules/decls/SecretPanel.tsx @@ -9,9 +9,7 @@ export const SecretPanel = ({ value, schema, moduleName, declName }: { value: Se } return (
- - Secret: {moduleName}.{declName} - +
diff --git a/frontend/console/src/features/modules/decls/SubscriptionPanel.tsx b/frontend/console/src/features/modules/decls/SubscriptionPanel.tsx index 1694388822..63b9c38e80 100644 --- a/frontend/console/src/features/modules/decls/SubscriptionPanel.tsx +++ b/frontend/console/src/features/modules/decls/SubscriptionPanel.tsx @@ -9,9 +9,7 @@ export const SubscriptionPanel = ({ value, schema, moduleName, declName }: { val } return (
- - Subscription: {moduleName}.{declName} - +
diff --git a/frontend/console/src/features/modules/decls/TopicPanel.tsx b/frontend/console/src/features/modules/decls/TopicPanel.tsx index f04d251f27..54665231d3 100644 --- a/frontend/console/src/features/modules/decls/TopicPanel.tsx +++ b/frontend/console/src/features/modules/decls/TopicPanel.tsx @@ -9,9 +9,7 @@ export const TopicPanel = ({ value, schema, moduleName, declName }: { value: Top } return (
- - Topic: {moduleName}.{declName} - +
diff --git a/frontend/console/src/features/modules/decls/TypeAliasPanel.tsx b/frontend/console/src/features/modules/decls/TypeAliasPanel.tsx index 3c0ab5fecf..b20d364cc6 100644 --- a/frontend/console/src/features/modules/decls/TypeAliasPanel.tsx +++ b/frontend/console/src/features/modules/decls/TypeAliasPanel.tsx @@ -9,9 +9,7 @@ export const TypeAliasPanel = ({ value, schema, moduleName, declName }: { value: } return (
- - Type Alias: {moduleName}.{declName} - +
diff --git a/frontend/console/src/protos/xyz/block/ftl/v1/console/console_connect.ts b/frontend/console/src/protos/xyz/block/ftl/v1/console/console_connect.ts index a9fa699157..02f609845c 100644 --- a/frontend/console/src/protos/xyz/block/ftl/v1/console/console_connect.ts +++ b/frontend/console/src/protos/xyz/block/ftl/v1/console/console_connect.ts @@ -5,7 +5,7 @@ import { PingRequest, PingResponse } from "../ftl_pb.js"; import { MethodIdempotency, MethodKind } from "@bufbuild/protobuf"; -import { EventsQuery, GetEventsResponse, GetModulesRequest, GetModulesResponse, StreamEventsRequest, StreamEventsResponse, StreamModulesRequest, StreamModulesResponse } from "./console_pb.js"; +import { EventsQuery, GetConfigRequest, GetConfigResponse, GetEventsResponse, GetModulesRequest, GetModulesResponse, SetConfigRequest, SetConfigResponse, StreamEventsRequest, StreamEventsResponse, StreamModulesRequest, StreamModulesResponse } from "./console_pb.js"; /** * @generated from service xyz.block.ftl.v1.console.ConsoleService @@ -61,6 +61,24 @@ export const ConsoleService = { O: GetEventsResponse, kind: MethodKind.Unary, }, + /** + * @generated from rpc xyz.block.ftl.v1.console.ConsoleService.GetConfig + */ + getConfig: { + name: "GetConfig", + I: GetConfigRequest, + O: GetConfigResponse, + kind: MethodKind.Unary, + }, + /** + * @generated from rpc xyz.block.ftl.v1.console.ConsoleService.SetConfig + */ + setConfig: { + name: "SetConfig", + I: SetConfigRequest, + O: SetConfigResponse, + kind: MethodKind.Unary, + }, } } as const; diff --git a/frontend/console/src/protos/xyz/block/ftl/v1/console/console_pb.ts b/frontend/console/src/protos/xyz/block/ftl/v1/console/console_pb.ts index 49e28ffe31..4f58e7cc20 100644 --- a/frontend/console/src/protos/xyz/block/ftl/v1/console/console_pb.ts +++ b/frontend/console/src/protos/xyz/block/ftl/v1/console/console_pb.ts @@ -2361,3 +2361,169 @@ export class GetEventsResponse extends Message { } } +/** + * @generated from message xyz.block.ftl.v1.console.GetConfigRequest + */ +export class GetConfigRequest extends Message { + /** + * @generated from field: string name = 1; + */ + name = ""; + + /** + * @generated from field: optional string module = 2; + */ + module?: string; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "xyz.block.ftl.v1.console.GetConfigRequest"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "module", kind: "scalar", T: 9 /* ScalarType.STRING */, opt: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): GetConfigRequest { + return new GetConfigRequest().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): GetConfigRequest { + return new GetConfigRequest().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): GetConfigRequest { + return new GetConfigRequest().fromJsonString(jsonString, options); + } + + static equals(a: GetConfigRequest | PlainMessage | undefined, b: GetConfigRequest | PlainMessage | undefined): boolean { + return proto3.util.equals(GetConfigRequest, a, b); + } +} + +/** + * @generated from message xyz.block.ftl.v1.console.GetConfigResponse + */ +export class GetConfigResponse extends Message { + /** + * @generated from field: bytes value = 1; + */ + value = new Uint8Array(0); + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "xyz.block.ftl.v1.console.GetConfigResponse"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "value", kind: "scalar", T: 12 /* ScalarType.BYTES */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): GetConfigResponse { + return new GetConfigResponse().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): GetConfigResponse { + return new GetConfigResponse().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): GetConfigResponse { + return new GetConfigResponse().fromJsonString(jsonString, options); + } + + static equals(a: GetConfigResponse | PlainMessage | undefined, b: GetConfigResponse | PlainMessage | undefined): boolean { + return proto3.util.equals(GetConfigResponse, a, b); + } +} + +/** + * @generated from message xyz.block.ftl.v1.console.SetConfigRequest + */ +export class SetConfigRequest extends Message { + /** + * @generated from field: string name = 1; + */ + name = ""; + + /** + * @generated from field: optional string module = 2; + */ + module?: string; + + /** + * @generated from field: bytes value = 3; + */ + value = new Uint8Array(0); + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "xyz.block.ftl.v1.console.SetConfigRequest"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "module", kind: "scalar", T: 9 /* ScalarType.STRING */, opt: true }, + { no: 3, name: "value", kind: "scalar", T: 12 /* ScalarType.BYTES */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): SetConfigRequest { + return new SetConfigRequest().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): SetConfigRequest { + return new SetConfigRequest().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): SetConfigRequest { + return new SetConfigRequest().fromJsonString(jsonString, options); + } + + static equals(a: SetConfigRequest | PlainMessage | undefined, b: SetConfigRequest | PlainMessage | undefined): boolean { + return proto3.util.equals(SetConfigRequest, a, b); + } +} + +/** + * @generated from message xyz.block.ftl.v1.console.SetConfigResponse + */ +export class SetConfigResponse extends Message { + /** + * @generated from field: bytes value = 1; + */ + value = new Uint8Array(0); + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "xyz.block.ftl.v1.console.SetConfigResponse"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "value", kind: "scalar", T: 12 /* ScalarType.BYTES */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): SetConfigResponse { + return new SetConfigResponse().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): SetConfigResponse { + return new SetConfigResponse().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): SetConfigResponse { + return new SetConfigResponse().fromJsonString(jsonString, options); + } + + static equals(a: SetConfigResponse | PlainMessage | undefined, b: SetConfigResponse | PlainMessage | undefined): boolean { + return proto3.util.equals(SetConfigResponse, a, b); + } +} + diff --git a/python-runtime/ftl/src/ftl/protos/xyz/block/ftl/v1/console/console_pb2.py b/python-runtime/ftl/src/ftl/protos/xyz/block/ftl/v1/console/console_pb2.py index 6cea2da33e..3fdf887989 100644 --- a/python-runtime/ftl/src/ftl/protos/xyz/block/ftl/v1/console/console_pb2.py +++ b/python-runtime/ftl/src/ftl/protos/xyz/block/ftl/v1/console/console_pb2.py @@ -28,7 +28,7 @@ from xyz.block.ftl.v1.schema import schema_pb2 as xyz_dot_block_dot_ftl_dot_v1_dot_schema_dot_schema__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n&xyz/block/ftl/v1/console/console.proto\x12\x18xyz.block.ftl.v1.console\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1axyz/block/ftl/v1/ftl.proto\x1a$xyz/block/ftl/v1/schema/schema.proto\"\xb6\x03\n\x08LogEvent\x12%\n\x0e\x64\x65ployment_key\x18\x01 \x01(\tR\rdeploymentKey\x12$\n\x0brequest_key\x18\x02 \x01(\tH\x00R\nrequestKey\x88\x01\x01\x12\x39\n\ntime_stamp\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\ttimeStamp\x12\x1b\n\tlog_level\x18\x04 \x01(\x05R\x08logLevel\x12R\n\nattributes\x18\x05 \x03(\x0b\x32\x32.xyz.block.ftl.v1.console.LogEvent.AttributesEntryR\nattributes\x12\x18\n\x07message\x18\x06 \x01(\tR\x07message\x12\x19\n\x05\x65rror\x18\x07 \x01(\tH\x01R\x05\x65rror\x88\x01\x01\x12\x19\n\x05stack\x18\x08 \x01(\tH\x02R\x05stack\x88\x01\x01\x1a=\n\x0f\x41ttributesEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n\x05value\x18\x02 \x01(\tR\x05value:\x02\x38\x01\x42\x0e\n\x0c_request_keyB\x08\n\x06_errorB\x08\n\x06_stack\"\x95\x04\n\tCallEvent\x12$\n\x0brequest_key\x18\x01 \x01(\tH\x00R\nrequestKey\x88\x01\x01\x12%\n\x0e\x64\x65ployment_key\x18\x02 \x01(\tR\rdeploymentKey\x12\x39\n\ntime_stamp\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\ttimeStamp\x12I\n\x0fsource_verb_ref\x18\x0b \x01(\x0b\x32\x1c.xyz.block.ftl.v1.schema.RefH\x01R\rsourceVerbRef\x88\x01\x01\x12N\n\x14\x64\x65stination_verb_ref\x18\x0c \x01(\x0b\x32\x1c.xyz.block.ftl.v1.schema.RefR\x12\x64\x65stinationVerbRef\x12\x35\n\x08\x64uration\x18\x06 \x01(\x0b\x32\x19.google.protobuf.DurationR\x08\x64uration\x12\x18\n\x07request\x18\x07 \x01(\tR\x07request\x12\x1a\n\x08response\x18\x08 \x01(\tR\x08response\x12\x19\n\x05\x65rror\x18\t \x01(\tH\x02R\x05\x65rror\x88\x01\x01\x12\x19\n\x05stack\x18\n \x01(\tH\x03R\x05stack\x88\x01\x01\x42\x0e\n\x0c_request_keyB\x12\n\x10_source_verb_refB\x08\n\x06_errorB\x08\n\x06_stackJ\x04\x08\x04\x10\x05J\x04\x08\x05\x10\x06\"\xb8\x01\n\x16\x44\x65ploymentCreatedEvent\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x1a\n\x08language\x18\x02 \x01(\tR\x08language\x12\x1f\n\x0bmodule_name\x18\x03 \x01(\tR\nmoduleName\x12!\n\x0cmin_replicas\x18\x04 \x01(\x05R\x0bminReplicas\x12\x1f\n\x08replaced\x18\x05 \x01(\tH\x00R\x08replaced\x88\x01\x01\x42\x0b\n\t_replaced\"y\n\x16\x44\x65ploymentUpdatedEvent\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12!\n\x0cmin_replicas\x18\x02 \x01(\x05R\x0bminReplicas\x12*\n\x11prev_min_replicas\x18\x03 \x01(\x05R\x0fprevMinReplicas\"\x8e\x04\n\x0cIngressEvent\x12%\n\x0e\x64\x65ployment_key\x18\x01 \x01(\tR\rdeploymentKey\x12$\n\x0brequest_key\x18\x02 \x01(\tH\x00R\nrequestKey\x88\x01\x01\x12\x37\n\x08verb_ref\x18\x03 \x01(\x0b\x32\x1c.xyz.block.ftl.v1.schema.RefR\x07verbRef\x12\x16\n\x06method\x18\x04 \x01(\tR\x06method\x12\x12\n\x04path\x18\x05 \x01(\tR\x04path\x12\x1f\n\x0bstatus_code\x18\x07 \x01(\x05R\nstatusCode\x12\x39\n\ntime_stamp\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\ttimeStamp\x12\x35\n\x08\x64uration\x18\t \x01(\x0b\x32\x19.google.protobuf.DurationR\x08\x64uration\x12\x18\n\x07request\x18\n \x01(\tR\x07request\x12%\n\x0erequest_header\x18\x0b \x01(\tR\rrequestHeader\x12\x1a\n\x08response\x18\x0c \x01(\tR\x08response\x12\'\n\x0fresponse_header\x18\r \x01(\tR\x0eresponseHeader\x12\x19\n\x05\x65rror\x18\x0e \x01(\tH\x01R\x05\x65rror\x88\x01\x01\x42\x0e\n\x0c_request_keyB\x08\n\x06_error\"\xe6\x02\n\x12\x43ronScheduledEvent\x12%\n\x0e\x64\x65ployment_key\x18\x01 \x01(\tR\rdeploymentKey\x12\x37\n\x08verb_ref\x18\x02 \x01(\x0b\x32\x1c.xyz.block.ftl.v1.schema.RefR\x07verbRef\x12\x39\n\ntime_stamp\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\ttimeStamp\x12\x35\n\x08\x64uration\x18\x04 \x01(\x0b\x32\x19.google.protobuf.DurationR\x08\x64uration\x12=\n\x0cscheduled_at\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\x0bscheduledAt\x12\x1a\n\x08schedule\x18\x06 \x01(\tR\x08schedule\x12\x19\n\x05\x65rror\x18\x07 \x01(\tH\x00R\x05\x65rror\x88\x01\x01\x42\x08\n\x06_error\"\x9b\x03\n\x11\x41syncExecuteEvent\x12%\n\x0e\x64\x65ployment_key\x18\x01 \x01(\tR\rdeploymentKey\x12$\n\x0brequest_key\x18\x02 \x01(\tH\x00R\nrequestKey\x88\x01\x01\x12\x37\n\x08verb_ref\x18\x03 \x01(\x0b\x32\x1c.xyz.block.ftl.v1.schema.RefR\x07verbRef\x12\x39\n\ntime_stamp\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\ttimeStamp\x12\x35\n\x08\x64uration\x18\x05 \x01(\x0b\x32\x19.google.protobuf.DurationR\x08\x64uration\x12Y\n\x10\x61sync_event_type\x18\x06 \x01(\x0e\x32/.xyz.block.ftl.v1.console.AsyncExecuteEventTypeR\x0e\x61syncEventType\x12\x19\n\x05\x65rror\x18\x07 \x01(\tH\x01R\x05\x65rror\x88\x01\x01\x42\x0e\n\x0c_request_keyB\x08\n\x06_error\"\xf1\x02\n\x12PubSubPublishEvent\x12%\n\x0e\x64\x65ployment_key\x18\x01 \x01(\tR\rdeploymentKey\x12$\n\x0brequest_key\x18\x02 \x01(\tH\x00R\nrequestKey\x88\x01\x01\x12\x37\n\x08verb_ref\x18\x03 \x01(\x0b\x32\x1c.xyz.block.ftl.v1.schema.RefR\x07verbRef\x12\x39\n\ntime_stamp\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\ttimeStamp\x12\x35\n\x08\x64uration\x18\x05 \x01(\x0b\x32\x19.google.protobuf.DurationR\x08\x64uration\x12\x14\n\x05topic\x18\x06 \x01(\tR\x05topic\x12\x18\n\x07request\x18\x07 \x01(\tR\x07request\x12\x19\n\x05\x65rror\x18\x08 \x01(\tH\x01R\x05\x65rror\x88\x01\x01\x42\x0e\n\x0c_request_keyB\x08\n\x06_error\"\xa0\x03\n\x12PubSubConsumeEvent\x12%\n\x0e\x64\x65ployment_key\x18\x01 \x01(\tR\rdeploymentKey\x12$\n\x0brequest_key\x18\x02 \x01(\tH\x00R\nrequestKey\x88\x01\x01\x12-\n\x10\x64\x65st_verb_module\x18\x03 \x01(\tH\x01R\x0e\x64\x65stVerbModule\x88\x01\x01\x12)\n\x0e\x64\x65st_verb_name\x18\x04 \x01(\tH\x02R\x0c\x64\x65stVerbName\x88\x01\x01\x12\x39\n\ntime_stamp\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\ttimeStamp\x12\x35\n\x08\x64uration\x18\x06 \x01(\x0b\x32\x19.google.protobuf.DurationR\x08\x64uration\x12\x14\n\x05topic\x18\x07 \x01(\tR\x05topic\x12\x19\n\x05\x65rror\x18\x08 \x01(\tH\x03R\x05\x65rror\x88\x01\x01\x42\x0e\n\x0c_request_keyB\x13\n\x11_dest_verb_moduleB\x11\n\x0f_dest_verb_nameB\x08\n\x06_error\"\x7f\n\x06\x43onfig\x12\x37\n\x06\x63onfig\x18\x01 \x01(\x0b\x32\x1f.xyz.block.ftl.v1.schema.ConfigR\x06\x63onfig\x12<\n\nreferences\x18\x02 \x03(\x0b\x32\x1c.xyz.block.ftl.v1.schema.RefR\nreferences\"\x8f\x01\n\x04\x44\x61ta\x12\x31\n\x04\x64\x61ta\x18\x01 \x01(\x0b\x32\x1d.xyz.block.ftl.v1.schema.DataR\x04\x64\x61ta\x12\x16\n\x06schema\x18\x02 \x01(\tR\x06schema\x12<\n\nreferences\x18\x03 \x03(\x0b\x32\x1c.xyz.block.ftl.v1.schema.RefR\nreferences\"\x87\x01\n\x08\x44\x61tabase\x12=\n\x08\x64\x61tabase\x18\x01 \x01(\x0b\x32!.xyz.block.ftl.v1.schema.DatabaseR\x08\x64\x61tabase\x12<\n\nreferences\x18\x02 \x03(\x0b\x32\x1c.xyz.block.ftl.v1.schema.RefR\nreferences\"w\n\x04\x45num\x12\x31\n\x04\x65num\x18\x01 \x01(\x0b\x32\x1d.xyz.block.ftl.v1.schema.EnumR\x04\x65num\x12<\n\nreferences\x18\x02 \x03(\x0b\x32\x1c.xyz.block.ftl.v1.schema.RefR\nreferences\"{\n\x05Topic\x12\x34\n\x05topic\x18\x01 \x01(\x0b\x32\x1e.xyz.block.ftl.v1.schema.TopicR\x05topic\x12<\n\nreferences\x18\x02 \x03(\x0b\x32\x1c.xyz.block.ftl.v1.schema.RefR\nreferences\"\x8b\x01\n\tTypeAlias\x12@\n\ttypealias\x18\x01 \x01(\x0b\x32\".xyz.block.ftl.v1.schema.TypeAliasR\ttypealias\x12<\n\nreferences\x18\x02 \x03(\x0b\x32\x1c.xyz.block.ftl.v1.schema.RefR\nreferences\"\x7f\n\x06Secret\x12\x37\n\x06secret\x18\x01 \x01(\x0b\x32\x1f.xyz.block.ftl.v1.schema.SecretR\x06secret\x12<\n\nreferences\x18\x02 \x03(\x0b\x32\x1c.xyz.block.ftl.v1.schema.RefR\nreferences\"\x97\x01\n\x0cSubscription\x12I\n\x0csubscription\x18\x01 \x01(\x0b\x32%.xyz.block.ftl.v1.schema.SubscriptionR\x0csubscription\x12<\n\nreferences\x18\x02 \x03(\x0b\x32\x1c.xyz.block.ftl.v1.schema.RefR\nreferences\"\xbf\x01\n\x04Verb\x12\x31\n\x04verb\x18\x01 \x01(\x0b\x32\x1d.xyz.block.ftl.v1.schema.VerbR\x04verb\x12\x16\n\x06schema\x18\x02 \x01(\tR\x06schema\x12.\n\x13json_request_schema\x18\x03 \x01(\tR\x11jsonRequestSchema\x12<\n\nreferences\x18\x04 \x03(\x0b\x32\x1c.xyz.block.ftl.v1.schema.RefR\nreferences\"\x9f\x05\n\x06Module\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12%\n\x0e\x64\x65ployment_key\x18\x02 \x01(\tR\rdeploymentKey\x12\x1a\n\x08language\x18\x03 \x01(\tR\x08language\x12\x16\n\x06schema\x18\x04 \x01(\tR\x06schema\x12\x34\n\x05verbs\x18\x05 \x03(\x0b\x32\x1e.xyz.block.ftl.v1.console.VerbR\x05verbs\x12\x32\n\x04\x64\x61ta\x18\x06 \x03(\x0b\x32\x1e.xyz.block.ftl.v1.console.DataR\x04\x64\x61ta\x12:\n\x07secrets\x18\x07 \x03(\x0b\x32 .xyz.block.ftl.v1.console.SecretR\x07secrets\x12:\n\x07\x63onfigs\x18\x08 \x03(\x0b\x32 .xyz.block.ftl.v1.console.ConfigR\x07\x63onfigs\x12@\n\tdatabases\x18\t \x03(\x0b\x32\".xyz.block.ftl.v1.console.DatabaseR\tdatabases\x12\x34\n\x05\x65nums\x18\n \x03(\x0b\x32\x1e.xyz.block.ftl.v1.console.EnumR\x05\x65nums\x12\x37\n\x06topics\x18\x0b \x03(\x0b\x32\x1f.xyz.block.ftl.v1.console.TopicR\x06topics\x12\x45\n\x0btypealiases\x18\x0c \x03(\x0b\x32#.xyz.block.ftl.v1.console.TypeAliasR\x0btypealiases\x12L\n\rsubscriptions\x18\r \x03(\x0b\x32&.xyz.block.ftl.v1.console.SubscriptionR\rsubscriptions\")\n\rTopologyGroup\x12\x18\n\x07modules\x18\x01 \x03(\tR\x07modules\"K\n\x08Topology\x12?\n\x06levels\x18\x01 \x03(\x0b\x32\'.xyz.block.ftl.v1.console.TopologyGroupR\x06levels\"\x13\n\x11GetModulesRequest\"\x90\x01\n\x12GetModulesResponse\x12:\n\x07modules\x18\x01 \x03(\x0b\x32 .xyz.block.ftl.v1.console.ModuleR\x07modules\x12>\n\x08topology\x18\x02 \x01(\x0b\x32\".xyz.block.ftl.v1.console.TopologyR\x08topology\"\x16\n\x14StreamModulesRequest\"S\n\x15StreamModulesResponse\x12:\n\x07modules\x18\x01 \x03(\x0b\x32 .xyz.block.ftl.v1.console.ModuleR\x07modules\"\xe4\r\n\x0b\x45ventsQuery\x12\x46\n\x07\x66ilters\x18\x01 \x03(\x0b\x32,.xyz.block.ftl.v1.console.EventsQuery.FilterR\x07\x66ilters\x12\x14\n\x05limit\x18\x02 \x01(\x05R\x05limit\x12\x41\n\x05order\x18\x03 \x01(\x0e\x32+.xyz.block.ftl.v1.console.EventsQuery.OrderR\x05order\x1a#\n\x0bLimitFilter\x12\x14\n\x05limit\x18\x01 \x01(\x05R\x05limit\x1aQ\n\x0eLogLevelFilter\x12?\n\tlog_level\x18\x01 \x01(\x0e\x32\".xyz.block.ftl.v1.console.LogLevelR\x08logLevel\x1a\x34\n\x10\x44\x65ploymentFilter\x12 \n\x0b\x64\x65ployments\x18\x01 \x03(\tR\x0b\x64\x65ployments\x1a+\n\rRequestFilter\x12\x1a\n\x08requests\x18\x01 \x03(\tR\x08requests\x1aW\n\x0f\x45ventTypeFilter\x12\x44\n\x0b\x65vent_types\x18\x01 \x03(\x0e\x32#.xyz.block.ftl.v1.console.EventTypeR\neventTypes\x1a\xaa\x01\n\nTimeFilter\x12>\n\nolder_than\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x00R\tolderThan\x88\x01\x01\x12>\n\nnewer_than\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x01R\tnewerThan\x88\x01\x01\x42\r\n\x0b_older_thanB\r\n\x0b_newer_than\x1as\n\x08IDFilter\x12\"\n\nlower_than\x18\x01 \x01(\x03H\x00R\tlowerThan\x88\x01\x01\x12$\n\x0bhigher_than\x18\x02 \x01(\x03H\x01R\nhigherThan\x88\x01\x01\x42\r\n\x0b_lower_thanB\x0e\n\x0c_higher_than\x1a\x99\x01\n\nCallFilter\x12\x1f\n\x0b\x64\x65st_module\x18\x01 \x01(\tR\ndestModule\x12 \n\tdest_verb\x18\x02 \x01(\tH\x00R\x08\x64\x65stVerb\x88\x01\x01\x12(\n\rsource_module\x18\x03 \x01(\tH\x01R\x0csourceModule\x88\x01\x01\x42\x0c\n\n_dest_verbB\x10\n\x0e_source_module\x1aH\n\x0cModuleFilter\x12\x16\n\x06module\x18\x01 \x01(\tR\x06module\x12\x17\n\x04verb\x18\x02 \x01(\tH\x00R\x04verb\x88\x01\x01\x42\x07\n\x05_verb\x1a\xdb\x05\n\x06\x46ilter\x12I\n\x05limit\x18\x01 \x01(\x0b\x32\x31.xyz.block.ftl.v1.console.EventsQuery.LimitFilterH\x00R\x05limit\x12S\n\tlog_level\x18\x02 \x01(\x0b\x32\x34.xyz.block.ftl.v1.console.EventsQuery.LogLevelFilterH\x00R\x08logLevel\x12Z\n\x0b\x64\x65ployments\x18\x03 \x01(\x0b\x32\x36.xyz.block.ftl.v1.console.EventsQuery.DeploymentFilterH\x00R\x0b\x64\x65ployments\x12Q\n\x08requests\x18\x04 \x01(\x0b\x32\x33.xyz.block.ftl.v1.console.EventsQuery.RequestFilterH\x00R\x08requests\x12X\n\x0b\x65vent_types\x18\x05 \x01(\x0b\x32\x35.xyz.block.ftl.v1.console.EventsQuery.EventTypeFilterH\x00R\neventTypes\x12\x46\n\x04time\x18\x06 \x01(\x0b\x32\x30.xyz.block.ftl.v1.console.EventsQuery.TimeFilterH\x00R\x04time\x12@\n\x02id\x18\x07 \x01(\x0b\x32..xyz.block.ftl.v1.console.EventsQuery.IDFilterH\x00R\x02id\x12\x46\n\x04\x63\x61ll\x18\x08 \x01(\x0b\x32\x30.xyz.block.ftl.v1.console.EventsQuery.CallFilterH\x00R\x04\x63\x61ll\x12L\n\x06module\x18\t \x01(\x0b\x32\x32.xyz.block.ftl.v1.console.EventsQuery.ModuleFilterH\x00R\x06moduleB\x08\n\x06\x66ilter\"\x1a\n\x05Order\x12\x07\n\x03\x41SC\x10\x00\x12\x08\n\x04\x44\x45SC\x10\x01\"\xaf\x01\n\x13StreamEventsRequest\x12G\n\x0fupdate_interval\x18\x01 \x01(\x0b\x32\x19.google.protobuf.DurationH\x00R\x0eupdateInterval\x88\x01\x01\x12;\n\x05query\x18\x02 \x01(\x0b\x32%.xyz.block.ftl.v1.console.EventsQueryR\x05queryB\x12\n\x10_update_interval\"O\n\x14StreamEventsResponse\x12\x37\n\x06\x65vents\x18\x01 \x03(\x0b\x32\x1f.xyz.block.ftl.v1.console.EventR\x06\x65vents\"\xb1\x06\n\x05\x45vent\x12\x39\n\ntime_stamp\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\ttimeStamp\x12\x0e\n\x02id\x18\x02 \x01(\x03R\x02id\x12\x36\n\x03log\x18\x03 \x01(\x0b\x32\".xyz.block.ftl.v1.console.LogEventH\x00R\x03log\x12\x39\n\x04\x63\x61ll\x18\x04 \x01(\x0b\x32#.xyz.block.ftl.v1.console.CallEventH\x00R\x04\x63\x61ll\x12\x61\n\x12\x64\x65ployment_created\x18\x05 \x01(\x0b\x32\x30.xyz.block.ftl.v1.console.DeploymentCreatedEventH\x00R\x11\x64\x65ploymentCreated\x12\x61\n\x12\x64\x65ployment_updated\x18\x06 \x01(\x0b\x32\x30.xyz.block.ftl.v1.console.DeploymentUpdatedEventH\x00R\x11\x64\x65ploymentUpdated\x12\x42\n\x07ingress\x18\x07 \x01(\x0b\x32&.xyz.block.ftl.v1.console.IngressEventH\x00R\x07ingress\x12U\n\x0e\x63ron_scheduled\x18\x08 \x01(\x0b\x32,.xyz.block.ftl.v1.console.CronScheduledEventH\x00R\rcronScheduled\x12R\n\rasync_execute\x18\t \x01(\x0b\x32+.xyz.block.ftl.v1.console.AsyncExecuteEventH\x00R\x0c\x61syncExecute\x12U\n\x0epubsub_publish\x18\n \x01(\x0b\x32,.xyz.block.ftl.v1.console.PubSubPublishEventH\x00R\rpubsubPublish\x12U\n\x0epubsub_consume\x18\x0b \x01(\x0b\x32,.xyz.block.ftl.v1.console.PubSubConsumeEventH\x00R\rpubsubConsumeB\x07\n\x05\x65ntry\"t\n\x11GetEventsResponse\x12\x37\n\x06\x65vents\x18\x01 \x03(\x0b\x32\x1f.xyz.block.ftl.v1.console.EventR\x06\x65vents\x12\x1b\n\x06\x63ursor\x18\x02 \x01(\x03H\x00R\x06\x63ursor\x88\x01\x01\x42\t\n\x07_cursor*\xa5\x02\n\tEventType\x12\x16\n\x12\x45VENT_TYPE_UNKNOWN\x10\x00\x12\x12\n\x0e\x45VENT_TYPE_LOG\x10\x01\x12\x13\n\x0f\x45VENT_TYPE_CALL\x10\x02\x12!\n\x1d\x45VENT_TYPE_DEPLOYMENT_CREATED\x10\x03\x12!\n\x1d\x45VENT_TYPE_DEPLOYMENT_UPDATED\x10\x04\x12\x16\n\x12\x45VENT_TYPE_INGRESS\x10\x05\x12\x1d\n\x19\x45VENT_TYPE_CRON_SCHEDULED\x10\x06\x12\x1c\n\x18\x45VENT_TYPE_ASYNC_EXECUTE\x10\x07\x12\x1d\n\x19\x45VENT_TYPE_PUBSUB_PUBLISH\x10\x08\x12\x1d\n\x19\x45VENT_TYPE_PUBSUB_CONSUME\x10\t*\x85\x01\n\x15\x41syncExecuteEventType\x12$\n ASYNC_EXECUTE_EVENT_TYPE_UNKNOWN\x10\x00\x12!\n\x1d\x41SYNC_EXECUTE_EVENT_TYPE_CRON\x10\x01\x12#\n\x1f\x41SYNC_EXECUTE_EVENT_TYPE_PUBSUB\x10\x02*\x88\x01\n\x08LogLevel\x12\x15\n\x11LOG_LEVEL_UNKNOWN\x10\x00\x12\x13\n\x0fLOG_LEVEL_TRACE\x10\x01\x12\x13\n\x0fLOG_LEVEL_DEBUG\x10\x05\x12\x12\n\x0eLOG_LEVEL_INFO\x10\t\x12\x12\n\x0eLOG_LEVEL_WARN\x10\r\x12\x13\n\x0fLOG_LEVEL_ERROR\x10\x11\x32\x8b\x04\n\x0e\x43onsoleService\x12J\n\x04Ping\x12\x1d.xyz.block.ftl.v1.PingRequest\x1a\x1e.xyz.block.ftl.v1.PingResponse\"\x03\x90\x02\x01\x12g\n\nGetModules\x12+.xyz.block.ftl.v1.console.GetModulesRequest\x1a,.xyz.block.ftl.v1.console.GetModulesResponse\x12r\n\rStreamModules\x12..xyz.block.ftl.v1.console.StreamModulesRequest\x1a/.xyz.block.ftl.v1.console.StreamModulesResponse0\x01\x12o\n\x0cStreamEvents\x12-.xyz.block.ftl.v1.console.StreamEventsRequest\x1a..xyz.block.ftl.v1.console.StreamEventsResponse0\x01\x12_\n\tGetEvents\x12%.xyz.block.ftl.v1.console.EventsQuery\x1a+.xyz.block.ftl.v1.console.GetEventsResponseBPP\x01ZLgithub.com/TBD54566975/ftl/backend/protos/xyz/block/ftl/v1/console;pbconsoleb\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n&xyz/block/ftl/v1/console/console.proto\x12\x18xyz.block.ftl.v1.console\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1axyz/block/ftl/v1/ftl.proto\x1a$xyz/block/ftl/v1/schema/schema.proto\"\xb6\x03\n\x08LogEvent\x12%\n\x0e\x64\x65ployment_key\x18\x01 \x01(\tR\rdeploymentKey\x12$\n\x0brequest_key\x18\x02 \x01(\tH\x00R\nrequestKey\x88\x01\x01\x12\x39\n\ntime_stamp\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\ttimeStamp\x12\x1b\n\tlog_level\x18\x04 \x01(\x05R\x08logLevel\x12R\n\nattributes\x18\x05 \x03(\x0b\x32\x32.xyz.block.ftl.v1.console.LogEvent.AttributesEntryR\nattributes\x12\x18\n\x07message\x18\x06 \x01(\tR\x07message\x12\x19\n\x05\x65rror\x18\x07 \x01(\tH\x01R\x05\x65rror\x88\x01\x01\x12\x19\n\x05stack\x18\x08 \x01(\tH\x02R\x05stack\x88\x01\x01\x1a=\n\x0f\x41ttributesEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n\x05value\x18\x02 \x01(\tR\x05value:\x02\x38\x01\x42\x0e\n\x0c_request_keyB\x08\n\x06_errorB\x08\n\x06_stack\"\x95\x04\n\tCallEvent\x12$\n\x0brequest_key\x18\x01 \x01(\tH\x00R\nrequestKey\x88\x01\x01\x12%\n\x0e\x64\x65ployment_key\x18\x02 \x01(\tR\rdeploymentKey\x12\x39\n\ntime_stamp\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\ttimeStamp\x12I\n\x0fsource_verb_ref\x18\x0b \x01(\x0b\x32\x1c.xyz.block.ftl.v1.schema.RefH\x01R\rsourceVerbRef\x88\x01\x01\x12N\n\x14\x64\x65stination_verb_ref\x18\x0c \x01(\x0b\x32\x1c.xyz.block.ftl.v1.schema.RefR\x12\x64\x65stinationVerbRef\x12\x35\n\x08\x64uration\x18\x06 \x01(\x0b\x32\x19.google.protobuf.DurationR\x08\x64uration\x12\x18\n\x07request\x18\x07 \x01(\tR\x07request\x12\x1a\n\x08response\x18\x08 \x01(\tR\x08response\x12\x19\n\x05\x65rror\x18\t \x01(\tH\x02R\x05\x65rror\x88\x01\x01\x12\x19\n\x05stack\x18\n \x01(\tH\x03R\x05stack\x88\x01\x01\x42\x0e\n\x0c_request_keyB\x12\n\x10_source_verb_refB\x08\n\x06_errorB\x08\n\x06_stackJ\x04\x08\x04\x10\x05J\x04\x08\x05\x10\x06\"\xb8\x01\n\x16\x44\x65ploymentCreatedEvent\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x1a\n\x08language\x18\x02 \x01(\tR\x08language\x12\x1f\n\x0bmodule_name\x18\x03 \x01(\tR\nmoduleName\x12!\n\x0cmin_replicas\x18\x04 \x01(\x05R\x0bminReplicas\x12\x1f\n\x08replaced\x18\x05 \x01(\tH\x00R\x08replaced\x88\x01\x01\x42\x0b\n\t_replaced\"y\n\x16\x44\x65ploymentUpdatedEvent\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12!\n\x0cmin_replicas\x18\x02 \x01(\x05R\x0bminReplicas\x12*\n\x11prev_min_replicas\x18\x03 \x01(\x05R\x0fprevMinReplicas\"\x8e\x04\n\x0cIngressEvent\x12%\n\x0e\x64\x65ployment_key\x18\x01 \x01(\tR\rdeploymentKey\x12$\n\x0brequest_key\x18\x02 \x01(\tH\x00R\nrequestKey\x88\x01\x01\x12\x37\n\x08verb_ref\x18\x03 \x01(\x0b\x32\x1c.xyz.block.ftl.v1.schema.RefR\x07verbRef\x12\x16\n\x06method\x18\x04 \x01(\tR\x06method\x12\x12\n\x04path\x18\x05 \x01(\tR\x04path\x12\x1f\n\x0bstatus_code\x18\x07 \x01(\x05R\nstatusCode\x12\x39\n\ntime_stamp\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\ttimeStamp\x12\x35\n\x08\x64uration\x18\t \x01(\x0b\x32\x19.google.protobuf.DurationR\x08\x64uration\x12\x18\n\x07request\x18\n \x01(\tR\x07request\x12%\n\x0erequest_header\x18\x0b \x01(\tR\rrequestHeader\x12\x1a\n\x08response\x18\x0c \x01(\tR\x08response\x12\'\n\x0fresponse_header\x18\r \x01(\tR\x0eresponseHeader\x12\x19\n\x05\x65rror\x18\x0e \x01(\tH\x01R\x05\x65rror\x88\x01\x01\x42\x0e\n\x0c_request_keyB\x08\n\x06_error\"\xe6\x02\n\x12\x43ronScheduledEvent\x12%\n\x0e\x64\x65ployment_key\x18\x01 \x01(\tR\rdeploymentKey\x12\x37\n\x08verb_ref\x18\x02 \x01(\x0b\x32\x1c.xyz.block.ftl.v1.schema.RefR\x07verbRef\x12\x39\n\ntime_stamp\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\ttimeStamp\x12\x35\n\x08\x64uration\x18\x04 \x01(\x0b\x32\x19.google.protobuf.DurationR\x08\x64uration\x12=\n\x0cscheduled_at\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\x0bscheduledAt\x12\x1a\n\x08schedule\x18\x06 \x01(\tR\x08schedule\x12\x19\n\x05\x65rror\x18\x07 \x01(\tH\x00R\x05\x65rror\x88\x01\x01\x42\x08\n\x06_error\"\x9b\x03\n\x11\x41syncExecuteEvent\x12%\n\x0e\x64\x65ployment_key\x18\x01 \x01(\tR\rdeploymentKey\x12$\n\x0brequest_key\x18\x02 \x01(\tH\x00R\nrequestKey\x88\x01\x01\x12\x37\n\x08verb_ref\x18\x03 \x01(\x0b\x32\x1c.xyz.block.ftl.v1.schema.RefR\x07verbRef\x12\x39\n\ntime_stamp\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\ttimeStamp\x12\x35\n\x08\x64uration\x18\x05 \x01(\x0b\x32\x19.google.protobuf.DurationR\x08\x64uration\x12Y\n\x10\x61sync_event_type\x18\x06 \x01(\x0e\x32/.xyz.block.ftl.v1.console.AsyncExecuteEventTypeR\x0e\x61syncEventType\x12\x19\n\x05\x65rror\x18\x07 \x01(\tH\x01R\x05\x65rror\x88\x01\x01\x42\x0e\n\x0c_request_keyB\x08\n\x06_error\"\xf1\x02\n\x12PubSubPublishEvent\x12%\n\x0e\x64\x65ployment_key\x18\x01 \x01(\tR\rdeploymentKey\x12$\n\x0brequest_key\x18\x02 \x01(\tH\x00R\nrequestKey\x88\x01\x01\x12\x37\n\x08verb_ref\x18\x03 \x01(\x0b\x32\x1c.xyz.block.ftl.v1.schema.RefR\x07verbRef\x12\x39\n\ntime_stamp\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\ttimeStamp\x12\x35\n\x08\x64uration\x18\x05 \x01(\x0b\x32\x19.google.protobuf.DurationR\x08\x64uration\x12\x14\n\x05topic\x18\x06 \x01(\tR\x05topic\x12\x18\n\x07request\x18\x07 \x01(\tR\x07request\x12\x19\n\x05\x65rror\x18\x08 \x01(\tH\x01R\x05\x65rror\x88\x01\x01\x42\x0e\n\x0c_request_keyB\x08\n\x06_error\"\xa0\x03\n\x12PubSubConsumeEvent\x12%\n\x0e\x64\x65ployment_key\x18\x01 \x01(\tR\rdeploymentKey\x12$\n\x0brequest_key\x18\x02 \x01(\tH\x00R\nrequestKey\x88\x01\x01\x12-\n\x10\x64\x65st_verb_module\x18\x03 \x01(\tH\x01R\x0e\x64\x65stVerbModule\x88\x01\x01\x12)\n\x0e\x64\x65st_verb_name\x18\x04 \x01(\tH\x02R\x0c\x64\x65stVerbName\x88\x01\x01\x12\x39\n\ntime_stamp\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\ttimeStamp\x12\x35\n\x08\x64uration\x18\x06 \x01(\x0b\x32\x19.google.protobuf.DurationR\x08\x64uration\x12\x14\n\x05topic\x18\x07 \x01(\tR\x05topic\x12\x19\n\x05\x65rror\x18\x08 \x01(\tH\x03R\x05\x65rror\x88\x01\x01\x42\x0e\n\x0c_request_keyB\x13\n\x11_dest_verb_moduleB\x11\n\x0f_dest_verb_nameB\x08\n\x06_error\"\x7f\n\x06\x43onfig\x12\x37\n\x06\x63onfig\x18\x01 \x01(\x0b\x32\x1f.xyz.block.ftl.v1.schema.ConfigR\x06\x63onfig\x12<\n\nreferences\x18\x02 \x03(\x0b\x32\x1c.xyz.block.ftl.v1.schema.RefR\nreferences\"\x8f\x01\n\x04\x44\x61ta\x12\x31\n\x04\x64\x61ta\x18\x01 \x01(\x0b\x32\x1d.xyz.block.ftl.v1.schema.DataR\x04\x64\x61ta\x12\x16\n\x06schema\x18\x02 \x01(\tR\x06schema\x12<\n\nreferences\x18\x03 \x03(\x0b\x32\x1c.xyz.block.ftl.v1.schema.RefR\nreferences\"\x87\x01\n\x08\x44\x61tabase\x12=\n\x08\x64\x61tabase\x18\x01 \x01(\x0b\x32!.xyz.block.ftl.v1.schema.DatabaseR\x08\x64\x61tabase\x12<\n\nreferences\x18\x02 \x03(\x0b\x32\x1c.xyz.block.ftl.v1.schema.RefR\nreferences\"w\n\x04\x45num\x12\x31\n\x04\x65num\x18\x01 \x01(\x0b\x32\x1d.xyz.block.ftl.v1.schema.EnumR\x04\x65num\x12<\n\nreferences\x18\x02 \x03(\x0b\x32\x1c.xyz.block.ftl.v1.schema.RefR\nreferences\"{\n\x05Topic\x12\x34\n\x05topic\x18\x01 \x01(\x0b\x32\x1e.xyz.block.ftl.v1.schema.TopicR\x05topic\x12<\n\nreferences\x18\x02 \x03(\x0b\x32\x1c.xyz.block.ftl.v1.schema.RefR\nreferences\"\x8b\x01\n\tTypeAlias\x12@\n\ttypealias\x18\x01 \x01(\x0b\x32\".xyz.block.ftl.v1.schema.TypeAliasR\ttypealias\x12<\n\nreferences\x18\x02 \x03(\x0b\x32\x1c.xyz.block.ftl.v1.schema.RefR\nreferences\"\x7f\n\x06Secret\x12\x37\n\x06secret\x18\x01 \x01(\x0b\x32\x1f.xyz.block.ftl.v1.schema.SecretR\x06secret\x12<\n\nreferences\x18\x02 \x03(\x0b\x32\x1c.xyz.block.ftl.v1.schema.RefR\nreferences\"\x97\x01\n\x0cSubscription\x12I\n\x0csubscription\x18\x01 \x01(\x0b\x32%.xyz.block.ftl.v1.schema.SubscriptionR\x0csubscription\x12<\n\nreferences\x18\x02 \x03(\x0b\x32\x1c.xyz.block.ftl.v1.schema.RefR\nreferences\"\xbf\x01\n\x04Verb\x12\x31\n\x04verb\x18\x01 \x01(\x0b\x32\x1d.xyz.block.ftl.v1.schema.VerbR\x04verb\x12\x16\n\x06schema\x18\x02 \x01(\tR\x06schema\x12.\n\x13json_request_schema\x18\x03 \x01(\tR\x11jsonRequestSchema\x12<\n\nreferences\x18\x04 \x03(\x0b\x32\x1c.xyz.block.ftl.v1.schema.RefR\nreferences\"\x9f\x05\n\x06Module\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12%\n\x0e\x64\x65ployment_key\x18\x02 \x01(\tR\rdeploymentKey\x12\x1a\n\x08language\x18\x03 \x01(\tR\x08language\x12\x16\n\x06schema\x18\x04 \x01(\tR\x06schema\x12\x34\n\x05verbs\x18\x05 \x03(\x0b\x32\x1e.xyz.block.ftl.v1.console.VerbR\x05verbs\x12\x32\n\x04\x64\x61ta\x18\x06 \x03(\x0b\x32\x1e.xyz.block.ftl.v1.console.DataR\x04\x64\x61ta\x12:\n\x07secrets\x18\x07 \x03(\x0b\x32 .xyz.block.ftl.v1.console.SecretR\x07secrets\x12:\n\x07\x63onfigs\x18\x08 \x03(\x0b\x32 .xyz.block.ftl.v1.console.ConfigR\x07\x63onfigs\x12@\n\tdatabases\x18\t \x03(\x0b\x32\".xyz.block.ftl.v1.console.DatabaseR\tdatabases\x12\x34\n\x05\x65nums\x18\n \x03(\x0b\x32\x1e.xyz.block.ftl.v1.console.EnumR\x05\x65nums\x12\x37\n\x06topics\x18\x0b \x03(\x0b\x32\x1f.xyz.block.ftl.v1.console.TopicR\x06topics\x12\x45\n\x0btypealiases\x18\x0c \x03(\x0b\x32#.xyz.block.ftl.v1.console.TypeAliasR\x0btypealiases\x12L\n\rsubscriptions\x18\r \x03(\x0b\x32&.xyz.block.ftl.v1.console.SubscriptionR\rsubscriptions\")\n\rTopologyGroup\x12\x18\n\x07modules\x18\x01 \x03(\tR\x07modules\"K\n\x08Topology\x12?\n\x06levels\x18\x01 \x03(\x0b\x32\'.xyz.block.ftl.v1.console.TopologyGroupR\x06levels\"\x13\n\x11GetModulesRequest\"\x90\x01\n\x12GetModulesResponse\x12:\n\x07modules\x18\x01 \x03(\x0b\x32 .xyz.block.ftl.v1.console.ModuleR\x07modules\x12>\n\x08topology\x18\x02 \x01(\x0b\x32\".xyz.block.ftl.v1.console.TopologyR\x08topology\"\x16\n\x14StreamModulesRequest\"S\n\x15StreamModulesResponse\x12:\n\x07modules\x18\x01 \x03(\x0b\x32 .xyz.block.ftl.v1.console.ModuleR\x07modules\"\xe4\r\n\x0b\x45ventsQuery\x12\x46\n\x07\x66ilters\x18\x01 \x03(\x0b\x32,.xyz.block.ftl.v1.console.EventsQuery.FilterR\x07\x66ilters\x12\x14\n\x05limit\x18\x02 \x01(\x05R\x05limit\x12\x41\n\x05order\x18\x03 \x01(\x0e\x32+.xyz.block.ftl.v1.console.EventsQuery.OrderR\x05order\x1a#\n\x0bLimitFilter\x12\x14\n\x05limit\x18\x01 \x01(\x05R\x05limit\x1aQ\n\x0eLogLevelFilter\x12?\n\tlog_level\x18\x01 \x01(\x0e\x32\".xyz.block.ftl.v1.console.LogLevelR\x08logLevel\x1a\x34\n\x10\x44\x65ploymentFilter\x12 \n\x0b\x64\x65ployments\x18\x01 \x03(\tR\x0b\x64\x65ployments\x1a+\n\rRequestFilter\x12\x1a\n\x08requests\x18\x01 \x03(\tR\x08requests\x1aW\n\x0f\x45ventTypeFilter\x12\x44\n\x0b\x65vent_types\x18\x01 \x03(\x0e\x32#.xyz.block.ftl.v1.console.EventTypeR\neventTypes\x1a\xaa\x01\n\nTimeFilter\x12>\n\nolder_than\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x00R\tolderThan\x88\x01\x01\x12>\n\nnewer_than\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x01R\tnewerThan\x88\x01\x01\x42\r\n\x0b_older_thanB\r\n\x0b_newer_than\x1as\n\x08IDFilter\x12\"\n\nlower_than\x18\x01 \x01(\x03H\x00R\tlowerThan\x88\x01\x01\x12$\n\x0bhigher_than\x18\x02 \x01(\x03H\x01R\nhigherThan\x88\x01\x01\x42\r\n\x0b_lower_thanB\x0e\n\x0c_higher_than\x1a\x99\x01\n\nCallFilter\x12\x1f\n\x0b\x64\x65st_module\x18\x01 \x01(\tR\ndestModule\x12 \n\tdest_verb\x18\x02 \x01(\tH\x00R\x08\x64\x65stVerb\x88\x01\x01\x12(\n\rsource_module\x18\x03 \x01(\tH\x01R\x0csourceModule\x88\x01\x01\x42\x0c\n\n_dest_verbB\x10\n\x0e_source_module\x1aH\n\x0cModuleFilter\x12\x16\n\x06module\x18\x01 \x01(\tR\x06module\x12\x17\n\x04verb\x18\x02 \x01(\tH\x00R\x04verb\x88\x01\x01\x42\x07\n\x05_verb\x1a\xdb\x05\n\x06\x46ilter\x12I\n\x05limit\x18\x01 \x01(\x0b\x32\x31.xyz.block.ftl.v1.console.EventsQuery.LimitFilterH\x00R\x05limit\x12S\n\tlog_level\x18\x02 \x01(\x0b\x32\x34.xyz.block.ftl.v1.console.EventsQuery.LogLevelFilterH\x00R\x08logLevel\x12Z\n\x0b\x64\x65ployments\x18\x03 \x01(\x0b\x32\x36.xyz.block.ftl.v1.console.EventsQuery.DeploymentFilterH\x00R\x0b\x64\x65ployments\x12Q\n\x08requests\x18\x04 \x01(\x0b\x32\x33.xyz.block.ftl.v1.console.EventsQuery.RequestFilterH\x00R\x08requests\x12X\n\x0b\x65vent_types\x18\x05 \x01(\x0b\x32\x35.xyz.block.ftl.v1.console.EventsQuery.EventTypeFilterH\x00R\neventTypes\x12\x46\n\x04time\x18\x06 \x01(\x0b\x32\x30.xyz.block.ftl.v1.console.EventsQuery.TimeFilterH\x00R\x04time\x12@\n\x02id\x18\x07 \x01(\x0b\x32..xyz.block.ftl.v1.console.EventsQuery.IDFilterH\x00R\x02id\x12\x46\n\x04\x63\x61ll\x18\x08 \x01(\x0b\x32\x30.xyz.block.ftl.v1.console.EventsQuery.CallFilterH\x00R\x04\x63\x61ll\x12L\n\x06module\x18\t \x01(\x0b\x32\x32.xyz.block.ftl.v1.console.EventsQuery.ModuleFilterH\x00R\x06moduleB\x08\n\x06\x66ilter\"\x1a\n\x05Order\x12\x07\n\x03\x41SC\x10\x00\x12\x08\n\x04\x44\x45SC\x10\x01\"\xaf\x01\n\x13StreamEventsRequest\x12G\n\x0fupdate_interval\x18\x01 \x01(\x0b\x32\x19.google.protobuf.DurationH\x00R\x0eupdateInterval\x88\x01\x01\x12;\n\x05query\x18\x02 \x01(\x0b\x32%.xyz.block.ftl.v1.console.EventsQueryR\x05queryB\x12\n\x10_update_interval\"O\n\x14StreamEventsResponse\x12\x37\n\x06\x65vents\x18\x01 \x03(\x0b\x32\x1f.xyz.block.ftl.v1.console.EventR\x06\x65vents\"\xb1\x06\n\x05\x45vent\x12\x39\n\ntime_stamp\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\ttimeStamp\x12\x0e\n\x02id\x18\x02 \x01(\x03R\x02id\x12\x36\n\x03log\x18\x03 \x01(\x0b\x32\".xyz.block.ftl.v1.console.LogEventH\x00R\x03log\x12\x39\n\x04\x63\x61ll\x18\x04 \x01(\x0b\x32#.xyz.block.ftl.v1.console.CallEventH\x00R\x04\x63\x61ll\x12\x61\n\x12\x64\x65ployment_created\x18\x05 \x01(\x0b\x32\x30.xyz.block.ftl.v1.console.DeploymentCreatedEventH\x00R\x11\x64\x65ploymentCreated\x12\x61\n\x12\x64\x65ployment_updated\x18\x06 \x01(\x0b\x32\x30.xyz.block.ftl.v1.console.DeploymentUpdatedEventH\x00R\x11\x64\x65ploymentUpdated\x12\x42\n\x07ingress\x18\x07 \x01(\x0b\x32&.xyz.block.ftl.v1.console.IngressEventH\x00R\x07ingress\x12U\n\x0e\x63ron_scheduled\x18\x08 \x01(\x0b\x32,.xyz.block.ftl.v1.console.CronScheduledEventH\x00R\rcronScheduled\x12R\n\rasync_execute\x18\t \x01(\x0b\x32+.xyz.block.ftl.v1.console.AsyncExecuteEventH\x00R\x0c\x61syncExecute\x12U\n\x0epubsub_publish\x18\n \x01(\x0b\x32,.xyz.block.ftl.v1.console.PubSubPublishEventH\x00R\rpubsubPublish\x12U\n\x0epubsub_consume\x18\x0b \x01(\x0b\x32,.xyz.block.ftl.v1.console.PubSubConsumeEventH\x00R\rpubsubConsumeB\x07\n\x05\x65ntry\"t\n\x11GetEventsResponse\x12\x37\n\x06\x65vents\x18\x01 \x03(\x0b\x32\x1f.xyz.block.ftl.v1.console.EventR\x06\x65vents\x12\x1b\n\x06\x63ursor\x18\x02 \x01(\x03H\x00R\x06\x63ursor\x88\x01\x01\x42\t\n\x07_cursor\"N\n\x10GetConfigRequest\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x1b\n\x06module\x18\x02 \x01(\tH\x00R\x06module\x88\x01\x01\x42\t\n\x07_module\")\n\x11GetConfigResponse\x12\x14\n\x05value\x18\x01 \x01(\x0cR\x05value\"d\n\x10SetConfigRequest\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x1b\n\x06module\x18\x02 \x01(\tH\x00R\x06module\x88\x01\x01\x12\x14\n\x05value\x18\x03 \x01(\x0cR\x05valueB\t\n\x07_module\")\n\x11SetConfigResponse\x12\x14\n\x05value\x18\x01 \x01(\x0cR\x05value*\xa5\x02\n\tEventType\x12\x16\n\x12\x45VENT_TYPE_UNKNOWN\x10\x00\x12\x12\n\x0e\x45VENT_TYPE_LOG\x10\x01\x12\x13\n\x0f\x45VENT_TYPE_CALL\x10\x02\x12!\n\x1d\x45VENT_TYPE_DEPLOYMENT_CREATED\x10\x03\x12!\n\x1d\x45VENT_TYPE_DEPLOYMENT_UPDATED\x10\x04\x12\x16\n\x12\x45VENT_TYPE_INGRESS\x10\x05\x12\x1d\n\x19\x45VENT_TYPE_CRON_SCHEDULED\x10\x06\x12\x1c\n\x18\x45VENT_TYPE_ASYNC_EXECUTE\x10\x07\x12\x1d\n\x19\x45VENT_TYPE_PUBSUB_PUBLISH\x10\x08\x12\x1d\n\x19\x45VENT_TYPE_PUBSUB_CONSUME\x10\t*\x85\x01\n\x15\x41syncExecuteEventType\x12$\n ASYNC_EXECUTE_EVENT_TYPE_UNKNOWN\x10\x00\x12!\n\x1d\x41SYNC_EXECUTE_EVENT_TYPE_CRON\x10\x01\x12#\n\x1f\x41SYNC_EXECUTE_EVENT_TYPE_PUBSUB\x10\x02*\x88\x01\n\x08LogLevel\x12\x15\n\x11LOG_LEVEL_UNKNOWN\x10\x00\x12\x13\n\x0fLOG_LEVEL_TRACE\x10\x01\x12\x13\n\x0fLOG_LEVEL_DEBUG\x10\x05\x12\x12\n\x0eLOG_LEVEL_INFO\x10\t\x12\x12\n\x0eLOG_LEVEL_WARN\x10\r\x12\x13\n\x0fLOG_LEVEL_ERROR\x10\x11\x32\xd7\x05\n\x0e\x43onsoleService\x12J\n\x04Ping\x12\x1d.xyz.block.ftl.v1.PingRequest\x1a\x1e.xyz.block.ftl.v1.PingResponse\"\x03\x90\x02\x01\x12g\n\nGetModules\x12+.xyz.block.ftl.v1.console.GetModulesRequest\x1a,.xyz.block.ftl.v1.console.GetModulesResponse\x12r\n\rStreamModules\x12..xyz.block.ftl.v1.console.StreamModulesRequest\x1a/.xyz.block.ftl.v1.console.StreamModulesResponse0\x01\x12o\n\x0cStreamEvents\x12-.xyz.block.ftl.v1.console.StreamEventsRequest\x1a..xyz.block.ftl.v1.console.StreamEventsResponse0\x01\x12_\n\tGetEvents\x12%.xyz.block.ftl.v1.console.EventsQuery\x1a+.xyz.block.ftl.v1.console.GetEventsResponse\x12\x64\n\tGetConfig\x12*.xyz.block.ftl.v1.console.GetConfigRequest\x1a+.xyz.block.ftl.v1.console.GetConfigResponse\x12\x64\n\tSetConfig\x12*.xyz.block.ftl.v1.console.SetConfigRequest\x1a+.xyz.block.ftl.v1.console.SetConfigResponseBPP\x01ZLgithub.com/TBD54566975/ftl/backend/protos/xyz/block/ftl/v1/console;pbconsoleb\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -40,12 +40,12 @@ _globals['_LOGEVENT_ATTRIBUTESENTRY']._serialized_options = b'8\001' _globals['_CONSOLESERVICE'].methods_by_name['Ping']._loaded_options = None _globals['_CONSOLESERVICE'].methods_by_name['Ping']._serialized_options = b'\220\002\001' - _globals['_EVENTTYPE']._serialized_start=8895 - _globals['_EVENTTYPE']._serialized_end=9188 - _globals['_ASYNCEXECUTEEVENTTYPE']._serialized_start=9191 - _globals['_ASYNCEXECUTEEVENTTYPE']._serialized_end=9324 - _globals['_LOGLEVEL']._serialized_start=9327 - _globals['_LOGLEVEL']._serialized_end=9463 + _globals['_EVENTTYPE']._serialized_start=9163 + _globals['_EVENTTYPE']._serialized_end=9456 + _globals['_ASYNCEXECUTEEVENTTYPE']._serialized_start=9459 + _globals['_ASYNCEXECUTEEVENTTYPE']._serialized_end=9592 + _globals['_LOGLEVEL']._serialized_start=9595 + _globals['_LOGLEVEL']._serialized_end=9731 _globals['_LOGEVENT']._serialized_start=200 _globals['_LOGEVENT']._serialized_end=638 _globals['_LOGEVENT_ATTRIBUTESENTRY']._serialized_start=541 @@ -130,6 +130,14 @@ _globals['_EVENT']._serialized_end=8774 _globals['_GETEVENTSRESPONSE']._serialized_start=8776 _globals['_GETEVENTSRESPONSE']._serialized_end=8892 - _globals['_CONSOLESERVICE']._serialized_start=9466 - _globals['_CONSOLESERVICE']._serialized_end=9989 + _globals['_GETCONFIGREQUEST']._serialized_start=8894 + _globals['_GETCONFIGREQUEST']._serialized_end=8972 + _globals['_GETCONFIGRESPONSE']._serialized_start=8974 + _globals['_GETCONFIGRESPONSE']._serialized_end=9015 + _globals['_SETCONFIGREQUEST']._serialized_start=9017 + _globals['_SETCONFIGREQUEST']._serialized_end=9117 + _globals['_SETCONFIGRESPONSE']._serialized_start=9119 + _globals['_SETCONFIGRESPONSE']._serialized_end=9160 + _globals['_CONSOLESERVICE']._serialized_start=9734 + _globals['_CONSOLESERVICE']._serialized_end=10461 # @@protoc_insertion_point(module_scope) diff --git a/python-runtime/ftl/src/ftl/protos/xyz/block/ftl/v1/console/console_pb2.pyi b/python-runtime/ftl/src/ftl/protos/xyz/block/ftl/v1/console/console_pb2.pyi index 906d4e508e..63d732e5c7 100644 --- a/python-runtime/ftl/src/ftl/protos/xyz/block/ftl/v1/console/console_pb2.pyi +++ b/python-runtime/ftl/src/ftl/protos/xyz/block/ftl/v1/console/console_pb2.pyi @@ -519,3 +519,33 @@ class GetEventsResponse(_message.Message): events: _containers.RepeatedCompositeFieldContainer[Event] cursor: int def __init__(self, events: _Optional[_Iterable[_Union[Event, _Mapping]]] = ..., cursor: _Optional[int] = ...) -> None: ... + +class GetConfigRequest(_message.Message): + __slots__ = ("name", "module") + NAME_FIELD_NUMBER: _ClassVar[int] + MODULE_FIELD_NUMBER: _ClassVar[int] + name: str + module: str + def __init__(self, name: _Optional[str] = ..., module: _Optional[str] = ...) -> None: ... + +class GetConfigResponse(_message.Message): + __slots__ = ("value",) + VALUE_FIELD_NUMBER: _ClassVar[int] + value: bytes + def __init__(self, value: _Optional[bytes] = ...) -> None: ... + +class SetConfigRequest(_message.Message): + __slots__ = ("name", "module", "value") + NAME_FIELD_NUMBER: _ClassVar[int] + MODULE_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + name: str + module: str + value: bytes + def __init__(self, name: _Optional[str] = ..., module: _Optional[str] = ..., value: _Optional[bytes] = ...) -> None: ... + +class SetConfigResponse(_message.Message): + __slots__ = ("value",) + VALUE_FIELD_NUMBER: _ClassVar[int] + value: bytes + def __init__(self, value: _Optional[bytes] = ...) -> None: ...