@oneuptime/common 11.5.11 → 11.5.13

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 (142) hide show
  1. package/Models/AnalyticsModels/NetworkFlow.ts +12 -1
  2. package/Models/DatabaseModels/AIInsight.ts +30 -0
  3. package/Models/DatabaseModels/Project.ts +30 -0
  4. package/Models/DatabaseModels/TelemetryException.ts +128 -0
  5. package/Server/API/AIAgentDataAPI.ts +129 -5
  6. package/Server/API/AIInvestigationAPI.ts +87 -0
  7. package/Server/API/StatusPageAPI.ts +14 -1
  8. package/Server/Infrastructure/Postgres/SchemaMigrations/1784640000000-AddExceptionTriageAndPrivacyColumns.ts +56 -0
  9. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +2 -2
  10. package/Server/Services/AIRunService.ts +8 -0
  11. package/Server/Services/IncidentService.ts +62 -67
  12. package/Server/Services/MonitorGroupService.ts +15 -2
  13. package/Server/Services/MonitorService.ts +91 -3
  14. package/Server/Services/MonitorStatusTimelineService.ts +285 -100
  15. package/Server/Services/StatusPageService.ts +59 -34
  16. package/Server/Services/TelemetryExceptionService.ts +320 -24
  17. package/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.ts +15 -4
  18. package/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.ts +15 -4
  19. package/Server/Utils/AI/SRE/Insights/InsightScanner.ts +222 -24
  20. package/Server/Utils/AI/SRE/Insights/InsightTriageRunner.ts +225 -9
  21. package/Server/Utils/AI/SRE/SubjectCodeFixRun.ts +39 -0
  22. package/Server/Utils/AI/SRE/TelemetryImprovementTaskTrigger.ts +114 -0
  23. package/Server/Utils/Monitor/MonitorResource.ts +43 -14
  24. package/Server/Utils/Monitor/MonitorStatusTimeline.ts +32 -7
  25. package/Server/Utils/Monitor/MonitorStatusTimelineReconciler.ts +362 -0
  26. package/Server/Utils/Telemetry/ExceptionSanitizer.ts +222 -0
  27. package/Tests/Server/Services/MonitorStatusTimelineService.test.ts +235 -0
  28. package/Tests/Server/Services/TelemetryExceptionCodeFixRun.test.ts +205 -1
  29. package/Tests/Server/Utils/AI/Insights/InsightScanner.test.ts +150 -141
  30. package/Tests/Server/Utils/AI/Insights/InsightTriageRunner.test.ts +277 -1
  31. package/Tests/Server/Utils/ExceptionSanitizer.test.ts +70 -0
  32. package/Tests/Server/Utils/InsightTriageClassification.test.ts +57 -0
  33. package/Tests/Server/Utils/Monitor/MonitorStatusTimelineReconciler.test.ts +555 -0
  34. package/Tests/Server/Utils/TelemetryImprovementTaskTrigger.test.ts +141 -0
  35. package/Tests/Types/Database/CompareOperatorWireSerialization.test.ts +216 -0
  36. package/Tests/Types/Database/GreaterThan.test.ts +5 -1
  37. package/Tests/Types/Database/GreaterThanOrEqual.test.ts +5 -1
  38. package/Tests/Types/Database/GreaterThanOrNull.test.ts +24 -1
  39. package/Tests/Types/Database/LessThan.test.ts +5 -1
  40. package/Tests/Types/Database/LessThanOrEqual.test.ts +24 -1
  41. package/Tests/Types/Database/LessThanOrNull.test.ts +5 -1
  42. package/Tests/UI/Components/ModelTableSelectFromColumns.test.ts +259 -0
  43. package/Tests/Utils/Uptime/UptimeUtil.test.ts +726 -0
  44. package/Types/AI/CodeFixTaskContext.ts +6 -0
  45. package/Types/AI/CodeFixTaskType.ts +38 -1
  46. package/Types/AI/ExceptionAIClassification.ts +27 -0
  47. package/Types/BaseDatabase/GreaterThan.ts +8 -1
  48. package/Types/BaseDatabase/GreaterThanOrEqual.ts +8 -1
  49. package/Types/BaseDatabase/GreaterThanOrNull.ts +9 -1
  50. package/Types/BaseDatabase/LessThan.ts +8 -1
  51. package/Types/BaseDatabase/LessThanOrEqual.ts +9 -1
  52. package/Types/BaseDatabase/LessThanOrNull.ts +8 -1
  53. package/Types/Log/LogScrubPatternType.ts +7 -0
  54. package/Types/Trace/TraceScrubPatternType.ts +7 -0
  55. package/UI/Components/ModelTable/BaseModelTable.tsx +15 -46
  56. package/UI/Components/ModelTable/SelectFromColumns.ts +129 -0
  57. package/Utils/StatusPage/ResourceUptime.ts +11 -1
  58. package/Utils/Uptime/UptimeUtil.ts +142 -36
  59. package/build/dist/Models/AnalyticsModels/NetworkFlow.js +12 -1
  60. package/build/dist/Models/AnalyticsModels/NetworkFlow.js.map +1 -1
  61. package/build/dist/Models/DatabaseModels/AIInsight.js +31 -0
  62. package/build/dist/Models/DatabaseModels/AIInsight.js.map +1 -1
  63. package/build/dist/Models/DatabaseModels/Project.js +31 -0
  64. package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
  65. package/build/dist/Models/DatabaseModels/TelemetryException.js +134 -0
  66. package/build/dist/Models/DatabaseModels/TelemetryException.js.map +1 -1
  67. package/build/dist/Server/API/AIAgentDataAPI.js +97 -8
  68. package/build/dist/Server/API/AIAgentDataAPI.js.map +1 -1
  69. package/build/dist/Server/API/AIInvestigationAPI.js +55 -0
  70. package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
  71. package/build/dist/Server/API/StatusPageAPI.js +12 -2
  72. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  73. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784640000000-AddExceptionTriageAndPrivacyColumns.js +33 -0
  74. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784640000000-AddExceptionTriageAndPrivacyColumns.js.map +1 -0
  75. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +2 -2
  76. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  77. package/build/dist/Server/Services/AIRunService.js +9 -2
  78. package/build/dist/Server/Services/AIRunService.js.map +1 -1
  79. package/build/dist/Server/Services/IncidentService.js +47 -56
  80. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  81. package/build/dist/Server/Services/MonitorGroupService.js +15 -2
  82. package/build/dist/Server/Services/MonitorGroupService.js.map +1 -1
  83. package/build/dist/Server/Services/MonitorService.js +66 -3
  84. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  85. package/build/dist/Server/Services/MonitorStatusTimelineService.js +244 -102
  86. package/build/dist/Server/Services/MonitorStatusTimelineService.js.map +1 -1
  87. package/build/dist/Server/Services/StatusPageService.js +57 -33
  88. package/build/dist/Server/Services/StatusPageService.js.map +1 -1
  89. package/build/dist/Server/Services/TelemetryExceptionService.js +263 -22
  90. package/build/dist/Server/Services/TelemetryExceptionService.js.map +1 -1
  91. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js +12 -4
  92. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js.map +1 -1
  93. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js +12 -4
  94. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js.map +1 -1
  95. package/build/dist/Server/Utils/AI/SRE/Insights/InsightScanner.js +193 -22
  96. package/build/dist/Server/Utils/AI/SRE/Insights/InsightScanner.js.map +1 -1
  97. package/build/dist/Server/Utils/AI/SRE/Insights/InsightTriageRunner.js +178 -9
  98. package/build/dist/Server/Utils/AI/SRE/Insights/InsightTriageRunner.js.map +1 -1
  99. package/build/dist/Server/Utils/AI/SRE/SubjectCodeFixRun.js +37 -0
  100. package/build/dist/Server/Utils/AI/SRE/SubjectCodeFixRun.js.map +1 -1
  101. package/build/dist/Server/Utils/AI/SRE/TelemetryImprovementTaskTrigger.js +98 -0
  102. package/build/dist/Server/Utils/AI/SRE/TelemetryImprovementTaskTrigger.js.map +1 -0
  103. package/build/dist/Server/Utils/Monitor/MonitorResource.js +34 -12
  104. package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
  105. package/build/dist/Server/Utils/Monitor/MonitorStatusTimeline.js +25 -8
  106. package/build/dist/Server/Utils/Monitor/MonitorStatusTimeline.js.map +1 -1
  107. package/build/dist/Server/Utils/Monitor/MonitorStatusTimelineReconciler.js +268 -0
  108. package/build/dist/Server/Utils/Monitor/MonitorStatusTimelineReconciler.js.map +1 -0
  109. package/build/dist/Server/Utils/Telemetry/ExceptionSanitizer.js +149 -0
  110. package/build/dist/Server/Utils/Telemetry/ExceptionSanitizer.js.map +1 -0
  111. package/build/dist/Types/AI/CodeFixTaskType.js +38 -1
  112. package/build/dist/Types/AI/CodeFixTaskType.js.map +1 -1
  113. package/build/dist/Types/AI/ExceptionAIClassification.js +28 -0
  114. package/build/dist/Types/AI/ExceptionAIClassification.js.map +1 -0
  115. package/build/dist/Types/BaseDatabase/GreaterThan.js +8 -1
  116. package/build/dist/Types/BaseDatabase/GreaterThan.js.map +1 -1
  117. package/build/dist/Types/BaseDatabase/GreaterThanOrEqual.js +8 -1
  118. package/build/dist/Types/BaseDatabase/GreaterThanOrEqual.js.map +1 -1
  119. package/build/dist/Types/BaseDatabase/GreaterThanOrNull.js +9 -1
  120. package/build/dist/Types/BaseDatabase/GreaterThanOrNull.js.map +1 -1
  121. package/build/dist/Types/BaseDatabase/LessThan.js +8 -1
  122. package/build/dist/Types/BaseDatabase/LessThan.js.map +1 -1
  123. package/build/dist/Types/BaseDatabase/LessThanOrEqual.js +9 -1
  124. package/build/dist/Types/BaseDatabase/LessThanOrEqual.js.map +1 -1
  125. package/build/dist/Types/BaseDatabase/LessThanOrNull.js +8 -1
  126. package/build/dist/Types/BaseDatabase/LessThanOrNull.js.map +1 -1
  127. package/build/dist/Types/Log/LogScrubPatternType.js +7 -0
  128. package/build/dist/Types/Log/LogScrubPatternType.js.map +1 -1
  129. package/build/dist/Types/Trace/TraceScrubPatternType.js +7 -0
  130. package/build/dist/Types/Trace/TraceScrubPatternType.js.map +1 -1
  131. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +12 -37
  132. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  133. package/build/dist/UI/Components/ModelTable/SelectFromColumns.js +82 -0
  134. package/build/dist/UI/Components/ModelTable/SelectFromColumns.js.map +1 -0
  135. package/build/dist/Utils/StatusPage/ResourceUptime.js +4 -1
  136. package/build/dist/Utils/StatusPage/ResourceUptime.js.map +1 -1
  137. package/build/dist/Utils/Uptime/UptimeUtil.js +86 -33
  138. package/build/dist/Utils/Uptime/UptimeUtil.js.map +1 -1
  139. package/package.json +1 -1
  140. package/Server/Infrastructure/Postgres/SchemaMigrations/1784401962564-MigrationName.ts +0 -101
  141. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784401962564-MigrationName.js +0 -40
  142. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784401962564-MigrationName.js.map +0 -1
