macp-runtime 0.5.0

MACP reference runtime: a coordination kernel and gRPC server enforcing session boundaries, message validation, append-only history, modes, and governance policy.
Documentation
#[path = "support/common.rs"]
mod common;

use common::{
    canonical_commitment_payload, canonical_start_payload, envelope, get_session_as, print_ack,
    send_as,
};
use macp_runtime::task_pb::{
    TaskAcceptPayload, TaskCompletePayload, TaskRequestPayload, TaskUpdatePayload,
};
use prost::Message;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut client = common::connect_client().await?;
    let session_id = common::new_session_id();

    println!("=== Task Mode Demo ===\n");

    let ack = send_as(
        &mut client,
        "planner",
        envelope(
            "macp.mode.task.v1",
            "SessionStart",
            "m0",
            &session_id,
            "planner",
            canonical_start_payload("summarize quarterly report", &["planner", "worker"], 60_000),
        ),
    )
    .await?;
    print_ack("session_start", &ack);

    let task_request = TaskRequestPayload {
        task_id: "t1".into(),
        title: "Summarize Q4 report".into(),
        instructions: "Produce a concise executive summary".into(),
        requested_assignee: "worker".into(),
        input: vec![],
        deadline_unix_ms: 0,
    };
    let ack = send_as(
        &mut client,
        "planner",
        envelope(
            "macp.mode.task.v1",
            "TaskRequest",
            "m1",
            &session_id,
            "planner",
            task_request.encode_to_vec(),
        ),
    )
    .await?;
    print_ack("task_request", &ack);

    let accept = TaskAcceptPayload {
        task_id: "t1".into(),
        assignee: "worker".into(),
        reason: "ready".into(),
    };
    let ack = send_as(
        &mut client,
        "worker",
        envelope(
            "macp.mode.task.v1",
            "TaskAccept",
            "m2",
            &session_id,
            "worker",
            accept.encode_to_vec(),
        ),
    )
    .await?;
    print_ack("task_accept", &ack);

    let update = TaskUpdatePayload {
        task_id: "t1".into(),
        status: "in_progress".into(),
        progress: 0.5,
        message: "draft summary complete".into(),
        partial_output: vec![],
    };
    let ack = send_as(
        &mut client,
        "worker",
        envelope(
            "macp.mode.task.v1",
            "TaskUpdate",
            "m3",
            &session_id,
            "worker",
            update.encode_to_vec(),
        ),
    )
    .await?;
    print_ack("task_update", &ack);

    let complete = TaskCompletePayload {
        task_id: "t1".into(),
        assignee: "worker".into(),
        output: b"Q4 summary".to_vec(),
        summary: "Report summarized successfully".into(),
    };
    let ack = send_as(
        &mut client,
        "worker",
        envelope(
            "macp.mode.task.v1",
            "TaskComplete",
            "m4",
            &session_id,
            "worker",
            complete.encode_to_vec(),
        ),
    )
    .await?;
    print_ack("task_complete", &ack);

    let ack = send_as(
        &mut client,
        "planner",
        envelope(
            "macp.mode.task.v1",
            "Commitment",
            "m5",
            &session_id,
            "planner",
            canonical_commitment_payload(
                "c1",
                "task.completed",
                "workflow",
                "worker completed task t1",
            ),
        ),
    )
    .await?;
    print_ack("commitment", &ack);

    let session = get_session_as(&mut client, "worker", &session_id).await?;
    let meta = session.metadata.expect("metadata");
    println!("[get_session] state={} mode={}", meta.state, meta.mode);

    Ok(())
}