Skip to main content

0.16.0

0.16.0 is a rebase-the-whole-codebase release. The runtime has been migrated from TypeScript to plain JavaScript with type-only .ts stubs, the package graph has been pruned and reorganized, and a new live-run DevTools surface lands alongside a derived RunState model for richer run observability.

Breaking changes

  • Runtime is now JavaScript, types live in .ts stubs. Every runtime package (smithers-orchestrator, engine, db, driver, server, cli, components, react-reconciler, agents, observability, time-travel, sandbox, scheduler, scorers, openapi, memory, vcs, graph, errors, protocol, and examples) has been migrated to .js files with .d.ts-style type-only .ts stubs next to each module. Build, test, and import paths are unchanged — but anyone patching the runtime should expect to edit .js sources rather than .ts.
  • Removed packages. The following have been deleted outright:
    • packages/durables — no longer used by the engine.
    • packages/rag and packages/voice — dropped from the product surface; matching metrics have been removed from observability.
    • packages/tools — the separate workspace package is gone. Public built-in helpers remain exported from smithers-orchestrator and smithers-orchestrator/tools: tools, read, write, edit, grep, bash, defineTool, and getDefinedToolMetadata.
    • Python SDK, examples, and integration code — smithers is TypeScript/JS only now.
    • jjhub workflows, the IDE / GitHub bot / Pi plugin integrations docs, and the Effect-ts integration doc page.
  • Tool context is no longer supplied by a standalone tools package. Custom tools should accept the defineTool() context argument for retry-safe metadata such as idempotencyKey. The public runWithToolContext() helper still exists for integrations that execute Smithers tool helpers manually.
  • observability moved to apps/observability. It remains the @smithers/observability workspace package, but its source now lives under apps/ with the CLI and other app-owned surfaces.
  • runtime package renamed to driver. Imports from @smithers/runtime should move to @smithers/driver. Runtime-adjacent helpers have been consolidated into the driver package.
  • Engine control APIs return Effect. engine.start, engine.stop, engine.resume, engine.pause, and friends now return Effects rather than plain promises. Callers that awaited the old promise API should run the returned effect through the engine’s runtime.
  • smithers diff now targets DevTools node diffs. The old snapshot-pair shape (diff <run-a>:<frame> <run-b>:<frame>) has been replaced by smithers diff <runId> <nodeId> with optional --iteration, --json, and --stat.
  • Stale semantic memory exports removed. createSemanticMemory and SemanticMemory are no longer exported. Use createMemoryStore, createMemoryLayer, and MemoryService from the memory package surface.

New: Live-run DevTools

A first cut of live-run DevTools lands in this release. It streams per-frame JSX tree snapshots, node-level diffs, and per-node tool output over the Gateway so that a debugger UI can follow an active run in real time and scrub backwards through history.
  • Snapshot serializer and delta apply/diff. packages/devtools now ships a stable serializer for React-reconciler trees, plus apply/diff helpers so clients can reconstruct any historical frame from a base snapshot and a delta stream.
  • Gateway DevTools stream + new HTTP routes. The server exposes a live DevTools WebSocket stream and three new routes: per-node diff, per-node output, and jump-to-frame.
  • Jump-to-frame with rewind lock, audit, and rate-limit. Time-travel jumps acquire a per-run rewind lock, write an audit row, and are rate-limited so that a runaway debugger client cannot thrash an active run.
  • Protocol additions. packages/protocol gains devtools, outputs, and errors types for the new stream and routes.
  • DB: node-diffs cache + time-travel audit schema. New tables back the DevTools stream so historical frames can be reconstructed without replaying the full event log.
  • Observability: DevTools + rewind metrics. New metrics cover DevTools stream fan-out, rewind lock contention, and jump-to-frame latency.
  • React reconciler: devtools stop handling. The reconciler now emits clean DevTools stop events when a run ends so clients can flush their buffers.
  • CLI: new tree, output, and rewind commands plus repurposed diff. The CLI ships thin clients for the new DevTools routes so you can inspect per-frame trees, per-node outputs, node DiffBundles, and rewinds from the terminal without a GUI.

New: CLI control plane

