@oneuptime/common 11.5.4 → 11.5.6
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.
- package/Models/DatabaseModels/AIAgentTaskPullRequest.ts +56 -45
- package/Models/DatabaseModels/AIInsight.ts +748 -0
- package/Models/DatabaseModels/AIRun.ts +262 -0
- package/Models/DatabaseModels/CodeRepository.ts +42 -0
- package/Models/DatabaseModels/GlobalConfig.ts +105 -0
- package/Models/DatabaseModels/Index.ts +4 -8
- package/Models/DatabaseModels/InstanceHealthLog.ts +277 -0
- package/Models/DatabaseModels/LlmLog.ts +33 -0
- package/Models/DatabaseModels/Project.ts +123 -6
- package/Models/DatabaseModels/Runbook.ts +1 -1
- package/Models/DatabaseModels/User.ts +47 -0
- package/Server/API/AIAgentDataAPI.ts +802 -140
- package/Server/API/AIAgentTaskAPI.ts +132 -69
- package/Server/API/AIAgentTaskLogAPI.ts +65 -41
- package/Server/API/AIAgentTaskPullRequestAPI.ts +41 -0
- package/Server/API/AIInsightAPI.ts +220 -0
- package/Server/API/AIInvestigationAPI.ts +363 -1
- package/Server/API/CodeFixRunAPI.ts +251 -0
- package/Server/API/GitHubAPI.ts +246 -3
- package/Server/API/TelemetryExceptionAPI.ts +193 -48
- package/Server/EnvironmentConfig.ts +1 -1
- package/Server/Infrastructure/Postgres/SchemaMigrations/1783943300000-DropServiceCodeRepository.ts +26 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1783947444597-CodeFixRunsOnAIRun.ts +73 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1783950962813-AddCodeFixTaskType.ts +29 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1783954040984-AddInstrumentationFixTasksFlag.ts +31 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1783957160597-MigrationName.ts +51 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1783958542237-AddTaskContextToAIRun.ts +25 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1783965945957-AddInvestigationVerdictAndGrade.ts +47 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1783970619301-AddFixGuardrailColumns.ts +53 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1783970619302-DropLegacyAIAgentTaskTables.ts +31 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1783977781677-AddCiStatusToFixPullRequests.ts +37 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1783990000000-AddCompletionTokensToLlmLog.ts +25 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1784010274993-AddSentinelInsight.ts +75 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1784010274994-AddSentinelInsightFlags.ts +37 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1784030612266-RenameSentinelToAI.ts +203 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1784033837629-MigrationName.ts +163 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1784048917994-AddCreatedByUserToUser.ts +23 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +32 -0
- package/Server/Infrastructure/Queue.ts +82 -4
- package/Server/Infrastructure/Semaphore.ts +62 -1
- package/Server/Middleware/MasterAdminAuthorization.ts +37 -0
- package/Server/Middleware/ProjectAuthorization.ts +40 -15
- package/Server/Services/AIAgentService.ts +32 -0
- package/Server/Services/AIAgentTaskPullRequestService.ts +117 -0
- package/Server/Services/AIInsightService.ts +174 -0
- package/Server/Services/AIRunEventService.ts +63 -0
- package/Server/Services/AIRunService.ts +259 -1
- package/Server/Services/AIService.ts +249 -7
- package/Server/Services/AlertService.ts +4 -4
- package/Server/Services/CodeRepositoryService.ts +209 -0
- package/Server/Services/GlobalConfigService.ts +148 -0
- package/Server/Services/IncidentService.ts +183 -38
- package/Server/Services/IncidentStateTimelineService.ts +24 -4
- package/Server/Services/Index.ts +4 -4
- package/Server/Services/{AIAgentTaskLogService.ts → InstanceHealthLogService.ts} +1 -1
- package/Server/Services/LlmLogService.ts +27 -0
- package/Server/Services/LlmProviderService.ts +108 -0
- package/Server/Services/MetricBaselineService.ts +123 -0
- package/Server/Services/MonitorService.ts +15 -0
- package/Server/Services/TeamMemberService.ts +2 -0
- package/Server/Services/TelemetryExceptionService.ts +323 -116
- package/Server/Services/TraceAggregationService.ts +176 -0
- package/Server/Services/UserService.ts +10 -0
- package/Server/Types/Workflow/ComponentCode.ts +6 -0
- package/Server/Types/Workflow/Components/AI/GenerateText.ts +326 -0
- package/Server/Types/Workflow/Components/Index.ts +2 -0
- package/Server/Utils/AI/Chat/ObservabilityAssistant.ts +1 -1
- package/Server/Utils/AI/CodeFix/CodeAgentWorkspaceGuard.ts +71 -0
- package/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.ts +243 -0
- package/Server/Utils/AI/CodeFix/CodeFixRunQueue.ts +131 -0
- package/Server/Utils/AI/CodeFix/FixRunBudget.ts +148 -0
- package/Server/Utils/AI/CodeFix/OpenPullRequestCap.ts +117 -0
- package/Server/Utils/AI/Eval/EvalCorpus.ts +369 -0
- package/Server/Utils/AI/Eval/EvalScores.ts +172 -0
- package/Server/Utils/AI/Eval/ReplayInvestigation.ts +87 -0
- package/Server/Utils/AI/PerfEvidence/SpanTreeAnalyzer.ts +676 -0
- package/Server/Utils/AI/{Sentinel/SentinelInvestigationEngine.ts → SRE/AIInvestigationEngine.ts} +58 -37
- package/Server/Utils/AI/{Sentinel/SentinelMemory.ts → SRE/AIMemory.ts} +3 -3
- package/Server/Utils/AI/{Sentinel → SRE}/AlertInvestigationRunner.ts +50 -20
- package/Server/Utils/AI/SRE/ConfidenceSignal.ts +293 -0
- package/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.ts +115 -0
- package/Server/Utils/AI/SRE/FixPerformanceTaskTrigger.ts +223 -0
- package/Server/Utils/AI/{Sentinel → SRE}/IncidentInvestigationRunner.ts +71 -21
- package/Server/Utils/AI/{Sentinel → SRE}/IncidentPostmortemRunner.ts +8 -8
- package/Server/Utils/AI/SRE/Insights/Detectors/ErrorLogSpikeDetector.ts +364 -0
- package/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.ts +317 -0
- package/Server/Utils/AI/SRE/Insights/Detectors/Index.ts +27 -0
- package/Server/Utils/AI/SRE/Insights/Detectors/MetricDriftDetector.ts +221 -0
- package/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.ts +238 -0
- package/Server/Utils/AI/SRE/Insights/Detectors/TraceLatencyRegressionDetector.ts +521 -0
- package/Server/Utils/AI/SRE/Insights/FixRouting.ts +242 -0
- package/Server/Utils/AI/SRE/Insights/InsightScanner.ts +290 -0
- package/Server/Utils/AI/SRE/Insights/InsightStore.ts +283 -0
- package/Server/Utils/AI/SRE/Insights/InsightTriageRunner.ts +242 -0
- package/Server/Utils/AI/SRE/Insights/Triage.ts +162 -0
- package/Server/Utils/AI/SRE/Insights/Types.ts +49 -0
- package/Server/Utils/AI/SRE/InstrumentationTaskTrigger.ts +212 -0
- package/Server/Utils/AI/SRE/InvestigationGrader.ts +282 -0
- package/Server/Utils/AI/{Sentinel → SRE}/InvestigationQueue.ts +114 -19
- package/Server/Utils/AI/{Sentinel → SRE}/README.md +4 -4
- package/Server/Utils/AI/SRE/SubjectCodeFixRun.ts +172 -0
- package/Server/Utils/AI/Toolbox/{SentinelActionTools.ts → AIActionTools.ts} +22 -1
- package/Server/Utils/AI/Toolbox/Index.ts +2 -2
- package/Server/Utils/AnalyticsDatabase/ClickhouseCapacity.ts +526 -0
- package/Server/Utils/CodeRepository/GitHub/GitHub.ts +319 -1
- package/Server/Utils/CodeRepository/ServiceRepoLinkSuggester.ts +221 -0
- package/Server/Utils/CodeRepository/StackTraceRepoResolver.ts +571 -0
- package/Server/Utils/Execute.ts +2 -1
- package/Server/Utils/LLM/LLMService.ts +160 -30
- package/Server/Utils/Monitor/Criteria/SqlMonitorCriteria.ts +152 -0
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +29 -0
- package/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.ts +16 -6
- package/Server/Utils/Monitor/MonitorCriteriaMessageBuilder.ts +14 -0
- package/Server/Utils/Monitor/MonitorCriteriaMessageFormatter.ts +14 -3
- package/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.ts +130 -12
- package/Tests/Server/Infrastructure/Queue.test.ts +227 -0
- package/Tests/Server/Infrastructure/SemaphorePermit.test.ts +159 -0
- package/Tests/Server/Services/AIAgentTaskPullRequestOutcomeStats.test.ts +154 -0
- package/Tests/Server/Services/AIInsightService.test.ts +324 -0
- package/Tests/Server/Services/AIRunCodeFixClaim.test.ts +401 -0
- package/Tests/Server/Services/AIRunHumanVerdict.test.ts +161 -0
- package/Tests/Server/Services/AIServiceDailyBudget.test.ts +95 -5
- package/Tests/Server/Services/AIServiceProjectAccess.test.ts +259 -0
- package/Tests/Server/Services/FixFromIncidentTaskTrigger.test.ts +249 -0
- package/Tests/Server/Services/FixPerformanceTaskTrigger.test.ts +274 -0
- package/Tests/Server/Services/GlobalConfigService.test.ts +80 -0
- package/Tests/Server/Services/IncidentInternalNoteAnnouncement.test.ts +1 -1
- package/Tests/Server/Services/InstrumentationTaskTrigger.test.ts +313 -0
- package/Tests/Server/Services/LlmProviderProjectOwned.test.ts +132 -0
- package/Tests/Server/Services/TelemetryExceptionAIFixReadiness.test.ts +405 -0
- package/Tests/Server/Services/TelemetryExceptionCodeFixRun.test.ts +322 -0
- package/Tests/Server/Services/TraceServiceLatencyProfile.test.ts +278 -0
- package/Tests/Server/Types/Workflow/Components/AIGenerateText.test.ts +722 -0
- package/Tests/Server/Utils/AI/{SentinelAlertGating.test.ts → AIAlertGating.test.ts} +19 -19
- package/Tests/Server/Utils/AI/AIConfidenceSignal.test.ts +362 -0
- package/Tests/Server/Utils/AI/{SentinelInvestigationQueue.test.ts → AIInvestigationQueue.test.ts} +19 -19
- package/Tests/Server/Utils/AI/CodeAgentWorkspaceGuard.test.ts +138 -0
- package/Tests/Server/Utils/AI/CodeFixAgentCompletion.test.ts +335 -0
- package/Tests/Server/Utils/AI/CodeFixRunQueue.test.ts +134 -0
- package/Tests/Server/Utils/AI/EvalCorpus.test.ts +209 -0
- package/Tests/Server/Utils/AI/EvalScores.test.ts +343 -0
- package/Tests/Server/Utils/AI/FixRunBudget.test.ts +218 -0
- package/Tests/Server/Utils/AI/Insights/ErrorLogSpikeDetector.test.ts +437 -0
- package/Tests/Server/Utils/AI/Insights/ExceptionSpikeDetector.test.ts +287 -0
- package/Tests/Server/Utils/AI/Insights/InsightDetectorsIndex.test.ts +34 -0
- package/Tests/Server/Utils/AI/Insights/InsightFixRouting.test.ts +572 -0
- package/Tests/Server/Utils/AI/Insights/InsightNeverThrowsHardening.test.ts +344 -0
- package/Tests/Server/Utils/AI/Insights/InsightScanner.test.ts +720 -0
- package/Tests/Server/Utils/AI/Insights/InsightStore.test.ts +467 -0
- package/Tests/Server/Utils/AI/Insights/InsightStoreHardening.test.ts +370 -0
- package/Tests/Server/Utils/AI/Insights/InsightTriage.test.ts +210 -0
- package/Tests/Server/Utils/AI/Insights/InsightTriageRunner.test.ts +221 -0
- package/Tests/Server/Utils/AI/Insights/InvestigationQueueInsightSubject.test.ts +328 -0
- package/Tests/Server/Utils/AI/Insights/MetricBaselineDrift.test.ts +182 -0
- package/Tests/Server/Utils/AI/Insights/MetricDriftDetector.test.ts +280 -0
- package/Tests/Server/Utils/AI/Insights/NewExceptionDetector.test.ts +259 -0
- package/Tests/Server/Utils/AI/Insights/TraceLatencyRegressionDetector.test.ts +770 -0
- package/Tests/Server/Utils/AI/InvestigationGrader.test.ts +343 -0
- package/Tests/Server/Utils/AI/LLMServiceRequestPolicy.test.ts +307 -0
- package/Tests/Server/Utils/AI/OpenPullRequestCap.test.ts +170 -0
- package/Tests/Server/Utils/AI/SpanTreeAnalyzer.test.ts +559 -0
- package/Tests/Server/Utils/AnalyticsDatabase/ClickhouseCapacity.test.ts +158 -0
- package/Tests/Server/Utils/GitHubCheckRunsConclusion.test.ts +100 -0
- package/Tests/Server/Utils/GitHubPullRequestStateMapping.test.ts +50 -0
- package/Tests/Server/Utils/Monitor/Criteria/SqlMonitorCriteria.test.ts +266 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaExpectationBuilderUnits.test.ts +553 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaMessageBuilderUnits.test.ts +590 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaMessageFormatterUnits.test.ts +254 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaObservationBuilderUnits.test.ts +821 -0
- package/Tests/Server/Utils/ServiceRepoLinkSuggester.test.ts +167 -0
- package/Tests/Server/Utils/StackTraceRepoResolver.test.ts +527 -0
- package/Tests/Types/AI/AIChatPermissionMode.test.ts +112 -0
- package/Tests/Types/AI/CodeFixTaskType.test.ts +152 -0
- package/Tests/Types/AI/FixPullRequestCiStatus.test.ts +181 -0
- package/Tests/Types/Monitor/MonitorStepSqlMonitor.test.ts +110 -0
- package/Tests/Types/Monitor/SqlDatabaseType.test.ts +55 -0
- package/Tests/Types/Workflow/AIGenerateTextMetadata.test.ts +180 -0
- package/Tests/UI/Components/TableBulkCsvExport.test.tsx +168 -0
- package/Tests/UI/Utils/TableColumnsToCsv.test.ts +523 -0
- package/Types/AI/AIChatTypes.ts +8 -0
- package/Types/AI/AIInsightEvidence.ts +77 -0
- package/Types/AI/AIInsightHumanVerdict.ts +15 -0
- package/Types/AI/AIInsightSeverity.ts +13 -0
- package/Types/AI/AIInsightStatus.ts +38 -0
- package/Types/AI/AIInsightType.ts +41 -0
- package/Types/AI/AIRunAutoGrade.ts +18 -0
- package/Types/AI/AIRunEventType.ts +5 -0
- package/Types/AI/AIRunHumanVerdict.ts +17 -0
- package/Types/AI/AIRunType.ts +6 -0
- package/Types/AI/CodeFixTaskContext.ts +88 -0
- package/Types/AI/CodeFixTaskType.ts +132 -0
- package/Types/AI/FixPullRequestCiStatus.ts +132 -0
- package/Types/BaseDatabase/AggregationIntervalUtil.ts +67 -0
- package/Types/Incident/IncidentMetricType.ts +7 -0
- package/Types/Monitor/CriteriaFilter.ts +8 -0
- package/Types/Monitor/MonitorCriteriaInstance.ts +67 -0
- package/Types/Monitor/MonitorStep.ts +38 -0
- package/Types/Monitor/MonitorStepSqlMonitor.ts +141 -0
- package/Types/Monitor/MonitorType.ts +17 -0
- package/Types/Monitor/SqlDatabaseType.ts +49 -0
- package/Types/Monitor/SqlMonitor/SqlMonitorResponse.ts +28 -0
- package/Types/Permission.ts +11 -95
- package/Types/Probe/ProbeMonitorResponse.ts +2 -0
- package/Types/Runbook/RunbookStep.ts +26 -2
- package/Types/Runbook/RunbookStepType.ts +1 -0
- package/Types/Workflow/Component.ts +13 -0
- package/Types/Workflow/ComponentID.ts +1 -0
- package/Types/Workflow/Components/AI.ts +148 -0
- package/Types/Workflow/Components.ts +8 -0
- package/UI/Components/AI/GenerateFromAIModal.tsx +1 -1
- package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +11 -0
- package/UI/Components/MoreMenu/MoreMenu.tsx +1 -1
- package/UI/Components/Table/Table.tsx +38 -2
- package/UI/Utils/TableColumnsToCsv.ts +385 -0
- package/Utils/Monitor/MonitorMetricType.ts +1 -0
- package/build/dist/Models/DatabaseModels/AIAgentTaskPullRequest.js +59 -45
- package/build/dist/Models/DatabaseModels/AIAgentTaskPullRequest.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AIInsight.js +795 -0
- package/build/dist/Models/DatabaseModels/AIInsight.js.map +1 -0
- package/build/dist/Models/DatabaseModels/AIRun.js +274 -0
- package/build/dist/Models/DatabaseModels/AIRun.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CodeRepository.js +43 -0
- package/build/dist/Models/DatabaseModels/CodeRepository.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GlobalConfig.js +110 -0
- package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +4 -8
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/InstanceHealthLog.js +304 -0
- package/build/dist/Models/DatabaseModels/InstanceHealthLog.js.map +1 -0
- package/build/dist/Models/DatabaseModels/LlmLog.js +35 -0
- package/build/dist/Models/DatabaseModels/LlmLog.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Project.js +127 -6
- package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Runbook.js +1 -1
- package/build/dist/Models/DatabaseModels/Runbook.js.map +1 -1
- package/build/dist/Models/DatabaseModels/User.js +46 -0
- package/build/dist/Models/DatabaseModels/User.js.map +1 -1
- package/build/dist/Server/API/AIAgentDataAPI.js +568 -85
- package/build/dist/Server/API/AIAgentDataAPI.js.map +1 -1
- package/build/dist/Server/API/AIAgentTaskAPI.js +100 -44
- package/build/dist/Server/API/AIAgentTaskAPI.js.map +1 -1
- package/build/dist/Server/API/AIAgentTaskLogAPI.js +49 -25
- package/build/dist/Server/API/AIAgentTaskLogAPI.js.map +1 -1
- package/build/dist/Server/API/AIAgentTaskPullRequestAPI.js +27 -0
- package/build/dist/Server/API/AIAgentTaskPullRequestAPI.js.map +1 -1
- package/build/dist/Server/API/AIInsightAPI.js +140 -0
- package/build/dist/Server/API/AIInsightAPI.js.map +1 -0
- package/build/dist/Server/API/AIInvestigationAPI.js +257 -1
- package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
- package/build/dist/Server/API/CodeFixRunAPI.js +181 -0
- package/build/dist/Server/API/CodeFixRunAPI.js.map +1 -0
- package/build/dist/Server/API/GitHubAPI.js +164 -2
- package/build/dist/Server/API/GitHubAPI.js.map +1 -1
- package/build/dist/Server/API/TelemetryExceptionAPI.js +148 -43
- package/build/dist/Server/API/TelemetryExceptionAPI.js.map +1 -1
- package/build/dist/Server/EnvironmentConfig.js +1 -1
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783943300000-DropServiceCodeRepository.js +23 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783943300000-DropServiceCodeRepository.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783947444597-CodeFixRunsOnAIRun.js +32 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783947444597-CodeFixRunsOnAIRun.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783950962813-AddCodeFixTaskType.js +16 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783950962813-AddCodeFixTaskType.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783954040984-AddInstrumentationFixTasksFlag.js +16 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783954040984-AddInstrumentationFixTasksFlag.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783957160597-MigrationName.js +24 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783957160597-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783958542237-AddTaskContextToAIRun.js +16 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783958542237-AddTaskContextToAIRun.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783965945957-AddInvestigationVerdictAndGrade.js +24 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783965945957-AddInvestigationVerdictAndGrade.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783970619301-AddFixGuardrailColumns.js +24 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783970619301-AddFixGuardrailColumns.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783970619302-DropLegacyAIAgentTaskTables.js +24 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783970619302-DropLegacyAIAgentTaskTables.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783977781677-AddCiStatusToFixPullRequests.js +18 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783977781677-AddCiStatusToFixPullRequests.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783990000000-AddCompletionTokensToLlmLog.js +18 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783990000000-AddCompletionTokensToLlmLog.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784010274993-AddSentinelInsight.js +32 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784010274993-AddSentinelInsight.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784010274994-AddSentinelInsightFlags.js +18 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784010274994-AddSentinelInsightFlags.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784030612266-RenameSentinelToAI.js +125 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784030612266-RenameSentinelToAI.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784033837629-MigrationName.js +62 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784033837629-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784048917994-AddCreatedByUserToUser.js +18 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784048917994-AddCreatedByUserToUser.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +32 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Infrastructure/Queue.js +73 -3
- package/build/dist/Server/Infrastructure/Queue.js.map +1 -1
- package/build/dist/Server/Infrastructure/Semaphore.js +44 -1
- package/build/dist/Server/Infrastructure/Semaphore.js.map +1 -1
- package/build/dist/Server/Middleware/MasterAdminAuthorization.js +26 -0
- package/build/dist/Server/Middleware/MasterAdminAuthorization.js.map +1 -1
- package/build/dist/Server/Middleware/ProjectAuthorization.js +40 -14
- package/build/dist/Server/Middleware/ProjectAuthorization.js.map +1 -1
- package/build/dist/Server/Services/AIAgentService.js +29 -0
- package/build/dist/Server/Services/AIAgentService.js.map +1 -1
- package/build/dist/Server/Services/AIAgentTaskPullRequestService.js +78 -0
- package/build/dist/Server/Services/AIAgentTaskPullRequestService.js.map +1 -1
- package/build/dist/Server/Services/AIInsightService.js +164 -0
- package/build/dist/Server/Services/AIInsightService.js.map +1 -0
- package/build/dist/Server/Services/AIRunEventService.js +49 -0
- package/build/dist/Server/Services/AIRunEventService.js.map +1 -1
- package/build/dist/Server/Services/AIRunService.js +221 -0
- package/build/dist/Server/Services/AIRunService.js.map +1 -1
- package/build/dist/Server/Services/AIService.js +198 -11
- package/build/dist/Server/Services/AIService.js.map +1 -1
- package/build/dist/Server/Services/AlertService.js +4 -4
- package/build/dist/Server/Services/AlertService.js.map +1 -1
- package/build/dist/Server/Services/CodeRepositoryService.js +180 -0
- package/build/dist/Server/Services/CodeRepositoryService.js.map +1 -1
- package/build/dist/Server/Services/GlobalConfigService.js +84 -0
- package/build/dist/Server/Services/GlobalConfigService.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +149 -37
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/IncidentStateTimelineService.js +24 -4
- package/build/dist/Server/Services/IncidentStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +4 -4
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/{AIAgentTaskLogService.js → InstanceHealthLogService.js} +2 -2
- package/build/dist/Server/Services/InstanceHealthLogService.js.map +1 -0
- package/build/dist/Server/Services/LlmLogService.js +23 -0
- package/build/dist/Server/Services/LlmLogService.js.map +1 -1
- package/build/dist/Server/Services/LlmProviderService.js +96 -0
- package/build/dist/Server/Services/LlmProviderService.js.map +1 -1
- package/build/dist/Server/Services/MetricBaselineService.js +65 -0
- package/build/dist/Server/Services/MetricBaselineService.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +9 -1
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/TeamMemberService.js +2 -0
- package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryExceptionService.js +243 -82
- package/build/dist/Server/Services/TelemetryExceptionService.js.map +1 -1
- package/build/dist/Server/Services/TraceAggregationService.js +124 -0
- package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
- package/build/dist/Server/Services/UserService.js +8 -0
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Types/Workflow/ComponentCode.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/AI/GenerateText.js +240 -0
- package/build/dist/Server/Types/Workflow/Components/AI/GenerateText.js.map +1 -0
- package/build/dist/Server/Types/Workflow/Components/Index.js +2 -0
- package/build/dist/Server/Types/Workflow/Components/Index.js.map +1 -1
- package/build/dist/Server/Utils/AI/CodeFix/CodeAgentWorkspaceGuard.js +48 -0
- package/build/dist/Server/Utils/AI/CodeFix/CodeAgentWorkspaceGuard.js.map +1 -0
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js +174 -0
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js.map +1 -0
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixRunQueue.js +126 -0
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixRunQueue.js.map +1 -0
- package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js +131 -0
- package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js.map +1 -0
- package/build/dist/Server/Utils/AI/CodeFix/OpenPullRequestCap.js +99 -0
- package/build/dist/Server/Utils/AI/CodeFix/OpenPullRequestCap.js.map +1 -0
- package/build/dist/Server/Utils/AI/Eval/EvalCorpus.js +245 -0
- package/build/dist/Server/Utils/AI/Eval/EvalCorpus.js.map +1 -0
- package/build/dist/Server/Utils/AI/Eval/EvalScores.js +83 -0
- package/build/dist/Server/Utils/AI/Eval/EvalScores.js.map +1 -0
- package/build/dist/Server/Utils/AI/Eval/ReplayInvestigation.js +12 -0
- package/build/dist/Server/Utils/AI/Eval/ReplayInvestigation.js.map +1 -0
- package/build/dist/Server/Utils/AI/PerfEvidence/SpanTreeAnalyzer.js +439 -0
- package/build/dist/Server/Utils/AI/PerfEvidence/SpanTreeAnalyzer.js.map +1 -0
- package/build/dist/Server/Utils/AI/{Sentinel/SentinelInvestigationEngine.js → SRE/AIInvestigationEngine.js} +47 -31
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -0
- package/build/dist/Server/Utils/AI/{Sentinel/SentinelMemory.js → SRE/AIMemory.js} +5 -5
- package/build/dist/Server/Utils/AI/SRE/AIMemory.js.map +1 -0
- package/build/dist/Server/Utils/AI/{Sentinel → SRE}/AlertInvestigationRunner.js +42 -19
- package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/ConfidenceSignal.js +226 -0
- package/build/dist/Server/Utils/AI/SRE/ConfidenceSignal.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.js +100 -0
- package/build/dist/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/FixPerformanceTaskTrigger.js +174 -0
- package/build/dist/Server/Utils/AI/SRE/FixPerformanceTaskTrigger.js.map +1 -0
- package/build/dist/Server/Utils/AI/{Sentinel → SRE}/IncidentInvestigationRunner.js +60 -22
- package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -0
- package/build/dist/Server/Utils/AI/{Sentinel → SRE}/IncidentPostmortemRunner.js +9 -9
- package/build/dist/Server/Utils/AI/SRE/IncidentPostmortemRunner.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ErrorLogSpikeDetector.js +268 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ErrorLogSpikeDetector.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js +226 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/Index.js +26 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/Index.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/MetricDriftDetector.js +159 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/MetricDriftDetector.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js +177 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/TraceLatencyRegressionDetector.js +384 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/TraceLatencyRegressionDetector.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/FixRouting.js +180 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/FixRouting.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/InsightScanner.js +269 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/InsightScanner.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/InsightStore.js +231 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/InsightStore.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/InsightTriageRunner.js +206 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/InsightTriageRunner.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Triage.js +121 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Triage.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Types.js +2 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Types.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/InstrumentationTaskTrigger.js +148 -0
- package/build/dist/Server/Utils/AI/SRE/InstrumentationTaskTrigger.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js +231 -0
- package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js.map +1 -0
- package/build/dist/Server/Utils/AI/{Sentinel → SRE}/InvestigationQueue.js +102 -23
- package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/SubjectCodeFixRun.js +167 -0
- package/build/dist/Server/Utils/AI/SRE/SubjectCodeFixRun.js.map +1 -0
- package/build/dist/Server/Utils/AI/Toolbox/{SentinelActionTools.js → AIActionTools.js} +18 -2
- package/build/dist/Server/Utils/AI/Toolbox/AIActionTools.js.map +1 -0
- package/build/dist/Server/Utils/AI/Toolbox/Index.js +2 -2
- package/build/dist/Server/Utils/AI/Toolbox/Index.js.map +1 -1
- package/build/dist/Server/Utils/AnalyticsDatabase/ClickhouseCapacity.js +301 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/ClickhouseCapacity.js.map +1 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js +240 -2
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js.map +1 -1
- package/build/dist/Server/Utils/CodeRepository/ServiceRepoLinkSuggester.js +127 -0
- package/build/dist/Server/Utils/CodeRepository/ServiceRepoLinkSuggester.js.map +1 -0
- package/build/dist/Server/Utils/CodeRepository/StackTraceRepoResolver.js +336 -0
- package/build/dist/Server/Utils/CodeRepository/StackTraceRepoResolver.js.map +1 -0
- package/build/dist/Server/Utils/Execute.js.map +1 -1
- package/build/dist/Server/Utils/LLM/LLMService.js +125 -25
- package/build/dist/Server/Utils/LLM/LLMService.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/SqlMonitorCriteria.js +120 -0
- package/build/dist/Server/Utils/Monitor/Criteria/SqlMonitorCriteria.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +21 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.js +15 -7
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaMessageBuilder.js +12 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaMessageBuilder.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaMessageFormatter.js +8 -3
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaMessageFormatter.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js +96 -12
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js.map +1 -1
- package/build/dist/Types/AI/AIInsightEvidence.js +2 -0
- package/build/dist/Types/AI/AIInsightEvidence.js.map +1 -0
- package/build/dist/Types/AI/AIInsightHumanVerdict.js +16 -0
- package/build/dist/Types/AI/AIInsightHumanVerdict.js.map +1 -0
- package/build/dist/Types/AI/AIInsightSeverity.js +14 -0
- package/build/dist/Types/AI/AIInsightSeverity.js.map +1 -0
- package/build/dist/Types/AI/AIInsightStatus.js +36 -0
- package/build/dist/Types/AI/AIInsightStatus.js.map +1 -0
- package/build/dist/Types/AI/AIInsightType.js +42 -0
- package/build/dist/Types/AI/AIInsightType.js.map +1 -0
- package/build/dist/Types/AI/AIRunAutoGrade.js +19 -0
- package/build/dist/Types/AI/AIRunAutoGrade.js.map +1 -0
- package/build/dist/Types/AI/AIRunEventType.js +5 -0
- package/build/dist/Types/AI/AIRunEventType.js.map +1 -1
- package/build/dist/Types/AI/AIRunHumanVerdict.js +18 -0
- package/build/dist/Types/AI/AIRunHumanVerdict.js.map +1 -0
- package/build/dist/Types/AI/AIRunType.js +6 -0
- package/build/dist/Types/AI/AIRunType.js.map +1 -1
- package/build/dist/Types/AI/CodeFixTaskContext.js +29 -0
- package/build/dist/Types/AI/CodeFixTaskContext.js.map +1 -0
- package/build/dist/Types/AI/CodeFixTaskType.js +122 -0
- package/build/dist/Types/AI/CodeFixTaskType.js.map +1 -0
- package/build/dist/Types/AI/FixPullRequestCiStatus.js +102 -0
- package/build/dist/Types/AI/FixPullRequestCiStatus.js.map +1 -0
- package/build/dist/Types/BaseDatabase/AggregationIntervalUtil.js +55 -0
- package/build/dist/Types/BaseDatabase/AggregationIntervalUtil.js.map +1 -1
- package/build/dist/Types/Incident/IncidentMetricType.js +7 -0
- package/build/dist/Types/Incident/IncidentMetricType.js.map +1 -1
- package/build/dist/Types/Monitor/CriteriaFilter.js +7 -0
- package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +62 -0
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStep.js +28 -0
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepSqlMonitor.js +93 -0
- package/build/dist/Types/Monitor/MonitorStepSqlMonitor.js.map +1 -0
- package/build/dist/Types/Monitor/MonitorType.js +15 -0
- package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
- package/build/dist/Types/Monitor/SqlDatabaseType.js +47 -0
- package/build/dist/Types/Monitor/SqlDatabaseType.js.map +1 -0
- package/build/dist/Types/Monitor/SqlMonitor/SqlMonitorResponse.js +2 -0
- package/build/dist/Types/Monitor/SqlMonitor/SqlMonitorResponse.js.map +1 -0
- package/build/dist/Types/Permission.js +10 -84
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Runbook/RunbookStepType.js +1 -0
- package/build/dist/Types/Runbook/RunbookStepType.js.map +1 -1
- package/build/dist/Types/Workflow/ComponentID.js +1 -0
- package/build/dist/Types/Workflow/ComponentID.js.map +1 -1
- package/build/dist/Types/Workflow/Components/AI.js +135 -0
- package/build/dist/Types/Workflow/Components/AI.js.map +1 -0
- package/build/dist/Types/Workflow/Components.js +7 -0
- package/build/dist/Types/Workflow/Components.js.map +1 -1
- package/build/dist/UI/Components/AI/GenerateFromAIModal.js +1 -1
- package/build/dist/UI/Components/AI/GenerateFromAIModal.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +9 -0
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenu.js +1 -1
- package/build/dist/UI/Components/Table/Table.js +28 -2
- package/build/dist/UI/Components/Table/Table.js.map +1 -1
- package/build/dist/UI/Utils/TableColumnsToCsv.js +291 -0
- package/build/dist/UI/Utils/TableColumnsToCsv.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorMetricType.js +1 -0
- package/build/dist/Utils/Monitor/MonitorMetricType.js.map +1 -1
- package/package.json +1 -1
- package/Models/DatabaseModels/AIAgentTask.ts +0 -660
- package/Models/DatabaseModels/AIAgentTaskLog.ts +0 -426
- package/Models/DatabaseModels/AIAgentTaskTelemetryException.ts +0 -399
- package/Models/DatabaseModels/ServiceCodeRepository.ts +0 -647
- package/Server/Services/AIAgentTaskService.ts +0 -240
- package/Server/Services/AIAgentTaskTelemetryExceptionService.ts +0 -39
- package/Server/Services/ServiceCodeRepositoryService.ts +0 -55
- package/Tests/Server/Services/AIAgentTaskServiceClaim.test.ts +0 -146
- package/Types/AI/AIAgentTaskMetadata.ts +0 -25
- package/Types/AI/AIAgentTaskType.ts +0 -40
- package/build/dist/Models/DatabaseModels/AIAgentTask.js +0 -691
- package/build/dist/Models/DatabaseModels/AIAgentTask.js.map +0 -1
- package/build/dist/Models/DatabaseModels/AIAgentTaskLog.js +0 -447
- package/build/dist/Models/DatabaseModels/AIAgentTaskLog.js.map +0 -1
- package/build/dist/Models/DatabaseModels/AIAgentTaskTelemetryException.js +0 -415
- package/build/dist/Models/DatabaseModels/AIAgentTaskTelemetryException.js.map +0 -1
- package/build/dist/Models/DatabaseModels/ServiceCodeRepository.js +0 -665
- package/build/dist/Models/DatabaseModels/ServiceCodeRepository.js.map +0 -1
- package/build/dist/Server/Services/AIAgentTaskLogService.js.map +0 -1
- package/build/dist/Server/Services/AIAgentTaskService.js +0 -217
- package/build/dist/Server/Services/AIAgentTaskService.js.map +0 -1
- package/build/dist/Server/Services/AIAgentTaskTelemetryExceptionService.js +0 -36
- package/build/dist/Server/Services/AIAgentTaskTelemetryExceptionService.js.map +0 -1
- package/build/dist/Server/Services/ServiceCodeRepositoryService.js +0 -54
- package/build/dist/Server/Services/ServiceCodeRepositoryService.js.map +0 -1
- package/build/dist/Server/Utils/AI/Sentinel/AlertInvestigationRunner.js.map +0 -1
- package/build/dist/Server/Utils/AI/Sentinel/IncidentInvestigationRunner.js.map +0 -1
- package/build/dist/Server/Utils/AI/Sentinel/IncidentPostmortemRunner.js.map +0 -1
- package/build/dist/Server/Utils/AI/Sentinel/InvestigationQueue.js.map +0 -1
- package/build/dist/Server/Utils/AI/Sentinel/SentinelInvestigationEngine.js.map +0 -1
- package/build/dist/Server/Utils/AI/Sentinel/SentinelMemory.js.map +0 -1
- package/build/dist/Server/Utils/AI/Toolbox/SentinelActionTools.js.map +0 -1
- package/build/dist/Types/AI/AIAgentTaskMetadata.js +0 -6
- package/build/dist/Types/AI/AIAgentTaskMetadata.js.map +0 -1
- package/build/dist/Types/AI/AIAgentTaskType.js +0 -29
- package/build/dist/Types/AI/AIAgentTaskType.js.map +0 -1
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import Route from "../../API/Route";
|
|
2
|
+
import IconProp from "../../Icon/IconProp";
|
|
3
|
+
import ComponentID from "../ComponentID";
|
|
4
|
+
import ComponentMetadata, {
|
|
5
|
+
ComponentInputType,
|
|
6
|
+
ComponentType,
|
|
7
|
+
} from "./../Component";
|
|
8
|
+
|
|
9
|
+
const components: Array<ComponentMetadata> = [
|
|
10
|
+
{
|
|
11
|
+
id: ComponentID.AIGenerateText,
|
|
12
|
+
title: "Generate Text with AI",
|
|
13
|
+
category: "AI",
|
|
14
|
+
description:
|
|
15
|
+
"Generate text from an instruction and explicit workflow context using the project's configured LLM provider.",
|
|
16
|
+
iconProp: IconProp.Sparkles,
|
|
17
|
+
componentType: ComponentType.Component,
|
|
18
|
+
documentationLink: Route.fromString("/workflow/docs/AI.md"),
|
|
19
|
+
arguments: [
|
|
20
|
+
{
|
|
21
|
+
type: ComponentInputType.LongText,
|
|
22
|
+
name: "System Instructions",
|
|
23
|
+
description:
|
|
24
|
+
"Optional high-level instructions that define the model's role, tone, or constraints.",
|
|
25
|
+
required: false,
|
|
26
|
+
id: "system-prompt",
|
|
27
|
+
placeholder:
|
|
28
|
+
"Example: Write concise, customer-safe operational updates.",
|
|
29
|
+
isSensitive: true,
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
type: ComponentInputType.Markdown,
|
|
33
|
+
name: "Prompt",
|
|
34
|
+
description:
|
|
35
|
+
"The task for the model. You can insert values from variables or earlier workflow components.",
|
|
36
|
+
required: true,
|
|
37
|
+
id: "prompt",
|
|
38
|
+
placeholder: "Summarize the following incident for our support team.",
|
|
39
|
+
isSensitive: true,
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
type: ComponentInputType.JSON,
|
|
43
|
+
name: "Context",
|
|
44
|
+
description:
|
|
45
|
+
"Optional JSON data appended after an explicit marker as untrusted workflow context.",
|
|
46
|
+
required: false,
|
|
47
|
+
id: "context",
|
|
48
|
+
placeholder: '{ "incident": "{{...}}" }',
|
|
49
|
+
isSensitive: true,
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
type: ComponentInputType.Decimal,
|
|
53
|
+
name: "Temperature",
|
|
54
|
+
description:
|
|
55
|
+
"Controls variation from 0 to 1. Defaults to 0.2 for predictable workflow output.",
|
|
56
|
+
required: false,
|
|
57
|
+
id: "temperature",
|
|
58
|
+
placeholder: "0.2",
|
|
59
|
+
isAdvanced: true,
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
type: ComponentInputType.Number,
|
|
63
|
+
name: "Maximum Output Tokens",
|
|
64
|
+
description:
|
|
65
|
+
"Maximum tokens the model may generate, from 1 to 4096. Defaults to 1024.",
|
|
66
|
+
required: false,
|
|
67
|
+
id: "max-output-tokens",
|
|
68
|
+
placeholder: "1024",
|
|
69
|
+
isAdvanced: true,
|
|
70
|
+
},
|
|
71
|
+
],
|
|
72
|
+
returnValues: [
|
|
73
|
+
{
|
|
74
|
+
type: ComponentInputType.LongText,
|
|
75
|
+
name: "Response",
|
|
76
|
+
description: "Text generated by the configured AI model.",
|
|
77
|
+
required: false,
|
|
78
|
+
id: "response",
|
|
79
|
+
isSensitive: true,
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
type: ComponentInputType.Text,
|
|
83
|
+
name: "Provider",
|
|
84
|
+
description: "Name of the LLM provider used for the request.",
|
|
85
|
+
required: false,
|
|
86
|
+
id: "provider",
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
type: ComponentInputType.Text,
|
|
90
|
+
name: "Model",
|
|
91
|
+
description: "Configured model name used for the request.",
|
|
92
|
+
required: false,
|
|
93
|
+
id: "model",
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
type: ComponentInputType.Number,
|
|
97
|
+
name: "Total Tokens",
|
|
98
|
+
description: "Total input and output tokens reported by the provider.",
|
|
99
|
+
required: false,
|
|
100
|
+
id: "total-tokens",
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
type: ComponentInputType.Number,
|
|
104
|
+
name: "Completion Tokens",
|
|
105
|
+
description: "Output tokens reported by the provider.",
|
|
106
|
+
required: false,
|
|
107
|
+
id: "completion-tokens",
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
type: ComponentInputType.Text,
|
|
111
|
+
name: "LLM Log ID",
|
|
112
|
+
description: "ID of the metered LLM log for this request.",
|
|
113
|
+
required: false,
|
|
114
|
+
id: "llm-log-id",
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
type: ComponentInputType.Text,
|
|
118
|
+
name: "Error",
|
|
119
|
+
description: "Error message when the request follows the Error port.",
|
|
120
|
+
required: false,
|
|
121
|
+
id: "error",
|
|
122
|
+
},
|
|
123
|
+
],
|
|
124
|
+
inPorts: [
|
|
125
|
+
{
|
|
126
|
+
title: "In",
|
|
127
|
+
description:
|
|
128
|
+
"Connect the component that should run before AI generation.",
|
|
129
|
+
id: "in",
|
|
130
|
+
},
|
|
131
|
+
],
|
|
132
|
+
outPorts: [
|
|
133
|
+
{
|
|
134
|
+
title: "Success",
|
|
135
|
+
description: "Runs when the model returns a response successfully.",
|
|
136
|
+
id: "success",
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
title: "Error",
|
|
140
|
+
description:
|
|
141
|
+
"Runs when validation, access, provider, budget, billing, or timeout checks fail.",
|
|
142
|
+
id: "error",
|
|
143
|
+
},
|
|
144
|
+
],
|
|
145
|
+
},
|
|
146
|
+
];
|
|
147
|
+
|
|
148
|
+
export default components;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import IconProp from "../Icon/IconProp";
|
|
2
2
|
import ComponentMetadata, { ComponentCategory } from "./Component";
|
|
3
3
|
import APIComponents from "./Components/API";
|
|
4
|
+
import AIComponents from "./Components/AI";
|
|
4
5
|
import ConditionComponents from "./Components/Condition";
|
|
5
6
|
import DiscordComponents from "./Components/Discord";
|
|
6
7
|
import EmailComponents from "./Components/Email";
|
|
@@ -17,6 +18,7 @@ import WebhookComponents from "./Components/Webhook";
|
|
|
17
18
|
import WorkflowComponents from "./Components/Workflow";
|
|
18
19
|
|
|
19
20
|
const components: Array<ComponentMetadata> = [
|
|
21
|
+
...AIComponents,
|
|
20
22
|
...LogComponents,
|
|
21
23
|
...APIComponents,
|
|
22
24
|
...ScheduleComponents,
|
|
@@ -37,6 +39,12 @@ const components: Array<ComponentMetadata> = [
|
|
|
37
39
|
export default components;
|
|
38
40
|
|
|
39
41
|
export const Categories: Array<ComponentCategory> = [
|
|
42
|
+
{
|
|
43
|
+
name: "AI",
|
|
44
|
+
description:
|
|
45
|
+
"Generate content with the LLM provider configured for this project.",
|
|
46
|
+
icon: IconProp.Sparkles,
|
|
47
|
+
},
|
|
40
48
|
{
|
|
41
49
|
name: "Webhook",
|
|
42
50
|
description: "Integrate any apps into the workflow with webhooks.",
|
|
@@ -98,7 +98,7 @@ const GenerateFromAIModal: FunctionComponent<GenerateFromAIModalProps> = (
|
|
|
98
98
|
title={props.title}
|
|
99
99
|
description={
|
|
100
100
|
props.description ||
|
|
101
|
-
"
|
|
101
|
+
"AI will generate content based on the available data."
|
|
102
102
|
}
|
|
103
103
|
onClose={() => {
|
|
104
104
|
if (!isGenerating) {
|
|
@@ -648,6 +648,17 @@ const MarkdownViewer: FunctionComponent<ComponentProps> = (
|
|
|
648
648
|
|
|
649
649
|
// Handle mermaid diagrams
|
|
650
650
|
if (match && match[1] === "mermaid") {
|
|
651
|
+
/*
|
|
652
|
+
* Never render mermaid for untrusted content: a diagram can
|
|
653
|
+
* carry an image node whose src the renderer fetches on paint
|
|
654
|
+
* (a zero-click exfil channel). Show the source as a plain,
|
|
655
|
+
* non-executing code block instead.
|
|
656
|
+
*/
|
|
657
|
+
if (safeMode) {
|
|
658
|
+
return (
|
|
659
|
+
<CodeBlock language="mermaid" content={content} rest={rest} />
|
|
660
|
+
);
|
|
661
|
+
}
|
|
651
662
|
return <MermaidDiagram chart={content} />;
|
|
652
663
|
}
|
|
653
664
|
|
|
@@ -201,7 +201,7 @@ const MoreMenu: React.ForwardRefExoticComponent<
|
|
|
201
201
|
<div
|
|
202
202
|
ref={ref}
|
|
203
203
|
id={menuId}
|
|
204
|
-
className="absolute right-0 z-
|
|
204
|
+
className="absolute right-0 z-50 mt-2 w-56 origin-top-right rounded-lg bg-white shadow-xl ring-1 ring-gray-200 focus:outline-none py-1"
|
|
205
205
|
role="menu"
|
|
206
206
|
aria-orientation="vertical"
|
|
207
207
|
aria-labelledby={buttonId}
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import { GetReactElementFunction } from "../../Types/FunctionTypes";
|
|
2
2
|
import useTranslateValue from "../../Utils/Translation";
|
|
3
|
+
import TableColumnsToCsv from "../../Utils/TableColumnsToCsv";
|
|
3
4
|
import ActionButtonSchema from "../ActionButton/ActionButtonSchema";
|
|
5
|
+
import { ButtonStyleType } from "../Button/Button";
|
|
4
6
|
import BulkUpdateForm, {
|
|
5
7
|
BulkActionButtonSchema,
|
|
8
|
+
BulkActionOnClickProps,
|
|
6
9
|
} from "../BulkUpdate/BulkUpdateForm";
|
|
7
10
|
import ComponentLoader from "../ComponentLoader/ComponentLoader";
|
|
8
11
|
import ErrorMessage from "../ErrorMessage/ErrorMessage";
|
|
@@ -15,6 +18,7 @@ import TableHeader from "./TableHeader";
|
|
|
15
18
|
import Columns from "./Types/Columns";
|
|
16
19
|
import SortOrder from "../../../Types/BaseDatabase/SortOrder";
|
|
17
20
|
import GenericObject from "../../../Types/GenericObject";
|
|
21
|
+
import IconProp from "../../../Types/Icon/IconProp";
|
|
18
22
|
import React, { ReactElement, useEffect, useState } from "react";
|
|
19
23
|
import { DragDropContext, DropResult } from "react-beautiful-dnd";
|
|
20
24
|
|
|
@@ -81,6 +85,12 @@ export interface ComponentProps<T extends GenericObject> {
|
|
|
81
85
|
onBulkActionEnd?: (() => void) | undefined;
|
|
82
86
|
onBulkActionStart?: (() => void) | undefined;
|
|
83
87
|
bulkItemToString?: ((item: T) => string) | undefined;
|
|
88
|
+
/*
|
|
89
|
+
* Every table that exposes bulk actions also gets an "Export CSV" action for
|
|
90
|
+
* the selected rows by default. Set this to true to hide it (for example when
|
|
91
|
+
* the rows contain data that should not be downloaded as a file).
|
|
92
|
+
*/
|
|
93
|
+
disableBulkCsvExport?: boolean | undefined;
|
|
84
94
|
}
|
|
85
95
|
|
|
86
96
|
type TableFunction = <T extends GenericObject>(
|
|
@@ -100,6 +110,32 @@ const Table: TableFunction = <T extends GenericObject>(
|
|
|
100
110
|
props.bulkActions.buttons &&
|
|
101
111
|
props.bulkActions.buttons.length > 0;
|
|
102
112
|
|
|
113
|
+
/*
|
|
114
|
+
* "Export CSV" is offered on every table that already exposes bulk actions.
|
|
115
|
+
* It exports the currently selected rows using the table's own visible
|
|
116
|
+
* columns (headers + formatted values) - "export what you see" - and runs
|
|
117
|
+
* entirely client-side from the already-loaded row data, so no extra
|
|
118
|
+
* requests or permissions are needed beyond the ability to view the rows.
|
|
119
|
+
*/
|
|
120
|
+
const csvExportBulkAction: BulkActionButtonSchema<T> = {
|
|
121
|
+
title: "Export CSV",
|
|
122
|
+
icon: IconProp.Download,
|
|
123
|
+
buttonStyleType: ButtonStyleType.NORMAL,
|
|
124
|
+
onClick: (onClickProps: BulkActionOnClickProps<T>): Promise<void> => {
|
|
125
|
+
TableColumnsToCsv.exportItemsToCsv({
|
|
126
|
+
items: onClickProps.items,
|
|
127
|
+
columns: props.columns,
|
|
128
|
+
label: translatedPluralLabel,
|
|
129
|
+
});
|
|
130
|
+
return Promise.resolve();
|
|
131
|
+
},
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
const bulkActionButtons: Array<BulkActionButtonSchema<T>> =
|
|
135
|
+
isBulkActionsEnabled && !props.disableBulkCsvExport
|
|
136
|
+
? [...props.bulkActions!.buttons, csvExportBulkAction]
|
|
137
|
+
: props.bulkActions?.buttons || [];
|
|
138
|
+
|
|
103
139
|
const [isAllItemsSelected, setIsAllItemsSelected] = useState<boolean>(false);
|
|
104
140
|
const [bulkSelectedItems, setBulkSelectedItems] = useState<Array<T>>([]);
|
|
105
141
|
const [isMobile, setIsMobile] = useState<boolean>(false);
|
|
@@ -258,9 +294,9 @@ const Table: TableFunction = <T extends GenericObject>(
|
|
|
258
294
|
filterData={props.filterData}
|
|
259
295
|
onAdvancedFiltersToggle={props.onAdvancedFiltersToggle}
|
|
260
296
|
/>
|
|
261
|
-
{
|
|
297
|
+
{bulkActionButtons.length > 0 && (
|
|
262
298
|
<BulkUpdateForm
|
|
263
|
-
buttons={
|
|
299
|
+
buttons={bulkActionButtons}
|
|
264
300
|
onClearSelectionClick={() => {
|
|
265
301
|
props.onBulkClearAllItems?.();
|
|
266
302
|
setIsAllItemsSelected(false);
|
|
@@ -0,0 +1,385 @@
|
|
|
1
|
+
import Column from "../Components/Table/Types/Column";
|
|
2
|
+
import Columns from "../Components/Table/Types/Columns";
|
|
3
|
+
import FieldType from "../Components/Types/FieldType";
|
|
4
|
+
import GenericObject from "../../Types/GenericObject";
|
|
5
|
+
import OneUptimeDate from "../../Types/Date";
|
|
6
|
+
|
|
7
|
+
/*
|
|
8
|
+
* Converts the rows currently rendered in a table (or a bulk-selected subset of
|
|
9
|
+
* them) into a CSV file using the table's own column definitions. The goal is
|
|
10
|
+
* to export "what you see": one column per visible table column, formatted the
|
|
11
|
+
* same way the table renders it (dates, booleans, currency, etc).
|
|
12
|
+
*
|
|
13
|
+
* The value extraction is deliberately model-agnostic so the same utility works
|
|
14
|
+
* for:
|
|
15
|
+
* - DatabaseBaseModel instances (column values are stored as direct
|
|
16
|
+
* properties, so falsy values like false / 0 / "" are preserved).
|
|
17
|
+
* - AnalyticsBaseModel instances (column values live in an internal map that
|
|
18
|
+
* is only reachable through getColumnValue()).
|
|
19
|
+
* - Plain objects used by LocalTable.
|
|
20
|
+
*/
|
|
21
|
+
export default class TableColumnsToCsv {
|
|
22
|
+
/*
|
|
23
|
+
* Escapes a single CSV field per RFC 4180 - wraps the value in double quotes
|
|
24
|
+
* and doubles any embedded quotes when it contains a comma, quote, or
|
|
25
|
+
* newline.
|
|
26
|
+
*/
|
|
27
|
+
public static escapeCsvValue(value: string): string {
|
|
28
|
+
const needsQuoting: boolean =
|
|
29
|
+
value.includes(",") ||
|
|
30
|
+
value.includes('"') ||
|
|
31
|
+
value.includes("\n") ||
|
|
32
|
+
value.includes("\r");
|
|
33
|
+
|
|
34
|
+
if (needsQuoting) {
|
|
35
|
+
return `"${value.replace(/"/g, '""')}"`;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return value;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/*
|
|
42
|
+
* Neutralizes spreadsheet formula injection. A field that begins with "=",
|
|
43
|
+
* "+", "@", or a leading control character can be executed as a formula when
|
|
44
|
+
* the CSV is opened in Excel / Google Sheets. Prefixing such a value with a
|
|
45
|
+
* single quote makes the spreadsheet treat it as literal text. A leading "-"
|
|
46
|
+
* is intentionally left untouched so negative numbers are not corrupted.
|
|
47
|
+
*/
|
|
48
|
+
public static sanitizeForCsvInjection(value: string): string {
|
|
49
|
+
if (value.length === 0) {
|
|
50
|
+
return value;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const firstChar: string = value.charAt(0);
|
|
54
|
+
|
|
55
|
+
if (
|
|
56
|
+
firstChar === "=" ||
|
|
57
|
+
firstChar === "+" ||
|
|
58
|
+
firstChar === "@" ||
|
|
59
|
+
firstChar === "\t" ||
|
|
60
|
+
firstChar === "\r"
|
|
61
|
+
) {
|
|
62
|
+
return `'${value}`;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return value;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/*
|
|
69
|
+
* Reads a nested value from an item using dot-notation, e.g. "label.name".
|
|
70
|
+
* Each segment is resolved via direct property access first (which works for
|
|
71
|
+
* database models and plain objects and keeps falsy values) and falls back to
|
|
72
|
+
* getColumnValue() for analytics models that keep values in an internal map.
|
|
73
|
+
*/
|
|
74
|
+
public static getRawValueByPath<T extends GenericObject>(
|
|
75
|
+
item: T,
|
|
76
|
+
path: string,
|
|
77
|
+
): unknown {
|
|
78
|
+
const segments: Array<string> = path.split(".");
|
|
79
|
+
let current: unknown = item;
|
|
80
|
+
|
|
81
|
+
for (const segment of segments) {
|
|
82
|
+
current = this.getSegmentValue(current, segment);
|
|
83
|
+
|
|
84
|
+
if (current === null || current === undefined) {
|
|
85
|
+
return current;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
return current;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
private static getSegmentValue(obj: unknown, segment: string): unknown {
|
|
93
|
+
if (obj === null || obj === undefined) {
|
|
94
|
+
return undefined;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const direct: unknown = (obj as Record<string, unknown>)[segment];
|
|
98
|
+
|
|
99
|
+
if (direct !== undefined) {
|
|
100
|
+
return direct;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const getColumnValue: ((name: string) => unknown) | undefined = (
|
|
104
|
+
obj as { getColumnValue?: (name: string) => unknown }
|
|
105
|
+
).getColumnValue;
|
|
106
|
+
|
|
107
|
+
if (typeof getColumnValue === "function") {
|
|
108
|
+
try {
|
|
109
|
+
return getColumnValue.call(obj, segment);
|
|
110
|
+
} catch {
|
|
111
|
+
return undefined;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
return undefined;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/*
|
|
119
|
+
* Formats a raw value into a display string based on the column's field type,
|
|
120
|
+
* mirroring how the table renders the same value. Arrays are formatted
|
|
121
|
+
* element-by-element and joined so multi-value cells stay in a single CSV
|
|
122
|
+
* field.
|
|
123
|
+
*/
|
|
124
|
+
public static formatValueForCsv(rawValue: unknown, type: FieldType): string {
|
|
125
|
+
if (rawValue === null || rawValue === undefined) {
|
|
126
|
+
return "";
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
if (Array.isArray(rawValue)) {
|
|
130
|
+
return rawValue
|
|
131
|
+
.map((element: unknown) => {
|
|
132
|
+
return this.formatScalarValue(element, type);
|
|
133
|
+
})
|
|
134
|
+
.filter((formatted: string) => {
|
|
135
|
+
return formatted.length > 0;
|
|
136
|
+
})
|
|
137
|
+
.join("; ");
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
return this.formatScalarValue(rawValue, type);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
private static formatScalarValue(rawValue: unknown, type: FieldType): string {
|
|
144
|
+
if (rawValue === null || rawValue === undefined) {
|
|
145
|
+
return "";
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
switch (type) {
|
|
149
|
+
case FieldType.Date:
|
|
150
|
+
return this.formatDate(rawValue, true);
|
|
151
|
+
case FieldType.DateTime:
|
|
152
|
+
return this.formatDate(rawValue, false);
|
|
153
|
+
case FieldType.Boolean:
|
|
154
|
+
return rawValue ? "Yes" : "No";
|
|
155
|
+
case FieldType.USDCents: {
|
|
156
|
+
const num: number = Number(rawValue);
|
|
157
|
+
if (Number.isNaN(num)) {
|
|
158
|
+
return "";
|
|
159
|
+
}
|
|
160
|
+
return `${num / 100} USD`;
|
|
161
|
+
}
|
|
162
|
+
case FieldType.Percent:
|
|
163
|
+
return `${this.stringifyValue(rawValue)}%`;
|
|
164
|
+
default:
|
|
165
|
+
return this.stringifyValue(rawValue);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
private static formatDate(rawValue: unknown, onlyShowDate: boolean): string {
|
|
170
|
+
if (rawValue instanceof Date) {
|
|
171
|
+
return OneUptimeDate.getDateAsUserFriendlyLocalFormattedString(
|
|
172
|
+
rawValue,
|
|
173
|
+
onlyShowDate,
|
|
174
|
+
);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
if (typeof rawValue === "string" && rawValue.length > 0) {
|
|
178
|
+
return OneUptimeDate.getDateAsUserFriendlyLocalFormattedString(
|
|
179
|
+
rawValue,
|
|
180
|
+
onlyShowDate,
|
|
181
|
+
);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
return "";
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
private static stringifyValue(rawValue: unknown): string {
|
|
188
|
+
if (rawValue === null || rawValue === undefined) {
|
|
189
|
+
return "";
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
const valueType: string = typeof rawValue;
|
|
193
|
+
|
|
194
|
+
if (valueType === "string") {
|
|
195
|
+
return rawValue as string;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
if (
|
|
199
|
+
valueType === "number" ||
|
|
200
|
+
valueType === "boolean" ||
|
|
201
|
+
valueType === "bigint"
|
|
202
|
+
) {
|
|
203
|
+
return String(rawValue);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
if (valueType === "object") {
|
|
207
|
+
const customString: string | null = this.getCustomToString(rawValue);
|
|
208
|
+
|
|
209
|
+
if (customString !== null) {
|
|
210
|
+
return customString;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
const obj: Record<string, unknown> = rawValue as Record<string, unknown>;
|
|
214
|
+
|
|
215
|
+
for (const displayKey of ["name", "title", "value"]) {
|
|
216
|
+
const displayValue: unknown = obj[displayKey];
|
|
217
|
+
|
|
218
|
+
if (typeof displayValue === "string" && displayValue.length > 0) {
|
|
219
|
+
return displayValue;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
if (displayValue !== null && typeof displayValue === "object") {
|
|
223
|
+
const nested: string | null = this.getCustomToString(displayValue);
|
|
224
|
+
|
|
225
|
+
if (nested !== null && nested.length > 0) {
|
|
226
|
+
return nested;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
try {
|
|
232
|
+
return JSON.stringify(rawValue);
|
|
233
|
+
} catch {
|
|
234
|
+
return "";
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
return String(rawValue);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/*
|
|
242
|
+
* Returns the result of a value's own toString() when it overrides the
|
|
243
|
+
* default Object.prototype.toString (as ObjectID, Color, Name, Email, etc do)
|
|
244
|
+
* and null otherwise so the caller can fall back to other strategies.
|
|
245
|
+
*/
|
|
246
|
+
private static getCustomToString(value: unknown): string | null {
|
|
247
|
+
const toStringFn: (() => string) | undefined = (
|
|
248
|
+
value as { toString?: () => string }
|
|
249
|
+
)?.toString;
|
|
250
|
+
|
|
251
|
+
if (
|
|
252
|
+
typeof toStringFn === "function" &&
|
|
253
|
+
toStringFn !== Object.prototype.toString
|
|
254
|
+
) {
|
|
255
|
+
const asString: string = toStringFn.call(value);
|
|
256
|
+
|
|
257
|
+
if (typeof asString === "string" && asString !== "[object Object]") {
|
|
258
|
+
return asString;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
return null;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/*
|
|
266
|
+
* Columns that can be exported: everything except the Actions column (which
|
|
267
|
+
* only holds buttons) and columns without a data key (purely presentational).
|
|
268
|
+
*/
|
|
269
|
+
public static getExportableColumns<T extends GenericObject>(
|
|
270
|
+
columns: Columns<T>,
|
|
271
|
+
): Columns<T> {
|
|
272
|
+
return (columns || []).filter((column: Column<T>) => {
|
|
273
|
+
if (column.type === FieldType.Actions) {
|
|
274
|
+
return false;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
if (column.key === null || column.key === undefined) {
|
|
278
|
+
return false;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
return true;
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
public static getCellValue<T extends GenericObject>(
|
|
286
|
+
item: T,
|
|
287
|
+
column: Column<T>,
|
|
288
|
+
): string {
|
|
289
|
+
if (column.key === null || column.key === undefined) {
|
|
290
|
+
return "";
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
const rawValue: unknown = this.getRawValueByPath(item, String(column.key));
|
|
294
|
+
|
|
295
|
+
return this.formatValueForCsv(rawValue, column.type);
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
/*
|
|
299
|
+
* Builds the full CSV text (header row + one row per item). Fields are
|
|
300
|
+
* sanitized against formula injection and escaped per RFC 4180, and rows are
|
|
301
|
+
* separated with CRLF.
|
|
302
|
+
*/
|
|
303
|
+
public static convertToCsv<T extends GenericObject>(data: {
|
|
304
|
+
items: Array<T>;
|
|
305
|
+
columns: Columns<T>;
|
|
306
|
+
}): string {
|
|
307
|
+
const exportColumns: Columns<T> = this.getExportableColumns(data.columns);
|
|
308
|
+
|
|
309
|
+
const encodeField: (value: string) => string = (value: string): string => {
|
|
310
|
+
return this.escapeCsvValue(this.sanitizeForCsvInjection(value));
|
|
311
|
+
};
|
|
312
|
+
|
|
313
|
+
const headerRow: string = exportColumns
|
|
314
|
+
.map((column: Column<T>) => {
|
|
315
|
+
return encodeField(column.title || "");
|
|
316
|
+
})
|
|
317
|
+
.join(",");
|
|
318
|
+
|
|
319
|
+
const rows: Array<string> = (data.items || []).map((item: T) => {
|
|
320
|
+
return exportColumns
|
|
321
|
+
.map((column: Column<T>) => {
|
|
322
|
+
return encodeField(this.getCellValue(item, column));
|
|
323
|
+
})
|
|
324
|
+
.join(",");
|
|
325
|
+
});
|
|
326
|
+
|
|
327
|
+
return [headerRow, ...rows].join("\r\n");
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
/*
|
|
331
|
+
* Builds a filesystem-safe, timestamped file name from a human label, e.g.
|
|
332
|
+
* "Monitors" -> "monitors-export-2024-01-31T10-30-00.csv".
|
|
333
|
+
*/
|
|
334
|
+
public static getExportFilename(label: string): string {
|
|
335
|
+
const safeLabel: string =
|
|
336
|
+
(label || "table")
|
|
337
|
+
.replace(/[^a-zA-Z0-9-_]+/g, "-")
|
|
338
|
+
.replace(/^-+|-+$/g, "")
|
|
339
|
+
.toLowerCase() || "table";
|
|
340
|
+
|
|
341
|
+
const timestamp: string = new Date()
|
|
342
|
+
.toISOString()
|
|
343
|
+
.replace(/[:.]/g, "-")
|
|
344
|
+
.slice(0, 19);
|
|
345
|
+
|
|
346
|
+
return `${safeLabel}-export-${timestamp}.csv`;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
public static downloadCsv(data: { csv: string; filename: string }): void {
|
|
350
|
+
/*
|
|
351
|
+
* A UTF-8 byte order mark makes Excel open the file with the correct
|
|
352
|
+
* encoding so non-ASCII characters are not mangled.
|
|
353
|
+
*/
|
|
354
|
+
const byteOrderMark: string = String.fromCharCode(0xfeff);
|
|
355
|
+
|
|
356
|
+
const blob: Blob = new Blob([`${byteOrderMark}${data.csv}`], {
|
|
357
|
+
type: "text/csv;charset=utf-8;",
|
|
358
|
+
});
|
|
359
|
+
|
|
360
|
+
const url: string = window.URL.createObjectURL(blob);
|
|
361
|
+
const anchor: HTMLAnchorElement = document.createElement("a");
|
|
362
|
+
anchor.href = url;
|
|
363
|
+
anchor.download = data.filename;
|
|
364
|
+
document.body.appendChild(anchor);
|
|
365
|
+
anchor.click();
|
|
366
|
+
document.body.removeChild(anchor);
|
|
367
|
+
window.URL.revokeObjectURL(url);
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
public static exportItemsToCsv<T extends GenericObject>(data: {
|
|
371
|
+
items: Array<T>;
|
|
372
|
+
columns: Columns<T>;
|
|
373
|
+
label: string;
|
|
374
|
+
}): void {
|
|
375
|
+
const csv: string = this.convertToCsv({
|
|
376
|
+
items: data.items,
|
|
377
|
+
columns: data.columns,
|
|
378
|
+
});
|
|
379
|
+
|
|
380
|
+
this.downloadCsv({
|
|
381
|
+
csv: csv,
|
|
382
|
+
filename: this.getExportFilename(data.label),
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
}
|
|
@@ -222,6 +222,7 @@ class MonitorMetricTypeUtil {
|
|
|
222
222
|
monitorType === MonitorType.DNS ||
|
|
223
223
|
monitorType === MonitorType.DNSSEC ||
|
|
224
224
|
monitorType === MonitorType.Domain ||
|
|
225
|
+
monitorType === MonitorType.SQLQuery ||
|
|
225
226
|
monitorType === MonitorType.ExternalStatusPage
|
|
226
227
|
) {
|
|
227
228
|
return [MonitorMetricType.IsOnline, MonitorMetricType.ResponseTime];
|