@oneuptime/common 11.7.1 → 11.7.3

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 (285) hide show
  1. package/Models/AnalyticsModels/KubernetesCostAllocation.ts +103 -0
  2. package/Models/DatabaseModels/DashboardDomain.ts +1 -0
  3. package/Models/DatabaseModels/Incident.ts +2 -0
  4. package/Models/DatabaseModels/IncidentEpisode.ts +1 -0
  5. package/Models/DatabaseModels/IncidentEpisodePublicNote.ts +1 -0
  6. package/Models/DatabaseModels/IncidentEpisodeStateTimeline.ts +1 -0
  7. package/Models/DatabaseModels/IncidentPublicNote.ts +1 -0
  8. package/Models/DatabaseModels/IncidentStateTimeline.ts +1 -0
  9. package/Models/DatabaseModels/Monitor.ts +1 -0
  10. package/Models/DatabaseModels/MonitorStatusTimeline.ts +1 -0
  11. package/Models/DatabaseModels/NetworkSite.ts +1 -0
  12. package/Models/DatabaseModels/NetworkSiteStatusTimeline.ts +1 -0
  13. package/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.ts +1 -0
  14. package/Models/DatabaseModels/OnCallDutyPolicySchedule.ts +2 -0
  15. package/Models/DatabaseModels/Probe.ts +13 -13
  16. package/Models/DatabaseModels/ScheduledMaintenance.ts +1 -0
  17. package/Models/DatabaseModels/ScheduledMaintenancePublicNote.ts +1 -0
  18. package/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.ts +1 -0
  19. package/Models/DatabaseModels/ScheduledMaintenanceTemplate.ts +1 -0
  20. package/Models/DatabaseModels/StatusPage.ts +1 -0
  21. package/Models/DatabaseModels/StatusPageAnnouncement.ts +1 -0
  22. package/Models/DatabaseModels/StatusPageDomain.ts +1 -0
  23. package/Models/DatabaseModels/TableView.ts +40 -0
  24. package/Models/DatabaseModels/WorkspaceNotificationSummary.ts +1 -0
  25. package/Models/DatabaseModels/WorkspaceProjectAuthToken.ts +11 -0
  26. package/Server/API/BaseAPI.ts +17 -1
  27. package/Server/API/CommonAPI.ts +32 -0
  28. package/Server/API/MicrosoftTeamsAPI.ts +99 -2
  29. package/Server/API/ProbeAPI.ts +2 -0
  30. package/Server/API/SlackAPI.ts +62 -0
  31. package/Server/API/StatusPageAPI.ts +157 -192
  32. package/Server/Infrastructure/Postgres/SchemaMigrations/1785140242697-AddHotQueryIndexes.ts +89 -0
  33. package/Server/Infrastructure/Postgres/SchemaMigrations/1785148065137-AddHotQueryIndexesSecondPass.ts +61 -0
  34. package/Server/Infrastructure/Postgres/SchemaMigrations/1785240000000-RepairCrossProjectMonitorStatusReferences.ts +280 -0
  35. package/Server/Infrastructure/Postgres/SchemaMigrations/1785241000000-AddColumnsToTableView.ts +13 -0
  36. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +8 -0
  37. package/Server/Services/DatabaseService.ts +11 -3
  38. package/Server/Services/MonitorGroupService.ts +145 -0
  39. package/Server/Services/MonitorService.ts +231 -30
  40. package/Server/Services/ProbeService.ts +319 -16
  41. package/Server/Services/StatusPageService.ts +72 -42
  42. package/Server/Services/WorkspaceNotificationRuleService.ts +232 -2
  43. package/Server/Utils/Database/PostgresErrorTranslator.ts +131 -0
  44. package/Server/Utils/Monitor/MonitorResource.ts +88 -35
  45. package/Server/Utils/Monitor/MonitorStatusTimeline.ts +21 -1
  46. package/Server/Utils/Monitor/MonitorStepsProjectValidator.ts +158 -0
  47. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +706 -6
  48. package/Tests/Models/AnalyticsModels/KubernetesCostAllocation.test.ts +16 -0
  49. package/Tests/Models/DatabaseModels/ProbeColumnAccessControl.test.ts +103 -0
  50. package/Tests/Server/API/BaseAPIUpdateNoOp.test.ts +135 -0
  51. package/Tests/Server/API/CommonAPIAuthGuard.test.ts +317 -0
  52. package/Tests/Server/API/MicrosoftTeamsManifest.test.ts +228 -0
  53. package/Tests/Server/API/ProbeAPI.test.ts +6 -0
  54. package/Tests/Server/API/ZZVerifyChatsAuth.test.ts +167 -0
  55. package/Tests/Server/Services/AddHotQueryIndexesMigration.test.ts +255 -0
  56. package/Tests/Server/Services/AddHotQueryIndexesSecondPassMigration.test.ts +258 -0
  57. package/Tests/Server/Services/DatabaseServiceSanitizeUpdateData.test.ts +1 -1
  58. package/Tests/Server/Services/DiscoveryScanClaimHookFreeSafety.test.ts +121 -0
  59. package/Tests/Server/Services/HeartbeatWriteFastPathSafety.test.ts +200 -0
  60. package/Tests/Server/Services/HookFreeWriteSafetySecondPass.test.ts +181 -0
  61. package/Tests/Server/Services/MonitorGroupServiceBatchedStatuses.test.ts +513 -0
  62. package/Tests/Server/Services/MonitorResourceProbeAgreementReuse.test.ts +492 -0
  63. package/Tests/Server/Services/MonitorServiceProbeSelection.test.ts +401 -0
  64. package/Tests/Server/Services/MonitorStatusTimelineFastPath.test.ts +453 -0
  65. package/Tests/Server/Services/ProbeAuthKeyCacheAndHeartbeat.test.ts +679 -0
  66. package/Tests/Server/Services/ServiceLevelObjectiveService.test.ts +3 -3
  67. package/Tests/Server/Services/StatusPageDomainResolutionCache.test.ts +245 -0
  68. package/Tests/Server/Services/StatusPageOverviewTimelineWindow.test.ts +283 -0
  69. package/Tests/Server/Services/StatusPageServiceMcp.test.ts +17 -1
  70. package/Tests/Server/Services/StatusPageServiceMonitorGroupBatching.test.ts +331 -0
  71. package/Tests/Server/Services/UserOnCallLogClaimNotificationRule.test.ts +12 -12
  72. package/Tests/Server/Services/WorkspaceNotificationRuleChats.test.ts +1390 -0
  73. package/Tests/Server/Utils/AI/Insights/InsightFixRouting.test.ts +4 -4
  74. package/Tests/Server/Utils/AI/Insights/InsightScanner.test.ts +2 -2
  75. package/Tests/Server/Utils/AI/Insights/InsightStore.test.ts +1 -3
  76. package/Tests/Server/Utils/AI/Insights/InsightStoreHardening.test.ts +1 -3
  77. package/Tests/Server/Utils/AI/Insights/InsightTriage.test.ts +1 -1
  78. package/Tests/Server/Utils/AI/Insights/InsightTriageRunner.test.ts +5 -5
  79. package/Tests/Server/Utils/Alert/AlertPrivacyFilter.test.ts +187 -0
  80. package/Tests/Server/Utils/AlertEpisode/AlertEpisodePrivacyFilter.test.ts +170 -0
  81. package/Tests/Server/Utils/Database/PostgresErrorTranslator.test.ts +125 -0
  82. package/Tests/Server/Utils/Incident/IncidentPrivacyFilter.test.ts +264 -0
  83. package/Tests/Server/Utils/IncidentEpisode/IncidentEpisodePrivacyFilter.test.ts +175 -0
  84. package/Tests/Server/Utils/Monitor/MonitorStepsProjectValidator.test.ts +181 -0
  85. package/Tests/Server/Utils/Monitor/NetworkDeviceWalkUtil.test.ts +1 -1
  86. package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +2 -2
  87. package/Tests/Server/Utils/Workspace/MicrosoftTeamsChannelsList.test.ts +341 -0
  88. package/Tests/Server/Utils/Workspace/MicrosoftTeamsChats.test.ts +2175 -0
  89. package/Tests/Server/Utils/Workspace/SlackChannelsList.test.ts +585 -0
  90. package/Tests/Types/Billing/MeteredPlan.test.ts +46 -0
  91. package/Tests/Types/JSONFunctions.test.ts +103 -1
  92. package/Tests/Types/Workspace/NotificationRules/NotificationRuleCondition.test.ts +219 -1
  93. package/Tests/UI/Components/BulkUpdateForm.test.tsx +174 -0
  94. package/Tests/UI/Components/CardModelDetailEdit.test.tsx +315 -0
  95. package/Tests/UI/Components/ModelDetailSelect.test.tsx +229 -0
  96. package/Tests/UI/Components/ModelTable/BaseModelTableBulkSelectAll.test.tsx +1258 -0
  97. package/Tests/UI/Components/ModelTable/BaseModelTableColumnCustomization.test.tsx +679 -0
  98. package/Tests/UI/Components/ModelTable/ColumnCustomizationModal.test.tsx +572 -0
  99. package/Tests/UI/Components/ModelTable/ColumnPreference.test.ts +1678 -0
  100. package/Tests/UI/Components/ModelTable/CustomFieldColumns.test.tsx +1094 -0
  101. package/Tests/UI/Components/ModelTableExportFromColumns.test.ts +153 -0
  102. package/Tests/UI/Components/MonacoLoader.test.ts +67 -0
  103. package/Tests/UI/Components/MonacoRuntime.test.ts +121 -0
  104. package/Tests/UI/Components/TableBulkCsvExport.test.tsx +212 -3
  105. package/Tests/UI/Utils/Project.test.ts +809 -0
  106. package/Tests/UI/Utils/TableColumnsToCsv.test.ts +360 -0
  107. package/Tests/Utils/Alerts/AlertMetricType.test.ts +143 -0
  108. package/Tests/Utils/Dashboard/VariableUrlState.test.ts +219 -0
  109. package/Tests/Utils/Incident/IncidentMetricType.test.ts +174 -0
  110. package/Tests/Utils/Monitor/MonitorProbeSelectionUtil.test.ts +145 -0
  111. package/Tests/Utils/StatusPage/ResourceUptime.test.ts +263 -0
  112. package/Tests/Utils/UserPreferences.test.ts +563 -0
  113. package/Types/JSONFunctions.ts +7 -2
  114. package/Types/Kubernetes/KubernetesCostIngest.ts +37 -1
  115. package/Types/Workspace/NotificationRules/BaseNotificationRule.ts +4 -0
  116. package/Types/Workspace/NotificationRules/NotificationRuleCondition.ts +25 -10
  117. package/Types/Workspace/WorkspaceMessagePayload.ts +1 -0
  118. package/UI/Components/BulkUpdate/BulkUpdateForm.tsx +63 -8
  119. package/UI/Components/CodeEditor/CodeEditor.tsx +3 -0
  120. package/UI/Components/CodeEditor/MonacoLoader.ts +36 -0
  121. package/UI/Components/Forms/ModelForm.tsx +41 -18
  122. package/UI/Components/MasterPage/MasterPage.tsx +65 -0
  123. package/UI/Components/ModelDetail/CardModelDetail.tsx +23 -1
  124. package/UI/Components/ModelDetail/ModelDetail.tsx +46 -1
  125. package/UI/Components/ModelTable/BaseModelTable.tsx +687 -34
  126. package/UI/Components/ModelTable/Column.ts +29 -0
  127. package/UI/Components/ModelTable/ColumnCustomizationModal.tsx +420 -0
  128. package/UI/Components/ModelTable/ColumnPreference.ts +482 -0
  129. package/UI/Components/ModelTable/CustomFieldColumns.tsx +326 -0
  130. package/UI/Components/ModelTable/ExportFromColumns.ts +57 -0
  131. package/UI/Components/ModelTable/TableView.tsx +24 -2
  132. package/UI/Components/ModelTable/useCustomFieldColumns.ts +150 -0
  133. package/UI/Components/Navbar/NavBar.tsx +66 -1
  134. package/UI/Components/SideMenu/SideMenu.tsx +24 -4
  135. package/UI/Components/Table/Table.tsx +66 -14
  136. package/UI/Components/Table/TableRow.tsx +180 -175
  137. package/UI/Components/Table/Types/Column.ts +20 -0
  138. package/UI/Utils/Project.ts +214 -18
  139. package/UI/Utils/TableColumnsToCsv.ts +86 -6
  140. package/UI/esbuild-config.js +34 -0
  141. package/Utils/Monitor/MonitorProbeSelectionUtil.ts +72 -0
  142. package/Utils/UserPreferences.ts +53 -0
  143. package/build/dist/Models/AnalyticsModels/KubernetesCostAllocation.js +86 -0
  144. package/build/dist/Models/AnalyticsModels/KubernetesCostAllocation.js.map +1 -1
  145. package/build/dist/Models/DatabaseModels/DashboardDomain.js +1 -0
  146. package/build/dist/Models/DatabaseModels/DashboardDomain.js.map +1 -1
  147. package/build/dist/Models/DatabaseModels/Incident.js +2 -0
  148. package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
  149. package/build/dist/Models/DatabaseModels/IncidentEpisode.js +1 -0
  150. package/build/dist/Models/DatabaseModels/IncidentEpisode.js.map +1 -1
  151. package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js +1 -0
  152. package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js.map +1 -1
  153. package/build/dist/Models/DatabaseModels/IncidentEpisodeStateTimeline.js +1 -0
  154. package/build/dist/Models/DatabaseModels/IncidentEpisodeStateTimeline.js.map +1 -1
  155. package/build/dist/Models/DatabaseModels/IncidentPublicNote.js +1 -0
  156. package/build/dist/Models/DatabaseModels/IncidentPublicNote.js.map +1 -1
  157. package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js +1 -0
  158. package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js.map +1 -1
  159. package/build/dist/Models/DatabaseModels/Monitor.js +1 -0
  160. package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
  161. package/build/dist/Models/DatabaseModels/MonitorStatusTimeline.js +1 -0
  162. package/build/dist/Models/DatabaseModels/MonitorStatusTimeline.js.map +1 -1
  163. package/build/dist/Models/DatabaseModels/NetworkSite.js +1 -0
  164. package/build/dist/Models/DatabaseModels/NetworkSite.js.map +1 -1
  165. package/build/dist/Models/DatabaseModels/NetworkSiteStatusTimeline.js +1 -0
  166. package/build/dist/Models/DatabaseModels/NetworkSiteStatusTimeline.js.map +1 -1
  167. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.js +1 -0
  168. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.js.map +1 -1
  169. package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js +2 -0
  170. package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js.map +1 -1
  171. package/build/dist/Models/DatabaseModels/Probe.js +13 -13
  172. package/build/dist/Models/DatabaseModels/Probe.js.map +1 -1
  173. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +1 -0
  174. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
  175. package/build/dist/Models/DatabaseModels/ScheduledMaintenancePublicNote.js +1 -0
  176. package/build/dist/Models/DatabaseModels/ScheduledMaintenancePublicNote.js.map +1 -1
  177. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js +1 -0
  178. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js.map +1 -1
  179. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplate.js +1 -0
  180. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplate.js.map +1 -1
  181. package/build/dist/Models/DatabaseModels/StatusPage.js +1 -0
  182. package/build/dist/Models/DatabaseModels/StatusPage.js.map +1 -1
  183. package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js +1 -0
  184. package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js.map +1 -1
  185. package/build/dist/Models/DatabaseModels/StatusPageDomain.js +1 -0
  186. package/build/dist/Models/DatabaseModels/StatusPageDomain.js.map +1 -1
  187. package/build/dist/Models/DatabaseModels/TableView.js +40 -0
  188. package/build/dist/Models/DatabaseModels/TableView.js.map +1 -1
  189. package/build/dist/Models/DatabaseModels/WorkspaceNotificationSummary.js +1 -0
  190. package/build/dist/Models/DatabaseModels/WorkspaceNotificationSummary.js.map +1 -1
  191. package/build/dist/Models/DatabaseModels/WorkspaceProjectAuthToken.js.map +1 -1
  192. package/build/dist/Server/API/BaseAPI.js +12 -1
  193. package/build/dist/Server/API/BaseAPI.js.map +1 -1
  194. package/build/dist/Server/API/CommonAPI.js +21 -0
  195. package/build/dist/Server/API/CommonAPI.js.map +1 -1
  196. package/build/dist/Server/API/MicrosoftTeamsAPI.js +72 -2
  197. package/build/dist/Server/API/MicrosoftTeamsAPI.js.map +1 -1
  198. package/build/dist/Server/API/ProbeAPI.js +2 -0
  199. package/build/dist/Server/API/ProbeAPI.js.map +1 -1
  200. package/build/dist/Server/API/SlackAPI.js +44 -0
  201. package/build/dist/Server/API/SlackAPI.js.map +1 -1
  202. package/build/dist/Server/API/StatusPageAPI.js +98 -152
  203. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  204. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785140242697-AddHotQueryIndexes.js +36 -0
  205. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785140242697-AddHotQueryIndexes.js.map +1 -0
  206. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785148065137-AddHotQueryIndexesSecondPass.js +26 -0
  207. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785148065137-AddHotQueryIndexesSecondPass.js.map +1 -0
  208. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785240000000-RepairCrossProjectMonitorStatusReferences.js +254 -0
  209. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785240000000-RepairCrossProjectMonitorStatusReferences.js.map +1 -0
  210. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785241000000-AddColumnsToTableView.js +12 -0
  211. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785241000000-AddColumnsToTableView.js.map +1 -0
  212. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +8 -0
  213. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  214. package/build/dist/Server/Services/DatabaseService.js +10 -2
  215. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  216. package/build/dist/Server/Services/MonitorGroupService.js +118 -0
  217. package/build/dist/Server/Services/MonitorGroupService.js.map +1 -1
  218. package/build/dist/Server/Services/MonitorService.js +198 -24
  219. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  220. package/build/dist/Server/Services/ProbeService.js +238 -9
  221. package/build/dist/Server/Services/ProbeService.js.map +1 -1
  222. package/build/dist/Server/Services/StatusPageService.js +46 -39
  223. package/build/dist/Server/Services/StatusPageService.js.map +1 -1
  224. package/build/dist/Server/Services/WorkspaceNotificationRuleService.js +178 -3
  225. package/build/dist/Server/Services/WorkspaceNotificationRuleService.js.map +1 -1
  226. package/build/dist/Server/Utils/Database/PostgresErrorTranslator.js +80 -0
  227. package/build/dist/Server/Utils/Database/PostgresErrorTranslator.js.map +1 -0
  228. package/build/dist/Server/Utils/Monitor/MonitorResource.js +67 -29
  229. package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
  230. package/build/dist/Server/Utils/Monitor/MonitorStatusTimeline.js +31 -14
  231. package/build/dist/Server/Utils/Monitor/MonitorStatusTimeline.js.map +1 -1
  232. package/build/dist/Server/Utils/Monitor/MonitorStepsProjectValidator.js +117 -0
  233. package/build/dist/Server/Utils/Monitor/MonitorStepsProjectValidator.js.map +1 -0
  234. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +549 -7
  235. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
  236. package/build/dist/Types/JSONFunctions.js +8 -3
  237. package/build/dist/Types/JSONFunctions.js.map +1 -1
  238. package/build/dist/Types/Kubernetes/KubernetesCostIngest.js.map +1 -1
  239. package/build/dist/Types/Workspace/NotificationRules/NotificationRuleCondition.js +17 -7
  240. package/build/dist/Types/Workspace/NotificationRules/NotificationRuleCondition.js.map +1 -1
  241. package/build/dist/UI/Components/BulkUpdate/BulkUpdateForm.js +37 -11
  242. package/build/dist/UI/Components/BulkUpdate/BulkUpdateForm.js.map +1 -1
  243. package/build/dist/UI/Components/CodeEditor/CodeEditor.js +2 -0
  244. package/build/dist/UI/Components/CodeEditor/CodeEditor.js.map +1 -1
  245. package/build/dist/UI/Components/CodeEditor/MonacoLoader.js +34 -0
  246. package/build/dist/UI/Components/CodeEditor/MonacoLoader.js.map +1 -0
  247. package/build/dist/UI/Components/Forms/ModelForm.js +37 -17
  248. package/build/dist/UI/Components/Forms/ModelForm.js.map +1 -1
  249. package/build/dist/UI/Components/MasterPage/MasterPage.js +50 -1
  250. package/build/dist/UI/Components/MasterPage/MasterPage.js.map +1 -1
  251. package/build/dist/UI/Components/ModelDetail/CardModelDetail.js +22 -1
  252. package/build/dist/UI/Components/ModelDetail/CardModelDetail.js.map +1 -1
  253. package/build/dist/UI/Components/ModelDetail/ModelDetail.js +31 -1
  254. package/build/dist/UI/Components/ModelDetail/ModelDetail.js.map +1 -1
  255. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +472 -27
  256. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  257. package/build/dist/UI/Components/ModelTable/ColumnCustomizationModal.js +189 -0
  258. package/build/dist/UI/Components/ModelTable/ColumnCustomizationModal.js.map +1 -0
  259. package/build/dist/UI/Components/ModelTable/ColumnPreference.js +258 -0
  260. package/build/dist/UI/Components/ModelTable/ColumnPreference.js.map +1 -0
  261. package/build/dist/UI/Components/ModelTable/CustomFieldColumns.js +168 -0
  262. package/build/dist/UI/Components/ModelTable/CustomFieldColumns.js.map +1 -0
  263. package/build/dist/UI/Components/ModelTable/ExportFromColumns.js +30 -0
  264. package/build/dist/UI/Components/ModelTable/ExportFromColumns.js.map +1 -0
  265. package/build/dist/UI/Components/ModelTable/TableView.js +13 -2
  266. package/build/dist/UI/Components/ModelTable/TableView.js.map +1 -1
  267. package/build/dist/UI/Components/ModelTable/useCustomFieldColumns.js +84 -0
  268. package/build/dist/UI/Components/ModelTable/useCustomFieldColumns.js.map +1 -0
  269. package/build/dist/UI/Components/Navbar/NavBar.js +39 -1
  270. package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
  271. package/build/dist/UI/Components/SideMenu/SideMenu.js +15 -5
  272. package/build/dist/UI/Components/SideMenu/SideMenu.js.map +1 -1
  273. package/build/dist/UI/Components/Table/Table.js +46 -13
  274. package/build/dist/UI/Components/Table/Table.js.map +1 -1
  275. package/build/dist/UI/Components/Table/TableRow.js +11 -6
  276. package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
  277. package/build/dist/UI/Utils/Project.js +161 -15
  278. package/build/dist/UI/Utils/Project.js.map +1 -1
  279. package/build/dist/UI/Utils/TableColumnsToCsv.js +67 -6
  280. package/build/dist/UI/Utils/TableColumnsToCsv.js.map +1 -1
  281. package/build/dist/Utils/Monitor/MonitorProbeSelectionUtil.js +52 -0
  282. package/build/dist/Utils/Monitor/MonitorProbeSelectionUtil.js.map +1 -0
  283. package/build/dist/Utils/UserPreferences.js +33 -0
  284. package/build/dist/Utils/UserPreferences.js.map +1 -1
  285. package/package.json +4 -3
