@rudderhq/server 0.7.1 → 0.7.2

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 (265) hide show
  1. package/dist/agent-runtimes/codex-models.d.ts +11 -0
  2. package/dist/agent-runtimes/codex-models.d.ts.map +1 -1
  3. package/dist/agent-runtimes/codex-models.js +155 -2
  4. package/dist/agent-runtimes/codex-models.js.map +1 -1
  5. package/dist/agent-runtimes/cursor-models.d.ts.map +1 -1
  6. package/dist/agent-runtimes/cursor-models.js +31 -9
  7. package/dist/agent-runtimes/cursor-models.js.map +1 -1
  8. package/dist/agent-runtimes/index.d.ts +1 -1
  9. package/dist/agent-runtimes/index.d.ts.map +1 -1
  10. package/dist/agent-runtimes/index.js +1 -1
  11. package/dist/agent-runtimes/index.js.map +1 -1
  12. package/dist/agent-runtimes/registry.d.ts +11 -4
  13. package/dist/agent-runtimes/registry.d.ts.map +1 -1
  14. package/dist/agent-runtimes/registry.js +54 -3
  15. package/dist/agent-runtimes/registry.js.map +1 -1
  16. package/dist/bundled-plugins/plugin-linear/dist/worker.js +287 -18
  17. package/dist/bundled-plugins/plugin-linear/dist/worker.js.map +3 -3
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +86 -30
  20. package/dist/index.js.map +1 -1
  21. package/dist/redaction.d.ts +1 -0
  22. package/dist/redaction.d.ts.map +1 -1
  23. package/dist/redaction.js +13 -0
  24. package/dist/redaction.js.map +1 -1
  25. package/dist/routes/access.helpers.d.ts +1 -1
  26. package/dist/routes/agents.d.ts.map +1 -1
  27. package/dist/routes/agents.js +20 -6
  28. package/dist/routes/agents.js.map +1 -1
  29. package/dist/routes/agents.management-routes.d.ts.map +1 -1
  30. package/dist/routes/agents.management-routes.js +13 -10
  31. package/dist/routes/agents.management-routes.js.map +1 -1
  32. package/dist/routes/approvals.d.ts.map +1 -1
  33. package/dist/routes/approvals.js +77 -1
  34. package/dist/routes/approvals.js.map +1 -1
  35. package/dist/routes/chats.d.ts.map +1 -1
  36. package/dist/routes/chats.js +1 -0
  37. package/dist/routes/chats.js.map +1 -1
  38. package/dist/routes/chats.stream-routes.d.ts.map +1 -1
  39. package/dist/routes/chats.stream-routes.js +4 -0
  40. package/dist/routes/chats.stream-routes.js.map +1 -1
  41. package/dist/routes/goals.d.ts.map +1 -1
  42. package/dist/routes/goals.js +349 -23
  43. package/dist/routes/goals.js.map +1 -1
  44. package/dist/routes/health.d.ts.map +1 -1
  45. package/dist/routes/health.js +1 -0
  46. package/dist/routes/health.js.map +1 -1
  47. package/dist/routes/managed-mcp-connections.d.ts.map +1 -1
  48. package/dist/routes/managed-mcp-connections.js +46 -7
  49. package/dist/routes/managed-mcp-connections.js.map +1 -1
  50. package/dist/routes/product-analytics-collector-report.d.ts +29 -0
  51. package/dist/routes/product-analytics-collector-report.d.ts.map +1 -1
  52. package/dist/routes/product-analytics-collector-report.js +57 -1
  53. package/dist/routes/product-analytics-collector-report.js.map +1 -1
  54. package/dist/routes/product-analytics-collector-report.test.d.ts +2 -0
  55. package/dist/routes/product-analytics-collector-report.test.d.ts.map +1 -0
  56. package/dist/routes/product-analytics-collector-report.test.js +50 -0
  57. package/dist/routes/product-analytics-collector-report.test.js.map +1 -0
  58. package/dist/services/automation-chat-output.d.ts +1 -1
  59. package/dist/services/automation-chat-output.d.ts.map +1 -1
  60. package/dist/services/automation-chat-output.js +24 -14
  61. package/dist/services/automation-chat-output.js.map +1 -1
  62. package/dist/services/chat-annotation-copy-lineage.d.ts +1 -1
  63. package/dist/services/chat-assistant.d.ts.map +1 -1
  64. package/dist/services/chat-assistant.helpers.d.ts +3 -3
  65. package/dist/services/chat-assistant.helpers.d.ts.map +1 -1
  66. package/dist/services/chat-assistant.helpers.js.map +1 -1
  67. package/dist/services/chat-assistant.js +34 -11
  68. package/dist/services/chat-assistant.js.map +1 -1
  69. package/dist/services/chat-assistant.runtime-overrides.d.ts +2 -1
  70. package/dist/services/chat-assistant.runtime-overrides.d.ts.map +1 -1
  71. package/dist/services/chat-assistant.runtime-overrides.js +47 -18
  72. package/dist/services/chat-assistant.runtime-overrides.js.map +1 -1
  73. package/dist/services/chat-assistant.runtime-overrides.test.d.ts +2 -0
  74. package/dist/services/chat-assistant.runtime-overrides.test.d.ts.map +1 -0
  75. package/dist/services/chat-assistant.runtime-overrides.test.js +37 -0
  76. package/dist/services/chat-assistant.runtime-overrides.test.js.map +1 -0
  77. package/dist/services/chat-generation-protocol.d.ts.map +1 -1
  78. package/dist/services/chat-generation-protocol.js +1 -12
  79. package/dist/services/chat-generation-protocol.js.map +1 -1
  80. package/dist/services/chat-generation-protocol.test.js +14 -23
  81. package/dist/services/chat-generation-protocol.test.js.map +1 -1
  82. package/dist/services/chat-generation-provenance.d.ts.map +1 -1
  83. package/dist/services/chat-generation-provenance.js +4 -2
  84. package/dist/services/chat-generation-provenance.js.map +1 -1
  85. package/dist/services/chat-queued-message-materialization.d.ts.map +1 -1
  86. package/dist/services/chat-queued-message-materialization.js +12 -2
  87. package/dist/services/chat-queued-message-materialization.js.map +1 -1
  88. package/dist/services/chat-transcript-persistence.d.ts +49 -0
  89. package/dist/services/chat-transcript-persistence.d.ts.map +1 -0
  90. package/dist/services/chat-transcript-persistence.js +238 -0
  91. package/dist/services/chat-transcript-persistence.js.map +1 -0
  92. package/dist/services/chat-transcript-persistence.test.d.ts +2 -0
  93. package/dist/services/chat-transcript-persistence.test.d.ts.map +1 -0
  94. package/dist/services/chat-transcript-persistence.test.js +23 -0
  95. package/dist/services/chat-transcript-persistence.test.js.map +1 -0
  96. package/dist/services/chat-work-manifest.d.ts.map +1 -1
  97. package/dist/services/chat-work-manifest.js +36 -10
  98. package/dist/services/chat-work-manifest.js.map +1 -1
  99. package/dist/services/chats.annotation-persistence.d.ts.map +1 -1
  100. package/dist/services/chats.annotation-persistence.js +25 -6
  101. package/dist/services/chats.annotation-persistence.js.map +1 -1
  102. package/dist/services/chats.create.d.ts.map +1 -1
  103. package/dist/services/chats.create.js +49 -4
  104. package/dist/services/chats.create.js.map +1 -1
  105. package/dist/services/chats.d.ts +8 -8
  106. package/dist/services/chats.d.ts.map +1 -1
  107. package/dist/services/chats.inline-visual-persistence.d.ts +2 -1
  108. package/dist/services/chats.inline-visual-persistence.d.ts.map +1 -1
  109. package/dist/services/chats.inline-visual-persistence.js +19 -2
  110. package/dist/services/chats.inline-visual-persistence.js.map +1 -1
  111. package/dist/services/chats.js +177 -95
  112. package/dist/services/chats.js.map +1 -1
  113. package/dist/services/finance.d.ts +1 -1
  114. package/dist/services/goals.d.ts +2041 -126
  115. package/dist/services/goals.d.ts.map +1 -1
  116. package/dist/services/goals.js +1533 -176
  117. package/dist/services/goals.js.map +1 -1
  118. package/dist/services/instance-settings.d.ts.map +1 -1
  119. package/dist/services/instance-settings.js +2 -0
  120. package/dist/services/instance-settings.js.map +1 -1
  121. package/dist/services/issues.d.ts.map +1 -1
  122. package/dist/services/issues.js +35 -16
  123. package/dist/services/issues.js.map +1 -1
  124. package/dist/services/mcp/managed-bindings.d.ts.map +1 -1
  125. package/dist/services/mcp/managed-bindings.js +11 -4
  126. package/dist/services/mcp/managed-bindings.js.map +1 -1
  127. package/dist/services/mcp/managed-connections.d.ts +19 -1
  128. package/dist/services/mcp/managed-connections.d.ts.map +1 -1
  129. package/dist/services/mcp/managed-connections.js +211 -37
  130. package/dist/services/mcp/managed-connections.js.map +1 -1
  131. package/dist/services/mcp/managed-runtime.js +1 -1
  132. package/dist/services/mcp/managed-runtime.js.map +1 -1
  133. package/dist/services/mcp/oauth.d.ts.map +1 -1
  134. package/dist/services/mcp/oauth.js +3 -0
  135. package/dist/services/mcp/oauth.js.map +1 -1
  136. package/dist/services/mcp/provider-registry.d.ts +24 -1
  137. package/dist/services/mcp/provider-registry.d.ts.map +1 -1
  138. package/dist/services/mcp/provider-registry.js +26 -0
  139. package/dist/services/mcp/provider-registry.js.map +1 -1
  140. package/dist/services/mcp/provider-registry.test.js +26 -0
  141. package/dist/services/mcp/provider-registry.test.js.map +1 -1
  142. package/dist/services/messenger-saved-views.d.ts.map +1 -1
  143. package/dist/services/messenger-saved-views.js +1 -0
  144. package/dist/services/messenger-saved-views.js.map +1 -1
  145. package/dist/services/messenger.d.ts.map +1 -1
  146. package/dist/services/messenger.js +16 -2
  147. package/dist/services/messenger.js.map +1 -1
  148. package/dist/services/plugin-host-services.d.ts.map +1 -1
  149. package/dist/services/plugin-host-services.js +5 -7
  150. package/dist/services/plugin-host-services.js.map +1 -1
  151. package/dist/services/product-analytics.d.ts +20 -4
  152. package/dist/services/product-analytics.d.ts.map +1 -1
  153. package/dist/services/product-analytics.js +47 -0
  154. package/dist/services/product-analytics.js.map +1 -1
  155. package/dist/services/product-analytics.test.js +63 -1
  156. package/dist/services/product-analytics.test.js.map +1 -1
  157. package/dist/services/run-events.d.ts +1 -1
  158. package/dist/services/runtime-kernel/heartbeat.d.ts +4 -0
  159. package/dist/services/runtime-kernel/heartbeat.d.ts.map +1 -1
  160. package/dist/services/runtime-kernel/heartbeat.execute.d.ts.map +1 -1
  161. package/dist/services/runtime-kernel/heartbeat.execute.js +51 -3
  162. package/dist/services/runtime-kernel/heartbeat.execute.js.map +1 -1
  163. package/dist/services/runtime-kernel/heartbeat.js +187 -9
  164. package/dist/services/runtime-kernel/heartbeat.js.map +1 -1
  165. package/dist/services/runtime-kernel/heartbeat.terminal.d.ts +3 -1
  166. package/dist/services/runtime-kernel/heartbeat.terminal.d.ts.map +1 -1
  167. package/dist/services/runtime-kernel/heartbeat.terminal.js +2 -1
  168. package/dist/services/runtime-kernel/heartbeat.terminal.js.map +1 -1
  169. package/dist/services/side-chats.d.ts.map +1 -1
  170. package/dist/services/side-chats.js +12 -0
  171. package/dist/services/side-chats.js.map +1 -1
  172. package/dist/services/workspace-runtime.services.d.ts +1 -1
  173. package/package.json +16 -14
  174. package/resources/bundled-skills/browser/SKILL.md +11 -4
  175. package/resources/bundled-skills/browser/agents/openai.yaml +2 -2
  176. package/resources/bundled-skills/browser/evals/trigger-evals.json +22 -0
  177. package/skills/browser/SKILL.md +11 -4
  178. package/skills/browser/agents/openai.yaml +2 -2
  179. package/skills/browser/evals/trigger-evals.json +22 -0
  180. package/ui-dist/assets/{LibraryLiveSurface-CZED7oKj.js → LibraryLiveSurface-cHCJmmsl.js} +1 -1
  181. package/ui-dist/assets/{abnfDiagram-VRR7QNED-BoPyIoAq.js → abnfDiagram-VRR7QNED-BORJvkew.js} +1 -1
  182. package/ui-dist/assets/{arc-DTYs4RCH.js → arc-DPUzhx87.js} +1 -1
  183. package/ui-dist/assets/{architectureDiagram-ZJ3FMSHR-BGfp2S_3.js → architectureDiagram-ZJ3FMSHR-Bz_hY8LM.js} +1 -1
  184. package/ui-dist/assets/{blockDiagram-677ZJIJ3-aW0EGIUf.js → blockDiagram-677ZJIJ3-Bq1X3YkP.js} +1 -1
  185. package/ui-dist/assets/{c4Diagram-LMCZKHZV--1itKgA2.js → c4Diagram-LMCZKHZV-BawEM9Pc.js} +1 -1
  186. package/ui-dist/assets/channel-C08AyYJr.js +1 -0
  187. package/ui-dist/assets/{chunk-2Q5K7J3B-ZIqIozPQ.js → chunk-2Q5K7J3B-D0D5ZOaA.js} +1 -1
  188. package/ui-dist/assets/{chunk-32BRIVSS-DiwBEZVQ.js → chunk-32BRIVSS-T90P7lug.js} +1 -1
  189. package/ui-dist/assets/{chunk-5VM5RSS4-CLOrTmL8.js → chunk-5VM5RSS4-jcAERTgh.js} +1 -1
  190. package/ui-dist/assets/{chunk-EX3LRPZG-D6xZzF47.js → chunk-EX3LRPZG-t9-JXwnR.js} +1 -1
  191. package/ui-dist/assets/{chunk-JWPE2WC7-B9tYvTZl.js → chunk-JWPE2WC7-hqgD1saC.js} +1 -1
  192. package/ui-dist/assets/{chunk-MOJQB5TN-D_qo-SzM.js → chunk-MOJQB5TN-BsSUoYzd.js} +1 -1
  193. package/ui-dist/assets/{chunk-RYQCIY6F-ChPHGc2P.js → chunk-RYQCIY6F-YcdDh2Zn.js} +1 -1
  194. package/ui-dist/assets/{chunk-V7JOEXUC-Dk6GbZYp.js → chunk-V7JOEXUC-ChFyH9Su.js} +1 -1
  195. package/ui-dist/assets/{chunk-VR4S4FIN-B6AREC1T.js → chunk-VR4S4FIN-BjVK8IyX.js} +1 -1
  196. package/ui-dist/assets/{chunk-XXDRQBXY-CUyO-JUr.js → chunk-XXDRQBXY-D-TvO9vT.js} +1 -1
  197. package/ui-dist/assets/classDiagram-OUVF2IWQ-BIXq6fec.js +1 -0
  198. package/ui-dist/assets/classDiagram-v2-EOCWNBFH-BIXq6fec.js +1 -0
  199. package/ui-dist/assets/{cose-bilkent-JH36ORCC-BCxIInLZ.js → cose-bilkent-JH36ORCC-DBwhASJG.js} +1 -1
  200. package/ui-dist/assets/{cynefin-VYW2F7L2-DqsnpnHA.js → cynefin-VYW2F7L2-SlCRmwl2.js} +1 -1
  201. package/ui-dist/assets/{cynefinDiagram-TSTJHNR4-BD7QQNLW.js → cynefinDiagram-TSTJHNR4-DImV6N_p.js} +1 -1
  202. package/ui-dist/assets/{dagre-VKFMJZFB-DaE160f7.js → dagre-VKFMJZFB-FH4Wv8Zn.js} +1 -1
  203. package/ui-dist/assets/{diagram-FQU43EPY-DZ0c59y8.js → diagram-FQU43EPY-CrZvQjId.js} +1 -1
  204. package/ui-dist/assets/{diagram-G47NLZAW-C_413g5E.js → diagram-G47NLZAW-B7IGl_T3.js} +1 -1
  205. package/ui-dist/assets/{diagram-NH7WQ7WH-D_o9pXB-.js → diagram-NH7WQ7WH-CB4i7H1a.js} +1 -1
  206. package/ui-dist/assets/{diagram-OA4YK3LP-BI2xMqiW.js → diagram-OA4YK3LP-DNyWPYY9.js} +1 -1
  207. package/ui-dist/assets/{diagram-WEI45ONY-hhM8R_14.js → diagram-WEI45ONY-BAhxbhpi.js} +1 -1
  208. package/ui-dist/assets/{ebnfDiagram-CCIWWBDH-DfFgEtmG.js → ebnfDiagram-CCIWWBDH-ClXtQ9qt.js} +1 -1
  209. package/ui-dist/assets/{erDiagram-Q63AITRT-CCw4ysHK.js → erDiagram-Q63AITRT-DGXiMYfn.js} +1 -1
  210. package/ui-dist/assets/{flowDiagram-23GEKE2U-CzC1SMmo.js → flowDiagram-23GEKE2U-CdZ-02zc.js} +1 -1
  211. package/ui-dist/assets/{ganttDiagram-NO4QXBWP-CbPJIrIw.js → ganttDiagram-NO4QXBWP-TxhzNpta.js} +1 -1
  212. package/ui-dist/assets/{gitGraphDiagram-IHSO6WYX-jCxJ66_C.js → gitGraphDiagram-IHSO6WYX-D6Q_w6wR.js} +1 -1
  213. package/ui-dist/assets/{graph-BfNZ9Jzj.js → graph-CxNmbpl9.js} +1 -1
  214. package/ui-dist/assets/{index-D00XdcOq.js → index-AkhgKOxC.js} +1 -1
  215. package/ui-dist/assets/{index-DiMDROQY.js → index-BA9tMBhO.js} +1 -1
  216. package/ui-dist/assets/{index-DmjAbzHq.js → index-BQ87dGIq.js} +1 -1
  217. package/ui-dist/assets/index-BmXb0yC1.css +1 -0
  218. package/ui-dist/assets/{index-B8q4cbOz.js → index-BoTz5S-X.js} +1 -1
  219. package/ui-dist/assets/{index-D_K-9VDs.js → index-BujwWE3j.js} +1 -1
  220. package/ui-dist/assets/{index-Chop-Dpa.js → index-Bxz75ICF.js} +1 -1
  221. package/ui-dist/assets/{index-BKn4zRjf.js → index-C12QC1Ex.js} +1 -1
  222. package/ui-dist/assets/{index-BjxRqzZK.js → index-CW21qWFm.js} +1 -1
  223. package/ui-dist/assets/{index-ByUFNj0O.js → index-CXnqg1Oq.js} +1 -1
  224. package/ui-dist/assets/{index-B3h9Vdxx.js → index-C_nwI4Yj.js} +1 -1
  225. package/ui-dist/assets/{index-Ck-ZNQeD.js → index-Cx6oIZPm.js} +572 -561
  226. package/ui-dist/assets/{index-BE1vSI6a.js → index-DU2LI7f9.js} +1 -1
  227. package/ui-dist/assets/{index-SkHIC7Ma.js → index-Do78GymY.js} +1 -1
  228. package/ui-dist/assets/{index-Bwo-C8W5.js → index-Rau2cGm0.js} +1 -1
  229. package/ui-dist/assets/{index-BULll2e0.js → index-kbWUQ1um.js} +1 -1
  230. package/ui-dist/assets/{infoDiagram-FWYZ7A6U-BkDimGw3.js → infoDiagram-FWYZ7A6U-CnJd4-Jq.js} +1 -1
  231. package/ui-dist/assets/{ishikawaDiagram-FXEZZL3T-BAyUfn6x.js → ishikawaDiagram-FXEZZL3T-Bq-qc3pD.js} +1 -1
  232. package/ui-dist/assets/{journeyDiagram-5HDEW3XC-DlbpTZHG.js → journeyDiagram-5HDEW3XC-NSmpUGUA.js} +1 -1
  233. package/ui-dist/assets/{kanban-definition-HUTT4EX6-Cd67S14K.js → kanban-definition-HUTT4EX6-D7pgWtfA.js} +1 -1
  234. package/ui-dist/assets/{layout-Dc4YEiCC.js → layout-BRuo6LWe.js} +1 -1
  235. package/ui-dist/assets/{linear-BhRsbD_5.js → linear-CkaWI9Nd.js} +1 -1
  236. package/ui-dist/assets/{map-CEWybj6z.js → map-CgA6tTpZ.js} +1 -1
  237. package/ui-dist/assets/{mermaid.core-CqqAFYNg.js → mermaid.core-DrXOt-P6.js} +4 -4
  238. package/ui-dist/assets/{mindmap-definition-LN4V7U3C-CCb-XmEi.js → mindmap-definition-LN4V7U3C-D9ImeWBe.js} +1 -1
  239. package/ui-dist/assets/{pegDiagram-2B236MQR-CqUV14VZ.js → pegDiagram-2B236MQR-Cq-zZ_zz.js} +1 -1
  240. package/ui-dist/assets/{pieDiagram-ENE6RG2P-Dn_M_GRM.js → pieDiagram-ENE6RG2P-FgNgy726.js} +1 -1
  241. package/ui-dist/assets/{quadrantDiagram-ABIIQ3AL-rAEhJDr2.js → quadrantDiagram-ABIIQ3AL-BxQbmGmi.js} +1 -1
  242. package/ui-dist/assets/{railroadDiagram-RFXS5EU6-iE2o_jkH.js → railroadDiagram-RFXS5EU6-CrpbkPH2.js} +1 -1
  243. package/ui-dist/assets/{requirementDiagram-TGXJPOKE-BFyKBR1h.js → requirementDiagram-TGXJPOKE-DQ-65ZW6.js} +1 -1
  244. package/ui-dist/assets/{sankeyDiagram-HTMAVEWB-DRa_2YB6.js → sankeyDiagram-HTMAVEWB-Bom0lMZm.js} +1 -1
  245. package/ui-dist/assets/{sequenceDiagram-DBY2YBRQ-BG8VIjD7.js → sequenceDiagram-DBY2YBRQ-C1MSDLDj.js} +1 -1
  246. package/ui-dist/assets/{sizeCapture-X5ZJPWSS-CS1xlbzG.js → sizeCapture-X5ZJPWSS-Bn1vxebD.js} +1 -1
  247. package/ui-dist/assets/{stateDiagram-2N3HPSRC-BSl2RUJ1.js → stateDiagram-2N3HPSRC-GRRQpmzI.js} +1 -1
  248. package/ui-dist/assets/stateDiagram-v2-6OUMAXLB-KvSJhiLM.js +1 -0
  249. package/ui-dist/assets/{swimlanes-5IMT3BWC-BT8Hrm9J.js → swimlanes-5IMT3BWC-BcOOCZ4q.js} +2 -2
  250. package/ui-dist/assets/swimlanesDiagram-G3AALYLV-Cr92NnJ4.js +8 -0
  251. package/ui-dist/assets/{timeline-definition-FHXFAJF6-CfYIqEuQ.js → timeline-definition-FHXFAJF6-gi6amswh.js} +1 -1
  252. package/ui-dist/assets/{vennDiagram-L72KCM5P-C8zBH7o9.js → vennDiagram-L72KCM5P-B9uqeyQt.js} +1 -1
  253. package/ui-dist/assets/{wardleyDiagram-EHGQE667-D5HyFfI9.js → wardleyDiagram-EHGQE667-BnqWAMiE.js} +1 -1
  254. package/ui-dist/assets/{xychartDiagram-FW5EYKEG-CGItJmLx.js → xychartDiagram-FW5EYKEG-BJXKltIN.js} +1 -1
  255. package/ui-dist/index.html +2 -2
  256. package/dist/services/issue-goal-fallback.d.ts +0 -15
  257. package/dist/services/issue-goal-fallback.d.ts.map +0 -1
  258. package/dist/services/issue-goal-fallback.js +0 -27
  259. package/dist/services/issue-goal-fallback.js.map +0 -1
  260. package/ui-dist/assets/channel-DLNwhPnC.js +0 -1
  261. package/ui-dist/assets/classDiagram-OUVF2IWQ-JsIc-rlc.js +0 -1
  262. package/ui-dist/assets/classDiagram-v2-EOCWNBFH-JsIc-rlc.js +0 -1
  263. package/ui-dist/assets/index-CxPYXL3t.css +0 -1
  264. package/ui-dist/assets/stateDiagram-v2-6OUMAXLB-DUVNSzI8.js +0 -1
  265. package/ui-dist/assets/swimlanesDiagram-G3AALYLV-DfLFj7sh.js +0 -8
