systemprompt-agent 0.2.2

Agent-to-Agent (A2A) protocol for systemprompt.io AI governance: streaming, JSON-RPC models, task lifecycle, .well-known discovery, and governed agent orchestration.
Documentation
use systemprompt_extension::prelude::*;

#[derive(Debug, Clone, Copy, Default)]
pub struct AgentExtension;

impl Extension for AgentExtension {
    fn metadata(&self) -> ExtensionMetadata {
        ExtensionMetadata {
            id: "agent",
            name: "Agent",
            version: env!("CARGO_PKG_VERSION"),
        }
    }

    fn migration_weight(&self) -> u32 {
        40
    }

    fn schemas(&self) -> Vec<SchemaDefinition> {
        vec![
            SchemaDefinition::inline("user_contexts", include_str!("../schema/user_contexts.sql"))
                .with_required_columns(vec![
                    "context_id".into(),
                    "user_id".into(),
                    "created_at".into(),
                ]),
            SchemaDefinition::inline("agent_tasks", include_str!("../schema/agent_tasks.sql"))
                .with_required_columns(vec![
                    "task_id".into(),
                    "context_id".into(),
                    "status".into(),
                    "created_at".into(),
                ]),
            SchemaDefinition::inline("task_messages", include_str!("../schema/task_messages.sql"))
                .with_required_columns(vec![
                    "id".into(),
                    "task_id".into(),
                    "role".into(),
                    "created_at".into(),
                ]),
            SchemaDefinition::inline("message_parts", include_str!("../schema/message_parts.sql"))
                .with_required_columns(vec!["id".into(), "message_id".into(), "part_kind".into()]),
            SchemaDefinition::inline(
                "task_artifacts",
                include_str!("../schema/task_artifacts.sql"),
            )
            .with_required_columns(vec![
                "id".into(),
                "task_id".into(),
                "artifact_id".into(),
            ]),
            SchemaDefinition::inline(
                "artifact_parts",
                include_str!("../schema/artifact_parts.sql"),
            )
            .with_required_columns(vec![
                "id".into(),
                "artifact_id".into(),
                "part_kind".into(),
            ]),
            SchemaDefinition::inline(
                "context_agents",
                include_str!("../schema/context_agents.sql"),
            )
            .with_required_columns(vec![
                "id".into(),
                "context_id".into(),
                "agent_name".into(),
            ]),
            SchemaDefinition::inline(
                "context_notifications",
                include_str!("../schema/context_notifications.sql"),
            )
            .with_required_columns(vec![
                "id".into(),
                "context_id".into(),
                "notification_type".into(),
            ]),
            SchemaDefinition::inline(
                "task_push_notification_configs",
                include_str!("../schema/task_push_notification_configs.sql"),
            )
            .with_required_columns(vec!["id".into(), "task_id".into()]),
            SchemaDefinition::inline("agents", include_str!("../schema/agents.sql"))
                .with_required_columns(vec!["agent_id".into(), "name".into(), "enabled".into()]),
            SchemaDefinition::inline("agent_skills", include_str!("../schema/agent_skills.sql"))
                .with_required_columns(vec!["skill_id".into(), "name".into()]),
            SchemaDefinition::inline(
                "task_execution_steps",
                include_str!("../schema/task_execution_steps.sql"),
            )
            .with_required_columns(vec![
                "step_id".into(),
                "task_id".into(),
                "step_type".into(),
            ]),
            SchemaDefinition::inline("services", include_str!("../schema/services.sql"))
                .with_required_columns(vec!["name".into(), "module_name".into(), "status".into()]),
            SchemaDefinition::inline(
                "user_session_analytics",
                include_str!("../schema/user_session_analytics.sql"),
            ),
        ]
    }

    fn dependencies(&self) -> Vec<&'static str> {
        vec!["users", "oauth", "mcp", "ai"]
    }

    fn migrations(&self) -> Vec<Migration> {
        vec![
            Migration::new(
                1,
                "drop_playbooks_table",
                include_str!("../schema/migrations/001_drop_playbooks.sql"),
            ),
            Migration::new(
                2,
                "add_server_type_column",
                include_str!("../schema/migrations/002_add_server_type.sql"),
            ),
            Migration::new(
                3,
                "a2a_v1_task_states",
                include_str!("../schema/migrations/003_a2a_v1_task_states.sql"),
            ),
            Migration::new(
                4,
                "ai_requests_task_fk",
                include_str!("../schema/migrations/004_ai_requests_task_fk.sql"),
            ),
        ]
    }
}

register_extension!(AgentExtension);