syntax = "proto3";
option go_package = "agent/v1;agent";

package agent.v1;

import "google/protobuf/timestamp.proto";
// import "proto/aclk/v1/lib.proto";

message CancelPendingRequest {
    // must match the ID sent with the request originally made
    // other than this agent will not put conditions on it
    // and will treat it as opaque string (it simply has to match)
    // However this doesn't mean there are no conditions on the id
    // made on the request side
    string request_id = 1;

    // time when the cancellation request was generated
    google.protobuf.Timestamp timestamp = 2;

    // optional might be useful for debugging purposes
    string trace_id = 3;
}

// AgentCommand is sent from the Cloud to the Agent at `/agent/{claim_id}/inbound/v1/cmd/AgentCommand`
// the message includes the resource that the Cloud needs to GET from the Agent HTTP API along with related metadata
message AgentCommand {
    // the topic to which the Cloud awaits for the AgentCommandResponse.
    // example: `/svc/agent-data-ctrl/2d7b7edd-561e-4aec-8ac1-466a585520f5/resp`
    string callback_topic = 1;
    // the topic to which the Cloud awaits for the AgentCommandAck.
    // example: `/svc/agent-data-ctrl/2d7b7edd-561e-4aec-8ac1-466a585520f5/resp`
    string ack_topic = 2;
    // unique identifier for the AgentCommand
    // example: `617038b3-7c2a-4617-a78f-ab37bd820198`
    string message_id = 3;
    // defined in milliseconds, the time the Agent has to respond before Cloud
    // considering the request as timed-out
    // example: `60000`
    uint64 timeout = 4;
    // defined in milliseconds, the time the Agent has to send back to the Cloud
    // an AgentCommandAck message signaling that is still working on the request
    // example: `3000`
    uint64 ack_timeout = 5;
    // the requested Agent resource
    // example: `/api/v2/data?query_params_go_here`
    string resource = 6;
}

// AgentCommandAck is sent from the Agent to the Cloud at predefined intervals (`AgentCommand.ack_timeout`) to predefined topic (`AgentCommand.ack_topic`)
// signaling that the Agent is still working to serve an AgentCommand (referenced by the message_id) that the Cloud sent
message AgentCommandAck {
    // unique identifier to reference AgentCommand on which the Agent is still working on serving
    // example: `617038b3-7c2a-4617-a78f-ab37bd820198`
    string message_id = 1;
    // the timestamp when the Agent created this AgentCommandAck message
    google.protobuf.Timestamp created_at = 2;
    // integer revealing the progress of completion to serve the AgentCommand with the given message_id
    // example: `25`
    uint32 progress_percent = 3;
}

// AgentCommandResponse is sent from the Agent to the Cloud at `/agent/{claim_id}/inbound/v1/cmd/AgentCommand`
// the message includes the resource that the Cloud needs to GET from the Agent HTTP API along with related metadata
message AgentCommandResponse {
    // unique identifier for the AgentCommand
    // example: `617038b3-7c2a-4617-a78f-ab37bd820198`
    string message_id = 1;
    // the (http) status code of the Agent's API response
    // example: `200`
    uint32 status_code = 2;
    // the dumped raw (http) response the Agent's API returned
    bytes response = 3;
    // the Agent's timestamp (aka legacy `timestamp`)
    google.protobuf.Timestamp timestamp = 4;
    // the timestamp when the Agent received the AgentCommand for execution (aka legacy `t-rx`)
    google.protobuf.Timestamp received_at = 5;
    // the amount of microseconds the Agent needed to execute the HTTP request of the AgentCommand (aka legacy`t-exec`)
    uint64 exec_time = 6;
}
