@rudderhq/server 0.5.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (352) hide show
  1. package/dist/agent-runtimes/http/execute.d.ts.map +1 -1
  2. package/dist/agent-runtimes/http/execute.js +56 -1
  3. package/dist/agent-runtimes/http/execute.js.map +1 -1
  4. package/dist/agent-runtimes/http/index.d.ts.map +1 -1
  5. package/dist/agent-runtimes/http/index.js +10 -0
  6. package/dist/agent-runtimes/http/index.js.map +1 -1
  7. package/dist/agent-runtimes/process/execute.d.ts.map +1 -1
  8. package/dist/agent-runtimes/process/execute.js +9 -1
  9. package/dist/agent-runtimes/process/execute.js.map +1 -1
  10. package/dist/agent-runtimes/process/index.d.ts.map +1 -1
  11. package/dist/agent-runtimes/process/index.js +7 -0
  12. package/dist/agent-runtimes/process/index.js.map +1 -1
  13. package/dist/agent-runtimes/registry.d.ts.map +1 -1
  14. package/dist/agent-runtimes/registry.js +21 -1
  15. package/dist/agent-runtimes/registry.js.map +1 -1
  16. package/dist/agent-runtimes/utils.d.ts +1 -0
  17. package/dist/agent-runtimes/utils.d.ts.map +1 -1
  18. package/dist/agent-runtimes/utils.js.map +1 -1
  19. package/dist/bundled-plugins/plugin-linear/dist/worker.js +183 -10
  20. package/dist/bundled-plugins/plugin-linear/dist/worker.js.map +3 -3
  21. package/dist/home-paths.d.ts +7 -0
  22. package/dist/home-paths.d.ts.map +1 -1
  23. package/dist/home-paths.js +46 -2
  24. package/dist/home-paths.js.map +1 -1
  25. package/dist/index.js +23 -4
  26. package/dist/index.js.map +1 -1
  27. package/dist/routes/access.d.ts.map +1 -1
  28. package/dist/routes/access.helpers.d.ts +1 -1
  29. package/dist/routes/access.helpers.d.ts.map +1 -1
  30. package/dist/routes/access.helpers.js +0 -3
  31. package/dist/routes/access.helpers.js.map +1 -1
  32. package/dist/routes/access.js +0 -4
  33. package/dist/routes/access.js.map +1 -1
  34. package/dist/routes/agents.js +2 -2
  35. package/dist/routes/agents.js.map +1 -1
  36. package/dist/routes/chats.d.ts.map +1 -1
  37. package/dist/routes/chats.generated-attachments.d.ts +16 -0
  38. package/dist/routes/chats.generated-attachments.d.ts.map +1 -0
  39. package/dist/routes/chats.generated-attachments.js +157 -0
  40. package/dist/routes/chats.generated-attachments.js.map +1 -0
  41. package/dist/routes/chats.helpers.d.ts +27 -0
  42. package/dist/routes/chats.helpers.d.ts.map +1 -0
  43. package/dist/routes/chats.helpers.js +52 -0
  44. package/dist/routes/chats.helpers.js.map +1 -0
  45. package/dist/routes/chats.js +126 -188
  46. package/dist/routes/chats.js.map +1 -1
  47. package/dist/routes/chats.stream-routes.d.ts.map +1 -1
  48. package/dist/routes/chats.stream-routes.js +185 -16
  49. package/dist/routes/chats.stream-routes.js.map +1 -1
  50. package/dist/routes/llms.js +3 -3
  51. package/dist/routes/llms.js.map +1 -1
  52. package/dist/routes/messenger.d.ts.map +1 -1
  53. package/dist/routes/messenger.js +48 -6
  54. package/dist/routes/messenger.js.map +1 -1
  55. package/dist/services/activity.d.ts.map +1 -1
  56. package/dist/services/activity.js +7 -2
  57. package/dist/services/activity.js.map +1 -1
  58. package/dist/services/agents.d.ts +65 -65
  59. package/dist/services/agents.d.ts.map +1 -1
  60. package/dist/services/agents.js +5 -4
  61. package/dist/services/agents.js.map +1 -1
  62. package/dist/services/approvals.d.ts +1 -1
  63. package/dist/services/assets.d.ts +2 -2
  64. package/dist/services/automation-chat-output.d.ts +1 -1
  65. package/dist/services/automation-chat-output.d.ts.map +1 -1
  66. package/dist/services/automation-chat-output.js +38 -23
  67. package/dist/services/automation-chat-output.js.map +1 -1
  68. package/dist/services/automations.d.ts.map +1 -1
  69. package/dist/services/automations.js +39 -41
  70. package/dist/services/automations.js.map +1 -1
  71. package/dist/services/budgets.d.ts +1 -1
  72. package/dist/services/chat-assistant.d.ts +23 -1
  73. package/dist/services/chat-assistant.d.ts.map +1 -1
  74. package/dist/services/chat-assistant.helpers.d.ts +21 -0
  75. package/dist/services/chat-assistant.helpers.d.ts.map +1 -1
  76. package/dist/services/chat-assistant.helpers.js +29 -10
  77. package/dist/services/chat-assistant.helpers.js.map +1 -1
  78. package/dist/services/chat-assistant.inline-visuals.d.ts +23 -0
  79. package/dist/services/chat-assistant.inline-visuals.d.ts.map +1 -0
  80. package/dist/services/chat-assistant.inline-visuals.js +129 -0
  81. package/dist/services/chat-assistant.inline-visuals.js.map +1 -0
  82. package/dist/services/chat-assistant.inline-visuals.test.js +85 -1
  83. package/dist/services/chat-assistant.inline-visuals.test.js.map +1 -1
  84. package/dist/services/chat-assistant.js +262 -38
  85. package/dist/services/chat-assistant.js.map +1 -1
  86. package/dist/services/chat-family-groups.d.ts +14 -0
  87. package/dist/services/chat-family-groups.d.ts.map +1 -0
  88. package/dist/services/chat-family-groups.js +96 -0
  89. package/dist/services/chat-family-groups.js.map +1 -0
  90. package/dist/services/chat-generation-protocol.d.ts +17 -31
  91. package/dist/services/chat-generation-protocol.d.ts.map +1 -1
  92. package/dist/services/chat-generation-protocol.helpers.d.ts +36 -0
  93. package/dist/services/chat-generation-protocol.helpers.d.ts.map +1 -0
  94. package/dist/services/chat-generation-protocol.helpers.js +53 -0
  95. package/dist/services/chat-generation-protocol.helpers.js.map +1 -0
  96. package/dist/services/chat-generation-protocol.js +86 -55
  97. package/dist/services/chat-generation-protocol.js.map +1 -1
  98. package/dist/services/chat-generation-protocol.test.js +31 -3
  99. package/dist/services/chat-generation-protocol.test.js.map +1 -1
  100. package/dist/services/chat-steer-messages.d.ts +117 -0
  101. package/dist/services/chat-steer-messages.d.ts.map +1 -0
  102. package/dist/services/chat-steer-messages.js +410 -0
  103. package/dist/services/chat-steer-messages.js.map +1 -0
  104. package/dist/services/chat-title-generation.d.ts +1 -0
  105. package/dist/services/chat-title-generation.d.ts.map +1 -1
  106. package/dist/services/chat-title-generation.js +12 -9
  107. package/dist/services/chat-title-generation.js.map +1 -1
  108. package/dist/services/chat-work-manifest.d.ts.map +1 -1
  109. package/dist/services/chat-work-manifest.js +39 -2
  110. package/dist/services/chat-work-manifest.js.map +1 -1
  111. package/dist/services/chats.constants.d.ts +5 -0
  112. package/dist/services/chats.constants.d.ts.map +1 -0
  113. package/dist/services/chats.constants.js +13 -0
  114. package/dist/services/chats.constants.js.map +1 -0
  115. package/dist/services/chats.create.d.ts +75 -0
  116. package/dist/services/chats.create.d.ts.map +1 -0
  117. package/dist/services/chats.create.js +159 -0
  118. package/dist/services/chats.create.js.map +1 -0
  119. package/dist/services/chats.d.ts +85 -76
  120. package/dist/services/chats.d.ts.map +1 -1
  121. package/dist/services/chats.fork-helpers.d.ts +8 -0
  122. package/dist/services/chats.fork-helpers.d.ts.map +1 -0
  123. package/dist/services/chats.fork-helpers.js +45 -0
  124. package/dist/services/chats.fork-helpers.js.map +1 -0
  125. package/dist/services/chats.inline-visual-persistence.d.ts +30 -0
  126. package/dist/services/chats.inline-visual-persistence.d.ts.map +1 -0
  127. package/dist/services/chats.inline-visual-persistence.js +209 -0
  128. package/dist/services/chats.inline-visual-persistence.js.map +1 -0
  129. package/dist/services/chats.js +288 -273
  130. package/dist/services/chats.js.map +1 -1
  131. package/dist/services/chats.types.d.ts +31 -0
  132. package/dist/services/chats.types.d.ts.map +1 -0
  133. package/dist/services/chats.types.js +2 -0
  134. package/dist/services/chats.types.js.map +1 -0
  135. package/dist/services/integrations/feishu/inbound-dispatcher-db.d.ts.map +1 -1
  136. package/dist/services/integrations/feishu/inbound-dispatcher-db.js +81 -53
  137. package/dist/services/integrations/feishu/inbound-dispatcher-db.js.map +1 -1
  138. package/dist/services/integrations/feishu/inbound-dispatcher.d.ts +1 -0
  139. package/dist/services/integrations/feishu/inbound-dispatcher.d.ts.map +1 -1
  140. package/dist/services/integrations/feishu/inbound-dispatcher.js.map +1 -1
  141. package/dist/services/issues.comments-attachments.d.ts.map +1 -1
  142. package/dist/services/issues.comments-attachments.js +11 -2
  143. package/dist/services/issues.comments-attachments.js.map +1 -1
  144. package/dist/services/issues.d.ts.map +1 -1
  145. package/dist/services/knowledge-portability/organization-skills.catalog.d.ts.map +1 -1
  146. package/dist/services/knowledge-portability/organization-skills.catalog.js +7 -1
  147. package/dist/services/knowledge-portability/organization-skills.catalog.js.map +1 -1
  148. package/dist/services/knowledge-portability/organization-skills.d.ts.map +1 -1
  149. package/dist/services/knowledge-portability/organization-skills.js +13 -1
  150. package/dist/services/knowledge-portability/organization-skills.js.map +1 -1
  151. package/dist/services/messenger-run-origin.d.ts +18 -0
  152. package/dist/services/messenger-run-origin.d.ts.map +1 -0
  153. package/dist/services/messenger-run-origin.js +248 -0
  154. package/dist/services/messenger-run-origin.js.map +1 -0
  155. package/dist/services/messenger-run-summary.d.ts +4 -0
  156. package/dist/services/messenger-run-summary.d.ts.map +1 -0
  157. package/dist/services/messenger-run-summary.js +6 -0
  158. package/dist/services/messenger-run-summary.js.map +1 -0
  159. package/dist/services/messenger-saved-views.d.ts +133 -0
  160. package/dist/services/messenger-saved-views.d.ts.map +1 -0
  161. package/dist/services/messenger-saved-views.js +275 -0
  162. package/dist/services/messenger-saved-views.js.map +1 -0
  163. package/dist/services/messenger.d.ts +17 -3
  164. package/dist/services/messenger.d.ts.map +1 -1
  165. package/dist/services/messenger.js +276 -56
  166. package/dist/services/messenger.js.map +1 -1
  167. package/dist/services/operator-event-visibility.d.ts +3 -0
  168. package/dist/services/operator-event-visibility.d.ts.map +1 -0
  169. package/dist/services/operator-event-visibility.js +5 -0
  170. package/dist/services/operator-event-visibility.js.map +1 -0
  171. package/dist/services/orgs.d.ts +5 -5
  172. package/dist/services/plugin-registry.d.ts +4 -4
  173. package/dist/services/projects.d.ts +2 -2
  174. package/dist/services/run-intelligence.d.ts.map +1 -1
  175. package/dist/services/run-intelligence.js +7 -3
  176. package/dist/services/run-intelligence.js.map +1 -1
  177. package/dist/services/runtime-kernel/heartbeat.core.d.ts.map +1 -1
  178. package/dist/services/runtime-kernel/heartbeat.core.js +9 -8
  179. package/dist/services/runtime-kernel/heartbeat.core.js.map +1 -1
  180. package/dist/services/runtime-kernel/heartbeat.d.ts +2 -2
  181. package/dist/services/runtime-kernel/heartbeat.d.ts.map +1 -1
  182. package/dist/services/runtime-kernel/heartbeat.js +3 -2
  183. package/dist/services/runtime-kernel/heartbeat.js.map +1 -1
  184. package/dist/services/runtime-kernel/heartbeat.misc.js +1 -1
  185. package/dist/services/runtime-kernel/heartbeat.misc.js.map +1 -1
  186. package/dist/services/runtime-kernel/heartbeat.recovery.js +1 -1
  187. package/dist/services/runtime-kernel/heartbeat.recovery.js.map +1 -1
  188. package/dist/services/side-chats.d.ts +1 -46
  189. package/dist/services/side-chats.d.ts.map +1 -1
  190. package/dist/services/side-chats.js +58 -65
  191. package/dist/services/side-chats.js.map +1 -1
  192. package/dist/services/title-generation.d.ts +3 -0
  193. package/dist/services/title-generation.d.ts.map +1 -1
  194. package/dist/services/title-generation.js +178 -6
  195. package/dist/services/title-generation.js.map +1 -1
  196. package/dist/services/workspace-backups.d.ts +19 -8
  197. package/dist/services/workspace-backups.d.ts.map +1 -1
  198. package/dist/services/workspace-backups.js +335 -127
  199. package/dist/services/workspace-backups.js.map +1 -1
  200. package/package.json +14 -13
  201. package/resources/bundled-skills/browser/references/tool-contract.md +2 -2
  202. package/resources/bundled-skills/rudder-docs/SKILL.md +20 -4
  203. package/resources/bundled-skills/rudder-docs/evals/retrieval-authority-evals.json +262 -0
  204. package/resources/bundled-skills/rudder-docs/evals/trigger-evals.json +11 -11
  205. package/resources/bundled-skills/rudder-docs/references/agent-creation.md +153 -0
  206. package/resources/bundled-skills/rudder-docs/references/api-reference.md +9 -2
  207. package/resources/bundled-skills/rudder-docs/references/cli-reference.md +12 -12
  208. package/{skills/rudder-docs/references/control-plane-practices.md → resources/bundled-skills/rudder-docs/references/operating-practices.md} +4 -4
  209. package/resources/bundled-skills/rudder-docs/references/organization-skills.md +3 -3
  210. package/resources/bundled-skills/rudder-docs/references/plugin-authoring.md +116 -0
  211. package/resources/bundled-skills/rudder-docs/references/source-map.md +26 -2
  212. package/resources/bundled-skills/visualize/SKILL.md +29 -27
  213. package/resources/bundled-skills/visualize/references/runtime-contract.md +18 -8
  214. package/skills/browser/references/tool-contract.md +2 -2
  215. package/skills/rudder-docs/SKILL.md +20 -4
  216. package/skills/rudder-docs/evals/retrieval-authority-evals.json +262 -0
  217. package/skills/rudder-docs/evals/trigger-evals.json +11 -11
  218. package/skills/rudder-docs/references/agent-creation.md +153 -0
  219. package/skills/rudder-docs/references/api-reference.md +9 -2
  220. package/skills/rudder-docs/references/cli-reference.md +12 -12
  221. package/{resources/bundled-skills/rudder-docs/references/control-plane-practices.md → skills/rudder-docs/references/operating-practices.md} +4 -4
  222. package/skills/rudder-docs/references/organization-skills.md +3 -3
  223. package/skills/rudder-docs/references/plugin-authoring.md +116 -0
  224. package/skills/rudder-docs/references/source-map.md +26 -2
  225. package/skills/visualize/SKILL.md +29 -27
  226. package/skills/visualize/references/runtime-contract.md +18 -8
  227. package/ui-dist/assets/{abnfDiagram-VRR7QNED-Dpnx79fp.js → abnfDiagram-VRR7QNED-CAAPm9Nj.js} +1 -1
  228. package/ui-dist/assets/{arc-Cpvh_rCf.js → arc-DOFoNr3M.js} +1 -1
  229. package/ui-dist/assets/{architectureDiagram-ZJ3FMSHR-sDD_mBAI.js → architectureDiagram-ZJ3FMSHR-DRg6yhG8.js} +1 -1
  230. package/ui-dist/assets/{blockDiagram-677ZJIJ3-4O4wWti1.js → blockDiagram-677ZJIJ3-e3ShzsXT.js} +1 -1
  231. package/ui-dist/assets/{c4Diagram-LMCZKHZV-BkGODE4P.js → c4Diagram-LMCZKHZV-Csd_18O2.js} +1 -1
  232. package/ui-dist/assets/channel-BFLsBJOK.js +1 -0
  233. package/ui-dist/assets/{chunk-2Q5K7J3B-DsDQQpID.js → chunk-2Q5K7J3B-eF77FV1C.js} +1 -1
  234. package/ui-dist/assets/{chunk-32BRIVSS-Bzx_VnIw.js → chunk-32BRIVSS-CpMx72B5.js} +1 -1
  235. package/ui-dist/assets/{chunk-5VM5RSS4-D4LoPCni.js → chunk-5VM5RSS4-Be6WylCu.js} +1 -1
  236. package/ui-dist/assets/{chunk-EX3LRPZG-BO0R-mS4.js → chunk-EX3LRPZG-D-A_TfL-.js} +1 -1
  237. package/ui-dist/assets/{chunk-JWPE2WC7-B4Nr8KRL.js → chunk-JWPE2WC7-CdBLDqvo.js} +1 -1
  238. package/ui-dist/assets/{chunk-MOJQB5TN--uaDDrYM.js → chunk-MOJQB5TN-DkLjRENV.js} +1 -1
  239. package/ui-dist/assets/{chunk-RYQCIY6F-CyBY2w_j.js → chunk-RYQCIY6F-57VqTsE9.js} +1 -1
  240. package/ui-dist/assets/{chunk-V7JOEXUC-BMid_x8S.js → chunk-V7JOEXUC-DI_m8pt6.js} +1 -1
  241. package/ui-dist/assets/{chunk-VR4S4FIN-DVqdPKuG.js → chunk-VR4S4FIN-CM_944j4.js} +1 -1
  242. package/ui-dist/assets/{chunk-XXDRQBXY-vy03lLSS.js → chunk-XXDRQBXY--WTAlt82.js} +1 -1
  243. package/ui-dist/assets/classDiagram-OUVF2IWQ-Dah6C4Dl.js +1 -0
  244. package/ui-dist/assets/classDiagram-v2-EOCWNBFH-Dah6C4Dl.js +1 -0
  245. package/ui-dist/assets/{cose-bilkent-JH36ORCC-jQDZmrG3.js → cose-bilkent-JH36ORCC-CR0qu31s.js} +1 -1
  246. package/ui-dist/assets/{cynefin-VYW2F7L2-BxBj6aea.js → cynefin-VYW2F7L2-f41lF5RD.js} +1 -1
  247. package/ui-dist/assets/{cynefinDiagram-TSTJHNR4-BuUubF5I.js → cynefinDiagram-TSTJHNR4-88wJ2LA8.js} +1 -1
  248. package/ui-dist/assets/{dagre-VKFMJZFB-B8HipJ3a.js → dagre-VKFMJZFB-B1yJCIRh.js} +1 -1
  249. package/ui-dist/assets/{diagram-FQU43EPY-r7gkbKSt.js → diagram-FQU43EPY-C0iYYFUe.js} +1 -1
  250. package/ui-dist/assets/{diagram-G47NLZAW-CxClRsxD.js → diagram-G47NLZAW-Cp6S0siK.js} +1 -1
  251. package/ui-dist/assets/{diagram-NH7WQ7WH-C8HYTLlq.js → diagram-NH7WQ7WH-CmZb5OSk.js} +1 -1
  252. package/ui-dist/assets/{diagram-OA4YK3LP-CjwqqLKz.js → diagram-OA4YK3LP-9rFYGY7H.js} +1 -1
  253. package/ui-dist/assets/{diagram-WEI45ONY-2IWfCqZb.js → diagram-WEI45ONY-Og8vyDQh.js} +1 -1
  254. package/ui-dist/assets/{ebnfDiagram-CCIWWBDH-DVGZkgjy.js → ebnfDiagram-CCIWWBDH--5sMape2.js} +1 -1
  255. package/ui-dist/assets/{erDiagram-Q63AITRT-C_-u3Gmw.js → erDiagram-Q63AITRT-DG10Bza-.js} +1 -1
  256. package/ui-dist/assets/{flowDiagram-23GEKE2U-BvGg0NCq.js → flowDiagram-23GEKE2U-BW-aZfEk.js} +1 -1
  257. package/ui-dist/assets/{ganttDiagram-NO4QXBWP-U3CZUUUR.js → ganttDiagram-NO4QXBWP-DcA7on8t.js} +1 -1
  258. package/ui-dist/assets/{gitGraphDiagram-IHSO6WYX-CIWuEBIo.js → gitGraphDiagram-IHSO6WYX-ygGufg32.js} +1 -1
  259. package/ui-dist/assets/{graph-D3P5q-7m.js → graph-BXl6uBoM.js} +1 -1
  260. package/ui-dist/assets/{index-DOPIV8vd.js → index-9bXlV2sq.js} +1 -1
  261. package/ui-dist/assets/{index-CjztBLJi.js → index-B58ems-F.js} +1 -1
  262. package/ui-dist/assets/{index-mnl55Stn.js → index-BM-SJNCx.js} +1 -1
  263. package/ui-dist/assets/index-BcdA9dZc.css +1 -0
  264. package/ui-dist/assets/{index-BAgtKYR1.js → index-BmTNDbzy.js} +1 -1
  265. package/ui-dist/assets/{index-DidCCw78.js → index-CCDynlok.js} +1 -1
  266. package/ui-dist/assets/{index-CbHqnWUe.js → index-CRLl2Ck7.js} +1 -1
  267. package/ui-dist/assets/{index-D7ycf1qU.js → index-CqmU1PxY.js} +1 -1
  268. package/ui-dist/assets/{index-B1rLBtZ1.js → index-CssgLJwf.js} +605 -493
  269. package/ui-dist/assets/{index-DRxLJD40.js → index-DOVMMhyj.js} +1 -1
  270. package/ui-dist/assets/{index-Ds_qma4-.js → index-DTlR8bJV.js} +1 -1
  271. package/ui-dist/assets/{index-DCFf9dps.js → index-Dl6nXXNc.js} +1 -1
  272. package/ui-dist/assets/{index-DAYlwxsg.js → index-DoiNhQrY.js} +1 -1
  273. package/ui-dist/assets/{index-CBOr9F6w.js → index-Dug5GX1J.js} +1 -1
  274. package/ui-dist/assets/{index-HkQRx1D6.js → index-DxXOCTVe.js} +1 -1
  275. package/ui-dist/assets/{index-BAMXpiI5.js → index-GdN-7KLt.js} +1 -1
  276. package/ui-dist/assets/{index-ikpL--zj.js → index-ZA8lPH2n.js} +1 -1
  277. package/ui-dist/assets/{index-Cu1iMhjl.js → index-fkDP349f.js} +1 -1
  278. package/ui-dist/assets/{index-DYMtCDKT.js → index-uKIvv9n9.js} +1 -1
  279. package/ui-dist/assets/{infoDiagram-FWYZ7A6U-Cx8Fa-I4.js → infoDiagram-FWYZ7A6U-27INMkBm.js} +1 -1
  280. package/ui-dist/assets/{ishikawaDiagram-FXEZZL3T-Cmuz1QUN.js → ishikawaDiagram-FXEZZL3T-Bp6XQ1_r.js} +1 -1
  281. package/ui-dist/assets/{journeyDiagram-5HDEW3XC-CJgkiVXG.js → journeyDiagram-5HDEW3XC-9vaIwdZ3.js} +1 -1
  282. package/ui-dist/assets/{kanban-definition-HUTT4EX6-RAWpefOB.js → kanban-definition-HUTT4EX6-DjsMaR6l.js} +1 -1
  283. package/ui-dist/assets/{layout-DyWQv0Rr.js → layout-C0oWcIiC.js} +1 -1
  284. package/ui-dist/assets/{linear-D5pdgIf9.js → linear-DNbmenmQ.js} +1 -1
  285. package/ui-dist/assets/{map-bVSzNLl2.js → map-B1s9kpcR.js} +1 -1
  286. package/ui-dist/assets/{mermaid.core-CeaXGD6B.js → mermaid.core-DsYT9DxL.js} +4 -4
  287. package/ui-dist/assets/{mindmap-definition-LN4V7U3C-B8B8AX5C.js → mindmap-definition-LN4V7U3C-vVHeRI83.js} +1 -1
  288. package/ui-dist/assets/{pegDiagram-2B236MQR-C4Sv-ua6.js → pegDiagram-2B236MQR-ohrgWLo_.js} +1 -1
  289. package/ui-dist/assets/{pieDiagram-ENE6RG2P-CLARlOHx.js → pieDiagram-ENE6RG2P-B0EqPrjn.js} +1 -1
  290. package/ui-dist/assets/{quadrantDiagram-ABIIQ3AL-DPCXQmeT.js → quadrantDiagram-ABIIQ3AL-D44iYm0o.js} +1 -1
  291. package/ui-dist/assets/{railroadDiagram-RFXS5EU6-BpqRuKUQ.js → railroadDiagram-RFXS5EU6-BQU5bpbU.js} +1 -1
  292. package/ui-dist/assets/{requirementDiagram-TGXJPOKE-Dd-h62HZ.js → requirementDiagram-TGXJPOKE-DGJciRxB.js} +1 -1
  293. package/ui-dist/assets/{sankeyDiagram-HTMAVEWB-DylT_pqq.js → sankeyDiagram-HTMAVEWB-NMXZW_Qb.js} +1 -1
  294. package/ui-dist/assets/{sequenceDiagram-DBY2YBRQ-RiCF1REj.js → sequenceDiagram-DBY2YBRQ-8uWY67Bb.js} +1 -1
  295. package/ui-dist/assets/{sizeCapture-X5ZJPWSS-DXW4JQz2.js → sizeCapture-X5ZJPWSS-BnUUR-On.js} +1 -1
  296. package/ui-dist/assets/{stateDiagram-2N3HPSRC-6U3ESIGT.js → stateDiagram-2N3HPSRC-B37bcKMy.js} +1 -1
  297. package/ui-dist/assets/stateDiagram-v2-6OUMAXLB-p6H0vL7N.js +1 -0
  298. package/ui-dist/assets/{swimlanes-5IMT3BWC-CeNHVNCi.js → swimlanes-5IMT3BWC-Bi2ZzUMi.js} +2 -2
  299. package/ui-dist/assets/swimlanesDiagram-G3AALYLV-BX6FiLF9.js +8 -0
  300. package/ui-dist/assets/{timeline-definition-FHXFAJF6-Vlwoe_1b.js → timeline-definition-FHXFAJF6-CkWauU5D.js} +1 -1
  301. package/ui-dist/assets/{vennDiagram-L72KCM5P-DBP7D3HE.js → vennDiagram-L72KCM5P-BrmBXmnk.js} +1 -1
  302. package/ui-dist/assets/{wardleyDiagram-EHGQE667-DG-wzqpy.js → wardleyDiagram-EHGQE667-kO5cojc6.js} +1 -1
  303. package/ui-dist/assets/{xychartDiagram-FW5EYKEG-BAq3mbha.js → xychartDiagram-FW5EYKEG-CUBDaCDm.js} +1 -1
  304. package/ui-dist/index.html +5 -4
  305. package/resources/bundled-skills/rudder-create-agent/SKILL.md +0 -185
  306. package/resources/bundled-skills/rudder-create-agent/references/api-reference.md +0 -179
  307. package/resources/bundled-skills/rudder-create-agent/references/cli-reference.md +0 -132
  308. package/resources/bundled-skills/rudder-create-plugin/SKILL.md +0 -103
  309. package/resources/bundled-skills/skill-optimizer/CHANGELOG.md +0 -29
  310. package/resources/bundled-skills/skill-optimizer/SKILL.md +0 -205
  311. package/resources/bundled-skills/skill-optimizer/references/adapters/creative-brand-content.md +0 -30
  312. package/resources/bundled-skills/skill-optimizer/references/adapters/customer-support-sales.md +0 -30
  313. package/resources/bundled-skills/skill-optimizer/references/adapters/document-data-processing.md +0 -31
  314. package/resources/bundled-skills/skill-optimizer/references/adapters/education-training.md +0 -31
  315. package/resources/bundled-skills/skill-optimizer/references/adapters/finance-accounting.md +0 -31
  316. package/resources/bundled-skills/skill-optimizer/references/adapters/healthcare-operations.md +0 -30
  317. package/resources/bundled-skills/skill-optimizer/references/adapters/hr-people-ops.md +0 -31
  318. package/resources/bundled-skills/skill-optimizer/references/adapters/legal-compliance.md +0 -31
  319. package/resources/bundled-skills/skill-optimizer/references/adapters/operations-supply-chain.md +0 -31
  320. package/resources/bundled-skills/skill-optimizer/references/adapters/personal-productivity.md +0 -29
  321. package/resources/bundled-skills/skill-optimizer/references/adapters/research-knowledge.md +0 -31
  322. package/resources/bundled-skills/skill-optimizer/references/adapters/software-ai.md +0 -31
  323. package/resources/bundled-skills/skill-optimizer/references/domain-adapter-patterns.md +0 -66
  324. package/resources/bundled-skills/skill-optimizer/references/eval-method.md +0 -17
  325. package/resources/bundled-skills/skill-optimizer/references/universal-optimization-lens.md +0 -73
  326. package/skills/rudder-create-agent/SKILL.md +0 -185
  327. package/skills/rudder-create-agent/references/api-reference.md +0 -179
  328. package/skills/rudder-create-agent/references/cli-reference.md +0 -132
  329. package/skills/rudder-create-plugin/SKILL.md +0 -103
  330. package/skills/skill-optimizer/CHANGELOG.md +0 -29
  331. package/skills/skill-optimizer/SKILL.md +0 -205
  332. package/skills/skill-optimizer/references/adapters/creative-brand-content.md +0 -30
  333. package/skills/skill-optimizer/references/adapters/customer-support-sales.md +0 -30
  334. package/skills/skill-optimizer/references/adapters/document-data-processing.md +0 -31
  335. package/skills/skill-optimizer/references/adapters/education-training.md +0 -31
  336. package/skills/skill-optimizer/references/adapters/finance-accounting.md +0 -31
  337. package/skills/skill-optimizer/references/adapters/healthcare-operations.md +0 -30
  338. package/skills/skill-optimizer/references/adapters/hr-people-ops.md +0 -31
  339. package/skills/skill-optimizer/references/adapters/legal-compliance.md +0 -31
  340. package/skills/skill-optimizer/references/adapters/operations-supply-chain.md +0 -31
  341. package/skills/skill-optimizer/references/adapters/personal-productivity.md +0 -29
  342. package/skills/skill-optimizer/references/adapters/research-knowledge.md +0 -31
  343. package/skills/skill-optimizer/references/adapters/software-ai.md +0 -31
  344. package/skills/skill-optimizer/references/domain-adapter-patterns.md +0 -66
  345. package/skills/skill-optimizer/references/eval-method.md +0 -17
  346. package/skills/skill-optimizer/references/universal-optimization-lens.md +0 -73
  347. package/ui-dist/assets/channel-CM4Myg_6.js +0 -1
  348. package/ui-dist/assets/classDiagram-OUVF2IWQ-CtlIEzTt.js +0 -1
  349. package/ui-dist/assets/classDiagram-v2-EOCWNBFH-CtlIEzTt.js +0 -1
  350. package/ui-dist/assets/index-DekHKOsL.css +0 -1
  351. package/ui-dist/assets/stateDiagram-v2-6OUMAXLB-KQTrcZvp.js +0 -1
  352. package/ui-dist/assets/swimlanesDiagram-G3AALYLV-CcxS1c6r.js +0 -8
