@oneuptime/common 9.2.16 → 9.2.18

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 (133) hide show
  1. package/Models/DatabaseModels/CodeRepository.ts +664 -0
  2. package/Models/DatabaseModels/Index.ts +8 -0
  3. package/Models/DatabaseModels/LlmLog.ts +818 -0
  4. package/Models/DatabaseModels/LlmProvider.ts +21 -0
  5. package/Models/DatabaseModels/Project.ts +206 -0
  6. package/Models/DatabaseModels/ServiceCatalogCodeRepository.ts +549 -0
  7. package/Server/API/AIBillingAPI.ts +126 -0
  8. package/Server/API/AlertAPI.ts +139 -0
  9. package/Server/API/GitHubAPI.ts +360 -0
  10. package/Server/API/IncidentAPI.ts +258 -0
  11. package/Server/API/ScheduledMaintenanceAPI.ts +164 -0
  12. package/Server/EnvironmentConfig.ts +44 -0
  13. package/Server/Infrastructure/Postgres/SchemaMigrations/1765580181582-MigrationName.ts +79 -0
  14. package/Server/Infrastructure/Postgres/SchemaMigrations/1765633554715-MigrationName.ts +75 -0
  15. package/Server/Infrastructure/Postgres/SchemaMigrations/1765801357168-MigrationName.ts +32 -0
  16. package/Server/Infrastructure/Postgres/SchemaMigrations/1765810218488-MigrationName.ts +69 -0
  17. package/Server/Infrastructure/Postgres/SchemaMigrations/1765830758857-MigrationName.ts +111 -0
  18. package/Server/Infrastructure/Postgres/SchemaMigrations/1765834537501-MigrationName.ts +39 -0
  19. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +12 -0
  20. package/Server/Services/AIBillingService.ts +247 -0
  21. package/Server/Services/AIService.ts +238 -0
  22. package/Server/Services/CodeRepositoryService.ts +10 -0
  23. package/Server/Services/IncidentService.ts +88 -0
  24. package/Server/Services/Index.ts +2 -0
  25. package/Server/Services/LlmLogService.ts +14 -0
  26. package/Server/Services/LlmProviderService.ts +58 -0
  27. package/Server/Services/ServiceCatalogCodeRepositoryService.ts +55 -0
  28. package/Server/Utils/AI/AlertAIContextBuilder.ts +264 -0
  29. package/Server/Utils/AI/IncidentAIContextBuilder.ts +710 -0
  30. package/Server/Utils/AI/ScheduledMaintenanceAIContextBuilder.ts +345 -0
  31. package/Server/Utils/CodeRepository/GitHub/GitHub.ts +226 -0
  32. package/Server/Utils/LLM/LLMService.ts +276 -0
  33. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +166 -0
  34. package/Server/Utils/Workspace/Slack/Slack.ts +134 -0
  35. package/Server/Utils/Workspace/Workspace.ts +126 -0
  36. package/Tests/Types/Domain.test.ts +24 -3
  37. package/Types/CodeRepository/CodeRepositoryType.ts +1 -1
  38. package/Types/Domain.ts +21 -24
  39. package/Types/LlmLogStatus.ts +7 -0
  40. package/Types/Permission.ts +87 -0
  41. package/Types/ServiceCatalog/CodeRepositoryImprovementAction.ts +9 -0
  42. package/UI/Components/AI/AILoader.tsx +95 -0
  43. package/UI/Components/AI/GenerateFromAIModal.tsx +432 -0
  44. package/UI/Components/Modal/Modal.tsx +6 -1
  45. package/build/dist/Models/DatabaseModels/CodeRepository.js +689 -0
  46. package/build/dist/Models/DatabaseModels/CodeRepository.js.map +1 -0
  47. package/build/dist/Models/DatabaseModels/Index.js +7 -0
  48. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  49. package/build/dist/Models/DatabaseModels/LlmLog.js +856 -0
  50. package/build/dist/Models/DatabaseModels/LlmLog.js.map +1 -0
  51. package/build/dist/Models/DatabaseModels/LlmProvider.js +22 -0
  52. package/build/dist/Models/DatabaseModels/LlmProvider.js.map +1 -1
  53. package/build/dist/Models/DatabaseModels/Project.js +220 -0
  54. package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
  55. package/build/dist/Models/DatabaseModels/ServiceCatalogCodeRepository.js +565 -0
  56. package/build/dist/Models/DatabaseModels/ServiceCatalogCodeRepository.js.map +1 -0
  57. package/build/dist/Server/API/AIBillingAPI.js +58 -0
  58. package/build/dist/Server/API/AIBillingAPI.js.map +1 -0
  59. package/build/dist/Server/API/AlertAPI.js +94 -0
  60. package/build/dist/Server/API/AlertAPI.js.map +1 -0
  61. package/build/dist/Server/API/GitHubAPI.js +207 -0
  62. package/build/dist/Server/API/GitHubAPI.js.map +1 -0
  63. package/build/dist/Server/API/IncidentAPI.js +171 -1
  64. package/build/dist/Server/API/IncidentAPI.js.map +1 -1
  65. package/build/dist/Server/API/ScheduledMaintenanceAPI.js +103 -0
  66. package/build/dist/Server/API/ScheduledMaintenanceAPI.js.map +1 -0
  67. package/build/dist/Server/EnvironmentConfig.js +31 -0
  68. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  69. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1765580181582-MigrationName.js +34 -0
  70. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1765580181582-MigrationName.js.map +1 -0
  71. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1765633554715-MigrationName.js +32 -0
  72. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1765633554715-MigrationName.js.map +1 -0
  73. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1765801357168-MigrationName.js +38 -0
  74. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1765801357168-MigrationName.js.map +1 -0
  75. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1765810218488-MigrationName.js +30 -0
  76. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1765810218488-MigrationName.js.map +1 -0
  77. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1765830758857-MigrationName.js +44 -0
  78. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1765830758857-MigrationName.js.map +1 -0
  79. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1765834537501-MigrationName.js +22 -0
  80. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1765834537501-MigrationName.js.map +1 -0
  81. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +12 -0
  82. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  83. package/build/dist/Server/Services/AIBillingService.js +187 -0
  84. package/build/dist/Server/Services/AIBillingService.js.map +1 -0
  85. package/build/dist/Server/Services/AIService.js +184 -0
  86. package/build/dist/Server/Services/AIService.js.map +1 -0
  87. package/build/dist/Server/Services/CodeRepositoryService.js +9 -0
  88. package/build/dist/Server/Services/CodeRepositoryService.js.map +1 -0
  89. package/build/dist/Server/Services/IncidentService.js +60 -0
  90. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  91. package/build/dist/Server/Services/Index.js +2 -0
  92. package/build/dist/Server/Services/Index.js.map +1 -1
  93. package/build/dist/Server/Services/LlmLogService.js +13 -0
  94. package/build/dist/Server/Services/LlmLogService.js.map +1 -0
  95. package/build/dist/Server/Services/LlmProviderService.js +65 -0
  96. package/build/dist/Server/Services/LlmProviderService.js.map +1 -1
  97. package/build/dist/Server/Services/ServiceCatalogCodeRepositoryService.js +54 -0
  98. package/build/dist/Server/Services/ServiceCatalogCodeRepositoryService.js.map +1 -0
  99. package/build/dist/Server/Utils/AI/AlertAIContextBuilder.js +238 -0
  100. package/build/dist/Server/Utils/AI/AlertAIContextBuilder.js.map +1 -0
  101. package/build/dist/Server/Utils/AI/IncidentAIContextBuilder.js +597 -0
  102. package/build/dist/Server/Utils/AI/IncidentAIContextBuilder.js.map +1 -0
  103. package/build/dist/Server/Utils/AI/ScheduledMaintenanceAIContextBuilder.js +311 -0
  104. package/build/dist/Server/Utils/AI/ScheduledMaintenanceAIContextBuilder.js.map +1 -0
  105. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js +163 -0
  106. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js.map +1 -1
  107. package/build/dist/Server/Utils/LLM/LLMService.js +225 -0
  108. package/build/dist/Server/Utils/LLM/LLMService.js.map +1 -0
  109. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +110 -0
  110. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
  111. package/build/dist/Server/Utils/Workspace/Slack/Slack.js +89 -0
  112. package/build/dist/Server/Utils/Workspace/Slack/Slack.js.map +1 -1
  113. package/build/dist/Server/Utils/Workspace/Workspace.js +80 -0
  114. package/build/dist/Server/Utils/Workspace/Workspace.js.map +1 -1
  115. package/build/dist/Tests/Types/Domain.test.js +19 -3
  116. package/build/dist/Tests/Types/Domain.test.js.map +1 -1
  117. package/build/dist/Types/CodeRepository/CodeRepositoryType.js +1 -1
  118. package/build/dist/Types/CodeRepository/CodeRepositoryType.js.map +1 -1
  119. package/build/dist/Types/Domain.js +18 -16
  120. package/build/dist/Types/Domain.js.map +1 -1
  121. package/build/dist/Types/LlmLogStatus.js +8 -0
  122. package/build/dist/Types/LlmLogStatus.js.map +1 -0
  123. package/build/dist/Types/Permission.js +74 -0
  124. package/build/dist/Types/Permission.js.map +1 -1
  125. package/build/dist/Types/ServiceCatalog/CodeRepositoryImprovementAction.js +10 -0
  126. package/build/dist/Types/ServiceCatalog/CodeRepositoryImprovementAction.js.map +1 -0
  127. package/build/dist/UI/Components/AI/AILoader.js +64 -0
  128. package/build/dist/UI/Components/AI/AILoader.js.map +1 -0
  129. package/build/dist/UI/Components/AI/GenerateFromAIModal.js +320 -0
  130. package/build/dist/UI/Components/AI/GenerateFromAIModal.js.map +1 -0
  131. package/build/dist/UI/Components/Modal/Modal.js +6 -1
  132. package/build/dist/UI/Components/Modal/Modal.js.map +1 -1
  133. package/package.json +1 -1
