@rudderhq/server 0.7.11 → 0.7.12

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 (255) hide show
  1. package/dist/bootstrap/register-api-routes.d.ts.map +1 -1
  2. package/dist/bootstrap/register-api-routes.js +1 -1
  3. package/dist/bootstrap/register-api-routes.js.map +1 -1
  4. package/dist/bootstrap/types.d.ts +7 -0
  5. package/dist/bootstrap/types.d.ts.map +1 -1
  6. package/dist/index.js +18 -3
  7. package/dist/index.js.map +1 -1
  8. package/dist/routes/agents.management-routes.d.ts.map +1 -1
  9. package/dist/routes/agents.management-routes.js +2 -0
  10. package/dist/routes/agents.management-routes.js.map +1 -1
  11. package/dist/routes/chats.d.ts +2 -1
  12. package/dist/routes/chats.d.ts.map +1 -1
  13. package/dist/routes/chats.js +334 -4
  14. package/dist/routes/chats.js.map +1 -1
  15. package/dist/routes/chats.stream-routes.d.ts.map +1 -1
  16. package/dist/routes/chats.stream-routes.js +55 -3
  17. package/dist/routes/chats.stream-routes.js.map +1 -1
  18. package/dist/routes/goals.d.ts.map +1 -1
  19. package/dist/routes/goals.js +10 -3
  20. package/dist/routes/goals.js.map +1 -1
  21. package/dist/routes/orgs.d.ts.map +1 -1
  22. package/dist/routes/orgs.js +22 -1
  23. package/dist/routes/orgs.js.map +1 -1
  24. package/dist/routes/run-intelligence.d.ts.map +1 -1
  25. package/dist/routes/run-intelligence.js +9 -0
  26. package/dist/routes/run-intelligence.js.map +1 -1
  27. package/dist/services/agent-instructions.d.ts +1 -0
  28. package/dist/services/agent-instructions.d.ts.map +1 -1
  29. package/dist/services/agent-instructions.js +124 -6
  30. package/dist/services/agent-instructions.js.map +1 -1
  31. package/dist/services/agent-run-context.d.ts.map +1 -1
  32. package/dist/services/agent-run-context.js +15 -0
  33. package/dist/services/agent-run-context.js.map +1 -1
  34. package/dist/services/agent-startup-context.d.ts +4 -0
  35. package/dist/services/agent-startup-context.d.ts.map +1 -1
  36. package/dist/services/agent-startup-context.js +57 -13
  37. package/dist/services/agent-startup-context.js.map +1 -1
  38. package/dist/services/agents.d.ts +218 -0
  39. package/dist/services/agents.d.ts.map +1 -1
  40. package/dist/services/automations.d.ts.map +1 -1
  41. package/dist/services/automations.js +3 -0
  42. package/dist/services/automations.js.map +1 -1
  43. package/dist/services/chat-agent-runs.d.ts +47 -1
  44. package/dist/services/chat-agent-runs.d.ts.map +1 -1
  45. package/dist/services/chat-agent-runs.js +91 -1
  46. package/dist/services/chat-agent-runs.js.map +1 -1
  47. package/dist/services/chat-assistant.d.ts.map +1 -1
  48. package/dist/services/chat-assistant.helpers.d.ts +12 -3
  49. package/dist/services/chat-assistant.helpers.d.ts.map +1 -1
  50. package/dist/services/chat-assistant.helpers.js +3 -0
  51. package/dist/services/chat-assistant.helpers.js.map +1 -1
  52. package/dist/services/chat-assistant.js +54 -18
  53. package/dist/services/chat-assistant.js.map +1 -1
  54. package/dist/services/chat-generation-protocol.d.ts +119 -0
  55. package/dist/services/chat-generation-protocol.d.ts.map +1 -1
  56. package/dist/services/chat-generation-protocol.js +65 -0
  57. package/dist/services/chat-generation-protocol.js.map +1 -1
  58. package/dist/services/chats.constants.d.ts +1 -1
  59. package/dist/services/chats.constants.d.ts.map +1 -1
  60. package/dist/services/chats.constants.js +1 -0
  61. package/dist/services/chats.constants.js.map +1 -1
  62. package/dist/services/chats.d.ts +128 -0
  63. package/dist/services/chats.d.ts.map +1 -1
  64. package/dist/services/chats.js +10 -0
  65. package/dist/services/chats.js.map +1 -1
  66. package/dist/services/goals.d.ts +36 -0
  67. package/dist/services/goals.d.ts.map +1 -1
  68. package/dist/services/goals.js +21 -1
  69. package/dist/services/goals.js.map +1 -1
  70. package/dist/services/heartbeat-run-reference.d.ts.map +1 -1
  71. package/dist/services/heartbeat-run-reference.js +11 -5
  72. package/dist/services/heartbeat-run-reference.js.map +1 -1
  73. package/dist/services/index.d.ts +2 -1
  74. package/dist/services/index.d.ts.map +1 -1
  75. package/dist/services/index.js +2 -1
  76. package/dist/services/index.js.map +1 -1
  77. package/dist/services/integrations/feishu/runtime.d.ts +8 -0
  78. package/dist/services/integrations/feishu/runtime.d.ts.map +1 -1
  79. package/dist/services/integrations/feishu/runtime.js +124 -1
  80. package/dist/services/integrations/feishu/runtime.js.map +1 -1
  81. package/dist/services/issues.d.ts.map +1 -1
  82. package/dist/services/issues.helpers.d.ts +8 -0
  83. package/dist/services/issues.helpers.d.ts.map +1 -1
  84. package/dist/services/issues.helpers.js +17 -1
  85. package/dist/services/issues.helpers.js.map +1 -1
  86. package/dist/services/issues.js +108 -15
  87. package/dist/services/issues.js.map +1 -1
  88. package/dist/services/messenger.d.ts.map +1 -1
  89. package/dist/services/messenger.js +12 -3
  90. package/dist/services/messenger.js.map +1 -1
  91. package/dist/services/organization-members.d.ts +27 -0
  92. package/dist/services/organization-members.d.ts.map +1 -0
  93. package/dist/services/organization-members.js +169 -0
  94. package/dist/services/organization-members.js.map +1 -0
  95. package/dist/services/organization-workspace-browser.d.ts.map +1 -1
  96. package/dist/services/organization-workspace-browser.js +44 -10
  97. package/dist/services/organization-workspace-browser.js.map +1 -1
  98. package/dist/services/product-intelligence.d.ts.map +1 -1
  99. package/dist/services/product-intelligence.js +4 -0
  100. package/dist/services/product-intelligence.js.map +1 -1
  101. package/dist/services/projects.d.ts +1 -4
  102. package/dist/services/projects.d.ts.map +1 -1
  103. package/dist/services/projects.js +27 -2
  104. package/dist/services/projects.js.map +1 -1
  105. package/dist/services/rudder-plugin-catalog.d.ts +1 -1
  106. package/dist/services/rudder-plugin-catalog.d.ts.map +1 -1
  107. package/dist/services/rudder-plugin-catalog.js +281 -15
  108. package/dist/services/rudder-plugin-catalog.js.map +1 -1
  109. package/dist/services/rudder-plugin-catalog.test.js +55 -0
  110. package/dist/services/rudder-plugin-catalog.test.js.map +1 -1
  111. package/dist/services/run-intelligence.d.ts.map +1 -1
  112. package/dist/services/run-intelligence.js +2 -1
  113. package/dist/services/run-intelligence.js.map +1 -1
  114. package/dist/services/run-log-store.d.ts +3 -0
  115. package/dist/services/run-log-store.d.ts.map +1 -1
  116. package/dist/services/run-log-store.js +124 -18
  117. package/dist/services/run-log-store.js.map +1 -1
  118. package/dist/services/runtime-kernel/assignment-run-guardrail.d.ts +2 -0
  119. package/dist/services/runtime-kernel/assignment-run-guardrail.d.ts.map +1 -1
  120. package/dist/services/runtime-kernel/assignment-run-guardrail.js +5 -3
  121. package/dist/services/runtime-kernel/assignment-run-guardrail.js.map +1 -1
  122. package/dist/services/runtime-kernel/assignment-run-guardrail.test.js +20 -0
  123. package/dist/services/runtime-kernel/assignment-run-guardrail.test.js.map +1 -1
  124. package/dist/services/runtime-kernel/heartbeat-attempt-ledger.d.ts +124 -0
  125. package/dist/services/runtime-kernel/heartbeat-attempt-ledger.d.ts.map +1 -0
  126. package/dist/services/runtime-kernel/heartbeat-attempt-ledger.js +108 -0
  127. package/dist/services/runtime-kernel/heartbeat-attempt-ledger.js.map +1 -0
  128. package/dist/services/runtime-kernel/heartbeat.core.d.ts +111 -0
  129. package/dist/services/runtime-kernel/heartbeat.core.d.ts.map +1 -1
  130. package/dist/services/runtime-kernel/heartbeat.core.js +13 -0
  131. package/dist/services/runtime-kernel/heartbeat.core.js.map +1 -1
  132. package/dist/services/runtime-kernel/heartbeat.d.ts +34 -0
  133. package/dist/services/runtime-kernel/heartbeat.d.ts.map +1 -1
  134. package/dist/services/runtime-kernel/heartbeat.execute.d.ts.map +1 -1
  135. package/dist/services/runtime-kernel/heartbeat.execute.js +229 -3
  136. package/dist/services/runtime-kernel/heartbeat.execute.js.map +1 -1
  137. package/dist/services/runtime-kernel/heartbeat.js +161 -6
  138. package/dist/services/runtime-kernel/heartbeat.js.map +1 -1
  139. package/dist/services/runtime-kernel/heartbeat.sessions.d.ts.map +1 -1
  140. package/dist/services/runtime-kernel/heartbeat.sessions.js +15 -3
  141. package/dist/services/runtime-kernel/heartbeat.sessions.js.map +1 -1
  142. package/dist/services/runtime-kernel/heartbeat.terminal.d.ts +48 -0
  143. package/dist/services/runtime-kernel/heartbeat.terminal.d.ts.map +1 -1
  144. package/dist/services/runtime-kernel/model-fallback.d.ts +4 -0
  145. package/dist/services/runtime-kernel/model-fallback.d.ts.map +1 -1
  146. package/dist/services/runtime-kernel/model-fallback.js +25 -4
  147. package/dist/services/runtime-kernel/model-fallback.js.map +1 -1
  148. package/dist/services/workspace-backup-v2.d.ts +20 -0
  149. package/dist/services/workspace-backup-v2.d.ts.map +1 -1
  150. package/dist/services/workspace-backup-v2.js +155 -23
  151. package/dist/services/workspace-backup-v2.js.map +1 -1
  152. package/dist/services/workspace-backup-v2.test.js +34 -2
  153. package/dist/services/workspace-backup-v2.test.js.map +1 -1
  154. package/dist/services/workspace-backups.d.ts +0 -1
  155. package/dist/services/workspace-backups.d.ts.map +1 -1
  156. package/dist/services/workspace-backups.js +18 -19
  157. package/dist/services/workspace-backups.js.map +1 -1
  158. package/dist/services/workspace-manifest-native.d.ts +10 -0
  159. package/dist/services/workspace-manifest-native.d.ts.map +1 -0
  160. package/dist/services/workspace-manifest-native.js +219 -0
  161. package/dist/services/workspace-manifest-native.js.map +1 -0
  162. package/dist/services/workspace-restore-reconciliation.d.ts +11 -0
  163. package/dist/services/workspace-restore-reconciliation.d.ts.map +1 -0
  164. package/dist/services/workspace-restore-reconciliation.js +165 -0
  165. package/dist/services/workspace-restore-reconciliation.js.map +1 -0
  166. package/package.json +14 -14
  167. package/resources/bundled-skills/rudder-docs/references/api-reference.md +8 -0
  168. package/resources/bundled-skills/rudder-docs/references/cli-reference.md +5 -2
  169. package/skills/rudder-docs/references/api-reference.md +8 -0
  170. package/skills/rudder-docs/references/cli-reference.md +5 -2
  171. package/ui-dist/assets/LibraryLiveSurface-tCWxJKp5.js +1 -0
  172. package/ui-dist/assets/{abnfDiagram-VRR7QNED-BggxrEZR.js → abnfDiagram-VRR7QNED-BcCms-hs.js} +1 -1
  173. package/ui-dist/assets/{addon-fit-Cc1gOtSX.js → addon-fit-CH3xNHN4.js} +1 -1
  174. package/ui-dist/assets/{arc-0kNrc9xt.js → arc-h5W-EkRK.js} +1 -1
  175. package/ui-dist/assets/{architectureDiagram-ZJ3FMSHR-BOCa-5ab.js → architectureDiagram-ZJ3FMSHR-Bdehm1PB.js} +1 -1
  176. package/ui-dist/assets/{blockDiagram-677ZJIJ3-CQU5jcsO.js → blockDiagram-677ZJIJ3-BJ3W91Su.js} +1 -1
  177. package/ui-dist/assets/{c4Diagram-LMCZKHZV-ChgWIw5O.js → c4Diagram-LMCZKHZV-Bnft_fRy.js} +1 -1
  178. package/ui-dist/assets/channel-G6qIOCiV.js +1 -0
  179. package/ui-dist/assets/{chunk-2Q5K7J3B-B4yrwesI.js → chunk-2Q5K7J3B-w1SF0tSk.js} +1 -1
  180. package/ui-dist/assets/{chunk-32BRIVSS-mhAeSMlR.js → chunk-32BRIVSS-C1UzXTFZ.js} +1 -1
  181. package/ui-dist/assets/{chunk-5VM5RSS4-BmS_u59G.js → chunk-5VM5RSS4-COVI3rNd.js} +1 -1
  182. package/ui-dist/assets/{chunk-EX3LRPZG-DXoTKkLG.js → chunk-EX3LRPZG-DxQOLy7z.js} +1 -1
  183. package/ui-dist/assets/{chunk-JWPE2WC7-Bj9myT03.js → chunk-JWPE2WC7-KTwmElcL.js} +1 -1
  184. package/ui-dist/assets/{chunk-MOJQB5TN-OAoJna8Y.js → chunk-MOJQB5TN-BynL4lzA.js} +1 -1
  185. package/ui-dist/assets/{chunk-RYQCIY6F-AGLA7TJn.js → chunk-RYQCIY6F-CJksBfuJ.js} +1 -1
  186. package/ui-dist/assets/{chunk-V7JOEXUC-YGM2tDK2.js → chunk-V7JOEXUC-C_zED5WJ.js} +1 -1
  187. package/ui-dist/assets/{chunk-VR4S4FIN-DqaZn9Ty.js → chunk-VR4S4FIN-BHDtMeiT.js} +1 -1
  188. package/ui-dist/assets/{chunk-XXDRQBXY-Cpqn_8Bl.js → chunk-XXDRQBXY-C0VvJgte.js} +1 -1
  189. package/ui-dist/assets/classDiagram-OUVF2IWQ-D15_PFCL.js +1 -0
  190. package/ui-dist/assets/classDiagram-v2-EOCWNBFH-D15_PFCL.js +1 -0
  191. package/ui-dist/assets/{cose-bilkent-JH36ORCC-BVe-X26w.js → cose-bilkent-JH36ORCC-DsTTzpP7.js} +1 -1
  192. package/ui-dist/assets/{cynefin-VYW2F7L2-DlDrrBWp.js → cynefin-VYW2F7L2-BfULw90s.js} +1 -1
  193. package/ui-dist/assets/{cynefinDiagram-TSTJHNR4-BSHvFeGh.js → cynefinDiagram-TSTJHNR4-BukSzKVC.js} +1 -1
  194. package/ui-dist/assets/{dagre-VKFMJZFB-tUm70k9h.js → dagre-VKFMJZFB-BbZY_Ipf.js} +1 -1
  195. package/ui-dist/assets/{diagram-FQU43EPY-C5kjITq7.js → diagram-FQU43EPY-BTYIYn2p.js} +1 -1
  196. package/ui-dist/assets/{diagram-G47NLZAW-BrbHgt8r.js → diagram-G47NLZAW-CikY_FKi.js} +1 -1
  197. package/ui-dist/assets/{diagram-NH7WQ7WH-DT7PdghT.js → diagram-NH7WQ7WH-BfZ7AlT8.js} +1 -1
  198. package/ui-dist/assets/{diagram-OA4YK3LP-wOjhRHRo.js → diagram-OA4YK3LP-f5AikxJj.js} +1 -1
  199. package/ui-dist/assets/{diagram-WEI45ONY-Dz9vtaDT.js → diagram-WEI45ONY-BCbG5yas.js} +1 -1
  200. package/ui-dist/assets/{ebnfDiagram-CCIWWBDH-BT5TzIA6.js → ebnfDiagram-CCIWWBDH-DT-3mJLY.js} +1 -1
  201. package/ui-dist/assets/{erDiagram-Q63AITRT-DLCpoOEP.js → erDiagram-Q63AITRT-BsfOhDfe.js} +1 -1
  202. package/ui-dist/assets/{flowDiagram-23GEKE2U-DfF2COjh.js → flowDiagram-23GEKE2U-BfaeQCsg.js} +1 -1
  203. package/ui-dist/assets/{ganttDiagram-NO4QXBWP-1d0KDwQs.js → ganttDiagram-NO4QXBWP-CgPQruVz.js} +1 -1
  204. package/ui-dist/assets/{gitGraphDiagram-IHSO6WYX-COLjS1ZR.js → gitGraphDiagram-IHSO6WYX-CNrBFzjY.js} +1 -1
  205. package/ui-dist/assets/{graph-B7fcgpw_.js → graph-QqDTzUUJ.js} +1 -1
  206. package/ui-dist/assets/{index-CZYXpHv4.js → index-2ZQZC89T.js} +1 -1
  207. package/ui-dist/assets/{index-COLwjKBR.js → index-2cYcOpZB.js} +1 -1
  208. package/ui-dist/assets/{index-CMNULCMJ.js → index-BAt16m_U.js} +1 -1
  209. package/ui-dist/assets/{index-BczgTMAn.js → index-BY8xCKIE.js} +1 -1
  210. package/ui-dist/assets/{index-CbqgXGcs.js → index-Befy20DN.js} +1 -1
  211. package/ui-dist/assets/{index-CgkYyYx9.js → index-BfAP3xNl.js} +1 -1
  212. package/ui-dist/assets/{index-DTc5LpTU.js → index-BogOyxlk.js} +1 -1
  213. package/ui-dist/assets/{index-DttnaNlV.js → index-BuIyK71w.js} +559 -559
  214. package/ui-dist/assets/{index-CH8I9acP.js → index-CQ92CxVC.js} +1 -1
  215. package/ui-dist/assets/{index-Denv6wuU.js → index-CQFwlD-o.js} +1 -1
  216. package/ui-dist/assets/{index-B6zSdXAR.js → index-Cu4qo_D7.js} +1 -1
  217. package/ui-dist/assets/index-DRuC5g8V.css +32 -0
  218. package/ui-dist/assets/{index-vtghjwab.js → index-DZ4gAeDM.js} +1 -1
  219. package/ui-dist/assets/{index-CTIfCQqR.js → index-Dc_DUpPj.js} +1 -1
  220. package/ui-dist/assets/{index-CXg1YCeI.js → index-Dqv46mWS.js} +1 -1
  221. package/ui-dist/assets/{index-D27Bbc-x.js → index-sFJMMyA3.js} +1 -1
  222. package/ui-dist/assets/{infoDiagram-FWYZ7A6U-Bg4YQUu2.js → infoDiagram-FWYZ7A6U-BJHuaNA9.js} +1 -1
  223. package/ui-dist/assets/{ishikawaDiagram-FXEZZL3T-BtgUVI_I.js → ishikawaDiagram-FXEZZL3T-CmsA1Knp.js} +1 -1
  224. package/ui-dist/assets/{journeyDiagram-5HDEW3XC-BGHGjvN4.js → journeyDiagram-5HDEW3XC-iV_Nt9d4.js} +1 -1
  225. package/ui-dist/assets/{kanban-definition-HUTT4EX6-DekQSNo8.js → kanban-definition-HUTT4EX6-D45s70Ny.js} +1 -1
  226. package/ui-dist/assets/{layout-Bsw9hK6u.js → layout-DDC-iOzY.js} +1 -1
  227. package/ui-dist/assets/{linear-D8D1R-4C.js → linear-DCTJ7Pq3.js} +1 -1
  228. package/ui-dist/assets/{map-BUIcuf4c.js → map-RGy5k616.js} +1 -1
  229. package/ui-dist/assets/{mermaid.core-CYZMLemV.js → mermaid.core-6MH04cvi.js} +4 -4
  230. package/ui-dist/assets/{mindmap-definition-LN4V7U3C-mjS9avIS.js → mindmap-definition-LN4V7U3C-CA2LFmda.js} +1 -1
  231. package/ui-dist/assets/{pegDiagram-2B236MQR-Buziry9m.js → pegDiagram-2B236MQR-DDsUr2du.js} +1 -1
  232. package/ui-dist/assets/{pieDiagram-ENE6RG2P-B_9BmFEg.js → pieDiagram-ENE6RG2P-D7jEL8xK.js} +1 -1
  233. package/ui-dist/assets/{quadrantDiagram-ABIIQ3AL-BxFdUA8s.js → quadrantDiagram-ABIIQ3AL-BsJxgVLb.js} +1 -1
  234. package/ui-dist/assets/{railroadDiagram-RFXS5EU6-pJh_afC-.js → railroadDiagram-RFXS5EU6-CBI457f6.js} +1 -1
  235. package/ui-dist/assets/{requirementDiagram-TGXJPOKE-BGgk3AxL.js → requirementDiagram-TGXJPOKE-_GAc0NOO.js} +1 -1
  236. package/ui-dist/assets/{sankeyDiagram-HTMAVEWB-DdPKE4bs.js → sankeyDiagram-HTMAVEWB-DNIaj5hu.js} +1 -1
  237. package/ui-dist/assets/{sequenceDiagram-DBY2YBRQ-xlik6FjZ.js → sequenceDiagram-DBY2YBRQ-BHDZs2dc.js} +1 -1
  238. package/ui-dist/assets/{sizeCapture-X5ZJPWSS-D_zKAjvf.js → sizeCapture-X5ZJPWSS-DwKT6aTP.js} +1 -1
  239. package/ui-dist/assets/{stateDiagram-2N3HPSRC-BGQP8giG.js → stateDiagram-2N3HPSRC-D2hDsltG.js} +1 -1
  240. package/ui-dist/assets/stateDiagram-v2-6OUMAXLB-CMTeJdkk.js +1 -0
  241. package/ui-dist/assets/{swimlanes-5IMT3BWC-ZhE8oAxR.js → swimlanes-5IMT3BWC-BV8xA0iq.js} +2 -2
  242. package/ui-dist/assets/swimlanesDiagram-G3AALYLV-ChF8QLeM.js +8 -0
  243. package/ui-dist/assets/{timeline-definition-FHXFAJF6-CUqfijnL.js → timeline-definition-FHXFAJF6-BPJMubhV.js} +1 -1
  244. package/ui-dist/assets/{vennDiagram-L72KCM5P-B_rqTUA0.js → vennDiagram-L72KCM5P-CY76J0Px.js} +1 -1
  245. package/ui-dist/assets/{wardleyDiagram-EHGQE667-BTvjybDi.js → wardleyDiagram-EHGQE667-pmNWLdE_.js} +1 -1
  246. package/ui-dist/assets/{xterm-CRpDYL2s.js → xterm-UByodpzD.js} +1 -1
  247. package/ui-dist/assets/{xychartDiagram-FW5EYKEG-ZBbwueZ5.js → xychartDiagram-FW5EYKEG-BWZC7gWV.js} +1 -1
  248. package/ui-dist/index.html +2 -2
  249. package/ui-dist/assets/LibraryLiveSurface-De1p59PK.js +0 -1
  250. package/ui-dist/assets/channel-eAoWqZqJ.js +0 -1
  251. package/ui-dist/assets/classDiagram-OUVF2IWQ-c94PI6yY.js +0 -1
  252. package/ui-dist/assets/classDiagram-v2-EOCWNBFH-c94PI6yY.js +0 -1
  253. package/ui-dist/assets/index-RSbihTRP.css +0 -32
  254. package/ui-dist/assets/stateDiagram-v2-6OUMAXLB-BMEtuB93.js +0 -1
  255. package/ui-dist/assets/swimlanesDiagram-G3AALYLV-Bdh18WfM.js +0 -8
