@overlordai/server 1.0.175 → 1.0.177

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 (289) hide show
  1. package/database/migrations/020-connectors.sql +48 -0
  2. package/database/migrations/021-task-design-context.sql +17 -0
  3. package/dist/adapters/command-parser.utils.d.ts +1 -0
  4. package/dist/adapters/command-parser.utils.d.ts.map +1 -1
  5. package/dist/adapters/command-parser.utils.js +9 -0
  6. package/dist/adapters/command-parser.utils.js.map +1 -1
  7. package/dist/adapters/nlu.service.d.ts.map +1 -1
  8. package/dist/adapters/nlu.service.js +4 -1
  9. package/dist/adapters/nlu.service.js.map +1 -1
  10. package/dist/app.module.d.ts.map +1 -1
  11. package/dist/app.module.js +2 -0
  12. package/dist/app.module.js.map +1 -1
  13. package/dist/connectors/connector-closure.service.d.ts +16 -0
  14. package/dist/connectors/connector-closure.service.d.ts.map +1 -0
  15. package/dist/connectors/connector-closure.service.js +97 -0
  16. package/dist/connectors/connector-closure.service.js.map +1 -0
  17. package/dist/connectors/connector-dispatch.service.d.ts +30 -0
  18. package/dist/connectors/connector-dispatch.service.d.ts.map +1 -0
  19. package/dist/connectors/connector-dispatch.service.js +226 -0
  20. package/dist/connectors/connector-dispatch.service.js.map +1 -0
  21. package/dist/connectors/connector.constants.d.ts +4 -0
  22. package/dist/connectors/connector.constants.d.ts.map +1 -0
  23. package/dist/connectors/connector.constants.js +12 -0
  24. package/dist/connectors/connector.constants.js.map +1 -0
  25. package/dist/connectors/connector.controller.d.ts +20 -0
  26. package/dist/connectors/connector.controller.d.ts.map +1 -0
  27. package/dist/connectors/connector.controller.js +166 -0
  28. package/dist/connectors/connector.controller.js.map +1 -0
  29. package/dist/connectors/connector.interface.d.ts +61 -0
  30. package/dist/connectors/connector.interface.d.ts.map +1 -0
  31. package/dist/connectors/connector.interface.js +3 -0
  32. package/dist/connectors/connector.interface.js.map +1 -0
  33. package/dist/connectors/connector.module.d.ts +3 -0
  34. package/dist/connectors/connector.module.d.ts.map +1 -0
  35. package/dist/connectors/connector.module.js +50 -0
  36. package/dist/connectors/connector.module.js.map +1 -0
  37. package/dist/connectors/connector.registry.d.ts +15 -0
  38. package/dist/connectors/connector.registry.d.ts.map +1 -0
  39. package/dist/connectors/connector.registry.js +48 -0
  40. package/dist/connectors/connector.registry.js.map +1 -0
  41. package/dist/connectors/design-context.service.d.ts +21 -0
  42. package/dist/connectors/design-context.service.d.ts.map +1 -0
  43. package/dist/connectors/design-context.service.js +77 -0
  44. package/dist/connectors/design-context.service.js.map +1 -0
  45. package/dist/connectors/design-review-trigger.service.d.ts +15 -0
  46. package/dist/connectors/design-review-trigger.service.d.ts.map +1 -0
  47. package/dist/connectors/design-review-trigger.service.js +98 -0
  48. package/dist/connectors/design-review-trigger.service.js.map +1 -0
  49. package/dist/connectors/figma/figma-url-parser.d.ts +12 -0
  50. package/dist/connectors/figma/figma-url-parser.d.ts.map +1 -0
  51. package/dist/connectors/figma/figma-url-parser.js +28 -0
  52. package/dist/connectors/figma/figma-url-parser.js.map +1 -0
  53. package/dist/connectors/figma/figma.client.d.ts +67 -0
  54. package/dist/connectors/figma/figma.client.d.ts.map +1 -0
  55. package/dist/connectors/figma/figma.client.js +67 -0
  56. package/dist/connectors/figma/figma.client.js.map +1 -0
  57. package/dist/connectors/figma/figma.connector.d.ts +29 -0
  58. package/dist/connectors/figma/figma.connector.d.ts.map +1 -0
  59. package/dist/connectors/figma/figma.connector.js +223 -0
  60. package/dist/connectors/figma/figma.connector.js.map +1 -0
  61. package/dist/connectors/figma/index.d.ts +4 -0
  62. package/dist/connectors/figma/index.d.ts.map +1 -0
  63. package/dist/connectors/figma/index.js +10 -0
  64. package/dist/connectors/figma/index.js.map +1 -0
  65. package/dist/connectors/issue-ref-helpers.d.ts +10 -0
  66. package/dist/connectors/issue-ref-helpers.d.ts.map +1 -0
  67. package/dist/connectors/issue-ref-helpers.js +24 -0
  68. package/dist/connectors/issue-ref-helpers.js.map +1 -0
  69. package/dist/connectors/issue-ref-parser.d.ts +22 -0
  70. package/dist/connectors/issue-ref-parser.d.ts.map +1 -0
  71. package/dist/connectors/issue-ref-parser.js +35 -0
  72. package/dist/connectors/issue-ref-parser.js.map +1 -0
  73. package/dist/connectors/issue-ref-resolver.service.d.ts +44 -0
  74. package/dist/connectors/issue-ref-resolver.service.d.ts.map +1 -0
  75. package/dist/connectors/issue-ref-resolver.service.js +226 -0
  76. package/dist/connectors/issue-ref-resolver.service.js.map +1 -0
  77. package/dist/connectors/jira/jira.client.d.ts +58 -0
  78. package/dist/connectors/jira/jira.client.d.ts.map +1 -0
  79. package/dist/connectors/jira/jira.client.js +70 -0
  80. package/dist/connectors/jira/jira.client.js.map +1 -0
  81. package/dist/connectors/jira/jira.connector.d.ts +17 -0
  82. package/dist/connectors/jira/jira.connector.d.ts.map +1 -0
  83. package/dist/connectors/jira/jira.connector.js +141 -0
  84. package/dist/connectors/jira/jira.connector.js.map +1 -0
  85. package/dist/connectors/sentry/sentry.client.d.ts +54 -0
  86. package/dist/connectors/sentry/sentry.client.d.ts.map +1 -0
  87. package/dist/connectors/sentry/sentry.client.js +69 -0
  88. package/dist/connectors/sentry/sentry.client.js.map +1 -0
  89. package/dist/connectors/sentry/sentry.connector.d.ts +17 -0
  90. package/dist/connectors/sentry/sentry.connector.d.ts.map +1 -0
  91. package/dist/connectors/sentry/sentry.connector.js +173 -0
  92. package/dist/connectors/sentry/sentry.connector.js.map +1 -0
  93. package/dist/connectors/webhook-comment-parser.d.ts +18 -0
  94. package/dist/connectors/webhook-comment-parser.d.ts.map +1 -0
  95. package/dist/connectors/webhook-comment-parser.js +28 -0
  96. package/dist/connectors/webhook-comment-parser.js.map +1 -0
  97. package/dist/database/repositories/connector.repository.d.ts +84 -0
  98. package/dist/database/repositories/connector.repository.d.ts.map +1 -0
  99. package/dist/database/repositories/connector.repository.js +222 -0
  100. package/dist/database/repositories/connector.repository.js.map +1 -0
  101. package/dist/database/repositories/developer.repository.d.ts +6 -1
  102. package/dist/database/repositories/developer.repository.d.ts.map +1 -1
  103. package/dist/database/repositories/developer.repository.js +19 -1
  104. package/dist/database/repositories/developer.repository.js.map +1 -1
  105. package/dist/database/repositories/external-issue-link.repository.d.ts +27 -0
  106. package/dist/database/repositories/external-issue-link.repository.d.ts.map +1 -0
  107. package/dist/database/repositories/external-issue-link.repository.js +85 -0
  108. package/dist/database/repositories/external-issue-link.repository.js.map +1 -0
  109. package/dist/database/repositories/task-design-context.repository.d.ts +33 -0
  110. package/dist/database/repositories/task-design-context.repository.d.ts.map +1 -0
  111. package/dist/database/repositories/task-design-context.repository.js +76 -0
  112. package/dist/database/repositories/task-design-context.repository.js.map +1 -0
  113. package/dist/database/repository.module.d.ts.map +1 -1
  114. package/dist/database/repository.module.js +6 -0
  115. package/dist/database/repository.module.js.map +1 -1
  116. package/dist/dispatcher/dedup.service.d.ts +1 -1
  117. package/dist/dispatcher/dedup.service.d.ts.map +1 -1
  118. package/dist/dispatcher/dedup.service.js +2 -2
  119. package/dist/dispatcher/dedup.service.js.map +1 -1
  120. package/dist/dispatcher/dispatcher.module.d.ts.map +1 -1
  121. package/dist/dispatcher/dispatcher.module.js +2 -1
  122. package/dist/dispatcher/dispatcher.module.js.map +1 -1
  123. package/dist/dispatcher/dispatcher.service.d.ts +7 -1
  124. package/dist/dispatcher/dispatcher.service.d.ts.map +1 -1
  125. package/dist/dispatcher/dispatcher.service.js +79 -8
  126. package/dist/dispatcher/dispatcher.service.js.map +1 -1
  127. package/dist/dispatcher/dispatcher.types.d.ts +26 -0
  128. package/dist/dispatcher/dispatcher.types.d.ts.map +1 -1
  129. package/dist/dispatcher/scheduler.service.d.ts +3 -1
  130. package/dist/dispatcher/scheduler.service.d.ts.map +1 -1
  131. package/dist/dispatcher/scheduler.service.js +16 -2
  132. package/dist/dispatcher/scheduler.service.js.map +1 -1
  133. package/dist/dispatcher/task-creation.service.d.ts +47 -3
  134. package/dist/dispatcher/task-creation.service.d.ts.map +1 -1
  135. package/dist/dispatcher/task-creation.service.js +26 -9
  136. package/dist/dispatcher/task-creation.service.js.map +1 -1
  137. package/dist/dispatcher/task-lifecycle.service.d.ts +5 -1
  138. package/dist/dispatcher/task-lifecycle.service.d.ts.map +1 -1
  139. package/dist/dispatcher/task-lifecycle.service.js +32 -3
  140. package/dist/dispatcher/task-lifecycle.service.js.map +1 -1
  141. package/dist/notifier/notification-consumer.d.ts +3 -1
  142. package/dist/notifier/notification-consumer.d.ts.map +1 -1
  143. package/dist/notifier/notification-consumer.js +26 -5
  144. package/dist/notifier/notification-consumer.js.map +1 -1
  145. package/dist/notifier/template.service.d.ts +6 -0
  146. package/dist/notifier/template.service.d.ts.map +1 -1
  147. package/dist/notifier/template.service.js +12 -0
  148. package/dist/notifier/template.service.js.map +1 -1
  149. package/dist/web/admin/admin-connector.controller.d.ts +58 -0
  150. package/dist/web/admin/admin-connector.controller.d.ts.map +1 -0
  151. package/dist/web/admin/admin-connector.controller.js +327 -0
  152. package/dist/web/admin/admin-connector.controller.js.map +1 -0
  153. package/dist/web/admin/admin-developer.controller.d.ts +1 -1
  154. package/dist/web/admin/admin-developer.controller.d.ts.map +1 -1
  155. package/dist/web/admin/admin-developer.controller.js +16 -5
  156. package/dist/web/admin/admin-developer.controller.js.map +1 -1
  157. package/dist/web/dashboard.controller.d.ts +1 -1
  158. package/dist/web/dashboard.service.d.ts +2 -7
  159. package/dist/web/dashboard.service.d.ts.map +1 -1
  160. package/dist/web/dashboard.service.js +16 -21
  161. package/dist/web/dashboard.service.js.map +1 -1
  162. package/dist/web/frame-handlers/review-report.handler.d.ts +3 -1
  163. package/dist/web/frame-handlers/review-report.handler.d.ts.map +1 -1
  164. package/dist/web/frame-handlers/review-report.handler.js +8 -3
  165. package/dist/web/frame-handlers/review-report.handler.js.map +1 -1
  166. package/dist/web/task.controller.d.ts +11 -1
  167. package/dist/web/task.controller.d.ts.map +1 -1
  168. package/dist/web/task.controller.js +118 -4
  169. package/dist/web/task.controller.js.map +1 -1
  170. package/dist/web/web.module.d.ts.map +1 -1
  171. package/dist/web/web.module.js +4 -1
  172. package/dist/web/web.module.js.map +1 -1
  173. package/dist/web/worker-channel.gateway.d.ts +3 -1
  174. package/dist/web/worker-channel.gateway.d.ts.map +1 -1
  175. package/dist/web/worker-channel.gateway.js +6 -3
  176. package/dist/web/worker-channel.gateway.js.map +1 -1
  177. package/package.json +4 -4
  178. package/public/assets/{AccessTokensPage-BlZBgj0-.js → AccessTokensPage-BhRmma33.js} +1 -1
  179. package/public/assets/{AdminPage-C0OFG0LC.js → AdminPage-ByfD-Bj7.js} +1 -1
  180. package/public/assets/{AgentCliPage-Ci2XVaN8.js → AgentCliPage-DyJnRmFm.js} +1 -1
  181. package/public/assets/{ApiReferencePage-Dm9y-zCM.js → ApiReferencePage-Wcyoo5XT.js} +1 -1
  182. package/public/assets/{ArchitecturePage-BetPO5Ws.js → ArchitecturePage-DgwFpJ3c.js} +1 -1
  183. package/public/assets/{AuditLogPage-Dbd27v1s.js → AuditLogPage-ByFVvlFb.js} +1 -1
  184. package/public/assets/{AutomationCreatePage-BvSw8KoZ.js → AutomationCreatePage-Cx-FCZEr.js} +1 -1
  185. package/public/assets/{AutomationDetailPage-1Y2tp1KP.js → AutomationDetailPage-BDh7SFeh.js} +1 -1
  186. package/public/assets/{AutomationEditPage-C9UO1XrW.js → AutomationEditPage-D76Ybtpz.js} +1 -1
  187. package/public/assets/{AutomationListPage-CJk8o3Vp.js → AutomationListPage-bNDDFN0Y.js} +1 -1
  188. package/public/assets/{AutomationRunDetailPage-h7T4V9Yq.js → AutomationRunDetailPage-BEWaGMai.js} +1 -1
  189. package/public/assets/{BindPlatformPage-DpzV1bpB.js → BindPlatformPage-CgfAbUal.js} +1 -1
  190. package/public/assets/{BotIntegrationPage-9kAG4BIL.js → BotIntegrationPage-D1A10L4d.js} +1 -1
  191. package/public/assets/{BotManage-BanZ5a5-.js → BotManage-IJm4jT-7.js} +1 -1
  192. package/public/assets/{BotSetupPage-BZIfJYqL.js → BotSetupPage-DIUSFgGv.js} +1 -1
  193. package/public/assets/{ChangelogPage-Da8n7_T3.js → ChangelogPage-D3R17QQT.js} +1 -1
  194. package/public/assets/{Checkbox-Dsj1BuTd.js → Checkbox-Drx9oKpj.js} +1 -1
  195. package/public/assets/{CliReferencePage-BDFsLYmx.js → CliReferencePage-BQ6Eyq2_.js} +1 -1
  196. package/public/assets/{ConfirmStageDialog-BUTA9YZ1.js → ConfirmStageDialog-BjjJNcLJ.js} +1 -1
  197. package/public/assets/ConnectorsPage-BgBXQlwq.js +48 -0
  198. package/public/assets/{DeploymentPage-B5TlN0FI.js → DeploymentPage-Cbmb8KKs.js} +1 -1
  199. package/public/assets/{DevWorkflowPage-Abvhng0F.js → DevWorkflowPage-Dur0zn7L.js} +1 -1
  200. package/public/assets/DeveloperManage-BmFhmcbZ.js +16 -0
  201. package/public/assets/{DeveloperSetupPage-QipfVSjp.js → DeveloperSetupPage-G9amle-q.js} +1 -1
  202. package/public/assets/{DocsIndexPage-Dw-saIXq.js → DocsIndexPage-CAPCKH_C.js} +11 -6
  203. package/public/assets/{DocsLayout-BsGaDVp1.js → DocsLayout-gVsQBlHm.js} +1 -1
  204. package/public/assets/{DocsPrimitives-Bv8TQpkc.js → DocsPrimitives-VBA7lZhS.js} +1 -1
  205. package/public/assets/{EditProjectPage-CtNCwK-z.js → EditProjectPage-Dn-MgU4f.js} +1 -1
  206. package/public/assets/{EmptyState-BpbqIJyG.js → EmptyState-B0pdsOsA.js} +1 -1
  207. package/public/assets/{EnvVariablesPage-D5Cn_E5P.js → EnvVariablesPage-DXaJ3Ejc.js} +1 -1
  208. package/public/assets/HomePage-B4ION8nK.js +1 -0
  209. package/public/assets/{InfoRow-BCDb21nt.js → InfoRow-DTHohr5Y.js} +1 -1
  210. package/public/assets/{InstallationPage-DLW6MXhs.js → InstallationPage-BVY5fIOG.js} +1 -1
  211. package/public/assets/{LandingPage-BLcQBvuD.js → LandingPage-DAP65IzR.js} +1 -1
  212. package/public/assets/{LocalDevelopmentPage-BnbdovKe.js → LocalDevelopmentPage-C9pD5y0c.js} +1 -1
  213. package/public/assets/{LoginPage-Bh-p4hP9.js → LoginPage-BToTW-qz.js} +1 -1
  214. package/public/assets/{MetricBar-DLR15rum.js → MetricBar-DA42IEeN.js} +1 -1
  215. package/public/assets/{MultiSelect-BKtGWYgt.js → MultiSelect-5hKAHK2N.js} +1 -1
  216. package/public/assets/{NotFoundPage-BpUwim1l.js → NotFoundPage-BQbQRjCC.js} +1 -1
  217. package/public/assets/{OnboardingGuide-BTsSW7Mq.js → OnboardingGuide-or_CwmfY.js} +1 -1
  218. package/public/assets/{PermissionsPage-A828G2ih.js → PermissionsPage-D867c8K5.js} +1 -1
  219. package/public/assets/{PipelineConfigPage-Cw1OxgKV.js → PipelineConfigPage-DYL-Eg8a.js} +1 -1
  220. package/public/assets/{PipelineEditorPage-tewviYrj.js → PipelineEditorPage-D6EpDvPI.js} +1 -1
  221. package/public/assets/{PlanPage-Bidp5iEn.js → PlanPage-Bfgn9hdf.js} +1 -1
  222. package/public/assets/{ProfilePage-DgFxZS6i.js → ProfilePage-DydZ_JO_.js} +1 -1
  223. package/public/assets/{ProjectDetailPage-BoIU1U3V.js → ProjectDetailPage-BLSkZmV0.js} +1 -1
  224. package/public/assets/{ProjectListPage-DMoN7Ghc.js → ProjectListPage-KWBq3v71.js} +1 -1
  225. package/public/assets/{PtyTerminal-QdM0LGge.js → PtyTerminal-DZ-tRh7i.js} +1 -1
  226. package/public/assets/{QuickAuth-CGnZQLaj.js → QuickAuth-D_2JnzxW.js} +1 -1
  227. package/public/assets/{RemoveMemberConfirmDialog-uFuATit4.js → RemoveMemberConfirmDialog-B1T8FRls.js} +1 -1
  228. package/public/assets/ReviewAggregatePage-D-sgcTHd.js +6 -0
  229. package/public/assets/ReviewPage-DLXr5nmf.js +1 -0
  230. package/public/assets/{Select-CC0FnszM.js → Select-PNbJCK1d.js} +1 -1
  231. package/public/assets/{SettingsPage-DiecpWAG.js → SettingsPage-DgNCPUzP.js} +1 -1
  232. package/public/assets/{Skeleton-WCDZdltv.js → Skeleton-C9OmZNVj.js} +1 -1
  233. package/public/assets/{SkillPage-ABYkJSop.js → SkillPage-jXi2VAvG.js} +1 -1
  234. package/public/assets/TaskDetailPage-Dy0CSg-i.js +21 -0
  235. package/public/assets/{TaskGuidePage-CFzoePPd.js → TaskGuidePage-C2VJEOGp.js} +1 -1
  236. package/public/assets/TaskListPage-63cj9-Gf.js +1 -0
  237. package/public/assets/{TaskStatusBadge-CzUIb3QQ.js → TaskStatusBadge-Ieecwysj.js} +1 -1
  238. package/public/assets/{TerminalHomePage-DP-gqkiq.js → TerminalHomePage-wxZHwphZ.js} +1 -1
  239. package/public/assets/{TokenManage-CbLsJbR9.js → TokenManage-D_fRhfSC.js} +1 -1
  240. package/public/assets/{Tooltip-Ds3lc4sS.js → Tooltip-hO7lE45q.js} +1 -1
  241. package/public/assets/{TotpSetupPage-Bakhx3kM.js → TotpSetupPage-DPv5zEkr.js} +1 -1
  242. package/public/assets/{WorkerDetailPage-W_1tf-Ng.js → WorkerDetailPage-BNHh3G4i.js} +1 -1
  243. package/public/assets/{WorkerListPage-DAgJojBW.js → WorkerListPage-CnUaksv5.js} +1 -1
  244. package/public/assets/{WorkerOperationsPage-BE8gDr3P.js → WorkerOperationsPage-BF-j3TGV.js} +1 -1
  245. package/public/assets/{WorkerSetupGuidePage-Cjwu7yCO.js → WorkerSetupGuidePage-CgoXTtvB.js} +1 -1
  246. package/public/assets/{WorkerSetupPage-C4F2PDWx.js → WorkerSetupPage-C9FJdEtx.js} +1 -1
  247. package/public/assets/{agent-type-options-BTd_pbKQ.js → agent-type-options-DPcGCrTV.js} +1 -1
  248. package/public/assets/{arrow-left-Czit8jGK.js → arrow-left-CMC8xPNU.js} +1 -1
  249. package/public/assets/{arrow-right-DUvU3ZSE.js → arrow-right-CzgMaKkq.js} +1 -1
  250. package/public/assets/{bot-xYitrdXz.js → bot-DZNbJaal.js} +1 -1
  251. package/public/assets/{chevron-down-DwSdaR46.js → chevron-down-Byw_H7qa.js} +1 -1
  252. package/public/assets/{chevron-left-DMFdbT8q.js → chevron-left-B9OwsObK.js} +1 -1
  253. package/public/assets/{chevron-right-BqoEBUXc.js → chevron-right-BDxmkY05.js} +1 -1
  254. package/public/assets/{chevron-up-4jZShvn6.js → chevron-up-qpQChOEd.js} +1 -1
  255. package/public/assets/{circle-alert-gAYg5DQY.js → circle-alert-qjGQBuvk.js} +1 -1
  256. package/public/assets/{clock-Bn8CRcdc.js → clock-RH0F7m7Y.js} +1 -1
  257. package/public/assets/{copy-_C7txolK.js → copy-sq8YNzps.js} +1 -1
  258. package/public/assets/{download-CGR9pdGa.js → download-BILbhyFl.js} +1 -1
  259. package/public/assets/{external-link-DGEar13h.js → external-link-6-aTSDMz.js} +1 -1
  260. package/public/assets/{git-fork-bd2vu3ng.js → git-fork-Tz0-ma48.js} +1 -1
  261. package/public/assets/{index-DAwsREkq.js → index-CqgRY3L6.js} +13 -13
  262. package/public/assets/{key-b6kn-A1T.js → key-D8a2ymYq.js} +1 -1
  263. package/public/assets/{loader-circle-vH-Hp_AS.js → loader-circle-CRxnDWNg.js} +1 -1
  264. package/public/assets/{pencil-Cxzh8oiw.js → pencil-BB-LZCT2.js} +1 -1
  265. package/public/assets/{play-bFi1k4eQ.js → play-DP6MNxNf.js} +1 -1
  266. package/public/assets/{plus-DJTaWh3N.js → plus-DSLmbw91.js} +1 -1
  267. package/public/assets/{rotate-ccw-CXFQ7046.js → rotate-ccw-DkPBqmSU.js} +1 -1
  268. package/public/assets/{scroll-text-UIbwyc0E.js → scroll-text-Cn9LA-xo.js} +1 -1
  269. package/public/assets/{settings-DA_C9Znv.js → settings-DQCRnFRi.js} +1 -1
  270. package/public/assets/{skip-forward-C71GgwGt.js → skip-forward-ZkknEL37.js} +1 -1
  271. package/public/assets/{status-colors-C14ffr9M.js → status-colors-CpKIU449.js} +1 -1
  272. package/public/assets/{task-agent-BasiQZ0L.js → task-agent-knUib-IL.js} +1 -1
  273. package/public/assets/{task-constants-DihuKtBw.js → task-constants-DiU1z_dP.js} +1 -1
  274. package/public/assets/{task.store-MpV9TV7z.js → task.store-BfdxbFUg.js} +1 -1
  275. package/public/assets/{timer-COkLkLUF.js → timer-BJw0BmGT.js} +1 -1
  276. package/public/assets/{trash-2-CDhJihtl.js → trash-2-DLdIg5hq.js} +1 -1
  277. package/public/assets/{useFetch-CgkGfhaP.js → useFetch-cT1ib8kh.js} +1 -1
  278. package/public/assets/{users-BwpIig9c.js → users-D2JV7gxB.js} +1 -1
  279. package/public/assets/{wifi-D5o6IWuC.js → wifi-Jy12B8KN.js} +1 -1
  280. package/public/assets/{workflow-DXTOpHef.js → workflow-BmBIBEn9.js} +1 -1
  281. package/public/assets/{zap-CEUF2oJs.js → zap-oNjSxQ6J.js} +1 -1
  282. package/public/index.html +1 -1
  283. package/public/sw.js +1 -1
  284. package/public/assets/DeveloperManage-DPSHCC6K.js +0 -16
  285. package/public/assets/HomePage-BFNO_Hk6.js +0 -1
  286. package/public/assets/ReviewAggregatePage-D5S57j51.js +0 -6
  287. package/public/assets/ReviewPage-tkUY7vrY.js +0 -1
  288. package/public/assets/TaskDetailPage-D6qSqsm0.js +0 -21
  289. package/public/assets/TaskListPage-rDPMfjmN.js +0 -1
