@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,315 @@
1
+ import API, { RequestOptions } from "../../../../Utils/API";
2
+ import HTTPResponse from "../../../../Types/API/HTTPResponse";
3
+ import { JSONObject } from "../../../../Types/JSON";
4
+ import LlmType from "../../../../Types/LLM/LlmType";
5
+ import LLMService from "../../../../Server/Utils/LLM/LLMService";
6
+ import DataSourceEgressGuard, {
7
+ EgressResolveFunction,
8
+ ResolvedAddress,
9
+ } from "../../../../Server/Utils/DataSource/EgressGuard";
10
+ import {
11
+ afterEach,
12
+ beforeEach,
13
+ describe,
14
+ expect,
15
+ jest,
16
+ test,
17
+ } from "@jest/globals";
18
+ import dns from "dns";
19
+
20
+ /*
21
+ * LlmProvider.baseUrl is writable by any ProjectMember, while reading the
22
+ * provider's apiKey is restricted to Owner/Admin. So an unguarded outbound
23
+ * request is a privilege escalation with two payouts: the decrypted key goes
24
+ * out in the auth header of a request to a host the member chose, and the
25
+ * provider's error body is reflected back through the LLM provider API, which
26
+ * turns the same lever into a read primitive against the internal network.
27
+ *
28
+ * These tests assert that no request leaves for an internal address, that the
29
+ * checked address is pinned into the socket, and that redirects are refused.
30
+ * DNS is mocked so they are deterministic and offline.
31
+ */
32
+
33
+ type LookupSpy = jest.SpiedFunction<
34
+ (
35
+ hostname: string,
36
+ options: { all: true },
37
+ ) => Promise<Array<{ address: string; family: number }>>
38
+ >;
39
+
40
+ let lookupSpy: LookupSpy;
41
+
42
+ // Every API.post the service made, so tests can assert on "never sent".
43
+ const postCalls: Array<{ options?: RequestOptions | undefined }> = [];
44
+
45
+ function mockPostSuccess(): void {
46
+ jest.spyOn(API, "post").mockImplementation(((options: {
47
+ options?: RequestOptions | undefined;
48
+ }) => {
49
+ postCalls.push(options);
50
+
51
+ return Promise.resolve({
52
+ jsonData: {
53
+ choices: [{ message: { content: "ok" } }],
54
+ content: [{ type: "text", text: "ok" }],
55
+ message: { content: "ok" },
56
+ usage: { prompt_tokens: 1, completion_tokens: 1, total_tokens: 2 },
57
+ },
58
+ } as unknown as HTTPResponse<JSONObject>);
59
+ }) as never);
60
+ }
61
+
62
+ function lastPostOptions(): RequestOptions {
63
+ return postCalls[postCalls.length - 1]!.options as RequestOptions;
64
+ }
65
+
66
+ beforeEach(() => {
67
+ postCalls.length = 0;
68
+ lookupSpy = jest.spyOn(dns.promises, "lookup") as unknown as LookupSpy;
69
+
70
+ /*
71
+ * Stand in for getaddrinfo: "localhost" is loopback, everything else is a
72
+ * public address. Individual tests override this to model rebinding.
73
+ */
74
+ lookupSpy.mockImplementation((hostname: string) => {
75
+ if (hostname === "localhost") {
76
+ return Promise.resolve([{ address: "127.0.0.1", family: 4 }]);
77
+ }
78
+
79
+ return Promise.resolve([{ address: "93.184.216.34", family: 4 }]);
80
+ });
81
+
82
+ mockPostSuccess();
83
+ });
84
+
85
+ afterEach(() => {
86
+ jest.restoreAllMocks();
87
+ });
88
+
89
+ describe("LLMService refuses internal LLM provider base URLs", () => {
90
+ const blockedBaseUrls: Array<string> = [
91
+ "http://127.0.0.1:11434",
92
+ "http://localhost:11434",
93
+ "http://169.254.169.254",
94
+ "http://169.254.169.254:80",
95
+ "http://[::1]:11434",
96
+ "http://0.0.0.0:11434",
97
+ ];
98
+
99
+ test.each(blockedBaseUrls)(
100
+ "OpenAI-compatible provider at %s never posts",
101
+ async (baseUrl: string) => {
102
+ await expect(
103
+ LLMService.getCompletion({
104
+ llmProviderConfig: {
105
+ llmType: LlmType.OpenAICompatible,
106
+ apiKey: "sk-secret",
107
+ modelName: "some-model",
108
+ baseUrl,
109
+ },
110
+ messages: [{ role: "user", content: "hi" }],
111
+ }),
112
+ ).rejects.toThrow();
113
+
114
+ expect(postCalls).toHaveLength(0);
115
+ },
116
+ );
117
+
118
+ test("Ollama provider at a loopback base URL never posts", async () => {
119
+ await expect(
120
+ LLMService.getCompletion({
121
+ llmProviderConfig: {
122
+ llmType: LlmType.Ollama,
123
+ modelName: "llama2",
124
+ baseUrl: "http://127.0.0.1:11434",
125
+ },
126
+ messages: [{ role: "user", content: "hi" }],
127
+ }),
128
+ ).rejects.toThrow();
129
+
130
+ expect(postCalls).toHaveLength(0);
131
+ });
132
+
133
+ test("Anthropic provider repointed at the metadata endpoint never posts", async () => {
134
+ await expect(
135
+ LLMService.getCompletion({
136
+ llmProviderConfig: {
137
+ llmType: LlmType.Anthropic,
138
+ apiKey: "sk-ant-secret",
139
+ modelName: "claude-sonnet-4-20250514",
140
+ baseUrl: "http://169.254.169.254/latest",
141
+ },
142
+ messages: [{ role: "user", content: "hi" }],
143
+ }),
144
+ ).rejects.toThrow();
145
+
146
+ expect(postCalls).toHaveLength(0);
147
+ });
148
+
149
+ test("Azure provider repointed at loopback never posts", async () => {
150
+ await expect(
151
+ LLMService.getCompletion({
152
+ llmProviderConfig: {
153
+ llmType: LlmType.AzureOpenAI,
154
+ apiKey: "azure-secret",
155
+ modelName: "gpt-4o",
156
+ baseUrl: "http://127.0.0.1/openai/deployments/gpt-4o",
157
+ },
158
+ messages: [{ role: "user", content: "hi" }],
159
+ }),
160
+ ).rejects.toThrow();
161
+
162
+ expect(postCalls).toHaveLength(0);
163
+ });
164
+
165
+ test("a public hostname that resolves to a private address never posts", async () => {
166
+ // The DNS-rebinding shape: the name looks fine, the answer does not.
167
+ lookupSpy.mockResolvedValue([{ address: "10.0.0.5", family: 4 }]);
168
+
169
+ /*
170
+ * Private ranges are only blocked under SaaS policy; this is the
171
+ * documented switch that turns it on for a self-hosted install.
172
+ */
173
+ process.env["DATA_SOURCE_BLOCK_PRIVATE_ADDRESSES"] = "true";
174
+
175
+ try {
176
+ await expect(
177
+ LLMService.getCompletion({
178
+ llmProviderConfig: {
179
+ llmType: LlmType.OpenAICompatible,
180
+ apiKey: "sk-secret",
181
+ modelName: "some-model",
182
+ baseUrl: "https://ollama.attacker.example/v1",
183
+ },
184
+ messages: [{ role: "user", content: "hi" }],
185
+ }),
186
+ ).rejects.toThrow();
187
+ } finally {
188
+ delete process.env["DATA_SOURCE_BLOCK_PRIVATE_ADDRESSES"];
189
+ }
190
+
191
+ expect(postCalls).toHaveLength(0);
192
+ });
193
+ });
194
+
195
+ describe("LLMService pins and refuses redirects on allowed providers", () => {
196
+ test("a public provider posts with redirects disabled and pinned agents", async () => {
197
+ await LLMService.getCompletion({
198
+ llmProviderConfig: {
199
+ llmType: LlmType.OpenAICompatible,
200
+ apiKey: "sk-secret",
201
+ modelName: "some-model",
202
+ baseUrl: "https://gateway.example.com/v1",
203
+ },
204
+ messages: [{ role: "user", content: "hi" }],
205
+ });
206
+
207
+ const options: RequestOptions = lastPostOptions();
208
+
209
+ expect(options.doNotFollowRedirects).toBe(true);
210
+ expect(options.httpAgent).toBeDefined();
211
+ expect(options.httpsAgent).toBeDefined();
212
+ });
213
+
214
+ test("the pinned agent dials the address that was validated", async () => {
215
+ lookupSpy.mockResolvedValue([{ address: "93.184.216.34", family: 4 }]);
216
+
217
+ await LLMService.getCompletion({
218
+ llmProviderConfig: {
219
+ llmType: LlmType.Anthropic,
220
+ apiKey: "sk-ant-secret",
221
+ modelName: "claude-sonnet-4-20250514",
222
+ baseUrl: "https://api.anthropic.com/v1",
223
+ },
224
+ messages: [{ role: "user", content: "hi" }],
225
+ });
226
+
227
+ const options: RequestOptions = lastPostOptions();
228
+
229
+ const lookup: (
230
+ hostname: string,
231
+ lookupOptions: { all?: boolean },
232
+ callback: (error: Error | null, address: string, family?: number) => void,
233
+ ) => void = (
234
+ options.httpsAgent as unknown as {
235
+ options: {
236
+ lookup: (
237
+ hostname: string,
238
+ lookupOptions: { all?: boolean },
239
+ callback: (
240
+ error: Error | null,
241
+ address: string,
242
+ family?: number,
243
+ ) => void,
244
+ ) => void;
245
+ };
246
+ }
247
+ ).options.lookup;
248
+
249
+ const dialed: string = await new Promise((resolve: (v: string) => void) => {
250
+ lookup(
251
+ "api.anthropic.com",
252
+ { all: false },
253
+ (_error: Error | null, address: string) => {
254
+ resolve(address);
255
+ },
256
+ );
257
+ });
258
+
259
+ expect(dialed).toBe("93.184.216.34");
260
+ });
261
+
262
+ test("the guard resolves once per completion, not once per retry", async () => {
263
+ /*
264
+ * postOpenAIChatCompletion re-posts when the provider rejects a generation
265
+ * parameter. Re-resolving per attempt would add a fresh rebind window
266
+ * between attempts.
267
+ */
268
+ await LLMService.getCompletion({
269
+ llmProviderConfig: {
270
+ llmType: LlmType.OpenAICompatible,
271
+ apiKey: "sk-secret",
272
+ modelName: "some-model",
273
+ baseUrl: "https://gateway.example.com/v1",
274
+ },
275
+ messages: [{ role: "user", content: "hi" }],
276
+ });
277
+
278
+ expect(lookupSpy).toHaveBeenCalledTimes(1);
279
+ });
280
+ });
281
+
282
+ describe("DataSourceEgressGuard self-hosted policy for LLM providers", () => {
283
+ const resolveToPrivate: EgressResolveFunction = (): Promise<
284
+ Array<ResolvedAddress>
285
+ > => {
286
+ return Promise.resolve([{ address: "10.0.0.5", family: 4 }]);
287
+ };
288
+
289
+ test("a self-hosted Ollama on a private address is still reachable", async () => {
290
+ // The documented deployment: blockPrivateAddresses off (no billing).
291
+ await expect(
292
+ DataSourceEgressGuard.assertUrlAllowed("http://ollama.internal:11434", {
293
+ blockPrivateAddresses: false,
294
+ resolveFunction: resolveToPrivate,
295
+ targetLabel: "LLM provider",
296
+ }),
297
+ ).resolves.toBeDefined();
298
+ });
299
+
300
+ test("but loopback and link-local are blocked even self-hosted", async () => {
301
+ await expect(
302
+ DataSourceEgressGuard.assertUrlAllowed("http://127.0.0.1:11434", {
303
+ blockPrivateAddresses: false,
304
+ targetLabel: "LLM provider",
305
+ }),
306
+ ).rejects.toThrow();
307
+
308
+ await expect(
309
+ DataSourceEgressGuard.assertUrlAllowed("http://169.254.169.254/", {
310
+ blockPrivateAddresses: false,
311
+ targetLabel: "LLM provider",
312
+ }),
313
+ ).rejects.toThrow();
314
+ });
315
+ });
@@ -1,4 +1,5 @@
1
1
  import API from "../../../../Utils/API";
