---
title: "Introduction"
description: "Meet Eve and the small set of ideas behind an Eve agent."
---

Eve is a framework for building durable agents as ordinary files in a TypeScript project.

Instead of describing your whole agent in one large configuration object, you give each part a clear home: instructions go in one file, tools in one folder, channels in another. Eve discovers that structure and turns it into an agent that runs locally, serves HTTP, connects to other platforms, and keeps working across many turns.

## An Eve project at a glance

A small Eve app looks like this:

```text
my-agent/
├── package.json
└── agent/
    ├── agent.ts
    ├── instructions.md
    ├── tools/
    │   └── get_weather.ts
    ├── skills/
    │   └── plan_a_trip.md
    └── channels/
        └── slack.ts
```

You can understand most Eve projects by reading that tree:

- `instructions.md` tells the agent who it is and how it should behave.
- [`agent.ts`](./agent-config) chooses the model and configures runtime options.
- [`tools/`](./tools) holds typed functions the model can call.
- [`skills/`](./skills) holds longer procedures the model loads only when they are useful.
- [`channels/`](./channels/overview) connect the agent to HTTP clients, Slack, Discord, and the other places people talk to it.

Start with only `instructions.md` and `agent.ts`. Add the other folders when the agent needs them.

## The files are the interface

Eve is [filesystem-first](./reference/project-layout): a file's location says what it does, and its path usually gives it a name.

For example, this file:

```text
agent/tools/get_weather.ts
```

defines a tool named `get_weather`:

```ts
import { defineTool } from "eve/tools";
import { z } from "zod";

export default defineTool({
  description: "Get the weather for a city.",
  inputSchema: z.object({ city: z.string() }),
  async execute({ city }) {
    return { city, condition: "Sunny" };
  },
});
```

There is no separate registry to keep in sync. Add the file and Eve discovers it; move or rename it and its identity moves with it. See [Tools](./tools) for the complete API.

## What happens when a message arrives

Whether a message comes from a web app, the terminal, or Slack, the same flow runs. Eve turns the platform input into a message, gives the model its instructions, skills, tools, and conversation history, runs the work (calling tools and subagents as needed), saves the session and streams events, then delivers the result back in the form the platform expects.

That keeps agent behavior portable. Your weather tool does not need to know whether the question came from a browser or from Slack.

## Durable by default

An Eve session is more than one request and one response. It can:

- stream progress while work is happening
- call tools and subagents
- pause for [approval or a human answer](./tools)
- resume after that answer arrives
- keep durable state across turns

Under the hood, Eve uses the open-source [Workflow SDK](https://workflow-sdk.dev) to make sessions durable, resumable, and crash-safe. Eve handles that machinery so your tools can focus on the work itself.

## Grow the project by adding capabilities

As the agent grows, each concern still has a predictable home:

| Path                            | Add it when you need...                          |
| ------------------------------- | ------------------------------------------------ |
| [`connections/`](./connections) | Tools from external MCP servers                  |
| [`hooks/`](./advanced/hooks)    | Code that reacts to lifecycle and stream events  |
| [`sandbox/`](./sandbox)         | A controlled workspace for files and commands    |
| [`subagents/`](./subagents)     | Specialist agents the root agent can delegate to |
| [`schedules/`](./schedules)     | Recurring or scheduled work                      |
| `lib/`                          | Shared code imported by the other agent files    |

The result stays readable before it runs: the directory tells you what the agent can do.

## What to read next

- [Getting started](./getting-started): scaffold and run your first agent
- [Tools](./tools): the typed actions your agent calls
- [Project layout](./reference/project-layout): every authored slot under `agent/`