@@ -12,12 +12,13 @@ import { chatGenerationProtocolService } from "./chat-generation-protocol.js";
12
12
  import { validateCanonicalChatInlineAnnotations } from "./chat-inline-annotation-validation.js";
13
13
  import { selectedChatMessageBranchCondition } from "./chat-message-branch.js";
14
14
  import { hydrateQueuedMessage, materializeQueuedUserMessage, normalizeQueuedMessagePayload, QUEUED_ANNOTATION_ASSETS_KEY, queuedAnnotationAssetState, queuedMessageMutationFingerprint, withQueuedAnnotationAssetState, } from "./chat-queued-message-materialization.js";
15
+ import { compareChatGenerationSelection, listChatGenerationTranscripts, listDetachedChatTranscripts, listDetachedChatTranscriptSummaries, loadChatTranscripts, replaceDetachedChatTranscript, selectChatTranscript, transcriptSummaryFromSources, } from "./chat-transcript-persistence.js";
15
16
  import { createChatAnnotationMessagePersistence } from "./chats.annotation-persistence.js";
16
17
  import { listActiveChatGenerationIds, listPendingChatProposalConversationIds, } from "./chats.attention-order.js";
17
18
  import { ACTIVE_CHAT_GENERATION_STATUSES, CHAT_GENERATION_CONTROL_LEASE_MS, NATIVE_STEER_GENERATION_STATUSES, SERVER_QUEUE_RUNNING_STATUSES, } from "./chats.constants.js";
