You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
synapse doctor checks for the coordination misconfigs that quietly cost an
agent its messages: an identity derived by accident (the home directory, a system
path) or fragile (the working directory); a send name like <project>-keeper
whose replies miss the project inbox; a hub URI exposed off loopback without a
token; an unreachable hub; and — the common one — no live -rx waiter on the bus,
so directed messages never wake you. Each line carries the fix, and the command
exits non-zero when a check fails, so it slots into a setup script. Point it with --uri/--project/--id/--send-name/--token (or --token-file).
synapse git-init makes a fresh clone claim-aware in one step: it installs the
same post-commit/post-merge auto-release hooks as git-hook install and writes
a short .synapse/git-claims.md guide — the branch-naming convention, the
recommended one-worktree-per-claim workflow, and the exact claim/release commands.
It is idempotent and never clobbers a file you wrote; --base sets the integration
branch the convention assumes (default main).
synapse a2a-card is the first Agent2Agent bridge slice: it reads the live
SYNAPSE capability manifest and prints an A2A Agent Card JSON document that can
be served by a thin HTTP edge as /.well-known/agent-card.json. It maps each
advertised SYNAPSE capability card into an A2A skill and can declare Bearer auth
for the advertised bridge endpoint.
synapse a2a-serve runs a stdlib HTTP+JSON Agent2Agent bridge at the edge of
the hub. It serves /.well-known/agent-card.json and /extendedAgentCard,
accepts POST /message:send by forwarding text/data parts into SYNAPSE chat,
exposes GET /tasks and GET /tasks/{id} over its local task view, and supports POST /tasks/{id}:cancel. POST /message:stream now returns an immediate
Server-Sent Events task lifecycle stream; subscribing to a terminal task returns
a clear 409 problem response. Push-notification configuration is now exposed
through POST/GET /tasks/{id}/pushNotificationConfigs, GET/DELETE /tasks/{id}/pushNotificationConfigs/{config_id}, and send-time configuration.taskPushNotificationConfig capture; the served Agent Card
advertises both streaming and push notification support.
The A2A bridge now includes outbound push webhook delivery, JSON-RPC 2.0
dispatch on /rpc, task pagination and history-length controls, Bearer-token
enforcement for protected routes, file-part forwarding, and optional durable
task/config state via synapse a2a-serve --state-file.
The A2A bridge now has committed local benchmark evidence for task creation,
reply correlation, task listing, push-delivery callback dispatch, and bounded
subscriber fanout. The benchmark is explicitly in-process evidence, not a claim
about third-party A2A conformance or real webhook/network latency.
Changed
The hub now refuses to start on a non-loopback address (e.g. --host 0.0.0.0)
when it would be reachable without a token — and, with --metrics, without a --metrics-token — instead of only printing a warning and exposing the bus anyway.
This makes the safe configuration the default: a coordination bus is never put on
the network unauthenticated by accident. A loopback bind (the default) is unaffected.
The A2A bridge now keeps validation, storage, event fanout, and handler logic in
separate focused modules instead of growing the HTTP bridge into one large file.
Caller-supplied A2A task creation is serialized around validation and insertion,
so racing requests with the same taskId create one task and reject the duplicate.
Security
A2A webhook URLs now reject localhost, loopback, private, and link-local IP
targets, and reject embedded credentials before push configuration enters bridge
state.
A2A state-file handling now fails fast on corrupt JSON, recovers stale in-flight
persisted tasks as failed on restart, and rolls back in-memory task/push-config
mutations when a state-file write fails.
Caller-supplied A2A taskId and contextId values are restricted to bridge-safe
characters, and duplicate caller task ids are rejected before task creation.
Upgrade notes
If you intentionally run an unauthenticated hub off loopback, add the new synapse hub --insecure-off-loopback flag to keep the previous warn-and-bind
behaviour. The recommended fix is to set a token (--token, and --metrics-token
when metrics are on) rather than override the guard. Loopback-only hubs and any hub
that already sets a token need no change.
Documentation
The README leads with the file-safety promise and adds a "Use it with your coding
agent" quickstart with one recipe each for Claude Code / Claude Desktop / Cursor
(via MCP) and Aider or any non-MCP tool (via git-init + branch-scoped claims).
The git-claims guide recommends gating a production setup on synapse git-hook test,
which catches a missing hook or a moved synapse binary before it silently no-ops.
The CLI and benchmark docs now state the A2A bridge's supported local HTTP+JSON
subset, auth model, persistence semantics, timeout behavior, webhook validation,
subscription replay boundary, benchmark limits, and remaining external validation
blockers.
GitHub Discussion #20 tracks community A2A interoperability and production
validation work as a validation lane, not a bug report.
CI
CI now installs the auto-release hooks in a scratch repo and runs synapse git-hook test on every push (asserting both that a hookless repo fails and that an installed
one passes), so a regression in the hook install-or-resolve path is caught up front.