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 withoutdependsOncontinue to use sequential execution unchanged. - Dependency validation — Registration validates
dependsOnreferences exist, rejects self-dependencies, and detects cycles using topological sort. - Parallel-aware state tracking —
WorkflowStateincludesparallel,completedSteps, andactiveStepsfields for parallel workflows. - Fail-fast semantics — When a parallel step fails without
onFailure, the entire workflow fails immediately. - DAG export for parallel workflows —
getWorkflowGraph()generatesdependsOnedges for parallel workflows.
@synkro/ui v0.2.4
Changed
- Bumped
@synkro/corepeer dependency from^0.18.1to^0.19.0.
@synkro/agents v0.4.0
Added
- Debate Pattern —
createDebate()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/corepeer dependency from^0.18.1to^0.19.0.
@synkro/nestjs v0.5.3
Changed
- Bumped
@synkro/corepeer dependency from^0.18.1to^0.19.0.
@synkro/next v0.2.3
Changed
- Bumped
@synkro/corepeer dependency from^0.18.1to^0.19.0. - Bumped
@synkro/uipeer dependency from^0.2.3to^0.2.4.
March 11, 2026
@synkro/core v0.18.1
Fixed
- Workflow payload propagation —
setPayload()changes inside workflow step handlers now correctly flow to subsequent steps. Previously,HandlerRegistrypublished the original event payload in the completion event instead of the updatedctx.payload, causingsetPayloadmutations to be lost between workflow steps.
@synkro/ui v0.2.3
Changed
- Bumped
@synkro/corepeer dependency from^0.15.0to^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: trueinAgentConfig. 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 configurablefallbackroute for uncertain cases. - Supervisor/Worker Pattern (D6) —
createSupervisor()creates an agent that delegates tasks to specialized worker agents via a syntheticdelegate_to_workertool. The supervisor iterates (reason → delegate → observe) until the task is complete.maxRoundsdefaults to 5 and maps directly to the underlying agent'smaxIterations. Built entirely on existing Agent primitives.
@synkro/agents v0.2.1
Changed
- Bumped
@synkro/corepeer dependency from^0.18.0to^0.18.1.
@synkro/agents v0.2.0
Added
- Live Agent Context — Tools receive real
publish()andsetPayload()from the synkro handler context when running viaasHandler(). Standaloneagent.run()keeps safe no-op stubs. - Agent Registry —
AgentRegistryclass for registering and looking up agents by name. Enables cross-agent delegation viactx.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 Pipeline —
createPipeline()generates aSynkroWorkflowfrom a sequence of agent steps. Supports custominputMapperfunctions, string-based agent resolution from registry, and workflow-levelonSuccess/onFailure/onCompletebranching. - Factory function —
createAgentRegistry()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 guardrails —
maxIterationsandtokenBudgetprevent runaway loops and API spend. - Factory functions —
createAgent()andcreateTool()for ergonomic API.
@synkro/nestjs v0.5.2
Changed
- Bumped
@synkro/corepeer dependency from^0.15.0to^0.18.1.
@synkro/next v0.2.2
Changed
- Bumped
@synkro/corepeer dependency from^0.16.0to^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 onsynkro.stop(). Active schedules included inintrospect().schedules. - Middleware / interceptor pipeline (IMP-03): Koa-style middleware chain for cross-cutting concerns.
synkro.use(middleware)orSynkroOptions.middlewaresfor registration. Middleware signature:(ctx: MiddlewareCtx, next: () => Promise. Executes in registration order (onion model), wrapping each handler independently. Works on regular events, workflow steps, and standalone) => Promise executeHandler. New exports:composeMiddleware,MiddlewareCtx,MiddlewareFunction. - Workflow visualization / DAG export (FT-10):
synkro.getWorkflowGraph(workflowName)returns aWorkflowGraphwithnodesandedges.introspect().graphsreturns all workflow DAGs. New exports:WorkflowGraph,WorkflowGraphNode,WorkflowGraphEdge.
@synkro/core v0.17.0
Added
- Transport contract test suite (IMP-09): Shared
transportContractTestssuite validatingInMemoryManageragainst the fullTransportManagerinterface. 24 contract tests covering pub/sub round-trips, cache CRUD with TTL expiry,setCacheIfNotExistsatomicity, increment, list operations,deleteKey, anddisconnectcleanup. - Event versioning (FT-12): Events following the
base:event:vNconvention (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 vialogFormatoption inSynkroOptions. JSON mode outputs machine-parseable log entries withlevel,msg,timestamp, and contextual fields (requestId,eventType,workflowName). Default"text"format is backward-compatible.LogFormattype exported. - Event filtering (FT-09): Handlers can specify a
filterpredicate viaSynkroEvent.filterorsynkro.on(). When a filter returnsfalse, 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.EventFiltertype 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: trueinSynkroOptions. New methods:synkro.getDeadLetterItems(eventType, { limit }),synkro.replayDeadLetterItem(item),synkro.clearDeadLetterQueue(eventType).DeadLetterItemtype exported.
Changed
- All internal log messages now use structured fields instead of string interpolation, improving observability in both text and JSON modes.
TransportManagerinterface extended withpushToList(),getListRange(), anddeleteKey()methods. Both Redis and in-memory transports implement them.
@synkro/core v0.15.1
Added
- Custom transport support (FT-10):
SynkroOptions.transportnow accepts aTransportManagerinstance 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 aWorkflowStateobject ornull. 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, andSynkroEventare now generic types with a default ofunknown. Fully backward-compatible.
Fixed
- eslint-disable for decorator types (TD-09): Replaced
Functiontype constraint in@OnEventand@OnWorkflowStepdecorators with(...args: any[]) => any.
@synkro/ui v0.2.2
Changed
- Updated
@synkro/corepeer dependency from^0.9.0to^0.15.0.
@synkro/nestjs v0.5.1
Changed
- Bumped
@synkro/corepeer dependency from^0.13.0to^0.15.0to align with latest core (includesoff(), 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), andWorkflowAdvancer. 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), andcancelWorkflow(requestId, workflowName)toSynkroClient.
Changed
- Peer dependency updated from
@synkro/core ^0.9.0to^0.15.0. Addedioredis: ^5.0.0as 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.SynkroOptionsaccepts aschemasmap. Per-event schemas viaschemafield onSynkroEvent.SchemaValidatoris a(payload: unknown) => voidfunction compatible with any validation library. - Workflow timeout (FT-06):
SynkroWorkflowStepandSynkroWorkflowsupport optionaltimeoutMs. Step-level timeout overrides workflow-level timeout. Synthetic failure event published on timeout. - Graceful shutdown (IMP-06):
stop()drains active handlers before disconnecting. ConfigurabledrainTimeout(default 5000ms) viaSynkroOptions.drainTimeout. - Instance-scoped logger (TD-06):
Loggeris now a class with instance-leveldebugEnabledstate. EachSynkroinstance creates its ownLogger. TheLoggerclass is exported.
Verified
- In-memory transport TTL (TD-03): Confirmed
InMemoryManagercorrectly applies TTL viaapplyTtl()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
retentionoption inSynkroOptions. 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.stateTtlto configure it.
@synkro/core v0.12.0
Added
- Implicit step registration (FT-14): Workflow steps referenced by
onSuccessoronFailureno longer need explicit declaration in thestepsarray. 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
errorsarray with serialized error details (message,name). processingLocksobservability (TD-05): Warning logs whenprocessingLocksexceeds 1000 entries inHandlerRegistryandWorkflowRegistry.
Changed
- Async publish with error propagation (TD-04): Breaking —
TransportManager.publishMessagesignature changed fromvoidtoPromise. Custom transport implementations must update their return type. - Validate transport field (TD-08)
[SEC]:Synkro.start()now validates thetransportoption. Only"redis","in-memory", andundefinedare accepted. Invalid values throw a descriptive error.
Removed
- Dead code (TD-12): Removed unused
eventToWorkflowsmap fromWorkflowRegistry.
@synkro/core v0.10.0
Added
- Retry backoff strategy (TD-01):
RetryConfignow supportsdelayMs,backoff("fixed"|"exponential"),jitter, andretryablepredicate. New export:RetryBackoffStrategy.
@synkro/core v0.9.2
Fixed
- Harden message parsing paths (TD-13)
[SEC]: AllJSON.parsecalls inHandlerRegistryandWorkflowRegistrywrapped with try/catch. Malformed messages logged and dropped instead of crashing. - Redis connection error handling (IMP-07):
RedisManagernow 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):
registerWorkflowsvalidates each workflow before registration — empty name, empty steps, duplicate step types, and danglingonSuccess/onFailuretargets now throw clear errors.
@synkro/nestjs v0.5.0
Added
- Retention option (IMP-03): Configure Redis key TTLs directly through module options via
retentionfield inSynkroModule.forRoot(). - Expanded public service API (IMP-04):
SynkroServicenow exposesintrospect()andgetEventMetrics(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.0to^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):
onModuleDestroyguards against uninitialized state.
March 6, 2026
@synkro/core v0.9.0
Changed
logger.warnnow always emits (TD-01): Breaking — Warnings always emit viaconsole.warnregardless of thedebugflag. Thedebugflag now exclusively controls verbose debug traces.
Fixed
- Multiple subscriptions no longer silently overwrite callbacks (TD-02):
RedisManagerandHandlerRegistrynow useSet-based storage and fan out to all registered callbacks/handlers. - Transport-level message deduplication (TD-03):
RedisManagerdeduplicates messages at the transport layer using a bounded in-memory cache (max 10,000 entries, 5-second window) before invoking callbacks.