// Copyright IBM Corp. 2014, 2026
// SPDX-License-Identifier: MPL-2.0

// Terraform Plugin RPC protocol version 5.10
//
// This file defines version 5.10 of the RPC protocol. To implement a plugin
// against this protocol, copy this definition into your own codebase and
// use protoc to generate stubs for your target language.
//
// Any minor versions of protocol 5 to follow should modify this file while
// maintaining backwards compatibility. Breaking changes, if any are required,
// will come in a subsequent major version with its own separate proto definition.
//
// Note that only the proto files included in a release tag of Terraform are
// official protocol releases. Proto files taken from other commits may include
// incomplete changes or features that did not make it into a final release.
// In all reasonable cases, plugin developers should take the proto file from
// the tag of the most recent release of Terraform, and not from the main
// branch or any other development branch.
//
syntax = "proto3";
option go_package = "github.com/hashicorp/terraform/internal/tfplugin5";

import "google/protobuf/timestamp.proto";

package tfplugin5;

// DynamicValue is an opaque encoding of terraform data, with the field name
// indicating the encoding scheme used.
message DynamicValue {
    bytes msgpack = 1;
    bytes json = 2;
}

message Diagnostic {
    enum Severity {
        INVALID = 0;
        ERROR = 1;
        WARNING = 2;
    }
    Severity severity = 1;
    string summary = 2;
    string detail = 3;
    AttributePath attribute = 4;
}

message FunctionError {
    string text = 1;
    // The optional function_argument records the index position of the
    // argument which caused the error.
    optional int64 function_argument = 2;
}

message AttributePath {
    message Step {
        oneof selector {
            // Set "attribute_name" to represent looking up an attribute
            // in the current object value.
            string attribute_name = 1;
            // Set "element_key_*" to represent looking up an element in
            // an indexable collection type.
            string element_key_string = 2;
            int64 element_key_int = 3;
        }
    }
    repeated Step steps = 1;
}

message Stop {
    message Request {
    }
    message Response {
        string Error = 1;
    }
}

// RawState holds the stored state for a resource to be upgraded by the
// provider. It can be in one of two formats, the current json encoded format
// in bytes, or the legacy flatmap format as a map of strings.
message RawState {
    bytes json = 1;
    map<string, string> flatmap = 2;
}

enum StringKind {
    PLAIN = 0;
    MARKDOWN = 1;
}

// ResourceIdentitySchema represents the structure and types of data used to identify
// a managed resource type. Effectively, resource identity is a versioned object
// that can be used to compare resources, whether already managed and/or being
// discovered.
message ResourceIdentitySchema {
    // IdentityAttribute represents one value of data within resource identity. These
    // are always used in resource identity comparisons.
    message IdentityAttribute {
        // name is the identity attribute name
        string name = 1;

        // type is the identity attribute type
        bytes type = 2;

        // required_for_import when enabled signifies that this attribute must be
        // defined for ImportResourceState to complete successfully
        bool required_for_import = 3;

        // optional_for_import when enabled signifies that this attribute is not
        // required for ImportResourceState, because it can be supplied by the
        // provider. It is still possible to supply this attribute during import.
        bool optional_for_import = 4;

        // description is a human-readable description of the attribute in Markdown
        string description = 5;
    }

    // version is the identity version and separate from the Schema version.
    // Any time the structure or format of identity_attributes changes, this version
    // should be incremented. Versioning implicitly starts at 0 and by convention
    // should be incremented by 1 each change.
    //
    // When comparing identity_attributes data, differing versions should always be treated
    // as inequal.
    int64 version = 1;

    // identity_attributes are the individual value definitions which define identity data
    // for a managed resource type. This information is used to decode DynamicValue of
    // identity data.
    //
    // These attributes are intended for permanent identity data and must be wholly
    // representative of all data necessary to compare two managed resource instances
    // with no other data. This generally should include account, endpoint, location,
    // and automatically generated identifiers. For some resources, this may include
    // configuration-based data, such as a required name which must be unique.
    repeated IdentityAttribute identity_attributes = 2;
}

