@oneuptime/common 9.2.26 → 9.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Models/DatabaseModels/AIAgent.ts +589 -0
- package/Models/DatabaseModels/AIAgentOwnerTeam.ts +434 -0
- package/Models/DatabaseModels/AIAgentOwnerUser.ts +433 -0
- package/Models/DatabaseModels/AIAgentTask.ts +549 -0
- package/Models/DatabaseModels/AIAgentTaskLog.ts +417 -0
- package/Models/DatabaseModels/AIAgentTaskPullRequest.ts +731 -0
- package/Models/DatabaseModels/AIAgentTaskTelemetryException.ts +388 -0
- package/Models/DatabaseModels/Index.ts +15 -0
- package/Models/DatabaseModels/Monitor.ts +33 -0
- package/Models/DatabaseModels/Project.ts +25 -0
- package/Models/DatabaseModels/TelemetryException.ts +1 -1
- package/Server/API/AIAgentAPI.ts +200 -0
- package/Server/API/AIAgentDataAPI.ts +692 -0
- package/Server/API/AIAgentTaskAPI.ts +286 -0
- package/Server/API/AIAgentTaskLogAPI.ts +165 -0
- package/Server/API/AIAgentTaskPullRequestAPI.ts +14 -0
- package/Server/API/GitHubAPI.ts +25 -7
- package/Server/API/TelemetryExceptionAPI.ts +169 -0
- package/Server/EnvironmentConfig.ts +3 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1766590916627-MigrationName.ts +195 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1766600860972-MigrationName.ts +31 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1766606720183-MigrationName.ts +17 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1766688107858-MigrationName.ts +63 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1766754182870-MigrationName.ts +75 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1766774689743-MigrationName.ts +157 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1766777986427-MigrationName.ts +33 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1766918848434-AddAIAgentIsDefault.ts +27 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1766923324521-MigrationName.ts +37 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1766958924188-AddGitHubAppInstallationIdToProject.ts +31 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1767009661768-MigrationName.ts +35 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +22 -0
- package/Server/Services/AIAgentOwnerTeamService.ts +10 -0
- package/Server/Services/AIAgentOwnerUserService.ts +10 -0
- package/Server/Services/AIAgentService.ts +564 -0
- package/Server/Services/AIAgentTaskLogService.ts +10 -0
- package/Server/Services/AIAgentTaskPullRequestService.ts +10 -0
- package/Server/Services/AIAgentTaskService.ts +178 -0
- package/Server/Services/AIAgentTaskTelemetryExceptionService.ts +39 -0
- package/Server/Services/Index.ts +10 -0
- package/Server/Services/TelemetryExceptionService.ts +162 -0
- package/Server/Types/Workflow/Components/Index.ts +2 -0
- package/Server/Types/Workflow/Components/Telegram/SendMessageToChat.ts +146 -0
- package/Server/Utils/Monitor/MonitorResource.ts +228 -0
- package/Server/Utils/PushNotificationUtil.ts +29 -0
- package/Server/Utils/WhatsAppTemplateUtil.ts +6 -0
- package/Tests/UI/Components/Badge.test.tsx +5 -5
- package/Tests/UI/Components/Card.test.tsx +4 -8
- package/Tests/UI/Components/HiddenText.test.tsx +2 -5
- package/Tests/UI/Components/SideMenuItem.test.tsx +4 -2
- package/Types/AI/AIAgentTaskMetadata.ts +25 -0
- package/Types/AI/AIAgentTaskStatus.ts +65 -0
- package/Types/AI/AIAgentTaskType.ts +40 -0
- package/Types/Email/EmailTemplateType.ts +2 -0
- package/Types/Monitor/MonitorEvaluationSummary.ts +2 -1
- package/Types/NotificationSetting/NotificationSettingEventType.ts +4 -0
- package/Types/Permission.ts +176 -0
- package/Types/WhatsApp/WhatsAppTemplates.ts +9 -0
- package/Types/Workflow/ComponentID.ts +1 -0
- package/Types/Workflow/Components/Telegram.ts +76 -0
- package/Types/Workflow/Components.ts +7 -0
- package/UI/Components/AIAgent/AIAgent.tsx +69 -0
- package/UI/Components/Badge/Badge.tsx +9 -5
- package/UI/Components/Banner/Banner.tsx +1 -1
- package/UI/Components/Card/Card.tsx +14 -12
- package/UI/Components/CodeBlock/CodeBlock.tsx +47 -4
- package/UI/Components/Detail/Detail.tsx +239 -49
- package/UI/Components/Detail/FieldLabel.tsx +35 -11
- package/UI/Components/Detail/PlaceholderText.tsx +18 -1
- package/UI/Components/Footer/Footer.tsx +9 -7
- package/UI/Components/Header/Header.tsx +4 -3
- package/UI/Components/Header/HeaderIconDropdownButton.tsx +13 -11
- package/UI/Components/Header/IconDropdown/IconDropdownItem.tsx +3 -3
- package/UI/Components/Header/IconDropdown/IconDropdownMenu.tsx +1 -1
- package/UI/Components/Header/ProjectPicker/CreateNewProjectButton.tsx +4 -4
- package/UI/Components/Header/ProjectPicker/ProjectPicker.tsx +6 -6
- package/UI/Components/Header/ProjectPicker/ProjectPickerFilterBox.tsx +3 -3
- package/UI/Components/Header/ProjectPicker/ProjectPickerMenu.tsx +1 -1
- package/UI/Components/Header/ProjectPicker/ProjectPickerMenuItem.tsx +4 -4
- package/UI/Components/HeaderAlert/HeaderAlert.tsx +32 -32
- package/UI/Components/HeaderAlert/HeaderAlertGroup.tsx +1 -7
- package/UI/Components/HiddenText/HiddenText.tsx +98 -27
- package/UI/Components/Icon/Icon.tsx +12 -9
- package/UI/Components/InfoCard/InfoCard.tsx +7 -3
- package/UI/Components/ModelTable/BaseModelTable.tsx +1 -1
- package/UI/Components/ObjectID/ObjectIDView.tsx +73 -0
- package/UI/Components/Page/Page.tsx +3 -5
- package/UI/Components/SideMenu/SideMenu.tsx +175 -40
- package/UI/Components/SideMenu/SideMenuDivider.tsx +17 -0
- package/UI/Components/SideMenu/SideMenuItem.tsx +111 -158
- package/UI/Components/SideMenu/SideMenuSection.tsx +53 -3
- package/UI/Components/Table/Table.tsx +1 -1
- package/UI/Components/Types/FieldType.ts +2 -0
- package/UI/Config.ts +5 -0
- package/build/dist/Models/DatabaseModels/AIAgent.js +614 -0
- package/build/dist/Models/DatabaseModels/AIAgent.js.map +1 -0
- package/build/dist/Models/DatabaseModels/AIAgentOwnerTeam.js +452 -0
- package/build/dist/Models/DatabaseModels/AIAgentOwnerTeam.js.map +1 -0
- package/build/dist/Models/DatabaseModels/AIAgentOwnerUser.js +451 -0
- package/build/dist/Models/DatabaseModels/AIAgentOwnerUser.js.map +1 -0
- package/build/dist/Models/DatabaseModels/AIAgentTask.js +580 -0
- package/build/dist/Models/DatabaseModels/AIAgentTask.js.map +1 -0
- package/build/dist/Models/DatabaseModels/AIAgentTaskLog.js +438 -0
- package/build/dist/Models/DatabaseModels/AIAgentTaskLog.js.map +1 -0
- package/build/dist/Models/DatabaseModels/AIAgentTaskPullRequest.js +771 -0
- package/build/dist/Models/DatabaseModels/AIAgentTaskPullRequest.js.map +1 -0
- package/build/dist/Models/DatabaseModels/AIAgentTaskTelemetryException.js +404 -0
- package/build/dist/Models/DatabaseModels/AIAgentTaskTelemetryException.js.map +1 -0
- package/build/dist/Models/DatabaseModels/Index.js +14 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Monitor.js +34 -0
- package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Project.js +26 -0
- package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TelemetryException.js +1 -1
- package/build/dist/Models/DatabaseModels/TelemetryException.js.map +1 -1
- package/build/dist/Server/API/AIAgentAPI.js +141 -0
- package/build/dist/Server/API/AIAgentAPI.js.map +1 -0
- package/build/dist/Server/API/AIAgentDataAPI.js +415 -0
- package/build/dist/Server/API/AIAgentDataAPI.js.map +1 -0
- package/build/dist/Server/API/AIAgentTaskAPI.js +199 -0
- package/build/dist/Server/API/AIAgentTaskAPI.js.map +1 -0
- package/build/dist/Server/API/AIAgentTaskLogAPI.js +106 -0
- package/build/dist/Server/API/AIAgentTaskLogAPI.js.map +1 -0
- package/build/dist/Server/API/AIAgentTaskPullRequestAPI.js +9 -0
- package/build/dist/Server/API/AIAgentTaskPullRequestAPI.js.map +1 -0
- package/build/dist/Server/API/GitHubAPI.js +23 -8
- package/build/dist/Server/API/GitHubAPI.js.map +1 -1
- package/build/dist/Server/API/TelemetryExceptionAPI.js +120 -0
- package/build/dist/Server/API/TelemetryExceptionAPI.js.map +1 -0
- package/build/dist/Server/EnvironmentConfig.js +2 -0
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1766590916627-MigrationName.js +74 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1766590916627-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1766600860972-MigrationName.js +18 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1766600860972-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1766606720183-MigrationName.js +12 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1766606720183-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1766688107858-MigrationName.js +28 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1766688107858-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1766754182870-MigrationName.js +32 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1766754182870-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1766774689743-MigrationName.js +60 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1766774689743-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1766777986427-MigrationName.js +18 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1766777986427-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1766918848434-AddAIAgentIsDefault.js +16 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1766918848434-AddAIAgentIsDefault.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1766923324521-MigrationName.js +20 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1766923324521-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1766958924188-AddGitHubAppInstallationIdToProject.js +16 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1766958924188-AddGitHubAppInstallationIdToProject.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1767009661768-MigrationName.js +18 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1767009661768-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +22 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Services/AIAgentOwnerTeamService.js +9 -0
- package/build/dist/Server/Services/AIAgentOwnerTeamService.js.map +1 -0
- package/build/dist/Server/Services/AIAgentOwnerUserService.js +9 -0
- package/build/dist/Server/Services/AIAgentOwnerUserService.js.map +1 -0
- package/build/dist/Server/Services/AIAgentService.js +471 -0
- package/build/dist/Server/Services/AIAgentService.js.map +1 -0
- package/build/dist/Server/Services/AIAgentTaskLogService.js +9 -0
- package/build/dist/Server/Services/AIAgentTaskLogService.js.map +1 -0
- package/build/dist/Server/Services/AIAgentTaskPullRequestService.js +9 -0
- package/build/dist/Server/Services/AIAgentTaskPullRequestService.js.map +1 -0
- package/build/dist/Server/Services/AIAgentTaskService.js +158 -0
- package/build/dist/Server/Services/AIAgentTaskService.js.map +1 -0
- package/build/dist/Server/Services/AIAgentTaskTelemetryExceptionService.js +36 -0
- package/build/dist/Server/Services/AIAgentTaskTelemetryExceptionService.js.map +1 -0
- package/build/dist/Server/Services/Index.js +10 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/TelemetryExceptionService.js +137 -0
- package/build/dist/Server/Services/TelemetryExceptionService.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/Index.js +2 -0
- package/build/dist/Server/Types/Workflow/Components/Index.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/Telegram/SendMessageToChat.js +119 -0
- package/build/dist/Server/Types/Workflow/Components/Telegram/SendMessageToChat.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorResource.js +168 -0
- package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
- package/build/dist/Server/Utils/PushNotificationUtil.js +21 -0
- package/build/dist/Server/Utils/PushNotificationUtil.js.map +1 -1
- package/build/dist/Server/Utils/WhatsAppTemplateUtil.js +4 -0
- package/build/dist/Server/Utils/WhatsAppTemplateUtil.js.map +1 -1
- package/build/dist/Tests/UI/Components/Badge.test.js +5 -5
- package/build/dist/Tests/UI/Components/Badge.test.js.map +1 -1
- package/build/dist/Tests/UI/Components/Card.test.js +4 -8
- package/build/dist/Tests/UI/Components/Card.test.js.map +1 -1
- package/build/dist/Tests/UI/Components/HiddenText.test.js +2 -3
- package/build/dist/Tests/UI/Components/HiddenText.test.js.map +1 -1
- package/build/dist/Tests/UI/Components/SideMenuItem.test.js +3 -2
- package/build/dist/Tests/UI/Components/SideMenuItem.test.js.map +1 -1
- package/build/dist/Types/AI/AIAgentTaskMetadata.js +6 -0
- package/build/dist/Types/AI/AIAgentTaskMetadata.js.map +1 -0
- package/build/dist/Types/AI/AIAgentTaskStatus.js +51 -0
- package/build/dist/Types/AI/AIAgentTaskStatus.js.map +1 -0
- package/build/dist/Types/AI/AIAgentTaskType.js +29 -0
- package/build/dist/Types/AI/AIAgentTaskType.js.map +1 -0
- package/build/dist/Types/Email/EmailTemplateType.js +2 -0
- package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
- package/build/dist/Types/NotificationSetting/NotificationSettingEventType.js +3 -0
- package/build/dist/Types/NotificationSetting/NotificationSettingEventType.js.map +1 -1
- package/build/dist/Types/Permission.js +160 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/WhatsApp/WhatsAppTemplates.js +6 -0
- package/build/dist/Types/WhatsApp/WhatsAppTemplates.js.map +1 -1
- package/build/dist/Types/Workflow/ComponentID.js +1 -0
- package/build/dist/Types/Workflow/ComponentID.js.map +1 -1
- package/build/dist/Types/Workflow/Components/Telegram.js +69 -0
- package/build/dist/Types/Workflow/Components/Telegram.js.map +1 -0
- package/build/dist/Types/Workflow/Components.js +7 -0
- package/build/dist/Types/Workflow/Components.js.map +1 -1
- package/build/dist/UI/Components/AIAgent/AIAgent.js +32 -0
- package/build/dist/UI/Components/AIAgent/AIAgent.js.map +1 -0
- package/build/dist/UI/Components/Badge/Badge.js +9 -5
- package/build/dist/UI/Components/Badge/Badge.js.map +1 -1
- package/build/dist/UI/Components/Banner/Banner.js +1 -1
- package/build/dist/UI/Components/Banner/Banner.js.map +1 -1
- package/build/dist/UI/Components/Card/Card.js +12 -12
- package/build/dist/UI/Components/Card/Card.js.map +1 -1
- package/build/dist/UI/Components/CodeBlock/CodeBlock.js +22 -2
- package/build/dist/UI/Components/CodeBlock/CodeBlock.js.map +1 -1
- package/build/dist/UI/Components/Detail/Detail.js +117 -37
- package/build/dist/UI/Components/Detail/Detail.js.map +1 -1
- package/build/dist/UI/Components/Detail/FieldLabel.js +12 -7
- package/build/dist/UI/Components/Detail/FieldLabel.js.map +1 -1
- package/build/dist/UI/Components/Detail/PlaceholderText.js +4 -1
- package/build/dist/UI/Components/Detail/PlaceholderText.js.map +1 -1
- package/build/dist/UI/Components/Footer/Footer.js +6 -6
- package/build/dist/UI/Components/Footer/Footer.js.map +1 -1
- package/build/dist/UI/Components/Header/Header.js +4 -3
- package/build/dist/UI/Components/Header/Header.js.map +1 -1
- package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js +7 -7
- package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js.map +1 -1
- package/build/dist/UI/Components/Header/IconDropdown/IconDropdownItem.js +3 -3
- package/build/dist/UI/Components/Header/IconDropdown/IconDropdownItem.js.map +1 -1
- package/build/dist/UI/Components/Header/IconDropdown/IconDropdownMenu.js +1 -1
- package/build/dist/UI/Components/Header/IconDropdown/IconDropdownMenu.js.map +1 -1
- package/build/dist/UI/Components/Header/ProjectPicker/CreateNewProjectButton.js +4 -4
- package/build/dist/UI/Components/Header/ProjectPicker/CreateNewProjectButton.js.map +1 -1
- package/build/dist/UI/Components/Header/ProjectPicker/ProjectPicker.js +6 -6
- package/build/dist/UI/Components/Header/ProjectPicker/ProjectPicker.js.map +1 -1
- package/build/dist/UI/Components/Header/ProjectPicker/ProjectPickerFilterBox.js +2 -2
- package/build/dist/UI/Components/Header/ProjectPicker/ProjectPickerFilterBox.js.map +1 -1
- package/build/dist/UI/Components/Header/ProjectPicker/ProjectPickerMenu.js +1 -1
- package/build/dist/UI/Components/Header/ProjectPicker/ProjectPickerMenu.js.map +1 -1
- package/build/dist/UI/Components/Header/ProjectPicker/ProjectPickerMenuItem.js +4 -4
- package/build/dist/UI/Components/Header/ProjectPicker/ProjectPickerMenuItem.js.map +1 -1
- package/build/dist/UI/Components/HeaderAlert/HeaderAlert.js +31 -29
- package/build/dist/UI/Components/HeaderAlert/HeaderAlert.js.map +1 -1
- package/build/dist/UI/Components/HeaderAlert/HeaderAlertGroup.js +1 -3
- package/build/dist/UI/Components/HeaderAlert/HeaderAlertGroup.js.map +1 -1
- package/build/dist/UI/Components/HiddenText/HiddenText.js +33 -14
- package/build/dist/UI/Components/HiddenText/HiddenText.js.map +1 -1
- package/build/dist/UI/Components/Icon/Icon.js +3 -4
- package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
- package/build/dist/UI/Components/InfoCard/InfoCard.js +3 -3
- package/build/dist/UI/Components/InfoCard/InfoCard.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/ObjectID/ObjectIDView.js +30 -0
- package/build/dist/UI/Components/ObjectID/ObjectIDView.js.map +1 -0
- package/build/dist/UI/Components/Page/Page.js +3 -3
- package/build/dist/UI/Components/Page/Page.js.map +1 -1
- package/build/dist/UI/Components/SideMenu/SideMenu.js +82 -17
- package/build/dist/UI/Components/SideMenu/SideMenu.js.map +1 -1
- package/build/dist/UI/Components/SideMenu/SideMenuDivider.js +7 -0
- package/build/dist/UI/Components/SideMenu/SideMenuDivider.js.map +1 -0
- package/build/dist/UI/Components/SideMenu/SideMenuItem.js +68 -97
- package/build/dist/UI/Components/SideMenu/SideMenuItem.js.map +1 -1
- package/build/dist/UI/Components/SideMenu/SideMenuSection.js +18 -3
- package/build/dist/UI/Components/SideMenu/SideMenuSection.js.map +1 -1
- package/build/dist/UI/Components/Table/Table.js +1 -1
- package/build/dist/UI/Components/Table/Table.js.map +1 -1
- package/build/dist/UI/Components/Types/FieldType.js +2 -0
- package/build/dist/UI/Components/Types/FieldType.js.map +1 -1
- package/build/dist/UI/Config.js +2 -0
- package/build/dist/UI/Config.js.map +1 -1
- package/package.json +1 -1
|
@@ -40,6 +40,17 @@ import CaptureSpan from "../Telemetry/CaptureSpan";
|
|
|
40
40
|
import ExceptionMessages from "../../../Types/Exception/ExceptionMessages";
|
|
41
41
|
import MonitorEvaluationSummary from "../../../Types/Monitor/MonitorEvaluationSummary";
|
|
42
42
|
import MonitorStatusService from "../../Services/MonitorStatusService";
|
|
43
|
+
import { ProbeConnectionStatus } from "../../../Models/DatabaseModels/Probe";
|
|
44
|
+
import { LIMIT_PER_PROJECT } from "../../../Types/Database/LimitMax";
|
|
45
|
+
|
|
46
|
+
interface ProbeAgreementResult {
|
|
47
|
+
hasAgreement: boolean;
|
|
48
|
+
agreementCount: number;
|
|
49
|
+
requiredCount: number;
|
|
50
|
+
totalActiveProbes: number;
|
|
51
|
+
agreedCriteriaId: string | null;
|
|
52
|
+
agreedRootCause: string | null;
|
|
53
|
+
}
|
|
43
54
|
|
|
44
55
|
export default class MonitorResourceUtil {
|
|
45
56
|
@CaptureSpan()
|
|
@@ -125,6 +136,7 @@ export default class MonitorResourceUtil {
|
|
|
125
136
|
currentMonitorStatusId: true,
|
|
126
137
|
_id: true,
|
|
127
138
|
name: true,
|
|
139
|
+
minimumProbeAgreement: true,
|
|
128
140
|
},
|
|
129
141
|
props: {
|
|
130
142
|
isRoot: true,
|
|
@@ -500,6 +512,62 @@ export default class MonitorResourceUtil {
|
|
|
500
512
|
evaluationSummary: evaluationSummary,
|
|
501
513
|
});
|
|
502
514
|
|
|
515
|
+
// Check probe agreement for probe-based monitors
|
|
516
|
+
if (
|
|
517
|
+
monitor.monitorType &&
|
|
518
|
+
MonitorTypeHelper.isProbableMonitor(monitor.monitorType)
|
|
519
|
+
) {
|
|
520
|
+
const probeAgreementResult: ProbeAgreementResult =
|
|
521
|
+
await MonitorResourceUtil.checkProbeAgreement({
|
|
522
|
+
monitor: monitor,
|
|
523
|
+
monitorStep: monitorStep,
|
|
524
|
+
currentCriteriaMetId: response.criteriaMetId || null,
|
|
525
|
+
currentRootCause: response.rootCause || null,
|
|
526
|
+
});
|
|
527
|
+
|
|
528
|
+
// Add probe agreement event to evaluation summary
|
|
529
|
+
evaluationSummary.events.push({
|
|
530
|
+
type: "probe-agreement",
|
|
531
|
+
title: "Probe Agreement Check",
|
|
532
|
+
message: probeAgreementResult.hasAgreement
|
|
533
|
+
? `Probe agreement reached: ${probeAgreementResult.agreementCount}/${probeAgreementResult.requiredCount} probes agree (${probeAgreementResult.totalActiveProbes} active probes total).`
|
|
534
|
+
: `Probe agreement not reached: ${probeAgreementResult.agreementCount}/${probeAgreementResult.requiredCount} probes agree (${probeAgreementResult.totalActiveProbes} active probes total). Skipping status change.`,
|
|
535
|
+
at: OneUptimeDate.getCurrentDate(),
|
|
536
|
+
});
|
|
537
|
+
|
|
538
|
+
if (!probeAgreementResult.hasAgreement) {
|
|
539
|
+
logger.debug(
|
|
540
|
+
`${dataToProcess.monitorId.toString()} - Probe agreement not met. ${probeAgreementResult.agreementCount}/${probeAgreementResult.requiredCount} probes agree. Skipping status change.`,
|
|
541
|
+
);
|
|
542
|
+
|
|
543
|
+
// Release lock and return early - no status change
|
|
544
|
+
if (mutex) {
|
|
545
|
+
try {
|
|
546
|
+
await Semaphore.release(mutex);
|
|
547
|
+
} catch (err) {
|
|
548
|
+
logger.error(err);
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
await persistLatestMonitorPayload();
|
|
553
|
+
|
|
554
|
+
MonitorLogUtil.saveMonitorLog({
|
|
555
|
+
monitorId: monitor.id!,
|
|
556
|
+
projectId: monitor.projectId!,
|
|
557
|
+
dataToProcess: dataToProcess,
|
|
558
|
+
});
|
|
559
|
+
|
|
560
|
+
response.evaluationSummary = evaluationSummary;
|
|
561
|
+
return response;
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
// Use the agreed criteria result
|
|
565
|
+
response.criteriaMetId = probeAgreementResult.agreedCriteriaId
|
|
566
|
+
? probeAgreementResult.agreedCriteriaId
|
|
567
|
+
: undefined;
|
|
568
|
+
response.rootCause = probeAgreementResult.agreedRootCause;
|
|
569
|
+
}
|
|
570
|
+
|
|
503
571
|
if (response.criteriaMetId && response.rootCause) {
|
|
504
572
|
logger.debug(
|
|
505
573
|
`${dataToProcess.monitorId.toString()} - Criteria met: ${
|
|
@@ -735,4 +803,164 @@ export default class MonitorResourceUtil {
|
|
|
735
803
|
|
|
736
804
|
return response;
|
|
737
805
|
}
|
|
806
|
+
|
|
807
|
+
@CaptureSpan()
|
|
808
|
+
private static async checkProbeAgreement(input: {
|
|
809
|
+
monitor: Monitor;
|
|
810
|
+
monitorStep: MonitorStep;
|
|
811
|
+
currentCriteriaMetId: string | null;
|
|
812
|
+
currentRootCause: string | null;
|
|
813
|
+
}): Promise<ProbeAgreementResult> {
|
|
814
|
+
const { monitor, monitorStep, currentCriteriaMetId, currentRootCause } =
|
|
815
|
+
input;
|
|
816
|
+
|
|
817
|
+
/*
|
|
818
|
+
* If minimumProbeAgreement is not set, all probes must agree
|
|
819
|
+
* Get all MonitorProbes for this monitor with their probe connection status
|
|
820
|
+
*/
|
|
821
|
+
const monitorProbes: Array<MonitorProbe> = await MonitorProbeService.findBy(
|
|
822
|
+
{
|
|
823
|
+
query: {
|
|
824
|
+
monitorId: monitor.id!,
|
|
825
|
+
},
|
|
826
|
+
select: {
|
|
827
|
+
probeId: true,
|
|
828
|
+
isEnabled: true,
|
|
829
|
+
lastMonitoringLog: true,
|
|
830
|
+
probe: {
|
|
831
|
+
connectionStatus: true,
|
|
832
|
+
},
|
|
833
|
+
},
|
|
834
|
+
limit: LIMIT_PER_PROJECT,
|
|
835
|
+
skip: 0,
|
|
836
|
+
props: {
|
|
837
|
+
isRoot: true,
|
|
838
|
+
},
|
|
839
|
+
},
|
|
840
|
+
);
|
|
841
|
+
|
|
842
|
+
// Filter to only active probes (enabled AND connected)
|
|
843
|
+
const activeProbes: Array<MonitorProbe> = monitorProbes.filter(
|
|
844
|
+
(mp: MonitorProbe) => {
|
|
845
|
+
return (
|
|
846
|
+
mp.isEnabled &&
|
|
847
|
+
mp.probe?.connectionStatus === ProbeConnectionStatus.Connected
|
|
848
|
+
);
|
|
849
|
+
},
|
|
850
|
+
);
|
|
851
|
+
|
|
852
|
+
// If no active probes, treat as agreement met (nothing to compare)
|
|
853
|
+
if (activeProbes.length === 0) {
|
|
854
|
+
logger.debug(
|
|
855
|
+
`${monitor.id?.toString()} - No active probes found. Treating as agreement met.`,
|
|
856
|
+
);
|
|
857
|
+
return {
|
|
858
|
+
hasAgreement: true,
|
|
859
|
+
agreementCount: 0,
|
|
860
|
+
requiredCount: 0,
|
|
861
|
+
totalActiveProbes: 0,
|
|
862
|
+
agreedCriteriaId: currentCriteriaMetId,
|
|
863
|
+
agreedRootCause: currentRootCause,
|
|
864
|
+
};
|
|
865
|
+
}
|
|
866
|
+
|
|
867
|
+
// Determine required count for agreement
|
|
868
|
+
const requiredCount: number =
|
|
869
|
+
monitor.minimumProbeAgreement ?? activeProbes.length;
|
|
870
|
+
// Effective threshold cannot exceed number of active probes
|
|
871
|
+
const effectiveThreshold: number = Math.min(
|
|
872
|
+
requiredCount,
|
|
873
|
+
activeProbes.length,
|
|
874
|
+
);
|
|
875
|
+
|
|
876
|
+
/*
|
|
877
|
+
* Count how many probes agree on each criteria result
|
|
878
|
+
* Key: criteriaId or "none" for no criteria met
|
|
879
|
+
* Value: { count, rootCause }
|
|
880
|
+
*/
|
|
881
|
+
const criteriaAgreements: Map<
|
|
882
|
+
string,
|
|
883
|
+
{ count: number; rootCause: string | null }
|
|
884
|
+
> = new Map();
|
|
885
|
+
|
|
886
|
+
const stepId: string = monitorStep.id.toString();
|
|
887
|
+
|
|
888
|
+
for (const monitorProbe of activeProbes) {
|
|
889
|
+
const probeResponse: ProbeMonitorResponse | undefined =
|
|
890
|
+
monitorProbe.lastMonitoringLog?.[stepId];
|
|
891
|
+
|
|
892
|
+
if (!probeResponse) {
|
|
893
|
+
// No response yet for this step from this probe - skip
|
|
894
|
+
logger.debug(
|
|
895
|
+
`${monitor.id?.toString()} - Probe ${monitorProbe.probeId?.toString()} has no response for step ${stepId}. Skipping.`,
|
|
896
|
+
);
|
|
897
|
+
continue;
|
|
898
|
+
}
|
|
899
|
+
|
|
900
|
+
// Evaluate this probe's response against criteria
|
|
901
|
+
const tempResponse: ProbeApiIngestResponse = {
|
|
902
|
+
monitorId: monitor.id!,
|
|
903
|
+
criteriaMetId: undefined,
|
|
904
|
+
rootCause: null,
|
|
905
|
+
};
|
|
906
|
+
|
|
907
|
+
const tempEvaluationSummary: MonitorEvaluationSummary = {
|
|
908
|
+
evaluatedAt: OneUptimeDate.getCurrentDate(),
|
|
909
|
+
criteriaResults: [],
|
|
910
|
+
events: [],
|
|
911
|
+
};
|
|
912
|
+
|
|
913
|
+
const evaluatedResponse: ProbeApiIngestResponse =
|
|
914
|
+
await MonitorCriteriaEvaluator.processMonitorStep({
|
|
915
|
+
dataToProcess: probeResponse as DataToProcess,
|
|
916
|
+
monitorStep: monitorStep,
|
|
917
|
+
monitor: monitor,
|
|
918
|
+
probeApiIngestResponse: tempResponse,
|
|
919
|
+
evaluationSummary: tempEvaluationSummary,
|
|
920
|
+
});
|
|
921
|
+
|
|
922
|
+
// Record the result
|
|
923
|
+
const criteriaKey: string = evaluatedResponse.criteriaMetId || "none";
|
|
924
|
+
const existing: { count: number; rootCause: string | null } | undefined =
|
|
925
|
+
criteriaAgreements.get(criteriaKey);
|
|
926
|
+
|
|
927
|
+
if (existing) {
|
|
928
|
+
existing.count += 1;
|
|
929
|
+
} else {
|
|
930
|
+
criteriaAgreements.set(criteriaKey, {
|
|
931
|
+
count: 1,
|
|
932
|
+
rootCause: evaluatedResponse.rootCause,
|
|
933
|
+
});
|
|
934
|
+
}
|
|
935
|
+
}
|
|
936
|
+
|
|
937
|
+
// Find the criteria with the most agreement
|
|
938
|
+
let maxCount: number = 0;
|
|
939
|
+
let winningCriteriaId: string | null = null;
|
|
940
|
+
let winningRootCause: string | null = null;
|
|
941
|
+
|
|
942
|
+
for (const [criteriaId, data] of criteriaAgreements) {
|
|
943
|
+
if (data.count > maxCount) {
|
|
944
|
+
maxCount = data.count;
|
|
945
|
+
winningCriteriaId = criteriaId === "none" ? null : criteriaId;
|
|
946
|
+
winningRootCause = data.rootCause;
|
|
947
|
+
}
|
|
948
|
+
}
|
|
949
|
+
|
|
950
|
+
// Check if the winning criteria has reached the agreement threshold
|
|
951
|
+
const hasAgreement: boolean = maxCount >= effectiveThreshold;
|
|
952
|
+
|
|
953
|
+
logger.debug(
|
|
954
|
+
`${monitor.id?.toString()} - Probe agreement check: ${maxCount}/${effectiveThreshold} probes agree on criteria "${winningCriteriaId || "none"}". Agreement ${hasAgreement ? "reached" : "not reached"}.`,
|
|
955
|
+
);
|
|
956
|
+
|
|
957
|
+
return {
|
|
958
|
+
hasAgreement,
|
|
959
|
+
agreementCount: maxCount,
|
|
960
|
+
requiredCount: effectiveThreshold,
|
|
961
|
+
totalActiveProbes: activeProbes.length,
|
|
962
|
+
agreedCriteriaId: hasAgreement ? winningCriteriaId : null,
|
|
963
|
+
agreedRootCause: hasAgreement ? winningRootCause : null,
|
|
964
|
+
};
|
|
965
|
+
}
|
|
738
966
|
}
|
|
@@ -327,4 +327,33 @@ export default class PushNotificationUtil {
|
|
|
327
327
|
|
|
328
328
|
return PushNotificationUtil.applyDefaults(notification);
|
|
329
329
|
}
|
|
330
|
+
|
|
331
|
+
public static createAIAgentStatusChangedNotification(params: {
|
|
332
|
+
aiAgentName: string;
|
|
333
|
+
projectName: string;
|
|
334
|
+
connectionStatus: string;
|
|
335
|
+
clickAction?: string;
|
|
336
|
+
}): PushNotificationMessage {
|
|
337
|
+
const { aiAgentName, projectName, connectionStatus, clickAction } = params;
|
|
338
|
+
const notification: Partial<PushNotificationMessage> = {
|
|
339
|
+
title: `AI Agent ${connectionStatus}: ${aiAgentName}`,
|
|
340
|
+
body: `AI Agent ${aiAgentName} is ${connectionStatus} in ${projectName}. Click to view details.`,
|
|
341
|
+
tag: "ai-agent-status-changed",
|
|
342
|
+
requireInteraction: true,
|
|
343
|
+
data: {
|
|
344
|
+
type: "ai-agent-status-changed",
|
|
345
|
+
aiAgentName: aiAgentName,
|
|
346
|
+
projectName: projectName,
|
|
347
|
+
connectionStatus: connectionStatus,
|
|
348
|
+
},
|
|
349
|
+
};
|
|
350
|
+
|
|
351
|
+
if (clickAction) {
|
|
352
|
+
notification.clickAction = clickAction;
|
|
353
|
+
notification.url = clickAction;
|
|
354
|
+
notification.data!["url"] = clickAction;
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
return PushNotificationUtil.applyDefaults(notification);
|
|
358
|
+
}
|
|
330
359
|
}
|
|
@@ -42,6 +42,8 @@ const templateDashboardLinkVariableMap: Partial<
|
|
|
42
42
|
[WhatsAppTemplateIds.StatusPageOwnerAddedNotification]: "status_page_link",
|
|
43
43
|
[WhatsAppTemplateIds.ProbeStatusChangedOwnerNotification]: "probe_link",
|
|
44
44
|
[WhatsAppTemplateIds.ProbeOwnerAddedNotification]: "probe_link",
|
|
45
|
+
[WhatsAppTemplateIds.AIAgentStatusChangedOwnerNotification]: "ai_agent_link",
|
|
46
|
+
[WhatsAppTemplateIds.AIAgentOwnerAddedNotification]: "ai_agent_link",
|
|
45
47
|
[WhatsAppTemplateIds.OnCallUserIsOnRosterNotification]: "schedule_link",
|
|
46
48
|
[WhatsAppTemplateIds.OnCallUserIsNextNotification]: "schedule_link",
|
|
47
49
|
[WhatsAppTemplateIds.OnCallUserNoLongerActiveNotification]: "schedule_link",
|
|
@@ -98,6 +100,10 @@ const templateIdByEventType: Record<
|
|
|
98
100
|
WhatsAppTemplateIds.ProbeStatusChangedOwnerNotification,
|
|
99
101
|
[NotificationSettingEventType.SEND_PROBE_OWNER_ADDED_NOTIFICATION]:
|
|
100
102
|
WhatsAppTemplateIds.ProbeOwnerAddedNotification,
|
|
103
|
+
[NotificationSettingEventType.SEND_AI_AGENT_STATUS_CHANGED_OWNER_NOTIFICATION]:
|
|
104
|
+
WhatsAppTemplateIds.AIAgentStatusChangedOwnerNotification,
|
|
105
|
+
[NotificationSettingEventType.SEND_AI_AGENT_OWNER_ADDED_NOTIFICATION]:
|
|
106
|
+
WhatsAppTemplateIds.AIAgentOwnerAddedNotification,
|
|
101
107
|
[NotificationSettingEventType.SEND_WHEN_USER_IS_ON_CALL_ROSTER]:
|
|
102
108
|
WhatsAppTemplateIds.OnCallUserIsOnRosterNotification,
|
|
103
109
|
[NotificationSettingEventType.SEND_WHEN_USER_IS_NEXT_ON_CALL_ROSTER]:
|
|
@@ -15,27 +15,27 @@ describe("Badge", () => {
|
|
|
15
15
|
const badge: HTMLElement = screen.getByTestId("badge");
|
|
16
16
|
expect(badge).toBeInTheDocument();
|
|
17
17
|
const testId: HTMLElement = screen.getByText(1);
|
|
18
|
-
expect(testId).toHaveClass("text-emerald-
|
|
18
|
+
expect(testId).toHaveClass("text-emerald-700");
|
|
19
19
|
});
|
|
20
20
|
test("it should show success when badgetype is equal to success", () => {
|
|
21
21
|
render(<Badge badgeCount={1} badgeType={BadgeType.SUCCESS} />);
|
|
22
22
|
const testId: HTMLElement = screen.getByText(1);
|
|
23
|
-
expect(testId).toHaveClass("text-emerald-
|
|
23
|
+
expect(testId).toHaveClass("text-emerald-700");
|
|
24
24
|
});
|
|
25
25
|
test("it should show danger when badgetype is equal to danger", () => {
|
|
26
26
|
render(<Badge badgeCount={1} badgeType={BadgeType.DANGER} />);
|
|
27
27
|
const testId: HTMLElement = screen.getByText(1);
|
|
28
|
-
expect(testId).toHaveClass("text-red-
|
|
28
|
+
expect(testId).toHaveClass("text-red-700");
|
|
29
29
|
});
|
|
30
30
|
test("it should show warning when badgetype is equal to warning", () => {
|
|
31
31
|
render(<Badge badgeCount={1} badgeType={BadgeType.WARNING} />);
|
|
32
32
|
const testId: HTMLElement = screen.getByText(1);
|
|
33
|
-
expect(testId).toHaveClass("text-
|
|
33
|
+
expect(testId).toHaveClass("text-amber-700");
|
|
34
34
|
});
|
|
35
35
|
test("it should show danger when badgetype is equal to danger", () => {
|
|
36
36
|
render(<Badge badgeCount={1} badgeType={BadgeType.DANGER} />);
|
|
37
37
|
const testId: HTMLElement = screen.getByText(1);
|
|
38
|
-
expect(testId).toHaveClass("text-red-
|
|
38
|
+
expect(testId).toHaveClass("text-red-700");
|
|
39
39
|
});
|
|
40
40
|
test("it should badgeCount when badgetype is equal to success", () => {
|
|
41
41
|
render(<Badge badgeCount={2} badgeType={BadgeType.SUCCESS} />);
|
|
@@ -28,7 +28,7 @@ describe("Card", () => {
|
|
|
28
28
|
|
|
29
29
|
const title: HTMLElement = screen.getByText(props.title as string);
|
|
30
30
|
expect(title).toBeInTheDocument();
|
|
31
|
-
expect(title).toHaveClass("text-lg font-
|
|
31
|
+
expect(title).toHaveClass("text-lg font-semibold leading-6 text-gray-900");
|
|
32
32
|
});
|
|
33
33
|
|
|
34
34
|
test("should display card description", () => {
|
|
@@ -38,7 +38,7 @@ describe("Card", () => {
|
|
|
38
38
|
props.description as string,
|
|
39
39
|
);
|
|
40
40
|
expect(description).toBeInTheDocument();
|
|
41
|
-
expect(description).toHaveClass("mt-1 text-sm text-gray-500");
|
|
41
|
+
expect(description).toHaveClass("mt-1.5 text-sm text-gray-500");
|
|
42
42
|
});
|
|
43
43
|
|
|
44
44
|
test("should render rightElement passed in the props", () => {
|
|
@@ -76,14 +76,10 @@ describe("Card", () => {
|
|
|
76
76
|
expect(button1).toBeInTheDocument();
|
|
77
77
|
expect(button1).toHaveClass(buttons[0]?.className ?? "");
|
|
78
78
|
expect(buttons[0]?.onClick).toHaveBeenCalled();
|
|
79
|
-
// First button should have first:md:ml-0 class
|
|
80
|
-
expect(button1.parentElement).toHaveClass("first:md:ml-0");
|
|
81
79
|
|
|
82
80
|
const button2: HTMLElement = screen.getByText(buttons[1]?.title ?? "");
|
|
83
81
|
expect(button2).toBeInTheDocument();
|
|
84
82
|
expect(button2).toBeDisabled();
|
|
85
|
-
// Second button should have md:ml-2 class
|
|
86
|
-
expect(button2.parentElement).toHaveClass("md:ml-2");
|
|
87
83
|
});
|
|
88
84
|
|
|
89
85
|
test("should render component children passed in the props and their parent element should have bodyClassName value passed in the props as css class", () => {
|
|
@@ -99,7 +95,7 @@ describe("Card", () => {
|
|
|
99
95
|
expect(childComponent.parentElement).toHaveClass(bodyClassName);
|
|
100
96
|
});
|
|
101
97
|
|
|
102
|
-
test("should render component children passed in the props and their parent element have css class 'mt-
|
|
98
|
+
test("should render component children passed in the props and their parent element have css class 'mt-4'", () => {
|
|
103
99
|
const childElementText: string = "child element";
|
|
104
100
|
const childElement: ReactElement = <div key={0}>{childElementText}</div>;
|
|
105
101
|
|
|
@@ -108,6 +104,6 @@ describe("Card", () => {
|
|
|
108
104
|
const childComponent: HTMLElement = screen.getByText(childElementText);
|
|
109
105
|
|
|
110
106
|
expect(childComponent).toBeInTheDocument();
|
|
111
|
-
expect(childComponent.parentElement).toHaveClass("mt-
|
|
107
|
+
expect(childComponent.parentElement).toHaveClass("mt-4");
|
|
112
108
|
});
|
|
113
109
|
});
|
|
@@ -54,10 +54,7 @@ describe("tests for HiddenText component", () => {
|
|
|
54
54
|
const copy: HTMLElement = screen.getByTestId("copy-to-clipboard-icon");
|
|
55
55
|
fireEvent.click(copy);
|
|
56
56
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
"Copied to Clipboard",
|
|
60
|
-
);
|
|
61
|
-
});
|
|
57
|
+
// Verify the copy icon is still present after clicking
|
|
58
|
+
expect(screen.getByTestId("copy-to-clipboard-icon")).toBeTruthy();
|
|
62
59
|
});
|
|
63
60
|
});
|
|
@@ -15,7 +15,9 @@ import React from "react";
|
|
|
15
15
|
import getJestMockFunction from "../../../Tests/MockType";
|
|
16
16
|
|
|
17
17
|
const highlightClassList: string =
|
|
18
|
-
"bg-
|
|
18
|
+
"bg-gradient-to-r from-indigo-50 to-indigo-50/50 text-indigo-700 shadow-sm";
|
|
19
|
+
|
|
20
|
+
const subItemHighlightClassList: string = "bg-indigo-50/70 text-indigo-700";
|
|
19
21
|
|
|
20
22
|
jest.mock("../../../UI/Utils/Navigation.ts", () => {
|
|
21
23
|
return {
|
|
@@ -148,6 +150,6 @@ describe("Side Menu Item", () => {
|
|
|
148
150
|
const subLinkElement: HTMLAnchorElement | null = screen
|
|
149
151
|
.getByText(subLink.title)
|
|
150
152
|
.closest("a");
|
|
151
|
-
expect(subLinkElement).toHaveClass(
|
|
153
|
+
expect(subLinkElement).toHaveClass(subItemHighlightClassList);
|
|
152
154
|
});
|
|
153
155
|
});
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import AIAgentTaskType from "./AIAgentTaskType";
|
|
2
|
+
|
|
3
|
+
// Base interface for all task metadata
|
|
4
|
+
export interface AIAgentTaskMetadataBase {
|
|
5
|
+
taskType: AIAgentTaskType;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
// Metadata for FixException task type
|
|
9
|
+
export interface FixExceptionTaskMetadata extends AIAgentTaskMetadataBase {
|
|
10
|
+
taskType: AIAgentTaskType.FixException;
|
|
11
|
+
exceptionId: string;
|
|
12
|
+
telemetryServiceId?: string;
|
|
13
|
+
stackTrace?: string;
|
|
14
|
+
errorMessage?: string;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// Union type for all task metadata types
|
|
18
|
+
export type AIAgentTaskMetadata = FixExceptionTaskMetadata; // More tasks can be added here in the future
|
|
19
|
+
|
|
20
|
+
// Type guard functions
|
|
21
|
+
export function isFixExceptionMetadata(
|
|
22
|
+
metadata: AIAgentTaskMetadata,
|
|
23
|
+
): metadata is FixExceptionTaskMetadata {
|
|
24
|
+
return metadata.taskType === AIAgentTaskType.FixException;
|
|
25
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
enum AIAgentTaskStatus {
|
|
2
|
+
Scheduled = "Scheduled",
|
|
3
|
+
InProgress = "InProgress",
|
|
4
|
+
Completed = "Completed",
|
|
5
|
+
Error = "Error",
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export default AIAgentTaskStatus;
|
|
9
|
+
|
|
10
|
+
export interface AIAgentTaskStatusProps {
|
|
11
|
+
status: AIAgentTaskStatus;
|
|
12
|
+
title: string;
|
|
13
|
+
description: string;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export class AIAgentTaskStatusHelper {
|
|
17
|
+
public static getAllStatusProps(): Array<AIAgentTaskStatusProps> {
|
|
18
|
+
return [
|
|
19
|
+
{
|
|
20
|
+
status: AIAgentTaskStatus.Scheduled,
|
|
21
|
+
title: "Scheduled",
|
|
22
|
+
description:
|
|
23
|
+
"Task is scheduled and waiting to be picked up by an agent.",
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
status: AIAgentTaskStatus.InProgress,
|
|
27
|
+
title: "In Progress",
|
|
28
|
+
description: "Task is currently being processed by an AI agent.",
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
status: AIAgentTaskStatus.Completed,
|
|
32
|
+
title: "Completed",
|
|
33
|
+
description: "Task has been completed successfully.",
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
status: AIAgentTaskStatus.Error,
|
|
37
|
+
title: "Error",
|
|
38
|
+
description: "Task encountered an error during execution.",
|
|
39
|
+
},
|
|
40
|
+
];
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
public static getDescription(status: AIAgentTaskStatus): string {
|
|
44
|
+
const props: AIAgentTaskStatusProps | undefined =
|
|
45
|
+
this.getAllStatusProps().find((p: AIAgentTaskStatusProps) => {
|
|
46
|
+
return p.status === status;
|
|
47
|
+
});
|
|
48
|
+
return props?.description || "";
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
public static getTitle(status: AIAgentTaskStatus): string {
|
|
52
|
+
const props: AIAgentTaskStatusProps | undefined =
|
|
53
|
+
this.getAllStatusProps().find((p: AIAgentTaskStatusProps) => {
|
|
54
|
+
return p.status === status;
|
|
55
|
+
});
|
|
56
|
+
return props?.title || "";
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
public static isTerminalStatus(status: AIAgentTaskStatus): boolean {
|
|
60
|
+
return (
|
|
61
|
+
status === AIAgentTaskStatus.Completed ||
|
|
62
|
+
status === AIAgentTaskStatus.Error
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
enum AIAgentTaskType {
|
|
2
|
+
FixException = "FixException",
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
export default AIAgentTaskType;
|
|
6
|
+
|
|
7
|
+
export interface AIAgentTaskTypeProps {
|
|
8
|
+
taskType: AIAgentTaskType;
|
|
9
|
+
title: string;
|
|
10
|
+
description: string;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export class AIAgentTaskTypeHelper {
|
|
14
|
+
public static getAllTaskTypeProps(): Array<AIAgentTaskTypeProps> {
|
|
15
|
+
return [
|
|
16
|
+
{
|
|
17
|
+
taskType: AIAgentTaskType.FixException,
|
|
18
|
+
title: "Fix Exception",
|
|
19
|
+
description:
|
|
20
|
+
"Analyze and fix an exception that occurred in your application.",
|
|
21
|
+
},
|
|
22
|
+
];
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
public static getDescription(taskType: AIAgentTaskType): string {
|
|
26
|
+
const props: AIAgentTaskTypeProps | undefined =
|
|
27
|
+
this.getAllTaskTypeProps().find((p: AIAgentTaskTypeProps) => {
|
|
28
|
+
return p.taskType === taskType;
|
|
29
|
+
});
|
|
30
|
+
return props?.description || "";
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
public static getTitle(taskType: AIAgentTaskType): string {
|
|
34
|
+
const props: AIAgentTaskTypeProps | undefined =
|
|
35
|
+
this.getAllTaskTypeProps().find((p: AIAgentTaskTypeProps) => {
|
|
36
|
+
return p.taskType === taskType;
|
|
37
|
+
});
|
|
38
|
+
return props?.title || "";
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -4,6 +4,8 @@ enum EmailTemplateType {
|
|
|
4
4
|
ProbeOffline = "ProbeOffline.hbs",
|
|
5
5
|
SignupWelcomeEmail = "SignupWelcomeEmail.hbs",
|
|
6
6
|
ProbeConnectionStatusChange = "ProbeConnectionStatusChange.hbs",
|
|
7
|
+
AIAgentConnectionStatusChange = "AIAgentConnectionStatusChange.hbs",
|
|
8
|
+
AIAgentOwnerAdded = "AIAgentOwnerAdded.hbs",
|
|
7
9
|
ConfirmStatusPageSubscription = "ConfirmStatusPageSubscription.hbs",
|
|
8
10
|
EmailVerified = "EmailVerified.hbs",
|
|
9
11
|
PasswordChanged = "PasswordChanged.hbs",
|
|
@@ -10,7 +10,8 @@ export type MonitorEvaluationEventType =
|
|
|
10
10
|
| "alert-created"
|
|
11
11
|
| "alert-resolved"
|
|
12
12
|
| "alert-skipped"
|
|
13
|
-
| "monitor-status-changed"
|
|
13
|
+
| "monitor-status-changed"
|
|
14
|
+
| "probe-agreement";
|
|
14
15
|
|
|
15
16
|
export interface MonitorEvaluationFilterResult {
|
|
16
17
|
checkOn: CheckOn;
|
|
@@ -34,6 +34,10 @@ enum NotificationSettingEventType {
|
|
|
34
34
|
SEND_PROBE_STATUS_CHANGED_OWNER_NOTIFICATION = "Send probe status changed notification when I am the owner of the probe",
|
|
35
35
|
SEND_PROBE_OWNER_ADDED_NOTIFICATION = "Send notification when I am added as a owner to the probe",
|
|
36
36
|
|
|
37
|
+
// AI Agent Status change Notification
|
|
38
|
+
SEND_AI_AGENT_STATUS_CHANGED_OWNER_NOTIFICATION = "Send AI agent status changed notification when I am the owner of the AI agent",
|
|
39
|
+
SEND_AI_AGENT_OWNER_ADDED_NOTIFICATION = "Send notification when I am added as a owner to the AI agent",
|
|
40
|
+
|
|
37
41
|
// On Call Notifications
|
|
38
42
|
SEND_WHEN_USER_IS_ON_CALL_ROSTER = "When user is on-call roster",
|
|
39
43
|
SEND_WHEN_USER_IS_NEXT_ON_CALL_ROSTER = "When user is next on-call roster",
|