Orchestration Adapters
Adapters decide where orchestration runs execute and how durable they are. Task and workflow definitions do not change when you switch adapters.
Memory
Section titled “Memory”Use createMemoryAdapter() when you want:
- no external infrastructure
- fast local development
- lightweight tests
Tradeoffs:
- no durability across process restarts
- no cross-process coordination
const adapter = createMemoryAdapter({ concurrency: 10 });SQLite
Section titled “SQLite”Use createSqliteAdapter() when you want:
- durable local or single-node execution
- restart recovery without Redis
- persistent run and step state
Tradeoffs:
- still a single-process or single-node shape
- not the right fit for distributed worker fleets
const adapter = createSqliteAdapter({ path: './data/orchestration.db', concurrency: 10,});BullMQ
Section titled “BullMQ”Use createBullMQOrchestrationAdapter() when you want:
- Redis-backed durability
- repeatable schedules
- BullMQ workers and queues
- progress updates through
QueueEvents
Tradeoffs:
- requires Redis
- signals are not supported
- you now operate queue infrastructure
import { createBullMQOrchestrationAdapter } from '@lastshotlabs/slingshot-orchestration-bullmq';
const adapter = createBullMQOrchestrationAdapter({ connection: { host: '127.0.0.1', port: 6379 }, prefix: 'orch', concurrency: 10,});When used through createOrchestrationPackage(), the plugin starts and shuts down the adapter for
you. When used directly through createOrchestrationRuntime(), the adapter now lazily starts on
first use, so runTask() / runWorkflow() do not require a separate manual start() call.
Temporal
Section titled “Temporal”Use createTemporalOrchestrationAdapter() from
@lastshotlabs/slingshot-orchestration-temporal when you want:
- distributed workers across multiple machines
- durable workflow history, timers, retries, and signals
- Temporal-native scheduling and visibility
- Slingshot task/workflow definitions running on a real Temporal cluster
Tradeoffs:
- requires an existing Temporal service or Temporal Cloud namespace
- requires a separate Node-based worker process
- operationally heavier than SQLite or BullMQ
import { Client, Connection } from '@temporalio/client';import { createTemporalOrchestrationAdapter } from '@lastshotlabs/slingshot-orchestration-temporal';
const connection = await Connection.connect({ address: 'localhost:7233' });const client = new Client({ connection, namespace: 'default' });
const adapter = createTemporalOrchestrationAdapter({ client, connection, namespace: 'default', workflowTaskQueue: 'slingshot-workflows', defaultActivityTaskQueue: 'slingshot-activities', ownsConnection: false,});Temporal worker processes are separate from the HTTP server. For real deployments, pair the adapter
with createTemporalOrchestrationWorker() so workflow code and activity handlers can poll the
configured task queues.
Capability matrix
Section titled “Capability matrix”| Capability | Memory | SQLite | BullMQ | Temporal |
|---|---|---|---|---|
| Core execution | Yes | Yes | Yes | Yes |
| Scheduling | No | No | Yes | Yes |
| Run listing | Yes | Yes | Yes | Yes |
| Progress subscriptions | Yes | Yes | Yes | Yes |
| Signals | No | No | No | Yes |
Not available yet
Section titled “Not available yet”These providers are planned but not shipped in the current worktree:
- Trigger.dev
- Step Functions
If you need those today, the answer is still “not implemented”, not “hidden behind a flag”.