@oneuptime/common 11.3.25 → 11.3.28

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.
Files changed (397) hide show
  1. package/Models/DatabaseModels/AIConversation.ts +322 -0
  2. package/Models/DatabaseModels/AIConversationMessage.ts +495 -0
  3. package/Models/DatabaseModels/AIRun.ts +584 -0
  4. package/Models/DatabaseModels/AIRunEvent.ts +443 -0
  5. package/Models/DatabaseModels/IncidentEpisodeRoleMember.ts +1 -1
  6. package/Models/DatabaseModels/IncidentMember.ts +1 -1
  7. package/Models/DatabaseModels/IncomingCallPolicy.ts +13 -0
  8. package/Models/DatabaseModels/Index.ts +11 -0
  9. package/Models/DatabaseModels/LlmLog.ts +26 -0
  10. package/Models/DatabaseModels/LlmProvider.ts +2 -2
  11. package/Models/DatabaseModels/MigrationFailure.ts +170 -0
  12. package/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.ts +51 -2
  13. package/Models/DatabaseModels/OnCallDutyPolicySchedule.ts +44 -0
  14. package/Models/DatabaseModels/OnCallDutyPolicyScheduleLayer.ts +6 -0
  15. package/Models/DatabaseModels/OnCallDutyPolicyScheduleLayerUser.ts +6 -0
  16. package/Models/DatabaseModels/OnCallDutyPolicyTimeLog.ts +1 -1
  17. package/Models/DatabaseModels/OnCallDutyPolicyUserOverride.ts +2 -2
  18. package/Server/API/AIChatAPI.ts +693 -0
  19. package/Server/API/AlertAPI.ts +1 -1
  20. package/Server/API/IncidentAPI.ts +2 -2
  21. package/Server/API/IncidentEpisodeAPI.ts +1 -1
  22. package/Server/API/LlmProviderAPI.ts +170 -0
  23. package/Server/API/MicrosoftTeamsAPI.ts +5 -0
  24. package/Server/API/ScheduledMaintenanceAPI.ts +1 -1
  25. package/Server/API/SlackAPI.ts +663 -0
  26. package/Server/Infrastructure/Postgres/SchemaMigrations/1783363279075-AddAIChatModels.ts +245 -0
  27. package/Server/Infrastructure/Postgres/SchemaMigrations/1783443471795-AddLlmProviderToAIConversation.ts +36 -0
  28. package/Server/Infrastructure/Postgres/SchemaMigrations/1783453297388-AddAIChatWriteActionsAndWidgets.ts +46 -0
  29. package/Server/Infrastructure/Postgres/SchemaMigrations/1783461767405-MigrationName.ts +119 -0
  30. package/Server/Infrastructure/Postgres/SchemaMigrations/1783470000000-AddIncomingCallPolicyRoutingPhoneNumberUnique.ts +25 -0
  31. package/Server/Infrastructure/Postgres/SchemaMigrations/1783510935686-FixNotNullForeignKeysOnDelete.ts +81 -0
  32. package/Server/Infrastructure/Postgres/SchemaMigrations/1783515836148-MigrationName.ts +25 -0
  33. package/Server/Infrastructure/Postgres/SchemaMigrations/1783523076215-AddMigrationFailureTable.ts +35 -0
  34. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +16 -0
  35. package/Server/Infrastructure/PostgresDatabase.ts +11 -0
  36. package/Server/Services/AIConversationMessageService.ts +39 -0
  37. package/Server/Services/AIConversationService.ts +63 -0
  38. package/Server/Services/AIRunEventService.ts +39 -0
  39. package/Server/Services/AIRunService.ts +39 -0
  40. package/Server/Services/AIService.ts +127 -33
  41. package/Server/Services/AnalyticsDatabaseService.ts +10 -1
  42. package/Server/Services/DatabaseService.ts +29 -1
  43. package/Server/Services/IncidentService.ts +1 -1
  44. package/Server/Services/IncomingCallPolicyEscalationRuleService.ts +75 -2
  45. package/Server/Services/IncomingCallPolicyService.ts +42 -1
  46. package/Server/Services/Index.ts +2 -0
  47. package/Server/Services/LlmProviderService.ts +110 -0
  48. package/Server/Services/MigrationFailureService.ts +9 -0
  49. package/Server/Services/MonitorProbeService.ts +33 -7
  50. package/Server/Services/MonitorService.ts +19 -7
  51. package/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.ts +65 -0
  52. package/Server/Services/OnCallDutyPolicyEscalationRuleService.ts +185 -41
  53. package/Server/Services/OnCallDutyPolicyEscalationRuleUserService.ts +23 -15
  54. package/Server/Services/OnCallDutyPolicyExecutionLogService.ts +39 -0
  55. package/Server/Services/OnCallDutyPolicyScheduleLayerService.ts +148 -0
  56. package/Server/Services/OnCallDutyPolicyScheduleLayerUserService.ts +11 -2
  57. package/Server/Services/OnCallDutyPolicyScheduleService.ts +502 -26
  58. package/Server/Services/OnCallDutyPolicyTimeLogService.ts +49 -7
  59. package/Server/Services/OnCallDutyPolicyUserOverrideService.ts +218 -4
  60. package/Server/Services/ProjectCallSMSConfigService.ts +82 -1
  61. package/Server/Services/ProjectService.ts +24 -0
  62. package/Server/Services/TeamMemberService.ts +6 -0
  63. package/Server/Services/UserNotificationRuleService.ts +13 -42
  64. package/Server/Services/UserOnCallLogService.ts +90 -0
  65. package/Server/Services/UserOnCallLogTimelineService.ts +43 -1
  66. package/Server/Types/AnalyticsDatabase/ModelPermission.ts +74 -9
  67. package/Server/Types/Database/QueryUtil.ts +57 -0
  68. package/Server/Utils/AI/AIChatPrivacyFilter.ts +28 -0
  69. package/Server/Utils/AI/AlertAIContextBuilder.ts +6 -1
  70. package/Server/Utils/AI/Chat/ChatAgentRunner.ts +1066 -0
  71. package/Server/Utils/AI/Chat/ObservabilityAssistant.ts +239 -0
  72. package/Server/Utils/AI/Chat/ObservabilityChatPrompt.ts +51 -0
  73. package/Server/Utils/AI/IncidentAIContextBuilder.ts +18 -3
  74. package/Server/Utils/AI/IncidentEpisodeAIContextBuilder.ts +6 -1
  75. package/Server/Utils/AI/ScheduledMaintenanceAIContextBuilder.ts +12 -2
  76. package/Server/Utils/AI/Toolbox/AlertTools.ts +201 -0
  77. package/Server/Utils/AI/Toolbox/AlertWriteTools.ts +174 -0
  78. package/Server/Utils/AI/Toolbox/ContextTools.ts +189 -0
  79. package/Server/Utils/AI/Toolbox/ExceptionTools.ts +149 -0
  80. package/Server/Utils/AI/Toolbox/IncidentTools.ts +386 -0
  81. package/Server/Utils/AI/Toolbox/IncidentWriteTools.ts +350 -0
  82. package/Server/Utils/AI/Toolbox/Index.ts +231 -0
  83. package/Server/Utils/AI/Toolbox/LogTools.ts +339 -0
  84. package/Server/Utils/AI/Toolbox/MetricTools.ts +179 -0
  85. package/Server/Utils/AI/Toolbox/MonitorTools.ts +193 -0
  86. package/Server/Utils/AI/Toolbox/RecentChangesTools.ts +208 -0
  87. package/Server/Utils/AI/Toolbox/Serializer.ts +299 -0
  88. package/Server/Utils/AI/Toolbox/ToolTypes.ts +249 -0
  89. package/Server/Utils/AI/Toolbox/TraceTools.ts +402 -0
  90. package/Server/Utils/AI/Toolbox/WidgetBuilder.ts +189 -0
  91. package/Server/Utils/Database/MigrationFailureLog.ts +240 -0
  92. package/Server/Utils/IncomingCallPhoneNumber.ts +41 -0
  93. package/Server/Utils/LLM/LLMService.ts +605 -96
  94. package/Server/Utils/Telemetry/IoTSnapshotScan.ts +12 -9
  95. package/Server/Utils/Telemetry/ProxmoxCephSnapshotScan.ts +12 -9
  96. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +512 -19
  97. package/Server/Utils/Workspace/Slack/Slack.ts +80 -0
  98. package/Server/Utils/Workspace/Slack/app-manifest.json +16 -1
  99. package/Tests/Server/Services/AnalyticsDatabaseService.test.ts +0 -8
  100. package/Tests/Server/Services/OnCallDutyPolicyScheduleLayerUserReorder.test.ts +233 -0
  101. package/Tests/Server/Services/OnCallDutyPolicyTimeLogServiceScoping.test.ts +242 -0
  102. package/Tests/Server/Services/OnCallDutyPolicyUserOverrideEdit.test.ts +198 -0
  103. package/Tests/Server/Services/UserOnCallLogClaimNotificationRule.test.ts +495 -0
  104. package/Tests/Server/Types/Database/QueryUtil.test.ts +74 -0
  105. package/Tests/Server/Utils/AI/AIChatModelACL.test.ts +42 -0
  106. package/Tests/Server/Utils/AI/ChatAgentHelpers.test.ts +89 -0
  107. package/Tests/Server/Utils/AI/LLMServiceBaseUrl.test.ts +139 -0
  108. package/Tests/Server/Utils/AI/LLMServiceToolCalling.test.ts +386 -0
  109. package/Tests/Server/Utils/AI/ToolArgsGetTimeRange.test.ts +62 -0
  110. package/Tests/Server/Utils/AI/ToolArgsScopeServiceIds.test.ts +79 -0
  111. package/Tests/Server/Utils/AI/ToolResultSerializer.test.ts +223 -0
  112. package/Tests/Types/Billing/SubscriptionStatus.test.ts +127 -0
  113. package/Tests/Types/DateExhaustiveTimezone.test.ts +700 -0
  114. package/Tests/Types/DateTimezoneWallClock.test.ts +99 -0
  115. package/Tests/Types/Events/Recurring.test.ts +22 -9
  116. package/Tests/Types/Metrics/RecordingRuleDefinition.test.ts +213 -0
  117. package/Tests/Types/OnCallDutyPolicy/LayerUtilAuditFixes.test.ts +291 -0
  118. package/Tests/Types/OnCallDutyPolicy/LayerUtilAuditFixesRound2.test.ts +398 -0
  119. package/Tests/Types/OnCallDutyPolicy/LayerUtilDSTWeekendGap.test.ts +114 -0
  120. package/Tests/Types/OnCallDutyPolicy/LayerUtilDSTWeeklyDayShift.test.ts +76 -0
  121. package/Tests/Types/OnCallDutyPolicy/LayerUtilDailyMutation.test.ts +128 -0
  122. package/Tests/Types/OnCallDutyPolicy/LayerUtilDailyProbe.test.ts +203 -0
  123. package/Tests/Types/OnCallDutyPolicy/LayerUtilDiffFuzz.test.ts +322 -0
  124. package/Tests/Types/OnCallDutyPolicy/LayerUtilEdgeCases.test.ts +280 -0
  125. package/Tests/Types/OnCallDutyPolicy/LayerUtilExhaustiveCurrentUser.test.ts +863 -0
  126. package/Tests/Types/OnCallDutyPolicy/LayerUtilExhaustiveDaily.test.ts +900 -0
  127. package/Tests/Types/OnCallDutyPolicy/LayerUtilExhaustiveMultiLayer.test.ts +1104 -0
  128. package/Tests/Types/OnCallDutyPolicy/LayerUtilExhaustiveRotation.test.ts +957 -0
  129. package/Tests/Types/OnCallDutyPolicy/LayerUtilExhaustiveWeekly.test.ts +1095 -0
  130. package/Tests/Types/OnCallDutyPolicy/LayerUtilInvariants.test.ts +232 -0
  131. package/Tests/Types/OnCallDutyPolicy/LayerUtilMergeAudit.test.ts +227 -0
  132. package/Tests/Types/OnCallDutyPolicy/LayerUtilMonthYearAudit.test.ts +255 -0
  133. package/Tests/Types/OnCallDutyPolicy/LayerUtilMultiLayerAudit.test.ts +388 -0
  134. package/Tests/Types/OnCallDutyPolicy/LayerUtilMultiLayerEdge.test.ts +300 -0
  135. package/Tests/Types/OnCallDutyPolicy/LayerUtilOvernightDSTAudit.test.ts +158 -0
  136. package/Tests/Types/OnCallDutyPolicy/LayerUtilRestrictedGapFix.test.ts +253 -0
  137. package/Tests/Types/OnCallDutyPolicy/LayerUtilRestrictedGapRepro.test.ts +157 -0
  138. package/Tests/Types/OnCallDutyPolicy/LayerUtilRotationFixes.test.ts +414 -0
  139. package/Tests/Types/OnCallDutyPolicy/LayerUtilTimezone.test.ts +243 -0
  140. package/Tests/Types/OnCallDutyPolicy/LayerUtilWeekendGapRepro.test.ts +112 -0
  141. package/Tests/Types/OnCallDutyPolicy/OverrideLensAudit.test.ts +117 -0
  142. package/Tests/Types/OnCallDutyPolicy/RestrictionTimes.test.ts +8 -6
  143. package/Tests/Types/OnCallDutyPolicy/RestrictionTimesDefaultDayAudit.test.ts +112 -0
  144. package/Tests/Types/OnCallDutyPolicy/RestrictionTimesExhaustive.test.ts +821 -0
  145. package/Tests/Types/OnCallDutyPolicy/RestrictionTimesMutationInvariant.test.ts +886 -0
  146. package/Tests/Types/OnCallDutyPolicy/UserOverrideUtil.test.ts +255 -0
  147. package/Tests/Types/OnCallDutyPolicy/UserOverrideUtilExhaustive.test.ts +1126 -0
  148. package/Types/AI/AIChatMessageRole.ts +6 -0
  149. package/Types/AI/AIChatMessageStatus.ts +32 -0
  150. package/Types/AI/AIChatPermissionMode.ts +69 -0
  151. package/Types/AI/AIChatTypes.ts +231 -0
  152. package/Types/AI/AIRunEventType.ts +17 -0
  153. package/Types/AI/AIRunStatus.ts +28 -0
  154. package/Types/AI/AIRunType.ts +6 -0
  155. package/Types/Date.ts +200 -15
  156. package/Types/LLM/LlmType.ts +6 -0
  157. package/Types/OnCallDutyPolicy/Layer.ts +790 -260
  158. package/Types/OnCallDutyPolicy/RestrictionTimes.ts +39 -13
  159. package/Types/OnCallDutyPolicy/UserOverrideUtil.ts +21 -5
  160. package/UI/Components/Events/RecurringFieldElement.tsx +16 -0
  161. package/UI/Components/Header/HeaderIconDropdownButton.tsx +22 -12
  162. package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +35 -3
  163. package/UI/Components/ModelFormModal/ModelFormModal.tsx +8 -0
  164. package/UI/Components/Page/Page.tsx +14 -0
  165. package/UI/Components/RadioButtons/BasicRadioButtons.tsx +1 -1
  166. package/UI/Utils/LlmTypeDropdownOptions.ts +40 -0
  167. package/UI/Utils/TestLLMProvider.ts +59 -0
  168. package/build/dist/Models/DatabaseModels/AIConversation.js +345 -0
  169. package/build/dist/Models/DatabaseModels/AIConversation.js.map +1 -0
  170. package/build/dist/Models/DatabaseModels/AIConversationMessage.js +521 -0
  171. package/build/dist/Models/DatabaseModels/AIConversationMessage.js.map +1 -0
  172. package/build/dist/Models/DatabaseModels/AIRun.js +619 -0
  173. package/build/dist/Models/DatabaseModels/AIRun.js.map +1 -0
  174. package/build/dist/Models/DatabaseModels/AIRunEvent.js +469 -0
  175. package/build/dist/Models/DatabaseModels/AIRunEvent.js.map +1 -0
  176. package/build/dist/Models/DatabaseModels/IncidentEpisodeRoleMember.js +1 -1
  177. package/build/dist/Models/DatabaseModels/IncidentEpisodeRoleMember.js.map +1 -1
  178. package/build/dist/Models/DatabaseModels/IncidentMember.js +1 -1
  179. package/build/dist/Models/DatabaseModels/IncidentMember.js.map +1 -1
  180. package/build/dist/Models/DatabaseModels/IncomingCallPolicy.js +10 -0
  181. package/build/dist/Models/DatabaseModels/IncomingCallPolicy.js.map +1 -1
  182. package/build/dist/Models/DatabaseModels/Index.js +10 -0
  183. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  184. package/build/dist/Models/DatabaseModels/LlmLog.js +28 -0
  185. package/build/dist/Models/DatabaseModels/LlmLog.js.map +1 -1
  186. package/build/dist/Models/DatabaseModels/LlmProvider.js +2 -2
  187. package/build/dist/Models/DatabaseModels/LlmProvider.js.map +1 -1
  188. package/build/dist/Models/DatabaseModels/MigrationFailure.js +196 -0
  189. package/build/dist/Models/DatabaseModels/MigrationFailure.js.map +1 -0
  190. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.js +52 -2
  191. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.js.map +1 -1
  192. package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js +45 -0
  193. package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js.map +1 -1
  194. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleLayer.js +6 -0
  195. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleLayer.js.map +1 -1
  196. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleLayerUser.js +6 -0
  197. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleLayerUser.js.map +1 -1
  198. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyTimeLog.js +1 -1
  199. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyTimeLog.js.map +1 -1
  200. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyUserOverride.js +2 -2
  201. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyUserOverride.js.map +1 -1
  202. package/build/dist/Server/API/AIChatAPI.js +498 -0
  203. package/build/dist/Server/API/AIChatAPI.js.map +1 -0
  204. package/build/dist/Server/API/AlertAPI.js +1 -1
  205. package/build/dist/Server/API/IncidentAPI.js +2 -2
  206. package/build/dist/Server/API/IncidentEpisodeAPI.js +1 -1
  207. package/build/dist/Server/API/LlmProviderAPI.js +108 -1
  208. package/build/dist/Server/API/LlmProviderAPI.js.map +1 -1
  209. package/build/dist/Server/API/MicrosoftTeamsAPI.js +4 -0
  210. package/build/dist/Server/API/MicrosoftTeamsAPI.js.map +1 -1
  211. package/build/dist/Server/API/ScheduledMaintenanceAPI.js +1 -1
  212. package/build/dist/Server/API/SlackAPI.js +442 -0
  213. package/build/dist/Server/API/SlackAPI.js.map +1 -1
  214. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783363279075-AddAIChatModels.js +96 -0
  215. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783363279075-AddAIChatModels.js.map +1 -0
  216. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783443471795-AddLlmProviderToAIConversation.js +25 -0
  217. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783443471795-AddLlmProviderToAIConversation.js.map +1 -0
  218. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783453297388-AddAIChatWriteActionsAndWidgets.js +31 -0
  219. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783453297388-AddAIChatWriteActionsAndWidgets.js.map +1 -0
  220. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783461767405-MigrationName.js +46 -0
  221. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783461767405-MigrationName.js.map +1 -0
  222. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783470000000-AddIncomingCallPolicyRoutingPhoneNumberUnique.js +18 -0
  223. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783470000000-AddIncomingCallPolicyRoutingPhoneNumberUnique.js.map +1 -0
  224. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783510935686-FixNotNullForeignKeysOnDelete.js +38 -0
  225. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783510935686-FixNotNullForeignKeysOnDelete.js.map +1 -0
  226. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783515836148-MigrationName.js +16 -0
  227. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783515836148-MigrationName.js.map +1 -0
  228. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783523076215-AddMigrationFailureTable.js +18 -0
  229. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783523076215-AddMigrationFailureTable.js.map +1 -0
  230. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +16 -0
  231. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  232. package/build/dist/Server/Infrastructure/PostgresDatabase.js +9 -0
  233. package/build/dist/Server/Infrastructure/PostgresDatabase.js.map +1 -1
  234. package/build/dist/Server/Services/AIConversationMessageService.js +34 -0
  235. package/build/dist/Server/Services/AIConversationMessageService.js.map +1 -0
  236. package/build/dist/Server/Services/AIConversationService.js +42 -0
  237. package/build/dist/Server/Services/AIConversationService.js.map +1 -0
  238. package/build/dist/Server/Services/AIRunEventService.js +34 -0
  239. package/build/dist/Server/Services/AIRunEventService.js.map +1 -0
  240. package/build/dist/Server/Services/AIRunService.js +34 -0
  241. package/build/dist/Server/Services/AIRunService.js.map +1 -0
  242. package/build/dist/Server/Services/AIService.js +84 -25
  243. package/build/dist/Server/Services/AIService.js.map +1 -1
  244. package/build/dist/Server/Services/AnalyticsDatabaseService.js +10 -1
  245. package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
  246. package/build/dist/Server/Services/DatabaseService.js +20 -1
  247. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  248. package/build/dist/Server/Services/IncidentService.js +1 -1
  249. package/build/dist/Server/Services/IncomingCallPolicyEscalationRuleService.js +55 -2
  250. package/build/dist/Server/Services/IncomingCallPolicyEscalationRuleService.js.map +1 -1
  251. package/build/dist/Server/Services/IncomingCallPolicyService.js +40 -0
  252. package/build/dist/Server/Services/IncomingCallPolicyService.js.map +1 -1
  253. package/build/dist/Server/Services/Index.js +2 -0
  254. package/build/dist/Server/Services/Index.js.map +1 -1
  255. package/build/dist/Server/Services/LlmProviderService.js +108 -0
  256. package/build/dist/Server/Services/LlmProviderService.js.map +1 -1
  257. package/build/dist/Server/Services/MigrationFailureService.js +9 -0
  258. package/build/dist/Server/Services/MigrationFailureService.js.map +1 -0
  259. package/build/dist/Server/Services/MonitorProbeService.js +33 -7
  260. package/build/dist/Server/Services/MonitorProbeService.js.map +1 -1
  261. package/build/dist/Server/Services/MonitorService.js +12 -5
  262. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  263. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js +81 -22
  264. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js.map +1 -1
  265. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleService.js +134 -31
  266. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleService.js.map +1 -1
  267. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleUserService.js +21 -13
  268. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleUserService.js.map +1 -1
  269. package/build/dist/Server/Services/OnCallDutyPolicyExecutionLogService.js +36 -0
  270. package/build/dist/Server/Services/OnCallDutyPolicyExecutionLogService.js.map +1 -1
  271. package/build/dist/Server/Services/OnCallDutyPolicyScheduleLayerService.js +121 -0
  272. package/build/dist/Server/Services/OnCallDutyPolicyScheduleLayerService.js.map +1 -1
  273. package/build/dist/Server/Services/OnCallDutyPolicyScheduleLayerUserService.js +11 -2
  274. package/build/dist/Server/Services/OnCallDutyPolicyScheduleLayerUserService.js.map +1 -1
  275. package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js +409 -36
  276. package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js.map +1 -1
  277. package/build/dist/Server/Services/OnCallDutyPolicyTimeLogService.js +52 -8
  278. package/build/dist/Server/Services/OnCallDutyPolicyTimeLogService.js.map +1 -1
  279. package/build/dist/Server/Services/OnCallDutyPolicyUserOverrideService.js +170 -3
  280. package/build/dist/Server/Services/OnCallDutyPolicyUserOverrideService.js.map +1 -1
  281. package/build/dist/Server/Services/ProjectCallSMSConfigService.js +72 -0
  282. package/build/dist/Server/Services/ProjectCallSMSConfigService.js.map +1 -1
  283. package/build/dist/Server/Services/ProjectService.js +25 -0
  284. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  285. package/build/dist/Server/Services/TeamMemberService.js +6 -0
  286. package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
  287. package/build/dist/Server/Services/UserNotificationRuleService.js +12 -30
  288. package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
  289. package/build/dist/Server/Services/UserOnCallLogService.js +75 -0
  290. package/build/dist/Server/Services/UserOnCallLogService.js.map +1 -1
  291. package/build/dist/Server/Services/UserOnCallLogTimelineService.js +31 -1
  292. package/build/dist/Server/Services/UserOnCallLogTimelineService.js.map +1 -1
  293. package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js +50 -7
  294. package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js.map +1 -1
  295. package/build/dist/Server/Types/Database/QueryUtil.js +45 -0
  296. package/build/dist/Server/Types/Database/QueryUtil.js.map +1 -1
  297. package/build/dist/Server/Utils/AI/AIChatPrivacyFilter.js +18 -0
  298. package/build/dist/Server/Utils/AI/AIChatPrivacyFilter.js.map +1 -0
  299. package/build/dist/Server/Utils/AI/AlertAIContextBuilder.js +6 -1
  300. package/build/dist/Server/Utils/AI/AlertAIContextBuilder.js.map +1 -1
  301. package/build/dist/Server/Utils/AI/Chat/ChatAgentRunner.js +756 -0
  302. package/build/dist/Server/Utils/AI/Chat/ChatAgentRunner.js.map +1 -0
  303. package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js +165 -0
  304. package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js.map +1 -0
  305. package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js +44 -0
  306. package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js.map +1 -0
  307. package/build/dist/Server/Utils/AI/IncidentAIContextBuilder.js +18 -3
  308. package/build/dist/Server/Utils/AI/IncidentAIContextBuilder.js.map +1 -1
  309. package/build/dist/Server/Utils/AI/IncidentEpisodeAIContextBuilder.js +6 -1
  310. package/build/dist/Server/Utils/AI/IncidentEpisodeAIContextBuilder.js.map +1 -1
  311. package/build/dist/Server/Utils/AI/ScheduledMaintenanceAIContextBuilder.js +12 -2
  312. package/build/dist/Server/Utils/AI/ScheduledMaintenanceAIContextBuilder.js.map +1 -1
  313. package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js +167 -0
  314. package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js.map +1 -0
  315. package/build/dist/Server/Utils/AI/Toolbox/AlertWriteTools.js +136 -0
  316. package/build/dist/Server/Utils/AI/Toolbox/AlertWriteTools.js.map +1 -0
  317. package/build/dist/Server/Utils/AI/Toolbox/ContextTools.js +141 -0
  318. package/build/dist/Server/Utils/AI/Toolbox/ContextTools.js.map +1 -0
  319. package/build/dist/Server/Utils/AI/Toolbox/ExceptionTools.js +117 -0
  320. package/build/dist/Server/Utils/AI/Toolbox/ExceptionTools.js.map +1 -0
  321. package/build/dist/Server/Utils/AI/Toolbox/IncidentTools.js +318 -0
  322. package/build/dist/Server/Utils/AI/Toolbox/IncidentTools.js.map +1 -0
  323. package/build/dist/Server/Utils/AI/Toolbox/IncidentWriteTools.js +280 -0
  324. package/build/dist/Server/Utils/AI/Toolbox/IncidentWriteTools.js.map +1 -0
  325. package/build/dist/Server/Utils/AI/Toolbox/Index.js +153 -0
  326. package/build/dist/Server/Utils/AI/Toolbox/Index.js.map +1 -0
  327. package/build/dist/Server/Utils/AI/Toolbox/LogTools.js +246 -0
  328. package/build/dist/Server/Utils/AI/Toolbox/LogTools.js.map +1 -0
  329. package/build/dist/Server/Utils/AI/Toolbox/MetricTools.js +120 -0
  330. package/build/dist/Server/Utils/AI/Toolbox/MetricTools.js.map +1 -0
  331. package/build/dist/Server/Utils/AI/Toolbox/MonitorTools.js +158 -0
  332. package/build/dist/Server/Utils/AI/Toolbox/MonitorTools.js.map +1 -0
  333. package/build/dist/Server/Utils/AI/Toolbox/RecentChangesTools.js +165 -0
  334. package/build/dist/Server/Utils/AI/Toolbox/RecentChangesTools.js.map +1 -0
  335. package/build/dist/Server/Utils/AI/Toolbox/Serializer.js +228 -0
  336. package/build/dist/Server/Utils/AI/Toolbox/Serializer.js.map +1 -0
  337. package/build/dist/Server/Utils/AI/Toolbox/ToolTypes.js +142 -0
  338. package/build/dist/Server/Utils/AI/Toolbox/ToolTypes.js.map +1 -0
  339. package/build/dist/Server/Utils/AI/Toolbox/TraceTools.js +309 -0
  340. package/build/dist/Server/Utils/AI/Toolbox/TraceTools.js.map +1 -0
  341. package/build/dist/Server/Utils/AI/Toolbox/WidgetBuilder.js +120 -0
  342. package/build/dist/Server/Utils/AI/Toolbox/WidgetBuilder.js.map +1 -0
  343. package/build/dist/Server/Utils/Database/MigrationFailureLog.js +174 -0
  344. package/build/dist/Server/Utils/Database/MigrationFailureLog.js.map +1 -0
  345. package/build/dist/Server/Utils/IncomingCallPhoneNumber.js +30 -0
  346. package/build/dist/Server/Utils/IncomingCallPhoneNumber.js.map +1 -0
  347. package/build/dist/Server/Utils/LLM/LLMService.js +452 -92
  348. package/build/dist/Server/Utils/LLM/LLMService.js.map +1 -1
  349. package/build/dist/Server/Utils/Telemetry/IoTSnapshotScan.js +11 -8
  350. package/build/dist/Server/Utils/Telemetry/IoTSnapshotScan.js.map +1 -1
  351. package/build/dist/Server/Utils/Telemetry/ProxmoxCephSnapshotScan.js +11 -8
  352. package/build/dist/Server/Utils/Telemetry/ProxmoxCephSnapshotScan.js.map +1 -1
  353. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +378 -15
  354. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
  355. package/build/dist/Server/Utils/Workspace/Slack/Slack.js +59 -0
  356. package/build/dist/Server/Utils/Workspace/Slack/Slack.js.map +1 -1
  357. package/build/dist/Server/Utils/Workspace/Slack/app-manifest.json +16 -1
  358. package/build/dist/Types/AI/AIChatMessageRole.js +7 -0
  359. package/build/dist/Types/AI/AIChatMessageRole.js.map +1 -0
  360. package/build/dist/Types/AI/AIChatMessageStatus.js +27 -0
  361. package/build/dist/Types/AI/AIChatMessageStatus.js.map +1 -0
  362. package/build/dist/Types/AI/AIChatPermissionMode.js +53 -0
  363. package/build/dist/Types/AI/AIChatPermissionMode.js.map +1 -0
  364. package/build/dist/Types/AI/AIChatTypes.js +74 -0
  365. package/build/dist/Types/AI/AIChatTypes.js.map +1 -0
  366. package/build/dist/Types/AI/AIRunEventType.js +18 -0
  367. package/build/dist/Types/AI/AIRunEventType.js.map +1 -0
  368. package/build/dist/Types/AI/AIRunStatus.js +26 -0
  369. package/build/dist/Types/AI/AIRunStatus.js.map +1 -0
  370. package/build/dist/Types/AI/AIRunType.js +7 -0
  371. package/build/dist/Types/AI/AIRunType.js.map +1 -0
  372. package/build/dist/Types/Date.js +153 -15
  373. package/build/dist/Types/Date.js.map +1 -1
  374. package/build/dist/Types/LLM/LlmType.js +6 -0
  375. package/build/dist/Types/LLM/LlmType.js.map +1 -1
  376. package/build/dist/Types/OnCallDutyPolicy/Layer.js +602 -171
  377. package/build/dist/Types/OnCallDutyPolicy/Layer.js.map +1 -1
  378. package/build/dist/Types/OnCallDutyPolicy/RestrictionTimes.js +27 -13
  379. package/build/dist/Types/OnCallDutyPolicy/RestrictionTimes.js.map +1 -1
  380. package/build/dist/Types/OnCallDutyPolicy/UserOverrideUtil.js +20 -5
  381. package/build/dist/Types/OnCallDutyPolicy/UserOverrideUtil.js.map +1 -1
  382. package/build/dist/UI/Components/Events/RecurringFieldElement.js +13 -0
  383. package/build/dist/UI/Components/Events/RecurringFieldElement.js.map +1 -1
  384. package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js +10 -5
  385. package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js.map +1 -1
  386. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +18 -4
  387. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
  388. package/build/dist/UI/Components/ModelFormModal/ModelFormModal.js.map +1 -1
  389. package/build/dist/UI/Components/Page/Page.js +3 -1
  390. package/build/dist/UI/Components/Page/Page.js.map +1 -1
  391. package/build/dist/UI/Components/RadioButtons/BasicRadioButtons.js +1 -1
  392. package/build/dist/UI/Components/RadioButtons/BasicRadioButtons.js.map +1 -1
  393. package/build/dist/UI/Utils/LlmTypeDropdownOptions.js +38 -0
  394. package/build/dist/UI/Utils/LlmTypeDropdownOptions.js.map +1 -0
  395. package/build/dist/UI/Utils/TestLLMProvider.js +37 -0
  396. package/build/dist/UI/Utils/TestLLMProvider.js.map +1 -0
  397. package/package.json +1 -1
