We measured what can be measured, cite what others have documented, and say plainly what we do not claim. Every number below has a date, a method, and a script you can run yourself.
Measured July 4, 2026 · Node 22.22 · npm 10.9 · Linux x64 · warm npm cache · fresh project per stack. Each stack was installed with the packages its own docs require for a durable, human-approvable agent: LangGraph (+core, +SQLite checkpointer), Temporal (client/worker/workflow/activity), Inngest AgentKit (+inngest), OpenAI Agents SDK, Mastra core. Package count = direct + transitive dependencies installed; footprint = du -sm node_modules; cold start = time to import the package in a fresh Node process. Install time varies with network, treat it as indicative; counts and sizes are stable. Reproduce: bench/footprint.sh.
Every package is supply-chain surface your security team must trust. 2025-26 saw real attacks ride exactly this vector (trojanized npm packages targeting AI tooling).
Matters for serverless, CLIs, and CI, every invocation pays it.
The number of things that must be deployed, monitored, patched, and paged about, for a durable agent with human approval. Sourced from each project's own documentation (July 2026).
| Stack | What must be running | Components | Durability model |
|---|---|---|---|
| ⬢ nexus | your Node process + a file or SQLite database | 1 | journal + resume, per step |
| OpenAI Agents SDK | your process + a datastore you build + resume plumbing you build (docs recommend adding Temporal/Dapr/Restate for real durability) | 2–4, DIY | serialized state blob; crash mid-turn loses the turn |
| LangGraph (durable) | your process + Postgres checkpointer; LangGraph Platform self-hosted adds a server + Redis + license key | 2–4 | checkpoints at step boundaries |
| Inngest AgentKit | your functions + the Inngest server (SSPL-licensed) + event keys | 2–3 | event-driven step memoization |
| Temporal | dev: single server binary + worker + client (3 processes) · production self-hosted: server, database, UI, admin tools, Elasticsearch (~5 containers) + workers, or Temporal Cloud | 3 dev / 5+ prod | event-history replay (excellent, heavy to self-host) |
Sources: openai-agents docs (HITL & running-agents), langchain-ai LangGraph platform docs, inngest/agent-kit README, temporalio docs. Capability differences, not quality judgments. Temporal's durability is superb if you can run Temporal.
OpenAI's own canonical human-in-the-loop examples are 116–137 lines, and their "persistence" is a local JSON file with resume plumbing left to you. Here's the whole thing in Nexus, durability included:
// 1. define tool with needsApproval (their SDK: ✓)
// 2. run, detect result.interruptions (their SDK: ✓)
// 3. serialize RunState to a string (their SDK: ✓)
// 4. design a DB schema for pending states (you: build it)
// 5. build an approval UI / notification (you: build it)
// 6. build the resume endpoint/worker (you: build it)
// 7. handle crash mid-turn (you: can't, turn is lost)
// 8. token/USD budget caps (you: build it)
// 9. audit journal of every step (you: build it)
// 10. replay for regression testing (you: build it)
runtime.register(defineAgent({ name: 'support', provider, model, tools: [lookup, refund], // refund: requiresApproval budget: { maxUsd: 0.50 }, // hard cap, pre-flight approvalPolicy: ({ arguments: a }) => a.amountUsd < 50 ? 'approve' : 'ask', })); const run = await runtime.run('support', task); // paused? notify Slack (1 line), approve from anywhere: await runtime.approve(run.id); // crashed? resume. finished? replay. all built in.
| Durable runs | Human approvals | Policy rules | Per-run USD budget | $0 replay | Open run format | Zero deps | |
|---|---|---|---|---|---|---|---|
| ⬢ nexus | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ CC0 | ✓ |
| LangGraph | checkpoints | ✓ | DIY | ✗ | ✗ | ✗ | ✗ |
| Temporal | ✓ | ✓ | DIY | ✗ | history replay | ✗ | ✗ |
| Inngest AgentKit | ✓ | ✓ | DIY | ✗ | ✗ | ✗ | ✗ |
| OpenAI Agents SDK | state blob, DIY store | ✓ | predicate | ✗ (max_turns only) | ✗ | ✗ | ✗ |
| MCP approval proxies | ✗ | ✓ | ✓ | per-key | ✗ | ✗ | ✗ |
Assessed July 2026 from public docs of each project. "DIY" = achievable with custom code, not shipped. Corrections welcome, open an issue.