Skip to content

feat(dashboard): Agent management page list view#10690

Merged
scopsy merged 6 commits intonextfrom
agent-management-page
Apr 13, 2026
Merged

feat(dashboard): Agent management page list view#10690
scopsy merged 6 commits intonextfrom
agent-management-page

Conversation

@scopsy
Copy link
Copy Markdown
Contributor

@scopsy scopsy commented Apr 13, 2026

What changed? Why was the change needed?

What changed

Added a full-featured Agent management list view to the dashboard with create and delete flows, identifier search, and cursor-based pagination; the UI is gated behind a new feature flag (IS_CONVERSATIONAL_AGENTS_ENABLED). Backend changes provide integration summaries per agent, enforce a shared slug identifier format, and add repository support to efficiently resolve agent–integration links so the list can show associated integrations.

Affected areas

api: Introduced AgentIntegrationSummaryDto and an integrations[] field on AgentResponseDto, added mapper logic and ListAgents usecase changes to load, dedupe, and sort integration summaries per agent, tightened CreateAgentRequestDto identifier validation, and added an e2e test for invalid identifiers.

dashboard: Added a typed agents API client (list/create/delete) and TanStack Query keys; new React components for listing and managing agents (AgentsList, AgentsTable, CreateAgentDialog, DeleteAgentDialog); page wiring to show the list when the conversational agents feature flag is enabled; minor ProviderIcon styling tweak.

dal: Added findLinksForAgents() to batch-fetch agent-integration link records scoped by environment and organization.

shared: Added SLUG_IDENTIFIER_REGEX and slugIdentifierFormatMessage(), and a new feature flag key IS_CONVERSATIONAL_AGENTS_ENABLED.

Key technical decisions

  • Cursor-based pagination (after/before) was chosen for scalable paging.
  • Centralized slug validation via SLUG_IDENTIFIER_REGEX to ensure consistent identifier rules across agents, workflows, and steps.
  • Client debounces identifier search (400ms) and uses React Query keepPreviousData to smooth pagination/filter transitions.
  • Feature flag gating preserves existing early-access UI when the feature is disabled.

Testing

Added an E2E test asserting a 422 response for an agent identifier containing spaces; UI behavior relies on manual/QA verification and existing integration tests (no new unit tests in this PR).

Screenshots

Expand for optional sections

Related enterprise PR

Special notes for your reviewer

scopsy added 3 commits April 13, 2026 16:50
Introduce conversational Agents feature: add API client (list/create/delete) and types, plus React components for listing, table view, create and delete dialogs with pagination, search, permissions and toasts. Wire the new AgentsList into the Agents page and gate it behind IS_CONVERSATIONAL_AGENTS_ENABLED feature flag. Also add QueryKeys.fetchAgents and the new feature flag enum entry.
Replace Add icon with RiRobot2Line and capitalize label for the create buttons. Revamp agents table UI: add a richer skeleton row component, import Skeleton primitive, set a fixed loading rows count (5), and update table header/cell padding and alignment for consistent spacing. Adjust row markup (icon sizing, name/identifier styling, description/date cell styles) to improve layout and visual hierarchy.
Add AgentIntegrationSummaryDto and include integrations on AgentResponseDto. Implement mapper to produce integration summaries and update ListAgents usecase to load, deduplicate and sort integrations per agent (using new AgentIntegrationRepository.findLinksForAgents and IntegrationRepository.find). Expose new types to the dashboard API and update agents list/table UI to render integration icons with tooltips, handle overflow, and improve provider icon sizing and skeleton row visuals.
@netlify
Copy link
Copy Markdown

netlify bot commented Apr 13, 2026

Deploy Preview for dashboard-v2-novu-staging canceled.

Name Link
🔨 Latest commit b6e6943
🔍 Latest deploy log https://app.netlify.com/projects/dashboard-v2-novu-staging/deploys/69dd109307e44b00095fd0c8

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai bot commented Apr 13, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: f9ba3c65-a8f2-427c-b660-cc25c4f264b7

