syntax = "proto3";

package moby.buildkit.v1.frontend;

option go_package = "github.com/moby/buildkit/frontend/gateway/pb;moby_buildkit_v1_frontend";

import "github.com/moby/buildkit/api/types/worker.proto";
import "github.com/moby/buildkit/solver/pb/ops.proto";
import "github.com/moby/buildkit/sourcepolicy/pb/policy.proto";
import "github.com/moby/buildkit/util/apicaps/pb/caps.proto";
import "github.com/tonistiigi/fsutil/types/stat.proto";
import "google/protobuf/timestamp.proto";
import "google/rpc/status.proto";

service LLBBridge {
	// apicaps:CapResolveImage
	rpc ResolveImageConfig(ResolveImageConfigRequest) returns (ResolveImageConfigResponse);
	// apicaps:CapSourceMetaResolver
	rpc ResolveSourceMeta(ResolveSourceMetaRequest) returns (ResolveSourceMetaResponse);
	// apicaps:CapSolveBase
	rpc Solve(SolveRequest) returns (SolveResponse);
	// apicaps:CapReadFile
	rpc ReadFile(ReadFileRequest) returns (ReadFileResponse);
	// apicaps:CapReadDir
	rpc ReadDir(ReadDirRequest) returns (ReadDirResponse);
	// apicaps:CapStatFile
	rpc StatFile(StatFileRequest) returns (StatFileResponse);
	// apicaps:CapGatewayEvaluate
	rpc Evaluate(EvaluateRequest) returns (EvaluateResponse);
	rpc Ping(PingRequest) returns (PongResponse);
	rpc Return(ReturnRequest) returns (ReturnResponse);
	// apicaps:CapFrontendInputs
	rpc Inputs(InputsRequest) returns (InputsResponse);

	rpc NewContainer(NewContainerRequest) returns (NewContainerResponse);
	rpc ReleaseContainer(ReleaseContainerRequest) returns (ReleaseContainerResponse);
	rpc ExecProcess(stream ExecMessage) returns (stream ExecMessage);

	// apicaps:CapGatewayWarnings
	rpc Warn(WarnRequest) returns (WarnResponse);
}

message Result {
	oneof result {
		// Deprecated non-array refs.
		string refDeprecated = 1;
		RefMapDeprecated refsDeprecated = 2;

		Ref ref = 3;
		RefMap refs = 4;
	}
	map<string, bytes> metadata = 10;
	// 11 was used during development and is reserved for old attestation format
	map<string, Attestations> attestations = 12;
}

message RefMapDeprecated {
	map<string, string> refs = 1;
}

message Ref {
	string id = 1;
	pb.Definition def = 2;
}

message RefMap {
	map<string, Ref> refs = 1;
}

message Attestations {
	repeated Attestation attestation = 1;
}

message Attestation {
	AttestationKind kind = 1;
	map<string, bytes> metadata = 2;

	Ref ref = 3;
	string path = 4;
	string inTotoPredicateType = 5;
	repeated InTotoSubject inTotoSubjects = 6;
}

enum AttestationKind {
	InToto = 0;
	Bundle = 1;
}

message InTotoSubject {
	InTotoSubjectKind kind = 1;

	repeated string digest = 2;
	string name = 3;
}

enum InTotoSubjectKind {
	Self = 0;
	Raw = 1;
}

message ReturnRequest {
	Result result = 1;
	google.rpc.Status error = 2;
}

message ReturnResponse {
}

message InputsRequest {
}

message InputsResponse {
	map<string, pb.Definition> Definitions = 1;
}

message ResolveImageConfigRequest {
	string Ref = 1;
	pb.Platform Platform = 2;
	string ResolveMode = 3;
	string LogName = 4;
	int32 ResolverType = 5;
	string SessionID = 6;
	string StoreID = 7;
	repeated moby.buildkit.v1.sourcepolicy.Policy SourcePolicies = 8;
}

message ResolveImageConfigResponse {
	string Digest = 1;
	bytes Config = 2;
	string Ref = 3;
}

message ResolveSourceMetaRequest {
	pb.SourceOp Source = 1;
	pb.Platform Platform = 2;
	string LogName = 3;
	string ResolveMode = 4;
	ResolveSourceGitRequest Git = 5;
	ResolveSourceImageRequest Image = 6;
	repeated moby.buildkit.v1.sourcepolicy.Policy SourcePolicies = 8;
}

message ResolveSourceMetaResponse {
	pb.SourceOp Source = 1;
	ResolveSourceImageResponse Image = 2;
	ResolveSourceGitResponse Git = 3;
	ResolveSourceHTTPResponse HTTP = 4;
}

message ResolveSourceImageRequest {
	bool NoConfig = 1;
	bool AttestationChain = 2;
}

message AttestationChain {
	string Root = 1;
	string ImageManifest = 2;
	string AttestationManifest = 3;
	repeated string SignatureManifests = 4;
	map<string, Blob> Blobs = 5;
}

message ResolveSourceImageResponse {
	string Digest = 1;
	bytes Config = 2;
	AttestationChain AttestationChain = 3;
}

message ResolveSourceGitRequest {
	// Return full commit and tag object bytes.
	bool ReturnObject = 1;
}