@@ -30,7 +30,7 @@ import SortOrder from "../../Types/BaseDatabase/SortOrder";
30
30
  import { PlanType } from "../../Types/Billing/SubscriptionPlan";
31
31
  import LIMIT_MAX, { LIMIT_PER_PROJECT } from "../../Types/Database/LimitMax";
32
32
  import BadDataException from "../../Types/Exception/BadDataException";
33
- import { JSONObject } from "../../Types/JSON";
33
+ import { JSONObject, JSONValue } from "../../Types/JSON";
34
34
  import MonitorType, {
35
35
  MonitorTypeHelper,
36
36
  } from "../../Types/Monitor/MonitorType";
@@ -60,6 +60,7 @@ import UserNotificationSettingService from "./UserNotificationSettingService";
60
60
  import NotificationSettingEventType from "../../Types/NotificationSetting/NotificationSettingEventType";
61
61
  import Query from "../Types/Database/Query";
62
62
  import DeleteBy from "../Types/Database/DeleteBy";
63
+ import UpdateBy from "../Types/Database/UpdateBy";
63
64
  import StatusPageResourceService from "./StatusPageResourceService";
64
65
  import Label from "../../Models/DatabaseModels/Label";
65
66
  import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
@@ -68,6 +69,7 @@ import NotificationRuleWorkspaceChannel from "../../Types/Workspace/Notification
68
69
  import WorkspaceNotificationRuleService, {
69
70
  MessageBlocksByWorkspaceType,
70
71
  } from "./WorkspaceNotificationRuleService";