📥 Commits

Reviewing files that changed from the base of the PR and between 7596152 and b6e6943.

📒 Files selected for processing (1)
  • apps/api/src/app/agents/e2e/agents.e2e.ts
✅ Files skipped from review due to trivial changes (1)
  • apps/api/src/app/agents/e2e/agents.e2e.ts

📝 Walkthrough

Walkthrough

Adds agent integrations support and dashboard UI for managing agents. Introduces new DTOs, mapper, repository method, usecase wiring to load integration summaries, shared slug identifier constants, feature-flag gating, and new dashboard components and API client for list/create/delete flows. E2E test and minor UI/styling tweaks included.

Changes

Cohort / File(s) Summary
Agent DTOs
apps/api/src/app/agents/dtos/agent-integration-summary.dto.ts, apps/api/src/app/agents/dtos/agent-response.dto.ts, apps/api/src/app/agents/dtos/index.ts
New AgentIntegrationSummaryDto; AgentResponseDto gains optional integrations?: AgentIntegrationSummaryDto[]; re-export added.
Agent Mapping & Repositories
apps/api/src/app/agents/mappers/agent-response.mapper.ts, libs/dal/src/repositories/agent-integration/agent-integration.repository.ts
Added toAgentIntegrationSummary mapper and repository method findLinksForAgents to fetch agent↔integration link pairs for multiple agents.
List Agents Usecase
apps/api/src/app/agents/usecases/list-agents/list-agents.usecase.ts
Injected AgentIntegrationRepository and IntegrationRepository; implemented loadIntegrationsForAgents to fetch links, resolve integrations, dedupe and sort summaries, and attach integrations to agent responses.
Dashboard API client
apps/dashboard/src/api/agents.ts
New module exporting query key, key builder, types (AgentIntegrationSummary, AgentResponse, ListAgentsResponse, CreateAgentBody, ListAgentsParams) and request functions listAgents, createAgent, deleteAgent.
Dashboard UI: list/table/dialogs
apps/dashboard/src/components/agents/agents-list.tsx, apps/dashboard/src/components/agents/agents-table.tsx, apps/dashboard/src/components/agents/create-agent-dialog.tsx, apps/dashboard/src/components/agents/delete-agent-dialog.tsx
New AgentsList (state, queries, mutations), AgentsTable (rows, integrations icons, actions), CreateAgentDialog (validation with slug regex), and DeleteAgentDialog (confirmation).
Dashboard Page & Feature Flag
apps/dashboard/src/pages/agents.tsx, packages/shared/src/types/feature-flags.ts
Added IS_CONVERSATIONAL_AGENTS_ENABLED feature flag and wired page rendering to show AgentsList when enabled, otherwise show early-access teaser/dialog.
Slug identifier constants
packages/shared/src/consts/slug-identifier.ts, packages/shared/src/consts/index.ts
Added SLUG_IDENTIFIER_REGEX and slugIdentifierFormatMessage() and re-exported from consts index.
Validation updates across DTOs / schema
apps/api/src/app/agents/dtos/create-agent-request.dto.ts, apps/api/src/app/workflows-v2/dtos/create-step.dto.ts, apps/api/src/app/workflows-v2/dtos/create-workflow.dto.ts, apps/api/src/app/workflows-v2/dtos/duplicate-workflow.dto.ts, apps/dashboard/src/components/workflow-editor/schema.ts
Replaced inline slug regexes and messages with shared SLUG_IDENTIFIER_REGEX and slugIdentifierFormatMessage(...).
E2E & small tweaks
apps/api/src/app/agents/e2e/agents.e2e.ts, apps/dashboard/src/components/integrations/components/provider-icon.tsx
Added invalid-identifier E2E test; minor test template literal change; added object-contain class to provider icon for SVG fitting.

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant AgentsList
    participant ListAgentsUseCase
    participant AgentRepo
    participant AgentIntgRepo
    participant IntegrationRepo
    participant Mapper

    User->>AgentsList: open list / request refresh
    AgentsList->>ListAgentsUseCase: execute(params)
    ListAgentsUseCase->>AgentRepo: find paginated agents
    AgentRepo-->>ListAgentsUseCase: agents[]
    ListAgentsUseCase->>AgentIntgRepo: findLinksForAgents(agentIds)
    AgentIntgRepo-->>ListAgentsUseCase: links[] (_agentId, _integrationId)
    ListAgentsUseCase->>IntegrationRepo: find integrations by IDs (env/org filtered)
    IntegrationRepo-->>ListAgentsUseCase: integrations[]
    ListAgentsUseCase->>Mapper: toAgentIntegrationSummary(integration)
    Mapper-->>ListAgentsUseCase: summary
    ListAgentsUseCase->>ListAgentsUseCase: dedupe & sort summaries per agent
    ListAgentsUseCase-->>AgentsList: agents with integrations[]
    AgentsList->>User: render table with provider icons
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~75 minutes

