@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
@@ -0,0 +1,65 @@
1
+ import EntityType from "./EntityType";
2
+
3
+ /*
4
+ * Partitions of the EntityType vocabulary by who creates and owns a row of
5
+ * that type. Isomorphic (plain Types, no server imports) because all three
6
+ * consumers need the same answer: the service enforcing what a user may
7
+ * create, the dashboard populating the type dropdown, and the tests pinning
8
+ * that the prune sweep cannot reach a type nothing re-bumps.
9
+ *
10
+ * Deliberately expressed as explicit sets rather than a string-prefix test.
11
+ * Prefix matching would silently absorb any future `external.*` or
12
+ * `*.device` type into the set that is exempt from pruning, which is the
13
+ * kind of default that goes unnoticed until a registry fills with rows
14
+ * nothing can ever reap.
15
+ */
16
+
17
+ /**
18
+ * Types a user may create by hand. These describe things OneUptime cannot
19
+ * observe — a third-party API, a vendor-managed database, an appliance —
20
+ * so nothing will ever discover them and nothing will ever bump their
21
+ * `lastSeenAt`.
22
+ *
23
+ * Manual creation is confined to these on purpose. A hand-made row of an
24
+ * observable type (say `service`) would mint an entity key from the manual
25
+ * identity attribute, which by construction differs from the key ingest
26
+ * derives from `service.name` — so the manual row would sit beside the
27
+ * discovered one as a permanent near-duplicate rather than merging with it.
28
+ */
29
+ export const MANUAL_ENTITY_TYPES: ReadonlySet<EntityType> = new Set<EntityType>(
30
+ [
31
+ EntityType.ExternalService,
32
+ EntityType.ExternalDatabase,
33
+ EntityType.Appliance,
34
+ ],
35
+ );
36
+
37
+ /**
38
+ * Types mirrored from a OneUptime inventory table. The owning row is the
39
+ * source of truth for both identity and liveness; the registry row is a
40
+ * projection kept in step by that table's create/delete hooks.
41
+ */
42
+ export const INVENTORY_ENTITY_TYPES: ReadonlySet<EntityType> =
43
+ new Set<EntityType>([
44
+ EntityType.NetworkDevice,
45
+ EntityType.CloudResource,
46
+ EntityType.ServerlessFunction,
47
+ EntityType.RumApplication,
48
+ EntityType.IoTDevice,
49
+ EntityType.DockerHost,
50
+ EntityType.PodmanHost,
51
+ ]);
52
+
53
+ /**
54
+ * True for types whose rows have no telemetry heartbeat, and which are
55
+ * therefore never eligible for `lastSeenAt`-based pruning. The prune job
56
+ * enforces this through the `source` column instead (a row's source is the
57
+ * authority, not its type); this predicate is what the tests assert the TTL
58
+ * map against, so a newly added type cannot quietly acquire a TTL.
59
+ */
60
+ export function isNonTelemetryEntityType(entityType: EntityType): boolean {
61
+ return (
62
+ MANUAL_ENTITY_TYPES.has(entityType) ||
63
+ INVENTORY_ENTITY_TYPES.has(entityType)
64
+ );
65
+ }
@@ -19,7 +19,15 @@ export interface TelemetrySavedViewTimeRange {
19
19
  export default interface TelemetrySavedViewState {
20
20
  // Submitted search string from the explorer search bar.
21
21
  search?: string | undefined;
22
- // Active facet filters as [facetKey, value] tuples.
22
+ /*
23
+ * Active facet filters as [facetKey, value] tuples.
24
+ *
25
+ * Read these with readSavedViewFilters (Common/Utils/Telemetry/
26
+ * SavedViewFilters) rather than destructuring them. Rows written before
27
+ * JSONFunctions.serializeValue learned to preserve nested arrays hold
28
+ * { "0": facetKey, "1": value } instead, and destructuring one of those
29
+ * throws — which is what this type asserting otherwise once cost us.
30
+ */
23
31
  filters?: Array<[string, string]> | undefined;
24
32
  // Selected time range.
25
33
  timeRange?: TelemetrySavedViewTimeRange | undefined;
@@ -30,6 +30,35 @@ export enum ComponentInputType {
30
30
  WorkflowSelect = "Workflow Select",
31
31
  }
32
32
 
33
+ /*
34
+ * Argument types whose value is a JSON document but is read with
35
+ * JSONFunctions.parse — that is, JSON5 — rather than JSON.parse. Unquoted keys,
36
+ * single quotes and trailing commas therefore work in these, and a workflow
37
+ * written that way runs fine today.
38
+ *
39
+ * The distinction matters wherever a JSON document is checked for syntax
40
+ * before it runs: applying JSON.parse's rules to one of these would report a
41
+ * mistake in a workflow that does not have one. The strict set is everything
42
+ * else — RunWorkflow.getComponentArguments calls JSON.parse directly on
43
+ * JSON, Query and Select, so those really must be JSON.
44
+ */
45
+ const JSON5_TOLERANT_INPUT_TYPES: Array<ComponentInputType> = [
46
+ ComponentInputType.StringDictionary,
47
+ ComponentInputType.JSONArray,
48
+ ComponentInputType.BaseModel,
49
+ ComponentInputType.BaseModelArray,
50
+ ];
51
+
52
+ export type IsJSON5ToleratedInputTypeFunction = (
53
+ type: ComponentInputType,
54
+ ) => boolean;
55
+
56
+ export const isJSON5ToleratedInputType: IsJSON5ToleratedInputTypeFunction = (
57
+ type: ComponentInputType,
58
+ ): boolean => {
59
+ return JSON5_TOLERANT_INPUT_TYPES.includes(type);
60
+ };
61
+
33
62
  export enum ComponentType {
34
63
  Trigger = "Trigger",
35
64
  Component = "Component",
@@ -37,6 +37,13 @@ const components: Array<ComponentMetadata> = [
37
37
  type: ComponentInputType.StringDictionary,
38
38
  required: false,
39
39
  isAdvanced: true,
40
+ /*
41
+ * Headers are where an Authorization bearer token gets typed, and
42
+ * without this the resolved value is written verbatim into the
43
+ * WorkflowLog for anyone with read access to the project. Only values
44
+ * that came from a variable marked secret were ever scrubbed.
45
+ */
46
+ isSensitive: true,
40
47
  placeholder:
41
48
  'Example: {"header1": "value1", "header2": "value2", ....}',
42
49
  },
@@ -123,6 +130,13 @@ const components: Array<ComponentMetadata> = [
123
130
  type: ComponentInputType.StringDictionary,
124
131
  required: false,
125
132
  isAdvanced: true,
133
+ /*
134
+ * Headers are where an Authorization bearer token gets typed, and
135
+ * without this the resolved value is written verbatim into the
136
+ * WorkflowLog for anyone with read access to the project. Only values
137
+ * that came from a variable marked secret were ever scrubbed.
138
+ */
139
+ isSensitive: true,
126
140
  placeholder:
127
141
  'Example: {"header1": "value1", "header2": "value2", ....}',
128
142
  },
@@ -209,6 +223,13 @@ const components: Array<ComponentMetadata> = [
209
223
  type: ComponentInputType.StringDictionary,
210
224
  required: false,
211
225
  isAdvanced: true,
226
+ /*
227
+ * Headers are where an Authorization bearer token gets typed, and
228
+ * without this the resolved value is written verbatim into the
229
+ * WorkflowLog for anyone with read access to the project. Only values
230
+ * that came from a variable marked secret were ever scrubbed.
231
+ */
232
+ isSensitive: true,
212
233
  placeholder:
213
234
  'Example: {"header1": "value1", "header2": "value2", ....}',
214
235
  },
@@ -295,6 +316,13 @@ const components: Array<ComponentMetadata> = [
295
316
  type: ComponentInputType.StringDictionary,
296
317
  required: false,
297
318
  isAdvanced: true,
319
+ /*
320
+ * Headers are where an Authorization bearer token gets typed, and
321
+ * without this the resolved value is written verbatim into the
322
+ * WorkflowLog for anyone with read access to the project. Only values
323
+ * that came from a variable marked secret were ever scrubbed.
324
+ */
325
+ isSensitive: true,
298
326
  placeholder:
299
327
  'Example: {"header1": "value1", "header2": "value2", ....}',
300
328
  },
@@ -381,6 +409,13 @@ const components: Array<ComponentMetadata> = [
381
409
  type: ComponentInputType.StringDictionary,
382
410
  required: false,
383
411
  isAdvanced: true,
412
+ /*
413
+ * Headers are where an Authorization bearer token gets typed, and
414
+ * without this the resolved value is written verbatim into the
415
+ * WorkflowLog for anyone with read access to the project. Only values
416
+ * that came from a variable marked secret were ever scrubbed.
417
+ */
418
+ isSensitive: true,
384
419
  placeholder:
385
420
  'Example: {"header1": "value1", "header2": "value2", ....}',
386
421
  },
@@ -1,4 +1,5 @@
1
1
  import BaseModel from "../../../Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel";
2
+ import Route from "../../API/Route";
2
3
  import IconProp from "../../Icon/IconProp";
3
4
  import Text from "../../Text";
4
5
  import ComponentMetadata, {
@@ -14,6 +15,33 @@ export default class BaseModelComponent {
14
15
  return [];
15
16
  }
16
17
 
18
+ /*
19
+ * Every one of these arguments is keyed on column names, and the single
20
+ * most common way to get one wrong is to write "id" - which is what an ID
21
+ * is called everywhere else in the product - when the column is "_id".
22
+ * Both spellings work.
23
+ *
24
+ * Query and record arguments now get a row editor backed by the model's
25
+ * real column list (ModelColumnEditor), so the names are offered rather
26
+ * than remembered. The hint stays because that editor keeps a JSON escape
27
+ * hatch for the queries rows cannot express, and because it is still the
28
+ * only thing explaining the two spellings.
29
+ */
30
+ const columnHint: string = `Keys are column names on ${model.singularName}. The ID column is "_id" (the "id" spelling is accepted too).`;
31
+
32
+ const queryDescription: string = `Query that selects which ${model.pluralName} this component acts on. ${columnHint}`;
33
+
34
+ const queryPlaceholder: string =
35
+ 'Example: {"_id": "00000000-0000-0000-0000-000000000000"}';
36
+
37
+ const selectPlaceholder: string = 'Example: {"_id": true, "name": true}';
38
+
39
+ const dataDescription: string = `${model.singularName} fields to write, as a JSON object. ${columnHint}`;
40
+
41
+ const documentationLink: Route = Route.fromString(
42
+ "/workflow/docs/DatabaseComponents.md",
43
+ );
44
+
17
45
  if (model.enableWorkflowOn.read) {
18
46
  components.push({
19
47
  id: `${Text.pascalCaseToDashes(model.tableName!)}-find-one`,
@@ -23,22 +51,23 @@ export default class BaseModelComponent {
23
51
  iconProp: IconProp.ArrowCircleDown,
24
52
  tableName: model.tableName!,
25
53
  componentType: ComponentType.Component,
54
+ documentationLink: documentationLink,
26
55
  arguments: [
27
56
  {
28
57
  type: ComponentInputType.Query,
29
58
  name: "Query",
30
- description: `Query on ${model.singularName}`,
59
+ description: queryDescription,
31
60
  required: true,
32
61
  id: "query",
33
- placeholder: 'Example: {"columnName": "value", ...}',
62
+ placeholder: queryPlaceholder,
34
63
  },
35
64
  {
36
65
  type: ComponentInputType.Select,
37
66
  name: "Select Fields",
38
- description: `Select on ${model.singularName}`,
67
+ description: `Fields to read from ${model.singularName}. ${columnHint}`,
39
68
  required: true,
40
69
  id: "select",
41
- placeholder: 'Example: {"columnName": true, ...}',
70
+ placeholder: selectPlaceholder,
42
71
  },
43
72
  ],
44
73
  returnValues: [
@@ -82,22 +111,23 @@ export default class BaseModelComponent {
82
111
  iconProp: IconProp.ArrowCircleDown,
83
112
  tableName: model.tableName!,
84
113
  componentType: ComponentType.Component,
114
+ documentationLink: documentationLink,
85
115
  arguments: [
86
116
  {
87
117
  type: ComponentInputType.Query,
88
118
  name: "Query",
89
- description: "Please fill out this query",
119
+ description: queryDescription,
90
120
  required: true,
91
121
  id: "query",
92
- placeholder: 'Example: {"columnName": "value", ...}',
122
+ placeholder: queryPlaceholder,
93
123
  },
94
124
  {
95
125
  type: ComponentInputType.Select,
96
126
  name: "Select Fields",
97
- description: `Select on ${model.singularName}`,
127
+ description: `Fields to read from ${model.singularName}. ${columnHint}`,
98
128
  required: true,
99
129
  id: "select",
100
- placeholder: 'Example: {"columnName": true, ...}',
130
+ placeholder: selectPlaceholder,
101
131
  },
102
132
  {
103
133
  type: ComponentInputType.Number,
@@ -196,17 +226,26 @@ export default class BaseModelComponent {
196
226
  iconProp: IconProp.Trash,
197
227
  tableName: model.tableName!,
198
228
  componentType: ComponentType.Component,
229
+ documentationLink: documentationLink,
199
230
  arguments: [
200
231
  {
201
232
  type: ComponentInputType.Query,
202
233
  name: "Delete by",
203
- description: "Please fill out this query",
234
+ description: queryDescription,
204
235
  required: true,
205
236
  id: "query",
206
- placeholder: 'Example: {"columnName": "value", ...}',
237
+ placeholder: queryPlaceholder,
238
+ },
239
+ ],
240
+ returnValues: [
241
+ {
242
+ id: "items-deleted",
243
+ name: "Items Deleted",
244
+ description: `How many ${model.pluralName} the query matched and deleted. Zero is not an error - it means nothing matched.`,
245
+ type: ComponentInputType.Number,
246
+ required: false,
207
247
  },
208
248
  ],
209
- returnValues: [],
210
249
  inPorts: [
211
250
  {
212
251
  title: "In",
@@ -239,14 +278,15 @@ export default class BaseModelComponent {
239
278
  iconProp: IconProp.Trash,
240
279
  tableName: model.tableName!,
241
280
  componentType: ComponentType.Component,
281
+ documentationLink: documentationLink,
242
282
  arguments: [
243
283
  {
244
284
  type: ComponentInputType.Query,
245
285
  name: "Delete by",
246
- description: "Please fill out this query",
286
+ description: queryDescription,
247
287
  required: true,
248
288
  id: "query",
249
- placeholder: 'Example: {"columnName": "value", ...}',
289
+ placeholder: queryPlaceholder,
250
290
  },
251
291
  {
252
292
  type: ComponentInputType.Number,
@@ -263,7 +303,15 @@ export default class BaseModelComponent {
263
303
  id: "limit",
264
304
  },
265
305
  ],
266
- returnValues: [],
306
+ returnValues: [
307
+ {
308
+ id: "items-deleted",
309
+ name: "Items Deleted",
310
+ description: `How many ${model.pluralName} the query matched and deleted. Zero is not an error - it means nothing matched.`,
311
+ type: ComponentInputType.Number,
312
+ required: false,
313
+ },
314
+ ],
267
315
  inPorts: [
268
316
  {
269
317
  title: "In",
@@ -312,10 +360,10 @@ export default class BaseModelComponent {
312
360
  {
313
361
  type: ComponentInputType.Select,
314
362
  name: "Select Fields",
315
- description: `Select on ${model.singularName}`,
363
+ description: `Fields to read from ${model.singularName}. ${columnHint}`,
316
364
  required: true,
317
365
  id: "select",
318
- placeholder: 'Example: {"columnName": true, ...}',
366
+ placeholder: selectPlaceholder,
319
367
  },
320
368
  ],
321
369
  returnValues: [
@@ -346,12 +394,13 @@ export default class BaseModelComponent {
346
394
  iconProp: IconProp.Database,
347
395
  tableName: model.tableName!,
348
396
  componentType: ComponentType.Component,
397
+ documentationLink: documentationLink,
349
398
  arguments: [
350
399
  {
351
400
  id: "json",
352
401
  placeholder: 'Example: {"columnName": "value", ...}',
353
402
  name: "JSON Object",
354
- description: `${model.singularName} represented as JSON`,
403
+ description: `${model.singularName} represented as JSON. ${columnHint}`,
355
404
  type: ComponentInputType.JSON,
356
405
  required: true,
357
406
  },
@@ -397,12 +446,13 @@ export default class BaseModelComponent {
397
446
  iconProp: IconProp.Database,
398
447
  tableName: model.tableName!,
399
448
  componentType: ComponentType.Component,
449
+ documentationLink: documentationLink,
400
450
  arguments: [
401
451
  {
402
452
  id: "json-array",
403
453
  name: "JSON Array",
404
454
  placeholder: 'Example: [{"columnName": "value", ...}, {...}]',
405
- description: "List of models represented as JSON array",
455
+ description: `List of ${model.pluralName} represented as a JSON array. ${columnHint}`,
406
456
  type: ComponentInputType.JSONArray,
407
457
  required: true,
408
458
  },
@@ -472,10 +522,10 @@ export default class BaseModelComponent {
472
522
  {
473
523
  type: ComponentInputType.Select,
474
524
  name: "Select Fields",
475
- description: `Select on ${model.singularName}`,
525
+ description: `Fields to read from ${model.singularName}. ${columnHint}`,
476
526
  required: true,
477
527
  id: "select",
478
- placeholder: 'Example: {"columnName": true, ...}',
528
+ placeholder: selectPlaceholder,
479
529
  },
480
530
  ],
481
531
  returnValues: [
@@ -505,25 +555,34 @@ export default class BaseModelComponent {
505
555
  iconProp: IconProp.ArrowCircleUp,
506
556
  tableName: model.tableName!,
507
557
  componentType: ComponentType.Component,
558
+ documentationLink: documentationLink,
508
559
  arguments: [
509
560
  {
510
561
  type: ComponentInputType.Query,
511
562
  name: "Query",
512
- description: "Please fill out this query",
563
+ description: queryDescription,
513
564
  required: true,
514
565
  id: "query",
515
- placeholder: 'Example: {"columnName": "value", ...}',
566
+ placeholder: queryPlaceholder,
516
567
  },
517
568
  {
518
569
  id: "data",
519
570
  placeholder: 'Example: {"columnName": "value", ...}',
520
571
  name: "Data (JSON Object)",
521
- description: `${model.singularName} represented as JSON`,
572
+ description: dataDescription,
522
573
  type: ComponentInputType.JSON,
523
574
  required: true,
524
575
  },
525
576
  ],
526
- returnValues: [],
577
+ returnValues: [
578
+ {
579
+ id: "items-updated",
580
+ name: "Items Updated",
581
+ description: `How many ${model.pluralName} the query matched and updated. Zero is not an error - it means nothing matched.`,
582
+ type: ComponentInputType.Number,
583
+ required: false,
584
+ },
585
+ ],
527
586
  inPorts: [
528
587
  {
529
588
  title: "In",
@@ -556,20 +615,21 @@ export default class BaseModelComponent {
556
615
  iconProp: IconProp.ArrowCircleUp,
557
616
  tableName: model.tableName!,
558
617
  componentType: ComponentType.Component,
618
+ documentationLink: documentationLink,
559
619
  arguments: [
560
620
  {
561
621
  type: ComponentInputType.Query,
562
622
  name: "Query",
563
- description: "Please fill out this query",
623
+ description: queryDescription,
564
624
  required: true,
565
625
  id: "query",
566
- placeholder: 'Example: {"columnName": "value", ...}',
626
+ placeholder: queryPlaceholder,
567
627
  },
568
628
  {
569
629
  id: "data",
570
630
  name: "Data (JSON Object)",
571
631
  placeholder: 'Example: {"columnName": "value", ...}',
572
- description: `${model.singularName} represented as JSON`,
632
+ description: dataDescription,
573
633
  type: ComponentInputType.JSON,
574
634
  required: true,
575
635
  },
@@ -588,7 +648,15 @@ export default class BaseModelComponent {
588
648
  id: "limit",
589
649
  },
590
650
  ],
591
- returnValues: [],
651
+ returnValues: [
652
+ {
653
+ id: "items-updated",
654
+ name: "Items Updated",
655
+ description: `How many ${model.pluralName} the query matched and updated. Zero is not an error - it means nothing matched.`,
656
+ type: ComponentInputType.Number,
657
+ required: false,
658
+ },
659
+ ],
592
660
  inPorts: [
593
661
  {
594
662
  title: "In",
@@ -0,0 +1,181 @@
1
+ /*
2
+ * A structured record of what each step of a workflow run actually did.
3
+ *
4
+ * The runner has always known this — it logs the arguments it resolved, the
5
+ * values a component returned, and which out port it took — but it flattened
6
+ * all of it into one newline-joined string, so the only way to answer "what did
7
+ * step three receive" was to read the whole blob. Keeping the same information
8
+ * as data lets the run be read as a list of steps, and lets a step be matched
9
+ * back to the node it came from on the canvas.
10
+ *
11
+ * The shapes live in Common/Types because the runner writes them, the API
12
+ * returns them, and the dashboard renders them.
13
+ */
14
+
15
+ import { JSONObject, JSONValue } from "../JSON";
16
+
17
+ export enum WorkflowStepStatus {
18
+ Success = "Success",
19
+ Error = "Error",
20
+ }
21
+
22
+ export interface WorkflowStepTraceEntry {
23
+ /** The step's user-facing id ("api-get-1") — matches a node on the canvas. */
24
+ componentId: string;
25
+ /** Which kind of component this was, e.g. "api-post". */
26
+ metadataId: string;
27
+ /** The component's title, so the trace reads without loading metadata. */
28
+ title: string;
29
+ status: WorkflowStepStatus;
30
+ startedAt: string;
31
+ completedAt: string;
32
+ durationInMs: number;
33
+ /** Resolved arguments, already redacted for sensitive fields. */
34
+ argumentValues: JSONObject;
35
+ /** Returned values, already redacted for sensitive fields. */
36
+ returnValues: JSONObject;
37
+ /** The out port taken, or null when the step ended the run. */
38
+ executedPort: string | null;
39
+ /** Present only on a failed step. */
40
+ errorMessage?: string | undefined;
41
+ }
42
+
43
+ export interface WorkflowStepTrace {
44
+ steps: Array<WorkflowStepTraceEntry>;
45
+ /**
46
+ * Set when steps were dropped to keep the row bounded. The dashboard says so
47
+ * rather than quietly showing a partial run as if it were complete.
48
+ */
49
+ truncated?: boolean | undefined;
50
+ }
51
+
52
+ /*
53
+ * A run is bounded by cycle detection, but a workflow that suspends and resumes
54
+ * accumulates across resumes, and a single value can be an entire HTTP response
55
+ * body. Both are capped: the row is written on every status change, and an
56
+ * unbounded trace would turn each of those writes into a large one.
57
+ */
58
+ export const MAX_TRACE_STEPS: number = 100;
59
+ export const MAX_TRACE_VALUE_LENGTH: number = 4000;
60
+
61
+ export const TRUNCATED_VALUE_SUFFIX: string = "… (truncated)";
62
+
63
+ export type TruncateTraceValueFunction = (value: JSONValue) => JSONValue;
64
+
65
+ /**
66
+ * Shrink one recorded value to something a row can hold.
67
+ *
68
+ * Strings are cut; anything structured is measured by its JSON length and
69
+ * replaced wholesale when it is too big, because cutting a serialized object in
70
+ * half produces text that looks like data but cannot be parsed.
71
+ */
72
+ export const truncateTraceValue: TruncateTraceValueFunction = (
73
+ value: JSONValue,
74
+ ): JSONValue => {
75
+ if (typeof value === "string") {
76
+ if (value.length <= MAX_TRACE_VALUE_LENGTH) {
77
+ return value;
78
+ }
79
+
80
+ return value.slice(0, MAX_TRACE_VALUE_LENGTH) + TRUNCATED_VALUE_SUFFIX;
81
+ }
82
+
83
+ if (value === null || value === undefined) {
84
+ return value;
85
+ }
86
+
87
+ if (typeof value !== "object") {
88
+ return value;
89
+ }
90
+
91
+ let serialized: string;
92
+
93
+ try {
94
+ serialized = JSON.stringify(value);
95
+ } catch {
96
+ // Circular or otherwise unserializable: say so rather than throwing.
97
+ return "[value could not be recorded]";
98
+ }
99
+
100
+ if (serialized.length <= MAX_TRACE_VALUE_LENGTH) {
101
+ return value;
102
+ }
103
+
104
+ return serialized.slice(0, MAX_TRACE_VALUE_LENGTH) + TRUNCATED_VALUE_SUFFIX;
105
+ };
106
+
107
+ export type TruncateTraceValuesFunction = (values: JSONObject) => JSONObject;
108
+
109
+ export const truncateTraceValues: TruncateTraceValuesFunction = (
110
+ values: JSONObject,
111
+ ): JSONObject => {
112
+ const truncated: JSONObject = {};
113
+
114
+ for (const key of Object.keys(values || {})) {
115
+ truncated[key] = truncateTraceValue(values[key] as JSONValue);
116
+ }
117
+
118
+ return truncated;
119
+ };
120
+
121
+ export type AppendTraceStepFunction = (
122
+ trace: WorkflowStepTrace,
123
+ entry: WorkflowStepTraceEntry,
124
+ ) => WorkflowStepTrace;
125
+
126
+ /**
127
+ * Add a step, keeping the trace within its cap.
128
+ *
129
+ * When the cap is reached the OLDEST steps are dropped: a run that failed is
130
+ * read from the end, and the step that broke it is the last one.
131
+ */
132
+ export const appendTraceStep: AppendTraceStepFunction = (
133
+ trace: WorkflowStepTrace,
134
+ entry: WorkflowStepTraceEntry,
135
+ ): WorkflowStepTrace => {
136
+ const steps: Array<WorkflowStepTraceEntry> = [...(trace.steps || []), entry];
137
+
138
+ if (steps.length <= MAX_TRACE_STEPS) {
139
+ return { ...trace, steps: steps };
140
+ }
141
+
142
+ return {
143
+ ...trace,
144
+ steps: steps.slice(steps.length - MAX_TRACE_STEPS),
145
+ truncated: true,
146
+ };
147
+ };
148
+
149
+ export type EmptyTraceFunction = () => WorkflowStepTrace;
150
+
151
+ export const emptyTrace: EmptyTraceFunction = (): WorkflowStepTrace => {
152
+ return { steps: [] };
153
+ };
154
+
155
+ export type ParseTraceFunction = (value: JSONValue) => WorkflowStepTrace;
156
+
157
+ /**
158
+ * Read a trace back off a row, tolerating anything that is not one.
159
+ *
160
+ * Old runs predate the column and rows can be written by an older build, so
161
+ * this never throws — a trace it cannot understand reads as an empty one and
162
+ * the viewer falls back to the raw log.
163
+ */
164
+ export const parseTrace: ParseTraceFunction = (
165
+ value: JSONValue,
166
+ ): WorkflowStepTrace => {
167
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
168
+ return emptyTrace();
169
+ }
170
+
171
+ const steps: JSONValue | undefined = (value as JSONObject)["steps"];
172
+
173
+ if (!Array.isArray(steps)) {
174
+ return emptyTrace();
175
+ }
176
+
177
+ return {
178
+ steps: steps as unknown as Array<WorkflowStepTraceEntry>,
179
+ truncated: Boolean((value as JSONObject)["truncated"]),
180
+ };
181
+ };