@@ -18,6 +18,7 @@ import { buildChatTitlePromptFromMessages, chatTitleGenerationService, } from ".
18
18
  import { chatWorkManifestService } from "../services/chat-work-manifest.js";
19
19
  import { validateCron } from "../services/cron.js";
20
20
  import { accessService, agentService, automationService, chatService, goalService, heartbeatService, issueService, logActivity, operatorProfileService, organizationService, productIntelligenceService, projectService, sideChatService, } from "../services/index.js";
21
+ import { NETWORK_WAIT_EXHAUSTED_ERROR, NETWORK_WAIT_EXHAUSTED_ERROR_CODE, } from "../services/runtime-kernel/heartbeat.core.js";
21
22
  import { runtimeResultText, sanitizeGeneratedTitle, } from "../services/title-generation.js";
22
23
  import { assertBoard, assertCompanyAccess, getActorInfo, getAuthorizedOrgScope } from "./authz.js";
23
24
  import { createChatBackgroundRuntime, } from "./chat-background-runtime.js";
@@ -33,7 +34,7 @@ function chatVisibleOutputAdmissionClosed(error) {
33
34
  && error.status === 409
34
35
  && error.message === "Chat-visible output admission is closed for this generation";
35
36
  }
36
- export function chatRoutes(db, storage, backgroundRuntime = createChatBackgroundRuntime()) {
37
+ export function chatRoutes(db, storage, backgroundRuntime = createChatBackgroundRuntime(), registerNetworkWaitingRunHandler) {
37
38
  const router = Router();
38
39
  const svc = chatService(db);
39
40
  const organizationsSvc = organizationService(db);
@@ -47,7 +48,14 @@ export function chatRoutes(db, storage, backgroundRuntime = createChatBackground
47
48
  const chatRunsSvc = chatAgentRunService(db);
48
49
  const workManifestSvc = chatWorkManifestService(db);
49
50
  const operatorProfiles = operatorProfileService(db);
50
- const heartbeat = heartbeatService(db);
51
+ let recoverNetworkWaitingChatRun = null;
52
+ const heartbeat = heartbeatService(db, {
53
+ onNetworkWaitingRun: async (run) => {
54
+ if (!recoverNetworkWaitingChatRun)
55
+ return false;
56
+ return recoverNetworkWaitingChatRun(run);
57
+ },
58
+ });
51
59
  const productIntelligence = productIntelligenceService(db);
52
60
  const chatTitles = chatTitleGenerationService({ chats: svc, productIntelligence });
53
61
  const steerMessages = chatSteerMessageService(db);
@@ -1107,6 +1115,7 @@ export function chatRoutes(db, storage, backgroundRuntime = createChatBackground
1107
1115
  userMessageId: userMessage.id,
1108
1116
  chatTurnId: turnContext.chatTurnId,
1109
1117
  turnVariant: turnContext.turnVariant,
1118
+ runContext: { chatGenerationId: claim.generationId },
1110
1119
  stream: false,
1111
1120
  abortSignal: abortController.signal,
1112
1121
  controlCoordinator: createChatRuntimeControlCoordinator(conversation.id, claim.generationId, {
@@ -1212,6 +1221,11 @@ export function chatRoutes(db, storage, backgroundRuntime = createChatBackground
1212
1221
  });
1213
1222
  }
1214
1223
  }
1224
+ else if (streamed.outcome === "waiting_for_network") {
1225
+ // The durable generation remains open; the background recovery path
1226
+ // will reattach and project the eventual assistant result.
1227
+ return;
1228
+ }
1215
1229
  else {
1216
1230
  let completionMessageId = null;
1217
1231
  try {
@@ -1323,6 +1337,310 @@ export function chatRoutes(db, storage, backgroundRuntime = createChatBackground
1323
1337
  managedAbort.release();
1324
1338
  }
1325
1339
  }
1340
+ /** Resume a Chat generation that the heartbeat coordinator woke from a
1341
+ * durable network wait. This path deliberately shares the existing
1342
+ * generation/run rows instead of creating a second active Chat run. */
1343
+ async function runRecoveredNetworkWaitingChatRun(run) {
1344
+ const context = run.contextSnapshot && typeof run.contextSnapshot === "object"
1345
+ && !Array.isArray(run.contextSnapshot)
1346
+ ? run.contextSnapshot
1347
+ : {};
1348
+ const conversationId = run.chatConversationId
1349
+ ?? (typeof context.conversationId === "string" ? context.conversationId : null);
1350
+ const generationId = typeof context.chatGenerationId === "string"
1351
+ ? context.chatGenerationId
1352
+ : null;
1353
+ const nonStreamChatRun = context.chatMode === "non_stream";
1354
+ const userMessageId = typeof context.userMessageId === "string"
1355
+ ? context.userMessageId
1356
+ : typeof context.messageId === "string"
1357
+ ? context.messageId
1358
+ : null;
1359
+ const ownerToken = typeof run.executionOwnerToken === "string" ? run.executionOwnerToken : null;
1360
+ if (!conversationId || (!generationId && !nonStreamChatRun) || !userMessageId || !ownerToken) {
1361
+ logger.error({ runId: run.id }, "network-wait Chat run is missing recovery context");
1362
+ return false;
1363
+ }
1364
+ const conversation = await svc.getById(conversationId);
1365
+ const userMessage = conversation
1366
+ ? await svc.getMessage(conversation.id, userMessageId)
1367
+ : null;
1368
+ if (!conversation || !userMessage) {
1369
+ logger.error({ runId: run.id, conversationId, generationId }, "network-wait Chat recovery target is missing");
1370
+ return false;
1371
+ }
1372
+ const abortController = new AbortController();
1373
+ const managedAbort = backgroundRuntime.manageAbortController(abortController);
1374
+ const releaseGeneration = claimChatGeneration(conversation.id, abortController, generationId);
1375
+ if (!releaseGeneration) {
1376
+ managedAbort.release();
1377
+ return true;
1378
+ }
1379
+ const request = requestForQueuedActor({
1380
+ type: "board",
1381
+ source: "local_implicit",
1382
+ userId: "local-board",
1383
+ isInstanceAdmin: true,
1384
+ }, conversation.orgId);
1385
+ const actor = getActorInfo(request);
1386
+ let assistantConversation = conversation;
1387
+ let activeAttemptEpoch = Math.max(1, Number(context.attemptEpoch) || 1);
1388
+ let activeChatRunId = run.id;
1389
+ let partialBody = "";
1390
+ let assistantProjectionMessageId = null;
1391
+ let transcript = [];
1392
+ let terminalStatus = "failed";
1393
+ let terminalReason = null;
1394
+ let waitingAgain = false;
1395
+ try {
1396
+ if (generationId) {
1397
+ const frozen = await svc.generationProtocol.getFrozenVisibleProjection({
1398
+ orgId: conversation.orgId,
1399
+ conversationId: conversation.id,
1400
+ generationId,
1401
+ });
1402
+ partialBody = frozen.projection.body;
1403
+ assistantProjectionMessageId = frozen.projection.assistantMessageId;
1404
+ transcript = [...frozen.projection.transcript];
1405
+ activeAttemptEpoch = Math.max(1, frozen.generation.attemptEpoch);
1406
+ if (!run.networkRecoveryExhausted) {
1407
+ await svc.generationProtocol.markNetworkResumed({
1408
+ orgId: conversation.orgId,
1409
+ conversationId: conversation.id,
1410
+ generationId,
1411
+ expectedAttemptEpoch: activeAttemptEpoch,
1412
+ });
1413
+ }
1414
+ }
1415
+ if (run.networkRecoveryExhausted) {
1416
+ throw new ChatAssistantStreamError(NETWORK_WAIT_EXHAUSTED_ERROR, partialBody, [], {
1417
+ errorCode: NETWORK_WAIT_EXHAUSTED_ERROR_CODE,
1418
+ userMessage: "Network recovery retries were exhausted. Check connectivity, then retry this reply.",
1419
+ retryable: true,
1420
+ failurePhase: "model_generation",
1421
+ action: "retry",
1422
+ });
1423
+ }
1424
+ const turnContext = turnContextFromUserMessage(userMessage);
1425
+ const assistantInput = await loadAssistantInput(conversation, actor);
1426
+ assistantConversation = assistantInput.conversation;
1427
+ const controlCoordinator = generationId
1428
+ ? createChatRuntimeControlCoordinator(conversation.id, generationId, {
1429
+ onAttemptStarted: async ({ generationId: currentGenerationId, attemptEpoch, ownerToken: attemptOwnerToken, attempt }) => {
1430
+ activeAttemptEpoch = attemptEpoch;
1431
+ await svc.beginGenerationControlAttempt({
1432
+ orgId: conversation.orgId,
1433
+ conversationId: conversation.id,
1434
+ generationId: currentGenerationId,
1435
+ attemptEpoch,
1436
+ ownerToken: attemptOwnerToken,
1437
+ runtimeType: attempt.runtimeType,
1438
+ });
1439
+ },
1440
+ onHandleRegistered: async ({ generationId: currentGenerationId, attemptEpoch, ownerToken: attemptOwnerToken, handle }) => {
1441
+ await svc.markGenerationControlReady({
1442
+ generationId: currentGenerationId,
1443
+ attemptEpoch,
1444
+ ownerToken: attemptOwnerToken,
1445
+ runtimeType: handle.runtimeType,
1446
+ providerThreadId: handle.providerThreadId ?? null,
1447
+ providerTurnId: handle.providerTurnId ?? null,
1448
+ });
1449
+ },
1450
+ onAttemptLeaseRenewed: async ({ generationId: currentGenerationId, attemptEpoch, ownerToken: attemptOwnerToken }) => {
1451
+ await svc.renewGenerationControlLease({
1452
+ generationId: currentGenerationId,
1453
+ attemptEpoch,
1454
+ ownerToken: attemptOwnerToken,
1455
+ });
1456
+ },
1457
+ onAttemptCompleted: async ({ generationId: currentGenerationId, attemptEpoch, ownerToken: attemptOwnerToken }) => {
1458
+ await svc.markGenerationControlAttemptCompleted({
1459
+ generationId: currentGenerationId,
1460
+ attemptEpoch,
1461
+ ownerToken: attemptOwnerToken,
1462
+ });
1463
+ },
1464
+ })
1465
+ : undefined;
1466
+ const streamed = await assistantSvc.streamChatAssistantReply({
1467
+ ...assistantInput,
1468
+ userMessageId: userMessage.id,
1469
+ chatTurnId: turnContext.chatTurnId,
1470
+ turnVariant: turnContext.turnVariant,
1471
+ runContext: { chatGenerationId: generationId },
1472
+ resumeRunId: run.id,
1473
+ resumeRunOwnerToken: ownerToken,
1474
+ stream: false,
1475
+ abortSignal: abortController.signal,
1476
+ controlCoordinator,
1477
+ onRunCreated: (recoveredRunId) => {
1478
+ activeChatRunId = recoveredRunId;
1479
+ },
1480
+ onWaitingForNetwork: async (suspension) => {
1481
+ if (!generationId) {
1482
+ waitingAgain = true;
1483
+ return;
1484
+ }
1485
+ const marked = await svc.generationProtocol.markWaitingForNetwork({
1486
+ orgId: conversation.orgId,
1487
+ conversationId: conversation.id,
1488
+ generationId,
1489
+ expectedAttemptEpoch: activeAttemptEpoch,
1490
+ suspension: suspension,
1491
+ });
1492
+ if (marked.stopped) {
1493
+ terminalStatus = "stopped";
1494
+ terminalReason = "operator_stop";
1495
+ if (!abortController.signal.aborted)
1496
+ abortController.abort();
1497
+ return;
1498
+ }
1499
+ waitingAgain = true;
1500
+ },
1501
+ onAssistantDelta: async (delta) => {
1502
+ if (abortController.signal.aborted)
1503
+ return;
1504
+ const projectedBody = `${partialBody}${delta}`;
1505
+ if (!generationId) {
1506
+ partialBody = projectedBody;
1507
+ return;
1508
+ }
1509
+ const projection = await svc.generationProtocol.appendVisibleEventAndProject({
1510
+ orgId: conversation.orgId,
1511
+ conversationId: conversation.id,
1512
+ generationId,
1513
+ expectedAttemptEpoch: activeAttemptEpoch,
1514
+ eventKind: "assistant_delta",
1515
+ payload: { delta },
1516
+ bodyOffset: partialBody.length,
1517
+ bodyLength: delta.length,
1518
+ messageId: assistantProjectionMessageId,
1519
+ runId: activeChatRunId,
1520
+ bodyHash: hashChatGenerationBody(projectedBody),
1521
+ body: projectedBody,
1522
+ replyingAgentId: chatReplyingAgentId(assistantConversation),
1523
+ chatTurnId: turnContext.chatTurnId,
1524
+ turnVariant: turnContext.turnVariant,
1525
+ });
1526
+ assistantProjectionMessageId = projection.message.id;
1527
+ partialBody = projectedBody;
1528
+ },
1529
+ onTranscriptEntry: async (entry) => {
1530
+ if (abortController.signal.aborted)
1531
+ return;
1532
+ transcript.push(entry);
1533
+ if (!generationId)
1534
+ return;
1535
+ const projection = await svc.generationProtocol.appendVisibleEventAndProject({
1536
+ orgId: conversation.orgId,
1537
+ conversationId: conversation.id,
1538
+ generationId,
1539
+ expectedAttemptEpoch: activeAttemptEpoch,
1540
+ eventKind: "transcript",
1541
+ payload: { entry },
1542
+ messageId: assistantProjectionMessageId,
1543
+ runId: activeChatRunId,
1544
+ bodyHash: hashChatGenerationBody(partialBody),
1545
+ body: partialBody,
1546
+ replyingAgentId: chatReplyingAgentId(assistantConversation),
1547
+ chatTurnId: turnContext.chatTurnId,
1548
+ turnVariant: turnContext.turnVariant,
1549
+ });
1550
+ assistantProjectionMessageId = projection.message.id;
1551
+ },
1552
+ });
1553
+ partialBody = streamed.partialBody || partialBody;
1554
+ if (waitingAgain || streamed.outcome === "waiting_for_network")
1555
+ return true;
1556
+ if (abortController.signal.aborted || streamed.outcome === "stopped") {
1557
+ terminalStatus = "stopped";
1558
+ terminalReason = "operator_stop";
1559
+ const stoppedMessage = await persistPartialAssistantMessage(assistantConversation, partialBody, "stopped", turnContext, transcript, streamed.replyingAgentId, assistantProjectionMessageId, activeChatRunId, undefined, false);
1560
+ if (stoppedMessage) {
1561
+ await linkChatRunMessages(assistantConversation, activeChatRunId, [stoppedMessage]);
1562
+ await logChatMessagesAdded(assistantConversation, [stoppedMessage], {
1563
+ actorType: "system",
1564
+ actorId: "chat-assistant",
1565
+ agentId: streamed.replyingAgentId,
1566
+ });
1567
+ }
1568
+ }
1569
+ else {
1570
+ const completionMessageId = generationId
1571
+ ? (await svc.generationProtocol.appendVisibleEventAndProject({
1572
+ orgId: conversation.orgId,
1573
+ conversationId: conversation.id,
1574
+ generationId,
1575
+ expectedAttemptEpoch: activeAttemptEpoch,
1576
+ eventKind: "runtime_output",
1577
+ payload: { resultKind: streamed.reply.kind, body: streamed.reply.body },
1578
+ bodyOffset: 0,
1579
+ bodyLength: streamed.reply.body.length,
1580
+ messageId: assistantProjectionMessageId,
1581
+ runId: activeChatRunId,
1582
+ bodyHash: hashChatGenerationBody(streamed.reply.body),
1583
+ body: streamed.reply.body,
1584
+ replyingAgentId: streamed.replyingAgentId,
1585
+ chatTurnId: turnContext.chatTurnId,
1586
+ turnVariant: turnContext.turnVariant,
1587
+ })).message.id
1588
+ : null;
1589
+ const createdMessages = await persistAssistantReply(request, assistantConversation, actor, streamed.reply, turnContext, transcript, streamed.replyingAgentId, completionMessageId, activeChatRunId, false);
1590
+ await linkChatRunMessages(assistantConversation, activeChatRunId, createdMessages);
1591
+ await logChatMessagesAdded(assistantConversation, createdMessages, {
1592
+ actorType: "system",
1593
+ actorId: "chat-assistant",
1594
+ agentId: streamed.replyingAgentId,
1595
+ });
1596
+ terminalStatus = "completed";
1597
+ }
1598
+ }
1599
+ catch (error) {
1600
+ terminalStatus = abortController.signal.aborted ? "aborted" : "failed";
1601
+ terminalReason = error instanceof Error ? error.message : "network_wait_chat_recovery_failed";
1602
+ const failurePayload = recoverableFailurePayload(error, activeChatRunId);
1603
+ const failureBody = userVisiblePartialBodyFromError(error)
1604
+ || recoverableFailureBody(failurePayload)
1605
+ || CHAT_ASSISTANT_USER_ERROR_MESSAGE;
1606
+ const failedMessage = await persistPartialAssistantMessage(assistantConversation, failureBody, "failed", null, transcript, chatReplyingAgentId(assistantConversation), assistantProjectionMessageId, activeChatRunId, failurePayload, false).catch(() => null);
1607
+ if (failedMessage) {
1608
+ await linkChatRunMessages(assistantConversation, activeChatRunId, [failedMessage]).catch(() => undefined);
1609
+ await logChatMessagesAdded(assistantConversation, [failedMessage], {
1610
+ actorType: "system",
1611
+ actorId: "chat-assistant",
1612
+ agentId: chatReplyingAgentId(assistantConversation),
1613
+ }).catch(() => undefined);
1614
+ }
1615
+ }
1616
+ finally {
1617
+ if (!waitingAgain && generationId) {
1618
+ const latestGeneration = await svc.getLatestGeneration(conversation.id).catch(() => null);
1619
+ if (latestGeneration?.id === generationId) {
1620
+ const terminalEvidence = await svc.generationProtocol.recordRuntimeTerminal({
1621
+ orgId: conversation.orgId,
1622
+ conversationId: conversation.id,
1623
+ generationId,
1624
+ expectedAttemptEpoch: latestGeneration.attemptEpoch,
1625
+ expectedOwnerToken: latestGeneration.controlOwnerToken,
1626
+ finalStatus: terminalStatus,
1627
+ terminalReason: terminalReason ?? terminalStatus,
1628
+ }).catch((error) => {
1629
+ logger.warn({ err: error, generationId }, "failed to record recovered Chat terminal evidence");
1630
+ return null;
1631
+ });
1632
+ if (terminalEvidence)
1633
+ wakeTerminalProjector();
1634
+ }
1635
+ }
1636
+ chatRunsSvc.releaseOwnedRun(run.id, ownerToken);
1637
+ releaseGeneration();
1638
+ managedAbort.release();
1639
+ }
1640
+ return true;
1641
+ }
1642
+ recoverNetworkWaitingChatRun = runRecoveredNetworkWaitingChatRun;
1643
+ registerNetworkWaitingRunHandler?.(runRecoveredNetworkWaitingChatRun);
1326
1644
  async function drainServerQueue() {
1327
1645
  await svc.recoverExpiredServerQueueClaims();
1328
1646
  while (backgroundRuntime.acceptingWork
@@ -1779,7 +2097,10 @@ export function chatRoutes(db, storage, backgroundRuntime = createChatBackground
1779
2097
  return;
1780
2098
  }
1781
2099
  const active = getActiveChatGeneration(conversation.id);
1782
- res.json(await svc.getQueueSnapshot(conversation.id, active?.generationId ?? null));
2100
+ const snapshot = active
2101
+ ? await svc.getQueueSnapshot(conversation.id, active.generationId)
2102
+ : await svc.getQueueSnapshot(conversation.id);
2103
+ res.json(snapshot);
1783
2104
  });
1784
2105
  router.post("/chats/:id/queue", async (req, res) => {
1785
2106
  const conversation = await assertConversationAccess(req, req.params.id);
@@ -2503,6 +2824,7 @@ export function chatRoutes(db, storage, backgroundRuntime = createChatBackground
2503
2824
  }
2504
2825
  const turnContext = turnContextFromUserMessage(userMessage);
2505
2826
  let activeChatRunId = null;
2827
+ let networkWaiting = false;
2506
2828
  const persistedAssistantMessages = await (async () => {
2507
2829
  const assistantInput = await loadAssistantInput(conversation, actor);
2508
2830
  const transcript = [];
@@ -2514,6 +2836,7 @@ export function chatRoutes(db, storage, backgroundRuntime = createChatBackground
2514
2836
  userMessageId: userMessage.id,
2515
2837
  chatTurnId: turnContext.chatTurnId,
2516
2838
  turnVariant: turnContext.turnVariant,
2839
+ runContext: { chatMode: "non_stream" },
2517
2840
  stream: false,
2518
2841
  onRunCreated: (runId) => {
2519
2842
  activeChatRunId = runId;
@@ -2523,6 +2846,10 @@ export function chatRoutes(db, storage, backgroundRuntime = createChatBackground
2523
2846
  },
2524
2847
  });
2525
2848
  fallbackOutput = streamed.partialBody;
2849
+ if (streamed.outcome === "waiting_for_network") {
2850
+ networkWaiting = true;
2851
+ return [];
2852
+ }
2526
2853
  if (streamed.outcome !== "completed") {
2527
2854
  throw new Error("Chat assistant reply was stopped before completion");
2528
2855
  }
@@ -2557,7 +2884,10 @@ export function chatRoutes(db, storage, backgroundRuntime = createChatBackground
2557
2884
  }
2558
2885
  })();
2559
2886
  const createdMessages = [userMessage, ...persistedAssistantMessages];
2560
- res.status(201).json({ messages: createdMessages });
2887
+ res.status(networkWaiting ? 202 : 201).json({
2888
+ messages: createdMessages,
2889
+ ...(networkWaiting ? { waitingForNetwork: true, runId: activeChatRunId } : {}),
2890
+ });
2561
2891
  }
2562
2892
  catch (err) {
2563
2893
  logger.warn({