Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
bc3d6a9
[Agent Builder] New navigation foundation (#257858)
chrisbmar Mar 16, 2026
8b2cb0a
Merge branch 'main' into ab-agent-centric-ux-feature-branch
chrisbmar Mar 17, 2026
85cf346
[Agent Builder] Migrate existing routes to new UX (#258241)
chrisbmar Mar 18, 2026
49f4ddc
Merge branch 'main' into ab-agent-centric-ux-feature-branch
chrisbmar Mar 18, 2026
a9b4370
add connctors page to route config
chrisbmar Mar 18, 2026
f786a08
feat(agent-builder): agent specific skill listing page (#258121)
SiddharthMantri Mar 19, 2026
53f5bfd
[Agent Builder] Sidebar designs (#258547)
chrisbmar Mar 19, 2026
67e47b2
Merge branch 'main' into ab-agent-centric-ux-feature-branch
chrisbmar Mar 20, 2026
9ca1163
[Agent Builder] Fix FTR tests in feature branch (#258846)
chrisbmar Mar 20, 2026
db71508
Merge branch 'main' into ab-agent-centric-ux-feature-branch
chrisbmar Mar 21, 2026
4b18201
Merge branch 'main' into ab-agent-centric-ux-feature-branch
chrisbmar Mar 23, 2026
b0bee07
feat(agent builder): plugin listing for agent first UX (#258667)
SiddharthMantri Mar 23, 2026
e85d077
Merge branch 'main' into ab-agent-centric-ux-feature-branch
chrisbmar Mar 23, 2026
274a0e5
[Agent Builder] Add unit tests for unified sidebar (#259061)
chrisbmar Mar 23, 2026
c5cb851
[Agent Builder] Add dynamic agent name label to nav item (#259106)
chrisbmar Mar 23, 2026
3f9a26e
feat(agent-builder): tool listing page for agent centric UX (#259066)
SiddharthMantri Mar 23, 2026
b8ad270
feat(agent-builder): agent centric ux design tweaks (#259296)
SiddharthMantri Mar 24, 2026
004d0ac
feat(agent-builder): agent overview page for agent centric ux (#259145)
SiddharthMantri Mar 24, 2026
1808748
[Agent Builder] Side pane header updates (#259401)
chrisbmar Mar 24, 2026
72840ef
Merge branch 'main' into ab-agent-centric-ux-feature-branch
chrisbmar Mar 25, 2026
5a51aa3
[Agent Builder] Small polish to UX flows (#259521)
chrisbmar Mar 25, 2026
54912aa
[Agent Builder] Remove sidebar view for agent customise routes (#259594)
chrisbmar Mar 26, 2026
2ee5904
Merge branch 'main' into ab-agent-centric-ux-feature-branch
chrisbmar Mar 26, 2026
0b5a002
Changes from node scripts/regenerate_moon_projects.js --update
kibanamachine Mar 26, 2026
cd06f12
Changes from node scripts/eslint_all_files --no-cache --fix
kibanamachine Mar 26, 2026
99cde6f
[Agent Builder] Fix FTR tests and simplify RBAC for route definitions…
chrisbmar Mar 26, 2026
64e97d4
Merge branch 'main' into ab-agent-centric-ux-feature-branch
chrisbmar Mar 26, 2026
8d7592e
fix mocks
chrisbmar Mar 26, 2026
778fe36
Merge branch 'main' into ab-agent-centric-ux-feature-branch
chrisbmar Mar 26, 2026
7cbb6bf
Merge branch 'main' into ab-agent-centric-ux-feature-branch
chrisbmar Mar 27, 2026
0e9031b
[Agent Builder] Use markdown renderer for skill instructions in read-…
chrisbmar Mar 27, 2026
7744d13
Merge branch 'main' into ab-agent-centric-ux-feature-branch
chrisbmar Mar 27, 2026
1c88bf6
Merge branch 'main' into ab-agent-centric-ux-feature-branch
chrisbmar Mar 30, 2026
2af1f4a
Merge branch 'main' into ab-agent-centric-ux-feature-branch
chrisbmar Mar 30, 2026
c8ca289
[Agent Builder] Fix skill counting on overview page and sidebar updat…
chrisbmar Mar 30, 2026
33abdef
Merge branch 'main' into ab-agent-centric-ux-feature-branch
chrisbmar Mar 30, 2026
c693126
Merge branch 'main' into ab-agent-centric-ux-feature-branch
elasticmachine Mar 31, 2026
3298b49
Merge branch 'main' into ab-agent-centric-ux-feature-branch
elasticmachine Mar 31, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion x-pack/platform/plugins/shared/agent_builder/moon.yml
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,6 @@ dependsOn:
- '@kbn/core-elasticsearch-server-mocks'
- '@kbn/core-data-streams-server'
- '@kbn/task-manager-plugin'
- '@kbn/deeplinks-data-sources'
- '@kbn/evals-plugin'
- '@kbn/usage-api-plugin'
- '@kbn/es-query'
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/

import React from 'react';
import { EuiButtonIcon, EuiFlexGroup, EuiFlexItem, EuiText, useEuiTheme } from '@elastic/eui';
import { css } from '@emotion/react';

export interface ActiveItemRowProps {
id: string;
name: string;
isSelected: boolean;
onSelect: () => void;
onRemove: () => void;
isRemoving?: boolean;
removeAriaLabel: string;
readOnlyContent?: React.ReactNode;
}

export const ActiveItemRow: React.FC<ActiveItemRowProps> = ({
name,
isSelected,
onSelect,
onRemove,
isRemoving = false,
removeAriaLabel,
readOnlyContent,
}) => {
const { euiTheme } = useEuiTheme();

return (
<EuiFlexGroup
alignItems="center"
gutterSize="none"
responsive={false}
onClick={onSelect}
css={css`
padding: ${euiTheme.size.s} ${euiTheme.size.m};
cursor: pointer;
border-radius: ${euiTheme.border.radius.medium};
background-color: ${isSelected
? euiTheme.colors.backgroundBaseInteractiveHover
: 'transparent'};
&:hover {
background-color: ${euiTheme.colors.backgroundBaseInteractiveHover};
}
`}
>
<EuiFlexItem
css={css`
min-width: 0;
`}
>
<EuiText
size="s"
css={css`
font-weight: ${isSelected
? euiTheme.font.weight.semiBold
: euiTheme.font.weight.regular};
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
`}
>
{name}
</EuiText>
</EuiFlexItem>
{isSelected && (
<EuiFlexItem grow={false}>
{readOnlyContent ?? (
<EuiButtonIcon
iconType="cross"
aria-label={removeAriaLabel}
disabled={isRemoving}
onClick={(event: React.MouseEvent) => {
event.stopPropagation();
onRemove();
}}
/>
)}
</EuiFlexItem>
)}
</EuiFlexGroup>
);
};
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,10 @@
* 2.0.
*/

export { AgentSelector } from './agent_selector';
export const FLYOUT_WIDTH = '960px';

export const CONTAINER_WIDTH = '1200px';

export const ICON_DIMENSIONS = { width: 24, height: 28 } as const;

export const SEARCH_LIST_WIDTH = '340px';
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/

import React, { useState } from 'react';
import {
EuiConfirmModal,
EuiFlexGroup,
EuiFlexItem,
EuiIcon,
EuiLoadingSpinner,
EuiTitle,
useEuiTheme,
} from '@elastic/eui';
import { css } from '@emotion/react';

interface ConfirmRemoveConfig {
title: string;
body: string;
confirmButtonText: string;
cancelButtonText: string;
onConfirm: () => void;
}

export interface DetailPanelLayoutProps {
isLoading: boolean;
isEmpty: boolean;
title: string;
showAutoIcon?: boolean;
headerActions: (openConfirmRemove: () => void) => React.ReactNode;
headerContent?: React.ReactNode;
children: React.ReactNode;
confirmRemove?: ConfirmRemoveConfig;
}

export const DetailPanelLayout: React.FC<DetailPanelLayoutProps> = ({
isLoading,
isEmpty,
title,
showAutoIcon = false,
headerActions,
headerContent,
children,
confirmRemove,
}) => {
const { euiTheme } = useEuiTheme();
const [isConfirmOpen, setIsConfirmOpen] = useState(false);

const openConfirmRemove = () => setIsConfirmOpen(true);

if (isLoading) {
return (
<EuiFlexGroup
justifyContent="center"
alignItems="center"
css={css`
padding: ${euiTheme.size.xxl};
`}
>
<EuiLoadingSpinner size="l" />
</EuiFlexGroup>
);
}

if (isEmpty) return null;

return (
<div
css={css`
height: 100%;
padding: 0;
`}
>
<div
css={css`
display: flex;
flex-direction: column;
height: 100%;
border: ${euiTheme.border.thin};
border-radius: ${euiTheme.size.xs};
`}
>
{/* Header: pinned at top, does not scroll */}
<div
css={css`
flex-shrink: 0;
padding: ${euiTheme.size.l};
border-bottom: ${euiTheme.border.thin};
background-color: ${euiTheme.colors.backgroundBaseSubdued};
`}
>
<EuiFlexGroup alignItems="center" justifyContent="spaceBetween" responsive={false}>
<EuiFlexItem grow={false}>
<EuiFlexGroup alignItems="center" gutterSize="s" responsive={false}>
<EuiFlexItem grow={false}>
<EuiTitle size="s">
<h2>{title}</h2>
</EuiTitle>
</EuiFlexItem>
{showAutoIcon && (
<EuiFlexItem grow={false}>
<EuiIcon type="logoElastic" size="m" aria-hidden={true} />
</EuiFlexItem>
)}
</EuiFlexGroup>
</EuiFlexItem>
<EuiFlexItem grow={false}>{headerActions(openConfirmRemove)}</EuiFlexItem>
</EuiFlexGroup>
{headerContent}
</div>

{/* Body: fills remaining height and scrolls on overflow */}
<div
css={css`
flex: 1;
min-height: 0;
overflow-y: auto;
`}
>
{children}
</div>
</div>

{confirmRemove && isConfirmOpen && (
<EuiConfirmModal
title={confirmRemove.title}
aria-label={confirmRemove.title}
onCancel={() => setIsConfirmOpen(false)}
onConfirm={() => {
setIsConfirmOpen(false);
confirmRemove.onConfirm();
}}
cancelButtonText={confirmRemove.cancelButtonText}
confirmButtonText={confirmRemove.confirmButtonText}
buttonColor="danger"
>
<p>{confirmRemove.body}</p>
</EuiConfirmModal>
)}
</div>
);
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/

import React from 'react';
import { EuiText, useEuiTheme } from '@elastic/eui';
import { css } from '@emotion/react';

export interface DetailRowProps {
label: string;
children: React.ReactNode;
isLast?: boolean;
}

export const DetailRow: React.FC<DetailRowProps> = ({ label, children, isLast = false }) => {
const { euiTheme } = useEuiTheme();

return (
<div
css={css`
padding: ${euiTheme.size.m};
border-bottom: ${isLast ? 'none' : euiTheme.border.thin};
`}
>
<EuiText size="s">
<strong>{label}</strong>
</EuiText>
<div
css={css`
padding-top: ${euiTheme.size.s};
`}
>
{children}
</div>
</div>
);
};
Loading
Loading