Skip to content

Release Notes

All notable changes to Synkro packages, organized by release date.

March 13, 2026

@synkro/core v0.19.0

Added

  • Parallel workflow step execution — Steps can now declare dependsOn: string[] to express dependency relationships. Steps without dependencies start in parallel; dependent steps wait for all dependencies to complete before executing. Workflows without dependsOn continue to use sequential execution unchanged.
  • Dependency validation — Registration validates dependsOn references exist, rejects self-dependencies, and detects cycles using topological sort.
  • Parallel-aware state trackingWorkflowState includes parallel, completedSteps, and activeSteps fields for parallel workflows.
  • Fail-fast semantics — When a parallel step fails without onFailure, the entire workflow fails immediately.
  • DAG export for parallel workflowsgetWorkflowGraph() generates dependsOn edges for parallel workflows.
@synkro/ui v0.2.4

Changed

  • Bumped @synkro/core peer dependency from ^0.18.1 to ^0.19.0.
@synkro/agents v0.4.0

Added

  • Debate PatterncreateDebate() enables multi-agent collaboration where participants take turns debating a topic over configurable rounds with full shared transcript history. Supports an optional moderator agent that frames the debate and synthesizes a final conclusion. Returns { run(), asHandler() } for standalone and Synkro-integrated use. Token usage is accumulated across all participants and rounds.
@synkro/agents v0.3.1

Changed

  • Bumped @synkro/core peer dependency from ^0.18.1 to ^0.19.0.
@synkro/nestjs v0.5.3

Changed

  • Bumped @synkro/core peer dependency from ^0.18.1 to ^0.19.0.
@synkro/next v0.2.3

Changed

  • Bumped @synkro/core peer dependency from ^0.18.1 to ^0.19.0.
  • Bumped @synkro/ui peer dependency from ^0.2.3 to ^0.2.4.

March 11, 2026

@synkro/core v0.18.1

Fixed

  • Workflow payload propagationsetPayload() changes inside workflow step handlers now correctly flow to subsequent steps. Previously, HandlerRegistry published the original event payload in the completion event instead of the updated ctx.payload, causing setPayload mutations to be lost between workflow steps.
@synkro/ui v0.2.3

Changed

  • Bumped @synkro/core peer dependency from ^0.15.0 to ^0.18.1.
@synkro/agents v0.3.0

Added

  • Observability (D4) — Agents can now emit structured lifecycle events into the synkro event system. Enable with emitEvents: true in AgentConfig. Emitted events: agent:run:started, agent:run:completed, agent:run:failed, agent:tool:executed. Events are no-ops in standalone mode (no synkro context).
  • Dynamic Router (D5)createRouter() provides LLM-based N-path workflow branching. The router presents named routes to the LLM (JSON mode, temperature 0), selects the best route, and publishes the selected route name as a synkro event with the current payload. Supports a configurable fallback route for uncertain cases.
  • Supervisor/Worker Pattern (D6)createSupervisor() creates an agent that delegates tasks to specialized worker agents via a synthetic delegate_to_worker tool. The supervisor iterates (reason → delegate → observe) until the task is complete. maxRounds defaults to 5 and maps directly to the underlying agent's maxIterations. Built entirely on existing Agent primitives.
@synkro/agents v0.2.1

Changed

  • Bumped @synkro/core peer dependency from ^0.18.0 to ^0.18.1.
@synkro/agents v0.2.0

Added

  • Live Agent Context — Tools receive real publish() and setPayload() from the synkro handler context when running via asHandler(). Standalone agent.run() keeps safe no-op stubs.
  • Agent RegistryAgentRegistry class for registering and looking up agents by name. Enables cross-agent delegation via ctx.delegate(agentName, input) in tool functions.
  • Delegation with token tracking — Delegated agent runs accumulate token usage into the parent agent's budget, preventing runaway spending across agent chains.
  • Agent PipelinecreatePipeline() generates a SynkroWorkflow from a sequence of agent steps. Supports custom inputMapper functions, string-based agent resolution from registry, and workflow-level onSuccess/onFailure/onComplete branching.
  • Factory functioncreateAgentRegistry() for ergonomic registry creation.
@synkro/agents v0.1.0

Added

  • Agent class with ReAct loop (reason → act → observe → repeat).
  • ModelProvider interface with built-in adapters for OpenAI, Anthropic, and Gemini.
  • Tool system — typed tools with JSON Schema parameters, parallel execution, error handling.
  • ConversationMemory — Redis-backed message history via TransportManager.
  • agent.asHandler() — bridges agents into Synkro's event system (locking, dedup, retries, DLQ).
  • Safety guardrailsmaxIterations and tokenBudget prevent runaway loops and API spend.
  • Factory functionscreateAgent() and createTool() for ergonomic API.
@synkro/nestjs v0.5.2

Changed

  • Bumped @synkro/core peer dependency from ^0.15.0 to ^0.18.1.
@synkro/next v0.2.2

Changed

  • Bumped @synkro/core peer dependency from ^0.16.0 to ^0.18.1.

March 10, 2026

@synkro/core v0.18.0

