@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,189 @@
1
+ import { JSONObject } from "../../../../Types/JSON";
2
+ import {
3
+ AIChatCitationTarget,
4
+ AIChatWidget,
5
+ AIChatWidgetColumn,
6
+ AIChatWidgetSeries,
7
+ AIChatWidgetSpan,
8
+ AIChatWidgetStat,
9
+ AIChatWidgetType,
10
+ } from "../../../../Types/AI/AIChatTypes";
11
+
12
+ /*
13
+ * Builds the inline widgets a tool attaches to its result. Widgets are built
14
+ * from the RAW rows a tool fetched (not the redacted LLM payload) and rendered
15
+ * back to the same user who already has RBAC access to the data.
16
+ *
17
+ * `id` and `citationId` are left blank here — ChatAgentRunner mints them
18
+ * (W1, W2, … and the matching C1, C2, …) after the tool executes so they line
19
+ * up with the server-minted citations.
20
+ */
21
+ export default class WidgetBuilder {
22
+ public static table(params: {
23
+ title: string;
24
+ description?: string | undefined;
25
+ columns: Array<AIChatWidgetColumn>;
26
+ rows: Array<JSONObject>;
27
+ link?: AIChatCitationTarget | undefined;
28
+ }): AIChatWidget {
29
+ return {
30
+ id: "",
31
+ type: AIChatWidgetType.Table,
32
+ title: params.title,
33
+ description: params.description,
34
+ data: {
35
+ columns: params.columns,
36
+ rows: params.rows,
37
+ link: params.link,
38
+ },
39
+ };
40
+ }
41
+
42
+ public static timeSeries(params: {
43
+ title: string;
44
+ description?: string | undefined;
45
+ series: Array<AIChatWidgetSeries>;
46
+ unit?: string | undefined;
47
+ valueLabel?: string | undefined;
48
+ link?: AIChatCitationTarget | undefined;
49
+ }): AIChatWidget {
50
+ return {
51
+ id: "",
52
+ type: AIChatWidgetType.TimeSeriesChart,
53
+ title: params.title,
54
+ description: params.description,
55
+ data: {
56
+ series: params.series,
57
+ xIsTime: true,
58
+ unit: params.unit,
59
+ valueLabel: params.valueLabel,
60
+ link: params.link,
61
+ },
62
+ };
63
+ }
64
+
65
+ public static bars(params: {
66
+ title: string;
67
+ description?: string | undefined;
68
+ series: Array<AIChatWidgetSeries>;
69
+ stacked?: boolean | undefined;
70
+ xIsTime?: boolean | undefined;
71
+ unit?: string | undefined;
72
+ link?: AIChatCitationTarget | undefined;
73
+ }): AIChatWidget {
74
+ return {
75
+ id: "",
76
+ type: AIChatWidgetType.BarChart,
77
+ title: params.title,
78
+ description: params.description,
79
+ data: {
80
+ series: params.series,
81
+ stacked: params.stacked ?? false,
82
+ xIsTime: params.xIsTime ?? false,
83
+ unit: params.unit,
84
+ link: params.link,
85
+ },
86
+ };
87
+ }
88
+
89
+ public static traceWaterfall(params: {
90
+ title: string;
91
+ description?: string | undefined;
92
+ spans: Array<AIChatWidgetSpan>;
93
+ totalDurationMs: number;
94
+ link?: AIChatCitationTarget | undefined;
95
+ }): AIChatWidget {
96
+ return {
97
+ id: "",
98
+ type: AIChatWidgetType.TraceWaterfall,
99
+ title: params.title,
100
+ description: params.description,
101
+ data: {
102
+ spans: params.spans,
103
+ totalDurationMs: params.totalDurationMs,
104
+ link: params.link,
105
+ },
106
+ };
107
+ }
108
+
109
+ public static incidentList(params: {
110
+ title: string;
111
+ description?: string | undefined;
112
+ items: Array<JSONObject>;
113
+ link?: AIChatCitationTarget | undefined;
114
+ }): AIChatWidget {
115
+ return {
116
+ id: "",
117
+ type: AIChatWidgetType.IncidentList,
118
+ title: params.title,
119
+ description: params.description,
120
+ data: { items: params.items, link: params.link },
121
+ };
122
+ }
123
+
124
+ public static alertList(params: {
125
+ title: string;
126
+ description?: string | undefined;
127
+ items: Array<JSONObject>;
128
+ link?: AIChatCitationTarget | undefined;
129
+ }): AIChatWidget {
130
+ return {
131
+ id: "",
132
+ type: AIChatWidgetType.AlertList,
133
+ title: params.title,
134
+ description: params.description,
135
+ data: { items: params.items, link: params.link },
136
+ };
137
+ }
138
+
139
+ public static exceptionList(params: {
140
+ title: string;
141
+ description?: string | undefined;
142
+ items: Array<JSONObject>;
143
+ link?: AIChatCitationTarget | undefined;
144
+ }): AIChatWidget {
145
+ return {
146
+ id: "",
147
+ type: AIChatWidgetType.ExceptionList,
148
+ title: params.title,
149
+ description: params.description,
150
+ data: { items: params.items, link: params.link },
151
+ };
152
+ }
153
+
154
+ public static resourceCard(params: {
155
+ title: string;
156
+ resourceType: string;
157
+ heading: string;
158
+ subheading?: string | undefined;
159
+ fields: Array<{ label: string; value: string }>;
160
+ link?: AIChatCitationTarget | undefined;
161
+ }): AIChatWidget {
162
+ return {
163
+ id: "",
164
+ type: AIChatWidgetType.ResourceCard,
165
+ title: params.title,
166
+ data: {
167
+ resourceType: params.resourceType,
168
+ heading: params.heading,
169
+ subheading: params.subheading,
170
+ fields: params.fields,
171
+ link: params.link,
172
+ },
173
+ };
174
+ }
175
+
176
+ public static stats(params: {
177
+ title: string;
178
+ description?: string | undefined;
179
+ stats: Array<AIChatWidgetStat>;
180
+ }): AIChatWidget {
181
+ return {
182
+ id: "",
183
+ type: AIChatWidgetType.StatCards,
184
+ title: params.title,
185
+ description: params.description,
186
+ data: { stats: params.stats },
187
+ };
188
+ }
189
+ }
@@ -0,0 +1,240 @@
1
+ import os from "os";
2
+ import { DataSource, DataSourceOptions } from "typeorm";
3
+ import logger from "../Logger";
4
+ import { AppVersion } from "../../EnvironmentConfig";
5
+
6
+ /*
7
+ * Records migrations that FAILED to apply into the "MigrationFailure" table so
8
+ * the admin health page can explain WHY a migration is pending (what error,
9
+ * when it ran) instead of only showing that it is behind. Every write here is
10
+ * best-effort: a diagnostic log must never itself crash a boot / migrate Job or
11
+ * mask the real migration error, so all failures inside this module are
12
+ * swallowed (logged, not thrown).
13
+ */
14
+
15
+ // Which runner a failed migration belongs to. Stored verbatim in the table.
16
+ export enum MigrationFailureType {
17
+ PostgresSchema = "PostgresSchema",
18
+ DataMigration = "DataMigration",
19
+ }
20
+
21
+ // Keep a single row bounded so a pathological error/stack can't bloat the table.
22
+ const MAX_ERROR_MESSAGE_LENGTH: number = 10000;
23
+ const MAX_ERROR_STACK_LENGTH: number = 20000;
24
+
25
+ /*
26
+ * Best-effort credential scrub for the free-form error text we persist. DB /
27
+ * migration errors seldom carry secrets, but a connection error can echo a
28
+ * `scheme://user:pass@host` DSN and a failing DDL can quote a literal default,
29
+ * so we mask the obvious vectors before the text is stored and later shown.
30
+ */
31
+ const CONNECTION_STRING_SECRET_PATTERN: RegExp =
32
+ /([a-z][a-z0-9+.-]*:\/\/[^:@\s/]+):[^\s/]+@/gi;
33
+ const KEYWORD_SECRET_PATTERN: RegExp =
34
+ /(password|secret|token|api[_-]?key|apikey|credential|private[_-]?key|auth[_-]?token|access[_-]?key)(\s*[:=]\s*)('(?:[^']|'')*'|"[^"]*"|[^\s,)]+)/gi;
35
+
36
+ export function scrubMigrationErrorText(text: string): string {
37
+ if (!text) {
38
+ return text;
39
+ }
40
+
41
+ return text
42
+ .replace(
43
+ CONNECTION_STRING_SECRET_PATTERN,
44
+ (_match: string, prefix: string): string => {
45
+ return `${prefix}:***REDACTED***@`;
46
+ },
47
+ )
48
+ .replace(
49
+ KEYWORD_SECRET_PATTERN,
50
+ (_match: string, keyword: string, separator: string): string => {
51
+ return `${keyword}${separator}***REDACTED***`;
52
+ },
53
+ );
54
+ }
55
+
56
+ function toErrorMessage(error: unknown): string {
57
+ if (error instanceof Error) {
58
+ return error.message || error.name || "Unknown error";
59
+ }
60
+ return String(error);
61
+ }
62
+
63
+ function toErrorStack(error: unknown): string | null {
64
+ return error instanceof Error && error.stack ? error.stack : null;
65
+ }
66
+
67
+ interface MigrationFailureInput {
68
+ migrationName: string;
69
+ migrationType: MigrationFailureType;
70
+ error: unknown;
71
+ }
72
+
73
+ /*
74
+ * Append one failed-attempt row using the provided (already-connected)
75
+ * DataSource. Raw SQL — not the Service layer — so it also works on a
76
+ * throwaway diagnostic connection and never depends on realtime/event wiring.
77
+ * Returns true if the row was written. If the "MigrationFailure" table does not
78
+ * exist yet (e.g. its own migration is still pending on a first rollout) the
79
+ * INSERT throws and is swallowed — the caller's real error is unaffected.
80
+ */
81
+ export async function recordMigrationFailure(
82
+ dataSource: DataSource,
83
+ input: MigrationFailureInput,
84
+ ): Promise<boolean> {
85
+ try {
86
+ const message: string = scrubMigrationErrorText(
87
+ toErrorMessage(input.error),
88
+ ).substring(0, MAX_ERROR_MESSAGE_LENGTH);
89
+
90
+ const rawStack: string | null = toErrorStack(input.error);
91
+ const stack: string | null = rawStack
92
+ ? scrubMigrationErrorText(rawStack).substring(0, MAX_ERROR_STACK_LENGTH)
93
+ : null;
94
+
95
+ await dataSource.query(
96
+ `INSERT INTO "MigrationFailure"
97
+ ("migrationName", "migrationType", "errorMessage", "errorStack", "attemptedAt", "hostName", "appVersion", "version", "createdAt", "updatedAt")
98
+ VALUES ($1, $2, $3, $4, $5, $6, $7, 1, now(), now())`,
99
+ [
100
+ input.migrationName,
101
+ input.migrationType,
102
+ message,
103
+ stack,
104
+ new Date(),
105
+ os.hostname(),
106
+ AppVersion,
107
+ ],
108
+ );
109
+
110
+ return true;
111
+ } catch (err) {
112
+ // Diagnostic write must never mask the real failure — log and move on.
113
+ logger.warn(
114
+ `Could not record migration failure for "${input.migrationName}" (${input.migrationType}); continuing.`,
115
+ );
116
+ logger.warn(err);
117
+ return false;
118
+ }
119
+ }
120
+
121
+ // Trailing epoch in a migration class name — how TypeORM orders/identifies them.
122
+ function parseMigrationTimestamp(name: string): number {
123
+ const match: RegExpMatchArray | null = name.match(/(\d{10,})$/);
124
+ return match ? Number(match[1]) : 0;
125
+ }
126
+
127
+ /*
128
+ * The TypeORM schema runner (migrationsRun) applies migrations in ascending
129
+ * timestamp order and halts at the first failure, so the FIRST defined
130
+ * migration not yet in the `migrations` table is exactly the one that failed.
131
+ * We recompute it here from a throwaway connection because the app's own
132
+ * connect() has already failed (its DataSource is not usable) at the point a
133
+ * schema migration throws.
134
+ */
135
+ export async function recordSchemaMigrationFailureBestEffort(
136
+ dataSourceOptions: DataSourceOptions,
137
+ originalError: unknown,
138
+ ): Promise<void> {
139
+ /*
140
+ * Only THIS process's own boot runs schema migrations (migrationsRun=true —
141
+ * the migrate Job and single-pod / dev boots). On runtime pods where a
142
+ * dedicated migrate Job owns migrations (migrationsRun=false), a connect()
143
+ * failure is a connectivity problem, never a failed migration — recording
144
+ * one here would misattribute an outage to a (legitimately) pending
145
+ * migration, so skip.
146
+ */
147
+ if (
148
+ (dataSourceOptions as { migrationsRun?: boolean }).migrationsRun !== true
149
+ ) {
150
+ return;
151
+ }
152
+
153
+ let diagnosticDataSource: DataSource | null = null;
154
+
155
+ try {
156
+ diagnosticDataSource = new DataSource({
157
+ ...dataSourceOptions,
158
+ // Never re-run migrations or sync schema on the diagnostic connection.
159
+ migrationsRun: false,
160
+ synchronize: false,
161
+ // Keep the probe short so a genuinely-down DB doesn't slow the failing boot.
162
+ extra: {
163
+ ...((dataSourceOptions as { extra?: Record<string, unknown> }).extra ||
164
+ {}),
165
+ connectionTimeoutMillis: 5000,
166
+ },
167
+ } as DataSourceOptions);
168
+
169
+ /*
170
+ * If this fails, the original error was a connectivity problem (not a bad
171
+ * migration) — there is nothing meaningful to attribute, so we skip.
172
+ */
173
+ await diagnosticDataSource.initialize();
174
+
175
+ const definedMigrationClasses: Array<new () => { name: string }> =
176
+ Array.isArray(dataSourceOptions.migrations)
177
+ ? (dataSourceOptions.migrations as unknown as Array<
178
+ new () => { name: string }
179
+ >)
180
+ : [];
181
+
182
+ const definedNames: Array<string> = Array.from(
183
+ new Set(
184
+ definedMigrationClasses.map(
185
+ (MigrationClass: new () => { name: string }): string => {
186
+ return new MigrationClass().name;
187
+ },
188
+ ),
189
+ ),
190
+ ).sort((a: string, b: string): number => {
191
+ return parseMigrationTimestamp(a) - parseMigrationTimestamp(b);
192
+ });
193
+
194
+ let appliedNames: Set<string> = new Set();
195
+ try {
196
+ const rows: Array<{ name: string }> = await diagnosticDataSource.query(
197
+ "SELECT name FROM migrations",
198
+ );
199
+ appliedNames = new Set(
200
+ rows.map((row: { name: string }): string => {
201
+ return row.name;
202
+ }),
203
+ );
204
+ } catch {
205
+ // migrations table may not exist on a brand-new DB — treat as none applied.
206
+ }
207
+
208
+ const firstPending: string | undefined = definedNames.find(
209
+ (name: string): boolean => {
210
+ return !appliedNames.has(name);
211
+ },
212
+ );
213
+
214
+ /*
215
+ * No pending schema migration means the connect() failure was not a pending
216
+ * migration failing (e.g. an entity-metadata error) — don't misattribute it.
217
+ */
218
+ if (!firstPending) {
219
+ return;
220
+ }
221
+
222
+ await recordMigrationFailure(diagnosticDataSource, {
223
+ migrationName: firstPending,
224
+ migrationType: MigrationFailureType.PostgresSchema,
225
+ error: originalError,
226
+ });
227
+ } catch (err) {
228
+ // Best-effort diagnostics only — swallow everything.
229
+ logger.warn("Could not record Postgres schema migration failure.");
230
+ logger.warn(err);
231
+ } finally {
232
+ try {
233
+ if (diagnosticDataSource && diagnosticDataSource.isInitialized) {
234
+ await diagnosticDataSource.destroy();
235
+ }
236
+ } catch (destroyErr) {
237
+ logger.warn(destroyErr);
238
+ }
239
+ }
240
+ }
@@ -0,0 +1,41 @@
1
+ import { AppApiHostname } from "../EnvironmentConfig";
2
+ import ClusterKeyAuthorization from "../Middleware/ClusterKeyAuthorization";
3
+ import logger from "./Logger";
4
+ import Protocol from "../../Types/API/Protocol";
5
+ import Route from "../../Types/API/Route";
6
+ import URL from "../../Types/API/URL";
7
+ import API from "../../Utils/API";
8
+ import ObjectID from "../../Types/ObjectID";
9
+
10
+ /*
11
+ * Releases a provisioned incoming-call number on the call provider by delegating
12
+ * to the notification app's internal endpoint (the Common layer cannot reach the
13
+ * provider directly). Best-effort: failures are logged but never thrown, so a
14
+ * provider/network issue during cleanup does not block the parent delete.
15
+ */
16
+ export default async function releaseIncomingCallPhoneNumber(data: {
17
+ projectCallSMSConfigId: ObjectID;
18
+ callProviderPhoneNumberId: string;
19
+ }): Promise<void> {
20
+ try {
21
+ await API.post({
22
+ url: new URL(
23
+ Protocol.HTTP,
24
+ AppApiHostname,
25
+ new Route("/api/notification/phone-number/internal/release"),
26
+ ),
27
+ data: {
28
+ projectCallSMSConfigId: data.projectCallSMSConfigId.toString(),
29
+ callProviderPhoneNumberId: data.callProviderPhoneNumberId,
30
+ },
31
+ headers: {
32
+ ...ClusterKeyAuthorization.getClusterKeyHeaders(),
33
+ },
34
+ });
35
+ } catch (err) {
36
+ logger.error(
37
+ "Failed to release incoming-call phone number on the provider during cleanup:",
38
+ );
39
+ logger.error(err);
40
+ }
41
+ }