@@ -0,0 +1,818 @@
1
+ import Project from "./Project";
2
+ import Incident from "./Incident";
3
+ import Alert from "./Alert";
4
+ import ScheduledMaintenance from "./ScheduledMaintenance";
5
+ import User from "./User";
6
+ import LlmProvider from "./LlmProvider";
7
+ import BaseModel from "./DatabaseBaseModel/DatabaseBaseModel";
8
+ import Route from "../../Types/API/Route";
9
+ import ColumnAccessControl from "../../Types/Database/AccessControl/ColumnAccessControl";
10
+ import TableAccessControl from "../../Types/Database/AccessControl/TableAccessControl";
11
+ import ColumnLength from "../../Types/Database/ColumnLength";
12
+ import ColumnType from "../../Types/Database/ColumnType";
13
+ import CrudApiEndpoint from "../../Types/Database/CrudApiEndpoint";
14
+ import EnableDocumentation from "../../Types/Database/EnableDocumentation";
15
+ import TableColumn from "../../Types/Database/TableColumn";
16
+ import TableColumnType from "../../Types/Database/TableColumnType";
17
+ import TableMetadata from "../../Types/Database/TableMetadata";
18
+ import TenantColumn from "../../Types/Database/TenantColumn";
19
+ import IconProp from "../../Types/Icon/IconProp";
20
+ import ObjectID from "../../Types/ObjectID";
21
+ import Permission from "../../Types/Permission";
22
+ import LlmLogStatus from "../../Types/LlmLogStatus";
23
+ import LlmType from "../../Types/LLM/LlmType";
24
+ import { Column, Entity, Index, JoinColumn, ManyToOne } from "typeorm";
25
+
26
+ @EnableDocumentation()
27
+ @TenantColumn("projectId")
28
+ @TableAccessControl({
29
+ create: [],
30
+ read: [
31
+ Permission.ProjectOwner,
32
+ Permission.ProjectAdmin,
33
+ Permission.ProjectMember,
34
+ Permission.ReadLlmLog,
35
+ ],
36
+ delete: [],
37
+ update: [],
38
+ })
39
+ @CrudApiEndpoint(new Route("/llm-log"))
40
+ @Entity({
41
+ name: "LlmLog",
42
+ })
43
+ @TableMetadata({
44
+ tableName: "LlmLog",
45
+ singularName: "LLM Log",
46
+ pluralName: "LLM Logs",
47
+ icon: IconProp.Bolt,
48
+ tableDescription:
49
+ "Logs of all the LLM API calls for AI features in this project.",
50
+ })
51
+ export default class LlmLog extends BaseModel {
52
+ @ColumnAccessControl({
53
+ create: [],
54
+ read: [
55
+ Permission.ProjectOwner,
56
+ Permission.ProjectAdmin,
57
+ Permission.ProjectMember,
58
+ Permission.ReadLlmLog,
59
+ ],
60
+ update: [],
61
+ })
62
+ @TableColumn({
63
+ manyToOneRelationColumn: "projectId",
64
+ type: TableColumnType.Entity,
65
+ modelType: Project,
66
+ title: "Project",
67
+ description: "Relation to Project Resource in which this object belongs",
68
+ })
69
+ @ManyToOne(
70
+ () => {
71
+ return Project;
72
+ },
73
+ {
74
+ eager: false,
75
+ nullable: true,
76
+ onDelete: "CASCADE",
77
+ orphanedRowAction: "nullify",
78
+ },
79
+ )
80
+ @JoinColumn({ name: "projectId" })
81
+ public project?: Project = undefined;
82
+
83
+ @ColumnAccessControl({
84
+ create: [],
85
+ read: [
86
+ Permission.ProjectOwner,
87
+ Permission.ProjectAdmin,
88
+ Permission.ProjectMember,
89
+ Permission.ReadLlmLog,
90
+ ],
91
+ update: [],
92
+ })
93
+ @Index()
94
+ @TableColumn({
95
+ type: TableColumnType.ObjectID,
96
+ required: true,
97
+ canReadOnRelationQuery: true,
98
+ title: "Project ID",
99
+ description: "ID of your OneUptime Project in which this object belongs",
100
+ })
101
+ @Column({
102
+ type: ColumnType.ObjectID,
103
+ nullable: false,
104
+ transformer: ObjectID.getDatabaseTransformer(),
105
+ })
106
+ public projectId?: ObjectID = undefined;
107
+
108
+ // LLM Provider Relation
109
+
110
+ @ColumnAccessControl({
111
+ create: [],
112
+ read: [
113
+ Permission.ProjectOwner,
114
+ Permission.ProjectAdmin,
115
+ Permission.ProjectMember,
116
+ Permission.ReadLlmLog,
117
+ ],
118
+ update: [],
119
+ })
120
+ @TableColumn({
121
+ manyToOneRelationColumn: "llmProviderId",
122
+ type: TableColumnType.Entity,
123
+ modelType: LlmProvider,
124
+ title: "LLM Provider",
125
+ description: "LLM Provider used for this API call",
126
+ })
127
+ @ManyToOne(
128
+ () => {
129
+ return LlmProvider;
130
+ },
131
+ {
132
+ eager: false,
133
+ nullable: true,
134
+ onDelete: "SET NULL",
135
+ orphanedRowAction: "nullify",
136
+ },
137
+ )
138
+ @JoinColumn({ name: "llmProviderId" })
139
+ public llmProvider?: LlmProvider = undefined;
140
+
141
+ @ColumnAccessControl({
142
+ create: [],
143
+ read: [
144
+ Permission.ProjectOwner,
145
+ Permission.ProjectAdmin,
146
+ Permission.ProjectMember,
147
+ Permission.ReadLlmLog,
148
+ ],
149
+ update: [],
150
+ })
151
+ @Index()
152
+ @TableColumn({
153
+ type: TableColumnType.ObjectID,
154
+ required: false,
155
+ canReadOnRelationQuery: true,
156
+ title: "LLM Provider ID",
157
+ description: "ID of LLM Provider used for this API call",
158
+ })
159
+ @Column({
160
+ type: ColumnType.ObjectID,
161
+ nullable: true,
162
+ transformer: ObjectID.getDatabaseTransformer(),
163
+ })
164
+ public llmProviderId?: ObjectID = undefined;
165
+
166
+ // Denormalized provider info for historical reference
167
+
168
+ @ColumnAccessControl({
169
+ create: [],
170
+ read: [
171
+ Permission.ProjectOwner,
172
+ Permission.ProjectAdmin,
173
+ Permission.ProjectMember,
174
+ Permission.ReadLlmLog,
175
+ ],
176
+ update: [],
177
+ })
178
+ @TableColumn({
179
+ required: false,
180
+ type: TableColumnType.ShortText,
181
+ title: "LLM Provider Name",
182
+ description: "Name of the LLM Provider at time of call",
183
+ canReadOnRelationQuery: false,
184
+ })
185
+ @Column({
186
+ nullable: true,
187
+ type: ColumnType.ShortText,
188
+ length: ColumnLength.ShortText,
189
+ })
190
+ public llmProviderName?: string = undefined;
191
+
192
+ @ColumnAccessControl({
193
+ create: [],
194
+ read: [
195
+ Permission.ProjectOwner,
196
+ Permission.ProjectAdmin,
197
+ Permission.ProjectMember,
198
+ Permission.ReadLlmLog,
199
+ ],
200
+ update: [],
201
+ })
202
+ @TableColumn({
203
+ required: false,
204
+ type: TableColumnType.ShortText,
205
+ title: "LLM Type",
206
+ description: "Type of LLM (OpenAI, Anthropic, Ollama)",
207
+ canReadOnRelationQuery: false,
208
+ })
209
+ @Column({
210
+ nullable: true,
211
+ type: ColumnType.ShortText,
212
+ length: ColumnLength.ShortText,
213
+ })
214
+ public llmType?: LlmType = undefined;
215
+
216
+ @ColumnAccessControl({
217
+ create: [],
218
+ read: [
219
+ Permission.ProjectOwner,
220
+ Permission.ProjectAdmin,
221
+ Permission.ProjectMember,
222
+ Permission.ReadLlmLog,
223
+ ],
224
+ update: [],
225
+ })
226
+ @TableColumn({
227
+ required: false,
228
+ type: TableColumnType.ShortText,
229
+ title: "Model Name",
230
+ description: "Name of the model used (e.g., gpt-4, claude-3-opus)",
231
+ canReadOnRelationQuery: false,
232
+ })
233
+ @Column({
234
+ nullable: true,
235
+ type: ColumnType.ShortText,
236
+ length: ColumnLength.ShortText,
237
+ })
238
+ public modelName?: string = undefined;
239
+
240
+ @ColumnAccessControl({
241
+ create: [],
242
+ read: [
243
+ Permission.ProjectOwner,
244
+ Permission.ProjectAdmin,
245
+ Permission.ProjectMember,
246
+ Permission.ReadLlmLog,
247
+ ],
248
+ update: [],
249
+ })
250
+ @TableColumn({
251
+ required: true,
252
+ type: TableColumnType.Boolean,
253
+ title: "Is Global Provider",
254
+ description: "Was a global LLM provider used for this call?",
255
+ canReadOnRelationQuery: false,
256
+ isDefaultValueColumn: true,
257
+ defaultValue: false,
258
+ })
259
+ @Column({
260
+ nullable: false,
261
+ type: ColumnType.Boolean,
262
+ default: false,
263
+ })
264
+ public isGlobalProvider?: boolean = undefined;
265
+
266
+ // Token usage
267
+
268
+ @ColumnAccessControl({
269
+ create: [],
270
+ read: [
271
+ Permission.ProjectOwner,
272
+ Permission.ProjectAdmin,
273
+ Permission.ProjectMember,
274
+ Permission.ReadLlmLog,
275
+ ],
276
+ update: [],
277
+ })
278
+ @TableColumn({
279
+ required: true,
280
+ type: TableColumnType.Number,
281
+ title: "Tokens Used",
282
+ description: "Total tokens used (input + output)",
283
+ canReadOnRelationQuery: false,
284
+ isDefaultValueColumn: true,
285
+ defaultValue: 0,
286
+ })
287
+ @Column({
288
+ nullable: false,
289
+ default: 0,
290
+ type: ColumnType.Number,
291
+ })
292
+ public totalTokens?: number = undefined;
293
+
294
+ // Cost tracking
295
+
296
+ @ColumnAccessControl({
297
+ create: [],
298
+ read: [
299
+ Permission.ProjectOwner,
300
+ Permission.ProjectAdmin,
301
+ Permission.ProjectMember,
302
+ Permission.ReadLlmLog,
303
+ ],
304
+ update: [],
305
+ })
306
+ @TableColumn({
307
+ required: true,
308
+ type: TableColumnType.Number,
309
+ title: "Cost (USD Cents)",
310
+ description: "Total cost in USD cents",
311
+ canReadOnRelationQuery: false,
312
+ isDefaultValueColumn: true,
313
+ defaultValue: 0,
314
+ })
315
+ @Column({
316
+ nullable: false,
317
+ default: 0,
318
+ type: ColumnType.Number,
319
+ })
320
+ public costInUSDCents?: number = undefined;
321
+
322
+ @ColumnAccessControl({
323
+ create: [],
324
+ read: [
325
+ Permission.ProjectOwner,
326
+ Permission.ProjectAdmin,
327
+ Permission.ProjectMember,
328
+ Permission.ReadLlmLog,
329
+ ],
330
+ update: [],
331
+ })
332
+ @TableColumn({
333
+ required: true,
334
+ type: TableColumnType.Boolean,
335
+ title: "Was Billed",
336
+ description: "Was the project charged for this API call?",
337
+ canReadOnRelationQuery: false,
338
+ isDefaultValueColumn: true,
339
+ defaultValue: false,
340
+ })
341
+ @Column({
342
+ nullable: false,
343
+ type: ColumnType.Boolean,
344
+ default: false,
345
+ })
346
+ public wasBilled?: boolean = undefined;
347
+
348
+ // Status
349
+
350
+ @ColumnAccessControl({
351
+ create: [],
352
+ read: [
353
+ Permission.ProjectOwner,
354
+ Permission.ProjectAdmin,
355
+ Permission.ProjectMember,
356
+ Permission.ReadLlmLog,
357
+ ],
358
+ update: [],
359
+ })
360
+ @TableColumn({
361
+ required: true,
362
+ type: TableColumnType.ShortText,
363
+ title: "Status",
364
+ description: "Status of the LLM API call",
365
+ canReadOnRelationQuery: false,
366
+ })
367
+ @Column({
368
+ nullable: false,
369
+ type: ColumnType.ShortText,
370
+ length: ColumnLength.ShortText,
371
+ })
372
+ public status?: LlmLogStatus = undefined;
373
+
374
+ @ColumnAccessControl({
375
+ create: [],
376
+ read: [
377
+ Permission.ProjectOwner,
378
+ Permission.ProjectAdmin,
379
+ Permission.ProjectMember,
380
+ Permission.ReadLlmLog,
381
+ ],
382
+ update: [],
383
+ })
384
+ @TableColumn({
385
+ required: false,
386
+ type: TableColumnType.LongText,
387
+ title: "Status Message",
388
+ description: "Status Message (error details if failed)",
389
+ canReadOnRelationQuery: false,
390
+ })
391
+ @Column({
392
+ nullable: true,
393
+ type: ColumnType.LongText,
394
+ length: ColumnLength.LongText,
395
+ })
396
+ public statusMessage?: string = undefined;
397
+
398
+ // Feature identification
399
+
400
+ @ColumnAccessControl({
401
+ create: [],
402
+ read: [
403
+ Permission.ProjectOwner,
404
+ Permission.ProjectAdmin,
405
+ Permission.ProjectMember,
406
+ Permission.ReadLlmLog,
407
+ ],
408
+ update: [],
409
+ })
410
+ @TableColumn({
411
+ required: false,
412
+ type: TableColumnType.ShortText,
413
+ title: "Feature",
414
+ description:
415
+ "The feature that triggered this API call (e.g., IncidentPostmortem)",
416
+ canReadOnRelationQuery: false,
417
+ })
418
+ @Column({
419
+ nullable: true,
420
+ type: ColumnType.ShortText,
421
+ length: ColumnLength.ShortText,
422
+ })
423
+ public feature?: string = undefined;
424
+
425
+ @ColumnAccessControl({
426
+ create: [],
427
+ read: [
428
+ Permission.ProjectOwner,
429
+ Permission.ProjectAdmin,
430
+ Permission.ProjectMember,
431
+ Permission.ReadLlmLog,
432
+ ],
433
+ update: [],
434
+ })
435
+ @TableColumn({
436
+ required: false,
437
+ type: TableColumnType.VeryLongText,
438
+ title: "Request Prompt",
439
+ description: "The prompt sent to the LLM (truncated)",
440
+ canReadOnRelationQuery: false,
441
+ })
442
+ @Column({
443
+ nullable: true,
444
+ type: ColumnType.VeryLongText,
445
+ })
446
+ public requestPrompt?: string = undefined;
447
+
448
+ @ColumnAccessControl({
449
+ create: [],
450
+ read: [
451
+ Permission.ProjectOwner,
452
+ Permission.ProjectAdmin,
453
+ Permission.ProjectMember,
454
+ Permission.ReadLlmLog,
455
+ ],
456
+ update: [],
457
+ })
458
+ @TableColumn({
459
+ required: false,
460
+ type: TableColumnType.VeryLongText,
461
+ title: "Response Preview",
462
+ description: "Preview of the LLM response (truncated)",
463
+ canReadOnRelationQuery: false,
464
+ })
465
+ @Column({
466
+ nullable: true,
467
+ type: ColumnType.VeryLongText,
468
+ })
469
+ public responsePreview?: string = undefined;
470
+
471
+ // Related resources
472
+
473
+ @ColumnAccessControl({
474
+ create: [],
475
+ read: [
476
+ Permission.ProjectOwner,
477
+ Permission.ProjectAdmin,
478
+ Permission.ProjectMember,
479
+ Permission.ReadLlmLog,
480
+ ],
481
+ update: [],
482
+ })
483
+ @TableColumn({
484
+ manyToOneRelationColumn: "incidentId",
485
+ type: TableColumnType.Entity,
486
+ modelType: Incident,
487
+ title: "Incident",
488
+ description: "Incident associated with this LLM call (if any)",
489
+ })
490
+ @ManyToOne(
491
+ () => {
492
+ return Incident;
493
+ },
494
+ {
495
+ eager: false,
496
+ nullable: true,
497
+ onDelete: "CASCADE",
498
+ orphanedRowAction: "nullify",
499
+ },
500
+ )
501
+ @JoinColumn({ name: "incidentId" })
502
+ public incident?: Incident = undefined;
503
+
504
+ @ColumnAccessControl({
505
+ create: [],
506
+ read: [
507
+ Permission.ProjectOwner,
508
+ Permission.ProjectAdmin,
509
+ Permission.ProjectMember,
510
+ Permission.ReadLlmLog,
511
+ ],
512
+ update: [],
513
+ })
514
+ @Index()
515
+ @TableColumn({
516
+ type: TableColumnType.ObjectID,
517
+ required: false,
518
+ canReadOnRelationQuery: true,
519
+ title: "Incident ID",
520
+ description: "ID of Incident associated with this LLM call (if any)",
521
+ })
522
+ @Column({
523
+ type: ColumnType.ObjectID,
524
+ nullable: true,
525
+ transformer: ObjectID.getDatabaseTransformer(),
526
+ })
527
+ public incidentId?: ObjectID = undefined;
528
+
529
+ @ColumnAccessControl({
530
+ create: [],
531
+ read: [
532
+ Permission.ProjectOwner,
533
+ Permission.ProjectAdmin,
534
+ Permission.ProjectMember,
535
+ Permission.ReadLlmLog,
536
+ ],
537
+ update: [],
538
+ })
539
+ @TableColumn({
540
+ manyToOneRelationColumn: "alertId",
541
+ type: TableColumnType.Entity,
542
+ modelType: Alert,
543
+ title: "Alert",
544
+ description: "Alert associated with this LLM call (if any)",
545
+ })
546
+ @ManyToOne(
547
+ () => {
548
+ return Alert;
549
+ },
550
+ {
551
+ eager: false,
552
+ nullable: true,
553
+ onDelete: "CASCADE",
554
+ orphanedRowAction: "nullify",
555
+ },
556
+ )
557
+ @JoinColumn({ name: "alertId" })
558
+ public alert?: Alert = undefined;
559
+
560
+ @ColumnAccessControl({
561
+ create: [],
562
+ read: [
563
+ Permission.ProjectOwner,
564
+ Permission.ProjectAdmin,
565
+ Permission.ProjectMember,
566
+ Permission.ReadLlmLog,
567
+ ],
568
+ update: [],
569
+ })
570
+ @Index()
571
+ @TableColumn({
572
+ type: TableColumnType.ObjectID,
573
+ required: false,
574
+ canReadOnRelationQuery: true,
575
+ title: "Alert ID",
576
+ description: "ID of Alert associated with this LLM call (if any)",
577
+ })
578
+ @Column({
579
+ type: ColumnType.ObjectID,
580
+ nullable: true,
581
+ transformer: ObjectID.getDatabaseTransformer(),
582
+ })
583
+ public alertId?: ObjectID = undefined;
584
+
585
+ @ColumnAccessControl({
586
+ create: [],
587
+ read: [
588
+ Permission.ProjectOwner,
589
+ Permission.ProjectAdmin,
590
+ Permission.ProjectMember,
591
+ Permission.ReadLlmLog,
592
+ ],
593
+ update: [],
594
+ })
595
+ @TableColumn({
596
+ manyToOneRelationColumn: "scheduledMaintenanceId",
597
+ type: TableColumnType.Entity,
598
+ modelType: ScheduledMaintenance,
599
+ title: "Scheduled Maintenance",
600
+ description: "Scheduled Maintenance associated with this LLM call (if any)",
601
+ })
602
+ @ManyToOne(
603
+ () => {
604
+ return ScheduledMaintenance;
605
+ },
606
+ {
607
+ eager: false,
608
+ nullable: true,
609
+ onDelete: "CASCADE",
610
+ orphanedRowAction: "nullify",
611
+ },
612
+ )
613
+ @JoinColumn({ name: "scheduledMaintenanceId" })
614
+ public scheduledMaintenance?: ScheduledMaintenance = undefined;
615
+
616
+ @ColumnAccessControl({
617
+ create: [],
618
+ read: [
619
+ Permission.ProjectOwner,
620
+ Permission.ProjectAdmin,
621
+ Permission.ProjectMember,
622
+ Permission.ReadLlmLog,
623
+ ],
624
+ update: [],
625
+ })
626
+ @Index()
627
+ @TableColumn({
628
+ type: TableColumnType.ObjectID,
629
+ required: false,
630
+ canReadOnRelationQuery: true,
631
+ title: "Scheduled Maintenance ID",
632
+ description:
633
+ "ID of Scheduled Maintenance associated with this LLM call (if any)",
634
+ })
635
+ @Column({
636
+ type: ColumnType.ObjectID,
637
+ nullable: true,
638
+ transformer: ObjectID.getDatabaseTransformer(),
639
+ })
640
+ public scheduledMaintenanceId?: ObjectID = undefined;
641
+
642
+ // User who triggered the request
643
+
644
+ @ColumnAccessControl({
645
+ create: [],
646
+ read: [
647
+ Permission.ProjectOwner,
648
+ Permission.ProjectAdmin,
649
+ Permission.ProjectMember,
650
+ Permission.ReadLlmLog,
651
+ ],
652
+ update: [],
653
+ })
654
+ @TableColumn({
655
+ manyToOneRelationColumn: "userId",
656
+ type: TableColumnType.Entity,
657
+ modelType: User,
658
+ title: "User",
659
+ description: "User who triggered this LLM call (if any)",
660
+ })
661
+ @ManyToOne(
662
+ () => {
663
+ return User;
664
+ },
665
+ {
666
+ eager: false,
667
+ nullable: true,
668
+ onDelete: "CASCADE",
669
+ orphanedRowAction: "nullify",
670
+ },
671
+ )
672
+ @JoinColumn({ name: "userId" })
673
+ public user?: User = undefined;
674
+
675
+ @ColumnAccessControl({
676
+ create: [],
677
+ read: [
678
+ Permission.ProjectOwner,
679
+ Permission.ProjectAdmin,
680
+ Permission.ProjectMember,
681
+ Permission.ReadLlmLog,
682
+ ],
683
+ update: [],
684
+ })
685
+ @Index()
686
+ @TableColumn({
687
+ type: TableColumnType.ObjectID,
688
+ required: false,
689
+ canReadOnRelationQuery: true,
690
+ title: "User ID",
691
+ description: "ID of User who triggered this LLM call (if any)",
692
+ })
693
+ @Column({
694
+ type: ColumnType.ObjectID,
695
+ nullable: true,
696
+ transformer: ObjectID.getDatabaseTransformer(),
697
+ })
698
+ public userId?: ObjectID = undefined;
699
+
700
+ // Timestamps and duration
701
+
702
+ @ColumnAccessControl({
703
+ create: [],
704
+ read: [
705
+ Permission.ProjectOwner,
706
+ Permission.ProjectAdmin,
707
+ Permission.ProjectMember,
708
+ Permission.ReadLlmLog,
709
+ ],
710
+ update: [],
711
+ })
712
+ @TableColumn({
713
+ required: false,
714
+ type: TableColumnType.Date,
715
+ title: "Request Started At",
716
+ description: "When the LLM request started",
717
+ canReadOnRelationQuery: false,
718
+ })
719
+ @Column({
720
+ nullable: true,
721
+ type: ColumnType.Date,
722
+ })
723
+ public requestStartedAt?: Date = undefined;
724
+
725
+ @ColumnAccessControl({
726
+ create: [],
727
+ read: [
728
+ Permission.ProjectOwner,
729
+ Permission.ProjectAdmin,
730
+ Permission.ProjectMember,
731
+ Permission.ReadLlmLog,
732
+ ],
733
+ update: [],
734
+ })
735
+ @TableColumn({
736
+ required: false,
737
+ type: TableColumnType.Date,
738
+ title: "Request Completed At",
739
+ description: "When the LLM request completed",
740
+ canReadOnRelationQuery: false,
741
+ })
742
+ @Column({
743
+ nullable: true,
744
+ type: ColumnType.Date,
745
+ })
746
+ public requestCompletedAt?: Date = undefined;
747
+
748
+ @ColumnAccessControl({
749
+ create: [],
750
+ read: [
751
+ Permission.ProjectOwner,
752
+ Permission.ProjectAdmin,
753
+ Permission.ProjectMember,
754
+ Permission.ReadLlmLog,
755
+ ],
756
+ update: [],
757
+ })
758
+ @TableColumn({
759
+ required: false,
760
+ type: TableColumnType.Number,
761
+ title: "Duration (ms)",
762
+ description: "Request duration in milliseconds",
763
+ canReadOnRelationQuery: false,
764
+ })
765
+ @Column({
766
+ nullable: true,
767
+ type: ColumnType.Number,
768
+ })
769
+ public durationMs?: number = undefined;
770
+
771
+ // Deleted by user
772
+
773
+ @ColumnAccessControl({
774
+ create: [],
775
+ read: [],
776
+ update: [],
777
+ })
778
+ @TableColumn({
779
+ manyToOneRelationColumn: "deletedByUserId",
780
+ type: TableColumnType.Entity,
781
+ title: "Deleted by User",
782
+ modelType: User,
783
+ description:
784
+ "Relation to User who deleted this object (if this object was deleted by a User)",
785
+ })
786
+ @ManyToOne(
787
+ () => {
788
+ return User;
789
+ },
790
+ {
791
+ cascade: false,
792
+ eager: false,
793
+ nullable: true,
794
+ onDelete: "SET NULL",
795
+ orphanedRowAction: "nullify",
796
+ },
797
+ )
798
+ @JoinColumn({ name: "deletedByUserId" })
799
+ public deletedByUser?: User = undefined;
800
+
801
+ @ColumnAccessControl({
802
+ create: [],
803
+ read: [],
804
+ update: [],
805
+ })
806
+ @TableColumn({
807
+ type: TableColumnType.ObjectID,
808
+ title: "Deleted by User ID",
809
+ description:
810
+ "User ID who deleted this object (if this object was deleted by a User)",
811
+ })
812
+ @Column({
813
+ type: ColumnType.ObjectID,
814
+ nullable: true,
815
+ transformer: ObjectID.getDatabaseTransformer(),
816
+ })
817
+ public deletedByUserId?: ObjectID = undefined;
818
+ }