Files
pangolin/server/internal/pb/pangolin/agent/v1/agent.pb.go
T
wangjia 6ec7cd8146 merge: maestro/tsk_V9IrIk2g5Q78 [proto 契约 + buf 工具链] (tsk_FrRarw9YO8Nf)
合并 proto 契约 + buf 工具链任务到 main(已含 apierr + idgen + CONVENTIONS.md):

- server/proto/pangolin/agent/v1/agent.proto: AgentService 6 个 RPC(Enroll/Register/
  Heartbeat/Subscribe/Ack/ReportUsage)及全量消息类型,隐私红线注释保留
- server/buf.yaml: v2 格式,STANDARD lint + FILE breaking 规则
- server/buf.gen.yaml: remote protoc-gen-go v1.36.4 + protoc-gen-go-grpc v1.5.1 插件
- server/internal/pb/: 生成的 agent.pb.go + agent_grpc.pb.go 提交入库
- server/Makefile: 新增 proto / proto-lint / proto-breaking 目标
- server/tools.go: 新增 buf v1.70.0、protoc-gen-go、protoc-gen-go-grpc 工具依赖
- server/go.mod / go.sum: 合并 buf 工具链依赖;github.com/google/uuid 保留为 direct
  依赖(idgen 直接 import);go 版本升至 1.25.10

冲突解决:两侧均修改 go.mod,以 proto 分支(超集)为基础,将 google/uuid 移至
直接依赖 require 块,保留 apierr/idgen 的已有文件不变。

go build ./... ✓  |  go test ./internal/apierr/... ./internal/idgen/... ✓

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-13 15:11:11 +08:00

