@rudderhq/server 0.7.16 → 0.7.19-canary.0

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 (248) hide show
  1. package/dist/agent-runtimes/registry.d.ts.map +1 -1
  2. package/dist/agent-runtimes/registry.js +2 -1
  3. package/dist/agent-runtimes/registry.js.map +1 -1
  4. package/dist/bootstrap/create-http-app.d.ts.map +1 -1
  5. package/dist/bootstrap/create-http-app.js +3 -9
  6. package/dist/bootstrap/create-http-app.js.map +1 -1
  7. package/dist/file-system-durability.d.ts +5 -0
  8. package/dist/file-system-durability.d.ts.map +1 -0
  9. package/dist/file-system-durability.js +39 -0
  10. package/dist/file-system-durability.js.map +1 -0
  11. package/dist/home-paths.d.ts +1 -0
  12. package/dist/home-paths.d.ts.map +1 -1
  13. package/dist/home-paths.js +705 -102
  14. package/dist/home-paths.js.map +1 -1
  15. package/dist/routes/chats.d.ts.map +1 -1
  16. package/dist/routes/chats.js +18 -69
  17. package/dist/routes/chats.js.map +1 -1
  18. package/dist/routes/chats.message-query-routes.d.ts +9 -0
  19. package/dist/routes/chats.message-query-routes.d.ts.map +1 -0
  20. package/dist/routes/chats.message-query-routes.js +43 -0
  21. package/dist/routes/chats.message-query-routes.js.map +1 -0
  22. package/dist/routes/chats.stop-route.d.ts +3 -0
  23. package/dist/routes/chats.stop-route.d.ts.map +1 -0
  24. package/dist/routes/chats.stop-route.js +240 -0
  25. package/dist/routes/chats.stop-route.js.map +1 -0
  26. package/dist/routes/chats.stream-routes.d.ts.map +1 -1
  27. package/dist/routes/chats.stream-routes.js +94 -390
  28. package/dist/routes/chats.stream-routes.js.map +1 -1
  29. package/dist/routes/chats.stream-support.d.ts +41 -0
  30. package/dist/routes/chats.stream-support.d.ts.map +1 -1
  31. package/dist/routes/chats.stream-support.js +58 -0
  32. package/dist/routes/chats.stream-support.js.map +1 -1
  33. package/dist/routes/issues.d.ts.map +1 -1
  34. package/dist/routes/issues.js +27 -5
  35. package/dist/routes/issues.js.map +1 -1
  36. package/dist/routes/issues.mutations.d.ts.map +1 -1
  37. package/dist/routes/issues.mutations.js +10 -6
  38. package/dist/routes/issues.mutations.js.map +1 -1
  39. package/dist/routes/orgs.d.ts.map +1 -1
  40. package/dist/routes/orgs.js +28 -8
  41. package/dist/routes/orgs.js.map +1 -1
  42. package/dist/routes/rudder-plugins.d.ts +5 -0
  43. package/dist/routes/rudder-plugins.d.ts.map +1 -1
  44. package/dist/routes/rudder-plugins.js +21 -1
  45. package/dist/routes/rudder-plugins.js.map +1 -1
  46. package/dist/routes/rudder-plugins.test.d.ts +2 -0
  47. package/dist/routes/rudder-plugins.test.d.ts.map +1 -0
  48. package/dist/routes/rudder-plugins.test.js +42 -0
  49. package/dist/routes/rudder-plugins.test.js.map +1 -0
  50. package/dist/routes/run-intelligence.d.ts.map +1 -1
  51. package/dist/routes/run-intelligence.js +8 -0
  52. package/dist/routes/run-intelligence.js.map +1 -1
  53. package/dist/services/agent-issue-creation.d.ts.map +1 -1
  54. package/dist/services/agent-issue-creation.js +2 -0
  55. package/dist/services/agent-issue-creation.js.map +1 -1
  56. package/dist/services/chat-assistant.d.ts.map +1 -1
  57. package/dist/services/chat-assistant.helpers.d.ts +4 -2
  58. package/dist/services/chat-assistant.helpers.d.ts.map +1 -1
  59. package/dist/services/chat-assistant.helpers.js +5 -0
  60. package/dist/services/chat-assistant.helpers.js.map +1 -1
  61. package/dist/services/chat-assistant.js +31 -8
  62. package/dist/services/chat-assistant.js.map +1 -1
  63. package/dist/services/chat-generation-locks.test.js +0 -8
  64. package/dist/services/chat-generation-locks.test.js.map +1 -1
  65. package/dist/services/chat-inline-annotation-validation.d.ts.map +1 -1
  66. package/dist/services/chat-inline-annotation-validation.js +3 -10
  67. package/dist/services/chat-inline-annotation-validation.js.map +1 -1
  68. package/dist/services/chat-inline-annotations.test.js +12 -15
  69. package/dist/services/chat-inline-annotations.test.js.map +1 -1
  70. package/dist/services/chat-message-mutation-fingerprint.d.ts +29 -1
  71. package/dist/services/chat-message-mutation-fingerprint.d.ts.map +1 -1
  72. package/dist/services/chat-message-mutation-fingerprint.js +55 -0
  73. package/dist/services/chat-message-mutation-fingerprint.js.map +1 -1
  74. package/dist/services/chats.annotation-persistence.d.ts +5 -0
  75. package/dist/services/chats.annotation-persistence.d.ts.map +1 -1
  76. package/dist/services/chats.annotation-persistence.js +33 -1
  77. package/dist/services/chats.annotation-persistence.js.map +1 -1
  78. package/dist/services/chats.d.ts +2 -28
  79. package/dist/services/chats.d.ts.map +1 -1
  80. package/dist/services/chats.js +3 -29
  81. package/dist/services/chats.js.map +1 -1
  82. package/dist/services/index.d.ts +1 -1
  83. package/dist/services/index.d.ts.map +1 -1
  84. package/dist/services/index.js.map +1 -1
  85. package/dist/services/issue-references.d.ts +10 -0
  86. package/dist/services/issue-references.d.ts.map +1 -0
  87. package/dist/services/issue-references.js +141 -0
  88. package/dist/services/issue-references.js.map +1 -0
  89. package/dist/services/issues.d.ts +1 -1
  90. package/dist/services/issues.d.ts.map +1 -1
  91. package/dist/services/issues.helpers.d.ts +4 -0
  92. package/dist/services/issues.helpers.d.ts.map +1 -1
  93. package/dist/services/issues.helpers.js.map +1 -1
  94. package/dist/services/issues.js +164 -97
  95. package/dist/services/issues.js.map +1 -1
  96. package/dist/services/organization-workspace-browser.d.ts +6 -2
  97. package/dist/services/organization-workspace-browser.d.ts.map +1 -1
  98. package/dist/services/organization-workspace-browser.js +212 -53
  99. package/dist/services/organization-workspace-browser.js.map +1 -1
  100. package/dist/services/plugin-archive-native.d.ts +10 -0
  101. package/dist/services/plugin-archive-native.d.ts.map +1 -0
  102. package/dist/services/plugin-archive-native.js +170 -0
  103. package/dist/services/plugin-archive-native.js.map +1 -0
  104. package/dist/services/plugin-archive-node.d.ts +3 -0
  105. package/dist/services/plugin-archive-node.d.ts.map +1 -0
  106. package/dist/services/plugin-archive-node.js +97 -0
  107. package/dist/services/plugin-archive-node.js.map +1 -0
  108. package/dist/services/product-analytics-collector.test.js +5 -1
  109. package/dist/services/product-analytics-collector.test.js.map +1 -1
  110. package/dist/services/rudder-plugin-catalog.d.ts.map +1 -1
  111. package/dist/services/rudder-plugin-catalog.js +10 -11
  112. package/dist/services/rudder-plugin-catalog.js.map +1 -1
  113. package/dist/services/rudder-plugins.d.ts +1 -3
  114. package/dist/services/rudder-plugins.d.ts.map +1 -1
  115. package/dist/services/rudder-plugins.js +57 -100
  116. package/dist/services/rudder-plugins.js.map +1 -1
  117. package/dist/services/rudder-plugins.test.js +52 -17
  118. package/dist/services/rudder-plugins.test.js.map +1 -1
  119. package/dist/services/run-intelligence.d.ts +1 -0
  120. package/dist/services/run-intelligence.d.ts.map +1 -1
  121. package/dist/services/run-intelligence.js +1 -1
  122. package/dist/services/run-intelligence.js.map +1 -1
  123. package/dist/services/run-log-store.d.ts +1 -0
  124. package/dist/services/run-log-store.d.ts.map +1 -1
  125. package/dist/services/run-log-store.js +123 -4
  126. package/dist/services/run-log-store.js.map +1 -1
  127. package/dist/services/runtime-kernel/heartbeat.core.d.ts +1 -0
  128. package/dist/services/runtime-kernel/heartbeat.core.d.ts.map +1 -1
  129. package/dist/services/runtime-kernel/heartbeat.core.js +11 -0
  130. package/dist/services/runtime-kernel/heartbeat.core.js.map +1 -1
  131. package/dist/services/runtime-kernel/heartbeat.d.ts +1 -0
  132. package/dist/services/runtime-kernel/heartbeat.d.ts.map +1 -1
  133. package/dist/services/runtime-kernel/heartbeat.js +3 -33
  134. package/dist/services/runtime-kernel/heartbeat.js.map +1 -1
  135. package/dist/services/runtime-kernel/heartbeat.recovery.d.ts +1 -0
  136. package/dist/services/runtime-kernel/heartbeat.recovery.d.ts.map +1 -1
  137. package/dist/services/runtime-kernel/heartbeat.recovery.js +23 -0
  138. package/dist/services/runtime-kernel/heartbeat.recovery.js.map +1 -1
  139. package/dist/services/runtime-kernel/model-fallback.d.ts.map +1 -1
  140. package/dist/services/runtime-kernel/model-fallback.js +56 -11
  141. package/dist/services/runtime-kernel/model-fallback.js.map +1 -1
  142. package/dist/services/workspace-backup-v2.d.ts +1 -0
  143. package/dist/services/workspace-backup-v2.d.ts.map +1 -1
  144. package/dist/services/workspace-backup-v2.js +16 -0
  145. package/dist/services/workspace-backup-v2.js.map +1 -1
  146. package/dist/services/workspace-backups.d.ts.map +1 -1
  147. package/dist/services/workspace-backups.js +4 -2
  148. package/dist/services/workspace-backups.js.map +1 -1
  149. package/dist/services/workspace-files-native.d.ts +16 -0
  150. package/dist/services/workspace-files-native.d.ts.map +1 -0
  151. package/dist/services/workspace-files-native.js +212 -0
  152. package/dist/services/workspace-files-native.js.map +1 -0
  153. package/dist/services/workspace-manifest-native.d.ts +1 -1
  154. package/dist/services/workspace-manifest-native.d.ts.map +1 -1
  155. package/dist/services/workspace-manifest-native.js +49 -6
  156. package/dist/services/workspace-manifest-native.js.map +1 -1
  157. package/dist/services/workspace-runtime.helpers.d.ts.map +1 -1
  158. package/dist/services/workspace-runtime.helpers.js +13 -11
  159. package/dist/services/workspace-runtime.helpers.js.map +1 -1
  160. package/package.json +14 -14
  161. package/resources/bundled-skills/rudder-docs/SKILL.md +12 -12
  162. package/resources/bundled-skills/rudder-docs/references/source-map.md +7 -31
  163. package/skills/rudder-docs/SKILL.md +12 -12
  164. package/skills/rudder-docs/references/source-map.md +7 -31
  165. package/ui-dist/assets/{LibraryLiveSurface-DnY0wZep.js → LibraryLiveSurface-D-6Puw4N.js} +1 -1
  166. package/ui-dist/assets/{abnfDiagram-VRR7QNED-CT-9m1Vc.js → abnfDiagram-VRR7QNED-DjgQ9iD_.js} +1 -1
  167. package/ui-dist/assets/{addon-fit-C6aMSfRz.js → addon-fit-OOCvZY14.js} +1 -1
  168. package/ui-dist/assets/{arc-1nExaM-y.js → arc-D6yqUjH4.js} +1 -1
  169. package/ui-dist/assets/{architectureDiagram-ZJ3FMSHR-bILoPPs5.js → architectureDiagram-ZJ3FMSHR-eF-Es2a-.js} +1 -1
  170. package/ui-dist/assets/{blockDiagram-677ZJIJ3--zRFciqi.js → blockDiagram-677ZJIJ3-B7G2uxR7.js} +1 -1
  171. package/ui-dist/assets/{c4Diagram-LMCZKHZV-CrtaX6A_.js → c4Diagram-LMCZKHZV-YhY4bz85.js} +1 -1
  172. package/ui-dist/assets/channel-DISxdJMI.js +1 -0
  173. package/ui-dist/assets/{chunk-2Q5K7J3B-DoBb7ZYS.js → chunk-2Q5K7J3B-D7QxbIUK.js} +1 -1
  174. package/ui-dist/assets/{chunk-32BRIVSS-DilGswdp.js → chunk-32BRIVSS-CArPDsLy.js} +1 -1
  175. package/ui-dist/assets/{chunk-5VM5RSS4-D8q00d1k.js → chunk-5VM5RSS4-ByyAjdOI.js} +1 -1
  176. package/ui-dist/assets/{chunk-EX3LRPZG-Bl1KSAwQ.js → chunk-EX3LRPZG-B6Z9cEKa.js} +1 -1
  177. package/ui-dist/assets/{chunk-JWPE2WC7-DtdgLB7Y.js → chunk-JWPE2WC7-L5jYy4CI.js} +1 -1
  178. package/ui-dist/assets/{chunk-MOJQB5TN-UaG7L1QI.js → chunk-MOJQB5TN-BBTZZsOQ.js} +1 -1
  179. package/ui-dist/assets/{chunk-RYQCIY6F-mkz9qbQF.js → chunk-RYQCIY6F-DyV9CaPT.js} +1 -1
  180. package/ui-dist/assets/{chunk-V7JOEXUC-FGET6Myl.js → chunk-V7JOEXUC-CNztgBrF.js} +1 -1
  181. package/ui-dist/assets/{chunk-VR4S4FIN-BgfUmupS.js → chunk-VR4S4FIN-Bv62Xmto.js} +1 -1
  182. package/ui-dist/assets/{chunk-XXDRQBXY-B6I-gBFN.js → chunk-XXDRQBXY-B5AzJDaz.js} +1 -1
  183. package/ui-dist/assets/classDiagram-OUVF2IWQ-BssC8UiF.js +1 -0
  184. package/ui-dist/assets/classDiagram-v2-EOCWNBFH-BssC8UiF.js +1 -0
  185. package/ui-dist/assets/{cose-bilkent-JH36ORCC-DVGWBjbO.js → cose-bilkent-JH36ORCC-DrzyjyO_.js} +1 -1
  186. package/ui-dist/assets/{cynefin-VYW2F7L2-CWjLXAiA.js → cynefin-VYW2F7L2-ChoChVKW.js} +1 -1
  187. package/ui-dist/assets/{cynefinDiagram-TSTJHNR4-DWY5Jowv.js → cynefinDiagram-TSTJHNR4-Fv4ecj_f.js} +1 -1
  188. package/ui-dist/assets/{dagre-VKFMJZFB-Bp0SVTqP.js → dagre-VKFMJZFB-Zd466k0O.js} +1 -1
  189. package/ui-dist/assets/{diagram-FQU43EPY-EhsLuQCs.js → diagram-FQU43EPY-BgL3Uu7z.js} +1 -1
  190. package/ui-dist/assets/{diagram-G47NLZAW-C_ifHw4Q.js → diagram-G47NLZAW-Bcbg2TZF.js} +1 -1
  191. package/ui-dist/assets/{diagram-NH7WQ7WH-BCitqFNA.js → diagram-NH7WQ7WH-YS4gl6dx.js} +1 -1
  192. package/ui-dist/assets/{diagram-OA4YK3LP-BRjomHnO.js → diagram-OA4YK3LP-C-A8A6Xi.js} +1 -1
  193. package/ui-dist/assets/{diagram-WEI45ONY-Cr_E92JE.js → diagram-WEI45ONY-mqkaxwes.js} +1 -1
  194. package/ui-dist/assets/{ebnfDiagram-CCIWWBDH-0WJQMwqt.js → ebnfDiagram-CCIWWBDH-CvH1cI4K.js} +1 -1
  195. package/ui-dist/assets/{erDiagram-Q63AITRT-B0EBivSu.js → erDiagram-Q63AITRT-Duhw1MUB.js} +1 -1
  196. package/ui-dist/assets/{flowDiagram-23GEKE2U-BwdRtCsd.js → flowDiagram-23GEKE2U-DUkAECUs.js} +1 -1
  197. package/ui-dist/assets/{ganttDiagram-NO4QXBWP-KxlqXAqZ.js → ganttDiagram-NO4QXBWP-B3cINaqn.js} +1 -1
  198. package/ui-dist/assets/{gitGraphDiagram-IHSO6WYX-DeTCa-SS.js → gitGraphDiagram-IHSO6WYX-BMEHvYy5.js} +1 -1
  199. package/ui-dist/assets/{graph-rdRwl3us.js → graph-B1-dUGRC.js} +1 -1
  200. package/ui-dist/assets/{index-B2jHUYti.js → index-BFmYzGL9.js} +1 -1
  201. package/ui-dist/assets/{index-DBPJ49Cn.js → index-BGAEBJze.js} +1 -1
  202. package/ui-dist/assets/{index-NxbW73mN.js → index-BMfPEMCH.js} +1 -1
  203. package/ui-dist/assets/{index-CcLF8pix.js → index-BglV2AAc.js} +1 -1
  204. package/ui-dist/assets/{index-BzLCEJCf.js → index-Blix7pGb.js} +1 -1
  205. package/ui-dist/assets/{index-D5pdKmHf.js → index-CBrXXiQ_.js} +1 -1
  206. package/ui-dist/assets/{index-7Mb8iY3g.js → index-CSMCUMYP.js} +1 -1
  207. package/ui-dist/assets/index-CUW-AUBO.css +32 -0
  208. package/ui-dist/assets/{index-D3RtGD1i.js → index-CaveK_TY.js} +1 -1
  209. package/ui-dist/assets/{index-CtFA44ZZ.js → index-DHcvu8nk.js} +1 -1
  210. package/ui-dist/assets/{index-CuP2P51w.js → index-DSz4Tjbh.js} +1 -1
  211. package/ui-dist/assets/{index-Bi7KPtJ3.js → index-DgNZ8Oto.js} +1 -1
  212. package/ui-dist/assets/{index-C2DKaTLo.js → index-Drmy6GaQ.js} +1 -1
  213. package/ui-dist/assets/{index-CbEMZXO1.js → index-DvrowL98.js} +1 -1
  214. package/ui-dist/assets/{index-CY1CWc3h.js → index-DxHCQu-4.js} +1 -1
  215. package/ui-dist/assets/{index-s8ZAOPE2.js → index-IJhIHwGp.js} +641 -641
  216. package/ui-dist/assets/{infoDiagram-FWYZ7A6U-Cun6yrS9.js → infoDiagram-FWYZ7A6U-BJ7smuOx.js} +1 -1
  217. package/ui-dist/assets/{ishikawaDiagram-FXEZZL3T-SHuCvm_3.js → ishikawaDiagram-FXEZZL3T-Bn7jPYRy.js} +1 -1
  218. package/ui-dist/assets/{journeyDiagram-5HDEW3XC-B2oa-ovF.js → journeyDiagram-5HDEW3XC-D5NYECBN.js} +1 -1
  219. package/ui-dist/assets/{kanban-definition-HUTT4EX6-DtG3RFW0.js → kanban-definition-HUTT4EX6-CcrYvDYt.js} +1 -1
  220. package/ui-dist/assets/{layout-DmSY_WKW.js → layout-32M7EWAw.js} +1 -1
  221. package/ui-dist/assets/{linear-BiklTv-9.js → linear-DT9kJUfH.js} +1 -1
  222. package/ui-dist/assets/{map-B3RAMPoy.js → map-C2crE4Bv.js} +1 -1
  223. package/ui-dist/assets/{mermaid.core-CQj0CvWy.js → mermaid.core-B9y8ebhy.js} +4 -4
  224. package/ui-dist/assets/{mindmap-definition-LN4V7U3C-BQrncLdk.js → mindmap-definition-LN4V7U3C-CaFsY4LT.js} +1 -1
  225. package/ui-dist/assets/{pegDiagram-2B236MQR-BmkmBhyS.js → pegDiagram-2B236MQR-BMTtqHzV.js} +1 -1
  226. package/ui-dist/assets/{pieDiagram-ENE6RG2P-B0dWJser.js → pieDiagram-ENE6RG2P-DRl32AMI.js} +1 -1
  227. package/ui-dist/assets/{quadrantDiagram-ABIIQ3AL-RS2o06NX.js → quadrantDiagram-ABIIQ3AL-pXeC4qE5.js} +1 -1
  228. package/ui-dist/assets/{railroadDiagram-RFXS5EU6-B4dlWUnB.js → railroadDiagram-RFXS5EU6-tGzWZNPI.js} +1 -1
  229. package/ui-dist/assets/{requirementDiagram-TGXJPOKE-7M1vICZA.js → requirementDiagram-TGXJPOKE-DEqEN1a0.js} +1 -1
  230. package/ui-dist/assets/{sankeyDiagram-HTMAVEWB-LUpZrugG.js → sankeyDiagram-HTMAVEWB-DjVDCNO4.js} +1 -1
  231. package/ui-dist/assets/{sequenceDiagram-DBY2YBRQ-DB4ecUEg.js → sequenceDiagram-DBY2YBRQ-CRKMhKhd.js} +1 -1
  232. package/ui-dist/assets/{sizeCapture-X5ZJPWSS-CgLQGkEa.js → sizeCapture-X5ZJPWSS-CWl0gYed.js} +1 -1
  233. package/ui-dist/assets/{stateDiagram-2N3HPSRC-BxLcsZg0.js → stateDiagram-2N3HPSRC-BH6FVEBD.js} +1 -1
  234. package/ui-dist/assets/stateDiagram-v2-6OUMAXLB-DFWkP3y3.js +1 -0
  235. package/ui-dist/assets/{swimlanes-5IMT3BWC-CFoyzQNM.js → swimlanes-5IMT3BWC-BZdn1cQ5.js} +2 -2
  236. package/ui-dist/assets/swimlanesDiagram-G3AALYLV-BwA91U1K.js +8 -0
  237. package/ui-dist/assets/{timeline-definition-FHXFAJF6-C1vajCzY.js → timeline-definition-FHXFAJF6-CMofE9DN.js} +1 -1
  238. package/ui-dist/assets/{vennDiagram-L72KCM5P-C42rETOq.js → vennDiagram-L72KCM5P-CszussGd.js} +1 -1
  239. package/ui-dist/assets/{wardleyDiagram-EHGQE667-BgzD6-QL.js → wardleyDiagram-EHGQE667-C1Op8a5q.js} +1 -1
  240. package/ui-dist/assets/{xterm-BeBaISmm.js → xterm-BM41mI-I.js} +1 -1
  241. package/ui-dist/assets/{xychartDiagram-FW5EYKEG-BdoJT_55.js → xychartDiagram-FW5EYKEG-zi-IHNrX.js} +1 -1
  242. package/ui-dist/index.html +11 -7
  243. package/ui-dist/assets/channel-C3jj6nd_.js +0 -1
  244. package/ui-dist/assets/classDiagram-OUVF2IWQ-CNsW5NoJ.js +0 -1
  245. package/ui-dist/assets/classDiagram-v2-EOCWNBFH-CNsW5NoJ.js +0 -1
  246. package/ui-dist/assets/index-CYaeM_68.css +0 -32
  247. package/ui-dist/assets/stateDiagram-v2-6OUMAXLB-DAlIlXqa.js +0 -1
  248. package/ui-dist/assets/swimlanesDiagram-G3AALYLV-DXfnihCA.js +0 -8
