@rudderhq/server 0.2.5-canary.9 → 0.2.5

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 (309) hide show
  1. package/dist/bootstrap/plugin-host-runtime.d.ts +39 -39
  2. package/dist/bundled-plugins/plugin-linear/dist/worker.js +101 -147
  3. package/dist/bundled-plugins/plugin-linear/dist/worker.js.map +2 -2
  4. package/dist/bundled-plugins/plugin-linear/package.json +1 -1
  5. package/dist/routes/access-onboarding.helpers.d.ts +142 -0
  6. package/dist/routes/access-onboarding.helpers.d.ts.map +1 -0
  7. package/dist/routes/access-onboarding.helpers.js +762 -0
  8. package/dist/routes/access-onboarding.helpers.js.map +1 -0
  9. package/dist/routes/access.d.ts +2 -48
  10. package/dist/routes/access.d.ts.map +1 -1
  11. package/dist/routes/access.helpers.d.ts +109 -0
  12. package/dist/routes/access.helpers.d.ts.map +1 -0
  13. package/dist/routes/access.helpers.js +460 -0
  14. package/dist/routes/access.helpers.js.map +1 -0
  15. package/dist/routes/access.js +6 -1218
  16. package/dist/routes/access.js.map +1 -1
  17. package/dist/routes/agents.d.ts.map +1 -1
  18. package/dist/routes/agents.js +55 -1057
  19. package/dist/routes/agents.js.map +1 -1
  20. package/dist/routes/agents.management-routes.d.ts +12 -0
  21. package/dist/routes/agents.management-routes.d.ts.map +1 -0
  22. package/dist/routes/agents.management-routes.js +1067 -0
  23. package/dist/routes/agents.management-routes.js.map +1 -0
  24. package/dist/routes/chats.d.ts.map +1 -1
  25. package/dist/routes/chats.js +42 -652
  26. package/dist/routes/chats.js.map +1 -1
  27. package/dist/routes/chats.stream-routes.d.ts +12 -0
  28. package/dist/routes/chats.stream-routes.d.ts.map +1 -0
  29. package/dist/routes/chats.stream-routes.js +666 -0
  30. package/dist/routes/chats.stream-routes.js.map +1 -0
  31. package/dist/routes/issues.comments-attachments.d.ts +12 -0
  32. package/dist/routes/issues.comments-attachments.d.ts.map +1 -0
  33. package/dist/routes/issues.comments-attachments.js +511 -0
  34. package/dist/routes/issues.comments-attachments.js.map +1 -0
  35. package/dist/routes/issues.d.ts.map +1 -1
  36. package/dist/routes/issues.js +43 -1128
  37. package/dist/routes/issues.js.map +1 -1
  38. package/dist/routes/issues.mutations.d.ts +12 -0
  39. package/dist/routes/issues.mutations.d.ts.map +1 -0
  40. package/dist/routes/issues.mutations.js +635 -0
  41. package/dist/routes/issues.mutations.js.map +1 -0
  42. package/dist/routes/plugins.d.ts.map +1 -1
  43. package/dist/routes/plugins.js +14 -694
  44. package/dist/routes/plugins.js.map +1 -1
  45. package/dist/routes/plugins.operations-routes.d.ts +28 -0
  46. package/dist/routes/plugins.operations-routes.d.ts.map +1 -0
  47. package/dist/routes/plugins.operations-routes.js +720 -0
  48. package/dist/routes/plugins.operations-routes.js.map +1 -0
  49. package/dist/services/access.d.ts +21 -21
  50. package/dist/services/activity.d.ts +19 -19
  51. package/dist/services/agents.d.ts +158 -158
  52. package/dist/services/approvals.d.ts +29 -29
  53. package/dist/services/assets.d.ts +8 -8
  54. package/dist/services/automations.d.ts +41 -27
  55. package/dist/services/automations.d.ts.map +1 -1
  56. package/dist/services/automations.js +287 -110
  57. package/dist/services/automations.js.map +1 -1
  58. package/dist/services/automations.scheduler.d.ts +9 -0
  59. package/dist/services/automations.scheduler.d.ts.map +1 -0
  60. package/dist/services/automations.scheduler.js +101 -0
  61. package/dist/services/automations.scheduler.js.map +1 -0
  62. package/dist/services/board-auth.d.ts +32 -32
  63. package/dist/services/calendar.d.ts +26 -26
  64. package/dist/services/chat-assistant.d.ts +3 -47
  65. package/dist/services/chat-assistant.d.ts.map +1 -1
  66. package/dist/services/chat-assistant.helpers.d.ts +156 -0
  67. package/dist/services/chat-assistant.helpers.d.ts.map +1 -0
  68. package/dist/services/chat-assistant.helpers.js +862 -0
  69. package/dist/services/chat-assistant.helpers.js.map +1 -0
  70. package/dist/services/chat-assistant.js +2 -861
  71. package/dist/services/chat-assistant.js.map +1 -1
  72. package/dist/services/chats.d.ts +149 -247
  73. package/dist/services/chats.d.ts.map +1 -1
  74. package/dist/services/chats.helpers.d.ts +117 -0
  75. package/dist/services/chats.helpers.d.ts.map +1 -0
  76. package/dist/services/chats.helpers.js +285 -0
  77. package/dist/services/chats.helpers.js.map +1 -0
  78. package/dist/services/chats.js +6 -286
  79. package/dist/services/chats.js.map +1 -1
  80. package/dist/services/costs.d.ts +8 -8
  81. package/dist/services/finance.d.ts +18 -18
  82. package/dist/services/goals.d.ts +30 -30
  83. package/dist/services/heartbeat.d.ts +3 -1
  84. package/dist/services/heartbeat.d.ts.map +1 -1
  85. package/dist/services/heartbeat.js +3 -1
  86. package/dist/services/heartbeat.js.map +1 -1
  87. package/dist/services/issue-approvals.d.ts +4 -4
  88. package/dist/services/issue-review-wakeup.d.ts +3 -3
  89. package/dist/services/issues.comments-attachments.d.ts +141 -0
  90. package/dist/services/issues.comments-attachments.d.ts.map +1 -0
  91. package/dist/services/issues.comments-attachments.js +313 -0
  92. package/dist/services/issues.comments-attachments.js.map +1 -0
  93. package/dist/services/issues.d.ts +205 -256
  94. package/dist/services/issues.d.ts.map +1 -1
  95. package/dist/services/issues.helpers.d.ts +87 -0
  96. package/dist/services/issues.helpers.d.ts.map +1 -0
  97. package/dist/services/issues.helpers.js +270 -0
  98. package/dist/services/issues.helpers.js.map +1 -0
  99. package/dist/services/issues.js +5 -569
  100. package/dist/services/issues.js.map +1 -1
  101. package/dist/services/knowledge-portability/organization-portability.core.d.ts +210 -0
  102. package/dist/services/knowledge-portability/organization-portability.core.d.ts.map +1 -0
  103. package/dist/services/knowledge-portability/organization-portability.core.js +997 -0
  104. package/dist/services/knowledge-portability/organization-portability.core.js.map +1 -0
  105. package/dist/services/knowledge-portability/organization-portability.d.ts +6 -28
  106. package/dist/services/knowledge-portability/organization-portability.d.ts.map +1 -1
  107. package/dist/services/knowledge-portability/organization-portability.export.d.ts +24 -0
  108. package/dist/services/knowledge-portability/organization-portability.export.d.ts.map +1 -0
  109. package/dist/services/knowledge-portability/organization-portability.export.js +607 -0
  110. package/dist/services/knowledge-portability/organization-portability.export.js.map +1 -0
  111. package/dist/services/knowledge-portability/organization-portability.files.d.ts +69 -0
  112. package/dist/services/knowledge-portability/organization-portability.files.d.ts.map +1 -0
  113. package/dist/services/knowledge-portability/organization-portability.files.js +597 -0
  114. package/dist/services/knowledge-portability/organization-portability.files.js.map +1 -0
  115. package/dist/services/knowledge-portability/organization-portability.import.d.ts +31 -0
  116. package/dist/services/knowledge-portability/organization-portability.import.d.ts.map +1 -0
  117. package/dist/services/knowledge-portability/organization-portability.import.js +575 -0
  118. package/dist/services/knowledge-portability/organization-portability.import.js.map +1 -0
  119. package/dist/services/knowledge-portability/organization-portability.js +37 -3848
  120. package/dist/services/knowledge-portability/organization-portability.js.map +1 -1
  121. package/dist/services/knowledge-portability/organization-portability.package.d.ts +72 -0
  122. package/dist/services/knowledge-portability/organization-portability.package.d.ts.map +1 -0
  123. package/dist/services/knowledge-portability/organization-portability.package.js +749 -0
  124. package/dist/services/knowledge-portability/organization-portability.package.js.map +1 -0
  125. package/dist/services/knowledge-portability/organization-portability.preview.d.ts +18 -0
  126. package/dist/services/knowledge-portability/organization-portability.preview.d.ts.map +1 -0
  127. package/dist/services/knowledge-portability/organization-portability.preview.js +333 -0
  128. package/dist/services/knowledge-portability/organization-portability.preview.js.map +1 -0
  129. package/dist/services/knowledge-portability/organization-portability.resolve-source.d.ts +4 -0
  130. package/dist/services/knowledge-portability/organization-portability.resolve-source.d.ts.map +1 -0
  131. package/dist/services/knowledge-portability/organization-portability.resolve-source.js +86 -0
  132. package/dist/services/knowledge-portability/organization-portability.resolve-source.js.map +1 -0
  133. package/dist/services/knowledge-portability/organization-skills.catalog.d.ts +221 -0
  134. package/dist/services/knowledge-portability/organization-skills.catalog.d.ts.map +1 -0
  135. package/dist/services/knowledge-portability/organization-skills.catalog.js +999 -0
  136. package/dist/services/knowledge-portability/organization-skills.catalog.js.map +1 -0
  137. package/dist/services/knowledge-portability/organization-skills.d.ts +4 -75
  138. package/dist/services/knowledge-portability/organization-skills.d.ts.map +1 -1
  139. package/dist/services/knowledge-portability/organization-skills.js +11 -2008
  140. package/dist/services/knowledge-portability/organization-skills.js.map +1 -1
  141. package/dist/services/knowledge-portability/organization-skills.scans.d.ts +16 -0
  142. package/dist/services/knowledge-portability/organization-skills.scans.d.ts.map +1 -0
  143. package/dist/services/knowledge-portability/organization-skills.scans.js +300 -0
  144. package/dist/services/knowledge-portability/organization-skills.scans.js.map +1 -0
  145. package/dist/services/knowledge-portability/organization-skills.sources.d.ts +68 -0
  146. package/dist/services/knowledge-portability/organization-skills.sources.d.ts.map +1 -0
  147. package/dist/services/knowledge-portability/organization-skills.sources.js +728 -0
  148. package/dist/services/knowledge-portability/organization-skills.sources.js.map +1 -0
  149. package/dist/services/messenger.d.ts +2 -2
  150. package/dist/services/messenger.js +2 -2
  151. package/dist/services/messenger.js.map +1 -1
  152. package/dist/services/organization-skills.d.ts +3 -1
  153. package/dist/services/organization-skills.d.ts.map +1 -1
  154. package/dist/services/organization-skills.js +3 -1
  155. package/dist/services/organization-skills.js.map +1 -1
  156. package/dist/services/orgs.d.ts +9 -9
  157. package/dist/services/plugin-loader.core.d.ts +14 -0
  158. package/dist/services/plugin-loader.core.d.ts.map +1 -0
  159. package/dist/services/plugin-loader.core.js +905 -0
  160. package/dist/services/plugin-loader.core.js.map +1 -0
  161. package/dist/services/plugin-loader.d.ts +3 -440
  162. package/dist/services/plugin-loader.d.ts.map +1 -1
  163. package/dist/services/plugin-loader.helpers.d.ts +468 -0
  164. package/dist/services/plugin-loader.helpers.d.ts.map +1 -0
  165. package/dist/services/plugin-loader.helpers.js +263 -0
  166. package/dist/services/plugin-loader.helpers.js.map +1 -0
  167. package/dist/services/plugin-loader.js +3 -1191
  168. package/dist/services/plugin-loader.js.map +1 -1
  169. package/dist/services/plugin-loader.worker-paths.d.ts +7 -0
  170. package/dist/services/plugin-loader.worker-paths.d.ts.map +1 -0
  171. package/dist/services/plugin-loader.worker-paths.js +85 -0
  172. package/dist/services/plugin-loader.worker-paths.js.map +1 -0
  173. package/dist/services/plugin-registry.d.ts +123 -123
  174. package/dist/services/projects.d.ts +8 -8
  175. package/dist/services/runtime-kernel/heartbeat.core.d.ts +725 -0
  176. package/dist/services/runtime-kernel/heartbeat.core.d.ts.map +1 -0
  177. package/dist/services/runtime-kernel/heartbeat.core.js +525 -0
  178. package/dist/services/runtime-kernel/heartbeat.core.js.map +1 -0
  179. package/dist/services/runtime-kernel/heartbeat.d.ts +38 -259
  180. package/dist/services/runtime-kernel/heartbeat.d.ts.map +1 -1
  181. package/dist/services/runtime-kernel/heartbeat.execute.d.ts +5 -0
  182. package/dist/services/runtime-kernel/heartbeat.execute.d.ts.map +1 -0
  183. package/dist/services/runtime-kernel/heartbeat.execute.js +1052 -0
  184. package/dist/services/runtime-kernel/heartbeat.execute.js.map +1 -0
  185. package/dist/services/runtime-kernel/heartbeat.js +50 -4142
  186. package/dist/services/runtime-kernel/heartbeat.js.map +1 -1
  187. package/dist/services/runtime-kernel/heartbeat.misc.d.ts +30 -0
  188. package/dist/services/runtime-kernel/heartbeat.misc.d.ts.map +1 -0
  189. package/dist/services/runtime-kernel/heartbeat.misc.js +483 -0
  190. package/dist/services/runtime-kernel/heartbeat.misc.js.map +1 -0
  191. package/dist/services/runtime-kernel/heartbeat.recovery.d.ts +38 -0
  192. package/dist/services/runtime-kernel/heartbeat.recovery.d.ts.map +1 -0
  193. package/dist/services/runtime-kernel/heartbeat.recovery.js +605 -0
  194. package/dist/services/runtime-kernel/heartbeat.recovery.js.map +1 -0
  195. package/dist/services/runtime-kernel/heartbeat.release.d.ts +6 -0
  196. package/dist/services/runtime-kernel/heartbeat.release.d.ts.map +1 -0
  197. package/dist/services/runtime-kernel/heartbeat.release.js +398 -0
  198. package/dist/services/runtime-kernel/heartbeat.release.js.map +1 -0
  199. package/dist/services/runtime-kernel/heartbeat.sessions.d.ts +229 -0
  200. package/dist/services/runtime-kernel/heartbeat.sessions.d.ts.map +1 -0
  201. package/dist/services/runtime-kernel/heartbeat.sessions.js +708 -0
  202. package/dist/services/runtime-kernel/heartbeat.sessions.js.map +1 -0
  203. package/dist/services/runtime-kernel/heartbeat.wakeup.d.ts +5 -0
  204. package/dist/services/runtime-kernel/heartbeat.wakeup.d.ts.map +1 -0
  205. package/dist/services/runtime-kernel/heartbeat.wakeup.js +552 -0
  206. package/dist/services/runtime-kernel/heartbeat.wakeup.js.map +1 -0
  207. package/dist/services/secrets.d.ts +25 -25
  208. package/dist/services/sidebar-badges.js +1 -1
  209. package/dist/services/sidebar-badges.js.map +1 -1
  210. package/dist/services/workspace-runtime.comments.d.ts +6 -0
  211. package/dist/services/workspace-runtime.comments.d.ts.map +1 -0
  212. package/dist/services/workspace-runtime.comments.js +17 -0
  213. package/dist/services/workspace-runtime.comments.js.map +1 -0
  214. package/dist/services/workspace-runtime.d.ts +4 -163
  215. package/dist/services/workspace-runtime.d.ts.map +1 -1
  216. package/dist/services/workspace-runtime.helpers.d.ts +163 -0
  217. package/dist/services/workspace-runtime.helpers.d.ts.map +1 -0
  218. package/dist/services/workspace-runtime.helpers.js +360 -0
  219. package/dist/services/workspace-runtime.helpers.js.map +1 -0
  220. package/dist/services/workspace-runtime.js +4 -1236
  221. package/dist/services/workspace-runtime.js.map +1 -1
  222. package/dist/services/workspace-runtime.lifecycle.d.ts +35 -0
  223. package/dist/services/workspace-runtime.lifecycle.d.ts.map +1 -0
  224. package/dist/services/workspace-runtime.lifecycle.js +266 -0
  225. package/dist/services/workspace-runtime.lifecycle.js.map +1 -0
  226. package/dist/services/workspace-runtime.services.d.ts +140 -0
  227. package/dist/services/workspace-runtime.services.d.ts.map +1 -0
  228. package/dist/services/workspace-runtime.services.js +606 -0
  229. package/dist/services/workspace-runtime.services.js.map +1 -0
  230. package/package.json +21 -15
  231. package/ui-dist/assets/{_basePickBy-B5mJzzqZ.js → _basePickBy-N8I9ml5Y.js} +1 -1
  232. package/ui-dist/assets/{_baseUniq-B10Ec09o.js → _baseUniq-BuSlpRSQ.js} +1 -1
  233. package/ui-dist/assets/{arc-Bw7wimOa.js → arc-qX-dPyA1.js} +1 -1
  234. package/ui-dist/assets/{architectureDiagram-2XIMDMQ5-DZr0XEvv.js → architectureDiagram-2XIMDMQ5-DhjkbXsp.js} +1 -1
  235. package/ui-dist/assets/{blockDiagram-WCTKOSBZ-D0jl0LgB.js → blockDiagram-WCTKOSBZ-JS-tTu3J.js} +1 -1
  236. package/ui-dist/assets/{c4Diagram-IC4MRINW-BEFxBnEm.js → c4Diagram-IC4MRINW-4DqwCWIx.js} +1 -1
  237. package/ui-dist/assets/channel-CccCW5_a.js +1 -0
  238. package/ui-dist/assets/{chunk-4BX2VUAB-Cbul1GoA.js → chunk-4BX2VUAB-T37SqBpp.js} +1 -1
  239. package/ui-dist/assets/{chunk-55IACEB6-DuouC3bT.js → chunk-55IACEB6-BSj9hdqK.js} +1 -1
  240. package/ui-dist/assets/{chunk-FMBD7UC4-bN1jF9xw.js → chunk-FMBD7UC4-Dkrlh0Wk.js} +1 -1
  241. package/ui-dist/assets/{chunk-JSJVCQXG-B0-Ij6ZF.js → chunk-JSJVCQXG-C0ZE3QdB.js} +1 -1
  242. package/ui-dist/assets/{chunk-KX2RTZJC-BjI3IEjI.js → chunk-KX2RTZJC-DOZQM9gW.js} +1 -1
  243. package/ui-dist/assets/{chunk-NQ4KR5QH-MUoGr46n.js → chunk-NQ4KR5QH-5Yr3U2k8.js} +1 -1
  244. package/ui-dist/assets/{chunk-QZHKN3VN-CQoI9Ouy.js → chunk-QZHKN3VN-CvKTufwF.js} +1 -1
  245. package/ui-dist/assets/{chunk-WL4C6EOR-DSJh3iDp.js → chunk-WL4C6EOR-IoEM0jyx.js} +1 -1
  246. package/ui-dist/assets/classDiagram-VBA2DB6C-JKk4tCW2.js +1 -0
  247. package/ui-dist/assets/classDiagram-v2-RAHNMMFH-JKk4tCW2.js +1 -0
  248. package/ui-dist/assets/clone-Onaweg8D.js +1 -0
  249. package/ui-dist/assets/{cose-bilkent-S5V4N54A-BPepglgB.js → cose-bilkent-S5V4N54A-CTvr1OFj.js} +1 -1
  250. package/ui-dist/assets/{dagre-KLK3FWXG-DhnHVZkt.js → dagre-KLK3FWXG-UZ-SNjVK.js} +1 -1
  251. package/ui-dist/assets/{diagram-E7M64L7V-DNvXtoOO.js → diagram-E7M64L7V-D7RAN0Hr.js} +1 -1
  252. package/ui-dist/assets/{diagram-IFDJBPK2-DhGlDTgn.js → diagram-IFDJBPK2-B4LViaFR.js} +1 -1
  253. package/ui-dist/assets/{diagram-P4PSJMXO-BmXEloWS.js → diagram-P4PSJMXO-CY1be7ak.js} +1 -1
  254. package/ui-dist/assets/{erDiagram-INFDFZHY-BTYVzaLM.js → erDiagram-INFDFZHY-Dca0KkvJ.js} +1 -1
  255. package/ui-dist/assets/{flowDiagram-PKNHOUZH-CqMNQUVv.js → flowDiagram-PKNHOUZH-i-qMvfwg.js} +1 -1
  256. package/ui-dist/assets/{ganttDiagram-A5KZAMGK-B2le_64a.js → ganttDiagram-A5KZAMGK-Wxq2lhbh.js} +1 -1
  257. package/ui-dist/assets/{gitGraphDiagram-K3NZZRJ6-BtxOBq5A.js → gitGraphDiagram-K3NZZRJ6-DwzgPlAY.js} +1 -1
  258. package/ui-dist/assets/{graph-C5E6qFfm.js → graph-BAqf89Tz.js} +1 -1
  259. package/ui-dist/assets/{index-Piq-IPXt.js → index-4eCzaLuY.js} +1 -1
  260. package/ui-dist/assets/{index-DT6UN2ec.js → index-8uu-nKqK.js} +1 -1
  261. package/ui-dist/assets/{index-T5NVZ3nR.js → index-B-1NEcI_.js} +1 -1
  262. package/ui-dist/assets/{index-D-MoarxG.js → index-B0b_3Eu5.js} +1 -1
  263. package/ui-dist/assets/{index-CZiP3FBQ.js → index-B8v0eZjP.js} +1 -1
  264. package/ui-dist/assets/{index-C1Ga66FM.js → index-BN7Moj3u.js} +1 -1
  265. package/ui-dist/assets/{index-xBUfBdQn.js → index-BSpxh3cY.js} +1 -1
  266. package/ui-dist/assets/{index-CQcMWp51.js → index-BY44RIi9.js} +1 -1
  267. package/ui-dist/assets/{index-3a93sZNI.js → index-BhyQJhdZ.js} +1 -1
  268. package/ui-dist/assets/{index-BsVDit5y.js → index-BkPL_iGU.js} +1 -1
  269. package/ui-dist/assets/{index-88lBSTsW.js → index-BsPfoHXS.js} +1 -1
  270. package/ui-dist/assets/{index-CyJtcUF0.js → index-BstW7nmv.js} +1 -1
  271. package/ui-dist/assets/{index-BvZ0Ptfl.js → index-BwB67Zyz.js} +1 -1
  272. package/ui-dist/assets/index-C2peSkmT.css +1 -0
  273. package/ui-dist/assets/{index-vkCrQLeX.js → index-C3ktOsS_.js} +1 -1
  274. package/ui-dist/assets/{index-D2hZpQJT.js → index-CMyABlS-.js} +1 -1
  275. package/ui-dist/assets/{index-C4WCPEY4.js → index-CyBJ8ujC.js} +1 -1
  276. package/ui-dist/assets/{index-Bf7NB_lK.js → index-DAxM2W3O.js} +1 -1
  277. package/ui-dist/assets/{index-Dq7H6-Lm.js → index-DVZXPmhk.js} +1 -1
  278. package/ui-dist/assets/{index-CskDu6A3.js → index-Dc19uAyw.js} +1 -1
  279. package/ui-dist/assets/index-DzHrwZu1.js +1511 -0
  280. package/ui-dist/assets/{index-B20JneLK.js → index-LJuf53Ye.js} +1 -1
  281. package/ui-dist/assets/{index-D6McTDMQ.js → index-Ugw5VWWz.js} +1 -1
  282. package/ui-dist/assets/{index-CcVGS6HJ.js → index-YGraEFR7.js} +1 -1
  283. package/ui-dist/assets/{infoDiagram-LFFYTUFH-BiCCZcIW.js → infoDiagram-LFFYTUFH-jLmDtFVR.js} +1 -1
  284. package/ui-dist/assets/{ishikawaDiagram-PHBUUO56-BiwBemM5.js → ishikawaDiagram-PHBUUO56-6OGMyLT8.js} +1 -1
  285. package/ui-dist/assets/{journeyDiagram-4ABVD52K-D8RGr2xl.js → journeyDiagram-4ABVD52K-yQjl6E0t.js} +1 -1
  286. package/ui-dist/assets/{kanban-definition-K7BYSVSG-C733Fj-E.js → kanban-definition-K7BYSVSG-DkdCeQlS.js} +1 -1
  287. package/ui-dist/assets/{layout-CM4c3NA_.js → layout-CqSYvZ_w.js} +1 -1
  288. package/ui-dist/assets/{linear-DzH21Xsf.js → linear-B8xGZaoi.js} +1 -1
  289. package/ui-dist/assets/{mermaid.core-Z2rpoVP2.js → mermaid.core-AKL_cdyk.js} +4 -4
  290. package/ui-dist/assets/{mindmap-definition-YRQLILUH-DylLLj9w.js → mindmap-definition-YRQLILUH-Zr-dXC0x.js} +1 -1
  291. package/ui-dist/assets/{pieDiagram-SKSYHLDU-617wI_rr.js → pieDiagram-SKSYHLDU-BvDAU-Nk.js} +1 -1
  292. package/ui-dist/assets/{quadrantDiagram-337W2JSQ-lxoCPJIL.js → quadrantDiagram-337W2JSQ-Dn9kM62o.js} +1 -1
  293. package/ui-dist/assets/{requirementDiagram-Z7DCOOCP-C5XydQ9-.js → requirementDiagram-Z7DCOOCP-GIsIh7Sd.js} +1 -1
  294. package/ui-dist/assets/{sankeyDiagram-WA2Y5GQK--grmq-Q8.js → sankeyDiagram-WA2Y5GQK-CUCuBkuf.js} +1 -1
  295. package/ui-dist/assets/{sequenceDiagram-2WXFIKYE-BS2PeYH-.js → sequenceDiagram-2WXFIKYE-MDpUY2HM.js} +1 -1
  296. package/ui-dist/assets/{stateDiagram-RAJIS63D-CeuZtj2z.js → stateDiagram-RAJIS63D-BymMpuUU.js} +1 -1
  297. package/ui-dist/assets/stateDiagram-v2-FVOUBMTO-Bi2oCU6d.js +1 -0
  298. package/ui-dist/assets/{timeline-definition-YZTLITO2-DxHdMpRr.js → timeline-definition-YZTLITO2-B6ofPhhy.js} +1 -1
  299. package/ui-dist/assets/{treemap-KZPCXAKY-Bv1ZlC5h.js → treemap-KZPCXAKY-DnLO6w1l.js} +1 -1
  300. package/ui-dist/assets/{vennDiagram-LZ73GAT5-DvpZSXY2.js → vennDiagram-LZ73GAT5-D0MyZIDl.js} +1 -1
  301. package/ui-dist/assets/{xychartDiagram-JWTSCODW-DttOu1GC.js → xychartDiagram-JWTSCODW-rADY1iUG.js} +1 -1
  302. package/ui-dist/index.html +2 -2
  303. package/ui-dist/assets/channel-DGUh6rEi.js +0 -1
  304. package/ui-dist/assets/classDiagram-VBA2DB6C-1ntk2IOV.js +0 -1
  305. package/ui-dist/assets/classDiagram-v2-RAHNMMFH-1ntk2IOV.js +0 -1
  306. package/ui-dist/assets/clone-BpddY88c.js +0 -1
  307. package/ui-dist/assets/index-C8AD6s7S.js +0 -1510
  308. package/ui-dist/assets/index-Ded0dPwB.css +0 -1
  309. package/ui-dist/assets/stateDiagram-v2-FVOUBMTO-DXq0yC5C.js +0 -1
