@oneuptime/common 9.3.8 → 9.3.10

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 (78) hide show
  1. package/Models/DatabaseModels/AIAgentTask.ts +18 -3
  2. package/Models/DatabaseModels/Index.ts +0 -5
  3. package/Models/DatabaseModels/MetricType.ts +7 -7
  4. package/Models/DatabaseModels/Service.ts +34 -8
  5. package/Models/DatabaseModels/TelemetryException.ts +11 -13
  6. package/Models/DatabaseModels/TelemetryUsageBilling.ts +11 -13
  7. package/Server/API/AIAgentDataAPI.ts +71 -108
  8. package/Server/Infrastructure/Postgres/SchemaMigrations/1767979055522-MigrationName.ts +743 -0
  9. package/Server/Infrastructure/Postgres/SchemaMigrations/1767979448478-MigrationName.ts +224 -0
  10. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +4 -0
  11. package/Server/Services/Index.ts +0 -5
  12. package/Server/Services/OpenTelemetryIngestService.ts +26 -28
  13. package/Server/Services/ServiceService.ts +23 -0
  14. package/Server/Services/TelemetryExceptionService.ts +3 -4
  15. package/Server/Services/TelemetryUsageBillingService.ts +30 -32
  16. package/Server/Utils/Telemetry/Telemetry.ts +24 -23
  17. package/Types/AI/AIAgentTaskMetadata.ts +1 -1
  18. package/UI/Components/LogsViewer/LogsViewer.tsx +20 -23
  19. package/UI/Components/LogsViewer/components/LogDetailsPanel.tsx +3 -3
  20. package/UI/Components/LogsViewer/components/LogsTable.tsx +3 -4
  21. package/UI/Components/Navbar/NavBar.tsx +146 -52
  22. package/UI/Components/Navbar/NavBarMenu.tsx +87 -7
  23. package/UI/Components/Navbar/NavBarMenuItem.tsx +12 -0
  24. package/build/dist/Models/DatabaseModels/AIAgentTask.js +18 -3
  25. package/build/dist/Models/DatabaseModels/AIAgentTask.js.map +1 -1
  26. package/build/dist/Models/DatabaseModels/Index.js +0 -4
  27. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  28. package/build/dist/Models/DatabaseModels/MetricType.js +8 -8
  29. package/build/dist/Models/DatabaseModels/MetricType.js.map +1 -1
  30. package/build/dist/Models/DatabaseModels/Service.js +36 -8
  31. package/build/dist/Models/DatabaseModels/Service.js.map +1 -1
  32. package/build/dist/Models/DatabaseModels/TelemetryException.js +14 -14
  33. package/build/dist/Models/DatabaseModels/TelemetryException.js.map +1 -1
  34. package/build/dist/Models/DatabaseModels/TelemetryUsageBilling.js +14 -14
  35. package/build/dist/Models/DatabaseModels/TelemetryUsageBilling.js.map +1 -1
  36. package/build/dist/Server/API/AIAgentDataAPI.js +47 -76
  37. package/build/dist/Server/API/AIAgentDataAPI.js.map +1 -1
  38. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1767979055522-MigrationName.js +254 -0
  39. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1767979055522-MigrationName.js.map +1 -0
  40. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1767979448478-MigrationName.js +140 -0
  41. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1767979448478-MigrationName.js.map +1 -0
  42. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +4 -0
  43. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  44. package/build/dist/Server/Services/Index.js +0 -4
  45. package/build/dist/Server/Services/Index.js.map +1 -1
  46. package/build/dist/Server/Services/OpenTelemetryIngestService.js +7 -7
  47. package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
  48. package/build/dist/Server/Services/ServiceService.js +23 -0
  49. package/build/dist/Server/Services/ServiceService.js.map +1 -1
  50. package/build/dist/Server/Services/TelemetryExceptionService.js +3 -4
  51. package/build/dist/Server/Services/TelemetryExceptionService.js.map +1 -1
  52. package/build/dist/Server/Services/TelemetryUsageBillingService.js +15 -16
  53. package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
  54. package/build/dist/Server/Utils/Telemetry/Telemetry.js +20 -20
  55. package/build/dist/Server/Utils/Telemetry/Telemetry.js.map +1 -1
  56. package/build/dist/UI/Components/LogsViewer/LogsViewer.js +5 -5
  57. package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
  58. package/build/dist/UI/Components/LogsViewer/components/LogDetailsPanel.js.map +1 -1
  59. package/build/dist/UI/Components/LogsViewer/components/LogsTable.js.map +1 -1
  60. package/build/dist/UI/Components/Navbar/NavBar.js +58 -13
  61. package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
  62. package/build/dist/UI/Components/Navbar/NavBarMenu.js +37 -5
  63. package/build/dist/UI/Components/Navbar/NavBarMenu.js.map +1 -1
  64. package/build/dist/UI/Components/Navbar/NavBarMenuItem.js +12 -0
  65. package/build/dist/UI/Components/Navbar/NavBarMenuItem.js.map +1 -1
  66. package/package.json +1 -1
  67. package/Models/DatabaseModels/ServiceTelemetryService.ts +0 -419
  68. package/Models/DatabaseModels/TelemetryService.ts +0 -529
  69. package/Server/Services/ServiceTelemetryServiceService.ts +0 -59
  70. package/Server/Services/TelemetryServiceService.ts +0 -53
  71. package/build/dist/Models/DatabaseModels/ServiceTelemetryService.js +0 -436
  72. package/build/dist/Models/DatabaseModels/ServiceTelemetryService.js.map +0 -1
  73. package/build/dist/Models/DatabaseModels/TelemetryService.js +0 -545
  74. package/build/dist/Models/DatabaseModels/TelemetryService.js.map +0 -1
  75. package/build/dist/Server/Services/ServiceTelemetryServiceService.js +0 -56
  76. package/build/dist/Server/Services/ServiceTelemetryServiceService.js.map +0 -1
  77. package/build/dist/Server/Services/TelemetryServiceService.js +0 -59
  78. package/build/dist/Server/Services/TelemetryServiceService.js.map +0 -1
@@ -205,7 +205,12 @@ export default class AIAgentTask extends BaseModel {
205
205
  public description?: string = undefined;
206
206
 
207
207
  @ColumnAccessControl({
208
- create: [],
208
+ create: [
209
+ Permission.ProjectOwner,
210
+ Permission.ProjectAdmin,
211
+ Permission.ProjectMember,
212
+ Permission.CreateProjectAIAgentTask,
213
+ ],
209
214
  read: [
210
215
  Permission.ProjectOwner,
211
216
  Permission.ProjectAdmin,
@@ -242,7 +247,12 @@ export default class AIAgentTask extends BaseModel {
242
247
  public aiAgent?: AIAgent = undefined;
243
248
 
244
249
  @ColumnAccessControl({
245
- create: [],
250
+ create: [
251
+ Permission.ProjectOwner,
252
+ Permission.ProjectAdmin,
253
+ Permission.ProjectMember,
254
+ Permission.CreateProjectAIAgentTask,
255
+ ],
246
256
  read: [
247
257
  Permission.ProjectOwner,
248
258
  Permission.ProjectAdmin,
@@ -522,7 +532,12 @@ export default class AIAgentTask extends BaseModel {
522
532
  public createdByUserId?: ObjectID = undefined;
523
533
 
524
534
  @ColumnAccessControl({
525
- create: [],
535
+ create: [
536
+ Permission.ProjectOwner,
537
+ Permission.ProjectAdmin,
538
+ Permission.ProjectMember,
539
+ Permission.CreateProjectAIAgentTask,
540
+ ],
526
541
  read: [
527
542
  Permission.ProjectOwner,
528
543
  Permission.ProjectAdmin,
@@ -138,7 +138,6 @@ import Team from "./Team";
138
138
  import TeamMember from "./TeamMember";
139
139
  import TeamPermission from "./TeamPermission";
140
140
  import TeamComplianceSetting from "./TeamComplianceSetting";
141
- import TelemetryService from "./TelemetryService";
142
141
  import UsageBilling from "./TelemetryUsageBilling";
143
142
  import User from "./User";
144
143
  import UserSession from "./UserSession";
@@ -159,7 +158,6 @@ import WorkflowLog from "./WorkflowLog";
159
158
  import WorkflowVariables from "./WorkflowVariable";
160
159
  import ServiceDependency from "./ServiceDependency";
161
160
  import ServiceMonitor from "./ServiceMonitor";
162
- import ServiceTelemetryService from "./ServiceTelemetryService";
163
161
 
164
162
  import UserTotpAuth from "./UserTotpAuth";
165
163
  import UserWebAuthn from "./UserWebAuthn";
@@ -354,8 +352,6 @@ const AllModelTypes: Array<{
354
352
  MonitorGroupOwnerUser,
355
353
  MonitorGroupResource,
356
354
 
357
- TelemetryService,
358
-
359
355
  OnCallDutyPolicySchedule,
360
356
  OnCallDutyPolicyScheduleLayer,
361
357
  OnCallDutyPolicyScheduleLayerUser,
@@ -377,7 +373,6 @@ const AllModelTypes: Array<{
377
373
  ServiceOwnerUser,
378
374
  ServiceDependency,
379
375
  ServiceMonitor,
380
- ServiceTelemetryService,
381
376
  ServiceCodeRepository,
382
377
 
383
378
  // Code Repository
@@ -27,7 +27,7 @@ import {
27
27
  ManyToOne,
28
28
  } from "typeorm";
29
29
  import BaseModel from "./DatabaseBaseModel/DatabaseBaseModel";
30
- import TelemetryService from "./TelemetryService";
30
+ import Service from "./Service";
31
31
 
32
32
  @EnableDocumentation()
33
33
  @TenantColumn("projectId")
@@ -133,20 +133,20 @@ export default class MetricType extends BaseModel {
133
133
  @TableColumn({
134
134
  required: false,
135
135
  type: TableColumnType.EntityArray,
136
- modelType: TelemetryService,
137
- title: "Telemetry Services",
136
+ modelType: Service,
137
+ title: "Services",
138
138
  description: "List of services this metric is related to",
139
139
  })
140
140
  @ManyToMany(
141
141
  () => {
142
- return TelemetryService;
142
+ return Service;
143
143
  },
144
144
  { eager: false },
145
145
  )
146
146
  @JoinTable({
147
- name: "MetricTypeTelemetryService",
147
+ name: "MetricTypeService",
148
148
  inverseJoinColumn: {
149
- name: "telemetryServiceId",
149
+ name: "serviceId",
150
150
  referencedColumnName: "_id",
151
151
  },
152
152
  joinColumn: {
@@ -154,7 +154,7 @@ export default class MetricType extends BaseModel {
154
154
  referencedColumnName: "_id",
155
155
  },
156
156
  })
157
- public telemetryServices?: Array<TelemetryService> = undefined;
157
+ public services?: Array<Service> = undefined;
158
158
 
159
159
  @ColumnAccessControl({
160
160
  create: [
@@ -3,11 +3,9 @@ import Project from "./Project";
3
3
  import User from "./User";
4
4
  import BaseModel from "./DatabaseBaseModel/DatabaseBaseModel";
5
5
  import Route from "../../Types/API/Route";
6
- import { PlanType } from "../../Types/Billing/SubscriptionPlan";
7
6
  import Color from "../../Types/Color";
8
7
  import ColumnAccessControl from "../../Types/Database/AccessControl/ColumnAccessControl";
9
8
  import TableAccessControl from "../../Types/Database/AccessControl/TableAccessControl";
10
- import TableBillingAccessControl from "../../Types/Database/AccessControl/TableBillingAccessControl";
11
9
  import AccessControlColumn from "../../Types/Database/AccessControlColumn";
12
10
  import ColumnLength from "../../Types/Database/ColumnLength";
13
11
  import ColumnType from "../../Types/Database/ColumnType";
@@ -38,12 +36,6 @@ import {
38
36
  @AccessControlColumn("labels")
39
37
  @EnableDocumentation()
40
38
  @TenantColumn("projectId")
41
- @TableBillingAccessControl({
42
- create: PlanType.Growth,
43
- read: PlanType.Growth,
44
- update: PlanType.Growth,
45
- delete: PlanType.Growth,
46
- })
47
39
  @TableAccessControl({
48
40
  create: [
49
41
  Permission.ProjectOwner,
@@ -519,4 +511,38 @@ export default class Service extends BaseModel {
519
511
  type: ColumnType.JSON,
520
512
  })
521
513
  public techStack?: Array<TechStack> = undefined;
514
+
515
+ @ColumnAccessControl({
516
+ create: [
517
+ Permission.ProjectOwner,
518
+ Permission.ProjectAdmin,
519
+ Permission.ProjectMember,
520
+ Permission.CreateService,
521
+ ],
522
+ read: [
523
+ Permission.ProjectOwner,
524
+ Permission.ProjectAdmin,
525
+ Permission.ProjectMember,
526
+ Permission.ProjectMember,
527
+ Permission.ReadService,
528
+ ],
529
+ update: [
530
+ Permission.ProjectOwner,
531
+ Permission.ProjectAdmin,
532
+ Permission.ProjectMember,
533
+ Permission.EditService,
534
+ ],
535
+ })
536
+ @TableColumn({
537
+ type: TableColumnType.Number,
538
+ title: "Retain Telemetry Data For Days",
539
+ description: "Number of days to retain telemetry data for this service.",
540
+ })
541
+ @Column({
542
+ type: ColumnType.Number,
543
+ nullable: true,
544
+ unique: false,
545
+ default: 15,
546
+ })
547
+ public retainTelemetryDataForDays?: number = undefined;
522
548
  }
@@ -17,7 +17,7 @@ import ObjectID from "../../Types/ObjectID";
17
17
  import Permission from "../../Types/Permission";
18
18
  import { Column, Entity, Index, JoinColumn, ManyToOne } from "typeorm";
19
19
  import DatabaseBaseModel from "./DatabaseBaseModel/DatabaseBaseModel";
20
- import TelemetryService from "./TelemetryService";
20
+ import Service from "./Service";
21
21
 
22
22
  @EnableDocumentation()
23
23
  @TenantColumn("projectId")
@@ -142,17 +142,16 @@ export default class TelemetryException extends DatabaseBaseModel {
142
142
  ],
143
143
  })
144
144
  @TableColumn({
145
- manyToOneRelationColumn: "telemetryServiceId",
145
+ manyToOneRelationColumn: "serviceId",
146
146
  type: TableColumnType.Entity,
147
- modelType: TelemetryService,
148
- title: "Telemetry Service",
149
- description:
150
- "Relation to Telemetry Service Resource in which this object belongs",
147
+ modelType: Service,
148
+ title: "Service",
149
+ description: "Relation to Service Resource in which this object belongs",
151
150
  example: "d4e5f6a7-b8c9-0123-def1-234567890123",
152
151
  })
153
152
  @ManyToOne(
154
153
  () => {
155
- return TelemetryService;
154
+ return Service;
156
155
  },
157
156
  {
158
157
  eager: false,
@@ -161,8 +160,8 @@ export default class TelemetryException extends DatabaseBaseModel {
161
160
  orphanedRowAction: "nullify",
162
161
  },
163
162
  )
164
- @JoinColumn({ name: "telemetryServiceId" })
165
- public telemetryService?: TelemetryService = undefined;
163
+ @JoinColumn({ name: "serviceId" })
164
+ public service?: Service = undefined;
166
165
 
167
166
  @ColumnAccessControl({
168
167
  create: [
@@ -186,9 +185,8 @@ export default class TelemetryException extends DatabaseBaseModel {
186
185
  @TableColumn({
187
186
  type: TableColumnType.ObjectID,
188
187
  required: true,
189
- title: "Telemetry Service ID",
190
- description:
191
- "ID of your Telemetry Service resource where this object belongs",
188
+ title: "Service ID",
189
+ description: "ID of your Service resource where this object belongs",
192
190
  example: "d4e5f6a7-b8c9-0123-def1-234567890123",
193
191
  })
194
192
  @Column({
@@ -196,7 +194,7 @@ export default class TelemetryException extends DatabaseBaseModel {
196
194
  nullable: false,
197
195
  transformer: ObjectID.getDatabaseTransformer(),
198
196
  })
199
- public telemetryServiceId?: ObjectID = undefined;
197
+ public serviceId?: ObjectID = undefined;
200
198
 
201
199
  @ColumnAccessControl({
202
200
  create: [
@@ -1,5 +1,5 @@
1
1
  import Project from "./Project";
2
- import TelemetryService from "./TelemetryService";
2
+ import Service from "./Service";
3
3
  import User from "./User";
4
4
  import BaseModel from "./DatabaseBaseModel/DatabaseBaseModel";
5
5
  import Route from "../../Types/API/Route";
@@ -256,17 +256,16 @@ export default class TelemetryUsageBilling extends BaseModel {
256
256
  update: [],
257
257
  })
258
258
  @TableColumn({
259
- manyToOneRelationColumn: "telemetryServiceId",
259
+ manyToOneRelationColumn: "serviceId",
260
260
  type: TableColumnType.Entity,
261
- modelType: TelemetryService,
262
- title: "Telemetry Service",
263
- description:
264
- "Relation to Telemetry Service Resource in which this object belongs",
261
+ modelType: Service,
262
+ title: "Service",
263
+ description: "Relation to Service Resource in which this object belongs",
265
264
  example: "d4e5f6a7-b8c9-0123-def1-234567890123",
266
265
  })
267
266
  @ManyToOne(
268
267
  () => {
269
- return TelemetryService;
268
+ return Service;
270
269
  },
271
270
  {
272
271
  eager: false,
@@ -275,8 +274,8 @@ export default class TelemetryUsageBilling extends BaseModel {
275
274
  orphanedRowAction: "nullify",
276
275
  },
277
276
  )
278
- @JoinColumn({ name: "telemetryServiceId" })
279
- public telemetryService?: TelemetryService = undefined;
277
+ @JoinColumn({ name: "serviceId" })
278
+ public service?: Service = undefined;
280
279
 
281
280
  @ColumnAccessControl({
282
281
  create: [],
@@ -291,9 +290,8 @@ export default class TelemetryUsageBilling extends BaseModel {
291
290
  @TableColumn({
292
291
  type: TableColumnType.ObjectID,
293
292
  required: true,
294
- title: "Telemetry Service ID",
295
- description:
296
- "ID of your Telemetry Service resource where this object belongs",
293
+ title: "Service ID",
294
+ description: "ID of your Service resource where this object belongs",
297
295
  example: "d4e5f6a7-b8c9-0123-def1-234567890123",
298
296
  })
299
297
  @Column({
@@ -301,7 +299,7 @@ export default class TelemetryUsageBilling extends BaseModel {
301
299
  nullable: false,
302
300
  transformer: ObjectID.getDatabaseTransformer(),
303
301
  })
304
- public telemetryServiceId?: ObjectID = undefined;
302
+ public serviceId?: ObjectID = undefined;
305
303
 
306
304
  @ColumnAccessControl({
307
305
  create: [],
@@ -1,7 +1,6 @@
1
1
  import AIAgentService from "../Services/AIAgentService";
2
2
  import LlmProviderService from "../Services/LlmProviderService";
3
3
  import TelemetryExceptionService from "../Services/TelemetryExceptionService";
4
- import ServiceTelemetryServiceService from "../Services/ServiceTelemetryServiceService";
5
4
  import ServiceCodeRepositoryService from "../Services/ServiceCodeRepositoryService";
6
5
  import CodeRepositoryService from "../Services/CodeRepositoryService";
7
6
  import AIAgentTaskPullRequestService from "../Services/AIAgentTaskPullRequestService";
@@ -16,7 +15,6 @@ import Response from "../Utils/Response";
16
15
  import AIAgent from "../../Models/DatabaseModels/AIAgent";
17
16
  import LlmProvider from "../../Models/DatabaseModels/LlmProvider";
18
17
  import TelemetryException from "../../Models/DatabaseModels/TelemetryException";
19
- import ServiceTelemetryService from "../../Models/DatabaseModels/ServiceTelemetryService";
20
18
  import ServiceCodeRepository from "../../Models/DatabaseModels/ServiceCodeRepository";
21
19
  import CodeRepository from "../../Models/DatabaseModels/CodeRepository";
22
20
  import AIAgentTaskPullRequest from "../../Models/DatabaseModels/AIAgentTaskPullRequest";
@@ -164,7 +162,7 @@ export default class AIAgentDataAPI {
164
162
  data["exceptionId"] as string,
165
163
  );
166
164
 
167
- // Get exception with telemetry service
165
+ // Get exception with service
168
166
  const exception: TelemetryException | null =
169
167
  await TelemetryExceptionService.findOneById({
170
168
  id: exceptionId,
@@ -174,8 +172,8 @@ export default class AIAgentDataAPI {
174
172
  stackTrace: true,
175
173
  exceptionType: true,
176
174
  fingerprint: true,
177
- telemetryServiceId: true,
178
- telemetryService: {
175
+ serviceId: true,
176
+ service: {
179
177
  _id: true,
180
178
  name: true,
181
179
  description: true,
@@ -206,11 +204,11 @@ export default class AIAgentDataAPI {
206
204
  exceptionType: exception.exceptionType,
207
205
  fingerprint: exception.fingerprint,
208
206
  },
209
- telemetryService: exception.telemetryServiceId
207
+ service: exception.serviceId
210
208
  ? {
211
- id: exception.telemetryServiceId.toString(),
212
- name: exception.telemetryService?.name,
213
- description: exception.telemetryService?.description,
209
+ id: exception.serviceId.toString(),
210
+ name: exception.service?.name,
211
+ description: exception.service?.description,
214
212
  }
215
213
  : null,
216
214
  });
@@ -220,7 +218,7 @@ export default class AIAgentDataAPI {
220
218
  },
221
219
  );
222
220
 
223
- // Get code repositories linked to a telemetry service via Service
221
+ // Get code repositories linked to a service
224
222
  this.router.post(
225
223
  "/ai-agent-data/get-code-repositories",
226
224
  async (
@@ -242,54 +240,22 @@ export default class AIAgentDataAPI {
242
240
  );
243
241
  }
244
242
 
245
- // Get telemetry service ID
246
- if (!data["telemetryServiceId"]) {
243
+ // Get service ID (supports both serviceId and legacy telemetryServiceId)
244
+ const serviceIdParam: string | undefined =
245
+ (data["serviceId"] as string) ||
246
+ (data["telemetryServiceId"] as string);
247
+
248
+ if (!serviceIdParam) {
247
249
  return Response.sendErrorResponse(
248
250
  req,
249
251
  res,
250
- new BadDataException("telemetryServiceId is required"),
251
- );
252
- }
253
-
254
- const telemetryServiceId: ObjectID = new ObjectID(
255
- data["telemetryServiceId"] as string,
256
- );
257
-
258
- // Step 1: Find Services linked to this TelemetryService
259
- const serviceTelemetryServices: Array<ServiceTelemetryService> =
260
- await ServiceTelemetryServiceService.findBy({
261
- query: {
262
- telemetryServiceId: telemetryServiceId,
263
- },
264
- select: {
265
- serviceId: true,
266
- },
267
- skip: 0,
268
- limit: LIMIT_MAX,
269
- props: {
270
- isRoot: true,
271
- },
272
- });
273
-
274
- if (serviceTelemetryServices.length === 0) {
275
- logger.debug(
276
- `No services found for telemetry service ${telemetryServiceId.toString()}`,
252
+ new BadDataException("serviceId is required"),
277
253
  );
278
- return Response.sendJsonObjectResponse(req, res, {
279
- repositories: [],
280
- });
281
254
  }
282
255
 
283
- // Extract service IDs
284
- const serviceIds: Array<ObjectID> = serviceTelemetryServices
285
- .filter((s: ServiceTelemetryService) => {
286
- return s.serviceId;
287
- })
288
- .map((s: ServiceTelemetryService) => {
289
- return s.serviceId as ObjectID;
290
- });
256
+ const serviceId: ObjectID = new ObjectID(serviceIdParam);
291
257
 
292
- // Step 2: Find CodeRepositories linked to these Services
258
+ // Find CodeRepositories linked to this Service
293
259
  const repositories: Array<{
294
260
  id: string;
295
261
  name: string;
@@ -301,70 +267,67 @@ export default class AIAgentDataAPI {
301
267
  gitHubAppInstallationId: string | null;
302
268
  }> = [];
303
269
 
304
- for (const serviceId of serviceIds) {
305
- const serviceCodeRepositories: Array<ServiceCodeRepository> =
306
- await ServiceCodeRepositoryService.findBy({
307
- query: {
308
- serviceId: serviceId,
309
- },
310
- select: {
311
- codeRepositoryId: true,
312
- servicePathInRepository: true,
313
- codeRepository: {
314
- _id: true,
315
- name: true,
316
- repositoryHostedAt: true,
317
- organizationName: true,
318
- repositoryName: true,
319
- mainBranchName: true,
320
- gitHubAppInstallationId: true,
321
- },
270
+ const serviceCodeRepositories: Array<ServiceCodeRepository> =
271
+ await ServiceCodeRepositoryService.findBy({
272
+ query: {
273
+ serviceId: serviceId,
274
+ },
275
+ select: {
276
+ codeRepositoryId: true,
277
+ servicePathInRepository: true,
278
+ codeRepository: {
279
+ _id: true,
280
+ name: true,
281
+ repositoryHostedAt: true,
282
+ organizationName: true,
283
+ repositoryName: true,
284
+ mainBranchName: true,
285
+ gitHubAppInstallationId: true,
322
286
  },
323
- skip: 0,
324
- limit: LIMIT_MAX,
325
- props: {
326
- isRoot: true,
287
+ },
288
+ skip: 0,
289
+ limit: LIMIT_MAX,
290
+ props: {
291
+ isRoot: true,
292
+ },
293
+ });
294
+
295
+ for (const scr of serviceCodeRepositories) {
296
+ if (scr.codeRepository) {
297
+ // Check if we already have this repository
298
+ const existingRepo: boolean = repositories.some(
299
+ (r: {
300
+ id: string;
301
+ name: string;
302
+ repositoryHostedAt: string;
303
+ organizationName: string;
304
+ repositoryName: string;
305
+ mainBranchName: string;
306
+ servicePathInRepository: string | null;
307
+ gitHubAppInstallationId: string | null;
308
+ }) => {
309
+ return r.id === scr.codeRepository?._id?.toString();
327
310
  },
328
- });
329
-
330
- for (const scr of serviceCodeRepositories) {
331
- if (scr.codeRepository) {
332
- // Check if we already have this repository
333
- const existingRepo: boolean = repositories.some(
334
- (r: {
335
- id: string;
336
- name: string;
337
- repositoryHostedAt: string;
338
- organizationName: string;
339
- repositoryName: string;
340
- mainBranchName: string;
341
- servicePathInRepository: string | null;
342
- gitHubAppInstallationId: string | null;
343
- }) => {
344
- return r.id === scr.codeRepository?._id?.toString();
345
- },
346
- );
347
- if (!existingRepo) {
348
- repositories.push({
349
- id: scr.codeRepository._id?.toString() || "",
350
- name: scr.codeRepository.name || "",
351
- repositoryHostedAt:
352
- scr.codeRepository.repositoryHostedAt || "",
353
- organizationName: scr.codeRepository.organizationName || "",
354
- repositoryName: scr.codeRepository.repositoryName || "",
355
- mainBranchName: scr.codeRepository.mainBranchName || "main",
356
- servicePathInRepository:
357
- scr.servicePathInRepository || null,
358
- gitHubAppInstallationId:
359
- scr.codeRepository.gitHubAppInstallationId || null,
360
- });
361
- }
311
+ );
312
+ if (!existingRepo) {
313
+ repositories.push({
314
+ id: scr.codeRepository._id?.toString() || "",
315
+ name: scr.codeRepository.name || "",
316
+ repositoryHostedAt:
317
+ scr.codeRepository.repositoryHostedAt || "",
318
+ organizationName: scr.codeRepository.organizationName || "",
319
+ repositoryName: scr.codeRepository.repositoryName || "",
320
+ mainBranchName: scr.codeRepository.mainBranchName || "main",
321
+ servicePathInRepository: scr.servicePathInRepository || null,
322
+ gitHubAppInstallationId:
323
+ scr.codeRepository.gitHubAppInstallationId || null,
324
+ });
362
325
  }
363
326
  }
364
327
  }
365
328
 
366
329
  logger.debug(
367
- `Found ${repositories.length} code repositories for telemetry service ${telemetryServiceId.toString()}`,
330
+ `Found ${repositories.length} code repositories for service ${serviceId.toString()}`,
368
331
  );
369
332
 
370
333
  return Response.sendJsonObjectResponse(req, res, {