vercel-labs/eve-chat-template-eve
Work safely on Eve-specific internals in the Eve chat template. Use when changing the Eve agent, withEve routes, eveChannel auth, useEveAgent, ClientSession/SessionState, persisted event logs, stream/resume behavior, connection authorization, Vercel Connect MCP connections, local Eve tools, or upstream Eve API assumptions.
npx skills add https://github.com/vercel-labs/eve-chat-template --skill eve-chat-template-eve
Use this skill to preserve the Eve protocol and durable-session invariants while changing the chat template.
AGENTS.md first. It requires reading the relevant guide under node_modules/eve/dist/docs/public/ before writing code.docs/how-the-chatbot-works.md for architecture changes and docs/setup-and-deploy.md for setup, auth, storage, or deployment changes.rg "useEveAgent|ClientSession|SessionState|message.appended|authorization.required|eveSession|chat_event|streamIndex|continuationToken|defineMcpClientConnection|defineTool".agent/ defines agent behavior; app/_components/agent-chat.tsx bridges Eve to the web UI; lib/db/* persists app state.pendingUserMessage, stored eveSession, and event rows. Eve owns the remote durable session and stream cursor.chat_event.eventIndex with SessionState.streamIndex. The first orders local Postgres rows; the second resumes /eve/v1/session/:sessionId/stream.withEve(nextConfig): POST /eve/v1/session, POST /eve/v1/session/:sessionId, and GET /eve/v1/session/:sessionId/stream?startIndex=n.betterAuthEveAuth, localDev(), and vercelOidc() in the Eve channel unless deliberately changing local, browser, or Vercel auth behavior.SessionState immediately after Eve returns sessionId and continuationToken; do not wait for the stream to finish.eventIndex; on final snapshot, delete rows beyond the final event length.pendingUserMessage for interruption recovery. Mark it before sending, consume it once in the session page, hide it after a settled event, and clear it after snapshot or authorization skip.JSON.stringify key order.useEveAgent reduces Eve events into renderable messages; the template wraps it with a custom ClientSession to persist and resume sessions.message.appended.data.messageDelta as the new text. Treat messageSoFar, reduced message text, and rendered parts as cumulative.session.completed, session.failed, or session.waiting. Treat authorization.required as a blocked state for normal text input.activeChat.session and layer resumed events until the final snapshot catches up.agent/tools/<snake_case>.ts with defineTool(...). Tool filenames become runtime tool names, so keep them ASCII snake_case.agent/connections/<name>.ts with defineMcpClientConnection(...) and connect(process.env.ENV_NAME ?? "local-name").authorization.required and authorization.completed events.session.waiting, apply those local events to the session, persist them, and clear pending input.onSessionStarted(session), hook-level resume APIs, durable event persistence adapters, authorization continuation helpers, structured connection policy, and stream debug helpers.pnpm typecheck for protocol/type changes and pnpm build before opening a PR that touches runtime, routes, or docs examples.Take vercel-labs/eve-chat-template-eve from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.