@@ -1,4 +1,4 @@
1
- import { addChatMessageSchema, chatClientCheckpointSchema, chatInlineAnnotationsFromStructuredPayload, convertChatToIssueSchema, createChatAttachmentMetadataSchema, createChatContextLinkSchema, createChatFirstTurnSchema, resolveChatOperationProposalSchema, setChatProjectContextSchema, stopChatGenerationSchema, } from "@rudderhq/shared";
1
+ import { addChatMessageSchema, chatClientCheckpointSchema, chatInlineAnnotationsFromStructuredPayload, convertChatToIssueSchema, createChatAttachmentMetadataSchema, createChatContextLinkSchema, createChatFirstTurnSchema, resolveChatOperationProposalSchema, setChatProjectContextSchema, } from "@rudderhq/shared";
2
2
  import { coalesceChatTranscriptTextEntries, withChatTranscriptGenerationProvenance, } from "@rudderhq/shared/chat-transcript-provenance";
3
3
  import multer from "multer";
4
4
  import { randomUUID } from "node:crypto";
@@ -8,14 +8,15 @@ import { logger } from "../middleware/logger.js";
8
8
  import { validate } from "../middleware/validate.js";
9
9
  import { chatAssistantErrorForLog } from "../services/chat-assistant.helpers.js";