18
19
  import { createChatConversation, createChatWithInitialMessage } from "./chats.create.js";
19
20
  import { conversationMutability, nextForkTitle } from "./chats.fork-helpers.js";
20
- import { buildSearchSnippet, CHAT_TRANSCRIPT_KEY, chatTranscriptFromPayload, chatTranscriptSummaryFromEntries, contentPath, escapeLikePattern, incomingMessagePreviewSql, issueProposalFromPayload, isVisibleIncomingChatMessage, listContextLinksForConversationIds, listPrimaryIssues, operationProposalDecisionStatusFromPayload, operationProposalFromPayload, resolveContextEntities, safeTrim, stripChatMetadataFromPayload, textContains, truncatePreview, visibleIncomingMessageSql, withOperationProposalDecisionState, withPersistedTranscript, } from "./chats.helpers.js";
21
+ import { buildSearchSnippet, CHAT_TRANSCRIPT_KEY, chatTranscriptFromPayload, contentPath, escapeLikePattern, incomingMessagePreviewSql, issueProposalFromPayload, isVisibleIncomingChatMessage, listContextLinksForConversationIds, listPrimaryIssues, operationProposalDecisionStatusFromPayload, operationProposalFromPayload, resolveContextEntities, safeTrim, stripChatMetadataFromPayload, textContains, truncatePreview, visibleIncomingMessageSql, withOperationProposalDecisionState, } from "./chats.helpers.js";
21
22
  import { copyForkChatMessages, listRecentUserChatMessages, updateTrustedInlineVisualMappings, } from "./chats.inline-visual-persistence.js";