message ResolveSourceGitResponse {
	string Checksum = 1;
	string Ref = 2;
	string CommitChecksum = 3;
	bytes CommitObject = 4;
	bytes TagObject = 5;
}

message ResolveSourceHTTPResponse {
	string Checksum = 1;
	string Filename = 2;
	google.protobuf.Timestamp LastModified = 3;
}

message SolveRequest {
	pb.Definition Definition = 1;
	string Frontend = 2;
	map<string, string> FrontendOpt = 3;
	// 4 was removed in BuildKit v0.11.0.
	bool allowResultReturn = 5;
	bool allowResultArrayRef = 6;

	// apicaps.CapSolveInlineReturn deprecated
	bool Final = 10;
	bytes ExporterAttr = 11;
	// CacheImports was added in BuildKit v0.4.0.
	// apicaps:CapImportCaches
	repeated CacheOptionsEntry CacheImports = 12;

	// apicaps:CapFrontendInputs
	map<string, pb.Definition> FrontendInputs = 13;

	bool Evaluate = 14;

	repeated moby.buildkit.v1.sourcepolicy.Policy SourcePolicies = 15;
}

// CacheOptionsEntry corresponds to the control.CacheOptionsEntry
message CacheOptionsEntry {
	string Type = 1;
	map<string, string> Attrs = 2;
}

message SolveResponse {
	// deprecated
	string ref = 1; // can be used by readfile request
	// deprecated
	// bytes ExporterAttr = 2;

	// these fields are returned when allowMapReturn was set
	Result result = 3;
}

message ReadFileRequest {
	string Ref = 1;
	string FilePath = 2;
	FileRange Range = 3;
}

message FileRange {
	int64 Offset = 1;
	int64 Length = 2;
}

message ReadFileResponse {
	bytes Data = 1;
}

message ReadDirRequest {
	string Ref = 1;
	string DirPath = 2;
	string IncludePattern = 3;
}

message ReadDirResponse {
	repeated fsutil.types.Stat entries = 1;
}

message StatFileRequest {
	string Ref = 1;
	string Path = 2;
}

message StatFileResponse {
	fsutil.types.Stat stat = 1;
}

message EvaluateRequest {
	string Ref = 1;
}

message EvaluateResponse {
}

message PingRequest{
}
message PongResponse{
	repeated moby.buildkit.v1.apicaps.APICap FrontendAPICaps = 1;
	repeated moby.buildkit.v1.apicaps.APICap LLBCaps = 2;
	repeated moby.buildkit.v1.types.WorkerRecord Workers = 3;
}

message WarnRequest {
	string digest = 1;
	int64 level = 2;
	bytes short = 3;
	repeated bytes detail = 4;
	string url = 5;
	pb.SourceInfo info = 6;
	repeated pb.Range ranges = 7;
}

message WarnResponse{}

message NewContainerRequest {
	string ContainerID = 1;
	// For mount input values we can use random identifiers passed with ref
	repeated pb.Mount Mounts = 2;
	pb.NetMode Network = 3;
	pb.Platform platform = 4;
	pb.WorkerConstraints constraints = 5;
	repeated pb.HostIP extraHosts = 6;
	string hostname = 7;
}

message NewContainerResponse{}

message ReleaseContainerRequest {
	string ContainerID = 1;
}

message ReleaseContainerResponse{}

message ExecMessage {
	string ProcessID = 1;
	oneof Input {
		// InitMessage sent from client to server will start a new process in a
		// container
		InitMessage Init = 2;
		// FdMessage used from client to server for input (stdin) and
		// from server to client for output (stdout, stderr)
		FdMessage File = 3;
		// ResizeMessage used from client to server for terminal resize events
		ResizeMessage Resize = 4;
		// StartedMessage sent from server to client after InitMessage to
		// indicate the process has started.
		StartedMessage Started = 5;
		// ExitMessage sent from server to client will contain the exit code
		// when the process ends.
		ExitMessage Exit = 6;
		// DoneMessage from server to client will be the last message for any
		// process.  Note that FdMessage might be sent after ExitMessage.
		DoneMessage Done = 7;
		// SignalMessage is used from client to server to send signal events
		SignalMessage Signal = 8;
	}
}

message InitMessage{
	string ContainerID = 1;
	pb.Meta Meta = 2;
	repeated uint32 Fds = 3;
	bool Tty = 4;
	pb.SecurityMode Security = 5;
	repeated pb.SecretEnv secretenv = 6;
}

message ExitMessage {
	uint32 Code = 1;
	google.rpc.Status Error = 2;
}

message StartedMessage{}

message DoneMessage{}

message FdMessage{
	uint32 Fd = 1; // what fd the data was from
	bool EOF = 2;  // true if eof was reached
	bytes Data = 3;
}

message ResizeMessage{
	uint32 Rows = 1;
	uint32 Cols = 2;
}

message SignalMessage {
	// we only send name (ie HUP, INT) because the int values
	// are platform dependent.
	string Name = 1;
}

message Blob {
	Descriptor descriptor = 1;
	bytes data = 2;
}

message Descriptor {
	string media_type = 1;
	string digest = 2;
	int64 size = 3;
	map<string, string> annotations = 5;
}