Possibly related PRs

  • PR #10679 — Adds base Agents integration pieces that this change extends (DTOs, mapper, repository, usecase wiring).
  • PR #10673 — Adds Agents page early-access flow and UI that this PR gates via feature flag and replaces with the management UI when enabled.

Suggested reviewers

  • merrcury
🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title follows the Conventional Commits format with a valid type (feat) and scope (dashboard), uses lowercase imperative description, and is directly related to the main changeset adding an Agent management page list view.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 13, 2026

Hey there and thank you for opening this pull request! 👋

We require pull request titles to follow specific formatting rules and it looks like your proposed title needs to be adjusted.

Your PR title is: feat(dashboard): Agent management page list view

Requirements:

  1. Follow the Conventional Commits specification
  2. As a team member, include Linear ticket ID at the end: fixes TICKET-ID or include it in your branch name

Expected format: feat(scope): Add fancy new feature fixes NOV-123

Details:

PR title must end with 'fixes TICKET-ID' (e.g., 'fixes NOV-123') or include ticket ID in branch name

@github-actions
Copy link
Copy Markdown
Contributor

LaunchDarkly flag references

🔍 1 flag added or modified

Name Key Aliases found Info
IS_CONVERSATIONAL_AGENTS_ENABLED IS_CONVERSATIONAL_AGENTS_ENABLED

@pkg-pr-new
Copy link
Copy Markdown

pkg-pr-new bot commented Apr 13, 2026

Open in StackBlitz

npm i https://pkg.pr.new/novuhq/novu@10690
npm i https://pkg.pr.new/novuhq/novu/@novu/providers@10690
npm i https://pkg.pr.new/novuhq/novu/@novu/shared@10690

commit: b6e6943

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Nitpick comments (5)
apps/api/src/app/agents/e2e/agents.e2e.ts (1)

64-71: Strengthen the 400 assertion to avoid false positives.

This test currently validates only status code; asserting the validation message/content would ensure the failure is specifically from slug validation.

Suggested change
   expect(res.status).to.equal(400);
