@compose-market/core
v0.2.21
Published
Shared Compose.Market SDK runtime primitives: HTTP client, typed errors, retries, storage, streaming parsers, receipts, and x402 wire types.
Readme
@compose-market/core
Shared runtime primitives for Compose.Market SDKs.
This package contains the reusable, product-agnostic pieces used by higher-level Compose clients:
- typed Compose error classes
- a dependency-free Fetch-based HTTP client with retries and timeouts
- x402
PaymentRequiredparsing - session-budget and receipt helpers
- SSE parsing
- minimal pluggable storage helpers
- the single client-side decoder for the Compose agent/model domain event streams
Generated Speakeasy SDK output should remain generated. Higher-level SDKs can depend on this package as normal npm code without self-imports or generated-file patches.
Domain event stream contract
Both servers (the api gateway and the runtime) stream agent activity as a
single typed event protocol. sse/stream parses the SSE transport and routes
each frame to one of two decoders:
activity.decode—ActivityEvent:{ domain: "activity", type: "activity.*", id, ts, kind, status?, runId?, rootId?, parentId?, spanId?, target?, name?, delta?, payload? }model.decode—ModelEvent:{ domain: "model", type: "model.*", id, ts, ... }
Event types:
activity.run(terminal carriespayload.usageonce, pluspayload.agentand optionalpayload.memory/payload.reason),activity.thinking,activity.tool(payload{ toolCallId, input, output, message, error }),activity.selection,activity.plan,activity.connector,activity.child(tree viaparentId/path),activity.conclave,activity.message,activity.errormodel.start,model.text.delta/model.text.done,model.reasoning.delta/model.reasoning.done,model.tool.delta/model.tool.done,model.asset(typedModelAsset, never raw),model.status,model.done,model.error
target is an EventDisplay { kind?, id, name, target?, summary?, details? } —
the server-owned, human-readable projection. Clients render from target, not
from internal protocol fields.
The legacy runtime wire names (tool_start, swarm_child_*, plan.proposed,
connector.connection_*, trace, timing, artifact.created, and friends)
were removed with the runtime's hard cutover to domain events. The inference
Responses wire (response.*, chat choices, text-delta, provider event
names) is still decoded for /v1/responses streams.
Separation of concerns
- Servers (api, runtime) import nothing from
packages/. coreis the only client-side decoder; the SDK, web, and the Rust crates consume its contract. Rust parity is enforced by literal duplicated-frame tests inpackages/sdk/rust/sdk/tests/parity.rs.rawpayload fields are durable/server-side only and never appear on user-visible streams.