@@ -0,0 +1,223 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var FigmaConnector_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.FigmaConnector = void 0;
14
+ const common_1 = require("@nestjs/common");
15
+ const protocol_1 = require("@overlordai/protocol");
16
+ const figma_client_1 = require("./figma.client");
17
+ const crypto_service_1 = require("../../common/crypto.service");
18
+ const webhook_comment_parser_1 = require("../webhook-comment-parser");
19
+ let FigmaConnector = FigmaConnector_1 = class FigmaConnector {
20
+ constructor(cryptoService) {
21
+ this.cryptoService = cryptoService;
22
+ this.platform = protocol_1.ConnectorPlatform.FIGMA;
23
+ this.logger = new common_1.Logger(FigmaConnector_1.name);
24
+ }
25
+ async handleWebhook(req, instance) {
26
+ const payload = req.body;
27
+ const eventType = payload.event_type;
28
+ if (eventType !== 'FILE_COMMENT') {
29
+ this.logger.debug({ eventType }, 'Ignoring non-comment Figma webhook event');
30
+ return null;
31
+ }
32
+ const commentFragments = payload.comment;
33
+ if (!commentFragments || !Array.isArray(commentFragments)) {
34
+ this.logger.warn('Figma webhook has no comment fragments');
35
+ return null;
36
+ }
37
+ // Build full comment text from fragments
38
+ const commentText = commentFragments
39
+ .map((f) => f.text ?? f.mention ?? '')
40
+ .join('');
41
+ const mentionKeyword = instance.mentionKeyword || '@Overlord';
42
+ if (!commentText.includes(mentionKeyword)) {
43
+ this.logger.debug('Figma comment does not contain mention keyword, ignoring');
44
+ return null;
45
+ }
46
+ const fileKey = payload.file_key;
47
+ const fileName = payload.file_name;
48
+ const commentId = payload.comment_id;
49
+ const parentId = payload.parent_id;
50
+ // Root comment normalization: use parent_id if this is a reply
51
+ const rootCommentId = String(parentId ?? commentId ?? '');
52
+ // Fetch node anchoring from the root comment (thread parent).
53
+ // For replies, the triggering comment itself may lack client_meta.node_id,
54
+ // but the thread root typically carries the design annotation anchor.
55
+ let figmaNodeIds;
56
+ try {
57
+ const client = this.createClient(instance);
58
+ const commentsResp = await client.getComments(fileKey);
59
+ // Try the triggering comment first, then fall back to the root comment
60
+ const triggeringComment = commentsResp.comments.find((c) => String(c.id) === String(commentId));
61
+ const rootComment = parentId
62
+ ? commentsResp.comments.find((c) => String(c.id) === String(parentId))
63
+ : null;
64
+ const nodeId = triggeringComment?.client_meta?.node_id
65
+ ?? rootComment?.client_meta?.node_id;
66
+ if (nodeId) {
67
+ figmaNodeIds = [nodeId];
68
+ }
69
+ }
70
+ catch (err) {
71
+ this.logger.warn({ err, fileKey }, 'Failed to fetch comments for node anchoring');
72
+ }
73
+ // Extract task description
74
+ const { cleanedText, explicitProjectKey } = (0, webhook_comment_parser_1.parseWebhookComment)(commentText, mentionKeyword);
75
+ const taskDescription = cleanedText
76
+ || `Implement design from Figma file: ${fileName ?? fileKey}`;
77
+ const fileUrl = `https://www.figma.com/design/${fileKey}/${encodeURIComponent(fileName ?? '')}`;
78
+ return {
79
+ action: 'create_task',
80
+ eventId: String(commentId),
81
+ projectKey: explicitProjectKey,
82
+ issueRef: {
83
+ platform: protocol_1.ConnectorPlatform.FIGMA,
84
+ issueId: fileKey,
85
+ issueUrl: fileUrl,
86
+ },
87
+ context: {
88
+ title: fileName ?? fileKey,
89
+ description: taskDescription,
90
+ url: fileUrl,
91
+ extra: {
92
+ figmaFileKey: fileKey,
93
+ figmaNodeIds,
94
+ figmaCommentId: rootCommentId,
95
+ },
96
+ },
97
+ description: `${taskDescription}\n\nFigma Design: [${fileName ?? fileKey}](${fileUrl})`,
98
+ };
99
+ }
100
+ async fetchContext(instance, externalId) {
101
+ const client = this.createClient(instance);
102
+ const file = await client.getFile(externalId);
103
+ const fileUrl = `https://www.figma.com/design/${externalId}/${encodeURIComponent(file.name)}`;
104
+ return {
105
+ title: file.name,
106
+ description: `Figma file: ${file.name}`,
107
+ url: fileUrl,
108
+ };
109
+ }
110
+ async buildDesignContext(instance, fileKey, nodeIds) {
111
+ // Validate fileKey format to prevent path traversal in API URLs
112
+ if (!/^[a-zA-Z0-9_-]+$/.test(fileKey)) {
113
+ throw new Error(`Invalid Figma file key: ${fileKey}`);
114
+ }
115
+ const client = this.createClient(instance);
116
+ let resolvedNodeIds;
117
+ let nodeNames = {};
118
+ if (nodeIds && nodeIds.length > 0) {
119
+ // Validate and filter node IDs (Figma format: "digits:digits")
120
+ resolvedNodeIds = nodeIds.filter(id => /^\d+:\d+$/.test(id));
121
+ if (resolvedNodeIds.length === 0) {
122
+ this.logger.warn({ nodeIds }, 'All provided Figma node IDs have invalid format');
123
+ }
124
+ try {
125
+ const nodesResp = await client.getFileNodes(fileKey, nodeIds);
126
+ for (const [id, node] of Object.entries(nodesResp.nodes)) {
127
+ if (node?.document) {
128
+ nodeNames[id] = node.document.name;
129
+ }
130
+ }
131
+ }
132
+ catch (err) {
133
+ this.logger.debug({ err, fileKey }, 'Failed to resolve node names, falling back to IDs');
134
+ }
135
+ }
136
+ else {
137
+ // Discover top-level frames
138
+ const file = await client.getFile(fileKey);
139
+ resolvedNodeIds = [];
140
+ for (const page of file.document.children) {
141
+ if (page.children) {
142
+ for (const child of page.children) {
143
+ if (child.type === 'FRAME') {
144
+ resolvedNodeIds.push(child.id);
145
+ nodeNames[child.id] = child.name;
146
+ }
147
+ }
148
+ }
149
+ }
150
+ if (resolvedNodeIds.length === 0) {
151
+ // Use first page as fallback
152
+ if (file.document.children.length > 0) {
153
+ const firstPage = file.document.children[0];
154
+ resolvedNodeIds.push(firstPage.id);
155
+ nodeNames[firstPage.id] = firstPage.name;
156
+ }
157
+ }
158
+ // Cap at 20 nodes to avoid API rate limits and oversized payloads
159
+ if (resolvedNodeIds.length > 20) {
160
+ resolvedNodeIds = resolvedNodeIds.slice(0, 20);
161
+ }
162
+ }
163
+ // Export images
164
+ const images = [];
165
+ if (resolvedNodeIds.length > 0) {
166
+ const imageResp = await client.exportImages(fileKey, resolvedNodeIds);
167
+ for (const nodeId of resolvedNodeIds) {
168
+ const url = imageResp.images[nodeId];
169
+ if (url) {
170
+ images.push({
171
+ nodeId,
172
+ name: nodeNames[nodeId] ?? nodeId,
173
+ url,
174
+ });
175
+ }
176
+ }
177
+ }
178
+ const fileUrl = `https://www.figma.com/design/${fileKey}`;
179
+ return {
180
+ fileKey,
181
+ fileUrl,
182
+ nodeIds: resolvedNodeIds,
183
+ images,
184
+ };
185
+ }
186
+ async addComment(instance, externalId, comment) {
187
+ const client = this.createClient(instance);
188
+ await client.postComment(externalId, comment);
189
+ }
190
+ async transitionStatus(_instance, _externalId, _targetStatus) {
191
+ this.logger.warn('Figma does not support status transitions');
192
+ }
193
+ async linkMR(_instance, _externalId, _mrUrl) {
194
+ // No-op: the closure comment from addComment already includes the MR URL.
195
+ // Posting a separate linkMR comment would create a duplicate notification.
196
+ }
197
+ async validateCredentials(credentials) {
198
+ try {
199
+ const client = new figma_client_1.FigmaClient(credentials);
200
+ await client.getCurrentUser();
201
+ return true;
202
+ }
203
+ catch {
204
+ return false;
205
+ }
206
+ }
207
+ createClient(instance) {
208
+ let credentials;
209
+ try {
210
+ credentials = JSON.parse(this.cryptoService.decryptAes(instance.credentials));
211
+ }
212
+ catch (err) {
213
+ throw new Error(`Failed to decrypt credentials for Figma instance ${instance.id}: ${err instanceof Error ? err.message : String(err)}`);
214
+ }
215
+ return new figma_client_1.FigmaClient(credentials);
216
+ }
217
+ };
218
+ exports.FigmaConnector = FigmaConnector;
219
+ exports.FigmaConnector = FigmaConnector = FigmaConnector_1 = __decorate([
220
+ (0, common_1.Injectable)(),
221
+ __metadata("design:paramtypes", [crypto_service_1.CryptoService])
222
+ ], FigmaConnector);
223
+ //# sourceMappingURL=figma.connector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"figma.connector.js","sourceRoot":"","sources":["../../../src/connectors/figma/figma.connector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { FigmaConnector, type FigmaDesignData } from './figma.connector';
2
+ export { FigmaClient, type FigmaCredentials } from './figma.client';
3
+ export { parseFigmaUrl, type ParsedFigmaUrl } from './figma-url-parser';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/connectors/figma/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseFigmaUrl = exports.FigmaClient = exports.FigmaConnector = void 0;
4
+ var figma_connector_1 = require("./figma.connector");
5
+ Object.defineProperty(exports, "FigmaConnector", { enumerable: true, get: function () { return figma_connector_1.FigmaConnector; } });
6
+ var figma_client_1 = require("./figma.client");
7
+ Object.defineProperty(exports, "FigmaClient", { enumerable: true, get: function () { return figma_client_1.FigmaClient; } });
8
+ var figma_url_parser_1 = require("./figma-url-parser");
9
+ Object.defineProperty(exports, "parseFigmaUrl", { enumerable: true, get: function () { return figma_url_parser_1.parseFigmaUrl; } });
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/connectors/figma/index.ts"],"names":[],"mappings":";;;AAAA,qDAAyE;AAAhE,iHAAA,cAAc,OAAA;AACvB,+CAAoE;AAA3D,2GAAA,WAAW,OAAA;AACpB,uDAAwE;AAA/D,iHAAA,aAAa,OAAA"}
@@ -0,0 +1,10 @@
1
+ import type { ConfigSnapshot } from '@overlordai/protocol';
2
+ import type { ExternalIssueLinkRepository } from '../database/repositories/external-issue-link.repository';
3
+ import type { IssueRefResolverService } from './issue-ref-resolver.service';
4
+ type ResolvedIssue = NonNullable<ReturnType<IssueRefResolverService['resolve']>>;
5
+ /** Build the externalRefs array for a ConfigSnapshot from a resolved issue. */
6
+ export declare function buildExternalRefs(resolvedIssue: ResolvedIssue): ConfigSnapshot['externalRefs'];
7
+ /** Create an external issue link record for a resolved issue. */
8
+ export declare function createExternalIssueLink(repo: ExternalIssueLinkRepository, taskId: number, resolvedIssue: ResolvedIssue): void;
9
+ export {};
10
+ //# sourceMappingURL=issue-ref-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue-ref-helpers.d.ts","sourceRoot":"","sources":["../../src/connectors/issue-ref-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,yDAAyD,CAAC;AAC3G,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAE5E,KAAK,aAAa,GAAG,WAAW,CAAC,UAAU,CAAC,uBAAuB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AAEjF,+EAA+E;AAC/E,wBAAgB,iBAAiB,CAC/B,aAAa,EAAE,aAAa,GAC3B,cAAc,CAAC,cAAc,CAAC,CAMhC;AAED,iEAAiE;AACjE,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,2BAA2B,EACjC,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,aAAa,GAC3B,IAAI,CASN"}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildExternalRefs = buildExternalRefs;
4
+ exports.createExternalIssueLink = createExternalIssueLink;
5
+ /** Build the externalRefs array for a ConfigSnapshot from a resolved issue. */
6
+ function buildExternalRefs(resolvedIssue) {
7
+ return [{
8
+ platform: resolvedIssue.ref.platform,
9
+ issueId: resolvedIssue.ref.displayIssueId ?? resolvedIssue.ref.issueId,
10
+ url: resolvedIssue.ref.issueUrl,
11
+ }];
12
+ }
13
+ /** Create an external issue link record for a resolved issue. */
14
+ function createExternalIssueLink(repo, taskId, resolvedIssue) {
15
+ repo.create({
16
+ taskId,
17
+ connectorInstanceId: resolvedIssue.instance.id,
18
+ connectorPlatform: resolvedIssue.ref.platform,
19
+ externalIssueId: resolvedIssue.ref.issueId,
20
+ externalIssueUrl: resolvedIssue.ref.issueUrl,
21
+ externalProjectKey: resolvedIssue.ref.projectKey,
22
+ });
23
+ }
24
+ //# sourceMappingURL=issue-ref-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue-ref-helpers.js","sourceRoot":"","sources":["../../src/connectors/issue-ref-helpers.ts"],"names":[],"mappings":";;AAOA,8CAQC;AAGD,0DAaC;AAzBD,+EAA+E;AAC/E,SAAgB,iBAAiB,CAC/B,aAA4B;IAE5B,OAAO,CAAC;YACN,QAAQ,EAAE,aAAa,CAAC,GAAG,CAAC,QAAQ;YACpC,OAAO,EAAE,aAAa,CAAC,GAAG,CAAC,cAAc,IAAI,aAAa,CAAC,GAAG,CAAC,OAAO;YACtE,GAAG,EAAE,aAAa,CAAC,GAAG,CAAC,QAAQ;SAChC,CAAC,CAAC;AACL,CAAC;AAED,iEAAiE;AACjE,SAAgB,uBAAuB,CACrC,IAAiC,EACjC,MAAc,EACd,aAA4B;IAE5B,IAAI,CAAC,MAAM,CAAC;QACV,MAAM;QACN,mBAAmB,EAAE,aAAa,CAAC,QAAQ,CAAC,EAAE;QAC9C,iBAAiB,EAAE,aAAa,CAAC,GAAG,CAAC,QAAQ;QAC7C,eAAe,EAAE,aAAa,CAAC,GAAG,CAAC,OAAO;QAC1C,gBAAgB,EAAE,aAAa,CAAC,GAAG,CAAC,QAAQ;QAC5C,kBAAkB,EAAE,aAAa,CAAC,GAAG,CAAC,UAAU;KACjD,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Parse issue references from text.
3
+ *
4
+ * Supports patterns like:
5
+ * - Jira: UAW-9228, PROJ-123
6
+ * - Generic: PREFIX-NNNNN (uppercase letters + hyphen + digits)
7
+ */
8
+ /** A parsed issue reference from text. */
9
+ export interface ParsedIssueRef {
10
+ /** The full match, e.g. "UAW-9228" */
11
+ issueId: string;
12
+ /** The project prefix, e.g. "UAW" */
13
+ projectKey: string;
14
+ }
15
+ /**
16
+ * Extract issue references from a text string.
17
+ *
18
+ * Matches uppercase-letter prefixes followed by a hyphen and digits (e.g. UAW-9228).
19
+ * Deduplicates by issueId.
20
+ */
21
+ export declare function parseIssueRefs(text: string): ParsedIssueRef[];
22
+ //# sourceMappingURL=issue-ref-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue-ref-parser.d.ts","sourceRoot":"","sources":["../../src/connectors/issue-ref-parser.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,WAAW,cAAc;IAC7B,sCAAsC;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,qCAAqC;IACrC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,EAAE,CAkB7D"}
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ /**
3
+ * Parse issue references from text.
4
+ *
5
+ * Supports patterns like:
6
+ * - Jira: UAW-9228, PROJ-123
7
+ * - Generic: PREFIX-NNNNN (uppercase letters + hyphen + digits)
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.parseIssueRefs = parseIssueRefs;
11
+ /**
12
+ * Extract issue references from a text string.
13
+ *
14
+ * Matches uppercase-letter prefixes followed by a hyphen and digits (e.g. UAW-9228).
15
+ * Deduplicates by issueId.
16
+ */
17
+ function parseIssueRefs(text) {
18
+ // Match patterns like UAW-9228, PROJ-1234567 (2-10 uppercase letters, hyphen, 1-9 digits)
19
+ const pattern = /\b([A-Z]{2,10})-(\d{1,9})\b/g;
20
+ const seen = new Set();
21
+ const refs = [];
22
+ let match;
23
+ while ((match = pattern.exec(text)) !== null) {
24
+ const issueId = match[0];
25
+ if (seen.has(issueId))
26
+ continue;
27
+ seen.add(issueId);
28
+ refs.push({
29
+ issueId,
30
+ projectKey: match[1],
31
+ });
32
+ }
33
+ return refs;
34
+ }
35
+ //# sourceMappingURL=issue-ref-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue-ref-parser.js","sourceRoot":"","sources":["../../src/connectors/issue-ref-parser.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;AAgBH,wCAkBC;AAxBD;;;;;GAKG;AACH,SAAgB,cAAc,CAAC,IAAY;IACzC,0FAA0F;IAC1F,MAAM,OAAO,GAAG,8BAA8B,CAAC;IAC/C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,IAAI,GAAqB,EAAE,CAAC;IAElC,IAAI,KAA6B,CAAC;IAClC,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC7C,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACzB,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;YAAE,SAAS;QAChC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAClB,IAAI,CAAC,IAAI,CAAC;YACR,OAAO;YACP,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC;SACrB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,44 @@
1
+ import type { ConnectorInstanceRow } from '../database/repositories/connector.repository';
2
+ import { ConnectorRepository } from '../database/repositories/connector.repository';
3
+ import { ProjectRepository } from '../database/repositories/project.repository';
4
+ import type { ExternalIssueRef } from './connector.interface';
5
+ import { CryptoService } from '../common/crypto.service';
6
+ interface ResolvedIssueRef {
7
+ ref: ExternalIssueRef;
8
+ instance: ConnectorInstanceRow;
9
+ nodeId?: string;
10
+ }
11
+ /**
12
+ * Resolve user-provided issue references (keys or URLs) into
13
+ * full ExternalIssueRef objects with matching connector instances.
14
+ *
15
+ * Supports:
16
+ * - Jira issue keys: PROJ-123
17
+ * - Jira URLs: https://company.atlassian.net/browse/PROJ-123
18
+ * - Sentry URLs: https://sentry.io/organizations/org/issues/12345/
19
+ */
20
+ export declare class IssueRefResolverService {
21
+ private readonly connectorRepo;
22
+ private readonly cryptoService;
23
+ private readonly projectRepo;
24
+ private readonly logger;
25
+ constructor(connectorRepo: ConnectorRepository, cryptoService: CryptoService, projectRepo: ProjectRepository);
26
+ /**
27
+ * Resolve a user-provided issue reference string into a full ref + connector instance.
28
+ * Returns null if the input cannot be parsed or no matching connector is found.
29
+ */
30
+ resolve(input: string, projectKey: string): ResolvedIssueRef | null;
31
+ private resolveFromUrl;
32
+ private resolveJiraKey;
33
+ private findInstanceByBaseUrl;
34
+ private findFigmaInstance;
35
+ /**
36
+ * Find a Sentry connector instance matching both origin and org.
37
+ * Decrypts credentials to compare the org field.
38
+ */
39
+ private findSentryInstanceByOrg;
40
+ /** Resolve a project key or alias to the canonical project key. */
41
+ private resolveCanonicalKey;
42
+ }
43
+ export {};
44
+ //# sourceMappingURL=issue-ref-resolver.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue-ref-resolver.service.d.ts","sourceRoot":"","sources":["../../src/connectors/issue-ref-resolver.service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,+CAA+C,CAAC;AAC1F,OAAO,EAAE,mBAAmB,EAAE,MAAM,+CAA+C,CAAC;AACpF,OAAO,EAAE,iBAAiB,EAAE,MAAM,6CAA6C,CAAC;AAChF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzD,UAAU,gBAAgB;IACxB,GAAG,EAAE,gBAAgB,CAAC;IACtB,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;GAQG;AACH,qBACa,uBAAuB;IAIhC,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAL9B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA4C;gBAGhD,aAAa,EAAE,mBAAmB,EAClC,aAAa,EAAE,aAAa,EAC5B,WAAW,EAAE,iBAAiB;IAGjD;;;OAGG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI;IAkBnE,OAAO,CAAC,cAAc;IAyEtB,OAAO,CAAC,cAAc;IA2BtB,OAAO,CAAC,qBAAqB;IAc7B,OAAO,CAAC,iBAAiB;IAezB;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IA0B/B,mEAAmE;IACnE,OAAO,CAAC,mBAAmB;CAM5B"}
@@ -0,0 +1,226 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var IssueRefResolverService_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.IssueRefResolverService = void 0;
14
+ const common_1 = require("@nestjs/common");
15
+ const connector_repository_1 = require("../database/repositories/connector.repository");
16
+ const project_repository_1 = require("../database/repositories/project.repository");
17
+ const crypto_service_1 = require("../common/crypto.service");
18
+ /**
19
+ * Resolve user-provided issue references (keys or URLs) into
20
+ * full ExternalIssueRef objects with matching connector instances.
21
+ *
22
+ * Supports:
23
+ * - Jira issue keys: PROJ-123
24
+ * - Jira URLs: https://company.atlassian.net/browse/PROJ-123
25
+ * - Sentry URLs: https://sentry.io/organizations/org/issues/12345/
26
+ */
27
+ let IssueRefResolverService = IssueRefResolverService_1 = class IssueRefResolverService {
28
+ constructor(connectorRepo, cryptoService, projectRepo) {
29
+ this.connectorRepo = connectorRepo;
30
+ this.cryptoService = cryptoService;
31
+ this.projectRepo = projectRepo;
32
+ this.logger = new common_1.Logger(IssueRefResolverService_1.name);
33
+ }
34
+ /**
35
+ * Resolve a user-provided issue reference string into a full ref + connector instance.
36
+ * Returns null if the input cannot be parsed or no matching connector is found.
37
+ */
38
+ resolve(input, projectKey) {
39
+ const trimmed = input.trim();
40
+ if (!trimmed)
41
+ return null;
42
+ // Try URL parsing first
43
+ const fromUrl = this.resolveFromUrl(trimmed, projectKey);
44
+ if (fromUrl)
45
+ return fromUrl;
46
+ // Try Jira issue key (PROJ-123)
47
+ const jiraKeyMatch = trimmed.match(/^([A-Z]{2,10})-(\d{1,9})$/);
48
+ if (jiraKeyMatch) {
49
+ return this.resolveJiraKey(trimmed, jiraKeyMatch[1], projectKey);
50
+ }
51
+ this.logger.debug({ input: trimmed }, 'Could not parse issue reference');
52
+ return null;
53
+ }
54
+ resolveFromUrl(url, projectKey) {
55
+ try {
56
+ const parsed = new URL(url);
57
+ const pathname = parsed.pathname;
58
+ // Jira: /browse/PROJ-123 — use binding-aware lookup (not just origin)
59
+ const jiraMatch = pathname.match(/\/browse\/([A-Z]{2,10}-\d{1,9})$/);
60
+ if (jiraMatch) {
61
+ const issueKey = jiraMatch[1];
62
+ const jiraProjectKey = issueKey.split('-')[0];
63
+ // resolveInstance with externalProjectKey ensures we get the right
64
+ // instance when multiple Jira connectors exist on the same host.
65
+ const resolved = this.connectorRepo.resolveInstance('jira', jiraProjectKey);
66
+ if (resolved?.binding) {
67
+ return {
68
+ ref: {
69
+ platform: 'jira',
70
+ issueId: issueKey,
71
+ issueUrl: url,
72
+ projectKey: jiraProjectKey,
73
+ },
74
+ instance: resolved.instance,
75
+ };
76
+ }
77
+ }
78
+ // Sentry: /organizations/{org}/issues/{id}/
79
+ const sentryMatch = pathname.match(/\/(?:organizations\/([^/]+)\/)?issues\/(\d+)/);
80
+ if (sentryMatch) {
81
+ const sentryOrg = sentryMatch[1]; // may be undefined for short URLs
82
+ const issueId = sentryMatch[2];
83
+ // Match by org when available (handles multiple orgs on sentry.io),
84
+ // fall back to origin-only matching when org is not in the URL.
85
+ const instance = sentryOrg
86
+ ? this.findSentryInstanceByOrg(parsed.origin, sentryOrg)
87
+ : this.findInstanceByBaseUrl('sentry', parsed.origin);
88
+ if (instance) {
89
+ return {
90
+ ref: {
91
+ platform: 'sentry',
92
+ issueId,
93
+ issueUrl: url,
94
+ },
95
+ instance,
96
+ };
97
+ }
98
+ }
99
+ // Figma: /file/abc123/... or /design/abc123/...
100
+ const figmaMatch = pathname.match(/\/(?:file|design)\/([a-zA-Z0-9_-]+)/);
101
+ if (figmaMatch && (parsed.hostname === 'figma.com' || parsed.hostname === 'www.figma.com')) {
102
+ const fileKey = figmaMatch[1];
103
+ const nodeId = parsed.searchParams.get('node-id')?.replace(/-/g, ':') ?? undefined;
104
+ const figmaInstance = this.findFigmaInstance(projectKey);
105
+ if (figmaInstance) {
106
+ return {
107
+ ref: {
108
+ platform: 'figma',
109
+ issueId: fileKey,
110
+ issueUrl: url,
111
+ },
112
+ instance: figmaInstance,
113
+ nodeId,
114
+ };
115
+ }
116
+ }
117
+ }
118
+ catch {
119
+ // Not a valid URL — fall through to key parsing
120
+ }
121
+ return null;
122
+ }
123
+ resolveJiraKey(issueKey, jiraProjectKey, _projectKey) {
124
+ // Find a Jira connector instance with an explicit binding for this project key.
125
+ // Do NOT use resolveInstance's fallback (returns any active instance) — that
126
+ // would attach refs to an unrelated Jira tenant.
127
+ const resolved = this.connectorRepo.resolveInstance('jira', jiraProjectKey);
128
+ if (!resolved?.binding) {
129
+ this.logger.debug({ issueKey, jiraProjectKey }, 'No Jira connector binding found for project key');
130
+ return null;
131
+ }
132
+ const baseUrl = resolved.instance.baseUrl;
133
+ if (!baseUrl) {
134
+ this.logger.debug({ issueKey }, 'Jira connector instance has no baseUrl');
135
+ return null;
136
+ }
137
+ return {
138
+ ref: {
139
+ platform: 'jira',
140
+ issueId: issueKey,
141
+ issueUrl: `${baseUrl.replace(/\/$/, '')}/browse/${issueKey}`,
142
+ projectKey: jiraProjectKey,
143
+ },
144
+ instance: resolved.instance,
145
+ };
146
+ }
147
+ findInstanceByBaseUrl(platform, origin) {
148
+ const instances = this.connectorRepo.findInstancesByPlatform(platform);
149
+ for (const instance of instances) {
150
+ if (!instance.baseUrl)
151
+ continue;
152
+ try {
153
+ const instanceOrigin = new URL(instance.baseUrl).origin;
154
+ if (instanceOrigin === origin)
155
+ return instance;
156
+ }
157
+ catch {
158
+ continue;
159
+ }
160
+ }
161
+ return null;
162
+ }
163
+ findFigmaInstance(projectKey) {
164
+ if (!projectKey)
165
+ return null;
166
+ // Resolve alias to canonical key so that `--project <alias>` works.
167
+ const canonicalKey = this.resolveCanonicalKey(projectKey);
168
+ // Only match Figma instances that have an explicit binding for this project.
169
+ // Do NOT fall back to a global instance — that would use another team's
170
+ // Figma credentials and bypass the intended binding check.
171
+ const bindings = this.connectorRepo.findBindingsByProjectKey(canonicalKey);
172
+ for (const b of bindings) {
173
+ const inst = this.connectorRepo.findInstanceById(b.connectorInstanceId);
174
+ if (inst?.platform === 'figma' && inst.status === 'active')
175
+ return inst;
176
+ }
177
+ return null;
178
+ }
179
+ /**
180
+ * Find a Sentry connector instance matching both origin and org.
181
+ * Decrypts credentials to compare the org field.
182
+ */
183
+ findSentryInstanceByOrg(origin, org) {
184
+ const instances = this.connectorRepo.findInstancesByPlatform('sentry');
185
+ const originMatches = [];
186
+ for (const instance of instances) {
187
+ if (!instance.baseUrl)
188
+ continue;
189
+ try {
190
+ if (new URL(instance.baseUrl).origin !== origin)
191
+ continue;
192
+ }
193
+ catch {
194
+ continue;
195
+ }
196
+ originMatches.push(instance);
197
+ try {
198
+ const credentials = JSON.parse(this.cryptoService.decryptAes(instance.credentials));
199
+ if (credentials.org === org)
200
+ return instance;
201
+ }
202
+ catch {
203
+ continue;
204
+ }
205
+ }
206
+ // No org match. Only fall back to origin-only when exactly one Sentry
207
+ // instance exists for this host — otherwise we'd pick the wrong tenant.
208
+ return originMatches.length === 1 ? originMatches[0] : null;
209
+ }
210
+ /** Resolve a project key or alias to the canonical project key. */
211
+ resolveCanonicalKey(keyOrAlias) {
212
+ const byKey = this.projectRepo.findByKey(keyOrAlias);
213
+ if (byKey)
214
+ return byKey.key;
215
+ const byAlias = this.projectRepo.findByAlias(keyOrAlias);
216
+ return byAlias ? byAlias.key : keyOrAlias;
217
+ }
218
+ };
219
+ exports.IssueRefResolverService = IssueRefResolverService;
220
+ exports.IssueRefResolverService = IssueRefResolverService = IssueRefResolverService_1 = __decorate([
221
+ (0, common_1.Injectable)(),
222
+ __metadata("design:paramtypes", [connector_repository_1.ConnectorRepository,
223
+ crypto_service_1.CryptoService,
224
+ project_repository_1.ProjectRepository])
225
+ ], IssueRefResolverService);
226
+ //# sourceMappingURL=issue-ref-resolver.service.js.map