1544 lines
59 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// agent.proto — Control-plane ↔ Agent 通信契约
//
// 安全红线(禁止违反):
// 1. 所有消息中只使用 dp_uuid 标识数据通道,严禁出现 user_id / email 等用户身份字段。
// 2. ReportUsage 不含目的地址、DNS 查询等任何可还原用户行为的字段(无日志口径)。
// 3. 本文件冻结后,任何 breaking change 须先通过 buf breaking 审查。
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.36.4
// protoc (unknown)
// source: pangolin/agent/v1/agent.proto
package agentv1
import (
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
timestamppb "google.golang.org/protobuf/types/known/timestamppb"
reflect "reflect"
sync "sync"
unsafe "unsafe"
)
const (
// Verify that this generated code is sufficiently up-to-date.
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
// Verify that runtime/protoimpl is sufficiently up-to-date.
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)
type Lifecycle_Action int32
const (
Lifecycle_ACTION_UNSPECIFIED Lifecycle_Action = 0
// ACTION_DRAIN 停止接受新连接,等待存量连接自然结束。
Lifecycle_ACTION_DRAIN Lifecycle_Action = 1
// ACTION_SHUTDOWN 立即停止所有服务并退出进程。
Lifecycle_ACTION_SHUTDOWN Lifecycle_Action = 2
)
// Enum value maps for Lifecycle_Action.
var (
Lifecycle_Action_name = map[int32]string{
0: "ACTION_UNSPECIFIED",
1: "ACTION_DRAIN",
2: "ACTION_SHUTDOWN",
}
Lifecycle_Action_value = map[string]int32{
"ACTION_UNSPECIFIED": 0,
"ACTION_DRAIN": 1,
"ACTION_SHUTDOWN": 2,
}
)
func (x Lifecycle_Action) Enum() *Lifecycle_Action {
p := new(Lifecycle_Action)
*p = x
return p
}
func (x Lifecycle_Action) String() string {
return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}
func (Lifecycle_Action) Descriptor() protoreflect.EnumDescriptor {
return file_pangolin_agent_v1_agent_proto_enumTypes[0].Descriptor()
}
func (Lifecycle_Action) Type() protoreflect.EnumType {
return &file_pangolin_agent_v1_agent_proto_enumTypes[0]
}
func (x Lifecycle_Action) Number() protoreflect.EnumNumber {
return protoreflect.EnumNumber(x)
}
// Deprecated: Use Lifecycle_Action.Descriptor instead.
func (Lifecycle_Action) EnumDescriptor() ([]byte, []int) {
return file_pangolin_agent_v1_agent_proto_rawDescGZIP(), []int{12, 0}
}
type EnrollRequest struct {
state protoimpl.MessageState `protogen:"open.v1"`
// bootstrap_token 由云初始化(cloud-init)注入,单次有效,控制面验证后即失效。
BootstrapToken string `protobuf:"bytes,1,opt,name=bootstrap_token,json=bootstrapToken,proto3" json:"bootstrap_token,omitempty"`
// csr_pem 是 Agent 生成的 X.509 证书签名请求(PEM 编码)。
CsrPem string `protobuf:"bytes,2,opt,name=csr_pem,json=csrPem,proto3" json:"csr_pem,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *EnrollRequest) Reset() {
*x = EnrollRequest{}
mi := &file_pangolin_agent_v1_agent_proto_msgTypes[0]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *EnrollRequest) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*EnrollRequest) ProtoMessage() {}
func (x *EnrollRequest) ProtoReflect() protoreflect.Message {
mi := &file_pangolin_agent_v1_agent_proto_msgTypes[0]
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 EnrollRequest.ProtoReflect.Descriptor instead.
func (*EnrollRequest) Descriptor() ([]byte, []int) {
return file_pangolin_agent_v1_agent_proto_rawDescGZIP(), []int{0}
}
func (x *EnrollRequest) GetBootstrapToken() string {
if x != nil {
return x.BootstrapToken
}
return ""
}
func (x *EnrollRequest) GetCsrPem() string {
if x != nil {
return x.CsrPem
}
return ""
}
type EnrollResponse struct {
state protoimpl.MessageState `protogen:"open.v1"`
// cert_pem 是控制面签发的节点证书(PEM 编码)。
CertPem string `protobuf:"bytes,1,opt,name=cert_pem,json=certPem,proto3" json:"cert_pem,omitempty"`
// ca_pem 是控制面 CA 证书链(PEM 编码),供 Agent 验证后续 TLS。
CaPem string `protobuf:"bytes,2,opt,name=ca_pem,json=caPem,proto3" json:"ca_pem,omitempty"`
// not_after 是证书过期时间,Agent 应在到期前主动轮换。
NotAfter *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=not_after,json=notAfter,proto3" json:"not_after,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *EnrollResponse) Reset() {
*x = EnrollResponse{}
mi := &file_pangolin_agent_v1_agent_proto_msgTypes[1]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *EnrollResponse) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*EnrollResponse) ProtoMessage() {}
func (x *EnrollResponse) ProtoReflect() protoreflect.Message {
mi := &file_pangolin_agent_v1_agent_proto_msgTypes[1]
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 EnrollResponse.ProtoReflect.Descriptor instead.
func (*EnrollResponse) Descriptor() ([]byte, []int) {
return file_pangolin_agent_v1_agent_proto_rawDescGZIP(), []int{1}
}
func (x *EnrollResponse) GetCertPem() string {
if x != nil {
return x.CertPem
}
return ""
}
func (x *EnrollResponse) GetCaPem() string {
if x != nil {
return x.CaPem
}
return ""
}
func (x *EnrollResponse) GetNotAfter() *timestamppb.Timestamp {
if x != nil {
return x.NotAfter
}
return nil
}
type RegisterRequest struct {
state protoimpl.MessageState `protogen:"open.v1"`
// agent_version 是 Agent 的语义化版本字符串,例如 "1.2.3"。
AgentVersion string `protobuf:"bytes,1,opt,name=agent_version,json=agentVersion,proto3" json:"agent_version,omitempty"`
// capabilities 描述 Agent 支持的功能集,例如 ["hysteria2", "reality"]。
Capabilities []string `protobuf:"bytes,2,rep,name=capabilities,proto3" json:"capabilities,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *RegisterRequest) Reset() {
*x = RegisterRequest{}
mi := &file_pangolin_agent_v1_agent_proto_msgTypes[2]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *RegisterRequest) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*RegisterRequest) ProtoMessage() {}
func (x *RegisterRequest) ProtoReflect() protoreflect.Message {
mi := &file_pangolin_agent_v1_agent_proto_msgTypes[2]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use RegisterRequest.ProtoReflect.Descriptor instead.
func (*RegisterRequest) Descriptor() ([]byte, []int) {
return file_pangolin_agent_v1_agent_proto_rawDescGZIP(), []int{2}
}
func (x *RegisterRequest) GetAgentVersion() string {
if x != nil {
return x.AgentVersion
}
return ""
}
func (x *RegisterRequest) GetCapabilities() []string {
if x != nil {
return x.Capabilities
}
return nil
}
type HeartbeatRequest struct {
state protoimpl.MessageState `protogen:"open.v1"`
// load 是节点实时负载快照。
Load *NodeLoad `protobuf:"bytes,1,opt,name=load,proto3" json:"load,omitempty"`
// config_version 是 Agent 当前持有的配置版本号,用于对账。
ConfigVersion uint64 `protobuf:"varint,2,opt,name=config_version,json=configVersion,proto3" json:"config_version,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *HeartbeatRequest) Reset() {
*x = HeartbeatRequest{}
mi := &file_pangolin_agent_v1_agent_proto_msgTypes[3]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *HeartbeatRequest) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*HeartbeatRequest) ProtoMessage() {}
func (x *HeartbeatRequest) ProtoReflect() protoreflect.Message {
mi := &file_pangolin_agent_v1_agent_proto_msgTypes[3]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use HeartbeatRequest.ProtoReflect.Descriptor instead.
func (*HeartbeatRequest) Descriptor() ([]byte, []int) {
return file_pangolin_agent_v1_agent_proto_rawDescGZIP(), []int{3}
}
func (x *HeartbeatRequest) GetLoad() *NodeLoad {
if x != nil {
return x.Load
}
return nil
}
func (x *HeartbeatRequest) GetConfigVersion() uint64 {
if x != nil {
return x.ConfigVersion
}
return 0
}
type HeartbeatResponse struct {
state protoimpl.MessageState `protogen:"open.v1"`
// need_full_resync 为 true 时,Agent 应重新调用 Register 获取全量配置。
NeedFullResync bool `protobuf:"varint,1,opt,name=need_full_resync,json=needFullResync,proto3" json:"need_full_resync,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *HeartbeatResponse) Reset() {
*x = HeartbeatResponse{}
mi := &file_pangolin_agent_v1_agent_proto_msgTypes[4]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *HeartbeatResponse) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*HeartbeatResponse) ProtoMessage() {}
func (x *HeartbeatResponse) ProtoReflect() protoreflect.Message {
mi := &file_pangolin_agent_v1_agent_proto_msgTypes[4]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use HeartbeatResponse.ProtoReflect.Descriptor instead.
func (*HeartbeatResponse) Descriptor() ([]byte, []int) {
return file_pangolin_agent_v1_agent_proto_rawDescGZIP(), []int{4}
}
func (x *HeartbeatResponse) GetNeedFullResync() bool {
if x != nil {
return x.NeedFullResync
}
return false
}
// NodeLoad 节点实时负载,由 Heartbeat 携带。
type NodeLoad struct {
state protoimpl.MessageState `protogen:"open.v1"`
// online_count 是当前在线连接数(代理隧道数)。
OnlineCount uint32 `protobuf:"varint,1,opt,name=online_count,json=onlineCount,proto3" json:"online_count,omitempty"`
// bandwidth_up 是上行带宽(bytes/s)。
BandwidthUp uint64 `protobuf:"varint,2,opt,name=bandwidth_up,json=bandwidthUp,proto3" json:"bandwidth_up,omitempty"`
// bandwidth_down 是下行带宽(bytes/s)。
BandwidthDown uint64 `protobuf:"varint,3,opt,name=bandwidth_down,json=bandwidthDown,proto3" json:"bandwidth_down,omitempty"`
// cpu_percent 是 CPU 使用率(0100)。
CpuPercent float32 `protobuf:"fixed32,4,opt,name=cpu_percent,json=cpuPercent,proto3" json:"cpu_percent,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *NodeLoad) Reset() {
*x = NodeLoad{}
mi := &file_pangolin_agent_v1_agent_proto_msgTypes[5]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *NodeLoad) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*NodeLoad) ProtoMessage() {}
func (x *NodeLoad) ProtoReflect() protoreflect.Message {
mi := &file_pangolin_agent_v1_agent_proto_msgTypes[5]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use NodeLoad.ProtoReflect.Descriptor instead.
func (*NodeLoad) Descriptor() ([]byte, []int) {
return file_pangolin_agent_v1_agent_proto_rawDescGZIP(), []int{5}
}
func (x *NodeLoad) GetOnlineCount() uint32 {
if x != nil {
return x.OnlineCount
}
return 0
}
func (x *NodeLoad) GetBandwidthUp() uint64 {
if x != nil {
return x.BandwidthUp
}
return 0
}
func (x *NodeLoad) GetBandwidthDown() uint64 {
if x != nil {
return x.BandwidthDown
}
return 0
}
func (x *NodeLoad) GetCpuPercent() float32 {
if x != nil {
return x.CpuPercent
}
return 0
}
type SubscribeRequest struct {
state protoimpl.MessageState `protogen:"open.v1"`
// last_command_id 是 Agent 已成功处理的最后一个命令 ID。
// 首次订阅传 0,控制面将从头补发未 Ack 的命令。
LastCommandId uint64 `protobuf:"varint,1,opt,name=last_command_id,json=lastCommandId,proto3" json:"last_command_id,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *SubscribeRequest) Reset() {
*x = SubscribeRequest{}
mi := &file_pangolin_agent_v1_agent_proto_msgTypes[6]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *SubscribeRequest) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*SubscribeRequest) ProtoMessage() {}
func (x *SubscribeRequest) ProtoReflect() protoreflect.Message {
mi := &file_pangolin_agent_v1_agent_proto_msgTypes[6]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use SubscribeRequest.ProtoReflect.Descriptor instead.
func (*SubscribeRequest) Descriptor() ([]byte, []int) {
return file_pangolin_agent_v1_agent_proto_rawDescGZIP(), []int{6}
}
func (x *SubscribeRequest) GetLastCommandId() uint64 {
if x != nil {
return x.LastCommandId
}
return 0
}
// Command 是控制面下发给 Agent 的指令,at-least-once 投递语义。
// command_id 单调递增,Agent 根据 last_command_id 实现幂等去重。
type Command struct {
state protoimpl.MessageState `protogen:"open.v1"`
// command_id 全局单调递增,用于续传与去重。
CommandId uint64 `protobuf:"varint,1,opt,name=command_id,json=commandId,proto3" json:"command_id,omitempty"`
// Types that are valid to be assigned to Payload:
//
// *Command_UpsertCredential
// *Command_RevokeCredential
// *Command_RotateCredential
// *Command_ApplyConfig
// *Command_Lifecycle
Payload isCommand_Payload `protobuf_oneof:"payload"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *Command) Reset() {
*x = Command{}
mi := &file_pangolin_agent_v1_agent_proto_msgTypes[7]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *Command) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*Command) ProtoMessage() {}
func (x *Command) ProtoReflect() protoreflect.Message {
mi := &file_pangolin_agent_v1_agent_proto_msgTypes[7]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use Command.ProtoReflect.Descriptor instead.
func (*Command) Descriptor() ([]byte, []int) {
return file_pangolin_agent_v1_agent_proto_rawDescGZIP(), []int{7}
}
func (x *Command) GetCommandId() uint64 {
if x != nil {
return x.CommandId
}
return 0
}
func (x *Command) GetPayload() isCommand_Payload {
if x != nil {
return x.Payload
}
return nil
}
func (x *Command) GetUpsertCredential() *UpsertCredential {
if x != nil {
if x, ok := x.Payload.(*Command_UpsertCredential); ok {
return x.UpsertCredential
}
}
return nil
}
func (x *Command) GetRevokeCredential() *RevokeCredential {
if x != nil {
if x, ok := x.Payload.(*Command_RevokeCredential); ok {
return x.RevokeCredential
}
}
return nil
}
func (x *Command) GetRotateCredential() *RotateCredential {
if x != nil {
if x, ok := x.Payload.(*Command_RotateCredential); ok {
return x.RotateCredential
}
}
return nil
}
func (x *Command) GetApplyConfig() *ApplyConfig {
if x != nil {
if x, ok := x.Payload.(*Command_ApplyConfig); ok {
return x.ApplyConfig
}
}
return nil
}
func (x *Command) GetLifecycle() *Lifecycle {
if x != nil {
if x, ok := x.Payload.(*Command_Lifecycle); ok {
return x.Lifecycle
}
}
return nil
}
type isCommand_Payload interface {
isCommand_Payload()
}
type Command_UpsertCredential struct {
UpsertCredential *UpsertCredential `protobuf:"bytes,2,opt,name=upsert_credential,json=upsertCredential,proto3,oneof"`
}
type Command_RevokeCredential struct {
RevokeCredential *RevokeCredential `protobuf:"bytes,3,opt,name=revoke_credential,json=revokeCredential,proto3,oneof"`
}
type Command_RotateCredential struct {
RotateCredential *RotateCredential `protobuf:"bytes,4,opt,name=rotate_credential,json=rotateCredential,proto3,oneof"`
}
type Command_ApplyConfig struct {
ApplyConfig *ApplyConfig `protobuf:"bytes,5,opt,name=apply_config,json=applyConfig,proto3,oneof"`
}
type Command_Lifecycle struct {
Lifecycle *Lifecycle `protobuf:"bytes,6,opt,name=lifecycle,proto3,oneof"`
}
func (*Command_UpsertCredential) isCommand_Payload() {}
func (*Command_RevokeCredential) isCommand_Payload() {}
func (*Command_RotateCredential) isCommand_Payload() {}
func (*Command_ApplyConfig) isCommand_Payload() {}
func (*Command_Lifecycle) isCommand_Payload() {}
// UpsertCredential 新增或更新数据通道凭证。
// 红线:只含 dp_uuid,不含 user_id / email。
type UpsertCredential struct {
state protoimpl.MessageState `protogen:"open.v1"`
// dp_uuid 是数据通道的唯一标识符(Data-Plane UUID)。
DpUuid string `protobuf:"bytes,1,opt,name=dp_uuid,json=dpUuid,proto3" json:"dp_uuid,omitempty"`
// expires_at 是凭证到期时间,到期后 Agent 应拒绝该 dp_uuid 的连接请求。
ExpiresAt *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=expires_at,json=expiresAt,proto3" json:"expires_at,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *UpsertCredential) Reset() {
*x = UpsertCredential{}
mi := &file_pangolin_agent_v1_agent_proto_msgTypes[8]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *UpsertCredential) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*UpsertCredential) ProtoMessage() {}
func (x *UpsertCredential) ProtoReflect() protoreflect.Message {
mi := &file_pangolin_agent_v1_agent_proto_msgTypes[8]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use UpsertCredential.ProtoReflect.Descriptor instead.
func (*UpsertCredential) Descriptor() ([]byte, []int) {
return file_pangolin_agent_v1_agent_proto_rawDescGZIP(), []int{8}
}
func (x *UpsertCredential) GetDpUuid() string {
if x != nil {
return x.DpUuid
}
return ""
}
func (x *UpsertCredential) GetExpiresAt() *timestamppb.Timestamp {
if x != nil {
return x.ExpiresAt
}
return nil
}
// RevokeCredential 立即吊销数据通道凭证,Agent 应断开对应连接。
// 红线:只含 dp_uuid,不含 user_id / email。
type RevokeCredential struct {
state protoimpl.MessageState `protogen:"open.v1"`
DpUuid string `protobuf:"bytes,1,opt,name=dp_uuid,json=dpUuid,proto3" json:"dp_uuid,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *RevokeCredential) Reset() {
*x = RevokeCredential{}
mi := &file_pangolin_agent_v1_agent_proto_msgTypes[9]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *RevokeCredential) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*RevokeCredential) ProtoMessage() {}
func (x *RevokeCredential) ProtoReflect() protoreflect.Message {
mi := &file_pangolin_agent_v1_agent_proto_msgTypes[9]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use RevokeCredential.ProtoReflect.Descriptor instead.
func (*RevokeCredential) Descriptor() ([]byte, []int) {
return file_pangolin_agent_v1_agent_proto_rawDescGZIP(), []int{9}
}
func (x *RevokeCredential) GetDpUuid() string {
if x != nil {
return x.DpUuid
}
return ""
}
// RotateCredential 原子替换凭证,grace_seconds 内新旧 dp_uuid 均有效。
// 红线:只含 dp_uuid,不含 user_id / email。
type RotateCredential struct {
state protoimpl.MessageState `protogen:"open.v1"`
OldDpUuid string `protobuf:"bytes,1,opt,name=old_dp_uuid,json=oldDpUuid,proto3" json:"old_dp_uuid,omitempty"`
NewDpUuid string `protobuf:"bytes,2,opt,name=new_dp_uuid,json=newDpUuid,proto3" json:"new_dp_uuid,omitempty"`
// grace_seconds 是新旧凭证共存的宽限期(秒),到期后 old_dp_uuid 自动失效。
GraceSeconds uint32 `protobuf:"varint,3,opt,name=grace_seconds,json=graceSeconds,proto3" json:"grace_seconds,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *RotateCredential) Reset() {
*x = RotateCredential{}
mi := &file_pangolin_agent_v1_agent_proto_msgTypes[10]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *RotateCredential) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*RotateCredential) ProtoMessage() {}
func (x *RotateCredential) ProtoReflect() protoreflect.Message {
mi := &file_pangolin_agent_v1_agent_proto_msgTypes[10]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use RotateCredential.ProtoReflect.Descriptor instead.
func (*RotateCredential) Descriptor() ([]byte, []int) {
return file_pangolin_agent_v1_agent_proto_rawDescGZIP(), []int{10}
}
func (x *RotateCredential) GetOldDpUuid() string {
if x != nil {
return x.OldDpUuid
}
return ""
}
func (x *RotateCredential) GetNewDpUuid() string {
if x != nil {
return x.NewDpUuid
}
return ""
}
func (x *RotateCredential) GetGraceSeconds() uint32 {
if x != nil {
return x.GraceSeconds
}
return 0
}
// ApplyConfig 将一份完整的 ConfigSnapshot 应用到 Agent。
type ApplyConfig struct {
state protoimpl.MessageState `protogen:"open.v1"`
Config *ConfigSnapshot `protobuf:"bytes,1,opt,name=config,proto3" json:"config,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *ApplyConfig) Reset() {
*x = ApplyConfig{}
mi := &file_pangolin_agent_v1_agent_proto_msgTypes[11]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *ApplyConfig) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*ApplyConfig) ProtoMessage() {}
func (x *ApplyConfig) ProtoReflect() protoreflect.Message {
mi := &file_pangolin_agent_v1_agent_proto_msgTypes[11]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use ApplyConfig.ProtoReflect.Descriptor instead.
func (*ApplyConfig) Descriptor() ([]byte, []int) {
return file_pangolin_agent_v1_agent_proto_rawDescGZIP(), []int{11}
}
func (x *ApplyConfig) GetConfig() *ConfigSnapshot {
if x != nil {
return x.Config
}
return nil
}
// Lifecycle 控制节点生命周期。
type Lifecycle struct {
state protoimpl.MessageState `protogen:"open.v1"`
Action Lifecycle_Action `protobuf:"varint,1,opt,name=action,proto3,enum=pangolin.agent.v1.Lifecycle_Action" json:"action,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *Lifecycle) Reset() {
*x = Lifecycle{}
mi := &file_pangolin_agent_v1_agent_proto_msgTypes[12]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *Lifecycle) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*Lifecycle) ProtoMessage() {}
func (x *Lifecycle) ProtoReflect() protoreflect.Message {
mi := &file_pangolin_agent_v1_agent_proto_msgTypes[12]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use Lifecycle.ProtoReflect.Descriptor instead.
func (*Lifecycle) Descriptor() ([]byte, []int) {
return file_pangolin_agent_v1_agent_proto_rawDescGZIP(), []int{12}
}
func (x *Lifecycle) GetAction() Lifecycle_Action {
if x != nil {
return x.Action
}
return Lifecycle_ACTION_UNSPECIFIED
}
// ConfigSnapshot 是节点运行所需的全量配置,由 Register 返回或 ApplyConfig 下发。
type ConfigSnapshot struct {
state protoimpl.MessageState `protogen:"open.v1"`
// config_version 单调递增,Agent 使用此版本号与控制面对账。
ConfigVersion uint64 `protobuf:"varint,1,opt,name=config_version,json=configVersion,proto3" json:"config_version,omitempty"`
// credentials 是当前有效的数据通道凭证列表。
// 红线:只含 dp_uuid,不含 user_id / email。
Credentials []*CredentialEntry `protobuf:"bytes,2,rep,name=credentials,proto3" json:"credentials,omitempty"`
// reality_sni 是 REALITY 协议使用的 SNI 域名(例如 "www.example.com")。
RealitySni string `protobuf:"bytes,3,opt,name=reality_sni,json=realitySni,proto3" json:"reality_sni,omitempty"`
// hy2_port_start / hy2_port_end 是 Hysteria2 监听的 UDP 端口范围。
Hy2PortStart uint32 `protobuf:"varint,4,opt,name=hy2_port_start,json=hy2PortStart,proto3" json:"hy2_port_start,omitempty"`
Hy2PortEnd uint32 `protobuf:"varint,5,opt,name=hy2_port_end,json=hy2PortEnd,proto3" json:"hy2_port_end,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *ConfigSnapshot) Reset() {
*x = ConfigSnapshot{}
mi := &file_pangolin_agent_v1_agent_proto_msgTypes[13]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *ConfigSnapshot) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*ConfigSnapshot) ProtoMessage() {}
func (x *ConfigSnapshot) ProtoReflect() protoreflect.Message {
mi := &file_pangolin_agent_v1_agent_proto_msgTypes[13]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use ConfigSnapshot.ProtoReflect.Descriptor instead.
func (*ConfigSnapshot) Descriptor() ([]byte, []int) {
return file_pangolin_agent_v1_agent_proto_rawDescGZIP(), []int{13}
}
func (x *ConfigSnapshot) GetConfigVersion() uint64 {
if x != nil {
return x.ConfigVersion
}
return 0
}
func (x *ConfigSnapshot) GetCredentials() []*CredentialEntry {
if x != nil {
return x.Credentials
}
return nil
}
func (x *ConfigSnapshot) GetRealitySni() string {
if x != nil {
return x.RealitySni
}
return ""
}
func (x *ConfigSnapshot) GetHy2PortStart() uint32 {
if x != nil {
return x.Hy2PortStart
}
return 0
}
func (x *ConfigSnapshot) GetHy2PortEnd() uint32 {
if x != nil {
return x.Hy2PortEnd
}
return 0
}
// CredentialEntry 单条数据通道凭证。
// 红线:只含 dp_uuid 与有效期,不含 user_id / email。
type CredentialEntry struct {
state protoimpl.MessageState `protogen:"open.v1"`
DpUuid string `protobuf:"bytes,1,opt,name=dp_uuid,json=dpUuid,proto3" json:"dp_uuid,omitempty"`
ExpiresAt *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=expires_at,json=expiresAt,proto3" json:"expires_at,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *CredentialEntry) Reset() {
*x = CredentialEntry{}
mi := &file_pangolin_agent_v1_agent_proto_msgTypes[14]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *CredentialEntry) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*CredentialEntry) ProtoMessage() {}
func (x *CredentialEntry) ProtoReflect() protoreflect.Message {
mi := &file_pangolin_agent_v1_agent_proto_msgTypes[14]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use CredentialEntry.ProtoReflect.Descriptor instead.
func (*CredentialEntry) Descriptor() ([]byte, []int) {
return file_pangolin_agent_v1_agent_proto_rawDescGZIP(), []int{14}
}
func (x *CredentialEntry) GetDpUuid() string {
if x != nil {
return x.DpUuid
}
return ""
}
func (x *CredentialEntry) GetExpiresAt() *timestamppb.Timestamp {
if x != nil {
return x.ExpiresAt
}
return nil
}
type AckRequest struct {
state protoimpl.MessageState `protogen:"open.v1"`
CommandId uint64 `protobuf:"varint,1,opt,name=command_id,json=commandId,proto3" json:"command_id,omitempty"`
Ok bool `protobuf:"varint,2,opt,name=ok,proto3" json:"ok,omitempty"`
// error_message 仅在 ok == false 时填写,描述失败原因。
ErrorMessage string `protobuf:"bytes,3,opt,name=error_message,json=errorMessage,proto3" json:"error_message,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *AckRequest) Reset() {
*x = AckRequest{}
mi := &file_pangolin_agent_v1_agent_proto_msgTypes[15]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *AckRequest) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*AckRequest) ProtoMessage() {}
func (x *AckRequest) ProtoReflect() protoreflect.Message {
mi := &file_pangolin_agent_v1_agent_proto_msgTypes[15]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use AckRequest.ProtoReflect.Descriptor instead.
func (*AckRequest) Descriptor() ([]byte, []int) {
return file_pangolin_agent_v1_agent_proto_rawDescGZIP(), []int{15}
}
func (x *AckRequest) GetCommandId() uint64 {
if x != nil {
return x.CommandId
}
return 0
}
func (x *AckRequest) GetOk() bool {
if x != nil {
return x.Ok
}
return false
}
func (x *AckRequest) GetErrorMessage() string {
if x != nil {
return x.ErrorMessage
}
return ""
}
type AckResponse struct {
state protoimpl.MessageState `protogen:"open.v1"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *AckResponse) Reset() {
*x = AckResponse{}
mi := &file_pangolin_agent_v1_agent_proto_msgTypes[16]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *AckResponse) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*AckResponse) ProtoMessage() {}
func (x *AckResponse) ProtoReflect() protoreflect.Message {
mi := &file_pangolin_agent_v1_agent_proto_msgTypes[16]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use AckResponse.ProtoReflect.Descriptor instead.
func (*AckResponse) Descriptor() ([]byte, []int) {
return file_pangolin_agent_v1_agent_proto_rawDescGZIP(), []int{16}
}
type ReportUsageRequest struct {
state protoimpl.MessageState `protogen:"open.v1"`
Items []*UsageItem `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *ReportUsageRequest) Reset() {
*x = ReportUsageRequest{}
mi := &file_pangolin_agent_v1_agent_proto_msgTypes[17]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *ReportUsageRequest) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*ReportUsageRequest) ProtoMessage() {}
func (x *ReportUsageRequest) ProtoReflect() protoreflect.Message {
mi := &file_pangolin_agent_v1_agent_proto_msgTypes[17]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use ReportUsageRequest.ProtoReflect.Descriptor instead.
func (*ReportUsageRequest) Descriptor() ([]byte, []int) {
return file_pangolin_agent_v1_agent_proto_rawDescGZIP(), []int{17}
}
func (x *ReportUsageRequest) GetItems() []*UsageItem {
if x != nil {
return x.Items
}
return nil
}
// UsageItem 单个数据通道的用量记录。
// 红线:只含 dp_uuid 与流量计数,不含目的地址、DNS 查询等可还原用户行为的字段。
type UsageItem struct {
state protoimpl.MessageState `protogen:"open.v1"`
DpUuid string `protobuf:"bytes,1,opt,name=dp_uuid,json=dpUuid,proto3" json:"dp_uuid,omitempty"`
BytesUp uint64 `protobuf:"varint,2,opt,name=bytes_up,json=bytesUp,proto3" json:"bytes_up,omitempty"`
BytesDown uint64 `protobuf:"varint,3,opt,name=bytes_down,json=bytesDown,proto3" json:"bytes_down,omitempty"`
Minutes uint32 `protobuf:"varint,4,opt,name=minutes,proto3" json:"minutes,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *UsageItem) Reset() {
*x = UsageItem{}
mi := &file_pangolin_agent_v1_agent_proto_msgTypes[18]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *UsageItem) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*UsageItem) ProtoMessage() {}
func (x *UsageItem) ProtoReflect() protoreflect.Message {
mi := &file_pangolin_agent_v1_agent_proto_msgTypes[18]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use UsageItem.ProtoReflect.Descriptor instead.
func (*UsageItem) Descriptor() ([]byte, []int) {
return file_pangolin_agent_v1_agent_proto_rawDescGZIP(), []int{18}
}
func (x *UsageItem) GetDpUuid() string {
if x != nil {
return x.DpUuid
}
return ""
}
func (x *UsageItem) GetBytesUp() uint64 {
if x != nil {
return x.BytesUp
}
return 0
}
func (x *UsageItem) GetBytesDown() uint64 {
if x != nil {
return x.BytesDown
}
return 0
}
func (x *UsageItem) GetMinutes() uint32 {
if x != nil {
return x.Minutes
}
return 0
}
type ReportUsageResponse struct {
state protoimpl.MessageState `protogen:"open.v1"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *ReportUsageResponse) Reset() {
*x = ReportUsageResponse{}
mi := &file_pangolin_agent_v1_agent_proto_msgTypes[19]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *ReportUsageResponse) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*ReportUsageResponse) ProtoMessage() {}
func (x *ReportUsageResponse) ProtoReflect() protoreflect.Message {
mi := &file_pangolin_agent_v1_agent_proto_msgTypes[19]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use ReportUsageResponse.ProtoReflect.Descriptor instead.
func (*ReportUsageResponse) Descriptor() ([]byte, []int) {
return file_pangolin_agent_v1_agent_proto_rawDescGZIP(), []int{19}
}
var File_pangolin_agent_v1_agent_proto protoreflect.FileDescriptor
var file_pangolin_agent_v1_agent_proto_rawDesc = string([]byte{
0x0a, 0x1d, 0x70, 0x61, 0x6e, 0x67, 0x6f, 0x6c, 0x69, 0x6e, 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x74,
0x2f, 0x76, 0x31, 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12,
0x11, 0x70, 0x61, 0x6e, 0x67, 0x6f, 0x6c, 0x69, 0x6e, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e,
0x76, 0x31, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f,
0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72,
0x6f, 0x74, 0x6f, 0x22, 0x51, 0x0a, 0x0d, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x52, 0x65, 0x71,
0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x62, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61,
0x70, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x62,
0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x17, 0x0a,
0x07, 0x63, 0x73, 0x72, 0x5f, 0x70, 0x65, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06,
0x63, 0x73, 0x72, 0x50, 0x65, 0x6d, 0x22, 0x7b, 0x0a, 0x0e, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c,
0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x65, 0x72, 0x74,
0x5f, 0x70, 0x65, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x65, 0x72, 0x74,
0x50, 0x65, 0x6d, 0x12, 0x15, 0x0a, 0x06, 0x63, 0x61, 0x5f, 0x70, 0x65, 0x6d, 0x18, 0x02, 0x20,
0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x61, 0x50, 0x65, 0x6d, 0x12, 0x37, 0x0a, 0x09, 0x6e, 0x6f,
0x74, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e,
0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x08, 0x6e, 0x6f, 0x74, 0x41, 0x66,
0x74, 0x65, 0x72, 0x22, 0x5a, 0x0a, 0x0f, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52,
0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f,
0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61,
0x67, 0x65, 0x6e, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x63,
0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28,
0x09, 0x52, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x22,
0x6a, 0x0a, 0x10, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x52, 0x65, 0x71, 0x75,
0x65, 0x73, 0x74, 0x12, 0x2f, 0x0a, 0x04, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
0x0b, 0x32, 0x1b, 0x2e, 0x70, 0x61, 0x6e, 0x67, 0x6f, 0x6c, 0x69, 0x6e, 0x2e, 0x61, 0x67, 0x65,
0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x4c, 0x6f, 0x61, 0x64, 0x52, 0x04,
0x6c, 0x6f, 0x61, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x76,
0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x63, 0x6f,
0x6e, 0x66, 0x69, 0x67, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3d, 0x0a, 0x11, 0x48,
0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
0x12, 0x28, 0x0a, 0x10, 0x6e, 0x65, 0x65, 0x64, 0x5f, 0x66, 0x75, 0x6c, 0x6c, 0x5f, 0x72, 0x65,
0x73, 0x79, 0x6e, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x6e, 0x65, 0x65, 0x64,
0x46, 0x75, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x79, 0x6e, 0x63, 0x22, 0x98, 0x01, 0x0a, 0x08, 0x4e,
0x6f, 0x64, 0x65, 0x4c, 0x6f, 0x61, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x6f, 0x6e, 0x6c, 0x69, 0x6e,
0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x6f,
0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x61,
0x6e, 0x64, 0x77, 0x69, 0x64, 0x74, 0x68, 0x5f, 0x75, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04,
0x52, 0x0b, 0x62, 0x61, 0x6e, 0x64, 0x77, 0x69, 0x64, 0x74, 0x68, 0x55, 0x70, 0x12, 0x25, 0x0a,
0x0e, 0x62, 0x61, 0x6e, 0x64, 0x77, 0x69, 0x64, 0x74, 0x68, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x18,
0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x62, 0x61, 0x6e, 0x64, 0x77, 0x69, 0x64, 0x74, 0x68,
0x44, 0x6f, 0x77, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x70, 0x75, 0x5f, 0x70, 0x65, 0x72, 0x63,
0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0a, 0x63, 0x70, 0x75, 0x50, 0x65,
0x72, 0x63, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x0a, 0x10, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69,
0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x6c, 0x61, 0x73,
0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,
0x28, 0x04, 0x52, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49,
0x64, 0x22, 0xb2, 0x03, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x1d, 0x0a,
0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
0x04, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x64, 0x12, 0x52, 0x0a, 0x11,
0x75, 0x70, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61,
0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x70, 0x61, 0x6e, 0x67, 0x6f, 0x6c,
0x69, 0x6e, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x73, 0x65,
0x72, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x48, 0x00, 0x52, 0x10,
0x75, 0x70, 0x73, 0x65, 0x72, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c,
0x12, 0x52, 0x0a, 0x11, 0x72, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x5f, 0x63, 0x72, 0x65, 0x64, 0x65,
0x6e, 0x74, 0x69, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x70, 0x61,
0x6e, 0x67, 0x6f, 0x6c, 0x69, 0x6e, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e,
0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c,
0x48, 0x00, 0x52, 0x10, 0x72, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e,
0x74, 0x69, 0x61, 0x6c, 0x12, 0x52, 0x0a, 0x11, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x63,
0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32,
0x23, 0x2e, 0x70, 0x61, 0x6e, 0x67, 0x6f, 0x6c, 0x69, 0x6e, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74,
0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e,
0x74, 0x69, 0x61, 0x6c, 0x48, 0x00, 0x52, 0x10, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x43, 0x72,
0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, 0x43, 0x0a, 0x0c, 0x61, 0x70, 0x70, 0x6c,
0x79, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e,
0x2e, 0x70, 0x61, 0x6e, 0x67, 0x6f, 0x6c, 0x69, 0x6e, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e,
0x76, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00,
0x52, 0x0b, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x3c, 0x0a,
0x09, 0x6c, 0x69, 0x66, 0x65, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b,
0x32, 0x1c, 0x2e, 0x70, 0x61, 0x6e, 0x67, 0x6f, 0x6c, 0x69, 0x6e, 0x2e, 0x61, 0x67, 0x65, 0x6e,
0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x66, 0x65, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x48, 0x00,
0x52, 0x09, 0x6c, 0x69, 0x66, 0x65, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x70,
0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x66, 0x0a, 0x10, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74,
0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x70,
0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x70, 0x55,
0x75, 0x69, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x61,
0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74,
0x61, 0x6d, 0x70, 0x52, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x22, 0x2b,
0x0a, 0x10, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69,
0x61, 0x6c, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x70, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20,
0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x70, 0x55, 0x75, 0x69, 0x64, 0x22, 0x77, 0x0a, 0x10, 0x52,
0x6f, 0x74, 0x61, 0x74, 0x65, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12,
0x1e, 0x0a, 0x0b, 0x6f, 0x6c, 0x64, 0x5f, 0x64, 0x70, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01,
0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6f, 0x6c, 0x64, 0x44, 0x70, 0x55, 0x75, 0x69, 0x64, 0x12,
0x1e, 0x0a, 0x0b, 0x6e, 0x65, 0x77, 0x5f, 0x64, 0x70, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x02,
0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x65, 0x77, 0x44, 0x70, 0x55, 0x75, 0x69, 0x64, 0x12,
0x23, 0x0a, 0x0d, 0x67, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73,
0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x67, 0x72, 0x61, 0x63, 0x65, 0x53, 0x65, 0x63,
0x6f, 0x6e, 0x64, 0x73, 0x22, 0x48, 0x0a, 0x0b, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x43, 0x6f, 0x6e,
0x66, 0x69, 0x67, 0x12, 0x39, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20,
0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x61, 0x6e, 0x67, 0x6f, 0x6c, 0x69, 0x6e, 0x2e, 0x61,
0x67, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x6e,
0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x91,
0x01, 0x0a, 0x09, 0x4c, 0x69, 0x66, 0x65, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x12, 0x3b, 0x0a, 0x06,
0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x70,
0x61, 0x6e, 0x67, 0x6f, 0x6c, 0x69, 0x6e, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31,
0x2e, 0x4c, 0x69, 0x66, 0x65, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f,
0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x47, 0x0a, 0x06, 0x41, 0x63, 0x74,
0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x12, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e,
0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x41,
0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x52, 0x41, 0x49, 0x4e, 0x10, 0x01, 0x12, 0x13, 0x0a,
0x0f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x48, 0x55, 0x54, 0x44, 0x4f, 0x57, 0x4e,
0x10, 0x02, 0x22, 0xe6, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x6e, 0x61,
0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f,
0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x63,
0x6f, 0x6e, 0x66, 0x69, 0x67, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x44, 0x0a, 0x0b,
0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28,
0x0b, 0x32, 0x22, 0x2e, 0x70, 0x61, 0x6e, 0x67, 0x6f, 0x6c, 0x69, 0x6e, 0x2e, 0x61, 0x67, 0x65,
0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c,
0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61,
0x6c, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x6e,
0x69, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x61, 0x6c, 0x69, 0x74, 0x79,
0x53, 0x6e, 0x69, 0x12, 0x24, 0x0a, 0x0e, 0x68, 0x79, 0x32, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x5f,
0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x68, 0x79, 0x32,
0x50, 0x6f, 0x72, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x20, 0x0a, 0x0c, 0x68, 0x79, 0x32,
0x5f, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52,
0x0a, 0x68, 0x79, 0x32, 0x50, 0x6f, 0x72, 0x74, 0x45, 0x6e, 0x64, 0x22, 0x65, 0x0a, 0x0f, 0x43,
0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x17,
0x0a, 0x07, 0x64, 0x70, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
0x06, 0x64, 0x70, 0x55, 0x75, 0x69, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72,
0x65, 0x73, 0x5f, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f,
0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69,
0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73,
0x41, 0x74, 0x22, 0x60, 0x0a, 0x0a, 0x41, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01,
0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x64, 0x12,
0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12,
0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73,
0x73, 0x61, 0x67, 0x65, 0x22, 0x0d, 0x0a, 0x0b, 0x41, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f,
0x6e, 0x73, 0x65, 0x22, 0x48, 0x0a, 0x12, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x55, 0x73, 0x61,
0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x32, 0x0a, 0x05, 0x69, 0x74, 0x65,
0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x70, 0x61, 0x6e, 0x67, 0x6f,
0x6c, 0x69, 0x6e, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x61,
0x67, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x78, 0x0a,
0x09, 0x55, 0x73, 0x61, 0x67, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x70,
0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x70, 0x55,
0x75, 0x69, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x75, 0x70, 0x18,
0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x62, 0x79, 0x74, 0x65, 0x73, 0x55, 0x70, 0x12, 0x1d,
0x0a, 0x0a, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x18, 0x03, 0x20, 0x01,
0x28, 0x04, 0x52, 0x09, 0x62, 0x79, 0x74, 0x65, 0x73, 0x44, 0x6f, 0x77, 0x6e, 0x12, 0x18, 0x0a,
0x07, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07,
0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x22, 0x15, 0x0a, 0x13, 0x52, 0x65, 0x70, 0x6f, 0x72,
0x74, 0x55, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xfc,
0x03, 0x0a, 0x0c, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12,
0x4d, 0x0a, 0x06, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x12, 0x20, 0x2e, 0x70, 0x61, 0x6e, 0x67,
0x6f, 0x6c, 0x69, 0x6e, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e,
0x72, 0x6f, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x70, 0x61,
0x6e, 0x67, 0x6f, 0x6c, 0x69, 0x6e, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e,
0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x51,
0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x22, 0x2e, 0x70, 0x61, 0x6e,
0x67, 0x6f, 0x6c, 0x69, 0x6e, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x52,
0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21,
0x2e, 0x70, 0x61, 0x6e, 0x67, 0x6f, 0x6c, 0x69, 0x6e, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e,
0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f,
0x74, 0x12, 0x56, 0x0a, 0x09, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x12, 0x23,
0x2e, 0x70, 0x61, 0x6e, 0x67, 0x6f, 0x6c, 0x69, 0x6e, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e,
0x76, 0x31, 0x2e, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x52, 0x65, 0x71, 0x75,
0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x70, 0x61, 0x6e, 0x67, 0x6f, 0x6c, 0x69, 0x6e, 0x2e, 0x61,
0x67, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61,
0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x09, 0x53, 0x75, 0x62,
0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x23, 0x2e, 0x70, 0x61, 0x6e, 0x67, 0x6f, 0x6c, 0x69,
0x6e, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63,
0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x70, 0x61,
0x6e, 0x67, 0x6f, 0x6c, 0x69, 0x6e, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e,
0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x30, 0x01, 0x12, 0x44, 0x0a, 0x03, 0x41, 0x63, 0x6b,
0x12, 0x1d, 0x2e, 0x70, 0x61, 0x6e, 0x67, 0x6f, 0x6c, 0x69, 0x6e, 0x2e, 0x61, 0x67, 0x65, 0x6e,
0x74, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
0x1e, 0x2e, 0x70, 0x61, 0x6e, 0x67, 0x6f, 0x6c, 0x69, 0x6e, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74,
0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
0x5c, 0x0a, 0x0b, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x25,
0x2e, 0x70, 0x61, 0x6e, 0x67, 0x6f, 0x6c, 0x69, 0x6e, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e,
0x76, 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x55, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65,
0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x70, 0x61, 0x6e, 0x67, 0x6f, 0x6c, 0x69, 0x6e,
0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74,
0x55, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x4a, 0x5a,
0x48, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x77, 0x61, 0x6e, 0x67,
0x6a, 0x69, 0x61, 0x2f, 0x70, 0x61, 0x6e, 0x67, 0x6f, 0x6c, 0x69, 0x6e, 0x2f, 0x73, 0x65, 0x72,
0x76, 0x65, 0x72, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x70, 0x62, 0x2f,
0x70, 0x61, 0x6e, 0x67, 0x6f, 0x6c, 0x69, 0x6e, 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2f, 0x76,
0x31, 0x3b, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,
0x33,
})
var (
file_pangolin_agent_v1_agent_proto_rawDescOnce sync.Once
file_pangolin_agent_v1_agent_proto_rawDescData []byte
)
func file_pangolin_agent_v1_agent_proto_rawDescGZIP() []byte {
file_pangolin_agent_v1_agent_proto_rawDescOnce.Do(func() {
file_pangolin_agent_v1_agent_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_pangolin_agent_v1_agent_proto_rawDesc), len(file_pangolin_agent_v1_agent_proto_rawDesc)))
})
return file_pangolin_agent_v1_agent_proto_rawDescData
}
var file_pangolin_agent_v1_agent_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_pangolin_agent_v1_agent_proto_msgTypes = make([]protoimpl.MessageInfo, 20)
var file_pangolin_agent_v1_agent_proto_goTypes = []any{
(Lifecycle_Action)(0), // 0: pangolin.agent.v1.Lifecycle.Action
(*EnrollRequest)(nil), // 1: pangolin.agent.v1.EnrollRequest
(*EnrollResponse)(nil), // 2: pangolin.agent.v1.EnrollResponse
(*RegisterRequest)(nil), // 3: pangolin.agent.v1.RegisterRequest
(*HeartbeatRequest)(nil), // 4: pangolin.agent.v1.HeartbeatRequest
(*HeartbeatResponse)(nil), // 5: pangolin.agent.v1.HeartbeatResponse
(*NodeLoad)(nil), // 6: pangolin.agent.v1.NodeLoad
(*SubscribeRequest)(nil), // 7: pangolin.agent.v1.SubscribeRequest
(*Command)(nil), // 8: pangolin.agent.v1.Command
(*UpsertCredential)(nil), // 9: pangolin.agent.v1.UpsertCredential
(*RevokeCredential)(nil), // 10: pangolin.agent.v1.RevokeCredential
(*RotateCredential)(nil), // 11: pangolin.agent.v1.RotateCredential
(*ApplyConfig)(nil), // 12: pangolin.agent.v1.ApplyConfig
(*Lifecycle)(nil), // 13: pangolin.agent.v1.Lifecycle
(*ConfigSnapshot)(nil), // 14: pangolin.agent.v1.ConfigSnapshot
(*CredentialEntry)(nil), // 15: pangolin.agent.v1.CredentialEntry
(*AckRequest)(nil), // 16: pangolin.agent.v1.AckRequest
(*AckResponse)(nil), // 17: pangolin.agent.v1.AckResponse
(*ReportUsageRequest)(nil), // 18: pangolin.agent.v1.ReportUsageRequest
(*UsageItem)(nil), // 19: pangolin.agent.v1.UsageItem
(*ReportUsageResponse)(nil), // 20: pangolin.agent.v1.ReportUsageResponse
(*timestamppb.Timestamp)(nil), // 21: google.protobuf.Timestamp
}
var file_pangolin_agent_v1_agent_proto_depIdxs = []int32{
21, // 0: pangolin.agent.v1.EnrollResponse.not_after:type_name -> google.protobuf.Timestamp
6, // 1: pangolin.agent.v1.HeartbeatRequest.load:type_name -> pangolin.agent.v1.NodeLoad
9, // 2: pangolin.agent.v1.Command.upsert_credential:type_name -> pangolin.agent.v1.UpsertCredential
10, // 3: pangolin.agent.v1.Command.revoke_credential:type_name -> pangolin.agent.v1.RevokeCredential
11, // 4: pangolin.agent.v1.Command.rotate_credential:type_name -> pangolin.agent.v1.RotateCredential
12, // 5: pangolin.agent.v1.Command.apply_config:type_name -> pangolin.agent.v1.ApplyConfig
13, // 6: pangolin.agent.v1.Command.lifecycle:type_name -> pangolin.agent.v1.Lifecycle
21, // 7: pangolin.agent.v1.UpsertCredential.expires_at:type_name -> google.protobuf.Timestamp
14, // 8: pangolin.agent.v1.ApplyConfig.config:type_name -> pangolin.agent.v1.ConfigSnapshot
0, // 9: pangolin.agent.v1.Lifecycle.action:type_name -> pangolin.agent.v1.Lifecycle.Action
15, // 10: pangolin.agent.v1.ConfigSnapshot.credentials:type_name -> pangolin.agent.v1.CredentialEntry
21, // 11: pangolin.agent.v1.CredentialEntry.expires_at:type_name -> google.protobuf.Timestamp
19, // 12: pangolin.agent.v1.ReportUsageRequest.items:type_name -> pangolin.agent.v1.UsageItem
1, // 13: pangolin.agent.v1.AgentService.Enroll:input_type -> pangolin.agent.v1.EnrollRequest
3, // 14: pangolin.agent.v1.AgentService.Register:input_type -> pangolin.agent.v1.RegisterRequest
4, // 15: pangolin.agent.v1.AgentService.Heartbeat:input_type -> pangolin.agent.v1.HeartbeatRequest
7, // 16: pangolin.agent.v1.AgentService.Subscribe:input_type -> pangolin.agent.v1.SubscribeRequest
16, // 17: pangolin.agent.v1.AgentService.Ack:input_type -> pangolin.agent.v1.AckRequest
18, // 18: pangolin.agent.v1.AgentService.ReportUsage:input_type -> pangolin.agent.v1.ReportUsageRequest
2, // 19: pangolin.agent.v1.AgentService.Enroll:output_type -> pangolin.agent.v1.EnrollResponse
14, // 20: pangolin.agent.v1.AgentService.Register:output_type -> pangolin.agent.v1.ConfigSnapshot
5, // 21: pangolin.agent.v1.AgentService.Heartbeat:output_type -> pangolin.agent.v1.HeartbeatResponse
8, // 22: pangolin.agent.v1.AgentService.Subscribe:output_type -> pangolin.agent.v1.Command
17, // 23: pangolin.agent.v1.AgentService.Ack:output_type -> pangolin.agent.v1.AckResponse
20, // 24: pangolin.agent.v1.AgentService.ReportUsage:output_type -> pangolin.agent.v1.ReportUsageResponse
19, // [19:25] is the sub-list for method output_type
13, // [13:19] is the sub-list for method input_type
13, // [13:13] is the sub-list for extension type_name
13, // [13:13] is the sub-list for extension extendee
0, // [0:13] is the sub-list for field type_name
}
func init() { file_pangolin_agent_v1_agent_proto_init() }
func file_pangolin_agent_v1_agent_proto_init() {
if File_pangolin_agent_v1_agent_proto != nil {
return
}
file_pangolin_agent_v1_agent_proto_msgTypes[7].OneofWrappers = []any{
(*Command_UpsertCredential)(nil),
(*Command_RevokeCredential)(nil),
(*Command_RotateCredential)(nil),
(*Command_ApplyConfig)(nil),
(*Command_Lifecycle)(nil),
}
type x struct{}
out := protoimpl.TypeBuilder{
File: protoimpl.DescBuilder{
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: unsafe.Slice(unsafe.StringData(file_pangolin_agent_v1_agent_proto_rawDesc), len(file_pangolin_agent_v1_agent_proto_rawDesc)),
NumEnums: 1,
NumMessages: 20,
NumExtensions: 0,
NumServices: 1,
},
GoTypes: file_pangolin_agent_v1_agent_proto_goTypes,
DependencyIndexes: file_pangolin_agent_v1_agent_proto_depIdxs,
EnumInfos: file_pangolin_agent_v1_agent_proto_enumTypes,
MessageInfos: file_pangolin_agent_v1_agent_proto_msgTypes,
}.Build()
File_pangolin_agent_v1_agent_proto = out.File
file_pangolin_agent_v1_agent_proto_goTypes = nil
file_pangolin_agent_v1_agent_proto_depIdxs = nil
}