v1.9.0
🚀 Synapse v1.9.0 — Seamless Orchestration
Our biggest orchestration release yet. Long-running workflows are now something you can walk away from.
Every run is fully recorded as it happens, so you can close the tab, come back hours later, and see exactly what happened and what is happening right now. Crashes resume from where they stopped instead of replaying whole nodes. And when a run needs you, Synapse comes and finds you. 🔔
✨ Highlights
🎬 Leave and come back — runs are replayable
Every orchestration run writes an append-only event journal as it executes. Reopening a run replays that journal into the same live view you would have seen watching from the start, then keeps tailing in real time. Reloading the page, navigating away, or dropping your connection no longer loses a run's history.
- 🆕
GET /api/orchestrations/runs/{run_id}/eventsand/events/stream— SSE,Last-Event-IDaware, replay-then-tail. - 🔄 Reconnects resume from the last event seen rather than replaying everything.
- 🌐 Distributed (scale-mode) deployments transparently fall back to the existing Redis Streams, so both modes expose the same API.
🧠 Reasoning is visible
Agent reasoning was already streaming from the backend — the UI was quietly dropping it. The orchestration run log and the main chat now render reasoning alongside tool calls, so you can see why an agent did something, not just what it called.
⚡ Mid-node continuity
A crashed or cancelled run used to restart the failed node from scratch — an agent step that had made a dozen tool calls would make them all again, side effects included. 😬 Nodes now carry their progress across a resume:
- 🤖 Agent steps checkpoint their transcript after each completed tool turn and continue from the last observation, with an explicit resume marker so the model doesn't repeat finished work. After two failed resume attempts the transcript is discarded and the step reruns clean.
- 🔁 Loops resume at the interrupted iteration.
- 🌿 Parallel steps skip completed branches and completed sub-steps within the interrupted branch.
🔔 Run notifications
Synapse now tells you when a run needs you, finishes, or fails.
- 🍞 In-app toasts and a notification bell with an unseen-count badge, plus a badge on the Orchestrations settings entry.
- 🖥️ Optional browser notifications when the tab is in the background; clicking one focuses the app and opens the run.
- 💬 Optional mirroring to a messaging channel (Slack, Telegram, Discord, Teams, WhatsApp) via a picker in Messaging settings — off by default.
- ✅ "Needs your input" notifications resolve automatically once the input is submitted, the run ends, or the answer arrives through another channel. Pauses missed during a server restart are recovered at startup.
📊 Orchestration dashboard
The Orchestrations page is no longer an empty canvas until you pick something. It opens on a tabbed dashboard — Orchestrations · Active · Recent · All runs — and lands on Active whenever something is running.
The runs tables show status (distinguishing 🟡 Needs input from Paused), the current step name, what triggered the run (Manual, Schedule · <name>, or Agent chat), steps completed, cost, start time and a live duration. Clicking any row opens that run's replay, and a Back button returns to the dashboard without interrupting the run.
🐛 Fixes
- 👀 Runs are visible from the moment they start. Checkpoints were previously written only at step boundaries, so a run inside a long first step was invisible to the runs list and unrecoverable if it crashed there. Runs now checkpoint at start, and resumed runs checkpoint immediately on resume rather than looking dead until their first step completes.
- 🧵 Human-input steps inside loops and parallel branches no longer fail the run. Both executors yielded the pause event while still inside their timeout scope, producing
RuntimeError: Attempted to exit a cancel scope that isn't the current task's— a clean pause was reported as a failure. - 📝 Reopening a cancelled-then-resumed run shows its input form. Replay stopped at the mid-journal "Cancelled" event because the terminal-event handler aborted its own replay stream, so nothing the resumed run produced was delivered.
- 🧹 Stale "needs your input" prompts cleared. An answered or completed run could still show the input form and an actionable notification.
- 🎯 Runs list only shows runs that open. Builder sessions, nested sub-runs, and runs whose orchestration has been deleted are filtered out, and the result limit is applied after filtering so a backlog of old runs cannot crowd out live ones.
- 🛡️ Tests no longer write to your run history.
RUNS_DIRand the notification store live underbackend/logs/and ignoredSYNAPSE_DATA_DIR, so the test suite had been writing fixture runs into real user data. Both are now isolated per-test.
🔌 API changes
All additive — no breaking changes. ✅
| Endpoint | Change |
|---|---|
GET /api/orchestrations/runs/{run_id}/events |
🆕 journaled events, ?after= for incremental fetch |
GET /api/orchestrations/runs/{run_id}/events/stream |
🆕 SSE replay-then-tail, honors Last-Event-ID |
GET /api/notifications |
🆕 recent notifications, ?after= |
GET /api/notifications/stream |
🆕 SSE notification feed |
GET /api/orchestrations/runs |
♻️ adds ?limit (default 20, max 200); response gains session_id, current_step_id, steps_completed, last_step_name, waiting_for_human, total_cost_usd; excludes builder/nested runs and runs of deleted orchestrations |
Settings gains one optional key, run_notification_channel_id (empty = in-app notifications only).
🛠️ Notes for operators
- 💾 Run event journals are written to
backend/logs/orchestration_events/as one JSONL file per run, capped per run and degrading to structural events only beyond the cap. Likeorchestration_runs/, this path is not relocated bySYNAPSE_DATA_DIR— worth accounting for in backup and disk planning. - 📦 No new runtime dependencies. Standalone installs need nothing beyond what v1.8.x required; Redis remains optional and scale-mode only.
- 🔀 No migration steps. Runs created before this release remain listable; they simply have no journal to replay and fall back to checkpoint-based status.
- 🔒 Dependency locks refreshed for upstream patch releases (
boto3/botocore,greenlet,openai,sqlalchemy,typing-inspection,twilio), all within existing major bounds.
Built with ❤️ on the Synapse orchestration engine · AGPL-3.0