+  expect(res.body.message).to.satisfy((message: string | string[]) =>
+    Array.isArray(message)
+      ? message.some((m) => m.includes('identifier'))
+      : message.includes('identifier')
+  );
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/api/src/app/agents/e2e/agents.e2e.ts` around lines 64 - 71, Update the
test "should return 400 when identifier is not a valid slug" to assert the
response body contains the specific validation message for the identifier slug
(in addition to status 400); after performing
session.testAgent.post('/v1/agents') and capturing res, check res.body (or
res.body.error/message/validation) includes a clear indicator like "identifier"
or "must be a valid slug" so the failure proves slug validation triggered (use
the existing res variable and the same request).
libs/dal/src/repositories/agent-integration/agent-integration.repository.ts (1)

27-27: Drop explicit return type in repository method.

The explicit Promise<Pick<...>[]> annotation is unnecessary here and goes against the repository typing convention.

Suggested change
-  }): Promise<Pick<AgentIntegrationEntity, '_agentId' | '_integrationId'>[]> {
+  }) {

As per coding guidelines: "Return types are automatically inferred as Pick<Entity, Keys> — do not manually annotate the return type."

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@libs/dal/src/repositories/agent-integration/agent-integration.repository.ts`
at line 27, The repository method in agent-integration.repository.ts currently
annotates its return as Promise<Pick<AgentIntegrationEntity, '_agentId' |
'_integrationId'>[]>, which violates the repository typing convention; remove
the explicit return type from that method signature so TypeScript infers the
return as Pick<AgentIntegrationEntity, '_agentId' | '_integrationId'>[] (keep
the method body unchanged) and ensure the method remains inside the same class
(AgentIntegrationRepository or the existing exported repository function) so
inference follows the project convention.
packages/shared/src/consts/slug-identifier.ts (1)

7-9: Add a blank line before return in slugIdentifierFormatMessage.

Suggested tweak
 export function slugIdentifierFormatMessage(fieldName: string): string {
+
   return `${fieldName} must be a valid slug format (letters, numbers, hyphens, dot and underscores only)`;
 }

As per coding guidelines, "Include a blank line before every return statement".

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/shared/src/consts/slug-identifier.ts` around lines 7 - 9, The
function slugIdentifierFormatMessage should have a blank line immediately before
its return statement per coding guidelines; open the function definition for
slugIdentifierFormatMessage and insert a single empty line before the existing
return line so the function body has a blank line separating any preceding logic
(or the function start) from the return.
apps/api/src/app/agents/mappers/agent-response.mapper.ts (1)

25-32: Please add a blank line before the return in the new mapper function.

Suggested tweak
 export function toAgentIntegrationSummary(
   integration: Pick<IntegrationEntity, '_id' | 'identifier' | 'name' | 'providerId' | 'channel' | 'active'>
 ): AgentIntegrationSummaryDto {
+
   return {
     integrationId: integration._id,
     providerId: integration.providerId,
     name: integration.name,
     identifier: integration.identifier,
     channel: integration.channel,
     active: integration.active,
   };
 }

As per coding guidelines, "Include a blank line before every return statement".

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/api/src/app/agents/mappers/agent-response.mapper.ts` around lines 25 -
32, Add a single blank line immediately before the return statement in the
mapper function that constructs the object with integrationId, providerId, name,
identifier, channel, and active (the new mapper in agent-response.mapper.ts);
locate the function that returns { integrationId: integration._id, providerId:
integration.providerId, name: integration.name, identifier:
integration.identifier, channel: integration.channel, active: integration.active
} and insert one empty line above that return to comply with the "blank line
before return" guideline.
apps/dashboard/src/components/agents/agents-list.tsx (1)

16-16: Keep the agents query key beside the agents API module.

This feature already has a dedicated apps/dashboard/src/api/agents.ts, but the query key still comes from @/utils/query-keys. Moving the key/helper next to the agents fetchers will keep fetching and invalidation coupled and matches the repo convention.