message ResourceIdentityData {
    // identity_data is the resource identity data for the given definition. It should
    // be decoded using the identity schema.
    //
    // This data is considered permanent for the identity version and suitable for
    // longer-term storage.
    DynamicValue identity_data = 1;
}

// ActionSchema defines the schema for an action that can be invoked by Terraform.
message ActionSchema {
    Schema schema = 1; // of the action itself
}

// Schema is the configuration schema for a Resource, Provider, or Provisioner.
message Schema {
    message Block {
        int64 version = 1;
        repeated Attribute attributes = 2;
        repeated NestedBlock block_types = 3;
        string description = 4;
        StringKind description_kind = 5;
        bool deprecated = 6;
        string deprecation_message = 7;
    }

    message Attribute {
        string name = 1;
        bytes type = 2;
        string description = 3;
        bool required = 4;
        bool optional = 5;
        bool computed = 6;
        bool sensitive = 7;
        StringKind description_kind = 8;
        bool deprecated = 9;
        bool write_only = 10;
        string deprecation_message = 11;
    }

    message NestedBlock {
        enum NestingMode {
            INVALID = 0;
            SINGLE = 1;
            LIST = 2;
            SET = 3;
            MAP = 4;
            GROUP = 5;
        }

        string type_name = 1;
        Block block = 2;
        NestingMode nesting = 3;
        int64 min_items = 4;
        int64 max_items = 5;
    }

    // The version of the schema.
    // Schemas are versioned, so that providers can upgrade a saved resource
    // state when the schema is changed.
    int64 version = 1;

    // Block is the top level configuration block for this schema.
    Block block = 2;
}

message Function {
    // parameters is the ordered list of positional function parameters.
    repeated Parameter parameters = 1;

    // variadic_parameter is an optional final parameter which accepts
    // zero or more argument values, in which Terraform will send an
    // ordered list of the parameter type.
    Parameter variadic_parameter = 2;

    // Return is the function return parameter.
    Return return = 3;

    // summary is the human-readable shortened documentation for the function.
    string summary = 4;

    // description is human-readable documentation for the function.
    string description = 5;

    // description_kind is the formatting of the description.
    StringKind description_kind = 6;

    // deprecation_message is human-readable documentation if the
    // function is deprecated.
    string deprecation_message = 7;

    message Parameter {
        // name is the human-readable display name for the parameter.
        string name = 1;

        // type is the type constraint for the parameter.
        bytes type = 2;

        // allow_null_value when enabled denotes that a null argument value can
        // be passed to the provider. When disabled, Terraform returns an error
        // if the argument value is null.
        bool allow_null_value = 3;

        // allow_unknown_values when enabled denotes that only wholly known
        // argument values will be passed to the provider. When disabled,
        // Terraform skips the function call entirely and assumes an unknown
        // value result from the function.
        bool allow_unknown_values = 4;

        // description is human-readable documentation for the parameter.
        string description = 5;

        // description_kind is the formatting of the description.
        StringKind description_kind = 6;
    }

    message Return {
        // type is the type constraint for the function result.
        bytes type = 1;
    }
}

// ServerCapabilities allows providers to communicate extra information
// regarding supported protocol features. This is used to indicate
// availability of certain forward-compatible changes which may be optional
// in a major protocol version, but cannot be tested for directly.
message ServerCapabilities {
    // The plan_destroy capability signals that a provider expects a call
    // to PlanResourceChange when a resource is going to be destroyed.
    bool plan_destroy = 1;

    // The get_provider_schema_optional capability indicates that this
    // provider does not require calling GetProviderSchema to operate
    // normally, and the caller can used a cached copy of the provider's
    // schema.
    bool get_provider_schema_optional = 2;

    // The move_resource_state capability signals that a provider supports the
    // MoveResourceState RPC.
    bool move_resource_state = 3;

    // The generate_resource_config capability signals that a provider supports
    // GenerateResourceConfig.
    bool generate_resource_config = 4;
}