@@ -8,10 +8,17 @@ var __metadata = (this && this.__metadata) || function (k, v) {
8
8
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
9
  };
10
10
  import OneUptimeDate from "../../../../../Types/Date";
11
+ import AIInsightStatus, { AIInsightStatusHelper, } from "../../../../../Types/AI/AIInsightStatus";
12
+ import AIInsightType from "../../../../../Types/AI/AIInsightType";
13
+ import ExceptionAIClassification from "../../../../../Types/AI/ExceptionAIClassification";
11
14
  import AIInsightService from "../../../../Services/AIInsightService";
15
+ import ProjectService from "../../../../Services/ProjectService";
16
+ import TelemetryExceptionService from "../../../../Services/TelemetryExceptionService";
12
17
  import { AI_INSIGHT_TRIAGE_FEATURE } from "../../../../Services/AIService";
13
18
  import AIInvestigationEngine from "../AIInvestigationEngine";
14
19
  import AIInvestigationQueue from "../InvestigationQueue";
20
+ import InsightFixRouting from "./FixRouting";
21
+ import ToolResultSerializer from "../../Toolbox/Serializer";
15
22
  import logger from "../../../Logger";
16
23
  import CaptureSpan from "../../../Telemetry/CaptureSpan";
17
24
  /*
@@ -45,7 +52,17 @@ const PREVENTIVE_TRIAGE_FRAMING = `IMPORTANT — this is PREVENTIVE TRIAGE, not
45
52
  - Establish the most likely root cause of the finding.
46
53
  - Estimate the blast radius: which services/users/operations are affected, and how badly.
47
54
  - Recommend exactly ONE next action (the single most useful thing an engineer should do first).
48
- Cite the evidence for every factual claim. If the telemetry cannot support a conclusion, say so plainly. Do not refer to "the incident" — there is none.`;
55
+ Cite the evidence for every factual claim. If the telemetry cannot support a conclusion, say so plainly. Do not refer to "the incident" — there is none.
56
+
57
+ CLASSIFICATION — you MUST end your analysis with one line in EXACTLY this format, on its own line, with nothing after it:
58
+ Classification: <verdict>
59
+ where <verdict> is exactly one of: code-fault, user-error, expected-denial, infrastructure, unknown.
60
+ - code-fault: a defect in the monitored code that a code change should fix.
61
+ - user-error: an expected consequence of invalid end-user input (bad parameters, malformed values, garbage in a URL). The code rejected it correctly; the input was wrong.
62
+ - expected-denial: an intentional check doing its job — authentication/authorization failures, plan or paywall rejections, rate limits, or security scanners/fuzzers tripping validation on purpose-built probes.
63
+ - infrastructure: an environmental condition (network timeout, connection reset, resource exhaustion, dependency outage) rather than a logic defect.
64
+ - unknown: the evidence does not support a confident verdict.
65
+ This verdict gates automation: ONLY code-fault findings may get an automatic fix pull request, so classify conservatively — when torn between code-fault and anything else, pick the other one.`;
49
66
  export default class InsightTriageRunner {
50
67
  /*
51
68
  * Execute a claimed triage run: load the insight, build its description
@@ -56,11 +73,13 @@ export default class InsightTriageRunner {
56
73
  static async executeTriage(data) {
57
74
  const { aiRunId, projectId, sentinelInsightId, attemptCount } = data;
58
75
  let contextSummary;
76
+ let insight = null;
59
77
  try {
60
- const insight = await AIInsightService.findOneById({
78
+ insight = await AIInsightService.findOneById({
61
79
  id: sentinelInsightId,
62
80
  select: {
63
81
  _id: true,
82
+ projectId: true,
64
83
  insightType: true,
65
84
  severity: true,
66
85
  title: true,
@@ -68,6 +87,7 @@ export default class InsightTriageRunner {
68
87
  evidence: true,
69
88
  serviceName: true,
70
89
  traceId: true,
90
+ telemetryExceptionId: true,
71
91
  metricName: true,
72
92
  firstSeenAt: true,
73
93
  lastSeenAt: true,
@@ -101,25 +121,168 @@ export default class InsightTriageRunner {
101
121
  feature: AI_INSIGHT_TRIAGE_FEATURE,
102
122
  contextSummary,
103
123
  postAnalysis: async (postData) => {
124
+ const classification = this.parseClassification(postData.analysisMarkdown);
104
125
  /*
105
- * The quiet inbox — deliberately the ONLY write: no feed items,
106
- * no workspace notification, no owner/on-call ping, no metrics,
107
- * and no instrumentation-task trigger. Insights never page and
108
- * never enter the notification pipeline (Preventive-lane rule);
109
- * the summary waits on the Insights page until a human looks.
126
+ * The quiet inbox — the summary and verdict land on the insight
127
+ * row: no feed items, no workspace notification, no owner/on-call
128
+ * ping, no metrics, and no instrumentation-task trigger. Insights
129
+ * never page and never enter the notification pipeline
130
+ * (Preventive-lane rule); the summary waits on the Insights page
131
+ * until a human looks.
110
132
  */
