diff --git a/content/docs/agents/get-started/core-concepts.mdx b/content/docs/agents/get-started/core-concepts.mdx
index 4780e7397..7e1ec616c 100644
--- a/content/docs/agents/get-started/core-concepts.mdx
+++ b/content/docs/agents/get-started/core-concepts.mdx
@@ -162,23 +162,24 @@ Now that you understand the core concepts, continue with:
}
- href="/agents/getting-started/quickstart"
+ href="/agents/get-started/quickstart"
title="Quickstart"
>
Create your first agent, connect a provider, and send a message.
- }
- href="/agents/agent-bridge/agent-definition"
- title="Agent bridge"
+ href="/agents/setup-your-agent/agent-logic"
+ title="Agent logic"
>
- Deep dive into defining agents, event handlers, context, replies, and signals.Create your first agent, connect a provider, and send a message.
+ Build your agent logic.
}
- href="/agents/agent-logic/overview"
- title="Agent logic"
+ href="/agents/manage-agents/manage-conversations"
+ title="Agent bridge"
>
- Connect your preferred framework or runtime.
+ Manage your agent conversations.
+
\ No newline at end of file
diff --git a/content/docs/agents/get-started/quickstart.mdx b/content/docs/agents/get-started/quickstart.mdx
index 871b6703f..5f78f7aca 100644
--- a/content/docs/agents/get-started/quickstart.mdx
+++ b/content/docs/agents/get-started/quickstart.mdx
@@ -137,7 +137,7 @@ Open the Slack channel where your app is installed and send a message to your bo