// ClientCapabilities allows Terraform to publish information regarding
// supported protocol features. This is used to indicate availability of
// certain forward-compatible changes which may be optional in a major
// protocol version, but cannot be tested for directly.
message ClientCapabilities {
    // The deferral_allowed capability signals that the client is able to
    // handle deferred responses from the provider.
    bool deferral_allowed = 1;

    // The write_only_attributes_allowed capability signals that the client
    // is able to handle write_only attributes for managed resources.
    bool write_only_attributes_allowed = 2;
}

// Deferred is a message that indicates that change is deferred for a reason.
message Deferred {
    // Reason is the reason for deferring the change.
    enum Reason {
        // UNKNOWN is the default value, and should not be used.
        UNKNOWN = 0;
        // RESOURCE_CONFIG_UNKNOWN is used when the config is partially unknown and the real
        // values need to be known before the change can be planned.
        RESOURCE_CONFIG_UNKNOWN = 1;
        // PROVIDER_CONFIG_UNKNOWN is used when parts of the provider configuration
        // are unknown, e.g. the provider configuration is only known after the apply is done.
        PROVIDER_CONFIG_UNKNOWN = 2;
        // ABSENT_PREREQ is used when a hard dependency has not been satisfied.
        ABSENT_PREREQ = 3;
    }

    // reason is the reason for deferring the change.
    Reason reason = 1;
}

service Provider {
    //////// Information about what a provider supports/expects

    // GetMetadata returns upfront information about server capabilities and
    // supported resource types without requiring the server to instantiate all
    // schema information, which may be memory intensive.
    // This method is CURRENTLY UNUSED and it serves mostly for convenience
    // of code generation inside of terraform-plugin-mux.
    rpc GetMetadata(GetMetadata.Request) returns (GetMetadata.Response);

    // GetSchema returns schema information for the provider, data resources,
    // and managed resources.
    rpc GetSchema(GetProviderSchema.Request) returns (GetProviderSchema.Response);
    rpc PrepareProviderConfig(PrepareProviderConfig.Request) returns (PrepareProviderConfig.Response);
    rpc ValidateResourceTypeConfig(ValidateResourceTypeConfig.Request) returns (ValidateResourceTypeConfig.Response);
    rpc ValidateDataSourceConfig(ValidateDataSourceConfig.Request) returns (ValidateDataSourceConfig.Response);
    rpc UpgradeResourceState(UpgradeResourceState.Request) returns (UpgradeResourceState.Response);

    // GetResourceIdentitySchemas returns the identity schemas for all managed
    // resources.
    rpc GetResourceIdentitySchemas(GetResourceIdentitySchemas.Request) returns (GetResourceIdentitySchemas.Response);
    // UpgradeResourceIdentityData should return the upgraded resource identity
    // data for a managed resource type.
    rpc UpgradeResourceIdentity(UpgradeResourceIdentity.Request) returns (UpgradeResourceIdentity.Response);

    //////// One-time initialization, called before other functions below
    rpc Configure(Configure.Request) returns (Configure.Response);

    //////// Managed Resource Lifecycle
    rpc ReadResource(ReadResource.Request) returns (ReadResource.Response);
    rpc PlanResourceChange(PlanResourceChange.Request) returns (PlanResourceChange.Response);
    rpc ApplyResourceChange(ApplyResourceChange.Request) returns (ApplyResourceChange.Response);
    rpc ImportResourceState(ImportResourceState.Request) returns (ImportResourceState.Response);
    rpc MoveResourceState(MoveResourceState.Request) returns (MoveResourceState.Response);
    rpc ReadDataSource(ReadDataSource.Request) returns (ReadDataSource.Response);
    rpc GenerateResourceConfig(GenerateResourceConfig.Request) returns (GenerateResourceConfig.Response);

    //////// Ephemeral Resource Lifecycle
    rpc ValidateEphemeralResourceConfig(ValidateEphemeralResourceConfig.Request) returns (ValidateEphemeralResourceConfig.Response);
    rpc OpenEphemeralResource(OpenEphemeralResource.Request) returns (OpenEphemeralResource.Response);
    rpc RenewEphemeralResource(RenewEphemeralResource.Request) returns (RenewEphemeralResource.Response);
    rpc CloseEphemeralResource(CloseEphemeralResource.Request) returns (CloseEphemeralResource.Response);

    /////// List
    rpc ListResource(ListResource.Request) returns (stream ListResource.Event);
    rpc ValidateListResourceConfig(ValidateListResourceConfig.Request) returns (ValidateListResourceConfig.Response);

    // GetFunctions returns the definitions of all functions.
    rpc GetFunctions(GetFunctions.Request) returns (GetFunctions.Response);

    //////// Provider-contributed Functions
    rpc CallFunction(CallFunction.Request) returns (CallFunction.Response);

    //////// Actions
    rpc PlanAction(PlanAction.Request) returns (PlanAction.Response);
    rpc InvokeAction(InvokeAction.Request) returns (stream InvokeAction.Event);
    rpc ValidateActionConfig(ValidateActionConfig.Request) returns (ValidateActionConfig.Response);

    //////// Graceful Shutdown
    rpc Stop(Stop.Request) returns (Stop.Response);
}