@@ -1,11 +1,15 @@
1
- import { activityLog, agents, approvalComments, approvals, authUsers, heartbeatRuns, issueComments, issueFollows, issues, joinRequests, messengerCustomGroupEntries, messengerCustomGroups, messengerThreadUserStates, projects } from "@rudderhq/db";
2
- import { formatMessengerPreview, formatMessengerTitle, issueUpdatedChangedKeys, toPublicHeartbeatRunContextSnapshot } from "@rudderhq/shared";
1
+ import { activityLog, agents, approvalComments, approvals, authUsers, heartbeatRuns, issueComments, issueFollows, issues, joinRequests, messengerCustomGroupEntries, messengerCustomGroups, messengerSavedViews, messengerThreadUserStates, projects } from "@rudderhq/db";
2
+ import { formatMessengerPreview, formatMessengerTitle, issueUpdatedChangedKeys, messengerSavedViewIdSchema } from "@rudderhq/shared";
3
3
  import { and, asc, desc, eq, gt, inArray, isNull, ne, or, sql } from "drizzle-orm";
4
4
  import { badRequest, conflict, notFound } from "../errors.js";
5
5
  import { redactEventPayload } from "../redaction.js";
6
+ import { logActivity } from "./activity-log.js";
6
7
  import { budgetService } from "./budgets.js";
