From b6f3d6984018515b2c53343762fd495c00ea5d09 Mon Sep 17 00:00:00 2001 From: mintaka Date: Sat, 12 Sep 2026 10:26:21 -0400 Subject: [PATCH] feat(runner): report the runtime tier and egress posture per session MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A green launch said nothing about which boundary an agent actually got, and the host tier has none. AgentSessionStatus now carries both the tier and the egress posture, stamped by the Runner because it is the component that resolved the backend. Posture is carried separately rather than derived from the tier: enforcement is a property of the backend, so a client inferring one from the other would render a stale answer the moment that changes. Both fields are backward-compatible appends, and an unrecognized value maps to UNSPECIFIED rather than a plausible default — on a security surface, saying nothing beats guessing. Tier identity rides a capability probe rather than widening the frozen WorkloadRuntime interface, matching the existing egress markers. --- go/gen/compass/v1/compass.pb.go | 613 +++++++++++------- go/internal/runner/host.go | 18 +- go/internal/runner/host_test.go | 62 ++ go/internal/runner/tier_proto.go | 36 + go/internal/runtime/tier.go | 49 ++ go/internal/runtime/tier_test.go | 56 ++ .../src/gen/compass/v1/compass_pb.ts | 104 ++- .../src/gen/compass/v1/compass_pb.ts | 104 ++- proto/compass/v1/compass.proto | 29 + 9 files changed, 821 insertions(+), 250 deletions(-) create mode 100644 go/internal/runner/tier_proto.go create mode 100644 go/internal/runtime/tier.go create mode 100644 go/internal/runtime/tier_test.go diff --git a/go/gen/compass/v1/compass.pb.go b/go/gen/compass/v1/compass.pb.go index c8fa53c7f..b0cde22c8 100644 --- a/go/gen/compass/v1/compass.pb.go +++ b/go/gen/compass/v1/compass.pb.go @@ -182,6 +182,116 @@ func (ServerState) EnumDescriptor() ([]byte, []int) { return file_compass_v1_compass_proto_rawDescGZIP(), []int{2} } +// The runtime tier an agent workload runs on. `HOST` runs agents as direct +// child processes of the Runner, with no container or VM boundary. +type RuntimeTier int32 + +const ( + RuntimeTier_RUNTIME_TIER_UNSPECIFIED RuntimeTier = 0 + RuntimeTier_RUNTIME_TIER_PODMAN RuntimeTier = 1 + RuntimeTier_RUNTIME_TIER_MICROVM RuntimeTier = 2 + RuntimeTier_RUNTIME_TIER_APPLE_CONTAINER RuntimeTier = 3 + RuntimeTier_RUNTIME_TIER_HOST RuntimeTier = 4 +) + +// Enum value maps for RuntimeTier. +var ( + RuntimeTier_name = map[int32]string{ + 0: "RUNTIME_TIER_UNSPECIFIED", + 1: "RUNTIME_TIER_PODMAN", + 2: "RUNTIME_TIER_MICROVM", + 3: "RUNTIME_TIER_APPLE_CONTAINER", + 4: "RUNTIME_TIER_HOST", + } + RuntimeTier_value = map[string]int32{ + "RUNTIME_TIER_UNSPECIFIED": 0, + "RUNTIME_TIER_PODMAN": 1, + "RUNTIME_TIER_MICROVM": 2, + "RUNTIME_TIER_APPLE_CONTAINER": 3, + "RUNTIME_TIER_HOST": 4, + } +) + +func (x RuntimeTier) Enum() *RuntimeTier { + p := new(RuntimeTier) + *p = x + return p +} + +func (x RuntimeTier) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (RuntimeTier) Descriptor() protoreflect.EnumDescriptor { + return file_compass_v1_compass_proto_enumTypes[3].Descriptor() +} + +func (RuntimeTier) Type() protoreflect.EnumType { + return &file_compass_v1_compass_proto_enumTypes[3] +} + +func (x RuntimeTier) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use RuntimeTier.Descriptor instead. +func (RuntimeTier) EnumDescriptor() ([]byte, []int) { + return file_compass_v1_compass_proto_rawDescGZIP(), []int{3} +} + +// How an agent's egress is constrained. `UNENFORCED` means the tier cannot +// constrain it at all — a host process shares the host's network namespace, so +// there is no boundary to firewall. It is a declared posture, never a failed +// arm, and a client must not render it as contained. +type EgressPosture int32 + +const ( + EgressPosture_EGRESS_POSTURE_UNSPECIFIED EgressPosture = 0 + EgressPosture_EGRESS_POSTURE_ARMED EgressPosture = 1 + EgressPosture_EGRESS_POSTURE_UNENFORCED EgressPosture = 2 +) + +// Enum value maps for EgressPosture. +var ( + EgressPosture_name = map[int32]string{ + 0: "EGRESS_POSTURE_UNSPECIFIED", + 1: "EGRESS_POSTURE_ARMED", + 2: "EGRESS_POSTURE_UNENFORCED", + } + EgressPosture_value = map[string]int32{ + "EGRESS_POSTURE_UNSPECIFIED": 0, + "EGRESS_POSTURE_ARMED": 1, + "EGRESS_POSTURE_UNENFORCED": 2, + } +) + +func (x EgressPosture) Enum() *EgressPosture { + p := new(EgressPosture) + *p = x + return p +} + +func (x EgressPosture) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (EgressPosture) Descriptor() protoreflect.EnumDescriptor { + return file_compass_v1_compass_proto_enumTypes[4].Descriptor() +} + +func (EgressPosture) Type() protoreflect.EnumType { + return &file_compass_v1_compass_proto_enumTypes[4] +} + +func (x EgressPosture) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use EgressPosture.Descriptor instead. +func (EgressPosture) EnumDescriptor() ([]byte, []int) { + return file_compass_v1_compass_proto_rawDescGZIP(), []int{4} +} + // Agent-session lifecycle states. `ERRORED` is an unexpected agent exit (OOM, // panic, engine restart); recovery is an explicit ReloadAgentSession, never an // automatic reconnect. `DISCONNECTED` is distinct: the owning Runner's link @@ -244,11 +354,11 @@ func (x AgentSessionState) String() string { } func (AgentSessionState) Descriptor() protoreflect.EnumDescriptor { - return file_compass_v1_compass_proto_enumTypes[3].Descriptor() + return file_compass_v1_compass_proto_enumTypes[5].Descriptor() } func (AgentSessionState) Type() protoreflect.EnumType { - return &file_compass_v1_compass_proto_enumTypes[3] + return &file_compass_v1_compass_proto_enumTypes[5] } func (x AgentSessionState) Number() protoreflect.EnumNumber { @@ -257,7 +367,7 @@ func (x AgentSessionState) Number() protoreflect.EnumNumber { // Deprecated: Use AgentSessionState.Descriptor instead. func (AgentSessionState) EnumDescriptor() ([]byte, []int) { - return file_compass_v1_compass_proto_rawDescGZIP(), []int{3} + return file_compass_v1_compass_proto_rawDescGZIP(), []int{5} } type AgentToolCallStatus int32 @@ -299,11 +409,11 @@ func (x AgentToolCallStatus) String() string { } func (AgentToolCallStatus) Descriptor() protoreflect.EnumDescriptor { - return file_compass_v1_compass_proto_enumTypes[4].Descriptor() + return file_compass_v1_compass_proto_enumTypes[6].Descriptor() } func (AgentToolCallStatus) Type() protoreflect.EnumType { - return &file_compass_v1_compass_proto_enumTypes[4] + return &file_compass_v1_compass_proto_enumTypes[6] } func (x AgentToolCallStatus) Number() protoreflect.EnumNumber { @@ -312,7 +422,7 @@ func (x AgentToolCallStatus) Number() protoreflect.EnumNumber { // Deprecated: Use AgentToolCallStatus.Descriptor instead. func (AgentToolCallStatus) EnumDescriptor() ([]byte, []int) { - return file_compass_v1_compass_proto_rawDescGZIP(), []int{4} + return file_compass_v1_compass_proto_rawDescGZIP(), []int{6} } type AgentPlanEntryStatus int32 @@ -351,11 +461,11 @@ func (x AgentPlanEntryStatus) String() string { } func (AgentPlanEntryStatus) Descriptor() protoreflect.EnumDescriptor { - return file_compass_v1_compass_proto_enumTypes[5].Descriptor() + return file_compass_v1_compass_proto_enumTypes[7].Descriptor() } func (AgentPlanEntryStatus) Type() protoreflect.EnumType { - return &file_compass_v1_compass_proto_enumTypes[5] + return &file_compass_v1_compass_proto_enumTypes[7] } func (x AgentPlanEntryStatus) Number() protoreflect.EnumNumber { @@ -364,7 +474,7 @@ func (x AgentPlanEntryStatus) Number() protoreflect.EnumNumber { // Deprecated: Use AgentPlanEntryStatus.Descriptor instead. func (AgentPlanEntryStatus) EnumDescriptor() ([]byte, []int) { - return file_compass_v1_compass_proto_rawDescGZIP(), []int{5} + return file_compass_v1_compass_proto_rawDescGZIP(), []int{7} } // The control op-kind a SessionInjection records. Mirrors the internal @@ -405,11 +515,11 @@ func (x SessionInjectionKind) String() string { } func (SessionInjectionKind) Descriptor() protoreflect.EnumDescriptor { - return file_compass_v1_compass_proto_enumTypes[6].Descriptor() + return file_compass_v1_compass_proto_enumTypes[8].Descriptor() } func (SessionInjectionKind) Type() protoreflect.EnumType { - return &file_compass_v1_compass_proto_enumTypes[6] + return &file_compass_v1_compass_proto_enumTypes[8] } func (x SessionInjectionKind) Number() protoreflect.EnumNumber { @@ -418,7 +528,7 @@ func (x SessionInjectionKind) Number() protoreflect.EnumNumber { // Deprecated: Use SessionInjectionKind.Descriptor instead. func (SessionInjectionKind) EnumDescriptor() ([]byte, []int) { - return file_compass_v1_compass_proto_rawDescGZIP(), []int{6} + return file_compass_v1_compass_proto_rawDescGZIP(), []int{8} } // The class of a SessionError. ERROR pairs with the ERRORED lifecycle @@ -457,11 +567,11 @@ func (x SessionErrorKind) String() string { } func (SessionErrorKind) Descriptor() protoreflect.EnumDescriptor { - return file_compass_v1_compass_proto_enumTypes[7].Descriptor() + return file_compass_v1_compass_proto_enumTypes[9].Descriptor() } func (SessionErrorKind) Type() protoreflect.EnumType { - return &file_compass_v1_compass_proto_enumTypes[7] + return &file_compass_v1_compass_proto_enumTypes[9] } func (x SessionErrorKind) Number() protoreflect.EnumNumber { @@ -470,7 +580,7 @@ func (x SessionErrorKind) Number() protoreflect.EnumNumber { // Deprecated: Use SessionErrorKind.Descriptor instead. func (SessionErrorKind) EnumDescriptor() ([]byte, []int) { - return file_compass_v1_compass_proto_rawDescGZIP(), []int{7} + return file_compass_v1_compass_proto_rawDescGZIP(), []int{9} } // The Compass issue lifecycle, server-owned (DL-032/DL-033 + terminal ARCHIVED, @@ -529,11 +639,11 @@ func (x IssueState) String() string { } func (IssueState) Descriptor() protoreflect.EnumDescriptor { - return file_compass_v1_compass_proto_enumTypes[8].Descriptor() + return file_compass_v1_compass_proto_enumTypes[10].Descriptor() } func (IssueState) Type() protoreflect.EnumType { - return &file_compass_v1_compass_proto_enumTypes[8] + return &file_compass_v1_compass_proto_enumTypes[10] } func (x IssueState) Number() protoreflect.EnumNumber { @@ -542,7 +652,7 @@ func (x IssueState) Number() protoreflect.EnumNumber { // Deprecated: Use IssueState.Descriptor instead. func (IssueState) EnumDescriptor() ([]byte, []int) { - return file_compass_v1_compass_proto_rawDescGZIP(), []int{8} + return file_compass_v1_compass_proto_rawDescGZIP(), []int{10} } // Which forge (and which host, for self-hosted instances) an artifact lives on. @@ -587,11 +697,11 @@ func (x ForgeProvider) String() string { } func (ForgeProvider) Descriptor() protoreflect.EnumDescriptor { - return file_compass_v1_compass_proto_enumTypes[9].Descriptor() + return file_compass_v1_compass_proto_enumTypes[11].Descriptor() } func (ForgeProvider) Type() protoreflect.EnumType { - return &file_compass_v1_compass_proto_enumTypes[9] + return &file_compass_v1_compass_proto_enumTypes[11] } func (x ForgeProvider) Number() protoreflect.EnumNumber { @@ -600,7 +710,7 @@ func (x ForgeProvider) Number() protoreflect.EnumNumber { // Deprecated: Use ForgeProvider.Descriptor instead. func (ForgeProvider) EnumDescriptor() ([]byte, []int) { - return file_compass_v1_compass_proto_rawDescGZIP(), []int{9} + return file_compass_v1_compass_proto_rawDescGZIP(), []int{11} } type SetSecretRequest struct { @@ -1943,8 +2053,17 @@ type AgentSessionStatus struct { // binding is no longer resolvable — a status emitted after a Runner reconnect // cleared the live-session maps carries none (the stated residual gap). AgentAccountId string `protobuf:"bytes,3,opt,name=agent_account_id,json=agentAccountId,proto3" json:"agent_account_id,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + // The runtime tier this session's workload runs on, and how its egress is + // constrained. Both are backward-compatible appends (buf: non-breaking) and + // both are reported by the Runner that owns the session, because it is the + // component that resolved the backend. Posture is carried separately rather + // than inferred from the tier: a tier's enforcement is a property of the + // backend, and a client deriving one from the other would render a stale + // answer the moment that changes. + RuntimeTier RuntimeTier `protobuf:"varint,4,opt,name=runtime_tier,json=runtimeTier,proto3,enum=compass.v1.RuntimeTier" json:"runtime_tier,omitempty"` + EgressPosture EgressPosture `protobuf:"varint,5,opt,name=egress_posture,json=egressPosture,proto3,enum=compass.v1.EgressPosture" json:"egress_posture,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AgentSessionStatus) Reset() { @@ -1998,6 +2117,20 @@ func (x *AgentSessionStatus) GetAgentAccountId() string { return "" } +func (x *AgentSessionStatus) GetRuntimeTier() RuntimeTier { + if x != nil { + return x.RuntimeTier + } + return RuntimeTier_RUNTIME_TIER_UNSPECIFIED +} + +func (x *AgentSessionStatus) GetEgressPosture() EgressPosture { + if x != nil { + return x.EgressPosture + } + return EgressPosture_EGRESS_POSTURE_UNSPECIFIED +} + // A chunk of the agent's message stream (assistant text / thought), relayed // from the Runner's agent event stream. type AgentMessageChunk struct { @@ -5869,12 +6002,14 @@ const file_compass_v1_compass_proto_rawDesc = "" + "\x06issues\x18\x01 \x03(\v2\x11.compass.v1.IssueR\x06issues\"=\n" + "\fServerStatus\x12-\n" + "\x05state\x18\x01 \x01(\x0e2\x17.compass.v1.ServerStateR\x05state\"\x10\n" + - "\x0eResyncRequired\"\x92\x01\n" + + "\x0eResyncRequired\"\x90\x02\n" + "\x12AgentSessionStatus\x12\x1d\n" + "\n" + "session_id\x18\x01 \x01(\tR\tsessionId\x123\n" + "\x05state\x18\x02 \x01(\x0e2\x1d.compass.v1.AgentSessionStateR\x05state\x12(\n" + - "\x10agent_account_id\x18\x03 \x01(\tR\x0eagentAccountId\"e\n" + + "\x10agent_account_id\x18\x03 \x01(\tR\x0eagentAccountId\x12:\n" + + "\fruntime_tier\x18\x04 \x01(\x0e2\x17.compass.v1.RuntimeTierR\vruntimeTier\x12@\n" + + "\x0eegress_posture\x18\x05 \x01(\x0e2\x19.compass.v1.EgressPostureR\regressPosture\"e\n" + "\x11AgentMessageChunk\x12\x1d\n" + "\n" + "session_id\x18\x01 \x01(\tR\tsessionId\x12\x12\n" + @@ -6149,7 +6284,17 @@ const file_compass_v1_compass_proto_rawDesc = "" + "\x0eSECRET_KIND_GH\x10\x03*C\n" + "\vServerState\x12\x1c\n" + "\x18SERVER_STATE_UNSPECIFIED\x10\x00\x12\x16\n" + - "\x12SERVER_STATE_READY\x10\x01*\x82\x02\n" + + "\x12SERVER_STATE_READY\x10\x01*\x97\x01\n" + + "\vRuntimeTier\x12\x1c\n" + + "\x18RUNTIME_TIER_UNSPECIFIED\x10\x00\x12\x17\n" + + "\x13RUNTIME_TIER_PODMAN\x10\x01\x12\x18\n" + + "\x14RUNTIME_TIER_MICROVM\x10\x02\x12 \n" + + "\x1cRUNTIME_TIER_APPLE_CONTAINER\x10\x03\x12\x15\n" + + "\x11RUNTIME_TIER_HOST\x10\x04*h\n" + + "\rEgressPosture\x12\x1e\n" + + "\x1aEGRESS_POSTURE_UNSPECIFIED\x10\x00\x12\x18\n" + + "\x14EGRESS_POSTURE_ARMED\x10\x01\x12\x1d\n" + + "\x19EGRESS_POSTURE_UNENFORCED\x10\x02*\x82\x02\n" + "\x11AgentSessionState\x12#\n" + "\x1fAGENT_SESSION_STATE_UNSPECIFIED\x10\x00\x12 \n" + "\x1cAGENT_SESSION_STATE_STARTING\x10\x01\x12\x1d\n" + @@ -6237,223 +6382,227 @@ func file_compass_v1_compass_proto_rawDescGZIP() []byte { return file_compass_v1_compass_proto_rawDescData } -var file_compass_v1_compass_proto_enumTypes = make([]protoimpl.EnumInfo, 10) +var file_compass_v1_compass_proto_enumTypes = make([]protoimpl.EnumInfo, 12) var file_compass_v1_compass_proto_msgTypes = make([]protoimpl.MessageInfo, 87) var file_compass_v1_compass_proto_goTypes = []any{ (SecretDelivery)(0), // 0: compass.v1.SecretDelivery (SecretKind)(0), // 1: compass.v1.SecretKind (ServerState)(0), // 2: compass.v1.ServerState - (AgentSessionState)(0), // 3: compass.v1.AgentSessionState - (AgentToolCallStatus)(0), // 4: compass.v1.AgentToolCallStatus - (AgentPlanEntryStatus)(0), // 5: compass.v1.AgentPlanEntryStatus - (SessionInjectionKind)(0), // 6: compass.v1.SessionInjectionKind - (SessionErrorKind)(0), // 7: compass.v1.SessionErrorKind - (IssueState)(0), // 8: compass.v1.IssueState - (ForgeProvider)(0), // 9: compass.v1.ForgeProvider - (*SetSecretRequest)(nil), // 10: compass.v1.SetSecretRequest - (*SetSecretResponse)(nil), // 11: compass.v1.SetSecretResponse - (*ListSecretsRequest)(nil), // 12: compass.v1.ListSecretsRequest - (*ListSecretsResponse)(nil), // 13: compass.v1.ListSecretsResponse - (*SecretStatus)(nil), // 14: compass.v1.SecretStatus - (*DeleteSecretRequest)(nil), // 15: compass.v1.DeleteSecretRequest - (*DeleteSecretResponse)(nil), // 16: compass.v1.DeleteSecretResponse - (*SetServerSecretRequest)(nil), // 17: compass.v1.SetServerSecretRequest - (*SetServerSecretResponse)(nil), // 18: compass.v1.SetServerSecretResponse - (*DeleteServerSecretRequest)(nil), // 19: compass.v1.DeleteServerSecretRequest - (*DeleteServerSecretResponse)(nil), // 20: compass.v1.DeleteServerSecretResponse - (*ListServerSecretsRequest)(nil), // 21: compass.v1.ListServerSecretsRequest - (*ListServerSecretsResponse)(nil), // 22: compass.v1.ListServerSecretsResponse - (*ServerSecretStatus)(nil), // 23: compass.v1.ServerSecretStatus - (*GetServerInfoRequest)(nil), // 24: compass.v1.GetServerInfoRequest - (*GetServerInfoResponse)(nil), // 25: compass.v1.GetServerInfoResponse - (*WhoAmIRequest)(nil), // 26: compass.v1.WhoAmIRequest - (*WhoAmIResponse)(nil), // 27: compass.v1.WhoAmIResponse - (*SubscribeEventsRequest)(nil), // 28: compass.v1.SubscribeEventsRequest - (*SubscribeEventsResponse)(nil), // 29: compass.v1.SubscribeEventsResponse - (*ListBoardIssuesRequest)(nil), // 30: compass.v1.ListBoardIssuesRequest - (*ListBoardIssuesResponse)(nil), // 31: compass.v1.ListBoardIssuesResponse - (*ServerStatus)(nil), // 32: compass.v1.ServerStatus - (*ResyncRequired)(nil), // 33: compass.v1.ResyncRequired - (*AgentSessionStatus)(nil), // 34: compass.v1.AgentSessionStatus - (*AgentMessageChunk)(nil), // 35: compass.v1.AgentMessageChunk - (*AgentToolCall)(nil), // 36: compass.v1.AgentToolCall - (*AgentPlan)(nil), // 37: compass.v1.AgentPlan - (*AgentPlanEntry)(nil), // 38: compass.v1.AgentPlanEntry - (*SessionEvent)(nil), // 39: compass.v1.SessionEvent - (*SessionAssistantText)(nil), // 40: compass.v1.SessionAssistantText - (*SessionThinking)(nil), // 41: compass.v1.SessionThinking - (*SessionToolCall)(nil), // 42: compass.v1.SessionToolCall - (*SessionToolCallUpdate)(nil), // 43: compass.v1.SessionToolCallUpdate - (*SessionFileDiff)(nil), // 44: compass.v1.SessionFileDiff - (*SessionPlan)(nil), // 45: compass.v1.SessionPlan - (*SessionNotice)(nil), // 46: compass.v1.SessionNotice - (*SessionInjection)(nil), // 47: compass.v1.SessionInjection - (*SessionError)(nil), // 48: compass.v1.SessionError - (*SubscribeAgentSessionRequest)(nil), // 49: compass.v1.SubscribeAgentSessionRequest - (*AgentSessionFrame)(nil), // 50: compass.v1.AgentSessionFrame - (*ProvisionAgentWorkspaceRequest)(nil), // 51: compass.v1.ProvisionAgentWorkspaceRequest - (*ProvisionAgentWorkspaceResponse)(nil), // 52: compass.v1.ProvisionAgentWorkspaceResponse - (*RemoveAgentWorkspaceRequest)(nil), // 53: compass.v1.RemoveAgentWorkspaceRequest - (*RemoveAgentWorkspaceResponse)(nil), // 54: compass.v1.RemoveAgentWorkspaceResponse - (*StartAgentSessionRequest)(nil), // 55: compass.v1.StartAgentSessionRequest - (*StartAgentSessionResponse)(nil), // 56: compass.v1.StartAgentSessionResponse - (*SpawnAgentRequest)(nil), // 57: compass.v1.SpawnAgentRequest - (*SpawnAgentResponse)(nil), // 58: compass.v1.SpawnAgentResponse - (*StopAgentSessionRequest)(nil), // 59: compass.v1.StopAgentSessionRequest - (*StopAgentSessionResponse)(nil), // 60: compass.v1.StopAgentSessionResponse - (*ReloadAgentSessionRequest)(nil), // 61: compass.v1.ReloadAgentSessionRequest - (*ReloadAgentSessionResponse)(nil), // 62: compass.v1.ReloadAgentSessionResponse - (*GetAgentStatusRequest)(nil), // 63: compass.v1.GetAgentStatusRequest - (*GetAgentStatusResponse)(nil), // 64: compass.v1.GetAgentStatusResponse - (*IssueTokenRequest)(nil), // 65: compass.v1.IssueTokenRequest - (*IssueTokenResponse)(nil), // 66: compass.v1.IssueTokenResponse - (*RevokeTokenRequest)(nil), // 67: compass.v1.RevokeTokenRequest - (*RevokeTokenResponse)(nil), // 68: compass.v1.RevokeTokenResponse - (*PutAgentConfigRequest)(nil), // 69: compass.v1.PutAgentConfigRequest - (*PutAgentConfigResponse)(nil), // 70: compass.v1.PutAgentConfigResponse - (*GetAgentConfigInfoRequest)(nil), // 71: compass.v1.GetAgentConfigInfoRequest - (*GetAgentConfigInfoResponse)(nil), // 72: compass.v1.GetAgentConfigInfoResponse - (*DeleteAgentConfigRequest)(nil), // 73: compass.v1.DeleteAgentConfigRequest - (*DeleteAgentConfigResponse)(nil), // 74: compass.v1.DeleteAgentConfigResponse - (*ModelCandidate)(nil), // 75: compass.v1.ModelCandidate - (*ModelMetadata)(nil), // 76: compass.v1.ModelMetadata - (*ModelRegistryEntry)(nil), // 77: compass.v1.ModelRegistryEntry - (*ModelRegistry)(nil), // 78: compass.v1.ModelRegistry - (*PutModelRegistryRequest)(nil), // 79: compass.v1.PutModelRegistryRequest - (*PutModelRegistryResponse)(nil), // 80: compass.v1.PutModelRegistryResponse - (*GetModelRegistryRequest)(nil), // 81: compass.v1.GetModelRegistryRequest - (*GetModelRegistryResponse)(nil), // 82: compass.v1.GetModelRegistryResponse - (*DeleteModelRegistryRequest)(nil), // 83: compass.v1.DeleteModelRegistryRequest - (*DeleteModelRegistryResponse)(nil), // 84: compass.v1.DeleteModelRegistryResponse - (*AgentAttribution)(nil), // 85: compass.v1.AgentAttribution - (*ForgeRef)(nil), // 86: compass.v1.ForgeRef - (*Issue)(nil), // 87: compass.v1.Issue - (*PullRequest)(nil), // 88: compass.v1.PullRequest - (*ChecksSummary)(nil), // 89: compass.v1.ChecksSummary - (*Check)(nil), // 90: compass.v1.Check - (*ChangedStats)(nil), // 91: compass.v1.ChangedStats - (*TrackerRef)(nil), // 92: compass.v1.TrackerRef - (*Review)(nil), // 93: compass.v1.Review - (*ReviewThread)(nil), // 94: compass.v1.ReviewThread - (*Comment)(nil), // 95: compass.v1.Comment - nil, // 96: compass.v1.ModelRegistry.EntriesEntry - (*timestamppb.Timestamp)(nil), // 97: google.protobuf.Timestamp + (RuntimeTier)(0), // 3: compass.v1.RuntimeTier + (EgressPosture)(0), // 4: compass.v1.EgressPosture + (AgentSessionState)(0), // 5: compass.v1.AgentSessionState + (AgentToolCallStatus)(0), // 6: compass.v1.AgentToolCallStatus + (AgentPlanEntryStatus)(0), // 7: compass.v1.AgentPlanEntryStatus + (SessionInjectionKind)(0), // 8: compass.v1.SessionInjectionKind + (SessionErrorKind)(0), // 9: compass.v1.SessionErrorKind + (IssueState)(0), // 10: compass.v1.IssueState + (ForgeProvider)(0), // 11: compass.v1.ForgeProvider + (*SetSecretRequest)(nil), // 12: compass.v1.SetSecretRequest + (*SetSecretResponse)(nil), // 13: compass.v1.SetSecretResponse + (*ListSecretsRequest)(nil), // 14: compass.v1.ListSecretsRequest + (*ListSecretsResponse)(nil), // 15: compass.v1.ListSecretsResponse + (*SecretStatus)(nil), // 16: compass.v1.SecretStatus + (*DeleteSecretRequest)(nil), // 17: compass.v1.DeleteSecretRequest + (*DeleteSecretResponse)(nil), // 18: compass.v1.DeleteSecretResponse + (*SetServerSecretRequest)(nil), // 19: compass.v1.SetServerSecretRequest + (*SetServerSecretResponse)(nil), // 20: compass.v1.SetServerSecretResponse + (*DeleteServerSecretRequest)(nil), // 21: compass.v1.DeleteServerSecretRequest + (*DeleteServerSecretResponse)(nil), // 22: compass.v1.DeleteServerSecretResponse + (*ListServerSecretsRequest)(nil), // 23: compass.v1.ListServerSecretsRequest + (*ListServerSecretsResponse)(nil), // 24: compass.v1.ListServerSecretsResponse + (*ServerSecretStatus)(nil), // 25: compass.v1.ServerSecretStatus + (*GetServerInfoRequest)(nil), // 26: compass.v1.GetServerInfoRequest + (*GetServerInfoResponse)(nil), // 27: compass.v1.GetServerInfoResponse + (*WhoAmIRequest)(nil), // 28: compass.v1.WhoAmIRequest + (*WhoAmIResponse)(nil), // 29: compass.v1.WhoAmIResponse + (*SubscribeEventsRequest)(nil), // 30: compass.v1.SubscribeEventsRequest + (*SubscribeEventsResponse)(nil), // 31: compass.v1.SubscribeEventsResponse + (*ListBoardIssuesRequest)(nil), // 32: compass.v1.ListBoardIssuesRequest + (*ListBoardIssuesResponse)(nil), // 33: compass.v1.ListBoardIssuesResponse + (*ServerStatus)(nil), // 34: compass.v1.ServerStatus + (*ResyncRequired)(nil), // 35: compass.v1.ResyncRequired + (*AgentSessionStatus)(nil), // 36: compass.v1.AgentSessionStatus + (*AgentMessageChunk)(nil), // 37: compass.v1.AgentMessageChunk + (*AgentToolCall)(nil), // 38: compass.v1.AgentToolCall + (*AgentPlan)(nil), // 39: compass.v1.AgentPlan + (*AgentPlanEntry)(nil), // 40: compass.v1.AgentPlanEntry + (*SessionEvent)(nil), // 41: compass.v1.SessionEvent + (*SessionAssistantText)(nil), // 42: compass.v1.SessionAssistantText + (*SessionThinking)(nil), // 43: compass.v1.SessionThinking + (*SessionToolCall)(nil), // 44: compass.v1.SessionToolCall + (*SessionToolCallUpdate)(nil), // 45: compass.v1.SessionToolCallUpdate + (*SessionFileDiff)(nil), // 46: compass.v1.SessionFileDiff + (*SessionPlan)(nil), // 47: compass.v1.SessionPlan + (*SessionNotice)(nil), // 48: compass.v1.SessionNotice + (*SessionInjection)(nil), // 49: compass.v1.SessionInjection + (*SessionError)(nil), // 50: compass.v1.SessionError + (*SubscribeAgentSessionRequest)(nil), // 51: compass.v1.SubscribeAgentSessionRequest + (*AgentSessionFrame)(nil), // 52: compass.v1.AgentSessionFrame + (*ProvisionAgentWorkspaceRequest)(nil), // 53: compass.v1.ProvisionAgentWorkspaceRequest + (*ProvisionAgentWorkspaceResponse)(nil), // 54: compass.v1.ProvisionAgentWorkspaceResponse + (*RemoveAgentWorkspaceRequest)(nil), // 55: compass.v1.RemoveAgentWorkspaceRequest + (*RemoveAgentWorkspaceResponse)(nil), // 56: compass.v1.RemoveAgentWorkspaceResponse + (*StartAgentSessionRequest)(nil), // 57: compass.v1.StartAgentSessionRequest + (*StartAgentSessionResponse)(nil), // 58: compass.v1.StartAgentSessionResponse + (*SpawnAgentRequest)(nil), // 59: compass.v1.SpawnAgentRequest + (*SpawnAgentResponse)(nil), // 60: compass.v1.SpawnAgentResponse + (*StopAgentSessionRequest)(nil), // 61: compass.v1.StopAgentSessionRequest + (*StopAgentSessionResponse)(nil), // 62: compass.v1.StopAgentSessionResponse + (*ReloadAgentSessionRequest)(nil), // 63: compass.v1.ReloadAgentSessionRequest + (*ReloadAgentSessionResponse)(nil), // 64: compass.v1.ReloadAgentSessionResponse + (*GetAgentStatusRequest)(nil), // 65: compass.v1.GetAgentStatusRequest + (*GetAgentStatusResponse)(nil), // 66: compass.v1.GetAgentStatusResponse + (*IssueTokenRequest)(nil), // 67: compass.v1.IssueTokenRequest + (*IssueTokenResponse)(nil), // 68: compass.v1.IssueTokenResponse + (*RevokeTokenRequest)(nil), // 69: compass.v1.RevokeTokenRequest + (*RevokeTokenResponse)(nil), // 70: compass.v1.RevokeTokenResponse + (*PutAgentConfigRequest)(nil), // 71: compass.v1.PutAgentConfigRequest + (*PutAgentConfigResponse)(nil), // 72: compass.v1.PutAgentConfigResponse + (*GetAgentConfigInfoRequest)(nil), // 73: compass.v1.GetAgentConfigInfoRequest + (*GetAgentConfigInfoResponse)(nil), // 74: compass.v1.GetAgentConfigInfoResponse + (*DeleteAgentConfigRequest)(nil), // 75: compass.v1.DeleteAgentConfigRequest + (*DeleteAgentConfigResponse)(nil), // 76: compass.v1.DeleteAgentConfigResponse + (*ModelCandidate)(nil), // 77: compass.v1.ModelCandidate + (*ModelMetadata)(nil), // 78: compass.v1.ModelMetadata + (*ModelRegistryEntry)(nil), // 79: compass.v1.ModelRegistryEntry + (*ModelRegistry)(nil), // 80: compass.v1.ModelRegistry + (*PutModelRegistryRequest)(nil), // 81: compass.v1.PutModelRegistryRequest + (*PutModelRegistryResponse)(nil), // 82: compass.v1.PutModelRegistryResponse + (*GetModelRegistryRequest)(nil), // 83: compass.v1.GetModelRegistryRequest + (*GetModelRegistryResponse)(nil), // 84: compass.v1.GetModelRegistryResponse + (*DeleteModelRegistryRequest)(nil), // 85: compass.v1.DeleteModelRegistryRequest + (*DeleteModelRegistryResponse)(nil), // 86: compass.v1.DeleteModelRegistryResponse + (*AgentAttribution)(nil), // 87: compass.v1.AgentAttribution + (*ForgeRef)(nil), // 88: compass.v1.ForgeRef + (*Issue)(nil), // 89: compass.v1.Issue + (*PullRequest)(nil), // 90: compass.v1.PullRequest + (*ChecksSummary)(nil), // 91: compass.v1.ChecksSummary + (*Check)(nil), // 92: compass.v1.Check + (*ChangedStats)(nil), // 93: compass.v1.ChangedStats + (*TrackerRef)(nil), // 94: compass.v1.TrackerRef + (*Review)(nil), // 95: compass.v1.Review + (*ReviewThread)(nil), // 96: compass.v1.ReviewThread + (*Comment)(nil), // 97: compass.v1.Comment + nil, // 98: compass.v1.ModelRegistry.EntriesEntry + (*timestamppb.Timestamp)(nil), // 99: google.protobuf.Timestamp } var file_compass_v1_compass_proto_depIdxs = []int32{ 0, // 0: compass.v1.SetSecretRequest.delivery:type_name -> compass.v1.SecretDelivery 1, // 1: compass.v1.SetSecretRequest.kind:type_name -> compass.v1.SecretKind - 14, // 2: compass.v1.ListSecretsResponse.secrets:type_name -> compass.v1.SecretStatus + 16, // 2: compass.v1.ListSecretsResponse.secrets:type_name -> compass.v1.SecretStatus 0, // 3: compass.v1.SecretStatus.delivery:type_name -> compass.v1.SecretDelivery 1, // 4: compass.v1.SecretStatus.kind:type_name -> compass.v1.SecretKind - 23, // 5: compass.v1.ListServerSecretsResponse.server_secrets:type_name -> compass.v1.ServerSecretStatus - 32, // 6: compass.v1.SubscribeEventsResponse.server_status:type_name -> compass.v1.ServerStatus - 33, // 7: compass.v1.SubscribeEventsResponse.resync_required:type_name -> compass.v1.ResyncRequired - 34, // 8: compass.v1.SubscribeEventsResponse.agent_session_status:type_name -> compass.v1.AgentSessionStatus - 35, // 9: compass.v1.SubscribeEventsResponse.agent_message_chunk:type_name -> compass.v1.AgentMessageChunk - 36, // 10: compass.v1.SubscribeEventsResponse.agent_tool_call:type_name -> compass.v1.AgentToolCall - 37, // 11: compass.v1.SubscribeEventsResponse.agent_plan:type_name -> compass.v1.AgentPlan - 87, // 12: compass.v1.SubscribeEventsResponse.issue:type_name -> compass.v1.Issue - 87, // 13: compass.v1.ListBoardIssuesResponse.issues:type_name -> compass.v1.Issue + 25, // 5: compass.v1.ListServerSecretsResponse.server_secrets:type_name -> compass.v1.ServerSecretStatus + 34, // 6: compass.v1.SubscribeEventsResponse.server_status:type_name -> compass.v1.ServerStatus + 35, // 7: compass.v1.SubscribeEventsResponse.resync_required:type_name -> compass.v1.ResyncRequired + 36, // 8: compass.v1.SubscribeEventsResponse.agent_session_status:type_name -> compass.v1.AgentSessionStatus + 37, // 9: compass.v1.SubscribeEventsResponse.agent_message_chunk:type_name -> compass.v1.AgentMessageChunk + 38, // 10: compass.v1.SubscribeEventsResponse.agent_tool_call:type_name -> compass.v1.AgentToolCall + 39, // 11: compass.v1.SubscribeEventsResponse.agent_plan:type_name -> compass.v1.AgentPlan + 89, // 12: compass.v1.SubscribeEventsResponse.issue:type_name -> compass.v1.Issue + 89, // 13: compass.v1.ListBoardIssuesResponse.issues:type_name -> compass.v1.Issue 2, // 14: compass.v1.ServerStatus.state:type_name -> compass.v1.ServerState - 3, // 15: compass.v1.AgentSessionStatus.state:type_name -> compass.v1.AgentSessionState - 4, // 16: compass.v1.AgentToolCall.status:type_name -> compass.v1.AgentToolCallStatus - 38, // 17: compass.v1.AgentPlan.entries:type_name -> compass.v1.AgentPlanEntry - 5, // 18: compass.v1.AgentPlanEntry.status:type_name -> compass.v1.AgentPlanEntryStatus - 40, // 19: compass.v1.SessionEvent.assistant_text:type_name -> compass.v1.SessionAssistantText - 41, // 20: compass.v1.SessionEvent.thinking:type_name -> compass.v1.SessionThinking - 42, // 21: compass.v1.SessionEvent.tool_call:type_name -> compass.v1.SessionToolCall - 43, // 22: compass.v1.SessionEvent.tool_call_update:type_name -> compass.v1.SessionToolCallUpdate - 45, // 23: compass.v1.SessionEvent.plan:type_name -> compass.v1.SessionPlan - 46, // 24: compass.v1.SessionEvent.notice:type_name -> compass.v1.SessionNotice - 47, // 25: compass.v1.SessionEvent.session_injection:type_name -> compass.v1.SessionInjection - 48, // 26: compass.v1.SessionEvent.session_error:type_name -> compass.v1.SessionError - 4, // 27: compass.v1.SessionToolCall.status:type_name -> compass.v1.AgentToolCallStatus - 4, // 28: compass.v1.SessionToolCallUpdate.status:type_name -> compass.v1.AgentToolCallStatus - 44, // 29: compass.v1.SessionToolCallUpdate.diffs:type_name -> compass.v1.SessionFileDiff - 38, // 30: compass.v1.SessionPlan.entries:type_name -> compass.v1.AgentPlanEntry - 6, // 31: compass.v1.SessionInjection.op_kind:type_name -> compass.v1.SessionInjectionKind - 7, // 32: compass.v1.SessionError.kind:type_name -> compass.v1.SessionErrorKind - 39, // 33: compass.v1.AgentSessionFrame.event:type_name -> compass.v1.SessionEvent - 3, // 34: compass.v1.AgentSessionFrame.state:type_name -> compass.v1.AgentSessionState - 34, // 35: compass.v1.GetAgentStatusResponse.statuses:type_name -> compass.v1.AgentSessionStatus - 75, // 36: compass.v1.ModelRegistryEntry.candidates:type_name -> compass.v1.ModelCandidate - 76, // 37: compass.v1.ModelRegistryEntry.metadata:type_name -> compass.v1.ModelMetadata - 96, // 38: compass.v1.ModelRegistry.entries:type_name -> compass.v1.ModelRegistry.EntriesEntry - 78, // 39: compass.v1.PutModelRegistryRequest.registry:type_name -> compass.v1.ModelRegistry - 78, // 40: compass.v1.GetModelRegistryResponse.registry:type_name -> compass.v1.ModelRegistry - 9, // 41: compass.v1.ForgeRef.provider:type_name -> compass.v1.ForgeProvider - 86, // 42: compass.v1.Issue.forge:type_name -> compass.v1.ForgeRef - 85, // 43: compass.v1.Issue.agent:type_name -> compass.v1.AgentAttribution - 97, // 44: compass.v1.Issue.updated_at:type_name -> google.protobuf.Timestamp - 8, // 45: compass.v1.Issue.state:type_name -> compass.v1.IssueState - 88, // 46: compass.v1.Issue.prs:type_name -> compass.v1.PullRequest - 92, // 47: compass.v1.Issue.tracker:type_name -> compass.v1.TrackerRef - 86, // 48: compass.v1.PullRequest.forge:type_name -> compass.v1.ForgeRef - 85, // 49: compass.v1.PullRequest.agent:type_name -> compass.v1.AgentAttribution - 91, // 50: compass.v1.PullRequest.changed:type_name -> compass.v1.ChangedStats - 89, // 51: compass.v1.PullRequest.checks:type_name -> compass.v1.ChecksSummary - 93, // 52: compass.v1.PullRequest.reviews:type_name -> compass.v1.Review - 94, // 53: compass.v1.PullRequest.threads:type_name -> compass.v1.ReviewThread - 90, // 54: compass.v1.ChecksSummary.checks:type_name -> compass.v1.Check - 95, // 55: compass.v1.ReviewThread.comments:type_name -> compass.v1.Comment - 77, // 56: compass.v1.ModelRegistry.EntriesEntry.value:type_name -> compass.v1.ModelRegistryEntry - 24, // 57: compass.v1.CompassService.GetServerInfo:input_type -> compass.v1.GetServerInfoRequest - 26, // 58: compass.v1.CompassService.WhoAmI:input_type -> compass.v1.WhoAmIRequest - 28, // 59: compass.v1.CompassService.SubscribeEvents:input_type -> compass.v1.SubscribeEventsRequest - 30, // 60: compass.v1.CompassService.ListBoardIssues:input_type -> compass.v1.ListBoardIssuesRequest - 51, // 61: compass.v1.CompassService.ProvisionAgentWorkspace:input_type -> compass.v1.ProvisionAgentWorkspaceRequest - 55, // 62: compass.v1.CompassService.StartAgentSession:input_type -> compass.v1.StartAgentSessionRequest - 57, // 63: compass.v1.CompassService.SpawnAgent:input_type -> compass.v1.SpawnAgentRequest - 59, // 64: compass.v1.CompassService.StopAgentSession:input_type -> compass.v1.StopAgentSessionRequest - 53, // 65: compass.v1.CompassService.RemoveAgentWorkspace:input_type -> compass.v1.RemoveAgentWorkspaceRequest - 61, // 66: compass.v1.CompassService.ReloadAgentSession:input_type -> compass.v1.ReloadAgentSessionRequest - 63, // 67: compass.v1.CompassService.GetAgentStatus:input_type -> compass.v1.GetAgentStatusRequest - 49, // 68: compass.v1.CompassService.SubscribeAgentSession:input_type -> compass.v1.SubscribeAgentSessionRequest - 65, // 69: compass.v1.CompassService.IssueToken:input_type -> compass.v1.IssueTokenRequest - 67, // 70: compass.v1.CompassService.RevokeToken:input_type -> compass.v1.RevokeTokenRequest - 69, // 71: compass.v1.CompassService.PutAgentConfig:input_type -> compass.v1.PutAgentConfigRequest - 71, // 72: compass.v1.CompassService.GetAgentConfigInfo:input_type -> compass.v1.GetAgentConfigInfoRequest - 73, // 73: compass.v1.CompassService.DeleteAgentConfig:input_type -> compass.v1.DeleteAgentConfigRequest - 79, // 74: compass.v1.CompassService.PutModelRegistry:input_type -> compass.v1.PutModelRegistryRequest - 81, // 75: compass.v1.CompassService.GetModelRegistry:input_type -> compass.v1.GetModelRegistryRequest - 83, // 76: compass.v1.CompassService.DeleteModelRegistry:input_type -> compass.v1.DeleteModelRegistryRequest - 10, // 77: compass.v1.SecretsService.SetSecret:input_type -> compass.v1.SetSecretRequest - 12, // 78: compass.v1.SecretsService.ListSecrets:input_type -> compass.v1.ListSecretsRequest - 15, // 79: compass.v1.SecretsService.DeleteSecret:input_type -> compass.v1.DeleteSecretRequest - 17, // 80: compass.v1.SecretsService.SetServerSecret:input_type -> compass.v1.SetServerSecretRequest - 19, // 81: compass.v1.SecretsService.DeleteServerSecret:input_type -> compass.v1.DeleteServerSecretRequest - 21, // 82: compass.v1.SecretsService.ListServerSecrets:input_type -> compass.v1.ListServerSecretsRequest - 25, // 83: compass.v1.CompassService.GetServerInfo:output_type -> compass.v1.GetServerInfoResponse - 27, // 84: compass.v1.CompassService.WhoAmI:output_type -> compass.v1.WhoAmIResponse - 29, // 85: compass.v1.CompassService.SubscribeEvents:output_type -> compass.v1.SubscribeEventsResponse - 31, // 86: compass.v1.CompassService.ListBoardIssues:output_type -> compass.v1.ListBoardIssuesResponse - 52, // 87: compass.v1.CompassService.ProvisionAgentWorkspace:output_type -> compass.v1.ProvisionAgentWorkspaceResponse - 56, // 88: compass.v1.CompassService.StartAgentSession:output_type -> compass.v1.StartAgentSessionResponse - 58, // 89: compass.v1.CompassService.SpawnAgent:output_type -> compass.v1.SpawnAgentResponse - 60, // 90: compass.v1.CompassService.StopAgentSession:output_type -> compass.v1.StopAgentSessionResponse - 54, // 91: compass.v1.CompassService.RemoveAgentWorkspace:output_type -> compass.v1.RemoveAgentWorkspaceResponse - 62, // 92: compass.v1.CompassService.ReloadAgentSession:output_type -> compass.v1.ReloadAgentSessionResponse - 64, // 93: compass.v1.CompassService.GetAgentStatus:output_type -> compass.v1.GetAgentStatusResponse - 50, // 94: compass.v1.CompassService.SubscribeAgentSession:output_type -> compass.v1.AgentSessionFrame - 66, // 95: compass.v1.CompassService.IssueToken:output_type -> compass.v1.IssueTokenResponse - 68, // 96: compass.v1.CompassService.RevokeToken:output_type -> compass.v1.RevokeTokenResponse - 70, // 97: compass.v1.CompassService.PutAgentConfig:output_type -> compass.v1.PutAgentConfigResponse - 72, // 98: compass.v1.CompassService.GetAgentConfigInfo:output_type -> compass.v1.GetAgentConfigInfoResponse - 74, // 99: compass.v1.CompassService.DeleteAgentConfig:output_type -> compass.v1.DeleteAgentConfigResponse - 80, // 100: compass.v1.CompassService.PutModelRegistry:output_type -> compass.v1.PutModelRegistryResponse - 82, // 101: compass.v1.CompassService.GetModelRegistry:output_type -> compass.v1.GetModelRegistryResponse - 84, // 102: compass.v1.CompassService.DeleteModelRegistry:output_type -> compass.v1.DeleteModelRegistryResponse - 11, // 103: compass.v1.SecretsService.SetSecret:output_type -> compass.v1.SetSecretResponse - 13, // 104: compass.v1.SecretsService.ListSecrets:output_type -> compass.v1.ListSecretsResponse - 16, // 105: compass.v1.SecretsService.DeleteSecret:output_type -> compass.v1.DeleteSecretResponse - 18, // 106: compass.v1.SecretsService.SetServerSecret:output_type -> compass.v1.SetServerSecretResponse - 20, // 107: compass.v1.SecretsService.DeleteServerSecret:output_type -> compass.v1.DeleteServerSecretResponse - 22, // 108: compass.v1.SecretsService.ListServerSecrets:output_type -> compass.v1.ListServerSecretsResponse - 83, // [83:109] is the sub-list for method output_type - 57, // [57:83] is the sub-list for method input_type - 57, // [57:57] is the sub-list for extension type_name - 57, // [57:57] is the sub-list for extension extendee - 0, // [0:57] is the sub-list for field type_name + 5, // 15: compass.v1.AgentSessionStatus.state:type_name -> compass.v1.AgentSessionState + 3, // 16: compass.v1.AgentSessionStatus.runtime_tier:type_name -> compass.v1.RuntimeTier + 4, // 17: compass.v1.AgentSessionStatus.egress_posture:type_name -> compass.v1.EgressPosture + 6, // 18: compass.v1.AgentToolCall.status:type_name -> compass.v1.AgentToolCallStatus + 40, // 19: compass.v1.AgentPlan.entries:type_name -> compass.v1.AgentPlanEntry + 7, // 20: compass.v1.AgentPlanEntry.status:type_name -> compass.v1.AgentPlanEntryStatus + 42, // 21: compass.v1.SessionEvent.assistant_text:type_name -> compass.v1.SessionAssistantText + 43, // 22: compass.v1.SessionEvent.thinking:type_name -> compass.v1.SessionThinking + 44, // 23: compass.v1.SessionEvent.tool_call:type_name -> compass.v1.SessionToolCall + 45, // 24: compass.v1.SessionEvent.tool_call_update:type_name -> compass.v1.SessionToolCallUpdate + 47, // 25: compass.v1.SessionEvent.plan:type_name -> compass.v1.SessionPlan + 48, // 26: compass.v1.SessionEvent.notice:type_name -> compass.v1.SessionNotice + 49, // 27: compass.v1.SessionEvent.session_injection:type_name -> compass.v1.SessionInjection + 50, // 28: compass.v1.SessionEvent.session_error:type_name -> compass.v1.SessionError + 6, // 29: compass.v1.SessionToolCall.status:type_name -> compass.v1.AgentToolCallStatus + 6, // 30: compass.v1.SessionToolCallUpdate.status:type_name -> compass.v1.AgentToolCallStatus + 46, // 31: compass.v1.SessionToolCallUpdate.diffs:type_name -> compass.v1.SessionFileDiff + 40, // 32: compass.v1.SessionPlan.entries:type_name -> compass.v1.AgentPlanEntry + 8, // 33: compass.v1.SessionInjection.op_kind:type_name -> compass.v1.SessionInjectionKind + 9, // 34: compass.v1.SessionError.kind:type_name -> compass.v1.SessionErrorKind + 41, // 35: compass.v1.AgentSessionFrame.event:type_name -> compass.v1.SessionEvent + 5, // 36: compass.v1.AgentSessionFrame.state:type_name -> compass.v1.AgentSessionState + 36, // 37: compass.v1.GetAgentStatusResponse.statuses:type_name -> compass.v1.AgentSessionStatus + 77, // 38: compass.v1.ModelRegistryEntry.candidates:type_name -> compass.v1.ModelCandidate + 78, // 39: compass.v1.ModelRegistryEntry.metadata:type_name -> compass.v1.ModelMetadata + 98, // 40: compass.v1.ModelRegistry.entries:type_name -> compass.v1.ModelRegistry.EntriesEntry + 80, // 41: compass.v1.PutModelRegistryRequest.registry:type_name -> compass.v1.ModelRegistry + 80, // 42: compass.v1.GetModelRegistryResponse.registry:type_name -> compass.v1.ModelRegistry + 11, // 43: compass.v1.ForgeRef.provider:type_name -> compass.v1.ForgeProvider + 88, // 44: compass.v1.Issue.forge:type_name -> compass.v1.ForgeRef + 87, // 45: compass.v1.Issue.agent:type_name -> compass.v1.AgentAttribution + 99, // 46: compass.v1.Issue.updated_at:type_name -> google.protobuf.Timestamp + 10, // 47: compass.v1.Issue.state:type_name -> compass.v1.IssueState + 90, // 48: compass.v1.Issue.prs:type_name -> compass.v1.PullRequest + 94, // 49: compass.v1.Issue.tracker:type_name -> compass.v1.TrackerRef + 88, // 50: compass.v1.PullRequest.forge:type_name -> compass.v1.ForgeRef + 87, // 51: compass.v1.PullRequest.agent:type_name -> compass.v1.AgentAttribution + 93, // 52: compass.v1.PullRequest.changed:type_name -> compass.v1.ChangedStats + 91, // 53: compass.v1.PullRequest.checks:type_name -> compass.v1.ChecksSummary + 95, // 54: compass.v1.PullRequest.reviews:type_name -> compass.v1.Review + 96, // 55: compass.v1.PullRequest.threads:type_name -> compass.v1.ReviewThread + 92, // 56: compass.v1.ChecksSummary.checks:type_name -> compass.v1.Check + 97, // 57: compass.v1.ReviewThread.comments:type_name -> compass.v1.Comment + 79, // 58: compass.v1.ModelRegistry.EntriesEntry.value:type_name -> compass.v1.ModelRegistryEntry + 26, // 59: compass.v1.CompassService.GetServerInfo:input_type -> compass.v1.GetServerInfoRequest + 28, // 60: compass.v1.CompassService.WhoAmI:input_type -> compass.v1.WhoAmIRequest + 30, // 61: compass.v1.CompassService.SubscribeEvents:input_type -> compass.v1.SubscribeEventsRequest + 32, // 62: compass.v1.CompassService.ListBoardIssues:input_type -> compass.v1.ListBoardIssuesRequest + 53, // 63: compass.v1.CompassService.ProvisionAgentWorkspace:input_type -> compass.v1.ProvisionAgentWorkspaceRequest + 57, // 64: compass.v1.CompassService.StartAgentSession:input_type -> compass.v1.StartAgentSessionRequest + 59, // 65: compass.v1.CompassService.SpawnAgent:input_type -> compass.v1.SpawnAgentRequest + 61, // 66: compass.v1.CompassService.StopAgentSession:input_type -> compass.v1.StopAgentSessionRequest + 55, // 67: compass.v1.CompassService.RemoveAgentWorkspace:input_type -> compass.v1.RemoveAgentWorkspaceRequest + 63, // 68: compass.v1.CompassService.ReloadAgentSession:input_type -> compass.v1.ReloadAgentSessionRequest + 65, // 69: compass.v1.CompassService.GetAgentStatus:input_type -> compass.v1.GetAgentStatusRequest + 51, // 70: compass.v1.CompassService.SubscribeAgentSession:input_type -> compass.v1.SubscribeAgentSessionRequest + 67, // 71: compass.v1.CompassService.IssueToken:input_type -> compass.v1.IssueTokenRequest + 69, // 72: compass.v1.CompassService.RevokeToken:input_type -> compass.v1.RevokeTokenRequest + 71, // 73: compass.v1.CompassService.PutAgentConfig:input_type -> compass.v1.PutAgentConfigRequest + 73, // 74: compass.v1.CompassService.GetAgentConfigInfo:input_type -> compass.v1.GetAgentConfigInfoRequest + 75, // 75: compass.v1.CompassService.DeleteAgentConfig:input_type -> compass.v1.DeleteAgentConfigRequest + 81, // 76: compass.v1.CompassService.PutModelRegistry:input_type -> compass.v1.PutModelRegistryRequest + 83, // 77: compass.v1.CompassService.GetModelRegistry:input_type -> compass.v1.GetModelRegistryRequest + 85, // 78: compass.v1.CompassService.DeleteModelRegistry:input_type -> compass.v1.DeleteModelRegistryRequest + 12, // 79: compass.v1.SecretsService.SetSecret:input_type -> compass.v1.SetSecretRequest + 14, // 80: compass.v1.SecretsService.ListSecrets:input_type -> compass.v1.ListSecretsRequest + 17, // 81: compass.v1.SecretsService.DeleteSecret:input_type -> compass.v1.DeleteSecretRequest + 19, // 82: compass.v1.SecretsService.SetServerSecret:input_type -> compass.v1.SetServerSecretRequest + 21, // 83: compass.v1.SecretsService.DeleteServerSecret:input_type -> compass.v1.DeleteServerSecretRequest + 23, // 84: compass.v1.SecretsService.ListServerSecrets:input_type -> compass.v1.ListServerSecretsRequest + 27, // 85: compass.v1.CompassService.GetServerInfo:output_type -> compass.v1.GetServerInfoResponse + 29, // 86: compass.v1.CompassService.WhoAmI:output_type -> compass.v1.WhoAmIResponse + 31, // 87: compass.v1.CompassService.SubscribeEvents:output_type -> compass.v1.SubscribeEventsResponse + 33, // 88: compass.v1.CompassService.ListBoardIssues:output_type -> compass.v1.ListBoardIssuesResponse + 54, // 89: compass.v1.CompassService.ProvisionAgentWorkspace:output_type -> compass.v1.ProvisionAgentWorkspaceResponse + 58, // 90: compass.v1.CompassService.StartAgentSession:output_type -> compass.v1.StartAgentSessionResponse + 60, // 91: compass.v1.CompassService.SpawnAgent:output_type -> compass.v1.SpawnAgentResponse + 62, // 92: compass.v1.CompassService.StopAgentSession:output_type -> compass.v1.StopAgentSessionResponse + 56, // 93: compass.v1.CompassService.RemoveAgentWorkspace:output_type -> compass.v1.RemoveAgentWorkspaceResponse + 64, // 94: compass.v1.CompassService.ReloadAgentSession:output_type -> compass.v1.ReloadAgentSessionResponse + 66, // 95: compass.v1.CompassService.GetAgentStatus:output_type -> compass.v1.GetAgentStatusResponse + 52, // 96: compass.v1.CompassService.SubscribeAgentSession:output_type -> compass.v1.AgentSessionFrame + 68, // 97: compass.v1.CompassService.IssueToken:output_type -> compass.v1.IssueTokenResponse + 70, // 98: compass.v1.CompassService.RevokeToken:output_type -> compass.v1.RevokeTokenResponse + 72, // 99: compass.v1.CompassService.PutAgentConfig:output_type -> compass.v1.PutAgentConfigResponse + 74, // 100: compass.v1.CompassService.GetAgentConfigInfo:output_type -> compass.v1.GetAgentConfigInfoResponse + 76, // 101: compass.v1.CompassService.DeleteAgentConfig:output_type -> compass.v1.DeleteAgentConfigResponse + 82, // 102: compass.v1.CompassService.PutModelRegistry:output_type -> compass.v1.PutModelRegistryResponse + 84, // 103: compass.v1.CompassService.GetModelRegistry:output_type -> compass.v1.GetModelRegistryResponse + 86, // 104: compass.v1.CompassService.DeleteModelRegistry:output_type -> compass.v1.DeleteModelRegistryResponse + 13, // 105: compass.v1.SecretsService.SetSecret:output_type -> compass.v1.SetSecretResponse + 15, // 106: compass.v1.SecretsService.ListSecrets:output_type -> compass.v1.ListSecretsResponse + 18, // 107: compass.v1.SecretsService.DeleteSecret:output_type -> compass.v1.DeleteSecretResponse + 20, // 108: compass.v1.SecretsService.SetServerSecret:output_type -> compass.v1.SetServerSecretResponse + 22, // 109: compass.v1.SecretsService.DeleteServerSecret:output_type -> compass.v1.DeleteServerSecretResponse + 24, // 110: compass.v1.SecretsService.ListServerSecrets:output_type -> compass.v1.ListServerSecretsResponse + 85, // [85:111] is the sub-list for method output_type + 59, // [59:85] is the sub-list for method input_type + 59, // [59:59] is the sub-list for extension type_name + 59, // [59:59] is the sub-list for extension extendee + 0, // [0:59] is the sub-list for field type_name } func init() { file_compass_v1_compass_proto_init() } @@ -6488,7 +6637,7 @@ func file_compass_v1_compass_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_compass_v1_compass_proto_rawDesc), len(file_compass_v1_compass_proto_rawDesc)), - NumEnums: 10, + NumEnums: 12, NumMessages: 87, NumExtensions: 0, NumServices: 2, diff --git a/go/internal/runner/host.go b/go/internal/runner/host.go index 42478df3d..38ab054bb 100644 --- a/go/internal/runner/host.go +++ b/go/internal/runner/host.go @@ -676,11 +676,11 @@ func (h *agentHost) Status(_ context.Context, sessionID string) ([]*compassv1.Ag if !ok { return nil, errSessionUnknown } - return []*compassv1.AgentSessionStatus{{SessionId: s.sessionID, State: s.state, AgentAccountId: s.agentAccountID}}, nil + return []*compassv1.AgentSessionStatus{h.statusOf(s)}, nil } out := make([]*compassv1.AgentSessionStatus, 0, len(h.sessions)) for _, s := range h.sessions { - out = append(out, &compassv1.AgentSessionStatus{SessionId: s.sessionID, State: s.state, AgentAccountId: s.agentAccountID}) + out = append(out, h.statusOf(s)) } return out, nil } @@ -837,6 +837,20 @@ func (h *agentHost) RefreshConfig(ctx context.Context) error { return nil } +// statusOf stamps a live session with the tier and egress posture of the +// backend this Runner resolved. Both are Runner-wide, not per-session: the +// Runner reports them because it is the component that picked the backend, so a +// client never has to infer containment from a tier name. +func (h *agentHost) statusOf(s *liveSession) *compassv1.AgentSessionStatus { + return &compassv1.AgentSessionStatus{ + SessionId: s.sessionID, + State: s.state, + AgentAccountId: s.agentAccountID, + RuntimeTier: runtimeTierProto(runtime.TierOf(h.engine)), + EgressPosture: egressPostureProto(h.runtime.EgressPosture()), + } +} + // provisionVsockGateway is Provision's microVM leg: it launches the container // with NO agent-socket mount and NO config mount (record §(c)/§(f)), resolves // the per-session host-side gateway path the backend serves the AgentGateway on, diff --git a/go/internal/runner/host_test.go b/go/internal/runner/host_test.go index 97b7d10c9..a98b72677 100644 --- a/go/internal/runner/host_test.go +++ b/go/internal/runner/host_test.go @@ -787,6 +787,68 @@ func TestCloseJoinsConcurrentTeardowns(t *testing.T) { // started session appears with its live state, and a stopped one is gone. The // Runner is authoritative for live truth. A bug that answered from a stale or // external source would not reflect the live set. +// hostTierStubRuntime is the streaming stub that also answers the tier and +// unenforced-egress capabilities, standing in for the host backend so the +// Status stamp is exercisable without spawning host children. +type hostTierStubRuntime struct { + *stubStreamingRuntime +} + +func (hostTierStubRuntime) Tier() runtime.WorkloadTier { return runtime.WorkloadTierHost } +func (hostTierStubRuntime) EgressUnenforced() bool { return true } + +// TestStatusStampsTheTierAndEgressPosture: the Runner reports both, because it +// is the component that resolved the backend. BOTH arms must stamp them — the +// targeted one and the all-sessions one — mirroring the account stamp below; a +// client reading the all-arm would otherwise render an uncontained host session +// as unspecified. +func TestStatusStampsTheTierAndEgressPosture(t *testing.T) { + // The host tier refuses a configured policy, which is the point of the + // posture — so its spec carries none, as the Runner's own resolution does. + hostSpec := liveSpec() + hostSpec.Egress = runtime.EgressPolicy{} + specs := &fakeSpecBuilder{spec: hostSpec} + engine := hostTierStubRuntime{stubStreamingRuntime: newStubStreamingRuntime(t)} + registry := runtime.NewAgentRegistry() + rt := runtime.NewAgentRuntimeWithRegistry(engine, registry) + link := newLink(newRunnerServiceServer(t, newCapturePublish())) + var n int + host := NewSessionHost(link, rt, registry, engine, specs, + AgentHostConfig{RuntimeDir: t.TempDir()}, discardLoggerRunner(), + func() string { n++; return "sess-" + string(rune('0'+n)) }) + ctx := context.Background() + + if _, err := host.Provision(ctx, &compassv1.ProvisionAgentWorkspaceRequest{AgentHandle: "0123456789abcdef0123456789abcdef"}); err != nil { + t.Fatalf("Provision = %v", err) + } + sessionID, err := host.Start(ctx, &compassv1.StartAgentSessionRequest{ContainerName: "cont-1"}, "") + if err != nil { + t.Fatalf("Start = %v", err) + } + + one, err := host.Status(ctx, sessionID) + if err != nil || len(one) != 1 { + t.Fatalf("Status(one) = %+v, %v", one, err) + } + if got := one[0].GetRuntimeTier(); got != compassv1.RuntimeTier_RUNTIME_TIER_HOST { + t.Errorf("Status(one) tier = %v, want RUNTIME_TIER_HOST", got) + } + if got := one[0].GetEgressPosture(); got != compassv1.EgressPosture_EGRESS_POSTURE_UNENFORCED { + t.Errorf("Status(one) posture = %v, want EGRESS_POSTURE_UNENFORCED", got) + } + + all, err := host.Status(ctx, "") + if err != nil || len(all) != 1 { + t.Fatalf("Status(all) = %+v, %v", all, err) + } + if got := all[0].GetRuntimeTier(); got != compassv1.RuntimeTier_RUNTIME_TIER_HOST { + t.Errorf("Status(all) tier = %v, want RUNTIME_TIER_HOST (the all-arm must stamp it too)", got) + } + if got := all[0].GetEgressPosture(); got != compassv1.EgressPosture_EGRESS_POSTURE_UNENFORCED { + t.Errorf("Status(all) posture = %v, want EGRESS_POSTURE_UNENFORCED (the all-arm must stamp it too)", got) + } +} + func TestStatusIsAnsweredFromLiveSet(t *testing.T) { specs := &fakeSpecBuilder{spec: liveSpec()} host, _, _ := newHostFixture(t, specs) diff --git a/go/internal/runner/tier_proto.go b/go/internal/runner/tier_proto.go new file mode 100644 index 000000000..6d7e41331 --- /dev/null +++ b/go/internal/runner/tier_proto.go @@ -0,0 +1,36 @@ +// Wire mapping for the runtime tier and egress posture a session reports. +// Both map an unknown value onto UNSPECIFIED rather than a plausible default: a +// security surface that guesses is worse than one that says it does not know. + +package runner + +import ( + compassv1 "github.com/RigelBuild/compass/go/gen/compass/v1" + "github.com/RigelBuild/compass/go/internal/runtime" +) + +func runtimeTierProto(tier runtime.WorkloadTier) compassv1.RuntimeTier { + switch tier { + case runtime.WorkloadTierPodman: + return compassv1.RuntimeTier_RUNTIME_TIER_PODMAN + case runtime.WorkloadTierMicroVM: + return compassv1.RuntimeTier_RUNTIME_TIER_MICROVM + case runtime.WorkloadTierAppleContainer: + return compassv1.RuntimeTier_RUNTIME_TIER_APPLE_CONTAINER + case runtime.WorkloadTierHost: + return compassv1.RuntimeTier_RUNTIME_TIER_HOST + default: + return compassv1.RuntimeTier_RUNTIME_TIER_UNSPECIFIED + } +} + +func egressPostureProto(posture runtime.EgressPosture) compassv1.EgressPosture { + switch posture { + case runtime.EgressPostureArmed: + return compassv1.EgressPosture_EGRESS_POSTURE_ARMED + case runtime.EgressPostureUnenforced: + return compassv1.EgressPosture_EGRESS_POSTURE_UNENFORCED + default: + return compassv1.EgressPosture_EGRESS_POSTURE_UNSPECIFIED + } +} diff --git a/go/internal/runtime/tier.go b/go/internal/runtime/tier.go new file mode 100644 index 000000000..37c367012 --- /dev/null +++ b/go/internal/runtime/tier.go @@ -0,0 +1,49 @@ +// Tier identity: what kind of isolation boundary a backend puts an agent +// behind. Reported outward per session so an operator can see which boundary +// their agent actually got, rather than inferring it from a green launch. + +package runtime + +// WorkloadTier names the isolation boundary a backend provides. +type WorkloadTier string + +const ( + // WorkloadTierPodman is a rootless container with its own network namespace. + WorkloadTierPodman WorkloadTier = "podman" + // WorkloadTierMicroVM is a hardware-virtualized guest. + WorkloadTierMicroVM WorkloadTier = "microvm" + // WorkloadTierAppleContainer is Apple's container runtime on macOS. + WorkloadTierAppleContainer WorkloadTier = "apple-container" + // WorkloadTierHost is a direct child process of the Runner — no boundary. + WorkloadTierHost WorkloadTier = "host" +) + +// workloadTierNamer is a backend that names its own tier. Like the egress +// markers, it is deliberately NOT a verb on the frozen WorkloadRuntime +// interface (podman.go): callers probe for it. A WorkloadRuntime decorator must +// re-expose Tier, or the session surface loses the tier it reports. +type workloadTierNamer interface { + Tier() WorkloadTier +} + +// TierOf names the tier a backend provides. An unrecognized backend reports the +// empty tier rather than guessing: a wrong tier on a security surface is worse +// than an absent one, and the wire's unspecified value renders as unknown. +func TierOf(engine WorkloadRuntime) WorkloadTier { + if namer, ok := engine.(workloadTierNamer); ok { + return namer.Tier() + } + return "" +} + +// Tier reports the podman tier. +func (p *PodmanCLI) Tier() WorkloadTier { return WorkloadTierPodman } + +// Tier reports the microVM tier. +func (m *MicroVMRuntime) Tier() WorkloadTier { return WorkloadTierMicroVM } + +// Tier reports the Apple-container tier. +func (a *AppleContainerCLI) Tier() WorkloadTier { return WorkloadTierAppleContainer } + +// Tier reports the host tier. +func (h *HostRuntime) Tier() WorkloadTier { return WorkloadTierHost } diff --git a/go/internal/runtime/tier_test.go b/go/internal/runtime/tier_test.go new file mode 100644 index 000000000..1d0b789a3 --- /dev/null +++ b/go/internal/runtime/tier_test.go @@ -0,0 +1,56 @@ +package runtime + +import "testing" + +// TestEveryBackendNamesItsOwnTier: the tier is reported on a security surface, +// so each production backend must name itself rather than fall through to the +// empty tier. A backend added without a Tier method would fail here. +func TestEveryBackendNamesItsOwnTier(t *testing.T) { + for _, tc := range []struct { + name string + engine WorkloadRuntime + want WorkloadTier + }{ + {"podman", NewPodmanCLI(), WorkloadTierPodman}, + {"microvm", NewMicroVMRuntime(MicroVMConfig{}), WorkloadTierMicroVM}, + {"apple-container", NewAppleContainerCLI(AppleContainerConfig{}), WorkloadTierAppleContainer}, + {"host", NewHostRuntime(t.TempDir()), WorkloadTierHost}, + } { + if got := TierOf(tc.engine); got != tc.want { + t.Errorf("TierOf(%s) = %q, want %q", tc.name, got, tc.want) + } + } +} + +// TestTierOfReportsUnknownRatherThanGuessing: a backend that does not name its +// tier reports the empty tier, which the wire renders as unspecified. Defaulting +// to a plausible tier would mislabel a session on a surface an operator trusts. +func TestTierOfReportsUnknownRatherThanGuessing(t *testing.T) { + if got := TierOf(newFakeRuntime(t)); got != "" { + t.Errorf("TierOf(a backend with no Tier method) = %q, want the empty tier", got) + } +} + +// TestSelectBackendTierMatchesTheRequestedBackend closes the loop the two tests +// above leave open: each is correct in isolation, but a mis-wired SelectBackend +// arm would hand back a healthy backend of the WRONG tier and both would still +// pass. The empty string is podman's documented default. +func TestSelectBackendTierMatchesTheRequestedBackend(t *testing.T) { + for _, tc := range []struct { + backend string + want WorkloadTier + }{ + {"", WorkloadTierPodman}, + {"podman", WorkloadTierPodman}, + {"microvm", WorkloadTierMicroVM}, + {"host", WorkloadTierHost}, + } { + engine, err := SelectBackend(BackendConfig{Backend: tc.backend}) + if err != nil { + t.Fatalf("SelectBackend(%q) error = %v", tc.backend, err) + } + if got := TierOf(engine); got != tc.want { + t.Errorf("SelectBackend(%q) resolved a backend of tier %q, want %q", tc.backend, got, tc.want) + } + } +} diff --git a/packages/compass-agent/src/gen/compass/v1/compass_pb.ts b/packages/compass-agent/src/gen/compass/v1/compass_pb.ts index c62d151ba..cc0b54ac6 100644 --- a/packages/compass-agent/src/gen/compass/v1/compass_pb.ts +++ b/packages/compass-agent/src/gen/compass/v1/compass_pb.ts @@ -20,7 +20,7 @@ import type { Message } from "@bufbuild/protobuf"; * Describes the file compass/v1/compass.proto. */ export const file_compass_v1_compass: GenFile = /*@__PURE__*/ - fileDesc("Chhjb21wYXNzL3YxL2NvbXBhc3MucHJvdG8SCmNvbXBhc3MudjEiqAEKEFNldFNlY3JldFJlcXVlc3QSDAoEbmFtZRgBIAEoCRISCgV2YWx1ZRgCIAEoCUIDgAEBEiwKCGRlbGl2ZXJ5GAMgASgOMhouY29tcGFzcy52MS5TZWNyZXREZWxpdmVyeRIkCgRraW5kGAQgASgOMhYuY29tcGFzcy52MS5TZWNyZXRLaW5kEhAKCHByb3ZpZGVyGAUgASgJEgwKBGhvc3QYBiABKAkiEwoRU2V0U2VjcmV0UmVzcG9uc2UiFAoSTGlzdFNlY3JldHNSZXF1ZXN0IkAKE0xpc3RTZWNyZXRzUmVzcG9uc2USKQoHc2VjcmV0cxgBIAMoCzIYLmNvbXBhc3MudjEuU2VjcmV0U3RhdHVzIqABCgxTZWNyZXRTdGF0dXMSDAoEbmFtZRgBIAEoCRIOCgZpc19zZXQYAiABKAgSLAoIZGVsaXZlcnkYAyABKA4yGi5jb21wYXNzLnYxLlNlY3JldERlbGl2ZXJ5EiQKBGtpbmQYBCABKA4yFi5jb21wYXNzLnYxLlNlY3JldEtpbmQSEAoIcHJvdmlkZXIYBSABKAkSDAoEaG9zdBgGIAEoCSIjChNEZWxldGVTZWNyZXRSZXF1ZXN0EgwKBG5hbWUYASABKAkiFgoURGVsZXRlU2VjcmV0UmVzcG9uc2UiOgoWU2V0U2VydmVyU2VjcmV0UmVxdWVzdBIMCgRuYW1lGAEgASgJEhIKBXZhbHVlGAIgASgJQgOAAQEiGQoXU2V0U2VydmVyU2VjcmV0UmVzcG9uc2UiKQoZRGVsZXRlU2VydmVyU2VjcmV0UmVxdWVzdBIMCgRuYW1lGAEgASgJIhwKGkRlbGV0ZVNlcnZlclNlY3JldFJlc3BvbnNlIhoKGExpc3RTZXJ2ZXJTZWNyZXRzUmVxdWVzdCJTChlMaXN0U2VydmVyU2VjcmV0c1Jlc3BvbnNlEjYKDnNlcnZlcl9zZWNyZXRzGAEgAygLMh4uY29tcGFzcy52MS5TZXJ2ZXJTZWNyZXRTdGF0dXMiMgoSU2VydmVyU2VjcmV0U3RhdHVzEgwKBG5hbWUYASABKAkSDgoGaXNfc2V0GAIgASgIIhYKFEdldFNlcnZlckluZm9SZXF1ZXN0Ij0KFUdldFNlcnZlckluZm9SZXNwb25zZRIPCgd2ZXJzaW9uGAEgASgJEhMKC2FwaV92ZXJzaW9uGAIgASgJIg8KDVdob0FtSVJlcXVlc3QiJAoOV2hvQW1JUmVzcG9uc2USEgoKYWNjb3VudF9pZBgBIAEoCSJDChZTdWJzY3JpYmVFdmVudHNSZXF1ZXN0EhEKCXNpbmNlX3NlcRgBIAEoBBIWCg5pbnN0YW5jZV9lcG9jaBgCIAEoBCLiAwoXU3Vic2NyaWJlRXZlbnRzUmVzcG9uc2USCwoDc2VxGAEgASgEEhIKCmF0X3VuaXhfbXMYAiABKAMSFgoOaW5zdGFuY2VfZXBvY2gYAyABKAQSFAoMc25hcHNob3Rfc2VxGAQgASgEEjEKDXNlcnZlcl9zdGF0dXMYCiABKAsyGC5jb21wYXNzLnYxLlNlcnZlclN0YXR1c0gAEjUKD3Jlc3luY19yZXF1aXJlZBgLIAEoCzIaLmNvbXBhc3MudjEuUmVzeW5jUmVxdWlyZWRIABI+ChRhZ2VudF9zZXNzaW9uX3N0YXR1cxgMIAEoCzIeLmNvbXBhc3MudjEuQWdlbnRTZXNzaW9uU3RhdHVzSAASPAoTYWdlbnRfbWVzc2FnZV9jaHVuaxgNIAEoCzIdLmNvbXBhc3MudjEuQWdlbnRNZXNzYWdlQ2h1bmtIABI0Cg9hZ2VudF90b29sX2NhbGwYDiABKAsyGS5jb21wYXNzLnYxLkFnZW50VG9vbENhbGxIABIrCgphZ2VudF9wbGFuGA8gASgLMhUuY29tcGFzcy52MS5BZ2VudFBsYW5IABIiCgVpc3N1ZRgQIAEoCzIRLmNvbXBhc3MudjEuSXNzdWVIAEIJCgdwYXlsb2FkIi4KFkxpc3RCb2FyZElzc3Vlc1JlcXVlc3QSFAoMc25hcHNob3Rfc2VxGAEgASgEIjwKF0xpc3RCb2FyZElzc3Vlc1Jlc3BvbnNlEiEKBmlzc3VlcxgBIAMoCzIRLmNvbXBhc3MudjEuSXNzdWUiNgoMU2VydmVyU3RhdHVzEiYKBXN0YXRlGAEgASgOMhcuY29tcGFzcy52MS5TZXJ2ZXJTdGF0ZSIQCg5SZXN5bmNSZXF1aXJlZCJwChJBZ2VudFNlc3Npb25TdGF0dXMSEgoKc2Vzc2lvbl9pZBgBIAEoCRIsCgVzdGF0ZRgCIAEoDjIdLmNvbXBhc3MudjEuQWdlbnRTZXNzaW9uU3RhdGUSGAoQYWdlbnRfYWNjb3VudF9pZBgDIAEoCSJJChFBZ2VudE1lc3NhZ2VDaHVuaxISCgpzZXNzaW9uX2lkGAEgASgJEgwKBHRleHQYAiABKAkSEgoKaXNfdGhvdWdodBgDIAEoCCJ5Cg1BZ2VudFRvb2xDYWxsEhIKCnNlc3Npb25faWQYASABKAkSFAoMdG9vbF9jYWxsX2lkGAIgASgJEg0KBXRpdGxlGAMgASgJEi8KBnN0YXR1cxgEIAEoDjIfLmNvbXBhc3MudjEuQWdlbnRUb29sQ2FsbFN0YXR1cyJMCglBZ2VudFBsYW4SEgoKc2Vzc2lvbl9pZBgBIAEoCRIrCgdlbnRyaWVzGAIgAygLMhouY29tcGFzcy52MS5BZ2VudFBsYW5FbnRyeSJTCg5BZ2VudFBsYW5FbnRyeRIPCgdjb250ZW50GAEgASgJEjAKBnN0YXR1cxgCIAEoDjIgLmNvbXBhc3MudjEuQWdlbnRQbGFuRW50cnlTdGF0dXMi3wMKDFNlc3Npb25FdmVudBIQCghldmVudF9pZBgBIAEoCRISCgphdF91bml4X21zGAIgASgDEjoKDmFzc2lzdGFudF90ZXh0GAMgASgLMiAuY29tcGFzcy52MS5TZXNzaW9uQXNzaXN0YW50VGV4dEgAEi8KCHRoaW5raW5nGAQgASgLMhsuY29tcGFzcy52MS5TZXNzaW9uVGhpbmtpbmdIABIwCgl0b29sX2NhbGwYBSABKAsyGy5jb21wYXNzLnYxLlNlc3Npb25Ub29sQ2FsbEgAEj0KEHRvb2xfY2FsbF91cGRhdGUYBiABKAsyIS5jb21wYXNzLnYxLlNlc3Npb25Ub29sQ2FsbFVwZGF0ZUgAEicKBHBsYW4YByABKAsyFy5jb21wYXNzLnYxLlNlc3Npb25QbGFuSAASKwoGbm90aWNlGAggASgLMhkuY29tcGFzcy52MS5TZXNzaW9uTm90aWNlSAASOQoRc2Vzc2lvbl9pbmplY3Rpb24YCSABKAsyHC5jb21wYXNzLnYxLlNlc3Npb25JbmplY3Rpb25IABIxCg1zZXNzaW9uX2Vycm9yGAogASgLMhguY29tcGFzcy52MS5TZXNzaW9uRXJyb3JIAEIHCgVldmVudCI4ChRTZXNzaW9uQXNzaXN0YW50VGV4dBIMCgR0ZXh0GAEgASgJEhIKCm1lc3NhZ2VfaWQYAiABKAkiMwoPU2Vzc2lvblRoaW5raW5nEgwKBHRleHQYASABKAkSEgoKbWVzc2FnZV9pZBgCIAEoCSJnCg9TZXNzaW9uVG9vbENhbGwSFAoMdG9vbF9jYWxsX2lkGAEgASgJEg0KBXRpdGxlGAIgASgJEi8KBnN0YXR1cxgDIAEoDjIfLmNvbXBhc3MudjEuQWdlbnRUb29sQ2FsbFN0YXR1cyKaAQoVU2Vzc2lvblRvb2xDYWxsVXBkYXRlEhQKDHRvb2xfY2FsbF9pZBgBIAEoCRIvCgZzdGF0dXMYAiABKA4yHy5jb21wYXNzLnYxLkFnZW50VG9vbENhbGxTdGF0dXMSDgoGb3V0cHV0GAMgASgJEioKBWRpZmZzGAQgAygLMhsuY29tcGFzcy52MS5TZXNzaW9uRmlsZURpZmYiVQoPU2Vzc2lvbkZpbGVEaWZmEgwKBHBhdGgYASABKAkSFQoIb2xkX3RleHQYAiABKAlIAIgBARIQCghuZXdfdGV4dBgDIAEoCUILCglfb2xkX3RleHQiOgoLU2Vzc2lvblBsYW4SKwoHZW50cmllcxgBIAMoCzIaLmNvbXBhc3MudjEuQWdlbnRQbGFuRW50cnkiOQoNU2Vzc2lvbk5vdGljZRIMCgR0ZXh0GAEgASgJEhEKBGxpbmsYAiABKAlIAIgBAUIHCgVfbGluayKDAQoQU2Vzc2lvbkluamVjdGlvbhIxCgdvcF9raW5kGAEgASgOMiAuY29tcGFzcy52MS5TZXNzaW9uSW5qZWN0aW9uS2luZBISCgptZXNzYWdlX2lkGAIgASgJEhMKC2Zyb21faGFuZGxlGAMgASgJEhMKC3RyYWNlcGFyZW50GAQgASgJImsKDFNlc3Npb25FcnJvchIqCgRraW5kGAEgASgOMhwuY29tcGFzcy52MS5TZXNzaW9uRXJyb3JLaW5kEg8KB21lc3NhZ2UYAiABKAkSEwoGc3RhdHVzGAMgASgFSACIAQFCCQoHX3N0YXR1cyIyChxTdWJzY3JpYmVBZ2VudFNlc3Npb25SZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkifgoRQWdlbnRTZXNzaW9uRnJhbWUSEgoKc2Vzc2lvbl9pZBgBIAEoCRInCgVldmVudBgCIAEoCzIYLmNvbXBhc3MudjEuU2Vzc2lvbkV2ZW50EiwKBXN0YXRlGAMgASgOMh0uY29tcGFzcy52MS5BZ2VudFNlc3Npb25TdGF0ZSJwCh5Qcm92aXNpb25BZ2VudFdvcmtzcGFjZVJlcXVlc3QSFAoMYWdlbnRfaGFuZGxlGAEgASgJEhkKEWNsaWVudF9yZXF1ZXN0X2lkGAIgASgJEg8KB3BlcnNvbmEYAyABKAkSDAoEcm9sZRgEIAEoCSI5Ch9Qcm92aXNpb25BZ2VudFdvcmtzcGFjZVJlc3BvbnNlEhYKDmNvbnRhaW5lcl9uYW1lGAEgASgJIlAKG1JlbW92ZUFnZW50V29ya3NwYWNlUmVxdWVzdBIWCg5jb250YWluZXJfbmFtZRgBIAEoCRIZChFjbGllbnRfcmVxdWVzdF9pZBgCIAEoCSIeChxSZW1vdmVBZ2VudFdvcmtzcGFjZVJlc3BvbnNlImMKGFN0YXJ0QWdlbnRTZXNzaW9uUmVxdWVzdBIWCg5jb250YWluZXJfbmFtZRgBIAEoCRIZChFyZXN1bWVfc2Vzc2lvbl9pZBgDIAEoCUoECAIQA1IOaW5pdGlhbF9wcm9tcHQiLwoZU3RhcnRBZ2VudFNlc3Npb25SZXNwb25zZRISCgpzZXNzaW9uX2lkGAEgASgJIloKEVNwYXduQWdlbnRSZXF1ZXN0EhQKDGFnZW50X2hhbmRsZRgBIAEoCRIZChFjbGllbnRfcmVxdWVzdF9pZBgDIAEoCUoECAIQA1IOaW5pdGlhbF9wcm9tcHQiQAoSU3Bhd25BZ2VudFJlc3BvbnNlEhIKCnNlc3Npb25faWQYASABKAkSFgoOY29udGFpbmVyX25hbWUYAiABKAkiLQoXU3RvcEFnZW50U2Vzc2lvblJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCSIaChhTdG9wQWdlbnRTZXNzaW9uUmVzcG9uc2UiLwoZUmVsb2FkQWdlbnRTZXNzaW9uUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJIjAKGlJlbG9hZEFnZW50U2Vzc2lvblJlc3BvbnNlEhIKCnNlc3Npb25faWQYASABKAkiKwoVR2V0QWdlbnRTdGF0dXNSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkiSgoWR2V0QWdlbnRTdGF0dXNSZXNwb25zZRIwCghzdGF0dXNlcxgBIAMoCzIeLmNvbXBhc3MudjEuQWdlbnRTZXNzaW9uU3RhdHVzIisKEUlzc3VlVG9rZW5SZXF1ZXN0EhYKDmFjY291bnRfaGFuZGxlGAEgASgJIiMKEklzc3VlVG9rZW5SZXNwb25zZRINCgV0b2tlbhgBIAEoCSIoChJSZXZva2VUb2tlblJlcXVlc3QSEgoFdG9rZW4YASABKAlCA4ABASIVChNSZXZva2VUb2tlblJlc3BvbnNlIicKFVB1dEFnZW50Q29uZmlnUmVxdWVzdBIOCgZidW5kbGUYASABKAwiKQoWUHV0QWdlbnRDb25maWdSZXNwb25zZRIPCgd2ZXJzaW9uGAEgASgJIhsKGUdldEFnZW50Q29uZmlnSW5mb1JlcXVlc3Qi2gEKGkdldEFnZW50Q29uZmlnSW5mb1Jlc3BvbnNlEg8KB3ZlcnNpb24YASABKAkSDgoGc2tpbGxzGAIgAygJEhIKCmV4dGVuc2lvbnMYAyADKAkSEwoLbWNwX3NlcnZlcnMYBCADKAkSFAoMaGFzX3NldHRpbmdzGAUgASgIEhUKDWhhc19hZ2VudHNfbWQYBiABKAgSDQoFcnVsZXMYByADKAkSEQoJc3ViYWdlbnRzGAggAygJEhIKCmhhc19tb2RlbHMYCSABKAgSDwoHcHJvbXB0cxgKIAMoCSIaChhEZWxldGVBZ2VudENvbmZpZ1JlcXVlc3QiGwoZRGVsZXRlQWdlbnRDb25maWdSZXNwb25zZSI0Cg5Nb2RlbENhbmRpZGF0ZRIQCghwcm92aWRlchgBIAEoCRIQCghtb2RlbF9pZBgCIAEoCSJxCg1Nb2RlbE1ldGFkYXRhEhYKDmNvbnRleHRfd2luZG93GAEgASgDEhwKFGlucHV0X2Nvc3RfbWljcm9fdXNkGAIgASgDEh0KFW91dHB1dF9jb3N0X21pY3JvX3VzZBgDIAEoAxILCgNhcGkYBCABKAkihwEKEk1vZGVsUmVnaXN0cnlFbnRyeRIUCgxkaXNwbGF5X25hbWUYASABKAkSLgoKY2FuZGlkYXRlcxgCIAMoCzIaLmNvbXBhc3MudjEuTW9kZWxDYW5kaWRhdGUSKwoIbWV0YWRhdGEYAyABKAsyGS5jb21wYXNzLnYxLk1vZGVsTWV0YWRhdGEimAEKDU1vZGVsUmVnaXN0cnkSNwoHZW50cmllcxgBIAMoCzImLmNvbXBhc3MudjEuTW9kZWxSZWdpc3RyeS5FbnRyaWVzRW50cnkaTgoMRW50cmllc0VudHJ5EgsKA2tleRgBIAEoCRItCgV2YWx1ZRgCIAEoCzIeLmNvbXBhc3MudjEuTW9kZWxSZWdpc3RyeUVudHJ5OgI4ASJgChdQdXRNb2RlbFJlZ2lzdHJ5UmVxdWVzdBIrCghyZWdpc3RyeRgBIAEoCzIZLmNvbXBhc3MudjEuTW9kZWxSZWdpc3RyeRIYChBleHBlY3RlZF92ZXJzaW9uGAIgASgDIisKGFB1dE1vZGVsUmVnaXN0cnlSZXNwb25zZRIPCgd2ZXJzaW9uGAEgASgDIhkKF0dldE1vZGVsUmVnaXN0cnlSZXF1ZXN0IlgKGEdldE1vZGVsUmVnaXN0cnlSZXNwb25zZRIPCgd2ZXJzaW9uGAEgASgDEisKCHJlZ2lzdHJ5GAIgASgLMhkuY29tcGFzcy52MS5Nb2RlbFJlZ2lzdHJ5IhwKGkRlbGV0ZU1vZGVsUmVnaXN0cnlSZXF1ZXN0Ih0KG0RlbGV0ZU1vZGVsUmVnaXN0cnlSZXNwb25zZSI+ChBBZ2VudEF0dHJpYnV0aW9uEhQKDGFnZW50X2hhbmRsZRgBIAEoCRIUCgxvd25lcl9oYW5kbGUYAiABKAkiRQoIRm9yZ2VSZWYSKwoIcHJvdmlkZXIYASABKA4yGS5jb21wYXNzLnYxLkZvcmdlUHJvdmlkZXISDAoEaG9zdBgCIAEoCSLUAwoFSXNzdWUSCgoCaWQYASABKAkSIwoFZm9yZ2UYAiABKAsyFC5jb21wYXNzLnYxLkZvcmdlUmVmEgwKBHJlcG8YAyABKAkSDgoGbnVtYmVyGAQgASgNEg0KBXRpdGxlGAUgASgJEgwKBGJvZHkYBiABKAkSEwoLZm9yZ2Vfc3RhdGUYByABKAkSCwoDdXJsGAggASgJEisKBWFnZW50GAkgASgLMhwuY29tcGFzcy52MS5BZ2VudEF0dHJpYnV0aW9uEhUKDWZvcmdlX2FjY291bnQYCiABKAkSDgoGbGFiZWxzGAsgAygJEi4KCnVwZGF0ZWRfYXQYEyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEiUKBXN0YXRlGAwgASgOMhYuY29tcGFzcy52MS5Jc3N1ZVN0YXRlEhAKCHByaW9yaXR5GA0gASgJEhAKCGFzc2lnbmVlGA4gASgJEg8KB3N1bW1hcnkYDyABKAkSDgoGYnJhbmNoGBAgASgJEiQKA3BycxgRIAMoCzIXLmNvbXBhc3MudjEuUHVsbFJlcXVlc3QSJwoHdHJhY2tlchgSIAEoCzIWLmNvbXBhc3MudjEuVHJhY2tlclJlZiKeAwoLUHVsbFJlcXVlc3QSIwoFZm9yZ2UYASABKAsyFC5jb21wYXNzLnYxLkZvcmdlUmVmEgwKBHJlcG8YAiABKAkSDgoGbnVtYmVyGAMgASgNEg0KBXRpdGxlGAQgASgJEhMKC2ZvcmdlX3N0YXRlGAUgASgJEgsKA3VybBgGIAEoCRIQCghoZWFkX3JlZhgHIAEoCRIQCghiYXNlX3JlZhgIIAEoCRIrCgVhZ2VudBgJIAEoCzIcLmNvbXBhc3MudjEuQWdlbnRBdHRyaWJ1dGlvbhIVCg1mb3JnZV9hY2NvdW50GAogASgJEg0KBWRyYWZ0GAsgASgIEikKB2NoYW5nZWQYDCABKAsyGC5jb21wYXNzLnYxLkNoYW5nZWRTdGF0cxIpCgZjaGVja3MYDSABKAsyGS5jb21wYXNzLnYxLkNoZWNrc1N1bW1hcnkSIwoHcmV2aWV3cxgOIAMoCzISLmNvbXBhc3MudjEuUmV2aWV3EikKB3RocmVhZHMYDyADKAsyGC5jb21wYXNzLnYxLlJldmlld1RocmVhZCJTCg1DaGVja3NTdW1tYXJ5EhAKCGhlYWRfc2hhGAEgASgJEg0KBXN0YXRlGAIgASgJEiEKBmNoZWNrcxgDIAMoCzIRLmNvbXBhc3MudjEuQ2hlY2siQwoFQ2hlY2sSDAoEbmFtZRgBIAEoCRINCgVzdGF0ZRgCIAEoCRILCgN1cmwYAyABKAkSEAoIcmVxdWlyZWQYBCABKAgiQwoMQ2hhbmdlZFN0YXRzEg0KBWZpbGVzGAEgASgNEhEKCWFkZGl0aW9ucxgCIAEoDRIRCglkZWxldGlvbnMYAyABKA0iQwoKVHJhY2tlclJlZhIMCgRraW5kGAEgASgJEgoKAmlkGAIgASgJEg4KBnN0YXR1cxgDIAEoCRILCgN1cmwYBCABKAkiRwoGUmV2aWV3Eg4KBmF1dGhvchgBIAEoCRIOCgZpc19ib3QYAiABKAgSDwoHdmVyZGljdBgDIAEoCRIMCgRib2R5GAQgASgJIlUKDFJldmlld1RocmVhZBIMCgRwYXRoGAEgASgJEhAKCHJlc29sdmVkGAIgASgIEiUKCGNvbW1lbnRzGAMgAygLMhMuY29tcGFzcy52MS5Db21tZW50IjcKB0NvbW1lbnQSDgoGYXV0aG9yGAEgASgJEg4KBmlzX2JvdBgCIAEoCBIMCgRib2R5GAMgASgJKmQKDlNlY3JldERlbGl2ZXJ5Eh8KG1NFQ1JFVF9ERUxJVkVSWV9VTlNQRUNJRklFRBAAEhgKFFNFQ1JFVF9ERUxJVkVSWV9GSUxFEAESFwoTU0VDUkVUX0RFTElWRVJZX0VOVhACKnAKClNlY3JldEtpbmQSGwoXU0VDUkVUX0tJTkRfVU5TUEVDSUZJRUQQABIXChNTRUNSRVRfS0lORF9HRU5FUklDEAESGAoUU0VDUkVUX0tJTkRfUFJPVklERVIQAhISCg5TRUNSRVRfS0lORF9HSBADKkMKC1NlcnZlclN0YXRlEhwKGFNFUlZFUl9TVEFURV9VTlNQRUNJRklFRBAAEhYKElNFUlZFUl9TVEFURV9SRUFEWRABKoICChFBZ2VudFNlc3Npb25TdGF0ZRIjCh9BR0VOVF9TRVNTSU9OX1NUQVRFX1VOU1BFQ0lGSUVEEAASIAocQUdFTlRfU0VTU0lPTl9TVEFURV9TVEFSVElORxABEh0KGUFHRU5UX1NFU1NJT05fU1RBVEVfUkVBRFkQAhIfChtBR0VOVF9TRVNTSU9OX1NUQVRFX1dPUktJTkcQAxIfChtBR0VOVF9TRVNTSU9OX1NUQVRFX1NUT1BQRUQQBBIfChtBR0VOVF9TRVNTSU9OX1NUQVRFX0VSUk9SRUQQBRIkCiBBR0VOVF9TRVNTSU9OX1NUQVRFX0RJU0NPTk5FQ1RFRBAGKtIBChNBZ2VudFRvb2xDYWxsU3RhdHVzEiYKIkFHRU5UX1RPT0xfQ0FMTF9TVEFUVVNfVU5TUEVDSUZJRUQQABIiCh5BR0VOVF9UT09MX0NBTExfU1RBVFVTX1BFTkRJTkcQARImCiJBR0VOVF9UT09MX0NBTExfU1RBVFVTX0lOX1BST0dSRVNTEAISJAogQUdFTlRfVE9PTF9DQUxMX1NUQVRVU19DT01QTEVURUQQAxIhCh1BR0VOVF9UT09MX0NBTExfU1RBVFVTX0ZBSUxFRBAEKrQBChRBZ2VudFBsYW5FbnRyeVN0YXR1cxInCiNBR0VOVF9QTEFOX0VOVFJZX1NUQVRVU19VTlNQRUNJRklFRBAAEiMKH0FHRU5UX1BMQU5fRU5UUllfU1RBVFVTX1BFTkRJTkcQARInCiNBR0VOVF9QTEFOX0VOVFJZX1NUQVRVU19JTl9QUk9HUkVTUxACEiUKIUFHRU5UX1BMQU5fRU5UUllfU1RBVFVTX0NPTVBMRVRFRBADKoQBChRTZXNzaW9uSW5qZWN0aW9uS2luZBImCiJTRVNTSU9OX0lOSkVDVElPTl9LSU5EX1VOU1BFQ0lGSUVEEAASIAocU0VTU0lPTl9JTkpFQ1RJT05fS0lORF9TVEVFUhABEiIKHlNFU1NJT05fSU5KRUNUSU9OX0tJTkRfREVMSVZFUhACKnQKEFNlc3Npb25FcnJvcktpbmQSIgoeU0VTU0lPTl9FUlJPUl9LSU5EX1VOU1BFQ0lGSUVEEAASHAoYU0VTU0lPTl9FUlJPUl9LSU5EX0VSUk9SEAESHgoaU0VTU0lPTl9FUlJPUl9LSU5EX0FCT1JURUQQAirxAQoKSXNzdWVTdGF0ZRIbChdJU1NVRV9TVEFURV9VTlNQRUNJRklFRBAAEhcKE0lTU1VFX1NUQVRFX0JBQ0tMT0cQARIUChBJU1NVRV9TVEFURV9UT0RPEAISFgoSSVNTVUVfU1RBVEVfUVVFVUVEEAMSFwoTSVNTVUVfU1RBVEVfQkxPQ0tFRBAEEhsKF0lTU1VFX1NUQVRFX0lOX1BST0dSRVNTEAUSGQoVSVNTVUVfU1RBVEVfSU5fUkVWSUVXEAYSFAoQSVNTVUVfU1RBVEVfRE9ORRAHEhgKFElTU1VFX1NUQVRFX0FSQ0hJVkVEEAgqnAEKDUZvcmdlUHJvdmlkZXISHgoaRk9SR0VfUFJPVklERVJfVU5TUEVDSUZJRUQQABIZChVGT1JHRV9QUk9WSURFUl9HSVRIVUIQARIZChVGT1JHRV9QUk9WSURFUl9HSVRMQUIQAhIaChZGT1JHRV9QUk9WSURFUl9GT1JHRUpPEAMSGQoVRk9SR0VfUFJPVklERVJfTElORUFSEAQy0w4KDkNvbXBhc3NTZXJ2aWNlElQKDUdldFNlcnZlckluZm8SIC5jb21wYXNzLnYxLkdldFNlcnZlckluZm9SZXF1ZXN0GiEuY29tcGFzcy52MS5HZXRTZXJ2ZXJJbmZvUmVzcG9uc2USPwoGV2hvQW1JEhkuY29tcGFzcy52MS5XaG9BbUlSZXF1ZXN0GhouY29tcGFzcy52MS5XaG9BbUlSZXNwb25zZRJcCg9TdWJzY3JpYmVFdmVudHMSIi5jb21wYXNzLnYxLlN1YnNjcmliZUV2ZW50c1JlcXVlc3QaIy5jb21wYXNzLnYxLlN1YnNjcmliZUV2ZW50c1Jlc3BvbnNlMAESWgoPTGlzdEJvYXJkSXNzdWVzEiIuY29tcGFzcy52MS5MaXN0Qm9hcmRJc3N1ZXNSZXF1ZXN0GiMuY29tcGFzcy52MS5MaXN0Qm9hcmRJc3N1ZXNSZXNwb25zZRJyChdQcm92aXNpb25BZ2VudFdvcmtzcGFjZRIqLmNvbXBhc3MudjEuUHJvdmlzaW9uQWdlbnRXb3Jrc3BhY2VSZXF1ZXN0GisuY29tcGFzcy52MS5Qcm92aXNpb25BZ2VudFdvcmtzcGFjZVJlc3BvbnNlEmAKEVN0YXJ0QWdlbnRTZXNzaW9uEiQuY29tcGFzcy52MS5TdGFydEFnZW50U2Vzc2lvblJlcXVlc3QaJS5jb21wYXNzLnYxLlN0YXJ0QWdlbnRTZXNzaW9uUmVzcG9uc2USSwoKU3Bhd25BZ2VudBIdLmNvbXBhc3MudjEuU3Bhd25BZ2VudFJlcXVlc3QaHi5jb21wYXNzLnYxLlNwYXduQWdlbnRSZXNwb25zZRJdChBTdG9wQWdlbnRTZXNzaW9uEiMuY29tcGFzcy52MS5TdG9wQWdlbnRTZXNzaW9uUmVxdWVzdBokLmNvbXBhc3MudjEuU3RvcEFnZW50U2Vzc2lvblJlc3BvbnNlEmkKFFJlbW92ZUFnZW50V29ya3NwYWNlEicuY29tcGFzcy52MS5SZW1vdmVBZ2VudFdvcmtzcGFjZVJlcXVlc3QaKC5jb21wYXNzLnYxLlJlbW92ZUFnZW50V29ya3NwYWNlUmVzcG9uc2USYwoSUmVsb2FkQWdlbnRTZXNzaW9uEiUuY29tcGFzcy52MS5SZWxvYWRBZ2VudFNlc3Npb25SZXF1ZXN0GiYuY29tcGFzcy52MS5SZWxvYWRBZ2VudFNlc3Npb25SZXNwb25zZRJXCg5HZXRBZ2VudFN0YXR1cxIhLmNvbXBhc3MudjEuR2V0QWdlbnRTdGF0dXNSZXF1ZXN0GiIuY29tcGFzcy52MS5HZXRBZ2VudFN0YXR1c1Jlc3BvbnNlEmIKFVN1YnNjcmliZUFnZW50U2Vzc2lvbhIoLmNvbXBhc3MudjEuU3Vic2NyaWJlQWdlbnRTZXNzaW9uUmVxdWVzdBodLmNvbXBhc3MudjEuQWdlbnRTZXNzaW9uRnJhbWUwARJLCgpJc3N1ZVRva2VuEh0uY29tcGFzcy52MS5Jc3N1ZVRva2VuUmVxdWVzdBoeLmNvbXBhc3MudjEuSXNzdWVUb2tlblJlc3BvbnNlEk4KC1Jldm9rZVRva2VuEh4uY29tcGFzcy52MS5SZXZva2VUb2tlblJlcXVlc3QaHy5jb21wYXNzLnYxLlJldm9rZVRva2VuUmVzcG9uc2USVwoOUHV0QWdlbnRDb25maWcSIS5jb21wYXNzLnYxLlB1dEFnZW50Q29uZmlnUmVxdWVzdBoiLmNvbXBhc3MudjEuUHV0QWdlbnRDb25maWdSZXNwb25zZRJjChJHZXRBZ2VudENvbmZpZ0luZm8SJS5jb21wYXNzLnYxLkdldEFnZW50Q29uZmlnSW5mb1JlcXVlc3QaJi5jb21wYXNzLnYxLkdldEFnZW50Q29uZmlnSW5mb1Jlc3BvbnNlEmAKEURlbGV0ZUFnZW50Q29uZmlnEiQuY29tcGFzcy52MS5EZWxldGVBZ2VudENvbmZpZ1JlcXVlc3QaJS5jb21wYXNzLnYxLkRlbGV0ZUFnZW50Q29uZmlnUmVzcG9uc2USXQoQUHV0TW9kZWxSZWdpc3RyeRIjLmNvbXBhc3MudjEuUHV0TW9kZWxSZWdpc3RyeVJlcXVlc3QaJC5jb21wYXNzLnYxLlB1dE1vZGVsUmVnaXN0cnlSZXNwb25zZRJdChBHZXRNb2RlbFJlZ2lzdHJ5EiMuY29tcGFzcy52MS5HZXRNb2RlbFJlZ2lzdHJ5UmVxdWVzdBokLmNvbXBhc3MudjEuR2V0TW9kZWxSZWdpc3RyeVJlc3BvbnNlEmYKE0RlbGV0ZU1vZGVsUmVnaXN0cnkSJi5jb21wYXNzLnYxLkRlbGV0ZU1vZGVsUmVnaXN0cnlSZXF1ZXN0GicuY29tcGFzcy52MS5EZWxldGVNb2RlbFJlZ2lzdHJ5UmVzcG9uc2UyoAQKDlNlY3JldHNTZXJ2aWNlEkgKCVNldFNlY3JldBIcLmNvbXBhc3MudjEuU2V0U2VjcmV0UmVxdWVzdBodLmNvbXBhc3MudjEuU2V0U2VjcmV0UmVzcG9uc2USTgoLTGlzdFNlY3JldHMSHi5jb21wYXNzLnYxLkxpc3RTZWNyZXRzUmVxdWVzdBofLmNvbXBhc3MudjEuTGlzdFNlY3JldHNSZXNwb25zZRJRCgxEZWxldGVTZWNyZXQSHy5jb21wYXNzLnYxLkRlbGV0ZVNlY3JldFJlcXVlc3QaIC5jb21wYXNzLnYxLkRlbGV0ZVNlY3JldFJlc3BvbnNlEloKD1NldFNlcnZlclNlY3JldBIiLmNvbXBhc3MudjEuU2V0U2VydmVyU2VjcmV0UmVxdWVzdBojLmNvbXBhc3MudjEuU2V0U2VydmVyU2VjcmV0UmVzcG9uc2USYwoSRGVsZXRlU2VydmVyU2VjcmV0EiUuY29tcGFzcy52MS5EZWxldGVTZXJ2ZXJTZWNyZXRSZXF1ZXN0GiYuY29tcGFzcy52MS5EZWxldGVTZXJ2ZXJTZWNyZXRSZXNwb25zZRJgChFMaXN0U2VydmVyU2VjcmV0cxIkLmNvbXBhc3MudjEuTGlzdFNlcnZlclNlY3JldHNSZXF1ZXN0GiUuY29tcGFzcy52MS5MaXN0U2VydmVyU2VjcmV0c1Jlc3BvbnNlYgZwcm90bzM", [file_google_protobuf_timestamp]); + fileDesc("Chhjb21wYXNzL3YxL2NvbXBhc3MucHJvdG8SCmNvbXBhc3MudjEiqAEKEFNldFNlY3JldFJlcXVlc3QSDAoEbmFtZRgBIAEoCRISCgV2YWx1ZRgCIAEoCUIDgAEBEiwKCGRlbGl2ZXJ5GAMgASgOMhouY29tcGFzcy52MS5TZWNyZXREZWxpdmVyeRIkCgRraW5kGAQgASgOMhYuY29tcGFzcy52MS5TZWNyZXRLaW5kEhAKCHByb3ZpZGVyGAUgASgJEgwKBGhvc3QYBiABKAkiEwoRU2V0U2VjcmV0UmVzcG9uc2UiFAoSTGlzdFNlY3JldHNSZXF1ZXN0IkAKE0xpc3RTZWNyZXRzUmVzcG9uc2USKQoHc2VjcmV0cxgBIAMoCzIYLmNvbXBhc3MudjEuU2VjcmV0U3RhdHVzIqABCgxTZWNyZXRTdGF0dXMSDAoEbmFtZRgBIAEoCRIOCgZpc19zZXQYAiABKAgSLAoIZGVsaXZlcnkYAyABKA4yGi5jb21wYXNzLnYxLlNlY3JldERlbGl2ZXJ5EiQKBGtpbmQYBCABKA4yFi5jb21wYXNzLnYxLlNlY3JldEtpbmQSEAoIcHJvdmlkZXIYBSABKAkSDAoEaG9zdBgGIAEoCSIjChNEZWxldGVTZWNyZXRSZXF1ZXN0EgwKBG5hbWUYASABKAkiFgoURGVsZXRlU2VjcmV0UmVzcG9uc2UiOgoWU2V0U2VydmVyU2VjcmV0UmVxdWVzdBIMCgRuYW1lGAEgASgJEhIKBXZhbHVlGAIgASgJQgOAAQEiGQoXU2V0U2VydmVyU2VjcmV0UmVzcG9uc2UiKQoZRGVsZXRlU2VydmVyU2VjcmV0UmVxdWVzdBIMCgRuYW1lGAEgASgJIhwKGkRlbGV0ZVNlcnZlclNlY3JldFJlc3BvbnNlIhoKGExpc3RTZXJ2ZXJTZWNyZXRzUmVxdWVzdCJTChlMaXN0U2VydmVyU2VjcmV0c1Jlc3BvbnNlEjYKDnNlcnZlcl9zZWNyZXRzGAEgAygLMh4uY29tcGFzcy52MS5TZXJ2ZXJTZWNyZXRTdGF0dXMiMgoSU2VydmVyU2VjcmV0U3RhdHVzEgwKBG5hbWUYASABKAkSDgoGaXNfc2V0GAIgASgIIhYKFEdldFNlcnZlckluZm9SZXF1ZXN0Ij0KFUdldFNlcnZlckluZm9SZXNwb25zZRIPCgd2ZXJzaW9uGAEgASgJEhMKC2FwaV92ZXJzaW9uGAIgASgJIg8KDVdob0FtSVJlcXVlc3QiJAoOV2hvQW1JUmVzcG9uc2USEgoKYWNjb3VudF9pZBgBIAEoCSJDChZTdWJzY3JpYmVFdmVudHNSZXF1ZXN0EhEKCXNpbmNlX3NlcRgBIAEoBBIWCg5pbnN0YW5jZV9lcG9jaBgCIAEoBCLiAwoXU3Vic2NyaWJlRXZlbnRzUmVzcG9uc2USCwoDc2VxGAEgASgEEhIKCmF0X3VuaXhfbXMYAiABKAMSFgoOaW5zdGFuY2VfZXBvY2gYAyABKAQSFAoMc25hcHNob3Rfc2VxGAQgASgEEjEKDXNlcnZlcl9zdGF0dXMYCiABKAsyGC5jb21wYXNzLnYxLlNlcnZlclN0YXR1c0gAEjUKD3Jlc3luY19yZXF1aXJlZBgLIAEoCzIaLmNvbXBhc3MudjEuUmVzeW5jUmVxdWlyZWRIABI+ChRhZ2VudF9zZXNzaW9uX3N0YXR1cxgMIAEoCzIeLmNvbXBhc3MudjEuQWdlbnRTZXNzaW9uU3RhdHVzSAASPAoTYWdlbnRfbWVzc2FnZV9jaHVuaxgNIAEoCzIdLmNvbXBhc3MudjEuQWdlbnRNZXNzYWdlQ2h1bmtIABI0Cg9hZ2VudF90b29sX2NhbGwYDiABKAsyGS5jb21wYXNzLnYxLkFnZW50VG9vbENhbGxIABIrCgphZ2VudF9wbGFuGA8gASgLMhUuY29tcGFzcy52MS5BZ2VudFBsYW5IABIiCgVpc3N1ZRgQIAEoCzIRLmNvbXBhc3MudjEuSXNzdWVIAEIJCgdwYXlsb2FkIi4KFkxpc3RCb2FyZElzc3Vlc1JlcXVlc3QSFAoMc25hcHNob3Rfc2VxGAEgASgEIjwKF0xpc3RCb2FyZElzc3Vlc1Jlc3BvbnNlEiEKBmlzc3VlcxgBIAMoCzIRLmNvbXBhc3MudjEuSXNzdWUiNgoMU2VydmVyU3RhdHVzEiYKBXN0YXRlGAEgASgOMhcuY29tcGFzcy52MS5TZXJ2ZXJTdGF0ZSIQCg5SZXN5bmNSZXF1aXJlZCLSAQoSQWdlbnRTZXNzaW9uU3RhdHVzEhIKCnNlc3Npb25faWQYASABKAkSLAoFc3RhdGUYAiABKA4yHS5jb21wYXNzLnYxLkFnZW50U2Vzc2lvblN0YXRlEhgKEGFnZW50X2FjY291bnRfaWQYAyABKAkSLQoMcnVudGltZV90aWVyGAQgASgOMhcuY29tcGFzcy52MS5SdW50aW1lVGllchIxCg5lZ3Jlc3NfcG9zdHVyZRgFIAEoDjIZLmNvbXBhc3MudjEuRWdyZXNzUG9zdHVyZSJJChFBZ2VudE1lc3NhZ2VDaHVuaxISCgpzZXNzaW9uX2lkGAEgASgJEgwKBHRleHQYAiABKAkSEgoKaXNfdGhvdWdodBgDIAEoCCJ5Cg1BZ2VudFRvb2xDYWxsEhIKCnNlc3Npb25faWQYASABKAkSFAoMdG9vbF9jYWxsX2lkGAIgASgJEg0KBXRpdGxlGAMgASgJEi8KBnN0YXR1cxgEIAEoDjIfLmNvbXBhc3MudjEuQWdlbnRUb29sQ2FsbFN0YXR1cyJMCglBZ2VudFBsYW4SEgoKc2Vzc2lvbl9pZBgBIAEoCRIrCgdlbnRyaWVzGAIgAygLMhouY29tcGFzcy52MS5BZ2VudFBsYW5FbnRyeSJTCg5BZ2VudFBsYW5FbnRyeRIPCgdjb250ZW50GAEgASgJEjAKBnN0YXR1cxgCIAEoDjIgLmNvbXBhc3MudjEuQWdlbnRQbGFuRW50cnlTdGF0dXMi3wMKDFNlc3Npb25FdmVudBIQCghldmVudF9pZBgBIAEoCRISCgphdF91bml4X21zGAIgASgDEjoKDmFzc2lzdGFudF90ZXh0GAMgASgLMiAuY29tcGFzcy52MS5TZXNzaW9uQXNzaXN0YW50VGV4dEgAEi8KCHRoaW5raW5nGAQgASgLMhsuY29tcGFzcy52MS5TZXNzaW9uVGhpbmtpbmdIABIwCgl0b29sX2NhbGwYBSABKAsyGy5jb21wYXNzLnYxLlNlc3Npb25Ub29sQ2FsbEgAEj0KEHRvb2xfY2FsbF91cGRhdGUYBiABKAsyIS5jb21wYXNzLnYxLlNlc3Npb25Ub29sQ2FsbFVwZGF0ZUgAEicKBHBsYW4YByABKAsyFy5jb21wYXNzLnYxLlNlc3Npb25QbGFuSAASKwoGbm90aWNlGAggASgLMhkuY29tcGFzcy52MS5TZXNzaW9uTm90aWNlSAASOQoRc2Vzc2lvbl9pbmplY3Rpb24YCSABKAsyHC5jb21wYXNzLnYxLlNlc3Npb25JbmplY3Rpb25IABIxCg1zZXNzaW9uX2Vycm9yGAogASgLMhguY29tcGFzcy52MS5TZXNzaW9uRXJyb3JIAEIHCgVldmVudCI4ChRTZXNzaW9uQXNzaXN0YW50VGV4dBIMCgR0ZXh0GAEgASgJEhIKCm1lc3NhZ2VfaWQYAiABKAkiMwoPU2Vzc2lvblRoaW5raW5nEgwKBHRleHQYASABKAkSEgoKbWVzc2FnZV9pZBgCIAEoCSJnCg9TZXNzaW9uVG9vbENhbGwSFAoMdG9vbF9jYWxsX2lkGAEgASgJEg0KBXRpdGxlGAIgASgJEi8KBnN0YXR1cxgDIAEoDjIfLmNvbXBhc3MudjEuQWdlbnRUb29sQ2FsbFN0YXR1cyKaAQoVU2Vzc2lvblRvb2xDYWxsVXBkYXRlEhQKDHRvb2xfY2FsbF9pZBgBIAEoCRIvCgZzdGF0dXMYAiABKA4yHy5jb21wYXNzLnYxLkFnZW50VG9vbENhbGxTdGF0dXMSDgoGb3V0cHV0GAMgASgJEioKBWRpZmZzGAQgAygLMhsuY29tcGFzcy52MS5TZXNzaW9uRmlsZURpZmYiVQoPU2Vzc2lvbkZpbGVEaWZmEgwKBHBhdGgYASABKAkSFQoIb2xkX3RleHQYAiABKAlIAIgBARIQCghuZXdfdGV4dBgDIAEoCUILCglfb2xkX3RleHQiOgoLU2Vzc2lvblBsYW4SKwoHZW50cmllcxgBIAMoCzIaLmNvbXBhc3MudjEuQWdlbnRQbGFuRW50cnkiOQoNU2Vzc2lvbk5vdGljZRIMCgR0ZXh0GAEgASgJEhEKBGxpbmsYAiABKAlIAIgBAUIHCgVfbGluayKDAQoQU2Vzc2lvbkluamVjdGlvbhIxCgdvcF9raW5kGAEgASgOMiAuY29tcGFzcy52MS5TZXNzaW9uSW5qZWN0aW9uS2luZBISCgptZXNzYWdlX2lkGAIgASgJEhMKC2Zyb21faGFuZGxlGAMgASgJEhMKC3RyYWNlcGFyZW50GAQgASgJImsKDFNlc3Npb25FcnJvchIqCgRraW5kGAEgASgOMhwuY29tcGFzcy52MS5TZXNzaW9uRXJyb3JLaW5kEg8KB21lc3NhZ2UYAiABKAkSEwoGc3RhdHVzGAMgASgFSACIAQFCCQoHX3N0YXR1cyIyChxTdWJzY3JpYmVBZ2VudFNlc3Npb25SZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkifgoRQWdlbnRTZXNzaW9uRnJhbWUSEgoKc2Vzc2lvbl9pZBgBIAEoCRInCgVldmVudBgCIAEoCzIYLmNvbXBhc3MudjEuU2Vzc2lvbkV2ZW50EiwKBXN0YXRlGAMgASgOMh0uY29tcGFzcy52MS5BZ2VudFNlc3Npb25TdGF0ZSJwCh5Qcm92aXNpb25BZ2VudFdvcmtzcGFjZVJlcXVlc3QSFAoMYWdlbnRfaGFuZGxlGAEgASgJEhkKEWNsaWVudF9yZXF1ZXN0X2lkGAIgASgJEg8KB3BlcnNvbmEYAyABKAkSDAoEcm9sZRgEIAEoCSI5Ch9Qcm92aXNpb25BZ2VudFdvcmtzcGFjZVJlc3BvbnNlEhYKDmNvbnRhaW5lcl9uYW1lGAEgASgJIlAKG1JlbW92ZUFnZW50V29ya3NwYWNlUmVxdWVzdBIWCg5jb250YWluZXJfbmFtZRgBIAEoCRIZChFjbGllbnRfcmVxdWVzdF9pZBgCIAEoCSIeChxSZW1vdmVBZ2VudFdvcmtzcGFjZVJlc3BvbnNlImMKGFN0YXJ0QWdlbnRTZXNzaW9uUmVxdWVzdBIWCg5jb250YWluZXJfbmFtZRgBIAEoCRIZChFyZXN1bWVfc2Vzc2lvbl9pZBgDIAEoCUoECAIQA1IOaW5pdGlhbF9wcm9tcHQiLwoZU3RhcnRBZ2VudFNlc3Npb25SZXNwb25zZRISCgpzZXNzaW9uX2lkGAEgASgJIloKEVNwYXduQWdlbnRSZXF1ZXN0EhQKDGFnZW50X2hhbmRsZRgBIAEoCRIZChFjbGllbnRfcmVxdWVzdF9pZBgDIAEoCUoECAIQA1IOaW5pdGlhbF9wcm9tcHQiQAoSU3Bhd25BZ2VudFJlc3BvbnNlEhIKCnNlc3Npb25faWQYASABKAkSFgoOY29udGFpbmVyX25hbWUYAiABKAkiLQoXU3RvcEFnZW50U2Vzc2lvblJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCSIaChhTdG9wQWdlbnRTZXNzaW9uUmVzcG9uc2UiLwoZUmVsb2FkQWdlbnRTZXNzaW9uUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJIjAKGlJlbG9hZEFnZW50U2Vzc2lvblJlc3BvbnNlEhIKCnNlc3Npb25faWQYASABKAkiKwoVR2V0QWdlbnRTdGF0dXNSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkiSgoWR2V0QWdlbnRTdGF0dXNSZXNwb25zZRIwCghzdGF0dXNlcxgBIAMoCzIeLmNvbXBhc3MudjEuQWdlbnRTZXNzaW9uU3RhdHVzIisKEUlzc3VlVG9rZW5SZXF1ZXN0EhYKDmFjY291bnRfaGFuZGxlGAEgASgJIiMKEklzc3VlVG9rZW5SZXNwb25zZRINCgV0b2tlbhgBIAEoCSIoChJSZXZva2VUb2tlblJlcXVlc3QSEgoFdG9rZW4YASABKAlCA4ABASIVChNSZXZva2VUb2tlblJlc3BvbnNlIicKFVB1dEFnZW50Q29uZmlnUmVxdWVzdBIOCgZidW5kbGUYASABKAwiKQoWUHV0QWdlbnRDb25maWdSZXNwb25zZRIPCgd2ZXJzaW9uGAEgASgJIhsKGUdldEFnZW50Q29uZmlnSW5mb1JlcXVlc3Qi2gEKGkdldEFnZW50Q29uZmlnSW5mb1Jlc3BvbnNlEg8KB3ZlcnNpb24YASABKAkSDgoGc2tpbGxzGAIgAygJEhIKCmV4dGVuc2lvbnMYAyADKAkSEwoLbWNwX3NlcnZlcnMYBCADKAkSFAoMaGFzX3NldHRpbmdzGAUgASgIEhUKDWhhc19hZ2VudHNfbWQYBiABKAgSDQoFcnVsZXMYByADKAkSEQoJc3ViYWdlbnRzGAggAygJEhIKCmhhc19tb2RlbHMYCSABKAgSDwoHcHJvbXB0cxgKIAMoCSIaChhEZWxldGVBZ2VudENvbmZpZ1JlcXVlc3QiGwoZRGVsZXRlQWdlbnRDb25maWdSZXNwb25zZSI0Cg5Nb2RlbENhbmRpZGF0ZRIQCghwcm92aWRlchgBIAEoCRIQCghtb2RlbF9pZBgCIAEoCSJxCg1Nb2RlbE1ldGFkYXRhEhYKDmNvbnRleHRfd2luZG93GAEgASgDEhwKFGlucHV0X2Nvc3RfbWljcm9fdXNkGAIgASgDEh0KFW91dHB1dF9jb3N0X21pY3JvX3VzZBgDIAEoAxILCgNhcGkYBCABKAkihwEKEk1vZGVsUmVnaXN0cnlFbnRyeRIUCgxkaXNwbGF5X25hbWUYASABKAkSLgoKY2FuZGlkYXRlcxgCIAMoCzIaLmNvbXBhc3MudjEuTW9kZWxDYW5kaWRhdGUSKwoIbWV0YWRhdGEYAyABKAsyGS5jb21wYXNzLnYxLk1vZGVsTWV0YWRhdGEimAEKDU1vZGVsUmVnaXN0cnkSNwoHZW50cmllcxgBIAMoCzImLmNvbXBhc3MudjEuTW9kZWxSZWdpc3RyeS5FbnRyaWVzRW50cnkaTgoMRW50cmllc0VudHJ5EgsKA2tleRgBIAEoCRItCgV2YWx1ZRgCIAEoCzIeLmNvbXBhc3MudjEuTW9kZWxSZWdpc3RyeUVudHJ5OgI4ASJgChdQdXRNb2RlbFJlZ2lzdHJ5UmVxdWVzdBIrCghyZWdpc3RyeRgBIAEoCzIZLmNvbXBhc3MudjEuTW9kZWxSZWdpc3RyeRIYChBleHBlY3RlZF92ZXJzaW9uGAIgASgDIisKGFB1dE1vZGVsUmVnaXN0cnlSZXNwb25zZRIPCgd2ZXJzaW9uGAEgASgDIhkKF0dldE1vZGVsUmVnaXN0cnlSZXF1ZXN0IlgKGEdldE1vZGVsUmVnaXN0cnlSZXNwb25zZRIPCgd2ZXJzaW9uGAEgASgDEisKCHJlZ2lzdHJ5GAIgASgLMhkuY29tcGFzcy52MS5Nb2RlbFJlZ2lzdHJ5IhwKGkRlbGV0ZU1vZGVsUmVnaXN0cnlSZXF1ZXN0Ih0KG0RlbGV0ZU1vZGVsUmVnaXN0cnlSZXNwb25zZSI+ChBBZ2VudEF0dHJpYnV0aW9uEhQKDGFnZW50X2hhbmRsZRgBIAEoCRIUCgxvd25lcl9oYW5kbGUYAiABKAkiRQoIRm9yZ2VSZWYSKwoIcHJvdmlkZXIYASABKA4yGS5jb21wYXNzLnYxLkZvcmdlUHJvdmlkZXISDAoEaG9zdBgCIAEoCSLUAwoFSXNzdWUSCgoCaWQYASABKAkSIwoFZm9yZ2UYAiABKAsyFC5jb21wYXNzLnYxLkZvcmdlUmVmEgwKBHJlcG8YAyABKAkSDgoGbnVtYmVyGAQgASgNEg0KBXRpdGxlGAUgASgJEgwKBGJvZHkYBiABKAkSEwoLZm9yZ2Vfc3RhdGUYByABKAkSCwoDdXJsGAggASgJEisKBWFnZW50GAkgASgLMhwuY29tcGFzcy52MS5BZ2VudEF0dHJpYnV0aW9uEhUKDWZvcmdlX2FjY291bnQYCiABKAkSDgoGbGFiZWxzGAsgAygJEi4KCnVwZGF0ZWRfYXQYEyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEiUKBXN0YXRlGAwgASgOMhYuY29tcGFzcy52MS5Jc3N1ZVN0YXRlEhAKCHByaW9yaXR5GA0gASgJEhAKCGFzc2lnbmVlGA4gASgJEg8KB3N1bW1hcnkYDyABKAkSDgoGYnJhbmNoGBAgASgJEiQKA3BycxgRIAMoCzIXLmNvbXBhc3MudjEuUHVsbFJlcXVlc3QSJwoHdHJhY2tlchgSIAEoCzIWLmNvbXBhc3MudjEuVHJhY2tlclJlZiKeAwoLUHVsbFJlcXVlc3QSIwoFZm9yZ2UYASABKAsyFC5jb21wYXNzLnYxLkZvcmdlUmVmEgwKBHJlcG8YAiABKAkSDgoGbnVtYmVyGAMgASgNEg0KBXRpdGxlGAQgASgJEhMKC2ZvcmdlX3N0YXRlGAUgASgJEgsKA3VybBgGIAEoCRIQCghoZWFkX3JlZhgHIAEoCRIQCghiYXNlX3JlZhgIIAEoCRIrCgVhZ2VudBgJIAEoCzIcLmNvbXBhc3MudjEuQWdlbnRBdHRyaWJ1dGlvbhIVCg1mb3JnZV9hY2NvdW50GAogASgJEg0KBWRyYWZ0GAsgASgIEikKB2NoYW5nZWQYDCABKAsyGC5jb21wYXNzLnYxLkNoYW5nZWRTdGF0cxIpCgZjaGVja3MYDSABKAsyGS5jb21wYXNzLnYxLkNoZWNrc1N1bW1hcnkSIwoHcmV2aWV3cxgOIAMoCzISLmNvbXBhc3MudjEuUmV2aWV3EikKB3RocmVhZHMYDyADKAsyGC5jb21wYXNzLnYxLlJldmlld1RocmVhZCJTCg1DaGVja3NTdW1tYXJ5EhAKCGhlYWRfc2hhGAEgASgJEg0KBXN0YXRlGAIgASgJEiEKBmNoZWNrcxgDIAMoCzIRLmNvbXBhc3MudjEuQ2hlY2siQwoFQ2hlY2sSDAoEbmFtZRgBIAEoCRINCgVzdGF0ZRgCIAEoCRILCgN1cmwYAyABKAkSEAoIcmVxdWlyZWQYBCABKAgiQwoMQ2hhbmdlZFN0YXRzEg0KBWZpbGVzGAEgASgNEhEKCWFkZGl0aW9ucxgCIAEoDRIRCglkZWxldGlvbnMYAyABKA0iQwoKVHJhY2tlclJlZhIMCgRraW5kGAEgASgJEgoKAmlkGAIgASgJEg4KBnN0YXR1cxgDIAEoCRILCgN1cmwYBCABKAkiRwoGUmV2aWV3Eg4KBmF1dGhvchgBIAEoCRIOCgZpc19ib3QYAiABKAgSDwoHdmVyZGljdBgDIAEoCRIMCgRib2R5GAQgASgJIlUKDFJldmlld1RocmVhZBIMCgRwYXRoGAEgASgJEhAKCHJlc29sdmVkGAIgASgIEiUKCGNvbW1lbnRzGAMgAygLMhMuY29tcGFzcy52MS5Db21tZW50IjcKB0NvbW1lbnQSDgoGYXV0aG9yGAEgASgJEg4KBmlzX2JvdBgCIAEoCBIMCgRib2R5GAMgASgJKmQKDlNlY3JldERlbGl2ZXJ5Eh8KG1NFQ1JFVF9ERUxJVkVSWV9VTlNQRUNJRklFRBAAEhgKFFNFQ1JFVF9ERUxJVkVSWV9GSUxFEAESFwoTU0VDUkVUX0RFTElWRVJZX0VOVhACKnAKClNlY3JldEtpbmQSGwoXU0VDUkVUX0tJTkRfVU5TUEVDSUZJRUQQABIXChNTRUNSRVRfS0lORF9HRU5FUklDEAESGAoUU0VDUkVUX0tJTkRfUFJPVklERVIQAhISCg5TRUNSRVRfS0lORF9HSBADKkMKC1NlcnZlclN0YXRlEhwKGFNFUlZFUl9TVEFURV9VTlNQRUNJRklFRBAAEhYKElNFUlZFUl9TVEFURV9SRUFEWRABKpcBCgtSdW50aW1lVGllchIcChhSVU5USU1FX1RJRVJfVU5TUEVDSUZJRUQQABIXChNSVU5USU1FX1RJRVJfUE9ETUFOEAESGAoUUlVOVElNRV9USUVSX01JQ1JPVk0QAhIgChxSVU5USU1FX1RJRVJfQVBQTEVfQ09OVEFJTkVSEAMSFQoRUlVOVElNRV9USUVSX0hPU1QQBCpoCg1FZ3Jlc3NQb3N0dXJlEh4KGkVHUkVTU19QT1NUVVJFX1VOU1BFQ0lGSUVEEAASGAoURUdSRVNTX1BPU1RVUkVfQVJNRUQQARIdChlFR1JFU1NfUE9TVFVSRV9VTkVORk9SQ0VEEAIqggIKEUFnZW50U2Vzc2lvblN0YXRlEiMKH0FHRU5UX1NFU1NJT05fU1RBVEVfVU5TUEVDSUZJRUQQABIgChxBR0VOVF9TRVNTSU9OX1NUQVRFX1NUQVJUSU5HEAESHQoZQUdFTlRfU0VTU0lPTl9TVEFURV9SRUFEWRACEh8KG0FHRU5UX1NFU1NJT05fU1RBVEVfV09SS0lORxADEh8KG0FHRU5UX1NFU1NJT05fU1RBVEVfU1RPUFBFRBAEEh8KG0FHRU5UX1NFU1NJT05fU1RBVEVfRVJST1JFRBAFEiQKIEFHRU5UX1NFU1NJT05fU1RBVEVfRElTQ09OTkVDVEVEEAYq0gEKE0FnZW50VG9vbENhbGxTdGF0dXMSJgoiQUdFTlRfVE9PTF9DQUxMX1NUQVRVU19VTlNQRUNJRklFRBAAEiIKHkFHRU5UX1RPT0xfQ0FMTF9TVEFUVVNfUEVORElORxABEiYKIkFHRU5UX1RPT0xfQ0FMTF9TVEFUVVNfSU5fUFJPR1JFU1MQAhIkCiBBR0VOVF9UT09MX0NBTExfU1RBVFVTX0NPTVBMRVRFRBADEiEKHUFHRU5UX1RPT0xfQ0FMTF9TVEFUVVNfRkFJTEVEEAQqtAEKFEFnZW50UGxhbkVudHJ5U3RhdHVzEicKI0FHRU5UX1BMQU5fRU5UUllfU1RBVFVTX1VOU1BFQ0lGSUVEEAASIwofQUdFTlRfUExBTl9FTlRSWV9TVEFUVVNfUEVORElORxABEicKI0FHRU5UX1BMQU5fRU5UUllfU1RBVFVTX0lOX1BST0dSRVNTEAISJQohQUdFTlRfUExBTl9FTlRSWV9TVEFUVVNfQ09NUExFVEVEEAMqhAEKFFNlc3Npb25JbmplY3Rpb25LaW5kEiYKIlNFU1NJT05fSU5KRUNUSU9OX0tJTkRfVU5TUEVDSUZJRUQQABIgChxTRVNTSU9OX0lOSkVDVElPTl9LSU5EX1NURUVSEAESIgoeU0VTU0lPTl9JTkpFQ1RJT05fS0lORF9ERUxJVkVSEAIqdAoQU2Vzc2lvbkVycm9yS2luZBIiCh5TRVNTSU9OX0VSUk9SX0tJTkRfVU5TUEVDSUZJRUQQABIcChhTRVNTSU9OX0VSUk9SX0tJTkRfRVJST1IQARIeChpTRVNTSU9OX0VSUk9SX0tJTkRfQUJPUlRFRBACKvEBCgpJc3N1ZVN0YXRlEhsKF0lTU1VFX1NUQVRFX1VOU1BFQ0lGSUVEEAASFwoTSVNTVUVfU1RBVEVfQkFDS0xPRxABEhQKEElTU1VFX1NUQVRFX1RPRE8QAhIWChJJU1NVRV9TVEFURV9RVUVVRUQQAxIXChNJU1NVRV9TVEFURV9CTE9DS0VEEAQSGwoXSVNTVUVfU1RBVEVfSU5fUFJPR1JFU1MQBRIZChVJU1NVRV9TVEFURV9JTl9SRVZJRVcQBhIUChBJU1NVRV9TVEFURV9ET05FEAcSGAoUSVNTVUVfU1RBVEVfQVJDSElWRUQQCCqcAQoNRm9yZ2VQcm92aWRlchIeChpGT1JHRV9QUk9WSURFUl9VTlNQRUNJRklFRBAAEhkKFUZPUkdFX1BST1ZJREVSX0dJVEhVQhABEhkKFUZPUkdFX1BST1ZJREVSX0dJVExBQhACEhoKFkZPUkdFX1BST1ZJREVSX0ZPUkdFSk8QAxIZChVGT1JHRV9QUk9WSURFUl9MSU5FQVIQBDLTDgoOQ29tcGFzc1NlcnZpY2USVAoNR2V0U2VydmVySW5mbxIgLmNvbXBhc3MudjEuR2V0U2VydmVySW5mb1JlcXVlc3QaIS5jb21wYXNzLnYxLkdldFNlcnZlckluZm9SZXNwb25zZRI/CgZXaG9BbUkSGS5jb21wYXNzLnYxLldob0FtSVJlcXVlc3QaGi5jb21wYXNzLnYxLldob0FtSVJlc3BvbnNlElwKD1N1YnNjcmliZUV2ZW50cxIiLmNvbXBhc3MudjEuU3Vic2NyaWJlRXZlbnRzUmVxdWVzdBojLmNvbXBhc3MudjEuU3Vic2NyaWJlRXZlbnRzUmVzcG9uc2UwARJaCg9MaXN0Qm9hcmRJc3N1ZXMSIi5jb21wYXNzLnYxLkxpc3RCb2FyZElzc3Vlc1JlcXVlc3QaIy5jb21wYXNzLnYxLkxpc3RCb2FyZElzc3Vlc1Jlc3BvbnNlEnIKF1Byb3Zpc2lvbkFnZW50V29ya3NwYWNlEiouY29tcGFzcy52MS5Qcm92aXNpb25BZ2VudFdvcmtzcGFjZVJlcXVlc3QaKy5jb21wYXNzLnYxLlByb3Zpc2lvbkFnZW50V29ya3NwYWNlUmVzcG9uc2USYAoRU3RhcnRBZ2VudFNlc3Npb24SJC5jb21wYXNzLnYxLlN0YXJ0QWdlbnRTZXNzaW9uUmVxdWVzdBolLmNvbXBhc3MudjEuU3RhcnRBZ2VudFNlc3Npb25SZXNwb25zZRJLCgpTcGF3bkFnZW50Eh0uY29tcGFzcy52MS5TcGF3bkFnZW50UmVxdWVzdBoeLmNvbXBhc3MudjEuU3Bhd25BZ2VudFJlc3BvbnNlEl0KEFN0b3BBZ2VudFNlc3Npb24SIy5jb21wYXNzLnYxLlN0b3BBZ2VudFNlc3Npb25SZXF1ZXN0GiQuY29tcGFzcy52MS5TdG9wQWdlbnRTZXNzaW9uUmVzcG9uc2USaQoUUmVtb3ZlQWdlbnRXb3Jrc3BhY2USJy5jb21wYXNzLnYxLlJlbW92ZUFnZW50V29ya3NwYWNlUmVxdWVzdBooLmNvbXBhc3MudjEuUmVtb3ZlQWdlbnRXb3Jrc3BhY2VSZXNwb25zZRJjChJSZWxvYWRBZ2VudFNlc3Npb24SJS5jb21wYXNzLnYxLlJlbG9hZEFnZW50U2Vzc2lvblJlcXVlc3QaJi5jb21wYXNzLnYxLlJlbG9hZEFnZW50U2Vzc2lvblJlc3BvbnNlElcKDkdldEFnZW50U3RhdHVzEiEuY29tcGFzcy52MS5HZXRBZ2VudFN0YXR1c1JlcXVlc3QaIi5jb21wYXNzLnYxLkdldEFnZW50U3RhdHVzUmVzcG9uc2USYgoVU3Vic2NyaWJlQWdlbnRTZXNzaW9uEiguY29tcGFzcy52MS5TdWJzY3JpYmVBZ2VudFNlc3Npb25SZXF1ZXN0Gh0uY29tcGFzcy52MS5BZ2VudFNlc3Npb25GcmFtZTABEksKCklzc3VlVG9rZW4SHS5jb21wYXNzLnYxLklzc3VlVG9rZW5SZXF1ZXN0Gh4uY29tcGFzcy52MS5Jc3N1ZVRva2VuUmVzcG9uc2USTgoLUmV2b2tlVG9rZW4SHi5jb21wYXNzLnYxLlJldm9rZVRva2VuUmVxdWVzdBofLmNvbXBhc3MudjEuUmV2b2tlVG9rZW5SZXNwb25zZRJXCg5QdXRBZ2VudENvbmZpZxIhLmNvbXBhc3MudjEuUHV0QWdlbnRDb25maWdSZXF1ZXN0GiIuY29tcGFzcy52MS5QdXRBZ2VudENvbmZpZ1Jlc3BvbnNlEmMKEkdldEFnZW50Q29uZmlnSW5mbxIlLmNvbXBhc3MudjEuR2V0QWdlbnRDb25maWdJbmZvUmVxdWVzdBomLmNvbXBhc3MudjEuR2V0QWdlbnRDb25maWdJbmZvUmVzcG9uc2USYAoRRGVsZXRlQWdlbnRDb25maWcSJC5jb21wYXNzLnYxLkRlbGV0ZUFnZW50Q29uZmlnUmVxdWVzdBolLmNvbXBhc3MudjEuRGVsZXRlQWdlbnRDb25maWdSZXNwb25zZRJdChBQdXRNb2RlbFJlZ2lzdHJ5EiMuY29tcGFzcy52MS5QdXRNb2RlbFJlZ2lzdHJ5UmVxdWVzdBokLmNvbXBhc3MudjEuUHV0TW9kZWxSZWdpc3RyeVJlc3BvbnNlEl0KEEdldE1vZGVsUmVnaXN0cnkSIy5jb21wYXNzLnYxLkdldE1vZGVsUmVnaXN0cnlSZXF1ZXN0GiQuY29tcGFzcy52MS5HZXRNb2RlbFJlZ2lzdHJ5UmVzcG9uc2USZgoTRGVsZXRlTW9kZWxSZWdpc3RyeRImLmNvbXBhc3MudjEuRGVsZXRlTW9kZWxSZWdpc3RyeVJlcXVlc3QaJy5jb21wYXNzLnYxLkRlbGV0ZU1vZGVsUmVnaXN0cnlSZXNwb25zZTKgBAoOU2VjcmV0c1NlcnZpY2USSAoJU2V0U2VjcmV0EhwuY29tcGFzcy52MS5TZXRTZWNyZXRSZXF1ZXN0Gh0uY29tcGFzcy52MS5TZXRTZWNyZXRSZXNwb25zZRJOCgtMaXN0U2VjcmV0cxIeLmNvbXBhc3MudjEuTGlzdFNlY3JldHNSZXF1ZXN0Gh8uY29tcGFzcy52MS5MaXN0U2VjcmV0c1Jlc3BvbnNlElEKDERlbGV0ZVNlY3JldBIfLmNvbXBhc3MudjEuRGVsZXRlU2VjcmV0UmVxdWVzdBogLmNvbXBhc3MudjEuRGVsZXRlU2VjcmV0UmVzcG9uc2USWgoPU2V0U2VydmVyU2VjcmV0EiIuY29tcGFzcy52MS5TZXRTZXJ2ZXJTZWNyZXRSZXF1ZXN0GiMuY29tcGFzcy52MS5TZXRTZXJ2ZXJTZWNyZXRSZXNwb25zZRJjChJEZWxldGVTZXJ2ZXJTZWNyZXQSJS5jb21wYXNzLnYxLkRlbGV0ZVNlcnZlclNlY3JldFJlcXVlc3QaJi5jb21wYXNzLnYxLkRlbGV0ZVNlcnZlclNlY3JldFJlc3BvbnNlEmAKEUxpc3RTZXJ2ZXJTZWNyZXRzEiQuY29tcGFzcy52MS5MaXN0U2VydmVyU2VjcmV0c1JlcXVlc3QaJS5jb21wYXNzLnYxLkxpc3RTZXJ2ZXJTZWNyZXRzUmVzcG9uc2ViBnByb3RvMw", [file_google_protobuf_timestamp]); /** * @generated from message compass.v1.SetSecretRequest @@ -660,6 +660,24 @@ export type AgentSessionStatus = Message<"compass.v1.AgentSessionStatus"> & { * @generated from field: string agent_account_id = 3; */ agentAccountId: string; + + /** + * The runtime tier this session's workload runs on, and how its egress is + * constrained. Both are backward-compatible appends (buf: non-breaking) and + * both are reported by the Runner that owns the session, because it is the + * component that resolved the backend. Posture is carried separately rather + * than inferred from the tier: a tier's enforcement is a property of the + * backend, and a client deriving one from the other would render a stale + * answer the moment that changes. + * + * @generated from field: compass.v1.RuntimeTier runtime_tier = 4; + */ + runtimeTier: RuntimeTier; + + /** + * @generated from field: compass.v1.EgressPosture egress_posture = 5; + */ + egressPosture: EgressPosture; }; /** @@ -2723,6 +2741,76 @@ export enum ServerState { export const ServerStateSchema: GenEnum = /*@__PURE__*/ enumDesc(file_compass_v1_compass, 2); +/** + * The runtime tier an agent workload runs on. `HOST` runs agents as direct + * child processes of the Runner, with no container or VM boundary. + * + * @generated from enum compass.v1.RuntimeTier + */ +export enum RuntimeTier { + /** + * @generated from enum value: RUNTIME_TIER_UNSPECIFIED = 0; + */ + UNSPECIFIED = 0, + + /** + * @generated from enum value: RUNTIME_TIER_PODMAN = 1; + */ + PODMAN = 1, + + /** + * @generated from enum value: RUNTIME_TIER_MICROVM = 2; + */ + MICROVM = 2, + + /** + * @generated from enum value: RUNTIME_TIER_APPLE_CONTAINER = 3; + */ + APPLE_CONTAINER = 3, + + /** + * @generated from enum value: RUNTIME_TIER_HOST = 4; + */ + HOST = 4, +} + +/** + * Describes the enum compass.v1.RuntimeTier. + */ +export const RuntimeTierSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_compass_v1_compass, 3); + +/** + * How an agent's egress is constrained. `UNENFORCED` means the tier cannot + * constrain it at all — a host process shares the host's network namespace, so + * there is no boundary to firewall. It is a declared posture, never a failed + * arm, and a client must not render it as contained. + * + * @generated from enum compass.v1.EgressPosture + */ +export enum EgressPosture { + /** + * @generated from enum value: EGRESS_POSTURE_UNSPECIFIED = 0; + */ + UNSPECIFIED = 0, + + /** + * @generated from enum value: EGRESS_POSTURE_ARMED = 1; + */ + ARMED = 1, + + /** + * @generated from enum value: EGRESS_POSTURE_UNENFORCED = 2; + */ + UNENFORCED = 2, +} + +/** + * Describes the enum compass.v1.EgressPosture. + */ +export const EgressPostureSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_compass_v1_compass, 4); + /** * Agent-session lifecycle states. `ERRORED` is an unexpected agent exit (OOM, * panic, engine restart); recovery is an explicit ReloadAgentSession, never an @@ -2786,7 +2874,7 @@ export enum AgentSessionState { * Describes the enum compass.v1.AgentSessionState. */ export const AgentSessionStateSchema: GenEnum = /*@__PURE__*/ - enumDesc(file_compass_v1_compass, 3); + enumDesc(file_compass_v1_compass, 5); /** * @generated from enum compass.v1.AgentToolCallStatus @@ -2822,7 +2910,7 @@ export enum AgentToolCallStatus { * Describes the enum compass.v1.AgentToolCallStatus. */ export const AgentToolCallStatusSchema: GenEnum = /*@__PURE__*/ - enumDesc(file_compass_v1_compass, 4); + enumDesc(file_compass_v1_compass, 6); /** * @generated from enum compass.v1.AgentPlanEntryStatus @@ -2853,7 +2941,7 @@ export enum AgentPlanEntryStatus { * Describes the enum compass.v1.AgentPlanEntryStatus. */ export const AgentPlanEntryStatusSchema: GenEnum = /*@__PURE__*/ - enumDesc(file_compass_v1_compass, 5); + enumDesc(file_compass_v1_compass, 7); /** * The control op-kind a SessionInjection records. Mirrors the internal @@ -2885,7 +2973,7 @@ export enum SessionInjectionKind { * Describes the enum compass.v1.SessionInjectionKind. */ export const SessionInjectionKindSchema: GenEnum = /*@__PURE__*/ - enumDesc(file_compass_v1_compass, 6); + enumDesc(file_compass_v1_compass, 8); /** * The class of a SessionError. ERROR pairs with the ERRORED lifecycle @@ -2915,7 +3003,7 @@ export enum SessionErrorKind { * Describes the enum compass.v1.SessionErrorKind. */ export const SessionErrorKindSchema: GenEnum = /*@__PURE__*/ - enumDesc(file_compass_v1_compass, 7); + enumDesc(file_compass_v1_compass, 9); /** * The Compass issue lifecycle, server-owned (DL-032/DL-033 + terminal ARCHIVED, @@ -2979,7 +3067,7 @@ export enum IssueState { * Describes the enum compass.v1.IssueState. */ export const IssueStateSchema: GenEnum = /*@__PURE__*/ - enumDesc(file_compass_v1_compass, 8); + enumDesc(file_compass_v1_compass, 10); /** * Which forge (and which host, for self-hosted instances) an artifact lives on. @@ -3021,7 +3109,7 @@ export enum ForgeProvider { * Describes the enum compass.v1.ForgeProvider. */ export const ForgeProviderSchema: GenEnum = /*@__PURE__*/ - enumDesc(file_compass_v1_compass, 9); + enumDesc(file_compass_v1_compass, 11); /** * The Compass server service. diff --git a/packages/compass-client/src/gen/compass/v1/compass_pb.ts b/packages/compass-client/src/gen/compass/v1/compass_pb.ts index c62d151ba..cc0b54ac6 100644 --- a/packages/compass-client/src/gen/compass/v1/compass_pb.ts +++ b/packages/compass-client/src/gen/compass/v1/compass_pb.ts @@ -20,7 +20,7 @@ import type { Message } from "@bufbuild/protobuf"; * Describes the file compass/v1/compass.proto. */ export const file_compass_v1_compass: GenFile = /*@__PURE__*/ - fileDesc("Chhjb21wYXNzL3YxL2NvbXBhc3MucHJvdG8SCmNvbXBhc3MudjEiqAEKEFNldFNlY3JldFJlcXVlc3QSDAoEbmFtZRgBIAEoCRISCgV2YWx1ZRgCIAEoCUIDgAEBEiwKCGRlbGl2ZXJ5GAMgASgOMhouY29tcGFzcy52MS5TZWNyZXREZWxpdmVyeRIkCgRraW5kGAQgASgOMhYuY29tcGFzcy52MS5TZWNyZXRLaW5kEhAKCHByb3ZpZGVyGAUgASgJEgwKBGhvc3QYBiABKAkiEwoRU2V0U2VjcmV0UmVzcG9uc2UiFAoSTGlzdFNlY3JldHNSZXF1ZXN0IkAKE0xpc3RTZWNyZXRzUmVzcG9uc2USKQoHc2VjcmV0cxgBIAMoCzIYLmNvbXBhc3MudjEuU2VjcmV0U3RhdHVzIqABCgxTZWNyZXRTdGF0dXMSDAoEbmFtZRgBIAEoCRIOCgZpc19zZXQYAiABKAgSLAoIZGVsaXZlcnkYAyABKA4yGi5jb21wYXNzLnYxLlNlY3JldERlbGl2ZXJ5EiQKBGtpbmQYBCABKA4yFi5jb21wYXNzLnYxLlNlY3JldEtpbmQSEAoIcHJvdmlkZXIYBSABKAkSDAoEaG9zdBgGIAEoCSIjChNEZWxldGVTZWNyZXRSZXF1ZXN0EgwKBG5hbWUYASABKAkiFgoURGVsZXRlU2VjcmV0UmVzcG9uc2UiOgoWU2V0U2VydmVyU2VjcmV0UmVxdWVzdBIMCgRuYW1lGAEgASgJEhIKBXZhbHVlGAIgASgJQgOAAQEiGQoXU2V0U2VydmVyU2VjcmV0UmVzcG9uc2UiKQoZRGVsZXRlU2VydmVyU2VjcmV0UmVxdWVzdBIMCgRuYW1lGAEgASgJIhwKGkRlbGV0ZVNlcnZlclNlY3JldFJlc3BvbnNlIhoKGExpc3RTZXJ2ZXJTZWNyZXRzUmVxdWVzdCJTChlMaXN0U2VydmVyU2VjcmV0c1Jlc3BvbnNlEjYKDnNlcnZlcl9zZWNyZXRzGAEgAygLMh4uY29tcGFzcy52MS5TZXJ2ZXJTZWNyZXRTdGF0dXMiMgoSU2VydmVyU2VjcmV0U3RhdHVzEgwKBG5hbWUYASABKAkSDgoGaXNfc2V0GAIgASgIIhYKFEdldFNlcnZlckluZm9SZXF1ZXN0Ij0KFUdldFNlcnZlckluZm9SZXNwb25zZRIPCgd2ZXJzaW9uGAEgASgJEhMKC2FwaV92ZXJzaW9uGAIgASgJIg8KDVdob0FtSVJlcXVlc3QiJAoOV2hvQW1JUmVzcG9uc2USEgoKYWNjb3VudF9pZBgBIAEoCSJDChZTdWJzY3JpYmVFdmVudHNSZXF1ZXN0EhEKCXNpbmNlX3NlcRgBIAEoBBIWCg5pbnN0YW5jZV9lcG9jaBgCIAEoBCLiAwoXU3Vic2NyaWJlRXZlbnRzUmVzcG9uc2USCwoDc2VxGAEgASgEEhIKCmF0X3VuaXhfbXMYAiABKAMSFgoOaW5zdGFuY2VfZXBvY2gYAyABKAQSFAoMc25hcHNob3Rfc2VxGAQgASgEEjEKDXNlcnZlcl9zdGF0dXMYCiABKAsyGC5jb21wYXNzLnYxLlNlcnZlclN0YXR1c0gAEjUKD3Jlc3luY19yZXF1aXJlZBgLIAEoCzIaLmNvbXBhc3MudjEuUmVzeW5jUmVxdWlyZWRIABI+ChRhZ2VudF9zZXNzaW9uX3N0YXR1cxgMIAEoCzIeLmNvbXBhc3MudjEuQWdlbnRTZXNzaW9uU3RhdHVzSAASPAoTYWdlbnRfbWVzc2FnZV9jaHVuaxgNIAEoCzIdLmNvbXBhc3MudjEuQWdlbnRNZXNzYWdlQ2h1bmtIABI0Cg9hZ2VudF90b29sX2NhbGwYDiABKAsyGS5jb21wYXNzLnYxLkFnZW50VG9vbENhbGxIABIrCgphZ2VudF9wbGFuGA8gASgLMhUuY29tcGFzcy52MS5BZ2VudFBsYW5IABIiCgVpc3N1ZRgQIAEoCzIRLmNvbXBhc3MudjEuSXNzdWVIAEIJCgdwYXlsb2FkIi4KFkxpc3RCb2FyZElzc3Vlc1JlcXVlc3QSFAoMc25hcHNob3Rfc2VxGAEgASgEIjwKF0xpc3RCb2FyZElzc3Vlc1Jlc3BvbnNlEiEKBmlzc3VlcxgBIAMoCzIRLmNvbXBhc3MudjEuSXNzdWUiNgoMU2VydmVyU3RhdHVzEiYKBXN0YXRlGAEgASgOMhcuY29tcGFzcy52MS5TZXJ2ZXJTdGF0ZSIQCg5SZXN5bmNSZXF1aXJlZCJwChJBZ2VudFNlc3Npb25TdGF0dXMSEgoKc2Vzc2lvbl9pZBgBIAEoCRIsCgVzdGF0ZRgCIAEoDjIdLmNvbXBhc3MudjEuQWdlbnRTZXNzaW9uU3RhdGUSGAoQYWdlbnRfYWNjb3VudF9pZBgDIAEoCSJJChFBZ2VudE1lc3NhZ2VDaHVuaxISCgpzZXNzaW9uX2lkGAEgASgJEgwKBHRleHQYAiABKAkSEgoKaXNfdGhvdWdodBgDIAEoCCJ5Cg1BZ2VudFRvb2xDYWxsEhIKCnNlc3Npb25faWQYASABKAkSFAoMdG9vbF9jYWxsX2lkGAIgASgJEg0KBXRpdGxlGAMgASgJEi8KBnN0YXR1cxgEIAEoDjIfLmNvbXBhc3MudjEuQWdlbnRUb29sQ2FsbFN0YXR1cyJMCglBZ2VudFBsYW4SEgoKc2Vzc2lvbl9pZBgBIAEoCRIrCgdlbnRyaWVzGAIgAygLMhouY29tcGFzcy52MS5BZ2VudFBsYW5FbnRyeSJTCg5BZ2VudFBsYW5FbnRyeRIPCgdjb250ZW50GAEgASgJEjAKBnN0YXR1cxgCIAEoDjIgLmNvbXBhc3MudjEuQWdlbnRQbGFuRW50cnlTdGF0dXMi3wMKDFNlc3Npb25FdmVudBIQCghldmVudF9pZBgBIAEoCRISCgphdF91bml4X21zGAIgASgDEjoKDmFzc2lzdGFudF90ZXh0GAMgASgLMiAuY29tcGFzcy52MS5TZXNzaW9uQXNzaXN0YW50VGV4dEgAEi8KCHRoaW5raW5nGAQgASgLMhsuY29tcGFzcy52MS5TZXNzaW9uVGhpbmtpbmdIABIwCgl0b29sX2NhbGwYBSABKAsyGy5jb21wYXNzLnYxLlNlc3Npb25Ub29sQ2FsbEgAEj0KEHRvb2xfY2FsbF91cGRhdGUYBiABKAsyIS5jb21wYXNzLnYxLlNlc3Npb25Ub29sQ2FsbFVwZGF0ZUgAEicKBHBsYW4YByABKAsyFy5jb21wYXNzLnYxLlNlc3Npb25QbGFuSAASKwoGbm90aWNlGAggASgLMhkuY29tcGFzcy52MS5TZXNzaW9uTm90aWNlSAASOQoRc2Vzc2lvbl9pbmplY3Rpb24YCSABKAsyHC5jb21wYXNzLnYxLlNlc3Npb25JbmplY3Rpb25IABIxCg1zZXNzaW9uX2Vycm9yGAogASgLMhguY29tcGFzcy52MS5TZXNzaW9uRXJyb3JIAEIHCgVldmVudCI4ChRTZXNzaW9uQXNzaXN0YW50VGV4dBIMCgR0ZXh0GAEgASgJEhIKCm1lc3NhZ2VfaWQYAiABKAkiMwoPU2Vzc2lvblRoaW5raW5nEgwKBHRleHQYASABKAkSEgoKbWVzc2FnZV9pZBgCIAEoCSJnCg9TZXNzaW9uVG9vbENhbGwSFAoMdG9vbF9jYWxsX2lkGAEgASgJEg0KBXRpdGxlGAIgASgJEi8KBnN0YXR1cxgDIAEoDjIfLmNvbXBhc3MudjEuQWdlbnRUb29sQ2FsbFN0YXR1cyKaAQoVU2Vzc2lvblRvb2xDYWxsVXBkYXRlEhQKDHRvb2xfY2FsbF9pZBgBIAEoCRIvCgZzdGF0dXMYAiABKA4yHy5jb21wYXNzLnYxLkFnZW50VG9vbENhbGxTdGF0dXMSDgoGb3V0cHV0GAMgASgJEioKBWRpZmZzGAQgAygLMhsuY29tcGFzcy52MS5TZXNzaW9uRmlsZURpZmYiVQoPU2Vzc2lvbkZpbGVEaWZmEgwKBHBhdGgYASABKAkSFQoIb2xkX3RleHQYAiABKAlIAIgBARIQCghuZXdfdGV4dBgDIAEoCUILCglfb2xkX3RleHQiOgoLU2Vzc2lvblBsYW4SKwoHZW50cmllcxgBIAMoCzIaLmNvbXBhc3MudjEuQWdlbnRQbGFuRW50cnkiOQoNU2Vzc2lvbk5vdGljZRIMCgR0ZXh0GAEgASgJEhEKBGxpbmsYAiABKAlIAIgBAUIHCgVfbGluayKDAQoQU2Vzc2lvbkluamVjdGlvbhIxCgdvcF9raW5kGAEgASgOMiAuY29tcGFzcy52MS5TZXNzaW9uSW5qZWN0aW9uS2luZBISCgptZXNzYWdlX2lkGAIgASgJEhMKC2Zyb21faGFuZGxlGAMgASgJEhMKC3RyYWNlcGFyZW50GAQgASgJImsKDFNlc3Npb25FcnJvchIqCgRraW5kGAEgASgOMhwuY29tcGFzcy52MS5TZXNzaW9uRXJyb3JLaW5kEg8KB21lc3NhZ2UYAiABKAkSEwoGc3RhdHVzGAMgASgFSACIAQFCCQoHX3N0YXR1cyIyChxTdWJzY3JpYmVBZ2VudFNlc3Npb25SZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkifgoRQWdlbnRTZXNzaW9uRnJhbWUSEgoKc2Vzc2lvbl9pZBgBIAEoCRInCgVldmVudBgCIAEoCzIYLmNvbXBhc3MudjEuU2Vzc2lvbkV2ZW50EiwKBXN0YXRlGAMgASgOMh0uY29tcGFzcy52MS5BZ2VudFNlc3Npb25TdGF0ZSJwCh5Qcm92aXNpb25BZ2VudFdvcmtzcGFjZVJlcXVlc3QSFAoMYWdlbnRfaGFuZGxlGAEgASgJEhkKEWNsaWVudF9yZXF1ZXN0X2lkGAIgASgJEg8KB3BlcnNvbmEYAyABKAkSDAoEcm9sZRgEIAEoCSI5Ch9Qcm92aXNpb25BZ2VudFdvcmtzcGFjZVJlc3BvbnNlEhYKDmNvbnRhaW5lcl9uYW1lGAEgASgJIlAKG1JlbW92ZUFnZW50V29ya3NwYWNlUmVxdWVzdBIWCg5jb250YWluZXJfbmFtZRgBIAEoCRIZChFjbGllbnRfcmVxdWVzdF9pZBgCIAEoCSIeChxSZW1vdmVBZ2VudFdvcmtzcGFjZVJlc3BvbnNlImMKGFN0YXJ0QWdlbnRTZXNzaW9uUmVxdWVzdBIWCg5jb250YWluZXJfbmFtZRgBIAEoCRIZChFyZXN1bWVfc2Vzc2lvbl9pZBgDIAEoCUoECAIQA1IOaW5pdGlhbF9wcm9tcHQiLwoZU3RhcnRBZ2VudFNlc3Npb25SZXNwb25zZRISCgpzZXNzaW9uX2lkGAEgASgJIloKEVNwYXduQWdlbnRSZXF1ZXN0EhQKDGFnZW50X2hhbmRsZRgBIAEoCRIZChFjbGllbnRfcmVxdWVzdF9pZBgDIAEoCUoECAIQA1IOaW5pdGlhbF9wcm9tcHQiQAoSU3Bhd25BZ2VudFJlc3BvbnNlEhIKCnNlc3Npb25faWQYASABKAkSFgoOY29udGFpbmVyX25hbWUYAiABKAkiLQoXU3RvcEFnZW50U2Vzc2lvblJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCSIaChhTdG9wQWdlbnRTZXNzaW9uUmVzcG9uc2UiLwoZUmVsb2FkQWdlbnRTZXNzaW9uUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJIjAKGlJlbG9hZEFnZW50U2Vzc2lvblJlc3BvbnNlEhIKCnNlc3Npb25faWQYASABKAkiKwoVR2V0QWdlbnRTdGF0dXNSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkiSgoWR2V0QWdlbnRTdGF0dXNSZXNwb25zZRIwCghzdGF0dXNlcxgBIAMoCzIeLmNvbXBhc3MudjEuQWdlbnRTZXNzaW9uU3RhdHVzIisKEUlzc3VlVG9rZW5SZXF1ZXN0EhYKDmFjY291bnRfaGFuZGxlGAEgASgJIiMKEklzc3VlVG9rZW5SZXNwb25zZRINCgV0b2tlbhgBIAEoCSIoChJSZXZva2VUb2tlblJlcXVlc3QSEgoFdG9rZW4YASABKAlCA4ABASIVChNSZXZva2VUb2tlblJlc3BvbnNlIicKFVB1dEFnZW50Q29uZmlnUmVxdWVzdBIOCgZidW5kbGUYASABKAwiKQoWUHV0QWdlbnRDb25maWdSZXNwb25zZRIPCgd2ZXJzaW9uGAEgASgJIhsKGUdldEFnZW50Q29uZmlnSW5mb1JlcXVlc3Qi2gEKGkdldEFnZW50Q29uZmlnSW5mb1Jlc3BvbnNlEg8KB3ZlcnNpb24YASABKAkSDgoGc2tpbGxzGAIgAygJEhIKCmV4dGVuc2lvbnMYAyADKAkSEwoLbWNwX3NlcnZlcnMYBCADKAkSFAoMaGFzX3NldHRpbmdzGAUgASgIEhUKDWhhc19hZ2VudHNfbWQYBiABKAgSDQoFcnVsZXMYByADKAkSEQoJc3ViYWdlbnRzGAggAygJEhIKCmhhc19tb2RlbHMYCSABKAgSDwoHcHJvbXB0cxgKIAMoCSIaChhEZWxldGVBZ2VudENvbmZpZ1JlcXVlc3QiGwoZRGVsZXRlQWdlbnRDb25maWdSZXNwb25zZSI0Cg5Nb2RlbENhbmRpZGF0ZRIQCghwcm92aWRlchgBIAEoCRIQCghtb2RlbF9pZBgCIAEoCSJxCg1Nb2RlbE1ldGFkYXRhEhYKDmNvbnRleHRfd2luZG93GAEgASgDEhwKFGlucHV0X2Nvc3RfbWljcm9fdXNkGAIgASgDEh0KFW91dHB1dF9jb3N0X21pY3JvX3VzZBgDIAEoAxILCgNhcGkYBCABKAkihwEKEk1vZGVsUmVnaXN0cnlFbnRyeRIUCgxkaXNwbGF5X25hbWUYASABKAkSLgoKY2FuZGlkYXRlcxgCIAMoCzIaLmNvbXBhc3MudjEuTW9kZWxDYW5kaWRhdGUSKwoIbWV0YWRhdGEYAyABKAsyGS5jb21wYXNzLnYxLk1vZGVsTWV0YWRhdGEimAEKDU1vZGVsUmVnaXN0cnkSNwoHZW50cmllcxgBIAMoCzImLmNvbXBhc3MudjEuTW9kZWxSZWdpc3RyeS5FbnRyaWVzRW50cnkaTgoMRW50cmllc0VudHJ5EgsKA2tleRgBIAEoCRItCgV2YWx1ZRgCIAEoCzIeLmNvbXBhc3MudjEuTW9kZWxSZWdpc3RyeUVudHJ5OgI4ASJgChdQdXRNb2RlbFJlZ2lzdHJ5UmVxdWVzdBIrCghyZWdpc3RyeRgBIAEoCzIZLmNvbXBhc3MudjEuTW9kZWxSZWdpc3RyeRIYChBleHBlY3RlZF92ZXJzaW9uGAIgASgDIisKGFB1dE1vZGVsUmVnaXN0cnlSZXNwb25zZRIPCgd2ZXJzaW9uGAEgASgDIhkKF0dldE1vZGVsUmVnaXN0cnlSZXF1ZXN0IlgKGEdldE1vZGVsUmVnaXN0cnlSZXNwb25zZRIPCgd2ZXJzaW9uGAEgASgDEisKCHJlZ2lzdHJ5GAIgASgLMhkuY29tcGFzcy52MS5Nb2RlbFJlZ2lzdHJ5IhwKGkRlbGV0ZU1vZGVsUmVnaXN0cnlSZXF1ZXN0Ih0KG0RlbGV0ZU1vZGVsUmVnaXN0cnlSZXNwb25zZSI+ChBBZ2VudEF0dHJpYnV0aW9uEhQKDGFnZW50X2hhbmRsZRgBIAEoCRIUCgxvd25lcl9oYW5kbGUYAiABKAkiRQoIRm9yZ2VSZWYSKwoIcHJvdmlkZXIYASABKA4yGS5jb21wYXNzLnYxLkZvcmdlUHJvdmlkZXISDAoEaG9zdBgCIAEoCSLUAwoFSXNzdWUSCgoCaWQYASABKAkSIwoFZm9yZ2UYAiABKAsyFC5jb21wYXNzLnYxLkZvcmdlUmVmEgwKBHJlcG8YAyABKAkSDgoGbnVtYmVyGAQgASgNEg0KBXRpdGxlGAUgASgJEgwKBGJvZHkYBiABKAkSEwoLZm9yZ2Vfc3RhdGUYByABKAkSCwoDdXJsGAggASgJEisKBWFnZW50GAkgASgLMhwuY29tcGFzcy52MS5BZ2VudEF0dHJpYnV0aW9uEhUKDWZvcmdlX2FjY291bnQYCiABKAkSDgoGbGFiZWxzGAsgAygJEi4KCnVwZGF0ZWRfYXQYEyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEiUKBXN0YXRlGAwgASgOMhYuY29tcGFzcy52MS5Jc3N1ZVN0YXRlEhAKCHByaW9yaXR5GA0gASgJEhAKCGFzc2lnbmVlGA4gASgJEg8KB3N1bW1hcnkYDyABKAkSDgoGYnJhbmNoGBAgASgJEiQKA3BycxgRIAMoCzIXLmNvbXBhc3MudjEuUHVsbFJlcXVlc3QSJwoHdHJhY2tlchgSIAEoCzIWLmNvbXBhc3MudjEuVHJhY2tlclJlZiKeAwoLUHVsbFJlcXVlc3QSIwoFZm9yZ2UYASABKAsyFC5jb21wYXNzLnYxLkZvcmdlUmVmEgwKBHJlcG8YAiABKAkSDgoGbnVtYmVyGAMgASgNEg0KBXRpdGxlGAQgASgJEhMKC2ZvcmdlX3N0YXRlGAUgASgJEgsKA3VybBgGIAEoCRIQCghoZWFkX3JlZhgHIAEoCRIQCghiYXNlX3JlZhgIIAEoCRIrCgVhZ2VudBgJIAEoCzIcLmNvbXBhc3MudjEuQWdlbnRBdHRyaWJ1dGlvbhIVCg1mb3JnZV9hY2NvdW50GAogASgJEg0KBWRyYWZ0GAsgASgIEikKB2NoYW5nZWQYDCABKAsyGC5jb21wYXNzLnYxLkNoYW5nZWRTdGF0cxIpCgZjaGVja3MYDSABKAsyGS5jb21wYXNzLnYxLkNoZWNrc1N1bW1hcnkSIwoHcmV2aWV3cxgOIAMoCzISLmNvbXBhc3MudjEuUmV2aWV3EikKB3RocmVhZHMYDyADKAsyGC5jb21wYXNzLnYxLlJldmlld1RocmVhZCJTCg1DaGVja3NTdW1tYXJ5EhAKCGhlYWRfc2hhGAEgASgJEg0KBXN0YXRlGAIgASgJEiEKBmNoZWNrcxgDIAMoCzIRLmNvbXBhc3MudjEuQ2hlY2siQwoFQ2hlY2sSDAoEbmFtZRgBIAEoCRINCgVzdGF0ZRgCIAEoCRILCgN1cmwYAyABKAkSEAoIcmVxdWlyZWQYBCABKAgiQwoMQ2hhbmdlZFN0YXRzEg0KBWZpbGVzGAEgASgNEhEKCWFkZGl0aW9ucxgCIAEoDRIRCglkZWxldGlvbnMYAyABKA0iQwoKVHJhY2tlclJlZhIMCgRraW5kGAEgASgJEgoKAmlkGAIgASgJEg4KBnN0YXR1cxgDIAEoCRILCgN1cmwYBCABKAkiRwoGUmV2aWV3Eg4KBmF1dGhvchgBIAEoCRIOCgZpc19ib3QYAiABKAgSDwoHdmVyZGljdBgDIAEoCRIMCgRib2R5GAQgASgJIlUKDFJldmlld1RocmVhZBIMCgRwYXRoGAEgASgJEhAKCHJlc29sdmVkGAIgASgIEiUKCGNvbW1lbnRzGAMgAygLMhMuY29tcGFzcy52MS5Db21tZW50IjcKB0NvbW1lbnQSDgoGYXV0aG9yGAEgASgJEg4KBmlzX2JvdBgCIAEoCBIMCgRib2R5GAMgASgJKmQKDlNlY3JldERlbGl2ZXJ5Eh8KG1NFQ1JFVF9ERUxJVkVSWV9VTlNQRUNJRklFRBAAEhgKFFNFQ1JFVF9ERUxJVkVSWV9GSUxFEAESFwoTU0VDUkVUX0RFTElWRVJZX0VOVhACKnAKClNlY3JldEtpbmQSGwoXU0VDUkVUX0tJTkRfVU5TUEVDSUZJRUQQABIXChNTRUNSRVRfS0lORF9HRU5FUklDEAESGAoUU0VDUkVUX0tJTkRfUFJPVklERVIQAhISCg5TRUNSRVRfS0lORF9HSBADKkMKC1NlcnZlclN0YXRlEhwKGFNFUlZFUl9TVEFURV9VTlNQRUNJRklFRBAAEhYKElNFUlZFUl9TVEFURV9SRUFEWRABKoICChFBZ2VudFNlc3Npb25TdGF0ZRIjCh9BR0VOVF9TRVNTSU9OX1NUQVRFX1VOU1BFQ0lGSUVEEAASIAocQUdFTlRfU0VTU0lPTl9TVEFURV9TVEFSVElORxABEh0KGUFHRU5UX1NFU1NJT05fU1RBVEVfUkVBRFkQAhIfChtBR0VOVF9TRVNTSU9OX1NUQVRFX1dPUktJTkcQAxIfChtBR0VOVF9TRVNTSU9OX1NUQVRFX1NUT1BQRUQQBBIfChtBR0VOVF9TRVNTSU9OX1NUQVRFX0VSUk9SRUQQBRIkCiBBR0VOVF9TRVNTSU9OX1NUQVRFX0RJU0NPTk5FQ1RFRBAGKtIBChNBZ2VudFRvb2xDYWxsU3RhdHVzEiYKIkFHRU5UX1RPT0xfQ0FMTF9TVEFUVVNfVU5TUEVDSUZJRUQQABIiCh5BR0VOVF9UT09MX0NBTExfU1RBVFVTX1BFTkRJTkcQARImCiJBR0VOVF9UT09MX0NBTExfU1RBVFVTX0lOX1BST0dSRVNTEAISJAogQUdFTlRfVE9PTF9DQUxMX1NUQVRVU19DT01QTEVURUQQAxIhCh1BR0VOVF9UT09MX0NBTExfU1RBVFVTX0ZBSUxFRBAEKrQBChRBZ2VudFBsYW5FbnRyeVN0YXR1cxInCiNBR0VOVF9QTEFOX0VOVFJZX1NUQVRVU19VTlNQRUNJRklFRBAAEiMKH0FHRU5UX1BMQU5fRU5UUllfU1RBVFVTX1BFTkRJTkcQARInCiNBR0VOVF9QTEFOX0VOVFJZX1NUQVRVU19JTl9QUk9HUkVTUxACEiUKIUFHRU5UX1BMQU5fRU5UUllfU1RBVFVTX0NPTVBMRVRFRBADKoQBChRTZXNzaW9uSW5qZWN0aW9uS2luZBImCiJTRVNTSU9OX0lOSkVDVElPTl9LSU5EX1VOU1BFQ0lGSUVEEAASIAocU0VTU0lPTl9JTkpFQ1RJT05fS0lORF9TVEVFUhABEiIKHlNFU1NJT05fSU5KRUNUSU9OX0tJTkRfREVMSVZFUhACKnQKEFNlc3Npb25FcnJvcktpbmQSIgoeU0VTU0lPTl9FUlJPUl9LSU5EX1VOU1BFQ0lGSUVEEAASHAoYU0VTU0lPTl9FUlJPUl9LSU5EX0VSUk9SEAESHgoaU0VTU0lPTl9FUlJPUl9LSU5EX0FCT1JURUQQAirxAQoKSXNzdWVTdGF0ZRIbChdJU1NVRV9TVEFURV9VTlNQRUNJRklFRBAAEhcKE0lTU1VFX1NUQVRFX0JBQ0tMT0cQARIUChBJU1NVRV9TVEFURV9UT0RPEAISFgoSSVNTVUVfU1RBVEVfUVVFVUVEEAMSFwoTSVNTVUVfU1RBVEVfQkxPQ0tFRBAEEhsKF0lTU1VFX1NUQVRFX0lOX1BST0dSRVNTEAUSGQoVSVNTVUVfU1RBVEVfSU5fUkVWSUVXEAYSFAoQSVNTVUVfU1RBVEVfRE9ORRAHEhgKFElTU1VFX1NUQVRFX0FSQ0hJVkVEEAgqnAEKDUZvcmdlUHJvdmlkZXISHgoaRk9SR0VfUFJPVklERVJfVU5TUEVDSUZJRUQQABIZChVGT1JHRV9QUk9WSURFUl9HSVRIVUIQARIZChVGT1JHRV9QUk9WSURFUl9HSVRMQUIQAhIaChZGT1JHRV9QUk9WSURFUl9GT1JHRUpPEAMSGQoVRk9SR0VfUFJPVklERVJfTElORUFSEAQy0w4KDkNvbXBhc3NTZXJ2aWNlElQKDUdldFNlcnZlckluZm8SIC5jb21wYXNzLnYxLkdldFNlcnZlckluZm9SZXF1ZXN0GiEuY29tcGFzcy52MS5HZXRTZXJ2ZXJJbmZvUmVzcG9uc2USPwoGV2hvQW1JEhkuY29tcGFzcy52MS5XaG9BbUlSZXF1ZXN0GhouY29tcGFzcy52MS5XaG9BbUlSZXNwb25zZRJcCg9TdWJzY3JpYmVFdmVudHMSIi5jb21wYXNzLnYxLlN1YnNjcmliZUV2ZW50c1JlcXVlc3QaIy5jb21wYXNzLnYxLlN1YnNjcmliZUV2ZW50c1Jlc3BvbnNlMAESWgoPTGlzdEJvYXJkSXNzdWVzEiIuY29tcGFzcy52MS5MaXN0Qm9hcmRJc3N1ZXNSZXF1ZXN0GiMuY29tcGFzcy52MS5MaXN0Qm9hcmRJc3N1ZXNSZXNwb25zZRJyChdQcm92aXNpb25BZ2VudFdvcmtzcGFjZRIqLmNvbXBhc3MudjEuUHJvdmlzaW9uQWdlbnRXb3Jrc3BhY2VSZXF1ZXN0GisuY29tcGFzcy52MS5Qcm92aXNpb25BZ2VudFdvcmtzcGFjZVJlc3BvbnNlEmAKEVN0YXJ0QWdlbnRTZXNzaW9uEiQuY29tcGFzcy52MS5TdGFydEFnZW50U2Vzc2lvblJlcXVlc3QaJS5jb21wYXNzLnYxLlN0YXJ0QWdlbnRTZXNzaW9uUmVzcG9uc2USSwoKU3Bhd25BZ2VudBIdLmNvbXBhc3MudjEuU3Bhd25BZ2VudFJlcXVlc3QaHi5jb21wYXNzLnYxLlNwYXduQWdlbnRSZXNwb25zZRJdChBTdG9wQWdlbnRTZXNzaW9uEiMuY29tcGFzcy52MS5TdG9wQWdlbnRTZXNzaW9uUmVxdWVzdBokLmNvbXBhc3MudjEuU3RvcEFnZW50U2Vzc2lvblJlc3BvbnNlEmkKFFJlbW92ZUFnZW50V29ya3NwYWNlEicuY29tcGFzcy52MS5SZW1vdmVBZ2VudFdvcmtzcGFjZVJlcXVlc3QaKC5jb21wYXNzLnYxLlJlbW92ZUFnZW50V29ya3NwYWNlUmVzcG9uc2USYwoSUmVsb2FkQWdlbnRTZXNzaW9uEiUuY29tcGFzcy52MS5SZWxvYWRBZ2VudFNlc3Npb25SZXF1ZXN0GiYuY29tcGFzcy52MS5SZWxvYWRBZ2VudFNlc3Npb25SZXNwb25zZRJXCg5HZXRBZ2VudFN0YXR1cxIhLmNvbXBhc3MudjEuR2V0QWdlbnRTdGF0dXNSZXF1ZXN0GiIuY29tcGFzcy52MS5HZXRBZ2VudFN0YXR1c1Jlc3BvbnNlEmIKFVN1YnNjcmliZUFnZW50U2Vzc2lvbhIoLmNvbXBhc3MudjEuU3Vic2NyaWJlQWdlbnRTZXNzaW9uUmVxdWVzdBodLmNvbXBhc3MudjEuQWdlbnRTZXNzaW9uRnJhbWUwARJLCgpJc3N1ZVRva2VuEh0uY29tcGFzcy52MS5Jc3N1ZVRva2VuUmVxdWVzdBoeLmNvbXBhc3MudjEuSXNzdWVUb2tlblJlc3BvbnNlEk4KC1Jldm9rZVRva2VuEh4uY29tcGFzcy52MS5SZXZva2VUb2tlblJlcXVlc3QaHy5jb21wYXNzLnYxLlJldm9rZVRva2VuUmVzcG9uc2USVwoOUHV0QWdlbnRDb25maWcSIS5jb21wYXNzLnYxLlB1dEFnZW50Q29uZmlnUmVxdWVzdBoiLmNvbXBhc3MudjEuUHV0QWdlbnRDb25maWdSZXNwb25zZRJjChJHZXRBZ2VudENvbmZpZ0luZm8SJS5jb21wYXNzLnYxLkdldEFnZW50Q29uZmlnSW5mb1JlcXVlc3QaJi5jb21wYXNzLnYxLkdldEFnZW50Q29uZmlnSW5mb1Jlc3BvbnNlEmAKEURlbGV0ZUFnZW50Q29uZmlnEiQuY29tcGFzcy52MS5EZWxldGVBZ2VudENvbmZpZ1JlcXVlc3QaJS5jb21wYXNzLnYxLkRlbGV0ZUFnZW50Q29uZmlnUmVzcG9uc2USXQoQUHV0TW9kZWxSZWdpc3RyeRIjLmNvbXBhc3MudjEuUHV0TW9kZWxSZWdpc3RyeVJlcXVlc3QaJC5jb21wYXNzLnYxLlB1dE1vZGVsUmVnaXN0cnlSZXNwb25zZRJdChBHZXRNb2RlbFJlZ2lzdHJ5EiMuY29tcGFzcy52MS5HZXRNb2RlbFJlZ2lzdHJ5UmVxdWVzdBokLmNvbXBhc3MudjEuR2V0TW9kZWxSZWdpc3RyeVJlc3BvbnNlEmYKE0RlbGV0ZU1vZGVsUmVnaXN0cnkSJi5jb21wYXNzLnYxLkRlbGV0ZU1vZGVsUmVnaXN0cnlSZXF1ZXN0GicuY29tcGFzcy52MS5EZWxldGVNb2RlbFJlZ2lzdHJ5UmVzcG9uc2UyoAQKDlNlY3JldHNTZXJ2aWNlEkgKCVNldFNlY3JldBIcLmNvbXBhc3MudjEuU2V0U2VjcmV0UmVxdWVzdBodLmNvbXBhc3MudjEuU2V0U2VjcmV0UmVzcG9uc2USTgoLTGlzdFNlY3JldHMSHi5jb21wYXNzLnYxLkxpc3RTZWNyZXRzUmVxdWVzdBofLmNvbXBhc3MudjEuTGlzdFNlY3JldHNSZXNwb25zZRJRCgxEZWxldGVTZWNyZXQSHy5jb21wYXNzLnYxLkRlbGV0ZVNlY3JldFJlcXVlc3QaIC5jb21wYXNzLnYxLkRlbGV0ZVNlY3JldFJlc3BvbnNlEloKD1NldFNlcnZlclNlY3JldBIiLmNvbXBhc3MudjEuU2V0U2VydmVyU2VjcmV0UmVxdWVzdBojLmNvbXBhc3MudjEuU2V0U2VydmVyU2VjcmV0UmVzcG9uc2USYwoSRGVsZXRlU2VydmVyU2VjcmV0EiUuY29tcGFzcy52MS5EZWxldGVTZXJ2ZXJTZWNyZXRSZXF1ZXN0GiYuY29tcGFzcy52MS5EZWxldGVTZXJ2ZXJTZWNyZXRSZXNwb25zZRJgChFMaXN0U2VydmVyU2VjcmV0cxIkLmNvbXBhc3MudjEuTGlzdFNlcnZlclNlY3JldHNSZXF1ZXN0GiUuY29tcGFzcy52MS5MaXN0U2VydmVyU2VjcmV0c1Jlc3BvbnNlYgZwcm90bzM", [file_google_protobuf_timestamp]); + fileDesc("Chhjb21wYXNzL3YxL2NvbXBhc3MucHJvdG8SCmNvbXBhc3MudjEiqAEKEFNldFNlY3JldFJlcXVlc3QSDAoEbmFtZRgBIAEoCRISCgV2YWx1ZRgCIAEoCUIDgAEBEiwKCGRlbGl2ZXJ5GAMgASgOMhouY29tcGFzcy52MS5TZWNyZXREZWxpdmVyeRIkCgRraW5kGAQgASgOMhYuY29tcGFzcy52MS5TZWNyZXRLaW5kEhAKCHByb3ZpZGVyGAUgASgJEgwKBGhvc3QYBiABKAkiEwoRU2V0U2VjcmV0UmVzcG9uc2UiFAoSTGlzdFNlY3JldHNSZXF1ZXN0IkAKE0xpc3RTZWNyZXRzUmVzcG9uc2USKQoHc2VjcmV0cxgBIAMoCzIYLmNvbXBhc3MudjEuU2VjcmV0U3RhdHVzIqABCgxTZWNyZXRTdGF0dXMSDAoEbmFtZRgBIAEoCRIOCgZpc19zZXQYAiABKAgSLAoIZGVsaXZlcnkYAyABKA4yGi5jb21wYXNzLnYxLlNlY3JldERlbGl2ZXJ5EiQKBGtpbmQYBCABKA4yFi5jb21wYXNzLnYxLlNlY3JldEtpbmQSEAoIcHJvdmlkZXIYBSABKAkSDAoEaG9zdBgGIAEoCSIjChNEZWxldGVTZWNyZXRSZXF1ZXN0EgwKBG5hbWUYASABKAkiFgoURGVsZXRlU2VjcmV0UmVzcG9uc2UiOgoWU2V0U2VydmVyU2VjcmV0UmVxdWVzdBIMCgRuYW1lGAEgASgJEhIKBXZhbHVlGAIgASgJQgOAAQEiGQoXU2V0U2VydmVyU2VjcmV0UmVzcG9uc2UiKQoZRGVsZXRlU2VydmVyU2VjcmV0UmVxdWVzdBIMCgRuYW1lGAEgASgJIhwKGkRlbGV0ZVNlcnZlclNlY3JldFJlc3BvbnNlIhoKGExpc3RTZXJ2ZXJTZWNyZXRzUmVxdWVzdCJTChlMaXN0U2VydmVyU2VjcmV0c1Jlc3BvbnNlEjYKDnNlcnZlcl9zZWNyZXRzGAEgAygLMh4uY29tcGFzcy52MS5TZXJ2ZXJTZWNyZXRTdGF0dXMiMgoSU2VydmVyU2VjcmV0U3RhdHVzEgwKBG5hbWUYASABKAkSDgoGaXNfc2V0GAIgASgIIhYKFEdldFNlcnZlckluZm9SZXF1ZXN0Ij0KFUdldFNlcnZlckluZm9SZXNwb25zZRIPCgd2ZXJzaW9uGAEgASgJEhMKC2FwaV92ZXJzaW9uGAIgASgJIg8KDVdob0FtSVJlcXVlc3QiJAoOV2hvQW1JUmVzcG9uc2USEgoKYWNjb3VudF9pZBgBIAEoCSJDChZTdWJzY3JpYmVFdmVudHNSZXF1ZXN0EhEKCXNpbmNlX3NlcRgBIAEoBBIWCg5pbnN0YW5jZV9lcG9jaBgCIAEoBCLiAwoXU3Vic2NyaWJlRXZlbnRzUmVzcG9uc2USCwoDc2VxGAEgASgEEhIKCmF0X3VuaXhfbXMYAiABKAMSFgoOaW5zdGFuY2VfZXBvY2gYAyABKAQSFAoMc25hcHNob3Rfc2VxGAQgASgEEjEKDXNlcnZlcl9zdGF0dXMYCiABKAsyGC5jb21wYXNzLnYxLlNlcnZlclN0YXR1c0gAEjUKD3Jlc3luY19yZXF1aXJlZBgLIAEoCzIaLmNvbXBhc3MudjEuUmVzeW5jUmVxdWlyZWRIABI+ChRhZ2VudF9zZXNzaW9uX3N0YXR1cxgMIAEoCzIeLmNvbXBhc3MudjEuQWdlbnRTZXNzaW9uU3RhdHVzSAASPAoTYWdlbnRfbWVzc2FnZV9jaHVuaxgNIAEoCzIdLmNvbXBhc3MudjEuQWdlbnRNZXNzYWdlQ2h1bmtIABI0Cg9hZ2VudF90b29sX2NhbGwYDiABKAsyGS5jb21wYXNzLnYxLkFnZW50VG9vbENhbGxIABIrCgphZ2VudF9wbGFuGA8gASgLMhUuY29tcGFzcy52MS5BZ2VudFBsYW5IABIiCgVpc3N1ZRgQIAEoCzIRLmNvbXBhc3MudjEuSXNzdWVIAEIJCgdwYXlsb2FkIi4KFkxpc3RCb2FyZElzc3Vlc1JlcXVlc3QSFAoMc25hcHNob3Rfc2VxGAEgASgEIjwKF0xpc3RCb2FyZElzc3Vlc1Jlc3BvbnNlEiEKBmlzc3VlcxgBIAMoCzIRLmNvbXBhc3MudjEuSXNzdWUiNgoMU2VydmVyU3RhdHVzEiYKBXN0YXRlGAEgASgOMhcuY29tcGFzcy52MS5TZXJ2ZXJTdGF0ZSIQCg5SZXN5bmNSZXF1aXJlZCLSAQoSQWdlbnRTZXNzaW9uU3RhdHVzEhIKCnNlc3Npb25faWQYASABKAkSLAoFc3RhdGUYAiABKA4yHS5jb21wYXNzLnYxLkFnZW50U2Vzc2lvblN0YXRlEhgKEGFnZW50X2FjY291bnRfaWQYAyABKAkSLQoMcnVudGltZV90aWVyGAQgASgOMhcuY29tcGFzcy52MS5SdW50aW1lVGllchIxCg5lZ3Jlc3NfcG9zdHVyZRgFIAEoDjIZLmNvbXBhc3MudjEuRWdyZXNzUG9zdHVyZSJJChFBZ2VudE1lc3NhZ2VDaHVuaxISCgpzZXNzaW9uX2lkGAEgASgJEgwKBHRleHQYAiABKAkSEgoKaXNfdGhvdWdodBgDIAEoCCJ5Cg1BZ2VudFRvb2xDYWxsEhIKCnNlc3Npb25faWQYASABKAkSFAoMdG9vbF9jYWxsX2lkGAIgASgJEg0KBXRpdGxlGAMgASgJEi8KBnN0YXR1cxgEIAEoDjIfLmNvbXBhc3MudjEuQWdlbnRUb29sQ2FsbFN0YXR1cyJMCglBZ2VudFBsYW4SEgoKc2Vzc2lvbl9pZBgBIAEoCRIrCgdlbnRyaWVzGAIgAygLMhouY29tcGFzcy52MS5BZ2VudFBsYW5FbnRyeSJTCg5BZ2VudFBsYW5FbnRyeRIPCgdjb250ZW50GAEgASgJEjAKBnN0YXR1cxgCIAEoDjIgLmNvbXBhc3MudjEuQWdlbnRQbGFuRW50cnlTdGF0dXMi3wMKDFNlc3Npb25FdmVudBIQCghldmVudF9pZBgBIAEoCRISCgphdF91bml4X21zGAIgASgDEjoKDmFzc2lzdGFudF90ZXh0GAMgASgLMiAuY29tcGFzcy52MS5TZXNzaW9uQXNzaXN0YW50VGV4dEgAEi8KCHRoaW5raW5nGAQgASgLMhsuY29tcGFzcy52MS5TZXNzaW9uVGhpbmtpbmdIABIwCgl0b29sX2NhbGwYBSABKAsyGy5jb21wYXNzLnYxLlNlc3Npb25Ub29sQ2FsbEgAEj0KEHRvb2xfY2FsbF91cGRhdGUYBiABKAsyIS5jb21wYXNzLnYxLlNlc3Npb25Ub29sQ2FsbFVwZGF0ZUgAEicKBHBsYW4YByABKAsyFy5jb21wYXNzLnYxLlNlc3Npb25QbGFuSAASKwoGbm90aWNlGAggASgLMhkuY29tcGFzcy52MS5TZXNzaW9uTm90aWNlSAASOQoRc2Vzc2lvbl9pbmplY3Rpb24YCSABKAsyHC5jb21wYXNzLnYxLlNlc3Npb25JbmplY3Rpb25IABIxCg1zZXNzaW9uX2Vycm9yGAogASgLMhguY29tcGFzcy52MS5TZXNzaW9uRXJyb3JIAEIHCgVldmVudCI4ChRTZXNzaW9uQXNzaXN0YW50VGV4dBIMCgR0ZXh0GAEgASgJEhIKCm1lc3NhZ2VfaWQYAiABKAkiMwoPU2Vzc2lvblRoaW5raW5nEgwKBHRleHQYASABKAkSEgoKbWVzc2FnZV9pZBgCIAEoCSJnCg9TZXNzaW9uVG9vbENhbGwSFAoMdG9vbF9jYWxsX2lkGAEgASgJEg0KBXRpdGxlGAIgASgJEi8KBnN0YXR1cxgDIAEoDjIfLmNvbXBhc3MudjEuQWdlbnRUb29sQ2FsbFN0YXR1cyKaAQoVU2Vzc2lvblRvb2xDYWxsVXBkYXRlEhQKDHRvb2xfY2FsbF9pZBgBIAEoCRIvCgZzdGF0dXMYAiABKA4yHy5jb21wYXNzLnYxLkFnZW50VG9vbENhbGxTdGF0dXMSDgoGb3V0cHV0GAMgASgJEioKBWRpZmZzGAQgAygLMhsuY29tcGFzcy52MS5TZXNzaW9uRmlsZURpZmYiVQoPU2Vzc2lvbkZpbGVEaWZmEgwKBHBhdGgYASABKAkSFQoIb2xkX3RleHQYAiABKAlIAIgBARIQCghuZXdfdGV4dBgDIAEoCUILCglfb2xkX3RleHQiOgoLU2Vzc2lvblBsYW4SKwoHZW50cmllcxgBIAMoCzIaLmNvbXBhc3MudjEuQWdlbnRQbGFuRW50cnkiOQoNU2Vzc2lvbk5vdGljZRIMCgR0ZXh0GAEgASgJEhEKBGxpbmsYAiABKAlIAIgBAUIHCgVfbGluayKDAQoQU2Vzc2lvbkluamVjdGlvbhIxCgdvcF9raW5kGAEgASgOMiAuY29tcGFzcy52MS5TZXNzaW9uSW5qZWN0aW9uS2luZBISCgptZXNzYWdlX2lkGAIgASgJEhMKC2Zyb21faGFuZGxlGAMgASgJEhMKC3RyYWNlcGFyZW50GAQgASgJImsKDFNlc3Npb25FcnJvchIqCgRraW5kGAEgASgOMhwuY29tcGFzcy52MS5TZXNzaW9uRXJyb3JLaW5kEg8KB21lc3NhZ2UYAiABKAkSEwoGc3RhdHVzGAMgASgFSACIAQFCCQoHX3N0YXR1cyIyChxTdWJzY3JpYmVBZ2VudFNlc3Npb25SZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkifgoRQWdlbnRTZXNzaW9uRnJhbWUSEgoKc2Vzc2lvbl9pZBgBIAEoCRInCgVldmVudBgCIAEoCzIYLmNvbXBhc3MudjEuU2Vzc2lvbkV2ZW50EiwKBXN0YXRlGAMgASgOMh0uY29tcGFzcy52MS5BZ2VudFNlc3Npb25TdGF0ZSJwCh5Qcm92aXNpb25BZ2VudFdvcmtzcGFjZVJlcXVlc3QSFAoMYWdlbnRfaGFuZGxlGAEgASgJEhkKEWNsaWVudF9yZXF1ZXN0X2lkGAIgASgJEg8KB3BlcnNvbmEYAyABKAkSDAoEcm9sZRgEIAEoCSI5Ch9Qcm92aXNpb25BZ2VudFdvcmtzcGFjZVJlc3BvbnNlEhYKDmNvbnRhaW5lcl9uYW1lGAEgASgJIlAKG1JlbW92ZUFnZW50V29ya3NwYWNlUmVxdWVzdBIWCg5jb250YWluZXJfbmFtZRgBIAEoCRIZChFjbGllbnRfcmVxdWVzdF9pZBgCIAEoCSIeChxSZW1vdmVBZ2VudFdvcmtzcGFjZVJlc3BvbnNlImMKGFN0YXJ0QWdlbnRTZXNzaW9uUmVxdWVzdBIWCg5jb250YWluZXJfbmFtZRgBIAEoCRIZChFyZXN1bWVfc2Vzc2lvbl9pZBgDIAEoCUoECAIQA1IOaW5pdGlhbF9wcm9tcHQiLwoZU3RhcnRBZ2VudFNlc3Npb25SZXNwb25zZRISCgpzZXNzaW9uX2lkGAEgASgJIloKEVNwYXduQWdlbnRSZXF1ZXN0EhQKDGFnZW50X2hhbmRsZRgBIAEoCRIZChFjbGllbnRfcmVxdWVzdF9pZBgDIAEoCUoECAIQA1IOaW5pdGlhbF9wcm9tcHQiQAoSU3Bhd25BZ2VudFJlc3BvbnNlEhIKCnNlc3Npb25faWQYASABKAkSFgoOY29udGFpbmVyX25hbWUYAiABKAkiLQoXU3RvcEFnZW50U2Vzc2lvblJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCSIaChhTdG9wQWdlbnRTZXNzaW9uUmVzcG9uc2UiLwoZUmVsb2FkQWdlbnRTZXNzaW9uUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJIjAKGlJlbG9hZEFnZW50U2Vzc2lvblJlc3BvbnNlEhIKCnNlc3Npb25faWQYASABKAkiKwoVR2V0QWdlbnRTdGF0dXNSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkiSgoWR2V0QWdlbnRTdGF0dXNSZXNwb25zZRIwCghzdGF0dXNlcxgBIAMoCzIeLmNvbXBhc3MudjEuQWdlbnRTZXNzaW9uU3RhdHVzIisKEUlzc3VlVG9rZW5SZXF1ZXN0EhYKDmFjY291bnRfaGFuZGxlGAEgASgJIiMKEklzc3VlVG9rZW5SZXNwb25zZRINCgV0b2tlbhgBIAEoCSIoChJSZXZva2VUb2tlblJlcXVlc3QSEgoFdG9rZW4YASABKAlCA4ABASIVChNSZXZva2VUb2tlblJlc3BvbnNlIicKFVB1dEFnZW50Q29uZmlnUmVxdWVzdBIOCgZidW5kbGUYASABKAwiKQoWUHV0QWdlbnRDb25maWdSZXNwb25zZRIPCgd2ZXJzaW9uGAEgASgJIhsKGUdldEFnZW50Q29uZmlnSW5mb1JlcXVlc3Qi2gEKGkdldEFnZW50Q29uZmlnSW5mb1Jlc3BvbnNlEg8KB3ZlcnNpb24YASABKAkSDgoGc2tpbGxzGAIgAygJEhIKCmV4dGVuc2lvbnMYAyADKAkSEwoLbWNwX3NlcnZlcnMYBCADKAkSFAoMaGFzX3NldHRpbmdzGAUgASgIEhUKDWhhc19hZ2VudHNfbWQYBiABKAgSDQoFcnVsZXMYByADKAkSEQoJc3ViYWdlbnRzGAggAygJEhIKCmhhc19tb2RlbHMYCSABKAgSDwoHcHJvbXB0cxgKIAMoCSIaChhEZWxldGVBZ2VudENvbmZpZ1JlcXVlc3QiGwoZRGVsZXRlQWdlbnRDb25maWdSZXNwb25zZSI0Cg5Nb2RlbENhbmRpZGF0ZRIQCghwcm92aWRlchgBIAEoCRIQCghtb2RlbF9pZBgCIAEoCSJxCg1Nb2RlbE1ldGFkYXRhEhYKDmNvbnRleHRfd2luZG93GAEgASgDEhwKFGlucHV0X2Nvc3RfbWljcm9fdXNkGAIgASgDEh0KFW91dHB1dF9jb3N0X21pY3JvX3VzZBgDIAEoAxILCgNhcGkYBCABKAkihwEKEk1vZGVsUmVnaXN0cnlFbnRyeRIUCgxkaXNwbGF5X25hbWUYASABKAkSLgoKY2FuZGlkYXRlcxgCIAMoCzIaLmNvbXBhc3MudjEuTW9kZWxDYW5kaWRhdGUSKwoIbWV0YWRhdGEYAyABKAsyGS5jb21wYXNzLnYxLk1vZGVsTWV0YWRhdGEimAEKDU1vZGVsUmVnaXN0cnkSNwoHZW50cmllcxgBIAMoCzImLmNvbXBhc3MudjEuTW9kZWxSZWdpc3RyeS5FbnRyaWVzRW50cnkaTgoMRW50cmllc0VudHJ5EgsKA2tleRgBIAEoCRItCgV2YWx1ZRgCIAEoCzIeLmNvbXBhc3MudjEuTW9kZWxSZWdpc3RyeUVudHJ5OgI4ASJgChdQdXRNb2RlbFJlZ2lzdHJ5UmVxdWVzdBIrCghyZWdpc3RyeRgBIAEoCzIZLmNvbXBhc3MudjEuTW9kZWxSZWdpc3RyeRIYChBleHBlY3RlZF92ZXJzaW9uGAIgASgDIisKGFB1dE1vZGVsUmVnaXN0cnlSZXNwb25zZRIPCgd2ZXJzaW9uGAEgASgDIhkKF0dldE1vZGVsUmVnaXN0cnlSZXF1ZXN0IlgKGEdldE1vZGVsUmVnaXN0cnlSZXNwb25zZRIPCgd2ZXJzaW9uGAEgASgDEisKCHJlZ2lzdHJ5GAIgASgLMhkuY29tcGFzcy52MS5Nb2RlbFJlZ2lzdHJ5IhwKGkRlbGV0ZU1vZGVsUmVnaXN0cnlSZXF1ZXN0Ih0KG0RlbGV0ZU1vZGVsUmVnaXN0cnlSZXNwb25zZSI+ChBBZ2VudEF0dHJpYnV0aW9uEhQKDGFnZW50X2hhbmRsZRgBIAEoCRIUCgxvd25lcl9oYW5kbGUYAiABKAkiRQoIRm9yZ2VSZWYSKwoIcHJvdmlkZXIYASABKA4yGS5jb21wYXNzLnYxLkZvcmdlUHJvdmlkZXISDAoEaG9zdBgCIAEoCSLUAwoFSXNzdWUSCgoCaWQYASABKAkSIwoFZm9yZ2UYAiABKAsyFC5jb21wYXNzLnYxLkZvcmdlUmVmEgwKBHJlcG8YAyABKAkSDgoGbnVtYmVyGAQgASgNEg0KBXRpdGxlGAUgASgJEgwKBGJvZHkYBiABKAkSEwoLZm9yZ2Vfc3RhdGUYByABKAkSCwoDdXJsGAggASgJEisKBWFnZW50GAkgASgLMhwuY29tcGFzcy52MS5BZ2VudEF0dHJpYnV0aW9uEhUKDWZvcmdlX2FjY291bnQYCiABKAkSDgoGbGFiZWxzGAsgAygJEi4KCnVwZGF0ZWRfYXQYEyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEiUKBXN0YXRlGAwgASgOMhYuY29tcGFzcy52MS5Jc3N1ZVN0YXRlEhAKCHByaW9yaXR5GA0gASgJEhAKCGFzc2lnbmVlGA4gASgJEg8KB3N1bW1hcnkYDyABKAkSDgoGYnJhbmNoGBAgASgJEiQKA3BycxgRIAMoCzIXLmNvbXBhc3MudjEuUHVsbFJlcXVlc3QSJwoHdHJhY2tlchgSIAEoCzIWLmNvbXBhc3MudjEuVHJhY2tlclJlZiKeAwoLUHVsbFJlcXVlc3QSIwoFZm9yZ2UYASABKAsyFC5jb21wYXNzLnYxLkZvcmdlUmVmEgwKBHJlcG8YAiABKAkSDgoGbnVtYmVyGAMgASgNEg0KBXRpdGxlGAQgASgJEhMKC2ZvcmdlX3N0YXRlGAUgASgJEgsKA3VybBgGIAEoCRIQCghoZWFkX3JlZhgHIAEoCRIQCghiYXNlX3JlZhgIIAEoCRIrCgVhZ2VudBgJIAEoCzIcLmNvbXBhc3MudjEuQWdlbnRBdHRyaWJ1dGlvbhIVCg1mb3JnZV9hY2NvdW50GAogASgJEg0KBWRyYWZ0GAsgASgIEikKB2NoYW5nZWQYDCABKAsyGC5jb21wYXNzLnYxLkNoYW5nZWRTdGF0cxIpCgZjaGVja3MYDSABKAsyGS5jb21wYXNzLnYxLkNoZWNrc1N1bW1hcnkSIwoHcmV2aWV3cxgOIAMoCzISLmNvbXBhc3MudjEuUmV2aWV3EikKB3RocmVhZHMYDyADKAsyGC5jb21wYXNzLnYxLlJldmlld1RocmVhZCJTCg1DaGVja3NTdW1tYXJ5EhAKCGhlYWRfc2hhGAEgASgJEg0KBXN0YXRlGAIgASgJEiEKBmNoZWNrcxgDIAMoCzIRLmNvbXBhc3MudjEuQ2hlY2siQwoFQ2hlY2sSDAoEbmFtZRgBIAEoCRINCgVzdGF0ZRgCIAEoCRILCgN1cmwYAyABKAkSEAoIcmVxdWlyZWQYBCABKAgiQwoMQ2hhbmdlZFN0YXRzEg0KBWZpbGVzGAEgASgNEhEKCWFkZGl0aW9ucxgCIAEoDRIRCglkZWxldGlvbnMYAyABKA0iQwoKVHJhY2tlclJlZhIMCgRraW5kGAEgASgJEgoKAmlkGAIgASgJEg4KBnN0YXR1cxgDIAEoCRILCgN1cmwYBCABKAkiRwoGUmV2aWV3Eg4KBmF1dGhvchgBIAEoCRIOCgZpc19ib3QYAiABKAgSDwoHdmVyZGljdBgDIAEoCRIMCgRib2R5GAQgASgJIlUKDFJldmlld1RocmVhZBIMCgRwYXRoGAEgASgJEhAKCHJlc29sdmVkGAIgASgIEiUKCGNvbW1lbnRzGAMgAygLMhMuY29tcGFzcy52MS5Db21tZW50IjcKB0NvbW1lbnQSDgoGYXV0aG9yGAEgASgJEg4KBmlzX2JvdBgCIAEoCBIMCgRib2R5GAMgASgJKmQKDlNlY3JldERlbGl2ZXJ5Eh8KG1NFQ1JFVF9ERUxJVkVSWV9VTlNQRUNJRklFRBAAEhgKFFNFQ1JFVF9ERUxJVkVSWV9GSUxFEAESFwoTU0VDUkVUX0RFTElWRVJZX0VOVhACKnAKClNlY3JldEtpbmQSGwoXU0VDUkVUX0tJTkRfVU5TUEVDSUZJRUQQABIXChNTRUNSRVRfS0lORF9HRU5FUklDEAESGAoUU0VDUkVUX0tJTkRfUFJPVklERVIQAhISCg5TRUNSRVRfS0lORF9HSBADKkMKC1NlcnZlclN0YXRlEhwKGFNFUlZFUl9TVEFURV9VTlNQRUNJRklFRBAAEhYKElNFUlZFUl9TVEFURV9SRUFEWRABKpcBCgtSdW50aW1lVGllchIcChhSVU5USU1FX1RJRVJfVU5TUEVDSUZJRUQQABIXChNSVU5USU1FX1RJRVJfUE9ETUFOEAESGAoUUlVOVElNRV9USUVSX01JQ1JPVk0QAhIgChxSVU5USU1FX1RJRVJfQVBQTEVfQ09OVEFJTkVSEAMSFQoRUlVOVElNRV9USUVSX0hPU1QQBCpoCg1FZ3Jlc3NQb3N0dXJlEh4KGkVHUkVTU19QT1NUVVJFX1VOU1BFQ0lGSUVEEAASGAoURUdSRVNTX1BPU1RVUkVfQVJNRUQQARIdChlFR1JFU1NfUE9TVFVSRV9VTkVORk9SQ0VEEAIqggIKEUFnZW50U2Vzc2lvblN0YXRlEiMKH0FHRU5UX1NFU1NJT05fU1RBVEVfVU5TUEVDSUZJRUQQABIgChxBR0VOVF9TRVNTSU9OX1NUQVRFX1NUQVJUSU5HEAESHQoZQUdFTlRfU0VTU0lPTl9TVEFURV9SRUFEWRACEh8KG0FHRU5UX1NFU1NJT05fU1RBVEVfV09SS0lORxADEh8KG0FHRU5UX1NFU1NJT05fU1RBVEVfU1RPUFBFRBAEEh8KG0FHRU5UX1NFU1NJT05fU1RBVEVfRVJST1JFRBAFEiQKIEFHRU5UX1NFU1NJT05fU1RBVEVfRElTQ09OTkVDVEVEEAYq0gEKE0FnZW50VG9vbENhbGxTdGF0dXMSJgoiQUdFTlRfVE9PTF9DQUxMX1NUQVRVU19VTlNQRUNJRklFRBAAEiIKHkFHRU5UX1RPT0xfQ0FMTF9TVEFUVVNfUEVORElORxABEiYKIkFHRU5UX1RPT0xfQ0FMTF9TVEFUVVNfSU5fUFJPR1JFU1MQAhIkCiBBR0VOVF9UT09MX0NBTExfU1RBVFVTX0NPTVBMRVRFRBADEiEKHUFHRU5UX1RPT0xfQ0FMTF9TVEFUVVNfRkFJTEVEEAQqtAEKFEFnZW50UGxhbkVudHJ5U3RhdHVzEicKI0FHRU5UX1BMQU5fRU5UUllfU1RBVFVTX1VOU1BFQ0lGSUVEEAASIwofQUdFTlRfUExBTl9FTlRSWV9TVEFUVVNfUEVORElORxABEicKI0FHRU5UX1BMQU5fRU5UUllfU1RBVFVTX0lOX1BST0dSRVNTEAISJQohQUdFTlRfUExBTl9FTlRSWV9TVEFUVVNfQ09NUExFVEVEEAMqhAEKFFNlc3Npb25JbmplY3Rpb25LaW5kEiYKIlNFU1NJT05fSU5KRUNUSU9OX0tJTkRfVU5TUEVDSUZJRUQQABIgChxTRVNTSU9OX0lOSkVDVElPTl9LSU5EX1NURUVSEAESIgoeU0VTU0lPTl9JTkpFQ1RJT05fS0lORF9ERUxJVkVSEAIqdAoQU2Vzc2lvbkVycm9yS2luZBIiCh5TRVNTSU9OX0VSUk9SX0tJTkRfVU5TUEVDSUZJRUQQABIcChhTRVNTSU9OX0VSUk9SX0tJTkRfRVJST1IQARIeChpTRVNTSU9OX0VSUk9SX0tJTkRfQUJPUlRFRBACKvEBCgpJc3N1ZVN0YXRlEhsKF0lTU1VFX1NUQVRFX1VOU1BFQ0lGSUVEEAASFwoTSVNTVUVfU1RBVEVfQkFDS0xPRxABEhQKEElTU1VFX1NUQVRFX1RPRE8QAhIWChJJU1NVRV9TVEFURV9RVUVVRUQQAxIXChNJU1NVRV9TVEFURV9CTE9DS0VEEAQSGwoXSVNTVUVfU1RBVEVfSU5fUFJPR1JFU1MQBRIZChVJU1NVRV9TVEFURV9JTl9SRVZJRVcQBhIUChBJU1NVRV9TVEFURV9ET05FEAcSGAoUSVNTVUVfU1RBVEVfQVJDSElWRUQQCCqcAQoNRm9yZ2VQcm92aWRlchIeChpGT1JHRV9QUk9WSURFUl9VTlNQRUNJRklFRBAAEhkKFUZPUkdFX1BST1ZJREVSX0dJVEhVQhABEhkKFUZPUkdFX1BST1ZJREVSX0dJVExBQhACEhoKFkZPUkdFX1BST1ZJREVSX0ZPUkdFSk8QAxIZChVGT1JHRV9QUk9WSURFUl9MSU5FQVIQBDLTDgoOQ29tcGFzc1NlcnZpY2USVAoNR2V0U2VydmVySW5mbxIgLmNvbXBhc3MudjEuR2V0U2VydmVySW5mb1JlcXVlc3QaIS5jb21wYXNzLnYxLkdldFNlcnZlckluZm9SZXNwb25zZRI/CgZXaG9BbUkSGS5jb21wYXNzLnYxLldob0FtSVJlcXVlc3QaGi5jb21wYXNzLnYxLldob0FtSVJlc3BvbnNlElwKD1N1YnNjcmliZUV2ZW50cxIiLmNvbXBhc3MudjEuU3Vic2NyaWJlRXZlbnRzUmVxdWVzdBojLmNvbXBhc3MudjEuU3Vic2NyaWJlRXZlbnRzUmVzcG9uc2UwARJaCg9MaXN0Qm9hcmRJc3N1ZXMSIi5jb21wYXNzLnYxLkxpc3RCb2FyZElzc3Vlc1JlcXVlc3QaIy5jb21wYXNzLnYxLkxpc3RCb2FyZElzc3Vlc1Jlc3BvbnNlEnIKF1Byb3Zpc2lvbkFnZW50V29ya3NwYWNlEiouY29tcGFzcy52MS5Qcm92aXNpb25BZ2VudFdvcmtzcGFjZVJlcXVlc3QaKy5jb21wYXNzLnYxLlByb3Zpc2lvbkFnZW50V29ya3NwYWNlUmVzcG9uc2USYAoRU3RhcnRBZ2VudFNlc3Npb24SJC5jb21wYXNzLnYxLlN0YXJ0QWdlbnRTZXNzaW9uUmVxdWVzdBolLmNvbXBhc3MudjEuU3RhcnRBZ2VudFNlc3Npb25SZXNwb25zZRJLCgpTcGF3bkFnZW50Eh0uY29tcGFzcy52MS5TcGF3bkFnZW50UmVxdWVzdBoeLmNvbXBhc3MudjEuU3Bhd25BZ2VudFJlc3BvbnNlEl0KEFN0b3BBZ2VudFNlc3Npb24SIy5jb21wYXNzLnYxLlN0b3BBZ2VudFNlc3Npb25SZXF1ZXN0GiQuY29tcGFzcy52MS5TdG9wQWdlbnRTZXNzaW9uUmVzcG9uc2USaQoUUmVtb3ZlQWdlbnRXb3Jrc3BhY2USJy5jb21wYXNzLnYxLlJlbW92ZUFnZW50V29ya3NwYWNlUmVxdWVzdBooLmNvbXBhc3MudjEuUmVtb3ZlQWdlbnRXb3Jrc3BhY2VSZXNwb25zZRJjChJSZWxvYWRBZ2VudFNlc3Npb24SJS5jb21wYXNzLnYxLlJlbG9hZEFnZW50U2Vzc2lvblJlcXVlc3QaJi5jb21wYXNzLnYxLlJlbG9hZEFnZW50U2Vzc2lvblJlc3BvbnNlElcKDkdldEFnZW50U3RhdHVzEiEuY29tcGFzcy52MS5HZXRBZ2VudFN0YXR1c1JlcXVlc3QaIi5jb21wYXNzLnYxLkdldEFnZW50U3RhdHVzUmVzcG9uc2USYgoVU3Vic2NyaWJlQWdlbnRTZXNzaW9uEiguY29tcGFzcy52MS5TdWJzY3JpYmVBZ2VudFNlc3Npb25SZXF1ZXN0Gh0uY29tcGFzcy52MS5BZ2VudFNlc3Npb25GcmFtZTABEksKCklzc3VlVG9rZW4SHS5jb21wYXNzLnYxLklzc3VlVG9rZW5SZXF1ZXN0Gh4uY29tcGFzcy52MS5Jc3N1ZVRva2VuUmVzcG9uc2USTgoLUmV2b2tlVG9rZW4SHi5jb21wYXNzLnYxLlJldm9rZVRva2VuUmVxdWVzdBofLmNvbXBhc3MudjEuUmV2b2tlVG9rZW5SZXNwb25zZRJXCg5QdXRBZ2VudENvbmZpZxIhLmNvbXBhc3MudjEuUHV0QWdlbnRDb25maWdSZXF1ZXN0GiIuY29tcGFzcy52MS5QdXRBZ2VudENvbmZpZ1Jlc3BvbnNlEmMKEkdldEFnZW50Q29uZmlnSW5mbxIlLmNvbXBhc3MudjEuR2V0QWdlbnRDb25maWdJbmZvUmVxdWVzdBomLmNvbXBhc3MudjEuR2V0QWdlbnRDb25maWdJbmZvUmVzcG9uc2USYAoRRGVsZXRlQWdlbnRDb25maWcSJC5jb21wYXNzLnYxLkRlbGV0ZUFnZW50Q29uZmlnUmVxdWVzdBolLmNvbXBhc3MudjEuRGVsZXRlQWdlbnRDb25maWdSZXNwb25zZRJdChBQdXRNb2RlbFJlZ2lzdHJ5EiMuY29tcGFzcy52MS5QdXRNb2RlbFJlZ2lzdHJ5UmVxdWVzdBokLmNvbXBhc3MudjEuUHV0TW9kZWxSZWdpc3RyeVJlc3BvbnNlEl0KEEdldE1vZGVsUmVnaXN0cnkSIy5jb21wYXNzLnYxLkdldE1vZGVsUmVnaXN0cnlSZXF1ZXN0GiQuY29tcGFzcy52MS5HZXRNb2RlbFJlZ2lzdHJ5UmVzcG9uc2USZgoTRGVsZXRlTW9kZWxSZWdpc3RyeRImLmNvbXBhc3MudjEuRGVsZXRlTW9kZWxSZWdpc3RyeVJlcXVlc3QaJy5jb21wYXNzLnYxLkRlbGV0ZU1vZGVsUmVnaXN0cnlSZXNwb25zZTKgBAoOU2VjcmV0c1NlcnZpY2USSAoJU2V0U2VjcmV0EhwuY29tcGFzcy52MS5TZXRTZWNyZXRSZXF1ZXN0Gh0uY29tcGFzcy52MS5TZXRTZWNyZXRSZXNwb25zZRJOCgtMaXN0U2VjcmV0cxIeLmNvbXBhc3MudjEuTGlzdFNlY3JldHNSZXF1ZXN0Gh8uY29tcGFzcy52MS5MaXN0U2VjcmV0c1Jlc3BvbnNlElEKDERlbGV0ZVNlY3JldBIfLmNvbXBhc3MudjEuRGVsZXRlU2VjcmV0UmVxdWVzdBogLmNvbXBhc3MudjEuRGVsZXRlU2VjcmV0UmVzcG9uc2USWgoPU2V0U2VydmVyU2VjcmV0EiIuY29tcGFzcy52MS5TZXRTZXJ2ZXJTZWNyZXRSZXF1ZXN0GiMuY29tcGFzcy52MS5TZXRTZXJ2ZXJTZWNyZXRSZXNwb25zZRJjChJEZWxldGVTZXJ2ZXJTZWNyZXQSJS5jb21wYXNzLnYxLkRlbGV0ZVNlcnZlclNlY3JldFJlcXVlc3QaJi5jb21wYXNzLnYxLkRlbGV0ZVNlcnZlclNlY3JldFJlc3BvbnNlEmAKEUxpc3RTZXJ2ZXJTZWNyZXRzEiQuY29tcGFzcy52MS5MaXN0U2VydmVyU2VjcmV0c1JlcXVlc3QaJS5jb21wYXNzLnYxLkxpc3RTZXJ2ZXJTZWNyZXRzUmVzcG9uc2ViBnByb3RvMw", [file_google_protobuf_timestamp]); /** * @generated from message compass.v1.SetSecretRequest @@ -660,6 +660,24 @@ export type AgentSessionStatus = Message<"compass.v1.AgentSessionStatus"> & { * @generated from field: string agent_account_id = 3; */ agentAccountId: string; + + /** + * The runtime tier this session's workload runs on, and how its egress is + * constrained. Both are backward-compatible appends (buf: non-breaking) and + * both are reported by the Runner that owns the session, because it is the + * component that resolved the backend. Posture is carried separately rather + * than inferred from the tier: a tier's enforcement is a property of the + * backend, and a client deriving one from the other would render a stale + * answer the moment that changes. + * + * @generated from field: compass.v1.RuntimeTier runtime_tier = 4; + */ + runtimeTier: RuntimeTier; + + /** + * @generated from field: compass.v1.EgressPosture egress_posture = 5; + */ + egressPosture: EgressPosture; }; /** @@ -2723,6 +2741,76 @@ export enum ServerState { export const ServerStateSchema: GenEnum = /*@__PURE__*/ enumDesc(file_compass_v1_compass, 2); +/** + * The runtime tier an agent workload runs on. `HOST` runs agents as direct + * child processes of the Runner, with no container or VM boundary. + * + * @generated from enum compass.v1.RuntimeTier + */ +export enum RuntimeTier { + /** + * @generated from enum value: RUNTIME_TIER_UNSPECIFIED = 0; + */ + UNSPECIFIED = 0, + + /** + * @generated from enum value: RUNTIME_TIER_PODMAN = 1; + */ + PODMAN = 1, + + /** + * @generated from enum value: RUNTIME_TIER_MICROVM = 2; + */ + MICROVM = 2, + + /** + * @generated from enum value: RUNTIME_TIER_APPLE_CONTAINER = 3; + */ + APPLE_CONTAINER = 3, + + /** + * @generated from enum value: RUNTIME_TIER_HOST = 4; + */ + HOST = 4, +} + +/** + * Describes the enum compass.v1.RuntimeTier. + */ +export const RuntimeTierSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_compass_v1_compass, 3); + +/** + * How an agent's egress is constrained. `UNENFORCED` means the tier cannot + * constrain it at all — a host process shares the host's network namespace, so + * there is no boundary to firewall. It is a declared posture, never a failed + * arm, and a client must not render it as contained. + * + * @generated from enum compass.v1.EgressPosture + */ +export enum EgressPosture { + /** + * @generated from enum value: EGRESS_POSTURE_UNSPECIFIED = 0; + */ + UNSPECIFIED = 0, + + /** + * @generated from enum value: EGRESS_POSTURE_ARMED = 1; + */ + ARMED = 1, + + /** + * @generated from enum value: EGRESS_POSTURE_UNENFORCED = 2; + */ + UNENFORCED = 2, +} + +/** + * Describes the enum compass.v1.EgressPosture. + */ +export const EgressPostureSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_compass_v1_compass, 4); + /** * Agent-session lifecycle states. `ERRORED` is an unexpected agent exit (OOM, * panic, engine restart); recovery is an explicit ReloadAgentSession, never an @@ -2786,7 +2874,7 @@ export enum AgentSessionState { * Describes the enum compass.v1.AgentSessionState. */ export const AgentSessionStateSchema: GenEnum = /*@__PURE__*/ - enumDesc(file_compass_v1_compass, 3); + enumDesc(file_compass_v1_compass, 5); /** * @generated from enum compass.v1.AgentToolCallStatus @@ -2822,7 +2910,7 @@ export enum AgentToolCallStatus { * Describes the enum compass.v1.AgentToolCallStatus. */ export const AgentToolCallStatusSchema: GenEnum = /*@__PURE__*/ - enumDesc(file_compass_v1_compass, 4); + enumDesc(file_compass_v1_compass, 6); /** * @generated from enum compass.v1.AgentPlanEntryStatus @@ -2853,7 +2941,7 @@ export enum AgentPlanEntryStatus { * Describes the enum compass.v1.AgentPlanEntryStatus. */ export const AgentPlanEntryStatusSchema: GenEnum = /*@__PURE__*/ - enumDesc(file_compass_v1_compass, 5); + enumDesc(file_compass_v1_compass, 7); /** * The control op-kind a SessionInjection records. Mirrors the internal @@ -2885,7 +2973,7 @@ export enum SessionInjectionKind { * Describes the enum compass.v1.SessionInjectionKind. */ export const SessionInjectionKindSchema: GenEnum = /*@__PURE__*/ - enumDesc(file_compass_v1_compass, 6); + enumDesc(file_compass_v1_compass, 8); /** * The class of a SessionError. ERROR pairs with the ERRORED lifecycle @@ -2915,7 +3003,7 @@ export enum SessionErrorKind { * Describes the enum compass.v1.SessionErrorKind. */ export const SessionErrorKindSchema: GenEnum = /*@__PURE__*/ - enumDesc(file_compass_v1_compass, 7); + enumDesc(file_compass_v1_compass, 9); /** * The Compass issue lifecycle, server-owned (DL-032/DL-033 + terminal ARCHIVED, @@ -2979,7 +3067,7 @@ export enum IssueState { * Describes the enum compass.v1.IssueState. */ export const IssueStateSchema: GenEnum = /*@__PURE__*/ - enumDesc(file_compass_v1_compass, 8); + enumDesc(file_compass_v1_compass, 10); /** * Which forge (and which host, for self-hosted instances) an artifact lives on. @@ -3021,7 +3109,7 @@ export enum ForgeProvider { * Describes the enum compass.v1.ForgeProvider. */ export const ForgeProviderSchema: GenEnum = /*@__PURE__*/ - enumDesc(file_compass_v1_compass, 9); + enumDesc(file_compass_v1_compass, 11); /** * The Compass server service. diff --git a/proto/compass/v1/compass.proto b/proto/compass/v1/compass.proto index eec0ff7c6..d11a37fa9 100644 --- a/proto/compass/v1/compass.proto +++ b/proto/compass/v1/compass.proto @@ -423,6 +423,35 @@ message AgentSessionStatus { // binding is no longer resolvable — a status emitted after a Runner reconnect // cleared the live-session maps carries none (the stated residual gap). string agent_account_id = 3; + // The runtime tier this session's workload runs on, and how its egress is + // constrained. Both are backward-compatible appends (buf: non-breaking) and + // both are reported by the Runner that owns the session, because it is the + // component that resolved the backend. Posture is carried separately rather + // than inferred from the tier: a tier's enforcement is a property of the + // backend, and a client deriving one from the other would render a stale + // answer the moment that changes. + RuntimeTier runtime_tier = 4; + EgressPosture egress_posture = 5; +} + +// The runtime tier an agent workload runs on. `HOST` runs agents as direct +// child processes of the Runner, with no container or VM boundary. +enum RuntimeTier { + RUNTIME_TIER_UNSPECIFIED = 0; + RUNTIME_TIER_PODMAN = 1; + RUNTIME_TIER_MICROVM = 2; + RUNTIME_TIER_APPLE_CONTAINER = 3; + RUNTIME_TIER_HOST = 4; +} + +// How an agent's egress is constrained. `UNENFORCED` means the tier cannot +// constrain it at all — a host process shares the host's network namespace, so +// there is no boundary to firewall. It is a declared posture, never a failed +// arm, and a client must not render it as contained. +enum EgressPosture { + EGRESS_POSTURE_UNSPECIFIED = 0; + EGRESS_POSTURE_ARMED = 1; + EGRESS_POSTURE_UNENFORCED = 2; } // Agent-session lifecycle states. `ERRORED` is an unexpected agent exit (OOM,