10
10
  import { CHAT_ASSISTANT_USER_ERROR_MESSAGE, ChatAssistantStreamError, userVisiblePartialBodyFromError } from "../services/chat-assistant.js";
11
- import { cancelActiveChatGeneration, claimChatGeneration, createChatRuntimeControlCoordinator, getActiveChatGeneration, setActiveChatGenerationId, } from "../services/chat-generation-locks.js";
11
+ import { claimChatGeneration, createChatRuntimeControlCoordinator, getActiveChatGeneration, setActiveChatGenerationId, } from "../services/chat-generation-locks.js";
12
12
  import { hashChatGenerationBody } from "../services/chat-generation-protocol.js";
13
- import { chatMessageMutationFingerprint } from "../services/chat-message-mutation-fingerprint.js";
13
+ import { replayChatStreamMessage } from "../services/chat-message-mutation-fingerprint.js";
14
14
  import { logActivity } from "../services/index.js";
15
15
  import { assertCompanyAccess, getActorInfo } from "./authz.js";
16
16
  import { wakeIssueAssigneeAfterChatConversion } from "./chat-issue-assignment-wakeup.js";
17
17
  import { chatRuntimeSnapshot } from "./chats.runtime-controls.js";
18
- import { CHAT_ASSISTANT_RECOVERABLE_FAILURE_FALLBACK_MESSAGE, CHAT_ASSISTANT_STOPPED_FALLBACK_MESSAGE, createChatStreamFileStaging, createStartingChatGenerationGate, normalizeMultipartFirstTurnBody, normalizeMultipartMessageBody, outputAdmissionClosed, resolveStoppedAssistantState, startingChatGenerationGates, withMergedChatMessageAttachments, } from "./chats.stream-support.js";
18
+ import { registerChatStopRoute } from "./chats.stop-route.js";
19
+ import { CHAT_ASSISTANT_RECOVERABLE_FAILURE_FALLBACK_MESSAGE, CHAT_ASSISTANT_STOPPED_FALLBACK_MESSAGE, createChatStreamFileStaging, createStartingChatGenerationGate, normalizeMultipartFirstTurnBody, normalizeMultipartMessageBody, outputAdmissionClosed, persistChatStreamUserMessageBeforeGeneration, resolveStoppedAssistantState, startingChatGenerationGates, withMergedChatMessageAttachments, } from "./chats.stream-support.js";
19
20
  import { registerChatUserStateRoutes } from "./chats.user-state-routes.js";