111
133
  await AIInsightService.updateOneById({
112
134
  id: sentinelInsightId,
113
135
  data: {
114
136
  triageSummaryMarkdown: postData.analysisMarkdown,
115
137
  triageCompletedAt: OneUptimeDate.getCurrentDate(),
138
+ classification: classification,
116
139
  },
117
140
  props: { isRoot: true },
118
141
  });
119
- logger.debug(`AI insights: triage summary posted for insight ${sentinelInsightId.toString()} (run ${aiRunId.toString()}, confident=${postData.confidence.confident} via ${postData.confidence.source}).`);
142
+ logger.debug(`AI insights: triage summary posted for insight ${sentinelInsightId.toString()} (run ${aiRunId.toString()}, classification=${classification}, confident=${postData.confidence.confident} via ${postData.confidence.source}).`);
143
+ /*
144
+ * Verdict-driven follow-through. Best-effort by design: the
145
+ * triage summary is already posted, and a failure here must not
146
+ * fail the triage run itself.
147
+ */
148
+ try {
149
+ await this.actOnClassification({
150
+ insight: insight,
151
+ classification: classification,
152
+ });
153
+ }
154
+ catch (error) {
155
+ logger.error(`AI insights: post-triage action failed for insight ${sentinelInsightId.toString()} (verdict ${classification}): ${error}`);
156
+ }
157
+ },
158
+ },
159
+ });
160
+ }
161
+ /*
162
+ * Parse the mandatory trailing "Classification: <verdict>" line out of
163
+ * the triage analysis. The LAST match wins (the model may discuss the
164
+ * taxonomy earlier in its reasoning). Anything unparseable is Unknown —
165
+ * and Unknown never routes a fix, so a malformed answer fails closed.
166
+ */
167
+ static parseClassification(analysisMarkdown) {
168
+ const matches = Array.from((analysisMarkdown || "").matchAll(/^\s*\**\s*classification\s*\**\s*[:=]\s*\**\s*(code-fault|user-error|expected-denial|infrastructure|unknown)\b/gim));
169
+ const last = matches[matches.length - 1];
170
+ if (!last || !last[1]) {
171
+ return ExceptionAIClassification.Unknown;
172
+ }
173
+ return last[1].toLowerCase();
174
+ }
175
+ /*
176
+ * Act on the triage verdict:
177
+ *
178
+ * 1. Stamp the verdict onto the exception group row (aiClassification)
179
+ * so the exceptions list can filter on it and the fix lane can skip
180
+ * known-non-defects without re-triaging.
181
+ * 2. code-fault → route the automatic fix (InsightFixRouting owns every
182
+ * gate: enableAi, enableInsightFixTasks, budget, readiness, dedupe)
183
+ * and flip the insight to FixOpened when a run was queued.
184
+ * 3. expected-denial → optionally auto-archive the exception group when
185
+ * the project opted in (autoArchiveNonActionableExceptions). Only
186
+ * expected denials are archived — user errors and infrastructure
187
+ * conditions stay visible for a human to judge.
188
+ */
189
+ static async actOnClassification(data) {
190
+ const { insight, classification } = data;
191
+ if (!insight.id || !insight.projectId) {
192
+ return;
193
+ }
194
+ /*
195
+ * The verdict stamp on the exception group is metadata and always
196
+ * lands; the AUTOMATION below (fix PR, auto-archive) additionally
197
+ * requires that no human closed the insight while the triage run sat
198
+ * in the queue or executed. The `insight` object is a snapshot from
199
+ * claim time — minutes to half an hour old — so the status MUST be
200
+ * re-read here: an insight a human Dismissed or Resolved in the
201
+ * meantime gets no PR and keeps its terminal status.
202
+ */
203
+ if (insight.telemetryExceptionId) {
204
+ await TelemetryExceptionService.updateOneById({
205
+ id: insight.telemetryExceptionId,
206
+ data: {
207
+ aiClassification: classification,
120
208
  },
209
+ props: { isRoot: true },
210
+ });
211
+ }
212
+ const currentInsight = await AIInsightService.findOneById({
213
+ id: insight.id,
214
+ select: {
215
+ _id: true,
216
+ status: true,
217
+ },
218
+ props: { isRoot: true },
219
+ });
220
+ if (!currentInsight ||
221
+ (currentInsight.status &&
222
+ AIInsightStatusHelper.isTerminalStatus(currentInsight.status))) {
223
+ logger.debug(`AI insights: skipping post-triage automation for insight ${insight.id.toString()} — insight is ${(currentInsight === null || currentInsight === void 0 ? void 0 : currentInsight.status) || "deleted"}.`);
224
+ return;
225
+ }
226
+ const project = await ProjectService.findOneById({
227
+ id: insight.projectId,
228
+ select: {
229
+ _id: true,
230
+ enableAi: true,
231
+ enableInsightFixTasks: true,
232
+ autoArchiveNonActionableExceptions: true,
121
233
  },
234
+ props: { isRoot: true },
122
235
  });
236
+ if (!project) {
237
+ return;
238
+ }
239
+ /*
240
+ * TraceLatencyRegression insights are fix-routed DETERMINISTICALLY at
241
+ * scan time (their span-tree evidence needs no LLM verdict — see
242
+ * InsightScanner.routeNewInsight); routing them again here would
243
+ * duplicate the run/PR. The verdict gate applies to exception
244
+ * insights only.
245
+ */
246
+ const isVerdictGatedInsight = insight.insightType !== AIInsightType.TraceLatencyRegression;
247
+ if (classification === ExceptionAIClassification.CodeFault &&
248
+ isVerdictGatedInsight) {
249
+ const fixResult = await InsightFixRouting.routeInsightFix({
250
+ insight: insight,
251
+ project: project,
252
+ });
253
+ if (fixResult.fixAiRunId) {
254
+ /*
255
+ * Conditional flip: only a still-ActionRequired insight moves to
256
+ * FixOpened, so a dismissal landing between the status re-read
257
+ * above and this write can never be clobbered.
258
+ */
259
+ await AIInsightService.updateOneBy({
260
+ query: {
261
+ _id: insight.id.toString(),
262
+ status: AIInsightStatus.ActionRequired,
263
+ },
264
+ data: {
265
+ status: AIInsightStatus.FixOpened,
266
+ fixAiRunId: fixResult.fixAiRunId,
267
+ },
268
+ props: { isRoot: true },
269
+ });
270
+ }
271
+ return;
272
+ }
273
+ if (classification === ExceptionAIClassification.ExpectedDenial &&
274
+ project.autoArchiveNonActionableExceptions === true &&
275
+ insight.telemetryExceptionId) {
276
+ await TelemetryExceptionService.updateOneById({
277
+ id: insight.telemetryExceptionId,
278
+ data: {
279
+ isArchived: true,
280
+ markedAsArchivedAt: OneUptimeDate.getCurrentDate(),
281
+ },
282
+ props: { isRoot: true },
283
+ });
284
+ logger.debug(`AI insights: auto-archived exception ${insight.telemetryExceptionId.toString()} (expected-denial verdict, project opted in).`);
285
+ }
123
286
  }