As per coding guidelines, apps/dashboard/src/api/**/*.{ts,tsx}: Co-locate query keys and fetcher functions in \src/api/` or alongside the feature they belong to`.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/dashboard/src/components/agents/agents-list.tsx` at line 16, The agents
query key is currently imported from QueryKeys in utils but should be co-located
with the agents fetchers; add and export a dedicated query key (e.g.,
AGENTS_QUERY_KEY or a function getAgentsQueryKey) from the existing agents API
module (apps/dashboard/src/api/agents.ts), update AgentsList to import that key
from the agents API module instead of '@/utils/query-keys', and scan the repo
for other imports of the agents key to update them to the new export so fetching
and invalidation remain coupled with the agents fetchers.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@apps/dashboard/src/components/agents/agents-list.tsx`:
- Around line 84-88: The onSuccess handler currently just invalidates
QueryKeys.fetchAgents which can leave the UI stuck on an empty last page after
deleting the only agent on that page; update the onSuccess in AgentsList to
detect when the refetched page becomes empty and, if so and if there is a
previous page, move the pagination cursor back one page before
invalidating/refetching. Concretely: in the onSuccess callback (where
queryClient.invalidateQueries, showSuccessToast and setAgentToDelete are called)
use queryClient.getQueryData for [QueryKeys.fetchAgents, currentCursor] or the
same paginated query key to inspect the returned items count; if items.length
=== 0 and currentPage > 1 (or previousCursor exists) call the setter that
controls pagination (e.g. setPage or setCursor) to go to the previous page, then
invalidate/refetch the agents; otherwise proceed as today. Ensure you still call
setAgentToDelete(null) and showSuccessToast.

In `@apps/dashboard/src/components/agents/agents-table.tsx`:
- Around line 137-140: The last TableHead in agents-table.tsx is empty which
leaves the actions column unlabeled for screen readers; update that final
TableHead (the one with className "h-11 w-[52px] px-3 py-2.5") to include a
visually hidden label such as "Actions" (e.g., a span with the app's
screen-reader class like "sr-only" or the existing VisuallyHidden component if
available) so assistive tech announces the column heading while keeping the
label visually hidden.
- Around line 67-86: The TooltipTrigger is wrapped around a non-focusable div so
keyboard users cannot access integration labels; update the trigger to be
focusable (for example replace the plain div with a button or an element with
tabIndex=0) or surface the integration.name as visible/accessibly-hidden text
inside the cell so screen readers and keyboard users can read it; modify the
TooltipTrigger usage (component TooltipTrigger asChild) and ensure ProviderIcon
remains unchanged while adding the accessible label (integration.name) either as
visible text or inside an aria-label/visually-hidden element and keep
TooltipContent(integration.name) in sync.

---

Nitpick comments:
In `@apps/api/src/app/agents/e2e/agents.e2e.ts`:
- Around line 64-71: Update the test "should return 400 when identifier is not a
valid slug" to assert the response body contains the specific validation message
for the identifier slug (in addition to status 400); after performing
session.testAgent.post('/v1/agents') and capturing res, check res.body (or
res.body.error/message/validation) includes a clear indicator like "identifier"
or "must be a valid slug" so the failure proves slug validation triggered (use
the existing res variable and the same request).

In `@apps/api/src/app/agents/mappers/agent-response.mapper.ts`:
- Around line 25-32: Add a single blank line immediately before the return
statement in the mapper function that constructs the object with integrationId,
providerId, name, identifier, channel, and active (the new mapper in
agent-response.mapper.ts); locate the function that returns { integrationId:
integration._id, providerId: integration.providerId, name: integration.name,
identifier: integration.identifier, channel: integration.channel, active:
integration.active } and insert one empty line above that return to comply with
the "blank line before return" guideline.

In `@apps/dashboard/src/components/agents/agents-list.tsx`:
- Line 16: The agents query key is currently imported from QueryKeys in utils
but should be co-located with the agents fetchers; add and export a dedicated
query key (e.g., AGENTS_QUERY_KEY or a function getAgentsQueryKey) from the
existing agents API module (apps/dashboard/src/api/agents.ts), update AgentsList
to import that key from the agents API module instead of '@/utils/query-keys',
and scan the repo for other imports of the agents key to update them to the new
export so fetching and invalidation remain coupled with the agents fetchers.