message GetMetadata {
    message Request {
    }

    message Response {
        ServerCapabilities server_capabilities = 1;
        repeated Diagnostic diagnostics = 2;
        repeated DataSourceMetadata data_sources = 3;
        repeated ResourceMetadata resources = 4;
        // functions returns metadata for any functions.
        repeated FunctionMetadata functions = 5;
        repeated EphemeralMetadata ephemeral_resources = 6;
        repeated ListResourceMetadata list_resources = 7;
        repeated ActionMetadata actions = 8;
    }

    message EphemeralMetadata {
        string type_name = 1;
    }

    message FunctionMetadata {
        // name is the function name.
        string name = 1;
    }

    message DataSourceMetadata {
        string type_name = 1;
    }

    message ResourceMetadata {
        string type_name = 1;
    }

    message ListResourceMetadata {
        string type_name = 1;
    }
    
    message ActionMetadata {
        string type_name = 1;
    }
}

message GetProviderSchema {
    message Request {
    }
    message Response {
        Schema provider = 1;
        map<string, Schema> resource_schemas = 2;
        map<string, Schema> data_source_schemas = 3;
        map<string, Function> functions = 7;
        map<string, Schema> ephemeral_resource_schemas = 8;
        map<string, Schema> list_resource_schemas = 9;
        reserved 10; // Field number 10 is used by state stores in version 6
        map<string, ActionSchema> action_schemas = 11;
        repeated Diagnostic diagnostics = 4;
        Schema provider_meta = 5;
        ServerCapabilities server_capabilities = 6;
    }
}

message PrepareProviderConfig {
    message Request {
        DynamicValue config = 1;
    }
    message Response {
        DynamicValue prepared_config = 1;
        repeated Diagnostic diagnostics = 2;
    }
}

message UpgradeResourceState {
    // Request is the message that is sent to the provider during the
    // UpgradeResourceState RPC.
    //
    // This message intentionally does not include configuration data as any
    // configuration-based or configuration-conditional changes should occur
    // during the PlanResourceChange RPC. Additionally, the configuration is
    // not guaranteed to exist (in the case of resource destruction), be wholly
    // known, nor match the given prior state, which could lead to unexpected
    // provider behaviors for practitioners.
    message Request {
        string type_name = 1;

        // version is the schema_version number recorded in the state file
        int64 version = 2;

        // raw_state is the raw states as stored for the resource.  Core does
        // not have access to the schema of prior_version, so it's the
        // provider's responsibility to interpret this value using the
        // appropriate older schema. The raw_state will be the json encoded
        // state, or a legacy flat-mapped format.
        RawState raw_state = 3;
    }
    message Response {
        // new_state is a msgpack-encoded data structure that, when interpreted with
        // the _current_ schema for this resource type, is functionally equivalent to
        // that which was given in prior_state_raw.
        DynamicValue upgraded_state = 1;

        // diagnostics describes any errors encountered during migration that could not
        // be safely resolved, and warnings about any possibly-risky assumptions made
        // in the upgrade process.
        repeated Diagnostic diagnostics = 2;
    }
}

