@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
@@ -14,6 +14,8 @@ import ComponentMetadata, {
14
14
  } from "../../../../../Types/Workflow/Component";
15
15
  import BaseModelComponents from "../../../../../Types/Workflow/Components/BaseModel";
16
16
  import CaptureSpan from "../../../../Utils/Telemetry/CaptureSpan";
17
+ import { normalizeModelKeys } from "./ModelArguments";
18
+ import logComponentError from "./LogComponentError";
17
19
 
18
20
  export default class FindManyBaseModel<
19
21
  TBaseModel extends BaseModel,
@@ -92,12 +94,6 @@ export default class FindManyBaseModel<
92
94
  );
93
95
  }
94
96
 
95
- if (this.modelService.getModel().getTenantColumn()) {
96
- (args["query"] as JSONObject)[
97
- this.modelService.getModel().getTenantColumn() as string
98
- ] = options.projectId;
99
- }
100
-
101
97
  if (!args["select"]) {
102
98
  throw options.onError(
103
99
  new BadDataException("Select Fields is undefined."),
@@ -139,24 +135,33 @@ export default class FindManyBaseModel<
139
135
  args["limit"] = LIMIT_PER_PROJECT;
140
136
  }
141
137
 
142
- let query: Query<TBaseModel> = args["query"] as Query<TBaseModel>;
143
-
144
- if (query) {
145
- query = JSONFunctions.deserialize(
138
+ const query: Query<TBaseModel> = JSONFunctions.deserialize(
139
+ normalizeModelKeys(
146
140
  args["query"] as JSONObject,
147
- ) as Query<TBaseModel>;
141
+ this.modelService.getModel(),
142
+ ),
143
+ ) as Query<TBaseModel>;
144
+
145
+ /*
146
+ * The tenant column goes on the deserialized query, not on args["query"]
147
+ * - JSONFunctions.deserialize returns a new object, so anything written
148
+ * to args after it runs never reaches the database.
149
+ */
150
+ if (this.modelService.getModel().getTenantColumn()) {
151
+ (query as JSONObject)[
152
+ this.modelService.getModel().getTenantColumn() as string
153
+ ] = options.projectId;
148
154
  }
149
155
 
150
- let select: Select<TBaseModel> = args["select"] as Select<TBaseModel>;
151
-
152
- if (select) {
153
- select = JSONFunctions.deserialize(
156
+ const select: Select<TBaseModel> = JSONFunctions.deserialize(
157
+ normalizeModelKeys(
154
158
  args["select"] as JSONObject,
155
- ) as Select<TBaseModel>;
156
- }
159
+ this.modelService.getModel(),
160
+ ),
161
+ ) as Select<TBaseModel>;
157
162
 
158
163
  const models: Array<TBaseModel> = await this.modelService.findBy({
159
- query: query || {},
164
+ query: query,
160
165
  select: select,
161
166
  limit: new PositiveNumber(args["limit"] as number),
162
167
  skip: new PositiveNumber(args["skip"] as number),
@@ -173,8 +178,12 @@ export default class FindManyBaseModel<
173
178
  executePort: successPort,
174
179
  };
175
180
  } catch (err: any) {
176
- options.log("Error running component");
177
- options.log(err.message ? err.message : JSON.stringify(err, null, 2));
181
+ logComponentError({
182
+ error: err,
183
+ model: this.modelService?.getModel() || null,
184
+ log: options.log,
185
+ });
186
+
178
187
  return {
179
188
  returnValues: {},
180
189
  executePort: errorPort,
@@ -12,6 +12,8 @@ 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 { normalizeModelKeys } from "./ModelArguments";
16
+ import logComponentError from "./LogComponentError";
15
17
 
16
18
  export default class FindOneBaseModel<
17
19
  TBaseModel extends BaseModel,
@@ -90,12 +92,6 @@ export default class FindOneBaseModel<
90
92
  );
91
93
  }
92
94
 
93
- if (this.modelService.getModel().getTenantColumn()) {
94
- (args["query"] as JSONObject)[
95
- this.modelService.getModel().getTenantColumn() as string
96
- ] = options.projectId;
97
- }
98
-
99
95
  if (!args["select"]) {
100
96
  throw options.onError(
101
97
  new BadDataException("Select Fields is undefined."),
@@ -112,24 +108,33 @@ export default class FindOneBaseModel<
112
108
  );
113
109
  }
114
110
 
115
- let query: Query<TBaseModel> = args["query"] as Query<TBaseModel>;
116
-
117
- if (query) {
118
- query = JSONFunctions.deserialize(
111
+ const query: Query<TBaseModel> = JSONFunctions.deserialize(
112
+ normalizeModelKeys(
119
113
  args["query"] as JSONObject,
120
- ) as Query<TBaseModel>;
114
+ this.modelService.getModel(),
115
+ ),
116
+ ) as Query<TBaseModel>;
117
+
118
+ /*
119
+ * The tenant column goes on the deserialized query, not on args["query"]
120
+ * - JSONFunctions.deserialize returns a new object, so anything written
121
+ * to args after it runs never reaches the database.
122
+ */
123
+ if (this.modelService.getModel().getTenantColumn()) {
124
+ (query as JSONObject)[
125
+ this.modelService.getModel().getTenantColumn() as string
126
+ ] = options.projectId;
121
127
  }
122
128
 
123
- let select: Select<TBaseModel> = args["select"] as Select<TBaseModel>;
124
-
125
- if (select) {
126
- select = JSONFunctions.deserialize(
129
+ const select: Select<TBaseModel> = JSONFunctions.deserialize(
130
+ normalizeModelKeys(
127
131
  args["select"] as JSONObject,
128
- ) as Select<TBaseModel>;
129
- }
132
+ this.modelService.getModel(),
133
+ ),
134
+ ) as Select<TBaseModel>;
130
135
 
131
136
  const model: TBaseModel | null = await this.modelService.findOneBy({
132
- query: query || {},
137
+ query: query,
133
138
  select: select,
134
139
  props: {
135
140
  isRoot: true,
@@ -146,9 +151,11 @@ export default class FindOneBaseModel<
146
151
  executePort: successPort,
147
152
  };
148
153
  } catch (err: any) {
149
- options.log("Error running component");
150
-
151
- options.log(err.message ? err.message : JSON.stringify(err, null, 2));
154
+ logComponentError({
155
+ error: err,
156
+ model: this.modelService?.getModel() || null,
157
+ log: options.log,
158
+ });
152
159
 
153
160
  return {
154
161
  returnValues: {},
@@ -0,0 +1,89 @@
1
+ import BaseModel from "../../../../../Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel";
2
+ import logger from "../../../../Utils/Logger";
3
+ import { RunOptions } from "../../ComponentCode";
4
+ import {
5
+ ID_ARGUMENT_KEY,
6
+ PRIMARY_KEY_COLUMN,
7
+ describeModelColumns,
8
+ } from "./ModelArguments";
9
+
10
+ /*
11
+ * TypeORM's EntityPropertyNotFoundError reads
12
+ * `Property "foo" was not found in "Monitor". Make sure your query is correct.`
13
+ * On its own that tells a workflow builder nothing they can act on: it names
14
+ * neither the argument at fault nor anything they can pick from, and it says
15
+ * "query" even when the offending key was in Data. Everything the builder
16
+ * needs is already on the model, so the components append it.
17
+ */
18
+ const UNKNOWN_PROPERTY_PATTERN: RegExp =
19
+ /Property "([^"]+)" was not found in "([^"]+)"/;
20
+
21
+ type BuildColumnHintFunction = (
22
+ message: string,
23
+ model: BaseModel,
24
+ ) => string | null;
25
+
26
+ export const buildColumnHint: BuildColumnHintFunction = (
27
+ message: string,
28
+ model: BaseModel,
29
+ ): string | null => {
30
+ const match: RegExpMatchArray | null = message.match(
31
+ UNKNOWN_PROPERTY_PATTERN,
32
+ );
33
+
34
+ if (!match) {
35
+ return null;
36
+ }
37
+
38
+ const property: string = match[1] as string;
39
+ const modelName: string = model.singularName || (match[2] as string);
40
+
41
+ if (property === ID_ARGUMENT_KEY) {
42
+ return `Tip: "${ID_ARGUMENT_KEY}" is not a column on ${modelName}. Use "${PRIMARY_KEY_COLUMN}" instead. Columns you can use: ${describeModelColumns(
43
+ model,
44
+ )}.`;
45
+ }
46
+
47
+ return `Tip: "${property}" is not a column on ${modelName}. Check every key in this component's Query, Select and Data arguments. Columns you can use: ${describeModelColumns(
48
+ model,
49
+ )}.`;
50
+ };
51
+
52
+ type LogComponentErrorFunction = (data: {
53
+ error: unknown;
54
+ model: BaseModel | null;
55
+ log: RunOptions["log"];
56
+ }) => void;
57
+
58
+ /*
59
+ * Every database component failed the same way before this: two lines in the
60
+ * workflow log and, for all but Create One, nothing at all in the server log.
61
+ */
62
+ const logComponentError: LogComponentErrorFunction = (data: {
63
+ error: unknown;
64
+ model: BaseModel | null;
65
+ log: RunOptions["log"];
66
+ }): void => {
67
+ const { error, model, log } = data;
68
+
69
+ logger.error(error);
70
+
71
+ const errorMessage: unknown = (error as { message?: unknown } | null)
72
+ ?.message;
73
+
74
+ const message: string =
75
+ typeof errorMessage === "string" && errorMessage
76
+ ? errorMessage
77
+ : JSON.stringify(error, null, 2);
78
+
79
+ log("Error running component");
80
+ log(message);
81
+
82
+ const hint: string | null = model ? buildColumnHint(message, model) : null;
83
+
84
+ if (hint) {
85
+ log(hint);
86
+ }
87
+ };
88
+
89
+ export default logComponentError;
@@ -0,0 +1,208 @@
1
+ import BaseModel from "../../../../../Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel";
2
+ import { TableColumnMetadata } from "../../../../../Types/Database/TableColumn";
3
+ import TableColumnType from "../../../../../Types/Database/TableColumnType";
4
+ import { JSONObject, JSONValue } from "../../../../../Types/JSON";
5
+ import ObjectID from "../../../../../Types/ObjectID";
6
+
7
+ /*
8
+ * Workflow builders write "id", because that is what an ID is called
9
+ * everywhere they can see one: in the dashboard, in the API docs, and on the
10
+ * model itself (`monitor.id`). On a database model, though, "id" is only a
11
+ * TypeScript accessor - the persisted primary key column is "_id"
12
+ * (DatabaseBaseModel._id). A query, select or data object keyed on "id"
13
+ * therefore reached TypeORM verbatim and threw
14
+ * `Property "id" was not found in "Monitor". Make sure your query is correct.`,
15
+ * which is what https://github.com/OneUptime/oneuptime/issues/3132 reported.
16
+ *
17
+ * The create path has accepted "id" all along - DatabaseBaseModel._fromJSON
18
+ * rewrites it to "_id" - so the fix is to make every other workflow argument
19
+ * agree with create, rather than to take the alias away from create.
20
+ */
21
+
22
+ export const ID_ARGUMENT_KEY: string = "id";
23
+ export const PRIMARY_KEY_COLUMN: string = "_id";
24
+
25
+ /*
26
+ * Only alias when the model actually looks like a DatabaseBaseModel: it has
27
+ * the "_id" primary key and no column of its own literally called "id".
28
+ * No model ships an "id" column today, but a model that grew one would mean
29
+ * something different by "id" and must keep it.
30
+ */
31
+ type ModelAliasesIdFunction = (model: BaseModel) => boolean;
32
+
33
+ const modelAliasesId: ModelAliasesIdFunction = (model: BaseModel): boolean => {
34
+ return (
35
+ model.hasColumn(PRIMARY_KEY_COLUMN) && !model.hasColumn(ID_ARGUMENT_KEY)
36
+ );
37
+ };
38
+
39
+ /*
40
+ * A nested object is only worth walking into when it is a map of column names.
41
+ * Serialized values - ObjectID, Date, and every QueryHelper operator - travel
42
+ * as `{ "_type": "...", "value": ... }` and are values, not column maps, so
43
+ * key rewriting has to stop at them.
44
+ */
45
+ type IsColumnMapFunction = (value: JSONValue) => boolean;
46
+
47
+ const isColumnMap: IsColumnMapFunction = (value: JSONValue): boolean => {
48
+ if (value === null || value === undefined || typeof value !== "object") {
49
+ return false;
50
+ }
51
+
52
+ if (Array.isArray(value) || value instanceof Date) {
53
+ return false;
54
+ }
55
+
56
+ return (value as JSONObject)["_type"] === undefined;
57
+ };
58
+
59
+ type NormalizeValueFunction = (
60
+ value: JSONValue,
61
+ columnName: string,
62
+ model: BaseModel,
63
+ ) => JSONValue;
64
+
65
+ /*
66
+ * Relations are queried and selected one level deep - `{"project": {"id":
67
+ * true}}` - so the alias has to follow the relation into the related model
68
+ * rather than stopping at the top level.
69
+ */
70
+ const normalizeValue: NormalizeValueFunction = (
71
+ value: JSONValue,
72
+ columnName: string,
73
+ model: BaseModel,
74
+ ): JSONValue => {
75
+ if (!isColumnMap(value)) {
76
+ return value;
77
+ }
78
+
79
+ const metadata: TableColumnMetadata | undefined =
80
+ model.getTableColumnMetadata(columnName);
81
+
82
+ if (
83
+ !metadata ||
84
+ !metadata.modelType ||
85
+ (metadata.type !== TableColumnType.Entity &&
86
+ metadata.type !== TableColumnType.EntityArray)
87
+ ) {
88
+ return value;
89
+ }
90
+
91
+ return normalizeModelKeys(value as JSONObject, new metadata.modelType());
92
+ };
93
+
94
+ type NormalizeModelKeysFunction = (
95
+ json: JSONObject,
96
+ model: BaseModel,
97
+ ) => JSONObject;
98
+
99
+ /*
100
+ * Returns a copy of `json` with the "id" alias resolved to the "_id" column,
101
+ * including inside related-model objects one level down. Everything else is
102
+ * copied through untouched - this deliberately does not validate column names,
103
+ * so an argument that works today keeps working.
104
+ */
105
+ export const normalizeModelKeys: NormalizeModelKeysFunction = (
106
+ json: JSONObject,
107
+ model: BaseModel,
108
+ ): JSONObject => {
109
+ const normalized: JSONObject = {};
110
+ const aliasesId: boolean = modelAliasesId(model);
111
+
112
+ /*
113
+ * Someone who spells out "_id" meant "_id". If both spellings are present
114
+ * the explicit column wins and the alias is dropped, so the result never
115
+ * depends on key order.
116
+ */
117
+ const explicitPrimaryKeyGiven: boolean =
118
+ json[PRIMARY_KEY_COLUMN] !== undefined;
119
+
120
+ for (const key of Object.keys(json)) {
121
+ let columnName: string = key;
122
+
123
+ if (key === ID_ARGUMENT_KEY && aliasesId) {
124
+ if (explicitPrimaryKeyGiven) {
125
+ continue;
126
+ }
127
+
128
+ columnName = PRIMARY_KEY_COLUMN;
129
+ }
130
+
131
+ normalized[columnName] = normalizeValue(
132
+ json[key] as JSONValue,
133
+ columnName,
134
+ model,
135
+ );
136
+ }
137
+
138
+ return normalized;
139
+ };
140
+
141
+ type ApplyTenantColumnFunction = (
142
+ json: JSONObject,
143
+ model: BaseModel,
144
+ tenantId: ObjectID,
145
+ ) => JSONObject;
146
+
147
+ /*
148
+ * Stamps the record being written with the project the workflow runs in.
149
+ *
150
+ * Setting the scalar tenant column is not enough on its own. Every tenant
151
+ * model also exposes that same physical column through its many-to-one
152
+ * relation - Monitor.project is @JoinColumn({name: "projectId"}) - and TypeORM
153
+ * reads the relation property first, writing the column once. So a payload
154
+ * carrying {"project": "<some other project>"} silently beat the stamp and
155
+ * moved the record into that project. The relation keys pointing at the tenant
156
+ * column are therefore dropped before the scalar is written.
157
+ */
158
+ export const applyTenantColumn: ApplyTenantColumnFunction = (
159
+ json: JSONObject,
160
+ model: BaseModel,
161
+ tenantId: ObjectID,
162
+ ): JSONObject => {
163
+ const tenantColumn: string | null = model.getTenantColumn();
164
+
165
+ if (!tenantColumn) {
166
+ return json;
167
+ }
168
+
169
+ const stamped: JSONObject = {};
170
+
171
+ for (const key of Object.keys(json)) {
172
+ if (key === tenantColumn) {
173
+ continue;
174
+ }
175
+
176
+ const metadata: TableColumnMetadata | undefined =
177
+ model.getTableColumnMetadata(key);
178
+
179
+ if (metadata && metadata.manyToOneRelationColumn === tenantColumn) {
180
+ continue;
181
+ }
182
+
183
+ stamped[key] = json[key];
184
+ }
185
+
186
+ stamped[tenantColumn] = tenantId;
187
+
188
+ return stamped;
189
+ };
190
+
191
+ type DescribeModelColumnsFunction = (model: BaseModel) => string;
192
+
193
+ /*
194
+ * The raw TypeORM failure ("Property "foo" was not found in "Monitor") names
195
+ * neither the argument at fault nor anything the builder can pick from, so the
196
+ * components append the real column list to it.
197
+ */
198
+ export const describeModelColumns: DescribeModelColumnsFunction = (
199
+ model: BaseModel,
200
+ ): string => {
201
+ const columns: Array<string> = [...model.getTableColumns().columns].sort(
202
+ (a: string, b: string): number => {
203
+ return a.localeCompare(b);
204
+ },
205
+ );
206
+
207
+ return columns.join(", ");
208
+ };
@@ -24,6 +24,7 @@ import ComponentMetadata, {
24
24
  import BaseModelComponents from "../../../../../Types/Workflow/Components/BaseModel";
25
25
  import Workflow from "../../../../../Models/DatabaseModels/Workflow";
26
26
  import CaptureSpan from "../../../../Utils/Telemetry/CaptureSpan";
27
+ import { normalizeModelKeys } from "./ModelArguments";
27
28
 
28
29
  export default class OnTriggerBaseModel<
29
30
  TBaseModel extends BaseModel,
@@ -156,6 +157,16 @@ export default class OnTriggerBaseModel<
156
157
  (select as any)[key] = false;
157
158
  }
158
159
  }
160
+
161
+ /*
162
+ * "id" is only a TypeScript accessor on the model - the column is "_id".
163
+ * Selecting "id" reached TypeORM verbatim and threw, and this trigger
164
+ * has no error port, so it took the whole workflow run down with it.
165
+ */
166
+ select = normalizeModelKeys(
167
+ select as JSONObject,
168
+ this.service!.getModel(),
169
+ ) as Select<TBaseModel>;
159
170
  }
160
171
 
161
172
  const model: TBaseModel | null = await this.service!.findOneById({
@@ -14,6 +14,8 @@ import ComponentMetadata, {
14
14
  } from "../../../../../Types/Workflow/Component";
15
15
  import BaseModelComponents from "../../../../../Types/Workflow/Components/BaseModel";
16
16
  import CaptureSpan from "../../../../Utils/Telemetry/CaptureSpan";
17
+ import { applyTenantColumn, normalizeModelKeys } from "./ModelArguments";
18
+ import logComponentError from "./LogComponentError";
17
19
 
18
20
  export default class UpdateManyBaseModel<
19
21
  TBaseModel extends BaseModel,
@@ -92,11 +94,14 @@ export default class UpdateManyBaseModel<
92
94
  );
93
95
  }
94
96
 
95
- if (this.modelService.getModel().getTenantColumn()) {
96
- (args["data"] as JSONObject)[
97
- this.modelService.getModel().getTenantColumn() as string
98
- ] = options.projectId;
99
- }
97
+ args["data"] = applyTenantColumn(
98
+ normalizeModelKeys(
99
+ args["data"] as JSONObject,
100
+ this.modelService.getModel(),
101
+ ),
102
+ this.modelService.getModel(),
103
+ options.projectId,
104
+ );
100
105
 
101
106
  if (!args["query"]) {
102
107
  throw options.onError(new BadDataException("Query is undefined."));
@@ -137,22 +142,28 @@ export default class UpdateManyBaseModel<
137
142
  args["limit"] = LIMIT_PER_PROJECT;
138
143
  }
139
144
 
140
- let query: Query<TBaseModel> = args["query"] as Query<TBaseModel>;
141
-
142
- if (query) {
143
- query = JSONFunctions.deserialize(
145
+ const query: Query<TBaseModel> = JSONFunctions.deserialize(
146
+ normalizeModelKeys(
144
147
  args["query"] as JSONObject,
145
- ) as Query<TBaseModel>;
146
- }
147
-
148
+ this.modelService.getModel(),
149
+ ),
150
+ ) as Query<TBaseModel>;
151
+
152
+ /*
153
+ * The tenant column goes on the deserialized query, not on args["query"].
154
+ * JSONFunctions.deserialize returns a new object, so writing the tenant
155
+ * column to args afterwards left the query that actually ran unscoped -
156
+ * and an update as root is not re-scoped by the permission layer, so an
157
+ * Update Many could reach rows in other projects.
158
+ */
148
159
  if (this.modelService.getModel().getTenantColumn()) {
149
- (args["query"] as JSONObject)[
160
+ (query as JSONObject)[
150
161
  this.modelService.getModel().getTenantColumn() as string
151
162
  ] = options.projectId;
152
163
  }
153
164
 
154
- await this.modelService.updateBy({
155
- query: query || {},
165
+ const itemsUpdated: number = await this.modelService.updateBy({
166
+ query: query,
156
167
  data: args["data"] as QueryDeepPartialEntity<TBaseModel>,
157
168
  limit: new PositiveNumber(args["limit"] as number),
158
169
  skip: new PositiveNumber(args["skip"] as number),
@@ -162,13 +173,25 @@ export default class UpdateManyBaseModel<
162
173
  },
163
174
  });
164
175
 
176
+ options.log(
177
+ `Updated ${itemsUpdated} ${
178
+ this.modelService.getModel().singularName || "record"
179
+ }(s).`,
180
+ );
181
+
165
182
  return {
166
- returnValues: {},
183
+ returnValues: {
184
+ "items-updated": itemsUpdated,
185
+ },
167
186
  executePort: successPort,
168
187
  };
169
188
  } catch (err: any) {
170
- options.log("Error running component");
171
- options.log(err.message ? err.message : JSON.stringify(err, null, 2));
189
+ logComponentError({
190
+ error: err,
191
+ model: this.modelService?.getModel() || null,
192
+ log: options.log,
193
+ });
194
+
172
195
  return {
173
196
  returnValues: {},
174
197
  executePort: errorPort,
@@ -12,6 +12,8 @@ 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, normalizeModelKeys } from "./ModelArguments";
16
+ import logComponentError from "./LogComponentError";
15
17
 
16
18
  export default class UpdateOneBaseModel<
17
19
  TBaseModel extends BaseModel,
@@ -90,11 +92,14 @@ export default class UpdateOneBaseModel<
90
92
  );
91
93
  }
92
94
 
93
- if (this.modelService.getModel().getTenantColumn()) {
94
- (args["data"] as JSONObject)[
95
- this.modelService.getModel().getTenantColumn() as string
96
- ] = options.projectId;
97
- }
95
+ args["data"] = applyTenantColumn(
96
+ normalizeModelKeys(
97
+ args["data"] as JSONObject,
98
+ this.modelService.getModel(),
99
+ ),
100
+ this.modelService.getModel(),
101
+ options.projectId,
102
+ );
98
103
 
99
104
  if (!args["query"]) {
100
105
  throw options.onError(new BadDataException("Query is undefined."));
@@ -110,22 +115,26 @@ export default class UpdateOneBaseModel<
110
115
  );
111
116
  }
112
117
 
118
+ const query: Query<TBaseModel> = JSONFunctions.deserialize(
119
+ normalizeModelKeys(
120
+ args["query"] as JSONObject,
121
+ this.modelService.getModel(),
122
+ ),
123
+ ) as Query<TBaseModel>;
124
+
125
+ /*
126
+ * The tenant column goes on the deserialized query, not on args["query"]
127
+ * - JSONFunctions.deserialize returns a new object, so anything written
128
+ * to args after it runs never reaches the database.
129
+ */
113
130
  if (this.modelService.getModel().getTenantColumn()) {
114
- (args["query"] as JSONObject)[
131
+ (query as JSONObject)[
115
132
  this.modelService.getModel().getTenantColumn() as string
116
133
  ] = options.projectId;
117
134
  }
118
135
 
119
- let query: Query<TBaseModel> = args["query"] as Query<TBaseModel>;
120
-
121
- if (query) {
122
- query = JSONFunctions.deserialize(
123
- args["query"] as JSONObject,
124
- ) as Query<TBaseModel>;
125
- }
126
-
127
- await this.modelService.updateOneBy({
128
- query: query || {},
136
+ const itemsUpdated: number = await this.modelService.updateOneBy({
137
+ query: query,
129
138
  data: args["data"] as QueryDeepPartialEntity<TBaseModel>,
130
139
  props: {
131
140
  isRoot: true,
@@ -133,13 +142,30 @@ export default class UpdateOneBaseModel<
133
142
  },
134
143
  });
135
144
 
145
+ /*
146
+ * A query that matches nothing is not an error, but reporting it as a
147
+ * bare success left builders with no way to tell "updated" from "found
148
+ * nothing to update".
149
+ */
150
+ options.log(
151
+ `Updated ${itemsUpdated} ${
152
+ this.modelService.getModel().singularName || "record"
153
+ }(s).`,
154
+ );
155
+
136
156
  return {
137
- returnValues: {},
157
+ returnValues: {
158
+ "items-updated": itemsUpdated,
159
+ },
138
160
  executePort: successPort,
139
161
  };
140
162
  } catch (err: any) {
141
- options.log("Error running component");
142
- options.log(err.message ? err.message : JSON.stringify(err, null, 2));
163
+ logComponentError({
164
+ error: err,
165
+ model: this.modelService?.getModel() || null,
166
+ log: options.log,
167
+ });
168
+
143
169
  return {
144
170
  returnValues: {},
145
171
  executePort: errorPort,