Skip to content

Commit 996d876

Browse files
Refactor incident statuses (#1399)
* Add Agentic directives * Add MCP management to the Template page * Format tool name * Add incident pending status support * Update types for statuses * Display current incident status in the header * Update Node to 24 --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
1 parent 704b3bb commit 996d876

File tree

81 files changed

+1930
-754
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

81 files changed

+1930
-754
lines changed

.nvmrc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
22
1+
24

README.md

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ Run tests:
2020
npm run test
2121
```
2222

23-
Start dev server:
23+
Start dev server (with Web distribution):
2424

2525
```shell
2626
npm run start
@@ -42,21 +42,28 @@ Supported `platform` values:
4242

4343
Build of the package will be in the `./dist` directory
4444

45-
## Environment variables
45+
## Environment variables for Web distribution
4646

4747
To set environment variables use .env file
4848

49-
| Name | Type | Default | Description |
50-
| ----------------- | ------ | ------- | --------------------------------------------------------- |
51-
| PORT | number | 3000 | Port (for dev server) |
52-
| UI_BASE_URL | string | - | Base URL to proxy requests to ingress (for dev server) |
53-
| JAEGER_API_PATH | string | - | URL path to proxy requests to Jaeger UI (for dev server ) |
54-
| API_BASE_URL | string | - | Base URL to proxy Digma API requests (for dev server) |
55-
| AUTH_API_BASE_URL | string | - | Base URL to proxy auth API requests (for dev server) |
56-
| API_TOKEN | string | - | API token (for dev server) |
57-
| USERNAME | string | - | User login (for dev server) |
58-
| PASSWORD | string | - | User password (for dev server) |
59-
| JAEGER_UI_PATH | string | - | Path to custom Jaeger UI build |
49+
| Name | Type | Default | Description |
50+
| ------------------------------- | ------- | ------- | -------------------------------------------------------- |
51+
| PORT | number | 3000 | Port (for dev server) |
52+
| UI_BASE_URL | string | - | Base URL to proxy requests to ingress (for dev server) |
53+
| JAEGER_API_PATH | string | - | URL path to proxy requests to Jaeger UI (for dev server) |
54+
| API_BASE_URL | string | - | Base URL to proxy Digma API requests (for dev server) |
55+
| AUTH_API_BASE_URL | string | - | Base URL to proxy auth API requests (for dev server) |
56+
| API_TOKEN | string | - | API token (for dev server) |
57+
| LOGIN | string | - | User login (for dev server) |
58+
| PASSWORD | string | - | User password (for dev server) |
59+
| IS_JAEGER_ENABLED | boolean | false | Enable links to Jaeger |
60+
| JAEGER_UI_PATH | string | - | Path to custom Jaeger UI build |
61+
| IS_SANDBOX_ENABLED | boolean | false | Enable Sandbox (demo) mode |
62+
| ARE_INSIGHT_SUGGESTIONS_ENABLED | boolean | false | Enable insight suggestions |
63+
| GOOGLE_CLIENT_ID | string | - | Google client ID |
64+
| POSTHOG_API_KEY | string | - | PostHog API key |
65+
| POSTHOG_URL | string | - | PostHog URL |
66+
| PRODUCT_FRUITS_WORKSPACE_CODE | string | - | Product Fruits workspace code |
6067

6168
## Jaeger UI
6269

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "digma-ui",
3-
"version": "15.2.1",
3+
"version": "15.3.0-alpha.3",
44
"description": "Digma UI",
55
"scripts": {
66
"lint:eslint": "eslint --cache .",
Lines changed: 11 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,25 @@
1-
import { useState } from "react";
21
import { useAdminDispatch } from "../../../../containers/Admin/hooks";
32
import { setEnvironmentToDelete } from "../../../../redux/slices/environmentsManagerSlice";
43
import { TrashBinIcon } from "../../../common/icons/16px/TrashBinIcon";
5-
import { ThreeDotsVerticalIcon } from "../../../common/icons/ThreeDotsVerticalIcon";
6-
import { NewPopover } from "../../../common/NewPopover";
7-
import { NewIconButton } from "../../../common/v3/NewIconButton";
8-
import { MenuList } from "../../../Navigation/common/MenuList";
9-
import * as s from "./styles";
4+
import { KebabMenu } from "../../../common/KebabMenu";
5+
import type { MenuItem } from "../../../Navigation/common/MenuList/types";
106
import type { ActionMenuButtonProps } from "./types";
117

128
export const ActionsMenuButton = ({ environment }: ActionMenuButtonProps) => {
13-
const [isKebabButtonMenuOpen, setIsKebabButtonMenuOpen] = useState(false);
149
const dispatch = useAdminDispatch();
1510

1611
const handleDeleteMenuItemClick = () => {
1712
dispatch(setEnvironmentToDelete(environment.id));
1813
};
1914

20-
const handleKebabMenuOpenChange = (isOpen: boolean) => {
21-
setIsKebabButtonMenuOpen(isOpen);
22-
};
15+
const items: MenuItem[] = [
16+
{
17+
id: "delete",
18+
icon: <TrashBinIcon />,
19+
label: "Delete",
20+
onClick: handleDeleteMenuItemClick
21+
}
22+
];
2323

24-
return (
25-
<NewPopover
26-
content={
27-
<s.Popup>
28-
<MenuList
29-
items={[
30-
{
31-
id: "delete",
32-
icon: <TrashBinIcon />,
33-
label: "Delete",
34-
onClick: handleDeleteMenuItemClick
35-
}
36-
]}
37-
/>
38-
</s.Popup>
39-
}
40-
onOpenChange={handleKebabMenuOpenChange}
41-
isOpen={isKebabButtonMenuOpen}
42-
placement={"bottom-end"}
43-
>
44-
<NewIconButton
45-
icon={ThreeDotsVerticalIcon}
46-
buttonType={"secondaryBorderless"}
47-
/>
48-
</NewPopover>
49-
);
24+
return <KebabMenu items={items} />;
5025
};

src/components/Agentic/IncidentDetails/AgentEvents/index.tsx

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,10 @@ export const AgentEvents = () => {
8080
);
8181

8282
const isAgentRunning = useMemo(
83-
() => Boolean(agentsData?.agents.find((x) => x.name === agentId)?.running),
83+
() =>
84+
Boolean(
85+
agentsData?.agents.find((x) => x.name === agentId)?.status === "running"
86+
),
8487
[agentsData, agentId]
8588
);
8689

@@ -104,15 +107,22 @@ export const AgentEvents = () => {
104107
speed={shouldShowTypingForEvent(i) ? TYPING_SPEED : undefined}
105108
/>
106109
);
107-
case "tool":
110+
case "tool": {
111+
let toolName = event.tool_name;
112+
113+
if (event.mcp_name) {
114+
toolName += ` ${[event.mcp_name, "MCP tool"]
115+
.filter(Boolean)
116+
.join(" ")})`;
117+
}
118+
108119
return (
109120
<Accordion
110-
summary={`${event.tool_name} (${[event.mcp_name, "MCP tool"]
111-
.filter(Boolean)
112-
.join(" ")})`}
121+
summary={toolName}
113122
content={<TypingMarkdown text={convertToMarkdown(event.message)} />}
114123
/>
115124
);
125+
}
116126
default:
117127
return null;
118128
}

src/components/Agentic/IncidentDetails/AgentFlowChart/AgentFlowChartNodeToolbar/index.tsx

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { Position } from "@xyflow/react";
22
import { PlusIcon } from "../../../../common/icons/16px/PlusIcon";
3-
import { MCPServersSideContainer } from "../MCPServersSideContainer";
3+
import { MCPServersContainer } from "../MCPServersContainer";
44
import { MCPServersToolbar } from "../MCPServersToolbar";
55
import * as s from "./styles";
66
import type { AgentFlowChartNodeToolbarProps } from "./types";
@@ -10,15 +10,20 @@ export const AgentFlowChartNodeToolbar = ({
1010
position,
1111
isEditMode,
1212
onAddMCPServer,
13-
onEditMCPServers,
13+
onEditMCPServer,
14+
onDeleteMCPServer,
1415
showPlusButton
1516
}: AgentFlowChartNodeToolbarProps) => {
1617
const handleAddMCPServer = () => {
17-
onAddMCPServer(position);
18+
onAddMCPServer();
1819
};
1920

20-
const handleEditMCPServers = () => {
21-
onEditMCPServers(position);
21+
const handleEditMCPServer = (server: string) => {
22+
onEditMCPServer(server);
23+
};
24+
25+
const handleDeleteMCPServer = (server: string) => {
26+
onDeleteMCPServer(server);
2227
};
2328

2429
const toolbarItems = [
@@ -27,8 +32,8 @@ export const AgentFlowChartNodeToolbar = ({
2732
<MCPServersToolbar
2833
key={"mcp-servers-toolbar"}
2934
servers={servers}
30-
onAddMCPServer={handleAddMCPServer}
31-
onEditMCPServers={handleEditMCPServers}
35+
onEditMCPServer={handleEditMCPServer}
36+
onDeleteMCPServer={handleDeleteMCPServer}
3237
/>
3338
]
3439
: []),
@@ -50,11 +55,9 @@ export const AgentFlowChartNodeToolbar = ({
5055
return (
5156
<>
5257
{isEditMode ? (
53-
[Position.Top, Position.Bottom].includes(position) && (
54-
<s.NodeToolbarContainer>{sortedToolbarItems}</s.NodeToolbarContainer>
55-
)
58+
<s.NodeToolbarContainer>{sortedToolbarItems}</s.NodeToolbarContainer>
5659
) : (
57-
<MCPServersSideContainer servers={servers} />
60+
<MCPServersContainer servers={servers} />
5861
)}
5962
</>
6063
);

src/components/Agentic/IncidentDetails/AgentFlowChart/AgentFlowChartNodeToolbar/types.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ export interface AgentFlowChartNodeToolbarProps {
55
isEditMode?: boolean;
66
position: Position;
77
servers: ExtendedAgentMCPServer[];
8-
onAddMCPServer: (position: Position) => void;
9-
onEditMCPServers: (position: Position) => void;
8+
onAddMCPServer: () => void;
9+
onEditMCPServer: (server: string) => void;
10+
onDeleteMCPServer: (server: string) => void;
1011
showPlusButton?: boolean;
1112
}

src/components/Agentic/IncidentDetails/AgentFlowChart/MCPServerIcon/index.tsx

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,7 @@ export const MCPServerIcon = ({
2727
themeKind={isActive ? "light" : "dark"}
2828
/>
2929
);
30-
case "mcp":
31-
return <MCPLogoIcon size={size} color={"currentColor"} />;
3230
default:
33-
return null;
31+
return <MCPLogoIcon size={size} color={"currentColor"} />;
3432
}
3533
};
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import { useViewport } from "@xyflow/react";
2+
import { Tooltip } from "../../../../common/v3/Tooltip";
3+
import { MCPServerIcon } from "../MCPServerIcon";
4+
import * as s from "./styles";
5+
import type { MCPServersContainerProps } from "./types";
6+
7+
const DEFAULT_ICON_SIZE = 27; // in pixels
8+
9+
export const MCPServersContainer = ({ servers }: MCPServersContainerProps) => {
10+
const viewport = useViewport();
11+
const zoomLevel = viewport.zoom;
12+
13+
if (!servers || servers.length === 0) {
14+
return null;
15+
}
16+
17+
return (
18+
<s.Container $zoomLevel={zoomLevel}>
19+
{servers?.map((x) => (
20+
<Tooltip title={x.display_name} key={x.name}>
21+
<s.MCPServerBlock $isActive={x.active} $zoomLevel={viewport.zoom}>
22+
<MCPServerIcon
23+
type={x.name}
24+
isActive={x.active}
25+
size={DEFAULT_ICON_SIZE * viewport.zoom}
26+
/>
27+
</s.MCPServerBlock>
28+
</Tooltip>
29+
))}
30+
</s.Container>
31+
);
32+
};

0 commit comments

Comments
 (0)