The CLI is now a fuller local control plane rather than just a workflow launcher:
  • Interactive TUI. smithers tui opens an OpenTUI dashboard with runs, logs, metrics, node detail, frames, SQL browsing, chat, and attention panes.
  • Workflow workspace commands. smithers init installs the local .smithers/ workflow pack, and smithers workflow list|run|path|create|doctor discovers and manages workflows under .smithers/workflows.
  • Run inspection commands. ps, logs, events, node, why, watch, supervise, cancel, and down now share the derived RunState model and emit machine-readable JSON when requested.
  • Agent and integration helpers. agents capabilities|doctor, openapi list, memory list, cron management, and the semantic MCP server surface are now part of the CLI package.

New: RunState model

A derived RunState view now lives in packages/db/src/runState. It takes raw run rows, events, and timers and computes a single view-model with a normalized state, block reasons, unhealthy reasons, and a heartbeat-staleness check (RUN_STATE_HEARTBEAT_STALE_MS). The Gateway, CLI, and DevTools all consume the same derived state, so a run looks the same from every surface. See the RunState runtime doc for the full shape.

New: Workflow metadata

  • WorkflowDefinition gains readableName and description. Used by the CLI, Gateway, and DevTools to render workflows with a human-friendly label instead of the programmatic ID.

New: Durable alerts

Alert policy support now has a concrete storage and operator surface:
  • Typed alertPolicy metadata. createSmithers(..., { alertPolicy }) and workflow-level overrides carry owners, severities, runbooks, labels, and reaction metadata.
  • Expanded _smithers_alerts schema. Alert rows now include fingerprint, node/iteration, owner, runbook, labels, reaction JSON, source event type, first/last fired timestamps, occurrence count, silence state, and acknowledged/resolved actor fields.
  • CLI alert management. smithers alerts list|ack|resolve|silence manages durable alert instances.
  • Important scope note. Built-in runtime rule evaluators and delivery transports are not bundled in 0.16. Runtime integrations should evaluate policies and write alert rows through the DB adapter.

Fixes

  • Prevent SQLITE_IOERR_VNODE under concurrent Worktree runs. Multiple concurrent runs sharing a worktree no longer race on the SQLite DB file.
  • Fix resume for workflows without a user-defined input schema. Resume used to crash when the workflow did not declare an input schema; it now resumes cleanly.
  • Fix smithers chat to display agent tool calls and file changes. Tool calls and file changes now render in the chat transcript instead of being silently dropped.
  • Default log level is now warning for smithers up. smithers up output is quiet by default; opt into verbose logging explicitly.
  • Waiting-timer supervisor no longer double-resumes. Regression covered by a new test in apps/cli/tests (#124).
  • Engine runtime split. The engine’s runtime implementation has been split into a dedicated module so Effect interop helpers and control APIs can be inlined without circular imports.
  • Package naming corrected for publish. The public package is smithers-orchestrator; the private repository root is smithers-monorepo.
  • Generated workflow imports now use smithers-orchestrator. The CLI scaffold and E2E fixtures no longer generate stale smithers imports.

Docs

The documentation site has been rewritten end-to-end: llms-full.txt has been reduced from 250k tokens to 66k tokens making it viable to put entire smithers docs in context
  • New Tour, How It Works, and Recipes pages on the landing path.
  • Hero pages (start, installation, quickstart) rewritten and merged into a single JSX overview.
  • CLI reference converted to a TOON command catalog.
  • Reference types condensed to a .d.ts dump, with the event union extracted as its own page.
  • Runtime API pages slimmed; every component page compressed to props plus one example.
  • Concept and guide pages consolidated — memory and openapi fleshed out; merged pages stubbed with redirects.
  • Aggressive trim across the integrations surface; the IDE, GitHub bot, Pi extension, Pi plugin, and Effect-ts integration pages are gone.
  • bunx invocation normalized across examples, design docs, and changelogs.
  • Tickets restructured into gui, jjhub, and smithers directories.
  • DevTools live-run UI spec and tickets added under docs/tickets.
  • docs.json nav restructured; redirects added for merged pages.
  • llms-* artifacts regenerated against the new MDX surface.

Internal / chore

  • CI workflow files removed. The .github/workflows directory is gone; CI is managed externally.
  • bun.lock replaced with pnpm-lock.yaml. The monorepo uses pnpm for installs and pnpm -r test as the root test script.
  • Workspace package graph defined. packages/* and apps/* now declare their dependency graph explicitly so changes propagate predictably.
  • Cursor rules, dev shell scripts, worktree-feature scripts, docs generation scripts, AGENTS.md, DEVTOOLS_HANDOFF.md, .env.example, and the Codex skill definition removed. Repo surface trimmed to what ships.