#[derive(Copy, Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum ArtifactType {
Plan,
DevelopmentResult,
Issues,
FixResult,
CommitMessage,
}
#[derive(Copy, Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum PromptMode {
Normal,
XsdRetry,
Continuation,
SameAgentRetry,
}
#[derive(Copy, Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum SameAgentRetryReason {
Timeout,
TimeoutWithContext,
InternalError,
Other,
}
impl std::fmt::Display for ArtifactType {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Plan => write!(f, "plan"),
Self::DevelopmentResult => write!(f, "development_result"),
Self::Issues => write!(f, "issues"),
Self::FixResult => write!(f, "fix_result"),
Self::CommitMessage => write!(f, "commit_message"),
}
}
}
#[derive(Copy, Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum DevelopmentStatus {
Completed,
Partial,
Failed,
}
#[derive(Copy, Clone, Debug, PartialEq, Eq, Default, Serialize, Deserialize)]
pub enum FixStatus {
#[default]
AllIssuesAddressed,
IssuesRemain,
NoIssuesFound,
Failed,
}
impl std::fmt::Display for DevelopmentStatus {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Completed => write!(f, "completed"),
Self::Partial => write!(f, "partial"),
Self::Failed => write!(f, "failed"),
}
}
}
impl std::fmt::Display for FixStatus {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::AllIssuesAddressed => write!(f, "all_issues_addressed"),
Self::IssuesRemain => write!(f, "issues_remain"),
Self::NoIssuesFound => write!(f, "no_issues_found"),
Self::Failed => write!(f, "failed"),
}
}
}
impl FixStatus {
#[must_use]
pub fn parse(s: &str) -> Option<Self> {
match s {
"all_issues_addressed" => Some(Self::AllIssuesAddressed),
"issues_remain" => Some(Self::IssuesRemain),
"no_issues_found" => Some(Self::NoIssuesFound),
"failed" => Some(Self::Failed),
_ => None,
}
}
#[must_use]
pub const fn is_complete(&self) -> bool {
matches!(self, Self::AllIssuesAddressed | Self::NoIssuesFound)
}
#[must_use]
pub const fn needs_continuation(&self) -> bool {
matches!(self, Self::IssuesRemain | Self::Failed)
}
}
#[derive(Clone, Serialize, Deserialize, Debug)]
pub enum RebaseState {
NotStarted,
InProgress {
original_head: String,
target_branch: String,
},
Conflicted {
original_head: String,
target_branch: String,
files: Vec<PathBuf>,
resolution_attempts: u32,
},
Completed {
new_head: String,
},
Skipped,
}
impl RebaseState {
#[doc(hidden)]
#[cfg(any(test, feature = "test-utils"))]
#[must_use]
pub const fn is_terminal(&self) -> bool {
matches!(self, Self::Completed { .. } | Self::Skipped)
}
#[must_use]
pub fn current_head(&self) -> Option<String> {
match self {
Self::InProgress { original_head, .. } => Some(original_head.clone()),
Self::NotStarted | Self::Skipped | Self::Conflicted { .. } => None,
Self::Completed { new_head } => Some(new_head.clone()),
}
}
#[doc(hidden)]
#[cfg(any(test, feature = "test-utils"))]
#[must_use]
pub const fn is_in_progress(&self) -> bool {
matches!(
self,
Self::InProgress { .. } | Self::Conflicted { .. }
)
}
}
pub const MAX_VALIDATION_RETRY_ATTEMPTS: u32 = 100;
pub const MAX_DEV_VALIDATION_RETRY_ATTEMPTS: u32 = 10;
pub const MAX_DEV_INVALID_OUTPUT_RERUNS: u32 = 2;
pub const MAX_PLAN_INVALID_OUTPUT_RERUNS: u32 = 2;
#[derive(Clone, Serialize, Deserialize, Debug)]
pub enum CommitState {
NotStarted,
Generating { attempt: u32, max_attempts: u32 },
Generated { message: String },
Committed { hash: String },
Skipped,
}
impl CommitState {
#[doc(hidden)]
#[cfg(any(test, feature = "test-utils"))]
#[must_use]
pub const fn is_terminal(&self) -> bool {
matches!(self, Self::Committed { .. } | Self::Skipped)
}
}
#[derive(Copy, Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum PromptInputKind {
Prompt,
Plan,
Diff,
LastOutput,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum PromptInputRepresentation {
Inline,
FileReference {
path: PathBuf,
},
}
#[derive(Copy, Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum PromptMaterializationReason {
WithinBudgets,
InlineBudgetExceeded,
ModelBudgetExceeded,
PolicyForcedReference,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct MaterializedPromptInput {
pub kind: PromptInputKind,
pub content_id_sha256: String,
pub consumer_signature_sha256: String,
pub original_bytes: u64,
pub final_bytes: u64,
#[serde(default)]
pub model_budget_bytes: Option<u64>,
#[serde(default)]
pub inline_budget_bytes: Option<u64>,
pub representation: PromptInputRepresentation,
pub reason: PromptMaterializationReason,
}