From c7483615cf63dace172df4f399282b3e6f8b4c55 Mon Sep 17 00:00:00 2001 From: Joseph Doherty Date: Tue, 18 Aug 2026 05:26:06 -0400 Subject: [PATCH] chore(clients): roll out feed-level snapshot_status to all five clients MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task 1 added AlarmSnapshotStatus and AlarmFeedMessage.snapshot_status = 5. Carry it downstream from the canonical Contracts protos: - Rust vendored protos under clients/rust/protos, refreshed byte-identical (build.rs falls back to them for out-of-repo tarball builds) - client descriptor set (protoc 34.1 pin) - Go (protoc-gen-go v1.36.11 / protoc-gen-go-grpc 1.6.2) - Python (grpcio-tools 1.80.0 pin) - Java (gradle generateProto) .NET needs no regeneration: the client compiles against the Contracts Generated/ output committed with the proto change. The hand-written CLI feed renderers switch on the payload oneof, so codegen alone does not carry the arm. Add snapshot-status to the .NET, Go, Rust, and Java renderers; the .NET and Go renderers were also missing provider-status, which has been on the wire since the provider-mode work, so add it there too. Java's renderer is an exhaustive switch expression and did not compile until the new case landed. The Python CLI renders generic protobuf-JSON and needs no change. Each client README gains a paragraph on the feed-level frame next to its existing from_truncated_snapshot paragraph: it arrives at stream open after provider_status and before the cached active_alarm frames, then on every verdict change including the clearing frame a monitor restart emits, so a live consumer can track set completeness without polling QueryActiveAlarms. GatewayDashboardDesign: list the two new payload cases the AlarmsHub forwards, and — separately — record the GroupToRole / GroupToTag / UntaggedSessionVisibility rows the settings page already renders but the bullet list omitted. --- clients/dotnet/README.md | 10 + .../MxGatewayClientCli.cs | 9 +- clients/go/README.md | 9 + clients/go/cmd/mxgw-go/main.go | 8 +- .../internal/generated/mxaccess_gateway.pb.go | 382 ++++-- clients/java/README.md | 10 + .../mxaccess_gateway/v1/MxaccessGateway.java | 1217 ++++++++++++++--- .../zb/mom/ww/mxgateway/cli/MxGatewayCli.java | 8 +- .../descriptors/mxaccessgw-client-v1.protoset | Bin 120969 -> 122424 bytes clients/python/README.md | 10 + .../generated/mxaccess_gateway_pb2.py | 110 +- clients/rust/README.md | 9 + clients/rust/crates/mxgw-cli/src/main.rs | 10 +- clients/rust/protos/mxaccess_gateway.proto | 21 + docs/GatewayDashboardDesign.md | 7 +- 15 files changed, 1412 insertions(+), 408 deletions(-) diff --git a/clients/dotnet/README.md b/clients/dotnet/README.md index bad5b6e..6a2864d 100644 --- a/clients/dotnet/README.md +++ b/clients/dotnet/README.md @@ -156,6 +156,16 @@ poll. Treat the set as possibly incomplete rather than reconciling deletions from it. It is set-level degraded status, not a comment on the record's own fidelity, and is distinct from `Degraded` (the subtag fallback provider). +`StreamAlarmsAsync` also carries that completeness verdict at feed level, as an +`AlarmFeedMessage.PayloadOneofCase.SnapshotStatus` frame whose +`SnapshotStatus.Truncated` is true while the monitor's cached set derives from a +truncated fetch. One arrives at stream open (after the `ProviderStatus` frame, +before the cached `ActiveAlarm` frames) so a late joiner learns the current +verdict, then one on every verdict change — including the clearing frame sent +when the gateway's alarm monitor restarts and drops a truncated verdict. Track +it if you need set completeness on a live feed without polling +`QueryActiveAlarmsAsync`. + `MxGatewaySession.CloseAsync` is explicit and idempotent. Repeated calls return the first `CloseSessionReply` instead of sending another close request. diff --git a/clients/dotnet/ZB.MOM.WW.MxGateway.Client.Cli/MxGatewayClientCli.cs b/clients/dotnet/ZB.MOM.WW.MxGateway.Client.Cli/MxGatewayClientCli.cs index cdd6e7d..353c21a 100644 --- a/clients/dotnet/ZB.MOM.WW.MxGateway.Client.Cli/MxGatewayClientCli.cs +++ b/clients/dotnet/ZB.MOM.WW.MxGateway.Client.Cli/MxGatewayClientCli.cs @@ -1546,8 +1546,9 @@ public static class MxGatewayClientCli /// /// Renders one for the human-readable /// (non-JSON) stream-alarms output, distinguishing the payload oneof - /// arms: a snapshot active alarm, the snapshot-complete sentinel, or a live - /// transition. + /// arms: a snapshot active alarm, the snapshot-complete sentinel, a live + /// transition, the provider-mode status, or the feed-level + /// snapshot-completeness status. /// private static string FormatAlarmFeedMessage(AlarmFeedMessage feedMessage) { @@ -1559,6 +1560,10 @@ public static class MxGatewayClientCli $"snapshot-complete {feedMessage.SnapshotComplete}", AlarmFeedMessage.PayloadOneofCase.Transition => $"transition {ProtobufJsonFormatter.Format(feedMessage.Transition)}", + AlarmFeedMessage.PayloadOneofCase.ProviderStatus => + $"provider-status {ProtobufJsonFormatter.Format(feedMessage.ProviderStatus)}", + AlarmFeedMessage.PayloadOneofCase.SnapshotStatus => + $"snapshot-status {ProtobufJsonFormatter.Format(feedMessage.SnapshotStatus)}", _ => $"unknown-payload {feedMessage.PayloadCase}", }; } diff --git a/clients/go/README.md b/clients/go/README.md index 86f9f62..84ea96a 100644 --- a/clients/go/README.md +++ b/clients/go/README.md @@ -153,6 +153,15 @@ deletions from it. It is set-level degraded status, not a comment on the record's own fidelity, and is distinct from `Degraded` (the subtag fallback provider). +`StreamAlarms` also carries that completeness verdict at feed level, as a frame +whose `GetSnapshotStatus()` is non-nil and whose `GetTruncated()` is true while +the monitor's cached set derives from a truncated fetch. One arrives at stream +open (after the `GetProviderStatus()` frame, before the cached +`GetActiveAlarm()` frames) so a late joiner learns the current verdict, then one +on every verdict change — including the clearing frame sent when the gateway's +alarm monitor restarts and drops a truncated verdict. Track it if you need set +completeness on a live feed without polling `QueryActiveAlarms`. + ## Write Semantics And Common Pitfalls These are MXAccess parity behaviors that surprise new callers. The gateway diff --git a/clients/go/cmd/mxgw-go/main.go b/clients/go/cmd/mxgw-go/main.go index 95898d1..159d3a2 100644 --- a/clients/go/cmd/mxgw-go/main.go +++ b/clients/go/cmd/mxgw-go/main.go @@ -1097,7 +1097,8 @@ func runStreamAlarms(ctx context.Context, args []string, stdout, stderr io.Write // formatAlarmFeedMessage renders one AlarmFeedMessage in the CLI's plain-text // output style, distinguishing the active-alarm snapshot, snapshot-complete -// sentinel, and transition cases of the message's payload oneof. +// sentinel, transition, provider-status, and snapshot-status cases of the +// message's payload oneof. func formatAlarmFeedMessage(message *mxgateway.AlarmFeedMessage) string { switch { case message.GetActiveAlarm() != nil: @@ -1108,6 +1109,11 @@ func formatAlarmFeedMessage(message *mxgateway.AlarmFeedMessage) string { case message.GetTransition() != nil: transition := message.GetTransition() return fmt.Sprintf("transition %s kind=%s severity=%d", transition.GetAlarmFullReference(), transition.GetTransitionKind(), transition.GetSeverity()) + case message.GetProviderStatus() != nil: + status := message.GetProviderStatus() + return fmt.Sprintf("provider-status mode=%s degraded=%t reason=%q", status.GetMode(), status.GetDegraded(), status.GetReason()) + case message.GetSnapshotStatus() != nil: + return fmt.Sprintf("snapshot-status truncated=%t", message.GetSnapshotStatus().GetTruncated()) default: return "unknown" } diff --git a/clients/go/internal/generated/mxaccess_gateway.pb.go b/clients/go/internal/generated/mxaccess_gateway.pb.go index f183bb9..4ef7d3a 100644 --- a/clients/go/internal/generated/mxaccess_gateway.pb.go +++ b/clients/go/internal/generated/mxaccess_gateway.pb.go @@ -7353,6 +7353,7 @@ type AlarmFeedMessage struct { // *AlarmFeedMessage_SnapshotComplete // *AlarmFeedMessage_Transition // *AlarmFeedMessage_ProviderStatus + // *AlarmFeedMessage_SnapshotStatus Payload isAlarmFeedMessage_Payload `protobuf_oneof:"payload"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache @@ -7431,6 +7432,15 @@ func (x *AlarmFeedMessage) GetProviderStatus() *AlarmProviderStatus { return nil } +func (x *AlarmFeedMessage) GetSnapshotStatus() *AlarmSnapshotStatus { + if x != nil { + if x, ok := x.Payload.(*AlarmFeedMessage_SnapshotStatus); ok { + return x.SnapshotStatus + } + } + return nil +} + type isAlarmFeedMessage_Payload interface { isAlarmFeedMessage_Payload() } @@ -7457,6 +7467,13 @@ type AlarmFeedMessage_ProviderStatus struct { ProviderStatus *AlarmProviderStatus `protobuf:"bytes,4,opt,name=provider_status,json=providerStatus,proto3,oneof"` } +type AlarmFeedMessage_SnapshotStatus struct { + // Snapshot-completeness status. Emitted once on stream open and again on + // every change of the truncation verdict, so late joiners learn whether the + // feed's active-alarm set may be incomplete. + SnapshotStatus *AlarmSnapshotStatus `protobuf:"bytes,5,opt,name=snapshot_status,json=snapshotStatus,proto3,oneof"` +} + func (*AlarmFeedMessage_ActiveAlarm) isAlarmFeedMessage_Payload() {} func (*AlarmFeedMessage_SnapshotComplete) isAlarmFeedMessage_Payload() {} @@ -7465,6 +7482,8 @@ func (*AlarmFeedMessage_Transition) isAlarmFeedMessage_Payload() {} func (*AlarmFeedMessage_ProviderStatus) isAlarmFeedMessage_Payload() {} +func (*AlarmFeedMessage_SnapshotStatus) isAlarmFeedMessage_Payload() {} + type AlarmProviderStatus struct { state protoimpl.MessageState `protogen:"open.v1"` Mode AlarmProviderMode `protobuf:"varint,1,opt,name=mode,proto3,enum=mxaccess_gateway.v1.AlarmProviderMode" json:"mode,omitempty"` @@ -7533,6 +7552,63 @@ func (x *AlarmProviderStatus) GetSince() *timestamppb.Timestamp { return nil } +// Feed-level snapshot-completeness status. Emitted once on StreamAlarms open +// (after the initial provider_status frame, before the cached active_alarm +// frames) so late joiners learn the current verdict, and again on every change +// of the truncation verdict — when a reconcile reports a different verdict, and +// when the gateway's alarm monitor restarts and drops a truncated verdict with +// the cache generation it described (feed subscribers outlive that monitor +// session, so they are sent the clearing frame). Mirrors the per-record +// ActiveAlarmSnapshot.from_truncated_snapshot caveat at feed level so live +// consumers can reason about completeness without polling QueryActiveAlarms. +type AlarmSnapshotStatus struct { + state protoimpl.MessageState `protogen:"open.v1"` + // True while the monitor's cached active-alarm set derives from a truncated + // (capped) worker fetch — the set may be missing alarms. Distinct from + // provider degradation (AlarmProviderStatus.degraded), which describes the + // fidelity of the records rather than the completeness of the set. + Truncated bool `protobuf:"varint,1,opt,name=truncated,proto3" json:"truncated,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *AlarmSnapshotStatus) Reset() { + *x = AlarmSnapshotStatus{} + mi := &file_mxaccess_gateway_proto_msgTypes[87] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AlarmSnapshotStatus) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AlarmSnapshotStatus) ProtoMessage() {} + +func (x *AlarmSnapshotStatus) ProtoReflect() protoreflect.Message { + mi := &file_mxaccess_gateway_proto_msgTypes[87] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AlarmSnapshotStatus.ProtoReflect.Descriptor instead. +func (*AlarmSnapshotStatus) Descriptor() ([]byte, []int) { + return file_mxaccess_gateway_proto_rawDescGZIP(), []int{87} +} + +func (x *AlarmSnapshotStatus) GetTruncated() bool { + if x != nil { + return x.Truncated + } + return false +} + type MxStatusProxy struct { state protoimpl.MessageState `protogen:"open.v1"` // Mirrors the `success` member of the MXAccess MXSTATUS_PROXY struct @@ -7557,7 +7633,7 @@ type MxStatusProxy struct { func (x *MxStatusProxy) Reset() { *x = MxStatusProxy{} - mi := &file_mxaccess_gateway_proto_msgTypes[87] + mi := &file_mxaccess_gateway_proto_msgTypes[88] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7569,7 +7645,7 @@ func (x *MxStatusProxy) String() string { func (*MxStatusProxy) ProtoMessage() {} func (x *MxStatusProxy) ProtoReflect() protoreflect.Message { - mi := &file_mxaccess_gateway_proto_msgTypes[87] + mi := &file_mxaccess_gateway_proto_msgTypes[88] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7582,7 +7658,7 @@ func (x *MxStatusProxy) ProtoReflect() protoreflect.Message { // Deprecated: Use MxStatusProxy.ProtoReflect.Descriptor instead. func (*MxStatusProxy) Descriptor() ([]byte, []int) { - return file_mxaccess_gateway_proto_rawDescGZIP(), []int{87} + return file_mxaccess_gateway_proto_rawDescGZIP(), []int{88} } func (x *MxStatusProxy) GetSuccess() int32 { @@ -7660,7 +7736,7 @@ type MxValue struct { func (x *MxValue) Reset() { *x = MxValue{} - mi := &file_mxaccess_gateway_proto_msgTypes[88] + mi := &file_mxaccess_gateway_proto_msgTypes[89] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7672,7 +7748,7 @@ func (x *MxValue) String() string { func (*MxValue) ProtoMessage() {} func (x *MxValue) ProtoReflect() protoreflect.Message { - mi := &file_mxaccess_gateway_proto_msgTypes[88] + mi := &file_mxaccess_gateway_proto_msgTypes[89] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7685,7 +7761,7 @@ func (x *MxValue) ProtoReflect() protoreflect.Message { // Deprecated: Use MxValue.ProtoReflect.Descriptor instead. func (*MxValue) Descriptor() ([]byte, []int) { - return file_mxaccess_gateway_proto_rawDescGZIP(), []int{88} + return file_mxaccess_gateway_proto_rawDescGZIP(), []int{89} } func (x *MxValue) GetDataType() MxDataType { @@ -7908,7 +7984,7 @@ type MxArray struct { func (x *MxArray) Reset() { *x = MxArray{} - mi := &file_mxaccess_gateway_proto_msgTypes[89] + mi := &file_mxaccess_gateway_proto_msgTypes[90] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7920,7 +7996,7 @@ func (x *MxArray) String() string { func (*MxArray) ProtoMessage() {} func (x *MxArray) ProtoReflect() protoreflect.Message { - mi := &file_mxaccess_gateway_proto_msgTypes[89] + mi := &file_mxaccess_gateway_proto_msgTypes[90] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7933,7 +8009,7 @@ func (x *MxArray) ProtoReflect() protoreflect.Message { // Deprecated: Use MxArray.ProtoReflect.Descriptor instead. func (*MxArray) Descriptor() ([]byte, []int) { - return file_mxaccess_gateway_proto_rawDescGZIP(), []int{89} + return file_mxaccess_gateway_proto_rawDescGZIP(), []int{90} } func (x *MxArray) GetElementDataType() MxDataType { @@ -8117,7 +8193,7 @@ type MxSparseArray struct { func (x *MxSparseArray) Reset() { *x = MxSparseArray{} - mi := &file_mxaccess_gateway_proto_msgTypes[90] + mi := &file_mxaccess_gateway_proto_msgTypes[91] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8129,7 +8205,7 @@ func (x *MxSparseArray) String() string { func (*MxSparseArray) ProtoMessage() {} func (x *MxSparseArray) ProtoReflect() protoreflect.Message { - mi := &file_mxaccess_gateway_proto_msgTypes[90] + mi := &file_mxaccess_gateway_proto_msgTypes[91] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8142,7 +8218,7 @@ func (x *MxSparseArray) ProtoReflect() protoreflect.Message { // Deprecated: Use MxSparseArray.ProtoReflect.Descriptor instead. func (*MxSparseArray) Descriptor() ([]byte, []int) { - return file_mxaccess_gateway_proto_rawDescGZIP(), []int{90} + return file_mxaccess_gateway_proto_rawDescGZIP(), []int{91} } func (x *MxSparseArray) GetElementDataType() MxDataType { @@ -8176,7 +8252,7 @@ type MxSparseElement struct { func (x *MxSparseElement) Reset() { *x = MxSparseElement{} - mi := &file_mxaccess_gateway_proto_msgTypes[91] + mi := &file_mxaccess_gateway_proto_msgTypes[92] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8188,7 +8264,7 @@ func (x *MxSparseElement) String() string { func (*MxSparseElement) ProtoMessage() {} func (x *MxSparseElement) ProtoReflect() protoreflect.Message { - mi := &file_mxaccess_gateway_proto_msgTypes[91] + mi := &file_mxaccess_gateway_proto_msgTypes[92] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8201,7 +8277,7 @@ func (x *MxSparseElement) ProtoReflect() protoreflect.Message { // Deprecated: Use MxSparseElement.ProtoReflect.Descriptor instead. func (*MxSparseElement) Descriptor() ([]byte, []int) { - return file_mxaccess_gateway_proto_rawDescGZIP(), []int{91} + return file_mxaccess_gateway_proto_rawDescGZIP(), []int{92} } func (x *MxSparseElement) GetIndex() uint32 { @@ -8227,7 +8303,7 @@ type BoolArray struct { func (x *BoolArray) Reset() { *x = BoolArray{} - mi := &file_mxaccess_gateway_proto_msgTypes[92] + mi := &file_mxaccess_gateway_proto_msgTypes[93] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8239,7 +8315,7 @@ func (x *BoolArray) String() string { func (*BoolArray) ProtoMessage() {} func (x *BoolArray) ProtoReflect() protoreflect.Message { - mi := &file_mxaccess_gateway_proto_msgTypes[92] + mi := &file_mxaccess_gateway_proto_msgTypes[93] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8252,7 +8328,7 @@ func (x *BoolArray) ProtoReflect() protoreflect.Message { // Deprecated: Use BoolArray.ProtoReflect.Descriptor instead. func (*BoolArray) Descriptor() ([]byte, []int) { - return file_mxaccess_gateway_proto_rawDescGZIP(), []int{92} + return file_mxaccess_gateway_proto_rawDescGZIP(), []int{93} } func (x *BoolArray) GetValues() []bool { @@ -8271,7 +8347,7 @@ type Int32Array struct { func (x *Int32Array) Reset() { *x = Int32Array{} - mi := &file_mxaccess_gateway_proto_msgTypes[93] + mi := &file_mxaccess_gateway_proto_msgTypes[94] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8283,7 +8359,7 @@ func (x *Int32Array) String() string { func (*Int32Array) ProtoMessage() {} func (x *Int32Array) ProtoReflect() protoreflect.Message { - mi := &file_mxaccess_gateway_proto_msgTypes[93] + mi := &file_mxaccess_gateway_proto_msgTypes[94] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8296,7 +8372,7 @@ func (x *Int32Array) ProtoReflect() protoreflect.Message { // Deprecated: Use Int32Array.ProtoReflect.Descriptor instead. func (*Int32Array) Descriptor() ([]byte, []int) { - return file_mxaccess_gateway_proto_rawDescGZIP(), []int{93} + return file_mxaccess_gateway_proto_rawDescGZIP(), []int{94} } func (x *Int32Array) GetValues() []int32 { @@ -8315,7 +8391,7 @@ type Int64Array struct { func (x *Int64Array) Reset() { *x = Int64Array{} - mi := &file_mxaccess_gateway_proto_msgTypes[94] + mi := &file_mxaccess_gateway_proto_msgTypes[95] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8327,7 +8403,7 @@ func (x *Int64Array) String() string { func (*Int64Array) ProtoMessage() {} func (x *Int64Array) ProtoReflect() protoreflect.Message { - mi := &file_mxaccess_gateway_proto_msgTypes[94] + mi := &file_mxaccess_gateway_proto_msgTypes[95] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8340,7 +8416,7 @@ func (x *Int64Array) ProtoReflect() protoreflect.Message { // Deprecated: Use Int64Array.ProtoReflect.Descriptor instead. func (*Int64Array) Descriptor() ([]byte, []int) { - return file_mxaccess_gateway_proto_rawDescGZIP(), []int{94} + return file_mxaccess_gateway_proto_rawDescGZIP(), []int{95} } func (x *Int64Array) GetValues() []int64 { @@ -8359,7 +8435,7 @@ type FloatArray struct { func (x *FloatArray) Reset() { *x = FloatArray{} - mi := &file_mxaccess_gateway_proto_msgTypes[95] + mi := &file_mxaccess_gateway_proto_msgTypes[96] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8371,7 +8447,7 @@ func (x *FloatArray) String() string { func (*FloatArray) ProtoMessage() {} func (x *FloatArray) ProtoReflect() protoreflect.Message { - mi := &file_mxaccess_gateway_proto_msgTypes[95] + mi := &file_mxaccess_gateway_proto_msgTypes[96] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8384,7 +8460,7 @@ func (x *FloatArray) ProtoReflect() protoreflect.Message { // Deprecated: Use FloatArray.ProtoReflect.Descriptor instead. func (*FloatArray) Descriptor() ([]byte, []int) { - return file_mxaccess_gateway_proto_rawDescGZIP(), []int{95} + return file_mxaccess_gateway_proto_rawDescGZIP(), []int{96} } func (x *FloatArray) GetValues() []float32 { @@ -8403,7 +8479,7 @@ type DoubleArray struct { func (x *DoubleArray) Reset() { *x = DoubleArray{} - mi := &file_mxaccess_gateway_proto_msgTypes[96] + mi := &file_mxaccess_gateway_proto_msgTypes[97] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8415,7 +8491,7 @@ func (x *DoubleArray) String() string { func (*DoubleArray) ProtoMessage() {} func (x *DoubleArray) ProtoReflect() protoreflect.Message { - mi := &file_mxaccess_gateway_proto_msgTypes[96] + mi := &file_mxaccess_gateway_proto_msgTypes[97] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8428,7 +8504,7 @@ func (x *DoubleArray) ProtoReflect() protoreflect.Message { // Deprecated: Use DoubleArray.ProtoReflect.Descriptor instead. func (*DoubleArray) Descriptor() ([]byte, []int) { - return file_mxaccess_gateway_proto_rawDescGZIP(), []int{96} + return file_mxaccess_gateway_proto_rawDescGZIP(), []int{97} } func (x *DoubleArray) GetValues() []float64 { @@ -8447,7 +8523,7 @@ type StringArray struct { func (x *StringArray) Reset() { *x = StringArray{} - mi := &file_mxaccess_gateway_proto_msgTypes[97] + mi := &file_mxaccess_gateway_proto_msgTypes[98] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8459,7 +8535,7 @@ func (x *StringArray) String() string { func (*StringArray) ProtoMessage() {} func (x *StringArray) ProtoReflect() protoreflect.Message { - mi := &file_mxaccess_gateway_proto_msgTypes[97] + mi := &file_mxaccess_gateway_proto_msgTypes[98] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8472,7 +8548,7 @@ func (x *StringArray) ProtoReflect() protoreflect.Message { // Deprecated: Use StringArray.ProtoReflect.Descriptor instead. func (*StringArray) Descriptor() ([]byte, []int) { - return file_mxaccess_gateway_proto_rawDescGZIP(), []int{97} + return file_mxaccess_gateway_proto_rawDescGZIP(), []int{98} } func (x *StringArray) GetValues() []string { @@ -8491,7 +8567,7 @@ type TimestampArray struct { func (x *TimestampArray) Reset() { *x = TimestampArray{} - mi := &file_mxaccess_gateway_proto_msgTypes[98] + mi := &file_mxaccess_gateway_proto_msgTypes[99] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8503,7 +8579,7 @@ func (x *TimestampArray) String() string { func (*TimestampArray) ProtoMessage() {} func (x *TimestampArray) ProtoReflect() protoreflect.Message { - mi := &file_mxaccess_gateway_proto_msgTypes[98] + mi := &file_mxaccess_gateway_proto_msgTypes[99] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8516,7 +8592,7 @@ func (x *TimestampArray) ProtoReflect() protoreflect.Message { // Deprecated: Use TimestampArray.ProtoReflect.Descriptor instead. func (*TimestampArray) Descriptor() ([]byte, []int) { - return file_mxaccess_gateway_proto_rawDescGZIP(), []int{98} + return file_mxaccess_gateway_proto_rawDescGZIP(), []int{99} } func (x *TimestampArray) GetValues() []*timestamppb.Timestamp { @@ -8535,7 +8611,7 @@ type RawArray struct { func (x *RawArray) Reset() { *x = RawArray{} - mi := &file_mxaccess_gateway_proto_msgTypes[99] + mi := &file_mxaccess_gateway_proto_msgTypes[100] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8547,7 +8623,7 @@ func (x *RawArray) String() string { func (*RawArray) ProtoMessage() {} func (x *RawArray) ProtoReflect() protoreflect.Message { - mi := &file_mxaccess_gateway_proto_msgTypes[99] + mi := &file_mxaccess_gateway_proto_msgTypes[100] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8560,7 +8636,7 @@ func (x *RawArray) ProtoReflect() protoreflect.Message { // Deprecated: Use RawArray.ProtoReflect.Descriptor instead. func (*RawArray) Descriptor() ([]byte, []int) { - return file_mxaccess_gateway_proto_rawDescGZIP(), []int{99} + return file_mxaccess_gateway_proto_rawDescGZIP(), []int{100} } func (x *RawArray) GetValues() [][]byte { @@ -8580,7 +8656,7 @@ type ProtocolStatus struct { func (x *ProtocolStatus) Reset() { *x = ProtocolStatus{} - mi := &file_mxaccess_gateway_proto_msgTypes[100] + mi := &file_mxaccess_gateway_proto_msgTypes[101] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8592,7 +8668,7 @@ func (x *ProtocolStatus) String() string { func (*ProtocolStatus) ProtoMessage() {} func (x *ProtocolStatus) ProtoReflect() protoreflect.Message { - mi := &file_mxaccess_gateway_proto_msgTypes[100] + mi := &file_mxaccess_gateway_proto_msgTypes[101] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8605,7 +8681,7 @@ func (x *ProtocolStatus) ProtoReflect() protoreflect.Message { // Deprecated: Use ProtocolStatus.ProtoReflect.Descriptor instead. func (*ProtocolStatus) Descriptor() ([]byte, []int) { - return file_mxaccess_gateway_proto_rawDescGZIP(), []int{100} + return file_mxaccess_gateway_proto_rawDescGZIP(), []int{101} } func (x *ProtocolStatus) GetCode() ProtocolStatusCode { @@ -9115,20 +9191,23 @@ const file_mxaccess_gateway_proto_rawDesc = "" + "session_id\"y\n" + "\x13StreamAlarmsRequest\x122\n" + "\x15client_correlation_id\x18\x01 \x01(\tR\x13clientCorrelationId\x12.\n" + - "\x13alarm_filter_prefix\x18\x02 \x01(\tR\x11alarmFilterPrefix\"\xbf\x02\n" + + "\x13alarm_filter_prefix\x18\x02 \x01(\tR\x11alarmFilterPrefix\"\x94\x03\n" + "\x10AlarmFeedMessage\x12M\n" + "\factive_alarm\x18\x01 \x01(\v2(.mxaccess_gateway.v1.ActiveAlarmSnapshotH\x00R\vactiveAlarm\x12-\n" + "\x11snapshot_complete\x18\x02 \x01(\bH\x00R\x10snapshotComplete\x12M\n" + "\n" + "transition\x18\x03 \x01(\v2+.mxaccess_gateway.v1.OnAlarmTransitionEventH\x00R\n" + "transition\x12S\n" + - "\x0fprovider_status\x18\x04 \x01(\v2(.mxaccess_gateway.v1.AlarmProviderStatusH\x00R\x0eproviderStatusB\t\n" + + "\x0fprovider_status\x18\x04 \x01(\v2(.mxaccess_gateway.v1.AlarmProviderStatusH\x00R\x0eproviderStatus\x12S\n" + + "\x0fsnapshot_status\x18\x05 \x01(\v2(.mxaccess_gateway.v1.AlarmSnapshotStatusH\x00R\x0esnapshotStatusB\t\n" + "\apayload\"\xb7\x01\n" + "\x13AlarmProviderStatus\x12:\n" + "\x04mode\x18\x01 \x01(\x0e2&.mxaccess_gateway.v1.AlarmProviderModeR\x04mode\x12\x1a\n" + "\bdegraded\x18\x02 \x01(\bR\bdegraded\x12\x16\n" + "\x06reason\x18\x03 \x01(\tR\x06reason\x120\n" + - "\x05since\x18\x04 \x01(\v2\x1a.google.protobuf.TimestampR\x05since\"\xbe\x02\n" + + "\x05since\x18\x04 \x01(\v2\x1a.google.protobuf.TimestampR\x05since\"3\n" + + "\x13AlarmSnapshotStatus\x12\x1c\n" + + "\ttruncated\x18\x01 \x01(\bR\ttruncated\"\xbe\x02\n" + "\rMxStatusProxy\x12\x18\n" + "\asuccess\x18\x01 \x01(\x05R\asuccess\x12A\n" + "\bcategory\x18\x02 \x01(\x0e2%.mxaccess_gateway.v1.MxStatusCategoryR\bcategory\x12D\n" + @@ -9364,7 +9443,7 @@ func file_mxaccess_gateway_proto_rawDescGZIP() []byte { } var file_mxaccess_gateway_proto_enumTypes = make([]protoimpl.EnumInfo, 10) -var file_mxaccess_gateway_proto_msgTypes = make([]protoimpl.MessageInfo, 101) +var file_mxaccess_gateway_proto_msgTypes = make([]protoimpl.MessageInfo, 102) var file_mxaccess_gateway_proto_goTypes = []any{ (MxCommandKind)(0), // 0: mxaccess_gateway.v1.MxCommandKind (AlarmProviderMode)(0), // 1: mxaccess_gateway.v1.AlarmProviderMode @@ -9463,29 +9542,30 @@ var file_mxaccess_gateway_proto_goTypes = []any{ (*StreamAlarmsRequest)(nil), // 94: mxaccess_gateway.v1.StreamAlarmsRequest (*AlarmFeedMessage)(nil), // 95: mxaccess_gateway.v1.AlarmFeedMessage (*AlarmProviderStatus)(nil), // 96: mxaccess_gateway.v1.AlarmProviderStatus - (*MxStatusProxy)(nil), // 97: mxaccess_gateway.v1.MxStatusProxy - (*MxValue)(nil), // 98: mxaccess_gateway.v1.MxValue - (*MxArray)(nil), // 99: mxaccess_gateway.v1.MxArray - (*MxSparseArray)(nil), // 100: mxaccess_gateway.v1.MxSparseArray - (*MxSparseElement)(nil), // 101: mxaccess_gateway.v1.MxSparseElement - (*BoolArray)(nil), // 102: mxaccess_gateway.v1.BoolArray - (*Int32Array)(nil), // 103: mxaccess_gateway.v1.Int32Array - (*Int64Array)(nil), // 104: mxaccess_gateway.v1.Int64Array - (*FloatArray)(nil), // 105: mxaccess_gateway.v1.FloatArray - (*DoubleArray)(nil), // 106: mxaccess_gateway.v1.DoubleArray - (*StringArray)(nil), // 107: mxaccess_gateway.v1.StringArray - (*TimestampArray)(nil), // 108: mxaccess_gateway.v1.TimestampArray - (*RawArray)(nil), // 109: mxaccess_gateway.v1.RawArray - (*ProtocolStatus)(nil), // 110: mxaccess_gateway.v1.ProtocolStatus - (*durationpb.Duration)(nil), // 111: google.protobuf.Duration - (*timestamppb.Timestamp)(nil), // 112: google.protobuf.Timestamp + (*AlarmSnapshotStatus)(nil), // 97: mxaccess_gateway.v1.AlarmSnapshotStatus + (*MxStatusProxy)(nil), // 98: mxaccess_gateway.v1.MxStatusProxy + (*MxValue)(nil), // 99: mxaccess_gateway.v1.MxValue + (*MxArray)(nil), // 100: mxaccess_gateway.v1.MxArray + (*MxSparseArray)(nil), // 101: mxaccess_gateway.v1.MxSparseArray + (*MxSparseElement)(nil), // 102: mxaccess_gateway.v1.MxSparseElement + (*BoolArray)(nil), // 103: mxaccess_gateway.v1.BoolArray + (*Int32Array)(nil), // 104: mxaccess_gateway.v1.Int32Array + (*Int64Array)(nil), // 105: mxaccess_gateway.v1.Int64Array + (*FloatArray)(nil), // 106: mxaccess_gateway.v1.FloatArray + (*DoubleArray)(nil), // 107: mxaccess_gateway.v1.DoubleArray + (*StringArray)(nil), // 108: mxaccess_gateway.v1.StringArray + (*TimestampArray)(nil), // 109: mxaccess_gateway.v1.TimestampArray + (*RawArray)(nil), // 110: mxaccess_gateway.v1.RawArray + (*ProtocolStatus)(nil), // 111: mxaccess_gateway.v1.ProtocolStatus + (*durationpb.Duration)(nil), // 112: google.protobuf.Duration + (*timestamppb.Timestamp)(nil), // 113: google.protobuf.Timestamp } var file_mxaccess_gateway_proto_depIdxs = []int32{ - 111, // 0: mxaccess_gateway.v1.OpenSessionRequest.command_timeout:type_name -> google.protobuf.Duration - 111, // 1: mxaccess_gateway.v1.OpenSessionReply.default_command_timeout:type_name -> google.protobuf.Duration - 110, // 2: mxaccess_gateway.v1.OpenSessionReply.protocol_status:type_name -> mxaccess_gateway.v1.ProtocolStatus + 112, // 0: mxaccess_gateway.v1.OpenSessionRequest.command_timeout:type_name -> google.protobuf.Duration + 112, // 1: mxaccess_gateway.v1.OpenSessionReply.default_command_timeout:type_name -> google.protobuf.Duration + 111, // 2: mxaccess_gateway.v1.OpenSessionReply.protocol_status:type_name -> mxaccess_gateway.v1.ProtocolStatus 9, // 3: mxaccess_gateway.v1.CloseSessionReply.final_state:type_name -> mxaccess_gateway.v1.SessionState - 110, // 4: mxaccess_gateway.v1.CloseSessionReply.protocol_status:type_name -> mxaccess_gateway.v1.ProtocolStatus + 111, // 4: mxaccess_gateway.v1.CloseSessionReply.protocol_status:type_name -> mxaccess_gateway.v1.ProtocolStatus 17, // 5: mxaccess_gateway.v1.MxCommandRequest.command:type_name -> mxaccess_gateway.v1.MxCommand 0, // 6: mxaccess_gateway.v1.MxCommand.kind:type_name -> mxaccess_gateway.v1.MxCommandKind 18, // 7: mxaccess_gateway.v1.MxCommand.register:type_name -> mxaccess_gateway.v1.RegisterCommand @@ -9527,30 +9607,30 @@ var file_mxaccess_gateway_proto_depIdxs = []int32{ 60, // 43: mxaccess_gateway.v1.MxCommand.get_worker_info:type_name -> mxaccess_gateway.v1.GetWorkerInfoCommand 61, // 44: mxaccess_gateway.v1.MxCommand.drain_events:type_name -> mxaccess_gateway.v1.DrainEventsCommand 62, // 45: mxaccess_gateway.v1.MxCommand.shutdown_worker:type_name -> mxaccess_gateway.v1.ShutdownWorkerCommand - 98, // 46: mxaccess_gateway.v1.WriteCommand.value:type_name -> mxaccess_gateway.v1.MxValue - 98, // 47: mxaccess_gateway.v1.Write2Command.value:type_name -> mxaccess_gateway.v1.MxValue - 98, // 48: mxaccess_gateway.v1.Write2Command.timestamp_value:type_name -> mxaccess_gateway.v1.MxValue - 98, // 49: mxaccess_gateway.v1.WriteSecuredCommand.value:type_name -> mxaccess_gateway.v1.MxValue - 98, // 50: mxaccess_gateway.v1.WriteSecured2Command.value:type_name -> mxaccess_gateway.v1.MxValue - 98, // 51: mxaccess_gateway.v1.WriteSecured2Command.timestamp_value:type_name -> mxaccess_gateway.v1.MxValue + 99, // 46: mxaccess_gateway.v1.WriteCommand.value:type_name -> mxaccess_gateway.v1.MxValue + 99, // 47: mxaccess_gateway.v1.Write2Command.value:type_name -> mxaccess_gateway.v1.MxValue + 99, // 48: mxaccess_gateway.v1.Write2Command.timestamp_value:type_name -> mxaccess_gateway.v1.MxValue + 99, // 49: mxaccess_gateway.v1.WriteSecuredCommand.value:type_name -> mxaccess_gateway.v1.MxValue + 99, // 50: mxaccess_gateway.v1.WriteSecured2Command.value:type_name -> mxaccess_gateway.v1.MxValue + 99, // 51: mxaccess_gateway.v1.WriteSecured2Command.timestamp_value:type_name -> mxaccess_gateway.v1.MxValue 1, // 52: mxaccess_gateway.v1.SubscribeAlarmsCommand.forced_mode:type_name -> mxaccess_gateway.v1.AlarmProviderMode 43, // 53: mxaccess_gateway.v1.SubscribeAlarmsCommand.watch_list:type_name -> mxaccess_gateway.v1.AlarmSubtagTarget 44, // 54: mxaccess_gateway.v1.SubscribeAlarmsCommand.failover:type_name -> mxaccess_gateway.v1.AlarmFailoverConfig 50, // 55: mxaccess_gateway.v1.WriteBulkCommand.entries:type_name -> mxaccess_gateway.v1.WriteBulkEntry - 98, // 56: mxaccess_gateway.v1.WriteBulkEntry.value:type_name -> mxaccess_gateway.v1.MxValue + 99, // 56: mxaccess_gateway.v1.WriteBulkEntry.value:type_name -> mxaccess_gateway.v1.MxValue 52, // 57: mxaccess_gateway.v1.Write2BulkCommand.entries:type_name -> mxaccess_gateway.v1.Write2BulkEntry - 98, // 58: mxaccess_gateway.v1.Write2BulkEntry.value:type_name -> mxaccess_gateway.v1.MxValue - 98, // 59: mxaccess_gateway.v1.Write2BulkEntry.timestamp_value:type_name -> mxaccess_gateway.v1.MxValue + 99, // 58: mxaccess_gateway.v1.Write2BulkEntry.value:type_name -> mxaccess_gateway.v1.MxValue + 99, // 59: mxaccess_gateway.v1.Write2BulkEntry.timestamp_value:type_name -> mxaccess_gateway.v1.MxValue 54, // 60: mxaccess_gateway.v1.WriteSecuredBulkCommand.entries:type_name -> mxaccess_gateway.v1.WriteSecuredBulkEntry - 98, // 61: mxaccess_gateway.v1.WriteSecuredBulkEntry.value:type_name -> mxaccess_gateway.v1.MxValue + 99, // 61: mxaccess_gateway.v1.WriteSecuredBulkEntry.value:type_name -> mxaccess_gateway.v1.MxValue 56, // 62: mxaccess_gateway.v1.WriteSecured2BulkCommand.entries:type_name -> mxaccess_gateway.v1.WriteSecured2BulkEntry - 98, // 63: mxaccess_gateway.v1.WriteSecured2BulkEntry.value:type_name -> mxaccess_gateway.v1.MxValue - 98, // 64: mxaccess_gateway.v1.WriteSecured2BulkEntry.timestamp_value:type_name -> mxaccess_gateway.v1.MxValue - 111, // 65: mxaccess_gateway.v1.ShutdownWorkerCommand.grace_period:type_name -> google.protobuf.Duration + 99, // 63: mxaccess_gateway.v1.WriteSecured2BulkEntry.value:type_name -> mxaccess_gateway.v1.MxValue + 99, // 64: mxaccess_gateway.v1.WriteSecured2BulkEntry.timestamp_value:type_name -> mxaccess_gateway.v1.MxValue + 112, // 65: mxaccess_gateway.v1.ShutdownWorkerCommand.grace_period:type_name -> google.protobuf.Duration 0, // 66: mxaccess_gateway.v1.MxCommandReply.kind:type_name -> mxaccess_gateway.v1.MxCommandKind - 110, // 67: mxaccess_gateway.v1.MxCommandReply.protocol_status:type_name -> mxaccess_gateway.v1.ProtocolStatus - 98, // 68: mxaccess_gateway.v1.MxCommandReply.return_value:type_name -> mxaccess_gateway.v1.MxValue - 97, // 69: mxaccess_gateway.v1.MxCommandReply.statuses:type_name -> mxaccess_gateway.v1.MxStatusProxy + 111, // 67: mxaccess_gateway.v1.MxCommandReply.protocol_status:type_name -> mxaccess_gateway.v1.ProtocolStatus + 99, // 68: mxaccess_gateway.v1.MxCommandReply.return_value:type_name -> mxaccess_gateway.v1.MxValue + 98, // 69: mxaccess_gateway.v1.MxCommandReply.statuses:type_name -> mxaccess_gateway.v1.MxStatusProxy 64, // 70: mxaccess_gateway.v1.MxCommandReply.register:type_name -> mxaccess_gateway.v1.RegisterReply 65, // 71: mxaccess_gateway.v1.MxCommandReply.add_item:type_name -> mxaccess_gateway.v1.AddItemReply 66, // 72: mxaccess_gateway.v1.MxCommandReply.add_item2:type_name -> mxaccess_gateway.v1.AddItem2Reply @@ -9575,24 +9655,24 @@ var file_mxaccess_gateway_proto_depIdxs = []int32{ 78, // 91: mxaccess_gateway.v1.MxCommandReply.session_state:type_name -> mxaccess_gateway.v1.SessionStateReply 79, // 92: mxaccess_gateway.v1.MxCommandReply.worker_info:type_name -> mxaccess_gateway.v1.WorkerInfoReply 80, // 93: mxaccess_gateway.v1.MxCommandReply.drain_events:type_name -> mxaccess_gateway.v1.DrainEventsReply - 97, // 94: mxaccess_gateway.v1.SuspendReply.status:type_name -> mxaccess_gateway.v1.MxStatusProxy - 97, // 95: mxaccess_gateway.v1.ActivateReply.status:type_name -> mxaccess_gateway.v1.MxStatusProxy + 98, // 94: mxaccess_gateway.v1.SuspendReply.status:type_name -> mxaccess_gateway.v1.MxStatusProxy + 98, // 95: mxaccess_gateway.v1.ActivateReply.status:type_name -> mxaccess_gateway.v1.MxStatusProxy 72, // 96: mxaccess_gateway.v1.BulkSubscribeReply.results:type_name -> mxaccess_gateway.v1.SubscribeResult - 97, // 97: mxaccess_gateway.v1.BulkWriteResult.statuses:type_name -> mxaccess_gateway.v1.MxStatusProxy + 98, // 97: mxaccess_gateway.v1.BulkWriteResult.statuses:type_name -> mxaccess_gateway.v1.MxStatusProxy 74, // 98: mxaccess_gateway.v1.BulkWriteReply.results:type_name -> mxaccess_gateway.v1.BulkWriteResult - 98, // 99: mxaccess_gateway.v1.BulkReadResult.value:type_name -> mxaccess_gateway.v1.MxValue - 112, // 100: mxaccess_gateway.v1.BulkReadResult.source_timestamp:type_name -> google.protobuf.Timestamp - 97, // 101: mxaccess_gateway.v1.BulkReadResult.statuses:type_name -> mxaccess_gateway.v1.MxStatusProxy + 99, // 99: mxaccess_gateway.v1.BulkReadResult.value:type_name -> mxaccess_gateway.v1.MxValue + 113, // 100: mxaccess_gateway.v1.BulkReadResult.source_timestamp:type_name -> google.protobuf.Timestamp + 98, // 101: mxaccess_gateway.v1.BulkReadResult.statuses:type_name -> mxaccess_gateway.v1.MxStatusProxy 76, // 102: mxaccess_gateway.v1.BulkReadReply.results:type_name -> mxaccess_gateway.v1.BulkReadResult 9, // 103: mxaccess_gateway.v1.SessionStateReply.state:type_name -> mxaccess_gateway.v1.SessionState 83, // 104: mxaccess_gateway.v1.DrainEventsReply.events:type_name -> mxaccess_gateway.v1.MxEvent 91, // 105: mxaccess_gateway.v1.QueryActiveAlarmsReplyPayload.snapshots:type_name -> mxaccess_gateway.v1.ActiveAlarmSnapshot 2, // 106: mxaccess_gateway.v1.MxEvent.family:type_name -> mxaccess_gateway.v1.MxEventFamily - 98, // 107: mxaccess_gateway.v1.MxEvent.value:type_name -> mxaccess_gateway.v1.MxValue - 112, // 108: mxaccess_gateway.v1.MxEvent.source_timestamp:type_name -> google.protobuf.Timestamp - 97, // 109: mxaccess_gateway.v1.MxEvent.statuses:type_name -> mxaccess_gateway.v1.MxStatusProxy - 112, // 110: mxaccess_gateway.v1.MxEvent.worker_timestamp:type_name -> google.protobuf.Timestamp - 112, // 111: mxaccess_gateway.v1.MxEvent.gateway_receive_timestamp:type_name -> google.protobuf.Timestamp + 99, // 107: mxaccess_gateway.v1.MxEvent.value:type_name -> mxaccess_gateway.v1.MxValue + 113, // 108: mxaccess_gateway.v1.MxEvent.source_timestamp:type_name -> google.protobuf.Timestamp + 98, // 109: mxaccess_gateway.v1.MxEvent.statuses:type_name -> mxaccess_gateway.v1.MxStatusProxy + 113, // 110: mxaccess_gateway.v1.MxEvent.worker_timestamp:type_name -> google.protobuf.Timestamp + 113, // 111: mxaccess_gateway.v1.MxEvent.gateway_receive_timestamp:type_name -> google.protobuf.Timestamp 84, // 112: mxaccess_gateway.v1.MxEvent.replay_gap:type_name -> mxaccess_gateway.v1.ReplayGap 85, // 113: mxaccess_gateway.v1.MxEvent.on_data_change:type_name -> mxaccess_gateway.v1.OnDataChangeEvent 86, // 114: mxaccess_gateway.v1.MxEvent.on_write_complete:type_name -> mxaccess_gateway.v1.OnWriteCompleteEvent @@ -9601,68 +9681,69 @@ var file_mxaccess_gateway_proto_depIdxs = []int32{ 89, // 117: mxaccess_gateway.v1.MxEvent.on_alarm_transition:type_name -> mxaccess_gateway.v1.OnAlarmTransitionEvent 90, // 118: mxaccess_gateway.v1.MxEvent.on_alarm_provider_mode_changed:type_name -> mxaccess_gateway.v1.OnAlarmProviderModeChangedEvent 7, // 119: mxaccess_gateway.v1.OnBufferedDataChangeEvent.data_type:type_name -> mxaccess_gateway.v1.MxDataType - 99, // 120: mxaccess_gateway.v1.OnBufferedDataChangeEvent.quality_values:type_name -> mxaccess_gateway.v1.MxArray - 99, // 121: mxaccess_gateway.v1.OnBufferedDataChangeEvent.timestamp_values:type_name -> mxaccess_gateway.v1.MxArray + 100, // 120: mxaccess_gateway.v1.OnBufferedDataChangeEvent.quality_values:type_name -> mxaccess_gateway.v1.MxArray + 100, // 121: mxaccess_gateway.v1.OnBufferedDataChangeEvent.timestamp_values:type_name -> mxaccess_gateway.v1.MxArray 3, // 122: mxaccess_gateway.v1.OnAlarmTransitionEvent.transition_kind:type_name -> mxaccess_gateway.v1.AlarmTransitionKind - 112, // 123: mxaccess_gateway.v1.OnAlarmTransitionEvent.original_raise_timestamp:type_name -> google.protobuf.Timestamp - 112, // 124: mxaccess_gateway.v1.OnAlarmTransitionEvent.transition_timestamp:type_name -> google.protobuf.Timestamp - 98, // 125: mxaccess_gateway.v1.OnAlarmTransitionEvent.current_value:type_name -> mxaccess_gateway.v1.MxValue - 98, // 126: mxaccess_gateway.v1.OnAlarmTransitionEvent.limit_value:type_name -> mxaccess_gateway.v1.MxValue + 113, // 123: mxaccess_gateway.v1.OnAlarmTransitionEvent.original_raise_timestamp:type_name -> google.protobuf.Timestamp + 113, // 124: mxaccess_gateway.v1.OnAlarmTransitionEvent.transition_timestamp:type_name -> google.protobuf.Timestamp + 99, // 125: mxaccess_gateway.v1.OnAlarmTransitionEvent.current_value:type_name -> mxaccess_gateway.v1.MxValue + 99, // 126: mxaccess_gateway.v1.OnAlarmTransitionEvent.limit_value:type_name -> mxaccess_gateway.v1.MxValue 1, // 127: mxaccess_gateway.v1.OnAlarmTransitionEvent.source_provider:type_name -> mxaccess_gateway.v1.AlarmProviderMode 1, // 128: mxaccess_gateway.v1.OnAlarmProviderModeChangedEvent.mode:type_name -> mxaccess_gateway.v1.AlarmProviderMode - 112, // 129: mxaccess_gateway.v1.OnAlarmProviderModeChangedEvent.at:type_name -> google.protobuf.Timestamp - 112, // 130: mxaccess_gateway.v1.ActiveAlarmSnapshot.original_raise_timestamp:type_name -> google.protobuf.Timestamp + 113, // 129: mxaccess_gateway.v1.OnAlarmProviderModeChangedEvent.at:type_name -> google.protobuf.Timestamp + 113, // 130: mxaccess_gateway.v1.ActiveAlarmSnapshot.original_raise_timestamp:type_name -> google.protobuf.Timestamp 4, // 131: mxaccess_gateway.v1.ActiveAlarmSnapshot.current_state:type_name -> mxaccess_gateway.v1.AlarmConditionState - 112, // 132: mxaccess_gateway.v1.ActiveAlarmSnapshot.last_transition_timestamp:type_name -> google.protobuf.Timestamp - 98, // 133: mxaccess_gateway.v1.ActiveAlarmSnapshot.current_value:type_name -> mxaccess_gateway.v1.MxValue - 98, // 134: mxaccess_gateway.v1.ActiveAlarmSnapshot.limit_value:type_name -> mxaccess_gateway.v1.MxValue + 113, // 132: mxaccess_gateway.v1.ActiveAlarmSnapshot.last_transition_timestamp:type_name -> google.protobuf.Timestamp + 99, // 133: mxaccess_gateway.v1.ActiveAlarmSnapshot.current_value:type_name -> mxaccess_gateway.v1.MxValue + 99, // 134: mxaccess_gateway.v1.ActiveAlarmSnapshot.limit_value:type_name -> mxaccess_gateway.v1.MxValue 1, // 135: mxaccess_gateway.v1.ActiveAlarmSnapshot.source_provider:type_name -> mxaccess_gateway.v1.AlarmProviderMode - 110, // 136: mxaccess_gateway.v1.AcknowledgeAlarmReply.protocol_status:type_name -> mxaccess_gateway.v1.ProtocolStatus - 97, // 137: mxaccess_gateway.v1.AcknowledgeAlarmReply.status:type_name -> mxaccess_gateway.v1.MxStatusProxy + 111, // 136: mxaccess_gateway.v1.AcknowledgeAlarmReply.protocol_status:type_name -> mxaccess_gateway.v1.ProtocolStatus + 98, // 137: mxaccess_gateway.v1.AcknowledgeAlarmReply.status:type_name -> mxaccess_gateway.v1.MxStatusProxy 91, // 138: mxaccess_gateway.v1.AlarmFeedMessage.active_alarm:type_name -> mxaccess_gateway.v1.ActiveAlarmSnapshot 89, // 139: mxaccess_gateway.v1.AlarmFeedMessage.transition:type_name -> mxaccess_gateway.v1.OnAlarmTransitionEvent 96, // 140: mxaccess_gateway.v1.AlarmFeedMessage.provider_status:type_name -> mxaccess_gateway.v1.AlarmProviderStatus - 1, // 141: mxaccess_gateway.v1.AlarmProviderStatus.mode:type_name -> mxaccess_gateway.v1.AlarmProviderMode - 112, // 142: mxaccess_gateway.v1.AlarmProviderStatus.since:type_name -> google.protobuf.Timestamp - 5, // 143: mxaccess_gateway.v1.MxStatusProxy.category:type_name -> mxaccess_gateway.v1.MxStatusCategory - 6, // 144: mxaccess_gateway.v1.MxStatusProxy.detected_by:type_name -> mxaccess_gateway.v1.MxStatusSource - 7, // 145: mxaccess_gateway.v1.MxValue.data_type:type_name -> mxaccess_gateway.v1.MxDataType - 112, // 146: mxaccess_gateway.v1.MxValue.timestamp_value:type_name -> google.protobuf.Timestamp - 99, // 147: mxaccess_gateway.v1.MxValue.array_value:type_name -> mxaccess_gateway.v1.MxArray - 100, // 148: mxaccess_gateway.v1.MxValue.sparse_array_value:type_name -> mxaccess_gateway.v1.MxSparseArray - 7, // 149: mxaccess_gateway.v1.MxArray.element_data_type:type_name -> mxaccess_gateway.v1.MxDataType - 102, // 150: mxaccess_gateway.v1.MxArray.bool_values:type_name -> mxaccess_gateway.v1.BoolArray - 103, // 151: mxaccess_gateway.v1.MxArray.int32_values:type_name -> mxaccess_gateway.v1.Int32Array - 104, // 152: mxaccess_gateway.v1.MxArray.int64_values:type_name -> mxaccess_gateway.v1.Int64Array - 105, // 153: mxaccess_gateway.v1.MxArray.float_values:type_name -> mxaccess_gateway.v1.FloatArray - 106, // 154: mxaccess_gateway.v1.MxArray.double_values:type_name -> mxaccess_gateway.v1.DoubleArray - 107, // 155: mxaccess_gateway.v1.MxArray.string_values:type_name -> mxaccess_gateway.v1.StringArray - 108, // 156: mxaccess_gateway.v1.MxArray.timestamp_values:type_name -> mxaccess_gateway.v1.TimestampArray - 109, // 157: mxaccess_gateway.v1.MxArray.raw_values:type_name -> mxaccess_gateway.v1.RawArray - 7, // 158: mxaccess_gateway.v1.MxSparseArray.element_data_type:type_name -> mxaccess_gateway.v1.MxDataType - 101, // 159: mxaccess_gateway.v1.MxSparseArray.elements:type_name -> mxaccess_gateway.v1.MxSparseElement - 98, // 160: mxaccess_gateway.v1.MxSparseElement.value:type_name -> mxaccess_gateway.v1.MxValue - 112, // 161: mxaccess_gateway.v1.TimestampArray.values:type_name -> google.protobuf.Timestamp - 8, // 162: mxaccess_gateway.v1.ProtocolStatus.code:type_name -> mxaccess_gateway.v1.ProtocolStatusCode - 11, // 163: mxaccess_gateway.v1.MxAccessGateway.OpenSession:input_type -> mxaccess_gateway.v1.OpenSessionRequest - 13, // 164: mxaccess_gateway.v1.MxAccessGateway.CloseSession:input_type -> mxaccess_gateway.v1.CloseSessionRequest - 16, // 165: mxaccess_gateway.v1.MxAccessGateway.Invoke:input_type -> mxaccess_gateway.v1.MxCommandRequest - 15, // 166: mxaccess_gateway.v1.MxAccessGateway.StreamEvents:input_type -> mxaccess_gateway.v1.StreamEventsRequest - 92, // 167: mxaccess_gateway.v1.MxAccessGateway.AcknowledgeAlarm:input_type -> mxaccess_gateway.v1.AcknowledgeAlarmRequest - 94, // 168: mxaccess_gateway.v1.MxAccessGateway.StreamAlarms:input_type -> mxaccess_gateway.v1.StreamAlarmsRequest - 10, // 169: mxaccess_gateway.v1.MxAccessGateway.QueryActiveAlarms:input_type -> mxaccess_gateway.v1.QueryActiveAlarmsRequest - 12, // 170: mxaccess_gateway.v1.MxAccessGateway.OpenSession:output_type -> mxaccess_gateway.v1.OpenSessionReply - 14, // 171: mxaccess_gateway.v1.MxAccessGateway.CloseSession:output_type -> mxaccess_gateway.v1.CloseSessionReply - 63, // 172: mxaccess_gateway.v1.MxAccessGateway.Invoke:output_type -> mxaccess_gateway.v1.MxCommandReply - 83, // 173: mxaccess_gateway.v1.MxAccessGateway.StreamEvents:output_type -> mxaccess_gateway.v1.MxEvent - 93, // 174: mxaccess_gateway.v1.MxAccessGateway.AcknowledgeAlarm:output_type -> mxaccess_gateway.v1.AcknowledgeAlarmReply - 95, // 175: mxaccess_gateway.v1.MxAccessGateway.StreamAlarms:output_type -> mxaccess_gateway.v1.AlarmFeedMessage - 91, // 176: mxaccess_gateway.v1.MxAccessGateway.QueryActiveAlarms:output_type -> mxaccess_gateway.v1.ActiveAlarmSnapshot - 170, // [170:177] is the sub-list for method output_type - 163, // [163:170] is the sub-list for method input_type - 163, // [163:163] is the sub-list for extension type_name - 163, // [163:163] is the sub-list for extension extendee - 0, // [0:163] is the sub-list for field type_name + 97, // 141: mxaccess_gateway.v1.AlarmFeedMessage.snapshot_status:type_name -> mxaccess_gateway.v1.AlarmSnapshotStatus + 1, // 142: mxaccess_gateway.v1.AlarmProviderStatus.mode:type_name -> mxaccess_gateway.v1.AlarmProviderMode + 113, // 143: mxaccess_gateway.v1.AlarmProviderStatus.since:type_name -> google.protobuf.Timestamp + 5, // 144: mxaccess_gateway.v1.MxStatusProxy.category:type_name -> mxaccess_gateway.v1.MxStatusCategory + 6, // 145: mxaccess_gateway.v1.MxStatusProxy.detected_by:type_name -> mxaccess_gateway.v1.MxStatusSource + 7, // 146: mxaccess_gateway.v1.MxValue.data_type:type_name -> mxaccess_gateway.v1.MxDataType + 113, // 147: mxaccess_gateway.v1.MxValue.timestamp_value:type_name -> google.protobuf.Timestamp + 100, // 148: mxaccess_gateway.v1.MxValue.array_value:type_name -> mxaccess_gateway.v1.MxArray + 101, // 149: mxaccess_gateway.v1.MxValue.sparse_array_value:type_name -> mxaccess_gateway.v1.MxSparseArray + 7, // 150: mxaccess_gateway.v1.MxArray.element_data_type:type_name -> mxaccess_gateway.v1.MxDataType + 103, // 151: mxaccess_gateway.v1.MxArray.bool_values:type_name -> mxaccess_gateway.v1.BoolArray + 104, // 152: mxaccess_gateway.v1.MxArray.int32_values:type_name -> mxaccess_gateway.v1.Int32Array + 105, // 153: mxaccess_gateway.v1.MxArray.int64_values:type_name -> mxaccess_gateway.v1.Int64Array + 106, // 154: mxaccess_gateway.v1.MxArray.float_values:type_name -> mxaccess_gateway.v1.FloatArray + 107, // 155: mxaccess_gateway.v1.MxArray.double_values:type_name -> mxaccess_gateway.v1.DoubleArray + 108, // 156: mxaccess_gateway.v1.MxArray.string_values:type_name -> mxaccess_gateway.v1.StringArray + 109, // 157: mxaccess_gateway.v1.MxArray.timestamp_values:type_name -> mxaccess_gateway.v1.TimestampArray + 110, // 158: mxaccess_gateway.v1.MxArray.raw_values:type_name -> mxaccess_gateway.v1.RawArray + 7, // 159: mxaccess_gateway.v1.MxSparseArray.element_data_type:type_name -> mxaccess_gateway.v1.MxDataType + 102, // 160: mxaccess_gateway.v1.MxSparseArray.elements:type_name -> mxaccess_gateway.v1.MxSparseElement + 99, // 161: mxaccess_gateway.v1.MxSparseElement.value:type_name -> mxaccess_gateway.v1.MxValue + 113, // 162: mxaccess_gateway.v1.TimestampArray.values:type_name -> google.protobuf.Timestamp + 8, // 163: mxaccess_gateway.v1.ProtocolStatus.code:type_name -> mxaccess_gateway.v1.ProtocolStatusCode + 11, // 164: mxaccess_gateway.v1.MxAccessGateway.OpenSession:input_type -> mxaccess_gateway.v1.OpenSessionRequest + 13, // 165: mxaccess_gateway.v1.MxAccessGateway.CloseSession:input_type -> mxaccess_gateway.v1.CloseSessionRequest + 16, // 166: mxaccess_gateway.v1.MxAccessGateway.Invoke:input_type -> mxaccess_gateway.v1.MxCommandRequest + 15, // 167: mxaccess_gateway.v1.MxAccessGateway.StreamEvents:input_type -> mxaccess_gateway.v1.StreamEventsRequest + 92, // 168: mxaccess_gateway.v1.MxAccessGateway.AcknowledgeAlarm:input_type -> mxaccess_gateway.v1.AcknowledgeAlarmRequest + 94, // 169: mxaccess_gateway.v1.MxAccessGateway.StreamAlarms:input_type -> mxaccess_gateway.v1.StreamAlarmsRequest + 10, // 170: mxaccess_gateway.v1.MxAccessGateway.QueryActiveAlarms:input_type -> mxaccess_gateway.v1.QueryActiveAlarmsRequest + 12, // 171: mxaccess_gateway.v1.MxAccessGateway.OpenSession:output_type -> mxaccess_gateway.v1.OpenSessionReply + 14, // 172: mxaccess_gateway.v1.MxAccessGateway.CloseSession:output_type -> mxaccess_gateway.v1.CloseSessionReply + 63, // 173: mxaccess_gateway.v1.MxAccessGateway.Invoke:output_type -> mxaccess_gateway.v1.MxCommandReply + 83, // 174: mxaccess_gateway.v1.MxAccessGateway.StreamEvents:output_type -> mxaccess_gateway.v1.MxEvent + 93, // 175: mxaccess_gateway.v1.MxAccessGateway.AcknowledgeAlarm:output_type -> mxaccess_gateway.v1.AcknowledgeAlarmReply + 95, // 176: mxaccess_gateway.v1.MxAccessGateway.StreamAlarms:output_type -> mxaccess_gateway.v1.AlarmFeedMessage + 91, // 177: mxaccess_gateway.v1.MxAccessGateway.QueryActiveAlarms:output_type -> mxaccess_gateway.v1.ActiveAlarmSnapshot + 171, // [171:178] is the sub-list for method output_type + 164, // [164:171] is the sub-list for method input_type + 164, // [164:164] is the sub-list for extension type_name + 164, // [164:164] is the sub-list for extension extendee + 0, // [0:164] is the sub-list for field type_name } func init() { file_mxaccess_gateway_proto_init() } @@ -9752,8 +9833,9 @@ func file_mxaccess_gateway_proto_init() { (*AlarmFeedMessage_SnapshotComplete)(nil), (*AlarmFeedMessage_Transition)(nil), (*AlarmFeedMessage_ProviderStatus)(nil), + (*AlarmFeedMessage_SnapshotStatus)(nil), } - file_mxaccess_gateway_proto_msgTypes[88].OneofWrappers = []any{ + file_mxaccess_gateway_proto_msgTypes[89].OneofWrappers = []any{ (*MxValue_BoolValue)(nil), (*MxValue_Int32Value)(nil), (*MxValue_Int64Value)(nil), @@ -9765,7 +9847,7 @@ func file_mxaccess_gateway_proto_init() { (*MxValue_RawValue)(nil), (*MxValue_SparseArrayValue)(nil), } - file_mxaccess_gateway_proto_msgTypes[89].OneofWrappers = []any{ + file_mxaccess_gateway_proto_msgTypes[90].OneofWrappers = []any{ (*MxArray_BoolValues)(nil), (*MxArray_Int32Values)(nil), (*MxArray_Int64Values)(nil), @@ -9781,7 +9863,7 @@ func file_mxaccess_gateway_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_mxaccess_gateway_proto_rawDesc), len(file_mxaccess_gateway_proto_rawDesc)), NumEnums: 10, - NumMessages: 101, + NumMessages: 102, NumExtensions: 0, NumServices: 1, }, diff --git a/clients/java/README.md b/clients/java/README.md index 6c89443..d16cd0e 100644 --- a/clients/java/README.md +++ b/clients/java/README.md @@ -125,6 +125,16 @@ deletions from it. It is set-level degraded status, not a comment on the record's own fidelity, and is distinct from `getDegraded()` (the subtag fallback provider). +`streamAlarms` also carries that completeness verdict at feed level, as a +message whose `getPayloadCase()` is `SNAPSHOT_STATUS` and whose +`getSnapshotStatus().getTruncated()` is true while the monitor's cached set +derives from a truncated fetch. One arrives at stream open (after the +`PROVIDER_STATUS` frame, before the cached `ACTIVE_ALARM` frames) so a late +joiner learns the current verdict, then one on every verdict change — including +the clearing frame sent when the gateway's alarm monitor restarts and drops a +truncated verdict. Track it if you need set completeness on a live feed without +polling `queryActiveAlarms`. + ## Write Semantics And Common Pitfalls These are MXAccess parity behaviors that surprise new callers. The gateway diff --git a/clients/java/src/main/generated/main/java/mxaccess_gateway/v1/MxaccessGateway.java b/clients/java/src/main/generated/main/java/mxaccess_gateway/v1/MxaccessGateway.java index defa7c5..b49bf8b 100644 --- a/clients/java/src/main/generated/main/java/mxaccess_gateway/v1/MxaccessGateway.java +++ b/clients/java/src/main/generated/main/java/mxaccess_gateway/v1/MxaccessGateway.java @@ -89166,6 +89166,39 @@ public final class MxaccessGateway extends com.google.protobuf.GeneratedFile { */ mxaccess_gateway.v1.MxaccessGateway.AlarmProviderStatusOrBuilder getProviderStatusOrBuilder(); + /** + *
+     * Snapshot-completeness status. Emitted once on stream open and again on
+     * every change of the truncation verdict, so late joiners learn whether the
+     * feed's active-alarm set may be incomplete.
+     * 
+ * + * .mxaccess_gateway.v1.AlarmSnapshotStatus snapshot_status = 5; + * @return Whether the snapshotStatus field is set. + */ + boolean hasSnapshotStatus(); + /** + *
+     * Snapshot-completeness status. Emitted once on stream open and again on
+     * every change of the truncation verdict, so late joiners learn whether the
+     * feed's active-alarm set may be incomplete.
+     * 
+ * + * .mxaccess_gateway.v1.AlarmSnapshotStatus snapshot_status = 5; + * @return The snapshotStatus. + */ + mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus getSnapshotStatus(); + /** + *
+     * Snapshot-completeness status. Emitted once on stream open and again on
+     * every change of the truncation verdict, so late joiners learn whether the
+     * feed's active-alarm set may be incomplete.
+     * 
+ * + * .mxaccess_gateway.v1.AlarmSnapshotStatus snapshot_status = 5; + */ + mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatusOrBuilder getSnapshotStatusOrBuilder(); + mxaccess_gateway.v1.MxaccessGateway.AlarmFeedMessage.PayloadCase getPayloadCase(); } /** @@ -89221,6 +89254,7 @@ public final class MxaccessGateway extends com.google.protobuf.GeneratedFile { SNAPSHOT_COMPLETE(2), TRANSITION(3), PROVIDER_STATUS(4), + SNAPSHOT_STATUS(5), PAYLOAD_NOT_SET(0); private final int value; private PayloadCase(int value) { @@ -89242,6 +89276,7 @@ public final class MxaccessGateway extends com.google.protobuf.GeneratedFile { case 2: return SNAPSHOT_COMPLETE; case 3: return TRANSITION; case 4: return PROVIDER_STATUS; + case 5: return SNAPSHOT_STATUS; case 0: return PAYLOAD_NOT_SET; default: return null; } @@ -89420,6 +89455,55 @@ public final class MxaccessGateway extends com.google.protobuf.GeneratedFile { return mxaccess_gateway.v1.MxaccessGateway.AlarmProviderStatus.getDefaultInstance(); } + public static final int SNAPSHOT_STATUS_FIELD_NUMBER = 5; + /** + *
+     * Snapshot-completeness status. Emitted once on stream open and again on
+     * every change of the truncation verdict, so late joiners learn whether the
+     * feed's active-alarm set may be incomplete.
+     * 
+ * + * .mxaccess_gateway.v1.AlarmSnapshotStatus snapshot_status = 5; + * @return Whether the snapshotStatus field is set. + */ + @java.lang.Override + public boolean hasSnapshotStatus() { + return payloadCase_ == 5; + } + /** + *
+     * Snapshot-completeness status. Emitted once on stream open and again on
+     * every change of the truncation verdict, so late joiners learn whether the
+     * feed's active-alarm set may be incomplete.
+     * 
+ * + * .mxaccess_gateway.v1.AlarmSnapshotStatus snapshot_status = 5; + * @return The snapshotStatus. + */ + @java.lang.Override + public mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus getSnapshotStatus() { + if (payloadCase_ == 5) { + return (mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus) payload_; + } + return mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus.getDefaultInstance(); + } + /** + *
+     * Snapshot-completeness status. Emitted once on stream open and again on
+     * every change of the truncation verdict, so late joiners learn whether the
+     * feed's active-alarm set may be incomplete.
+     * 
+ * + * .mxaccess_gateway.v1.AlarmSnapshotStatus snapshot_status = 5; + */ + @java.lang.Override + public mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatusOrBuilder getSnapshotStatusOrBuilder() { + if (payloadCase_ == 5) { + return (mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus) payload_; + } + return mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus.getDefaultInstance(); + } + private byte memoizedIsInitialized = -1; @java.lang.Override public final boolean isInitialized() { @@ -89447,6 +89531,9 @@ public final class MxaccessGateway extends com.google.protobuf.GeneratedFile { if (payloadCase_ == 4) { output.writeMessage(4, (mxaccess_gateway.v1.MxaccessGateway.AlarmProviderStatus) payload_); } + if (payloadCase_ == 5) { + output.writeMessage(5, (mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus) payload_); + } getUnknownFields().writeTo(output); } @@ -89473,6 +89560,10 @@ public final class MxaccessGateway extends com.google.protobuf.GeneratedFile { size += com.google.protobuf.CodedOutputStream .computeMessageSize(4, (mxaccess_gateway.v1.MxaccessGateway.AlarmProviderStatus) payload_); } + if (payloadCase_ == 5) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(5, (mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus) payload_); + } size += getUnknownFields().getSerializedSize(); memoizedSize = size; return size; @@ -89506,6 +89597,10 @@ public final class MxaccessGateway extends com.google.protobuf.GeneratedFile { if (!getProviderStatus() .equals(other.getProviderStatus())) return false; break; + case 5: + if (!getSnapshotStatus() + .equals(other.getSnapshotStatus())) return false; + break; case 0: default: } @@ -89538,6 +89633,10 @@ public final class MxaccessGateway extends com.google.protobuf.GeneratedFile { hash = (37 * hash) + PROVIDER_STATUS_FIELD_NUMBER; hash = (53 * hash) + getProviderStatus().hashCode(); break; + case 5: + hash = (37 * hash) + SNAPSHOT_STATUS_FIELD_NUMBER; + hash = (53 * hash) + getSnapshotStatus().hashCode(); + break; case 0: default: } @@ -89687,6 +89786,9 @@ public final class MxaccessGateway extends com.google.protobuf.GeneratedFile { if (providerStatusBuilder_ != null) { providerStatusBuilder_.clear(); } + if (snapshotStatusBuilder_ != null) { + snapshotStatusBuilder_.clear(); + } payloadCase_ = 0; payload_ = null; return this; @@ -89740,6 +89842,10 @@ public final class MxaccessGateway extends com.google.protobuf.GeneratedFile { providerStatusBuilder_ != null) { result.payload_ = providerStatusBuilder_.build(); } + if (payloadCase_ == 5 && + snapshotStatusBuilder_ != null) { + result.payload_ = snapshotStatusBuilder_.build(); + } } @java.lang.Override @@ -89771,6 +89877,10 @@ public final class MxaccessGateway extends com.google.protobuf.GeneratedFile { mergeProviderStatus(other.getProviderStatus()); break; } + case SNAPSHOT_STATUS: { + mergeSnapshotStatus(other.getSnapshotStatus()); + break; + } case PAYLOAD_NOT_SET: { break; } @@ -89827,6 +89937,13 @@ public final class MxaccessGateway extends com.google.protobuf.GeneratedFile { payloadCase_ = 4; break; } // case 34 + case 42: { + input.readMessage( + internalGetSnapshotStatusFieldBuilder().getBuilder(), + extensionRegistry); + payloadCase_ = 5; + break; + } // case 42 default: { if (!super.parseUnknownField(input, extensionRegistry, tag)) { done = true; // was an endgroup tag @@ -90464,6 +90581,202 @@ public final class MxaccessGateway extends com.google.protobuf.GeneratedFile { return providerStatusBuilder_; } + private com.google.protobuf.SingleFieldBuilder< + mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus, mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus.Builder, mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatusOrBuilder> snapshotStatusBuilder_; + /** + *
+       * Snapshot-completeness status. Emitted once on stream open and again on
+       * every change of the truncation verdict, so late joiners learn whether the
+       * feed's active-alarm set may be incomplete.
+       * 
+ * + * .mxaccess_gateway.v1.AlarmSnapshotStatus snapshot_status = 5; + * @return Whether the snapshotStatus field is set. + */ + @java.lang.Override + public boolean hasSnapshotStatus() { + return payloadCase_ == 5; + } + /** + *
+       * Snapshot-completeness status. Emitted once on stream open and again on
+       * every change of the truncation verdict, so late joiners learn whether the
+       * feed's active-alarm set may be incomplete.
+       * 
+ * + * .mxaccess_gateway.v1.AlarmSnapshotStatus snapshot_status = 5; + * @return The snapshotStatus. + */ + @java.lang.Override + public mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus getSnapshotStatus() { + if (snapshotStatusBuilder_ == null) { + if (payloadCase_ == 5) { + return (mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus) payload_; + } + return mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus.getDefaultInstance(); + } else { + if (payloadCase_ == 5) { + return snapshotStatusBuilder_.getMessage(); + } + return mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus.getDefaultInstance(); + } + } + /** + *
+       * Snapshot-completeness status. Emitted once on stream open and again on
+       * every change of the truncation verdict, so late joiners learn whether the
+       * feed's active-alarm set may be incomplete.
+       * 
+ * + * .mxaccess_gateway.v1.AlarmSnapshotStatus snapshot_status = 5; + */ + public Builder setSnapshotStatus(mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus value) { + if (snapshotStatusBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + payload_ = value; + onChanged(); + } else { + snapshotStatusBuilder_.setMessage(value); + } + payloadCase_ = 5; + return this; + } + /** + *
+       * Snapshot-completeness status. Emitted once on stream open and again on
+       * every change of the truncation verdict, so late joiners learn whether the
+       * feed's active-alarm set may be incomplete.
+       * 
+ * + * .mxaccess_gateway.v1.AlarmSnapshotStatus snapshot_status = 5; + */ + public Builder setSnapshotStatus( + mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus.Builder builderForValue) { + if (snapshotStatusBuilder_ == null) { + payload_ = builderForValue.build(); + onChanged(); + } else { + snapshotStatusBuilder_.setMessage(builderForValue.build()); + } + payloadCase_ = 5; + return this; + } + /** + *
+       * Snapshot-completeness status. Emitted once on stream open and again on
+       * every change of the truncation verdict, so late joiners learn whether the
+       * feed's active-alarm set may be incomplete.
+       * 
+ * + * .mxaccess_gateway.v1.AlarmSnapshotStatus snapshot_status = 5; + */ + public Builder mergeSnapshotStatus(mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus value) { + if (snapshotStatusBuilder_ == null) { + if (payloadCase_ == 5 && + payload_ != mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus.getDefaultInstance()) { + payload_ = mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus.newBuilder((mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus) payload_) + .mergeFrom(value).buildPartial(); + } else { + payload_ = value; + } + onChanged(); + } else { + if (payloadCase_ == 5) { + snapshotStatusBuilder_.mergeFrom(value); + } else { + snapshotStatusBuilder_.setMessage(value); + } + } + payloadCase_ = 5; + return this; + } + /** + *
+       * Snapshot-completeness status. Emitted once on stream open and again on
+       * every change of the truncation verdict, so late joiners learn whether the
+       * feed's active-alarm set may be incomplete.
+       * 
+ * + * .mxaccess_gateway.v1.AlarmSnapshotStatus snapshot_status = 5; + */ + public Builder clearSnapshotStatus() { + if (snapshotStatusBuilder_ == null) { + if (payloadCase_ == 5) { + payloadCase_ = 0; + payload_ = null; + onChanged(); + } + } else { + if (payloadCase_ == 5) { + payloadCase_ = 0; + payload_ = null; + } + snapshotStatusBuilder_.clear(); + } + return this; + } + /** + *
+       * Snapshot-completeness status. Emitted once on stream open and again on
+       * every change of the truncation verdict, so late joiners learn whether the
+       * feed's active-alarm set may be incomplete.
+       * 
+ * + * .mxaccess_gateway.v1.AlarmSnapshotStatus snapshot_status = 5; + */ + public mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus.Builder getSnapshotStatusBuilder() { + return internalGetSnapshotStatusFieldBuilder().getBuilder(); + } + /** + *
+       * Snapshot-completeness status. Emitted once on stream open and again on
+       * every change of the truncation verdict, so late joiners learn whether the
+       * feed's active-alarm set may be incomplete.
+       * 
+ * + * .mxaccess_gateway.v1.AlarmSnapshotStatus snapshot_status = 5; + */ + @java.lang.Override + public mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatusOrBuilder getSnapshotStatusOrBuilder() { + if ((payloadCase_ == 5) && (snapshotStatusBuilder_ != null)) { + return snapshotStatusBuilder_.getMessageOrBuilder(); + } else { + if (payloadCase_ == 5) { + return (mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus) payload_; + } + return mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus.getDefaultInstance(); + } + } + /** + *
+       * Snapshot-completeness status. Emitted once on stream open and again on
+       * every change of the truncation verdict, so late joiners learn whether the
+       * feed's active-alarm set may be incomplete.
+       * 
+ * + * .mxaccess_gateway.v1.AlarmSnapshotStatus snapshot_status = 5; + */ + private com.google.protobuf.SingleFieldBuilder< + mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus, mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus.Builder, mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatusOrBuilder> + internalGetSnapshotStatusFieldBuilder() { + if (snapshotStatusBuilder_ == null) { + if (!(payloadCase_ == 5)) { + payload_ = mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus.getDefaultInstance(); + } + snapshotStatusBuilder_ = new com.google.protobuf.SingleFieldBuilder< + mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus, mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus.Builder, mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatusOrBuilder>( + (mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus) payload_, + getParentForChildren(), + isClean()); + payload_ = null; + } + payloadCase_ = 5; + onChanged(); + return snapshotStatusBuilder_; + } + // @@protoc_insertion_point(builder_scope:mxaccess_gateway.v1.AlarmFeedMessage) } @@ -91465,6 +91778,500 @@ public final class MxaccessGateway extends com.google.protobuf.GeneratedFile { } + public interface AlarmSnapshotStatusOrBuilder extends + // @@protoc_insertion_point(interface_extends:mxaccess_gateway.v1.AlarmSnapshotStatus) + com.google.protobuf.MessageOrBuilder { + + /** + *
+     * True while the monitor's cached active-alarm set derives from a truncated
+     * (capped) worker fetch — the set may be missing alarms. Distinct from
+     * provider degradation (AlarmProviderStatus.degraded), which describes the
+     * fidelity of the records rather than the completeness of the set.
+     * 
+ * + * bool truncated = 1; + * @return The truncated. + */ + boolean getTruncated(); + } + /** + *
+   * Feed-level snapshot-completeness status. Emitted once on StreamAlarms open
+   * (after the initial provider_status frame, before the cached active_alarm
+   * frames) so late joiners learn the current verdict, and again on every change
+   * of the truncation verdict — when a reconcile reports a different verdict, and
+   * when the gateway's alarm monitor restarts and drops a truncated verdict with
+   * the cache generation it described (feed subscribers outlive that monitor
+   * session, so they are sent the clearing frame). Mirrors the per-record
+   * ActiveAlarmSnapshot.from_truncated_snapshot caveat at feed level so live
+   * consumers can reason about completeness without polling QueryActiveAlarms.
+   * 
+ * + * Protobuf type {@code mxaccess_gateway.v1.AlarmSnapshotStatus} + */ + public static final class AlarmSnapshotStatus extends + com.google.protobuf.GeneratedMessage implements + // @@protoc_insertion_point(message_implements:mxaccess_gateway.v1.AlarmSnapshotStatus) + AlarmSnapshotStatusOrBuilder { + private static final long serialVersionUID = 0L; + static { + com.google.protobuf.RuntimeVersion.validateProtobufGencodeVersion( + com.google.protobuf.RuntimeVersion.RuntimeDomain.PUBLIC, + /* major= */ 4, + /* minor= */ 33, + /* patch= */ 1, + /* suffix= */ "", + "AlarmSnapshotStatus"); + } + // Use AlarmSnapshotStatus.newBuilder() to construct. + private AlarmSnapshotStatus(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + } + private AlarmSnapshotStatus() { + } + + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return mxaccess_gateway.v1.MxaccessGateway.internal_static_mxaccess_gateway_v1_AlarmSnapshotStatus_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return mxaccess_gateway.v1.MxaccessGateway.internal_static_mxaccess_gateway_v1_AlarmSnapshotStatus_fieldAccessorTable + .ensureFieldAccessorsInitialized( + mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus.class, mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus.Builder.class); + } + + public static final int TRUNCATED_FIELD_NUMBER = 1; + private boolean truncated_ = false; + /** + *
+     * True while the monitor's cached active-alarm set derives from a truncated
+     * (capped) worker fetch — the set may be missing alarms. Distinct from
+     * provider degradation (AlarmProviderStatus.degraded), which describes the
+     * fidelity of the records rather than the completeness of the set.
+     * 
+ * + * bool truncated = 1; + * @return The truncated. + */ + @java.lang.Override + public boolean getTruncated() { + return truncated_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (truncated_ != false) { + output.writeBool(1, truncated_); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (truncated_ != false) { + size += com.google.protobuf.CodedOutputStream + .computeBoolSize(1, truncated_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus)) { + return super.equals(obj); + } + mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus other = (mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus) obj; + + if (getTruncated() + != other.getTruncated()) return false; + if (!getUnknownFields().equals(other.getUnknownFields())) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + TRUNCATED_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean( + getTruncated()); + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessage + .parseWithIOException(PARSER, input); + } + public static mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessage + .parseWithIOException(PARSER, input, extensionRegistry); + } + + public static mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessage + .parseDelimitedWithIOException(PARSER, input); + } + + public static mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessage + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessage + .parseWithIOException(PARSER, input); + } + public static mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessage + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
+     * Feed-level snapshot-completeness status. Emitted once on StreamAlarms open
+     * (after the initial provider_status frame, before the cached active_alarm
+     * frames) so late joiners learn the current verdict, and again on every change
+     * of the truncation verdict — when a reconcile reports a different verdict, and
+     * when the gateway's alarm monitor restarts and drops a truncated verdict with
+     * the cache generation it described (feed subscribers outlive that monitor
+     * session, so they are sent the clearing frame). Mirrors the per-record
+     * ActiveAlarmSnapshot.from_truncated_snapshot caveat at feed level so live
+     * consumers can reason about completeness without polling QueryActiveAlarms.
+     * 
+ * + * Protobuf type {@code mxaccess_gateway.v1.AlarmSnapshotStatus} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder implements + // @@protoc_insertion_point(builder_implements:mxaccess_gateway.v1.AlarmSnapshotStatus) + mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatusOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return mxaccess_gateway.v1.MxaccessGateway.internal_static_mxaccess_gateway_v1_AlarmSnapshotStatus_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return mxaccess_gateway.v1.MxaccessGateway.internal_static_mxaccess_gateway_v1_AlarmSnapshotStatus_fieldAccessorTable + .ensureFieldAccessorsInitialized( + mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus.class, mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus.Builder.class); + } + + // Construct using mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus.newBuilder() + private Builder() { + + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + + } + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + truncated_ = false; + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return mxaccess_gateway.v1.MxaccessGateway.internal_static_mxaccess_gateway_v1_AlarmSnapshotStatus_descriptor; + } + + @java.lang.Override + public mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus getDefaultInstanceForType() { + return mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus.getDefaultInstance(); + } + + @java.lang.Override + public mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus build() { + mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus buildPartial() { + mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus result = new mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus(this); + if (bitField0_ != 0) { buildPartial0(result); } + onBuilt(); + return result; + } + + private void buildPartial0(mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus result) { + int from_bitField0_ = bitField0_; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.truncated_ = truncated_; + } + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus) { + return mergeFrom((mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus other) { + if (other == mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus.getDefaultInstance()) return this; + if (other.getTruncated() != false) { + setTruncated(other.getTruncated()); + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 8: { + truncated_ = input.readBool(); + bitField0_ |= 0x00000001; + break; + } // case 8 + default: { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + done = true; // was an endgroup tag + } + break; + } // default: + } // switch (tag) + } // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } // finally + return this; + } + private int bitField0_; + + private boolean truncated_ ; + /** + *
+       * True while the monitor's cached active-alarm set derives from a truncated
+       * (capped) worker fetch — the set may be missing alarms. Distinct from
+       * provider degradation (AlarmProviderStatus.degraded), which describes the
+       * fidelity of the records rather than the completeness of the set.
+       * 
+ * + * bool truncated = 1; + * @return The truncated. + */ + @java.lang.Override + public boolean getTruncated() { + return truncated_; + } + /** + *
+       * True while the monitor's cached active-alarm set derives from a truncated
+       * (capped) worker fetch — the set may be missing alarms. Distinct from
+       * provider degradation (AlarmProviderStatus.degraded), which describes the
+       * fidelity of the records rather than the completeness of the set.
+       * 
+ * + * bool truncated = 1; + * @param value The truncated to set. + * @return This builder for chaining. + */ + public Builder setTruncated(boolean value) { + + truncated_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + /** + *
+       * True while the monitor's cached active-alarm set derives from a truncated
+       * (capped) worker fetch — the set may be missing alarms. Distinct from
+       * provider degradation (AlarmProviderStatus.degraded), which describes the
+       * fidelity of the records rather than the completeness of the set.
+       * 
+ * + * bool truncated = 1; + * @return This builder for chaining. + */ + public Builder clearTruncated() { + bitField0_ = (bitField0_ & ~0x00000001); + truncated_ = false; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:mxaccess_gateway.v1.AlarmSnapshotStatus) + } + + // @@protoc_insertion_point(class_scope:mxaccess_gateway.v1.AlarmSnapshotStatus) + private static final mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus(); + } + + public static mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public AlarmSnapshotStatus parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e) + .setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + public interface MxStatusProxyOrBuilder extends // @@protoc_insertion_point(interface_extends:mxaccess_gateway.v1.MxStatusProxy) com.google.protobuf.MessageOrBuilder { @@ -105185,6 +105992,11 @@ public final class MxaccessGateway extends com.google.protobuf.GeneratedFile { private static final com.google.protobuf.GeneratedMessage.FieldAccessorTable internal_static_mxaccess_gateway_v1_AlarmProviderStatus_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_mxaccess_gateway_v1_AlarmSnapshotStatus_descriptor; + private static final + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_mxaccess_gateway_v1_AlarmSnapshotStatus_fieldAccessorTable; private static final com.google.protobuf.Descriptors.Descriptor internal_static_mxaccess_gateway_v1_MxStatusProxy_descriptor; private static final @@ -105643,194 +106455,197 @@ public final class MxaccessGateway extends com.google.protobuf.GeneratedFile { "agnostic_message\030\006 \001(\tB\n\n\010_hresultJ\004\010\001\020\002" + "R\nsession_id\"Q\n\023StreamAlarmsRequest\022\035\n\025c" + "lient_correlation_id\030\001 \001(\t\022\033\n\023alarm_filt" + - "er_prefix\030\002 \001(\t\"\204\002\n\020AlarmFeedMessage\022@\n\014" + + "er_prefix\030\002 \001(\t\"\311\002\n\020AlarmFeedMessage\022@\n\014" + "active_alarm\030\001 \001(\0132(.mxaccess_gateway.v1" + ".ActiveAlarmSnapshotH\000\022\033\n\021snapshot_compl" + "ete\030\002 \001(\010H\000\022A\n\ntransition\030\003 \001(\0132+.mxacce" + "ss_gateway.v1.OnAlarmTransitionEventH\000\022C" + "\n\017provider_status\030\004 \001(\0132(.mxaccess_gatew" + - "ay.v1.AlarmProviderStatusH\000B\t\n\007payload\"\230" + - "\001\n\023AlarmProviderStatus\0224\n\004mode\030\001 \001(\0162&.m" + - "xaccess_gateway.v1.AlarmProviderMode\022\020\n\010" + - "degraded\030\002 \001(\010\022\016\n\006reason\030\003 \001(\t\022)\n\005since\030" + - "\004 \001(\0132\032.google.protobuf.Timestamp\"\353\001\n\rMx" + - "StatusProxy\022\017\n\007success\030\001 \001(\005\0227\n\010category" + - "\030\002 \001(\0162%.mxaccess_gateway.v1.MxStatusCat" + - "egory\0228\n\013detected_by\030\003 \001(\0162#.mxaccess_ga" + - "teway.v1.MxStatusSource\022\016\n\006detail\030\004 \001(\005\022" + - "\024\n\014raw_category\030\005 \001(\005\022\027\n\017raw_detected_by" + - "\030\006 \001(\005\022\027\n\017diagnostic_text\030\007 \001(\t\"\351\003\n\007MxVa" + - "lue\0222\n\tdata_type\030\001 \001(\0162\037.mxaccess_gatewa" + - "y.v1.MxDataType\022\024\n\014variant_type\030\002 \001(\t\022\017\n" + - "\007is_null\030\003 \001(\010\022\026\n\016raw_diagnostic\030\004 \001(\t\022\025" + - "\n\rraw_data_type\030\005 \001(\005\022\024\n\nbool_value\030\n \001(", - "\010H\000\022\025\n\013int32_value\030\013 \001(\005H\000\022\025\n\013int64_valu" + - "e\030\014 \001(\003H\000\022\025\n\013float_value\030\r \001(\002H\000\022\026\n\014doub" + - "le_value\030\016 \001(\001H\000\022\026\n\014string_value\030\017 \001(\tH\000" + - "\0225\n\017timestamp_value\030\020 \001(\0132\032.google.proto" + - "buf.TimestampH\000\0223\n\013array_value\030\021 \001(\0132\034.m" + - "xaccess_gateway.v1.MxArrayH\000\022\023\n\traw_valu" + - "e\030\022 \001(\014H\000\022@\n\022sparse_array_value\030\023 \001(\0132\"." + - "mxaccess_gateway.v1.MxSparseArrayH\000B\006\n\004k" + - "ind\"\376\004\n\007MxArray\022:\n\021element_data_type\030\001 \001" + - "(\0162\037.mxaccess_gateway.v1.MxDataType\022\024\n\014v" + - "ariant_type\030\002 \001(\t\022\022\n\ndimensions\030\003 \003(\r\022\026\n" + - "\016raw_diagnostic\030\004 \001(\t\022\035\n\025raw_element_dat" + - "a_type\030\005 \001(\005\0225\n\013bool_values\030\n \001(\0132\036.mxac" + - "cess_gateway.v1.BoolArrayH\000\0227\n\014int32_val" + - "ues\030\013 \001(\0132\037.mxaccess_gateway.v1.Int32Arr" + - "ayH\000\0227\n\014int64_values\030\014 \001(\0132\037.mxaccess_ga" + - "teway.v1.Int64ArrayH\000\0227\n\014float_values\030\r " + - "\001(\0132\037.mxaccess_gateway.v1.FloatArrayH\000\0229" + - "\n\rdouble_values\030\016 \001(\0132 .mxaccess_gateway" + - ".v1.DoubleArrayH\000\0229\n\rstring_values\030\017 \001(\013" + - "2 .mxaccess_gateway.v1.StringArrayH\000\022?\n\020" + - "timestamp_values\030\020 \001(\0132#.mxaccess_gatewa" + - "y.v1.TimestampArrayH\000\0223\n\nraw_values\030\021 \001(" + - "\0132\035.mxaccess_gateway.v1.RawArrayH\000B\010\n\006va" + - "lues\"\231\001\n\rMxSparseArray\022:\n\021element_data_t" + - "ype\030\001 \001(\0162\037.mxaccess_gateway.v1.MxDataTy" + - "pe\022\024\n\014total_length\030\002 \001(\r\0226\n\010elements\030\003 \003" + - "(\0132$.mxaccess_gateway.v1.MxSparseElement" + - "\"M\n\017MxSparseElement\022\r\n\005index\030\001 \001(\r\022+\n\005va" + - "lue\030\002 \001(\0132\034.mxaccess_gateway.v1.MxValue\"" + - "\033\n\tBoolArray\022\016\n\006values\030\001 \003(\010\"\034\n\nInt32Arr" + - "ay\022\016\n\006values\030\001 \003(\005\"\034\n\nInt64Array\022\016\n\006valu" + - "es\030\001 \003(\003\"\034\n\nFloatArray\022\016\n\006values\030\001 \003(\002\"\035" + - "\n\013DoubleArray\022\016\n\006values\030\001 \003(\001\"\035\n\013StringA" + - "rray\022\016\n\006values\030\001 \003(\t\"<\n\016TimestampArray\022*" + - "\n\006values\030\001 \003(\0132\032.google.protobuf.Timesta" + - "mp\"\032\n\010RawArray\022\016\n\006values\030\001 \003(\014\"X\n\016Protoc" + - "olStatus\0225\n\004code\030\001 \001(\0162\'.mxaccess_gatewa" + - "y.v1.ProtocolStatusCode\022\017\n\007message\030\002 \001(\t" + - "*\237\013\n\rMxCommandKind\022\037\n\033MX_COMMAND_KIND_UN" + - "SPECIFIED\020\000\022\034\n\030MX_COMMAND_KIND_REGISTER\020" + - "\001\022\036\n\032MX_COMMAND_KIND_UNREGISTER\020\002\022\034\n\030MX_" + - "COMMAND_KIND_ADD_ITEM\020\003\022\035\n\031MX_COMMAND_KI" + - "ND_ADD_ITEM2\020\004\022\037\n\033MX_COMMAND_KIND_REMOVE" + - "_ITEM\020\005\022\032\n\026MX_COMMAND_KIND_ADVISE\020\006\022\035\n\031M" + - "X_COMMAND_KIND_UN_ADVISE\020\007\022&\n\"MX_COMMAND" + - "_KIND_ADVISE_SUPERVISORY\020\010\022%\n!MX_COMMAND" + - "_KIND_ADD_BUFFERED_ITEM\020\t\0220\n,MX_COMMAND_" + - "KIND_SET_BUFFERED_UPDATE_INTERVAL\020\n\022\033\n\027M" + - "X_COMMAND_KIND_SUSPEND\020\013\022\034\n\030MX_COMMAND_K" + - "IND_ACTIVATE\020\014\022\031\n\025MX_COMMAND_KIND_WRITE\020" + - "\r\022\032\n\026MX_COMMAND_KIND_WRITE2\020\016\022!\n\035MX_COMM" + - "AND_KIND_WRITE_SECURED\020\017\022\"\n\036MX_COMMAND_K" + - "IND_WRITE_SECURED2\020\020\022%\n!MX_COMMAND_KIND_" + - "AUTHENTICATE_USER\020\021\022(\n$MX_COMMAND_KIND_A" + - "RCHESTRA_USER_TO_ID\020\022\022!\n\035MX_COMMAND_KIND" + - "_ADD_ITEM_BULK\020\023\022$\n MX_COMMAND_KIND_ADVI" + - "SE_ITEM_BULK\020\024\022$\n MX_COMMAND_KIND_REMOVE" + - "_ITEM_BULK\020\025\022\'\n#MX_COMMAND_KIND_UN_ADVIS" + - "E_ITEM_BULK\020\026\022\"\n\036MX_COMMAND_KIND_SUBSCRI" + - "BE_BULK\020\027\022$\n MX_COMMAND_KIND_UNSUBSCRIBE" + - "_BULK\020\030\022$\n MX_COMMAND_KIND_SUBSCRIBE_ALA" + - "RMS\020\031\022&\n\"MX_COMMAND_KIND_UNSUBSCRIBE_ALA" + - "RMS\020\032\022%\n!MX_COMMAND_KIND_ACKNOWLEDGE_ALA" + - "RM\020\033\022\'\n#MX_COMMAND_KIND_QUERY_ACTIVE_ALA" + - "RMS\020\034\022-\n)MX_COMMAND_KIND_ACKNOWLEDGE_ALA" + - "RM_BY_NAME\020\035\022\036\n\032MX_COMMAND_KIND_WRITE_BU" + - "LK\020\036\022\037\n\033MX_COMMAND_KIND_WRITE2_BULK\020\037\022&\n" + - "\"MX_COMMAND_KIND_WRITE_SECURED_BULK\020 \022\'\n" + - "#MX_COMMAND_KIND_WRITE_SECURED2_BULK\020!\022\035" + - "\n\031MX_COMMAND_KIND_READ_BULK\020\"\022\030\n\024MX_COMM" + - "AND_KIND_PING\020d\022%\n!MX_COMMAND_KIND_GET_S" + - "ESSION_STATE\020e\022#\n\037MX_COMMAND_KIND_GET_WO" + - "RKER_INFO\020f\022 \n\034MX_COMMAND_KIND_DRAIN_EVE" + - "NTS\020g\022#\n\037MX_COMMAND_KIND_SHUTDOWN_WORKER" + - "\020h*z\n\021AlarmProviderMode\022#\n\037ALARM_PROVIDE" + - "R_MODE_UNSPECIFIED\020\000\022 \n\034ALARM_PROVIDER_M" + - "ODE_ALARMMGR\020\001\022\036\n\032ALARM_PROVIDER_MODE_SU" + - "BTAG\020\002*\255\002\n\rMxEventFamily\022\037\n\033MX_EVENT_FAM" + - "ILY_UNSPECIFIED\020\000\022\"\n\036MX_EVENT_FAMILY_ON_" + - "DATA_CHANGE\020\001\022%\n!MX_EVENT_FAMILY_ON_WRIT" + - "E_COMPLETE\020\002\022&\n\"MX_EVENT_FAMILY_OPERATIO" + - "N_COMPLETE\020\003\022+\n\'MX_EVENT_FAMILY_ON_BUFFE" + - "RED_DATA_CHANGE\020\004\022\'\n#MX_EVENT_FAMILY_ON_" + - "ALARM_TRANSITION\020\005\0222\n.MX_EVENT_FAMILY_ON" + - "_ALARM_PROVIDER_MODE_CHANGED\020\006*\312\001\n\023Alarm" + - "TransitionKind\022%\n!ALARM_TRANSITION_KIND_" + - "UNSPECIFIED\020\000\022\037\n\033ALARM_TRANSITION_KIND_R" + - "AISE\020\001\022%\n!ALARM_TRANSITION_KIND_ACKNOWLE" + - "DGE\020\002\022\037\n\033ALARM_TRANSITION_KIND_CLEAR\020\003\022#" + - "\n\037ALARM_TRANSITION_KIND_RETRIGGER\020\004*\252\001\n\023" + - "AlarmConditionState\022%\n!ALARM_CONDITION_S" + - "TATE_UNSPECIFIED\020\000\022 \n\034ALARM_CONDITION_ST" + - "ATE_ACTIVE\020\001\022&\n\"ALARM_CONDITION_STATE_AC" + - "TIVE_ACKED\020\002\022\"\n\036ALARM_CONDITION_STATE_IN" + - "ACTIVE\020\003*\245\003\n\020MxStatusCategory\022\"\n\036MX_STAT" + - "US_CATEGORY_UNSPECIFIED\020\000\022\036\n\032MX_STATUS_C" + - "ATEGORY_UNKNOWN\020\001\022\031\n\025MX_STATUS_CATEGORY_" + - "OK\020\002\022\036\n\032MX_STATUS_CATEGORY_PENDING\020\003\022\036\n\032" + - "MX_STATUS_CATEGORY_WARNING\020\004\022*\n&MX_STATU" + - "S_CATEGORY_COMMUNICATION_ERROR\020\005\022*\n&MX_S" + - "TATUS_CATEGORY_CONFIGURATION_ERROR\020\006\022(\n$" + - "MX_STATUS_CATEGORY_OPERATIONAL_ERROR\020\007\022%" + - "\n!MX_STATUS_CATEGORY_SECURITY_ERROR\020\010\022%\n" + - "!MX_STATUS_CATEGORY_SOFTWARE_ERROR\020\t\022\"\n\036" + - "MX_STATUS_CATEGORY_OTHER_ERROR\020\n*\312\002\n\016MxS" + - "tatusSource\022 \n\034MX_STATUS_SOURCE_UNSPECIF" + - "IED\020\000\022\034\n\030MX_STATUS_SOURCE_UNKNOWN\020\001\022#\n\037M" + - "X_STATUS_SOURCE_REQUESTING_LMX\020\002\022#\n\037MX_S" + - "TATUS_SOURCE_RESPONDING_LMX\020\003\022#\n\037MX_STAT" + - "US_SOURCE_REQUESTING_NMX\020\004\022#\n\037MX_STATUS_" + - "SOURCE_RESPONDING_NMX\020\005\0221\n-MX_STATUS_SOU" + - "RCE_REQUESTING_AUTOMATION_OBJECT\020\006\0221\n-MX" + - "_STATUS_SOURCE_RESPONDING_AUTOMATION_OBJ" + - "ECT\020\007*\335\004\n\nMxDataType\022\034\n\030MX_DATA_TYPE_UNS" + - "PECIFIED\020\000\022\030\n\024MX_DATA_TYPE_UNKNOWN\020\001\022\030\n\024" + - "MX_DATA_TYPE_NO_DATA\020\002\022\030\n\024MX_DATA_TYPE_B" + - "OOLEAN\020\003\022\030\n\024MX_DATA_TYPE_INTEGER\020\004\022\026\n\022MX" + - "_DATA_TYPE_FLOAT\020\005\022\027\n\023MX_DATA_TYPE_DOUBL" + - "E\020\006\022\027\n\023MX_DATA_TYPE_STRING\020\007\022\025\n\021MX_DATA_" + - "TYPE_TIME\020\010\022\035\n\031MX_DATA_TYPE_ELAPSED_TIME" + - "\020\t\022\037\n\033MX_DATA_TYPE_REFERENCE_TYPE\020\n\022\034\n\030M" + - "X_DATA_TYPE_STATUS_TYPE\020\013\022\025\n\021MX_DATA_TYP" + - "E_ENUM\020\014\022-\n)MX_DATA_TYPE_SECURITY_CLASSI" + - "FICATION_ENUM\020\r\022\"\n\036MX_DATA_TYPE_DATA_QUA" + - "LITY_TYPE\020\016\022\037\n\033MX_DATA_TYPE_QUALIFIED_EN" + - "UM\020\017\022!\n\035MX_DATA_TYPE_QUALIFIED_STRUCT\020\020\022" + - ")\n%MX_DATA_TYPE_INTERNATIONALIZED_STRING" + - "\020\021\022\033\n\027MX_DATA_TYPE_BIG_STRING\020\022\022\024\n\020MX_DA" + - "TA_TYPE_END\020\023*\243\003\n\022ProtocolStatusCode\022$\n " + - "PROTOCOL_STATUS_CODE_UNSPECIFIED\020\000\022\033\n\027PR" + - "OTOCOL_STATUS_CODE_OK\020\001\022(\n$PROTOCOL_STAT" + - "US_CODE_INVALID_REQUEST\020\002\022*\n&PROTOCOL_ST" + - "ATUS_CODE_SESSION_NOT_FOUND\020\003\022*\n&PROTOCO" + - "L_STATUS_CODE_SESSION_NOT_READY\020\004\022+\n\'PRO" + - "TOCOL_STATUS_CODE_WORKER_UNAVAILABLE\020\005\022 " + - "\n\034PROTOCOL_STATUS_CODE_TIMEOUT\020\006\022!\n\035PROT" + - "OCOL_STATUS_CODE_CANCELED\020\007\022+\n\'PROTOCOL_" + - "STATUS_CODE_PROTOCOL_VIOLATION\020\010\022)\n%PROT" + - "OCOL_STATUS_CODE_MXACCESS_FAILURE\020\t*\277\002\n\014" + - "SessionState\022\035\n\031SESSION_STATE_UNSPECIFIE" + - "D\020\000\022\032\n\026SESSION_STATE_CREATING\020\001\022!\n\035SESSI" + - "ON_STATE_STARTING_WORKER\020\002\022\"\n\036SESSION_ST" + - "ATE_WAITING_FOR_PIPE\020\003\022\035\n\031SESSION_STATE_" + - "HANDSHAKING\020\004\022%\n!SESSION_STATE_INITIALIZ" + - "ING_WORKER\020\005\022\027\n\023SESSION_STATE_READY\020\006\022\031\n" + - "\025SESSION_STATE_CLOSING\020\007\022\030\n\024SESSION_STAT" + - "E_CLOSED\020\010\022\031\n\025SESSION_STATE_FAULTED\020\t2\303\005" + - "\n\017MxAccessGateway\022]\n\013OpenSession\022\'.mxacc" + - "ess_gateway.v1.OpenSessionRequest\032%.mxac" + - "cess_gateway.v1.OpenSessionReply\022`\n\014Clos" + - "eSession\022(.mxaccess_gateway.v1.CloseSess" + - "ionRequest\032&.mxaccess_gateway.v1.CloseSe" + - "ssionReply\022T\n\006Invoke\022%.mxaccess_gateway." + - "v1.MxCommandRequest\032#.mxaccess_gateway.v" + - "1.MxCommandReply\022X\n\014StreamEvents\022(.mxacc" + - "ess_gateway.v1.StreamEventsRequest\032\034.mxa" + - "ccess_gateway.v1.MxEvent0\001\022l\n\020Acknowledg" + - "eAlarm\022,.mxaccess_gateway.v1.Acknowledge" + - "AlarmRequest\032*.mxaccess_gateway.v1.Ackno" + - "wledgeAlarmReply\022a\n\014StreamAlarms\022(.mxacc" + - "ess_gateway.v1.StreamAlarmsRequest\032%.mxa" + - "ccess_gateway.v1.AlarmFeedMessage0\001\022n\n\021Q" + - "ueryActiveAlarms\022-.mxaccess_gateway.v1.Q" + - "ueryActiveAlarmsRequest\032(.mxaccess_gatew" + - "ay.v1.ActiveAlarmSnapshot0\001B&\252\002#ZB.MOM.W" + - "W.MxGateway.Contracts.Protob\006proto3" + "ay.v1.AlarmProviderStatusH\000\022C\n\017snapshot_" + + "status\030\005 \001(\0132(.mxaccess_gateway.v1.Alarm" + + "SnapshotStatusH\000B\t\n\007payload\"\230\001\n\023AlarmPro" + + "viderStatus\0224\n\004mode\030\001 \001(\0162&.mxaccess_gat" + + "eway.v1.AlarmProviderMode\022\020\n\010degraded\030\002 " + + "\001(\010\022\016\n\006reason\030\003 \001(\t\022)\n\005since\030\004 \001(\0132\032.goo" + + "gle.protobuf.Timestamp\"(\n\023AlarmSnapshotS" + + "tatus\022\021\n\ttruncated\030\001 \001(\010\"\353\001\n\rMxStatusPro" + + "xy\022\017\n\007success\030\001 \001(\005\0227\n\010category\030\002 \001(\0162%." + + "mxaccess_gateway.v1.MxStatusCategory\0228\n\013" + + "detected_by\030\003 \001(\0162#.mxaccess_gateway.v1." + + "MxStatusSource\022\016\n\006detail\030\004 \001(\005\022\024\n\014raw_ca" + + "tegory\030\005 \001(\005\022\027\n\017raw_detected_by\030\006 \001(\005\022\027\n" + + "\017diagnostic_text\030\007 \001(\t\"\351\003\n\007MxValue\0222\n\tda" + + "ta_type\030\001 \001(\0162\037.mxaccess_gateway.v1.MxDa", + "taType\022\024\n\014variant_type\030\002 \001(\t\022\017\n\007is_null\030" + + "\003 \001(\010\022\026\n\016raw_diagnostic\030\004 \001(\t\022\025\n\rraw_dat" + + "a_type\030\005 \001(\005\022\024\n\nbool_value\030\n \001(\010H\000\022\025\n\013in" + + "t32_value\030\013 \001(\005H\000\022\025\n\013int64_value\030\014 \001(\003H\000" + + "\022\025\n\013float_value\030\r \001(\002H\000\022\026\n\014double_value\030" + + "\016 \001(\001H\000\022\026\n\014string_value\030\017 \001(\tH\000\0225\n\017times" + + "tamp_value\030\020 \001(\0132\032.google.protobuf.Times" + + "tampH\000\0223\n\013array_value\030\021 \001(\0132\034.mxaccess_g" + + "ateway.v1.MxArrayH\000\022\023\n\traw_value\030\022 \001(\014H\000" + + "\022@\n\022sparse_array_value\030\023 \001(\0132\".mxaccess_" + + "gateway.v1.MxSparseArrayH\000B\006\n\004kind\"\376\004\n\007M" + + "xArray\022:\n\021element_data_type\030\001 \001(\0162\037.mxac" + + "cess_gateway.v1.MxDataType\022\024\n\014variant_ty" + + "pe\030\002 \001(\t\022\022\n\ndimensions\030\003 \003(\r\022\026\n\016raw_diag" + + "nostic\030\004 \001(\t\022\035\n\025raw_element_data_type\030\005 " + + "\001(\005\0225\n\013bool_values\030\n \001(\0132\036.mxaccess_gate" + + "way.v1.BoolArrayH\000\0227\n\014int32_values\030\013 \001(\013" + + "2\037.mxaccess_gateway.v1.Int32ArrayH\000\0227\n\014i" + + "nt64_values\030\014 \001(\0132\037.mxaccess_gateway.v1." + + "Int64ArrayH\000\0227\n\014float_values\030\r \001(\0132\037.mxa" + + "ccess_gateway.v1.FloatArrayH\000\0229\n\rdouble_" + + "values\030\016 \001(\0132 .mxaccess_gateway.v1.Doubl" + + "eArrayH\000\0229\n\rstring_values\030\017 \001(\0132 .mxacce" + + "ss_gateway.v1.StringArrayH\000\022?\n\020timestamp" + + "_values\030\020 \001(\0132#.mxaccess_gateway.v1.Time" + + "stampArrayH\000\0223\n\nraw_values\030\021 \001(\0132\035.mxacc" + + "ess_gateway.v1.RawArrayH\000B\010\n\006values\"\231\001\n\r" + + "MxSparseArray\022:\n\021element_data_type\030\001 \001(\016" + + "2\037.mxaccess_gateway.v1.MxDataType\022\024\n\014tot" + + "al_length\030\002 \001(\r\0226\n\010elements\030\003 \003(\0132$.mxac" + + "cess_gateway.v1.MxSparseElement\"M\n\017MxSpa" + + "rseElement\022\r\n\005index\030\001 \001(\r\022+\n\005value\030\002 \001(\013" + + "2\034.mxaccess_gateway.v1.MxValue\"\033\n\tBoolAr" + + "ray\022\016\n\006values\030\001 \003(\010\"\034\n\nInt32Array\022\016\n\006val" + + "ues\030\001 \003(\005\"\034\n\nInt64Array\022\016\n\006values\030\001 \003(\003\"" + + "\034\n\nFloatArray\022\016\n\006values\030\001 \003(\002\"\035\n\013DoubleA" + + "rray\022\016\n\006values\030\001 \003(\001\"\035\n\013StringArray\022\016\n\006v" + + "alues\030\001 \003(\t\"<\n\016TimestampArray\022*\n\006values\030" + + "\001 \003(\0132\032.google.protobuf.Timestamp\"\032\n\010Raw" + + "Array\022\016\n\006values\030\001 \003(\014\"X\n\016ProtocolStatus\022" + + "5\n\004code\030\001 \001(\0162\'.mxaccess_gateway.v1.Prot" + + "ocolStatusCode\022\017\n\007message\030\002 \001(\t*\237\013\n\rMxCo" + + "mmandKind\022\037\n\033MX_COMMAND_KIND_UNSPECIFIED" + + "\020\000\022\034\n\030MX_COMMAND_KIND_REGISTER\020\001\022\036\n\032MX_C" + + "OMMAND_KIND_UNREGISTER\020\002\022\034\n\030MX_COMMAND_K" + + "IND_ADD_ITEM\020\003\022\035\n\031MX_COMMAND_KIND_ADD_IT" + + "EM2\020\004\022\037\n\033MX_COMMAND_KIND_REMOVE_ITEM\020\005\022\032" + + "\n\026MX_COMMAND_KIND_ADVISE\020\006\022\035\n\031MX_COMMAND" + + "_KIND_UN_ADVISE\020\007\022&\n\"MX_COMMAND_KIND_ADV" + + "ISE_SUPERVISORY\020\010\022%\n!MX_COMMAND_KIND_ADD" + + "_BUFFERED_ITEM\020\t\0220\n,MX_COMMAND_KIND_SET_" + + "BUFFERED_UPDATE_INTERVAL\020\n\022\033\n\027MX_COMMAND" + + "_KIND_SUSPEND\020\013\022\034\n\030MX_COMMAND_KIND_ACTIV" + + "ATE\020\014\022\031\n\025MX_COMMAND_KIND_WRITE\020\r\022\032\n\026MX_C" + + "OMMAND_KIND_WRITE2\020\016\022!\n\035MX_COMMAND_KIND_" + + "WRITE_SECURED\020\017\022\"\n\036MX_COMMAND_KIND_WRITE" + + "_SECURED2\020\020\022%\n!MX_COMMAND_KIND_AUTHENTIC" + + "ATE_USER\020\021\022(\n$MX_COMMAND_KIND_ARCHESTRA_" + + "USER_TO_ID\020\022\022!\n\035MX_COMMAND_KIND_ADD_ITEM" + + "_BULK\020\023\022$\n MX_COMMAND_KIND_ADVISE_ITEM_B" + + "ULK\020\024\022$\n MX_COMMAND_KIND_REMOVE_ITEM_BUL" + + "K\020\025\022\'\n#MX_COMMAND_KIND_UN_ADVISE_ITEM_BU" + + "LK\020\026\022\"\n\036MX_COMMAND_KIND_SUBSCRIBE_BULK\020\027" + + "\022$\n MX_COMMAND_KIND_UNSUBSCRIBE_BULK\020\030\022$" + + "\n MX_COMMAND_KIND_SUBSCRIBE_ALARMS\020\031\022&\n\"" + + "MX_COMMAND_KIND_UNSUBSCRIBE_ALARMS\020\032\022%\n!" + + "MX_COMMAND_KIND_ACKNOWLEDGE_ALARM\020\033\022\'\n#M" + + "X_COMMAND_KIND_QUERY_ACTIVE_ALARMS\020\034\022-\n)" + + "MX_COMMAND_KIND_ACKNOWLEDGE_ALARM_BY_NAM" + + "E\020\035\022\036\n\032MX_COMMAND_KIND_WRITE_BULK\020\036\022\037\n\033M" + + "X_COMMAND_KIND_WRITE2_BULK\020\037\022&\n\"MX_COMMA" + + "ND_KIND_WRITE_SECURED_BULK\020 \022\'\n#MX_COMMA" + + "ND_KIND_WRITE_SECURED2_BULK\020!\022\035\n\031MX_COMM" + + "AND_KIND_READ_BULK\020\"\022\030\n\024MX_COMMAND_KIND_" + + "PING\020d\022%\n!MX_COMMAND_KIND_GET_SESSION_ST" + + "ATE\020e\022#\n\037MX_COMMAND_KIND_GET_WORKER_INFO" + + "\020f\022 \n\034MX_COMMAND_KIND_DRAIN_EVENTS\020g\022#\n\037" + + "MX_COMMAND_KIND_SHUTDOWN_WORKER\020h*z\n\021Ala" + + "rmProviderMode\022#\n\037ALARM_PROVIDER_MODE_UN" + + "SPECIFIED\020\000\022 \n\034ALARM_PROVIDER_MODE_ALARM" + + "MGR\020\001\022\036\n\032ALARM_PROVIDER_MODE_SUBTAG\020\002*\255\002" + + "\n\rMxEventFamily\022\037\n\033MX_EVENT_FAMILY_UNSPE" + + "CIFIED\020\000\022\"\n\036MX_EVENT_FAMILY_ON_DATA_CHAN" + + "GE\020\001\022%\n!MX_EVENT_FAMILY_ON_WRITE_COMPLET" + + "E\020\002\022&\n\"MX_EVENT_FAMILY_OPERATION_COMPLET" + + "E\020\003\022+\n\'MX_EVENT_FAMILY_ON_BUFFERED_DATA_" + + "CHANGE\020\004\022\'\n#MX_EVENT_FAMILY_ON_ALARM_TRA" + + "NSITION\020\005\0222\n.MX_EVENT_FAMILY_ON_ALARM_PR" + + "OVIDER_MODE_CHANGED\020\006*\312\001\n\023AlarmTransitio" + + "nKind\022%\n!ALARM_TRANSITION_KIND_UNSPECIFI" + + "ED\020\000\022\037\n\033ALARM_TRANSITION_KIND_RAISE\020\001\022%\n" + + "!ALARM_TRANSITION_KIND_ACKNOWLEDGE\020\002\022\037\n\033" + + "ALARM_TRANSITION_KIND_CLEAR\020\003\022#\n\037ALARM_T" + + "RANSITION_KIND_RETRIGGER\020\004*\252\001\n\023AlarmCond" + + "itionState\022%\n!ALARM_CONDITION_STATE_UNSP" + + "ECIFIED\020\000\022 \n\034ALARM_CONDITION_STATE_ACTIV" + + "E\020\001\022&\n\"ALARM_CONDITION_STATE_ACTIVE_ACKE" + + "D\020\002\022\"\n\036ALARM_CONDITION_STATE_INACTIVE\020\003*" + + "\245\003\n\020MxStatusCategory\022\"\n\036MX_STATUS_CATEGO" + + "RY_UNSPECIFIED\020\000\022\036\n\032MX_STATUS_CATEGORY_U" + + "NKNOWN\020\001\022\031\n\025MX_STATUS_CATEGORY_OK\020\002\022\036\n\032M" + + "X_STATUS_CATEGORY_PENDING\020\003\022\036\n\032MX_STATUS" + + "_CATEGORY_WARNING\020\004\022*\n&MX_STATUS_CATEGOR" + + "Y_COMMUNICATION_ERROR\020\005\022*\n&MX_STATUS_CAT" + + "EGORY_CONFIGURATION_ERROR\020\006\022(\n$MX_STATUS" + + "_CATEGORY_OPERATIONAL_ERROR\020\007\022%\n!MX_STAT" + + "US_CATEGORY_SECURITY_ERROR\020\010\022%\n!MX_STATU" + + "S_CATEGORY_SOFTWARE_ERROR\020\t\022\"\n\036MX_STATUS" + + "_CATEGORY_OTHER_ERROR\020\n*\312\002\n\016MxStatusSour" + + "ce\022 \n\034MX_STATUS_SOURCE_UNSPECIFIED\020\000\022\034\n\030" + + "MX_STATUS_SOURCE_UNKNOWN\020\001\022#\n\037MX_STATUS_" + + "SOURCE_REQUESTING_LMX\020\002\022#\n\037MX_STATUS_SOU" + + "RCE_RESPONDING_LMX\020\003\022#\n\037MX_STATUS_SOURCE" + + "_REQUESTING_NMX\020\004\022#\n\037MX_STATUS_SOURCE_RE" + + "SPONDING_NMX\020\005\0221\n-MX_STATUS_SOURCE_REQUE" + + "STING_AUTOMATION_OBJECT\020\006\0221\n-MX_STATUS_S" + + "OURCE_RESPONDING_AUTOMATION_OBJECT\020\007*\335\004\n" + + "\nMxDataType\022\034\n\030MX_DATA_TYPE_UNSPECIFIED\020" + + "\000\022\030\n\024MX_DATA_TYPE_UNKNOWN\020\001\022\030\n\024MX_DATA_T" + + "YPE_NO_DATA\020\002\022\030\n\024MX_DATA_TYPE_BOOLEAN\020\003\022" + + "\030\n\024MX_DATA_TYPE_INTEGER\020\004\022\026\n\022MX_DATA_TYP" + + "E_FLOAT\020\005\022\027\n\023MX_DATA_TYPE_DOUBLE\020\006\022\027\n\023MX" + + "_DATA_TYPE_STRING\020\007\022\025\n\021MX_DATA_TYPE_TIME" + + "\020\010\022\035\n\031MX_DATA_TYPE_ELAPSED_TIME\020\t\022\037\n\033MX_" + + "DATA_TYPE_REFERENCE_TYPE\020\n\022\034\n\030MX_DATA_TY" + + "PE_STATUS_TYPE\020\013\022\025\n\021MX_DATA_TYPE_ENUM\020\014\022" + + "-\n)MX_DATA_TYPE_SECURITY_CLASSIFICATION_" + + "ENUM\020\r\022\"\n\036MX_DATA_TYPE_DATA_QUALITY_TYPE" + + "\020\016\022\037\n\033MX_DATA_TYPE_QUALIFIED_ENUM\020\017\022!\n\035M" + + "X_DATA_TYPE_QUALIFIED_STRUCT\020\020\022)\n%MX_DAT" + + "A_TYPE_INTERNATIONALIZED_STRING\020\021\022\033\n\027MX_" + + "DATA_TYPE_BIG_STRING\020\022\022\024\n\020MX_DATA_TYPE_E" + + "ND\020\023*\243\003\n\022ProtocolStatusCode\022$\n PROTOCOL_" + + "STATUS_CODE_UNSPECIFIED\020\000\022\033\n\027PROTOCOL_ST" + + "ATUS_CODE_OK\020\001\022(\n$PROTOCOL_STATUS_CODE_I" + + "NVALID_REQUEST\020\002\022*\n&PROTOCOL_STATUS_CODE" + + "_SESSION_NOT_FOUND\020\003\022*\n&PROTOCOL_STATUS_" + + "CODE_SESSION_NOT_READY\020\004\022+\n\'PROTOCOL_STA" + + "TUS_CODE_WORKER_UNAVAILABLE\020\005\022 \n\034PROTOCO" + + "L_STATUS_CODE_TIMEOUT\020\006\022!\n\035PROTOCOL_STAT" + + "US_CODE_CANCELED\020\007\022+\n\'PROTOCOL_STATUS_CO" + + "DE_PROTOCOL_VIOLATION\020\010\022)\n%PROTOCOL_STAT" + + "US_CODE_MXACCESS_FAILURE\020\t*\277\002\n\014SessionSt" + + "ate\022\035\n\031SESSION_STATE_UNSPECIFIED\020\000\022\032\n\026SE" + + "SSION_STATE_CREATING\020\001\022!\n\035SESSION_STATE_" + + "STARTING_WORKER\020\002\022\"\n\036SESSION_STATE_WAITI" + + "NG_FOR_PIPE\020\003\022\035\n\031SESSION_STATE_HANDSHAKI" + + "NG\020\004\022%\n!SESSION_STATE_INITIALIZING_WORKE" + + "R\020\005\022\027\n\023SESSION_STATE_READY\020\006\022\031\n\025SESSION_" + + "STATE_CLOSING\020\007\022\030\n\024SESSION_STATE_CLOSED\020" + + "\010\022\031\n\025SESSION_STATE_FAULTED\020\t2\303\005\n\017MxAcces" + + "sGateway\022]\n\013OpenSession\022\'.mxaccess_gatew" + + "ay.v1.OpenSessionRequest\032%.mxaccess_gate" + + "way.v1.OpenSessionReply\022`\n\014CloseSession\022" + + "(.mxaccess_gateway.v1.CloseSessionReques" + + "t\032&.mxaccess_gateway.v1.CloseSessionRepl" + + "y\022T\n\006Invoke\022%.mxaccess_gateway.v1.MxComm" + + "andRequest\032#.mxaccess_gateway.v1.MxComma" + + "ndReply\022X\n\014StreamEvents\022(.mxaccess_gatew" + + "ay.v1.StreamEventsRequest\032\034.mxaccess_gat" + + "eway.v1.MxEvent0\001\022l\n\020AcknowledgeAlarm\022,." + + "mxaccess_gateway.v1.AcknowledgeAlarmRequ" + + "est\032*.mxaccess_gateway.v1.AcknowledgeAla" + + "rmReply\022a\n\014StreamAlarms\022(.mxaccess_gatew" + + "ay.v1.StreamAlarmsRequest\032%.mxaccess_gat" + + "eway.v1.AlarmFeedMessage0\001\022n\n\021QueryActiv" + + "eAlarms\022-.mxaccess_gateway.v1.QueryActiv" + + "eAlarmsRequest\032(.mxaccess_gateway.v1.Act" + + "iveAlarmSnapshot0\001B&\252\002#ZB.MOM.WW.MxGatew" + + "ay.Contracts.Protob\006proto3" }; descriptor = com.google.protobuf.Descriptors.FileDescriptor .internalBuildGeneratedFileFrom(descriptorData, @@ -106353,93 +107168,99 @@ public final class MxaccessGateway extends com.google.protobuf.GeneratedFile { internal_static_mxaccess_gateway_v1_AlarmFeedMessage_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_mxaccess_gateway_v1_AlarmFeedMessage_descriptor, - new java.lang.String[] { "ActiveAlarm", "SnapshotComplete", "Transition", "ProviderStatus", "Payload", }); + new java.lang.String[] { "ActiveAlarm", "SnapshotComplete", "Transition", "ProviderStatus", "SnapshotStatus", "Payload", }); internal_static_mxaccess_gateway_v1_AlarmProviderStatus_descriptor = getDescriptor().getMessageType(86); internal_static_mxaccess_gateway_v1_AlarmProviderStatus_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_mxaccess_gateway_v1_AlarmProviderStatus_descriptor, new java.lang.String[] { "Mode", "Degraded", "Reason", "Since", }); - internal_static_mxaccess_gateway_v1_MxStatusProxy_descriptor = + internal_static_mxaccess_gateway_v1_AlarmSnapshotStatus_descriptor = getDescriptor().getMessageType(87); + internal_static_mxaccess_gateway_v1_AlarmSnapshotStatus_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_mxaccess_gateway_v1_AlarmSnapshotStatus_descriptor, + new java.lang.String[] { "Truncated", }); + internal_static_mxaccess_gateway_v1_MxStatusProxy_descriptor = + getDescriptor().getMessageType(88); internal_static_mxaccess_gateway_v1_MxStatusProxy_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_mxaccess_gateway_v1_MxStatusProxy_descriptor, new java.lang.String[] { "Success", "Category", "DetectedBy", "Detail", "RawCategory", "RawDetectedBy", "DiagnosticText", }); internal_static_mxaccess_gateway_v1_MxValue_descriptor = - getDescriptor().getMessageType(88); + getDescriptor().getMessageType(89); internal_static_mxaccess_gateway_v1_MxValue_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_mxaccess_gateway_v1_MxValue_descriptor, new java.lang.String[] { "DataType", "VariantType", "IsNull", "RawDiagnostic", "RawDataType", "BoolValue", "Int32Value", "Int64Value", "FloatValue", "DoubleValue", "StringValue", "TimestampValue", "ArrayValue", "RawValue", "SparseArrayValue", "Kind", }); internal_static_mxaccess_gateway_v1_MxArray_descriptor = - getDescriptor().getMessageType(89); + getDescriptor().getMessageType(90); internal_static_mxaccess_gateway_v1_MxArray_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_mxaccess_gateway_v1_MxArray_descriptor, new java.lang.String[] { "ElementDataType", "VariantType", "Dimensions", "RawDiagnostic", "RawElementDataType", "BoolValues", "Int32Values", "Int64Values", "FloatValues", "DoubleValues", "StringValues", "TimestampValues", "RawValues", "Values", }); internal_static_mxaccess_gateway_v1_MxSparseArray_descriptor = - getDescriptor().getMessageType(90); + getDescriptor().getMessageType(91); internal_static_mxaccess_gateway_v1_MxSparseArray_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_mxaccess_gateway_v1_MxSparseArray_descriptor, new java.lang.String[] { "ElementDataType", "TotalLength", "Elements", }); internal_static_mxaccess_gateway_v1_MxSparseElement_descriptor = - getDescriptor().getMessageType(91); + getDescriptor().getMessageType(92); internal_static_mxaccess_gateway_v1_MxSparseElement_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_mxaccess_gateway_v1_MxSparseElement_descriptor, new java.lang.String[] { "Index", "Value", }); internal_static_mxaccess_gateway_v1_BoolArray_descriptor = - getDescriptor().getMessageType(92); + getDescriptor().getMessageType(93); internal_static_mxaccess_gateway_v1_BoolArray_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_mxaccess_gateway_v1_BoolArray_descriptor, new java.lang.String[] { "Values", }); internal_static_mxaccess_gateway_v1_Int32Array_descriptor = - getDescriptor().getMessageType(93); + getDescriptor().getMessageType(94); internal_static_mxaccess_gateway_v1_Int32Array_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_mxaccess_gateway_v1_Int32Array_descriptor, new java.lang.String[] { "Values", }); internal_static_mxaccess_gateway_v1_Int64Array_descriptor = - getDescriptor().getMessageType(94); + getDescriptor().getMessageType(95); internal_static_mxaccess_gateway_v1_Int64Array_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_mxaccess_gateway_v1_Int64Array_descriptor, new java.lang.String[] { "Values", }); internal_static_mxaccess_gateway_v1_FloatArray_descriptor = - getDescriptor().getMessageType(95); + getDescriptor().getMessageType(96); internal_static_mxaccess_gateway_v1_FloatArray_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_mxaccess_gateway_v1_FloatArray_descriptor, new java.lang.String[] { "Values", }); internal_static_mxaccess_gateway_v1_DoubleArray_descriptor = - getDescriptor().getMessageType(96); + getDescriptor().getMessageType(97); internal_static_mxaccess_gateway_v1_DoubleArray_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_mxaccess_gateway_v1_DoubleArray_descriptor, new java.lang.String[] { "Values", }); internal_static_mxaccess_gateway_v1_StringArray_descriptor = - getDescriptor().getMessageType(97); + getDescriptor().getMessageType(98); internal_static_mxaccess_gateway_v1_StringArray_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_mxaccess_gateway_v1_StringArray_descriptor, new java.lang.String[] { "Values", }); internal_static_mxaccess_gateway_v1_TimestampArray_descriptor = - getDescriptor().getMessageType(98); + getDescriptor().getMessageType(99); internal_static_mxaccess_gateway_v1_TimestampArray_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_mxaccess_gateway_v1_TimestampArray_descriptor, new java.lang.String[] { "Values", }); internal_static_mxaccess_gateway_v1_RawArray_descriptor = - getDescriptor().getMessageType(99); + getDescriptor().getMessageType(100); internal_static_mxaccess_gateway_v1_RawArray_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_mxaccess_gateway_v1_RawArray_descriptor, new java.lang.String[] { "Values", }); internal_static_mxaccess_gateway_v1_ProtocolStatus_descriptor = - getDescriptor().getMessageType(100); + getDescriptor().getMessageType(101); internal_static_mxaccess_gateway_v1_ProtocolStatus_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_mxaccess_gateway_v1_ProtocolStatus_descriptor, diff --git a/clients/java/zb-mom-ww-mxgateway-cli/src/main/java/com/zb/mom/ww/mxgateway/cli/MxGatewayCli.java b/clients/java/zb-mom-ww-mxgateway-cli/src/main/java/com/zb/mom/ww/mxgateway/cli/MxGatewayCli.java index 3fe632e..e4e7649 100644 --- a/clients/java/zb-mom-ww-mxgateway-cli/src/main/java/com/zb/mom/ww/mxgateway/cli/MxGatewayCli.java +++ b/clients/java/zb-mom-ww-mxgateway-cli/src/main/java/com/zb/mom/ww/mxgateway/cli/MxGatewayCli.java @@ -48,6 +48,7 @@ import mxaccess_gateway.v1.MxaccessGateway.AcknowledgeAlarmReply; import mxaccess_gateway.v1.MxaccessGateway.AcknowledgeAlarmRequest; import mxaccess_gateway.v1.MxaccessGateway.ActiveAlarmSnapshot; import mxaccess_gateway.v1.MxaccessGateway.AlarmProviderStatus; +import mxaccess_gateway.v1.MxaccessGateway.AlarmSnapshotStatus; import mxaccess_gateway.v1.MxaccessGateway.AlarmFeedMessage; import mxaccess_gateway.v1.MxaccessGateway.BulkReadResult; import mxaccess_gateway.v1.MxaccessGateway.BulkWriteResult; @@ -2282,7 +2283,8 @@ public final class MxGatewayCli implements Callable { /** * Renders one {@link AlarmFeedMessage} in the CLI's plain-text output * style, distinguishing the active-alarm snapshot, snapshot-complete - * sentinel, and transition cases of the message's {@code payload} oneof. + * sentinel, transition, provider-status, and snapshot-status cases of the + * message's {@code payload} oneof. */ private static String formatAlarmFeedMessage(AlarmFeedMessage message) { return switch (message.getPayloadCase()) { @@ -2307,6 +2309,10 @@ public final class MxGatewayCli implements Callable { "provider-status mode=%s degraded=%b reason=%s", status.getMode().name(), status.getDegraded(), status.getReason()); } + case SNAPSHOT_STATUS -> { + AlarmSnapshotStatus status = message.getSnapshotStatus(); + yield String.format("snapshot-status truncated=%b", status.getTruncated()); + } case PAYLOAD_NOT_SET -> "unknown"; }; } diff --git a/clients/proto/descriptors/mxaccessgw-client-v1.protoset b/clients/proto/descriptors/mxaccessgw-client-v1.protoset index fe740013a3b4bef4f16385b73edb061763e136d3..30a8c97c340245ff050d2dc488b98ae93ab7cfd7 100644 GIT binary patch delta 7819 zcmZ{p{cl{=na5|Y@64QY?Y#Ip3Bh^ck`R)BZD^r?K&7feRBWrV3yuSr@pv51V$WDJ z6WHvky0n3$Evsf#vo&p2z_v|75(qCTNuYu7RzYc+H=wX9Ah6|~R{H~#s$tda=Q%IA zpw&wGA)h(l=RD`-d7g9b@%J7q9XMEe;G(|p)b|R}%pY&apSAb$zL6_}+dKB|*>Guo zetcy#r&TXcwZ|1Gy7rhj(_^^CDFI{bVQ}NkjtIed-snoe=zvAn)$=! z`8R@_)&3)2%YQ3ac_bf&;ok*e9G)(PeZ7bBiFeXpX-rN{RNK{hwbh!r^NRcz(kQ9k zSZ!`dD&yt)x@yuGOWNbr#EqfWs3)|J)++73q}50!7*_K4jat3hY$X%bazbx}hTGe(kS>BM0RFhiW`yYs+Sy6#OreVIknwxlyS_G=p2hl6o;}PvGYTiPR z^m>b0v^eUEl-SaG>&))I$q)43s)C{u<>gmZn&T0hTUFeHjhF;+xM`;N_547(Nd?Mj zq@ztrdy@c@O=4n42yIru`A*xx2*E`jG2N^dpXDsI_b5iDatTxUn`` zZMx7+#+v2HY9D(w)@Tw1L_(!p8Ly7IEgd#n%07#%wR+~gEAq?JGXYYrqgz+5)f2+z zvr!fO|6!H<*Uh&}4Aqlz(yUe*^-67`%KxSs%{GCQjMm1+s?BP>oy8$;B5NY!TbB}( zHTqgifCRTA4tYyF7*f%tE%Z%+{BDaK_&+`5g3_f`vQlP?T#LsDiXTQUQ)oRT%Q`Z~LW zs|S)RYRzVY-lTD=+U%D_XfnYsn;bIx=d*WUtl5|xJ~M@3+5Xn}V57|@-B@J|{4=9; z(Lug4z9?Z;Tk9t!Wh>=6>r!qpx$+3(rzxukW+~*ysm8CkRt8wZn(8-J!Y{yRM|{?NH|=&KA1ISK`5-gAs#%#2uL4qtt9?+F``qu`}fa z+o^)HU1NwT=uN{E+nq|y^Uc`qRA()8wupDBz>le5(c2a<-KCU0bOwV0rn^+HJxT^; zdb|Bm0$~c;8V_Q+TWOAxlmiULcDI}*oKScv?oqi%?cNo{%N|vjFC!`xWasWz!3r6! z5RIVO4ndaqezp8Or={@$x8O9&Q3RUF2%>#Jos*gshQSB3R@n{E%uO0itDPIjXdlWt zmgNV1#~o-Nayy5X<=>lWyUmDMrC+F^-_1^@4zBV@$G=b)_PN=yzz=6y zSy9kyi)bItw52%Qr-BPzM}YP z$g~uM9a$#uB9CaFR$sit4VVykCeum?fEPu*vie060?$}+5Uz=f&#K&i&b&U9Uz}ew z^XX82$=n6fYq-Xg!{^l5y)&!U<}VwtSHm@d1n%?x)(6u2^QvSE63Ajbue#%z`>;vP z>eG`{qQkxtf!G|D5^ep2*c?_1&yHqOu-B+uTs)$J|4<#aS;?*+QL0NOM_+VxRE4(2 zK^ASX0nr{++Kn|eh3cqUU~AkODOAT)XlpivEvVfvWKEB$$d5|u)G@WN*STd)k7uSO zOhIodOME;tEn#{b)706LWhXLQg)Qi9CFxFNwhG%5nOl)8$rZ1>osjRY4Q9K#GnAt|yg5Fkg^2N+H!uG|?wlfZ2QsE_TWja|m(2t@M)0fmz zQ@ZfeiRnw~;xEpeyf(i$?Q}L>h<>NK{Mfn>{VwZ&Rvf;ZZQ?A32Kp75h3U&G@&Pvs z)0eY7oE?X+sPF>kW;R0uyFJPo_lkcJ zq|14Fk`n~9dj!(cN!4j52h!6?#TT!n4M_;J0>kXytb|5xt zcYqIx+c#CP%ylf;3fi-uMoiyS%I-dh>6u>rmqAS5R!b9` zazg>>`c7tB!WQ(llCJM$wvw*zVCzOqw!WL0DojCdD%tvOW-8hGZf2_EG<;8m=1^qF z8e7m_FF|bIQ*-@7O1i$M5_5bZ=E!_MGmS6>y{TmD`-(80+4_MBSIeTN^d#vD z+nXwg?FXvI4@%PY19ko?H`}f_{LrWNP|$@b=;L0J_(L_zM~x)$hmypb0@7)1T>MDo z{>(@ApYzGp&04$K->A=g>AL(!>00bQk^(O=uvT*GW1m|PK0xaOMEkMNEf60c``lV9 zA^#_zTM*F%+Motat4l2q(?3aSrPeLE^@+Q%FbD~9(B>A%C_Yi0_JjiI>JzodE)qyr zpV;e65MC1(|DtmLbct4`Z3i0x_R4u23Yr#bxTDG0BNi{H_?Tb!5cP<}@%`_XZo zIN7M(hXaI@6t-Sqylm8+_R|N%cBAgL5e4F9qc(LY2#4e1CY}4P^D>NbllL+#UN(C# z5MDs*1jNZ^?_@Yg#mi>zg=V~L_Fk@!i{IC|e|BE3NBMp4<$CdQoA(0Y1+-p3yxiu! zfSBIqoq#yG%{t+tSB{H6(7AtcUdl*+pp|{tDvOsb+C9BNcmb^!5HDM_EBYX&TXbw+ z;y}D?(e~>p9EpoR)VbT8lM$3ZG)_{YYec+EdoK`PK%e40bVms}=N$iHFtuJ_0(nMv+S3@sc1Eu--zFi5ml-{9kqNQU zxcC#D`#0xh6y;B}nrpm_ikGc^TOhoE)(OZ|w)$-W^AzE&eqUg`Y;~JoD8;U+@;+I1VkffKOjJ=$z9rgKa`|g+^y|nB$kq)pt(4MseEwWtxfWT zF!b-4SZqNrwykHhjP|FQR*r4ZYvp6(r&+(O!_P9UoYNp$KD6;F9~(c*#H`ZKwS60) zQBGdayafoN{kgVp0U+D9Et|R=wV=7dNF&;9+TLJ5PTK96R+e;onu+Cmb9*M{Y~7&) z6U>;(VG5dyo*>#CdV#5|AXndewENzN(1PZ?mqxVrX#3s*a(M34?qihom*WyPC#|$1 z-l^?L3vyiU$~uVjgnPay;(NR!z=B&=0r^?QU(qF3@tRy;lcc@ar$v zSlE7v(~9_BJ#evvG-9r?_i6iGE`%1eAIKou`?UE$7VR9KMY7q=K@0lH%|W{-o7`NU zMOc6PYEla3BECNh>bZ#T*URjyNh#>&T|~P#2na2>Qj!_3-Dn@s7uYul_K{bTtfLq$ zXl`z3W3&%ydvhz4(x8WTk!+uP5QFAIg186qLwdgKa}ZYJ;=?+3z~y}v<-@+ZR3#(# zY5Tn&LWCt~->*Ql`}BN!c?8LveR}Z{dQC&rwC;CtC`9;!_T~VZR&7ru5ZnFQz9$w` zTzpjLe&uR}#OR~CV1rW0h<@pp2%-@*7v}=V#D1w)oNq3nFs%pO@P#beB?A#3wBrqF zg&y<40-*)XvyC*GR`+V7xXNrB7*PKn*B9D-Q*!M&l!>KCfL<&$;!vh# zk)F`Ofa^(W1ZeJ+3_@ze6S}Y81TYT(JZ1QxgwTTaX(ojcKdIf@4BryGW$3`11N0g5#Y+yGva5o{bN``$HixL z?u6S`kv^*n=Au;4vaQeg^n+*wZLI<6<~d($v~10->uQRL delta 6423 zcmYM2S&&x67017?=id9B{=ONQxdX^D!zzm~ftN+HVY;T(Ern2~|QTwgbo2_PBc2m8~zG}#nW_vTsZZfqp zyG=}Qv!j_S6%M;2qPI}Bp^G50FiHPk+nKnJxLYu_+rRg_q zL=47=+c4cEGA5X|IdNAROtUiEEM`(@%rFI`X;xvoS!7&n#&)w@H8I#C-XbQ(lzWV} zIi_1gt_r3(rdwpP&#itP-qx5~5T>ACbr937V#%$F)Pu3zs>#LL;iY&$YPlU8RGjM@V2_M~l;*$y!aLPrg>p!=;VyfzT;kZb0Lj-|{VOFao4Ei?Y})wP!*K=-75k z?utTQ=+FCPbOO-`PIcXYbn~RlnCapxbQzx#Gc7b~3V@R%qOG2i-l;(h?uh{wMr}d& zzv5L>V2`-+l7Xba-lWwO0Han@U~kfr0{fCyQveLw%4CT5B{3=RbP{U{fU)Bo?bAt1 z3hWniLl}-u6SycM+WoTl`YQfuhj!4IZh|JQ6Oqv`_X*?8WA8nnH9+E251lTp(@xfM$=OLLm zDcCZY!?6Gk82wQ|zwdyU9+rkLfFP!aB^1B`r6b{&!>!g%&{v`XQ|Zzj5$mfM%}yPv z*ns}MqbX!9o}e#)G-5ic+ln82hUutAJVqx%_@qDwv*3rqqe&CG#hZ0b?-*n?zh`+GyQ) zURrStEVj?fWZexkguy2Zh5dzrnM#O>IEtFO0dpy+}Qs-IUSb46K+A%Y!l zOd#4K2ZJtI^78EVjw`mZJ12Bu&% z)y#h_nQG?0mQ2a~*ORGW3XXBblb|&9Ur)B0`mZNjQvVIf+@6TmVhj4yC5Y)8(i!Jb zGye^l?shN4Wd57Uw23JgP09Qpz+c;H>c5$6N&UAZyC%%4ratHos)I&T|1If`L22f{ zC3EHtpIK4w>GQ>W&}fdoEge3`K}2tBj;}Lh+s$S1j@14&`u3W7yu8ny@!)AzLCR^Bap#My8d zp(o95&}TPD6lbO7_I_=ptFto2&j3hQXZ=ydWJ}88eW`sI_P-@4-`8WVI$5G)I~O-1 zhyc%hy@|ny&x!R}1=8&~-H9eRTN*zQGj66#|Jj;VKU(!uAKMb6*9aPXg#ewd=@%NL zlMnn2#AHj$;v=bj9AaCF@*|O|%LTVogF7ELXNVa9y%&&J&r8d93u1d-I{jV^;^n;G zt4+47EIyIizk`=$C_fSL7m8)-UXDmjj4K&|eNfs>xk8+zlF9F7CGe z=>bdqLqYfNfR$b*@3#J+3q!w8VzmXM*tdSICE9zER!^f~)apgzp42b%aBtG;@e@SL zB^s}Kk+?UBnWg)zzxUIq+bZbp`HE=ov;LkBvTWs@j~60>n`w8kYfrn*sr?&zb4cB7r(Dl5oFxygpRJcJf>d$~5E-DLe+3dqj5 z*@lZI^RK5s*lnZQig>g2+bGCZxFvP0dmk9rxrKI%?RAedXgT$5O|zz3AQ%H~N4wSf zV>nuldBfIxBhJ4b>|lS(rWNt9U3i_QG-A$m_gjDGRzeH<%P)xbe(Ns3svXOdM;hH& zv|t?EShNqM!FBTF!TkFdk%s9+ye%blC*o~(rhgG>m@eKtYT4ktdeJtdm66p{6lLP2l zt>2YEY#+1T<20gN%3_zTJrin#=IAb)`=k_&=!rN*5RKqWH)9|Jd&171Q@J%34Pkc( zKZiW}DFYGj_VH%4LQlqIfzX2PNk$u8Yj}|nJ)ArhmkmM-&I>_MBPw`-UpLWX&z>aK zA^}FR)`&ex%Ovf!W?|?_YXs=dj0B-IVz2GHHVlr%*cX$Mt2bKEKf6>g;(a!}yKqJ3 zox&Qo573hq3D7^ofM}n#GiQa4sS*2A5IX;03_@$f{uBf?;(#@MAz-Z$;9Pf!#*Y?> z19tubIySj2i-WdyGAye~58B)vlya-fIud_Bh(^%Y8jx;AVy&^dG>78v2YK`*4McmW zvhL|Jqhs)J95{p+^aBT7YZ$n74-@gvh0q>JF=^>PV#8aebq^7#(Y-vRfGb_r(G)Su z`dnOd>q Value { } /// Render a streamed [`AlarmFeedMessage`] as a terse one-line summary that -/// distinguishes the four `payload` oneof cases. +/// distinguishes the five `payload` oneof cases. fn alarm_feed_message_summary(message: &AlarmFeedMessage) -> String { match &message.payload { Some(alarm_feed_message::Payload::ActiveAlarm(snapshot)) => { @@ -2259,6 +2259,9 @@ fn alarm_feed_message_summary(message: &AlarmFeedMessage) -> String { status.reason ) } + Some(alarm_feed_message::Payload::SnapshotStatus(status)) => { + format!("snapshot-status truncated={}", status.truncated) + } None => "(empty)".to_owned(), } } @@ -2308,6 +2311,11 @@ fn alarm_feed_message_to_json(message: &AlarmFeedMessage) -> Value { })), } }), + Some(alarm_feed_message::Payload::SnapshotStatus(status)) => json!({ + "snapshotStatus": { + "truncated": status.truncated, + } + }), None => Value::Null, } } diff --git a/clients/rust/protos/mxaccess_gateway.proto b/clients/rust/protos/mxaccess_gateway.proto index 0ee3fb2..b5e2a6b 100644 --- a/clients/rust/protos/mxaccess_gateway.proto +++ b/clients/rust/protos/mxaccess_gateway.proto @@ -1018,6 +1018,10 @@ message AlarmFeedMessage { // Provider-mode status. Emitted once on stream open and again on every // failover/failback so late joiners learn the current mode immediately. AlarmProviderStatus provider_status = 4; + // Snapshot-completeness status. Emitted once on stream open and again on + // every change of the truncation verdict, so late joiners learn whether the + // feed's active-alarm set may be incomplete. + AlarmSnapshotStatus snapshot_status = 5; } } @@ -1028,6 +1032,23 @@ message AlarmProviderStatus { google.protobuf.Timestamp since = 4; } +// Feed-level snapshot-completeness status. Emitted once on StreamAlarms open +// (after the initial provider_status frame, before the cached active_alarm +// frames) so late joiners learn the current verdict, and again on every change +// of the truncation verdict — when a reconcile reports a different verdict, and +// when the gateway's alarm monitor restarts and drops a truncated verdict with +// the cache generation it described (feed subscribers outlive that monitor +// session, so they are sent the clearing frame). Mirrors the per-record +// ActiveAlarmSnapshot.from_truncated_snapshot caveat at feed level so live +// consumers can reason about completeness without polling QueryActiveAlarms. +message AlarmSnapshotStatus { + // True while the monitor's cached active-alarm set derives from a truncated + // (capped) worker fetch — the set may be missing alarms. Distinct from + // provider degradation (AlarmProviderStatus.degraded), which describes the + // fidelity of the records rather than the completeness of the set. + bool truncated = 1; +} + message MxStatusProxy { // Mirrors the `success` member of the MXAccess MXSTATUS_PROXY struct // (a 16-bit signed value in the COM struct, widened to int32 on the diff --git a/docs/GatewayDashboardDesign.md b/docs/GatewayDashboardDesign.md index f121526..bfc7fdb 100644 --- a/docs/GatewayDashboardDesign.md +++ b/docs/GatewayDashboardDesign.md @@ -273,7 +273,7 @@ bearer). Each hub class is `[Authorize(Policy = HubClientsPolicy)]`. | Hub | Path | Producer | Payload | Routing | |---|---|---|---|---| | `DashboardSnapshotHub` | `/hubs/snapshot` | `DashboardSnapshotPublisher` (BackgroundService consuming `IDashboardSnapshotService.WatchSnapshotsAsync`) | `DashboardSnapshot` | Sent to all connected clients on every snapshot tick, but only while at least one client is connected (see "Idle gating" below); new connections receive the current snapshot synchronously in `OnConnectedAsync`. | -| `AlarmsHub` | `/hubs/alarms` | `AlarmsHubPublisher` (BackgroundService consuming `IGatewayAlarmService.StreamAsync(filter: null)`) | `AlarmFeedMessage` (`active_alarm` / `snapshot_complete` / `transition`) | Connected clients auto-join `__alarms__`; all clients receive every message. Publisher auto-reconnects every 5s on stream faults. The alarm value fields (`current_value` / `limit_value`) are stripped from a deep-cloned copy of the message when `Dashboard:ShowTagValues` is false (the default) — on both value-bearing payload arms, so neither a live transition nor a snapshot record leaks a process value; every other field still renders. The source message is never mutated: it fans out from the same feed to gRPC `StreamAlarms` subscribers, which this dashboard-display flag does not govern. Arms carrying no value are forwarded as-is, uncloned. | +| `AlarmsHub` | `/hubs/alarms` | `AlarmsHubPublisher` (BackgroundService consuming `IGatewayAlarmService.StreamAsync(filter: null)`) | `AlarmFeedMessage` (`active_alarm` / `snapshot_complete` / `transition` / `provider_status` / `snapshot_status`) | Connected clients auto-join `__alarms__`; all clients receive every message. Publisher auto-reconnects every 5s on stream faults. The alarm value fields (`current_value` / `limit_value`) are stripped from a deep-cloned copy of the message when `Dashboard:ShowTagValues` is false (the default) — on both value-bearing payload arms, so neither a live transition nor a snapshot record leaks a process value; every other field still renders. The source message is never mutated: it fans out from the same feed to gRPC `StreamAlarms` subscribers, which this dashboard-display flag does not govern. Arms carrying no value are forwarded as-is, uncloned. | | `EventsHub` | `/hubs/events` | `DashboardEventBroadcaster` invoked by each session's internal dashboard-mirror subscriber on its `SessionEventDistributor` (registered when the session becomes Ready) | `MxEvent` | Clients call `SubscribeSession(sessionId)` to join `session:{id}`, which also registers them in `EventsHubViewerRegistry` — the mirror is gated on that registry, which counts hub and in-process viewers alike (see "Mirror gating" below). The dashboard is a first-class distributor subscriber, so it receives the session's events whether or not a gRPC client is streaming. It sees RAW session events — not the per-gRPC-subscriber `AfterWorkerSequence` filtering that `EventStreamService` applies at its own boundary — because the dashboard is a separate LDAP-authenticated monitoring view meant to show the session's full event activity. Tag values are stripped from the mirrored `MxEvent` copy by `DashboardEventBroadcaster` when `Dashboard:ShowTagValues` is false (the default) — event metadata (tag reference, quality, status, timestamps) still renders, but the value fields are blanked, so no value leaks through this seam. `SubscribeSession` is gated by `IDashboardSessionAcl` (SEC-25 / TST-15): a denied caller gets a `HubException`, is not joined to the group, and is not registered as a viewer, so the mirror stays off for a session nobody is legitimately watching. The same ACL gates the in-process seam the session-details page uses, so neither path is the weaker one. Value redaction remains an independent layer — it bounds what a *permitted* subscriber sees. | ### Default cadences @@ -652,6 +652,11 @@ Show read-only effective configuration: - auth mode, - SQLite auth database path with sensitive parts redacted if needed, - dashboard enabled state, +- the LDAP group mappings that decide what a signed-in user may see — + `Dashboard:GroupToRole` (group → `Administrator` / `Viewer`) and + `Dashboard:GroupToTag` (group → the session tags it grants), +- `Dashboard:UntaggedSessionVisibility`, which decides who sees a session whose + owning API key carries no dashboard tags, - protocol version. Do not show API key secrets or pepper values.