Documentation
¶
Overview ¶
Package a2a — Agent2Agent protocol surface for clawtool (ADR-024). Phase 1 ships only the Agent Card serializer + the JSON shape the protocol wants advertised at /.well-known/agent-card.json. mDNS announce, HTTP server, peer discovery, and capability tier enforcement layer on top in phase 2+.
We adopt Google A2A's wire format (now Linux Foundation; github.com/a2aproject/A2A) verbatim rather than inventing one, per ADR-007 (wrap, don't reinvent). The Card describes *what* this clawtool instance can do (capabilities + skills + auth); it deliberately does NOT enumerate every aggregated tool — per A2A's opacity model, peers see the agent's contract, not its internal toolset.
Index ¶
Constants ¶
const CurrentProtocolVersion = "0.2.0"
CurrentProtocolVersion is the A2A spec snapshot we conform to. Bump in lockstep with upstream as their stable snapshots advance.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type Capabilities ¶
type Capabilities struct {
// Streaming: server-sent events for long-running tasks. We
// have BIAM (TaskNotify) which is conceptually the same;
// phase 2 wires the HTTP transport.
Streaming bool `json:"streaming"`
// PushNotifications: webhook delivery on task transitions.
// Same primitive as TaskNotify but cross-network. Phase 3+.
PushNotifications bool `json:"pushNotifications"`
// StateTransitionHistory: peer can replay every task
// state. BIAM stores envelope history; we'll expose it
// when phase 2 ships the HTTP /tasks/{id} endpoint.
StateTransitionHistory bool `json:"stateTransitionHistory"`
}
Capabilities is A2A's feature-flag block. We model only the flags clawtool currently cares about; A2A's spec allows additional vendor extensions.
type Card ¶
type Card struct {
// Name is the human-readable agent name shown in registries
// and peer dashboards. We use clawtool's instance name when
// the operator has set one; otherwise the bare project
// name.
Name string `json:"name"`
// Description is one paragraph of plain text describing what
// this agent does. Peers may render it in discovery UIs.
Description string `json:"description"`
// URL is the JSON-RPC endpoint base. Empty in phase 1
// (Card-only mode); populated when phase 2 lands the HTTP
// server.
URL string `json:"url,omitempty"`
// Version is the agent's product version (clawtool's
// internal/version.Version). NOT the A2A protocol version;
// that's protocolVersion below.
Version string `json:"version"`
// ProtocolVersion is the A2A spec the card conforms to.
// Follow upstream as it evolves; pinning here lets peers
// negotiate.
ProtocolVersion string `json:"protocolVersion"`
// Capabilities is the feature flag block. We surface only
// the streaming + push-notifications primitives clawtool
// can actually serve today; future phases flip more on as
// the implementation lands.
Capabilities Capabilities `json:"capabilities"`
// Skills enumerates the high-level abilities this agent
// advertises. We don't dump every internal tool — that
// would leak the operator's private surface and overflow
// the card. Skills are *coarse* groupings (research,
// code-edit, dispatch) the peer chooses from.
Skills []Skill `json:"skills"`
// DefaultInputModes / DefaultOutputModes — A2A's MIME-typed
// I/O contract. clawtool speaks plain text + JSON-RPC; we
// don't ship audio / image modes today.
DefaultInputModes []string `json:"defaultInputModes"`
DefaultOutputModes []string `json:"defaultOutputModes"`
// SecuritySchemes describes the auth modes this agent
// accepts. Phase 1 advertises an empty schemes block (peers
// can read the card but can't authenticate yet). Phase 2+
// adds Bearer / OAuth schemes per ADR-024 §Threat model.
SecuritySchemes map[string]SecurityScheme `json:"securitySchemes,omitempty"`
// PublishedAt is when this card snapshot was generated.
// Useful for caches / freshness checks. Always UTC.
PublishedAt time.Time `json:"publishedAt"`
}
Card is the canonical A2A Agent Card (Schema v0.2.x, the stable LF-A2A snapshot as of 2026-04). Field names match the spec verbatim — JSON-RPC clients consuming the card MUST be able to parse it without translation.
func NewCard ¶
func NewCard(opts CardOptions) Card
NewCard builds the Card snapshot for this clawtool instance. Pure function — fields come from CardOptions + version.Version + a static skill list. Caller serializes via json.Marshal.
func (Card) MarshalIndented ¶
MarshalIndented is the human-readable form for CLI output. Two-space indent matches GitHub Actions' workflow YAML convention so an operator copy-pasting the output into a gist / issue gets a readable layout.
func (Card) MarshalJSON ¶
MarshalJSON serializes the card to compact JSON — what an HTTP handler would write to /.well-known/agent-card.json. We use MarshalIndent for the CLI surface (`clawtool a2a card`) so humans can read it; the server-side path uses bare json.Marshal.
type CardOptions ¶
type CardOptions struct {
// Name overrides the default ("clawtool"); empty keeps default.
Name string
// URL is the JSON-RPC endpoint. Empty until phase 2 lands.
URL string
// ExtraSkills appends to the canonical skill list. Empty
// gives just the canonical set.
ExtraSkills []Skill
}
CardOptions carries the per-instance fields we don't want hard-coded into NewCard so a future supervisor can customise per dispatch (e.g. emit different skills depending on which instance is calling).
type SecurityScheme ¶
type SecurityScheme struct {
Type string `json:"type"` // "http" | "oauth2" | "apiKey"
Scheme string `json:"scheme,omitempty"` // for http: "bearer" / "basic"
Description string `json:"description,omitempty"`
}
SecurityScheme mirrors A2A's auth-scheme block. We expose only the fields clawtool's phase 2 will actually populate; A2A's full spec covers OAuth 2.1, mTLS, API key, etc.
type Skill ¶
type Skill struct {
ID string `json:"id"`
Name string `json:"name"`
Description string `json:"description"`
Tags []string `json:"tags,omitempty"`
// Examples are short prompts a peer can use to test the
// skill. Optional. Keep them representative, not
// exhaustive — the card is a contract, not a tutorial.
Examples []string `json:"examples,omitempty"`
}
Skill is one coarse ability the agent advertises. A2A treats skills as the discovery primitive — a peer scanning a roster of cards looks at skill IDs to decide who can help.