use schemars::JsonSchema;
use serde::Serialize;
pub fn any_json_schema(_: &mut schemars::SchemaGenerator) -> schemars::Schema {
schemars::json_schema!({})
}
pub fn ts(dt: chrono::DateTime<chrono::Utc>) -> String {
dt.to_rfc3339_opts(chrono::SecondsFormat::Secs, true)
}
pub fn ts_opt(dt: Option<chrono::DateTime<chrono::Utc>>) -> Option<String> {
dt.map(ts)
}
#[derive(Debug, Serialize, JsonSchema)]
pub struct WhoAmI {
pub agent: String,
pub agent_id: String,
pub team: String,
pub team_id: String,
pub session: Option<String>,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub project: Option<String>,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub role: Option<String>,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub session_identity: Option<SessionIdentity>,
pub default_channel: Option<String>,
pub unread_direct_messages: i64,
pub open_claimed_tasks: i64,
}
#[derive(Debug, Serialize, JsonSchema)]
pub struct AgentInfo {
pub name: String,
pub display_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub session: Option<String>,
pub status: String,
pub repo: Option<String>,
pub branch: Option<String>,
pub activity: Option<String>,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub project: Option<String>,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub role: Option<String>,
pub last_seen: Option<String>,
pub online: bool,
#[serde(skip_serializing_if = "Vec::is_empty", default)]
pub sessions: Vec<AgentSession>,
}
#[derive(Debug, Serialize, JsonSchema)]
pub struct SessionCredential {
#[serde(skip_serializing_if = "Option::is_none", default)]
pub session_token: Option<String>,
pub session_id: String,
pub session: String,
pub address: String,
pub epoch: i64,
pub expires_at: String,
pub expires_in_seconds: i64,
}
#[derive(Debug, Serialize, JsonSchema)]
pub struct SessionIdentity {
pub session_id: String,
pub epoch: i64,
pub registered_at: String,
pub expires_at: String,
pub expires_in_seconds: i64,
}
#[derive(Debug, Serialize, JsonSchema)]
pub struct AgentSession {
#[serde(skip_serializing_if = "Option::is_none", default)]
pub session: Option<String>,
pub status: String,
pub repo: Option<String>,
pub branch: Option<String>,
pub activity: Option<String>,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub project: Option<String>,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub role: Option<String>,
pub last_seen: Option<String>,
pub online: bool,
}
#[derive(Debug, Serialize, JsonSchema)]
pub struct SessionEntry {
pub agent: String,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub session: Option<String>,
pub address: String,
pub exact: bool,
pub project: Option<String>,
pub role: Option<String>,
pub repo: Option<String>,
pub branch: Option<String>,
pub activity: Option<String>,
pub status: String,
pub online: bool,
pub last_seen: Option<String>,
}
#[derive(Debug, Serialize, JsonSchema)]
pub struct SessionList {
pub sessions: Vec<SessionEntry>,
pub count: usize,
pub limit: i64,
}
#[derive(Debug, Serialize, JsonSchema)]
pub struct AgentList {
pub agents: Vec<AgentInfo>,
pub online_count: usize,
}
#[derive(Debug, Serialize, JsonSchema)]
pub struct ChannelInfo {
pub name: String,
pub topic: Option<String>,
pub message_count: i64,
pub created_at: String,
}
#[derive(Debug, Serialize, JsonSchema)]
pub struct ChannelList {
pub channels: Vec<ChannelInfo>,
}
#[derive(Debug, Serialize, JsonSchema)]
pub struct MessageInfo {
pub id: i64,
pub from: String,
pub from_session: Option<String>,
pub announce: bool,
pub channel: Option<String>,
pub to: Option<String>,
pub to_session: Option<String>,
pub body: String,
pub reply_to: Option<i64>,
#[schemars(schema_with = "any_json_schema")]
pub metadata: serde_json::Value,
pub attachments: Vec<AttachmentMeta>,
pub created_at: String,
}
#[derive(Debug, Serialize, serde::Deserialize, JsonSchema)]
pub struct AttachmentMeta {
pub id: i64,
pub filename: String,
pub content_type: String,
pub size_bytes: i64,
}
#[derive(Debug, Serialize, JsonSchema)]
pub struct AttachmentContent {
pub id: i64,
pub filename: String,
pub content_type: String,
pub size_bytes: i64,
pub uploaded_by: String,
pub created_at: String,
pub data_base64: String,
}
#[derive(Debug, Serialize, JsonSchema)]
pub struct PostMessageResult {
pub message: MessageInfo,
pub delivered_to: Vec<String>,
}
#[derive(Debug, Serialize, JsonSchema)]
pub struct MessageList {
pub messages: Vec<MessageInfo>,
pub scope: String,
pub cursor: i64,
pub truncated: bool,
}
#[derive(Debug, Serialize, JsonSchema)]
pub struct TaskInfo {
pub key: String,
pub title: String,
pub description: Option<String>,
pub status: String,
pub depends_on: Vec<String>,
pub blocked: bool,
pub claimed_by: Option<String>,
pub claimed_session: Option<String>,
pub claimed_at: Option<String>,
pub lease_expires_at: Option<String>,
pub lease_seconds_remaining: Option<i64>,
pub lease_expired: bool,
pub lapsed_holder: Option<String>,
pub result: Option<String>,
#[schemars(schema_with = "any_json_schema")]
pub metadata: serde_json::Value,
pub attachments: Vec<AttachmentMeta>,
pub created_by: Option<String>,
pub created_at: String,
pub updated_at: String,
}
#[derive(Debug, Serialize, JsonSchema)]
pub struct TaskList {
pub tasks: Vec<TaskInfo>,
pub open: i64,
pub claimed: i64,
}
#[derive(Debug, Serialize, JsonSchema)]
pub struct ClaimResult {
pub claimed: bool,
pub task: Option<TaskInfo>,
pub reason: Option<String>,
}
#[derive(Debug, Serialize, JsonSchema)]
pub struct TaskEventInfo {
pub event: String,
pub agent: Option<String>,
pub detail: Option<String>,
pub created_at: String,
}
#[derive(Debug, Serialize, JsonSchema)]
pub struct TaskDetail {
pub task: TaskInfo,
pub history: Vec<TaskEventInfo>,
}
#[derive(Debug, Serialize, JsonSchema)]
pub struct NoteInfo {
pub scope: String,
pub key: String,
pub value: String,
pub tags: Vec<String>,
pub updated_by: Option<String>,
pub updated_at: String,
}
#[derive(Debug, Serialize, JsonSchema)]
pub struct NoteList {
pub notes: Vec<NoteInfo>,
}
#[derive(Debug, Serialize, JsonSchema)]
pub struct NoteRef {
pub scope: String,
pub key: String,
pub found: bool,
pub note: Option<NoteInfo>,
}
#[derive(Debug, Serialize, JsonSchema)]
pub struct Ack {
pub ok: bool,
pub detail: String,
}
#[derive(Debug, Serialize, JsonSchema)]
pub struct LockInfo {
pub name: String,
pub holder: String,
pub holder_session: Option<String>,
pub purpose: Option<String>,
pub acquired_at: String,
pub expires_at: String,
}
#[derive(Debug, Serialize, JsonSchema)]
pub struct LockList {
pub locks: Vec<LockInfo>,
}
#[derive(Debug, Serialize, JsonSchema)]
pub struct LockResult {
pub acquired: bool,
pub lock: Option<LockInfo>,
pub reason: Option<String>,
}
#[derive(Debug, Serialize, JsonSchema)]
pub struct WaitEvent {
pub kind: String,
pub summary: String,
}
#[derive(Debug, Serialize, JsonSchema)]
pub struct WaitResult {
pub woke: bool,
pub timed_out: bool,
pub events: Vec<WaitEvent>,
pub unread_direct_messages: i64,
pub suggestion: String,
}
#[derive(Debug, Serialize, JsonSchema)]
pub struct AskResult {
pub answered: bool,
pub to: String,
pub question_message_id: i64,
pub answer: Option<MessageInfo>,
pub suggestion: String,
}
#[derive(Debug, Serialize, JsonSchema)]
pub struct DigestMessage {
pub from: String,
pub body: String,
pub at: String,
}
#[derive(Debug, Serialize, JsonSchema)]
pub struct DigestChannel {
pub name: String,
pub message_count: i64,
pub last_messages: Vec<DigestMessage>,
}
#[derive(Debug, Serialize, JsonSchema)]
pub struct DigestTask {
pub key: String,
pub title: String,
pub status: String,
pub claimed_by: Option<String>,
pub result: Option<String>,
pub updated_at: String,
}
#[derive(Debug, Serialize, JsonSchema)]
pub struct DigestNote {
pub scope: String,
pub key: String,
pub updated_by: Option<String>,
pub updated_at: String,
}
#[derive(Debug, Serialize, JsonSchema)]
pub struct DigestAgent {
pub name: String,
pub activity: Option<String>,
pub last_seen: Option<String>,
pub online: bool,
}
#[derive(Debug, Serialize, JsonSchema)]
pub struct DigestResult {
pub hours: i64,
pub channels: Vec<DigestChannel>,
pub tasks_moved: Vec<DigestTask>,
pub open_tasks: i64,
pub claimed_tasks: i64,
pub notes_updated: Vec<DigestNote>,
pub agents_seen: Vec<DigestAgent>,
pub active_locks: Vec<LockInfo>,
}
#[derive(Debug, Serialize, JsonSchema)]
pub struct ProjectInfo {
pub id: String,
pub name: String,
pub members: Vec<String>,
pub archived: bool,
pub created_at: String,
}
#[derive(Debug, Serialize, JsonSchema)]
pub struct ProjectList {
pub projects: Vec<ProjectInfo>,
}
#[derive(Debug, Serialize, JsonSchema)]
pub struct ConversationInfo {
pub id: String,
pub title: String,
pub visibility: String,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub project: Option<String>,
pub created_by: String,
pub created_at: String,
pub archived: bool,
pub last_seq: i64,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub membership: Option<MembershipInfo>,
#[serde(skip_serializing_if = "Vec::is_empty", default)]
pub members: Vec<MembershipInfo>,
}
#[derive(Clone, Debug, Serialize, JsonSchema)]
pub struct MembershipInfo {
pub membership_id: String,
pub agent: String,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub session: Option<String>,
pub address: String,
pub role: String,
pub state: String,
pub history_from_seq: Option<i64>,
pub invited_at: String,
pub accepted_at: Option<String>,
}
#[derive(Debug, Serialize, JsonSchema)]
pub struct ConversationList {
pub conversations: Vec<ConversationInfo>,
}
#[derive(Debug, Serialize, JsonSchema)]
pub struct SentMessage {
pub message_id: String,
pub conversation_id: String,
pub seq: i64,
pub stored: bool,
pub publication: String,
pub recipients: Vec<String>,
pub created_at: String,
}
#[derive(Debug, Serialize, JsonSchema)]
pub struct ConversationMessage {
pub message_id: String,
pub seq: i64,
pub from: String,
pub from_address: String,
pub body: String,
pub reply_to: Option<String>,
pub metadata: serde_json::Value,
pub created_at: String,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub my_receipt: Option<ReceiptInfo>,
pub publication: String,
#[serde(default)]
pub unavailable: Option<String>,
}
#[derive(Debug, Serialize, JsonSchema)]
pub struct ConversationRead {
pub conversation_id: String,
pub messages: Vec<ConversationMessage>,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub next_after_seq: Option<i64>,
pub history_from_seq: Option<i64>,
}
#[derive(Clone, Debug, Serialize, JsonSchema)]
pub struct InboxReference {
pub delivery_id: String,
pub message_id: String,
pub conversation_id: String,
pub seq: i64,
pub from: String,
pub from_address: String,
pub created_at: String,
pub redelivered: bool,
pub source: String,
pub kind: String,
}
#[derive(Debug, Serialize, JsonSchema)]
pub struct InboxBatch {
pub references: Vec<InboxReference>,
pub from_broker: i64,
pub more: bool,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub note: Option<String>,
}
#[derive(Debug, Serialize, JsonSchema)]
pub struct InboxState {
pub address: String,
pub undelivered: i64,
pub handed_out_unconfirmed: i64,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub broker_pending: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub broker_awaiting_ack: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub broker_consumer_present: Option<bool>,
}
#[derive(Clone, Debug, Serialize, JsonSchema)]
pub struct ReceiptInfo {
pub agent: String,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub session: Option<String>,
pub address: String,
pub stored_at: Option<String>,
pub delivered_at: Option<String>,
pub presented_at: Option<String>,
pub acknowledged_at: Option<String>,
pub resolved_at: Option<String>,
pub note: Option<String>,
}
#[derive(Debug, Serialize, JsonSchema)]
pub struct MessageReceipts {
pub message_id: String,
pub seq: i64,
pub receipts: Vec<ReceiptInfo>,
pub acknowledged: usize,
pub resolved: usize,
pub total: usize,
}
#[derive(Debug, Serialize, JsonSchema)]
pub struct ConversationUpdates {
pub conversations: Vec<ConversationActivity>,
pub waited_seconds: i64,
}
#[derive(Debug, Serialize, JsonSchema)]
pub struct ConversationActivity {
pub conversation_id: String,
pub title: String,
pub last_seq: i64,
pub unacknowledged: i64,
}
#[derive(Debug, Serialize, JsonSchema)]
pub struct TransferResult {
pub conversation_id: String,
pub from_address: String,
pub to_address: String,
pub state: String,
}