72
+ import MonitorStepsProjectValidator from "../Utils/Monitor/MonitorStepsProjectValidator";
71
73
  import MonitorWorkspaceMessages from "../Utils/Workspace/WorkspaceMessages/Monitor";
72
74
  import MonitorFeedService from "./MonitorFeedService";
73
75
  import { MonitorFeedEventType } from "../../Models/DatabaseModels/MonitorFeed";
@@ -382,6 +384,57 @@ export class Service extends DatabaseService<Model> {
382
384
  return onDelete;
383
385
  }
384
386
 
387
+ @CaptureSpan()
388
+ protected override async onBeforeUpdate(
389
+ updateBy: UpdateBy<Model>,
390
+ ): Promise<OnUpdate<Model>> {
391
+ if (updateBy.data.monitorSteps) {
392
+ /*
393
+ * Root/API updates do not always carry a tenantId, so fall back to the
394
+ * project of each monitor the query actually matches.
395
+ */
396
+ const projectIds: Array<ObjectID> = updateBy.props.tenantId
397
+ ? [updateBy.props.tenantId]
398
+ : await this.getProjectIdsForUpdateQuery(updateBy);
399
+
400
+ for (const projectId of projectIds) {
401
+ await MonitorStepsProjectValidator.validateMonitorStepsBelongToProject({
402
+ monitorSteps: updateBy.data.monitorSteps as MonitorSteps | JSONObject,
403
+ projectId: projectId,
404
+ });
405
+ }
406
+ }
407
+
408
+ return { updateBy, carryForward: null };
409
+ }
410
+
411
+ private async getProjectIdsForUpdateQuery(
412
+ updateBy: UpdateBy<Model>,
413
+ ): Promise<Array<ObjectID>> {
414
+ const monitors: Array<Model> = await this.findBy({
415
+ query: updateBy.query,
416
+ select: {
417
+ projectId: true,
418
+ },
419
+ limit: LIMIT_MAX,
420
+ skip: 0,
421
+ props: {
422
+ isRoot: true,
423
+ ignoreHooks: true,
424
+ },
425
+ });
426
+
427
+ const projectIds: Dictionary<ObjectID> = {};
428
+
429
+ for (const monitor of monitors) {
430
+ if (monitor.projectId) {
431
+ projectIds[monitor.projectId.toString()] = monitor.projectId;
432
+ }
433
+ }
434
+
435
+ return Object.values(projectIds);
436
+ }
437
+
385
438
  @CaptureSpan()