2
+ import stubLLMEgressGuard from "./StubLLMEgressGuard";
2
3
  import logger from "../../../../Server/Utils/Logger";
3
4
  import HTTPErrorResponse from "../../../../Types/API/HTTPErrorResponse";
4
5
  import HTTPResponse from "../../../../Types/API/HTTPResponse";
@@ -90,6 +91,8 @@ function bodyOf(spy: PostSpy, callIndex: number): JSONObject {
90
91
  }
91
92
 
92
93
  beforeEach(() => {
94
+ // These hosts are placeholders; the SSRF guard is covered elsewhere.
95
+ stubLLMEgressGuard();
93
96
  LLMService.clearRequestAdaptationCache();
94
97
  jest.spyOn(logger, "debug").mockImplementation((): void => {});
95
98
  jest.spyOn(logger, "error").mockImplementation((): void => {});
@@ -7,7 +7,8 @@ import LlmType from "../../../../Types/LLM/LlmType";
7
7
  import LLMService, {
8
8
  LLMProviderConfig,
9
9
  } from "../../../../Server/Utils/LLM/LLMService";
10
- import { afterEach, describe, expect, test } from "@jest/globals";
10
+ import stubLLMEgressGuard from "./StubLLMEgressGuard";
11
+ import { afterEach, beforeEach, describe, expect, test } from "@jest/globals";
11
12
 
12
13
  type PostSpy = ReturnType<typeof jest.spyOn>;
13
14
 
@@ -83,6 +84,11 @@ function mockPost(response: JSONObject): PostSpy {
83
84
  } as unknown as HTTPResponse<JSONObject>) as PostSpy;
84
85
  }