@@ -0,0 +1,174 @@
1
+ import Alert from "../../../../Models/DatabaseModels/Alert";
2
+ import { JSONObject } from "../../../../Types/JSON";
3
+ import ObjectID from "../../../../Types/ObjectID";
4
+ import Permission from "../../../../Types/Permission";
5
+ import BadDataException from "../../../../Types/Exception/BadDataException";
6
+ import { AIChatCitationTargetType } from "../../../../Types/AI/AIChatTypes";
7
+ import AlertService from "../../../Services/AlertService";
8
+ import ToolResultSerializer, { SerializedResult } from "./Serializer";
9
+ import WidgetBuilder from "./WidgetBuilder";
10
+ import {
11
+ ObservabilityTool,
12
+ ToolArgs,
13
+ ToolContext,
14
+ ToolExecutionResult,
15
+ } from "./ToolTypes";
16
+
17
+ /*
18
+ * Derived from the model ACL so the tool gate can never drift from RBAC.
19
+ * Resolved lazily rather than at module load: this module is pulled in through
20
+ * the service import graph before the Alert model class is fully wired up, so
21
+ * calling a model method at import time throws a circular-dependency
22
+ * TypeError. By the time a tool actually executes, every module is loaded.
23
+ */
24
+ let cachedUpdatePermissions: Array<Permission> | null = null;
25
+ const resolveUpdatePermissions: () => Array<Permission> =
26
+ (): Array<Permission> => {
27
+ if (!cachedUpdatePermissions) {
28
+ cachedUpdatePermissions = new Alert().getUpdatePermissions();
29
+ }
30
+ return cachedUpdatePermissions;
31
+ };
32
+
33
+ async function changeAlertStateTool(data: {
34
+ args: JSONObject;
35
+ ctx: ToolContext;
36
+ verb: "acknowledge" | "resolve";
37
+ }): Promise<ToolExecutionResult> {
38
+ const { args, ctx, verb } = data;
39
+
40
+ const alertId: ObjectID | undefined = ToolArgs.getObjectID(args, "alertId");
41
+ if (!alertId) {
42
+ throw new BadDataException(
43
+ "alertId is required. Use query_alerts to find it first.",
44
+ );
45
+ }
46
+
47
+ const userId: ObjectID | undefined = ctx.props.userId;
48
+ if (!userId) {
49
+ throw new BadDataException(
50
+ "No authenticated user in context; cannot change the alert.",
51
+ );
52
+ }
53
+
54
+ // Confirm the alert is visible to this user under their RBAC.
55
+ const alert: Alert | null = await AlertService.findOneById({
56
+ id: alertId,
57
+ select: {
58
+ _id: true,
59
+ alertNumber: true,
60
+ title: true,
61
+ },
62
+ props: ctx.props,
63
+ });
64
+
65
+ if (!alert) {
66
+ throw new BadDataException(
67
+ "Alert not found (or you do not have access to it).",
68
+ );
69
+ }
70
+
71
+ if (verb === "acknowledge") {
72
+ await AlertService.acknowledgeAlert(alertId, userId);
73
+ } else {
74
+ await AlertService.resolveAlert(alertId, userId);
75
+ }
76
+
77
+ const newStateName: string =
78
+ verb === "acknowledge" ? "Acknowledged" : "Resolved";
79
+
80
+ const alertIdString: string = alertId.toString();
81
+
82
+ const serialized: SerializedResult = ToolResultSerializer.serializeRows([
83
+ {
84
+ id: alertIdString,
85
+ alertNumber: alert.alertNumber,
86
+ title: alert.title,
87
+ newState: newStateName,
88
+ },
89
+ ]);
90
+
91
+ return {
92
+ dataForLlm: `Alert #${alert.alertNumber} ("${alert.title}") is now ${newStateName}.\n${serialized.text}`,
93
+ rowCount: 1,
94
+ citationLabel: `${newStateName} alert #${alert.alertNumber}`,
95
+ citationTarget: {
96
+ type: AIChatCitationTargetType.AlertView,
97
+ params: { alertId: alertIdString },
98
+ },
99
+ redactionCount: serialized.redactionCount,
100
+ isTruncated: false,
101
+ widget: WidgetBuilder.resourceCard({
102
+ title: `Alert ${newStateName.toLowerCase()}`,
103
+ resourceType: "Alert",
104
+ heading: `#${alert.alertNumber} · ${alert.title}`,
105
+ subheading: `Now ${newStateName}`,
106
+ fields: [
107
+ { label: "Number", value: `#${alert.alertNumber ?? ""}` },
108
+ { label: "State", value: newStateName },
109
+ ],
110
+ link: {
111
+ type: AIChatCitationTargetType.AlertView,
112
+ params: { alertId: alertIdString },
113
+ },
114
+ }),
115
+ };
116
+ }
117
+
118
+ export const AcknowledgeAlertTool: ObservabilityTool = {
119
+ name: "acknowledge_alert",
120
+ description:
121
+ "Acknowledge an alert (move it to the acknowledged state) by its alertId. Find the alertId with query_alerts first.",
122
+ inputSchema: {
123
+ type: "object",
124
+ properties: {
125
+ alertId: {
126
+ type: "string",
127
+ description: "The alert's ID (required).",
128
+ },
129
+ },
130
+ required: ["alertId"],
131
+ },
132
+ get requiredPermissions(): Array<Permission> {
133
+ return resolveUpdatePermissions();
134
+ },
135
+ isMutation: true,
136
+ buildActionTitle: (args: JSONObject): string => {
137
+ return `Acknowledge alert ${ToolArgs.getString(args, "alertId") || ""}`.trim();
138
+ },
139
+ execute: async (
140
+ args: JSONObject,
141
+ ctx: ToolContext,
142
+ ): Promise<ToolExecutionResult> => {
143
+ return changeAlertStateTool({ args, ctx, verb: "acknowledge" });
144
+ },
145
+ };
146
+
147
+ export const ResolveAlertTool: ObservabilityTool = {
148
+ name: "resolve_alert",
149
+ description:
150
+ "Resolve an alert (move it to the resolved state) by its alertId. Find the alertId with query_alerts first.",
151
+ inputSchema: {
152
+ type: "object",
153
+ properties: {
154
+ alertId: {
155
+ type: "string",
156
+ description: "The alert's ID (required).",
157
+ },
158
+ },
159
+ required: ["alertId"],
160
+ },
161
+ get requiredPermissions(): Array<Permission> {
162
+ return resolveUpdatePermissions();
163
+ },
164
+ isMutation: true,
165
+ buildActionTitle: (args: JSONObject): string => {
166
+ return `Resolve alert ${ToolArgs.getString(args, "alertId") || ""}`.trim();
167
+ },
168
+ execute: async (
169
+ args: JSONObject,
170
+ ctx: ToolContext,
171
+ ): Promise<ToolExecutionResult> => {
172
+ return changeAlertStateTool({ args, ctx, verb: "resolve" });
173
+ },
174
+ };
@@ -0,0 +1,189 @@
1
+ import MetricType from "../../../../Models/DatabaseModels/MetricType";
2
+ import Service from "../../../../Models/DatabaseModels/Service";
3
+ import SortOrder from "../../../../Types/BaseDatabase/SortOrder";
4
+ import BadDataException from "../../../../Types/Exception/BadDataException";
5
+ import { JSONObject } from "../../../../Types/JSON";
6
+ import Permission from "../../../../Types/Permission";
7
+ import TelemetryType from "../../../../Types/Telemetry/TelemetryType";
8
+ import MetricTypeService from "../../../Services/MetricTypeService";
9
+ import ServiceService from "../../../Services/ServiceService";
10
+ import TelemetryAttributeService from "../../../Services/TelemetryAttributeService";
11
+ import QueryHelper from "../../../Types/Database/QueryHelper";
12
+ import ToolResultSerializer, { SerializedResult } from "./Serializer";
13
+ import {
14
+ ObservabilityTool,
15
+ ToolArgs,
16
+ ToolContext,
17
+ ToolExecutionResult,
18
+ } from "./ToolTypes";
19
+
20
+ const CONTEXT_READ_PERMISSIONS: Array<Permission> = [
21
+ Permission.ProjectOwner,
22
+ Permission.ProjectAdmin,
23
+ Permission.ProjectMember,
24
+ Permission.Viewer,
25
+ Permission.TelemetryAdmin,
26
+ Permission.TelemetryMember,
27
+ Permission.TelemetryViewer,
28
+ ];
29
+
30
+ export const LookupContextTool: ObservabilityTool = {
31
+ name: "lookup_context",
32
+ description:
33
+ "Discover what exists in this project so other tools can be called with exact identifiers: telemetry services (name → ID), metric names, and attribute keys for logs/traces/metrics. ALWAYS resolve a service name to its ID here before filtering other tools by service.",
34
+ inputSchema: {
35
+ type: "object",
36
+ properties: {
37
+ type: {
38
+ type: "string",
39
+ enum: ["services", "metricNames", "attributeKeys"],
40
+ description: "What to look up (required).",
41
+ },
42
+ nameSearch: {
43
+ type: "string",
44
+ description: "Filter results whose name contains this text.",
45
+ },
46
+ telemetryType: {
47
+ type: "string",
48
+ enum: ["Log", "Trace", "Metric", "Exception"],
49
+ description:
50
+ "For attributeKeys lookups: which signal's attribute keys to list.",
51
+ },
52
+ },
53
+ required: ["type"],
54
+ },
55
+ requiredPermissions: CONTEXT_READ_PERMISSIONS,
56
+ execute: async (
57
+ args: JSONObject,
58
+ ctx: ToolContext,
59
+ ): Promise<ToolExecutionResult> => {
60
+ const lookupType: string | undefined = ToolArgs.getString(args, "type");
61
+ const nameSearch: string | undefined = ToolArgs.getString(
62
+ args,
63
+ "nameSearch",
64
+ );
65
+
66
+ if (lookupType === "services") {
67
+ const services: Array<Service> = await ServiceService.findBy({
68
+ query: nameSearch
69
+ ? {
70
+ name: QueryHelper.search(nameSearch),
71
+ }
72
+ : {},
73
+ select: {
74
+ _id: true,
75
+ name: true,
76
+ },
77
+ sort: {
78
+ name: SortOrder.Ascending,
79
+ },
80
+ limit: 100,
81
+ skip: 0,
82
+ props: ctx.props,
83
+ });
84
+
85
+ const rows: Array<JSONObject> = services.map((service: Service) => {
86
+ return {
87
+ id: service.id?.toString(),
88
+ name: service.name,
89
+ };
90
+ });
91
+
92
+ const serialized: SerializedResult =
93
+ ToolResultSerializer.serializeRows(rows);
94
+
95
+ return {
96
+ dataForLlm: serialized.text,
97
+ rowCount: serialized.rowCount,
98
+ citationLabel: `Telemetry services (${serialized.rowCount} found)`,
99
+ citationTarget: undefined,
100
+ redactionCount: serialized.redactionCount,
101
+ isTruncated: serialized.isTruncated,
102
+ };
103
+ }
104
+
105
+ if (lookupType === "metricNames") {
106
+ const metricTypes: Array<MetricType> = await MetricTypeService.findBy({
107
+ query: nameSearch
108
+ ? {
109
+ name: QueryHelper.search(nameSearch),
110
+ }
111
+ : {},
112
+ select: {
113
+ name: true,
114
+ },
115
+ sort: {
116
+ name: SortOrder.Ascending,
117
+ },
118
+ limit: 200,
119
+ skip: 0,
120
+ props: ctx.props,
121
+ });
122
+
123
+ const rows: Array<JSONObject> = metricTypes.map(
124
+ (metricType: MetricType) => {
125
+ return {
126
+ name: metricType.name,
127
+ };
128
+ },
129
+ );
130
+
131
+ const serialized: SerializedResult =
132
+ ToolResultSerializer.serializeRows(rows);
133
+
134
+ return {
135
+ dataForLlm: serialized.text,
136
+ rowCount: serialized.rowCount,
137
+ citationLabel: `Metric names (${serialized.rowCount} found)`,
138
+ citationTarget: undefined,
139
+ redactionCount: serialized.redactionCount,
140
+ isTruncated: serialized.isTruncated,
141
+ };
142
+ }
143
+
144
+ if (lookupType === "attributeKeys") {
145
+ const telemetryTypeString: string =
146
+ ToolArgs.getString(args, "telemetryType") || "Log";
147
+
148
+ if (
149
+ !Object.values(TelemetryType).includes(
150
+ telemetryTypeString as TelemetryType,
151
+ )
152
+ ) {
153
+ throw new BadDataException(
154
+ `Invalid telemetryType: ${telemetryTypeString}`,
155
+ );
156
+ }
157
+
158
+ const attributes: Array<string> =
159
+ await TelemetryAttributeService.fetchAttributes({
160
+ projectId: ctx.projectId,
161
+ telemetryType: telemetryTypeString as TelemetryType,
162
+ });
163
+
164
+ const filtered: Array<string> = nameSearch
165
+ ? attributes.filter((attribute: string) => {
166
+ return attribute.toLowerCase().includes(nameSearch.toLowerCase());
167
+ })
168
+ : attributes;
169
+
170
+ const serialized: SerializedResult = ToolResultSerializer.serializeText(
171
+ filtered.slice(0, 200).join("\n"),
172
+ filtered.length,
173
+ );
174
+
175
+ return {
176
+ dataForLlm: serialized.text,
177
+ rowCount: serialized.rowCount,
178
+ citationLabel: `${telemetryTypeString} attribute keys (${filtered.length} found)`,
179
+ citationTarget: undefined,
180
+ redactionCount: serialized.redactionCount,
181
+ isTruncated: serialized.isTruncated,
182
+ };
183
+ }
184
+
185
+ throw new BadDataException(
186
+ `Invalid lookup type: ${lookupType}. Use one of: services, metricNames, attributeKeys.`,
187
+ );
188
+ },
189
+ };
@@ -0,0 +1,149 @@
1
+ import TelemetryException from "../../../../Models/DatabaseModels/TelemetryException";
2
+ import { JSONObject } from "../../../../Types/JSON";
3
+ import Permission from "../../../../Types/Permission";
4
+ import SortOrder from "../../../../Types/BaseDatabase/SortOrder";
5
+ import { AIChatCitationTargetType } from "../../../../Types/AI/AIChatTypes";
6
+ import TelemetryExceptionService from "../../../Services/TelemetryExceptionService";
7
+ import QueryHelper from "../../../Types/Database/QueryHelper";
8
+ import OneUptimeDate from "../../../../Types/Date";
9
+ import ToolResultSerializer, { SerializedResult } from "./Serializer";
10
+ import WidgetBuilder from "./WidgetBuilder";
11
+ import {
12
+ ObservabilityTool,
13
+ ToolArgs,
14
+ ToolContext,
15
+ ToolExecutionResult,
16
+ } from "./ToolTypes";
17
+
18
+ /*
19
+ * Derived from the model ACL so the tool gate can never drift from RBAC.
20
+ * Resolved lazily rather than at module load: this module is pulled in through
21
+ * the service import graph before the TelemetryException model class is fully
22
+ * wired up, so calling a model method at import time throws a
23
+ * circular-dependency TypeError. By the time a tool actually executes, every
24
+ * module is loaded.
25
+ */
26
+ let cachedReadPermissions: Array<Permission> | null = null;
27
+ const resolveReadPermissions: () => Array<Permission> =
28
+ (): Array<Permission> => {
29
+ if (!cachedReadPermissions) {
30
+ cachedReadPermissions = new TelemetryException().getReadPermissions();
31
+ }
32
+ return cachedReadPermissions;
33
+ };
34
+
35
+ export const TopExceptionsTool: ObservabilityTool = {
36
+ name: "top_exceptions",
37
+ description:
38
+ "Get the top exceptions (grouped by fingerprint) in this project, sorted by occurrence count. Includes first/last seen timestamps so you can tell if an exception is new or recurring.",
39
+ inputSchema: {
40
+ type: "object",
41
+ properties: {
42
+ lastSeenWithinHours: {
43
+ type: "number",
44
+ description:
45
+ "Only exceptions last seen within this many hours (default 168 = 7 days, max 720).",
46
+ },
47
+ includeResolved: {
48
+ type: "boolean",
49
+ description: "Include resolved exceptions (default false).",
50
+ },
51
+ limit: {
52
+ type: "number",
53
+ description: "Maximum exception groups to return (default 10, max 25).",
54
+ },
55
+ },
56
+ },
57
+ get requiredPermissions(): Array<Permission> {
58
+ return resolveReadPermissions();
59
+ },
60
+ execute: async (
61
+ args: JSONObject,
62
+ ctx: ToolContext,
63
+ ): Promise<ToolExecutionResult> => {
64
+ const lastSeenWithinHours: number = ToolArgs.getNumber(
65
+ args,
66
+ "lastSeenWithinHours",
67
+ { defaultValue: 168, min: 1, max: 720 },
68
+ );
69
+ const includeResolved: boolean =
70
+ ToolArgs.getBoolean(args, "includeResolved") ?? false;
71
+ const limit: number = ToolArgs.getNumber(args, "limit", {
72
+ defaultValue: 10,
73
+ min: 1,
74
+ max: 25,
75
+ });
76
+
77
+ const since: Date = OneUptimeDate.addRemoveHours(
78
+ OneUptimeDate.getCurrentDate(),
79
+ -1 * lastSeenWithinHours,
80
+ );
81
+
82
+ const query: JSONObject = {
83
+ lastSeenAt: QueryHelper.greaterThanEqualTo(since),
84
+ };
85
+
86
+ if (!includeResolved) {
87
+ query["isResolved"] = false;
88
+ }
89
+
90
+ const exceptions: Array<TelemetryException> =
91
+ await TelemetryExceptionService.findBy({
92
+ query: query as never,
93
+ select: {
94
+ _id: true,
95
+ message: true,
96
+ exceptionType: true,
97
+ fingerprint: true,
98
+ occuranceCount: true,
99
+ firstSeenAt: true,
100
+ lastSeenAt: true,
101
+ isResolved: true,
102
+ },
103
+ sort: {
104
+ occuranceCount: SortOrder.Descending,
105
+ },
106
+ limit: limit,
107
+ skip: 0,
108
+ props: ctx.props,
109
+ });
110
+
111
+ const rows: Array<JSONObject> = exceptions.map(
112
+ (exception: TelemetryException) => {
113
+ return {
114
+ id: exception.id?.toString(),
115
+ type: exception.exceptionType,
116
+ message: exception.message,
117
+ occurrences: exception.occuranceCount,
118
+ firstSeenAt: exception.firstSeenAt,
119
+ lastSeenAt: exception.lastSeenAt,
120
+ isResolved: exception.isResolved,
121
+ fingerprint: exception.fingerprint,
122
+ };
123
+ },
124
+ );
125
+
126
+ const serialized: SerializedResult =
127
+ ToolResultSerializer.serializeRows(rows);
128
+
129
+ return {
130
+ dataForLlm: serialized.text,
131
+ rowCount: serialized.rowCount,
132
+ citationLabel: `Top exceptions, last ${lastSeenWithinHours}h (${serialized.rowCount} found)`,
133
+ citationTarget: {
134
+ type: AIChatCitationTargetType.Exceptions,
135
+ },
136
+ redactionCount: serialized.redactionCount,
137
+ isTruncated: serialized.isTruncated,
138
+ widget:
139
+ rows.length > 0
140
+ ? WidgetBuilder.exceptionList({
141
+ title: `Top exceptions (${rows.length})`,
142
+ description: `Last ${lastSeenWithinHours}h, by occurrence count`,
143
+ items: rows,
144
+ link: { type: AIChatCitationTargetType.Exceptions },
145
+ })
146
+ : undefined,
147
+ };
148
+ },
149
+ };