-Edit the files in `app/novu/agents/` to customize how your agent responds. See [Handle Events](/agents/setup-your-agent/connect-your-code/handle-events) for the full list of events your agent can respond to.
+Edit the files in `app/novu/agents/` to customize how your agent responds. See [Handle Events](/agents/setup-your-agent/handle-events) for the full list of events your agent can respond to.
## Next steps
diff --git a/content/docs/agents/get-started/what-is-aci.mdx b/content/docs/agents/get-started/what-is-aci.mdx
index 35901a320..33c455aa8 100644
--- a/content/docs/agents/get-started/what-is-aci.mdx
+++ b/content/docs/agents/get-started/what-is-aci.mdx
@@ -93,27 +93,18 @@ Common use cases include:
}
+ >
+ Learn more about the core concepts of Novu Agents.
+
+ }
>
- Create your first agent and connect it to Slack in under 10 minutes.
-
- } title="Connect your providers">Learn how to connect any provider of your choice.
- } href="/" title="Connect your code">
- Learn how to connect your to the Novu
-
- } href="/" title="Add agent logic">
- Learn how to connect your agent brain to the agent communication layer
+ Create your first agent, connect a slack provider, and send a message in under 5 minutes.
-## Learn more
-
-
- } href="/" title="Understand concepts">
- Learn more about the core concepts of Novu Agents.
-
-
-
-
diff --git a/content/docs/agents/index.mdx b/content/docs/agents/index.mdx
deleted file mode 100644
index 81f240627..000000000
--- a/content/docs/agents/index.mdx
+++ /dev/null
@@ -1,5 +0,0 @@
----
-title: "Overview"
-pageTitle: 'Novu Agents Overview'
-description: 'Explore Novu Agents: conversational agents built on Novu.'
----
\ No newline at end of file
diff --git a/content/docs/agents/deploy-your-agent.mdx b/content/docs/agents/manage-agents/deploy-your-agent.mdx
similarity index 99%
rename from content/docs/agents/deploy-your-agent.mdx
rename to content/docs/agents/manage-agents/deploy-your-agent.mdx
index 1792f422d..97cc74156 100644
--- a/content/docs/agents/deploy-your-agent.mdx
+++ b/content/docs/agents/manage-agents/deploy-your-agent.mdx
@@ -2,6 +2,7 @@
title: "Agent Deployment"
pageTitle: 'Agent Deployment'
description: 'Learn how to run a conversational agent on your local machine, test it in a development environment, and deploy it to production.'
+icon: Rocket
---
Agents built with Novu can run on your local machine. Deploy them to development and production environments when you are ready.
diff --git a/content/docs/agents/manage-conversations.mdx b/content/docs/agents/manage-agents/manage-conversations.mdx
similarity index 98%
rename from content/docs/agents/manage-conversations.mdx
rename to content/docs/agents/manage-agents/manage-conversations.mdx
index fa5682dc1..fa9954ec1 100644
--- a/content/docs/agents/manage-conversations.mdx
+++ b/content/docs/agents/manage-agents/manage-conversations.mdx
@@ -1,7 +1,8 @@
---
-title: "Agent conversations"
+title: "Agent Conversations"
pageTitle: 'Manage agents conversations'
description: 'How to manage agent conversations, their history, lifecycle and observability.'
+icon: MessagesSquare
---
Novu provides full observability for agent conversations. You can view and manage conversations in the Novu dashboard. To access the conversations, go to the Activity Feed page on the dashboard and switch to the Agent Conversations tab.
diff --git a/content/docs/agents/meta.json b/content/docs/agents/meta.json
index 277efd266..a468cd955 100644
--- a/content/docs/agents/meta.json
+++ b/content/docs/agents/meta.json
@@ -7,10 +7,17 @@
"get-started/what-is-aci",
"get-started/core-concepts",
"get-started/quickstart",
- "setup-your-agent",
- "manage-conversations",
- "deploy-your-agent",
- "add-connect-components",
- "receive-inbound-email"
+
+ "---Setup Your Agent---",
+ "setup-your-agent/overview",
+ "setup-your-agent/agent-logic",
+ "setup-your-agent/handle-events",
+ "setup-your-agent/reply-types",
+ "setup-your-agent/use-signals",
+ "setup-your-agent/add-connect-components",
+
+ "---Manage Agents---",
+ "manage-agents/manage-conversations",
+ "manage-agents/deploy-your-agent"
]
}
diff --git a/content/docs/agents/add-connect-components.mdx b/content/docs/agents/setup-your-agent/add-connect-components.mdx
similarity index 97%
rename from content/docs/agents/add-connect-components.mdx
rename to content/docs/agents/setup-your-agent/add-connect-components.mdx
index 90404af4f..242cb8578 100644
--- a/content/docs/agents/add-connect-components.mdx
+++ b/content/docs/agents/setup-your-agent/add-connect-components.mdx
@@ -1,7 +1,8 @@
---
-title: "Add Connect Components"
-pageTitle: 'Novu Agents Add Connect Components'
+title: "Connect Components"
+pageTitle: 'Novu Agents Connect Components'
description: 'Add Connect UI components so users can link accounts and channels to your agent.'
+icon: Puzzle
---
Novu provides pre-built UI components for chat platforms like Slack and Microsoft Teams. Add these components so users can install the Slack or Microsoft Teams app in their workspace and connect it to your agent.
diff --git a/content/docs/agents/add-connect-components.model.mdx b/content/docs/agents/setup-your-agent/add-connect-components.model.mdx
similarity index 91%
rename from content/docs/agents/add-connect-components.model.mdx
rename to content/docs/agents/setup-your-agent/add-connect-components.model.mdx
index 9f568e5b7..42087d495 100644
--- a/content/docs/agents/add-connect-components.model.mdx
+++ b/content/docs/agents/setup-your-agent/add-connect-components.model.mdx
@@ -1,7 +1,8 @@
---
-title: "Add Connect Components"
-pageTitle: 'Novu Agents Add Connect Components'
+title: "Connect Components"
+pageTitle: 'Novu Agents Connect Components'
description: 'Add Connect UI components so users can link accounts and channels to your agent.'
+icon: Puzzle
---
Novu provides pre-built UI components for chat platforms like Slack and Microsoft Teams. Add these components so users can install the Slack or Microsoft Teams app in their workspace and connect it to your agent.
@@ -48,7 +49,7 @@ export default SlackConnectButtonComponent;
`SlackConnectButton` accepts the following props to customize the UI and behavior:
---type-table---
-../platform/sdks/types/react-types.ts#SlackConnectButtonProps
+../../platform/sdks/types/react-types.ts#SlackConnectButtonProps
---end---
## Microsoft Teams connect button
diff --git a/content/docs/agents/setup-your-agent/agent-logic.mdx b/content/docs/agents/setup-your-agent/agent-logic.mdx
new file mode 100644
index 000000000..fa0faae3f
--- /dev/null
+++ b/content/docs/agents/setup-your-agent/agent-logic.mdx
@@ -0,0 +1,331 @@
+---
+title: "Agent Logic"
+pageTitle: 'Novu Agents Logic'
+description: 'Write your agents lo'
+icon: Brain
+---
+
+import { Steps, Step } from 'fumadocs-ui/components/steps';
+import { Brain, ThumbsUp, Mail, LayoutGrid, Rocket } from 'lucide-react';
+
+Once you've scaffolded an agent, the next question is usually: *what do I actually put in this file?*
+
+This page builds one agent from scratch, a small support bot for a fictional log monitoring product called Pipelinr. You'll add one piece at a time, and by the end you'll have a single file that greets users, routes them by topic, replies to follow-ups, and resolves the thread when they're done.
+
+If you want the API reference for any of the pieces below, see [Handle Events](/agents/setup-your-agent/handle-events), [Reply Types](/agents/setup-your-agent/reply-types), and [Signals](/agents/setup-your-agent/use-signals).
+
+## What we're building
+
+Pipelinr customers usually contact support for one of three reasons:
+
+- a **billing** question (invoices, seats, usage spikes)
+- a **technical** issue (broken pipelines, missing logs, API errors)
+- something else (account access, feature requests)
+
+So the agent's job is simple: say hi, ask which bucket the issue falls in, answer the follow-up, and close the conversation when the user says "thanks". That's enough to be useful in production, and it covers every event type the framework gives you.
+
+## Where the code goes
+
+The scaffold drops a Next.js app with this shape:
+
+```text
+app/
+ api/novu/route.ts # exposes your agents over HTTP
+ novu/
+ agents/
+ index.ts # re-exports each agent
+ support-agent.tsx # the file we'll edit
+```
+
+You almost never touch `route.ts` after the first day. It just wires your agent into Novu:
+
+```ts title="app/api/novu/route.ts"
+import { serve } from '@novu/framework/next';
+import { supportAgent } from '../../novu/agents';
+
+export const { GET, POST, OPTIONS } = serve({
+ agents: [supportAgent],
+});
+```
+
+Everything below happens inside `support-agent.tsx`.
+
+## Building agents Logic
+
+
+
+
+### Step 1: Define the agent shell
+
+Start with the bare minimum, an `agent()` call with an id and an empty `onMessage` handler. The id (`support-agent`) is what you'll reference in the Novu dashboard.
+
+```tsx title="app/novu/agents/support-agent.tsx"
+/** @jsxImportSource @novu/framework */
+import { agent } from '@novu/framework';
+
+export const supportAgent = agent('support-agent', {
+ onMessage: async ({ message, ctx }) => {
+ return `You said: ${message.text}`;
+ },
+});
+```
+
+The JSX pragma at the top lets us return cards as JSX later. You can skip it if you only ever return strings.
+
+At this point the agent is already alive: send it a message and it echoes back. Now let's make it actually behave like a support bot.
+
+
+
+
+### Handle first message
+
+A real support bot doesn't open with "you said: hello". It introduces itself and asks how it can help.
+
+The `ctx.conversation.messageCount` field tells you which turn you're on. On the first message it's `1`, so we can branch on that and send a welcome card with three buttons, one for each topic.
+
+```tsx
+import { Actions, agent, Button, Card, CardText } from '@novu/framework';
+
+export const supportAgent = agent('support-agent', {
+ onMessage: async ({ message, ctx }) => {
+ const firstName = ctx.subscriber?.firstName;
+ const isFirstMessage = ctx.conversation.messageCount <= 1;
+
+ if (isFirstMessage) {
+ return (
+
+ What can I help you with today?
+
+
+
+
+
+
+ );
+ }
+
+ return `You said: ${message.text}`;
+ },
+});
+```
+
+A few things worth pointing out:
+
+- `ctx.subscriber` carries whatever you know about the user (`firstName`, `email`, custom data). Using it for the greeting makes the bot feel less robotic.
+- Returning the JSX is the shortcut for `await ctx.reply(...)`. Either one works, the return form just reads cleaner inside a handler.
+- Each `Button` carries an `id` and a `value`. We'll use both in the next step.
+
+For the full menu of card components, see [Reply Types](/agents/setup-your-agent/reply-types#interactive-cards).
+
+
+
+
+### Use metadata for context
+
+When the user clicks one of the buttons, the framework fires `onAction` instead of `onMessage`. You get the button's `id` and `value`, and your job is to record the choice somewhere the next turn can read it.
+
+That's what `ctx.metadata` is for. It's a key/value bag attached to the conversation that survives across handler runs.
+
+```tsx
+export const supportAgent = agent('support-agent', {
+ // ...onMessage from step 2...
+
+ onAction: async ({ actionId, value, ctx }) => {
+ if (actionId.startsWith('topic-') && value) {
+ ctx.metadata.set('topic', value);
+ return `Got it, a **${value}** issue. Tell me what's going on and I'll take a look.`;
+ }
+ },
+});
+```
+
+Now the conversation has a `topic` saved on it. On the next message you can read it back with `ctx.metadata.get('topic')` and tailor the response, route to a different prompt, or pull the right docs.
+
+If you wanted to also ping your on-call channel for technical issues, this is where you'd use `ctx.trigger` to fire a Novu workflow. See [Signals](/agents/setup-your-agent/use-signals#trigger-a-workflow).
+
+
+
+
+### Answer the follow-up messages with an LLM
+
+After the first welcome card, every subsequent message is a real question. Time to plug in a model.
+
+We'll use the [Vercel AI SDK](https://sdk.vercel.ai/) with OpenAI. The SDK is provider-agnostic, so once it's wired in you can swap to Anthropic, Google, or anything else with a one-line change. The framework itself doesn't care which model you pick.
+
+Install the packages:
+
+```bash
+npm install ai @ai-sdk/openai
+```
+
+Drop your API key in `.env.local`:
+
+```bash
+OPENAI_API_KEY=sk-...
+```
+
+Now inside `onMessage`, after the welcome-card branch, pull the saved topic out of metadata, hand `ctx.history` to the model, and return the answer:
+
+```tsx
+import { openai } from '@ai-sdk/openai';
+import { generateText } from 'ai';
+
+// inside onMessage, after the isFirstMessage branch:
+const topic = ctx.metadata.get('topic') ?? 'unknown';
+
+const { text } = await generateText({
+ model: openai('gpt-4o-mini'),
+ system: `You are a Pipelinr support agent. The user's topic is: ${topic}. Keep answers short and link to docs when relevant.`,
+ messages: ctx.history.map((h) => ({
+ role: h.role,
+ content: h.content,
+ })),
+});
+
+return text;
+```
+
+A few practical notes:
+
+- `ctx.history` already gives you `{ role, content }` entries, which is exactly what the SDK expects.
+- `gpt-4o-mini` is cheap and fast enough for most support replies. Bump to `gpt-4o` for trickier questions.
+- Switching to Anthropic is one line: `npm install @ai-sdk/anthropic`, then `model: anthropic('claude-3-5-sonnet-latest')`.
+- For a typing-effect reply, swap `generateText` for `streamText` and pipe the stream to `ctx.reply`. See the [Vercel AI SDK docs](https://sdk.vercel.ai/) for streaming patterns.
+- If the answer should include a file (a CSV export, a screenshot, a PDF), call `ctx.reply` directly with the `files` option instead of returning a string. See [attachments](/agents/setup-your-agent/reply-types#sending-attachments).
+
+
+
+
+### Close the loop and resolve
+
+When the user signals they're done, mark the conversation resolved. This updates the status in Novu, fires any `onResolve` handler you've defined, and is a nice place to trigger a CSAT follow-up workflow.
+
+We'll keep it simple and just look for "thanks" or "resolve" in the message text:
+
+```tsx
+const text = (message.text ?? '').toLowerCase();
+
+if (text.includes('thanks') || text.includes('resolve')) {
+ ctx.resolve('User confirmed the issue is fixed.');
+ // ctx.trigger('csat-survey', { to: ctx.subscriber }); // optional follow-up
+ return 'Glad I could help. Closing this out, ping me anytime.';
+}
+```
+
+`ctx.resolve` takes an optional summary string that shows up in the Novu dashboard, useful when an agent or analyst opens the thread later. If the user replies again afterwards, the conversation reopens automatically.
+
+
+
+
+
+## Complete agent logic
+
+Here's everything stitched together. This is the file you'd ship as a v1 of the Pipelinr support bot:
+
+```tsx title="app/novu/agents/support-agent.tsx"
+/** @jsxImportSource @novu/framework */
+import { Actions, agent, Button, Card, CardText } from '@novu/framework';
+import { openai } from '@ai-sdk/openai';
+import { generateText } from 'ai';
+
+export const supportAgent = agent('support-agent', {
+ onMessage: async ({ message, ctx }) => {
+ const firstName = ctx.subscriber?.firstName;
+ const userText = (message.text ?? '').toLowerCase();
+ const isFirstMessage = ctx.conversation.messageCount <= 1;
+
+ if (isFirstMessage) {
+ return (
+
+ What can I help you with today?
+
+
+
+
+
+
+ );
+ }
+
+ if (userText.includes('thanks') || userText.includes('resolve')) {
+ ctx.resolve('User confirmed the issue is fixed.');
+ return 'Glad I could help. Closing this out, ping me anytime.';
+ }
+
+ const topic = ctx.metadata.get('topic') ?? 'unknown';
+ const { text } = await generateText({
+ model: openai('gpt-4o-mini'),
+ system: `You are a Pipelinr support agent. The user's topic is: ${topic}. Keep answers short and link to docs when relevant.`,
+ messages: ctx.history.map((h) => ({
+ role: h.role,
+ content: h.content,
+ })),
+ });
+
+ return text;
+ },
+
+ onAction: async ({ actionId, value, ctx }) => {
+ if (actionId.startsWith('topic-') && value) {
+ ctx.metadata.set('topic', value);
+ return `Got it, a **${value}** issue. Tell me what's going on and I'll take a look.`;
+ }
+ },
+});
+```
+
+## How the pieces fit together
+
+Reading the file end to end, here's the mental model:
+
+- **`onMessage`** runs on every user text message. You branch on what turn it is and what was said.
+- **`onAction`** runs when the user clicks a button or picks a dropdown option from a card you sent.
+- **`ctx.metadata`** is your scratchpad on the conversation. Write on one turn, read on the next.
+- **`ctx.history`** is the transcript, ready to feed into an LLM.
+- **`ctx.reply`** (or returning a value) is how you talk back. Strings, markdown, cards, or files.
+- **`ctx.trigger`** fires a Novu workflow, useful for emails, escalations, surveys.
+- **`ctx.resolve`** ends the conversation.
+
+## Next steps
+
+Once this skeleton is working, here's where to go from here:
+
+
+ }
+ href="https://sdk.vercel.ai/docs/foundations/tools"
+ title="Give the model real context"
+ >
+ Pull from your docs with a RAG step before `generateText`, or add tool calls so the model can hit your API.
+
+ }
+ href="/agents/setup-your-agent/handle-events#onreaction"
+ title="Capture reactions"
+ >
+ Add an `onReaction` handler to record thumbs-up/down feedback on your agent's replies.
+
+ }
+ href="/agents/setup-your-agent/use-signals#trigger-a-workflow"
+ title="Send a CSAT email"
+ >
+ Use `ctx.trigger` after resolution to fire a Novu workflow and follow up with a short survey.
+
+ }
+ href="/agents/setup-your-agent/reply-types#interactive-cards"
+ title="Build richer cards"
+ >
+ Return dropdowns, links, text inputs, and multi-action cards from your handlers.
+
+ }
+ href="/agents/manage-agents/deploy-your-agent"
+ title="Deploy your agent"
+ >
+ Run your agent locally with the dev tunnel, then ship it to production.
+
+
+
+The shape of the file stays the same. You just keep adding branches and handlers as the agent grows up.
diff --git a/content/docs/agents/setup-your-agent/connect-providers.mdx b/content/docs/agents/setup-your-agent/connect-providers.mdx
deleted file mode 100644
index e45e5b5c5..000000000
--- a/content/docs/agents/setup-your-agent/connect-providers.mdx
+++ /dev/null
@@ -1,7 +0,0 @@
----
-title: "Connect Providers"
-pageTitle: 'Novu Agents Connect Providers'
-description: 'Connect channels and third-party providers to your Novu Agent.'
----
-
-Once an agent is created, providers can be connected to the agent. This page guides you through how to connect your first provider to the agent and then later extend the agent to connect more providers.
diff --git a/content/docs/agents/setup-your-agent/connect-your-code/index.mdx b/content/docs/agents/setup-your-agent/connect-your-code/index.mdx
deleted file mode 100644
index f3191b47a..000000000
--- a/content/docs/agents/setup-your-agent/connect-your-code/index.mdx
+++ /dev/null
@@ -1,5 +0,0 @@
----
-title: "Connect Your Code"
-pageTitle: 'Novu Agents Connect Your Code'
-description: 'Integrate your codebase with Novu Agents using events, replies, and signals.'
----
diff --git a/content/docs/agents/setup-your-agent/connect-your-code/meta.json b/content/docs/agents/setup-your-agent/connect-your-code/meta.json
deleted file mode 100644
index 2780a4986..000000000
--- a/content/docs/agents/setup-your-agent/connect-your-code/meta.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "title": "Connect Your Code",
- "description": "Connect Your Code",
- "defaultOpen": true,
- "pages": ["handle-events", "reply-types", "use-signals"]
-}
diff --git a/content/docs/agents/setup-your-agent/connect-your-code/handle-events.mdx b/content/docs/agents/setup-your-agent/handle-events.mdx
similarity index 96%
rename from content/docs/agents/setup-your-agent/connect-your-code/handle-events.mdx
rename to content/docs/agents/setup-your-agent/handle-events.mdx
index 0aa7bc3c6..24eeaca57 100644
--- a/content/docs/agents/setup-your-agent/connect-your-code/handle-events.mdx
+++ b/content/docs/agents/setup-your-agent/handle-events.mdx
@@ -2,6 +2,7 @@
title: "Handle Events"
pageTitle: 'Novu Agents Handle Events'
description: 'Handle agent events in your webhooks, handlers, and backend services.'
+icon: MousePointerClick
---
Agents receive events as users interact in a conversation. This page explains the event flow and shows how to handle each event type in your code.
@@ -72,7 +73,7 @@ export const myAgent = agent("my-agent", {
### onAction
-`onAction` event is fired when a user clicks a button or selects a value in an interactive card. For interactive cards, refer to [Interactive cards](/agents/setup-your-agent/connect-your-code/reply-types#interactive-cards). This event is used to handle form submissions, button clicks, dropdown selections, and more.
+`onAction` event is fired when a user clicks a button or selects a value in an interactive card. For interactive cards, refer to [Interactive cards](/agents/setup-your-agent/reply-types#interactive-cards). This event is used to handle form submissions, button clicks, dropdown selections, and more.
```typescript
import { agent } from '@novu/agent';
diff --git a/content/docs/agents/setup-your-agent/meta.json b/content/docs/agents/setup-your-agent/meta.json
deleted file mode 100644
index 1114c67a4..000000000
--- a/content/docs/agents/setup-your-agent/meta.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "title": "Setup Your Agent",
- "description": "Setup Your Agent",
- "defaultOpen": true,
- "pages": ["connect-providers", "connect-your-code"]
-}
diff --git a/content/docs/agents/setup-your-agent/index.mdx b/content/docs/agents/setup-your-agent/overview.mdx
similarity index 52%
rename from content/docs/agents/setup-your-agent/index.mdx
rename to content/docs/agents/setup-your-agent/overview.mdx
index 4533f4bc4..0f522a89f 100644
--- a/content/docs/agents/setup-your-agent/index.mdx
+++ b/content/docs/agents/setup-your-agent/overview.mdx
@@ -1,9 +1,14 @@
---
-title: "Setup your Agent"
-pageTitle: 'Setup your Agent'
+title: "Overview"
+pageTitle: 'Novu agents setup overview'
description: 'Set up your Novu Agent: create an agent and connect providers and wire up your application code.'
+icon: Compass
---
+
+import { MousePointerClick, Cloud, Brain } from 'lucide-react';
+
+
A conversational agent has the following components:
- **Agent Name**: The display name shown in the dashboard.
@@ -23,7 +28,39 @@ A conversational agent has the following components:
4. Add a description for your agent to help others understand its purpose.
5. Click **Create** to create the agent.
6. After the agent is created, you are redirected to the agent details page.
-7. For connecting providers to the agent, refer to [Connect Providers](/agents/setup-your-agent/connect-providers).
+7. Connect slack provider to the agent in the setup agent section by clicking on the **Select provider** dropdown and selecting **Slack**. This will open the slack setup section with steps.

