monarchic_agent_protocol/
lib.rs1use serde::{Deserialize, Serialize};
2use std::collections::BTreeMap;
3
4pub const PROTOCOL_VERSION: &str = "v1";
5
6pub type JsonMap = BTreeMap<String, serde_json::Value>;
7
8#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
9#[serde(rename_all = "snake_case")]
10pub enum AgentRole {
11 ProductOwner,
12 ProjectManager,
13 Dev,
14 Qa,
15 Reviewer,
16 Security,
17 Ops,
18}
19
20#[derive(Debug, Clone, Serialize, Deserialize)]
21pub struct Task {
22 pub version: String,
23 pub task_id: String,
24 pub role: AgentRole,
25 pub goal: String,
26 #[serde(default, skip_serializing_if = "Option::is_none")]
27 pub inputs: Option<JsonMap>,
28 #[serde(default, skip_serializing_if = "Option::is_none")]
29 pub constraints: Option<JsonMap>,
30 #[serde(default, skip_serializing_if = "Option::is_none")]
31 pub gates_required: Option<Vec<String>>,
32 #[serde(default, skip_serializing_if = "Option::is_none")]
33 pub run_context: Option<RunContext>,
34 #[serde(default, flatten)]
35 pub extensions: JsonMap,
36}
37
38#[derive(Debug, Clone, Serialize, Deserialize)]
39pub struct Artifact {
40 pub version: String,
41 pub artifact_id: String,
42 #[serde(rename = "type")]
43 pub artifact_type: String,
44 pub summary: String,
45 pub path: String,
46 pub task_id: String,
47 #[serde(default, flatten)]
48 pub extensions: JsonMap,
49}
50
51#[derive(Debug, Clone, Serialize, Deserialize)]
52pub struct Event {
53 pub version: String,
54 pub event_type: String,
55 pub timestamp: String,
56 pub task_id: String,
57 pub status: String,
58 #[serde(default, skip_serializing_if = "Option::is_none")]
59 pub message: Option<String>,
60 #[serde(default, flatten)]
61 pub extensions: JsonMap,
62}
63
64#[derive(Debug, Clone, Serialize, Deserialize)]
65pub struct GateResult {
66 pub version: String,
67 pub gate: String,
68 pub status: String,
69 #[serde(default, skip_serializing_if = "Option::is_none")]
70 pub reason: Option<String>,
71 #[serde(default, skip_serializing_if = "Option::is_none")]
72 pub evidence: Option<JsonMap>,
73 #[serde(default, flatten)]
74 pub extensions: JsonMap,
75}
76
77#[derive(Debug, Clone, Serialize, Deserialize)]
78pub struct RunContext {
79 pub version: String,
80 pub repo: String,
81 pub worktree: String,
82 pub image: String,
83 pub runner: String,
84 #[serde(default, skip_serializing_if = "Option::is_none")]
85 pub labels: Option<Vec<String>>,
86 #[serde(default, flatten)]
87 pub extensions: JsonMap,
88}