@oneuptime/common 12.0.6 → 12.0.8

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 (594) hide show
  1. package/Models/DatabaseModels/AIInsight.ts +1 -1
  2. package/Models/DatabaseModels/DatabaseBaseModel/FileModel.ts +2 -3
  3. package/Models/DatabaseModels/DeletedProject.ts +595 -0
  4. package/Models/DatabaseModels/Index.ts +2 -0
  5. package/Models/DatabaseModels/Monitor.ts +111 -0
  6. package/Models/DatabaseModels/Project.ts +3 -3
  7. package/Models/DatabaseModels/TelemetryEntity.ts +45 -0
  8. package/Models/DatabaseModels/TelemetryEntityRelationship.ts +26 -0
  9. package/Models/DatabaseModels/WorkflowLog.ts +38 -0
  10. package/Models/DatabaseModels/WorkspaceProjectAuthToken.ts +19 -1
  11. package/Server/API/FileAPI.ts +15 -2
  12. package/Server/API/MicrosoftTeamsAPI.ts +6 -1
  13. package/Server/API/ProjectAPI.ts +214 -0
  14. package/Server/API/StatusPageAPI.ts +39 -6
  15. package/Server/API/UserAPI.ts +16 -1
  16. package/Server/Infrastructure/Postgres/SchemaMigrations/1786446545142-MigrationName.ts +50 -0
  17. package/Server/Infrastructure/Postgres/SchemaMigrations/1786449497966-AddMonitorDependency.ts +67 -0
  18. package/Server/Infrastructure/Postgres/SchemaMigrations/1786461136170-AddDeletedProjectTable.ts +39 -0
  19. package/Server/Infrastructure/Postgres/SchemaMigrations/1786551733814-MigrationName.ts +41 -0
  20. package/Server/Infrastructure/Postgres/SchemaMigrations/1786559879134-AddWorkflowLogStepTrace.ts +17 -0
  21. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +10 -0
  22. package/Server/Middleware/MasterAdminAuthorization.ts +11 -6
  23. package/Server/Services/AIAgentService.ts +20 -0
  24. package/Server/Services/DashboardDomainService.ts +73 -28
  25. package/Server/Services/DatabaseService.ts +1 -0
  26. package/Server/Services/DeletedProjectService.ts +138 -0
  27. package/Server/Services/FileService.ts +61 -0
  28. package/Server/Services/IncidentEpisodePublicNoteService.ts +18 -0
  29. package/Server/Services/IncidentPublicNoteService.ts +18 -0
  30. package/Server/Services/Index.ts +2 -0
  31. package/Server/Services/MonitorService.ts +311 -0
  32. package/Server/Services/ProbeService.ts +20 -0
  33. package/Server/Services/ProjectService.ts +297 -1
  34. package/Server/Services/PushNotificationService.ts +71 -0
  35. package/Server/Services/ScheduledMaintenancePublicNoteService.ts +18 -0
  36. package/Server/Services/StatusPageAnnouncementService.ts +53 -0
  37. package/Server/Services/StatusPageDomainService.ts +73 -28
  38. package/Server/Services/TeamMemberService.ts +117 -12
  39. package/Server/Services/TelemetryEntityRelationshipService.ts +3 -0
  40. package/Server/Services/TelemetryEntityService.ts +114 -1
  41. package/Server/Services/TelemetryIngestionKeyService.ts +1 -0
  42. package/Server/Services/UserWebhookService.ts +34 -109
  43. package/Server/Services/WorkspaceNotificationRuleService.ts +69 -0
  44. package/Server/Services/WorkspaceProjectAuthTokenService.ts +37 -1
  45. package/Server/Types/Database/DeleteById.ts +2 -0
  46. package/Server/Types/Database/DeleteOneBy.ts +6 -0
  47. package/Server/Types/Domain.ts +41 -0
  48. package/Server/Types/Workflow/Components/API/Delete.ts +2 -1
  49. package/Server/Types/Workflow/Components/API/Get.ts +2 -1
  50. package/Server/Types/Workflow/Components/API/Patch.ts +2 -1
  51. package/Server/Types/Workflow/Components/API/Post.ts +2 -1
  52. package/Server/Types/Workflow/Components/API/Put.ts +2 -1
  53. package/Server/Types/Workflow/Components/API/Utils.ts +85 -3
  54. package/Server/Types/Workflow/Components/BaseModel/CreateManyBaseModel.ts +25 -19
  55. package/Server/Types/Workflow/Components/BaseModel/CreateOneBaseModel.ts +6 -5
  56. package/Server/Types/Workflow/Components/BaseModel/DeleteManyBaseModel.ts +32 -14
  57. package/Server/Types/Workflow/Components/BaseModel/DeleteOneBaseModel.ts +31 -13
  58. package/Server/Types/Workflow/Components/BaseModel/FindManyBaseModel.ts +29 -20
  59. package/Server/Types/Workflow/Components/BaseModel/FindOneBaseModel.ts +28 -21
  60. package/Server/Types/Workflow/Components/BaseModel/LogComponentError.ts +89 -0
  61. package/Server/Types/Workflow/Components/BaseModel/ModelArguments.ts +208 -0
  62. package/Server/Types/Workflow/Components/BaseModel/OnTriggerBaseModel.ts +11 -0
  63. package/Server/Types/Workflow/Components/BaseModel/UpdateManyBaseModel.ts +41 -18
  64. package/Server/Types/Workflow/Components/BaseModel/UpdateOneBaseModel.ts +45 -19
  65. package/Server/Types/Workflow/Components/Discord/SendMessageToChannel.ts +16 -9
  66. package/Server/Types/Workflow/Components/IncomingWebhookUtils.ts +66 -0
  67. package/Server/Types/Workflow/Components/MicrosoftTeams/SendMessageToChannel.ts +15 -9
  68. package/Server/Types/Workflow/Components/Slack/SendMessageToChannel.ts +17 -0
  69. package/Server/Types/Workflow/TriggerCode.ts +12 -0
  70. package/Server/Types/Workflow/Workflow.ts +5 -0
  71. package/Server/Utils/AI/Chat/ObservabilityChatPrompt.ts +1 -1
  72. package/Server/Utils/AI/CodeFix/CodeAgentWorkspaceGuard.ts +171 -0
  73. package/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.ts +3 -3
  74. package/Server/Utils/AI/SRE/Insights/FixRouting.ts +3 -2
  75. package/Server/Utils/AI/SRE/TelemetryImprovementTaskTrigger.ts +1 -1
  76. package/Server/Utils/AI/Toolbox/CodeWriteTools.ts +6 -6
  77. package/Server/Utils/CodeRepository/GitHub/GitHub.ts +43 -5
  78. package/Server/Utils/DataSource/EgressGuard.ts +176 -16
  79. package/Server/Utils/DataSource/HttpFetch.ts +6 -45
  80. package/Server/Utils/Execute.ts +8 -0
  81. package/Server/Utils/InlineImageAccessTokenSync.ts +23 -0
  82. package/Server/Utils/LLM/LLMService.ts +57 -12
  83. package/Server/Utils/Monitor/MonitorAlert.ts +40 -0
  84. package/Server/Utils/Monitor/MonitorDependencySuppression.ts +192 -0
  85. package/Server/Utils/Monitor/MonitorIncident.ts +40 -0
  86. package/Server/Utils/Monitor/MonitorResource.ts +36 -0
  87. package/Server/Utils/Response.ts +142 -6
  88. package/Server/Utils/SSRFProtection.ts +273 -60
  89. package/Server/Utils/StartServer.ts +8 -0
  90. package/Server/Utils/Telemetry/InventoryEntityRegistry.ts +689 -0
  91. package/Server/Utils/VM/VMAPI.ts +56 -8
  92. package/Server/Utils/VM/VMRunner.ts +88 -1
  93. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +555 -49
  94. package/Server/Utils/Workspace/Slack/Slack.ts +25 -2
  95. package/Server/Utils/Workspace/WorkspaceBase.ts +6 -0
  96. package/Tests/App/Dashboard/DangerZone.test.tsx +334 -0
  97. package/Tests/App/Dashboard/DashboardVariableAllContract.test.tsx +539 -0
  98. package/Tests/App/Dashboard/DashboardVariableSelector.test.tsx +678 -0
  99. package/Tests/App/Dashboard/DashboardVariablesDiscard.test.tsx +706 -0
  100. package/Tests/App/Dashboard/DashboardVariablesModal.test.tsx +508 -0
  101. package/Tests/App/Dashboard/MonitorCriteriaAttributeFilter.test.tsx +574 -0
  102. package/Tests/App/PublicDashboard/DashboardVariableSelector.test.tsx +470 -0
  103. package/Tests/App/StatusPage/StatusPageDetailPagesNotFound.test.tsx +308 -0
  104. package/Tests/Models/DatabaseModels/DeletedProjectModel.test.ts +251 -0
  105. package/Tests/Models/DatabaseModels/SavedViewJSONColumnTuples.test.ts +115 -0
  106. package/Tests/Server/API/FileAPIAccessControl.test.ts +316 -0
  107. package/Tests/Server/API/ProjectAPI.test.ts +299 -1
  108. package/Tests/Server/API/ProjectAPIAdjustBalance.test.ts +459 -0
  109. package/Tests/Server/API/ProjectAPIAdjustBalanceBillingDisabled.test.ts +177 -0
  110. package/Tests/Server/API/UserProjectsAPI.test.ts +478 -4
  111. package/Tests/Server/Services/DatabaseServiceDeletionReason.test.ts +123 -0
  112. package/Tests/Server/Services/DeletedProjectService.test.ts +415 -0
  113. package/Tests/Server/Services/DeletedProjectServiceSelfHosted.test.ts +70 -0
  114. package/Tests/Server/Services/DomainSubdomainHooks.test.ts +94 -0
  115. package/Tests/Server/Services/FileIsPublicBooleanMigration.test.ts +244 -0
  116. package/Tests/Server/Services/FileServiceMimeType.test.ts +89 -0
  117. package/Tests/Server/Services/MonitorServiceDependencyValidation.test.ts +702 -0
  118. package/Tests/Server/Services/ProjectServiceAdjustBalance.test.ts +615 -0
  119. package/Tests/Server/Services/ProjectServiceDeleteAudit.test.ts +406 -0
  120. package/Tests/Server/Services/PublishTimeImageVisibility.test.ts +450 -0
  121. package/Tests/Server/Services/TeamMemberAutoAcceptInvitation.test.ts +669 -0
  122. package/Tests/Server/Services/TelemetryEntityManualCreate.test.ts +248 -0
  123. package/Tests/Server/Services/UserWebhookSSRF.test.ts +174 -0
  124. package/Tests/Server/Services/WebPushEndpointAllowlist.test.ts +133 -0
  125. package/Tests/Server/Services/WorkspaceProjectAuthTokenRepoint.test.ts +618 -0
  126. package/Tests/Server/Types/Workflow/Components/ApiComponentErrorPort.test.ts +26 -1
  127. package/Tests/Server/Types/Workflow/Components/ApiComponentHeaders.test.ts +192 -0
  128. package/Tests/Server/Types/Workflow/Components/ApiComponentSsrf.test.ts +215 -0
  129. package/Tests/Server/Types/Workflow/Components/BaseModelDatabaseComponents.test.ts +742 -0
  130. package/Tests/Server/Types/Workflow/Components/ChatWebhookComponents.test.ts +256 -0
  131. package/Tests/Server/Types/Workflow/Components/ModelArguments.test.ts +371 -0
  132. package/Tests/Server/Utils/AI/CodeAgentCommandGuard.test.ts +204 -0
  133. package/Tests/Server/Utils/AI/CodeAgentWriteLimits.test.ts +213 -0
  134. package/Tests/Server/Utils/AI/CodeWriteTools.test.ts +52 -5
  135. package/Tests/Server/Utils/AI/LLMServiceBaseUrl.test.ts +3 -0
  136. package/Tests/Server/Utils/AI/LLMServiceEgressGuard.test.ts +315 -0
  137. package/Tests/Server/Utils/AI/LLMServiceModelCompatibility.test.ts +3 -0
  138. package/Tests/Server/Utils/AI/LLMServiceRequestPolicy.test.ts +17 -5
  139. package/Tests/Server/Utils/AI/LLMServiceToolCalling.test.ts +14 -1
  140. package/Tests/Server/Utils/AI/ObservabilityChatPrompt.test.ts +35 -0
  141. package/Tests/Server/Utils/AI/StubLLMEgressGuard.ts +25 -0
  142. package/Tests/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.test.ts +152 -0
  143. package/Tests/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.test.ts +62 -7
  144. package/Tests/Server/Utils/DataSource/EgressGuard.test.ts +69 -0
  145. package/Tests/Server/Utils/DataSource/EgressGuardPinning.test.ts +330 -0
  146. package/Tests/Server/Utils/GitHubCreatePullRequestWithToken.test.ts +393 -0
  147. package/Tests/Server/Utils/InlineImageAccessTokenSync.test.ts +202 -0
  148. package/Tests/Server/Utils/Monitor/MonitorDependencySuppression.test.ts +811 -0
  149. package/Tests/Server/Utils/Monitor/MonitorDependencySuppressionCreatorSkip.test.ts +604 -0
  150. package/Tests/Server/Utils/ResponseSendFileResponse.test.ts +192 -0
  151. package/Tests/Server/Utils/SSRFProtectionBypasses.test.ts +406 -0
  152. package/Tests/Server/Utils/Telemetry/InventoryEntityRegistry.test.ts +322 -0
  153. package/Tests/Server/Utils/VM/VMAPISubstitution.test.ts +243 -0
  154. package/Tests/Server/Utils/VM/VMRunnerSsrf.test.ts +194 -0
  155. package/Tests/Server/Utils/Workspace/MicrosoftTeamsChannelSend.test.ts +1169 -0
  156. package/Tests/Server/Utils/Workspace/MicrosoftTeamsChannelsList.test.ts +2 -0
  157. package/Tests/Server/Utils/Workspace/MicrosoftTeamsTeamInstalls.test.ts +1605 -0
  158. package/Tests/Server/Utils/Workspace/MicrosoftTeamsTenantResolution.test.ts +1218 -0
  159. package/Tests/Types/AI/AIChatMessageStatus.test.ts +79 -0
  160. package/Tests/Types/AI/AIInsightStatus.test.ts +40 -0
  161. package/Tests/Types/API/HostnameAuthorityParsing.test.ts +157 -0
  162. package/Tests/Types/Dashboard/DashboardTemplateInvariants.test.ts +27 -0
  163. package/Tests/Types/DataSource/DataSourceLimits.test.ts +71 -0
  164. package/Tests/Types/DataSource/DataSourceType.test.ts +181 -0
  165. package/Tests/Types/DomainSubdomainValidation.test.ts +90 -0
  166. package/Tests/Types/JSONFunctions.test.ts +252 -1
  167. package/Tests/Types/Monitor/SnmpMonitor/SnmpAuthProtocol.test.ts +61 -0
  168. package/Tests/Types/Monitor/SnmpMonitor/SnmpPrivProtocol.test.ts +62 -0
  169. package/Tests/Types/Monitor/SnmpMonitor/SnmpSecurityLevel.test.ts +68 -0
  170. package/Tests/Types/Monitor/SnmpMonitor/SnmpVersion.test.ts +51 -0
  171. package/Tests/Types/SerializableObjectDictionaryImportCycle.test.ts +197 -0
  172. package/Tests/Types/Telemetry/EntityTypeGroups.test.ts +140 -0
  173. package/Tests/Types/Workflow/StepTrace.test.ts +235 -0
  174. package/Tests/Types/Workflow/TemplateSyntax.test.ts +379 -0
  175. package/Tests/Types/Workflow/Templates.test.ts +403 -0
  176. package/Tests/UI/Components/404.test.tsx +1 -1
  177. package/Tests/UI/Components/Alert.test.tsx +1 -1
  178. package/Tests/UI/Components/Badge.test.tsx +1 -1
  179. package/Tests/UI/Components/BasicForm.test.tsx +39 -10
  180. package/Tests/UI/Components/Button.test.tsx +1 -1
  181. package/Tests/UI/Components/Card.test.tsx +1 -1
  182. package/Tests/UI/Components/Charts/AxisTickColor.test.tsx +1 -1
  183. package/Tests/UI/Components/ColorViewer.test.tsx +1 -1
  184. package/Tests/UI/Components/ComponentsModal.test.tsx +7 -1
  185. package/Tests/UI/Components/CustomTimeRangeModal.test.tsx +459 -0
  186. package/Tests/UI/Components/DictionaryAttributeFilterRow.test.tsx +477 -0
  187. package/Tests/UI/Components/DictionaryOfStrings.test.tsx +1 -1
  188. package/Tests/UI/Components/Dropdown.test.tsx +1 -1
  189. package/Tests/UI/Components/FilePicker.test.tsx +1 -1
  190. package/Tests/UI/Components/Forms/AnchoredFieldPopupKeyboard.test.tsx +382 -0
  191. package/Tests/UI/Components/Forms/ColorPickerPicking.test.tsx +569 -0
  192. package/Tests/UI/Components/Forms/ValidationJSON.test.ts +241 -0
  193. package/Tests/UI/Components/HiddenText.test.tsx +1 -1
  194. package/Tests/UI/Components/Input.test.tsx +1 -1
  195. package/Tests/UI/Components/Loader.test.tsx +1 -1
  196. package/Tests/UI/Components/LogTimeRangePicker.test.tsx +43 -1
  197. package/Tests/UI/Components/MasterPage.test.tsx +1 -1
  198. package/Tests/UI/Components/ModalPortalDismissal.test.tsx +579 -0
  199. package/Tests/UI/Components/ModelDelete.test.tsx +214 -0
  200. package/Tests/UI/Components/ModelTable/BaseModelTableBulkSelectAll.test.tsx +1 -1
  201. package/Tests/UI/Components/ModelTable/BaseModelTableColumnCustomization.test.tsx +1 -1
  202. package/Tests/UI/Components/ModelTable/BaseModelTableSearchLabels.test.tsx +1 -1
  203. package/Tests/UI/Components/ModelTable/BaseModelTableUrlState.test.tsx +1 -1
  204. package/Tests/UI/Components/ModelTable/CustomFieldColumns.test.tsx +1 -1
  205. package/Tests/UI/Components/NavBar.test.tsx +1 -1
  206. package/Tests/UI/Components/OperatorSelectorKeyboard.test.tsx +1 -1
  207. package/Tests/UI/Components/Pagination.test.tsx +1 -1
  208. package/Tests/UI/Components/Pill.test.tsx +1 -1
  209. package/Tests/UI/Components/Probe.test.tsx +1 -1
  210. package/Tests/UI/Components/ProgressBar.test.tsx +1 -1
  211. package/Tests/UI/Components/RadioButtons.test.tsx +1 -1
  212. package/Tests/UI/Components/SideMenuItem.test.tsx +1 -1
  213. package/Tests/UI/Components/SideOver.test.tsx +500 -6
  214. package/Tests/UI/Components/Tabs.test.tsx +1 -1
  215. package/Tests/UI/Components/TelemetrySearchBar.test.tsx +1 -1
  216. package/Tests/UI/Components/TelemetryTimeRangePicker.test.tsx +50 -8
  217. package/Tests/UI/Components/TextArea.test.tsx +1 -1
  218. package/Tests/UI/Components/TimeRangePickerDropdown.test.tsx +325 -0
  219. package/Tests/UI/Components/Toast.test.tsx +1 -1
  220. package/Tests/UI/Components/Toggle.test.tsx +1 -1
  221. package/Tests/UI/Components/TopSection.test.tsx +1 -1
  222. package/Tests/UI/Components/UseLiveLogsRefresh.test.tsx +1 -1
  223. package/Tests/UI/Components/Workflow/GraphLint.test.ts +821 -0
  224. package/Tests/UI/Components/Workflow/ModelColumnEditor.test.ts +287 -0
  225. package/Tests/UI/Components/Workflow/ModelColumnEditorServerContract.test.ts +185 -0
  226. package/Tests/UI/Components/Workflow/ModelSchema.test.ts +174 -0
  227. package/Tests/UI/Components/Workflow/RunStatusWatcher.test.ts +152 -0
  228. package/Tests/UI/Components/Workflow/Utils.test.ts +192 -0
  229. package/Tests/UI/Monitor/MonitorStepCriteriaView.test.tsx +432 -0
  230. package/Tests/UI/Rum/ReplayScrubber.test.tsx +1 -1
  231. package/Tests/UI/Rum/ReplayStage.test.tsx +1 -1
  232. package/Tests/UI/Telemetry/TelemetrySnapshotWindowAlert.test.tsx +1 -1
  233. package/Tests/UI/Utils/LocalStorageArrayRoundTrip.test.ts +72 -0
  234. package/Tests/Utils/Dashboard/HtmlWidgetDocument.test.ts +19 -2
  235. package/Tests/Utils/Dashboard/ModelQueryVariableInterpolation.test.ts +44 -0
  236. package/Tests/Utils/Dashboard/VariableInterpolation.test.ts +288 -5
  237. package/Tests/Utils/Dashboard/VariableUrlState.test.ts +42 -0
  238. package/Tests/Utils/DataSource/DataSourceQueryText.test.ts +27 -0
  239. package/Tests/Utils/LegacySerializedArray.test.ts +139 -0
  240. package/Tests/Utils/Monitor/MonitorDependencyRule.test.ts +190 -0
  241. package/Tests/Utils/Monitor/NetworkDeviceRoleUtil.test.ts +514 -0
  242. package/Tests/Utils/Monitor/NetworkTopologyUtil.test.ts +240 -0
  243. package/Tests/Utils/Realtime.test.ts +78 -0
  244. package/Tests/Utils/Schema/AnalyticsModelSchema.test.ts +469 -0
  245. package/Tests/Utils/Schema/ModelSchema.test.ts +268 -0
  246. package/Tests/Utils/Telemetry/EntityKeyNonTelemetry.test.ts +193 -0
  247. package/Tests/Utils/Telemetry/SavedViewFilters.test.ts +246 -0
  248. package/Tests/__mocks__/i18next-browser-languagedetector.js +21 -0
  249. package/Types/AI/FixPullRequestCiStatus.ts +1 -1
  250. package/Types/AI/FixVerificationStatus.ts +2 -2
  251. package/Types/API/Hostname.ts +92 -4
  252. package/Types/API/URL.ts +43 -25
  253. package/Types/Billing/BalanceAdjustmentType.ts +14 -0
  254. package/Types/Billing/ProjectBalanceType.ts +13 -0
  255. package/Types/Domain.ts +26 -0
  256. package/Types/File/MimeType.ts +11 -0
  257. package/Types/JSONFunctions.ts +15 -0
  258. package/Types/Monitor/SnmpMonitor/NetworkTopology.ts +31 -0
  259. package/Types/SerializableObjectDictionary.ts +133 -39
  260. package/Types/Telemetry/EntitySource.ts +40 -0
  261. package/Types/Telemetry/EntityType.ts +27 -0
  262. package/Types/Telemetry/EntityTypeGroups.ts +65 -0
  263. package/Types/Telemetry/TelemetrySavedViewState.ts +9 -1
  264. package/Types/Workflow/Component.ts +29 -0
  265. package/Types/Workflow/Components/API.ts +35 -0
  266. package/Types/Workflow/Components/BaseModel.ts +96 -28
  267. package/Types/Workflow/StepTrace.ts +181 -0
  268. package/Types/Workflow/TemplateSyntax.ts +499 -0
  269. package/Types/Workflow/Templates.ts +316 -0
  270. package/Typings/Index.d.ts +12 -0
  271. package/UI/Components/Date/CustomTimeRangeModal.tsx +278 -0
  272. package/UI/Components/Date/TimeRangePickerDropdown.tsx +250 -0
  273. package/UI/Components/Dictionary/Dictionary.tsx +23 -6
  274. package/UI/Components/Forms/Fields/ColorPicker.tsx +66 -10
  275. package/UI/Components/Forms/Fields/IconPicker.tsx +48 -10
  276. package/UI/Components/Forms/Types/Field.ts +7 -0
  277. package/UI/Components/Forms/Validation.ts +63 -1
  278. package/UI/Components/GanttChart/ChartContainer.tsx +4 -3
  279. package/UI/Components/Input/Input.tsx +31 -3
  280. package/UI/Components/LogsViewer/components/LogTimeRangePicker.tsx +11 -216
  281. package/UI/Components/Modal/ConfirmModal.tsx +10 -5
  282. package/UI/Components/Modal/Modal.tsx +64 -51
  283. package/UI/Components/ModelDelete/ModelDelete.tsx +23 -6
  284. package/UI/Components/SideOver/SideOver.tsx +195 -68
  285. package/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.tsx +11 -210
  286. package/UI/Components/Workflow/ArgumentsForm.tsx +194 -7
  287. package/UI/Components/Workflow/Component.tsx +28 -26
  288. package/UI/Components/Workflow/ComponentSettingsModal.tsx +69 -8
  289. package/UI/Components/Workflow/GraphLint.ts +591 -0
  290. package/UI/Components/Workflow/ModelColumnEditor.tsx +396 -0
  291. package/UI/Components/Workflow/ModelSchema.ts +196 -0
  292. package/UI/Components/Workflow/RunForm.tsx +41 -7
  293. package/UI/Components/Workflow/RunStatusWatcher.ts +122 -0
  294. package/UI/Components/Workflow/StepTraceViewer.tsx +186 -0
  295. package/UI/Components/Workflow/Utils.ts +93 -1
  296. package/UI/Components/Workflow/Workflow.tsx +77 -4
  297. package/UI/Types/LayeredDismissal.ts +31 -0
  298. package/UI/Types/UseAnchoredFieldPopup.ts +99 -0
  299. package/UI/Utils/PageScrollLock.ts +66 -0
  300. package/Utils/Dashboard/HtmlWidgetDocument.ts +4 -2
  301. package/Utils/Dashboard/VariableInterpolation.ts +19 -1
  302. package/Utils/LegacySerializedArray.ts +60 -0
  303. package/Utils/Monitor/MonitorDependencyRule.ts +88 -0
  304. package/Utils/Monitor/NetworkDeviceRoleUtil.ts +533 -0
  305. package/Utils/Monitor/NetworkTopologyUtil.ts +45 -7
  306. package/Utils/Telemetry/EntityKey.ts +66 -0
  307. package/Utils/Telemetry/SavedViewFilters.ts +88 -0
  308. package/build/dist/Models/DatabaseModels/AIInsight.js +1 -1
  309. package/build/dist/Models/DatabaseModels/AIInsight.js.map +1 -1
  310. package/build/dist/Models/DatabaseModels/DatabaseBaseModel/FileModel.js +2 -3
  311. package/build/dist/Models/DatabaseModels/DatabaseBaseModel/FileModel.js.map +1 -1
  312. package/build/dist/Models/DatabaseModels/DeletedProject.js +640 -0
  313. package/build/dist/Models/DatabaseModels/DeletedProject.js.map +1 -0
  314. package/build/dist/Models/DatabaseModels/Index.js +2 -0
  315. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  316. package/build/dist/Models/DatabaseModels/Monitor.js +106 -0
  317. package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
  318. package/build/dist/Models/DatabaseModels/Project.js +3 -3
  319. package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
  320. package/build/dist/Models/DatabaseModels/TelemetryEntity.js +47 -0
  321. package/build/dist/Models/DatabaseModels/TelemetryEntity.js.map +1 -1
  322. package/build/dist/Models/DatabaseModels/TelemetryEntityRelationship.js +27 -0
  323. package/build/dist/Models/DatabaseModels/TelemetryEntityRelationship.js.map +1 -1
  324. package/build/dist/Models/DatabaseModels/WorkflowLog.js +39 -0
  325. package/build/dist/Models/DatabaseModels/WorkflowLog.js.map +1 -1
  326. package/build/dist/Models/DatabaseModels/WorkspaceProjectAuthToken.js.map +1 -1
  327. package/build/dist/Server/API/FileAPI.js +14 -2
  328. package/build/dist/Server/API/FileAPI.js.map +1 -1
  329. package/build/dist/Server/API/MicrosoftTeamsAPI.js +6 -1
  330. package/build/dist/Server/API/MicrosoftTeamsAPI.js.map +1 -1
  331. package/build/dist/Server/API/ProjectAPI.js +157 -4
  332. package/build/dist/Server/API/ProjectAPI.js.map +1 -1
  333. package/build/dist/Server/API/StatusPageAPI.js +27 -3
  334. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  335. package/build/dist/Server/API/UserAPI.js +16 -1
  336. package/build/dist/Server/API/UserAPI.js.map +1 -1
  337. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786446545142-MigrationName.js +34 -0
  338. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786446545142-MigrationName.js.map +1 -0
  339. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786449497966-AddMonitorDependency.js +30 -0
  340. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786449497966-AddMonitorDependency.js.map +1 -0
  341. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786461136170-AddDeletedProjectTable.js +20 -0
  342. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786461136170-AddDeletedProjectTable.js.map +1 -0
  343. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786551733814-MigrationName.js +20 -0
  344. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786551733814-MigrationName.js.map +1 -0
  345. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786559879134-AddWorkflowLogStepTrace.js +12 -0
  346. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786559879134-AddWorkflowLogStepTrace.js.map +1 -0
  347. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +10 -0
  348. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  349. package/build/dist/Server/Middleware/MasterAdminAuthorization.js +11 -6
  350. package/build/dist/Server/Middleware/MasterAdminAuthorization.js.map +1 -1
  351. package/build/dist/Server/Services/AIAgentService.js +17 -0
  352. package/build/dist/Server/Services/AIAgentService.js.map +1 -1
  353. package/build/dist/Server/Services/DashboardDomainService.js +55 -18
  354. package/build/dist/Server/Services/DashboardDomainService.js.map +1 -1
  355. package/build/dist/Server/Services/DatabaseService.js +1 -0
  356. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  357. package/build/dist/Server/Services/DeletedProjectService.js +124 -0
  358. package/build/dist/Server/Services/DeletedProjectService.js.map +1 -0
  359. package/build/dist/Server/Services/FileService.js +52 -0
  360. package/build/dist/Server/Services/FileService.js.map +1 -1
  361. package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js +10 -1
  362. package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js.map +1 -1
  363. package/build/dist/Server/Services/IncidentPublicNoteService.js +10 -1
  364. package/build/dist/Server/Services/IncidentPublicNoteService.js.map +1 -1
  365. package/build/dist/Server/Services/Index.js +2 -0
  366. package/build/dist/Server/Services/Index.js.map +1 -1
  367. package/build/dist/Server/Services/MonitorService.js +232 -0
  368. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  369. package/build/dist/Server/Services/ProbeService.js +17 -0
  370. package/build/dist/Server/Services/ProbeService.js.map +1 -1
  371. package/build/dist/Server/Services/ProjectService.js +228 -6
  372. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  373. package/build/dist/Server/Services/PushNotificationService.js +56 -0
  374. package/build/dist/Server/Services/PushNotificationService.js.map +1 -1
  375. package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js +10 -1
  376. package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js.map +1 -1
  377. package/build/dist/Server/Services/StatusPageAnnouncementService.js +54 -0
  378. package/build/dist/Server/Services/StatusPageAnnouncementService.js.map +1 -1
  379. package/build/dist/Server/Services/StatusPageDomainService.js +55 -18
  380. package/build/dist/Server/Services/StatusPageDomainService.js.map +1 -1
  381. package/build/dist/Server/Services/TeamMemberService.js +97 -6
  382. package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
  383. package/build/dist/Server/Services/TelemetryEntityRelationshipService.js +3 -0
  384. package/build/dist/Server/Services/TelemetryEntityRelationshipService.js.map +1 -1
  385. package/build/dist/Server/Services/TelemetryEntityService.js +91 -1
  386. package/build/dist/Server/Services/TelemetryEntityService.js.map +1 -1
  387. package/build/dist/Server/Services/TelemetryIngestionKeyService.js +1 -0
  388. package/build/dist/Server/Services/TelemetryIngestionKeyService.js.map +1 -1
  389. package/build/dist/Server/Services/UserWebhookService.js +31 -87
  390. package/build/dist/Server/Services/UserWebhookService.js.map +1 -1
  391. package/build/dist/Server/Services/WorkspaceNotificationRuleService.js +65 -0
  392. package/build/dist/Server/Services/WorkspaceNotificationRuleService.js.map +1 -1
  393. package/build/dist/Server/Services/WorkspaceProjectAuthTokenService.js +23 -0
  394. package/build/dist/Server/Services/WorkspaceProjectAuthTokenService.js.map +1 -1
  395. package/build/dist/Server/Types/Domain.js +37 -0
  396. package/build/dist/Server/Types/Domain.js.map +1 -1
  397. package/build/dist/Server/Types/Workflow/Components/API/Delete.js +2 -1
  398. package/build/dist/Server/Types/Workflow/Components/API/Delete.js.map +1 -1
  399. package/build/dist/Server/Types/Workflow/Components/API/Get.js +2 -1
  400. package/build/dist/Server/Types/Workflow/Components/API/Get.js.map +1 -1
  401. package/build/dist/Server/Types/Workflow/Components/API/Patch.js +2 -1
  402. package/build/dist/Server/Types/Workflow/Components/API/Patch.js.map +1 -1
  403. package/build/dist/Server/Types/Workflow/Components/API/Post.js +2 -1
  404. package/build/dist/Server/Types/Workflow/Components/API/Post.js.map +1 -1
  405. package/build/dist/Server/Types/Workflow/Components/API/Put.js +2 -1
  406. package/build/dist/Server/Types/Workflow/Components/API/Put.js.map +1 -1
  407. package/build/dist/Server/Types/Workflow/Components/API/Utils.js +63 -2
  408. package/build/dist/Server/Types/Workflow/Components/API/Utils.js.map +1 -1
  409. package/build/dist/Server/Types/Workflow/Components/BaseModel/CreateManyBaseModel.js +15 -11
  410. package/build/dist/Server/Types/Workflow/Components/BaseModel/CreateManyBaseModel.js.map +1 -1
  411. package/build/dist/Server/Types/Workflow/Components/BaseModel/CreateOneBaseModel.js +2 -3
  412. package/build/dist/Server/Types/Workflow/Components/BaseModel/CreateOneBaseModel.js.map +1 -1
  413. package/build/dist/Server/Types/Workflow/Components/BaseModel/DeleteManyBaseModel.js +21 -10
  414. package/build/dist/Server/Types/Workflow/Components/BaseModel/DeleteManyBaseModel.js.map +1 -1
  415. package/build/dist/Server/Types/Workflow/Components/BaseModel/DeleteOneBaseModel.js +21 -10
  416. package/build/dist/Server/Types/Workflow/Components/BaseModel/DeleteOneBaseModel.js.map +1 -1
  417. package/build/dist/Server/Types/Workflow/Components/BaseModel/FindManyBaseModel.js +18 -13
  418. package/build/dist/Server/Types/Workflow/Components/BaseModel/FindManyBaseModel.js.map +1 -1
  419. package/build/dist/Server/Types/Workflow/Components/BaseModel/FindOneBaseModel.js +18 -13
  420. package/build/dist/Server/Types/Workflow/Components/BaseModel/FindOneBaseModel.js.map +1 -1
  421. package/build/dist/Server/Types/Workflow/Components/BaseModel/LogComponentError.js +43 -0
  422. package/build/dist/Server/Types/Workflow/Components/BaseModel/LogComponentError.js.map +1 -0
  423. package/build/dist/Server/Types/Workflow/Components/BaseModel/ModelArguments.js +116 -0
  424. package/build/dist/Server/Types/Workflow/Components/BaseModel/ModelArguments.js.map +1 -0
  425. package/build/dist/Server/Types/Workflow/Components/BaseModel/OnTriggerBaseModel.js +7 -0
  426. package/build/dist/Server/Types/Workflow/Components/BaseModel/OnTriggerBaseModel.js.map +1 -1
  427. package/build/dist/Server/Types/Workflow/Components/BaseModel/UpdateManyBaseModel.js +24 -13
  428. package/build/dist/Server/Types/Workflow/Components/BaseModel/UpdateManyBaseModel.js.map +1 -1
  429. package/build/dist/Server/Types/Workflow/Components/BaseModel/UpdateOneBaseModel.js +27 -13
  430. package/build/dist/Server/Types/Workflow/Components/BaseModel/UpdateOneBaseModel.js.map +1 -1
  431. package/build/dist/Server/Types/Workflow/Components/Discord/SendMessageToChannel.js +14 -6
  432. package/build/dist/Server/Types/Workflow/Components/Discord/SendMessageToChannel.js.map +1 -1
  433. package/build/dist/Server/Types/Workflow/Components/IncomingWebhookUtils.js +42 -0
  434. package/build/dist/Server/Types/Workflow/Components/IncomingWebhookUtils.js.map +1 -0
  435. package/build/dist/Server/Types/Workflow/Components/MicrosoftTeams/SendMessageToChannel.js +15 -6
  436. package/build/dist/Server/Types/Workflow/Components/MicrosoftTeams/SendMessageToChannel.js.map +1 -1
  437. package/build/dist/Server/Types/Workflow/Components/Slack/SendMessageToChannel.js +10 -2
  438. package/build/dist/Server/Types/Workflow/Components/Slack/SendMessageToChannel.js.map +1 -1
  439. package/build/dist/Server/Types/Workflow/TriggerCode.js.map +1 -1
  440. package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js +1 -1
  441. package/build/dist/Server/Utils/AI/CodeFix/CodeAgentWorkspaceGuard.js +141 -0
  442. package/build/dist/Server/Utils/AI/CodeFix/CodeAgentWorkspaceGuard.js.map +1 -1
  443. package/build/dist/Server/Utils/AI/SRE/Insights/FixRouting.js.map +1 -1
  444. package/build/dist/Server/Utils/AI/SRE/TelemetryImprovementTaskTrigger.js +1 -1
  445. package/build/dist/Server/Utils/AI/Toolbox/CodeWriteTools.js +6 -6
  446. package/build/dist/Server/Utils/AI/Toolbox/CodeWriteTools.js.map +1 -1
  447. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js +39 -5
  448. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js.map +1 -1
  449. package/build/dist/Server/Utils/DataSource/EgressGuard.js +94 -10
  450. package/build/dist/Server/Utils/DataSource/EgressGuard.js.map +1 -1
  451. package/build/dist/Server/Utils/DataSource/HttpFetch.js +1 -19
  452. package/build/dist/Server/Utils/DataSource/HttpFetch.js.map +1 -1
  453. package/build/dist/Server/Utils/Execute.js +2 -2
  454. package/build/dist/Server/Utils/Execute.js.map +1 -1
  455. package/build/dist/Server/Utils/InlineImageAccessTokenSync.js +13 -0
  456. package/build/dist/Server/Utils/InlineImageAccessTokenSync.js.map +1 -1
  457. package/build/dist/Server/Utils/LLM/LLMService.js +43 -12
  458. package/build/dist/Server/Utils/LLM/LLMService.js.map +1 -1
  459. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +44 -24
  460. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  461. package/build/dist/Server/Utils/Monitor/MonitorDependencySuppression.js +158 -0
  462. package/build/dist/Server/Utils/Monitor/MonitorDependencySuppression.js.map +1 -0
  463. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +50 -30
  464. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  465. package/build/dist/Server/Utils/Monitor/MonitorResource.js +32 -0
  466. package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
  467. package/build/dist/Server/Utils/Response.js +112 -5
  468. package/build/dist/Server/Utils/Response.js.map +1 -1
  469. package/build/dist/Server/Utils/SSRFProtection.js +219 -53
  470. package/build/dist/Server/Utils/SSRFProtection.js.map +1 -1
  471. package/build/dist/Server/Utils/StartServer.js +7 -0
  472. package/build/dist/Server/Utils/StartServer.js.map +1 -1
  473. package/build/dist/Server/Utils/Telemetry/InventoryEntityRegistry.js +507 -0
  474. package/build/dist/Server/Utils/Telemetry/InventoryEntityRegistry.js.map +1 -0
  475. package/build/dist/Server/Utils/VM/VMAPI.js +51 -4
  476. package/build/dist/Server/Utils/VM/VMAPI.js.map +1 -1
  477. package/build/dist/Server/Utils/VM/VMRunner.js +73 -1
  478. package/build/dist/Server/Utils/VM/VMRunner.js.map +1 -1
  479. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +445 -43
  480. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
  481. package/build/dist/Server/Utils/Workspace/Slack/Slack.js +18 -1
  482. package/build/dist/Server/Utils/Workspace/Slack/Slack.js.map +1 -1
  483. package/build/dist/Server/Utils/Workspace/WorkspaceBase.js.map +1 -1
  484. package/build/dist/Types/AI/FixPullRequestCiStatus.js +1 -1
  485. package/build/dist/Types/AI/FixVerificationStatus.js +2 -2
  486. package/build/dist/Types/API/Hostname.js +73 -4
  487. package/build/dist/Types/API/Hostname.js.map +1 -1
  488. package/build/dist/Types/API/URL.js +42 -24
  489. package/build/dist/Types/API/URL.js.map +1 -1
  490. package/build/dist/Types/Billing/BalanceAdjustmentType.js +15 -0
  491. package/build/dist/Types/Billing/BalanceAdjustmentType.js.map +1 -0
  492. package/build/dist/Types/Billing/ProjectBalanceType.js +14 -0
  493. package/build/dist/Types/Billing/ProjectBalanceType.js.map +1 -0
  494. package/build/dist/Types/Domain.js +22 -0
  495. package/build/dist/Types/Domain.js.map +1 -1
  496. package/build/dist/Types/File/MimeType.js +11 -0
  497. package/build/dist/Types/File/MimeType.js.map +1 -1
  498. package/build/dist/Types/JSONFunctions.js +14 -0
  499. package/build/dist/Types/JSONFunctions.js.map +1 -1
  500. package/build/dist/Types/SerializableObjectDictionary.js +133 -39
  501. package/build/dist/Types/SerializableObjectDictionary.js.map +1 -1
  502. package/build/dist/Types/Telemetry/EntitySource.js +39 -0
  503. package/build/dist/Types/Telemetry/EntitySource.js.map +1 -0
  504. package/build/dist/Types/Telemetry/EntityType.js +27 -0
  505. package/build/dist/Types/Telemetry/EntityType.js.map +1 -1
  506. package/build/dist/Types/Telemetry/EntityTypeGroups.js +57 -0
  507. package/build/dist/Types/Telemetry/EntityTypeGroups.js.map +1 -0
  508. package/build/dist/Types/Workflow/Component.js +21 -0
  509. package/build/dist/Types/Workflow/Component.js.map +1 -1
  510. package/build/dist/Types/Workflow/Components/API.js +35 -0
  511. package/build/dist/Types/Workflow/Components/API.js.map +1 -1
  512. package/build/dist/Types/Workflow/Components/BaseModel.js +87 -28
  513. package/build/dist/Types/Workflow/Components/BaseModel.js.map +1 -1
  514. package/build/dist/Types/Workflow/StepTrace.js +104 -0
  515. package/build/dist/Types/Workflow/StepTrace.js.map +1 -0
  516. package/build/dist/Types/Workflow/TemplateSyntax.js +326 -0
  517. package/build/dist/Types/Workflow/TemplateSyntax.js.map +1 -0
  518. package/build/dist/Types/Workflow/Templates.js +218 -0
  519. package/build/dist/Types/Workflow/Templates.js.map +1 -0
  520. package/build/dist/UI/Components/Date/CustomTimeRangeModal.js +126 -0
  521. package/build/dist/UI/Components/Date/CustomTimeRangeModal.js.map +1 -0
  522. package/build/dist/UI/Components/Date/TimeRangePickerDropdown.js +123 -0
  523. package/build/dist/UI/Components/Date/TimeRangePickerDropdown.js.map +1 -0
  524. package/build/dist/UI/Components/Dictionary/Dictionary.js +22 -6
  525. package/build/dist/UI/Components/Dictionary/Dictionary.js.map +1 -1
  526. package/build/dist/UI/Components/Forms/Fields/ColorPicker.js +52 -13
  527. package/build/dist/UI/Components/Forms/Fields/ColorPicker.js.map +1 -1
  528. package/build/dist/UI/Components/Forms/Fields/IconPicker.js +28 -12
  529. package/build/dist/UI/Components/Forms/Fields/IconPicker.js.map +1 -1
  530. package/build/dist/UI/Components/Forms/Validation.js +44 -0
  531. package/build/dist/UI/Components/Forms/Validation.js.map +1 -1
  532. package/build/dist/UI/Components/GanttChart/ChartContainer.js +4 -3
  533. package/build/dist/UI/Components/GanttChart/ChartContainer.js.map +1 -1
  534. package/build/dist/UI/Components/Input/Input.js +12 -4
  535. package/build/dist/UI/Components/Input/Input.js.map +1 -1
  536. package/build/dist/UI/Components/LogsViewer/components/LogTimeRangePicker.js +5 -108
  537. package/build/dist/UI/Components/LogsViewer/components/LogTimeRangePicker.js.map +1 -1
  538. package/build/dist/UI/Components/Modal/ConfirmModal.js +3 -1
  539. package/build/dist/UI/Components/Modal/ConfirmModal.js.map +1 -1
  540. package/build/dist/UI/Components/Modal/Modal.js +55 -39
  541. package/build/dist/UI/Components/Modal/Modal.js.map +1 -1
  542. package/build/dist/UI/Components/ModelDelete/ModelDelete.js +11 -6
  543. package/build/dist/UI/Components/ModelDelete/ModelDelete.js.map +1 -1
  544. package/build/dist/UI/Components/SideOver/SideOver.js +105 -30
  545. package/build/dist/UI/Components/SideOver/SideOver.js.map +1 -1
  546. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.js +5 -105
  547. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.js.map +1 -1
  548. package/build/dist/UI/Components/Workflow/ArgumentsForm.js +140 -11
  549. package/build/dist/UI/Components/Workflow/ArgumentsForm.js.map +1 -1
  550. package/build/dist/UI/Components/Workflow/Component.js +20 -19
  551. package/build/dist/UI/Components/Workflow/Component.js.map +1 -1
  552. package/build/dist/UI/Components/Workflow/ComponentSettingsModal.js +31 -3
  553. package/build/dist/UI/Components/Workflow/ComponentSettingsModal.js.map +1 -1
  554. package/build/dist/UI/Components/Workflow/GraphLint.js +396 -0
  555. package/build/dist/UI/Components/Workflow/GraphLint.js.map +1 -0
  556. package/build/dist/UI/Components/Workflow/ModelColumnEditor.js +225 -0
  557. package/build/dist/UI/Components/Workflow/ModelColumnEditor.js.map +1 -0
  558. package/build/dist/UI/Components/Workflow/ModelSchema.js +118 -0
  559. package/build/dist/UI/Components/Workflow/ModelSchema.js.map +1 -0
  560. package/build/dist/UI/Components/Workflow/RunForm.js +22 -6
  561. package/build/dist/UI/Components/Workflow/RunForm.js.map +1 -1
  562. package/build/dist/UI/Components/Workflow/RunStatusWatcher.js +76 -0
  563. package/build/dist/UI/Components/Workflow/RunStatusWatcher.js.map +1 -0
  564. package/build/dist/UI/Components/Workflow/StepTraceViewer.js +76 -0
  565. package/build/dist/UI/Components/Workflow/StepTraceViewer.js.map +1 -0
  566. package/build/dist/UI/Components/Workflow/Utils.js +73 -1
  567. package/build/dist/UI/Components/Workflow/Utils.js.map +1 -1
  568. package/build/dist/UI/Components/Workflow/Workflow.js +51 -6
  569. package/build/dist/UI/Components/Workflow/Workflow.js.map +1 -1
  570. package/build/dist/UI/Types/LayeredDismissal.js +21 -0
  571. package/build/dist/UI/Types/LayeredDismissal.js.map +1 -0
  572. package/build/dist/UI/Types/UseAnchoredFieldPopup.js +74 -1
  573. package/build/dist/UI/Types/UseAnchoredFieldPopup.js.map +1 -1
  574. package/build/dist/UI/Utils/PageScrollLock.js +52 -0
  575. package/build/dist/UI/Utils/PageScrollLock.js.map +1 -0
  576. package/build/dist/Utils/Dashboard/HtmlWidgetDocument.js +4 -2
  577. package/build/dist/Utils/Dashboard/HtmlWidgetDocument.js.map +1 -1
  578. package/build/dist/Utils/Dashboard/VariableInterpolation.js +19 -1
  579. package/build/dist/Utils/Dashboard/VariableInterpolation.js.map +1 -1
  580. package/build/dist/Utils/LegacySerializedArray.js +51 -0
  581. package/build/dist/Utils/LegacySerializedArray.js.map +1 -0
  582. package/build/dist/Utils/Monitor/MonitorDependencyRule.js +47 -0
  583. package/build/dist/Utils/Monitor/MonitorDependencyRule.js.map +1 -0
  584. package/build/dist/Utils/Monitor/NetworkDeviceRoleUtil.js +386 -0
  585. package/build/dist/Utils/Monitor/NetworkDeviceRoleUtil.js.map +1 -0
  586. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +35 -6
  587. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
  588. package/build/dist/Utils/Telemetry/EntityKey.js +52 -0
  589. package/build/dist/Utils/Telemetry/EntityKey.js.map +1 -1
  590. package/build/dist/Utils/Telemetry/SavedViewFilters.js +52 -0
  591. package/build/dist/Utils/Telemetry/SavedViewFilters.js.map +1 -0
  592. package/jest.config.json +3 -0
  593. package/package.json +1 -1
  594. package/tsconfig.json +3 -1
