Bike Maintenance Dispatcher

A sample Eve agent: the front desk at Spoke & Mirror Cyclery. Customers describe what their bike is doing, the agent diagnoses, quotes from a real catalog, and books a slot. It's a small app that exercises every core Eve primitive used in the course, plus a Next.js dashboard and an optional Slack channel backed by Vercel Connect.

What it demonstrates

PrimitiveWhereWhat it does
Agent + personaagent/agent.ts, agent/instructions.mdModel config and the standing front-desk identity.
Toolsagent/tools/*.tsLook up services, check openings, book repairs.
Stateagent/lib/garage.tsRemembers the customer's bikes across turns.
Human-in-the-loopagent/tools/book_repair.tsParks for approval when the quote tops $150.
Dynamic skillagent/skills/shop-playbook.tsLoads a member/pro playbook from the caller's tier.
Channel authagent/channels/eve.tsStamps the tier claim the skill reads.
Web dashboardapp/Streams sessions through Eve's current React API.
Slack channelagent/channels/slack.tsReceives mentions and replies through Vercel Connect.
Sandbox seedagent/sandbox/workspace/torque-specs.mdReference file mounted into /workspace.

Run it

npm install
npm run dev:eve

Then talk to it in the TUI.

Things to try

Plain Q&A → tool loop

My commuter's rear brake feels spongy. What do you recommend and what's it cost?

Watch it call lookup_service, land on the Hydraulic Brake Bleed, and quote a real price.

Persistent state

It's a Surly Disc Trucker, 700c. Save it as "the commuter".

(new turn) Book the brake bleed for it.

The second turn still knows the bike. State checkpoints at step boundaries.

Human-in-the-loop

Book the Full Overhaul for Tue 10am.

The $180 quote trips approval. The turn parks on an approve/deny prompt and resumes from exactly that step once you answer.

Dynamic skill (per tier)

eve dev authenticates via localDev(), which sets no tier, so you get the plain desk. To see the member/pro playbook over HTTP, send a demo customer cookie such as shop_session=demo-member or shop_session=demo-pro. The server-side customer record, not a caller-controlled tier header, supplies the claim.

Web and deployment

Run npm run dev for the included Next.js dashboard. When the project and production credentials are ready, deploy the complete app with npx eve deploy.

The Slack channel expects SLACK_CONNECTOR to contain the Vercel Connect client UID. It falls back to the course's slack/spoke-and-mirror example. Slack authentication provides Slack identity, not a shop membership tier; add a trusted server-side mapping if Slack customers should receive member or pro behavior.