In `@libs/dal/src/repositories/agent-integration/agent-integration.repository.ts`:
- Line 27: The repository method in agent-integration.repository.ts currently
annotates its return as Promise<Pick<AgentIntegrationEntity, '_agentId' |
'_integrationId'>[]>, which violates the repository typing convention; remove
the explicit return type from that method signature so TypeScript infers the
return as Pick<AgentIntegrationEntity, '_agentId' | '_integrationId'>[] (keep
the method body unchanged) and ensure the method remains inside the same class
(AgentIntegrationRepository or the existing exported repository function) so
inference follows the project convention.

In `@packages/shared/src/consts/slug-identifier.ts`:
- Around line 7-9: The function slugIdentifierFormatMessage should have a blank
line immediately before its return statement per coding guidelines; open the
function definition for slugIdentifierFormatMessage and insert a single empty
line before the existing return line so the function body has a blank line
separating any preceding logic (or the function start) from the return.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 13ee04d9-f013-4e14-ad6a-a566769acd0d

📥 Commits

Reviewing files that changed from the base of the PR and between 92136a1 and c5a7c3e.

📒 Files selected for processing (23)
  • apps/api/src/app/agents/dtos/agent-integration-summary.dto.ts
  • apps/api/src/app/agents/dtos/agent-response.dto.ts
  • apps/api/src/app/agents/dtos/create-agent-request.dto.ts
  • apps/api/src/app/agents/dtos/index.ts
  • apps/api/src/app/agents/e2e/agents.e2e.ts
  • apps/api/src/app/agents/mappers/agent-response.mapper.ts
  • apps/api/src/app/agents/usecases/list-agents/list-agents.usecase.ts
  • apps/api/src/app/workflows-v2/dtos/create-step.dto.ts
  • apps/api/src/app/workflows-v2/dtos/create-workflow.dto.ts
  • apps/api/src/app/workflows-v2/dtos/duplicate-workflow.dto.ts
  • apps/dashboard/src/api/agents.ts
  • apps/dashboard/src/components/agents/agents-list.tsx
  • apps/dashboard/src/components/agents/agents-table.tsx
  • apps/dashboard/src/components/agents/create-agent-dialog.tsx
  • apps/dashboard/src/components/agents/delete-agent-dialog.tsx
  • apps/dashboard/src/components/integrations/components/provider-icon.tsx
  • apps/dashboard/src/components/workflow-editor/schema.ts
  • apps/dashboard/src/pages/agents.tsx
  • apps/dashboard/src/utils/query-keys.ts
  • libs/dal/src/repositories/agent-integration/agent-integration.repository.ts
  • packages/shared/src/consts/index.ts
  • packages/shared/src/consts/slug-identifier.ts
  • packages/shared/src/types/feature-flags.ts

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (4)
apps/dashboard/src/components/agents/agents-list.tsx (2)

147-156: Add blank line before return in callback.

Same as handleNextPage - as per coding guidelines, include a blank line before every return statement.

Suggested fix
 const handlePreviousPage = useCallback(() => {
   const previous = listQuery.data?.previous;

   if (!previous) {
+
     return;
   }

   setBefore(previous);
   setAfter(undefined);
 }, [listQuery.data?.previous]);
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/dashboard/src/components/agents/agents-list.tsx` around lines 147 - 156,
The callback handlePreviousPage should follow the coding guideline of having a
blank line before every return; open the function (handlePreviousPage) and
insert a single empty line immediately before the "return" statement that exits
when previous is falsy, ensuring the spacing matches handleNextPage and the
component's lint/style rules.

136-145: Add blank line before return in callback.

As per coding guidelines, include a blank line before every return statement.

Suggested fix
 const handleNextPage = useCallback(() => {
   const next = listQuery.data?.next;

-    if (!next) {
-      return;
-    }
+   if (!next) {
+
+     return;
+   }

   setAfter(next);
   setBefore(undefined);
 }, [listQuery.data?.next]);
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/dashboard/src/components/agents/agents-list.tsx` around lines 136 - 145,
The callback handleNextPage lacks a blank line immediately before its early
return; update the function (the useCallback that reads listQuery.data?.next) to
insert a blank line before the line "return" while keeping logic intact (leave
the next-check, setAfter(next) and setBefore(undefined) behavior unchanged) so
the blank-line-before-return coding guideline is satisfied.
apps/dashboard/src/components/agents/agents-table.tsx (2)