message GetResourceIdentitySchemas {
    message Request {
    }

    message Response {
        // identity_schemas is a mapping of resource type names to their identity schemas.
        map<string, ResourceIdentitySchema> identity_schemas = 1;

        // diagnostics is the collection of warning and error diagnostics for this request.
        repeated Diagnostic diagnostics = 2;
    }
}

message UpgradeResourceIdentity {
    message Request {
        // type_name is the managed resource type name
        string type_name = 1;

        // version is the version of the resource identity data to upgrade
        int64 version = 2;

        // raw_identity is the raw identity as stored for the resource. Core does
        // not have access to the identity schema of prior_version, so it's the
        // provider's responsibility to interpret this value using the
        // appropriate older schema. The raw_identity will be json encoded.
        RawState raw_identity = 3;
    }

    message Response {
        // upgraded_identity returns the upgraded resource identity data
        ResourceIdentityData upgraded_identity = 1;

        // diagnostics is the collection of warning and error diagnostics for this request
        repeated Diagnostic diagnostics = 2;
    }
}

message ValidateResourceTypeConfig {
    message Request {
        string type_name = 1;
        DynamicValue config = 2;
        ClientCapabilities client_capabilities = 3;
    }
    message Response {
        repeated Diagnostic diagnostics = 1;
    }
}

message ValidateDataSourceConfig {
    message Request {
        string type_name = 1;
        DynamicValue config = 2;
    }
    message Response {
        repeated Diagnostic diagnostics = 1;
    }
}

message ValidateEphemeralResourceConfig {
    message Request {
        string type_name = 1;
        DynamicValue config = 2;
    }
    message Response {
        repeated Diagnostic diagnostics = 1;
    }
}

message Configure {
    message Request {
        string terraform_version = 1;
        DynamicValue config = 2;
        ClientCapabilities client_capabilities = 3;
    }
    message Response {
        repeated Diagnostic diagnostics = 1;
    }
}

message ReadResource {
    // Request is the message that is sent to the provider during the
    // ReadResource RPC.
    //
    // This message intentionally does not include configuration data as any
    // configuration-based or configuration-conditional changes should occur
    // during the PlanResourceChange RPC. Additionally, the configuration is
    // not guaranteed to be wholly known nor match the given prior state, which
    // could lead to unexpected provider behaviors for practitioners.
    message Request {
        string type_name = 1;
        DynamicValue current_state = 2;
        bytes private = 3;
        DynamicValue provider_meta = 4;
        ClientCapabilities client_capabilities = 5;
        ResourceIdentityData current_identity = 6;
    }
    message Response {
        DynamicValue new_state = 1;
        repeated Diagnostic diagnostics = 2;
        bytes private = 3;
        // deferred is set if the provider is deferring the change. If set the caller
        // needs to handle the deferral.
        Deferred deferred = 4;
        ResourceIdentityData new_identity = 5;
    }
}

message PlanResourceChange {
    message Request {
        string type_name = 1;
        DynamicValue prior_state = 2;
        DynamicValue proposed_new_state = 3;
        DynamicValue config = 4;
        bytes prior_private = 5;
        DynamicValue provider_meta = 6;
        ClientCapabilities client_capabilities = 7;
        ResourceIdentityData prior_identity = 8;
    }

    message Response {
        DynamicValue planned_state = 1;
        repeated AttributePath requires_replace = 2;
        bytes planned_private = 3;
        repeated Diagnostic diagnostics = 4;

        // This may be set only by the helper/schema "SDK" in the main Terraform
        // repository, to request that Terraform Core >=0.12 permit additional
        // inconsistencies that can result from the legacy SDK type system
        // and its imprecise mapping to the >=0.12 type system.
        // The change in behavior implied by this flag makes sense only for the
        // specific details of the legacy SDK type system, and are not a general
        // mechanism to avoid proper type handling in providers.
        //
        //     ====              DO NOT USE THIS              ====
        //     ==== THIS MUST BE LEFT UNSET IN ALL OTHER SDKS ====
        //     ====              DO NOT USE THIS              ====
        bool legacy_type_system = 5;

        // deferred is set if the provider is deferring the change. If set the caller
        // needs to handle the deferral.
        Deferred deferred = 6;

        ResourceIdentityData planned_identity = 7;
    }
}

