Skip to content

v0.44.0

Choose a tag to compare

@github-actions github-actions released this 25 Jun 13:04
· 1626 commits to main since this release

Added

  • 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.