The Agent Client Protocol (ACP) is a JSON-RPC 2.0 protocol over WebSocket that standardizes how clients communicate with AI agents. Clients speak ACP to Diminuendo, and Diminuendo translates between ACP and Podium’s native StreamUpdate protocol. This means ACP is the client-facing protocol, while the Podium coordinator and agents use an internal native protocol optimized for agent execution.

Protocol Flow

Client                    Diminuendo (Gateway)             Podium / Agent
  │                              │                              │
  │── initialize ───────────────>│                              │
  │<─ initialize response ───────│                              │
  │── initialized (notif.) ─────>│                              │
  │                              │                              │
  │── thread/start ─────────────>│── POST /instances ──────────>│
  │<─ thread/start response ─────│<─ {instance_id} ─────────────│
  │                              │── WS /agent/{instanceId} ──>│
  │<─ thread/started (notif.) ──│                              │
  │                              │                              │
  │── turn/start ───────────────>│── native: process_message ─>│ agent.onMessage()
  │    (ACP JSON-RPC)            │   (Podium native format)     │ agent.run()
  │<─ turn/started (notif.) ────│<─ native: StreamUpdate ──────│ ctx.emit()
  │<─ item/agentMessage/delta ──│<─ native: StreamUpdate ──────│
  │    (ACP notification)        │   (PodiumNativeMapper        │
  │<─ item/completed (notif.) ──│    translates native → ACP)  │
  │<─ turn/completed (notif.) ──│<─ native: StreamUpdate ──────│
  │                              │                              │
  │── turn/start ───────────────>│  ... (repeat) ...            │
Native StreamUpdate events from the Podium coordinator are received by AcpPodiumBridge, translated to ACP by PodiumNativeMapper (which maps 40+ native event types to ACP notifications), persisted as needed, and relayed to clients as ACP JSON-RPC 2.0 notifications.

Session State Machine

Sessions follow a 7-state machine:
inactive → activating → ready ⇄ running ⇄ waiting → deactivating → inactive
error is reachable from any active state.
StateDescription
inactiveNo agent process running
activatingAgent being spawned on Podium
readyAgent running, waiting for input
runningAgent processing a turn
waitingAgent requesting user input (approval, answer)
deactivatingAgent shutting down
errorUnrecoverable error

ACP Extensions

On the client-facing side, 94% of the ACP notifications that Diminuendo sends to clients use standard ACP types. Only 4 require Podium-specific extensions:
ExtensionPurpose
_podium/compaction_completeConversation compaction finished
_podium/agent_loopAgent loop iteration metadata
_podium/memoryAgent memory operations
_podium/linked_repoRepository linking events