+## Scaffold your agent
+
+To scaffold your agent, open the terminal, go to the directory where you want to create the project and run the following command in the terminal:
+
+```bash
+npx novu@rc init -t agent \
+ --agent-identifier \
+ -s \
+ -a
+```
+
+This scaffold command will ask the project name and will create a new agent project in the directory you provided. After the project is created, you can start building your agent logic.
+
+## Next steps
+
+Checkout the next steps to build your agent logic.
+
+
+ }
+ href="/agents/setup-your-agent/agent-logic"
+ title="Agent logic"
+ >
+ Build your agent logic.
+
+ } href="/agents/manage-agents/manage-conversations" title="Manage conversations">
+ View and manage your agent conversations.
+
+ } href="/agents/manage-agents/deploy-your-agent" title="Deploy your agent">
+ Deploy your agent to production.
+
+
diff --git a/content/docs/agents/setup-your-agent/connect-your-code/reply-types.mdx b/content/docs/agents/setup-your-agent/reply-types.mdx
similarity index 99%
rename from content/docs/agents/setup-your-agent/connect-your-code/reply-types.mdx
rename to content/docs/agents/setup-your-agent/reply-types.mdx
index c75831ac6..9400eca6b 100644
--- a/content/docs/agents/setup-your-agent/connect-your-code/reply-types.mdx
+++ b/content/docs/agents/setup-your-agent/reply-types.mdx
@@ -2,6 +2,7 @@
title: "Reply Types"
pageTitle: 'Novu Agents Reply Types'
description: 'Choose and send the right reply types from your agent handlers.'
+icon: Reply
---
The public reply API is `ctx.reply(content, options?)`. The content argument must be either a plain text string, markdown value or a `ChatElement` card. File attachments are passed in the optional second argument.
diff --git a/content/docs/agents/setup-your-agent/connect-your-code/use-signals.mdx b/content/docs/agents/setup-your-agent/use-signals.mdx
similarity index 99%
rename from content/docs/agents/setup-your-agent/connect-your-code/use-signals.mdx
rename to content/docs/agents/setup-your-agent/use-signals.mdx
index ffc5e545b..97375bb2e 100644
--- a/content/docs/agents/setup-your-agent/connect-your-code/use-signals.mdx
+++ b/content/docs/agents/setup-your-agent/use-signals.mdx
@@ -2,6 +2,7 @@
title: "Signals"
pageTitle: 'Novu Agents Signals'
description: 'Use signals to coordinate state and behavior across your agent integration.'
+icon: Signal
---
Signals are side-effects your agent can perform *in addition to* replying. While `ctx.reply()` sends a message back to the user, signals let you do everything else: persist state, kick off workflows, or close the conversation.
diff --git a/src/middleware.ts b/src/middleware.ts
index 88da1d9a7..2a63e9ac9 100644
--- a/src/middleware.ts
+++ b/src/middleware.ts
@@ -172,6 +172,9 @@ export default async function middleware(request: NextRequest, event: NextFetchE
'/platform/workflow/workflows.mdx': '/platform/workflow',
'/docs/platform/workflow/layouts':
'/platform/workflow/add-notification-content/channels-template-editors#email-layouts',
+
+ // Agents section landing
+ '/agents': '/agents/get-started/what-is-aci',
};
if (pathname in redirectMap) {