message ApplyResourceChange {
    message Request {
        string type_name = 1;
        DynamicValue prior_state = 2;
        DynamicValue planned_state = 3;
        DynamicValue config = 4;
        bytes planned_private = 5;
        DynamicValue provider_meta = 6;
        ResourceIdentityData planned_identity = 7;
    }
    message Response {
        DynamicValue new_state = 1;
        bytes private = 2;
        repeated Diagnostic diagnostics = 3;

        // This may be set only by the helper/schema "SDK" in the main Terraform
        // repository, to request that Terraform Core >=0.12 permit additional
        // inconsistencies that can result from the legacy SDK type system
        // and its imprecise mapping to the >=0.12 type system.
        // The change in behavior implied by this flag makes sense only for the
        // specific details of the legacy SDK type system, and are not a general
        // mechanism to avoid proper type handling in providers.
        //
        //     ====              DO NOT USE THIS              ====
        //     ==== THIS MUST BE LEFT UNSET IN ALL OTHER SDKS ====
        //     ====              DO NOT USE THIS              ====
        bool legacy_type_system = 4;

        ResourceIdentityData new_identity = 5;
    }
}

message ImportResourceState {
    message Request {
        string type_name = 1;
        string id = 2;
        ClientCapabilities client_capabilities = 3;
        ResourceIdentityData identity = 4;
    }

    message ImportedResource {
        string type_name = 1;
        DynamicValue state = 2;
        bytes private = 3;
        ResourceIdentityData identity = 4;
    }

    message Response {
        repeated ImportedResource imported_resources = 1;
        repeated Diagnostic diagnostics = 2;
        // deferred is set if the provider is deferring the change. If set the caller
        // needs to handle the deferral.
        Deferred deferred = 3;
    }
}

message GenerateResourceConfig {
    message Request {
        string type_name = 1;
        DynamicValue state = 2;
    }

    message Response {
        // config is the provided state modified such that it represents a valid resource configuration value.
        DynamicValue config = 1;
        repeated Diagnostic diagnostics = 2;
    }
}

message MoveResourceState {
    message Request {
        // The address of the provider the resource is being moved from.
        string source_provider_address = 1;

        // The resource type that the resource is being moved from.
        string source_type_name = 2;

        // The schema version of the resource type that the resource is being
        // moved from.
        int64 source_schema_version = 3;

        // The raw state of the resource being moved. Only the json field is
        // populated, as there should be no legacy providers using the flatmap
        // format that support newly introduced RPCs.
        RawState source_state = 4;

        // The resource type that the resource is being moved to.
        string target_type_name = 5;

        // The private state of the resource being moved.
        bytes source_private = 6;

        // The raw identity of the resource being moved. Only the json field is
        // populated, as there should be no legacy providers using the flatmap
        // format that support newly introduced RPCs.
        RawState source_identity = 7;

        // The identity schema version of the resource type that the resource
        // is being moved from.
        int64 source_identity_schema_version = 8;
    }

    message Response {
        // The state of the resource after it has been moved.
        DynamicValue target_state = 1;

        // Any diagnostics that occurred during the move.
        repeated Diagnostic diagnostics = 2;

        // The private state of the resource after it has been moved.
        bytes target_private = 3;

        ResourceIdentityData target_identity = 4;
    }
}

message ReadDataSource {
    message Request {
        string type_name = 1;
        DynamicValue config = 2;
        DynamicValue provider_meta = 3;
        ClientCapabilities client_capabilities = 4;
    }
    message Response {
        DynamicValue state = 1;
        repeated Diagnostic diagnostics = 2;
        // deferred is set if the provider is deferring the change. If set the caller
        // needs to handle the deferral.
        Deferred deferred = 3;
    }
}

service Provisioner {
    rpc GetSchema(GetProvisionerSchema.Request) returns (GetProvisionerSchema.Response);
    rpc ValidateProvisionerConfig(ValidateProvisionerConfig.Request) returns (ValidateProvisionerConfig.Response);
    rpc ProvisionResource(ProvisionResource.Request) returns (stream ProvisionResource.Response);
    rpc Stop(Stop.Request) returns (Stop.Response);
}