124
287
  // Build the compact insight record that seeds the triage.
125
288
  static buildInsightSummary(insight) {
@@ -159,7 +322,13 @@ export default class InsightTriageRunner {
159
322
  lines.push("## Raw evidence values");
160
323
  lines.push(renderedEvidence);
161
324
  }
162
- return lines.join("\n");
325
+ /*
326
+ * Detector detailMarkdown and evidence quote raw exception messages —
327
+ * sweep secrets/PII before the text reaches the LLM provider. (The
328
+ * chat/investigation toolbox path already redacts its tool results;
329
+ * this closes the same gap for the detector-supplied context.)
330
+ */
331
+ return ToolResultSerializer.redact(lines.join("\n")).text;
163
332
  }
164
333
  /*
165
334
  * Render the stored evidence JSON compactly: one line per populated
@@ -1 +1 @@
1
- {"version":3,"file":"InsightTriageRunner.js","sourceRoot":"","sources":["../../../../../../../Server/Utils/AI/SRE/Insights/InsightTriageRunner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"InsightTriageRunner.js","sourceRoot":"","sources":["../../../../../../../Server/Utils/AI/SRE/Insights/InsightTriageRunner.ts"],"names":[],"mappings":"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"}
@@ -98,6 +98,37 @@ export default class SubjectCodeFixRun {
98
98
  return ((_a = run.taskContext) === null || _a === void 0 ? void 0 : _a.traceId) === data.traceId;
99
99
  }) || null);
100
100
  }
101
+ /*
102
+ * Per-(service, recipe) dedupe for the service-scoped instrumentation
103
+ * recipes (ImproveLogging / ImproveTracing): at most one non-terminal
104
+ * run of a recipe per (project, telemetryServiceId). Same in-memory
105
+ * taskContext matching as the per-trace guard above — the id lives in
106
+ * JSON the Query layer cannot filter on, and the candidate set is
107
+ * bounded and rare.
108
+ */
109
+ static async findNonTerminalRunForTelemetryService(data) {
110
+ const activeRuns = await AIRunService.findBy({
111
+ query: {
112
+ projectId: data.projectId,
113
+ runType: AIRunType.CodeFix,
114
+ codeFixTaskType: data.taskType,
115
+ status: QueryHelper.notIn([
116
+ AIRunStatus.Completed,
117
+ AIRunStatus.Error,
118
+ AIRunStatus.Cancelled,
119
+ AIRunStatus.Stale,
120
+ ]),
121
+ },
122
+ select: { _id: true, taskContext: true },
123
+ limit: LIMIT_PER_PROJECT,
124
+ skip: 0,
125
+ props: { isRoot: true },
126
+ });
127
+ return (activeRuns.find((run) => {
128
+ var _a;
129
+ return ((_a = run.taskContext) === null || _a === void 0 ? void 0 : _a.telemetryServiceId) === data.telemetryServiceId;
130
+ }) || null);
131
+ }
101
132
  /*
102
133
  * Record the durable intent as a Queued CodeFix AIRun that the external
103
134
  * agent worker claims via /ai-agent-task/get-pending-task. `userId` is
@@ -158,6 +189,12 @@ __decorate([
158
189
  __metadata("design:paramtypes", [Object]),
159
190
  __metadata("design:returntype", Promise)
160
191
  ], SubjectCodeFixRun, "findNonTerminalPerformanceFixRunForTrace", null);
192
+ __decorate([
193
+ CaptureSpan(),
194
+ __metadata("design:type", Function),
195
+ __metadata("design:paramtypes", [Object]),
196
+ __metadata("design:returntype", Promise)
197
+ ], SubjectCodeFixRun, "findNonTerminalRunForTelemetryService", null);
161
198
  __decorate([
162
199
  CaptureSpan(),
163
200
  __metadata("design:type", Function),
@@ -1 +1 @@
1
- {"version":3,"file":"SubjectCodeFixRun.js","sourceRoot":"","sources":["../../../../../../Server/Utils/AI/SRE/SubjectCodeFixRun.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SubjectCodeFixRun.js","sourceRoot":"","sources":["../../../../../../Server/Utils/AI/SRE/SubjectCodeFixRun.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,98 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import CodeFixTaskType from "../../../../Types/AI/CodeFixTaskType";
11
+ import BadDataException from "../../../../Types/Exception/BadDataException";
12
+ import ServiceService from "../../../Services/ServiceService";
13
+ import SubjectCodeFixRun from "./SubjectCodeFixRun";
14
+ import CaptureSpan from "../../Telemetry/CaptureSpan";
15
+ /*
16
+ * AI SRE — the service-scoped instrumentation-improvement triggers:
17
+ * ImproveLogging and ImproveTracing. One click on a service's Logs or
18
+ * Traces page opens a draft PR that improves that service's logging or
19
+ * tracing hygiene — parameterized log messages, correct severities, spans
20
+ * on uninstrumented paths, proper exception recording — WITHOUT changing
21
+ * behavior.
22
+ *
23
+ * Like FixFromIncident and FixPerformance these are human-triggered from a
24
+ * user-facing endpoint (POST /ai-investigation/
25
+ * create-telemetry-improvement-task), so there is no project opt-in flag —
26
+ * the human in the loop IS the gate — and every unmet gate FAILS EARLY
27
+ * with a clear message. The recipe's grounding is the SERVICE: repository
28
+ * resolution at task-details time uses the service name (name-match /
29
+ * only-repository), the same path the incident-subject recipes use.
30
+ */
31
+ export default class TelemetryImprovementTaskTrigger {
32
+ /*
33
+ * Gate and enqueue an ImproveLogging / ImproveTracing CodeFix run for a
34
+ * telemetry service. The caller must already have loaded the service
35
+ * under the USER's permissions (the access check) — this method reads
36
+ * and writes as root.
37
+ *
38
+ * Throws BadDataException naming the failed gate: unsupported recipe, no
39
+ * GitHub-App repository, a duplicate active run for the same service, or
40
+ * (via enqueueSubjectCodeFixRun) the daily fix-run budget.
41
+ */
42
+ static async createTelemetryImprovementTask(data) {
43
+ var _a;
44
+ if (data.taskType !== CodeFixTaskType.ImproveLogging &&
45
+ data.taskType !== CodeFixTaskType.ImproveTracing) {
46
+ throw new BadDataException(`Task type "${data.taskType}" is not a telemetry-improvement recipe. Supported: ${CodeFixTaskType.ImproveLogging}, ${CodeFixTaskType.ImproveTracing}.`);
47
+ }
48
+ const service = await ServiceService.findOneById({
49
+ id: data.telemetryServiceId,
50
+ select: {
51
+ _id: true,
52
+ name: true,
53
+ projectId: true,
54
+ },
55
+ props: { isRoot: true },
56
+ });
57
+ if (!service ||
58
+ ((_a = service.projectId) === null || _a === void 0 ? void 0 : _a.toString()) !== data.projectId.toString()) {
59
+ throw new BadDataException("Telemetry service not found.");
60
+ }
61
+ // Gate — a repository the agent can actually open a PR against.
62
+ const hasConnectedRepository = await SubjectCodeFixRun.hasGitHubAppConnectedRepository(data.projectId);
63
+ if (!hasConnectedRepository) {
64
+ throw new BadDataException("No GitHub-App-connected repository exists for this project, so the agent has nowhere to open the pull request. Connect one under AI > Code Repositories.");
65
+ }
66
+ /*
67
+ * Gate — per-(service, recipe) dedupe: repeated clicks must not fan
68
+ * out into duplicate PRs.
69
+ */
70
+ const existingRun = await SubjectCodeFixRun.findNonTerminalRunForTelemetryService({
71
+ projectId: data.projectId,
72
+ taskType: data.taskType,
73
+ telemetryServiceId: data.telemetryServiceId.toString(),
74
+ });
75
+ if (existingRun) {
76
+ throw new BadDataException(`An ${data.taskType === CodeFixTaskType.ImproveLogging
77
+ ? "improve-logging"
78
+ : "improve-tracing"} task is already queued or running for this service. Track its progress on the AI > Tasks page.`);
79
+ }
80
+ const taskContext = {
81
+ telemetryServiceId: data.telemetryServiceId.toString(),
82
+ serviceName: service.name || undefined,
83
+ };
84
+ return SubjectCodeFixRun.enqueueSubjectCodeFixRun({
85
+ projectId: data.projectId,
86
+ taskType: data.taskType,
87
+ userId: data.userId,
88
+ taskContext,
89
+ });
90
+ }
91
+ }
92
+ __decorate([
93
+ CaptureSpan(),
94
+ __metadata("design:type", Function),
95
+ __metadata("design:paramtypes", [Object]),
96
+ __metadata("design:returntype", Promise)
97
+ ], TelemetryImprovementTaskTrigger, "createTelemetryImprovementTask", null);
98
+ //# sourceMappingURL=TelemetryImprovementTaskTrigger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TelemetryImprovementTaskTrigger.js","sourceRoot":"","sources":["../../../../../../Server/Utils/AI/SRE/TelemetryImprovementTaskTrigger.ts"],"names":[],"mappings":";;;;;;;;;AACA,OAAO,eAAe,MAAM,sCAAsC,CAAC;AAEnE,OAAO,gBAAgB,MAAM,8CAA8C,CAAC;AAG5E,OAAO,cAAc,MAAM,kCAAkC,CAAC;AAC9D,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;AACpD,OAAO,WAAW,MAAM,6BAA6B,CAAC;AAEtD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,OAAO,OAAO,+BAA+B;IAClD;;;;;;;;;OASG;IAEiB,AAAb,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,IAKlD;;QACC,IACE,IAAI,CAAC,QAAQ,KAAK,eAAe,CAAC,cAAc;YAChD,IAAI,CAAC,QAAQ,KAAK,eAAe,CAAC,cAAc,EAChD,CAAC;YACD,MAAM,IAAI,gBAAgB,CACxB,cAAc,IAAI,CAAC,QAAQ,uDAAuD,eAAe,CAAC,cAAc,KAAK,eAAe,CAAC,cAAc,GAAG,CACvJ,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAmB,MAAM,cAAc,CAAC,WAAW,CAAC;YAC/D,EAAE,EAAE,IAAI,CAAC,kBAAkB;YAC3B,MAAM,EAAE;gBACN,GAAG,EAAE,IAAI;gBACT,IAAI,EAAE,IAAI;gBACV,SAAS,EAAE,IAAI;aAChB;YACD,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;SACxB,CAAC,CAAC;QAEH,IACE,CAAC,OAAO;YACR,CAAA,MAAA,OAAO,CAAC,SAAS,0CAAE,QAAQ,EAAE,MAAK,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,EAC3D,CAAC;YACD,MAAM,IAAI,gBAAgB,CAAC,8BAA8B,CAAC,CAAC;QAC7D,CAAC;QAED,gEAAgE;QAChE,MAAM,sBAAsB,GAC1B,MAAM,iBAAiB,CAAC,+BAA+B,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAE1E,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAC5B,MAAM,IAAI,gBAAgB,CACxB,0JAA0J,CAC3J,CAAC;QACJ,CAAC;QAED;;;WAGG;QACH,MAAM,WAAW,GACf,MAAM,iBAAiB,CAAC,qCAAqC,CAAC;YAC5D,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,kBAAkB,EAAE,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE;SACvD,CAAC,CAAC;QAEL,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,IAAI,gBAAgB,CACxB,MACE,IAAI,CAAC,QAAQ,KAAK,eAAe,CAAC,cAAc;gBAC9C,CAAC,CAAC,iBAAiB;gBACnB,CAAC,CAAC,iBACN,iGAAiG,CAClG,CAAC;QACJ,CAAC;QAED,MAAM,WAAW,GAAuB;YACtC,kBAAkB,EAAE,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE;YACtD,WAAW,EAAE,OAAO,CAAC,IAAI,IAAI,SAAS;SACvC,CAAC;QAEF,OAAO,iBAAiB,CAAC,wBAAwB,CAAC;YAChD,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,WAAW;SACZ,CAAC,CAAC;IACL,CAAC;CACF;AA3EqB;IADnB,WAAW,EAAE;;;;2EA2Eb"}
@@ -9,7 +9,8 @@ var __metadata = (this && this.__metadata) || function (k, v) {
9
9
  };
