Skip to main content
0.14.0 brings durable timers, sandboxed execution, and the diagnostic tools to understand exactly what’s happening inside a running workflow.

New Components

<Timer>: Pause a workflow for minutes, hours, or until a specific time

Durable timers that survive process restarts. The workflow engine persists the timer target to SQLite and automatically resumes execution when it fires, with no long-lived process required.

<Sandbox>: Run untrusted code in isolation

Execute agent-generated code or compute-heavy tasks in isolated environments. Three backends: Sandboxes capture filesystem diffs and present them for approval before applying changes to the host. Set autoAcceptDiffs to skip the gate for fully autonomous workflows.

<ContinueAsNew>: Prevent unbounded state growth in long-running loops

Replaces the current run with a fresh one, carrying over only the state you specify. Old run history remains queryable and the continuation lineage is preserved. Essential for daemon-style loops that would otherwise accumulate gigabytes of event history.

<Signal>: Inject external data into a running workflow

Pauses execution until structured data arrives via the CLI or HTTP API. The payload is validated against a Zod schema and passed type-safely to downstream tasks.

CLI

bunx smthrs why: Understand why a run is stuck

A diagnostic engine that calculates exactly what’s blocking a run and tells you how to fix it.
Detects waiting signals, pending approvals, stale heartbeats, retry backoffs, upstream dependency failures, and more.

bunx smthrs events: Browse workflow event history

Filter by node, category, or time. Events stream incrementally so you never run out of memory on large runs.

bunx smthrs node: Deep-dive into a single node

Aggregates task attempts, tool calls, schema validation errors, Zod-validated outputs, and token usage with pricing.

--watch flag

Live-updating views for ps, inspect, and events.

Durability

  • Transactional state writes. Critical SQLite updates are now grouped into atomic BEGIN IMMEDIATE transactions, preventing partial state if a process crashes mid-write.
  • Task heartbeats with checkpoints. Long-running tasks can report progress. If the task crashes, the retry execution receives the last checkpoint via lastHeartbeat to resume where it left off.
  • Auto-resume supervisor. Watches for orphaned runs with stale heartbeats and resumes them automatically. Atomic DB claim lock prevents concurrent supervisor races.

Engine & Storage

  • Frame delta encoding. 95-99% reduction in _smithers_frames storage. Frames are now stored as compact XML structural diffs instead of full snapshots, shrinking multi-gigabyte databases to megabytes.

bunx smthrs init Improvements

  • Tier-based agent groupings (cheapFast, smart, smartTool) with automatic provider detection and fallback
  • Typed inputSchema objects on all seeded workflows
  • ValidationLoop with feedback injection and convergence detection
  • New ticket-kanban workflow for parallel ticket implementation in worktrees
  • bunx smthrs workflow create scaffold uses the tier-based system
  • All seeded files use zod/v4

New Run Statuses

  • waiting-timer: paused on a durable timer
  • continued: completed via continue-as-new; a successor run was started

New Metrics

timerDelayDuration, timersCancelled, timersCreated, timersFired, timersPending, dbTransactionDuration, dbTransactionRetries, dbTransactionRollbacks, sandboxActive, sandboxBundleSizeBytes, sandboxCompletedTotal, sandboxCreatedTotal, sandboxDurationMs, sandboxPatchCount, sandboxTransportDurationMs

Error Codes

  • Added: RUN_NOT_FOUND, NODE_NOT_FOUND, INVALID_EVENTS_OPTIONS, SANDBOX_BUNDLE_INVALID, SANDBOX_BUNDLE_TOO_LARGE, TASK_HEARTBEAT_TIMEOUT, HEARTBEAT_PAYLOAD_TOO_LARGE, HEARTBEAT_PAYLOAD_NOT_JSON_SERIALIZABLE
  • Removed: PROMPT_EXISTS, PROMPT_MDX_INVALID, TICKET_EXISTS, TICKET_NOT_FOUND