SDKs
Three SDKs, one protocol. Cross-SDK signature compatibility is verified: TypeScript and Python produce identical signatures for identical inputs (same algorithm, same format, same key ordering).
Coverage matrix
| API surface (15 total) | TypeScript | Python | Go |
|---|---|---|---|
| Coverage | 13/15 (87%) | 12/15 (80%) | 9/15 (60%) |
TypeScript - @sidianlabs/map
Best-supported surface. Developer preview.
bash
npm install @sidianlabs/mapSigners
typescript
import { HMACSigner, RSASigner, HTTPSigner } from '@sidianlabs/map';
// HMAC for shared-secret deployments
const hmac = new HMACSigner('your-secret');
// RSA for verified/regulated profiles (RS256 only)
const rsa = new RSASigner(privateKeyPem);
// HTTP request signing (nonce + timestamp headers)
const http = new HTTPSigner(keyId, secret);WebSocket transport
Real-time dispatch and task status streaming with auto-reconnect:
typescript
import { WebSocketTransport } from '@sidianlabs/map';
const transport = new WebSocketTransport('ws://localhost:8787', {
timeout: 30000,
reconnect: true,
reconnectIntervalMs: 1000,
maxReconnectAttempts: 5,
pingIntervalMs: 30000,
});
await transport.connect();
// Stream task status updates
for await (const update of await transport.streamTaskStatus('task-123')) {
console.log('Task status:', update.status, update.message);
if (update.status === 'completed' || update.status === 'failed') break;
}
transport.close();Batch execution
typescript
const results = await client.dispatchBatch({ items: requests, parallel: true });Error handling
All error codes are typed:
typescript
import type { ErrorCode } from '@sidianlabs/map';
try {
await agent.run('payment.execute', input);
} catch (err) {
if (err.code === 'approval_expired') { /* re-request approval */ }
if (err.code === 'tenant_mismatch') { /* wrong tenant scope */ }
if (err.code === 'idempotency_conflict') { /* already processed */ }
}Observability
typescript
// OpenTelemetry tracing with scoped spans
import { Tracer, InMemorySpanExporter } from '@sidianlabs/map';
// Prometheus metrics (e.g. map_dispatch_total{capability="payment"} 1)
import { PrometheusMetricsCollector } from '@sidianlabs/map';
// Health checks: HTTP, WebSocket, TCP, custom
import { HealthCheckBuilder } from '@sidianlabs/map';
// Persistent storage (task + receipt stores, composable)
import { InMemoryTaskStore, InMemoryReceiptStore, CompositeStore } from '@sidianlabs/map';
const store = new CompositeStore({
tasks: new InMemoryTaskStore(),
receipts: new InMemoryReceiptStore(),
});Python - mapprotocol
154 tests across 8 test files. Source install while in preview:
bash
pip install -e packages/pythonpython
from mapprotocol import Client
client = Client(base_url="http://localhost:8787")
client.configure_signing(key_id="your-key-id", secret="your-secret")
result = client.dispatch({...})Go - mapproto
bash
go get github.com/SidianLabs/micro-agent-protocol/packages/go/mapprotogo
client := mapproto.NewClient("http://localhost:8787")
client.ConfigureSigning("your-key-id", "your-secret")
result, err := client.Dispatch(mapproto.DispatchRequest{...})Signing model
JWS/MAPSIG compact serialization with JCS canonicalization and key rotation. HMAC-SHA256 for shared secrets, RSA-SHA256 for verified deployments.