10
10
  import MonitorProbeService from "../../Services/MonitorProbeService";
11
11
  import MonitorService from "../../Services/MonitorService";
12
- import MonitorStatusTimelineService from "../../Services/MonitorStatusTimelineService";
12
+ import MonitorStatusTimelineService, { MONITOR_STATUS_SAME_AS_PREVIOUS_ERROR_MESSAGE, MONITOR_STATUS_TIMELINE_LOCK_ERROR_MESSAGE, } from "../../Services/MonitorStatusTimelineService";
13
+ import ServerException from "../../../Types/Exception/ServerException";
13
14
  import logger from "../Logger";
14
15
  import MonitorCriteriaEvaluator from "./MonitorCriteriaEvaluator";
15
16
  import MonitorLogUtil from "./MonitorLogUtil";
@@ -727,6 +728,14 @@ export default class MonitorResourceUtil {
727
728
  monitorStatusTimeline.statusChangeLog = JSON.parse(JSON.stringify(dataToProcess));
728
729
  monitorStatusTimeline.rootCause =
729
730
  "No monitoring criteria met. Change to default status. ";
731
+ /*
732
+ * Tracks whether the monitor really is at its default status after the
733
+ * create call, so the summary event below records only what actually
734
+ * happened. On the lock-skip path the write was REFUSED - recording a
735
+ * "reverted" event there would put a false entry in the monitor log and
736
+ * mask the very lock failure the error log surfaces.
737
+ */
738
+ let revertedToDefaultStatus = true;
730
739
  try {
731
740
  await MonitorStatusTimelineService.create({
732
741
  data: monitorStatusTimeline,
@@ -745,23 +754,36 @@ export default class MonitorResourceUtil {
745
754
  * exact message so unrelated BadDataExceptions still propagate.
746
755
  */
747
756
  if (err instanceof BadDataException &&
748
- err.message ===
749
- "Monitor Status cannot be same as previous status.") {
757
+ err.message === MONITOR_STATUS_SAME_AS_PREVIOUS_ERROR_MESSAGE) {
750
758
  logger.debug(`${dataToProcess.monitorId.toString()} - Monitor status already at default; skipping duplicate status timeline (concurrent race).`);
751
759
  }
760
+ else if (err instanceof ServerException &&
761
+ err.message === MONITOR_STATUS_TIMELINE_LOCK_ERROR_MESSAGE) {
762
+ /*
763
+ * The per-monitor timeline mutex could not be acquired (fail-closed
764
+ * create, see MonitorStatusTimelineService). Skipping is recoverable:
765
+ * the next probe result re-evaluates the same criteria and recreates
766
+ * the revert-to-default, while failing here would abort the whole
767
+ * ingest run and lose the monitor log for this probe result.
768
+ */
769
+ logger.error(`${dataToProcess.monitorId.toString()} - Could not acquire the monitor status timeline lock; skipping revert to default status. It will be retried on the next probe result.`);
770
+ revertedToDefaultStatus = false;
771
+ }
752
772
  else {
753
773
  throw err;
754
774
  }
755
775
  }
756
- const defaultStatusName = await getMonitorStatusName(monitorSteps.data.defaultMonitorStatusId);
757
- evaluationSummary.events.push({
758
- type: "monitor-status-changed",
759
- title: "Monitor status reverted",
760
- message: defaultStatusName
761
- ? `Monitor status reverted to "${defaultStatusName}" because no monitoring criteria were met.`
762
- : "Monitor status reverted to its default state because no monitoring criteria were met.",
763
- at: OneUptimeDate.getCurrentDate(),
764
- });
776
+ if (revertedToDefaultStatus) {
777
+ const defaultStatusName = await getMonitorStatusName(monitorSteps.data.defaultMonitorStatusId);
778
+ evaluationSummary.events.push({
779
+ type: "monitor-status-changed",
780
+ title: "Monitor status reverted",
781
+ message: defaultStatusName
782
+ ? `Monitor status reverted to "${defaultStatusName}" because no monitoring criteria were met.`
783
+ : "Monitor status reverted to its default state because no monitoring criteria were met.",
784
+ at: OneUptimeDate.getCurrentDate(),
785
+ });
786
+ }
765
787
  }
766
788
  }
767
789
  await releaseMutex();