syntax = "proto3";
package semantic;

service Semantic {
  rpc RecordCommands(stream CommandCapture) returns (RecordCommandsReply);
  rpc CommandOutput(CommandOutputRequest) returns (CommandOutputReply);
}

message CommandCapture {
  // The shell prompt, as rendered by the terminal. May contain SGR escape
  // sequences.
  string prompt = 1;
  // The command typed by the user, as rendered by the terminal. May contain
  // SGR escape sequences.
  string command = 2;
  // The rendered output of the command itself. May contain SGR escape
  // sequences.
  string output = 3;
  optional int32 exit_code = 4;
  optional string history_id = 5;
  optional string session_id = 6;
  bool output_truncated = 7;
  uint64 output_observed_bytes = 8;
}

message RecordCommandsReply {
  uint64 accepted = 1;
}

message CommandOutputRequest {
  string history_id = 1;
  repeated OutputRange ranges = 2;
}

message OutputRange {
  int64 start = 1;
  int64 end = 2;
}

message OutputLine {
  uint64 line_number = 1;
  string content = 2;
}

message CommandOutputReply {
  bool found = 1;
  string output = 2;
  uint64 total_bytes = 3;
  uint64 total_lines = 4;
  repeated OutputLine lines = 5;
  bool output_truncated = 6;
  uint64 output_observed_bytes = 7;
}