Added

  • Scheduled and delayed event publishing (FT-02): synkro.publishDelayed(event, payload, delayMs) publishes an event after a one-shot delay. synkro.schedule(eventType, intervalMs, payload?) creates recurring event publishes. synkro.unschedule(scheduleId) cancels a schedule. All timers cleaned up on synkro.stop(). Active schedules included in introspect().schedules.
  • Middleware / interceptor pipeline (IMP-03): Koa-style middleware chain for cross-cutting concerns. synkro.use(middleware) or SynkroOptions.middlewares for registration. Middleware signature: (ctx: MiddlewareCtx, next: () => Promise) => Promise. Executes in registration order (onion model), wrapping each handler independently. Works on regular events, workflow steps, and standalone executeHandler. New exports: composeMiddleware, MiddlewareCtx, MiddlewareFunction.
  • Workflow visualization / DAG export (FT-10): synkro.getWorkflowGraph(workflowName) returns a WorkflowGraph with nodes and edges. introspect().graphs returns all workflow DAGs. New exports: WorkflowGraph, WorkflowGraphNode, WorkflowGraphEdge.
@synkro/core v0.17.0

Added

  • Transport contract test suite (IMP-09): Shared transportContractTests suite validating InMemoryManager against the full TransportManager interface. 24 contract tests covering pub/sub round-trips, cache CRUD with TTL expiry, setCacheIfNotExists atomicity, increment, list operations, deleteKey, and disconnect cleanup.
  • Event versioning (FT-12): Events following the base:event:vN convention (e.g., user:created:v2) trigger automatic base-event fanout. Handlers on the base event receive all versions as a catch-all; handlers on a specific version receive only that version. Unversioned events work unchanged. New exports: parseEventType(), isVersionedEvent(), ParsedEventType.

March 9, 2026

@synkro/core v0.16.0

Added

  • Structured logging (IMP-05): Logger now supports "json" output format via logFormat option in SynkroOptions. JSON mode outputs machine-parseable log entries with level, msg, timestamp, and contextual fields (requestId, eventType, workflowName). Default "text" format is backward-compatible. LogFormat type exported.
  • Event filtering (FT-09): Handlers can specify a filter predicate via SynkroEvent.filter or synkro.on(). When a filter returns false, the handler is skipped without triggering failure events. When all handlers for an event are filtered out, no metrics or completion/failure events are emitted. EventFilter type exported.
  • Dead letter queue (FT-01): Failed events (after retry exhaustion) can be persisted to a DLQ for later inspection and replay. Opt-in via deadLetterQueue: true in SynkroOptions. New methods: synkro.getDeadLetterItems(eventType, { limit }), synkro.replayDeadLetterItem(item), synkro.clearDeadLetterQueue(eventType). DeadLetterItem type exported.

Changed

  • All internal log messages now use structured fields instead of string interpolation, improving observability in both text and JSON modes.
  • TransportManager interface extended with pushToList(), getListRange(), and deleteKey() methods. Both Redis and in-memory transports implement them.
@synkro/core v0.15.1

Added

  • Custom transport support (FT-10): SynkroOptions.transport now accepts a TransportManager instance in addition to "redis" and "in-memory" strings, enabling custom transport implementations without modifying the core package.
  • Standalone executeHandler() utility (FT-11): Extracted handler execution logic (dedup, distributed locking, retry with backoff, metrics, completion event publication) into a standalone function. New exports: ExecuteHandlerOptions, ExecuteHandlerResult.
@synkro/core v0.15.0

Added

  • Unsubscribe / off() capability (TD-10): synkro.off(eventType, handler?) to unregister event handlers at runtime. Removes specific handler or all handlers for the event type. Transport channel subscription cleaned up when no handlers remain.
  • Workflow state query API (FT-04): synkro.getWorkflowState(requestId, workflowName) returns a WorkflowState object or null. New export: WorkflowState.
  • Workflow cancellation (FT-07): synkro.cancelWorkflow(requestId, workflowName) cancels a running workflow, setting status to "cancelled" and clearing active step timers.
  • Typed payload generics (IMP-01): HandlerCtx, HandlerFunction, and SynkroEvent are now generic types with a default of unknown. Fully backward-compatible.

Fixed

  • eslint-disable for decorator types (TD-09): Replaced Function type constraint in @OnEvent and @OnWorkflowStep decorators with (...args: any[]) => any.
@synkro/ui v0.2.2

Changed

  • Updated @synkro/core peer dependency from ^0.9.0 to ^0.15.0.
@synkro/nestjs v0.5.1

Changed

  • Bumped @synkro/core peer dependency from ^0.13.0 to ^0.15.0 to align with latest core (includes off(), workflow state query, cancellation, and typed generics).
@synkro/next v0.2.0

Added

  • Serverless HTTP dispatch (FT-08): Full event and workflow processing in Next.js serverless functions. New exports: createSynkroServerless(options), createEventHandler(synkro, options), createWorkflowStepHandler(synkro, options), HttpTransportManager (Redis for cache, HTTP POST for dispatch, optional HMAC signing), and WorkflowAdvancer.
  • publishAfterResponse() helper (FT-09): Wraps Next.js 15+ after() API for fire-and-forget event publishing after the response is sent.
  • Align SynkroClient with core v0.15.0 (IMP-05): Added off(eventType, handler?), getWorkflowState(requestId, workflowName), and cancelWorkflow(requestId, workflowName) to SynkroClient.

