@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,533 @@
1
+ import { NetworkTopologyDeviceRole } from "../../Types/Monitor/SnmpMonitor/NetworkTopology";
2
+
3
+ /*
4
+ * Works out what a node on the network topology map DOES — router, switch,
5
+ * firewall, access point, load balancer, server, storage, or one of the
6
+ * leaf roles (printer, camera, phone, plain host).
7
+ *
8
+ * Why derive it rather than store it: nothing in SNMP hands us a role. The
9
+ * evidence we already collect does, though, and it arrives in a strict
10
+ * order of trustworthiness:
11
+ *
12
+ * 1. the product family in sysDescr / model / the CDP platform string
13
+ * ("Catalyst 2960", "FortiGate-60F", "SRX340") — a named family is
14
+ * the closest thing to a declaration of purpose,
15
+ * 2. the sysObjectId enterprise arc, for the vendors whose entire
16
+ * catalogue is one role (Palo Alto, F5, NetApp, ...),
17
+ * 3. the generic words in sysDescr ("... Switch ...", "Load Balancer"),
18
+ * 4. the naming convention in the hostname ("core-sw-1", "edge-fw01"),
19
+ * 5. last and weakest, a general-purpose OS or SNMP agent in sysDescr —
20
+ * "it is a computer", which loses to a hostname that says otherwise
21
+ * because switches and firewalls announce Linux kernels too.
22
+ *
23
+ * Each tier is weaker than the one above it, so they are tried in order
24
+ * and the first answer wins. When nothing matches the answer is "unknown",
25
+ * which is deliberate: a neutral node is honest, and a router drawn as a
26
+ * firewall because its hostname happened to contain "fw" is not. This is
27
+ * also why unmanaged CDP/LLDP peers — for which we have a platform string
28
+ * and a name and nothing else — mostly come back "unknown", and should.
29
+ *
30
+ * Pure and dependency-free so it runs identically in the topology builder
31
+ * on the server and in the unit tests.
32
+ */
33
+
34
+ /** Everything the classifier is allowed to look at. All best-effort. */
35
+ export interface DeviceRoleSignals {
36
+ sysDescr?: string | undefined;
37
+ sysObjectId?: string | undefined;
38
+ vendor?: string | undefined;
39
+ /** NetworkDevice.deviceModel for managed nodes. */
40
+ deviceModel?: string | undefined;
41
+ /** The CDP platform string an unmanaged peer advertises about itself. */
42
+ platform?: string | undefined;
43
+ name?: string | undefined;
44
+ sysName?: string | undefined;
45
+ }
46
+
47
+ /** What a discovered (ARP/FDB) endpoint tells us about itself. */
48
+ export interface EndpointRoleSignals {
49
+ /** User-editable free text: "POS", "Camera", "Printer", ... */
50
+ classification?: string | undefined;
51
+ vendor?: string | undefined;
52
+ name?: string | undefined;
53
+ }
54
+
55
+ interface RoleRule {
56
+ role: NetworkTopologyDeviceRole;
57
+ pattern: RegExp;
58
+ /*
59
+ * Only applied when the vendor evidence matches. This is what keeps
60
+ * Juniper's MX960 (a core router) apart from Meraki's MX64 (a security
61
+ * appliance) — the model strings are otherwise the same shape.
62
+ */
63
+ vendor?: RegExp | undefined;
64
+ }
65
+
66
+ /** Human-readable role names. One source of truth for UI and tests. */
67
+ export const DEVICE_ROLE_LABELS: Record<NetworkTopologyDeviceRole, string> = {
68
+ router: "Router",
69
+ switch: "Switch",
70
+ firewall: "Firewall",
71
+ wirelessAccessPoint: "Wireless AP",
72
+ loadBalancer: "Load balancer",
73
+ server: "Server",
74
+ storage: "Storage",
75
+ printer: "Printer",
76
+ camera: "Camera",
77
+ phone: "IP phone",
78
+ host: "Host",
79
+ unknown: "Unknown type",
80
+ };
81
+
82
+ /** Every role except "unknown", in the order a legend should list them. */
83
+ export const DEVICE_ROLES_IN_LEGEND_ORDER: ReadonlyArray<NetworkTopologyDeviceRole> =
84
+ [
85
+ "router",
86
+ "switch",
87
+ "firewall",
88
+ "wirelessAccessPoint",
89
+ "loadBalancer",
90
+ "server",
91
+ "storage",
92
+ "printer",
93
+ "camera",
94
+ "phone",
95
+ "host",
96
+ ];
97
+
98
+ /*
99
+ * Tier 1 — named product families. Ordered most specific first, because
100
+ * the first match wins: the leaf roles come before the infrastructure
101
+ * ones so "Cisco IP Phone 7961" is a phone rather than being swallowed by
102
+ * a later Cisco rule.
103
+ *
104
+ * A note on the boundaries. Every pattern is anchored with a LEADING \b
105
+ * and, for the model-code alternatives, deliberately no trailing one:
106
+ * real model strings run straight on into suffixes ("AIR-CAP3702I-A-K9",
107
+ * "C9300L-24P", "DCS-7050SX3-48YC8"), and a closing \b silently refuses
108
+ * to match every one of them. Alternatives that are ordinary words keep
109
+ * their own trailing \b, so "nas" cannot match "nasa".
110
+ */
111
+ const PRODUCT_RULES: ReadonlyArray<RoleRule> = [
112
+ // --- leaf devices that also speak SNMP ---
113
+ {
114
+ role: "camera",
115
+ pattern:
116
+ /\b(?:ip[- ]?camera|network camera|cctv\b|nvr\b|hikvision|dahua|axis [pqmf]\d{4})/,
117
+ },
118
+ { role: "camera", pattern: /\bmv\d{2}/, vendor: /meraki|cisco/ },
119
+ {
120
+ role: "phone",
121
+ pattern:
122
+ /\b(?:ip phone|voip phone|desk phone|polycom|yealink|grandstream|snom\b|spa\d{3}|cp-\d{4})/,
123
+ },
124
+ {
125
+ role: "printer",
126
+ pattern:
127
+ /\b(?:laserjet|officejet|deskjet|designjet|jetdirect|imagerunner|workcentre|workcenter|bizhub|kyocera|lexmark|mfp\b|multifunction printer)/,
128
+ },
129
+
130
+ // --- firewalls / security appliances ---
131
+ { role: "firewall", pattern: /\b(?:fortigate|fortiwifi|forti-gate)/ },
132
+ {
133
+ role: "firewall",
134
+ pattern: /\b(?:palo alto|pan-?os\b|pa-\d{3,4})/,
135
+ },
136
+ {
137
+ role: "firewall",
138
+ pattern:
139
+ /\b(?:adaptive security appliance|cisco asa\b|asa\d{4}|firepower|ftd\b|pix\b)/,
140
+ },
141
+ { role: "firewall", pattern: /\bsrx ?\d{2,4}|\bsrx\b/ },
142
+ {
143
+ role: "firewall",
144
+ pattern:
145
+ /\b(?:sonicwall|watchguard|check ?point|gaia\b|pfsense|opnsense|untangle|barracuda)/,
146
+ },
147
+ { role: "firewall", pattern: /\bsophos (?:xg|xgs|utm|sg)\b/ },
148
+ {
149
+ role: "firewall",
150
+ pattern: /\bmx\d{2,3}|\bz\d{1,2}\b/,
151
+ vendor: /meraki/,
152
+ },
153
+
154
+ // --- load balancers / application delivery ---
155
+ {
156
+ role: "loadBalancer",
157
+ pattern:
158
+ /\b(?:big-?ip|f5 networks|tmos\b|netscaler|citrix adc|a10 thunder|ax\d{4}|loadmaster|avi vantage|haproxy)/,
159
+ },
160
+
161
+ // --- wireless ---
162
+ {
163
+ role: "wirelessAccessPoint",
164
+ pattern:
165
+ /\b(?:aironet|air-(?:cap|ap|lap|sap|ct)|wlc\b|wireless lan controller|wireless controller)/,
166
+ },
167
+ /*
168
+ * Cisco recycled "Catalyst" across three roles, so the two that are not
169
+ * switches have to be claimed before the blanket Catalyst rule below:
170
+ * a 9800 is a wireless controller and an 8000 is a router.
171
+ */
172
+ {
173
+ role: "wirelessAccessPoint",
174
+ pattern: /\b(?:catalyst 98\d{2}|c98\d{2})/,
175
+ },
176
+ {
177
+ role: "wirelessAccessPoint",
178
+ pattern:
179
+ /\b(?:unifi ap|uap[- ]|u6-|nanostation|instant ap|iap\b|aruba ap|ap-\d{3}|fortiap|omada|eap\d{3}|cw9\d{3})/,
180
+ },
181
+ {
182
+ role: "wirelessAccessPoint",
183
+ pattern: /\bmr\d{2,3}/,
184
+ vendor: /meraki/,
185
+ },
186
+
187
+ /*
188
+ * --- switches ---
189
+ * First, the other half of the Catalyst disambiguation above.
190
+ */
191
+ {
192
+ role: "router",
193
+ pattern: /\b(?:catalyst 8\d{3}|c8\d{3})/,
194
+ },
195
+ {
196
+ role: "switch",
197
+ pattern:
198
+ /\b(?:catalyst|nexus|ws-c\d|c9[2345]\d{2}|c1000|c2960|c3[578]\d{2}|me-\d{4})/,
199
+ },
200
+ {
201
+ role: "switch",
202
+ pattern: /\b(?:ex\d{4}|qfx\d{4})/,
203
+ },
204
+ {
205
+ role: "switch",
206
+ pattern: /\bms\d{2,3}/,
207
+ vendor: /meraki/,
208
+ },
209
+ {
210
+ role: "switch",
211
+ pattern:
212
+ /\b(?:fortiswitch|procurve|powerconnect|force10|dcs-\d{4}|icx\d{4}|edgeswitch|unifi switch|usw-|crs\d{3}|css\d{3}|sg\d{3}|gs\d{3}|jl\d{3}[a-z]|s\d{4}-on|n\d{4}-on)/,
213
+ },
214
+
215
+ // --- routers ---
216
+ {
217
+ role: "router",
218
+ pattern: /\b(?:isr ?\d{3,4}|isr\b|asr ?\d{3,4}|c11\d{2}|c89\d\b|csr1000v)/,
219
+ },
220
+ {
221
+ role: "router",
222
+ pattern: /\b(?:mx\d{2,4}|ptx\d{4}|acx\d{4})/,
223
+ vendor: /juniper|junos/,
224
+ },
225
+ {
226
+ role: "router",
227
+ pattern:
228
+ /\b(?:routeros|mikrotik|ccr\d{4}|rb\d{3,4}|edgerouter|vyos\b|vsr\b)/,
229
+ },
230
+
231
+ // --- storage ---
232
+ {
233
+ role: "storage",
234
+ pattern:
235
+ /\b(?:netapp|data ontap|isilon|powerstore|powervault|unity xt|synology|qnap|truenas|freenas|pure ?storage|nimble storage|storwize|nas\b|san\b)/,
236
+ },
237
+
238
+ // --- servers / hypervisors / lights-out controllers ---
239
+ {
240
+ role: "server",
241
+ pattern:
242
+ /\b(?:esxi|vmware|proxmox|hyper-?v\b|xenserver|idrac\b|ilo\b|integrated lights-out|cimc\b|poweredge|proliant|thinksystem|primergy)/,
243
+ },
244
+ ];
245
+
246
+ /*
247
+ * Tier 3 — the generic words. Only consulted when no product family
248
+ * matched, and only against sysDescr, which is the one field vendors
249
+ * write a sentence into.
250
+ */
251
+ const GENERIC_RULES: ReadonlyArray<RoleRule> = [
252
+ {
253
+ role: "firewall",
254
+ pattern: /\b(firewall|security appliance|utm appliance)\b/,
255
+ },
256
+ {
257
+ role: "loadBalancer",
258
+ pattern: /\b(load ?balancer|application delivery controller)\b/,
259
+ },
260
+ {
261
+ role: "wirelessAccessPoint",
262
+ pattern: /\b(access point|wireless|wi-?fi|wlan)\b/,
263
+ },
264
+ { role: "printer", pattern: /\b(printer|print server|copier|scanner)\b/ },
265
+ { role: "camera", pattern: /\bcamera\b/ },
266
+ { role: "phone", pattern: /\b(phone|voip)\b/ },
267
+ { role: "switch", pattern: /\b(switch|switching)\b/ },
268
+ { role: "router", pattern: /\b(router|routing|gateway)\b/ },
269
+ { role: "storage", pattern: /\b(storage array|storage system|filer)\b/ },
270
+ ];
271
+
272
+ /*
273
+ * The weakest evidence there is: a general-purpose operating system in
274
+ * sysDescr. It says the box is a computer, not what job it does — plenty
275
+ * of switches and firewalls announce a Linux kernel — so it is consulted
276
+ * only after the hostname has had its say. A machine called "gw-1" that
277
+ * runs Linux is a router; a machine called "app-3" that runs Linux is a
278
+ * server.
279
+ */
280
+ const OPERATING_SYSTEM_RULES: ReadonlyArray<RoleRule> = [
281
+ {
282
+ role: "server",
283
+ pattern:
284
+ /\b(linux|windows|ubuntu|debian|centos|red ?hat|freebsd|solaris|net-snmp|\bserver\b)\b/,
285
+ },
286
+ ];
287
+
288
+ /*
289
+ * Tier 2 — sysObjectId enterprise arcs, for vendors that only make one
290
+ * kind of box. Deliberately short: a vendor with a mixed catalogue (Cisco,
291
+ * Juniper, HPE, Ubiquiti) tells us nothing here, and a wrong shape is
292
+ * worse than a neutral one. Matched on dotted-prefix boundaries so
293
+ * ".1.3.6.1.4.1.11" cannot swallow ".1.3.6.1.4.1.1124".
294
+ */
295
+ const SYS_OBJECT_ID_RULES: ReadonlyArray<{
296
+ prefix: string;
297
+ role: NetworkTopologyDeviceRole;
298
+ }> = [
299
+ // Printers, most specific arcs first (HP's printer arc sits under HP's).
300
+ { prefix: "1.3.6.1.4.1.11.2.3.9", role: "printer" },
301
+ { prefix: "1.3.6.1.4.1.641", role: "printer" }, // Lexmark
302
+ { prefix: "1.3.6.1.4.1.1602", role: "printer" }, // Canon
303
+ { prefix: "1.3.6.1.4.1.367", role: "printer" }, // Ricoh
304
+ { prefix: "1.3.6.1.4.1.253", role: "printer" }, // Xerox
305
+ { prefix: "1.3.6.1.4.1.1248", role: "printer" }, // Epson
306
+ { prefix: "1.3.6.1.4.1.236", role: "printer" }, // Samsung printers
307
+ // Firewalls.
308
+ { prefix: "1.3.6.1.4.1.12356", role: "firewall" }, // Fortinet
309
+ { prefix: "1.3.6.1.4.1.25461", role: "firewall" }, // Palo Alto
310
+ { prefix: "1.3.6.1.4.1.2620", role: "firewall" }, // Check Point
311
+ { prefix: "1.3.6.1.4.1.8741", role: "firewall" }, // SonicWall
312
+ { prefix: "1.3.6.1.4.1.3097", role: "firewall" }, // WatchGuard
313
+ { prefix: "1.3.6.1.4.1.2604", role: "firewall" }, // Sophos / Astaro
314
+ // Load balancers.
315
+ { prefix: "1.3.6.1.4.1.3375", role: "loadBalancer" }, // F5
316
+ { prefix: "1.3.6.1.4.1.5951", role: "loadBalancer" }, // Citrix NetScaler
317
+ { prefix: "1.3.6.1.4.1.22610", role: "loadBalancer" }, // A10
318
+ // Storage.
319
+ { prefix: "1.3.6.1.4.1.789", role: "storage" }, // NetApp
320
+ // Switching / routing houses.
321
+ { prefix: "1.3.6.1.4.1.30065", role: "switch" }, // Arista
322
+ { prefix: "1.3.6.1.4.1.6027", role: "switch" }, // Force10 / Dell
323
+ { prefix: "1.3.6.1.4.1.14988", role: "router" }, // MikroTik
324
+ ];
325
+
326
+ /*
327
+ * Generic SNMP agents. These identify the AGENT, not the appliance — a
328
+ * Linux firewall answers on Net-SNMP just as readily as a database server
329
+ * does — so, like the OS rules, they are consulted only after the
330
+ * hostname.
331
+ */
332
+ const GENERIC_AGENT_SYS_OBJECT_ID_RULES: ReadonlyArray<{
333
+ prefix: string;
334
+ role: NetworkTopologyDeviceRole;
335
+ }> = [
336
+ { prefix: "1.3.6.1.4.1.8072", role: "server" }, // Net-SNMP
337
+ { prefix: "1.3.6.1.4.1.2021", role: "server" }, // UCD-SNMP
338
+ { prefix: "1.3.6.1.4.1.311", role: "server" }, // Microsoft
339
+ { prefix: "1.3.6.1.4.1.6876", role: "server" }, // VMware
340
+ ];
341
+
342
+ /*
343
+ * Tier 4 — hostname conventions. Whole tokens only ("core-sw-1" → "sw",
344
+ * "edge-fw01" → "fw01"), never substrings, so "swan" is not a switch and
345
+ * "apex" is not an access point.
346
+ */
347
+ const NAME_RULES: ReadonlyArray<RoleRule> = [
348
+ { role: "router", pattern: /^(rtr|router|rt|gw|gwy|gateway)\d*$/ },
349
+ {
350
+ role: "switch",
351
+ pattern: /^(sw|swi|switch|sws|dsw|asw|csw|tor|leaf|spine)\d*$/,
352
+ },
353
+ { role: "firewall", pattern: /^(fw|fwl|firewall|asa|ngfw|utm)\d*$/ },
354
+ { role: "wirelessAccessPoint", pattern: /^(ap|wap|wifi|wlan|wlc)\d*$/ },
355
+ { role: "loadBalancer", pattern: /^(lb|slb|adc|vip)\d*$/ },
356
+ { role: "server", pattern: /^(srv|server|esx|esxi|vmhost)\d*$/ },
357
+ { role: "storage", pattern: /^(nas|san|stor|storage|filer)\d*$/ },
358
+ { role: "camera", pattern: /^(cam|camera|ipcam|cctv)\d*$/ },
359
+ { role: "printer", pattern: /^(prn|print|printer|mfp)\d*$/ },
360
+ { role: "phone", pattern: /^(phone|voip|sip)\d*$/ },
361
+ ];
362
+
363
+ /*
364
+ * Endpoint classifications are free text a human typed, so they are
365
+ * matched loosely — but still whole-word, and still ordered so the
366
+ * specific ones win.
367
+ */
368
+ const ENDPOINT_RULES: ReadonlyArray<RoleRule> = [
369
+ {
370
+ role: "camera",
371
+ pattern:
372
+ /\b(camera|cam|cctv|nvr|dvr|hikvision|dahua|axis communications)\b/,
373
+ },
374
+ {
375
+ role: "printer",
376
+ pattern:
377
+ /\b(printer|print|mfp|copier|scanner|label|zebra|brother|lexmark|kyocera|ricoh|xerox|epson)\b/,
378
+ },
379
+ {
380
+ role: "phone",
381
+ pattern:
382
+ /\b(phone|voip|sip|handset|intercom|polycom|yealink|avaya|mitel)\b/,
383
+ },
384
+ {
385
+ role: "wirelessAccessPoint",
386
+ pattern: /\b(access point|\bap\b|wireless|wi-?fi)\b/,
387
+ },
388
+ { role: "switch", pattern: /\bswitch\b/ },
389
+ { role: "router", pattern: /\b(router|gateway)\b/ },
390
+ { role: "server", pattern: /\b(server|nas|hypervisor)\b/ },
391
+ ];
392
+
393
+ /** Lowercase, whitespace-collapsed, and safe on undefined. */
394
+ function normalize(value: string | undefined): string {
395
+ return (value || "").toLowerCase().replace(/\s+/g, " ").trim();
396
+ }
397
+
398
+ function firstMatch(
399
+ rules: ReadonlyArray<RoleRule>,
400
+ haystack: string,
401
+ vendorText: string,
402
+ ): NetworkTopologyDeviceRole | undefined {
403
+ if (!haystack) {
404
+ return undefined;
405
+ }
406
+ for (const rule of rules) {
407
+ if (rule.vendor && !rule.vendor.test(vendorText)) {
408
+ continue;
409
+ }
410
+ if (rule.pattern.test(haystack)) {
411
+ return rule.role;
412
+ }
413
+ }
414
+ return undefined;
415
+ }
416
+
417
+ /*
418
+ * Dotted-prefix containment: the arc must end at a dot or at the end of
419
+ * the OID. Leading dots (".1.3.6.1...", which plenty of agents emit) are
420
+ * stripped first.
421
+ */
422
+ function roleForSysObjectId(
423
+ sysObjectId: string | undefined,
424
+ rules: ReadonlyArray<{ prefix: string; role: NetworkTopologyDeviceRole }>,
425
+ ): NetworkTopologyDeviceRole | undefined {
426
+ const oid: string = normalize(sysObjectId).replace(/^\.+/, "");
427
+ if (!oid) {
428
+ return undefined;
429
+ }
430
+ for (const rule of rules) {
431
+ if (oid === rule.prefix || oid.startsWith(`${rule.prefix}.`)) {
432
+ return rule.role;
433
+ }
434
+ }
435
+ return undefined;
436
+ }
437
+
438
+ function roleForNameText(
439
+ value: string | undefined,
440
+ ): NetworkTopologyDeviceRole | undefined {
441
+ const text: string = normalize(value);
442
+ if (!text) {
443
+ return undefined;
444
+ }
445
+ /*
446
+ * Split on anything that is not a letter or a digit, which is how the
447
+ * separators people actually use ("-", ".", "_", " ") all behave.
448
+ */
449
+ for (const token of text.split(/[^a-z0-9]+/)) {
450
+ if (!token) {
451
+ continue;
452
+ }
453
+ for (const rule of NAME_RULES) {
454
+ if (rule.pattern.test(token)) {
455
+ return rule.role;
456
+ }
457
+ }
458
+ }
459
+ return undefined;
460
+ }
461
+
462
+ /**
463
+ * The role of one network device (managed) or discovery-protocol peer
464
+ * (unmanaged).
465
+ *
466
+ * Total: always returns a role, "unknown" when nothing is conclusive.
467
+ */
468
+ export function classifyDeviceRole(
469
+ signals: DeviceRoleSignals,
470
+ ): NetworkTopologyDeviceRole {
471
+ const model: string = normalize(
472
+ [signals.deviceModel, signals.platform].filter(Boolean).join(" "),
473
+ );
474
+ const sysDescr: string = normalize(signals.sysDescr);
475
+ /*
476
+ * Vendor guards read every identity field, not just `vendor` — the word
477
+ * "Meraki" usually arrives inside sysDescr or the platform string, and
478
+ * `vendor` itself is often empty on an unmanaged peer.
479
+ */
480
+ const vendorText: string = normalize(
481
+ [signals.vendor, signals.deviceModel, signals.platform, signals.sysDescr]
482
+ .filter(Boolean)
483
+ .join(" "),
484
+ );
485
+
486
+ return (
487
+ firstMatch(PRODUCT_RULES, model, vendorText) ??
488
+ firstMatch(PRODUCT_RULES, sysDescr, vendorText) ??
489
+ roleForSysObjectId(signals.sysObjectId, SYS_OBJECT_ID_RULES) ??
490
+ firstMatch(GENERIC_RULES, sysDescr, vendorText) ??
491
+ roleForNameText(signals.sysName) ??
492
+ roleForNameText(signals.name) ??
493
+ roleForSysObjectId(
494
+ signals.sysObjectId,
495
+ GENERIC_AGENT_SYS_OBJECT_ID_RULES,
496
+ ) ??
497
+ firstMatch(OPERATING_SYSTEM_RULES, sysDescr, vendorText) ??
498
+ "unknown"
499
+ );
500
+ }
501
+
502
+ /**
503
+ * The role of a discovered (ARP/FDB) endpoint.
504
+ *
505
+ * An endpoint is a host until something says otherwise — that is what
506
+ * being on the far side of an access port means — so this never returns
507
+ * "unknown". The classification field is a human's own words about the
508
+ * thing, so it is read first, then the OUI vendor, then the name.
509
+ */
510
+ export function classifyEndpointRole(
511
+ signals: EndpointRoleSignals,
512
+ ): NetworkTopologyDeviceRole {
513
+ const classification: string = normalize(signals.classification);
514
+ const vendor: string = normalize(signals.vendor);
515
+ const name: string = normalize(signals.name);
516
+
517
+ return (
518
+ firstMatch(ENDPOINT_RULES, classification, classification) ??
519
+ firstMatch(ENDPOINT_RULES, vendor, vendor) ??
520
+ firstMatch(ENDPOINT_RULES, name, name) ??
521
+ "host"
522
+ );
523
+ }
524
+
525
+ /** Display name for a role. Falls back to the "unknown" label. */
526
+ export function labelForDeviceRole(
527
+ role: NetworkTopologyDeviceRole | undefined,
528
+ ): string {
529
+ if (!role) {
530
+ return DEVICE_ROLE_LABELS.unknown;
531
+ }
532
+ return DEVICE_ROLE_LABELS[role] || DEVICE_ROLE_LABELS.unknown;
533
+ }
@@ -8,6 +8,10 @@ import NetworkTopology, {
8
8
  import LldpNeighbor from "../../Types/Monitor/SnmpMonitor/LldpNeighbor";
9
9
  import CdpNeighbor from "../../Types/Monitor/SnmpMonitor/CdpNeighbor";
10
10
  import { normalizeMac } from "./EndpointAttachmentUtil";
11
+ import {
12
+ classifyDeviceRole,
13
+ classifyEndpointRole,
14
+ } from "./NetworkDeviceRoleUtil";
11
15
 
12
16
  export interface TopologyDeviceInput {
13
17
  id: string;
@@ -19,6 +23,12 @@ export interface TopologyDeviceInput {
19
23
  interfacesDown?: number | undefined;
20
24
  vendor?: string | undefined;
21
25
  deviceModel?: string | undefined;
26
+ /*
27
+ * SNMP identity, carried purely so the node can be classified into a
28
+ * role (router/switch/firewall/...). Neither is rendered directly.
29
+ */
30
+ sysDescr?: string | undefined;
31
+ sysObjectId?: string | undefined;
22
32
  lldpNeighbors?: Array<LldpNeighbor> | undefined;
23
33
  cdpNeighbors?: Array<CdpNeighbor> | undefined;
24
34
  }
@@ -145,6 +155,14 @@ export default class NetworkTopologyUtil {
145
155
  name: device.name,
146
156
  isManaged: true,
147
157
  kind: "device",
158
+ role: classifyDeviceRole({
159
+ sysDescr: device.sysDescr,
160
+ sysObjectId: device.sysObjectId,
161
+ vendor: device.vendor,
162
+ deviceModel: device.deviceModel,
163
+ name: device.name,
164
+ sysName: device.sysName || device.hostname,
165
+ }),
148
166
  status: NetworkTopologyUtil.deviceStatus(device, now),
149
167
  interfacesUp: device.interfacesUp,
150
168
  interfacesDown: device.interfacesDown,
@@ -180,19 +198,33 @@ export default class NetworkTopologyUtil {
180
198
  const existingUnmanaged: NetworkTopologyNode | undefined =
181
199
  unmanagedNodeById.get(toNodeId);
182
200
  if (!existingUnmanaged) {
201
+ const unmanagedName: string = claim.displayName || "Unknown device";
183
202
  const unmanagedNode: NetworkTopologyNode = {
184
203
  id: toNodeId,
185
- name: claim.displayName || "Unknown device",
204
+ name: unmanagedName,
186
205
  isManaged: false,
187
206
  kind: "unmanaged",
207
+ role: classifyDeviceRole({
208
+ platform: claim.remotePlatform,
209
+ name: unmanagedName,
210
+ }),
188
211
  status: "unknown",
189
212
  deviceModel: claim.remotePlatform,
190
213
  };
191
214
  unmanagedNodeById.set(toNodeId, unmanagedNode);
192
215
  nodes.push(unmanagedNode);
193
216
  } else if (!existingUnmanaged.deviceModel && claim.remotePlatform) {
194
- // A later CDP claim may know the platform the first one didn't.
217
+ /*
218
+ * A later CDP claim may know the platform the first one didn't
219
+ * — which is usually the only evidence a peer's role rests on,
220
+ * so the role is re-derived rather than left at whatever the
221
+ * name alone produced.
222
+ */
195
223
  existingUnmanaged.deviceModel = claim.remotePlatform;
224
+ existingUnmanaged.role = classifyDeviceRole({
225
+ platform: claim.remotePlatform,
226
+ name: existingUnmanaged.name,
227
+ });
196
228
  }
197
229
  }
198
230
 
@@ -348,15 +380,21 @@ export default class NetworkTopologyUtil {
348
380
  renderedEndpointCount++;
349
381
 
350
382
  const nodeId: string = `endpoint:${endpoint.id}`;
383
+ const endpointName: string =
384
+ endpoint.classification ||
385
+ endpoint.vendor ||
386
+ endpoint.ipAddress ||
387
+ endpoint.macAddress;
351
388
  nodes.push({
352
389
  id: nodeId,
353
- name:
354
- endpoint.classification ||
355
- endpoint.vendor ||
356
- endpoint.ipAddress ||
357
- endpoint.macAddress,
390
+ name: endpointName,
358
391
  isManaged: false,
359
392
  kind: "endpoint",
393
+ role: classifyEndpointRole({
394
+ classification: endpoint.classification,
395
+ vendor: endpoint.vendor,
396
+ name: endpointName,
397
+ }),
360
398
  status: NetworkTopologyUtil.statusFromLastSeen(
361
399
  endpoint.lastSeenAt,
362
400
  now,
@@ -202,3 +202,69 @@ export function keyForDockerSwarmCluster(
202
202
  identifyingAttributes: { "docker.swarm.cluster.name": clusterName },
203
203
  });
204
204
  }
205
+
206
+ /*
207
+ * ---- Rows without telemetry ----------------------------------------------
208
+ *
209
+ * The helpers above mirror an ingest-side resolver, so their identifying
210
+ * attribute is dictated by semconv — the key MUST byte-match what ingest
211
+ * stamped or the lookup finds nothing. The two below have no ingest-side
212
+ * counterpart to match: nothing about a hand-registered vendor API or an
213
+ * SNMP-polled switch ever flows through an OTLP resource. Their identity is
214
+ * therefore chosen here, and the only real requirement is that it is stable
215
+ * and collision-free within a project.
216
+ */
217
+
218
+ /**
219
+ * Identity attribute for a manually created CI. Its value is the CI's
220
+ * canonicalized display name, which makes (project, type, name) the natural
221
+ * key — so re-creating a deleted CI under the same name reuses its key, and
222
+ * two CIs of one type cannot share a name.
223
+ */
224
+ export const MANUAL_ENTITY_IDENTITY_ATTRIBUTE: string = "oneuptime.entity.name";
225
+
226
+ /**
227
+ * Key for a manually created CI. Pass the user-entered display name; it is
228
+ * canonicalized (trimmed + lowercased) exactly like every other identity
229
+ * value, so casing drift on re-entry does not fork identity.
230
+ */
231
+ export function keyForManualEntity(
232
+ projectId: string,
233
+ entityType: EntityType,
234
+ displayName: string,
235
+ ): string {
236
+ return computeEntityKey({
237
+ projectId,
238
+ entityType,
239
+ identifyingAttributes: {
240
+ [MANUAL_ENTITY_IDENTITY_ATTRIBUTE]: displayName,
241
+ },
242
+ });
243
+ }
244
+
245
+ /**
246
+ * Identity attribute for an inventory-mirrored CI. The value is the owning
247
+ * row's ObjectID rather than its name: unlike the semconv-derived types,
248
+ * the inventory row IS the identity, and keying on the id means renaming a
249
+ * device in the UI does not orphan its registry row and mint a second one.
250
+ */
251
+ export const INVENTORY_ENTITY_IDENTITY_ATTRIBUTE: string =
252
+ "oneuptime.resource.id";
253
+
254
+ /**
255
+ * Key for a row mirrored out of a OneUptime inventory table. Pass the
256
+ * owning row's id (e.g. `NetworkDevice.id`).
257
+ */
258
+ export function keyForInventoryEntity(
259
+ projectId: string,
260
+ entityType: EntityType,
261
+ resourceId: string,
262
+ ): string {
263
+ return computeEntityKey({
264
+ projectId,
265
+ entityType,
266
+ identifyingAttributes: {
267
+ [INVENTORY_ENTITY_IDENTITY_ATTRIBUTE]: resourceId,
268
+ },
269
+ });
270
+ }