message GetProvisionerSchema {
    message Request {
    }
    message Response {
        Schema provisioner = 1;
        repeated Diagnostic diagnostics = 2;
    }
}

message ValidateProvisionerConfig {
    message Request {
        DynamicValue config = 1;
    }
    message Response {
        repeated Diagnostic diagnostics = 1;
    }
}

message ProvisionResource {
    message Request {
        DynamicValue config = 1;
        DynamicValue connection = 2;
    }
    message Response {
        string output = 1;
        repeated Diagnostic diagnostics = 2;
    }
}

message OpenEphemeralResource {
    message Request {
        string type_name = 1;
        DynamicValue config = 2;
        ClientCapabilities client_capabilities = 3;
    }
    message Response {
        repeated Diagnostic diagnostics = 1;
        optional google.protobuf.Timestamp renew_at = 2;
        DynamicValue result = 3;
        optional bytes private = 4;
        Deferred deferred = 5;
    }
}

message RenewEphemeralResource {
    message Request {
        string type_name = 1;
        optional bytes private = 2;
    }
    message Response {
        repeated Diagnostic diagnostics = 1;
        optional google.protobuf.Timestamp renew_at = 2;
        optional bytes private = 3;
    }
}

message CloseEphemeralResource {
    message Request {
        string type_name = 1;
        optional bytes private = 2;
    }
    message Response {
        repeated Diagnostic diagnostics = 1;
    }
}

message GetFunctions {
    message Request {}

    message Response {
        // functions is a mapping of function names to definitions.
        map<string, Function> functions = 1;

        // diagnostics is any warnings or errors.
        repeated Diagnostic diagnostics = 2;
    }
}

message CallFunction {
    message Request {
        string name = 1;
        repeated DynamicValue arguments = 2;
    }
    message Response {
        DynamicValue result = 1;
        FunctionError error = 2;
    }
}

message ListResource {
    message Request {
        // type_name is the list resource type name.
        string type_name = 1;

        // configuration is the list ConfigSchema-based configuration data.
        DynamicValue config = 2;

        // when include_resource_object is set to true, the provider should
        // include the full resource object for each result
        bool include_resource_object = 3;

        // The maximum number of results that Terraform is expecting.
        // The stream will stop, once this limit is reached.
        int64 limit = 4;
    }

    message Event {
        // identity is the resource identity data of the resource instance.
        ResourceIdentityData identity = 1;

        // display_name can be displayed in a UI to make it easier for humans to identify a resource
        string display_name = 2;

        // optional resource object which can be useful when combining list blocks in configuration
        optional DynamicValue resource_object = 3;

        // A warning or error diagnostics for this event
        repeated Diagnostic diagnostic = 4;
    }
}

message ValidateListResourceConfig {
    message Request {
        string type_name = 1;
        DynamicValue config = 2;
        DynamicValue include_resource_object = 3;
        DynamicValue limit = 4;
    }
    message Response {
        repeated Diagnostic diagnostics = 1;
    }
}

message PlanAction {
    message Request {
        string action_type = 1;
        // config of the action, based on the schema of the actual action
        DynamicValue config = 2;
        // metadata
        ClientCapabilities client_capabilities = 3;
    }

    message Response {
        repeated Diagnostic diagnostics = 1;
        // metadata
        Deferred deferred = 2;
    }
}

message InvokeAction {
    message Request {
        string action_type = 1;
        // response from the plan
        DynamicValue config = 2;
        // metadata
        ClientCapabilities client_capabilities = 3;
    }

    message Event {
      message Progress {
        // message to be printed in the console / HCPT
        string message = 1;
      }
      message Completed {
        repeated Diagnostic diagnostics = 1;
    }

    oneof type {
      Progress progress = 1;
      Completed completed = 2;
    }
  }
}

message ValidateActionConfig {
    message Request {
        string type_name = 1;
        DynamicValue config = 2;
    }
    message Response {
        repeated Diagnostic diagnostics = 1;
    }
}