100-129: Add blank line before return statement.

As per coding guidelines, include a blank line before every return statement.

Suggested fix
 function AgentsTableSkeletonRow() {
+
   return (
     <TableRow>
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/dashboard/src/components/agents/agents-table.tsx` around lines 100 -
129, In AgentsTableSkeletonRow, add a single blank line immediately before the
"return (" statement so there is an empty line separating the function body
start from the return; update the function declaration around
AgentsTableSkeletonRow to include that blank line and ensure no other whitespace
rules are violated.

48-50: Add blank line before return statement.

As per coding guidelines, include a blank line before every return statement.

Suggested fix
 function getProviderDisplayName(providerId: string): string {
+
   return novuProviders.find((p) => p.id === providerId)?.displayName ?? providerId;
 }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/dashboard/src/components/agents/agents-table.tsx` around lines 48 - 50,
Add a blank line before the return statement in the getProviderDisplayName
function: locate the function getProviderDisplayName(providerId: string) which
uses novuProviders.find(...) and insert a single empty line immediately above
the return so the file follows the coding guideline of having a blank line
before every return statement.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@apps/dashboard/src/components/agents/agents-list.tsx`:
- Around line 147-156: The callback handlePreviousPage should follow the coding
guideline of having a blank line before every return; open the function
(handlePreviousPage) and insert a single empty line immediately before the
"return" statement that exits when previous is falsy, ensuring the spacing
matches handleNextPage and the component's lint/style rules.
- Around line 136-145: The callback handleNextPage lacks a blank line
immediately before its early return; update the function (the useCallback that
reads listQuery.data?.next) to insert a blank line before the line "return"
while keeping logic intact (leave the next-check, setAfter(next) and
setBefore(undefined) behavior unchanged) so the blank-line-before-return coding
guideline is satisfied.

In `@apps/dashboard/src/components/agents/agents-table.tsx`:
- Around line 100-129: In AgentsTableSkeletonRow, add a single blank line
immediately before the "return (" statement so there is an empty line separating
the function body start from the return; update the function declaration around
AgentsTableSkeletonRow to include that blank line and ensure no other whitespace
rules are violated.
- Around line 48-50: Add a blank line before the return statement in the
getProviderDisplayName function: locate the function
getProviderDisplayName(providerId: string) which uses novuProviders.find(...)
and insert a single empty line immediately above the return so the file follows
the coding guideline of having a blank line before every return statement.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 49f2d0a9-f8aa-458d-91f2-d9153a2a7c85

📥 Commits

Reviewing files that changed from the base of the PR and between fde0d4d and 7596152.

📒 Files selected for processing (6)
  • apps/api/src/app/agents/e2e/agents.e2e.ts
  • apps/api/src/app/agents/mappers/agent-response.mapper.ts
  • apps/dashboard/src/api/agents.ts
  • apps/dashboard/src/components/agents/agents-list.tsx
  • apps/dashboard/src/components/agents/agents-table.tsx
  • libs/dal/src/repositories/agent-integration/agent-integration.repository.ts
✅ Files skipped from review due to trivial changes (1)
  • libs/dal/src/repositories/agent-integration/agent-integration.repository.ts
🚧 Files skipped from review as they are similar to previous changes (3)
  • apps/api/src/app/agents/e2e/agents.e2e.ts
  • apps/api/src/app/agents/mappers/agent-response.mapper.ts
  • apps/dashboard/src/api/agents.ts

@scopsy scopsy merged commit ddcef59 into next Apr 13, 2026
39 checks passed
@scopsy scopsy deleted the agent-management-page branch April 13, 2026 16:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant