@oneuptime/common 9.2.27 → 9.3.1

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 (263) hide show
  1. package/Models/DatabaseModels/AIAgent.ts +589 -0
  2. package/Models/DatabaseModels/AIAgentOwnerTeam.ts +434 -0
  3. package/Models/DatabaseModels/AIAgentOwnerUser.ts +433 -0
  4. package/Models/DatabaseModels/AIAgentTask.ts +549 -0
  5. package/Models/DatabaseModels/AIAgentTaskLog.ts +417 -0
  6. package/Models/DatabaseModels/AIAgentTaskPullRequest.ts +731 -0
  7. package/Models/DatabaseModels/AIAgentTaskTelemetryException.ts +388 -0
  8. package/Models/DatabaseModels/Index.ts +15 -0
  9. package/Models/DatabaseModels/Monitor.ts +33 -0
  10. package/Models/DatabaseModels/Project.ts +25 -0
  11. package/Models/DatabaseModels/TelemetryException.ts +1 -1
  12. package/Server/API/AIAgentAPI.ts +200 -0
  13. package/Server/API/AIAgentDataAPI.ts +692 -0
  14. package/Server/API/AIAgentTaskAPI.ts +286 -0
  15. package/Server/API/AIAgentTaskLogAPI.ts +165 -0
  16. package/Server/API/AIAgentTaskPullRequestAPI.ts +14 -0
  17. package/Server/API/GitHubAPI.ts +25 -7
  18. package/Server/API/TelemetryExceptionAPI.ts +169 -0
  19. package/Server/EnvironmentConfig.ts +3 -0
  20. package/Server/Infrastructure/Postgres/SchemaMigrations/1766590916627-MigrationName.ts +195 -0
  21. package/Server/Infrastructure/Postgres/SchemaMigrations/1766600860972-MigrationName.ts +31 -0
  22. package/Server/Infrastructure/Postgres/SchemaMigrations/1766606720183-MigrationName.ts +17 -0
  23. package/Server/Infrastructure/Postgres/SchemaMigrations/1766688107858-MigrationName.ts +63 -0
  24. package/Server/Infrastructure/Postgres/SchemaMigrations/1766754182870-MigrationName.ts +75 -0
  25. package/Server/Infrastructure/Postgres/SchemaMigrations/1766774689743-MigrationName.ts +157 -0
  26. package/Server/Infrastructure/Postgres/SchemaMigrations/1766777986427-MigrationName.ts +33 -0
  27. package/Server/Infrastructure/Postgres/SchemaMigrations/1766918848434-AddAIAgentIsDefault.ts +27 -0
  28. package/Server/Infrastructure/Postgres/SchemaMigrations/1766923324521-MigrationName.ts +37 -0
  29. package/Server/Infrastructure/Postgres/SchemaMigrations/1766958924188-AddGitHubAppInstallationIdToProject.ts +31 -0
  30. package/Server/Infrastructure/Postgres/SchemaMigrations/1767009661768-MigrationName.ts +35 -0
  31. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +22 -0
  32. package/Server/Services/AIAgentOwnerTeamService.ts +10 -0
  33. package/Server/Services/AIAgentOwnerUserService.ts +10 -0
  34. package/Server/Services/AIAgentService.ts +564 -0
  35. package/Server/Services/AIAgentTaskLogService.ts +10 -0
  36. package/Server/Services/AIAgentTaskPullRequestService.ts +10 -0
  37. package/Server/Services/AIAgentTaskService.ts +178 -0
  38. package/Server/Services/AIAgentTaskTelemetryExceptionService.ts +39 -0
  39. package/Server/Services/Index.ts +10 -0
  40. package/Server/Services/TelemetryExceptionService.ts +162 -0
  41. package/Server/Utils/Monitor/MonitorResource.ts +228 -0
  42. package/Server/Utils/PushNotificationUtil.ts +29 -0
  43. package/Server/Utils/WhatsAppTemplateUtil.ts +6 -0
  44. package/Tests/UI/Components/Badge.test.tsx +5 -5
  45. package/Tests/UI/Components/Card.test.tsx +4 -8
  46. package/Tests/UI/Components/HiddenText.test.tsx +2 -5
  47. package/Tests/UI/Components/SideMenuItem.test.tsx +4 -2
  48. package/Types/AI/AIAgentTaskMetadata.ts +25 -0
  49. package/Types/AI/AIAgentTaskStatus.ts +65 -0
  50. package/Types/AI/AIAgentTaskType.ts +40 -0
  51. package/Types/Email/EmailTemplateType.ts +2 -0
  52. package/Types/Monitor/MonitorEvaluationSummary.ts +2 -1
  53. package/Types/NotificationSetting/NotificationSettingEventType.ts +4 -0
  54. package/Types/Permission.ts +176 -0
  55. package/Types/WhatsApp/WhatsAppTemplates.ts +9 -0
  56. package/UI/Components/AIAgent/AIAgent.tsx +69 -0
  57. package/UI/Components/Badge/Badge.tsx +9 -5
  58. package/UI/Components/Banner/Banner.tsx +1 -1
  59. package/UI/Components/Card/Card.tsx +14 -12
  60. package/UI/Components/CodeBlock/CodeBlock.tsx +47 -4
  61. package/UI/Components/Detail/Detail.tsx +239 -49
  62. package/UI/Components/Detail/FieldLabel.tsx +35 -11
  63. package/UI/Components/Detail/PlaceholderText.tsx +18 -1
  64. package/UI/Components/Footer/Footer.tsx +9 -7
  65. package/UI/Components/Header/Header.tsx +4 -3
  66. package/UI/Components/Header/HeaderIconDropdownButton.tsx +13 -11
  67. package/UI/Components/Header/IconDropdown/IconDropdownItem.tsx +3 -3
  68. package/UI/Components/Header/IconDropdown/IconDropdownMenu.tsx +1 -1
  69. package/UI/Components/Header/ProjectPicker/CreateNewProjectButton.tsx +4 -4
  70. package/UI/Components/Header/ProjectPicker/ProjectPicker.tsx +6 -6
  71. package/UI/Components/Header/ProjectPicker/ProjectPickerFilterBox.tsx +3 -3
  72. package/UI/Components/Header/ProjectPicker/ProjectPickerMenu.tsx +1 -1
  73. package/UI/Components/Header/ProjectPicker/ProjectPickerMenuItem.tsx +4 -4
  74. package/UI/Components/HeaderAlert/HeaderAlert.tsx +32 -32
  75. package/UI/Components/HeaderAlert/HeaderAlertGroup.tsx +1 -7
  76. package/UI/Components/HiddenText/HiddenText.tsx +98 -27
  77. package/UI/Components/Icon/Icon.tsx +12 -9
  78. package/UI/Components/InfoCard/InfoCard.tsx +7 -3
  79. package/UI/Components/ModelTable/BaseModelTable.tsx +1 -1
  80. package/UI/Components/ObjectID/ObjectIDView.tsx +73 -0
  81. package/UI/Components/Page/Page.tsx +3 -5
  82. package/UI/Components/SideMenu/SideMenu.tsx +175 -40
  83. package/UI/Components/SideMenu/SideMenuDivider.tsx +17 -0
  84. package/UI/Components/SideMenu/SideMenuItem.tsx +111 -158
  85. package/UI/Components/SideMenu/SideMenuSection.tsx +53 -3
  86. package/UI/Components/Table/Table.tsx +1 -1
  87. package/UI/Components/Types/FieldType.ts +2 -0
  88. package/UI/Config.ts +5 -0
  89. package/build/dist/Models/DatabaseModels/AIAgent.js +614 -0
  90. package/build/dist/Models/DatabaseModels/AIAgent.js.map +1 -0
  91. package/build/dist/Models/DatabaseModels/AIAgentOwnerTeam.js +452 -0
  92. package/build/dist/Models/DatabaseModels/AIAgentOwnerTeam.js.map +1 -0
  93. package/build/dist/Models/DatabaseModels/AIAgentOwnerUser.js +451 -0
  94. package/build/dist/Models/DatabaseModels/AIAgentOwnerUser.js.map +1 -0
  95. package/build/dist/Models/DatabaseModels/AIAgentTask.js +580 -0
  96. package/build/dist/Models/DatabaseModels/AIAgentTask.js.map +1 -0
  97. package/build/dist/Models/DatabaseModels/AIAgentTaskLog.js +438 -0
  98. package/build/dist/Models/DatabaseModels/AIAgentTaskLog.js.map +1 -0
  99. package/build/dist/Models/DatabaseModels/AIAgentTaskPullRequest.js +771 -0
  100. package/build/dist/Models/DatabaseModels/AIAgentTaskPullRequest.js.map +1 -0
  101. package/build/dist/Models/DatabaseModels/AIAgentTaskTelemetryException.js +404 -0
  102. package/build/dist/Models/DatabaseModels/AIAgentTaskTelemetryException.js.map +1 -0
  103. package/build/dist/Models/DatabaseModels/Index.js +14 -0
  104. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  105. package/build/dist/Models/DatabaseModels/Monitor.js +34 -0
  106. package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
  107. package/build/dist/Models/DatabaseModels/Project.js +26 -0
  108. package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
  109. package/build/dist/Models/DatabaseModels/TelemetryException.js +1 -1
  110. package/build/dist/Models/DatabaseModels/TelemetryException.js.map +1 -1
  111. package/build/dist/Server/API/AIAgentAPI.js +141 -0
  112. package/build/dist/Server/API/AIAgentAPI.js.map +1 -0
  113. package/build/dist/Server/API/AIAgentDataAPI.js +415 -0
  114. package/build/dist/Server/API/AIAgentDataAPI.js.map +1 -0
  115. package/build/dist/Server/API/AIAgentTaskAPI.js +199 -0
  116. package/build/dist/Server/API/AIAgentTaskAPI.js.map +1 -0
  117. package/build/dist/Server/API/AIAgentTaskLogAPI.js +106 -0
  118. package/build/dist/Server/API/AIAgentTaskLogAPI.js.map +1 -0
  119. package/build/dist/Server/API/AIAgentTaskPullRequestAPI.js +9 -0
  120. package/build/dist/Server/API/AIAgentTaskPullRequestAPI.js.map +1 -0
  121. package/build/dist/Server/API/GitHubAPI.js +23 -8
  122. package/build/dist/Server/API/GitHubAPI.js.map +1 -1
  123. package/build/dist/Server/API/TelemetryExceptionAPI.js +120 -0
  124. package/build/dist/Server/API/TelemetryExceptionAPI.js.map +1 -0
  125. package/build/dist/Server/EnvironmentConfig.js +2 -0
  126. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  127. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1766590916627-MigrationName.js +74 -0
  128. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1766590916627-MigrationName.js.map +1 -0
  129. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1766600860972-MigrationName.js +18 -0
  130. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1766600860972-MigrationName.js.map +1 -0
  131. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1766606720183-MigrationName.js +12 -0
  132. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1766606720183-MigrationName.js.map +1 -0
  133. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1766688107858-MigrationName.js +28 -0
  134. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1766688107858-MigrationName.js.map +1 -0
  135. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1766754182870-MigrationName.js +32 -0
  136. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1766754182870-MigrationName.js.map +1 -0
  137. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1766774689743-MigrationName.js +60 -0
  138. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1766774689743-MigrationName.js.map +1 -0
  139. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1766777986427-MigrationName.js +18 -0
  140. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1766777986427-MigrationName.js.map +1 -0
  141. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1766918848434-AddAIAgentIsDefault.js +16 -0
  142. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1766918848434-AddAIAgentIsDefault.js.map +1 -0
  143. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1766923324521-MigrationName.js +20 -0
  144. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1766923324521-MigrationName.js.map +1 -0
  145. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1766958924188-AddGitHubAppInstallationIdToProject.js +16 -0
  146. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1766958924188-AddGitHubAppInstallationIdToProject.js.map +1 -0
  147. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1767009661768-MigrationName.js +18 -0
  148. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1767009661768-MigrationName.js.map +1 -0
  149. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +22 -0
  150. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  151. package/build/dist/Server/Services/AIAgentOwnerTeamService.js +9 -0
  152. package/build/dist/Server/Services/AIAgentOwnerTeamService.js.map +1 -0
  153. package/build/dist/Server/Services/AIAgentOwnerUserService.js +9 -0
  154. package/build/dist/Server/Services/AIAgentOwnerUserService.js.map +1 -0
  155. package/build/dist/Server/Services/AIAgentService.js +471 -0
  156. package/build/dist/Server/Services/AIAgentService.js.map +1 -0
  157. package/build/dist/Server/Services/AIAgentTaskLogService.js +9 -0
  158. package/build/dist/Server/Services/AIAgentTaskLogService.js.map +1 -0
  159. package/build/dist/Server/Services/AIAgentTaskPullRequestService.js +9 -0
  160. package/build/dist/Server/Services/AIAgentTaskPullRequestService.js.map +1 -0
  161. package/build/dist/Server/Services/AIAgentTaskService.js +158 -0
  162. package/build/dist/Server/Services/AIAgentTaskService.js.map +1 -0
  163. package/build/dist/Server/Services/AIAgentTaskTelemetryExceptionService.js +36 -0
  164. package/build/dist/Server/Services/AIAgentTaskTelemetryExceptionService.js.map +1 -0
  165. package/build/dist/Server/Services/Index.js +10 -0
  166. package/build/dist/Server/Services/Index.js.map +1 -1
  167. package/build/dist/Server/Services/TelemetryExceptionService.js +137 -0
  168. package/build/dist/Server/Services/TelemetryExceptionService.js.map +1 -1
  169. package/build/dist/Server/Utils/Monitor/MonitorResource.js +168 -0
  170. package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
  171. package/build/dist/Server/Utils/PushNotificationUtil.js +21 -0
  172. package/build/dist/Server/Utils/PushNotificationUtil.js.map +1 -1
  173. package/build/dist/Server/Utils/WhatsAppTemplateUtil.js +4 -0
  174. package/build/dist/Server/Utils/WhatsAppTemplateUtil.js.map +1 -1
  175. package/build/dist/Tests/UI/Components/Badge.test.js +5 -5
  176. package/build/dist/Tests/UI/Components/Badge.test.js.map +1 -1
  177. package/build/dist/Tests/UI/Components/Card.test.js +4 -8
  178. package/build/dist/Tests/UI/Components/Card.test.js.map +1 -1
  179. package/build/dist/Tests/UI/Components/HiddenText.test.js +2 -3
  180. package/build/dist/Tests/UI/Components/HiddenText.test.js.map +1 -1
  181. package/build/dist/Tests/UI/Components/SideMenuItem.test.js +3 -2
  182. package/build/dist/Tests/UI/Components/SideMenuItem.test.js.map +1 -1
  183. package/build/dist/Types/AI/AIAgentTaskMetadata.js +6 -0
  184. package/build/dist/Types/AI/AIAgentTaskMetadata.js.map +1 -0
  185. package/build/dist/Types/AI/AIAgentTaskStatus.js +51 -0
  186. package/build/dist/Types/AI/AIAgentTaskStatus.js.map +1 -0
  187. package/build/dist/Types/AI/AIAgentTaskType.js +29 -0
  188. package/build/dist/Types/AI/AIAgentTaskType.js.map +1 -0
  189. package/build/dist/Types/Email/EmailTemplateType.js +2 -0
  190. package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
  191. package/build/dist/Types/NotificationSetting/NotificationSettingEventType.js +3 -0
  192. package/build/dist/Types/NotificationSetting/NotificationSettingEventType.js.map +1 -1
  193. package/build/dist/Types/Permission.js +160 -0
  194. package/build/dist/Types/Permission.js.map +1 -1
  195. package/build/dist/Types/WhatsApp/WhatsAppTemplates.js +6 -0
  196. package/build/dist/Types/WhatsApp/WhatsAppTemplates.js.map +1 -1
  197. package/build/dist/UI/Components/AIAgent/AIAgent.js +32 -0
  198. package/build/dist/UI/Components/AIAgent/AIAgent.js.map +1 -0
  199. package/build/dist/UI/Components/Badge/Badge.js +9 -5
  200. package/build/dist/UI/Components/Badge/Badge.js.map +1 -1
  201. package/build/dist/UI/Components/Banner/Banner.js +1 -1
  202. package/build/dist/UI/Components/Banner/Banner.js.map +1 -1
  203. package/build/dist/UI/Components/Card/Card.js +12 -12
  204. package/build/dist/UI/Components/Card/Card.js.map +1 -1
  205. package/build/dist/UI/Components/CodeBlock/CodeBlock.js +22 -2
  206. package/build/dist/UI/Components/CodeBlock/CodeBlock.js.map +1 -1
  207. package/build/dist/UI/Components/Detail/Detail.js +117 -37
  208. package/build/dist/UI/Components/Detail/Detail.js.map +1 -1
  209. package/build/dist/UI/Components/Detail/FieldLabel.js +12 -7
  210. package/build/dist/UI/Components/Detail/FieldLabel.js.map +1 -1
  211. package/build/dist/UI/Components/Detail/PlaceholderText.js +4 -1
  212. package/build/dist/UI/Components/Detail/PlaceholderText.js.map +1 -1
  213. package/build/dist/UI/Components/Footer/Footer.js +6 -6
  214. package/build/dist/UI/Components/Footer/Footer.js.map +1 -1
  215. package/build/dist/UI/Components/Header/Header.js +4 -3
  216. package/build/dist/UI/Components/Header/Header.js.map +1 -1
  217. package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js +7 -7
  218. package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js.map +1 -1
  219. package/build/dist/UI/Components/Header/IconDropdown/IconDropdownItem.js +3 -3
  220. package/build/dist/UI/Components/Header/IconDropdown/IconDropdownItem.js.map +1 -1
  221. package/build/dist/UI/Components/Header/IconDropdown/IconDropdownMenu.js +1 -1
  222. package/build/dist/UI/Components/Header/IconDropdown/IconDropdownMenu.js.map +1 -1
  223. package/build/dist/UI/Components/Header/ProjectPicker/CreateNewProjectButton.js +4 -4
  224. package/build/dist/UI/Components/Header/ProjectPicker/CreateNewProjectButton.js.map +1 -1
  225. package/build/dist/UI/Components/Header/ProjectPicker/ProjectPicker.js +6 -6
  226. package/build/dist/UI/Components/Header/ProjectPicker/ProjectPicker.js.map +1 -1
  227. package/build/dist/UI/Components/Header/ProjectPicker/ProjectPickerFilterBox.js +2 -2
  228. package/build/dist/UI/Components/Header/ProjectPicker/ProjectPickerFilterBox.js.map +1 -1
  229. package/build/dist/UI/Components/Header/ProjectPicker/ProjectPickerMenu.js +1 -1
  230. package/build/dist/UI/Components/Header/ProjectPicker/ProjectPickerMenu.js.map +1 -1
  231. package/build/dist/UI/Components/Header/ProjectPicker/ProjectPickerMenuItem.js +4 -4
  232. package/build/dist/UI/Components/Header/ProjectPicker/ProjectPickerMenuItem.js.map +1 -1
  233. package/build/dist/UI/Components/HeaderAlert/HeaderAlert.js +31 -29
  234. package/build/dist/UI/Components/HeaderAlert/HeaderAlert.js.map +1 -1
  235. package/build/dist/UI/Components/HeaderAlert/HeaderAlertGroup.js +1 -3
  236. package/build/dist/UI/Components/HeaderAlert/HeaderAlertGroup.js.map +1 -1
  237. package/build/dist/UI/Components/HiddenText/HiddenText.js +33 -14
  238. package/build/dist/UI/Components/HiddenText/HiddenText.js.map +1 -1
  239. package/build/dist/UI/Components/Icon/Icon.js +3 -4
  240. package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
  241. package/build/dist/UI/Components/InfoCard/InfoCard.js +3 -3
  242. package/build/dist/UI/Components/InfoCard/InfoCard.js.map +1 -1
  243. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +1 -1
  244. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  245. package/build/dist/UI/Components/ObjectID/ObjectIDView.js +30 -0
  246. package/build/dist/UI/Components/ObjectID/ObjectIDView.js.map +1 -0
  247. package/build/dist/UI/Components/Page/Page.js +3 -3
  248. package/build/dist/UI/Components/Page/Page.js.map +1 -1
  249. package/build/dist/UI/Components/SideMenu/SideMenu.js +82 -17
  250. package/build/dist/UI/Components/SideMenu/SideMenu.js.map +1 -1
  251. package/build/dist/UI/Components/SideMenu/SideMenuDivider.js +7 -0
  252. package/build/dist/UI/Components/SideMenu/SideMenuDivider.js.map +1 -0
  253. package/build/dist/UI/Components/SideMenu/SideMenuItem.js +68 -97
  254. package/build/dist/UI/Components/SideMenu/SideMenuItem.js.map +1 -1
  255. package/build/dist/UI/Components/SideMenu/SideMenuSection.js +18 -3
  256. package/build/dist/UI/Components/SideMenu/SideMenuSection.js.map +1 -1
  257. package/build/dist/UI/Components/Table/Table.js +1 -1
  258. package/build/dist/UI/Components/Table/Table.js.map +1 -1
  259. package/build/dist/UI/Components/Types/FieldType.js +2 -0
  260. package/build/dist/UI/Components/Types/FieldType.js.map +1 -1
  261. package/build/dist/UI/Config.js +2 -0
  262. package/build/dist/UI/Config.js.map +1 -1
  263. package/package.json +1 -1
@@ -0,0 +1,692 @@
1
+ import AIAgentService from "../Services/AIAgentService";
2
+ import LlmProviderService from "../Services/LlmProviderService";
3
+ import TelemetryExceptionService from "../Services/TelemetryExceptionService";
4
+ import ServiceCatalogTelemetryServiceService from "../Services/ServiceCatalogTelemetryServiceService";
5
+ import ServiceCatalogCodeRepositoryService from "../Services/ServiceCatalogCodeRepositoryService";
6
+ import CodeRepositoryService from "../Services/CodeRepositoryService";
7
+ import AIAgentTaskPullRequestService from "../Services/AIAgentTaskPullRequestService";
8
+ import AIAgentTaskService from "../Services/AIAgentTaskService";
9
+ import Express, {
10
+ ExpressRequest,
11
+ ExpressResponse,
12
+ ExpressRouter,
13
+ NextFunction,
14
+ } from "../Utils/Express";
15
+ import Response from "../Utils/Response";
16
+ import AIAgent from "../../Models/DatabaseModels/AIAgent";
17
+ import LlmProvider from "../../Models/DatabaseModels/LlmProvider";
18
+ import TelemetryException from "../../Models/DatabaseModels/TelemetryException";
19
+ import ServiceCatalogTelemetryService from "../../Models/DatabaseModels/ServiceCatalogTelemetryService";
20
+ import ServiceCatalogCodeRepository from "../../Models/DatabaseModels/ServiceCatalogCodeRepository";
21
+ import CodeRepository from "../../Models/DatabaseModels/CodeRepository";
22
+ import AIAgentTaskPullRequest from "../../Models/DatabaseModels/AIAgentTaskPullRequest";
23
+ import AIAgentTask from "../../Models/DatabaseModels/AIAgentTask";
24
+ import BadDataException from "../../Types/Exception/BadDataException";
25
+ import { JSONObject } from "../../Types/JSON";
26
+ import ObjectID from "../../Types/ObjectID";
27
+ import GitHubUtil, {
28
+ GitHubInstallationToken,
29
+ } from "../Utils/CodeRepository/GitHub/GitHub";
30
+ import CodeRepositoryType from "../../Types/CodeRepository/CodeRepositoryType";
31
+ import LIMIT_MAX from "../../Types/Database/LimitMax";
32
+ import URL from "../../Types/API/URL";
33
+ import PullRequestState from "../../Types/CodeRepository/PullRequestState";
34
+ import logger from "../Utils/Logger";
35
+
36
+ export default class AIAgentDataAPI {
37
+ public router!: ExpressRouter;
38
+
39
+ public constructor() {
40
+ this.router = Express.getRouter();
41
+ this.initRoutes();
42
+ }
43
+
44
+ public getRouter(): ExpressRouter {
45
+ return this.router;
46
+ }
47
+
48
+ private initRoutes(): void {
49
+ // Get LLM configuration for a project
50
+ this.router.post(
51
+ "/ai-agent-data/get-llm-config",
52
+ async (
53
+ req: ExpressRequest,
54
+ res: ExpressResponse,
55
+ next: NextFunction,
56
+ ): Promise<void> => {
57
+ try {
58
+ const data: JSONObject = req.body;
59
+
60
+ // Validate AI Agent credentials
61
+ const aiAgent: AIAgent | null = await this.validateAIAgent(data);
62
+
63
+ if (!aiAgent) {
64
+ return Response.sendErrorResponse(
65
+ req,
66
+ res,
67
+ new BadDataException("Invalid AI Agent ID or AI Agent Key"),
68
+ );
69
+ }
70
+
71
+ // Get project ID
72
+ if (!data["projectId"]) {
73
+ return Response.sendErrorResponse(
74
+ req,
75
+ res,
76
+ new BadDataException("projectId is required"),
77
+ );
78
+ }
79
+
80
+ const projectId: ObjectID = new ObjectID(data["projectId"] as string);
81
+
82
+ // Check if this is a Project AI Agent (has a projectId)
83
+ const isProjectAIAgent: boolean =
84
+ aiAgent.projectId !== null && aiAgent.projectId !== undefined;
85
+
86
+ // Get LLM provider for the project
87
+ const llmProvider: LlmProvider | null =
88
+ await LlmProviderService.getLLMProviderForProject(projectId);
89
+
90
+ if (!llmProvider) {
91
+ return Response.sendErrorResponse(
92
+ req,
93
+ res,
94
+ new BadDataException(
95
+ "No LLM provider configured for this project",
96
+ ),
97
+ );
98
+ }
99
+
100
+ /*
101
+ * Security check: Project AI Agents cannot access Global LLM Providers
102
+ * Only Global AI Agents (projectId is null) can access Global LLM Providers
103
+ */
104
+ const isGlobalLLMProvider: boolean = llmProvider.isGlobalLlm === true;
105
+
106
+ if (isProjectAIAgent && isGlobalLLMProvider) {
107
+ return Response.sendErrorResponse(
108
+ req,
109
+ res,
110
+ new BadDataException(
111
+ "Project AI Agents cannot access Global LLM Providers. Please configure a project-specific LLM Provider.",
112
+ ),
113
+ );
114
+ }
115
+
116
+ logger.debug(
117
+ `LLM config fetched for project ${projectId.toString()}: ${llmProvider.llmType}`,
118
+ );
119
+
120
+ return Response.sendJsonObjectResponse(req, res, {
121
+ llmType: llmProvider.llmType,
122
+ apiKey: llmProvider.apiKey,
123
+ baseUrl: llmProvider.baseUrl,
124
+ modelName: llmProvider.modelName,
125
+ });
126
+ } catch (err) {
127
+ next(err);
128
+ }
129
+ },
130
+ );
131
+
132
+ // Get exception details with telemetry service info
133
+ this.router.post(
134
+ "/ai-agent-data/get-exception-details",
135
+ async (
136
+ req: ExpressRequest,
137
+ res: ExpressResponse,
138
+ next: NextFunction,
139
+ ): Promise<void> => {
140
+ try {
141
+ const data: JSONObject = req.body;
142
+
143
+ // Validate AI Agent credentials
144
+ const aiAgent: AIAgent | null = await this.validateAIAgent(data);
145
+
146
+ if (!aiAgent) {
147
+ return Response.sendErrorResponse(
148
+ req,
149
+ res,
150
+ new BadDataException("Invalid AI Agent ID or AI Agent Key"),
151
+ );
152
+ }
153
+
154
+ // Get exception ID
155
+ if (!data["exceptionId"]) {
156
+ return Response.sendErrorResponse(
157
+ req,
158
+ res,
159
+ new BadDataException("exceptionId is required"),
160
+ );
161
+ }
162
+
163
+ const exceptionId: ObjectID = new ObjectID(
164
+ data["exceptionId"] as string,
165
+ );
166
+
167
+ // Get exception with telemetry service
168
+ const exception: TelemetryException | null =
169
+ await TelemetryExceptionService.findOneById({
170
+ id: exceptionId,
171
+ select: {
172
+ _id: true,
173
+ message: true,
174
+ stackTrace: true,
175
+ exceptionType: true,
176
+ fingerprint: true,
177
+ telemetryServiceId: true,
178
+ telemetryService: {
179
+ _id: true,
180
+ name: true,
181
+ description: true,
182
+ },
183
+ },
184
+ props: {
185
+ isRoot: true,
186
+ },
187
+ });
188
+
189
+ if (!exception) {
190
+ return Response.sendErrorResponse(
191
+ req,
192
+ res,
193
+ new BadDataException("Exception not found"),
194
+ );
195
+ }
196
+
197
+ logger.debug(
198
+ `Exception details fetched: ${exception._id} - ${exception.message?.substring(0, 100)}`,
199
+ );
200
+
201
+ return Response.sendJsonObjectResponse(req, res, {
202
+ exception: {
203
+ id: exception._id?.toString(),
204
+ message: exception.message,
205
+ stackTrace: exception.stackTrace,
206
+ exceptionType: exception.exceptionType,
207
+ fingerprint: exception.fingerprint,
208
+ },
209
+ telemetryService: exception.telemetryServiceId
210
+ ? {
211
+ id: exception.telemetryServiceId.toString(),
212
+ name: exception.telemetryService?.name,
213
+ description: exception.telemetryService?.description,
214
+ }
215
+ : null,
216
+ });
217
+ } catch (err) {
218
+ next(err);
219
+ }
220
+ },
221
+ );
222
+
223
+ // Get code repositories linked to a telemetry service via ServiceCatalog
224
+ this.router.post(
225
+ "/ai-agent-data/get-code-repositories",
226
+ async (
227
+ req: ExpressRequest,
228
+ res: ExpressResponse,
229
+ next: NextFunction,
230
+ ): Promise<void> => {
231
+ try {
232
+ const data: JSONObject = req.body;
233
+
234
+ // Validate AI Agent credentials
235
+ const aiAgent: AIAgent | null = await this.validateAIAgent(data);
236
+
237
+ if (!aiAgent) {
238
+ return Response.sendErrorResponse(
239
+ req,
240
+ res,
241
+ new BadDataException("Invalid AI Agent ID or AI Agent Key"),
242
+ );
243
+ }
244
+
245
+ // Get telemetry service ID
246
+ if (!data["telemetryServiceId"]) {
247
+ return Response.sendErrorResponse(
248
+ req,
249
+ 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 ServiceCatalogs linked to this TelemetryService
259
+ const serviceCatalogTelemetryServices: Array<ServiceCatalogTelemetryService> =
260
+ await ServiceCatalogTelemetryServiceService.findBy({
261
+ query: {
262
+ telemetryServiceId: telemetryServiceId,
263
+ },
264
+ select: {
265
+ serviceCatalogId: true,
266
+ },
267
+ skip: 0,
268
+ limit: LIMIT_MAX,
269
+ props: {
270
+ isRoot: true,
271
+ },
272
+ });
273
+
274
+ if (serviceCatalogTelemetryServices.length === 0) {
275
+ logger.debug(
276
+ `No service catalogs found for telemetry service ${telemetryServiceId.toString()}`,
277
+ );
278
+ return Response.sendJsonObjectResponse(req, res, {
279
+ repositories: [],
280
+ });
281
+ }
282
+
283
+ // Extract service catalog IDs
284
+ const serviceCatalogIds: Array<ObjectID> =
285
+ serviceCatalogTelemetryServices
286
+ .filter((s: ServiceCatalogTelemetryService) => {
287
+ return s.serviceCatalogId;
288
+ })
289
+ .map((s: ServiceCatalogTelemetryService) => {
290
+ return s.serviceCatalogId as ObjectID;
291
+ });
292
+
293
+ // Step 2: Find CodeRepositories linked to these ServiceCatalogs
294
+ const repositories: Array<{
295
+ id: string;
296
+ name: string;
297
+ repositoryHostedAt: string;
298
+ organizationName: string;
299
+ repositoryName: string;
300
+ mainBranchName: string;
301
+ servicePathInRepository: string | null;
302
+ gitHubAppInstallationId: string | null;
303
+ }> = [];
304
+
305
+ for (const serviceCatalogId of serviceCatalogIds) {
306
+ const serviceCatalogCodeRepositories: Array<ServiceCatalogCodeRepository> =
307
+ await ServiceCatalogCodeRepositoryService.findBy({
308
+ query: {
309
+ serviceCatalogId: serviceCatalogId,
310
+ },
311
+ select: {
312
+ codeRepositoryId: true,
313
+ servicePathInRepository: true,
314
+ codeRepository: {
315
+ _id: true,
316
+ name: true,
317
+ repositoryHostedAt: true,
318
+ organizationName: true,
319
+ repositoryName: true,
320
+ mainBranchName: true,
321
+ gitHubAppInstallationId: true,
322
+ },
323
+ },
324
+ skip: 0,
325
+ limit: LIMIT_MAX,
326
+ props: {
327
+ isRoot: true,
328
+ },
329
+ });
330
+
331
+ for (const scr of serviceCatalogCodeRepositories) {
332
+ if (scr.codeRepository) {
333
+ // Check if we already have this repository
334
+ const existingRepo: boolean = repositories.some(
335
+ (r: {
336
+ id: string;
337
+ name: string;
338
+ repositoryHostedAt: string;
339
+ organizationName: string;
340
+ repositoryName: string;
341
+ mainBranchName: string;
342
+ servicePathInRepository: string | null;
343
+ gitHubAppInstallationId: string | null;
344
+ }) => {
345
+ return r.id === scr.codeRepository?._id?.toString();
346
+ },
347
+ );
348
+ if (!existingRepo) {
349
+ repositories.push({
350
+ id: scr.codeRepository._id?.toString() || "",
351
+ name: scr.codeRepository.name || "",
352
+ repositoryHostedAt:
353
+ scr.codeRepository.repositoryHostedAt || "",
354
+ organizationName: scr.codeRepository.organizationName || "",
355
+ repositoryName: scr.codeRepository.repositoryName || "",
356
+ mainBranchName: scr.codeRepository.mainBranchName || "main",
357
+ servicePathInRepository:
358
+ scr.servicePathInRepository || null,
359
+ gitHubAppInstallationId:
360
+ scr.codeRepository.gitHubAppInstallationId || null,
361
+ });
362
+ }
363
+ }
364
+ }
365
+ }
366
+
367
+ logger.debug(
368
+ `Found ${repositories.length} code repositories for telemetry service ${telemetryServiceId.toString()}`,
369
+ );
370
+
371
+ return Response.sendJsonObjectResponse(req, res, {
372
+ repositories: repositories,
373
+ });
374
+ } catch (err) {
375
+ next(err);
376
+ }
377
+ },
378
+ );
379
+
380
+ // Get access token for a code repository
381
+ this.router.post(
382
+ "/ai-agent-data/get-repository-token",
383
+ async (
384
+ req: ExpressRequest,
385
+ res: ExpressResponse,
386
+ next: NextFunction,
387
+ ): Promise<void> => {
388
+ try {
389
+ const data: JSONObject = req.body;
390
+
391
+ // Validate AI Agent credentials
392
+ const aiAgent: AIAgent | null = await this.validateAIAgent(data);
393
+
394
+ if (!aiAgent) {
395
+ return Response.sendErrorResponse(
396
+ req,
397
+ res,
398
+ new BadDataException("Invalid AI Agent ID or AI Agent Key"),
399
+ );
400
+ }
401
+
402
+ // Get code repository ID
403
+ if (!data["codeRepositoryId"]) {
404
+ return Response.sendErrorResponse(
405
+ req,
406
+ res,
407
+ new BadDataException("codeRepositoryId is required"),
408
+ );
409
+ }
410
+
411
+ const codeRepositoryId: ObjectID = new ObjectID(
412
+ data["codeRepositoryId"] as string,
413
+ );
414
+
415
+ // Get code repository
416
+ const codeRepository: CodeRepository | null =
417
+ await CodeRepositoryService.findOneById({
418
+ id: codeRepositoryId,
419
+ select: {
420
+ _id: true,
421
+ repositoryHostedAt: true,
422
+ organizationName: true,
423
+ repositoryName: true,
424
+ gitHubAppInstallationId: true,
425
+ },
426
+ props: {
427
+ isRoot: true,
428
+ },
429
+ });
430
+
431
+ if (!codeRepository) {
432
+ return Response.sendErrorResponse(
433
+ req,
434
+ res,
435
+ new BadDataException("Code repository not found"),
436
+ );
437
+ }
438
+
439
+ // Currently only supporting GitHub
440
+ if (codeRepository.repositoryHostedAt !== CodeRepositoryType.GitHub) {
441
+ return Response.sendErrorResponse(
442
+ req,
443
+ res,
444
+ new BadDataException(
445
+ `Repository type ${codeRepository.repositoryHostedAt} is not yet supported`,
446
+ ),
447
+ );
448
+ }
449
+
450
+ // Check if we have a GitHub App installation ID
451
+ if (!codeRepository.gitHubAppInstallationId) {
452
+ return Response.sendErrorResponse(
453
+ req,
454
+ res,
455
+ new BadDataException(
456
+ "No GitHub App installation ID found for this repository",
457
+ ),
458
+ );
459
+ }
460
+
461
+ // Generate GitHub installation access token
462
+ const tokenData: GitHubInstallationToken =
463
+ await GitHubUtil.getInstallationAccessToken(
464
+ codeRepository.gitHubAppInstallationId,
465
+ );
466
+
467
+ const repositoryUrl: string = `https://github.com/${codeRepository.organizationName}/${codeRepository.repositoryName}.git`;
468
+
469
+ logger.debug(
470
+ `Generated access token for repository ${codeRepository.organizationName}/${codeRepository.repositoryName}`,
471
+ );
472
+
473
+ return Response.sendJsonObjectResponse(req, res, {
474
+ token: tokenData.token,
475
+ expiresAt: tokenData.expiresAt,
476
+ repositoryUrl: repositoryUrl,
477
+ organizationName: codeRepository.organizationName,
478
+ repositoryName: codeRepository.repositoryName,
479
+ });
480
+ } catch (err) {
481
+ next(err);
482
+ }
483
+ },
484
+ );
485
+
486
+ // Record a pull request created by the AI Agent
487
+ this.router.post(
488
+ "/ai-agent-data/record-pull-request",
489
+ async (
490
+ req: ExpressRequest,
491
+ res: ExpressResponse,
492
+ next: NextFunction,
493
+ ): Promise<void> => {
494
+ try {
495
+ const data: JSONObject = req.body;
496
+
497
+ // Validate AI Agent credentials
498
+ const aiAgent: AIAgent | null = await this.validateAIAgent(data);
499
+
500
+ if (!aiAgent) {
501
+ return Response.sendErrorResponse(
502
+ req,
503
+ res,
504
+ new BadDataException("Invalid AI Agent ID or AI Agent Key"),
505
+ );
506
+ }
507
+
508
+ // Validate required fields
509
+ if (!data["taskId"]) {
510
+ return Response.sendErrorResponse(
511
+ req,
512
+ res,
513
+ new BadDataException("taskId is required"),
514
+ );
515
+ }
516
+
517
+ if (!data["codeRepositoryId"]) {
518
+ return Response.sendErrorResponse(
519
+ req,
520
+ res,
521
+ new BadDataException("codeRepositoryId is required"),
522
+ );
523
+ }
524
+
525
+ if (!data["pullRequestUrl"]) {
526
+ return Response.sendErrorResponse(
527
+ req,
528
+ res,
529
+ new BadDataException("pullRequestUrl is required"),
530
+ );
531
+ }
532
+
533
+ if (!data["title"]) {
534
+ return Response.sendErrorResponse(
535
+ req,
536
+ res,
537
+ new BadDataException("title is required"),
538
+ );
539
+ }
540
+
541
+ const taskId: ObjectID = new ObjectID(data["taskId"] as string);
542
+ const codeRepositoryId: ObjectID = new ObjectID(
543
+ data["codeRepositoryId"] as string,
544
+ );
545
+ const pullRequestUrl: string = data["pullRequestUrl"] as string;
546
+ const pullRequestNumber: number | undefined = data[
547
+ "pullRequestNumber"
548
+ ] as number | undefined;
549
+ const pullRequestId: number | undefined = data["pullRequestId"] as
550
+ | number
551
+ | undefined;
552
+ const title: string = data["title"] as string;
553
+ const description: string | undefined = data["description"] as
554
+ | string
555
+ | undefined;
556
+ const headRefName: string | undefined = data["headRefName"] as
557
+ | string
558
+ | undefined;
559
+ const baseRefName: string | undefined = data["baseRefName"] as
560
+ | string
561
+ | undefined;
562
+
563
+ // Get the task to get the project ID
564
+ const task: AIAgentTask | null = await AIAgentTaskService.findOneById(
565
+ {
566
+ id: taskId,
567
+ select: {
568
+ _id: true,
569
+ projectId: true,
570
+ },
571
+ props: {
572
+ isRoot: true,
573
+ },
574
+ },
575
+ );
576
+
577
+ if (!task) {
578
+ return Response.sendErrorResponse(
579
+ req,
580
+ res,
581
+ new BadDataException("Task not found"),
582
+ );
583
+ }
584
+
585
+ // Get code repository for organization and repo name
586
+ const codeRepository: CodeRepository | null =
587
+ await CodeRepositoryService.findOneById({
588
+ id: codeRepositoryId,
589
+ select: {
590
+ _id: true,
591
+ organizationName: true,
592
+ repositoryName: true,
593
+ },
594
+ props: {
595
+ isRoot: true,
596
+ },
597
+ });
598
+
599
+ // Create the pull request record
600
+ const pullRequest: AIAgentTaskPullRequest =
601
+ new AIAgentTaskPullRequest();
602
+
603
+ if (task.projectId) {
604
+ pullRequest.projectId = task.projectId;
605
+ }
606
+
607
+ pullRequest.aiAgentTaskId = taskId;
608
+ pullRequest.aiAgentId = aiAgent.id!;
609
+ pullRequest.codeRepositoryId = codeRepositoryId;
610
+ pullRequest.pullRequestUrl = URL.fromString(pullRequestUrl);
611
+
612
+ if (pullRequestNumber !== undefined) {
613
+ pullRequest.pullRequestNumber = pullRequestNumber;
614
+ }
615
+
616
+ if (pullRequestId !== undefined) {
617
+ pullRequest.pullRequestId = pullRequestId;
618
+ }
619
+
620
+ pullRequest.title = title;
621
+
622
+ if (description) {
623
+ pullRequest.description = description;
624
+ }
625
+
626
+ pullRequest.pullRequestState = PullRequestState.Open;
627
+
628
+ if (headRefName) {
629
+ pullRequest.headRefName = headRefName;
630
+ }
631
+
632
+ if (baseRefName) {
633
+ pullRequest.baseRefName = baseRefName;
634
+ }
635
+
636
+ if (codeRepository?.organizationName) {
637
+ pullRequest.repoOrganizationName = codeRepository.organizationName;
638
+ }
639
+
640
+ if (codeRepository?.repositoryName) {
641
+ pullRequest.repoName = codeRepository.repositoryName;
642
+ }
643
+
644
+ const createdPullRequest: AIAgentTaskPullRequest =
645
+ await AIAgentTaskPullRequestService.create({
646
+ data: pullRequest,
647
+ props: {
648
+ isRoot: true,
649
+ },
650
+ });
651
+
652
+ logger.debug(
653
+ `Recorded pull request ${pullRequestUrl} for task ${taskId.toString()}`,
654
+ );
655
+
656
+ return Response.sendJsonObjectResponse(req, res, {
657
+ success: true,
658
+ pullRequestId: createdPullRequest._id?.toString(),
659
+ });
660
+ } catch (err) {
661
+ next(err);
662
+ }
663
+ },
664
+ );
665
+ }
666
+
667
+ // Validate AI Agent credentials from request body
668
+ private async validateAIAgent(data: JSONObject): Promise<AIAgent | null> {
669
+ if (!data["aiAgentId"] || !data["aiAgentKey"]) {
670
+ return null;
671
+ }
672
+
673
+ const aiAgentId: ObjectID = new ObjectID(data["aiAgentId"] as string);
674
+ const aiAgentKey: string = data["aiAgentKey"] as string;
675
+
676
+ const aiAgent: AIAgent | null = await AIAgentService.findOneBy({
677
+ query: {
678
+ _id: aiAgentId.toString(),
679
+ key: aiAgentKey,
680
+ },
681
+ select: {
682
+ _id: true,
683
+ projectId: true, // Fetch projectId to check if this is a global or project AI agent
684
+ },
685
+ props: {
686
+ isRoot: true,
687
+ },
688
+ });
689
+
690
+ return aiAgent;
691
+ }
692
+ }