386
439
  protected override async onUpdateSuccess(
387
440
  onUpdate: OnUpdate<Model>,
@@ -602,6 +655,11 @@ export class Service extends DatabaseService<Model> {
602
655
  throw new BadDataException("ProjectId required to create monitor.");
603
656
  }
604
657
 
658
+ await MonitorStepsProjectValidator.validateMonitorStepsBelongToProject({
659
+ monitorSteps: createBy.data.monitorSteps,
660
+ projectId: createBy.props.tenantId,
661
+ });
662
+
605
663
  const monitorStatus: MonitorStatus | null =
606
664
  await MonitorStatusService.findOneBy({
607
665
  query: {
@@ -705,6 +763,34 @@ ${createdItem.description?.trim() || "No description provided."}
705
763
  feedInfoInMarkdown += `\n\n`;
706
764
  }
707
765
 
766
+ /*
767
+ * Probes are attached inline rather than on the detached chain below: the
768
+ * create form redirects straight to the monitor, and a monitor that shows
769
+ * no probes for a second or two reads as "the probe was never assigned".
770
+ * Failures are logged, never thrown - a probe problem must not fail the
771
+ * monitor create.
772
+ */
773
+ if (
774
+ createdItem.monitorType &&
775
+ MonitorTypeHelper.isProbableMonitor(createdItem.monitorType)
776
+ ) {
777
+ try {
778
+ await this.addProbesToMonitor({
779
+ projectId: createdItem.projectId,
780
+ monitorId: createdItem.id,
781
+ selectedProbeIds: this.getSelectedProbeIdsFromMiscDataProps(
782
+ onCreate.createBy.miscDataProps,
783
+ ),
784
+ });
785
+ } catch (error) {
786
+ logger.error("Add probes failed in MonitorService.onCreateSuccess", {
787
+ projectId: createdItem.projectId?.toString(),
788
+ monitorId: createdItem.id?.toString(),
789
+ } as LogAttributes);
790
+ logger.error(error as Error);
791
+ }
792
+ }
793
+
708
794
  // Execute operations sequentially with error handling (workspace first)
709
795
  Promise.resolve()
710
796
  .then(async () => {
@@ -751,30 +837,6 @@ ${createdItem.description?.trim() || "No description provided."}
751
837
  return Promise.resolve();
752
838
  }
753
839
  })
754
- .then(async () => {
755
- try {
756
- if (
757
- createdItem.monitorType &&
758
- MonitorTypeHelper.isProbableMonitor(createdItem.monitorType)
759
- ) {
760
- return await this.addDefaultProbesToMonitor(
761
- createdItem.projectId!,
762
- createdItem.id!,
763
- );
764
- }
765
- return Promise.resolve();
766
- } catch (error) {
767
- logger.error(
768
- "Add default probes failed in MonitorService.onCreateSuccess",
769
- {
770
- projectId: createdItem.projectId?.toString(),
771
- monitorId: createdItem.id?.toString(),
772
- } as LogAttributes,
773
- );
774
- logger.error(error as Error);
775
- return Promise.resolve();
776
- }
777
- })
778
840
  .then(async () => {
779
841
  try {
780
842
  if (IsBillingEnabled) {
@@ -1069,6 +1131,134 @@ ${createdItem.description?.trim() || "No description provided."}
1069
1131
  }
1070
1132
  }
1071
1133
 
1134
+ /*
1135
+ * The monitor create form sends the probes the user picked through
1136
+ * miscDataProps (the same side channel the owner fields use). They arrive as
1137
+ * plain strings because miscDataProps is not run through the model
1138
+ * serializer, so normalise before anything else touches them.
1139
+ */
1140
+ public getSelectedProbeIdsFromMiscDataProps(
1141
+ miscDataProps: JSONObject | undefined,
1142
+ ): Array<ObjectID> | undefined {
1143
+ const rawProbeIds: JSONValue | undefined = miscDataProps?.["probes"];
1144
+
1145
+ if (!Array.isArray(rawProbeIds)) {
1146
+ // Nothing was sent (API clients, templates) - fall back to the defaults.
1147
+ return undefined;
1148
+ }
1149
+
1150
+ const probeIds: Array<ObjectID> = [];
1151
+ const seen: Set<string> = new Set<string>();
1152
+
1153
+ for (const rawProbeId of rawProbeIds) {
1154
+ if (!rawProbeId) {
1155
+ continue;
1156
+ }
1157
+
1158
+ const probeId: string =
1159
+ rawProbeId instanceof ObjectID
1160
+ ? rawProbeId.toString()
1161
+ : String(rawProbeId);
1162
+
1163
+ if (!probeId || seen.has(probeId)) {
1164
+ continue;
1165
+ }
1166
+
1167
+ seen.add(probeId);
1168
+ probeIds.push(new ObjectID(probeId));
1169
+ }
1170
+
1171
+ return probeIds;
1172
+ }
1173
+
1174
+ /*
1175
+ * Attaches the probes the user explicitly selected at create time, or the
1176
+ * project's auto-enable defaults when no selection was made. An explicit but
1177
+ * empty selection means "no probes" and is honoured as such.
1178
+ */
1179
+ @CaptureSpan()
1180
+ public async addProbesToMonitor(data: {
1181
+ projectId: ObjectID | undefined;
1182
+ monitorId: ObjectID | undefined | null;
1183
+ selectedProbeIds: Array<ObjectID> | undefined;
1184
+ }): Promise<void> {
1185
+ if (!data.projectId) {
1186
+ throw new BadDataException("projectId is required");
1187
+ }
1188
+
1189
+ if (!data.monitorId) {
1190
+ throw new BadDataException("monitorId is required");
1191
+ }
1192
+
1193
+ if (data.selectedProbeIds === undefined) {
1194
+ return await this.addDefaultProbesToMonitor(
1195
+ data.projectId,
1196
+ data.monitorId,
1197
+ );
1198
+ }
1199
+
1200
+ return await this.addSelectedProbesToMonitor(
1201
+ data.projectId,
1202
+ data.monitorId,
1203
+ data.selectedProbeIds,
1204
+ );
1205
+ }
1206
+
1207
+ /*
1208
+ * Only global probes and probes belonging to this project may be attached -
1209
+ * the id list comes from the browser, so it cannot be trusted to stay inside
1210
+ * the tenant.
1211
+ */
1212
+ @CaptureSpan()
1213
+ public async addSelectedProbesToMonitor(
1214
+ projectId: ObjectID,
1215
+ monitorId: ObjectID,
1216
+ probeIds: Array<ObjectID>,
1217
+ ): Promise<void> {
1218
+ if (probeIds.length === 0) {
1219
+ return;
1220
+ }
1221
+
1222
+ const [globalProbes, projectProbes]: [Array<Probe>, Array<Probe>] =
1223
+ await Promise.all([
1224
+ ProbeService.findBy({
1225
+ query: {
1226
+ _id: QueryHelper.any(probeIds),
1227
+ isGlobalProbe: true,
1228
+ },
1229
+ select: {
1230
+ _id: true,
1231
+ },
1232
+ skip: 0,
1233
+ limit: LIMIT_PER_PROJECT,
1234
+ props: {
1235
+ isRoot: true,
1236
+ },
1237
+ }),
1238
+ ProbeService.findBy({
1239
+ query: {
1240
+ _id: QueryHelper.any(probeIds),
1241
+ isGlobalProbe: false,
1242
+ projectId: projectId,
1243
+ },
1244
+ select: {
1245
+ _id: true,
1246
+ },
1247
+ skip: 0,
1248
+ limit: LIMIT_PER_PROJECT,
1249
+ props: {
1250
+ isRoot: true,
1251
+ },
1252
+ }),
1253
+ ]);
1254
+
1255
+ await this.createMonitorProbes({
1256
+ projectId: projectId,
1257
+ monitorId: monitorId,
1258
+ probes: [...globalProbes, ...projectProbes],
1259
+ });
1260
+ }
1261
+
1072
1262
  @CaptureSpan()
1073
1263
  public async addDefaultProbesToMonitor(
1074
1264
  projectId: ObjectID,
@@ -1124,20 +1314,31 @@ ${createdItem.description?.trim() || "No description provided."}
1124
1314
  },
1125
1315
  });
1126
1316
 
1127
- const totalProbes: Array<Probe> = [...globalProbes, ...projectProbes];
1317
+ await this.createMonitorProbes({
1318
+ projectId: projectId,
1319
+ monitorId: monitorId,
1320
+ probes: [...globalProbes, ...projectProbes],
1321
+ });
1322
+ }
1128
1323
 
1129
- if (totalProbes.length === 0) {
1324
+ @CaptureSpan()
1325
+ public async createMonitorProbes(data: {
1326
+ projectId: ObjectID;
1327
+ monitorId: ObjectID;
1328
+ probes: Array<Probe>;
1329
+ }): Promise<void> {
1330
+ if (data.probes.length === 0) {
1130
1331
  return;
1131
1332
  }
1132
1333
 
1133
1334
  // Create all monitor probes in parallel for better performance
1134
1335
  const createPromises: Array<Promise<MonitorProbe>> = [];
1135
1336
 
1136
- for (const probe of totalProbes) {
1337
+ for (const probe of data.probes) {
1137
1338
  const monitorProbe: MonitorProbe = new MonitorProbe();
1138
- monitorProbe.monitorId = monitorId;
1339
+ monitorProbe.monitorId = data.monitorId;
1139
1340
  monitorProbe.probeId = probe.id!;
1140
- monitorProbe.projectId = projectId;
1341
+ monitorProbe.projectId = data.projectId;
1141
1342
  monitorProbe.isEnabled = true;
1142
1343
 
1143
1344
  createPromises.push(