syntax = "proto3";

import "google/protobuf/empty.proto";

package prymn;

message SystemHealth {
    // Comma-separated statuses
    string status = 1;
}

message TaskHealth {
    string status = 1;
    string message = 2;
    string started_on = 3;
    int32 progress = 4;
}

message HealthResponse {
    string version = 1;
    SystemHealth system = 2;
    map<string, TaskHealth> tasks = 3;
}

message SysInfoResponse {
    message Cpu {
        uint64 freq_mhz = 1;
        float  usage = 2;
    }

    message Disk {
        string name = 1;
        uint64 total_bytes = 2;
        uint64 avail_bytes = 3;
        string mount_point = 4;
    }

    uint64 uptime = 1;
    string hostname = 2;
    string os = 3;
    uint64 mem_total_bytes = 4;
    uint64 mem_avail_bytes = 5;
    uint64 swap_total_bytes = 6;
    uint64 swap_free_bytes = 7;
    repeated Cpu  cpus = 8;
    repeated Disk disks = 9;
}

message ExecRequest {
    string program = 1;
    repeated string args = 2;
}

message ExecResponse {
    message Output {
        string stdout = 1;
        string stderr = 2;
    }

    oneof response {
        Output output = 1;
        int32  exit_code = 2;
        string error = 3;
    }
}

service Agent {
    rpc Health(google.protobuf.Empty) returns (stream HealthResponse);
    rpc GetSysInfo(google.protobuf.Empty) returns (SysInfoResponse);
    rpc Exec(ExecRequest) returns (stream ExecResponse);
}