package agent import ( "context" "fmt" rvboxv1 "github.com/rvbox/rvbox/gen/go/rvbox/v1" "github.com/rvbox/rvbox/internal/agentproto" "google.golang.org/protobuf/proto" ) // SendCommandEvent writes a previously durable, sequence-assigned event. It // derives the immutable digest at the final wire boundary so retrying the same // event produces byte-equivalent protocol evidence. func SendCommandEvent(ctx context.Context, transport Transport, session Session, event *rvboxv1.CommandEvent, limits agentproto.Limits) error { if transport == nil || event == nil || session.ID == "" || session.Generation == 0 { return ErrProtocolHandshake } copyEvent := proto.Clone(event).(*rvboxv1.CommandEvent) digest, err := agentproto.CommandEventDigest(copyEvent) if err != nil { return err } copyEvent.ImmutableEventSha256 = digest[:] envelope := &rvboxv1.AgentEnvelope{SessionId: session.ID, SessionGeneration: session.Generation, Payload: &rvboxv1.AgentEnvelope_CommandEvent{CommandEvent: copyEvent}} if err := agentproto.ValidateEnvelope(envelope, limits, rvboxv1.Platform_PLATFORM_WINDOWS); err != nil { return fmt.Errorf("validate command event: %w", err) } encoded, err := proto.Marshal(envelope) if err != nil { return err } return transport.Write(ctx, encoded) }