edition = "2023";

package safepower_agent_proto;

import "action.proto";
import "safepower_agent_config.proto";
import "system_state.proto";

option features.field_presence = IMPLICIT;

service SafepowerLocalAgent {
  // Get a list of all supported actions
  //
  // Deprecated: Use GetFeatures instead.
  rpc GetSupportedActions(GetSupportedActionsRequest)
      returns (GetSupportedActionsResponse) {
    option deprecated = true;
  }

  // Get features and version information of the agent.
  rpc GetFeatures(GetFeaturesRequest) returns (GetFeaturesResponse) {
  }

  // Execute an action when a condition is met
  rpc StartAction(StartActionRequest) returns (StartActionResponse) {}

  // Monitor reaction
  rpc MonitorAction(MonitorActionRequest) returns (stream ActionStateLog) {}

  // This monitors the local state as detected by this agent.
  //
  // Note that this is not monitoring the global state. For example, if the
  // state is updated via SystemStateUpdate, that update will not be reflected
  // here unless independently determined locally.
  rpc MonitorState(MonitorStateRequest) returns (stream SystemState) {}

  // Update the global system state.
  //
  // The global state is owned by the Safepower service (S4) and is used to
  // synchronize state between nodes that may not have a complete picture of
  // the system. The safepower agent only uses this state to match
  // conditions for actions and does not perform any validation on the
  // received state.
  //
  // For example, to confirm that a SystemStateUpdate has been durably
  // applied across an agent restart, use MonitorAction. MonitorAction tracks
  // the action's effects persistently, unlike MonitorState which only
  // reflects the local agent's current view.
  rpc SystemStateUpdate(SystemState) returns (SystemStateUpdateResponse) {}
}

message GetSupportedActionsRequest {}

message GetSupportedActionsResponse {
  // This lists all supported actions.
  repeated Action actions = 1;  // may be empty
}

message GetFeaturesRequest {}

message GetFeaturesResponse {
  repeated Action supported_actions = 1;
  BuildInfo daemon_info = 2;
  safepower_agent_config.SafePowerAgentConfig config = 3;
}

message MonitorStateRequest {}

message SystemStateUpdateResponse {}