85
86
 
87
+ // These hosts are placeholders; the SSRF guard is covered elsewhere.
88
+ beforeEach(() => {
89
+ stubLLMEgressGuard();
90
+ });
91
+
86
92
  afterEach(() => {
87
93
  jest.restoreAllMocks();
88
94
  });
@@ -103,11 +109,16 @@ describe("LLMService request timeout and retry policy", () => {
103
109
  expect(postSpy).toHaveBeenCalledTimes(1);
104
110
  expect(postSpy.mock.calls[0]![0]).toEqual(
105
111
  expect.objectContaining({
106
- options: {
112
+ options: expect.objectContaining({
107
113
  retries: 0,
108
114
  exponentialBackoff: true,
109
115
  timeout: 12_345,
110
- },
116
+ /*
117
+ * Every provider request also carries the SSRF guard's
118
+ * settings — the policy above must not displace them.
119
+ */
120
+ doNotFollowRedirects: true,
121
+ }),
111
122
  }),
112
123
  );
113
124
  },
@@ -125,11 +136,12 @@ describe("LLMService request timeout and retry policy", () => {
125
136
 
126
137
  expect(postSpy.mock.calls[0]![0]).toEqual(
127
138
  expect.objectContaining({
128
- options: {
139
+ options: expect.objectContaining({
129
140
  retries: 2,
130
141
  exponentialBackoff: true,
131
142
  timeout: defaultTimeoutInMs,
132
- },
143
+ doNotFollowRedirects: true,
144
+ }),
133
145
  }),
134
146
  );
135
147
  },
@@ -5,7 +5,15 @@ import LlmType from "../../../../Types/LLM/LlmType";
5
5
  import LLMService, {
6
6
  LLMCompletionResponse,
7
7
  } from "../../../../Server/Utils/LLM/LLMService";
8
- import { afterEach, describe, expect, jest, test } from "@jest/globals";
8
+ import stubLLMEgressGuard from "./StubLLMEgressGuard";
9
+ import {
10
+ afterEach,
11
+ beforeEach,
12
+ describe,
13
+ expect,
14
+ jest,
15
+ test,
16
+ } from "@jest/globals";
9
17
 
10
18
  type PostSpy = ReturnType<typeof jest.spyOn>;
11
19
 
@@ -15,6 +23,11 @@ function mockPostResponse(jsonData: JSONObject): PostSpy {
15
23
  } as unknown as HTTPResponse<JSONObject>) as PostSpy;
16
24
  }
