# Durable Execution Fetch https://developers.cloudflare.com/agents/runtime/execution/durable-execution/index.md for complete documentation. Fibers let agent work survive Durable Object eviction. Progress is checkpointed to SQLite; on recovery, you decide what to do. ## `runFiber` ```typescript export class MyAgent extends Agent { async onRequest(request: Request) { await this.runFiber("process-data", async (ctx) => { const step1 = await fetchData(); ctx.stash({ step: 1, data: step1 }); const step2 = await transform(step1); ctx.stash({ step: 2, result: step2 }); this.setState({ result: step2 }); }); return new Response("Started"); } async onFiberRecovered(ctx) { const checkpoint = ctx.stash; if (checkpoint.step === 1) { const step2 = await transform(checkpoint.data); this.setState({ result: step2 }); } } } ``` ## Key APIs | API | Purpose | |-----|---------| | `this.runFiber(name, fn)` | Start a named fiber | | `ctx.stash` / `this.stash` | Read latest checkpoint | | `ctx.stash = data` | Write checkpoint (JSON-serializable) | | `onFiberRecovered(ctx)` | Called on DO restart if fiber was in-flight | | `keepAlive()` | Prevent hibernation while fiber runs | | `keepAliveWhile(fn)` | Keep alive for duration of async function | ## Important - `stash` replaces the entire checkpoint — not a merge - The lambda is NOT restored on recovery — only the stash data is. You must re-derive what to do in `onFiberRecovered` - No auto-retry on throw — handle errors yourself - For long-running pipelines with automatic retries, use Workflows instead - Filter concurrent fibers by `ctx.name` in `onFiberRecovered`