7
8
  import { chatService } from "./chats.js";
8
9
  import { issueLowSignalContentOnlyActivitySql } from "./issue-activity-filters.js";
10
+ import { hydrateMessengerFailedRunOrigins, messengerFailedRunSourceAction, } from "./messenger-run-origin.js";
11
+ import { failedRunUserSummary } from "./messenger-run-summary.js";
12
+ import { lockMessengerCustomGroupPlacement, lockMessengerSavedViewPlacement, } from "./messenger-saved-views.js";
9
13
  const ISSUE_ACTIVITY_ACTIONS = [
10
14
  "issue.updated",
11
15
  "issue.followed",
@@ -25,7 +29,6 @@ const DEFAULT_THREAD_SUMMARY_LIMIT = 40;
25
29
  const MAX_THREAD_SUMMARY_LIMIT = 100;
26
30
  const DEFAULT_ISSUE_THREAD_DETAIL_LIMIT = 50;
27
31
  const MAX_ISSUE_THREAD_DETAIL_LIMIT = 100;
28
- const FAILED_RUN_USER_SUMMARY = "The run hit a system-level execution problem. Rudder saved the technical details for diagnostics.";
29
32
  function truncate(value, max = 140) {
30
33
  return formatMessengerPreview(value, { max });
31
34
  }
@@ -556,10 +559,9 @@ function approvalCard(approval, latestComment, currentUserId, latestActivityAt)
556
559
  approval: approval,
557
560
  };