22
23
  import { createQueuedMessageWithStagedAttachments as createQueuedMessageWithStagedAttachmentsInDb } from "./chats.queued-message-create.js";
23
24
  import { findQueuedMessageReplay, updateChatAgentRuntimeInvariant, } from "./chats.runtime-controls.js";
@@ -27,7 +28,7 @@ import { normalizeLocalLibraryPathMarkdown } from "./library-path-markdown.js";
27
28
  import { removeMessengerCustomGroupEntriesForItem } from "./messenger-saved-views.js";
28
29
  import { organizationService } from "./orgs.js";
29
30
  import { sanitizePostgresJsonValue } from "./postgres-json.js";
30
- import { completeProductAnalyticsWorkCycle } from "./product-analytics.js";
31
+ import { completeProductAnalyticsWorkCycle, recordProductAnalyticsChatCreated, } from "./product-analytics.js";
31
32
  const CHAT_TITLE_MAX_LENGTH = 200;
32
33
  class InvalidQueueDeliveryActionLinkError extends Error {
33
34
  }
@@ -2316,7 +2317,7 @@ export function chatService(db) {
2316
2317
  const nativeSteerMessageIds = rows
2317
2318
  .filter((row) => row.role === "user" && row.structuredPayload?.source === "steer")
2318
2319
  .map((row) => row.id);
2319
- const [attachmentsByMessageId, approvalsById, generationMessageRows, linkedSteerQueueRows] = await Promise.all([
2320
+ const [attachmentsByMessageId, approvalsById, generationMessageRows, linkedSteerQueueRows, detachedTranscriptByMessageId] = await Promise.all([
2320
2321
  listAttachmentsForMessageIds(rows.map((row) => row.id)),
2321
2322
  listApprovalsForMessages(rows),
2322
2323
  assistantMessageIds.length > 0
@@ -2326,11 +2327,12 @@ export function chatService(db) {
2326
2327
  generationId: chatGenerationEvents.generationId,
2327
2328
  generationCreatedAt: chatGenerations.createdAt,
2328
2329
  eventRecordedAt: chatGenerationEvents.recordedAt,
2330
+ generationSeq: chatGenerationEvents.generationSeq,
2329
2331
  })
2330
2332
  .from(chatGenerationEvents)
2331
2333
  .innerJoin(chatGenerations, eq(chatGenerations.id, chatGenerationEvents.generationId))
2332
2334
  .where(and(inArray(chatGenerationEvents.assistantMessageId, assistantMessageIds), inArray(chatGenerationEvents.orgId, [...new Set(rows.map((row) => row.orgId))])))
2333
- .orderBy(desc(chatGenerations.createdAt), desc(chatGenerationEvents.recordedAt), desc(chatGenerationEvents.generationSeq))
2335
+ .orderBy(desc(chatGenerations.createdAt), desc(chatGenerationEvents.recordedAt), desc(chatGenerationEvents.generationSeq), desc(chatGenerationEvents.generationId))
2334
2336
  : Promise.resolve([]),
2335
2337
  nativeSteerMessageIds.length > 0
2336
2338
  ? db
@@ -2344,6 +2346,9 @@ export function chatService(db) {
2344
2346
  .from(chatQueuedMessages)
2345
2347
  .where(or(inArray(chatQueuedMessages.sourceMessageId, nativeSteerMessageIds), inArray(chatQueuedMessages.continuationMessageId, nativeSteerMessageIds)))
2346
2348
  : Promise.resolve([]),
2349
+ includeTranscript
2350
+ ? listDetachedChatTranscripts(db, rows)
2351
+ : Promise.resolve(new Map()),
2347
2352
  ]);
2348
2353
  const generationIds = [...new Set(generationMessageRows.map((row) => row.generationId))];
2349
2354
  const generationsById = generationIds.length === 0
@@ -2360,9 +2365,10 @@ export function chatService(db) {
2360
2365
  .map((generation) => [generation.id, generation]));
2361
2366
  const messageById = new Map(rows.map((row) => [row.id, row]));
2362
2367
  const generationIdByAssistantMessageId = new Map();
2368
+ const generationSelectionByAssistantMessageId = new Map();
2363
2369
  for (const generationMessageRow of generationMessageRows) {
2364
2370
  const assistantMessageId = generationMessageRow.assistantMessageId;
2365
- if (!assistantMessageId || generationIdByAssistantMessageId.has(assistantMessageId))
2371
+ if (!assistantMessageId)
2366
2372
  continue;
2367
2373
  const message = messageById.get(assistantMessageId);
2368
2374
  const generation = generationsById.get(generationMessageRow.generationId);
@@ -2370,6 +2376,16 @@ export function chatService(db) {
2370
2376
  continue;
2371
2377
  if (generation.orgId !== message.orgId || generation.conversationId !== message.conversationId)
2372
2378
  continue;
2379
+ const candidate = {
2380
+ generationId: generationMessageRow.generationId,
2381
+ generationCreatedAt: generationMessageRow.generationCreatedAt,
2382
+ eventRecordedAt: generationMessageRow.eventRecordedAt,
2383
+ generationSeq: generationMessageRow.generationSeq,
2384
+ };
2385
+ const current = generationSelectionByAssistantMessageId.get(assistantMessageId);
2386
+ if (current && compareChatGenerationSelection(candidate, current) <= 0)
2387
+ continue;
2388
+ generationSelectionByAssistantMessageId.set(assistantMessageId, candidate);
2373
2389
  generationIdByAssistantMessageId.set(assistantMessageId, generationMessageRow.generationId);
2374
2390
  }
2375
2391
  const steerDispositionByMessageId = new Map();
@@ -2418,6 +2434,11 @@ export function chatService(db) {
2418
2434
  const generationId = generationIdByAssistantMessageId.get(messageId);
2419
2435
  return Boolean(generationId && nativeSteerTargetGenerationIds.has(generationId));
2420
2436
  });
2437
+ const hydratedDetachedTranscriptByMessageId = includeTranscript
2438
+ ? detachedTranscriptByMessageId
2439
+ : nativeSteerAssistantMessageIds.length > 0
2440
+ ? await listDetachedChatTranscripts(db, rows)
2441
+ : detachedTranscriptByMessageId;
2421
2442
  const assistantGenerationIds = [
2422
2443
  ...new Set(generationIdByAssistantMessageId.values()),
2423
2444
  ];
@@ -2484,6 +2505,9 @@ export function chatService(db) {
2484
2505
  });
2485
2506
  }
2486
2507
  }
