Diminuendo provides SDKs in 5 languages for building clients that speak ACP.

TypeScript SDK

Zero dependencies, Promise-based, fully typed ACP methods.
import { DimClient } from '@igentai/diminuendo-sdk';

const client = new DimClient({
  url: 'ws://localhost:8080/ws',
  token: 'auth0_jwt_token',
});

await client.initialize();

// Create a thread
const thread = await client.threadStart({
  agentType: 'claude-agent',
  name: 'Fix bug',
});

// Send a message and stream response
await client.turnStart({ text: 'Fix the failing test' });

client.on('item/agentMessage/delta', (params) => {
  process.stdout.write(params.text);
});

Rust SDK

Tokio-based, serde serialization, Tauri-compatible.
use diminuendo_sdk::{Client, Config};

let client = Client::connect(Config {
    url: "ws://localhost:8080/ws".into(),
    token: "auth0_jwt".into(),
}).await?;

client.initialize().await?;

let thread = client.thread_start("claude-agent", "Fix bug").await?;
client.turn_start("Fix the failing test").await?;

while let Some(event) = client.next_event().await {
    match event {
        Event::TextDelta(text) => print!("{}", text),
        Event::TurnCompleted(_) => break,
        _ => {}
    }
}

Swift SDK

Async/await, actor-based, macOS/iOS native.
let client = DimClient(
    url: URL(string: "ws://localhost:8080/ws")!,
    token: "auth0_jwt"
)

try await client.initialize()

let thread = try await client.threadStart(agentType: "claude-agent", name: "Fix bug")
try await client.turnStart(text: "Fix the failing test")

for await event in client.events {
    switch event {
    case .textDelta(let text):
        print(text, terminator: "")
    case .turnCompleted:
        break
    default:
        continue
    }
}

Go SDK

client, err := diminuendo.NewClient(diminuendo.Config{
    URL:   "ws://localhost:8080/ws",
    Token: "auth0_jwt",
})

client.Initialize(ctx)
thread, _ := client.ThreadStart(ctx, "claude-agent", "Fix bug")
client.TurnStart(ctx, "Fix the failing test")

for event := range client.Events() {
    switch e := event.(type) {
    case *diminuendo.TextDelta:
        fmt.Print(e.Text)
    case *diminuendo.TurnCompleted:
        return
    }
}

Python SDK

from diminuendo import DimClient

async with DimClient(url="ws://localhost:8080/ws", token="auth0_jwt") as client:
    await client.initialize()
    thread = await client.thread_start(agent_type="claude-agent", name="Fix bug")
    await client.turn_start(text="Fix the failing test")

    async for event in client.events():
        if event.type == "text_delta":
            print(event.text, end="")
        elif event.type == "turn_completed":
            break

SDK Feature Matrix

FeatureTypeScriptRustSwiftGoPython
ACP WebSocketYesYesYesYesYes
Auto-reconnectYesYesYesYesYes
Typed eventsYesYesYesYesYes
Thread managementYesYesYesYesYes
File operationsYesYesYesYesYes
Approval handlingYesYesYesYesYes