@@ -1,278 +1,14 @@
1
1
  import { and, asc, desc, eq, inArray, isNull, ne, or, sql } from "drizzle-orm";
2
- import { activityLog, agents, assets, organizations, organizationMemberships, documents, goals, heartbeatRuns, executionWorkspaces, issueAttachments, issueFollows, issueLabels, issueComments, issueDocuments, issueReadStates, issues, labels, projectWorkspaces, projects, } from "@rudderhq/db";
3
- import { extractAgentMentionIds, extractProjectMentionIds, isUuidLike, } from "@rudderhq/shared";
2
+ import { agents, assets, organizations, organizationMemberships, documents, goals, heartbeatRuns, executionWorkspaces, issueAttachments, issueFollows, issueLabels, issueComments, issueDocuments, issueReadStates, issues, labels, projectWorkspaces, projects, } from "@rudderhq/db";
4
3
  import { conflict, notFound, unprocessable } from "../errors.js";
5
4
  import { defaultIssueExecutionWorkspaceSettingsForProject, parseProjectExecutionWorkspacePolicy, } from "./execution-workspace-policy.js";
6
5
  import { instanceSettingsService } from "./instance-settings.js";
7
6
  import { redactCurrentUserText } from "../log-redaction.js";
8
7
  import { resolveIssueGoalId, resolveNextIssueGoalId } from "./issue-goal-fallback.js";