Changed

  • Peer dependency updated from @synkro/core ^0.9.0 to ^0.15.0. Added ioredis: ^5.0.0 as optional peer dependency (required for serverless mode).

March 7, 2026

@synkro/core v0.14.0

Added

  • Event schema validation (IMP-04) [SEC]: Schema validation for event payloads at publish and handler dispatch time. SynkroOptions accepts a schemas map. Per-event schemas via schema field on SynkroEvent. SchemaValidator is a (payload: unknown) => void function compatible with any validation library.
  • Workflow timeout (FT-06): SynkroWorkflowStep and SynkroWorkflow support optional timeoutMs. Step-level timeout overrides workflow-level timeout. Synthetic failure event published on timeout.
  • Graceful shutdown (IMP-06): stop() drains active handlers before disconnecting. Configurable drainTimeout (default 5000ms) via SynkroOptions.drainTimeout.
  • Instance-scoped logger (TD-06): Logger is now a class with instance-level debugEnabled state. Each Synkro instance creates its own Logger. The Logger class is exported.

Verified

  • In-memory transport TTL (TD-03): Confirmed InMemoryManager correctly applies TTL via applyTtl() with lazy eviction on read.
@synkro/core v0.13.0

Added

  • Configurable key retention / TTL policy (IMP-08): Redis keys now have configurable TTLs via retention option in SynkroOptions. Fields: lockTtl, dedupTtl, stateTtl, metricsTtl. All optional — omitting preserves defaults. New export: RetentionConfig.
  • Configurable workflow state TTL (TD-07): Workflow state TTL is no longer hardcoded to 24 hours. Use retention.stateTtl to configure it.
@synkro/core v0.12.0

Added

  • Implicit step registration (FT-14): Workflow steps referenced by onSuccess or onFailure no longer need explicit declaration in the steps array. Missing branch targets are auto-appended during registration. Fully backward-compatible.
@synkro/core v0.11.0

Added

  • Error details in failure events (IMP-02): Failure events now include an errors array with serialized error details (message, name).
  • processingLocks observability (TD-05): Warning logs when processingLocks exceeds 1000 entries in HandlerRegistry and WorkflowRegistry.

Changed

  • Async publish with error propagation (TD-04): BreakingTransportManager.publishMessage signature changed from void to Promise. Custom transport implementations must update their return type.
  • Validate transport field (TD-08) [SEC]: Synkro.start() now validates the transport option. Only "redis", "in-memory", and undefined are accepted. Invalid values throw a descriptive error.

Removed

  • Dead code (TD-12): Removed unused eventToWorkflows map from WorkflowRegistry.
@synkro/core v0.10.0

Added

  • Retry backoff strategy (TD-01): RetryConfig now supports delayMs, backoff ("fixed" | "exponential"), jitter, and retryable predicate. New export: RetryBackoffStrategy.
@synkro/core v0.9.2

Fixed

  • Harden message parsing paths (TD-13) [SEC]: All JSON.parse calls in HandlerRegistry and WorkflowRegistry wrapped with try/catch. Malformed messages logged and dropped instead of crashing.
  • Redis connection error handling (IMP-07): RedisManager now creates connections with retry strategy (exponential backoff capped at 5s), error event handler, and connect event handler.
@synkro/core v0.9.1

Added

  • Validate workflow definitions at registration (TD-11): registerWorkflows validates each workflow before registration — empty name, empty steps, duplicate step types, and dangling onSuccess/onFailure targets now throw clear errors.
@synkro/nestjs v0.5.0

Added

  • Retention option (IMP-03): Configure Redis key TTLs directly through module options via retention field in SynkroModule.forRoot().
  • Expanded public service API (IMP-04): SynkroService now exposes introspect() and getEventMetrics(eventType) directly.
  • Readiness checks on public methods (TD-07): All public methods throw a clear error if called before module initialization completes.

Changed

  • Peer dependency updated from @synkro/core ^0.9.0 to ^0.13.0.
  • Remove noop handler masking (TD-03) [SEC]: Breaking — Workflow steps without a handler now throw at startup instead of silently running a noop.
  • Safe module destroy on partial init (TD-06): onModuleDestroy guards against uninitialized state.

March 6, 2026

@synkro/core v0.9.0

Changed

  • logger.warn now always emits (TD-01): Breaking — Warnings always emit via console.warn regardless of the debug flag. The debug flag now exclusively controls verbose debug traces.

Fixed

  • Multiple subscriptions no longer silently overwrite callbacks (TD-02): RedisManager and HandlerRegistry now use Set-based storage and fan out to all registered callbacks/handlers.
  • Transport-level message deduplication (TD-03): RedisManager deduplicates messages at the transport layer using a bounded in-memory cache (max 10,000 entries, 5-second window) before invoking callbacks.