20
21
  export function registerChatStreamRoutes(ctx) {
21
22
  const { router, db, storage, svc, assistantSvc, agentsSvc, issuesSvc, projectsSvc, goalsSvc, access, operatorProfiles, heartbeat, assertConversationAccess, assertChatLocalMutationAllowed, assertSideChatMutationAllowed, touchSideChat, boardUserId, assertCanAssignTasks, runSingleFileUpload, runMessageFileUpload, isMultipartRequest, uploadedMessageFiles, validateUploadedMessageFiles, preflightChatDraft, logChatMessagesAdded, assertContextLinksBelongToCompany, turnContextFromUserMessage, addUserMessage, inlineAnnotations, storeUserMessageFiles, cleanupStoredUserMessageFiles, storeQueuedAnnotationFiles, cleanupUncommittedQueuedAnnotationFiles, startChatTitleGeneration, attachFilesToUserMessage, loadAssistantInput, chatReplyingAgentId, assertCanConvertIssueProposal, persistAssistantReply, linkChatRunMessages, attachGeneratedFilesToPartialMessage, persistPartialAssistantMessage, recoverableFailurePayload, recoverableFailureBody, writeStreamEvent, queueRequestActor, wakeServerQueue, wakeTerminalProjector, } = ctx;
@@ -77,39 +78,24 @@ export function registerChatStreamRoutes(ctx) {
77
78
  return;
78
79
  }
79
80
  const clientMutationId = parsedBody.data.clientMutationId ?? null;
80
- const clientMutationFingerprint = clientMutationId
81
- ? chatMessageMutationFingerprint({
82
- body: parsedBody.data.body,
83
- editUserMessageId: parsedBody.data.editUserMessageId ?? null,
84
- inlineAnnotationsProvided,
85
- inlineAnnotations: parsedBody.data.inlineAnnotations,
86
- modelOverride: parsedBody.data.modelOverride ?? null,
87
- effortOverride: parsedBody.data.effortOverride ?? null,
88
- files: messageFiles,
89
- })
90
- : null;
91
- if (!atomicFirstTurn && clientMutationId) {
92
- const replayedMutation = await svc.getUserMessageMutationByClientMutationId(conversation.orgId, conversation.id, clientMutationId);
93
- if (replayedMutation) {
94
- const replayedUserMessage = replayedMutation.message;
95
- if (replayedUserMessage.body !== parsedBody.data.body
96
- || (replayedMutation.fingerprint !== null
97
- && replayedMutation.fingerprint !== clientMutationFingerprint)) {
98
- throw conflict("Chat mutation key was already used for different content");
99
- }
100
- res.status(200);
101
- res.setHeader("Content-Type", "application/x-ndjson; charset=utf-8");
102
- res.setHeader("Cache-Control", "no-cache, no-transform");
103
- res.setHeader("X-Accel-Buffering", "no");
104
- writeStreamEvent(res, {
105
- type: "ack",
106
- userMessage: replayedUserMessage,
107
- });
108
- writeStreamEvent(res, { type: "final", messages: [] });
109
- res.end();
110
- return;
111
- }
112
- }
81
+ const clientMutationFingerprint = await replayChatStreamMessage({
82
+ atomicFirstTurn: Boolean(atomicFirstTurn),
83
+ clientMutationId,
84
+ body: parsedBody.data.body,
85
+ editUserMessageId: parsedBody.data.editUserMessageId,
86
+ inlineAnnotationsProvided,
87
+ inlineAnnotations: parsedBody.data.inlineAnnotations,
88
+ modelOverride: parsedBody.data.modelOverride,
89
+ effortOverride: parsedBody.data.effortOverride,
90
+ files: messageFiles,
91
+ orgId: conversation.orgId,
92
+ conversationId: conversation.id,
93
+ lookup: svc.getUserMessageMutationByClientMutationId,
94
+ response: res,
95
+ writeStreamEvent,
96
+ });
97
+ if (clientMutationFingerprint === undefined)
98
+ return;
113
99
  const preparedAnnotations = !atomicFirstTurn && inlineAnnotationsProvided
114
100
  ? await inlineAnnotations.prepare({
115
101
  orgId: conversation.orgId,
@@ -252,94 +238,45 @@ export function registerChatStreamRoutes(ctx) {
252
238
  }
253
239
  const startupGate = createStartingChatGenerationGate();
254
240
  startingChatGenerationGates.set(conversation.id, startupGate);
255
- let persistedUserMessage = atomicFirstTurn?.userMessage ?? null;
256
- let userMessagePersisted = Boolean(atomicFirstTurn);
257
- let committedUserMessageId = atomicFirstTurn?.userMessage.id ?? null;
258
- if (queuedMessageId) {
259
- try {
260
- await svc.assertQueuedMessageClaimedForDelivery({
261
- conversationId: conversation.id,
262
- itemId: queuedMessageId,
263
- body: parsedBody.data.body,
264
- });
265
- }
266
- catch (error) {
267
- startupGate.resolveGeneration(null);
268
- startingChatGenerationGates.delete(conversation.id);
269
- releaseGeneration();
270
- await stagedMessageFiles.cleanup();
271
- logger.warn({
272
- err: chatAssistantErrorForLog(error),
273
- conversationId: conversation.id,
274
- }, "chat user-message persistence failed before generation");
275
- res.status(201);
276
- res.setHeader("Content-Type", "application/x-ndjson; charset=utf-8");
277
- res.setHeader("Cache-Control", "no-cache, no-transform");
278
- res.setHeader("X-Accel-Buffering", "no");
279
- writeStreamEvent(res, {
280
- type: "error",
281
- error: CHAT_ASSISTANT_USER_ERROR_MESSAGE,
282
- messageId: committedUserMessageId,
283
- });
284
- res.end();
285
- return;
286
- }
241
+ const messagePersistence = await persistChatStreamUserMessageBeforeGeneration({
242
+ atomicFirstTurn,
243
+ queuedMessageId,
244
+ conversation: conversation,
245
+ body: parsedBody.data.body,
246
+ editUserMessageId: parsedBody.data.editUserMessageId ?? null,
247
+ preparedAnnotations,
248
+ inlineAnnotationsProvided,
249
+ clientMutationId,
250
+ clientMutationFingerprint,
251
+ svc,
252
+ addUserMessage,
253
+ actor,
254
+ startupGate,
255
+ releaseGeneration,
256
+ stagedMessageFiles,
257
+ });
258
+ if (messagePersistence.kind === "error") {
259
+ logger.warn({ err: chatAssistantErrorForLog(messagePersistence.error), conversationId: conversation.id }, "chat user-message persistence failed before generation");
260
+ res.status(201);
261
+ res.setHeader("Content-Type", "application/x-ndjson; charset=utf-8");
262
+ res.setHeader("Cache-Control", "no-cache, no-transform");
263
+ res.setHeader("X-Accel-Buffering", "no");
264
+ writeStreamEvent(res, { type: "error", error: CHAT_ASSISTANT_USER_ERROR_MESSAGE, messageId: messagePersistence.messageId });
265
+ res.end();
266
+ return;
287
267
  }
288
- if (!atomicFirstTurn) {
289
- try {
290
- const persistence = await addUserMessage(conversation, parsedBody.data.body, actor, parsedBody.data.editUserMessageId ?? null, {
291
- provided: inlineAnnotationsProvided,
292
- prepared: preparedAnnotations,
293
- storedAttachments: stagedMessageFiles.files,
294
- onPersisted: (messageId) => {
295
- userMessagePersisted = true;
296
- committedUserMessageId = messageId;
297
- stagedMessageFiles.markCommitted();
298
- },
299
- clientMutationId,
300
- clientMutationFingerprint,
301
- });
302
- persistedUserMessage = persistence.message;
303
- if (!persistence.accepted) {
304
- startupGate.resolveGeneration(null);
305
- startingChatGenerationGates.delete(conversation.id);
306
- releaseGeneration();
307
- await stagedMessageFiles.cleanup();
308
- res.status(200);
309
- res.setHeader("Content-Type", "application/x-ndjson; charset=utf-8");
310
- res.setHeader("Cache-Control", "no-cache, no-transform");
311
- res.setHeader("X-Accel-Buffering", "no");
312
- writeStreamEvent(res, { type: "ack", userMessage: persistence.message });
313
- writeStreamEvent(res, { type: "final", messages: [] });
314
- res.end();
315
- return;
316
- }
317
- userMessagePersisted = true;
318
- committedUserMessageId = persistence.message.id;
319
- stagedMessageFiles.markCommitted();
320
- }
321
- catch (error) {
322
- startupGate.resolveGeneration(null);
323
- startingChatGenerationGates.delete(conversation.id);
324
- releaseGeneration();
325
- await stagedMessageFiles.cleanup();
326
- logger.warn({
327
- err: chatAssistantErrorForLog(error),
328
- conversationId: conversation.id,
329
- }, "chat user-message persistence failed before generation");
330
- res.status(201);
331
- res.setHeader("Content-Type", "application/x-ndjson; charset=utf-8");
332
- res.setHeader("Cache-Control", "no-cache, no-transform");
333
- res.setHeader("X-Accel-Buffering", "no");
334
- writeStreamEvent(res, {
335
- type: "error",
336
- error: CHAT_ASSISTANT_USER_ERROR_MESSAGE,
337
- messageId: committedUserMessageId,
338
- });
339
- res.end();
340
- return;
341
- }
268
+ if (messagePersistence.kind === "replayed") {
269
+ res.status(200);
270
+ res.setHeader("Content-Type", "application/x-ndjson; charset=utf-8");
271
+ res.setHeader("Cache-Control", "no-cache, no-transform");
272
+ res.setHeader("X-Accel-Buffering", "no");
273
+ writeStreamEvent(res, { type: "ack", userMessage: messagePersistence.message });
274
+ writeStreamEvent(res, { type: "final", messages: [] });
275
+ res.end();
276
+ return;
342
277
  }
278
+ let { userMessagePersisted, committedUserMessageId } = messagePersistence;
279
+ const persistedUserMessage = messagePersistence.userMessage;
343
280
  let generation = null;
344
281
  try {
345
282
  const createdGeneration = await svc.createGeneration(conversation.orgId, conversation.id);
@@ -352,42 +289,39 @@ export function registerChatStreamRoutes(ctx) {
352
289
  startingChatGenerationGates.delete(conversation.id);
353
290
  releaseGeneration();
354
291
  await stagedMessageFiles.cleanup();
355
- if (atomicFirstTurn) {
356
- const failurePayload = recoverableFailurePayload(error, null);
357
- const failureBody = recoverableFailureBody(failurePayload) || CHAT_ASSISTANT_RECOVERABLE_FAILURE_FALLBACK_MESSAGE;
358
- const failedMessage = await svc.addMessage(conversation.id, {
359
- orgId: conversation.orgId,
360
- role: "assistant",
361
- kind: "message",
362
- status: "failed",
363
- body: failureBody,
364
- structuredPayload: failurePayload,
365
- replyingAgentId: conversation.preferredAgentId,
366
- chatTurnId: atomicFirstTurn.userMessage.chatTurnId,
367
- });
368
- await logChatMessagesAdded(conversation, [failedMessage], {
369
- actorType: "system",
370
- actorId: "chat-assistant",
371
- agentId: conversation.preferredAgentId,
372
- });
373
- res.status(201);
374
- res.setHeader("Content-Type", "application/x-ndjson; charset=utf-8");
375
- res.setHeader("Cache-Control", "no-cache, no-transform");
376
- res.setHeader("X-Accel-Buffering", "no");
377
- writeStreamEvent(res, {
378
- type: "ack",
379
- conversation: atomicFirstTurn.conversation,
380
- userMessage: atomicFirstTurn.userMessage,
381
- });
382
- writeStreamEvent(res, {
383
- type: "error",
384
- error: failureBody,
385
- messageId: failedMessage.id,
386
- });
387
- res.end();
388
- return;
389
- }
390
- throw error;
292
+ const failurePayload = recoverableFailurePayload(error, null);
293
+ const failureBody = recoverableFailureBody(failurePayload) || CHAT_ASSISTANT_RECOVERABLE_FAILURE_FALLBACK_MESSAGE;
294
+ const failedMessage = await svc.addMessage(conversation.id, {
295
+ orgId: conversation.orgId,
296
+ role: "assistant",
297
+ kind: "message",
298
+ status: "failed",
299
+ body: failureBody,
300
+ structuredPayload: failurePayload,
301
+ replyingAgentId: conversation.preferredAgentId,
302
+ chatTurnId: persistedUserMessage.chatTurnId,
303
+ });
304
+ await logChatMessagesAdded(conversation, [failedMessage], {
305
+ actorType: "system",
306
+ actorId: "chat-assistant",
307
+ agentId: conversation.preferredAgentId,
308
+ });
309
+ res.status(201);
310
+ res.setHeader("Content-Type", "application/x-ndjson; charset=utf-8");
311
+ res.setHeader("Cache-Control", "no-cache, no-transform");
312
+ res.setHeader("X-Accel-Buffering", "no");
313
+ writeStreamEvent(res, {
314
+ type: "ack",
315
+ ...(atomicFirstTurn ? { conversation: atomicFirstTurn.conversation } : {}),
316
+ userMessage: persistedUserMessage,
317
+ });
318
+ writeStreamEvent(res, {
319
+ type: "error",
320
+ error: failureBody,
321
+ messageId: failedMessage.id,
322
+ });
323
+ res.end();
324
+ return;
391
325
  }
392
326
  if (abortController.signal.aborted && startupGate.stopRequested) {
393
327
  await startupGate.stopApplied;
@@ -1061,237 +995,7 @@ export function registerChatStreamRoutes(ctx) {
1061
995
  advanced: checkpoint.advanced,
1062
996
  });
1063
997
  });
1064
- router.post("/chats/:id/messages/stream/stop", async (req, res) => {
1065
- const parsed = stopChatGenerationSchema.safeParse(req.body ?? {});
1066
- if (!parsed.success) {
1067
- res.status(400).json({ error: "Invalid chat Stop request", details: parsed.error.issues });
1068
- return;
1069
- }
1070
- const conversation = await assertConversationAccess(req, req.params.id);
1071
- if (!conversation) {
1072
- res.status(404).json({ error: "Chat conversation not found" });
1073
- return;
1074
- }
1075
- assertChatLocalMutationAllowed(conversation);
1076
- await assertSideChatMutationAllowed(req, conversation);
1077
- const controlActionId = parsed.data.controlActionId ?? randomUUID();
1078
- const startupGate = startingChatGenerationGates.get(conversation.id) ?? null;
1079
- let startupStopRequested = false;
1080
- let startupInterruptRequested = false;
1081
- try {
1082
- let active = getActiveChatGeneration(conversation.id);
1083
- if (active && !active.generationId && startupGate) {
1084
- startupStopRequested = true;
1085
- startupGate.stopRequested = true;
1086
- startupInterruptRequested = cancelActiveChatGeneration(conversation.id);
1087
- const startupGenerationId = await startupGate.generationReady;
1088
- active = startupGenerationId ? getActiveChatGeneration(conversation.id) : null;
1089
- if (!startupGenerationId) {
1090
- res.json({
1091
- stopped: startupInterruptRequested,
1092
- controlActionId,
1093
- generationId: null,
1094
- disposition: startupInterruptRequested ? "startup_cancelled" : "interrupted_unverified",
1095
- });
1096
- return;
1097
- }
1098
- }
1099
- const latestActiveGeneration = active?.generationId
1100
- ? null
1101
- : await svc.getLatestActiveGeneration(conversation.id);
1102
- const generationId = parsed.data.expectedGenerationId
1103
- ?? active?.generationId
1104
- ?? latestActiveGeneration?.id
1105
- ?? null;
1106
- if (!generationId) {
1107
- res.json({
1108
- stopped: false,
1109
- controlActionId,
1110
- generationId: null,
1111
- disposition: "no_active_generation",
1112
- });
1113
- return;
1114
- }
1115
- let durableCheckpoint = await svc.generationProtocol.getLatestVisibleCheckpoint({
1116
- orgId: conversation.orgId,
1117
- conversationId: conversation.id,
1118
- generationId,
1119
- });
1120
- if (durableCheckpoint.generation.runtimeTerminalAt && !parsed.data.controlActionId) {
1121
- wakeTerminalProjector();
1122
- res.json({
1123
- stopped: false,
1124
- controlActionId,
1125
- generationId,
1126
- disposition: "no_active_generation",
1127
- });
1128
- return;
1129
- }
1130
- const expectedAttemptEpoch = parsed.data.expectedAttemptEpoch
1131
- ?? durableCheckpoint.generation.attemptEpoch;
1132
- const requestedControlVersion = parsed.data.expectedControlVersion
1133
- ?? durableCheckpoint.generation.controlVersion;
1134
- const requestedRenderSeq = parsed.data.lastCommittedRenderSeq
1135
- ?? durableCheckpoint.generationSeq;
1136
- const requestedBodyHash = parsed.data.renderedBodyHash
1137
- ?? durableCheckpoint.bodyHash;
1138
- let stop = null;
1139
- for (let attempt = 0; attempt < 2 && !stop; attempt += 1) {
1140
- try {
1141
- stop = await svc.generationProtocol.beginStopAction({
1142
- orgId: conversation.orgId,
1143
- conversationId: conversation.id,
1144
- controlActionId,
1145
- expectedGenerationId: generationId,
1146
- expectedAttemptEpoch,
1147
- expectedControlVersion: requestedControlVersion,
1148
- admissionControlVersion: attempt === 0
1149
- ? requestedControlVersion
1150
- : durableCheckpoint.generation.controlVersion,
1151
- requestedRenderSeq,
1152
- requestedBodyHash,
1153
- });
1154
- }
1155
- catch (error) {
1156
- const status = error && typeof error === "object" && "status" in error
1157
- ? Number(error.status)
1158
- : null;
1159
- if (attempt > 0 || status !== 409)
1160
- throw error;
1161
- durableCheckpoint = await svc.generationProtocol.getLatestVisibleCheckpoint({
1162
- orgId: conversation.orgId,
1163
- conversationId: conversation.id,
1164
- generationId,
1165
- });
1166
- if (durableCheckpoint.generation.runtimeTerminalAt && !parsed.data.controlActionId) {
1167
- wakeTerminalProjector();
1168
- res.json({
1169
- stopped: false,
1170
- controlActionId,
1171
- generationId,
1172
- disposition: "no_active_generation",
1173
- });
1174
- return;
1175
- }
1176
- if (durableCheckpoint.generation.attemptEpoch !== expectedAttemptEpoch)
1177
- throw error;
1178
- }
1179
- }
1180
- if (!stop)
1181
- throw new Error("Failed to establish the chat Stop cutoff");
1182
- const wasWaitingForNetwork = durableCheckpoint.generation.status === "waiting_for_network";
1183
- if (stop.idempotent
1184
- && parsed.data.expectedControlVersion !== undefined
1185
- && stop.action.expectedControlVersion !== parsed.data.expectedControlVersion) {
1186
- throw conflict("Control action id was already used for a different Stop request");
1187
- }
1188
- if (stop.outcome === "completion_committed") {
1189
- res.json({
1190
- stopped: false,
1191
- controlActionId,
1192
- generationId,
1193
- disposition: "completion_committed",
1194
- });
1195
- return;
1196
- }
1197
- if (stop.outcome === "already_terminal") {
1198
- const alreadyStopped = stop.generation.status === "stopped"
1199
- || stop.action.localDisposition === "stopped";
1200
- wakeTerminalProjector();
1201
- res.json({
1202
- stopped: alreadyStopped,
1203
- controlActionId,
1204
- generationId,
1205
- disposition: alreadyStopped ? "stopped" : "no_active_generation",
1206
- acceptedThroughSeq: stop.action.acceptedThroughSeq,
1207
- frozenBodyHash: stop.action.frozenBodyHash,
1208
- });
1209
- return;
1210
- }
1211
- if (stop.outcome === "stop_in_progress" && !stop.generation.runtimeTerminalAt) {
1212
- const localInterruptRequested = startupInterruptRequested || cancelActiveChatGeneration(conversation.id);
1213
- res.json({
1214
- stopped: Boolean(localInterruptRequested),
1215
- controlActionId,
1216
- generationId,
1217
- disposition: "stopping",
1218
- acceptedThroughSeq: stop.action.acceptedThroughSeq,
1219
- frozenBodyHash: stop.action.frozenBodyHash,
1220
- });
1221
- return;
1222
- }
1223
- if (stop.idempotent && stop.generation.runtimeTerminalAt) {
1224
- const terminalDisposition = stop.generation.status === "stopped"
1225
- || stop.action.localDisposition === "stopped"
1226
- ? "stopped"
1227
- : "stopping";
1228
- wakeTerminalProjector();
1229
- res.json({
1230
- stopped: true,
1231
- controlActionId,
1232
- generationId,
1233
- disposition: terminalDisposition,
1234
- acceptedThroughSeq: stop.action.acceptedThroughSeq,
1235
- frozenBodyHash: stop.action.frozenBodyHash,
1236
- });
1237
- return;
1238
- }
1239
- const localInterruptRequested = startupInterruptRequested || cancelActiveChatGeneration(conversation.id);
1240
- let stopped = Boolean(localInterruptRequested);
1241
- let disposition = "stopping";
1242
- if (startupStopRequested) {
1243
- await svc.generationProtocol.recordRuntimeTerminal({
1244
- orgId: conversation.orgId,
1245
- conversationId: conversation.id,
1246
- generationId,
1247
- expectedAttemptEpoch: stop.generation.attemptEpoch,
1248
- finalStatus: "stopped",
1249
- terminalReason: "operator_stop",
1250
- controlActionId,
1251
- });
1252
- wakeTerminalProjector();
1253
- }
1254
- else if (wasWaitingForNetwork) {
1255
- stopped = true;
1256
- disposition = "stopped";
1257
- await svc.generationProtocol.recordRuntimeTerminal({
1258
- orgId: conversation.orgId,
1259
- conversationId: conversation.id,
1260
- generationId,
1261
- expectedAttemptEpoch: stop.generation.attemptEpoch,
1262
- finalStatus: "stopped",
1263
- terminalReason: "operator_stop",
1264
- controlActionId,
1265
- });
1266
- wakeTerminalProjector();
1267
- }
1268
- else if (!localInterruptRequested) {
1269
- disposition = "interrupted_unverified";
1270
- await svc.generationProtocol.recordRuntimeTerminal({
1271
- orgId: conversation.orgId,
1272
- conversationId: conversation.id,
1273
- generationId,
1274
- expectedAttemptEpoch: stop.generation.attemptEpoch,
1275
- finalStatus: "interrupted_unverified",
1276
- terminalReason: "stop_without_local_runtime_owner",
1277
- controlActionId,
1278
- });
1279
- wakeTerminalProjector();
1280
- }
1281
- res.json({
1282
- stopped,
1283
- controlActionId,
1284
- generationId,
1285
- disposition,
1286
- acceptedThroughSeq: stop.action.acceptedThroughSeq,
1287
- frozenBodyHash: stop.action.frozenBodyHash,
1288
- });
1289
- }
1290
- finally {
1291
- if (startupStopRequested)
1292
- startupGate?.resolveStopApplied();
1293
- }
1294
- });
998
+ registerChatStopRoute(ctx);
1295
999
  router.post("/orgs/:orgId/chats/:chatId/attachments", async (req, res) => {
1296
1000
  const orgId = req.params.orgId;
1297
1001
  const chatId = req.params.chatId;