17
25
 
26
+ // These hosts are placeholders; the SSRF guard is covered elsewhere.
27
+ beforeEach(() => {
28
+ stubLLMEgressGuard();
29
+ });
30
+
18
31
  afterEach(() => {
19
32
  jest.restoreAllMocks();
20
33
  });
@@ -140,3 +140,38 @@ describe("buildObservabilityChatSystemPrompt with page context", () => {
140
140
  expect(prompt).toContain("Cite your sources.");
141
141
  });
142
142
  });
143
+
144
+ /*
145
+ * open_code_pull_request now opens the PR ready for review rather than as a
146
+ * draft. The system prompt describes that tool to the model in its own words,
147
+ * so a stale sentence here makes the model tell the user it filed a draft and
148
+ * that they should go mark it ready — for a PR that already is.
149
+ *
150
+ * What must stay is the part that was never about the draft flag: this is a
151
+ * proposal off the default branch that a human reviews and merges.
152
+ */
153
+ describe("buildObservabilityChatSystemPrompt — how it describes code changes", () => {
154
+ const prompt: string = buildObservabilityChatSystemPrompt({
155
+ currentTime: new Date("2026-07-16T00:00:00Z"),
156
+ permissionMode: AIChatPermissionMode.AskForApproval,
157
+ });
158
+
159
+ test("does not tell the model the pull request is a draft", () => {
160
+ expect(prompt.toLowerCase()).not.toContain("draft pull request");
161
+ });
162
+
163
+ test("says the pull request opens ready for review", () => {
164
+ expect(prompt).toContain("ready for review");
165
+ });
166
+
167
+ test("still says the change goes off the default branch for a human", () => {
168
+ expect(prompt).toContain("off the default branch");
169
+ expect(prompt).toContain("for a human to review");
170
+ });
171
+
172
+ test("still prefers open_code_pull_request over committing to a branch", () => {
173
+ expect(prompt).toContain(
174
+ "open_code_pull_request is the right tool almost always",
175
+ );
176
+ });
177
+ });
@@ -0,0 +1,25 @@
1
+ import DataSourceEgressGuard from "../../../../Server/Utils/DataSource/EgressGuard";
2
+ import { jest } from "@jest/globals";
3
+
4
+ /*
5
+ * LLMService validates and pins every provider URL through the SSRF egress
6
+ * guard before posting, which means a real DNS lookup for whatever host the
7
+ * test configured. The suites that are about request SHAPE rather than egress
8
+ * policy use unresolvable placeholder hosts ("http://host:8000"), so they stub
9
+ * the guard and stay offline.
10
+ *
11
+ * Call this from a beforeEach, before the API.post stub. Egress policy itself
12
+ * is covered by LLMServiceEgressGuard.test.ts, which does NOT stub it.
13
+ */
14
+ export default function stubLLMEgressGuard(): void {
15
+ jest
16
+ .spyOn(DataSourceEgressGuard, "assertUrlAllowedAndPin")
17
+ .mockImplementation((urlString: string) => {
18
+ return Promise.resolve({
19
+ url: new globalThis.URL(urlString),
20
+ addresses: [{ address: "93.184.216.34", family: 4 }],
21
+ httpAgent: undefined as never,
22
+ httpsAgent: undefined as never,
23
+ });
24
+ });
25
+ }
@@ -0,0 +1,152 @@
1
+ import QuerySettingsHelper, {
2
+ getQuerySettings,
3
+ DEFAULT_MAX_MEMORY_USAGE_IN_BYTES,
4
+ DEFAULT_MAX_BYTES_BEFORE_EXTERNAL_GROUP_BY_IN_BYTES,
5
+ DEFAULT_MAX_BYTES_BEFORE_EXTERNAL_SORT_IN_BYTES,
6
+ } from "../../../../Server/Utils/AnalyticsDatabase/QuerySettingsHelper";
7
+
8
+ /*
9
+ * Unit tests for getQuerySettings — the builder for the trailing
10
+ * ` SETTINGS ...` clause appended verbatim to every ClickHouse read query.
11
+ *
12
+ * The clause is NOT parameterized; it is concatenated straight into SQL, so
13
+ * the exact emitted text matters. These tests lock down:
14
+ * - the always-present per-query memory ceiling and spill thresholds,
15
+ * - correct quoting (strings single-quoted, numbers bare),
16
+ * - the conditional execution-time / overflow-mode settings, and
17
+ * - the ordering of the emitted parts.
18
+ */
19
+
20
+ describe("getQuerySettings", () => {
21
+ test("always emits the memory ceiling and spill thresholds by default", () => {
22
+ const clause: string = getQuerySettings();
23
+
24
+ expect(clause).toBe(
25
+ ` SETTINGS max_memory_usage = ${DEFAULT_MAX_MEMORY_USAGE_IN_BYTES}, ` +
26
+ `max_bytes_before_external_group_by = ${DEFAULT_MAX_BYTES_BEFORE_EXTERNAL_GROUP_BY_IN_BYTES}, ` +
27
+ `max_bytes_before_external_sort = ${DEFAULT_MAX_BYTES_BEFORE_EXTERNAL_SORT_IN_BYTES}`,
28
+ );
29
+ });
30
+
31
+ test("produces the same output whether called with no args or undefined", () => {
32
+ expect(getQuerySettings()).toBe(getQuerySettings(undefined));
33
+ });
34
+
35
+ test("always starts with the ` SETTINGS ` keyword and a leading space", () => {
36
+ expect(getQuerySettings().startsWith(" SETTINGS ")).toBe(true);
37
+ expect(
38
+ getQuerySettings({ maxExecutionTimeInSeconds: 30 }).startsWith(
39
+ " SETTINGS ",
40
+ ),
41
+ ).toBe(true);
42
+ });
43
+
44
+ test("omits execution-time settings when not provided", () => {
45
+ const clause: string = getQuerySettings();
46
+
47
+ expect(clause).not.toContain("max_execution_time");
48
+ expect(clause).not.toContain("timeout_overflow_mode");
49
+ });
50
+
51
+ test("includes max_execution_time when provided", () => {
52
+ const clause: string = getQuerySettings({ maxExecutionTimeInSeconds: 45 });
53
+
54
+ expect(clause).toContain("max_execution_time = 45");
55
+ // Execution time is emitted before the memory settings.
56
+ expect(clause.indexOf("max_execution_time")).toBeLessThan(
57
+ clause.indexOf("max_memory_usage"),
58
+ );
59
+ });
60
+
61
+ test("single-quotes the timeout overflow mode", () => {
62
+ expect(getQuerySettings({ timeoutOverflowMode: "break" })).toContain(
63
+ "timeout_overflow_mode = 'break'",
64
+ );
65
+ expect(getQuerySettings({ timeoutOverflowMode: "throw" })).toContain(
66
+ "timeout_overflow_mode = 'throw'",
67
+ );
68
+ });
69
+
70
+ test("emits execution time before overflow mode before memory settings", () => {
71
+ const clause: string = getQuerySettings({
72
+ maxExecutionTimeInSeconds: 10,
73
+ timeoutOverflowMode: "break",
74
+ });
75
+
76
+ const timePos: number = clause.indexOf("max_execution_time");
77
+ const overflowPos: number = clause.indexOf("timeout_overflow_mode");
78
+ const memoryPos: number = clause.indexOf("max_memory_usage");
79
+
80
+ expect(timePos).toBeGreaterThan(-1);
81
+ expect(timePos).toBeLessThan(overflowPos);
82
+ expect(overflowPos).toBeLessThan(memoryPos);
83
+ });
84
+
85
+ test("honours overrides for the memory ceiling and spill thresholds", () => {
86
+ const clause: string = getQuerySettings({
87
+ maxMemoryUsageInBytes: 100,
88
+ maxBytesBeforeExternalGroupByInBytes: 50,
89
+ maxBytesBeforeExternalSortInBytes: 25,
90
+ });
91
+
92
+ expect(clause).toContain("max_memory_usage = 100");
93
+ expect(clause).toContain("max_bytes_before_external_group_by = 50");
94
+ expect(clause).toContain("max_bytes_before_external_sort = 25");
95
+ // The defaults must not leak through when overridden.
96
+ expect(clause).not.toContain(`${DEFAULT_MAX_MEMORY_USAGE_IN_BYTES}`);
97
+ });
98
+
99
+ test("emits numeric additional settings without quotes", () => {
100
+ const clause: string = getQuerySettings({
101
+ additionalSettings: { max_threads: 4 },
102
+ });
103
+
104
+ expect(clause).toContain("max_threads = 4");
105
+ expect(clause).not.toContain("max_threads = '4'");
106
+ });
107
+
108
+ test("single-quotes string additional settings", () => {
109
+ const clause: string = getQuerySettings({
110
+ additionalSettings: { optimize_aggregation_in_order: "1" },
111
+ });
112
+
113
+ expect(clause).toContain("optimize_aggregation_in_order = '1'");
114
+ });
115
+
116
+ test("appends additional settings after the memory settings", () => {
117
+ const clause: string = getQuerySettings({
118
+ additionalSettings: { optimize_use_projections: 1 },
119
+ });
120
+
121
+ expect(clause.indexOf("max_bytes_before_external_sort")).toBeLessThan(
122
+ clause.indexOf("optimize_use_projections"),
123
+ );
124
+ });
125
+
126
+ test("joins every setting with a comma-and-space separator", () => {
127
+ const clause: string = getQuerySettings({
128
+ maxExecutionTimeInSeconds: 5,
129
+ timeoutOverflowMode: "throw",
130
+ additionalSettings: { max_threads: 2 },
131
+ });
132
+
133
+ /*
134
+ * The clause after " SETTINGS " is a comma-separated list; splitting it
135
+ * must yield one entry per emitted setting (2 conditional + 3 memory + 1
136
+ * extra).
137
+ */
138
+ const body: string = clause.replace(" SETTINGS ", "");
139
+ expect(body.split(", ").length).toBe(6);
140
+ });
141
+
142
+ test("class static method delegates to the standalone function", () => {
143
+ const options: { maxExecutionTimeInSeconds: number } = {
144
+ maxExecutionTimeInSeconds: 12,
145
+ };
146
+
147
+ expect(QuerySettingsHelper.getQuerySettings(options)).toBe(
148
+ getQuerySettings(options),
149
+ );
150
+ expect(QuerySettingsHelper.getQuerySettings()).toBe(getQuerySettings());
151
+ });
152
+ });