@@ -309,6 +309,20 @@ export class Service extends DatabaseService<WorkspaceNotificationRule> {
309
309
 
310
310
  // Check for errors in the response
311
311
  if (res.errors && res.errors.length > 0) {
312
+ /*
313
+ * Record the failure before throwing. Test sends used to throw
314
+ * straight out of here, so a failed test left no trace in
315
+ * Notification Logs and support had no way to see what Microsoft
316
+ * or Slack actually said.
317
+ */
318
+ await this.logTestSendFailures({
319
+ projectId: data.projectId,
320
+ workspaceType: res.workspaceType,
321
+ errors: res.errors,
322
+ message: messageSummary,
323
+ userId: data.testByUserId,
324
+ });
325
+
312
326
  const errorMessages: Array<string> = res.errors.map(
313
327
  (error: { channel: WorkspaceChannel; error: string }) => {
314
328
  return `Channel ${error.channel.name}: ${error.error}`;
@@ -408,6 +422,20 @@ export class Service extends DatabaseService<WorkspaceNotificationRule> {
408
422
 
409
423
  // Check for errors in the response
410
424
  if (res.errors && res.errors.length > 0) {
425
+ /*
426
+ * Record the failure before throwing. Test sends used to throw
427
+ * straight out of here, so a failed test left no trace in
428
+ * Notification Logs and support had no way to see what Microsoft
429
+ * or Slack actually said.
430
+ */
431
+ await this.logTestSendFailures({
432
+ projectId: data.projectId,
433
+ workspaceType: res.workspaceType,
434
+ errors: res.errors,
435
+ message: messageSummary,
436
+ userId: data.testByUserId,
437
+ });
438
+
411
439
  const errorMessages: Array<string> = res.errors.map(
412
440
  (error: { channel: WorkspaceChannel; error: string }) => {
413
441
  return `Channel ${error.channel.name}: ${error.error}`;
@@ -540,6 +568,47 @@ export class Service extends DatabaseService<WorkspaceNotificationRule> {
540
568
  }
541
569
  }
542
570
 
571
+ /*
572
+ * Persist per-destination failures from a test send so they show up in
573
+ * Settings > Notification Logs alongside real notification failures. Real
574
+ * sends already log; test sends threw before reaching any logging, which
575
+ * meant the one action an admin takes to diagnose a broken integration was
576
+ * also the only one that recorded nothing.
577
+ *
578
+ * Best-effort: a logging failure must never mask the underlying send error.
579
+ */
580
+ @CaptureSpan()
581
+ private async logTestSendFailures(data: {
582
+ projectId: ObjectID;
583
+ workspaceType: WorkspaceType;
584
+ errors: Array<{ channel: WorkspaceChannel; error: string }>;
585
+ message: string;
586
+ userId: ObjectID;
587
+ }): Promise<void> {
588
+ for (const error of data.errors) {
589
+ try {
590
+ const log: WorkspaceNotificationLog = new WorkspaceNotificationLog();
591
+ log.projectId = data.projectId;
592
+ log.workspaceType = data.workspaceType;
593
+ log.channelId = error.channel.id;
594
+ log.channelName = error.channel.name;
595
+ log.message = data.message;
596
+ log.status = WorkspaceNotificationStatus.Error;
597
+ log.statusMessage = error.error;
598
+ log.userId = data.userId;
599
+ log.actionType = WorkspaceNotificationActionType.SendMessage;
600
+
601
+ await WorkspaceNotificationLogService.create({
602
+ data: log,
603
+ props: { isRoot: true },
604
+ });
605
+ } catch (err) {
606
+ logger.error("Could not write test-send failure to notification log:");
607
+ logger.error(err);
608
+ }
609
+ }
610
+ }
611
+
543
612
  @CaptureSpan()
544
613
  public async archiveWorkspaceChannels(data: {
545
614
  projectId: ObjectID;
@@ -1,5 +1,7 @@
1
1
  import ObjectID from "../../Types/ObjectID";
2
- import WorkspaceType from "../../Types/Workspace/WorkspaceType";
2
+ import WorkspaceType, {
3
+ getWorkspaceTypeDisplayName,
4
+ } from "../../Types/Workspace/WorkspaceType";
3
5
  import DatabaseService from "./DatabaseService";
4
6
  import Model, {
5
7
  WorkspaceMiscData,
@@ -7,6 +9,7 @@ import Model, {
7
9
  import { LIMIT_PER_PROJECT } from "../../Types/Database/LimitMax";
8
10
  import BadDataException from "../../Types/Exception/BadDataException";
9
11
  import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
12
+ import logger from "../Utils/Logger";
10
13
 
11
14
  export class Service extends DatabaseService<Model> {
12
15
  public constructor() {
@@ -112,12 +115,45 @@ export class Service extends DatabaseService<Model> {
112
115
  },
113
116
  select: {
114
117
  _id: true,
118
+ workspaceProjectId: true,
115
119
  },
116
120
  props: {
117
121
  isRoot: true,
118
122
  },
119
123
  });
120
124
 
125
+ /*
126
+ * A project stores exactly one workspace (one Microsoft tenant / one Slack
127
+ * team). Re-running the connect flow from a DIFFERENT workspace used to
128
+ * silently repoint the project, which breaks every existing notification
129
+ * rule and orphans the bot conversations captured under the old workspace —
130
+ * with no error and nothing in the logs.
131
+ *
132
+ * Refuse instead, and tell the admin to disconnect first if the change is
133
+ * deliberate.
134
+ */
135
+ if (
136
+ projectAuth &&
137
+ projectAuth.workspaceProjectId &&
138
+ projectAuth.workspaceProjectId !== data.workspaceProjectId
139
+ ) {
140
+ logger.error(
141
+ `Refusing to repoint ${data.workspaceType} for project ${data.projectId.toString()} from workspace ${projectAuth.workspaceProjectId} to ${data.workspaceProjectId}.`,
142
+ {
143
+ projectId: data.projectId.toString(),
144
+ workspaceType: data.workspaceType,
145
+ },
146
+ );
147
+
148
+ const workspaceName: string = getWorkspaceTypeDisplayName(
149
+ data.workspaceType,
150
+ );
151
+
152
+ throw new BadDataException(
153
+ `This OneUptime project is already connected to a different ${workspaceName} workspace. Disconnect the existing ${workspaceName} connection in Project Settings before connecting a new one.`,
154
+ );
155
+ }
156
+
121
157
  if (!projectAuth) {
122
158
  projectAuth = new Model();
123
159
 
@@ -5,5 +5,7 @@ import User from "../../../Models/DatabaseModels/User";
5
5
  export default interface DeleteById {
6
6
  id: ObjectID;
7
7
  deletedByUser?: User;
8
+ // See DeleteOneBy.deletionReason - passed straight through to the hooks.
9
+ deletionReason?: string | undefined;
8
10
  props: DatabaseCommonInteractionProps;
9
11
  }
@@ -6,5 +6,11 @@ import User from "../../../Models/DatabaseModels/User";
6
6
  export default interface DeleteOneBy<TBaseModel extends BaseModel> {
7
7
  query: Query<TBaseModel>;
8
8
  deletedByUser?: User | undefined;
9
+ /*
10
+ * Free-text reason the caller gave for the delete. Never persisted on the
11
+ * row being deleted (it is about to be gone) - it rides through to the
12
+ * delete hooks, which are the last place that can record it anywhere.
13
+ */
14
+ deletionReason?: string | undefined;
9
15
  props: DatabaseCommonInteractionProps;
10
16
  }
@@ -4,8 +4,49 @@ import { PromiseRejectErrorFunction } from "../../Types/FunctionTypes";
4
4
  import dns from "dns";
5
5
  import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
6
6
  import BadDataException from "../../Types/Exception/BadDataException";
7
+ import HTTPErrorResponse from "../../Types/API/HTTPErrorResponse";
8
+ import HTTPResponse from "../../Types/API/HTTPResponse";
9
+ import { JSONObject } from "../../Types/JSON";
10
+ import URL from "../../Types/API/URL";
11
+ import API from "../../Utils/API";
12
+ import DataSourceEgressGuard from "../Utils/DataSource/EgressGuard";
7
13
 
8
14
  export default class Domain extends DomainCommon {
15
+ /*
16
+ * GET a domain-verification URL built from a tenant-supplied domain.
17
+ *
18
+ * Both the status page and the dashboard build these URLs by interpolating
19
+ * a customer domain into a string, and the certificate cron re-fetches them
20
+ * unattended every 15 minutes — so the target has to be validated on every
21
+ * call, not just when the row was written. The address that was validated
22
+ * is pinned into the socket, and redirects are refused so a 3xx cannot
23
+ * bounce the request to a host that was never checked. (The callers try
24
+ * http first and https second, so the ordinary http→https redirect a
25
+ * customer proxy emits is still covered by the https attempt.)
26
+ *
27
+ * Private ranges stay reachable on self-hosted installs, where a status page
28
+ * domain legitimately resolves inside the corporate network.
29
+ */
30
+ @CaptureSpan()
31
+ public static async getForDomainVerification(data: {
32
+ url: string;
33
+ targetLabel: string;
34
+ }): Promise<HTTPErrorResponse | HTTPResponse<JSONObject>> {
35
+ const { httpAgent, httpsAgent } =
36
+ await DataSourceEgressGuard.assertUrlAllowedAndPin(data.url, {
37
+ targetLabel: data.targetLabel,
38
+ });
39
+
40
+ return API.get<JSONObject>({
41
+ url: URL.fromString(data.url),
42
+ options: {
43
+ doNotFollowRedirects: true,
44
+ httpAgent,
45
+ httpsAgent,
46
+ },
47
+ });
48
+ }
49
+
9
50
  @CaptureSpan()
10
51
  public static getCnameRecords(data: { domain: string }): Promise<string[]> {
11
52
  return new Promise(
@@ -37,7 +37,7 @@ export default class ApiDelete extends ComponentCode {
37
37
  options: RunOptions,
38
38
  ): Promise<RunReturnType> {
39
39
  const result: { args: JSONObject; successPort: Port; errorPort: Port } =
40
- ApiComponentUtils.sanitizeArgs(this.getMetadata(), args, options);
40
+ await ApiComponentUtils.sanitizeArgs(this.getMetadata(), args, options);
41
41
 
42
42
  let apiResult: HTTPResponse<JSONObject> | HTTPErrorResponse | null = null;
43
43
 
@@ -46,6 +46,7 @@ export default class ApiDelete extends ComponentCode {
46
46
  url: args["url"] as URL,
47
47
  data: args["request-body"] as JSONObject,
48
48
  headers: args["request-headers"] as Dictionary<string>,
49
+ options: ApiComponentUtils.requestOptions,
49
50
  });
50
51
 
51
52
  /*
@@ -37,7 +37,7 @@ export default class ApiGet extends ComponentCode {
37
37
  options: RunOptions,
38
38
  ): Promise<RunReturnType> {
39
39
  const result: { args: JSONObject; successPort: Port; errorPort: Port } =
40
- ApiComponentUtils.sanitizeArgs(this.getMetadata(), args, options);
40
+ await ApiComponentUtils.sanitizeArgs(this.getMetadata(), args, options);
41
41
 
42
42
  let apiResult: HTTPResponse<JSONObject> | HTTPErrorResponse | null = null;
43
43
 
@@ -46,6 +46,7 @@ export default class ApiGet extends ComponentCode {
46
46
  url: args["url"] as URL,
47
47
  data: args["request-body"] as JSONObject,
48
48
  headers: args["request-headers"] as Dictionary<string>,
49
+ options: ApiComponentUtils.requestOptions,
49
50
  });
50
51
 
51
52
  /*
@@ -37,7 +37,7 @@ export default class ApiPut extends ComponentCode {
37
37
  options: RunOptions,
38
38
  ): Promise<RunReturnType> {
39
39
  const result: { args: JSONObject; successPort: Port; errorPort: Port } =
40
- ApiComponentUtils.sanitizeArgs(this.getMetadata(), args, options);
40
+ await ApiComponentUtils.sanitizeArgs(this.getMetadata(), args, options);
41
41
 
42
42
  let apiResult: HTTPResponse<JSONObject> | HTTPErrorResponse | null = null;
43
43
 
@@ -46,6 +46,7 @@ export default class ApiPut extends ComponentCode {
46
46
  url: args["url"] as URL,
47
47
  data: args["request-body"] as JSONObject,
48
48
  headers: args["request-headers"] as Dictionary<string>,
49
+ options: ApiComponentUtils.requestOptions,
49
50
  });
50
51
 
51
52
  /*
@@ -38,7 +38,7 @@ export default class ApiPost extends ComponentCode {
38
38
  options: RunOptions,
39
39
  ): Promise<RunReturnType> {
40
40
  const result: { args: JSONObject; successPort: Port; errorPort: Port } =
41
- ApiComponentUtils.sanitizeArgs(this.getMetadata(), args, options);
41
+ await ApiComponentUtils.sanitizeArgs(this.getMetadata(), args, options);
42
42
 
43
43
  let apiResult: HTTPResponse<JSONObject> | HTTPErrorResponse | null = null;
44
44
 
@@ -77,6 +77,7 @@ export default class ApiPost extends ComponentCode {
77
77
  url: args["url"] as URL,
78
78
  data: args["request-body"] as JSONObject,
79
79
  headers: args["request-headers"] as Dictionary<string>,
80
+ options: ApiComponentUtils.requestOptions,
80
81
  });
81
82
 
82
83
  logger.debug("API Post Component is done.", workflowLogAttributes);
@@ -37,7 +37,7 @@ export default class ApiPut extends ComponentCode {
37
37
  options: RunOptions,
38
38
  ): Promise<RunReturnType> {
39
39
  const result: { args: JSONObject; successPort: Port; errorPort: Port } =
40
- ApiComponentUtils.sanitizeArgs(this.getMetadata(), args, options);
40
+ await ApiComponentUtils.sanitizeArgs(this.getMetadata(), args, options);
41
41
 
42
42
  let apiResult: HTTPResponse<JSONObject> | HTTPErrorResponse | null = null;
43
43
 
@@ -46,6 +46,7 @@ export default class ApiPut extends ComponentCode {
46
46
  url: args["url"] as URL,
47
47
  data: args["request-body"] as JSONObject,
48
48
  headers: args["request-headers"] as Dictionary<string>,
49
+ options: ApiComponentUtils.requestOptions,
49
50
  });
50
51
 
51
52
  /*
@@ -3,14 +3,27 @@ import HTTPErrorResponse from "../../../../../Types/API/HTTPErrorResponse";
3
3
  import HTTPResponse from "../../../../../Types/API/HTTPResponse";
4
4
  import URL from "../../../../../Types/API/URL";
5
5
  import BadDataException from "../../../../../Types/Exception/BadDataException";
6
- import { JSONObject } from "../../../../../Types/JSON";
6
+ import Exception from "../../../../../Types/Exception/Exception";
7
+ import { JSONObject, JSONValue } from "../../../../../Types/JSON";
7
8
  import JSONFunctions from "../../../../../Types/JSONFunctions";
8
9
  import ComponentMetadata, {
9
10
  Port,
10
11
  } from "../../../../../Types/Workflow/Component";
12
+ import { RequestOptions } from "../../../../../Utils/API";
13
+ import SSRFProtection from "../../../../Utils/SSRFProtection";
11
14
  import CaptureSpan from "../../../../Utils/Telemetry/CaptureSpan";
12
15
 
13
16
  export class ApiComponentUtils {
17
+ /*
18
+ * Every API component sends its request with these. Redirects MUST stay off:
19
+ * sanitizeArgs validates the URL before the request is dispatched, and a
20
+ * validated public host that answers 302 -> http://169.254.169.254/ would
21
+ * otherwise walk the server straight past that check.
22
+ */
23
+ public static readonly requestOptions: RequestOptions = {
24
+ doNotFollowRedirects: true,
25
+ };
26
+
14
27
  @CaptureSpan()
15
28
  public static getReturnValues(
16
29
  response: HTTPResponse<JSONObject> | HTTPErrorResponse,
@@ -33,11 +46,11 @@ export class ApiComponentUtils {
33
46
  }
34
47
 
35
48
  @CaptureSpan()
36
- public static sanitizeArgs(
49
+ public static async sanitizeArgs(
37
50
  metadata: ComponentMetadata,
38
51
  args: JSONObject,
39
52
  options: RunOptions,
40
- ): { args: JSONObject; successPort: Port; errorPort: Port } {
53
+ ): Promise<{ args: JSONObject; successPort: Port; errorPort: Port }> {
41
54
  const successPort: Port | undefined = metadata.outPorts.find((p: Port) => {
42
55
  return p.id === "success";
43
56
  });
@@ -69,6 +82,49 @@ export class ApiComponentUtils {
69
82
  );
70
83
  }
71
84
 
85
+ /*
86
+ * Headers reach here from a key/value grid that can emit numbers and
87
+ * booleans, from a JSON document someone typed, or from a {{...}}
88
+ * substitution — and every consumer below blind-casts the result to
89
+ * Dictionary<string> before spreading it into the outgoing request. An
90
+ * array or a bare scalar spreads into per-index junk headers rather than
91
+ * failing, so check the shape and flatten the values to strings here.
92
+ */
93
+ if (args["request-headers"]) {
94
+ const headers: JSONValue = args["request-headers"] as JSONValue;
95
+
96
+ if (
97
+ typeof headers !== "object" ||
98
+ headers === null ||
99
+ Array.isArray(headers)
100
+ ) {
101
+ throw options.onError(
102
+ new BadDataException(
103
+ "Request headers must be a JSON object of header names and values.",
104
+ ),
105
+ );
106
+ }
107
+
108
+ const stringifiedHeaders: JSONObject = {};
109
+
110
+ for (const headerName of Object.keys(headers as JSONObject)) {
111
+ const headerValue: JSONValue = (headers as JSONObject)[
112
+ headerName
113
+ ] as JSONValue;
114
+
115
+ if (headerValue === null || headerValue === undefined) {
116
+ continue;
117
+ }
118
+
119
+ stringifiedHeaders[headerName] =
120
+ typeof headerValue === "object"
121
+ ? JSON.stringify(headerValue)
122
+ : String(headerValue);
123
+ }
124
+
125
+ args["request-headers"] = stringifiedHeaders;
126
+ }
127
+
72
128
  if (!args["url"]) {
73
129
  throw options.onError(new BadDataException("URL not found"));
74
130
  }
@@ -77,6 +133,32 @@ export class ApiComponentUtils {
77
133
  throw options.onError(new BadDataException("URL is not type of string"));
78
134
  }
79
135
 
136
+ /*
137
+ * The URL is authored by whoever built the workflow - i.e. any member of
138
+ * any project - and the request goes out from the server, which sits
139
+ * inside the cluster and next to the cloud metadata endpoint. Without this
140
+ * check the API components are an authenticated request proxy into the
141
+ * private network: GET http://169.254.169.254/latest/meta-data/iam/... and
142
+ * the credentials come back in the component's "response-body" return
143
+ * value, in plain sight in the workflow log. Resolve and blocklist the
144
+ * target the same way outbound webhooks already do.
145
+ *
146
+ * Validate the RAW string, before URL.fromString - that parser defaults an
147
+ * unrecognized scheme to https, so "file:///etc/passwd" would reach the
148
+ * check already rewritten as host "file".
149
+ */
150
+ try {
151
+ await SSRFProtection.validateWebhookTargetIsSafe(args["url"] as string);
152
+ } catch (err) {
153
+ throw options.onError(
154
+ new BadDataException(
155
+ err instanceof Exception
156
+ ? err.message
157
+ : "URL points to an address that is not allowed.",
158
+ ),
159
+ );
160
+ }
161
+
80
162
  args["url"] = URL.fromString(args["url"] as string);
81
163
 
82
164
  return { args, successPort, errorPort };
@@ -10,6 +10,7 @@ import ComponentMetadata, {
10
10
  } from "../../../../../Types/Workflow/Component";
11
11
  import BaseModelComponents from "../../../../../Types/Workflow/Components/BaseModel";
12
12
  import CaptureSpan from "../../../../Utils/Telemetry/CaptureSpan";
13
+ import { applyTenantColumn } from "./ModelArguments";
13
14
 
14
15
  export default class CreateManyBaseModel<
15
16
  TBaseModel extends BaseModel,
@@ -91,25 +92,30 @@ export default class CreateManyBaseModel<
91
92
 
92
93
  const array: Array<TBaseModel> = [];
93
94
 
94
- if (this.modelService.getModel().getTenantColumn()) {
95
- for (const item of args["json-array"]) {
96
- (item as JSONObject)[
97
- this.modelService.getModel().getTenantColumn() as string
98
- ] = options.projectId;
99
-
100
- array.push(
101
- (await this.modelService.create({
102
- data: BaseModel.fromJSON<TBaseModel>(
103
- (item as JSONObject) || {},
104
- this.modelService.modelType,
105
- ) as TBaseModel,
106
- props: {
107
- isRoot: true,
108
- tenantId: options.projectId,
109
- },
110
- })) as TBaseModel,
111
- );
112
- }
95
+ /*
96
+ * This loop used to sit inside an `if (getTenantColumn())` check that
97
+ * was only meant to guard the projectId stamping, so a model without a
98
+ * tenant column created nothing at all and still reported success.
99
+ */
100
+ for (const item of args["json-array"]) {
101
+ const json: JSONObject = applyTenantColumn(
102
+ (item as JSONObject) || {},
103
+ this.modelService.getModel(),
104
+ options.projectId,
105
+ );
106
+
107
+ array.push(
108
+ (await this.modelService.create({
109
+ data: BaseModel.fromJSON<TBaseModel>(
110
+ json,
111
+ this.modelService.modelType,
112
+ ) as TBaseModel,
113
+ props: {
114
+ isRoot: true,
115
+ tenantId: options.projectId,
116
+ },
117
+ })) as TBaseModel,
118
+ );
113
119
  }
114
120
 
115
121
  return {
@@ -12,6 +12,7 @@ import ComponentMetadata, {
12
12
  } from "../../../../../Types/Workflow/Component";
13
13
  import BaseModelComponents from "../../../../../Types/Workflow/Components/BaseModel";
14
14
  import CaptureSpan from "../../../../Utils/Telemetry/CaptureSpan";
15
+ import { applyTenantColumn } from "./ModelArguments";
15
16
 
16
17
  export default class CreateOneBaseModel<
17
18
  TBaseModel extends BaseModel,
@@ -90,11 +91,11 @@ export default class CreateOneBaseModel<
90
91
  );
91
92
  }
92
93
 
93
- if (this.modelService.getModel().getTenantColumn()) {
94
- (args["json"] as JSONObject)[
95
- this.modelService.getModel().getTenantColumn() as string
96
- ] = options.projectId;
97
- }
94
+ args["json"] = applyTenantColumn(
95
+ args["json"] as JSONObject,
96
+ this.modelService.getModel(),
97
+ options.projectId,
98
+ );
98
99
 
99
100
  const model: TBaseModel = (await this.modelService.create({
100
101
  data: BaseModel.fromJSON<TBaseModel>(
@@ -12,6 +12,8 @@ import ComponentMetadata, {
12
12
  Port,
13
13
  } from "../../../../../Types/Workflow/Component";
14
14
  import BaseModelComponents from "../../../../../Types/Workflow/Components/BaseModel";
15
+ import { normalizeModelKeys } from "./ModelArguments";
16
+ import logComponentError from "./LogComponentError";
15
17
 
16
18
  export default class DeleteManyBaseModel<
17
19
  TBaseModel extends BaseModel,
@@ -114,22 +116,26 @@ export default class DeleteManyBaseModel<
114
116
  args["limit"] = LIMIT_PER_PROJECT;
115
117
  }
116
118
 
119
+ const query: Query<TBaseModel> = JSONFunctions.deserialize(
120
+ normalizeModelKeys(
121
+ args["query"] as JSONObject,
122
+ this.modelService.getModel(),
123
+ ),
124
+ ) as Query<TBaseModel>;
125
+
126
+ /*
127
+ * The tenant column goes on the deserialized query, not on args["query"]
128
+ * - JSONFunctions.deserialize returns a new object, so anything written
129
+ * to args after it runs never reaches the database.
130
+ */
117
131
  if (this.modelService.getModel().getTenantColumn()) {
118
- (args["query"] as JSONObject)[
132
+ (query as JSONObject)[
119
133
  this.modelService.getModel().getTenantColumn() as string
120
134
  ] = options.projectId;
121
135
  }
122
136
 
123
- let query: Query<TBaseModel> = args["query"] as Query<TBaseModel>;
124
-
125
- if (query) {
126
- query = JSONFunctions.deserialize(
127
- args["query"] as JSONObject,
128
- ) as Query<TBaseModel>;
129
- }
130
-
131
- await this.modelService.deleteBy({
132
- query: query || {},
137
+ const itemsDeleted: number = await this.modelService.deleteBy({
138
+ query: query,
133
139
  limit: new PositiveNumber(args["limit"] as number),
134
140
  skip: new PositiveNumber(args["skip"] as number),
135
141
  props: {
@@ -138,13 +144,25 @@ export default class DeleteManyBaseModel<
138
144
  },
139
145
  });
140
146
 
147
+ options.log(
148
+ `Deleted ${itemsDeleted} ${
149
+ this.modelService.getModel().singularName || "record"
150
+ }(s).`,
151
+ );
152
+
141
153
  return {
142
- returnValues: {},
154
+ returnValues: {
155
+ "items-deleted": itemsDeleted,
156
+ },
143
157
  executePort: successPort,
144
158
  };
145
159
  } catch (err: any) {
146
- options.log("Error running component");
147
- options.log(err.message ? err.message : JSON.stringify(err, null, 2));
160
+ logComponentError({
161
+ error: err,
162
+ model: this.modelService?.getModel() || null,
163
+ log: options.log,
164
+ });
165
+
148
166
  return {
149
167
  returnValues: {},
150
168
  executePort: errorPort,
@@ -11,6 +11,8 @@ import ComponentMetadata, {
11
11
  } from "../../../../../Types/Workflow/Component";
12
12
  import BaseModelComponents from "../../../../../Types/Workflow/Components/BaseModel";
13
13
  import CaptureSpan from "../../../../Utils/Telemetry/CaptureSpan";
14
+ import { normalizeModelKeys } from "./ModelArguments";
15
+ import logComponentError from "./LogComponentError";
14
16
 
15
17
  export default class DeleteOneBaseModel<
16
18
  TBaseModel extends BaseModel,
@@ -89,35 +91,51 @@ export default class DeleteOneBaseModel<
89
91
  );
90
92
  }
91
93
 
92
- let query: Query<TBaseModel> = args["query"] as Query<TBaseModel>;
93
-
94
- if (query) {
95
- query = JSONFunctions.deserialize(
94
+ const query: Query<TBaseModel> = JSONFunctions.deserialize(
95
+ normalizeModelKeys(
96
96
  args["query"] as JSONObject,
97
- ) as Query<TBaseModel>;
98
- }
99
-
97
+ this.modelService.getModel(),
98
+ ),
99
+ ) as Query<TBaseModel>;
100
+
101
+ /*
102
+ * The tenant column goes on the deserialized query, not on args["query"]
103
+ * - JSONFunctions.deserialize returns a new object, so anything written
104
+ * to args after it runs never reaches the database.
105
+ */
100
106
  if (this.modelService.getModel().getTenantColumn()) {
101
- (args["query"] as JSONObject)[
107
+ (query as JSONObject)[
102
108
  this.modelService.getModel().getTenantColumn() as string
103
109
  ] = options.projectId;
104
110
  }
105
111
 
106
- await this.modelService.deleteOneBy({
107
- query: (query as Query<TBaseModel>) || {},
112
+ const itemsDeleted: number = await this.modelService.deleteOneBy({
113
+ query: query,
108
114
  props: {
109
115
  isRoot: true,
110
116
  tenantId: options.projectId,
111
117
  },
112
118
  });
113
119
 
120
+ options.log(
121
+ `Deleted ${itemsDeleted} ${
122
+ this.modelService.getModel().singularName || "record"
123
+ }(s).`,
124
+ );
125
+
114
126
  return {
115
- returnValues: {},
127
+ returnValues: {
128
+ "items-deleted": itemsDeleted,
129
+ },
116
130
  executePort: successPort,
117
131
  };
118
132
  } catch (err: any) {
119
- options.log("Error running component");
120
- options.log(err.message ? err.message : JSON.stringify(err, null, 2));
133
+ logComponentError({
134
+ error: err,
135
+ model: this.modelService?.getModel() || null,
136
+ log: options.log,
137
+ });
138
+
121
139
  return {
122
140
  returnValues: {},
123
141
  executePort: errorPort,