Sessions & State
Sessions
Maintain state across multiple requests
Sessions#
Sessions let agents maintain state across multiple requests โ useful for carts, multi-step workflows, and personalization. Surf includes an in-memory session store out of the box.
TypeScript
// Agent starts a sessionPOST /surf/session/start// => { "ok": true, "sessionId": "sess_abc123" }ย // Execute commands with session contextPOST /surf/execute{ "command": "cart.add", "params": { "sku": "LAPTOP-01" }, "sessionId": "sess_abc123"}ย // The handler receives session state in ctx.stateconst surf = await createSurf({ name: 'My Store', commands: { 'cart.add': { description: 'Add item to cart', params: { sku: { type: 'string', required: true } }, run: async ({ sku }, ctx) => { const cart = (ctx.state?.cart as string[]) ?? [] cart.push(sku) // Return state to persist it return { cart, added: sku } }, }, 'cart.view': { description: 'View cart', run: async (_, ctx) => { return { items: ctx.state?.cart ?? [] } }, }, },})ย // End session when donePOST /surf/session/end{ "sessionId": "sess_abc123" }Session state is automatically persisted between requests when a sessionId is provided and the response includes state.