2508
+ const detachedTranscriptSummaryByMessageId = includeTranscript
2509
+ ? new Map()
2510
+ : await listDetachedChatTranscriptSummaries(db, rows);
2487
2511
  const nativeSteerTranscriptPayloadByMessageId = new Map();
2488
2512
  if (nativeSteerAssistantMessageIds.length > 0) {
2489
2513
  const transcriptPayloadRows = await db
@@ -2504,13 +2528,22 @@ export function chatService(db) {
2504
2528
  const transcriptPayload = nativeSteerTranscriptPayloadByMessageId.get(row.id) ?? row.structuredPayload;
2505
2529
  const ledgerTranscript = transcriptByAssistantMessageId.get(row.id);
2506
2530
  const transcript = includeRowTranscript
2507
- ? ledgerTranscript?.length
2508
- ? ledgerTranscript
2509
- : chatTranscriptFromPayload(transcriptPayload)
2531
+ ? selectChatTranscript({
2532
+ ledger: ledgerTranscript,
2533
+ detached: hydratedDetachedTranscriptByMessageId.get(row.id),
2534
+ legacyPayload: transcriptPayload,
2535
+ })
2510
2536
  : [];
2511
2537
  const transcriptSummary = includeRowTranscript
2512
- ? chatTranscriptSummaryFromEntries(transcript)
2513
- : transcriptSummaryByAssistantMessageId.get(row.id) ?? row.transcriptSummary ?? null;
2538
+ ? transcriptSummaryFromSources({
2539
+ ledger: ledgerTranscript,
2540
+ detached: hydratedDetachedTranscriptByMessageId.get(row.id),
2541
+ legacyPayload: transcriptPayload,
2542
+ })
2543
+ : transcriptSummaryByAssistantMessageId.get(row.id)
2544
+ ?? detachedTranscriptSummaryByMessageId.get(row.id)
2545
+ ?? row.transcriptSummary
2546
+ ?? null;
2514
2547
  const structuredPayload = effectiveStructuredPayload(row);
2515
2548
  return {
2516
2549
  ...row,
@@ -2763,6 +2796,17 @@ export function chatService(db) {
2763
2796
  .returning();
2764
2797
  if (!child)
2765
2798
  throw new Error("Failed to create forked chat conversation");
2799
+ await recordProductAnalyticsChatCreated(tx, {
2800
+ orgId: input.orgId,
2801
+ conversationId: child.id,
2802
+ createdAt: child.createdAt,
2803
+ createdByUserId: input.createdByUserId,
2804
+ actorType: "human",
2805
+ actorId: input.userId,
2806
+ creationPath: "fork",
2807
+ planMode: child.planMode,
2808
+ initialRole: "system",
2809
+ });
2766
2810
  const contextLinks = await tx
2767
2811
  .select()
2768
2812
  .from(chatContextLinks)
@@ -2799,6 +2843,7 @@ export function chatService(db) {
2799
2843
  sourceConversation: source,
2800
2844
  targetConversationId: child.id,
2801
2845
  orgId: input.orgId,
2846
+ transcriptBySourceMessageId: await loadChatTranscripts(tx, forkMessages),
2802
2847
  });
2803
2848
  const [systemEvent] = await tx
2804
2849
  .insert(chatMessages)
@@ -3102,6 +3147,9 @@ export function chatService(db) {
3102
3147
  const row = await db
3103
3148
  .select({
3104
3149
  id: chatMessages.id,
3150
+ orgId: chatMessages.orgId,
3151
+ conversationId: chatMessages.conversationId,
3152
+ role: chatMessages.role,
3105
3153
  structuredPayload: chatMessages.structuredPayload,
3106
3154
  })
3107
3155
  .from(chatMessages)
@@ -3109,44 +3157,17 @@ export function chatService(db) {
3109
3157
  .then((rows) => rows[0] ?? null);
3110
3158
  if (!row)
3111
3159
  return null;
3112
- const generation = await db
3113
- .select({
3114
- generationId: chatGenerationEvents.generationId,
3115
- acceptedThroughSeq: chatGenerations.acceptedThroughSeq,
3116
- })
3117
- .from(chatGenerationEvents)
3118
- .innerJoin(chatGenerations, eq(chatGenerations.id, chatGenerationEvents.generationId))
3119
- .where(eq(chatGenerationEvents.assistantMessageId, messageId))
3120
- .orderBy(desc(chatGenerations.createdAt), desc(chatGenerationEvents.recordedAt), desc(chatGenerationEvents.generationSeq))
3121
- .limit(1)
3122
- .then((rows) => rows[0] ?? null);
3123
- const transcript = generation
3124
- ? await db
3125
- .select({
3126
- generationId: chatGenerationEvents.generationId,
3127
- generationSeq: chatGenerationEvents.generationSeq,
3128
- payload: chatGenerationEvents.payload,
3129
- })
3130
- .from(chatGenerationEvents)
3131
- .where(and(eq(chatGenerationEvents.generationId, generation.generationId), eq(chatGenerationEvents.assistantMessageId, messageId), eq(chatGenerationEvents.eventKind, "transcript"), generation.acceptedThroughSeq === null
3132
- ? undefined
3133
- : lte(chatGenerationEvents.generationSeq, generation.acceptedThroughSeq)))
3134
- .orderBy(asc(chatGenerationEvents.generationSeq))
3135
- .then((events) => events.flatMap((event) => {
3136
- const entry = event.payload.entry;
3137
- return entry && typeof entry === "object" && !Array.isArray(entry)
3138
- ? [withChatTranscriptGenerationProvenance(entry, {
3139
- generationId: event.generationId,
3140
- generationSeq: event.generationSeq,
3141
- })]
3142
- : [];
3143
- }))
3144
- : [];
3160
+ const [generation, detached] = await Promise.all([
3161
+ listChatGenerationTranscripts(db, [row]),
3162
+ listDetachedChatTranscripts(db, [row]),
3163
+ ]);
3145
3164
  return {
3146
3165
  messageId: row.id,
3147
- transcript: transcript.length > 0
3148
- ? transcript
3149
- : chatTranscriptFromPayload(row.structuredPayload),
3166
+ transcript: selectChatTranscript({
3167
+ ledger: generation.transcriptByMessageId.get(row.id),
3168
+ detached: detached.get(row.id),
3169
+ legacyPayload: row.structuredPayload,
3170
+ }),
3150
3171
  };
3151
3172
  }
3152
3173
  async function getMessage(conversationId, messageId) {
@@ -3160,27 +3181,59 @@ export function chatService(db) {
3160
3181
  const [hydrated] = await hydrateMessages([row]);
3161
3182
  return hydrated ? hydrated : null;
3162
3183
  }
3184
+ async function transcriptSnapshotForWrite(database, message, requestedTranscript) {
3185
+ // Generation events are the canonical live source. Never duplicate their
3186
+ // transcript into the detached snapshot table during a metadata update.
3187
+ if (message.role === "assistant") {
3188
+ const generation = await listChatGenerationTranscripts(database, [message]);
3189
+ if ((generation.transcriptByMessageId.get(message.id)?.length ?? 0) > 0)
3190
+ return [];
3191
+ }
3192
+ if (requestedTranscript !== undefined)
3193
+ return requestedTranscript;
3194
+ const detached = await listDetachedChatTranscripts(database, [message]);
3195
+ return selectChatTranscript({
3196
+ ledger: undefined,
3197
+ detached: detached.get(message.id),
3198
+ legacyPayload: message.structuredPayload,
3199
+ });
3200
+ }
3163
3201
  async function addMessage(conversationId, input) {
3164
3202
  const durableBody = input.role === "user"
3165
3203
  ? input.body
3166
3204
  : await normalizeLocalLibraryPathMarkdown(input.body, input.orgId);
3167
- const [message] = await db
3168
- .insert(chatMessages)
3169
- .values({
3170
- orgId: input.orgId,
3171
- conversationId,
3172
- role: input.role,
3173
- kind: input.kind,
3174
- status: input.status ?? "completed",
3175
- body: durableBody,
3176
- structuredPayload: withPersistedTranscript(sanitizeChatStructuredPayload(input.structuredPayload ?? null), input.transcript ?? []),
3177
- approvalId: input.approvalId ?? null,
3178
- runId: input.runId ?? null,
3179
- replyingAgentId: input.replyingAgentId ?? null,
3180
- chatTurnId: input.chatTurnId ?? null,
3181
- turnVariant: input.turnVariant ?? 0,
3182
- })
3183
- .returning();
3205
+ const sanitizedPayload = sanitizeChatStructuredPayload(input.structuredPayload ?? null);
3206
+ const transcriptFromPayload = chatTranscriptFromPayload(sanitizedPayload);
3207
+ const transcript = input.transcript ?? transcriptFromPayload;
3208
+ const { message } = await db.transaction(async (tx) => {
3209
+ const [inserted] = await tx
3210
+ .insert(chatMessages)
3211
+ .values({
3212
+ orgId: input.orgId,
3213
+ conversationId,
3214
+ role: input.role,
3215
+ kind: input.kind,
3216
+ status: input.status ?? "completed",
3217
+ body: durableBody,
3218
+ structuredPayload: stripChatMetadataFromPayload(sanitizedPayload),
3219
+ approvalId: input.approvalId ?? null,
3220
+ runId: input.runId ?? null,
3221
+ replyingAgentId: input.replyingAgentId ?? null,
3222
+ chatTurnId: input.chatTurnId ?? null,
3223
+ turnVariant: input.turnVariant ?? 0,
3224
+ })
3225
+ .returning();
3226
+ if (!inserted)
3227
+ throw new Error("Failed to create chat message");
3228
+ if (transcript.length > 0) {
3229
+ await replaceDetachedChatTranscript(tx, {
3230
+ orgId: input.orgId,
3231
+ messageId: inserted.id,
3232
+ entries: transcript,
3233
+ });
3234
+ }
3235
+ return { message: inserted };
3236
+ });
3184
3237
  if (!message)
3185
3238
  throw new Error("Failed to create chat message");
3186
3239
  if (input.role === "user" || isVisibleIncomingChatMessage(message)) {
@@ -3213,29 +3266,43 @@ export function chatService(db) {
3213
3266
  const visibleContentChanged = (durableInputBody !== undefined && safeTrim(durableInputBody) !== safeTrim(existing.body)) ||
3214
3267
  (input.kind !== undefined && input.kind !== existing.kind) ||
3215
3268
  (input.approvalId !== undefined && input.approvalId !== existing.approvalId);
3216
- const [updated] = await db
3217
- .update(chatMessages)
3218
- .set({
3219
- ...(becameVisibleIncoming ? { createdAt: now } : {}),
3220
- ...(input.kind !== undefined ? { kind: input.kind } : {}),
3221
- ...(input.status !== undefined ? { status: input.status } : {}),
3222
- ...(durableInputBody !== undefined ? { body: durableInputBody } : {}),
3223
- ...(input.structuredPayload !== undefined || input.transcript !== undefined
3224
- ? {
3225
- structuredPayload: withPersistedTranscript(input.structuredPayload !== undefined
3226
- ? sanitizeChatStructuredPayload(input.structuredPayload)
3227
- : sanitizeChatStructuredPayload(stripChatMetadataFromPayload(existing.structuredPayload)), input.transcript !== undefined
3228
- ? input.transcript
3229
- : chatTranscriptFromPayload(existing.structuredPayload)),
3230
- }
3231
- : {}),
3232
- ...(input.approvalId !== undefined ? { approvalId: input.approvalId } : {}),
3233
- ...(input.runId !== undefined ? { runId: input.runId } : {}),
3234
- ...(input.replyingAgentId !== undefined ? { replyingAgentId: input.replyingAgentId } : {}),
3235
- updatedAt: now,
3236
- })
3237
- .where(and(eq(chatMessages.conversationId, conversationId), eq(chatMessages.id, messageId)))
3238
- .returning();
3269
+ const hasPayloadUpdate = input.structuredPayload !== undefined || input.transcript !== undefined;
3270
+ const sanitizedPayload = input.structuredPayload !== undefined
3271
+ ? sanitizeChatStructuredPayload(input.structuredPayload)
3272
+ : sanitizeChatStructuredPayload(stripChatMetadataFromPayload(existing.structuredPayload));
3273
+ const requestedTranscript = input.transcript !== undefined
3274
+ ? input.transcript
3275
+ : input.structuredPayload !== undefined && Object.hasOwn(sanitizedPayload ?? {}, CHAT_TRANSCRIPT_KEY)
3276
+ ? chatTranscriptFromPayload(sanitizedPayload)
3277
+ : undefined;
3278
+ const { updated } = await db.transaction(async (tx) => {
3279
+ const transcript = hasPayloadUpdate
3280
+ ? await transcriptSnapshotForWrite(tx, existing, requestedTranscript)
3281
+ : null;
3282
+ const [next] = await tx
3283
+ .update(chatMessages)
3284
+ .set({
3285
+ ...(becameVisibleIncoming ? { createdAt: now } : {}),
3286
+ ...(input.kind !== undefined ? { kind: input.kind } : {}),
3287
+ ...(input.status !== undefined ? { status: input.status } : {}),
3288
+ ...(durableInputBody !== undefined ? { body: durableInputBody } : {}),
3289
+ ...(hasPayloadUpdate ? { structuredPayload: stripChatMetadataFromPayload(sanitizedPayload) } : {}),
3290
+ ...(input.approvalId !== undefined ? { approvalId: input.approvalId } : {}),
3291
+ ...(input.runId !== undefined ? { runId: input.runId } : {}),
3292
+ ...(input.replyingAgentId !== undefined ? { replyingAgentId: input.replyingAgentId } : {}),
3293
+ updatedAt: now,
3294
+ })
3295
+ .where(and(eq(chatMessages.conversationId, conversationId), eq(chatMessages.id, messageId)))
3296
+ .returning();
3297
+ if (next && transcript !== null) {
3298
+ await replaceDetachedChatTranscript(tx, {
3299
+ orgId: existing.orgId,
3300
+ messageId: existing.id,
3301
+ entries: transcript,
3302
+ });
3303
+ }
3304
+ return { updated: next };
3305
+ });
3239
3306
  if (!updated)
3240
3307
  return null;
3241
3308
  if ((existing.role === "user" && input.body !== undefined) ||
@@ -3281,15 +3348,30 @@ export function chatService(db) {
3281
3348
  .then((rows) => rows[0] ?? null);
3282
3349
  if (!existing)
3283
3350
  return null;
3284
- const [updated] = await db
3285
- .update(chatMessages)
3286
- .set({
3287
- structuredPayload: withPersistedTranscript(sanitizeChatStructuredPayload(structuredPayload), chatTranscriptFromPayload(existing.structuredPayload)),
3288
- updatedAt: new Date(),
3289
- })
3290
- .where(and(eq(chatMessages.conversationId, conversationId), eq(chatMessages.id, messageId)))
3291
- .returning();
3292
- const [hydrated] = await hydrateMessages([updated]);
3351
+ const sanitizedPayload = sanitizeChatStructuredPayload(structuredPayload);
3352
+ const requestedTranscript = Object.hasOwn(sanitizedPayload ?? {}, CHAT_TRANSCRIPT_KEY)
3353
+ ? chatTranscriptFromPayload(sanitizedPayload)
3354
+ : undefined;
3355
+ const { updated } = await db.transaction(async (tx) => {
3356
+ const transcript = await transcriptSnapshotForWrite(tx, existing, requestedTranscript);
3357
+ const [next] = await tx
3358
+ .update(chatMessages)
3359
+ .set({
3360
+ structuredPayload: stripChatMetadataFromPayload(sanitizedPayload),
3361
+ updatedAt: new Date(),
3362
+ })
3363
+ .where(and(eq(chatMessages.conversationId, conversationId), eq(chatMessages.id, messageId)))
3364
+ .returning();
3365
+ if (next) {
3366
+ await replaceDetachedChatTranscript(tx, {
3367
+ orgId: existing.orgId,
3368
+ messageId: existing.id,
3369
+ entries: transcript,
3370
+ });
3371
+ }
3372
+ return { updated: next };
3373
+ });
3374
+ const [hydrated] = await hydrateMessages(updated ? [updated] : []);
3293
3375
  return hydrated ?? null;
3294
3376
  }
3295
3377
  async function addContextLink(conversationId, orgId, input) {