use super::{FileDigestScope, FileIdentity, RecordedFileDigest};
use crate::{ActionPrediction, CacheDigest, RemoteActionResult};
use serde::{Deserialize, Serialize};
use std::collections::BTreeMap;
use std::path::PathBuf;
pub const AGENT_PROTOCOL_VERSION: u8 = 6;
pub(super) const MAX_REQUEST_BYTES: usize = 16 * 1024 * 1024;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum AgentRequest {
Hello {
protocol: u8,
client_version: String,
},
BeginTask {
task: String,
},
CommitTask {
run: String,
},
FindBlob {
digest: CacheDigest,
},
FindBlobs {
digests: Vec<CacheDigest>,
},
StoreBlob {
digest: CacheDigest,
source: PathBuf,
},
FindActionResult {
action: CacheDigest,
},
RecordActionHit {
action: CacheDigest,
restore: RestoreStats,
crate_name: Option<String>,
},
RecordBypass {
kind: String,
},
RecordUnconsulted,
RecordCompilerInvocation {
outcome: String,
crate_name: Option<String>,
duration_ns: u64,
},
RecordActionVerification {
matched: bool,
restore: RestoreStats,
},
StoreActionResult {
result: RemoteActionResult,
},
FindActionPrediction {
task: String,
invocation: CacheDigest,
},
RecordActionPrediction {
task: String,
prediction: ActionPrediction,
},
FindExecutableIdentity {
executable: PathBuf,
environment: BTreeMap<String, Option<String>>,
},
StoreExecutableIdentity {
executable: PathBuf,
environment: BTreeMap<String, Option<String>>,
stdout: Vec<u8>,
},
RecordWarning {
message: String,
},
FindFileDigests {
scope: FileDigestScope,
files: Vec<FileIdentity>,
},
RecordFileDigests {
scope: FileDigestScope,
entries: Vec<RecordedFileDigest>,
},
JoinActionPromise {
adapter: String,
invocation: CacheDigest,
},
CompleteActionPromise {
claim: String,
prediction: ActionPrediction,
},
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct RestoreStats {
pub duration_ns: u64,
pub avoided_compiler_duration_ns: u64,
pub output_files: u64,
pub output_bytes: u64,
pub reflinked_output_files: u64,
pub reflinked_output_bytes: u64,
pub copied_output_files: u64,
pub copied_output_bytes: u64,
pub reused_output_files: u64,
pub reused_output_bytes: u64,
}
#[derive(Debug, Clone)]
#[non_exhaustive]
pub enum AgentEvent {
ActionHit {
crate_name: Option<String>,
restore: RestoreStats,
},
Bypass {
kind: String,
},
Unconsulted,
CompilerInvocation {
outcome: String,
crate_name: Option<String>,
duration_ns: u64,
},
Verification {
matched: bool,
restore: RestoreStats,
},
Warning {
message: String,
},
}
pub trait AgentEventObserver: Send + Sync {
fn event(&self, event: AgentEvent);
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum AgentResponse {
Hello {
protocol: u8,
agent_version: String,
},
TaskBegun {
run: String,
},
TaskCommitted,
Blob {
path: Option<PathBuf>,
},
Blobs {
paths: Vec<Option<PathBuf>>,
},
Stored {
path: PathBuf,
},
ActionResult {
result: Option<RemoteActionResult>,
},
ActionHitRecorded,
ActionVerificationRecorded,
BypassRecorded,
UnconsultedRecorded,
CompilerInvocationRecorded,
ActionStored {
path: PathBuf,
},
ActionPrediction {
prediction: Option<ActionPrediction>,
},
ActionPredictionRecorded,
ExecutableIdentity {
stdout: Option<Vec<u8>>,
},
Error {
message: String,
},
WarningRecorded,
FileDigests {
digests: Vec<Option<CacheDigest>>,
},
FileDigestsRecorded,
ActionPromise {
claim: Option<String>,
prediction: Option<ActionPrediction>,
},
ActionPromiseCompleted,
}