pub mod codec;
use std::collections::BTreeMap;
use std::path::PathBuf;
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use serde_json::Value;
use crate::ontology::Residue;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum Lane {
Triage,
Todo,
Scheduled,
Ready,
Running,
Blocked,
Review,
Done,
Archived,
#[serde(other)]
Unknown,
}
impl Lane {
pub fn parse(word: &str) -> Self {
match word {
"triage" => Self::Triage,
"todo" => Self::Todo,
"scheduled" => Self::Scheduled,
"ready" => Self::Ready,
"running" => Self::Running,
"blocked" => Self::Blocked,
"review" => Self::Review,
"done" => Self::Done,
"archived" => Self::Archived,
_ => Self::Unknown,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum WorkspaceKind {
Scratch,
Dir,
Worktree,
#[serde(other)]
Unknown,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct Workspace {
pub kind: WorkspaceKind,
#[serde(default)]
pub path: Option<String>,
#[serde(default)]
pub branch: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct Dependency {
pub parent: String,
pub child: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct Handoff {
#[serde(default)]
pub summary: Option<String>,
#[serde(default)]
pub metadata: Option<Value>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum Verdict {
Requested,
Approved,
ChangesRequested,
Escalated,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct Review {
pub verdict: Verdict,
#[serde(default)]
pub by: Option<String>,
#[serde(default)]
pub reason: Option<String>,
#[serde(default)]
pub at: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct Attempt {
pub id: String,
#[serde(default)]
pub profile: Option<String>,
#[serde(default)]
pub step: Option<String>,
pub status: String,
#[serde(default)]
pub started_at: Option<String>,
#[serde(default)]
pub ended_at: Option<String>,
#[serde(default)]
pub outcome: Option<String>,
#[serde(default)]
pub handoff: Option<Handoff>,
#[serde(default)]
pub error: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct Comment {
pub author: String,
pub body: String,
#[serde(default)]
pub at: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct Task {
pub id: String,
pub title: String,
#[serde(default)]
pub body: Option<String>,
#[serde(default)]
pub assignee: Option<String>,
pub lane: Lane,
#[serde(default)]
pub priority: i64,
#[serde(default)]
pub tenant: Option<String>,
#[serde(default)]
pub idempotency_key: Option<String>,
pub workspace: Workspace,
#[serde(default)]
pub skills: Vec<String>,
#[serde(default)]
pub model: Option<String>,
#[serde(default)]
pub provider: Option<String>,
#[serde(default)]
pub created_by: Option<String>,
#[serde(default)]
pub created_at: Option<String>,
#[serde(default)]
pub started_at: Option<String>,
#[serde(default)]
pub completed_at: Option<String>,
#[serde(default)]
pub result: Option<String>,
#[serde(default)]
pub attempts: Vec<Attempt>,
#[serde(default)]
pub reviews: Vec<Review>,
#[serde(default)]
pub comments: Vec<Comment>,
#[serde(default)]
pub residue: Residue,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct Board {
pub slug: String,
#[serde(default)]
pub name: Option<String>,
pub root: PathBuf,
pub tasks: BTreeMap<String, Task>,
#[serde(default)]
pub dependencies: Vec<Dependency>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct Workflow {
pub root: PathBuf,
pub boards: BTreeMap<String, Board>,
}