558
561
  }
559
- function failedRunCard(run, agentName) {
562
+ function failedRunCard(run, agentName, origin) {
560
563
  const summary = failedRunUserSummary(run);
561
- const publicContextSnapshot = toPublicHeartbeatRunContextSnapshot(run.contextSnapshot);
562
- const publicRun = { ...run, contextSnapshot: publicContextSnapshot };
564
+ const sourceAction = messengerFailedRunSourceAction(origin);
563
565
  return {
564
566
  id: run.id,
565
567
  threadKey: "failed-runs",
@@ -572,23 +574,17 @@ function failedRunCard(run, agentName) {
572
574
  latestActivityAt: run.updatedAt ?? run.createdAt,
573
575
  actions: [
574
576
  buildAction("Retry", `/agent-runs/${run.id}/retry`, "POST"),
577
+ ...(sourceAction ? [sourceAction] : []),
575
578
  buildAction("Open run", `/agents/${run.agentId}/runs/${run.id}`, "GET"),
576
579
  ],
577
580
  metadata: {
578
581
  runId: run.id,
579
582
  agentId: run.agentId,
580
583
  status: run.status,
581
- contextSnapshot: publicContextSnapshot,
582
584
  },
583
- run: publicRun,
585
+ origin,
584
586
  };
585
587
  }
586
- function readNonEmptyString(value) {
587
- return typeof value === "string" && value.trim().length > 0 ? value.trim() : null;
588
- }
589
- function failedRunUserSummary(run) {
590
- return readNonEmptyString(run.resultJson?.userMessage) ?? FAILED_RUN_USER_SUMMARY;
591
- }
592
588
  function budgetCard(incident) {
593
589
  return {
594
590
  id: incident.id,
@@ -676,8 +672,30 @@ export function messengerService(db) {
676
672
  || threadKey === "budget-alerts"
677
673
  || threadKey === "join-requests";
678
674
  }
679
- async function getCustomGroupOrThrow(orgId, userId, groupId) {
680
- const [group] = await db
675
+ function savedViewIdFromItemKey(itemKey) {
676
+ if (!itemKey.startsWith("saved-view:"))
677
+ return null;
678
+ const parsed = messengerSavedViewIdSchema.safeParse(itemKey.slice("saved-view:".length));
679
+ if (!parsed.success)
680
+ throw badRequest("Invalid Messenger Saved View item key");
681
+ return parsed.data;
682
+ }
683
+ async function logSavedViewPlacement(database, orgId, userId, itemKey, action, details) {
684
+ const savedViewId = savedViewIdFromItemKey(itemKey);
685
+ if (!savedViewId)
686
+ return;
687
+ await logActivity(database, {
688
+ orgId,
689
+ actorType: "user",
690
+ actorId: userId,
691
+ action,
692
+ entityType: "messenger_saved_view",
693
+ entityId: savedViewId,
694
+ details: { itemKey, ...details },
695
+ });
696
+ }
697
+ async function getCustomGroupOrThrowWithDb(database, orgId, userId, groupId) {
698
+ const [group] = await database
681
699
  .select()
682
700
  .from(messengerCustomGroups)
683
701
  .where(and(eq(messengerCustomGroups.orgId, orgId), eq(messengerCustomGroups.userId, userId), eq(messengerCustomGroups.id, groupId)))
@@ -686,6 +704,9 @@ export function messengerService(db) {
686
704
  throw notFound("Messenger custom group not found");
687
705
  return group;
688
706
  }
707
+ async function getCustomGroupOrThrow(orgId, userId, groupId) {
708
+ return getCustomGroupOrThrowWithDb(db, orgId, userId, groupId);
709
+ }
689
710
  async function loadIssueThreadSummaryById(orgId, userId, issueId) {
690
711
  const lastReadAtPromise = lastReadAtForThread(db, orgId, userId, "issues");
691
712
  const rows = (await db.execute(issueEntryRowsQuery(orgId, userId, sql `
@@ -754,9 +775,28 @@ export function messengerService(db) {
754
775
  throw notFound("Messenger thread not found");
755
776
  }
756
777
  }
778
+ async function findMessengerSavedViewWithDb(database, orgId, userId, itemKey) {
779
+ const savedViewId = savedViewIdFromItemKey(itemKey);
780
+ if (!savedViewId)
781
+ return null;
782
+ return database
783
+ .select()
784
+ .from(messengerSavedViews)
785
+ .where(and(eq(messengerSavedViews.orgId, orgId), eq(messengerSavedViews.userId, userId), eq(messengerSavedViews.id, savedViewId)))
786
+ .limit(1)
787
+ .then((rows) => rows[0] ?? null);
788
+ }
789
+ async function findMessengerSavedView(orgId, userId, itemKey) {
790
+ return findMessengerSavedViewWithDb(db, orgId, userId, itemKey);
791
+ }
757
792
  async function listThreadTitles(orgId, userId, threadKeys) {
758
793
  const titles = [];
759
794
  for (const threadKey of [...new Set(threadKeys)]) {
795
+ const savedView = await findMessengerSavedView(orgId, userId, threadKey);
796
+ if (savedView?.title) {
797
+ titles.push(savedView.title);
798
+ continue;
799
+ }
760
800
  const summary = await findMessengerThreadSummary(orgId, userId, threadKey);
761
801
  if (summary?.title)
762
802
  titles.push(summary.title);
@@ -785,8 +825,22 @@ export function messengerService(db) {
785
825
  .where(and(eq(messengerCustomGroupEntries.orgId, orgId), eq(messengerCustomGroupEntries.userId, userId)))
786
826
  .orderBy(asc(messengerCustomGroupEntries.sortOrder), asc(messengerCustomGroupEntries.createdAt)),
787
827
  ]);
828
+ const savedViewItemKeys = entries
829
+ .map((entry) => entry.threadKey)
830
+ .filter((itemKey) => Boolean(savedViewIdFromItemKey(itemKey)));
831
+ const savedViewIds = savedViewItemKeys
832
+ .map((itemKey) => savedViewIdFromItemKey(itemKey))
833
+ .filter((id) => Boolean(id));
834
+ const savedViews = savedViewIds.length > 0
835
+ ? await db
836
+ .select()
837
+ .from(messengerSavedViews)
838
+ .where(and(eq(messengerSavedViews.orgId, orgId), eq(messengerSavedViews.userId, userId), inArray(messengerSavedViews.id, savedViewIds)))
839
+ : [];
840
+ const savedViewByItemKey = new Map(savedViews.map((savedView) => [`saved-view:${savedView.id}`, savedView]));
788
841
  const conversationIds = entries
789
842
  .map((entry) => entry.threadKey)
843
+ .filter((itemKey) => !savedViewIdFromItemKey(itemKey))
790
844
  .map((threadKey) => chatConversationIdFromThreadKey(threadKey))
791
845
  .filter((id) => Boolean(id));
792
846
  const conversations = await chatsSvc.listSummariesByIds(orgId, conversationIds, userId);
@@ -796,6 +850,7 @@ export function messengerService(db) {
796
850
  }));
797
851
  const nonChatThreadKeys = [...new Set(entries
798
852
  .map((entry) => entry.threadKey)
853
+ .filter((itemKey) => !savedViewIdFromItemKey(itemKey))
799
854
  .filter((threadKey) => !chatConversationIdFromThreadKey(threadKey)))];
800
855
  const issueThreadKeys = nonChatThreadKeys.filter((threadKey) => Boolean(issueIdFromThreadKey(threadKey)));
801
856
  if (nonChatThreadKeys.length > 0) {
@@ -819,6 +874,36 @@ export function messengerService(db) {
819
874
  const staleEntryIds = [];
820
875
  const entriesByGroupId = new Map();
821
876
  for (const entry of entries) {
877
+ const savedViewId = savedViewIdFromItemKey(entry.threadKey);
878
+ if (savedViewId) {
879
+ const savedView = savedViewByItemKey.get(entry.threadKey);
880
+ if (!savedView) {
881
+ staleEntryIds.push(entry.id);
882
+ continue;
883
+ }
884
+ // Hidden Saved Views retain their exact membership and order, but are
885
+ // omitted from the visible hydrated directory until restored.
886
+ if (savedView.hiddenAt)
887
+ continue;
888
+ const { threadKey: _storedItemKey, ...entryFields } = entry;
889
+ const item = {
890
+ type: "saved_view",
891
+ itemKey: entry.threadKey,
892
+ title: savedView.title,
893
+ savedView,
894
+ };
895
+ const hydratedEntry = {
896
+ ...entryFields,
897
+ itemKey: entry.threadKey,
898
+ item,
899
+ };
900
+ const groupEntries = entriesByGroupId.get(entry.groupId);
901
+ if (groupEntries)
902
+ groupEntries.push(hydratedEntry);
903
+ else
904
+ entriesByGroupId.set(entry.groupId, [hydratedEntry]);
905
+ continue;
906
+ }
822
907
  const summary = summaryByThreadKey.get(entry.threadKey);
823
908
  if (!summary) {
824
909
  if (isSyntheticMessengerThreadKey(entry.threadKey)) {
@@ -829,6 +914,13 @@ export function messengerService(db) {
829
914
  }
830
915
  const hydratedEntry = {
831
916
  ...entry,
917
+ itemKey: entry.threadKey,
918
+ item: {
919
+ type: "thread",
920
+ itemKey: entry.threadKey,
921
+ title: summary.title,
922
+ thread: summary,
923
+ },
832
924
  thread: summary,
833
925
  };
834
926
  const groupEntries = entriesByGroupId.get(entry.groupId);
@@ -891,15 +983,33 @@ export function messengerService(db) {
891
983
  .returning();
892
984
  return group;
893
985
  }
986
+ async function removeCustomGroup(orgId, userId, groupId, source) {
987
+ return db.transaction(async (tx) => {
988
+ const txDb = tx;
989
+ await lockMessengerSavedViewPlacement(txDb, orgId, userId);
990
+ await lockMessengerCustomGroupPlacement(txDb, orgId, userId, groupId);
991
+ await getCustomGroupOrThrowWithDb(txDb, orgId, userId, groupId);
992
+ const savedMemberships = (await txDb
993
+ .select({ threadKey: messengerCustomGroupEntries.threadKey })
994
+ .from(messengerCustomGroupEntries)
995
+ .where(and(eq(messengerCustomGroupEntries.orgId, orgId), eq(messengerCustomGroupEntries.userId, userId), eq(messengerCustomGroupEntries.groupId, groupId))))
996
+ .filter((entry) => Boolean(savedViewIdFromItemKey(entry.threadKey)));
997
+ for (const membership of savedMemberships) {
998
+ await logSavedViewPlacement(txDb, orgId, userId, membership.threadKey, "messenger.saved_view_group_removed", { groupId, source });
999
+ }
1000
+ const [group] = await txDb
1001
+ .delete(messengerCustomGroups)
1002
+ .where(and(eq(messengerCustomGroups.orgId, orgId), eq(messengerCustomGroups.userId, userId), eq(messengerCustomGroups.id, groupId)))
1003
+ .returning();
1004
+ return group;
1005
+ });
1006
+ }
894
1007
  async function separateCustomGroup(orgId, userId, groupId) {
895
- await getCustomGroupOrThrow(orgId, userId, groupId);
896
- const [group] = await db
897
- .delete(messengerCustomGroups)
898
- .where(and(eq(messengerCustomGroups.orgId, orgId), eq(messengerCustomGroups.userId, userId), eq(messengerCustomGroups.id, groupId)))
899
- .returning();
900
- return group;
1008
+ return removeCustomGroup(orgId, userId, groupId, "group_separate");
1009
+ }
1010
+ async function deleteCustomGroup(orgId, userId, groupId) {
1011
+ return removeCustomGroup(orgId, userId, groupId, "group_delete");
901
1012
  }
902
- const deleteCustomGroup = separateCustomGroup;
903
1013
  async function reorderCustomGroups(orgId, userId, groupIds) {
904
1014
  const uniqueGroupIds = [...new Set(groupIds)];
905
1015
  if (uniqueGroupIds.length === 0)
@@ -922,16 +1032,15 @@ export function messengerService(db) {
922
1032
  });
923
1033
  return listCustomGroups(orgId, userId);
924
1034
  }
925
- async function assignThreadToCustomGroupWithClient(client, orgId, userId, groupId, threadKey) {
926
- await ensureMessengerThreadCanBeGrouped(orgId, userId, threadKey);
927
- const [lastEntry] = await client
1035
+ async function assignThreadToCustomGroupWithClient(database, orgId, userId, groupId, threadKey) {
1036
+ const [lastEntry] = await database
928
1037
  .select({ sortOrder: messengerCustomGroupEntries.sortOrder })
929
1038
  .from(messengerCustomGroupEntries)
930
1039
  .where(and(eq(messengerCustomGroupEntries.orgId, orgId), eq(messengerCustomGroupEntries.userId, userId), eq(messengerCustomGroupEntries.groupId, groupId)))
931
1040
  .orderBy(desc(messengerCustomGroupEntries.sortOrder))
932
1041
  .limit(1);
933
1042
  const now = new Date();
934
- const [entry] = await client
1043
+ const [entry] = await database
935
1044
  .insert(messengerCustomGroupEntries)
936
1045
  .values({
937
1046
  orgId,
@@ -954,49 +1063,159 @@ export function messengerService(db) {
954
1063
  },
955
1064
  })
956
1065
  .returning();
957
- return entry;
1066
+ if (savedViewIdFromItemKey(threadKey)) {
1067
+ const { threadKey: _storedItemKey, ...entryFields } = entry;
1068
+ return { ...entryFields, itemKey: threadKey };
1069
+ }
1070
+ return { ...entry, itemKey: threadKey };
958
1071
  }
959
1072
  async function assignThreadToCustomGroup(orgId, userId, groupId, threadKey) {
960
- await getCustomGroupOrThrow(orgId, userId, groupId);
961
- return assignThreadToCustomGroupWithClient(db, orgId, userId, groupId, threadKey);
1073
+ const savedViewId = savedViewIdFromItemKey(threadKey);
1074
+ if (!savedViewId) {
1075
+ await ensureMessengerThreadCanBeGrouped(orgId, userId, threadKey);
1076
+ }
1077
+ return db.transaction(async (tx) => {
1078
+ const txDb = tx;
1079
+ // The owner lock keeps the source membership stable while we resolve and
1080
+ // acquire all affected group locks. Saved placements also share it with
1081
+ // Saved View delete, preventing a post-cleanup orphan insert.
1082
+ await lockMessengerSavedViewPlacement(txDb, orgId, userId);
1083
+ const [existingMembership] = await txDb
1084
+ .select({ groupId: messengerCustomGroupEntries.groupId })
1085
+ .from(messengerCustomGroupEntries)
1086
+ .where(and(eq(messengerCustomGroupEntries.orgId, orgId), eq(messengerCustomGroupEntries.userId, userId), eq(messengerCustomGroupEntries.threadKey, threadKey)))
1087
+ .limit(1);
1088
+ const affectedGroupIds = [...new Set([existingMembership?.groupId, groupId].filter((id) => Boolean(id)))].sort();
1089
+ for (const affectedGroupId of affectedGroupIds) {
1090
+ await lockMessengerCustomGroupPlacement(txDb, orgId, userId, affectedGroupId);
1091
+ }
1092
+ await getCustomGroupOrThrowWithDb(txDb, orgId, userId, groupId);
1093
+ if (savedViewId && !await findMessengerSavedViewWithDb(txDb, orgId, userId, threadKey)) {
1094
+ throw notFound("Messenger Saved View not found");
1095
+ }
1096
+ const entry = await assignThreadToCustomGroupWithClient(txDb, orgId, userId, groupId, threadKey);
1097
+ if (savedViewId) {
1098
+ await logSavedViewPlacement(txDb, orgId, userId, threadKey, "messenger.saved_view_group_assigned", { groupId });
1099
+ }
1100
+ return entry;
1101
+ });
962
1102
  }
963
1103
  async function createCustomGroupWithEntries(orgId, userId, name, icon, threadKeys) {
964
1104
  const uniqueThreadKeys = [...new Set(threadKeys)];
965
1105
  if (uniqueThreadKeys.length === 0)
966
1106
  throw badRequest("At least one thread key is required");
1107
+ const savedViewItemKeys = new Set();
1108
+ for (const threadKey of uniqueThreadKeys) {
1109
+ if (savedViewIdFromItemKey(threadKey))
1110
+ savedViewItemKeys.add(threadKey);
1111
+ else
1112
+ await ensureMessengerThreadCanBeGrouped(orgId, userId, threadKey);
1113
+ }
967
1114
  await db.transaction(async (tx) => {
1115
+ const txDb = tx;
1116
+ await lockMessengerSavedViewPlacement(txDb, orgId, userId);
968
1117
  const group = await createCustomGroupWithClient(tx, orgId, userId, name, icon);
1118
+ await lockMessengerCustomGroupPlacement(txDb, orgId, userId, group.id);
969
1119
  for (const threadKey of uniqueThreadKeys) {
970
- await assignThreadToCustomGroupWithClient(tx, orgId, userId, group.id, threadKey);
1120
+ if (savedViewItemKeys.has(threadKey) && !await findMessengerSavedViewWithDb(txDb, orgId, userId, threadKey)) {
1121
+ throw notFound("Messenger Saved View not found");
1122
+ }
1123
+ await assignThreadToCustomGroupWithClient(txDb, orgId, userId, group.id, threadKey);
1124
+ await logSavedViewPlacement(txDb, orgId, userId, threadKey, "messenger.saved_view_group_assigned", {
1125
+ groupId: group.id,
1126
+ source: "group_create",
1127
+ });
971
1128
  }
972
1129
  });
973
1130
  return listCustomGroups(orgId, userId);
974
1131
  }
975
1132
  async function removeThreadFromCustomGroups(orgId, userId, threadKey) {
976
- await db
977
- .delete(messengerCustomGroupEntries)
978
- .where(and(eq(messengerCustomGroupEntries.orgId, orgId), eq(messengerCustomGroupEntries.userId, userId), eq(messengerCustomGroupEntries.threadKey, threadKey)));
979
- return { threadKey };
1133
+ const savedViewId = savedViewIdFromItemKey(threadKey);
1134
+ await db.transaction(async (tx) => {
1135
+ const txDb = tx;
1136
+ await lockMessengerSavedViewPlacement(txDb, orgId, userId);
1137
+ if (savedViewId) {
1138
+ if (!await findMessengerSavedViewWithDb(txDb, orgId, userId, threadKey)) {
1139
+ throw notFound("Messenger Saved View not found");
1140
+ }
1141
+ }
1142
+ const [membership] = await txDb
1143
+ .select({ id: messengerCustomGroupEntries.id, groupId: messengerCustomGroupEntries.groupId })
1144
+ .from(messengerCustomGroupEntries)
1145
+ .where(and(eq(messengerCustomGroupEntries.orgId, orgId), eq(messengerCustomGroupEntries.userId, userId), eq(messengerCustomGroupEntries.threadKey, threadKey)))
1146
+ .limit(1);
1147
+ if (!membership)
1148
+ return;
1149
+ await lockMessengerCustomGroupPlacement(txDb, orgId, userId, membership.groupId);
1150
+ const deleted = await txDb
1151
+ .delete(messengerCustomGroupEntries)
1152
+ .where(and(eq(messengerCustomGroupEntries.id, membership.id), eq(messengerCustomGroupEntries.orgId, orgId), eq(messengerCustomGroupEntries.userId, userId), eq(messengerCustomGroupEntries.groupId, membership.groupId), eq(messengerCustomGroupEntries.threadKey, threadKey)))
1153
+ .returning({ id: messengerCustomGroupEntries.id });
1154
+ if (savedViewId && deleted.length > 0) {
1155
+ await logSavedViewPlacement(txDb, orgId, userId, threadKey, "messenger.saved_view_group_removed", {
1156
+ groupId: membership.groupId,
1157
+ source: "item_remove",
1158
+ });
1159
+ }
1160
+ });
1161
+ return savedViewId ? { itemKey: threadKey } : { itemKey: threadKey, threadKey };
980
1162
  }
981
1163
  async function reorderCustomGroupEntries(orgId, userId, groupId, threadKeys) {
982
- await getCustomGroupOrThrow(orgId, userId, groupId);
983
- const entries = await db
984
- .select()
985
- .from(messengerCustomGroupEntries)
986
- .where(and(eq(messengerCustomGroupEntries.orgId, orgId), eq(messengerCustomGroupEntries.userId, userId), eq(messengerCustomGroupEntries.groupId, groupId)))
987
- .orderBy(asc(messengerCustomGroupEntries.sortOrder), asc(messengerCustomGroupEntries.createdAt));
988
- const entryByThreadKey = new Map(entries.map((entry) => [entry.threadKey, entry]));
989
- const orderedKeys = [
990
- ...threadKeys.filter((threadKey) => entryByThreadKey.has(threadKey)),
991
- ...entries.map((entry) => entry.threadKey).filter((threadKey) => !threadKeys.includes(threadKey)),
992
- ];
993
- const now = new Date();
1164
+ if (new Set(threadKeys).size !== threadKeys.length) {
1165
+ throw badRequest("Messenger custom group reorder keys must be unique");
1166
+ }
1167
+ for (const itemKey of threadKeys)
1168
+ savedViewIdFromItemKey(itemKey);
994
1169
  await db.transaction(async (tx) => {
995
- for (const [index, threadKey] of orderedKeys.entries()) {
996
- await tx
1170
+ const txDb = tx;
1171
+ await lockMessengerSavedViewPlacement(txDb, orgId, userId);
1172
+ await lockMessengerCustomGroupPlacement(txDb, orgId, userId, groupId);
1173
+ await getCustomGroupOrThrowWithDb(txDb, orgId, userId, groupId);
1174
+ const entries = await txDb
1175
+ .select()
1176
+ .from(messengerCustomGroupEntries)
1177
+ .where(and(eq(messengerCustomGroupEntries.orgId, orgId), eq(messengerCustomGroupEntries.userId, userId), eq(messengerCustomGroupEntries.groupId, groupId)))
1178
+ .orderBy(asc(messengerCustomGroupEntries.sortOrder), asc(messengerCustomGroupEntries.createdAt));
1179
+ const savedIds = entries
1180
+ .map((entry) => savedViewIdFromItemKey(entry.threadKey))
1181
+ .filter((id) => Boolean(id));
1182
+ const savedViews = savedIds.length > 0
1183
+ ? await txDb
1184
+ .select({ id: messengerSavedViews.id, hiddenAt: messengerSavedViews.hiddenAt })
1185
+ .from(messengerSavedViews)
1186
+ .where(and(eq(messengerSavedViews.orgId, orgId), eq(messengerSavedViews.userId, userId), inArray(messengerSavedViews.id, savedIds)))
1187
+ : [];
1188
+ const hiddenSavedIds = new Set(savedViews.filter((view) => view.hiddenAt).map((view) => view.id));
1189
+ const visibleEntries = entries.filter((entry) => {
1190
+ const savedViewId = savedViewIdFromItemKey(entry.threadKey);
1191
+ return !savedViewId || !hiddenSavedIds.has(savedViewId);
1192
+ });
1193
+ const visibleByKey = new Map(visibleEntries.map((entry) => [entry.threadKey, entry]));
1194
+ const requested = new Set(threadKeys);
1195
+ const orderedKeys = [
1196
+ ...threadKeys.filter((itemKey) => visibleByKey.has(itemKey)),
1197
+ ...visibleEntries.map((entry) => entry.threadKey).filter((itemKey) => !requested.has(itemKey)),
1198
+ ];
1199
+ const visibleSlots = visibleEntries.map((entry) => entry.sortOrder);
1200
+ const now = new Date();
1201
+ const changedSavedItemKeys = [];
1202
+ for (const [index, itemKey] of orderedKeys.entries()) {
1203
+ const entry = visibleByKey.get(itemKey);
1204
+ const nextSortOrder = visibleSlots[index];
1205
+ if (!entry || nextSortOrder === undefined || entry.sortOrder === nextSortOrder)
1206
+ continue;
1207
+ await txDb
997
1208
  .update(messengerCustomGroupEntries)
998
- .set({ sortOrder: index, updatedAt: now })
999
- .where(and(eq(messengerCustomGroupEntries.orgId, orgId), eq(messengerCustomGroupEntries.userId, userId), eq(messengerCustomGroupEntries.groupId, groupId), eq(messengerCustomGroupEntries.threadKey, threadKey)));
1209
+ .set({ sortOrder: nextSortOrder, updatedAt: now })
1210
+ .where(and(eq(messengerCustomGroupEntries.orgId, orgId), eq(messengerCustomGroupEntries.userId, userId), eq(messengerCustomGroupEntries.groupId, groupId), eq(messengerCustomGroupEntries.threadKey, itemKey)));
1211
+ if (savedViewIdFromItemKey(itemKey))
1212
+ changedSavedItemKeys.push(itemKey);
1213
+ }
1214
+ for (const itemKey of changedSavedItemKeys) {
1215
+ await logSavedViewPlacement(txDb, orgId, userId, itemKey, "messenger.saved_view_group_reordered", {
1216
+ groupId,
1217
+ itemKeys: orderedKeys,
1218
+ });
1000
1219
  }
1001
1220
  });
1002
1221
  return listCustomGroups(orgId, userId);
@@ -1652,12 +1871,12 @@ export function messengerService(db) {
1652
1871
  id: heartbeatRuns.id,
1653
1872
  orgId: heartbeatRuns.orgId,
1654
1873
  agentId: heartbeatRuns.agentId,
1874
+ invocationSource: heartbeatRuns.invocationSource,
1875
+ triggerDetail: heartbeatRuns.triggerDetail,
1655
1876
  status: heartbeatRuns.status,
1656
- error: heartbeatRuns.error,
1657
- errorCode: heartbeatRuns.errorCode,
1877
+ wakeupRequestId: heartbeatRuns.wakeupRequestId,
1878
+ chatConversationId: heartbeatRuns.chatConversationId,
1658
1879
  resultJson: heartbeatRuns.resultJson,
1659
- stderrExcerpt: heartbeatRuns.stderrExcerpt,
1660
- stdoutExcerpt: heartbeatRuns.stdoutExcerpt,
1661
1880
  contextSnapshot: heartbeatRuns.contextSnapshot,
1662
1881
  createdAt: heartbeatRuns.createdAt,
1663
1882
  updatedAt: heartbeatRuns.updatedAt,
@@ -1675,7 +1894,8 @@ export function messengerService(db) {
1675
1894
  ]);
1676
1895
  const lastReadAt = await lastReadAtPromise;
1677
1896
  const agentNames = new Map(agentRows.map((row) => [row.id, row.name]));
1678
- const items = runRows.map((run) => failedRunCard(run, agentNames.get(run.agentId) ?? null));
1897
+ const origins = await hydrateMessengerFailedRunOrigins(db, orgId, runRows);
1898
+ const items = runRows.map((run) => failedRunCard(run, agentNames.get(run.agentId) ?? null, origins.get(run.id)));
1679
1899
  const latestFirstItems = [...items].sort(compareLatestActivity);
1680
1900
  const chronologicalItems = [...items].sort(compareChronologicalActivity);
1681
1901
  const latestActivityAt = latestFirstItems[0]?.latestActivityAt ?? null;