diff --git a/keep-ui/app/(keep)/incidents/[id]/chat/incident-chat.css b/keep-ui/app/(keep)/incidents/[id]/chat/incident-chat.css index 50bca9be6..5ee1ad1df 100644 --- a/keep-ui/app/(keep)/incidents/[id]/chat/incident-chat.css +++ b/keep-ui/app/(keep)/incidents/[id]/chat/incident-chat.css @@ -33,7 +33,7 @@ } .chat-container { - @apply max-h-[calc(100vh-37rem)] flex flex-col; + @apply max-h-[calc(100vh-30rem)] flex flex-col; scroll-behavior: smooth; } diff --git a/keep-ui/app/(keep)/incidents/[id]/chat/incident-chat.tsx b/keep-ui/app/(keep)/incidents/[id]/chat/incident-chat.tsx index 4afed77f4..cf185c6f3 100644 --- a/keep-ui/app/(keep)/incidents/[id]/chat/incident-chat.tsx +++ b/keep-ui/app/(keep)/incidents/[id]/chat/incident-chat.tsx @@ -1,4 +1,8 @@ -import { CopilotChat, useCopilotChatSuggestions } from "@copilotkit/react-ui"; +import { + CopilotChat, + ResponseButtonProps, + useCopilotChatSuggestions, +} from "@copilotkit/react-ui"; import type { IncidentDto } from "@/entities/incidents/model"; import { useIncidentAlerts } from "utils/hooks/useIncidents"; import { EmptyStateCard } from "@/components/ui/EmptyStateCard"; @@ -7,6 +11,7 @@ import { useCopilotAction, useCopilotReadable, useCopilotMessagesContext, + useCopilotChat, } from "@copilotkit/react-core"; import { ActionExecutionMessage, @@ -21,6 +26,13 @@ import { useEffect, useMemo } from "react"; import "@copilotkit/react-ui/styles.css"; import "./incident-chat.css"; import { useSession } from "next-auth/react"; +import { TrashIcon } from "@radix-ui/react-icons"; + +const INSTRUCTIONS = `You are an expert incident resolver who's capable of resolving incidents in a variety of ways. You can get traces from providers, search for traces, create incidents, update incident name and summary, and more. You can also ask the user for information if you need it. +You should always answer short and concise answers, always trying to suggest the next best action to investigate or resolve the incident. +Any time you're not sure about something, ask the user for clarification. +If you used some provider's method to get data, present the icon of the provider you used. +If you think your response is relevant for the root cause analysis, add a "root_cause" tag to the message and call the "enrichRCA" method to enrich the incident.`; export function IncidentChat({ incident }: { incident: IncidentDto }) { const router = useRouter(); @@ -29,6 +41,27 @@ export function IncidentChat({ incident }: { incident: IncidentDto }) { incident.id ); const { messages, setMessages } = useCopilotMessagesContext(); + const { runChatCompletion } = useCopilotChat(); + + function CustomResponseButton({ onClick, inProgress }: ResponseButtonProps) { + return ( +
+ +
+ ); + } //https://docs.copilotkit.ai/guides/messages-localstorage // save to local storage when messages change @@ -122,6 +155,34 @@ export function IncidentChat({ incident }: { incident: IncidentDto }) { }); // Actions + useCopilotAction({ + name: "enrichRCA", + description: + "This action is used by the copilot chat to enrich the incident with root cause analysis. It takes the messages and the incident and enriches the incident with the root cause analysis.", + parameters: [ + { + name: "rootCausePoint", + type: "string", + description: + "The bullet you think should be added to the list of root cause analysis points", + }, + { + name: "rcaProvider", + type: "string", + description: + "The provider you used to get the root cause analysis point", + }, + ], + handler: async ({ rootCausePoint, rcaProvider }) => { + const rcaPoints = incident.enrichments["rca_points"] || []; + await enrichIncident(incident.id, { + rca_points: [ + ...rcaPoints, + { content: rootCausePoint, providerType: rcaProvider }, + ], + }); + }, + }); useCopilotAction({ name: "invokeProviderMethod", description: @@ -377,13 +438,14 @@ export function IncidentChat({ incident }: { incident: IncidentDto }) {
diff --git a/keep-ui/app/(keep)/incidents/[id]/incident-overview.tsx b/keep-ui/app/(keep)/incidents/[id]/incident-overview.tsx index 48ec6180b..854179bd2 100644 --- a/keep-ui/app/(keep)/incidents/[id]/incident-overview.tsx +++ b/keep-ui/app/(keep)/incidents/[id]/incident-overview.tsx @@ -3,7 +3,6 @@ import { useIncidentActions, type IncidentDto, - type PaginatedIncidentAlertsDto, } from "@/entities/incidents/model"; import React, { useState } from "react"; import { useIncident, useIncidentAlerts } from "@/utils/hooks/useIncidents"; @@ -33,6 +32,7 @@ import { import { IncidentOverviewSkeleton } from "../incident-overview-skeleton"; import { AlertDto } from "@/entities/alerts/model"; import { useRouter } from "next/navigation"; +import { RootCauseAnalysis } from "@/components/ui/RootCauseAnalysis"; interface Props { incident: IncidentDto; @@ -214,7 +214,7 @@ export function IncidentOverview({ incident: initialIncidentData }: Props) { return ( // Adding padding bottom to visually separate from the tabs -
+
@@ -225,6 +225,7 @@ export function IncidentOverview({ incident: initialIncidentData }: Props) { alerts={alerts.items} incident={incident} /> + {/* @tb: not sure how we use this, but leaving it here for now {incident.user_summary && incident.generated_summary ? ( - ) : null} + ) : null} */} {incident.merged_into_incident_id && ( )} +
+ +
- Involved services - {notNullServices.length > 0 ? ( -
- {notNullServices.map((service) => ( - filterBy("service", service)} - > - {service} - - ))} -
- ) : ( - "No services involved" - )} - Affected environments - {environments.length > 0 ? ( -
- {environments.map((env) => ( - filterBy("environment", env)} - > - {env} - - ))} +
+
+ Involved services + {notNullServices.length > 0 ? ( +
+ {notNullServices.map((service) => ( + filterBy("service", service)} + > + {service} + + ))} +
+ ) : ( + "No services involved" + )}
- ) : ( - "No environments involved" - )} - External incident - {incident.enrichments?.incident_id && - incident.enrichments?.incident_url ? ( -
- { - // TODO: @tb: add alert tickets as well? - } - ( - - ) - : undefined - } - className="cursor-pointer" - onClick={() => - window.open(incident.enrichments.incident_url, "_blank") - } - > - {incident.enrichments?.incident_title ?? - incident.user_generated_name} - + +
+ Affected environments + {environments.length > 0 ? ( +
+ {environments.map((env) => ( + filterBy("environment", env)} + > + {env} + + ))} +
+ ) : ( + "No environments involved" + )}
- ) : ( - "No external incidents" - )} - Repositories - {repositories?.length > 0 ? ( -
- {repositories.map((repo) => { - const repoName = repo.split("/").pop(); - return ( + +
+ External incident + {incident.enrichments?.incident_id && + incident.enrichments?.incident_url ? ( +
( - - )} + icon={ + incident.enrichments?.incident_provider + ? (props: any) => ( + + ) + : undefined + } className="cursor-pointer" - onClick={() => window.open(repo, "_blank")} + onClick={() => + window.open(incident.enrichments.incident_url, "_blank") + } > - {repoName} + {incident.enrichments?.incident_title ?? + incident.user_generated_name} - ); - })} +
+ ) : ( + "No external incidents" + )}
- ) : ( - "No environments involved" - )} - {incident.rule_fingerprint !== "none" && - !!incident.rule_fingerprint && ( - <> - Grouped by + +
+ Repositories + {repositories?.length > 0 ? (
- - {incident.rule_fingerprint} - + {repositories.map((repo) => { + const repoName = repo.split("/").pop(); + return ( + ( + + )} + className="cursor-pointer" + onClick={() => window.open(repo, "_blank")} + > + {repoName} + + ); + })}
- - )} -
-
- + ) : ( + "No environments involved" + )} +
+
+ Assignee + {incident.assignee ? ( +

{incident.assignee}

+ ) : ( +

No assignee yet

+ )} +
+ {incident.rule_fingerprint !== "none" && + !!incident.rule_fingerprint && ( +
+ Grouped by +
+ + {incident.rule_fingerprint} + +
+
+ )} +
@@ -372,14 +391,9 @@ export function IncidentOverview({ incident: initialIncidentData }: Props) {
)} -
- Assignee - {incident.assignee ? ( -

{incident.assignee}

- ) : ( -

No assignee yet

- )} -
+ {incident?.enrichments && "rca_points" in incident.enrichments && ( + + )} {!!incident.rule_fingerprint && (
Group by value diff --git a/keep-ui/components/ui/RootCauseAnalysis.tsx b/keep-ui/components/ui/RootCauseAnalysis.tsx new file mode 100644 index 000000000..c68de57a7 --- /dev/null +++ b/keep-ui/components/ui/RootCauseAnalysis.tsx @@ -0,0 +1,89 @@ +import { DynamicIcon } from "./DynamicIcon"; +import * as HoverCard from "@radix-ui/react-hover-card"; + +interface RCAPoint { + providerType: string; + content: string; +} + +export function RootCauseAnalysis({ + points, + className, +}: { + points: RCAPoint[]; + className?: string; +}) { + if (!points || points.length === 0) return null; + + return ( + + +
+
+ + + + +
+ +
+ + + + +

+ Root Cause Analysis +

+
+
+
+ + + +
+

+ Analysis Points +

+
    + {points.map((point, index) => ( +
  • + {point.providerType && ( +
    + +
    + )} + {point.content} +
  • + ))} +
+
+ + +
+
+
+ ); +} diff --git a/keep-ui/package-lock.json b/keep-ui/package-lock.json index ec81bb704..1d2ff83a7 100644 --- a/keep-ui/package-lock.json +++ b/keep-ui/package-lock.json @@ -24,6 +24,7 @@ "@headlessui/react": "^1.7.14", "@headlessui/tailwindcss": "^0.2.1", "@heroicons/react": "^2.1.5", + "@radix-ui/react-hover-card": "^1.0.0", "@radix-ui/react-icons": "^1.3.0", "@radix-ui/react-label": "^1.0.0", "@radix-ui/react-popover": "^1.1.2", @@ -6465,6 +6466,264 @@ } } }, + "node_modules/@radix-ui/react-hover-card": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-hover-card/-/react-hover-card-1.0.0.tgz", + "integrity": "sha512-9Vn24lwbB0QUrVsgIKdjCmX9Y/ElBbBbGrJ4FWeT6EktaOQUWJT7y1Ao+WBSlNwbklhJIbbhZgknHm0IAoxTLA==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-dismissable-layer": "1.0.0", + "@radix-ui/react-popper": "1.0.0", + "@radix-ui/react-portal": "1.0.0", + "@radix-ui/react-presence": "1.0.0", + "@radix-ui/react-primitive": "1.0.0", + "@radix-ui/react-use-controllable-state": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-hover-card/node_modules/@floating-ui/core": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-0.7.3.tgz", + "integrity": "sha512-buc8BXHmG9l82+OQXOFU3Kr2XQx9ys01U/Q9HMIrZ300iLc8HLMgh7dcCqgYzAzf4BkoQvDcXf5Y+CuEZ5JBYg==" + }, + "node_modules/@radix-ui/react-hover-card/node_modules/@floating-ui/dom": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-0.5.4.tgz", + "integrity": "sha512-419BMceRLq0RrmTSDxn8hf9R3VCJv2K9PUfugh5JyEFmdjzDo+e8U5EdR8nzKq8Yj1htzLm3b6eQEEam3/rrtg==", + "dependencies": { + "@floating-ui/core": "^0.7.3" + } + }, + "node_modules/@radix-ui/react-hover-card/node_modules/@floating-ui/react-dom": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-0.7.2.tgz", + "integrity": "sha512-1T0sJcpHgX/u4I1OzIEhlcrvkUN8ln39nz7fMoE/2HDHrPiMFoOGR7++GYyfUmIQHkkrTinaeQsO3XWubjSvGg==", + "dependencies": { + "@floating-ui/dom": "^0.5.3", + "use-isomorphic-layout-effect": "^1.1.1" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@radix-ui/react-hover-card/node_modules/@radix-ui/primitive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.0.tgz", + "integrity": "sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA==", + "dependencies": { + "@babel/runtime": "^7.13.10" + } + }, + "node_modules/@radix-ui/react-hover-card/node_modules/@radix-ui/react-arrow": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.0.0.tgz", + "integrity": "sha512-1MUuv24HCdepi41+qfv125EwMuxgQ+U+h0A9K3BjCO/J8nVRREKHHpkD9clwfnjEDk9hgGzCnff4aUKCPiRepw==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-hover-card/node_modules/@radix-ui/react-compose-refs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.0.tgz", + "integrity": "sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-hover-card/node_modules/@radix-ui/react-context": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.0.0.tgz", + "integrity": "sha512-1pVM9RfOQ+n/N5PJK33kRSKsr1glNxomxONs5c49MliinBY6Yw2Q995qfBUUo0/Mbg05B/sGA0gkgPI7kmSHBg==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-hover-card/node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.0.tgz", + "integrity": "sha512-n7kDRfx+LB1zLueRDvZ1Pd0bxdJWDUZNQ/GWoxDn2prnuJKRdxsjulejX/ePkOsLi2tTm6P24mDqlMSgQpsT6g==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-primitive": "1.0.0", + "@radix-ui/react-use-callback-ref": "1.0.0", + "@radix-ui/react-use-escape-keydown": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-hover-card/node_modules/@radix-ui/react-popper": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.0.0.tgz", + "integrity": "sha512-k2dDd+1Wl0XWAMs9ZvAxxYsB9sOsEhrFQV4CINd7IUZf0wfdye4OHen9siwxvZImbzhgVeKTJi68OQmPRvVdMg==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@floating-ui/react-dom": "0.7.2", + "@radix-ui/react-arrow": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-primitive": "1.0.0", + "@radix-ui/react-use-layout-effect": "1.0.0", + "@radix-ui/react-use-rect": "1.0.0", + "@radix-ui/react-use-size": "1.0.0", + "@radix-ui/rect": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-hover-card/node_modules/@radix-ui/react-portal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.0.tgz", + "integrity": "sha512-a8qyFO/Xb99d8wQdu4o7qnigNjTPG123uADNecz0eX4usnQEj7o+cG4ZX4zkqq98NYekT7UoEQIjxBNWIFuqTA==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-hover-card/node_modules/@radix-ui/react-presence": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.0.0.tgz", + "integrity": "sha512-A+6XEvN01NfVWiKu38ybawfHsBjWum42MRPnEuqPsBZ4eV7e/7K321B5VgYMPv3Xx5An6o1/l9ZuDBgmcmWK3w==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-use-layout-effect": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-hover-card/node_modules/@radix-ui/react-primitive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.0.tgz", + "integrity": "sha512-EyXe6mnRlHZ8b6f4ilTDrXmkLShICIuOTTj0GX4w1rp+wSxf3+TD05u1UOITC8VsJ2a9nwHvdXtOXEOl0Cw/zQ==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-slot": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-hover-card/node_modules/@radix-ui/react-slot": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.0.tgz", + "integrity": "sha512-3mrKauI/tWXo1Ll+gN5dHcxDPdm/Df1ufcDLCecn+pnCIVcdWE7CujXo8QaXOWRJyZyQWWbpB8eFwHzWXlv5mQ==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-hover-card/node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.0.tgz", + "integrity": "sha512-GZtyzoHz95Rhs6S63D2t/eqvdFCm7I+yHMLVQheKM7nBD8mbZIt+ct1jz4536MDnaOGKIxynJ8eHTkVGVVkoTg==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-hover-card/node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.0.tgz", + "integrity": "sha512-FohDoZvk3mEXh9AWAVyRTYR4Sq7/gavuofglmiXB2g1aKyboUD4YtgWxKj8O5n+Uak52gXQ4wKz5IFST4vtJHg==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-callback-ref": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-hover-card/node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.0.tgz", + "integrity": "sha512-JwfBCUIfhXRxKExgIqGa4CQsiMemo1Xt0W/B4ei3fpzpvPENKpMKQ8mZSB6Acj3ebrAEgi2xiQvcI1PAAodvyg==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-callback-ref": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-hover-card/node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.0.tgz", + "integrity": "sha512-6Tpkq+R6LOlmQb1R5NNETLG0B4YP0wc+klfXafpUCj6JGyaUc8il7/kUZ7m59rGbXGczE9Bs+iz2qloqsZBduQ==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-hover-card/node_modules/@radix-ui/react-use-rect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.0.0.tgz", + "integrity": "sha512-TB7pID8NRMEHxb/qQJpvSt3hQU4sqNPM1VCTjTRjEOa7cEop/QMuq8S6fb/5Tsz64kqSvB9WnwsDHtjnrM9qew==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/rect": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-hover-card/node_modules/@radix-ui/react-use-size": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.0.0.tgz", + "integrity": "sha512-imZ3aYcoYCKhhgNpkNDh/aTiU05qw9hX+HHI1QDBTyIlcFjgeFlKKySNGMwTp7nYFLQg/j0VA2FmCY4WPDDHMg==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-layout-effect": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-hover-card/node_modules/@radix-ui/rect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.0.0.tgz", + "integrity": "sha512-d0O68AYy/9oeEy1DdC07bz1/ZXX+DqCskRd3i4JzLSTXwefzaepQrKjXC7aNM8lTHjFLDO0pDgaEiQ7jEk+HVg==", + "dependencies": { + "@babel/runtime": "^7.13.10" + } + }, "node_modules/@radix-ui/react-icons": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/@radix-ui/react-icons/-/react-icons-1.3.2.tgz", diff --git a/keep-ui/package.json b/keep-ui/package.json index 38546e52a..38adcff6d 100644 --- a/keep-ui/package.json +++ b/keep-ui/package.json @@ -25,6 +25,7 @@ "@headlessui/react": "^1.7.14", "@headlessui/tailwindcss": "^0.2.1", "@heroicons/react": "^2.1.5", + "@radix-ui/react-hover-card": "^1.0.0", "@radix-ui/react-icons": "^1.3.0", "@radix-ui/react-label": "^1.0.0", "@radix-ui/react-popover": "^1.1.2", diff --git a/keep/api/models/alert.py b/keep/api/models/alert.py index 09274e5e8..42a561b35 100644 --- a/keep/api/models/alert.py +++ b/keep/api/models/alert.py @@ -536,6 +536,7 @@ def from_db_incident(cls, db_incident: "Incident"): merged_at=db_incident.merged_at, incident_type=db_incident.incident_type, incident_application=str(db_incident.incident_application), + enrichments=db_incident.enrichments, ) # This field is required for getting alerts when required