9
8
  import { getDefaultCompanyGoal } from "./goals.js";
10
- const ALL_ISSUE_STATUSES = ["backlog", "todo", "in_progress", "in_review", "blocked", "done", "cancelled"];
11
- const MAX_ISSUE_COMMENT_PAGE_LIMIT = 500;
12
- const BOARD_ORDER_STEP = 1000;
13
- function isUniqueConstraintConflict(error, constraintName) {
14
- return (typeof error === "object" &&
15
- error !== null &&
16
- "code" in error &&
17
- error.code === "23505" &&
18
- "constraint" in error &&
19
- error.constraint === constraintName);
20
- }
21
- function assertTransition(from, to) {
22
- if (from === to)
23
- return;
24
- if (!ALL_ISSUE_STATUSES.includes(to)) {
25
- throw conflict(`Unknown issue status: ${to}`);
26
- }
27
- }
28
- function applyStatusSideEffects(status, patch) {
29
- if (!status)
30
- return patch;
31
- if (status === "in_progress" && !patch.startedAt) {
32
- patch.startedAt = new Date();
33
- }
34
- if (status === "done") {
35
- patch.completedAt = new Date();
36
- }
37
- if (status === "cancelled") {
38
- patch.cancelledAt = new Date();
39
- }
40
- return patch;
41
- }
42
- function sameRunLock(checkoutRunId, actorRunId) {
43
- if (actorRunId)
44
- return checkoutRunId === actorRunId;
45
- return checkoutRunId == null;
46
- }
47
- const TERMINAL_HEARTBEAT_RUN_STATUSES = new Set(["succeeded", "failed", "cancelled", "timed_out"]);
48
- function escapeLikePattern(value) {
49
- return value.replace(/[\\%_]/g, "\\$&");
50
- }
51
- function textContains(value, query) {
52
- return Boolean(value && value.toLowerCase().includes(query.toLowerCase()));
53
- }
54
- function buildSearchSnippet(value, query, maxLength = 160) {
55
- const compact = value.replace(/\s+/g, " ").trim();
56
- if (compact.length <= maxLength)
57
- return compact;
58
- const index = compact.toLowerCase().indexOf(query.toLowerCase());
59
- if (index < 0)
60
- return `${compact.slice(0, maxLength - 1).trimEnd()}…`;
61
- const context = Math.max(20, Math.floor((maxLength - query.length) / 2));
62
- const start = Math.max(0, index - context);
63
- const end = Math.min(compact.length, start + maxLength);
64
- const prefix = start > 0 ? "…" : "";
65
- const suffix = end < compact.length ? "…" : "";
66
- return `${prefix}${compact.slice(start, end).trim()}${suffix}`;
67
- }
68
- function fieldSearchMatch(row, query) {
69
- if (textContains(row.identifier, query)) {
70
- return { field: "identifier", snippet: buildSearchSnippet(row.identifier, query) };
71
- }
72
- if (textContains(row.title, query)) {
73
- return { field: "title", snippet: buildSearchSnippet(row.title, query) };
74
- }
75
- if (textContains(row.description, query)) {
76
- return { field: "description", snippet: buildSearchSnippet(row.description, query) };
77
- }
78
- return null;
79
- }
80
- function touchedByUserCondition(orgId, userId) {
81
- return sql `
82
- (
83
- ${issues.createdByUserId} = ${userId}
84
- OR ${issues.assigneeUserId} = ${userId}
85
- OR ${issues.reviewerUserId} = ${userId}
86
- OR EXISTS (
87
- SELECT 1
88
- FROM ${issueReadStates}
89
- WHERE ${issueReadStates.issueId} = ${issues.id}
90
- AND ${issueReadStates.orgId} = ${orgId}
91
- AND ${issueReadStates.userId} = ${userId}
92
- )
93
- OR EXISTS (
94
- SELECT 1
95
- FROM ${issueComments}
96
- WHERE ${issueComments.issueId} = ${issues.id}
97
- AND ${issueComments.orgId} = ${orgId}
98
- AND ${issueComments.authorUserId} = ${userId}
99
- )
100
- )
101
- `;
102
- }
103
- function participatedByAgentCondition(orgId, agentId) {
104
- return sql `
105
- (
106
- ${issues.createdByAgentId} = ${agentId}
107
- OR ${issues.assigneeAgentId} = ${agentId}
108
- OR ${issues.reviewerAgentId} = ${agentId}
109
- OR EXISTS (
110
- SELECT 1
111
- FROM ${issueComments}
112
- WHERE ${issueComments.issueId} = ${issues.id}
113
- AND ${issueComments.orgId} = ${orgId}
114
- AND ${issueComments.authorAgentId} = ${agentId}
115
- )
116
- OR EXISTS (
117
- SELECT 1
118
- FROM ${activityLog}
119
- WHERE ${activityLog.orgId} = ${orgId}
120
- AND ${activityLog.entityType} = 'issue'
121
- AND ${activityLog.entityId} = ${issues.id}::text
122
- AND ${activityLog.agentId} = ${agentId}
123
- )
124
- )
125
- `;
126
- }
127
- function myLastCommentAtExpr(orgId, userId) {
128
- return sql `
129
- (
130
- SELECT MAX(${issueComments.createdAt})
131
- FROM ${issueComments}
132
- WHERE ${issueComments.issueId} = ${issues.id}
133
- AND ${issueComments.orgId} = ${orgId}
134
- AND ${issueComments.authorUserId} = ${userId}
135
- )
136
- `;
137
- }
138
- function myLastReadAtExpr(orgId, userId) {
139
- return sql `
140
- (
141
- SELECT MAX(${issueReadStates.lastReadAt})
142
- FROM ${issueReadStates}
143
- WHERE ${issueReadStates.issueId} = ${issues.id}
144
- AND ${issueReadStates.orgId} = ${orgId}
145
- AND ${issueReadStates.userId} = ${userId}
146
- )
147
- `;
148
- }
149
- function myLastTouchAtExpr(orgId, userId) {
150
- const myLastCommentAt = myLastCommentAtExpr(orgId, userId);
151
- const myLastReadAt = myLastReadAtExpr(orgId, userId);
152
- return sql `
153
- GREATEST(
154
- COALESCE(${myLastCommentAt}, to_timestamp(0)),
155
- COALESCE(${myLastReadAt}, to_timestamp(0)),
156
- COALESCE(CASE WHEN ${issues.createdByUserId} = ${userId} THEN ${issues.createdAt} ELSE NULL END, to_timestamp(0)),
157
- COALESCE(CASE WHEN ${issues.assigneeUserId} = ${userId} THEN ${issues.updatedAt} ELSE NULL END, to_timestamp(0)),
158
- COALESCE(CASE WHEN ${issues.reviewerUserId} = ${userId} THEN ${issues.updatedAt} ELSE NULL END, to_timestamp(0))
159
- )
160
- `;
161
- }
162
- function unreadForUserCondition(orgId, userId) {
163
- const touchedCondition = touchedByUserCondition(orgId, userId);
164
- const myLastTouchAt = myLastTouchAtExpr(orgId, userId);
165
- return sql `
166
- (
167
- ${touchedCondition}
168
- AND EXISTS (
169
- SELECT 1
170
- FROM ${issueComments}
171
- WHERE ${issueComments.issueId} = ${issues.id}
172
- AND ${issueComments.orgId} = ${orgId}
173
- AND (
174
- ${issueComments.authorUserId} IS NULL
175
- OR ${issueComments.authorUserId} <> ${userId}
176
- )
177
- AND ${issueComments.createdAt} > ${myLastTouchAt}
178
- )
179
- )
180
- `;
181
- }
182
- export function deriveIssueUserContext(issue, userId, stats) {
183
- const normalizeDate = (value) => {
184
- if (!value)
185
- return null;
186
- if (value instanceof Date)
187
- return Number.isNaN(value.getTime()) ? null : value;
188
- const parsed = new Date(value);
189
- return Number.isNaN(parsed.getTime()) ? null : parsed;
190
- };
191
- const myLastCommentAt = normalizeDate(stats?.myLastCommentAt);
192
- const myLastReadAt = normalizeDate(stats?.myLastReadAt);
193
- const createdTouchAt = issue.createdByUserId === userId ? normalizeDate(issue.createdAt) : null;
194
- const assignedTouchAt = issue.assigneeUserId === userId ? normalizeDate(issue.updatedAt) : null;
195
- const reviewerTouchAt = issue.reviewerUserId === userId ? normalizeDate(issue.updatedAt) : null;
196
- const myLastTouchAt = [myLastCommentAt, myLastReadAt, createdTouchAt, assignedTouchAt, reviewerTouchAt]
197
- .filter((value) => value instanceof Date)
198
- .sort((a, b) => b.getTime() - a.getTime())[0] ?? null;
199
- const lastExternalCommentAt = normalizeDate(stats?.lastExternalCommentAt);
200
- const isUnreadForMe = Boolean(myLastTouchAt &&
201
- lastExternalCommentAt &&
202
- lastExternalCommentAt.getTime() > myLastTouchAt.getTime());
203
- return {
204
- myLastTouchAt,
205
- lastExternalCommentAt,
206
- isUnreadForMe,
207
- };
208
- }
209
- async function labelMapForIssues(dbOrTx, issueIds) {
210
- const map = new Map();
211
- if (issueIds.length === 0)
212
- return map;
213
- const rows = await dbOrTx
214
- .select({
215
- issueId: issueLabels.issueId,
216
- label: labels,
217
- })
218
- .from(issueLabels)
219
- .innerJoin(labels, eq(issueLabels.labelId, labels.id))
220
- .where(inArray(issueLabels.issueId, issueIds))
221
- .orderBy(asc(labels.name), asc(labels.id));
222
- for (const row of rows) {
223
- const existing = map.get(row.issueId);
224
- if (existing)
225
- existing.push(row.label);
226
- else
227
- map.set(row.issueId, [row.label]);
228
- }
229
- return map;
230
- }
231
- async function withIssueLabels(dbOrTx, rows) {
232
- if (rows.length === 0)
233
- return [];
234
- const labelsByIssueId = await labelMapForIssues(dbOrTx, rows.map((row) => row.id));
235
- return rows.map((row) => {
236
- const issueLabels = labelsByIssueId.get(row.id) ?? [];
237
- return {
238
- ...row,
239
- labels: issueLabels,
240
- labelIds: issueLabels.map((label) => label.id),
241
- };
242
- });
243
- }
244
- const ACTIVE_RUN_STATUSES = ["queued", "running"];
245
- async function activeRunMapForIssues(dbOrTx, issueRows) {
246
- const map = new Map();
247
- const runIds = issueRows
248
- .map((row) => row.executionRunId)
249
- .filter((id) => id != null);
250
- if (runIds.length === 0)
251
- return map;
252
- const rows = await dbOrTx
253
- .select({
254
- id: heartbeatRuns.id,
255
- status: heartbeatRuns.status,
256
- agentId: heartbeatRuns.agentId,
257
- invocationSource: heartbeatRuns.invocationSource,
258
- triggerDetail: heartbeatRuns.triggerDetail,
259
- startedAt: heartbeatRuns.startedAt,
260
- finishedAt: heartbeatRuns.finishedAt,
261
- createdAt: heartbeatRuns.createdAt,
262
- })
263
- .from(heartbeatRuns)
264
- .where(and(inArray(heartbeatRuns.id, runIds), inArray(heartbeatRuns.status, ACTIVE_RUN_STATUSES)));
265
- for (const row of rows) {
266
- map.set(row.id, row);
267
- }
268
- return map;
269
- }
270
- function withActiveRuns(issueRows, runMap) {
271
- return issueRows.map((row) => ({
272
- ...row,
273
- activeRun: row.executionRunId ? (runMap.get(row.executionRunId) ?? null) : null,
274
- }));
275
- }
9
+ import { BOARD_ORDER_STEP, isUniqueConstraintConflict, assertTransition, applyStatusSideEffects, sameRunLock, TERMINAL_HEARTBEAT_RUN_STATUSES, escapeLikePattern, buildSearchSnippet, fieldSearchMatch, touchedByUserCondition, participatedByAgentCondition, unreadForUserCondition, deriveIssueUserContext, withIssueLabels, activeRunMapForIssues, withActiveRuns, } from "./issues.helpers.js";
10
+ import { createIssueCommentAttachmentMethods } from "./issues.comments-attachments.js";
11
+ export { deriveIssueUserContext } from "./issues.helpers.js";
276
12
  export function issueService(db) {
277
13
  const instanceSettings = instanceSettingsService(db);
278
14
  function redactIssueComment(comment, censorUsernameInLogs) {
@@ -1374,307 +1110,7 @@ export function issueService(db) {
1374
1110
  .where(eq(labels.id, id))
1375
1111
  .returning()
1376
1112
  .then((rows) => rows[0] ?? null),
1377
- listComments: async (issueId, opts) => {
1378
- const order = opts?.order === "asc" ? "asc" : "desc";
1379
- const afterCommentId = opts?.afterCommentId?.trim() || null;
1380
- const limit = opts?.limit && opts.limit > 0
1381
- ? Math.min(Math.floor(opts.limit), MAX_ISSUE_COMMENT_PAGE_LIMIT)
1382
- : null;
1383
- const conditions = [eq(issueComments.issueId, issueId)];
1384
- if (afterCommentId) {
1385
- const anchor = await db
1386
- .select({
1387
- id: issueComments.id,
1388
- createdAt: issueComments.createdAt,
1389
- })
1390
- .from(issueComments)
1391
- .where(and(eq(issueComments.issueId, issueId), eq(issueComments.id, afterCommentId)))
1392
- .then((rows) => rows[0] ?? null);
1393
- if (!anchor)
1394
- return [];
1395
- const anchorCreatedAt = anchor.createdAt instanceof Date
1396
- ? anchor.createdAt.toISOString()
1397
- : new Date(anchor.createdAt).toISOString();
1398
- conditions.push(order === "asc"
1399
- ? sql `(
1400
- ${issueComments.createdAt} > ${anchorCreatedAt}
1401
- OR (${issueComments.createdAt} = ${anchorCreatedAt} AND ${issueComments.id} > ${anchor.id})
1402
- )`
1403
- : sql `(
1404
- ${issueComments.createdAt} < ${anchorCreatedAt}
1405
- OR (${issueComments.createdAt} = ${anchorCreatedAt} AND ${issueComments.id} < ${anchor.id})
1406
- )`);
1407
- }
1408
- const query = db
1409
- .select()
1410
- .from(issueComments)
1411
- .where(and(...conditions))
1412
- .orderBy(order === "asc" ? asc(issueComments.createdAt) : desc(issueComments.createdAt), order === "asc" ? asc(issueComments.id) : desc(issueComments.id));
1413
- const comments = limit ? await query.limit(limit) : await query;
1414
- const { censorUsernameInLogs } = await instanceSettings.getGeneral();
1415
- return comments.map((comment) => redactIssueComment(comment, censorUsernameInLogs));
1416
- },
1417
- getCommentCursor: async (issueId) => {
1418
- const [latest, countRow] = await Promise.all([
1419
- db
1420
- .select({
1421
- latestCommentId: issueComments.id,
1422
- latestCommentAt: issueComments.createdAt,
1423
- })
1424
- .from(issueComments)
1425
- .where(eq(issueComments.issueId, issueId))
1426
- .orderBy(desc(issueComments.createdAt), desc(issueComments.id))
1427
- .limit(1)
1428
- .then((rows) => rows[0] ?? null),
1429
- db
1430
- .select({
1431
- totalComments: sql `count(*)::int`,
1432
- })
1433
- .from(issueComments)
1434
- .where(eq(issueComments.issueId, issueId))
1435
- .then((rows) => rows[0] ?? null),
1436
- ]);
1437
- return {
1438
- totalComments: Number(countRow?.totalComments ?? 0),
1439
- latestCommentId: latest?.latestCommentId ?? null,
1440
- latestCommentAt: latest?.latestCommentAt ?? null,
1441
- };
1442
- },
1443
- getComment: (commentId) => instanceSettings.getGeneral().then(({ censorUsernameInLogs }) => db
1444
- .select()
1445
- .from(issueComments)
1446
- .where(eq(issueComments.id, commentId))
1447
- .then((rows) => {
1448
- const comment = rows[0] ?? null;
1449
- return comment ? redactIssueComment(comment, censorUsernameInLogs) : null;
1450
- })),
1451
- addComment: async (issueId, body, actor) => {
1452
- const issue = await db
1453
- .select({ orgId: issues.orgId })
1454
- .from(issues)
1455
- .where(eq(issues.id, issueId))
1456
- .then((rows) => rows[0] ?? null);
1457
- if (!issue)
1458
- throw notFound("Issue not found");
1459
- const currentUserRedactionOptions = {
1460
- enabled: (await instanceSettings.getGeneral()).censorUsernameInLogs,
1461
- };
1462
- const redactedBody = redactCurrentUserText(body, currentUserRedactionOptions);
1463
- const [comment] = await db
1464
- .insert(issueComments)
1465
- .values({
1466
- orgId: issue.orgId,
1467
- issueId,
1468
- authorAgentId: actor.agentId ?? null,
1469
- authorUserId: actor.userId ?? null,
1470
- body: redactedBody,
1471
- })
1472
- .returning();
1473
- // Update issue's updatedAt so comment activity is reflected in recency sorting
1474
- await db
1475
- .update(issues)
1476
- .set({ updatedAt: new Date() })
1477
- .where(eq(issues.id, issueId));
1478
- return redactIssueComment(comment, currentUserRedactionOptions.enabled);
1479
- },
1480
- createAttachment: async (input) => {
1481
- const issue = await db
1482
- .select({ id: issues.id, orgId: issues.orgId })
1483
- .from(issues)
1484
- .where(eq(issues.id, input.issueId))
1485
- .then((rows) => rows[0] ?? null);
1486
- if (!issue)
1487
- throw notFound("Issue not found");
1488
- if (input.issueCommentId) {
1489
- const comment = await db
1490
- .select({ id: issueComments.id, orgId: issueComments.orgId, issueId: issueComments.issueId })
1491
- .from(issueComments)
1492
- .where(eq(issueComments.id, input.issueCommentId))
1493
- .then((rows) => rows[0] ?? null);
1494
- if (!comment)
1495
- throw notFound("Issue comment not found");
1496
- if (comment.orgId !== issue.orgId || comment.issueId !== issue.id) {
1497
- throw unprocessable("Attachment comment must belong to same issue and organization");
1498
- }
1499
- }
1500
- return db.transaction(async (tx) => {
1501
- const [asset] = await tx
1502
- .insert(assets)
1503
- .values({
1504
- orgId: issue.orgId,
1505
- provider: input.provider,
1506
- objectKey: input.objectKey,
1507
- contentType: input.contentType,
1508
- byteSize: input.byteSize,
1509
- sha256: input.sha256,
1510
- originalFilename: input.originalFilename ?? null,
1511
- createdByAgentId: input.createdByAgentId ?? null,
1512
- createdByUserId: input.createdByUserId ?? null,
1513
- })
1514
- .returning();
1515
- const [attachment] = await tx
1516
- .insert(issueAttachments)
1517
- .values({
1518
- orgId: issue.orgId,
1519
- issueId: issue.id,
1520
- assetId: asset.id,
1521
- issueCommentId: input.issueCommentId ?? null,
1522
- usage: input.usage ?? "issue",
1523
- })
1524
- .returning();
1525
- return {
1526
- id: attachment.id,
1527
- orgId: attachment.orgId,
1528
- issueId: attachment.issueId,
1529
- issueCommentId: attachment.issueCommentId,
1530
- assetId: attachment.assetId,
1531
- usage: attachment.usage,
1532
- provider: asset.provider,
1533
- objectKey: asset.objectKey,
1534
- contentType: asset.contentType,
1535
- byteSize: asset.byteSize,
1536
- sha256: asset.sha256,
1537
- originalFilename: asset.originalFilename,
1538
- createdByAgentId: asset.createdByAgentId,
1539
- createdByUserId: asset.createdByUserId,
1540
- createdAt: attachment.createdAt,
1541
- updatedAt: attachment.updatedAt,
1542
- };
1543
- });
1544
- },
1545
- listAttachments: async (issueId) => db
1546
- .select({
1547
- id: issueAttachments.id,
1548
- orgId: issueAttachments.orgId,
1549
- issueId: issueAttachments.issueId,
1550
- issueCommentId: issueAttachments.issueCommentId,
1551
- assetId: issueAttachments.assetId,
1552
- usage: issueAttachments.usage,
1553
- provider: assets.provider,
1554
- objectKey: assets.objectKey,
1555
- contentType: assets.contentType,
1556
- byteSize: assets.byteSize,
1557
- sha256: assets.sha256,
1558
- originalFilename: assets.originalFilename,
1559
- createdByAgentId: assets.createdByAgentId,
1560
- createdByUserId: assets.createdByUserId,
1561
- createdAt: issueAttachments.createdAt,
1562
- updatedAt: issueAttachments.updatedAt,
1563
- })
1564
- .from(issueAttachments)
1565
- .innerJoin(assets, eq(issueAttachments.assetId, assets.id))
1566
- .where(and(eq(issueAttachments.issueId, issueId), eq(issueAttachments.usage, "issue")))
1567
- .orderBy(desc(issueAttachments.createdAt)),
1568
- getAttachmentById: async (id) => db
1569
- .select({
1570
- id: issueAttachments.id,
1571
- orgId: issueAttachments.orgId,
1572
- issueId: issueAttachments.issueId,
1573
- issueCommentId: issueAttachments.issueCommentId,
1574
- assetId: issueAttachments.assetId,
1575
- usage: issueAttachments.usage,
1576
- provider: assets.provider,
1577
- objectKey: assets.objectKey,
1578
- contentType: assets.contentType,
1579
- byteSize: assets.byteSize,
1580
- sha256: assets.sha256,
1581
- originalFilename: assets.originalFilename,
1582
- createdByAgentId: assets.createdByAgentId,
1583
- createdByUserId: assets.createdByUserId,
1584
- createdAt: issueAttachments.createdAt,
1585
- updatedAt: issueAttachments.updatedAt,
1586
- })
1587
- .from(issueAttachments)
1588
- .innerJoin(assets, eq(issueAttachments.assetId, assets.id))
1589
- .where(eq(issueAttachments.id, id))
1590
- .then((rows) => rows[0] ?? null),
1591
- removeAttachment: async (id) => db.transaction(async (tx) => {
1592
- const existing = await tx
1593
- .select({
1594
- id: issueAttachments.id,
1595
- orgId: issueAttachments.orgId,
1596
- issueId: issueAttachments.issueId,
1597
- issueCommentId: issueAttachments.issueCommentId,
1598
- assetId: issueAttachments.assetId,
1599
- usage: issueAttachments.usage,
1600
- provider: assets.provider,
1601
- objectKey: assets.objectKey,
1602
- contentType: assets.contentType,
1603
- byteSize: assets.byteSize,
1604
- sha256: assets.sha256,
1605
- originalFilename: assets.originalFilename,
1606
- createdByAgentId: assets.createdByAgentId,
1607
- createdByUserId: assets.createdByUserId,
1608
- createdAt: issueAttachments.createdAt,
1609
- updatedAt: issueAttachments.updatedAt,
1610
- })
1611
- .from(issueAttachments)
1612
- .innerJoin(assets, eq(issueAttachments.assetId, assets.id))
1613
- .where(eq(issueAttachments.id, id))
1614
- .then((rows) => rows[0] ?? null);
1615
- if (!existing)
1616
- return null;
1617
- await tx.delete(issueAttachments).where(eq(issueAttachments.id, id));
1618
- await tx.delete(assets).where(eq(assets.id, existing.assetId));
1619
- return existing;
1620
- }),
1621
- findMentionedAgents: async (orgId, body) => {
1622
- const re = /\B@([^\s@,!?.]+)/g;
1623
- const tokens = new Set();
1624
- let m;
1625
- while ((m = re.exec(body)) !== null)
1626
- tokens.add(m[1].toLowerCase());
1627
- const explicitAgentMentionIds = extractAgentMentionIds(body).filter(isUuidLike);
1628
- if (tokens.size === 0 && explicitAgentMentionIds.length === 0)
1629
- return [];
1630
- const rows = await db.select({ id: agents.id, name: agents.name })
1631
- .from(agents).where(eq(agents.orgId, orgId));
1632
- const resolved = new Set(explicitAgentMentionIds);
1633
- for (const agent of rows) {
1634
- if (tokens.has(agent.name.toLowerCase())) {
1635
- resolved.add(agent.id);
1636
- }
1637
- }
1638
- return [...resolved];
1639
- },
1640
- findMentionedProjectIds: async (issueId) => {
1641
- const issue = await db
1642
- .select({
1643
- orgId: issues.orgId,
1644
- title: issues.title,
1645
- description: issues.description,
1646
- })
1647
- .from(issues)
1648
- .where(eq(issues.id, issueId))
1649
- .then((rows) => rows[0] ?? null);
1650
- if (!issue)
1651
- return [];
1652
- const comments = await db
1653
- .select({ body: issueComments.body })
1654
- .from(issueComments)
1655
- .where(eq(issueComments.issueId, issueId));
1656
- const mentionedIds = new Set();
1657
- for (const source of [
1658
- issue.title,
1659
- issue.description ?? "",
1660
- ...comments.map((comment) => comment.body),
1661
- ]) {
1662
- for (const projectId of extractProjectMentionIds(source)) {
1663
- mentionedIds.add(projectId);
1664
- }
1665
- }
1666
- if (mentionedIds.size === 0)
1667
- return [];
1668
- const validMentionedIds = [...mentionedIds].filter(isUuidLike);
1669
- if (validMentionedIds.length === 0)
1670
- return [];
1671
- const rows = await db
1672
- .select({ id: projects.id })
1673
- .from(projects)
1674
- .where(and(eq(projects.orgId, issue.orgId), inArray(projects.id, validMentionedIds)));
1675
- const valid = new Set(rows.map((row) => row.id));
1676
- return validMentionedIds.filter((projectId) => valid.has(projectId));
1677
- },
1113
+ ...createIssueCommentAttachmentMethods({ db, instanceSettings, redactIssueComment }),
1678
1114
  getAncestors: async (issueId) => {
1679
1115
  const raw = [];
1680
1116
  const visited = new Set([issueId]);