syntax = "proto3";

package autopilotrpc;

option go_package = "github.com/lightningnetwork/lnd/lnrpc/autopilotrpc";

// Autopilot is a service that can be used to get information about the current
// state of the daemon's autopilot agent, and also supply it with information
// that can be used when deciding where to open channels.
service Autopilot {
    /*
    Status returns whether the daemon's autopilot agent is active.
    */
    rpc Status (StatusRequest) returns (StatusResponse);

    /*
    ModifyStatus is used to modify the status of the autopilot agent, like
    enabling or disabling it.
    */
    rpc ModifyStatus (ModifyStatusRequest) returns (ModifyStatusResponse);

    /*
    QueryScores queries all available autopilot heuristics, in addition to any
    active combination of these heruristics, for the scores they would give to
    the given nodes.
    */
    rpc QueryScores (QueryScoresRequest) returns (QueryScoresResponse);

    /*
    SetScores attempts to set the scores used by the running autopilot agent,
    if the external scoring heuristic is enabled.
    */
    rpc SetScores (SetScoresRequest) returns (SetScoresResponse);
}

message StatusRequest {
}

message StatusResponse {
    // Indicates whether the autopilot is active or not.
    bool active = 1;
}

message ModifyStatusRequest {
    // Whether the autopilot agent should be enabled or not.
    bool enable = 1;
}

message ModifyStatusResponse {
}

message QueryScoresRequest {
    repeated string pubkeys = 1;

    // If set, we will ignore the local channel state when calculating scores.
    bool ignore_local_state = 2;
}

message QueryScoresResponse {
    message HeuristicResult {
        string heuristic = 1;
        map<string, double> scores = 2;
    }

    repeated HeuristicResult results = 1;
}

message SetScoresRequest {
    // The name of the heuristic to provide scores to.
    string heuristic = 1;

    /*
    A map from hex-encoded public keys to scores. Scores must be in the range
    [0.0, 1.0].
    */
    map<string, double> scores = 2;
}

message SetScoresResponse {
}
