Skip to main content

monarchic_agent_protocol/
lib.rs

1use 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}