@oneuptime/common 9.2.16 → 9.2.17
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/CodeRepository.ts +664 -0
- package/Models/DatabaseModels/Index.ts +8 -0
- package/Models/DatabaseModels/LlmLog.ts +818 -0
- package/Models/DatabaseModels/LlmProvider.ts +21 -0
- package/Models/DatabaseModels/Project.ts +206 -0
- package/Models/DatabaseModels/ServiceCatalogCodeRepository.ts +549 -0
- package/Server/API/AIBillingAPI.ts +126 -0
- package/Server/API/GitHubAPI.ts +360 -0
- package/Server/API/IncidentAPI.ts +126 -0
- package/Server/EnvironmentConfig.ts +44 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1765580181582-MigrationName.ts +79 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1765633554715-MigrationName.ts +75 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1765801357168-MigrationName.ts +32 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1765810218488-MigrationName.ts +69 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1765830758857-MigrationName.ts +111 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1765834537501-MigrationName.ts +39 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +12 -0
- package/Server/Services/AIBillingService.ts +247 -0
- package/Server/Services/AIService.ts +239 -0
- package/Server/Services/CodeRepositoryService.ts +10 -0
- package/Server/Services/IncidentService.ts +89 -0
- package/Server/Services/Index.ts +2 -0
- package/Server/Services/LlmLogService.ts +14 -0
- package/Server/Services/LlmProviderService.ts +58 -0
- package/Server/Services/ServiceCatalogCodeRepositoryService.ts +55 -0
- package/Server/Utils/AI/IncidentAIContextBuilder.ts +498 -0
- package/Server/Utils/CodeRepository/GitHub/GitHub.ts +226 -0
- package/Server/Utils/LLM/LLMService.ts +276 -0
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +166 -0
- package/Server/Utils/Workspace/Slack/Slack.ts +134 -0
- package/Server/Utils/Workspace/Workspace.ts +126 -0
- package/Types/CodeRepository/CodeRepositoryType.ts +1 -1
- package/Types/LlmLogStatus.ts +7 -0
- package/Types/Permission.ts +87 -0
- package/Types/ServiceCatalog/CodeRepositoryImprovementAction.ts +9 -0
- package/UI/Components/AI/AILoader.tsx +95 -0
- package/UI/Components/AI/GenerateFromAIModal.tsx +295 -0
- package/UI/Components/Modal/Modal.tsx +6 -1
- package/build/dist/Models/DatabaseModels/CodeRepository.js +689 -0
- package/build/dist/Models/DatabaseModels/CodeRepository.js.map +1 -0
- package/build/dist/Models/DatabaseModels/Index.js +7 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/LlmLog.js +856 -0
- package/build/dist/Models/DatabaseModels/LlmLog.js.map +1 -0
- package/build/dist/Models/DatabaseModels/LlmProvider.js +22 -0
- package/build/dist/Models/DatabaseModels/LlmProvider.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Project.js +220 -0
- package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceCatalogCodeRepository.js +565 -0
- package/build/dist/Models/DatabaseModels/ServiceCatalogCodeRepository.js.map +1 -0
- package/build/dist/Server/API/AIBillingAPI.js +58 -0
- package/build/dist/Server/API/AIBillingAPI.js.map +1 -0
- package/build/dist/Server/API/GitHubAPI.js +207 -0
- package/build/dist/Server/API/GitHubAPI.js.map +1 -0
- package/build/dist/Server/API/IncidentAPI.js +84 -1
- package/build/dist/Server/API/IncidentAPI.js.map +1 -1
- package/build/dist/Server/EnvironmentConfig.js +31 -0
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1765580181582-MigrationName.js +34 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1765580181582-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1765633554715-MigrationName.js +32 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1765633554715-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1765801357168-MigrationName.js +38 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1765801357168-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1765810218488-MigrationName.js +30 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1765810218488-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1765830758857-MigrationName.js +44 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1765830758857-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1765834537501-MigrationName.js +22 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1765834537501-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +12 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Services/AIBillingService.js +187 -0
- package/build/dist/Server/Services/AIBillingService.js.map +1 -0
- package/build/dist/Server/Services/AIService.js +185 -0
- package/build/dist/Server/Services/AIService.js.map +1 -0
- package/build/dist/Server/Services/CodeRepositoryService.js +9 -0
- package/build/dist/Server/Services/CodeRepositoryService.js.map +1 -0
- package/build/dist/Server/Services/IncidentService.js +61 -0
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +2 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/LlmLogService.js +13 -0
- package/build/dist/Server/Services/LlmLogService.js.map +1 -0
- package/build/dist/Server/Services/LlmProviderService.js +65 -0
- package/build/dist/Server/Services/LlmProviderService.js.map +1 -1
- package/build/dist/Server/Services/ServiceCatalogCodeRepositoryService.js +54 -0
- package/build/dist/Server/Services/ServiceCatalogCodeRepositoryService.js.map +1 -0
- package/build/dist/Server/Utils/AI/IncidentAIContextBuilder.js +408 -0
- package/build/dist/Server/Utils/AI/IncidentAIContextBuilder.js.map +1 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js +163 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js.map +1 -1
- package/build/dist/Server/Utils/LLM/LLMService.js +225 -0
- package/build/dist/Server/Utils/LLM/LLMService.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +110 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/Slack.js +89 -0
- package/build/dist/Server/Utils/Workspace/Slack/Slack.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Workspace.js +80 -0
- package/build/dist/Server/Utils/Workspace/Workspace.js.map +1 -1
- package/build/dist/Types/CodeRepository/CodeRepositoryType.js +1 -1
- package/build/dist/Types/CodeRepository/CodeRepositoryType.js.map +1 -1
- package/build/dist/Types/LlmLogStatus.js +8 -0
- package/build/dist/Types/LlmLogStatus.js.map +1 -0
- package/build/dist/Types/Permission.js +74 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/ServiceCatalog/CodeRepositoryImprovementAction.js +10 -0
- package/build/dist/Types/ServiceCatalog/CodeRepositoryImprovementAction.js.map +1 -0
- package/build/dist/UI/Components/AI/AILoader.js +64 -0
- package/build/dist/UI/Components/AI/AILoader.js.map +1 -0
- package/build/dist/UI/Components/AI/GenerateFromAIModal.js +207 -0
- package/build/dist/UI/Components/AI/GenerateFromAIModal.js.map +1 -0
- package/build/dist/UI/Components/Modal/Modal.js +6 -1
- package/build/dist/UI/Components/Modal/Modal.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,408 @@
|
|
|
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 IncidentService from "../../Services/IncidentService";
|
|
11
|
+
import IncidentStateTimelineService from "../../Services/IncidentStateTimelineService";
|
|
12
|
+
import IncidentInternalNoteService from "../../Services/IncidentInternalNoteService";
|
|
13
|
+
import IncidentPublicNoteService from "../../Services/IncidentPublicNoteService";
|
|
14
|
+
import WorkspaceUtil from "../Workspace/Workspace";
|
|
15
|
+
import WorkspaceProjectAuthTokenService from "../../Services/WorkspaceProjectAuthTokenService";
|
|
16
|
+
import logger from "../Logger";
|
|
17
|
+
import CaptureSpan from "../Telemetry/CaptureSpan";
|
|
18
|
+
import OneUptimeDate from "../../../Types/Date";
|
|
19
|
+
import SortOrder from "../../../Types/BaseDatabase/SortOrder";
|
|
20
|
+
export default class IncidentAIContextBuilder {
|
|
21
|
+
static async buildIncidentContext(data) {
|
|
22
|
+
const incident = await IncidentService.findOneById({
|
|
23
|
+
id: data.incidentId,
|
|
24
|
+
select: {
|
|
25
|
+
_id: true,
|
|
26
|
+
title: true,
|
|
27
|
+
description: true,
|
|
28
|
+
createdAt: true,
|
|
29
|
+
postmortemNote: true,
|
|
30
|
+
remediationNotes: true,
|
|
31
|
+
rootCause: true,
|
|
32
|
+
customFields: true,
|
|
33
|
+
projectId: true,
|
|
34
|
+
incidentSeverity: {
|
|
35
|
+
name: true,
|
|
36
|
+
color: true,
|
|
37
|
+
},
|
|
38
|
+
currentIncidentState: {
|
|
39
|
+
name: true,
|
|
40
|
+
color: true,
|
|
41
|
+
},
|
|
42
|
+
monitors: {
|
|
43
|
+
name: true,
|
|
44
|
+
},
|
|
45
|
+
labels: {
|
|
46
|
+
name: true,
|
|
47
|
+
color: true,
|
|
48
|
+
},
|
|
49
|
+
postUpdatesToWorkspaceChannels: true,
|
|
50
|
+
},
|
|
51
|
+
props: {
|
|
52
|
+
isRoot: true,
|
|
53
|
+
},
|
|
54
|
+
});
|
|
55
|
+
if (!incident) {
|
|
56
|
+
throw new Error("Incident not found");
|
|
57
|
+
}
|
|
58
|
+
// Fetch state timeline
|
|
59
|
+
const stateTimeline = await IncidentStateTimelineService.findBy({
|
|
60
|
+
query: {
|
|
61
|
+
incidentId: data.incidentId,
|
|
62
|
+
},
|
|
63
|
+
select: {
|
|
64
|
+
_id: true,
|
|
65
|
+
createdAt: true,
|
|
66
|
+
startsAt: true,
|
|
67
|
+
endsAt: true,
|
|
68
|
+
rootCause: true,
|
|
69
|
+
incidentState: {
|
|
70
|
+
name: true,
|
|
71
|
+
color: true,
|
|
72
|
+
},
|
|
73
|
+
createdByUser: {
|
|
74
|
+
name: true,
|
|
75
|
+
email: true,
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
sort: {
|
|
79
|
+
startsAt: SortOrder.Ascending,
|
|
80
|
+
},
|
|
81
|
+
limit: 100,
|
|
82
|
+
skip: 0,
|
|
83
|
+
props: {
|
|
84
|
+
isRoot: true,
|
|
85
|
+
},
|
|
86
|
+
});
|
|
87
|
+
// Fetch internal notes
|
|
88
|
+
const internalNotes = await IncidentInternalNoteService.findBy({
|
|
89
|
+
query: {
|
|
90
|
+
incidentId: data.incidentId,
|
|
91
|
+
},
|
|
92
|
+
select: {
|
|
93
|
+
_id: true,
|
|
94
|
+
note: true,
|
|
95
|
+
createdAt: true,
|
|
96
|
+
createdByUser: {
|
|
97
|
+
name: true,
|
|
98
|
+
email: true,
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
sort: {
|
|
102
|
+
createdAt: SortOrder.Ascending,
|
|
103
|
+
},
|
|
104
|
+
limit: 100,
|
|
105
|
+
skip: 0,
|
|
106
|
+
props: {
|
|
107
|
+
isRoot: true,
|
|
108
|
+
},
|
|
109
|
+
});
|
|
110
|
+
// Fetch public notes
|
|
111
|
+
const publicNotes = await IncidentPublicNoteService.findBy({
|
|
112
|
+
query: {
|
|
113
|
+
incidentId: data.incidentId,
|
|
114
|
+
},
|
|
115
|
+
select: {
|
|
116
|
+
_id: true,
|
|
117
|
+
note: true,
|
|
118
|
+
createdAt: true,
|
|
119
|
+
postedAt: true,
|
|
120
|
+
createdByUser: {
|
|
121
|
+
name: true,
|
|
122
|
+
email: true,
|
|
123
|
+
},
|
|
124
|
+
},
|
|
125
|
+
sort: {
|
|
126
|
+
createdAt: SortOrder.Ascending,
|
|
127
|
+
},
|
|
128
|
+
limit: 100,
|
|
129
|
+
skip: 0,
|
|
130
|
+
props: {
|
|
131
|
+
isRoot: true,
|
|
132
|
+
},
|
|
133
|
+
});
|
|
134
|
+
// Fetch workspace messages if requested and channels exist
|
|
135
|
+
let workspaceMessages = [];
|
|
136
|
+
const workspaceChannels = incident.postUpdatesToWorkspaceChannels;
|
|
137
|
+
if (data.includeWorkspaceMessages &&
|
|
138
|
+
workspaceChannels &&
|
|
139
|
+
workspaceChannels.length > 0 &&
|
|
140
|
+
incident.projectId) {
|
|
141
|
+
try {
|
|
142
|
+
const fetchParams = {
|
|
143
|
+
projectId: incident.projectId,
|
|
144
|
+
workspaceChannels: workspaceChannels,
|
|
145
|
+
limit: data.workspaceMessageLimit || 500,
|
|
146
|
+
};
|
|
147
|
+
if (incident.createdAt) {
|
|
148
|
+
fetchParams.oldestTimestamp = incident.createdAt;
|
|
149
|
+
}
|
|
150
|
+
workspaceMessages =
|
|
151
|
+
await this.getWorkspaceMessagesForIncident(fetchParams);
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
logger.error(`Error fetching workspace messages: ${error}`);
|
|
155
|
+
// Continue without workspace messages
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return {
|
|
159
|
+
incident,
|
|
160
|
+
stateTimeline,
|
|
161
|
+
internalNotes,
|
|
162
|
+
publicNotes,
|
|
163
|
+
workspaceMessages,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
static formatIncidentContextForPostmortem(contextData, template) {
|
|
167
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r;
|
|
168
|
+
const { incident, stateTimeline, internalNotes, publicNotes, workspaceMessages, } = contextData;
|
|
169
|
+
let contextText = "";
|
|
170
|
+
// Basic incident information
|
|
171
|
+
contextText += "# Incident Information\n\n";
|
|
172
|
+
contextText += `**Title:** ${incident.title || "N/A"}\n\n`;
|
|
173
|
+
contextText += `**Description:** ${incident.description || "N/A"}\n\n`;
|
|
174
|
+
contextText += `**Severity:** ${((_a = incident.incidentSeverity) === null || _a === void 0 ? void 0 : _a.name) || "N/A"}\n\n`;
|
|
175
|
+
contextText += `**Current State:** ${((_b = incident.currentIncidentState) === null || _b === void 0 ? void 0 : _b.name) || "N/A"}\n\n`;
|
|
176
|
+
contextText += `**Created At:** ${incident.createdAt ? OneUptimeDate.getDateAsFormattedString(incident.createdAt) : "N/A"}\n\n`;
|
|
177
|
+
// Affected monitors
|
|
178
|
+
if (incident.monitors && incident.monitors.length > 0) {
|
|
179
|
+
contextText += "**Affected Monitors:** ";
|
|
180
|
+
contextText += incident.monitors
|
|
181
|
+
.map((m) => {
|
|
182
|
+
return m.name;
|
|
183
|
+
})
|
|
184
|
+
.join(", ");
|
|
185
|
+
contextText += "\n\n";
|
|
186
|
+
}
|
|
187
|
+
// Labels
|
|
188
|
+
if (incident.labels && incident.labels.length > 0) {
|
|
189
|
+
contextText += "**Labels:** ";
|
|
190
|
+
contextText += incident.labels
|
|
191
|
+
.map((l) => {
|
|
192
|
+
return l.name;
|
|
193
|
+
})
|
|
194
|
+
.join(", ");
|
|
195
|
+
contextText += "\n\n";
|
|
196
|
+
}
|
|
197
|
+
// Root cause if available
|
|
198
|
+
if (incident.rootCause) {
|
|
199
|
+
contextText += `**Root Cause:** ${incident.rootCause}\n\n`;
|
|
200
|
+
}
|
|
201
|
+
// Remediation notes if available
|
|
202
|
+
if (incident.remediationNotes) {
|
|
203
|
+
contextText += `**Remediation Notes:** ${incident.remediationNotes}\n\n`;
|
|
204
|
+
}
|
|
205
|
+
// State timeline
|
|
206
|
+
if (stateTimeline.length > 0) {
|
|
207
|
+
contextText += "# State Timeline\n\n";
|
|
208
|
+
for (const timeline of stateTimeline) {
|
|
209
|
+
const startTime = timeline.startsAt
|
|
210
|
+
? OneUptimeDate.getDateAsFormattedString(timeline.startsAt)
|
|
211
|
+
: "N/A";
|
|
212
|
+
const stateName = ((_d = (_c = timeline.incidentState) === null || _c === void 0 ? void 0 : _c.name) === null || _d === void 0 ? void 0 : _d.toString()) || "Unknown";
|
|
213
|
+
const createdBy = ((_f = (_e = timeline.createdByUser) === null || _e === void 0 ? void 0 : _e.name) === null || _f === void 0 ? void 0 : _f.toString()) ||
|
|
214
|
+
((_h = (_g = timeline.createdByUser) === null || _g === void 0 ? void 0 : _g.email) === null || _h === void 0 ? void 0 : _h.toString()) ||
|
|
215
|
+
"System";
|
|
216
|
+
contextText += `- **${startTime}**: State changed to **${stateName}** by ${createdBy}\n`;
|
|
217
|
+
if (timeline.rootCause) {
|
|
218
|
+
contextText += ` - Root cause noted: ${timeline.rootCause}\n`;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
contextText += "\n";
|
|
222
|
+
}
|
|
223
|
+
// Internal notes
|
|
224
|
+
if (internalNotes.length > 0) {
|
|
225
|
+
contextText += "# Internal Notes (Private)\n\n";
|
|
226
|
+
for (const note of internalNotes) {
|
|
227
|
+
const noteTime = note.createdAt
|
|
228
|
+
? OneUptimeDate.getDateAsFormattedString(note.createdAt)
|
|
229
|
+
: "N/A";
|
|
230
|
+
const createdBy = ((_k = (_j = note.createdByUser) === null || _j === void 0 ? void 0 : _j.name) === null || _k === void 0 ? void 0 : _k.toString()) ||
|
|
231
|
+
((_m = (_l = note.createdByUser) === null || _l === void 0 ? void 0 : _l.email) === null || _m === void 0 ? void 0 : _m.toString()) ||
|
|
232
|
+
"Unknown";
|
|
233
|
+
contextText += `**[${noteTime}] ${createdBy}:**\n`;
|
|
234
|
+
contextText += `${note.note || "N/A"}\n\n`;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
// Public notes
|
|
238
|
+
if (publicNotes.length > 0) {
|
|
239
|
+
contextText += "# Public Notes\n\n";
|
|
240
|
+
for (const note of publicNotes) {
|
|
241
|
+
const noteTime = note.postedAt
|
|
242
|
+
? OneUptimeDate.getDateAsFormattedString(note.postedAt)
|
|
243
|
+
: note.createdAt
|
|
244
|
+
? OneUptimeDate.getDateAsFormattedString(note.createdAt)
|
|
245
|
+
: "N/A";
|
|
246
|
+
const createdBy = ((_p = (_o = note.createdByUser) === null || _o === void 0 ? void 0 : _o.name) === null || _p === void 0 ? void 0 : _p.toString()) ||
|
|
247
|
+
((_r = (_q = note.createdByUser) === null || _q === void 0 ? void 0 : _q.email) === null || _r === void 0 ? void 0 : _r.toString()) ||
|
|
248
|
+
"Unknown";
|
|
249
|
+
contextText += `**[${noteTime}] ${createdBy}:**\n`;
|
|
250
|
+
contextText += `${note.note || "N/A"}\n\n`;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
// Workspace messages (Slack/Teams)
|
|
254
|
+
if (workspaceMessages.length > 0) {
|
|
255
|
+
contextText += "# Discussion from Incident Channel\n\n";
|
|
256
|
+
contextText += WorkspaceUtil.formatMessagesAsContext(workspaceMessages, {
|
|
257
|
+
includeTimestamp: true,
|
|
258
|
+
includeUsername: true,
|
|
259
|
+
maxLength: 30000,
|
|
260
|
+
});
|
|
261
|
+
contextText += "\n\n";
|
|
262
|
+
}
|
|
263
|
+
// System prompt for postmortem generation
|
|
264
|
+
let systemPrompt;
|
|
265
|
+
if (template) {
|
|
266
|
+
// When a template is provided, strictly fill only the template
|
|
267
|
+
systemPrompt = `You are an expert Site Reliability Engineer (SRE) and incident response specialist. Your task is to fill in an incident postmortem template based on the provided incident data.
|
|
268
|
+
|
|
269
|
+
CRITICAL INSTRUCTIONS:
|
|
270
|
+
- You MUST use ONLY the exact template structure provided below
|
|
271
|
+
- Fill in each section of the template with relevant information from the incident data
|
|
272
|
+
- Do NOT add any new sections, headers, or content that is not part of the template
|
|
273
|
+
- Do NOT add introductions, conclusions, or any text outside the template structure
|
|
274
|
+
- If a section in the template has no relevant data, write "No data available" or leave the placeholder text
|
|
275
|
+
- Be blameless - focus on systemic improvements rather than individual blame
|
|
276
|
+
- Write in a professional, clear, and concise manner
|
|
277
|
+
|
|
278
|
+
TEMPLATE TO FILL (use this exact structure):
|
|
279
|
+
|
|
280
|
+
${template}`;
|
|
281
|
+
}
|
|
282
|
+
else {
|
|
283
|
+
// When no template is provided, use standard format
|
|
284
|
+
systemPrompt = `You are an expert Site Reliability Engineer (SRE) and incident response specialist. Your task is to generate a comprehensive, well-structured incident postmortem based on the provided incident data.
|
|
285
|
+
|
|
286
|
+
The postmortem should:
|
|
287
|
+
1. Be written in a blameless manner, focusing on systemic improvements rather than individual blame
|
|
288
|
+
2. Include a clear executive summary
|
|
289
|
+
3. Provide a detailed timeline of events
|
|
290
|
+
4. Identify the root cause(s) and contributing factors
|
|
291
|
+
5. Outline the impact on users and systems
|
|
292
|
+
6. List actionable items to prevent recurrence
|
|
293
|
+
7. Include lessons learned
|
|
294
|
+
|
|
295
|
+
Use a standard incident postmortem format with sections for: Executive Summary, Timeline, Root Cause Analysis, Impact, Action Items, and Lessons Learned.
|
|
296
|
+
|
|
297
|
+
Write in a professional, clear, and concise manner. Use markdown formatting for better readability.`;
|
|
298
|
+
}
|
|
299
|
+
// Build user message based on whether template is provided
|
|
300
|
+
const userMessage = template
|
|
301
|
+
? `Fill in the template above using ONLY the following incident data. Output only the filled template, nothing else:\n\n${contextText}`
|
|
302
|
+
: `Based on the following incident data, please generate a comprehensive incident postmortem:\n\n${contextText}`;
|
|
303
|
+
// Build messages array
|
|
304
|
+
const messages = [
|
|
305
|
+
{
|
|
306
|
+
role: "system",
|
|
307
|
+
content: systemPrompt,
|
|
308
|
+
},
|
|
309
|
+
{
|
|
310
|
+
role: "user",
|
|
311
|
+
content: userMessage,
|
|
312
|
+
},
|
|
313
|
+
];
|
|
314
|
+
return {
|
|
315
|
+
contextText,
|
|
316
|
+
systemPrompt,
|
|
317
|
+
messages,
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
static buildGenericAIContext(data) {
|
|
321
|
+
let userContent = data.userPrompt;
|
|
322
|
+
if (data.context) {
|
|
323
|
+
userContent = `${data.userPrompt}\n\nContext:\n${data.context}`;
|
|
324
|
+
}
|
|
325
|
+
const messages = [
|
|
326
|
+
{
|
|
327
|
+
role: "system",
|
|
328
|
+
content: data.systemPrompt,
|
|
329
|
+
},
|
|
330
|
+
{
|
|
331
|
+
role: "user",
|
|
332
|
+
content: userContent,
|
|
333
|
+
},
|
|
334
|
+
];
|
|
335
|
+
return {
|
|
336
|
+
contextText: data.context || "",
|
|
337
|
+
systemPrompt: data.systemPrompt,
|
|
338
|
+
messages,
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
static async getWorkspaceMessagesForIncident(data) {
|
|
342
|
+
const allMessages = [];
|
|
343
|
+
for (const channel of data.workspaceChannels) {
|
|
344
|
+
try {
|
|
345
|
+
// Get auth token for this workspace type
|
|
346
|
+
const projectAuth = await WorkspaceProjectAuthTokenService.getProjectAuth({
|
|
347
|
+
projectId: data.projectId,
|
|
348
|
+
workspaceType: channel.workspaceType,
|
|
349
|
+
});
|
|
350
|
+
if (!projectAuth || !projectAuth.authToken) {
|
|
351
|
+
logger.debug(`No auth token found for workspace type: ${channel.workspaceType}`);
|
|
352
|
+
continue;
|
|
353
|
+
}
|
|
354
|
+
const messagesParams = {
|
|
355
|
+
channelId: channel.id,
|
|
356
|
+
authToken: projectAuth.authToken,
|
|
357
|
+
projectId: data.projectId,
|
|
358
|
+
workspaceType: channel.workspaceType,
|
|
359
|
+
};
|
|
360
|
+
if (channel.teamId) {
|
|
361
|
+
messagesParams.teamId = channel.teamId;
|
|
362
|
+
}
|
|
363
|
+
if (data.limit !== undefined) {
|
|
364
|
+
messagesParams.limit = data.limit;
|
|
365
|
+
}
|
|
366
|
+
if (data.oldestTimestamp) {
|
|
367
|
+
messagesParams.oldestTimestamp = data.oldestTimestamp;
|
|
368
|
+
}
|
|
369
|
+
const messages = await WorkspaceUtil.getChannelMessages(messagesParams);
|
|
370
|
+
allMessages.push(...messages);
|
|
371
|
+
}
|
|
372
|
+
catch (error) {
|
|
373
|
+
logger.error(`Error fetching messages from channel ${channel.id}: ${error}`);
|
|
374
|
+
// Continue with other channels even if one fails
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
// Sort all messages by timestamp
|
|
378
|
+
allMessages.sort((a, b) => {
|
|
379
|
+
return a.timestamp.getTime() - b.timestamp.getTime();
|
|
380
|
+
});
|
|
381
|
+
return allMessages;
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
__decorate([
|
|
385
|
+
CaptureSpan(),
|
|
386
|
+
__metadata("design:type", Function),
|
|
387
|
+
__metadata("design:paramtypes", [Object]),
|
|
388
|
+
__metadata("design:returntype", Promise)
|
|
389
|
+
], IncidentAIContextBuilder, "buildIncidentContext", null);
|
|
390
|
+
__decorate([
|
|
391
|
+
CaptureSpan(),
|
|
392
|
+
__metadata("design:type", Function),
|
|
393
|
+
__metadata("design:paramtypes", [Object, String]),
|
|
394
|
+
__metadata("design:returntype", Object)
|
|
395
|
+
], IncidentAIContextBuilder, "formatIncidentContextForPostmortem", null);
|
|
396
|
+
__decorate([
|
|
397
|
+
CaptureSpan(),
|
|
398
|
+
__metadata("design:type", Function),
|
|
399
|
+
__metadata("design:paramtypes", [Object]),
|
|
400
|
+
__metadata("design:returntype", Object)
|
|
401
|
+
], IncidentAIContextBuilder, "buildGenericAIContext", null);
|
|
402
|
+
__decorate([
|
|
403
|
+
CaptureSpan(),
|
|
404
|
+
__metadata("design:type", Function),
|
|
405
|
+
__metadata("design:paramtypes", [Object]),
|
|
406
|
+
__metadata("design:returntype", Promise)
|
|
407
|
+
], IncidentAIContextBuilder, "getWorkspaceMessagesForIncident", null);
|
|
408
|
+
//# sourceMappingURL=IncidentAIContextBuilder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IncidentAIContextBuilder.js","sourceRoot":"","sources":["../../../../../Server/Utils/AI/IncidentAIContextBuilder.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,6 +16,9 @@ import PullRequestState from "../../../../Types/CodeRepository/PullRequestState"
|
|
|
16
16
|
import OneUptimeDate from "../../../../Types/Date";
|
|
17
17
|
import API from "../../../../Utils/API";
|
|
18
18
|
import CaptureSpan from "../../Telemetry/CaptureSpan";
|
|
19
|
+
import { GitHubAppId, GitHubAppPrivateKey, GitHubAppWebhookSecret, } from "../../../EnvironmentConfig";
|
|
20
|
+
import BadDataException from "../../../../Types/Exception/BadDataException";
|
|
21
|
+
import * as crypto from "crypto";
|
|
19
22
|
export default class GitHubUtil extends HostedCodeRepository {
|
|
20
23
|
getPullRequestFromJSONObject(data) {
|
|
21
24
|
let pullRequestState = data.pullRequest["state"] === "open"
|
|
@@ -165,6 +168,148 @@ export default class GitHubUtil extends HostedCodeRepository {
|
|
|
165
168
|
repositoryName: data.repositoryName,
|
|
166
169
|
});
|
|
167
170
|
}
|
|
171
|
+
// GitHub App Authentication Methods
|
|
172
|
+
/**
|
|
173
|
+
* Generates a JWT for GitHub App authentication
|
|
174
|
+
* @returns JWT string valid for 10 minutes
|
|
175
|
+
*/
|
|
176
|
+
static generateAppJWT() {
|
|
177
|
+
if (!GitHubAppId) {
|
|
178
|
+
throw new BadDataException("GITHUB_APP_ID environment variable is not set");
|
|
179
|
+
}
|
|
180
|
+
if (!GitHubAppPrivateKey) {
|
|
181
|
+
throw new BadDataException("GITHUB_APP_PRIVATE_KEY environment variable is not set");
|
|
182
|
+
}
|
|
183
|
+
const now = Math.floor(Date.now() / 1000);
|
|
184
|
+
const payload = {
|
|
185
|
+
iat: now - 60, // Issued at time (60 seconds in the past to allow for clock drift)
|
|
186
|
+
exp: now + 600, // Expiration time (10 minutes from now)
|
|
187
|
+
iss: GitHubAppId,
|
|
188
|
+
};
|
|
189
|
+
// Create JWT header
|
|
190
|
+
const header = {
|
|
191
|
+
alg: "RS256",
|
|
192
|
+
typ: "JWT",
|
|
193
|
+
};
|
|
194
|
+
const encodedHeader = Buffer.from(JSON.stringify(header)).toString("base64url");
|
|
195
|
+
const encodedPayload = Buffer.from(JSON.stringify(payload)).toString("base64url");
|
|
196
|
+
const signatureInput = `${encodedHeader}.${encodedPayload}`;
|
|
197
|
+
// Sign with private key
|
|
198
|
+
const sign = crypto.createSign("RSA-SHA256");
|
|
199
|
+
sign.update(signatureInput);
|
|
200
|
+
const signature = sign.sign(GitHubAppPrivateKey, "base64url");
|
|
201
|
+
return `${signatureInput}.${signature}`;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Gets an installation access token for a GitHub App installation
|
|
205
|
+
* @param installationId - The GitHub App installation ID
|
|
206
|
+
* @returns Installation token and expiration date
|
|
207
|
+
*/
|
|
208
|
+
static async getInstallationAccessToken(installationId) {
|
|
209
|
+
const jwt = GitHubUtil.generateAppJWT();
|
|
210
|
+
const url = URL.fromString(`https://api.github.com/app/installations/${installationId}/access_tokens`);
|
|
211
|
+
const result = await API.post({
|
|
212
|
+
url: url,
|
|
213
|
+
data: {},
|
|
214
|
+
headers: {
|
|
215
|
+
Authorization: `Bearer ${jwt}`,
|
|
216
|
+
Accept: "application/vnd.github+json",
|
|
217
|
+
"X-GitHub-Api-Version": "2022-11-28",
|
|
218
|
+
},
|
|
219
|
+
});
|
|
220
|
+
if (result instanceof HTTPErrorResponse) {
|
|
221
|
+
throw result;
|
|
222
|
+
}
|
|
223
|
+
return {
|
|
224
|
+
token: result.data["token"],
|
|
225
|
+
expiresAt: OneUptimeDate.fromString(result.data["expires_at"]),
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Lists repositories accessible to a GitHub App installation
|
|
230
|
+
* @param installationId - The GitHub App installation ID
|
|
231
|
+
* @returns Array of repositories
|
|
232
|
+
*/
|
|
233
|
+
static async listRepositoriesForInstallation(installationId) {
|
|
234
|
+
const tokenData = await GitHubUtil.getInstallationAccessToken(installationId);
|
|
235
|
+
const allRepositories = [];
|
|
236
|
+
let page = 1;
|
|
237
|
+
let hasMore = true;
|
|
238
|
+
while (hasMore) {
|
|
239
|
+
const url = URL.fromString(`https://api.github.com/installation/repositories?per_page=100&page=${page}`);
|
|
240
|
+
const result = await API.get({
|
|
241
|
+
url: url,
|
|
242
|
+
data: {},
|
|
243
|
+
headers: {
|
|
244
|
+
Authorization: `Bearer ${tokenData.token}`,
|
|
245
|
+
Accept: "application/vnd.github+json",
|
|
246
|
+
"X-GitHub-Api-Version": "2022-11-28",
|
|
247
|
+
},
|
|
248
|
+
});
|
|
249
|
+
if (result instanceof HTTPErrorResponse) {
|
|
250
|
+
throw result;
|
|
251
|
+
}
|
|
252
|
+
const repositories = result.data["repositories"] || [];
|
|
253
|
+
for (const repo of repositories) {
|
|
254
|
+
const repoData = repo;
|
|
255
|
+
const owner = repoData["owner"];
|
|
256
|
+
allRepositories.push({
|
|
257
|
+
id: repoData["id"],
|
|
258
|
+
name: repoData["name"],
|
|
259
|
+
fullName: repoData["full_name"],
|
|
260
|
+
private: repoData["private"],
|
|
261
|
+
htmlUrl: repoData["html_url"],
|
|
262
|
+
description: repoData["description"] || null,
|
|
263
|
+
defaultBranch: repoData["default_branch"],
|
|
264
|
+
ownerLogin: owner["login"],
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
// Check if there are more pages
|
|
268
|
+
if (repositories.length < 100) {
|
|
269
|
+
hasMore = false;
|
|
270
|
+
}
|
|
271
|
+
else {
|
|
272
|
+
page++;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
return allRepositories;
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Verifies a GitHub webhook signature
|
|
279
|
+
* @param payload - The raw request body
|
|
280
|
+
* @param signature - The X-Hub-Signature-256 header value
|
|
281
|
+
* @returns true if signature is valid
|
|
282
|
+
*/
|
|
283
|
+
static verifyWebhookSignature(payload, signature) {
|
|
284
|
+
if (!GitHubAppWebhookSecret) {
|
|
285
|
+
logger.warn("GITHUB_APP_WEBHOOK_SECRET is not set, skipping verification");
|
|
286
|
+
return true;
|
|
287
|
+
}
|
|
288
|
+
const expectedSignature = `sha256=${crypto
|
|
289
|
+
.createHmac("sha256", GitHubAppWebhookSecret)
|
|
290
|
+
.update(payload)
|
|
291
|
+
.digest("hex")}`;
|
|
292
|
+
try {
|
|
293
|
+
return crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expectedSignature));
|
|
294
|
+
}
|
|
295
|
+
catch (_a) {
|
|
296
|
+
return false;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Gets the GitHub App installation URL for a project to install the app
|
|
301
|
+
* @returns The installation URL
|
|
302
|
+
*/
|
|
303
|
+
static getAppInstallationUrl() {
|
|
304
|
+
if (!GitHubAppId) {
|
|
305
|
+
throw new BadDataException("GITHUB_APP_ID environment variable is not set");
|
|
306
|
+
}
|
|
307
|
+
/*
|
|
308
|
+
* This is the standard GitHub App installation URL format
|
|
309
|
+
* The app slug would typically come from another env var, but we can use the client ID approach
|
|
310
|
+
*/
|
|
311
|
+
return `https://github.com/apps`;
|
|
312
|
+
}
|
|
168
313
|
}
|
|
169
314
|
__decorate([
|
|
170
315
|
CaptureSpan(),
|
|
@@ -196,4 +341,22 @@ __decorate([
|
|
|
196
341
|
__metadata("design:paramtypes", [Object]),
|
|
197
342
|
__metadata("design:returntype", Promise)
|
|
198
343
|
], GitHubUtil.prototype, "createPullRequest", null);
|
|
344
|
+
__decorate([
|
|
345
|
+
CaptureSpan(),
|
|
346
|
+
__metadata("design:type", Function),
|
|
347
|
+
__metadata("design:paramtypes", []),
|
|
348
|
+
__metadata("design:returntype", String)
|
|
349
|
+
], GitHubUtil, "generateAppJWT", null);
|
|
350
|
+
__decorate([
|
|
351
|
+
CaptureSpan(),
|
|
352
|
+
__metadata("design:type", Function),
|
|
353
|
+
__metadata("design:paramtypes", [String]),
|
|
354
|
+
__metadata("design:returntype", Promise)
|
|
355
|
+
], GitHubUtil, "getInstallationAccessToken", null);
|
|
356
|
+
__decorate([
|
|
357
|
+
CaptureSpan(),
|
|
358
|
+
__metadata("design:type", Function),
|
|
359
|
+
__metadata("design:paramtypes", [String]),
|
|
360
|
+
__metadata("design:returntype", Promise)
|
|
361
|
+
], GitHubUtil, "listRepositoriesForInstallation", null);
|
|
199
362
|
//# sourceMappingURL=GitHub.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GitHub.js","sourceRoot":"","sources":["../../../../../../Server/Utils/CodeRepository/GitHub/GitHub.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,OAAO,MAAM,eAAe,CAAC;AACpC,OAAO,MAAM,MAAM,cAAc,CAAC;AAClC,OAAO,oBAAoB,MAAM,8CAA8C,CAAC;AAChF,OAAO,iBAAiB,MAAM,yCAAyC,CAAC;AAExE,OAAO,GAAG,MAAM,2BAA2B,CAAC;AAE5C,OAAO,gBAAgB,MAAM,mDAAmD,CAAC;AACjF,OAAO,aAAa,MAAM,wBAAwB,CAAC;AAEnD,OAAO,GAAG,MAAM,uBAAuB,CAAC;AACxC,OAAO,WAAW,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"GitHub.js","sourceRoot":"","sources":["../../../../../../Server/Utils/CodeRepository/GitHub/GitHub.ts"],"names":[],"mappings":"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"}
|