Repository: Tochemey/goakt
Pull request #566 (2024-12-16 19:32:27)

feat: add ActorSuspended event to the events stream

codecov[bot]: ## [Codecov](https://app.codecov.io/gh/Tochemey/goakt/pull/566?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Arsene) Report
All modified and coverable lines are covered by tests :white_check_mark:
> Project coverage is 87.26%. Comparing base [(`bb51647`)](https://app.codecov.io/gh/Tochemey/goakt/commit/bb51647ce7ddca4c145ed98322766fed454f401e?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Arsene) to head [(`abbd063`)](https://app.codecov.io/gh/Tochemey/goakt/commit/abbd0634b6d15ce055c1a220f2c5a218f5b756d6?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Arsene).

<details><summary>Additional details and impacted files</summary>


```diff
@@            Coverage Diff             @@
##             main     #566      +/-   ##
==========================================
- Coverage   87.40%   87.26%   -0.15%     
==========================================
  Files          54       54              
  Lines        5123     5129       +6     
==========================================
- Hits         4478     4476       -2     
- Misses        510      516       +6     
- Partials      135      137       +2     
```

</details>

[:umbrella: View full report in Codecov by Sentry](https://app.codecov.io/gh/Tochemey/goakt/pull/566?dropdown=coverage&src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Arsene).   
:loudspeaker: Have feedback on the report? [Share it here](https://about.codecov.io/codecov-pr-comment-feedback/?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Arsene).


Patch:
diff --git a/README.md b/README.md
index 78e1782..3ef92aa 100644
--- a/README.md
+++ b/README.md
@@ -241,7 +241,8 @@ The subscription methods can be found on the `ActorSystem` interface.
 - [`ActorStopped`](./protos/goakt/goakt.proto): emitted when an actor has stopped
 - [`ActorPassivated`](./protos/goakt/goakt.proto): emitted when an actor is passivated
 - [`ActorChildCreated`](./protos/goakt/goakt.proto): emitted when a child actor is created
-- [`ActorRestarted`](./protos/goakt/events/v1/events.proto): emitted when an actor has restarted
+- [`ActorRestarted`](./protos/goakt/goakt.proto): emitted when an actor has restarted
+- [`ActorSuspended`](./protos/goakt/goakt.proto): emitted when an actor has been suspended
 - [`NodeJoined`](./protos/goakt/goakt.proto): cluster event emitted when a node joins the cluster. This only happens when cluster mode is enabled
 - [`NodeLeft`](./protos/goakt/goakt.proto): cluster event emitted when a node leaves the cluster. This only happens when cluster mode is enabled
 - [`Deadletter`](./protos/goakt/goakt.proto): emitted when a message cannot be delivered or that were not handled by a given actor.
diff --git a/actors/actor_system.go b/actors/actor_system.go
index 03267e5..942d4ba 100644
--- a/actors/actor_system.go
+++ b/actors/actor_system.go
@@ -108,7 +108,8 @@ type ActorSystem interface {
 	InCluster() bool
 	// GetPartition returns the partition where a given actor is located
 	GetPartition(actorName string) uint64
-	// Subscribe creates an event subscriber.
+	// Subscribe creates an event subscriber to consume events from the actor system.
+	// Remember to use the Unsubscribe method to avoid resource leakage.
 	Subscribe() (eventstream.Subscriber, error)
 	// Unsubscribe unsubscribes a subscriber.
 	Unsubscribe(subscriber eventstream.Subscriber) error
@@ -422,7 +423,8 @@ func (x *actorSystem) RemoteScheduleWithCron(ctx context.Context, message proto.
 	return x.scheduler.RemoteScheduleWithCron(ctx, message, address, cronExpression)
 }
 
-// Subscribe help receive dead letters whenever there are available
+// Subscribe creates an event subscriber to consume events from the actor system.
+// Remember to use the Unsubscribe method to avoid resource leakage.
 func (x *actorSystem) Subscribe() (eventstream.Subscriber, error) {
 	if !x.started.Load() {
 		return nil, ErrActorSystemNotStarted
diff --git a/actors/pid.go b/actors/pid.go
index 777571c..29ad7a6 100644
--- a/actors/pid.go
+++ b/actors/pid.go
@@ -1565,7 +1565,7 @@ func (pid *PID) notifyParent(err error) {
 	strategy, ok := pid.supervisorStrategies.Get(err)
 	if !ok {
 		pid.logger.Debugf("no supervisor directive found for error: %s", errorType(err))
-		pid.suspend()
+		pid.suspend(err.Error())
 		return
 	}
 
@@ -1593,7 +1593,7 @@ func (pid *PID) notifyParent(err error) {
 		}
 	default:
 		pid.logger.Debugf("unknown directive: %T found for error: %s", d, errorType(err))
-		pid.suspend()
+		pid.suspend(err.Error())
 		return
 	}
 
@@ -1749,11 +1749,17 @@ func (pid *PID) childAddress(name string) *address.Address {
 }
 
 // suspend puts the actor in a suspension mode.
-func (pid *PID) suspend() {
+func (pid *PID) suspend(reason string) {
 	pid.logger.Infof("%s going into suspension mode", pid.Name())
 	pid.suspended.Store(true)
 	// stop passivation loop
 	pid.haltPassivationLnr <- types.Unit{}
 	// stop the supervisor loop
 	pid.supervisionStopSignal <- types.Unit{}
+	// publish an event to the events stream
+	pid.eventsStream.Publish(eventsTopic, &goaktpb.ActorSuspended{
+		Address:     pid.Address().Address,
+		SuspendedAt: timestamppb.Now(),
+		Reason:      reason,
+	})
 }
diff --git a/bench/benchpb/benchmark.pb.go b/bench/benchpb/benchmark.pb.go
index 852e2a3..6aaa9d4 100644
--- a/bench/benchpb/benchmark.pb.go
+++ b/bench/benchpb/benchmark.pb.go
@@ -1,6 +1,6 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.35.2
+// 	protoc-gen-go v1.36.0
 // 	protoc        (unknown)
 // source: benchmark/benchmark.proto
 
@@ -21,9 +21,9 @@ const (
 )
 
 type BenchTell struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
+	state         protoimpl.MessageState `protogen:"open.v1"`
 	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *BenchTell) Reset() {
@@ -57,9 +57,9 @@ func (*BenchTell) Descriptor() ([]byte, []int) {
 }
 
 type BenchRequest struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
+	state         protoimpl.MessageState `protogen:"open.v1"`
 	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *BenchRequest) Reset() {
@@ -93,9 +93,9 @@ func (*BenchRequest) Descriptor() ([]byte, []int) {
 }
 
 type BenchResponse struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
+	state         protoimpl.MessageState `protogen:"open.v1"`
 	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *BenchResponse) Reset() {
@@ -129,9 +129,9 @@ func (*BenchResponse) Descriptor() ([]byte, []int) {
 }
 
 type Ping struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
+	state         protoimpl.MessageState `protogen:"open.v1"`
 	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *Ping) Reset() {
@@ -165,9 +165,9 @@ func (*Ping) Descriptor() ([]byte, []int) {
 }
 
 type Pong struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
+	state         protoimpl.MessageState `protogen:"open.v1"`
 	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *Pong) Reset() {
@@ -201,12 +201,11 @@ func (*Pong) Descriptor() ([]byte, []int) {
 }
 
 type BenchPriorityMailbox struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
+	state protoimpl.MessageState `protogen:"open.v1"`
 	// Specifies the message priority
-	Priority int64 `protobuf:"varint,1,opt,name=priority,proto3" json:"priority,omitempty"`
+	Priority      int64 `protobuf:"varint,1,opt,name=priority,proto3" json:"priority,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *BenchPriorityMailbox) Reset() {
diff --git a/goaktpb/goakt.pb.go b/goaktpb/goakt.pb.go
index 69362ee..4e2a057 100644
--- a/goaktpb/goakt.pb.go
+++ b/goaktpb/goakt.pb.go
@@ -1,6 +1,6 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.35.2
+// 	protoc-gen-go v1.36.0
 // 	protoc        (unknown)
 // source: goakt/goakt.proto
 
@@ -24,10 +24,7 @@ const (
 
 // Address represents an actor address
 type Address struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
+	state protoimpl.MessageState `protogen:"open.v1"`
 	// Specifies the remote host address
 	Host string `protobuf:"bytes,1,opt,name=host,proto3" json:"host,omitempty"`
 	// Specifies the remote port
@@ -39,7 +36,9 @@ type Address struct {
 	// Specifies the actor system
 	System string `protobuf:"bytes,5,opt,name=system,proto3" json:"system,omitempty"`
 	// Specifies the parent address
-	Parent *Address `protobuf:"bytes,6,opt,name=parent,proto3" json:"parent,omitempty"`
+	Parent        *Address `protobuf:"bytes,6,opt,name=parent,proto3" json:"parent,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *Address) Reset() {
@@ -116,10 +115,7 @@ func (x *Address) GetParent() *Address {
 
 // Deadletter defines the deadletter event
 type Deadletter struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
+	state protoimpl.MessageState `protogen:"open.v1"`
 	// Specifies the sender's address
 	Sender *Address `protobuf:"bytes,1,opt,name=sender,proto3" json:"sender,omitempty"`
 	// Specifies the actor address
@@ -130,7 +126,9 @@ type Deadletter struct {
 	// Specifies the message send time
 	SendTime *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=send_time,json=sendTime,proto3" json:"send_time,omitempty"`
 	// Specifies the reason why the deadletter
-	Reason string `protobuf:"bytes,5,opt,name=reason,proto3" json:"reason,omitempty"`
+	Reason        string `protobuf:"bytes,5,opt,name=reason,proto3" json:"reason,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *Deadletter) Reset() {
@@ -200,14 +198,13 @@ func (x *Deadletter) GetReason() string {
 
 // ActorStarted defines the actor started event
 type ActorStarted struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
+	state protoimpl.MessageState `protogen:"open.v1"`
 	// Specifies the actor address
 	Address *Address `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"`
 	// Specifies the started time
-	StartedAt *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=started_at,json=startedAt,proto3" json:"started_at,omitempty"`
+	StartedAt     *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=started_at,json=startedAt,proto3" json:"started_at,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *ActorStarted) Reset() {
@@ -256,14 +253,13 @@ func (x *ActorStarted) GetStartedAt() *timestamppb.Timestamp {
 
 // ActorStopped defines the actor stopped event
 type ActorStopped struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
+	state protoimpl.MessageState `protogen:"open.v1"`
 	// Specifies the actor address
 	Address *Address `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"`
 	// Specifies the stop time
-	StoppedAt *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=stopped_at,json=stoppedAt,proto3" json:"stopped_at,omitempty"`
+	StoppedAt     *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=stopped_at,json=stoppedAt,proto3" json:"stopped_at,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *ActorStopped) Reset() {
@@ -312,14 +308,13 @@ func (x *ActorStopped) GetStoppedAt() *timestamppb.Timestamp {
 
 // ActorPassivated define the actor passivated event
 type ActorPassivated struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
+	state protoimpl.MessageState `protogen:"open.v1"`
 	// Specifies the actor address
 	Address *Address `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"`
 	// Specifies the passivation time
-	PassivatedAt *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=passivated_at,json=passivatedAt,proto3" json:"passivated_at,omitempty"`
+	PassivatedAt  *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=passivated_at,json=passivatedAt,proto3" json:"passivated_at,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *ActorPassivated) Reset() {
@@ -368,16 +363,15 @@ func (x *ActorPassivated) GetPassivatedAt() *timestamppb.Timestamp {
 
 // ActorChildCreated defines the child actor created event
 type ActorChildCreated struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
+	state protoimpl.MessageState `protogen:"open.v1"`
 	// Specifies the actor address
 	Address *Address `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"`
 	// Specifies the parent address
 	Parent *Address `protobuf:"bytes,2,opt,name=parent,proto3" json:"parent,omitempty"`
 	// Specifies the started time
-	CreatedAt *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"`
+	CreatedAt     *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *ActorChildCreated) Reset() {
@@ -433,14 +427,13 @@ func (x *ActorChildCreated) GetCreatedAt() *timestamppb.Timestamp {
 
 // ActorRestarted defines the actor restarted event
 type ActorRestarted struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
+	state protoimpl.MessageState `protogen:"open.v1"`
 	// Specifies the actor address
 	Address *Address `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"`
-	// Specifies the stop time
-	RestartedAt *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=restarted_at,json=restartedAt,proto3" json:"restarted_at,omitempty"`
+	// Specifies the restarted time
+	RestartedAt   *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=restarted_at,json=restartedAt,proto3" json:"restarted_at,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *ActorRestarted) Reset() {
@@ -487,21 +480,84 @@ func (x *ActorRestarted) GetRestartedAt() *timestamppb.Timestamp {
 	return nil
 }
 
-// NodeJoined defines the node joined event
-type NodeJoined struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
+// ActorSuspended defines the actor suspended event
+type ActorSuspended struct {
+	state protoimpl.MessageState `protogen:"open.v1"`
+	// Specifies the actor address
+	Address *Address `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"`
+	// Specifies the suspended time
+	SuspendedAt *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=suspended_at,json=suspendedAt,proto3" json:"suspended_at,omitempty"`
+	// Specifies the suspension reason
+	Reason        string `protobuf:"bytes,3,opt,name=reason,proto3" json:"reason,omitempty"`
 	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *ActorSuspended) Reset() {
+	*x = ActorSuspended{}
+	mi := &file_goakt_goakt_proto_msgTypes[7]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *ActorSuspended) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ActorSuspended) ProtoMessage() {}
+
+func (x *ActorSuspended) ProtoReflect() protoreflect.Message {
+	mi := &file_goakt_goakt_proto_msgTypes[7]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ActorSuspended.ProtoReflect.Descriptor instead.
+func (*ActorSuspended) Descriptor() ([]byte, []int) {
+	return file_goakt_goakt_proto_rawDescGZIP(), []int{7}
+}
+
+func (x *ActorSuspended) GetAddress() *Address {
+	if x != nil {
+		return x.Address
+	}
+	return nil
+}
+
+func (x *ActorSuspended) GetSuspendedAt() *timestamppb.Timestamp {
+	if x != nil {
+		return x.SuspendedAt
+	}
+	return nil
+}
+
+func (x *ActorSuspended) GetReason() string {
+	if x != nil {
+		return x.Reason
+	}
+	return ""
+}
 
+// NodeJoined defines the node joined event
+type NodeJoined struct {
+	state protoimpl.MessageState `protogen:"open.v1"`
 	// Specifies the node address
 	Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"`
 	// Specifies the timestamp
-	Timestamp *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"`
+	Timestamp     *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *NodeJoined) Reset() {
 	*x = NodeJoined{}
-	mi := &file_goakt_goakt_proto_msgTypes[7]
+	mi := &file_goakt_goakt_proto_msgTypes[8]
 	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 	ms.StoreMessageInfo(mi)
 }
@@ -513,7 +569,7 @@ func (x *NodeJoined) String() string {
 func (*NodeJoined) ProtoMessage() {}
 
 func (x *NodeJoined) ProtoReflect() protoreflect.Message {
-	mi := &file_goakt_goakt_proto_msgTypes[7]
+	mi := &file_goakt_goakt_proto_msgTypes[8]
 	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -526,7 +582,7 @@ func (x *NodeJoined) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use NodeJoined.ProtoReflect.Descriptor instead.
 func (*NodeJoined) Descriptor() ([]byte, []int) {
-	return file_goakt_goakt_proto_rawDescGZIP(), []int{7}
+	return file_goakt_goakt_proto_rawDescGZIP(), []int{8}
 }
 
 func (x *NodeJoined) GetAddress() string {
@@ -545,19 +601,18 @@ func (x *NodeJoined) GetTimestamp() *timestamppb.Timestamp {
 
 // NodeLeft defines the node left event
 type NodeLeft struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
+	state protoimpl.MessageState `protogen:"open.v1"`
 	// Specifies the node address
 	Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"`
 	// Specifies the timestamp
-	Timestamp *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"`
+	Timestamp     *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *NodeLeft) Reset() {
 	*x = NodeLeft{}
-	mi := &file_goakt_goakt_proto_msgTypes[8]
+	mi := &file_goakt_goakt_proto_msgTypes[9]
 	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 	ms.StoreMessageInfo(mi)
 }
@@ -569,7 +624,7 @@ func (x *NodeLeft) String() string {
 func (*NodeLeft) ProtoMessage() {}
 
 func (x *NodeLeft) ProtoReflect() protoreflect.Message {
-	mi := &file_goakt_goakt_proto_msgTypes[8]
+	mi := &file_goakt_goakt_proto_msgTypes[9]
 	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -582,7 +637,7 @@ func (x *NodeLeft) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use NodeLeft.ProtoReflect.Descriptor instead.
 func (*NodeLeft) Descriptor() ([]byte, []int) {
-	return file_goakt_goakt_proto_rawDescGZIP(), []int{8}
+	return file_goakt_goakt_proto_rawDescGZIP(), []int{9}
 }
 
 func (x *NodeLeft) GetAddress() string {
@@ -602,17 +657,16 @@ func (x *NodeLeft) GetTimestamp() *timestamppb.Timestamp {
 // Terminated is used to notify watching actors
 // of the shutdown of its child actor.
 type Terminated struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
+	state protoimpl.MessageState `protogen:"open.v1"`
 	// Specifies the terminated actor
-	ActorId string `protobuf:"bytes,1,opt,name=actor_id,json=actorId,proto3" json:"actor_id,omitempty"`
+	ActorId       string `protobuf:"bytes,1,opt,name=actor_id,json=actorId,proto3" json:"actor_id,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *Terminated) Reset() {
 	*x = Terminated{}
-	mi := &file_goakt_goakt_proto_msgTypes[9]
+	mi := &file_goakt_goakt_proto_msgTypes[10]
 	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 	ms.StoreMessageInfo(mi)
 }
@@ -624,7 +678,7 @@ func (x *Terminated) String() string {
 func (*Terminated) ProtoMessage() {}
 
 func (x *Terminated) ProtoReflect() protoreflect.Message {
-	mi := &file_goakt_goakt_proto_msgTypes[9]
+	mi := &file_goakt_goakt_proto_msgTypes[10]
 	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -637,7 +691,7 @@ func (x *Terminated) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use Terminated.ProtoReflect.Descriptor instead.
 func (*Terminated) Descriptor() ([]byte, []int) {
-	return file_goakt_goakt_proto_rawDescGZIP(), []int{9}
+	return file_goakt_goakt_proto_rawDescGZIP(), []int{10}
 }
 
 func (x *Terminated) GetActorId() string {
@@ -651,14 +705,14 @@ func (x *Terminated) GetActorId() string {
 // It is enqueued as ordinary messages.
 // It will be handled after messages that were already queued in the mailbox.
 type PoisonPill struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
+	state         protoimpl.MessageState `protogen:"open.v1"`
 	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *PoisonPill) Reset() {
 	*x = PoisonPill{}
-	mi := &file_goakt_goakt_proto_msgTypes[10]
+	mi := &file_goakt_goakt_proto_msgTypes[11]
 	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 	ms.StoreMessageInfo(mi)
 }
@@ -670,7 +724,7 @@ func (x *PoisonPill) String() string {
 func (*PoisonPill) ProtoMessage() {}
 
 func (x *PoisonPill) ProtoReflect() protoreflect.Message {
-	mi := &file_goakt_goakt_proto_msgTypes[10]
+	mi := &file_goakt_goakt_proto_msgTypes[11]
 	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -683,19 +737,19 @@ func (x *PoisonPill) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use PoisonPill.ProtoReflect.Descriptor instead.
 func (*PoisonPill) Descriptor() ([]byte, []int) {
-	return file_goakt_goakt_proto_rawDescGZIP(), []int{10}
+	return file_goakt_goakt_proto_rawDescGZIP(), []int{11}
 }
 
 // PostStart is used when an actor has successfully started
 type PostStart struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
+	state         protoimpl.MessageState `protogen:"open.v1"`
 	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *PostStart) Reset() {
 	*x = PostStart{}
-	mi := &file_goakt_goakt_proto_msgTypes[11]
+	mi := &file_goakt_goakt_proto_msgTypes[12]
 	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 	ms.StoreMessageInfo(mi)
 }
@@ -707,7 +761,7 @@ func (x *PostStart) String() string {
 func (*PostStart) ProtoMessage() {}
 
 func (x *PostStart) ProtoReflect() protoreflect.Message {
-	mi := &file_goakt_goakt_proto_msgTypes[11]
+	mi := &file_goakt_goakt_proto_msgTypes[12]
 	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -720,22 +774,21 @@ func (x *PostStart) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use PostStart.ProtoReflect.Descriptor instead.
 func (*PostStart) Descriptor() ([]byte, []int) {
-	return file_goakt_goakt_proto_rawDescGZIP(), []int{11}
+	return file_goakt_goakt_proto_rawDescGZIP(), []int{12}
 }
 
 // Broadcast is used to send message to a router
 type Broadcast struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
+	state protoimpl.MessageState `protogen:"open.v1"`
 	// Specifies the actual message
-	Message *anypb.Any `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"`
+	Message       *anypb.Any `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *Broadcast) Reset() {
 	*x = Broadcast{}
-	mi := &file_goakt_goakt_proto_msgTypes[12]
+	mi := &file_goakt_goakt_proto_msgTypes[13]
 	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 	ms.StoreMessageInfo(mi)
 }
@@ -747,7 +800,7 @@ func (x *Broadcast) String() string {
 func (*Broadcast) ProtoMessage() {}
 
 func (x *Broadcast) ProtoReflect() protoreflect.Message {
-	mi := &file_goakt_goakt_proto_msgTypes[12]
+	mi := &file_goakt_goakt_proto_msgTypes[13]
 	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -760,7 +813,7 @@ func (x *Broadcast) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use Broadcast.ProtoReflect.Descriptor instead.
 func (*Broadcast) Descriptor() ([]byte, []int) {
-	return file_goakt_goakt_proto_rawDescGZIP(), []int{12}
+	return file_goakt_goakt_proto_rawDescGZIP(), []int{13}
 }
 
 func (x *Broadcast) GetMessage() *anypb.Any {
@@ -843,36 +896,46 @@ var file_goakt_goakt_proto_rawDesc = []byte{
 	0x0c, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x02, 0x20,
 	0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
 	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52,
-	0x0b, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x60, 0x0a, 0x0a,
-	0x4e, 0x6f, 0x64, 0x65, 0x4a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64,
-	0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64,
-	0x72, 0x65, 0x73, 0x73, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d,
-	0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
-	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74,
-	0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x5e,
-	0x0a, 0x08, 0x4e, 0x6f, 0x64, 0x65, 0x4c, 0x65, 0x66, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64,
-	0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64,
-	0x72, 0x65, 0x73, 0x73, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d,
-	0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
-	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74,
-	0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x27,
-	0x0a, 0x0a, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x12, 0x19, 0x0a, 0x08,
-	0x61, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07,
-	0x61, 0x63, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, 0x0c, 0x0a, 0x0a, 0x50, 0x6f, 0x69, 0x73, 0x6f,
-	0x6e, 0x50, 0x69, 0x6c, 0x6c, 0x22, 0x0b, 0x0a, 0x09, 0x50, 0x6f, 0x73, 0x74, 0x53, 0x74, 0x61,
-	0x72, 0x74, 0x22, 0x3b, 0x0a, 0x09, 0x42, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x12,
-	0x2e, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
-	0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
-	0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42,
-	0x85, 0x01, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x61, 0x6b, 0x74, 0x70, 0x62, 0x42,
-	0x0a, 0x47, 0x6f, 0x61, 0x6b, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x48, 0x02, 0x50, 0x01, 0x5a,
-	0x2c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x74, 0x6f, 0x63, 0x68,
-	0x65, 0x6d, 0x65, 0x79, 0x2f, 0x67, 0x6f, 0x61, 0x6b, 0x74, 0x2f, 0x76, 0x32, 0x2f, 0x67, 0x6f,
-	0x61, 0x6b, 0x74, 0x70, 0x62, 0x3b, 0x67, 0x6f, 0x61, 0x6b, 0x74, 0x70, 0x62, 0xa2, 0x02, 0x03,
-	0x47, 0x58, 0x58, 0xaa, 0x02, 0x07, 0x47, 0x6f, 0x61, 0x6b, 0x74, 0x70, 0x62, 0xca, 0x02, 0x07,
-	0x47, 0x6f, 0x61, 0x6b, 0x74, 0x70, 0x62, 0xe2, 0x02, 0x13, 0x47, 0x6f, 0x61, 0x6b, 0x74, 0x70,
-	0x62, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x07,
-	0x47, 0x6f, 0x61, 0x6b, 0x74, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x0b, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x93, 0x01, 0x0a,
+	0x0e, 0x41, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x75, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x12,
+	0x2a, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x10, 0x2e, 0x67, 0x6f, 0x61, 0x6b, 0x74, 0x70, 0x62, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65,
+	0x73, 0x73, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x3d, 0x0a, 0x0c, 0x73,
+	0x75, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0b, 0x73,
+	0x75, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x41, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65,
+	0x61, 0x73, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73,
+	0x6f, 0x6e, 0x22, 0x60, 0x0a, 0x0a, 0x4e, 0x6f, 0x64, 0x65, 0x4a, 0x6f, 0x69, 0x6e, 0x65, 0x64,
+	0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69,
+	0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e,
+	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
+	0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73,
+	0x74, 0x61, 0x6d, 0x70, 0x22, 0x5e, 0x0a, 0x08, 0x4e, 0x6f, 0x64, 0x65, 0x4c, 0x65, 0x66, 0x74,
+	0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69,
+	0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e,
+	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
+	0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73,
+	0x74, 0x61, 0x6d, 0x70, 0x22, 0x27, 0x0a, 0x0a, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74,
+	0x65, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, 0x0c, 0x0a,
+	0x0a, 0x50, 0x6f, 0x69, 0x73, 0x6f, 0x6e, 0x50, 0x69, 0x6c, 0x6c, 0x22, 0x0b, 0x0a, 0x09, 0x50,
+	0x6f, 0x73, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x22, 0x3b, 0x0a, 0x09, 0x42, 0x72, 0x6f, 0x61,
+	0x64, 0x63, 0x61, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x07, 0x6d, 0x65,
+	0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 0x85, 0x01, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f,
+	0x61, 0x6b, 0x74, 0x70, 0x62, 0x42, 0x0a, 0x47, 0x6f, 0x61, 0x6b, 0x74, 0x50, 0x72, 0x6f, 0x74,
+	0x6f, 0x48, 0x02, 0x50, 0x01, 0x5a, 0x2c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f,
+	0x6d, 0x2f, 0x74, 0x6f, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x79, 0x2f, 0x67, 0x6f, 0x61, 0x6b, 0x74,
+	0x2f, 0x76, 0x32, 0x2f, 0x67, 0x6f, 0x61, 0x6b, 0x74, 0x70, 0x62, 0x3b, 0x67, 0x6f, 0x61, 0x6b,
+	0x74, 0x70, 0x62, 0xa2, 0x02, 0x03, 0x47, 0x58, 0x58, 0xaa, 0x02, 0x07, 0x47, 0x6f, 0x61, 0x6b,
+	0x74, 0x70, 0x62, 0xca, 0x02, 0x07, 0x47, 0x6f, 0x61, 0x6b, 0x74, 0x70, 0x62, 0xe2, 0x02, 0x13,
+	0x47, 0x6f, 0x61, 0x6b, 0x74, 0x70, 0x62, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64,
+	0x61, 0x74, 0x61, 0xea, 0x02, 0x07, 0x47, 0x6f, 0x61, 0x6b, 0x74, 0x70, 0x62, 0x62, 0x06, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
@@ -887,7 +950,7 @@ func file_goakt_goakt_proto_rawDescGZIP() []byte {
 	return file_goakt_goakt_proto_rawDescData
 }
 
-var file_goakt_goakt_proto_msgTypes = make([]protoimpl.MessageInfo, 13)
+var file_goakt_goakt_proto_msgTypes = make([]protoimpl.MessageInfo, 14)
 var file_goakt_goakt_proto_goTypes = []any{
 	(*Address)(nil),               // 0: goaktpb.Address
 	(*Deadletter)(nil),            // 1: goaktpb.Deadletter
@@ -896,40 +959,43 @@ var file_goakt_goakt_proto_goTypes = []any{
 	(*ActorPassivated)(nil),       // 4: goaktpb.ActorPassivated
 	(*ActorChildCreated)(nil),     // 5: goaktpb.ActorChildCreated
 	(*ActorRestarted)(nil),        // 6: goaktpb.ActorRestarted
-	(*NodeJoined)(nil),            // 7: goaktpb.NodeJoined
-	(*NodeLeft)(nil),              // 8: goaktpb.NodeLeft
-	(*Terminated)(nil),            // 9: goaktpb.Terminated
-	(*PoisonPill)(nil),            // 10: goaktpb.PoisonPill
-	(*PostStart)(nil),             // 11: goaktpb.PostStart
-	(*Broadcast)(nil),             // 12: goaktpb.Broadcast
-	(*anypb.Any)(nil),             // 13: google.protobuf.Any
-	(*timestamppb.Timestamp)(nil), // 14: google.protobuf.Timestamp
+	(*ActorSuspended)(nil),        // 7: goaktpb.ActorSuspended
+	(*NodeJoined)(nil),            // 8: goaktpb.NodeJoined
+	(*NodeLeft)(nil),              // 9: goaktpb.NodeLeft
+	(*Terminated)(nil),            // 10: goaktpb.Terminated
+	(*PoisonPill)(nil),            // 11: goaktpb.PoisonPill
+	(*PostStart)(nil),             // 12: goaktpb.PostStart
+	(*Broadcast)(nil),             // 13: goaktpb.Broadcast
+	(*anypb.Any)(nil),             // 14: google.protobuf.Any
+	(*timestamppb.Timestamp)(nil), // 15: google.protobuf.Timestamp
 }
 var file_goakt_goakt_proto_depIdxs = []int32{
 	0,  // 0: goaktpb.Address.parent:type_name -> goaktpb.Address
 	0,  // 1: goaktpb.Deadletter.sender:type_name -> goaktpb.Address
 	0,  // 2: goaktpb.Deadletter.receiver:type_name -> goaktpb.Address
-	13, // 3: goaktpb.Deadletter.message:type_name -> google.protobuf.Any
-	14, // 4: goaktpb.Deadletter.send_time:type_name -> google.protobuf.Timestamp
+	14, // 3: goaktpb.Deadletter.message:type_name -> google.protobuf.Any
+	15, // 4: goaktpb.Deadletter.send_time:type_name -> google.protobuf.Timestamp
 	0,  // 5: goaktpb.ActorStarted.address:type_name -> goaktpb.Address
-	14, // 6: goaktpb.ActorStarted.started_at:type_name -> google.protobuf.Timestamp
+	15, // 6: goaktpb.ActorStarted.started_at:type_name -> google.protobuf.Timestamp
 	0,  // 7: goaktpb.ActorStopped.address:type_name -> goaktpb.Address
-	14, // 8: goaktpb.ActorStopped.stopped_at:type_name -> google.protobuf.Timestamp
+	15, // 8: goaktpb.ActorStopped.stopped_at:type_name -> google.protobuf.Timestamp
 	0,  // 9: goaktpb.ActorPassivated.address:type_name -> goaktpb.Address
-	14, // 10: goaktpb.ActorPassivated.passivated_at:type_name -> google.protobuf.Timestamp
+	15, // 10: goaktpb.ActorPassivated.passivated_at:type_name -> google.protobuf.Timestamp
 	0,  // 11: goaktpb.ActorChildCreated.address:type_name -> goaktpb.Address
 	0,  // 12: goaktpb.ActorChildCreated.parent:type_name -> goaktpb.Address
-	14, // 13: goaktpb.ActorChildCreated.created_at:type_name -> google.protobuf.Timestamp
+	15, // 13: goaktpb.ActorChildCreated.created_at:type_name -> google.protobuf.Timestamp
 	0,  // 14: goaktpb.ActorRestarted.address:type_name -> goaktpb.Address
-	14, // 15: goaktpb.ActorRestarted.restarted_at:type_name -> google.protobuf.Timestamp
-	14, // 16: goaktpb.NodeJoined.timestamp:type_name -> google.protobuf.Timestamp
-	14, // 17: goaktpb.NodeLeft.timestamp:type_name -> google.protobuf.Timestamp
-	13, // 18: goaktpb.Broadcast.message:type_name -> google.protobuf.Any
-	19, // [19:19] is the sub-list for method output_type
-	19, // [19:19] is the sub-list for method input_type
-	19, // [19:19] is the sub-list for extension type_name
-	19, // [19:19] is the sub-list for extension extendee
-	0,  // [0:19] is the sub-list for field type_name
+	15, // 15: goaktpb.ActorRestarted.restarted_at:type_name -> google.protobuf.Timestamp
+	0,  // 16: goaktpb.ActorSuspended.address:type_name -> goaktpb.Address
+	15, // 17: goaktpb.ActorSuspended.suspended_at:type_name -> google.protobuf.Timestamp
+	15, // 18: goaktpb.NodeJoined.timestamp:type_name -> google.protobuf.Timestamp
+	15, // 19: goaktpb.NodeLeft.timestamp:type_name -> google.protobuf.Timestamp
+	14, // 20: goaktpb.Broadcast.message:type_name -> google.protobuf.Any
+	21, // [21:21] is the sub-list for method output_type
+	21, // [21:21] is the sub-list for method input_type
+	21, // [21:21] is the sub-list for extension type_name
+	21, // [21:21] is the sub-list for extension extendee
+	0,  // [0:21] is the sub-list for field type_name
 }
 
 func init() { file_goakt_goakt_proto_init() }
@@ -943,7 +1009,7 @@ func file_goakt_goakt_proto_init() {
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_goakt_goakt_proto_rawDesc,
 			NumEnums:      0,
-			NumMessages:   13,
+			NumMessages:   14,
 			NumExtensions: 0,
 			NumServices:   0,
 		},
diff --git a/internal/internalpb/actor.pb.go b/internal/internalpb/actor.pb.go
index 6b6063d..a838b84 100644
--- a/internal/internalpb/actor.pb.go
+++ b/internal/internalpb/actor.pb.go
@@ -1,6 +1,6 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.35.2
+// 	protoc-gen-go v1.36.0
 // 	protoc        (unknown)
 // source: internal/actor.proto
 
@@ -23,14 +23,13 @@ const (
 
 // ActorRef represents the actor information on the wire.
 type ActorRef struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
+	state protoimpl.MessageState `protogen:"open.v1"`
 	// Specifies the actor address
 	ActorAddress *goaktpb.Address `protobuf:"bytes,1,opt,name=actor_address,json=actorAddress,proto3" json:"actor_address,omitempty"`
 	// Specifies the actor type
-	ActorType string `protobuf:"bytes,2,opt,name=actor_type,json=actorType,proto3" json:"actor_type,omitempty"`
+	ActorType     string `protobuf:"bytes,2,opt,name=actor_type,json=actorType,proto3" json:"actor_type,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *ActorRef) Reset() {
diff --git a/internal/internalpb/cluster.pb.go b/internal/internalpb/cluster.pb.go
index 81de204..ba5b1d7 100644
--- a/internal/internalpb/cluster.pb.go
+++ b/internal/internalpb/cluster.pb.go
@@ -1,6 +1,6 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.35.2
+// 	protoc-gen-go v1.36.0
 // 	protoc        (unknown)
 // source: internal/cluster.proto
 
@@ -21,12 +21,11 @@ const (
 )
 
 type GetNodeMetricRequest struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
+	state protoimpl.MessageState `protogen:"open.v1"`
 	// Specifies the node address
-	NodeAddress string `protobuf:"bytes,1,opt,name=node_address,json=nodeAddress,proto3" json:"node_address,omitempty"`
+	NodeAddress   string `protobuf:"bytes,1,opt,name=node_address,json=nodeAddress,proto3" json:"node_address,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *GetNodeMetricRequest) Reset() {
@@ -67,14 +66,13 @@ func (x *GetNodeMetricRequest) GetNodeAddress() string {
 }
 
 type GetNodeMetricResponse struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
+	state protoimpl.MessageState `protogen:"open.v1"`
 	// Specifies the node address
 	NodeRemoteAddress string `protobuf:"bytes,1,opt,name=node_remote_address,json=nodeRemoteAddress,proto3" json:"node_remote_address,omitempty"`
 	// Specifies the actors count for the given node
-	ActorsCount uint64 `protobuf:"varint,2,opt,name=actors_count,json=actorsCount,proto3" json:"actors_count,omitempty"`
+	ActorsCount   uint64 `protobuf:"varint,2,opt,name=actors_count,json=actorsCount,proto3" json:"actors_count,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *GetNodeMetricResponse) Reset() {
@@ -122,12 +120,11 @@ func (x *GetNodeMetricResponse) GetActorsCount() uint64 {
 }
 
 type GetKindsRequest struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
+	state protoimpl.MessageState `protogen:"open.v1"`
 	// Specifies the node address
-	NodeAddress string `protobuf:"bytes,1,opt,name=node_address,json=nodeAddress,proto3" json:"node_address,omitempty"`
+	NodeAddress   string `protobuf:"bytes,1,opt,name=node_address,json=nodeAddress,proto3" json:"node_address,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *GetKindsRequest) Reset() {
@@ -168,12 +165,11 @@ func (x *GetKindsRequest) GetNodeAddress() string {
 }
 
 type GetKindsResponse struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
+	state protoimpl.MessageState `protogen:"open.v1"`
 	// Specifies the list of kinds
-	Kinds []string `protobuf:"bytes,1,rep,name=kinds,proto3" json:"kinds,omitempty"`
+	Kinds         []string `protobuf:"bytes,1,rep,name=kinds,proto3" json:"kinds,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *GetKindsResponse) Reset() {
diff --git a/internal/internalpb/nats.pb.go b/internal/internalpb/nats.pb.go
index 633453f..b291d5b 100644
--- a/internal/internalpb/nats.pb.go
+++ b/internal/internalpb/nats.pb.go
@@ -1,6 +1,6 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.35.2
+// 	protoc-gen-go v1.36.0
 // 	protoc        (unknown)
 // source: internal/nats.proto
 
@@ -76,10 +76,7 @@ func (NatsMessageType) EnumDescriptor() ([]byte, []int) {
 // NatsMessage defines the NATs message
 // used by the discovery provider
 type NatsMessage struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
+	state protoimpl.MessageState `protogen:"open.v1"`
 	// Specifies the host name of the client node
 	Host string `protobuf:"bytes,1,opt,name=host,proto3" json:"host,omitempty"`
 	// Specifies the port of the client node
@@ -87,7 +84,9 @@ type NatsMessage struct {
 	// Specifies the client name
 	Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"`
 	// Specifies the message type
-	MessageType NatsMessageType `protobuf:"varint,4,opt,name=message_type,json=messageType,proto3,enum=internalpb.NatsMessageType" json:"message_type,omitempty"`
+	MessageType   NatsMessageType `protobuf:"varint,4,opt,name=message_type,json=messageType,proto3,enum=internalpb.NatsMessageType" json:"message_type,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *NatsMessage) Reset() {
diff --git a/internal/internalpb/peers.pb.go b/internal/internalpb/peers.pb.go
index 6cceec6..e75cb1a 100644
--- a/internal/internalpb/peers.pb.go
+++ b/internal/internalpb/peers.pb.go
@@ -1,6 +1,6 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.35.2
+// 	protoc-gen-go v1.36.0
 // 	protoc        (unknown)
 // source: internal/peers.proto
 
@@ -23,10 +23,7 @@ const (
 // PeersSync is used to share a created/ restarted actor
 // on a given node to his peers when cluster is enabled
 type PeersSync struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
+	state protoimpl.MessageState `protogen:"open.v1"`
 	// Specifies the peer host
 	Host string `protobuf:"bytes,1,opt,name=host,proto3" json:"host,omitempty"`
 	// Specifies the remoting port
@@ -34,7 +31,9 @@ type PeersSync struct {
 	// Specifies the remoting host
 	PeersPort int32 `protobuf:"varint,3,opt,name=peers_port,json=peersPort,proto3" json:"peers_port,omitempty"`
 	// Specifies the wire actor
-	Actor *ActorRef `protobuf:"bytes,4,opt,name=actor,proto3" json:"actor,omitempty"`
+	Actor         *ActorRef `protobuf:"bytes,4,opt,name=actor,proto3" json:"actor,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *PeersSync) Reset() {
@@ -96,10 +95,7 @@ func (x *PeersSync) GetActor() *ActorRef {
 }
 
 type PeerState struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
+	state protoimpl.MessageState `protogen:"open.v1"`
 	// Specifies the peer host
 	Host string `protobuf:"bytes,1,opt,name=host,proto3" json:"host,omitempty"`
 	// Specifies the remoting port
@@ -107,7 +103,9 @@ type PeerState struct {
 	// Specifies the remoting host
 	PeersPort int32 `protobuf:"varint,3,opt,name=peers_port,json=peersPort,proto3" json:"peers_port,omitempty"`
 	// Specifies the list of actors
-	Actors []*ActorRef `protobuf:"bytes,4,rep,name=actors,proto3" json:"actors,omitempty"`
+	Actors        []*ActorRef `protobuf:"bytes,4,rep,name=actors,proto3" json:"actors,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *PeerState) Reset() {
@@ -169,12 +167,11 @@ func (x *PeerState) GetActors() []*ActorRef {
 }
 
 type Rebalance struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
+	state protoimpl.MessageState `protogen:"open.v1"`
 	// Specifies the peer state
-	PeerState *PeerState `protobuf:"bytes,1,opt,name=peer_state,json=peerState,proto3" json:"peer_state,omitempty"`
+	PeerState     *PeerState `protobuf:"bytes,1,opt,name=peer_state,json=peerState,proto3" json:"peer_state,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *Rebalance) Reset() {
diff --git a/internal/internalpb/remoting.pb.go b/internal/internalpb/remoting.pb.go
index a937e5f..66b2b1e 100644
--- a/internal/internalpb/remoting.pb.go
+++ b/internal/internalpb/remoting.pb.go
@@ -1,6 +1,6 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.35.2
+// 	protoc-gen-go v1.36.0
 // 	protoc        (unknown)
 // source: internal/remoting.proto
 
@@ -26,14 +26,13 @@ const (
 // RemoteAsk is used to send a message to an actor remotely and expect a response
 // immediately.
 type RemoteAskRequest struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
+	state protoimpl.MessageState `protogen:"open.v1"`
 	// Specifies the remote message to send
 	RemoteMessage *RemoteMessage `protobuf:"bytes,1,opt,name=remote_message,json=remoteMessage,proto3" json:"remote_message,omitempty"`
 	// Specifies the timeout(how long to wait for a reply)
-	Timeout *durationpb.Duration `protobuf:"bytes,2,opt,name=timeout,proto3" json:"timeout,omitempty"`
+	Timeout       *durationpb.Duration `protobuf:"bytes,2,opt,name=timeout,proto3" json:"timeout,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *RemoteAskRequest) Reset() {
@@ -81,13 +80,12 @@ func (x *RemoteAskRequest) GetTimeout() *durationpb.Duration {
 }
 
 type RemoteAskResponse struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
+	state protoimpl.MessageState `protogen:"open.v1"`
 	// Specifies the message to send to the actor
 	// Any proto message is allowed to be sent
-	Message *anypb.Any `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"`
+	Message       *anypb.Any `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *RemoteAskResponse) Reset() {
@@ -129,12 +127,11 @@ func (x *RemoteAskResponse) GetMessage() *anypb.Any {
 
 // RemoteTell is used to send a message to an actor remotely
 type RemoteTellRequest struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
+	state protoimpl.MessageState `protogen:"open.v1"`
 	// Specifies the remote message to send
 	RemoteMessage *RemoteMessage `protobuf:"bytes,1,opt,name=remote_message,json=remoteMessage,proto3" json:"remote_message,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *RemoteTellRequest) Reset() {
@@ -175,9 +172,9 @@ func (x *RemoteTellRequest) GetRemoteMessage() *RemoteMessage {
 }
 
 type RemoteTellResponse struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
+	state         protoimpl.MessageState `protogen:"open.v1"`
 	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *RemoteTellResponse) Reset() {
@@ -212,16 +209,15 @@ func (*RemoteTellResponse) Descriptor() ([]byte, []int) {
 
 // RemoteLookupRequest checks whether a given actor exists on a remote host
 type RemoteLookupRequest struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
+	state protoimpl.MessageState `protogen:"open.v1"`
 	// Specifies the remote host address
 	Host string `protobuf:"bytes,1,opt,name=host,proto3" json:"host,omitempty"`
 	// Specifies the remote port
 	Port int32 `protobuf:"varint,2,opt,name=port,proto3" json:"port,omitempty"`
 	// Specifies the actor name
-	Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"`
+	Name          string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *RemoteLookupRequest) Reset() {
@@ -276,12 +272,11 @@ func (x *RemoteLookupRequest) GetName() string {
 }
 
 type RemoteLookupResponse struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
+	state protoimpl.MessageState `protogen:"open.v1"`
 	// Specifies the actor address
-	Address *goaktpb.Address `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"`
+	Address       *goaktpb.Address `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *RemoteLookupResponse) Reset() {
@@ -323,17 +318,16 @@ func (x *RemoteLookupResponse) GetAddress() *goaktpb.Address {
 
 // RemoteMessage will be used by Actors to communicate remotely
 type RemoteMessage struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
+	state protoimpl.MessageState `protogen:"open.v1"`
 	// Specifies the sender' address
 	Sender *goaktpb.Address `protobuf:"bytes,1,opt,name=sender,proto3" json:"sender,omitempty"`
 	// Specifies the actor address
 	Receiver *goaktpb.Address `protobuf:"bytes,2,opt,name=receiver,proto3" json:"receiver,omitempty"`
 	// Specifies the message to send to the actor
 	// Any proto message is allowed to be sent
-	Message *anypb.Any `protobuf:"bytes,3,opt,name=message,proto3" json:"message,omitempty"`
+	Message       *anypb.Any `protobuf:"bytes,3,opt,name=message,proto3" json:"message,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *RemoteMessage) Reset() {
@@ -388,16 +382,15 @@ func (x *RemoteMessage) GetMessage() *anypb.Any {
 }
 
 type RemoteReSpawnRequest struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
+	state protoimpl.MessageState `protogen:"open.v1"`
 	// Specifies the remote host address
 	Host string `protobuf:"bytes,1,opt,name=host,proto3" json:"host,omitempty"`
 	// Specifies the remote port
 	Port int32 `protobuf:"varint,2,opt,name=port,proto3" json:"port,omitempty"`
 	// Specifies the actor name
-	Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"`
+	Name          string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *RemoteReSpawnRequest) Reset() {
@@ -452,9 +445,9 @@ func (x *RemoteReSpawnRequest) GetName() string {
 }
 
 type RemoteReSpawnResponse struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
+	state         protoimpl.MessageState `protogen:"open.v1"`
 	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *RemoteReSpawnResponse) Reset() {
@@ -488,16 +481,15 @@ func (*RemoteReSpawnResponse) Descriptor() ([]byte, []int) {
 }
 
 type RemoteStopRequest struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
+	state protoimpl.MessageState `protogen:"open.v1"`
 	// Specifies the remote host address
 	Host string `protobuf:"bytes,1,opt,name=host,proto3" json:"host,omitempty"`
 	// Specifies the remote port
 	Port int32 `protobuf:"varint,2,opt,name=port,proto3" json:"port,omitempty"`
 	// Specifies the actor name
-	Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"`
+	Name          string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *RemoteStopRequest) Reset() {
@@ -552,9 +544,9 @@ func (x *RemoteStopRequest) GetName() string {
 }
 
 type RemoteStopResponse struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
+	state         protoimpl.MessageState `protogen:"open.v1"`
 	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *RemoteStopResponse) Reset() {
@@ -588,10 +580,7 @@ func (*RemoteStopResponse) Descriptor() ([]byte, []int) {
 }
 
 type RemoteSpawnRequest struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
+	state protoimpl.MessageState `protogen:"open.v1"`
 	// Specifies the remote host address
 	Host string `protobuf:"bytes,1,opt,name=host,proto3" json:"host,omitempty"`
 	// Specifies the remote port
@@ -599,7 +588,9 @@ type RemoteSpawnRequest struct {
 	// Specifies the actor name.
 	ActorName string `protobuf:"bytes,3,opt,name=actor_name,json=actorName,proto3" json:"actor_name,omitempty"`
 	// Specifies the actor type
-	ActorType string `protobuf:"bytes,4,opt,name=actor_type,json=actorType,proto3" json:"actor_type,omitempty"`
+	ActorType     string `protobuf:"bytes,4,opt,name=actor_type,json=actorType,proto3" json:"actor_type,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *RemoteSpawnRequest) Reset() {
@@ -661,9 +652,9 @@ func (x *RemoteSpawnRequest) GetActorType() string {
 }
 
 type RemoteSpawnResponse struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
+	state         protoimpl.MessageState `protogen:"open.v1"`
 	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *RemoteSpawnResponse) Reset() {
diff --git a/internal/internalpb/supervision.pb.go b/internal/internalpb/supervision.pb.go
index ca3731b..d805445 100644
--- a/internal/internalpb/supervision.pb.go
+++ b/internal/internalpb/supervision.pb.go
@@ -1,6 +1,6 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.35.2
+// 	protoc-gen-go v1.36.0
 // 	protoc        (unknown)
 // source: internal/supervision.proto
 
@@ -24,23 +24,22 @@ const (
 // actor to its parent when it is panicking or returning an error
 // while processing message
 type HandleFault struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
+	state protoimpl.MessageState `protogen:"open.v1"`
 	// Specifies the actor id
 	ActorId string `protobuf:"bytes,1,opt,name=actor_id,json=actorId,proto3" json:"actor_id,omitempty"`
 	// Specifies the message
 	Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"`
 	// Specifies the directive
 	//
-	// Types that are assignable to Directive:
+	// Types that are valid to be assigned to Directive:
 	//
 	//	*HandleFault_Stop
 	//	*HandleFault_Resume
 	//	*HandleFault_Restart
 	//	*HandleFault_Escalate
-	Directive isHandleFault_Directive `protobuf_oneof:"directive"`
+	Directive     isHandleFault_Directive `protobuf_oneof:"directive"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *HandleFault) Reset() {
@@ -87,37 +86,45 @@ func (x *HandleFault) GetMessage() string {
 	return ""
 }
 
-func (m *HandleFault) GetDirective() isHandleFault_Directive {
-	if m != nil {
-		return m.Directive
+func (x *HandleFault) GetDirective() isHandleFault_Directive {
+	if x != nil {
+		return x.Directive
 	}
 	return nil
 }
 
 func (x *HandleFault) GetStop() *StopDirective {
-	if x, ok := x.GetDirective().(*HandleFault_Stop); ok {
-		return x.Stop
+	if x != nil {
+		if x, ok := x.Directive.(*HandleFault_Stop); ok {
+			return x.Stop
+		}
 	}
 	return nil
 }
 
 func (x *HandleFault) GetResume() *ResumeDirective {
-	if x, ok := x.GetDirective().(*HandleFault_Resume); ok {
-		return x.Resume
+	if x != nil {
+		if x, ok := x.Directive.(*HandleFault_Resume); ok {
+			return x.Resume
+		}
 	}
 	return nil
 }
 
 func (x *HandleFault) GetRestart() *RestartDirective {
-	if x, ok := x.GetDirective().(*HandleFault_Restart); ok {
-		return x.Restart
+	if x != nil {
+		if x, ok := x.Directive.(*HandleFault_Restart); ok {
+			return x.Restart
+		}
 	}
 	return nil
 }
 
 func (x *HandleFault) GetEscalate() *EscalateDirective {
-	if x, ok := x.GetDirective().(*HandleFault_Escalate); ok {
-		return x.Escalate
+	if x != nil {
+		if x, ok := x.Directive.(*HandleFault_Escalate); ok {
+			return x.Escalate
+		}
 	}
 	return nil
 }
@@ -152,9 +159,9 @@ func (*HandleFault_Escalate) isHandleFault_Directive() {}
 
 // StopDirective defines the supervisor stop directive
 type StopDirective struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
+	state         protoimpl.MessageState `protogen:"open.v1"`
 	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *StopDirective) Reset() {
@@ -190,9 +197,9 @@ func (*StopDirective) Descriptor() ([]byte, []int) {
 // ResumeDirective defines the supervisor resume directive
 // This ignores the failure and process the next message, instead
 type ResumeDirective struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
+	state         protoimpl.MessageState `protogen:"open.v1"`
 	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *ResumeDirective) Reset() {
@@ -228,9 +235,9 @@ func (*ResumeDirective) Descriptor() ([]byte, []int) {
 // EscalateDirective defines the supervisor escalation directive
 // It escalates the failure to the next parent in the hierarchy, thereby failing itself
 type EscalateDirective struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
+	state         protoimpl.MessageState `protogen:"open.v1"`
 	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *EscalateDirective) Reset() {
@@ -265,15 +272,14 @@ func (*EscalateDirective) Descriptor() ([]byte, []int) {
 
 // RestartDirective defines supervisor restart directive
 type RestartDirective struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
+	state protoimpl.MessageState `protogen:"open.v1"`
 	// Specifies the maximum number of retries
 	// When reaching this number the faulty actor is stopped
 	MaxRetries uint32 `protobuf:"varint,1,opt,name=max_retries,json=maxRetries,proto3" json:"max_retries,omitempty"`
 	// Specifies the time range to restart the faulty actor
-	Timeout int64 `protobuf:"varint,2,opt,name=timeout,proto3" json:"timeout,omitempty"`
+	Timeout       int64 `protobuf:"varint,2,opt,name=timeout,proto3" json:"timeout,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *RestartDirective) Reset() {
diff --git a/protos/goakt/goakt.proto b/protos/goakt/goakt.proto
index 4eaabc8..3e2d1b7 100644
--- a/protos/goakt/goakt.proto
+++ b/protos/goakt/goakt.proto
@@ -76,10 +76,20 @@ message ActorChildCreated {
 message ActorRestarted {
   // Specifies the actor address
   Address address = 1;
-  // Specifies the stop time
+  // Specifies the restarted time
   google.protobuf.Timestamp restarted_at = 2;
 }
 
+// ActorSuspended defines the actor suspended event
+message ActorSuspended {
+  // Specifies the actor address
+  Address address = 1;
+  // Specifies the suspended time
+  google.protobuf.Timestamp suspended_at = 2;
+  // Specifies the suspension reason
+  string reason = 3;
+}
+
 // NodeJoined defines the node joined event
 message NodeJoined {
   // Specifies the node address


Test patch:
diff --git a/actors/pid_test.go b/actors/pid_test.go
index 565fb75..07508d3 100644
--- a/actors/pid_test.go
+++ b/actors/pid_test.go
@@ -984,6 +984,10 @@ func TestSupervisorStrategy(t *testing.T) {
 
 		lib.Pause(time.Second)
 
+		subscriber, err := actorSystem.Subscribe()
+		require.NoError(t, err)
+		require.NotNil(t, subscriber)
+
 		parent, err := actorSystem.Spawn(ctx, "test", newMockSupervisorActor())
 		require.NoError(t, err)
 		require.NotNil(t, parent)
@@ -1010,6 +1014,25 @@ func TestSupervisorStrategy(t *testing.T) {
 		require.True(t, child.IsSuspended())
 		require.Len(t, parent.Children(), 0)
 
+		var suspendedEvent *goaktpb.ActorSuspended
+		for message := range subscriber.Iterator() {
+			payload := message.Payload()
+			// only listening to suspended actors
+			event, ok := payload.(*goaktpb.ActorSuspended)
+			if ok {
+				suspendedEvent = event
+				break
+			}
+		}
+
+		require.NotNil(t, suspendedEvent)
+		require.False(t, proto.Equal(suspendedEvent, new(goaktpb.ActorSuspended)))
+		require.Equal(t, child.Name(), suspendedEvent.GetAddress().GetName())
+
+		// unsubscribe the consumer
+		err = actorSystem.Unsubscribe(subscriber)
+		require.NoError(t, err)
+
 		// restart the actor
 		require.NoError(t, child.Restart(ctx))
 		// wait for  a while
diff --git a/test/data/testpb/test.pb.go b/test/data/testpb/test.pb.go
index c0380df..529de6d 100644
--- a/test/data/testpb/test.pb.go
+++ b/test/data/testpb/test.pb.go
@@ -1,6 +1,6 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.35.2
+// 	protoc-gen-go v1.36.0
 // 	protoc        (unknown)
 // source: test/test.proto
 
@@ -22,9 +22,9 @@ const (
 )
 
 type TestReply struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
+	state         protoimpl.MessageState `protogen:"open.v1"`
 	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *TestReply) Reset() {
@@ -58,9 +58,9 @@ func (*TestReply) Descriptor() ([]byte, []int) {
 }
 
 type TestPanic struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
+	state         protoimpl.MessageState `protogen:"open.v1"`
 	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *TestPanic) Reset() {
@@ -94,9 +94,9 @@ func (*TestPanic) Descriptor() ([]byte, []int) {
 }
 
 type TestTimeout struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
+	state         protoimpl.MessageState `protogen:"open.v1"`
 	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *TestTimeout) Reset() {
@@ -130,11 +130,10 @@ func (*TestTimeout) Descriptor() ([]byte, []int) {
 }
 
 type Reply struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	Content       string                 `protobuf:"bytes,1,opt,name=content,proto3" json:"content,omitempty"`
 	unknownFields protoimpl.UnknownFields
-
-	Content string `protobuf:"bytes,1,opt,name=content,proto3" json:"content,omitempty"`
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *Reply) Reset() {
@@ -175,9 +174,9 @@ func (x *Reply) GetContent() string {
 }
 
 type TestSend struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
+	state         protoimpl.MessageState `protogen:"open.v1"`
 	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *TestSend) Reset() {
@@ -211,9 +210,9 @@ func (*TestSend) Descriptor() ([]byte, []int) {
 }
 
 type TestRemoteSend struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
+	state         protoimpl.MessageState `protogen:"open.v1"`
 	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *TestRemoteSend) Reset() {
@@ -247,12 +246,11 @@ func (*TestRemoteSend) Descriptor() ([]byte, []int) {
 }
 
 type Account struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	AccountId      string  `protobuf:"bytes,1,opt,name=account_id,json=accountId,proto3" json:"account_id,omitempty"`
-	AccountBalance float64 `protobuf:"fixed64,2,opt,name=account_balance,json=accountBalance,proto3" json:"account_balance,omitempty"`
+	state          protoimpl.MessageState `protogen:"open.v1"`
+	AccountId      string                 `protobuf:"bytes,1,opt,name=account_id,json=accountId,proto3" json:"account_id,omitempty"`
+	AccountBalance float64                `protobuf:"fixed64,2,opt,name=account_balance,json=accountBalance,proto3" json:"account_balance,omitempty"`
+	unknownFields  protoimpl.UnknownFields
+	sizeCache      protoimpl.SizeCache
 }
 
 func (x *Account) Reset() {
@@ -300,11 +298,10 @@ func (x *Account) GetAccountBalance() float64 {
 }
 
 type CreateAccount struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	AccountBalance float64 `protobuf:"fixed64,2,opt,name=account_balance,json=accountBalance,proto3" json:"account_balance,omitempty"`
+	state          protoimpl.MessageState `protogen:"open.v1"`
+	AccountBalance float64                `protobuf:"fixed64,2,opt,name=account_balance,json=accountBalance,proto3" json:"account_balance,omitempty"`
+	unknownFields  protoimpl.UnknownFields
+	sizeCache      protoimpl.SizeCache
 }
 
 func (x *CreateAccount) Reset() {
@@ -345,12 +342,11 @@ func (x *CreateAccount) GetAccountBalance() float64 {
 }
 
 type CreditAccount struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	AccountId     string                 `protobuf:"bytes,1,opt,name=account_id,json=accountId,proto3" json:"account_id,omitempty"`
+	Balance       float64                `protobuf:"fixed64,2,opt,name=balance,proto3" json:"balance,omitempty"`
 	unknownFields protoimpl.UnknownFields
-
-	AccountId string  `protobuf:"bytes,1,opt,name=account_id,json=accountId,proto3" json:"account_id,omitempty"`
-	Balance   float64 `protobuf:"fixed64,2,opt,name=balance,proto3" json:"balance,omitempty"`
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *CreditAccount) Reset() {
@@ -398,12 +394,11 @@ func (x *CreditAccount) GetBalance() float64 {
 }
 
 type AccountCreated struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	AccountId      string  `protobuf:"bytes,1,opt,name=account_id,json=accountId,proto3" json:"account_id,omitempty"`
-	AccountBalance float64 `protobuf:"fixed64,2,opt,name=account_balance,json=accountBalance,proto3" json:"account_balance,omitempty"`
+	state          protoimpl.MessageState `protogen:"open.v1"`
+	AccountId      string                 `protobuf:"bytes,1,opt,name=account_id,json=accountId,proto3" json:"account_id,omitempty"`
+	AccountBalance float64                `protobuf:"fixed64,2,opt,name=account_balance,json=accountBalance,proto3" json:"account_balance,omitempty"`
+	unknownFields  protoimpl.UnknownFields
+	sizeCache      protoimpl.SizeCache
 }
 
 func (x *AccountCreated) Reset() {
@@ -451,12 +446,11 @@ func (x *AccountCreated) GetAccountBalance() float64 {
 }
 
 type AccountCredited struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	AccountId      string  `protobuf:"bytes,1,opt,name=account_id,json=accountId,proto3" json:"account_id,omitempty"`
-	AccountBalance float64 `protobuf:"fixed64,2,opt,name=account_balance,json=accountBalance,proto3" json:"account_balance,omitempty"`
+	state          protoimpl.MessageState `protogen:"open.v1"`
+	AccountId      string                 `protobuf:"bytes,1,opt,name=account_id,json=accountId,proto3" json:"account_id,omitempty"`
+	AccountBalance float64                `protobuf:"fixed64,2,opt,name=account_balance,json=accountBalance,proto3" json:"account_balance,omitempty"`
+	unknownFields  protoimpl.UnknownFields
+	sizeCache      protoimpl.SizeCache
 }
 
 func (x *AccountCredited) Reset() {
@@ -504,9 +498,9 @@ func (x *AccountCredited) GetAccountBalance() float64 {
 }
 
 type DebitAccount struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
+	state         protoimpl.MessageState `protogen:"open.v1"`
 	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *DebitAccount) Reset() {
@@ -540,9 +534,9 @@ func (*DebitAccount) Descriptor() ([]byte, []int) {
 }
 
 type AccountDebited struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
+	state         protoimpl.MessageState `protogen:"open.v1"`
 	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *AccountDebited) Reset() {
@@ -576,9 +570,9 @@ func (*AccountDebited) Descriptor() ([]byte, []int) {
 }
 
 type TestLogin struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
+	state         protoimpl.MessageState `protogen:"open.v1"`
 	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *TestLogin) Reset() {
@@ -612,9 +606,9 @@ func (*TestLogin) Descriptor() ([]byte, []int) {
 }
 
 type TestLoginSuccess struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
+	state         protoimpl.MessageState `protogen:"open.v1"`
 	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *TestLoginSuccess) Reset() {
@@ -648,9 +642,9 @@ func (*TestLoginSuccess) Descriptor() ([]byte, []int) {
 }
 
 type TestReadiness struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
+	state         protoimpl.MessageState `protogen:"open.v1"`
 	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *TestReadiness) Reset() {
@@ -684,9 +678,9 @@ func (*TestReadiness) Descriptor() ([]byte, []int) {
 }
 
 type TestReady struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
+	state         protoimpl.MessageState `protogen:"open.v1"`
 	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *TestReady) Reset() {
@@ -720,9 +714,9 @@ func (*TestReady) Descriptor() ([]byte, []int) {
 }
 
 type TestBye struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
+	state         protoimpl.MessageState `protogen:"open.v1"`
 	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *TestBye) Reset() {
@@ -756,9 +750,9 @@ func (*TestBye) Descriptor() ([]byte, []int) {
 }
 
 type TestStash struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
+	state         protoimpl.MessageState `protogen:"open.v1"`
 	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *TestStash) Reset() {
@@ -792,9 +786,9 @@ func (*TestStash) Descriptor() ([]byte, []int) {
 }
 
 type TestUnstash struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
+	state         protoimpl.MessageState `protogen:"open.v1"`
 	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *TestUnstash) Reset() {
@@ -828,9 +822,9 @@ func (*TestUnstash) Descriptor() ([]byte, []int) {
 }
 
 type TestUnstashAll struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
+	state         protoimpl.MessageState `protogen:"open.v1"`
 	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *TestUnstashAll) Reset() {
@@ -864,9 +858,9 @@ func (*TestUnstashAll) Descriptor() ([]byte, []int) {
 }
 
 type TestPing struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
+	state         protoimpl.MessageState `protogen:"open.v1"`
 	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *TestPing) Reset() {
@@ -900,9 +894,9 @@ func (*TestPing) Descriptor() ([]byte, []int) {
 }
 
 type TestPong struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
+	state         protoimpl.MessageState `protogen:"open.v1"`
 	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *TestPong) Reset() {
@@ -936,11 +930,10 @@ func (*TestPong) Descriptor() ([]byte, []int) {
 }
 
 type TestWait struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	Duration      uint64                 `protobuf:"varint,1,opt,name=duration,proto3" json:"duration,omitempty"`
 	unknownFields protoimpl.UnknownFields
-
-	Duration uint64 `protobuf:"varint,1,opt,name=duration,proto3" json:"duration,omitempty"`
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *TestWait) Reset() {
@@ -981,11 +974,10 @@ func (x *TestWait) GetDuration() uint64 {
 }
 
 type TestRunTask struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	Duration      uint64                 `protobuf:"varint,1,opt,name=duration,proto3" json:"duration,omitempty"`
 	unknownFields protoimpl.UnknownFields
-
-	Duration uint64 `protobuf:"varint,1,opt,name=duration,proto3" json:"duration,omitempty"`
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *TestRunTask) Reset() {
@@ -1026,9 +1018,9 @@ func (x *TestRunTask) GetDuration() uint64 {
 }
 
 type TaskComplete struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
+	state         protoimpl.MessageState `protogen:"open.v1"`
 	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *TaskComplete) Reset() {
@@ -1062,11 +1054,10 @@ func (*TaskComplete) Descriptor() ([]byte, []int) {
 }
 
 type TestLog struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	Text          string                 `protobuf:"bytes,1,opt,name=text,proto3" json:"text,omitempty"`
 	unknownFields protoimpl.UnknownFields
-
-	Text string `protobuf:"bytes,1,opt,name=text,proto3" json:"text,omitempty"`
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *TestLog) Reset() {
@@ -1107,9 +1098,9 @@ func (x *TestLog) GetText() string {
 }
 
 type TestGetCount struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
+	state         protoimpl.MessageState `protogen:"open.v1"`
 	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *TestGetCount) Reset() {
@@ -1143,11 +1134,10 @@ func (*TestGetCount) Descriptor() ([]byte, []int) {
 }
 
 type TestCount struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	Value         int32                  `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"`
 	unknownFields protoimpl.UnknownFields
-
-	Value int32 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"`
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *TestCount) Reset() {
@@ -1188,9 +1178,9 @@ func (x *TestCount) GetValue() int32 {
 }
 
 type TestRemoteForward struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
+	state         protoimpl.MessageState `protogen:"open.v1"`
 	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *TestRemoteForward) Reset() {
@@ -1224,9 +1214,9 @@ func (*TestRemoteForward) Descriptor() ([]byte, []int) {
 }
 
 type TestClusterForward struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
+	state         protoimpl.MessageState `protogen:"open.v1"`
 	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *TestClusterForward) Reset() {
@@ -1260,14 +1250,13 @@ func (*TestClusterForward) Descriptor() ([]byte, []int) {
 }
 
 type TestMessage struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
+	state protoimpl.MessageState `protogen:"open.v1"`
 	// Specifies the actual message
 	Message *anypb.Any `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"`
 	// Specifies the message priority
-	Priority int64 `protobuf:"varint,2,opt,name=priority,proto3" json:"priority,omitempty"`
+	Priority      int64 `protobuf:"varint,2,opt,name=priority,proto3" json:"priority,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
 func (x *TestMessage) Reset() {