@rudderhq/server 0.2.5-canary.8 → 0.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (309) hide show
  1. package/dist/bootstrap/plugin-host-runtime.d.ts +39 -39
  2. package/dist/bundled-plugins/plugin-linear/dist/worker.js +101 -147
  3. package/dist/bundled-plugins/plugin-linear/dist/worker.js.map +2 -2
  4. package/dist/bundled-plugins/plugin-linear/package.json +1 -1
  5. package/dist/routes/access-onboarding.helpers.d.ts +142 -0
  6. package/dist/routes/access-onboarding.helpers.d.ts.map +1 -0
  7. package/dist/routes/access-onboarding.helpers.js +762 -0
  8. package/dist/routes/access-onboarding.helpers.js.map +1 -0
  9. package/dist/routes/access.d.ts +2 -48
  10. package/dist/routes/access.d.ts.map +1 -1
  11. package/dist/routes/access.helpers.d.ts +109 -0
  12. package/dist/routes/access.helpers.d.ts.map +1 -0
  13. package/dist/routes/access.helpers.js +460 -0
  14. package/dist/routes/access.helpers.js.map +1 -0
  15. package/dist/routes/access.js +6 -1218
  16. package/dist/routes/access.js.map +1 -1
  17. package/dist/routes/agents.d.ts.map +1 -1
  18. package/dist/routes/agents.js +55 -1057
  19. package/dist/routes/agents.js.map +1 -1
  20. package/dist/routes/agents.management-routes.d.ts +12 -0
  21. package/dist/routes/agents.management-routes.d.ts.map +1 -0
  22. package/dist/routes/agents.management-routes.js +1067 -0
  23. package/dist/routes/agents.management-routes.js.map +1 -0
  24. package/dist/routes/chats.d.ts.map +1 -1
  25. package/dist/routes/chats.js +42 -652
  26. package/dist/routes/chats.js.map +1 -1
  27. package/dist/routes/chats.stream-routes.d.ts +12 -0
  28. package/dist/routes/chats.stream-routes.d.ts.map +1 -0
  29. package/dist/routes/chats.stream-routes.js +666 -0
  30. package/dist/routes/chats.stream-routes.js.map +1 -0
  31. package/dist/routes/issues.comments-attachments.d.ts +12 -0
  32. package/dist/routes/issues.comments-attachments.d.ts.map +1 -0
  33. package/dist/routes/issues.comments-attachments.js +511 -0
  34. package/dist/routes/issues.comments-attachments.js.map +1 -0
  35. package/dist/routes/issues.d.ts.map +1 -1
  36. package/dist/routes/issues.js +43 -1128
  37. package/dist/routes/issues.js.map +1 -1
  38. package/dist/routes/issues.mutations.d.ts +12 -0
  39. package/dist/routes/issues.mutations.d.ts.map +1 -0
  40. package/dist/routes/issues.mutations.js +635 -0
  41. package/dist/routes/issues.mutations.js.map +1 -0
  42. package/dist/routes/plugins.d.ts.map +1 -1
  43. package/dist/routes/plugins.js +14 -694
  44. package/dist/routes/plugins.js.map +1 -1
  45. package/dist/routes/plugins.operations-routes.d.ts +28 -0
  46. package/dist/routes/plugins.operations-routes.d.ts.map +1 -0
  47. package/dist/routes/plugins.operations-routes.js +720 -0
  48. package/dist/routes/plugins.operations-routes.js.map +1 -0
  49. package/dist/services/access.d.ts +21 -21
  50. package/dist/services/activity.d.ts +19 -19
  51. package/dist/services/agents.d.ts +158 -158
  52. package/dist/services/approvals.d.ts +29 -29
  53. package/dist/services/assets.d.ts +8 -8
  54. package/dist/services/automations.d.ts +41 -27
  55. package/dist/services/automations.d.ts.map +1 -1
  56. package/dist/services/automations.js +287 -110
  57. package/dist/services/automations.js.map +1 -1
  58. package/dist/services/automations.scheduler.d.ts +9 -0
  59. package/dist/services/automations.scheduler.d.ts.map +1 -0
  60. package/dist/services/automations.scheduler.js +101 -0
  61. package/dist/services/automations.scheduler.js.map +1 -0
  62. package/dist/services/board-auth.d.ts +32 -32
  63. package/dist/services/calendar.d.ts +26 -26
  64. package/dist/services/chat-assistant.d.ts +3 -47
  65. package/dist/services/chat-assistant.d.ts.map +1 -1
  66. package/dist/services/chat-assistant.helpers.d.ts +156 -0
  67. package/dist/services/chat-assistant.helpers.d.ts.map +1 -0
  68. package/dist/services/chat-assistant.helpers.js +862 -0
  69. package/dist/services/chat-assistant.helpers.js.map +1 -0
  70. package/dist/services/chat-assistant.js +2 -861
  71. package/dist/services/chat-assistant.js.map +1 -1
  72. package/dist/services/chats.d.ts +149 -247
  73. package/dist/services/chats.d.ts.map +1 -1
  74. package/dist/services/chats.helpers.d.ts +117 -0
  75. package/dist/services/chats.helpers.d.ts.map +1 -0
  76. package/dist/services/chats.helpers.js +285 -0
  77. package/dist/services/chats.helpers.js.map +1 -0
  78. package/dist/services/chats.js +6 -286
  79. package/dist/services/chats.js.map +1 -1
  80. package/dist/services/costs.d.ts +8 -8
  81. package/dist/services/finance.d.ts +18 -18
  82. package/dist/services/goals.d.ts +30 -30
  83. package/dist/services/heartbeat.d.ts +3 -1
  84. package/dist/services/heartbeat.d.ts.map +1 -1
  85. package/dist/services/heartbeat.js +3 -1
  86. package/dist/services/heartbeat.js.map +1 -1
  87. package/dist/services/issue-approvals.d.ts +4 -4
  88. package/dist/services/issue-review-wakeup.d.ts +3 -3
  89. package/dist/services/issues.comments-attachments.d.ts +141 -0
  90. package/dist/services/issues.comments-attachments.d.ts.map +1 -0
  91. package/dist/services/issues.comments-attachments.js +313 -0
  92. package/dist/services/issues.comments-attachments.js.map +1 -0
  93. package/dist/services/issues.d.ts +205 -256
  94. package/dist/services/issues.d.ts.map +1 -1
  95. package/dist/services/issues.helpers.d.ts +87 -0
  96. package/dist/services/issues.helpers.d.ts.map +1 -0
  97. package/dist/services/issues.helpers.js +270 -0
  98. package/dist/services/issues.helpers.js.map +1 -0
  99. package/dist/services/issues.js +5 -569
  100. package/dist/services/issues.js.map +1 -1
  101. package/dist/services/knowledge-portability/organization-portability.core.d.ts +210 -0
  102. package/dist/services/knowledge-portability/organization-portability.core.d.ts.map +1 -0
  103. package/dist/services/knowledge-portability/organization-portability.core.js +997 -0
  104. package/dist/services/knowledge-portability/organization-portability.core.js.map +1 -0
  105. package/dist/services/knowledge-portability/organization-portability.d.ts +6 -28
  106. package/dist/services/knowledge-portability/organization-portability.d.ts.map +1 -1
  107. package/dist/services/knowledge-portability/organization-portability.export.d.ts +24 -0
  108. package/dist/services/knowledge-portability/organization-portability.export.d.ts.map +1 -0
  109. package/dist/services/knowledge-portability/organization-portability.export.js +607 -0
  110. package/dist/services/knowledge-portability/organization-portability.export.js.map +1 -0
  111. package/dist/services/knowledge-portability/organization-portability.files.d.ts +69 -0
  112. package/dist/services/knowledge-portability/organization-portability.files.d.ts.map +1 -0
  113. package/dist/services/knowledge-portability/organization-portability.files.js +597 -0
  114. package/dist/services/knowledge-portability/organization-portability.files.js.map +1 -0
  115. package/dist/services/knowledge-portability/organization-portability.import.d.ts +31 -0
  116. package/dist/services/knowledge-portability/organization-portability.import.d.ts.map +1 -0
  117. package/dist/services/knowledge-portability/organization-portability.import.js +575 -0
  118. package/dist/services/knowledge-portability/organization-portability.import.js.map +1 -0
  119. package/dist/services/knowledge-portability/organization-portability.js +37 -3848
  120. package/dist/services/knowledge-portability/organization-portability.js.map +1 -1
  121. package/dist/services/knowledge-portability/organization-portability.package.d.ts +72 -0
  122. package/dist/services/knowledge-portability/organization-portability.package.d.ts.map +1 -0
  123. package/dist/services/knowledge-portability/organization-portability.package.js +749 -0
  124. package/dist/services/knowledge-portability/organization-portability.package.js.map +1 -0
  125. package/dist/services/knowledge-portability/organization-portability.preview.d.ts +18 -0
  126. package/dist/services/knowledge-portability/organization-portability.preview.d.ts.map +1 -0
  127. package/dist/services/knowledge-portability/organization-portability.preview.js +333 -0
  128. package/dist/services/knowledge-portability/organization-portability.preview.js.map +1 -0
  129. package/dist/services/knowledge-portability/organization-portability.resolve-source.d.ts +4 -0
  130. package/dist/services/knowledge-portability/organization-portability.resolve-source.d.ts.map +1 -0
  131. package/dist/services/knowledge-portability/organization-portability.resolve-source.js +86 -0
  132. package/dist/services/knowledge-portability/organization-portability.resolve-source.js.map +1 -0
  133. package/dist/services/knowledge-portability/organization-skills.catalog.d.ts +221 -0
  134. package/dist/services/knowledge-portability/organization-skills.catalog.d.ts.map +1 -0
  135. package/dist/services/knowledge-portability/organization-skills.catalog.js +999 -0
  136. package/dist/services/knowledge-portability/organization-skills.catalog.js.map +1 -0
  137. package/dist/services/knowledge-portability/organization-skills.d.ts +4 -75
  138. package/dist/services/knowledge-portability/organization-skills.d.ts.map +1 -1
  139. package/dist/services/knowledge-portability/organization-skills.js +11 -2008
  140. package/dist/services/knowledge-portability/organization-skills.js.map +1 -1
  141. package/dist/services/knowledge-portability/organization-skills.scans.d.ts +16 -0
  142. package/dist/services/knowledge-portability/organization-skills.scans.d.ts.map +1 -0
  143. package/dist/services/knowledge-portability/organization-skills.scans.js +300 -0
  144. package/dist/services/knowledge-portability/organization-skills.scans.js.map +1 -0
  145. package/dist/services/knowledge-portability/organization-skills.sources.d.ts +68 -0
  146. package/dist/services/knowledge-portability/organization-skills.sources.d.ts.map +1 -0
  147. package/dist/services/knowledge-portability/organization-skills.sources.js +728 -0
  148. package/dist/services/knowledge-portability/organization-skills.sources.js.map +1 -0
  149. package/dist/services/messenger.d.ts +2 -2
  150. package/dist/services/messenger.js +2 -2
  151. package/dist/services/messenger.js.map +1 -1
  152. package/dist/services/organization-skills.d.ts +3 -1
  153. package/dist/services/organization-skills.d.ts.map +1 -1
  154. package/dist/services/organization-skills.js +3 -1
  155. package/dist/services/organization-skills.js.map +1 -1
  156. package/dist/services/orgs.d.ts +9 -9
  157. package/dist/services/plugin-loader.core.d.ts +14 -0
  158. package/dist/services/plugin-loader.core.d.ts.map +1 -0
  159. package/dist/services/plugin-loader.core.js +905 -0
  160. package/dist/services/plugin-loader.core.js.map +1 -0
  161. package/dist/services/plugin-loader.d.ts +3 -440
  162. package/dist/services/plugin-loader.d.ts.map +1 -1
  163. package/dist/services/plugin-loader.helpers.d.ts +468 -0
  164. package/dist/services/plugin-loader.helpers.d.ts.map +1 -0
  165. package/dist/services/plugin-loader.helpers.js +263 -0
  166. package/dist/services/plugin-loader.helpers.js.map +1 -0
  167. package/dist/services/plugin-loader.js +3 -1191
  168. package/dist/services/plugin-loader.js.map +1 -1
  169. package/dist/services/plugin-loader.worker-paths.d.ts +7 -0
  170. package/dist/services/plugin-loader.worker-paths.d.ts.map +1 -0
  171. package/dist/services/plugin-loader.worker-paths.js +85 -0
  172. package/dist/services/plugin-loader.worker-paths.js.map +1 -0
  173. package/dist/services/plugin-registry.d.ts +123 -123
  174. package/dist/services/projects.d.ts +8 -8
  175. package/dist/services/runtime-kernel/heartbeat.core.d.ts +725 -0
  176. package/dist/services/runtime-kernel/heartbeat.core.d.ts.map +1 -0
  177. package/dist/services/runtime-kernel/heartbeat.core.js +525 -0
  178. package/dist/services/runtime-kernel/heartbeat.core.js.map +1 -0
  179. package/dist/services/runtime-kernel/heartbeat.d.ts +38 -259
  180. package/dist/services/runtime-kernel/heartbeat.d.ts.map +1 -1
  181. package/dist/services/runtime-kernel/heartbeat.execute.d.ts +5 -0
  182. package/dist/services/runtime-kernel/heartbeat.execute.d.ts.map +1 -0
  183. package/dist/services/runtime-kernel/heartbeat.execute.js +1052 -0
  184. package/dist/services/runtime-kernel/heartbeat.execute.js.map +1 -0
  185. package/dist/services/runtime-kernel/heartbeat.js +50 -4142
  186. package/dist/services/runtime-kernel/heartbeat.js.map +1 -1
  187. package/dist/services/runtime-kernel/heartbeat.misc.d.ts +30 -0
  188. package/dist/services/runtime-kernel/heartbeat.misc.d.ts.map +1 -0
  189. package/dist/services/runtime-kernel/heartbeat.misc.js +483 -0
  190. package/dist/services/runtime-kernel/heartbeat.misc.js.map +1 -0
  191. package/dist/services/runtime-kernel/heartbeat.recovery.d.ts +38 -0
  192. package/dist/services/runtime-kernel/heartbeat.recovery.d.ts.map +1 -0
  193. package/dist/services/runtime-kernel/heartbeat.recovery.js +605 -0
  194. package/dist/services/runtime-kernel/heartbeat.recovery.js.map +1 -0
  195. package/dist/services/runtime-kernel/heartbeat.release.d.ts +6 -0
  196. package/dist/services/runtime-kernel/heartbeat.release.d.ts.map +1 -0
  197. package/dist/services/runtime-kernel/heartbeat.release.js +398 -0
  198. package/dist/services/runtime-kernel/heartbeat.release.js.map +1 -0
  199. package/dist/services/runtime-kernel/heartbeat.sessions.d.ts +229 -0
  200. package/dist/services/runtime-kernel/heartbeat.sessions.d.ts.map +1 -0
  201. package/dist/services/runtime-kernel/heartbeat.sessions.js +708 -0
  202. package/dist/services/runtime-kernel/heartbeat.sessions.js.map +1 -0
  203. package/dist/services/runtime-kernel/heartbeat.wakeup.d.ts +5 -0
  204. package/dist/services/runtime-kernel/heartbeat.wakeup.d.ts.map +1 -0
  205. package/dist/services/runtime-kernel/heartbeat.wakeup.js +552 -0
  206. package/dist/services/runtime-kernel/heartbeat.wakeup.js.map +1 -0
  207. package/dist/services/secrets.d.ts +25 -25
  208. package/dist/services/sidebar-badges.js +1 -1
  209. package/dist/services/sidebar-badges.js.map +1 -1
  210. package/dist/services/workspace-runtime.comments.d.ts +6 -0
  211. package/dist/services/workspace-runtime.comments.d.ts.map +1 -0
  212. package/dist/services/workspace-runtime.comments.js +17 -0
  213. package/dist/services/workspace-runtime.comments.js.map +1 -0
  214. package/dist/services/workspace-runtime.d.ts +4 -163
  215. package/dist/services/workspace-runtime.d.ts.map +1 -1
  216. package/dist/services/workspace-runtime.helpers.d.ts +163 -0
  217. package/dist/services/workspace-runtime.helpers.d.ts.map +1 -0
  218. package/dist/services/workspace-runtime.helpers.js +360 -0
  219. package/dist/services/workspace-runtime.helpers.js.map +1 -0
  220. package/dist/services/workspace-runtime.js +4 -1236
  221. package/dist/services/workspace-runtime.js.map +1 -1
  222. package/dist/services/workspace-runtime.lifecycle.d.ts +35 -0
  223. package/dist/services/workspace-runtime.lifecycle.d.ts.map +1 -0
  224. package/dist/services/workspace-runtime.lifecycle.js +266 -0
  225. package/dist/services/workspace-runtime.lifecycle.js.map +1 -0
  226. package/dist/services/workspace-runtime.services.d.ts +140 -0
  227. package/dist/services/workspace-runtime.services.d.ts.map +1 -0
  228. package/dist/services/workspace-runtime.services.js +606 -0
  229. package/dist/services/workspace-runtime.services.js.map +1 -0
  230. package/package.json +21 -15
  231. package/ui-dist/assets/{_basePickBy-DeCw-kw3.js → _basePickBy-N8I9ml5Y.js} +1 -1
  232. package/ui-dist/assets/{_baseUniq-CVepsVZm.js → _baseUniq-BuSlpRSQ.js} +1 -1
  233. package/ui-dist/assets/{arc-QifRrkx2.js → arc-qX-dPyA1.js} +1 -1
  234. package/ui-dist/assets/{architectureDiagram-2XIMDMQ5-CT4me0hw.js → architectureDiagram-2XIMDMQ5-DhjkbXsp.js} +1 -1
  235. package/ui-dist/assets/{blockDiagram-WCTKOSBZ-uD6J91MI.js → blockDiagram-WCTKOSBZ-JS-tTu3J.js} +1 -1
  236. package/ui-dist/assets/{c4Diagram-IC4MRINW-D2GM2pzG.js → c4Diagram-IC4MRINW-4DqwCWIx.js} +1 -1
  237. package/ui-dist/assets/channel-CccCW5_a.js +1 -0
  238. package/ui-dist/assets/{chunk-4BX2VUAB-D8pPrlss.js → chunk-4BX2VUAB-T37SqBpp.js} +1 -1
  239. package/ui-dist/assets/{chunk-55IACEB6-CHF68vwj.js → chunk-55IACEB6-BSj9hdqK.js} +1 -1
  240. package/ui-dist/assets/{chunk-FMBD7UC4-CKmGUf9X.js → chunk-FMBD7UC4-Dkrlh0Wk.js} +1 -1
  241. package/ui-dist/assets/{chunk-JSJVCQXG-CTBCV-7X.js → chunk-JSJVCQXG-C0ZE3QdB.js} +1 -1
  242. package/ui-dist/assets/{chunk-KX2RTZJC-DV5XzGob.js → chunk-KX2RTZJC-DOZQM9gW.js} +1 -1
  243. package/ui-dist/assets/{chunk-NQ4KR5QH-B7diT0e4.js → chunk-NQ4KR5QH-5Yr3U2k8.js} +1 -1
  244. package/ui-dist/assets/{chunk-QZHKN3VN-BphcSb1i.js → chunk-QZHKN3VN-CvKTufwF.js} +1 -1
  245. package/ui-dist/assets/{chunk-WL4C6EOR-Bs_jQBMG.js → chunk-WL4C6EOR-IoEM0jyx.js} +1 -1
  246. package/ui-dist/assets/classDiagram-VBA2DB6C-JKk4tCW2.js +1 -0
  247. package/ui-dist/assets/classDiagram-v2-RAHNMMFH-JKk4tCW2.js +1 -0
  248. package/ui-dist/assets/clone-Onaweg8D.js +1 -0
  249. package/ui-dist/assets/{cose-bilkent-S5V4N54A-BxfO0pV9.js → cose-bilkent-S5V4N54A-CTvr1OFj.js} +1 -1
  250. package/ui-dist/assets/{dagre-KLK3FWXG-BiDkAX-Z.js → dagre-KLK3FWXG-UZ-SNjVK.js} +1 -1
  251. package/ui-dist/assets/{diagram-E7M64L7V-Btz_oxkC.js → diagram-E7M64L7V-D7RAN0Hr.js} +1 -1
  252. package/ui-dist/assets/{diagram-IFDJBPK2-Cdp8lQxJ.js → diagram-IFDJBPK2-B4LViaFR.js} +1 -1
  253. package/ui-dist/assets/{diagram-P4PSJMXO-DuTbeAS1.js → diagram-P4PSJMXO-CY1be7ak.js} +1 -1
  254. package/ui-dist/assets/{erDiagram-INFDFZHY-CzoQlOwo.js → erDiagram-INFDFZHY-Dca0KkvJ.js} +1 -1
  255. package/ui-dist/assets/{flowDiagram-PKNHOUZH-Diz_MWi3.js → flowDiagram-PKNHOUZH-i-qMvfwg.js} +1 -1
  256. package/ui-dist/assets/{ganttDiagram-A5KZAMGK-CWeGI1E-.js → ganttDiagram-A5KZAMGK-Wxq2lhbh.js} +1 -1
  257. package/ui-dist/assets/{gitGraphDiagram-K3NZZRJ6-C3QhZnAN.js → gitGraphDiagram-K3NZZRJ6-DwzgPlAY.js} +1 -1
  258. package/ui-dist/assets/{graph-KQH4eaLv.js → graph-BAqf89Tz.js} +1 -1
  259. package/ui-dist/assets/{index-CkEEsJ_9.js → index-4eCzaLuY.js} +1 -1
  260. package/ui-dist/assets/{index-DCOA92Vt.js → index-8uu-nKqK.js} +1 -1
  261. package/ui-dist/assets/{index-DtsZnqcf.js → index-B-1NEcI_.js} +1 -1
  262. package/ui-dist/assets/{index-BvGpil9e.js → index-B0b_3Eu5.js} +1 -1
  263. package/ui-dist/assets/{index-BMhxh9sB.js → index-B8v0eZjP.js} +1 -1
  264. package/ui-dist/assets/{index-aKvEm2pJ.js → index-BN7Moj3u.js} +1 -1
  265. package/ui-dist/assets/{index-iJyjaIGd.js → index-BSpxh3cY.js} +1 -1
  266. package/ui-dist/assets/{index-DhRKQjzu.js → index-BY44RIi9.js} +1 -1
  267. package/ui-dist/assets/{index-Z4rTzdcL.js → index-BhyQJhdZ.js} +1 -1
  268. package/ui-dist/assets/{index-DBxBUiZC.js → index-BkPL_iGU.js} +1 -1
  269. package/ui-dist/assets/{index-CsSppW5U.js → index-BsPfoHXS.js} +1 -1
  270. package/ui-dist/assets/{index-B8J1oewY.js → index-BstW7nmv.js} +1 -1
  271. package/ui-dist/assets/{index-CVZYu_kq.js → index-BwB67Zyz.js} +1 -1
  272. package/ui-dist/assets/index-C2peSkmT.css +1 -0
  273. package/ui-dist/assets/{index-Djz3PL1M.js → index-C3ktOsS_.js} +1 -1
  274. package/ui-dist/assets/{index-BMZfWLwr.js → index-CMyABlS-.js} +1 -1
  275. package/ui-dist/assets/{index-Cqdw7Lnc.js → index-CyBJ8ujC.js} +1 -1
  276. package/ui-dist/assets/{index-Ctp_0y5X.js → index-DAxM2W3O.js} +1 -1
  277. package/ui-dist/assets/{index-_jGthZ-1.js → index-DVZXPmhk.js} +1 -1
  278. package/ui-dist/assets/{index-CBLnbZVL.js → index-Dc19uAyw.js} +1 -1
  279. package/ui-dist/assets/index-DzHrwZu1.js +1511 -0
  280. package/ui-dist/assets/{index-ChTjk1gO.js → index-LJuf53Ye.js} +1 -1
  281. package/ui-dist/assets/{index-wXEAD8rI.js → index-Ugw5VWWz.js} +1 -1
  282. package/ui-dist/assets/{index-ciyPUpT9.js → index-YGraEFR7.js} +1 -1
  283. package/ui-dist/assets/{infoDiagram-LFFYTUFH-DbMzKsuw.js → infoDiagram-LFFYTUFH-jLmDtFVR.js} +1 -1
  284. package/ui-dist/assets/{ishikawaDiagram-PHBUUO56-CcKXcf2V.js → ishikawaDiagram-PHBUUO56-6OGMyLT8.js} +1 -1
  285. package/ui-dist/assets/{journeyDiagram-4ABVD52K-BY2GuHyR.js → journeyDiagram-4ABVD52K-yQjl6E0t.js} +1 -1
  286. package/ui-dist/assets/{kanban-definition-K7BYSVSG-BlZWM0Uz.js → kanban-definition-K7BYSVSG-DkdCeQlS.js} +1 -1
  287. package/ui-dist/assets/{layout-qHGAYgRY.js → layout-CqSYvZ_w.js} +1 -1
  288. package/ui-dist/assets/{linear-BigkGXbh.js → linear-B8xGZaoi.js} +1 -1
  289. package/ui-dist/assets/{mermaid.core-DZ099nW4.js → mermaid.core-AKL_cdyk.js} +4 -4
  290. package/ui-dist/assets/{mindmap-definition-YRQLILUH-CElDqDe0.js → mindmap-definition-YRQLILUH-Zr-dXC0x.js} +1 -1
  291. package/ui-dist/assets/{pieDiagram-SKSYHLDU-I2LDYrgm.js → pieDiagram-SKSYHLDU-BvDAU-Nk.js} +1 -1
  292. package/ui-dist/assets/{quadrantDiagram-337W2JSQ-D-U35edU.js → quadrantDiagram-337W2JSQ-Dn9kM62o.js} +1 -1
  293. package/ui-dist/assets/{requirementDiagram-Z7DCOOCP-FAWtaOKe.js → requirementDiagram-Z7DCOOCP-GIsIh7Sd.js} +1 -1
  294. package/ui-dist/assets/{sankeyDiagram-WA2Y5GQK-CzFHHNNh.js → sankeyDiagram-WA2Y5GQK-CUCuBkuf.js} +1 -1
  295. package/ui-dist/assets/{sequenceDiagram-2WXFIKYE-Cy-UViPL.js → sequenceDiagram-2WXFIKYE-MDpUY2HM.js} +1 -1
  296. package/ui-dist/assets/{stateDiagram-RAJIS63D-BEdt3CLl.js → stateDiagram-RAJIS63D-BymMpuUU.js} +1 -1
  297. package/ui-dist/assets/stateDiagram-v2-FVOUBMTO-Bi2oCU6d.js +1 -0
  298. package/ui-dist/assets/{timeline-definition-YZTLITO2-YD1e-WHS.js → timeline-definition-YZTLITO2-B6ofPhhy.js} +1 -1
  299. package/ui-dist/assets/{treemap-KZPCXAKY-BnqlVkAC.js → treemap-KZPCXAKY-DnLO6w1l.js} +1 -1
  300. package/ui-dist/assets/{vennDiagram-LZ73GAT5-f4WCy3o6.js → vennDiagram-LZ73GAT5-D0MyZIDl.js} +1 -1
  301. package/ui-dist/assets/{xychartDiagram-JWTSCODW-CWA35znA.js → xychartDiagram-JWTSCODW-rADY1iUG.js} +1 -1
  302. package/ui-dist/index.html +2 -2
  303. package/ui-dist/assets/channel-BV7st2TW.js +0 -1
  304. package/ui-dist/assets/classDiagram-VBA2DB6C-Cw_xj5ie.js +0 -1
  305. package/ui-dist/assets/classDiagram-v2-RAHNMMFH-Cw_xj5ie.js +0 -1
  306. package/ui-dist/assets/clone-DGshofUt.js +0 -1
  307. package/ui-dist/assets/index-Ded0dPwB.css +0 -1
  308. package/ui-dist/assets/index-Jhxth516.js +0 -1510
  309. package/ui-dist/assets/stateDiagram-v2-FVOUBMTO-cW7aES_v.js +0 -1
@@ -0,0 +1,1052 @@
1
+ import { and, eq } from "drizzle-orm";
2
+ import { agents, heartbeatRuns, issues, projects, } from "@rudderhq/db";
3
+ import { updateExecutionObservation, updateExecutionTraceIO, updateExecutionTraceName, updateExecutionTraceSession, withExecutionObservation, } from "../../langfuse.js";
4
+ import { emitExecutionTranscriptTree } from "../../langfuse-transcript.js";
5
+ import { logger } from "../../middleware/logger.js";
6
+ import { publishLiveEvent } from "../live-events.js";
7
+ import { findServerAdapter, getServerAdapter } from "../../agent-runtimes/index.js";
8
+ import { createLocalAgentJwt } from "../../agent-auth-jwt.js";
9
+ import { parseObject } from "../../agent-runtimes/utils.js";
10
+ import { resolveDefaultAgentWorkspaceDir, } from "../../home-paths.js";
11
+ import { summarizeHeartbeatRunResultJson } from "../heartbeat-run-summary.js";
12
+ import { buildWorkspaceReadyComment, cleanupExecutionWorkspaceArtifacts, ensureRuntimeServicesForRun, persistAdapterManagedRuntimeServices, realizeExecutionWorkspace, releaseRuntimeServicesForRun, } from "../workspace-runtime.js";
13
+ import { isManagedWorkspaceConfigurationError, isWorkspacePermissionPreflightError, preflightManagedAgentWorkspace, } from "../managed-workspace-preflight.js";
14
+ import { buildExecutionWorkspaceAdapterConfig, issueExecutionWorkspaceModeForPersistedWorkspace, parseIssueExecutionWorkspaceSettings, parseProjectExecutionWorkspacePolicy, resolveExecutionWorkspaceMode, } from "../execution-workspace-policy.js";
15
+ import { redactCurrentUserText } from "../../log-redaction.js";
16
+ import { buildIssueDocumentsPrompt } from "@rudderhq/agent-runtime-utils/server-utils";
17
+ import { executeAdapterWithModelFallbacks } from "./model-fallback.js";
18
+ export { prioritizeProjectWorkspaceCandidatesForRun } from "../agent-run-context.js";
19
+ import * as heartbeatCore from "./heartbeat.core.js";
20
+ import * as heartbeatSessions from "./heartbeat.sessions.js";
21
+ const { MAX_LIVE_LOG_CHUNK_BYTES, HEARTBEAT_MAX_CONCURRENT_RUNS_DEFAULT, HEARTBEAT_MAX_CONCURRENT_RUNS_MIN, HEARTBEAT_MAX_CONCURRENT_RUNS_MAX, DEFERRED_WAKE_CONTEXT_KEY, DETACHED_PROCESS_ERROR_CODE, ORPHANED_PROCESS_TERMINATION_GRACE_MS, ORPHANED_PROCESS_KILL_WAIT_MS, ORPHANED_PROCESS_POLL_INTERVAL_MS, startLocksByAgent, MAX_RECOVERY_CHAIN_DEPTH, ISSUE_PASSIVE_FOLLOWUP_REASON, ISSUE_PASSIVE_FOLLOWUP_WAKE_SOURCE, ISSUE_PASSIVE_FOLLOWUP_FAILURE_REASON, ISSUE_PASSIVE_FOLLOWUP_MAX_ATTEMPTS, ISSUE_REVIEW_CLOSEOUT_REASON, ISSUE_REVIEW_CLOSEOUT_FAILURE_REASON, ISSUE_REVIEW_CLOSEOUT_MAX_ATTEMPTS, ISSUE_PASSIVE_FOLLOWUP_COOLDOWN_MS_BY_ATTEMPT, ISSUE_PASSIVE_FOLLOWUP_TIMER_CONTINUITY_MAX_WINDOW_MS, SESSIONED_LOCAL_ADAPTERS, heartbeatRunListColumns, appendExcerpt, appendTranscriptEntriesFromChunk, normalizeMaxConcurrentRuns, withAgentStartLock, readNonEmptyString, resolveHeartbeatObservabilitySurface, buildHeartbeatObservationName, compactTraceText, buildIssueRunTraceName, buildHeartbeatRuntimeTraceMetadata, buildHeartbeatAdapterInvokePayload, buildRecentDateKeys, buildDateKeysBetween, fallbackSkillLabel, normalizeLoadedSkill, normalizeLoadedSkillForPayload, emptySkillEvidenceCounts, incrementSkillEvidenceCount, strongestSkillEvidence, resolveSkillEvidence, readSkillEvidenceFromPayload, extractSkillSlugFromPath, collectSkillPathsFromText, collectStringValues, normalizeSkillUseFromPath, dedupeSkillUses, collectSkillUsesFromText, readToolCommandInput, isCommandTranscriptTool, isReadTranscriptTool, inferUsedSkillsFromTranscript, normalizeSkillCandidate, addSkillCandidate, readSkillReferenceSlug, collectSkillReferences, inferUsedSkillsFromPrompt, normalizeLedgerBillingType, resolveLedgerBiller, normalizeBilledCostCents, resolveLedgerScopeForRun } = heartbeatCore;
22
+ const { buildExplicitResumeSessionOverride, normalizeUsageTotals, readRawUsageTotals, deriveNormalizedUsageDelta, formatCount, parseSessionCompactionPolicy, resolveRuntimeSessionParamsForWorkspace, parseIssueAssigneeAgentRuntimeOverrides, deriveTaskKey, shouldResetTaskSessionForWake, formatRuntimeWorkspaceWarningLog, describeSessionResetReason, deriveCommentId, enrichWakeContextSnapshot, mergeCoalescedContextSnapshot, issueCommentAuthorKind, issueCommentAuthorLabel, buildDeferredWakePayload, readDeferredWakeContext, readDeferredWakePayload, deriveDeferredWakeTaskKey, hydrateWakeContextSnapshot, firstNonEmptyLine, deriveRecoveryFailureKind, deriveRecoveryFailureSummary, mergeMissingRecoveryContextFields, hydrateRecoveryBaseContextSnapshot, buildRecoveryContextSnapshot, normalizePassiveFollowupContext, normalizeReviewCloseoutContext, passiveFollowupCooldownMs, issueHasReviewer, isAgentEligibleForTimerContinuation, hasCredibleTimerContinuation, buildPassiveFollowupContextSnapshot, runTaskKey, isSameTaskScope, isTrackedLocalChildProcessAdapter, isProcessAlive, waitForProcessExit, terminateOrphanedProcess, truncateDisplayId, normalizeAgentNameKey, defaultSessionCodec, getAgentRuntimeSessionCodec, normalizeSessionParams, resolveNextSessionState } = heartbeatSessions;
23
+ export function createHeartbeatExecuteHandlers(context) {
24
+ const { db, instanceSettings, getCurrentUserRedactionOptions, runLogStore, runContextSvc, issuesSvc, documentsSvc, executionWorkspacesSvc, workspaceOperationsSvc, activeRunExecutions, budgetHooks, budgets, getAgent, getRun, getRuntimeState, getTaskSession, getLatestRunForSession, getOldestRunForSession, resolveNormalizedUsageForSession, evaluateSessionCompaction, resolveSessionBeforeForWakeup, resolveExplicitResumeSessionOverride, upsertTaskSession, clearTaskSessions, ensureRuntimeState, buildHeartbeatObservabilityContext, emitHeartbeatObservationEvent, emitHeartbeatLiveEval, setRunStatus, setWakeupStatus, updateWakeupRequestRecord, insertWakeupRequestRecord, appendRunEvent, nextRunEventSeq, persistRunProcessMetadata, clearDetachedRunWarning, enqueueRecoveryRun, enqueueProcessLossRetry, parseHeartbeatPolicy, markAgentHeartbeatChecked, evaluateTimerPreflight, runHasIssueClosureComment, runHasIssueReviewDecision, issueHasDeferredWake, passiveFollowupAlreadyRecorded, reviewerCloseoutAlreadyRecorded, issueHasConfirmedBlockedReviewerHandoff, evaluatePassiveIssueClosureForLockedIssue, countRunningRunsForAgent, claimQueuedRun, finalizeAgentStatus, reapOrphanedRuns, resumeQueuedRuns, updateRuntimeState, startNextQueuedRunForAgent, releaseIssueExecutionAndPromote, enqueueWakeup, resumeDeferredWakeupsForAgent, listProjectScopedRunIds, listProjectScopedWakeupIds, cancelPendingWakeupsForBudgetScope, cancelRunInternal, cancelActiveForAgentInternal, cancelBudgetScopeWork, retryRunInternal, buildSkillAnalytics } = context;
25
+ async function executeRun(runId) {
26
+ let run = await getRun(runId);
27
+ if (!run)
28
+ return;
29
+ if (run.status !== "queued" && run.status !== "running")
30
+ return;
31
+ if (run.status === "queued") {
32
+ const claimed = await claimQueuedRun(run);
33
+ if (!claimed) {
34
+ // Another worker has already claimed or finalized this run.
35
+ return;
36
+ }
37
+ run = claimed;
38
+ }
39
+ activeRunExecutions.add(run.id);
40
+ try {
41
+ const agent = await getAgent(run.agentId);
42
+ if (!agent) {
43
+ await setRunStatus(runId, "failed", {
44
+ error: "Agent not found",
45
+ errorCode: "agent_not_found",
46
+ finishedAt: new Date(),
47
+ });
48
+ await setWakeupStatus(run.wakeupRequestId, "failed", {
49
+ finishedAt: new Date(),
50
+ error: "Agent not found",
51
+ });
52
+ const failedRun = await getRun(runId);
53
+ if (failedRun)
54
+ await releaseIssueExecutionAndPromote(failedRun);
55
+ return;
56
+ }
57
+ const heartbeatObservationContext = buildHeartbeatObservabilityContext(run, {
58
+ runtime: agent.agentRuntimeType,
59
+ metadata: {
60
+ agentName: agent.name,
61
+ invocationSource: run.invocationSource,
62
+ triggerDetail: run.triggerDetail,
63
+ },
64
+ });
65
+ await withExecutionObservation(heartbeatObservationContext, {
66
+ name: buildHeartbeatObservationName(run, agent.name),
67
+ asType: "agent",
68
+ input: {
69
+ agentId: agent.id,
70
+ agentName: agent.name,
71
+ invocationSource: run.invocationSource,
72
+ triggerDetail: run.triggerDetail,
73
+ issueId: readNonEmptyString(parseObject(run.contextSnapshot).issueId),
74
+ },
75
+ }, async (observation) => {
76
+ const executionTranscript = [];
77
+ let stdoutTranscriptBuffer = "";
78
+ let stderrTranscriptBuffer = "";
79
+ let stdoutTranscriptParser = null;
80
+ let transcriptFallbackResult = null;
81
+ let modelTurnInput;
82
+ let finalObservationOutput = null;
83
+ let finalObservationStatus = run.status;
84
+ let finalObservationSessionId = heartbeatObservationContext.sessionKey ?? null;
85
+ const runtime = await ensureRuntimeState(agent);
86
+ const context = parseObject(run.contextSnapshot);
87
+ delete context.rudderGitIdentity;
88
+ const taskKey = deriveTaskKey(context, null);
89
+ const sessionCodec = getAgentRuntimeSessionCodec(agent.agentRuntimeType);
90
+ const issueId = readNonEmptyString(context.issueId);
91
+ const issueContext = issueId
92
+ ? await db
93
+ .select({
94
+ id: issues.id,
95
+ identifier: issues.identifier,
96
+ title: issues.title,
97
+ description: issues.description,
98
+ projectId: issues.projectId,
99
+ projectWorkspaceId: issues.projectWorkspaceId,
100
+ executionWorkspaceId: issues.executionWorkspaceId,
101
+ executionWorkspacePreference: issues.executionWorkspacePreference,
102
+ assigneeAgentId: issues.assigneeAgentId,
103
+ assigneeAgentRuntimeOverrides: issues.assigneeAgentRuntimeOverrides,
104
+ executionWorkspaceSettings: issues.executionWorkspaceSettings,
105
+ })
106
+ .from(issues)
107
+ .where(and(eq(issues.id, issueId), eq(issues.orgId, agent.orgId)))
108
+ .then((rows) => rows[0] ?? null)
109
+ : null;
110
+ const issueAssigneeOverrides = issueContext && issueContext.assigneeAgentId === agent.id
111
+ ? parseIssueAssigneeAgentRuntimeOverrides(issueContext.assigneeAgentRuntimeOverrides)
112
+ : null;
113
+ const issueExecutionWorkspaceSettings = parseIssueExecutionWorkspaceSettings(issueContext?.executionWorkspaceSettings);
114
+ const contextProjectId = readNonEmptyString(context.projectId);
115
+ const executionProjectId = issueContext?.projectId ?? contextProjectId;
116
+ const projectExecutionWorkspacePolicy = executionProjectId
117
+ ? await db
118
+ .select({ executionWorkspacePolicy: projects.executionWorkspacePolicy })
119
+ .from(projects)
120
+ .where(and(eq(projects.id, executionProjectId), eq(projects.orgId, agent.orgId)))
121
+ .then((rows) => parseProjectExecutionWorkspacePolicy(rows[0]?.executionWorkspacePolicy))
122
+ : null;
123
+ const taskSession = taskKey
124
+ ? await getTaskSession(agent.orgId, agent.id, agent.agentRuntimeType, taskKey)
125
+ : null;
126
+ const resetTaskSession = shouldResetTaskSessionForWake(context);
127
+ const sessionResetReason = describeSessionResetReason(context);
128
+ const taskSessionForRun = resetTaskSession ? null : taskSession;
129
+ const explicitResumeSessionParams = normalizeSessionParams(sessionCodec.deserialize(parseObject(context.resumeSessionParams)));
130
+ const explicitResumeSessionDisplayId = truncateDisplayId(readNonEmptyString(context.resumeSessionDisplayId) ??
131
+ (sessionCodec.getDisplayId ? sessionCodec.getDisplayId(explicitResumeSessionParams) : null) ??
132
+ readNonEmptyString(explicitResumeSessionParams?.sessionId));
133
+ const previousSessionParams = explicitResumeSessionParams ??
134
+ (explicitResumeSessionDisplayId ? { sessionId: explicitResumeSessionDisplayId } : null) ??
135
+ normalizeSessionParams(sessionCodec.deserialize(taskSessionForRun?.sessionParamsJson ?? null));
136
+ const config = parseObject(agent.agentRuntimeConfig);
137
+ const executionWorkspaceMode = resolveExecutionWorkspaceMode({
138
+ projectPolicy: projectExecutionWorkspacePolicy,
139
+ issueSettings: issueExecutionWorkspaceSettings,
140
+ legacyUseProjectWorkspace: issueAssigneeOverrides?.useProjectWorkspace ?? null,
141
+ });
142
+ const resolvedWorkspace = await runContextSvc.resolveWorkspaceForRun(agent, context, previousSessionParams, { useProjectWorkspace: executionWorkspaceMode !== "agent_default" });
143
+ const workspaceManagedConfig = buildExecutionWorkspaceAdapterConfig({
144
+ agentConfig: config,
145
+ projectPolicy: projectExecutionWorkspacePolicy,
146
+ issueSettings: issueExecutionWorkspaceSettings,
147
+ mode: executionWorkspaceMode,
148
+ legacyUseProjectWorkspace: issueAssigneeOverrides?.useProjectWorkspace ?? null,
149
+ });
150
+ const mergedConfig = issueAssigneeOverrides?.agentRuntimeConfig
151
+ ? { ...workspaceManagedConfig, ...issueAssigneeOverrides.agentRuntimeConfig }
152
+ : workspaceManagedConfig;
153
+ const { resolvedConfig, runtimeConfig, runtimeSkillEntries, secretKeys } = await runContextSvc.prepareRuntimeConfig({
154
+ scene: "heartbeat",
155
+ agent,
156
+ baseConfig: mergedConfig,
157
+ });
158
+ heartbeatObservationContext.metadata = {
159
+ ...(heartbeatObservationContext.metadata ?? {}),
160
+ ...buildHeartbeatRuntimeTraceMetadata({
161
+ runtimeConfig,
162
+ runtimeSkills: runtimeSkillEntries,
163
+ }),
164
+ };
165
+ const issueRef = issueContext
166
+ ? {
167
+ id: issueContext.id,
168
+ identifier: issueContext.identifier,
169
+ title: issueContext.title,
170
+ projectId: issueContext.projectId,
171
+ projectWorkspaceId: issueContext.projectWorkspaceId,
172
+ executionWorkspaceId: issueContext.executionWorkspaceId,
173
+ executionWorkspacePreference: issueContext.executionWorkspacePreference,
174
+ }
175
+ : null;
176
+ const rootObservationInput = {
177
+ agentId: agent.id,
178
+ agentName: agent.name,
179
+ invocationSource: run.invocationSource,
180
+ triggerDetail: run.triggerDetail,
181
+ issue: issueRef
182
+ ? {
183
+ id: issueRef.id,
184
+ identifier: issueRef.identifier ?? null,
185
+ title: issueRef.title ?? null,
186
+ }
187
+ : null,
188
+ };
189
+ updateExecutionObservation(observation, heartbeatObservationContext, {
190
+ input: rootObservationInput,
191
+ });
192
+ updateExecutionTraceIO(observation, { input: rootObservationInput });
193
+ if (issueRef) {
194
+ updateExecutionTraceName(observation, buildIssueRunTraceName({
195
+ issueTitle: issueRef.title,
196
+ issueId: issueRef.id,
197
+ }));
198
+ }
199
+ const existingExecutionWorkspace = issueRef?.executionWorkspaceId ? await executionWorkspacesSvc.getById(issueRef.executionWorkspaceId) : null;
200
+ const workspaceOperationRecorder = workspaceOperationsSvc.createRecorder({
201
+ orgId: agent.orgId,
202
+ heartbeatRunId: run.id,
203
+ executionWorkspaceId: existingExecutionWorkspace?.id ?? null,
204
+ });
205
+ const executionWorkspace = await realizeExecutionWorkspace({
206
+ base: {
207
+ baseCwd: resolvedWorkspace.cwd,
208
+ source: resolvedWorkspace.source,
209
+ projectId: resolvedWorkspace.projectId,
210
+ workspaceId: resolvedWorkspace.workspaceId,
211
+ repoUrl: resolvedWorkspace.repoUrl,
212
+ repoRef: resolvedWorkspace.repoRef,
213
+ },
214
+ config: runtimeConfig,
215
+ issue: issueRef,
216
+ agent: {
217
+ id: agent.id,
218
+ name: agent.name,
219
+ orgId: agent.orgId,
220
+ },
221
+ recorder: workspaceOperationRecorder,
222
+ });
223
+ const resolvedProjectId = executionWorkspace.projectId ?? issueRef?.projectId ?? executionProjectId ?? null;
224
+ const resolvedProjectWorkspaceId = issueRef?.projectWorkspaceId ?? resolvedWorkspace.workspaceId ?? null;
225
+ const shouldReuseExisting = issueRef?.executionWorkspacePreference === "reuse_existing" &&
226
+ existingExecutionWorkspace &&
227
+ existingExecutionWorkspace.status !== "archived";
228
+ let persistedExecutionWorkspace = null;
229
+ try {
230
+ persistedExecutionWorkspace = shouldReuseExisting && existingExecutionWorkspace
231
+ ? await executionWorkspacesSvc.update(existingExecutionWorkspace.id, {
232
+ cwd: executionWorkspace.cwd,
233
+ repoUrl: executionWorkspace.repoUrl,
234
+ baseRef: executionWorkspace.repoRef,
235
+ branchName: executionWorkspace.branchName,
236
+ providerType: executionWorkspace.strategy === "git_worktree" ? "git_worktree" : "local_fs",
237
+ providerRef: executionWorkspace.worktreePath,
238
+ status: "active",
239
+ lastUsedAt: new Date(),
240
+ metadata: {
241
+ ...(existingExecutionWorkspace.metadata ?? {}),
242
+ source: executionWorkspace.source,
243
+ createdByRuntime: executionWorkspace.created,
244
+ },
245
+ })
246
+ : resolvedProjectId
247
+ ? await executionWorkspacesSvc.create({
248
+ orgId: agent.orgId,
249
+ projectId: resolvedProjectId,
250
+ projectWorkspaceId: resolvedProjectWorkspaceId,
251
+ sourceIssueId: issueRef?.id ?? null,
252
+ mode: executionWorkspaceMode === "isolated_workspace"
253
+ ? "isolated_workspace"
254
+ : executionWorkspaceMode === "operator_branch"
255
+ ? "operator_branch"
256
+ : executionWorkspaceMode === "agent_default"
257
+ ? "adapter_managed"
258
+ : "shared_workspace",
259
+ strategyType: executionWorkspace.strategy === "git_worktree" ? "git_worktree" : "project_primary",
260
+ name: executionWorkspace.branchName ?? issueRef?.identifier ?? `workspace-${agent.id.slice(0, 8)}`,
261
+ status: "active",
262
+ cwd: executionWorkspace.cwd,
263
+ repoUrl: executionWorkspace.repoUrl,
264
+ baseRef: executionWorkspace.repoRef,
265
+ branchName: executionWorkspace.branchName,
266
+ providerType: executionWorkspace.strategy === "git_worktree" ? "git_worktree" : "local_fs",
267
+ providerRef: executionWorkspace.worktreePath,
268
+ lastUsedAt: new Date(),
269
+ openedAt: new Date(),
270
+ metadata: {
271
+ source: executionWorkspace.source,
272
+ createdByRuntime: executionWorkspace.created,
273
+ },
274
+ })
275
+ : null;
276
+ }
277
+ catch (error) {
278
+ if (executionWorkspace.created) {
279
+ try {
280
+ await cleanupExecutionWorkspaceArtifacts({
281
+ workspace: {
282
+ id: existingExecutionWorkspace?.id ?? `transient-${run.id}`,
283
+ cwd: executionWorkspace.cwd,
284
+ providerType: executionWorkspace.strategy === "git_worktree" ? "git_worktree" : "local_fs",
285
+ providerRef: executionWorkspace.worktreePath,
286
+ branchName: executionWorkspace.branchName,
287
+ repoUrl: executionWorkspace.repoUrl,
288
+ baseRef: executionWorkspace.repoRef,
289
+ projectId: resolvedProjectId,
290
+ projectWorkspaceId: resolvedProjectWorkspaceId,
291
+ sourceIssueId: issueRef?.id ?? null,
292
+ metadata: {
293
+ createdByRuntime: true,
294
+ source: executionWorkspace.source,
295
+ },
296
+ },
297
+ projectWorkspace: {
298
+ cwd: resolvedWorkspace.cwd,
299
+ cleanupCommand: null,
300
+ },
301
+ teardownCommand: projectExecutionWorkspacePolicy?.workspaceStrategy?.teardownCommand ?? null,
302
+ recorder: workspaceOperationRecorder,
303
+ });
304
+ }
305
+ catch (cleanupError) {
306
+ logger.warn({
307
+ runId: run.id,
308
+ issueId,
309
+ executionWorkspaceCwd: executionWorkspace.cwd,
310
+ cleanupError: cleanupError instanceof Error ? cleanupError.message : String(cleanupError),
311
+ }, "Failed to cleanup realized execution workspace after persistence failure");
312
+ }
313
+ }
314
+ throw error;
315
+ }
316
+ await workspaceOperationRecorder.attachExecutionWorkspaceId(persistedExecutionWorkspace?.id ?? null);
317
+ if (existingExecutionWorkspace &&
318
+ persistedExecutionWorkspace &&
319
+ existingExecutionWorkspace.id !== persistedExecutionWorkspace.id &&
320
+ existingExecutionWorkspace.status === "active") {
321
+ await executionWorkspacesSvc.update(existingExecutionWorkspace.id, {
322
+ status: "idle",
323
+ cleanupReason: null,
324
+ });
325
+ }
326
+ if (issueId && persistedExecutionWorkspace) {
327
+ const nextIssueWorkspaceMode = issueExecutionWorkspaceModeForPersistedWorkspace(persistedExecutionWorkspace.mode);
328
+ const shouldSwitchIssueToExistingWorkspace = issueRef?.executionWorkspacePreference === "reuse_existing" ||
329
+ executionWorkspaceMode === "isolated_workspace" ||
330
+ executionWorkspaceMode === "operator_branch";
331
+ const nextIssuePatch = {};
332
+ if (issueRef?.executionWorkspaceId !== persistedExecutionWorkspace.id) {
333
+ nextIssuePatch.executionWorkspaceId = persistedExecutionWorkspace.id;
334
+ }
335
+ if (resolvedProjectWorkspaceId && issueRef?.projectWorkspaceId !== resolvedProjectWorkspaceId) {
336
+ nextIssuePatch.projectWorkspaceId = resolvedProjectWorkspaceId;
337
+ }
338
+ if (shouldSwitchIssueToExistingWorkspace) {
339
+ nextIssuePatch.executionWorkspacePreference = "reuse_existing";
340
+ nextIssuePatch.executionWorkspaceSettings = {
341
+ ...(issueExecutionWorkspaceSettings ?? {}),
342
+ mode: nextIssueWorkspaceMode,
343
+ };
344
+ }
345
+ if (Object.keys(nextIssuePatch).length > 0) {
346
+ await issuesSvc.update(issueId, nextIssuePatch);
347
+ }
348
+ }
349
+ if (persistedExecutionWorkspace) {
350
+ context.executionWorkspaceId = persistedExecutionWorkspace.id;
351
+ await db
352
+ .update(heartbeatRuns)
353
+ .set({
354
+ contextSnapshot: context,
355
+ updatedAt: new Date(),
356
+ })
357
+ .where(eq(heartbeatRuns.id, run.id));
358
+ }
359
+ const runtimeSessionResolution = resolveRuntimeSessionParamsForWorkspace({
360
+ orgId: agent.orgId,
361
+ agent,
362
+ previousSessionParams,
363
+ resolvedWorkspace: {
364
+ ...resolvedWorkspace,
365
+ cwd: resolveDefaultAgentWorkspaceDir(agent.orgId, agent),
366
+ source: "agent_home",
367
+ },
368
+ });
369
+ const runtimeSessionParams = runtimeSessionResolution.sessionParams;
370
+ const runtimeWorkspaceWarnings = [
371
+ ...resolvedWorkspace.warnings,
372
+ ...executionWorkspace.warnings,
373
+ ...(runtimeSessionResolution.warning ? [runtimeSessionResolution.warning] : []),
374
+ ...(resetTaskSession && sessionResetReason
375
+ ? [
376
+ taskKey
377
+ ? `Skipping saved session resume for task "${taskKey}" because ${sessionResetReason}.`
378
+ : `Skipping saved session resume because ${sessionResetReason}.`,
379
+ ]
380
+ : []),
381
+ ];
382
+ const runtimeSceneContext = await runContextSvc.buildSceneContext({
383
+ scene: "heartbeat",
384
+ agent,
385
+ resolvedWorkspace,
386
+ runtimeConfig,
387
+ executionWorkspaceMode,
388
+ executionWorkspace: {
389
+ cwd: executionWorkspace.cwd,
390
+ source: executionWorkspace.source,
391
+ strategy: executionWorkspace.strategy,
392
+ projectId: executionWorkspace.projectId,
393
+ workspaceId: executionWorkspace.workspaceId,
394
+ repoUrl: executionWorkspace.repoUrl,
395
+ repoRef: executionWorkspace.repoRef,
396
+ branchName: executionWorkspace.branchName,
397
+ worktreePath: executionWorkspace.worktreePath,
398
+ },
399
+ });
400
+ context.rudderScene = runtimeSceneContext.rudderScene;
401
+ context.rudderWorkspace = runtimeSceneContext.rudderWorkspace;
402
+ context.rudderWorkspaces = runtimeSceneContext.rudderWorkspaces;
403
+ if (runtimeSceneContext.rudderRuntimeServiceIntents) {
404
+ context.rudderRuntimeServiceIntents = runtimeSceneContext.rudderRuntimeServiceIntents;
405
+ }
406
+ else {
407
+ delete context.rudderRuntimeServiceIntents;
408
+ }
409
+ if (executionWorkspace.projectId && !readNonEmptyString(context.projectId)) {
410
+ context.projectId = executionWorkspace.projectId;
411
+ }
412
+ if (issueContext) {
413
+ const issueDocumentPayload = await documentsSvc.getIssueDocumentPayload({
414
+ id: issueContext.id,
415
+ description: issueContext.description,
416
+ });
417
+ const issueDocumentsPrompt = buildIssueDocumentsPrompt(issueDocumentPayload);
418
+ if (issueDocumentsPrompt) {
419
+ context.issueDocumentsPrompt = issueDocumentsPrompt;
420
+ }
421
+ else {
422
+ delete context.issueDocumentsPrompt;
423
+ }
424
+ }
425
+ const runtimeSessionFallback = taskKey || resetTaskSession ? null : runtime.sessionId;
426
+ let previousSessionDisplayId = truncateDisplayId(explicitResumeSessionDisplayId ??
427
+ taskSessionForRun?.sessionDisplayId ??
428
+ (sessionCodec.getDisplayId ? sessionCodec.getDisplayId(runtimeSessionParams) : null) ??
429
+ readNonEmptyString(runtimeSessionParams?.sessionId) ??
430
+ runtimeSessionFallback);
431
+ let runtimeSessionIdForAdapter = readNonEmptyString(runtimeSessionParams?.sessionId) ?? runtimeSessionFallback;
432
+ let runtimeSessionParamsForAdapter = runtimeSessionParams;
433
+ const sessionCompaction = await evaluateSessionCompaction({
434
+ agent,
435
+ sessionId: previousSessionDisplayId ?? runtimeSessionIdForAdapter,
436
+ issueId,
437
+ });
438
+ if (sessionCompaction.rotate) {
439
+ context.rudderSessionHandoffMarkdown = sessionCompaction.handoffMarkdown;
440
+ context.rudderSessionRotationReason = sessionCompaction.reason;
441
+ context.rudderPreviousSessionId = previousSessionDisplayId ?? runtimeSessionIdForAdapter;
442
+ runtimeSessionIdForAdapter = null;
443
+ runtimeSessionParamsForAdapter = null;
444
+ previousSessionDisplayId = null;
445
+ if (sessionCompaction.reason) {
446
+ runtimeWorkspaceWarnings.push(`Starting a fresh session because ${sessionCompaction.reason}.`);
447
+ }
448
+ }
449
+ else {
450
+ delete context.rudderSessionHandoffMarkdown;
451
+ delete context.rudderSessionRotationReason;
452
+ delete context.rudderPreviousSessionId;
453
+ }
454
+ const runtimeForAdapter = {
455
+ sessionId: runtimeSessionIdForAdapter,
456
+ sessionParams: runtimeSessionParamsForAdapter,
457
+ sessionDisplayId: previousSessionDisplayId,
458
+ taskKey,
459
+ };
460
+ let seq = 1;
461
+ let handle = null;
462
+ let stdoutExcerpt = "";
463
+ let stderrExcerpt = "";
464
+ try {
465
+ await preflightManagedAgentWorkspace({
466
+ agentHome: readNonEmptyString(runtimeSceneContext.rudderWorkspace.agentHome) ?? "",
467
+ instructionsDir: readNonEmptyString(runtimeSceneContext.rudderWorkspace.instructionsDir) ?? "",
468
+ memoryDir: readNonEmptyString(runtimeSceneContext.rudderWorkspace.memoryDir) ?? "",
469
+ lifeDir: readNonEmptyString(runtimeSceneContext.rudderWorkspace.lifeDir) ?? "",
470
+ skillsDir: readNonEmptyString(runtimeSceneContext.rudderWorkspace.agentSkillsDir) ?? "",
471
+ });
472
+ const startedAt = run.startedAt ?? new Date();
473
+ const runningWithSession = await db
474
+ .update(heartbeatRuns)
475
+ .set({
476
+ startedAt,
477
+ sessionIdBefore: runtimeForAdapter.sessionDisplayId ?? runtimeForAdapter.sessionId,
478
+ contextSnapshot: context,
479
+ updatedAt: new Date(),
480
+ })
481
+ .where(eq(heartbeatRuns.id, run.id))
482
+ .returning()
483
+ .then((rows) => rows[0] ?? null);
484
+ if (runningWithSession)
485
+ run = runningWithSession;
486
+ const runningAgent = await db
487
+ .update(agents)
488
+ .set({ status: "running", updatedAt: new Date() })
489
+ .where(eq(agents.id, agent.id))
490
+ .returning()
491
+ .then((rows) => rows[0] ?? null);
492
+ if (runningAgent) {
493
+ publishLiveEvent({
494
+ orgId: runningAgent.orgId,
495
+ type: "agent.status",
496
+ payload: {
497
+ agentId: runningAgent.id,
498
+ status: runningAgent.status,
499
+ outcome: "running",
500
+ },
501
+ });
502
+ }
503
+ const currentRun = run;
504
+ await appendRunEvent(currentRun, seq++, {
505
+ eventType: "lifecycle",
506
+ stream: "system",
507
+ level: "info",
508
+ message: "run started",
509
+ });
510
+ handle = await runLogStore.begin({
511
+ orgId: run.orgId,
512
+ agentId: run.agentId,
513
+ runId,
514
+ });
515
+ await db
516
+ .update(heartbeatRuns)
517
+ .set({
518
+ logStore: handle.store,
519
+ logRef: handle.logRef,
520
+ updatedAt: new Date(),
521
+ })
522
+ .where(eq(heartbeatRuns.id, runId));
523
+ const adapter = getServerAdapter(agent.agentRuntimeType);
524
+ stdoutTranscriptParser = adapter.parseStdoutLine ?? null;
525
+ const currentUserRedactionOptions = await getCurrentUserRedactionOptions();
526
+ const onLog = async (stream, chunk) => {
527
+ const sanitizedChunk = redactCurrentUserText(chunk, currentUserRedactionOptions);
528
+ if (stream === "stdout")
529
+ stdoutExcerpt = appendExcerpt(stdoutExcerpt, sanitizedChunk);
530
+ if (stream === "stderr")
531
+ stderrExcerpt = appendExcerpt(stderrExcerpt, sanitizedChunk);
532
+ const ts = new Date().toISOString();
533
+ if (handle) {
534
+ await runLogStore.append(handle, {
535
+ stream,
536
+ chunk: sanitizedChunk,
537
+ ts,
538
+ });
539
+ }
540
+ const payloadChunk = sanitizedChunk.length > MAX_LIVE_LOG_CHUNK_BYTES
541
+ ? sanitizedChunk.slice(sanitizedChunk.length - MAX_LIVE_LOG_CHUNK_BYTES)
542
+ : sanitizedChunk;
543
+ publishLiveEvent({
544
+ orgId: run.orgId,
545
+ type: "heartbeat.run.log",
546
+ payload: {
547
+ runId: run.id,
548
+ agentId: run.agentId,
549
+ ts,
550
+ stream,
551
+ chunk: payloadChunk,
552
+ truncated: payloadChunk.length !== sanitizedChunk.length,
553
+ },
554
+ });
555
+ if (stream === "stdout") {
556
+ stdoutTranscriptBuffer = appendTranscriptEntriesFromChunk({
557
+ buffer: stdoutTranscriptBuffer,
558
+ chunk: sanitizedChunk,
559
+ transcript: executionTranscript,
560
+ parser: stdoutTranscriptParser,
561
+ kind: "stdout",
562
+ });
563
+ return;
564
+ }
565
+ stderrTranscriptBuffer = appendTranscriptEntriesFromChunk({
566
+ buffer: stderrTranscriptBuffer,
567
+ chunk: sanitizedChunk,
568
+ transcript: executionTranscript,
569
+ kind: "stderr",
570
+ });
571
+ };
572
+ for (const warning of runtimeWorkspaceWarnings) {
573
+ const logEntry = formatRuntimeWorkspaceWarningLog(warning);
574
+ await onLog(logEntry.stream, logEntry.chunk);
575
+ }
576
+ const adapterEnv = Object.fromEntries(Object.entries(parseObject(resolvedConfig.env)).filter((entry) => typeof entry[0] === "string" && typeof entry[1] === "string"));
577
+ const runtimeServices = await ensureRuntimeServicesForRun({
578
+ db,
579
+ runId: run.id,
580
+ agent: {
581
+ id: agent.id,
582
+ name: agent.name,
583
+ orgId: agent.orgId,
584
+ },
585
+ issue: issueRef,
586
+ workspace: executionWorkspace,
587
+ executionWorkspaceId: persistedExecutionWorkspace?.id ?? issueRef?.executionWorkspaceId ?? null,
588
+ config: resolvedConfig,
589
+ adapterEnv,
590
+ onLog,
591
+ });
592
+ if (runtimeServices.length > 0) {
593
+ context.rudderRuntimeServices = runtimeServices;
594
+ context.rudderRuntimePrimaryUrl =
595
+ runtimeServices.find((service) => readNonEmptyString(service.url))?.url ?? null;
596
+ await db
597
+ .update(heartbeatRuns)
598
+ .set({
599
+ contextSnapshot: context,
600
+ updatedAt: new Date(),
601
+ })
602
+ .where(eq(heartbeatRuns.id, run.id));
603
+ }
604
+ if (issueId && (executionWorkspace.created || runtimeServices.some((service) => !service.reused))) {
605
+ try {
606
+ await issuesSvc.addComment(issueId, buildWorkspaceReadyComment({
607
+ workspace: executionWorkspace,
608
+ runtimeServices,
609
+ }), { agentId: agent.id });
610
+ }
611
+ catch (err) {
612
+ await onLog("stderr", `[rudder] Failed to post workspace-ready comment: ${err instanceof Error ? err.message : String(err)}\n`);
613
+ }
614
+ }
615
+ const onAdapterMeta = async (meta) => {
616
+ if (meta.env && secretKeys.size > 0) {
617
+ for (const key of secretKeys) {
618
+ if (key in meta.env)
619
+ meta.env[key] = "***REDACTED***";
620
+ }
621
+ }
622
+ modelTurnInput = meta.prompt;
623
+ heartbeatObservationContext.metadata = {
624
+ ...(heartbeatObservationContext.metadata ?? {}),
625
+ ...buildHeartbeatRuntimeTraceMetadata({
626
+ runtimeConfig,
627
+ runtimeSkills: runtimeSkillEntries,
628
+ adapterMeta: meta,
629
+ }),
630
+ };
631
+ updateExecutionObservation(observation, heartbeatObservationContext, {
632
+ input: rootObservationInput,
633
+ });
634
+ await appendRunEvent(currentRun, seq++, {
635
+ eventType: "adapter.invoke",
636
+ stream: "system",
637
+ level: "info",
638
+ message: "adapter invocation",
639
+ payload: buildHeartbeatAdapterInvokePayload({
640
+ meta,
641
+ runtimeSkills: runtimeSkillEntries,
642
+ }),
643
+ });
644
+ };
645
+ const authToken = adapter.supportsLocalAgentJwt
646
+ ? createLocalAgentJwt(agent.id, agent.orgId, agent.agentRuntimeType, run.id)
647
+ : null;
648
+ if (adapter.supportsLocalAgentJwt && !authToken) {
649
+ logger.warn({
650
+ orgId: agent.orgId,
651
+ agentId: agent.id,
652
+ runId: run.id,
653
+ agentRuntimeType: agent.agentRuntimeType,
654
+ }, "local agent jwt secret missing or invalid; running without injected RUDDER_API_KEY");
655
+ }
656
+ const adapterResult = await executeAdapterWithModelFallbacks(adapter, {
657
+ runId: run.id,
658
+ agent,
659
+ runtime: runtimeForAdapter,
660
+ config: runtimeConfig,
661
+ context,
662
+ onLog,
663
+ onMeta: onAdapterMeta,
664
+ onSpawn: async (meta) => {
665
+ await persistRunProcessMetadata(run.id, meta);
666
+ },
667
+ authToken: authToken ?? undefined,
668
+ }, {
669
+ resolveAdapter: findServerAdapter,
670
+ createAuthToken: (agentRuntimeType) => createLocalAgentJwt(agent.id, agent.orgId, agentRuntimeType, run.id) ?? undefined,
671
+ onAttemptStart: (_attempt, attemptAdapter) => {
672
+ stdoutTranscriptParser = attemptAdapter.parseStdoutLine ?? null;
673
+ },
674
+ });
675
+ const adapterManagedRuntimeServices = adapterResult.runtimeServices
676
+ ? await persistAdapterManagedRuntimeServices({
677
+ db,
678
+ agentRuntimeType: agent.agentRuntimeType,
679
+ runId: run.id,
680
+ agent: {
681
+ id: agent.id,
682
+ name: agent.name,
683
+ orgId: agent.orgId,
684
+ },
685
+ issue: issueRef,
686
+ workspace: executionWorkspace,
687
+ reports: adapterResult.runtimeServices,
688
+ })
689
+ : [];
690
+ if (adapterManagedRuntimeServices.length > 0) {
691
+ const combinedRuntimeServices = [
692
+ ...runtimeServices,
693
+ ...adapterManagedRuntimeServices,
694
+ ];
695
+ context.rudderRuntimeServices = combinedRuntimeServices;
696
+ context.rudderRuntimePrimaryUrl =
697
+ combinedRuntimeServices.find((service) => readNonEmptyString(service.url))?.url ?? null;
698
+ await db
699
+ .update(heartbeatRuns)
700
+ .set({
701
+ contextSnapshot: context,
702
+ updatedAt: new Date(),
703
+ })
704
+ .where(eq(heartbeatRuns.id, run.id));
705
+ if (issueId) {
706
+ try {
707
+ await issuesSvc.addComment(issueId, buildWorkspaceReadyComment({
708
+ workspace: executionWorkspace,
709
+ runtimeServices: adapterManagedRuntimeServices,
710
+ }), { agentId: agent.id });
711
+ }
712
+ catch (err) {
713
+ await onLog("stderr", `[rudder] Failed to post adapter-managed runtime comment: ${err instanceof Error ? err.message : String(err)}\n`);
714
+ }
715
+ }
716
+ }
717
+ const nextSessionState = resolveNextSessionState({
718
+ codec: sessionCodec,
719
+ adapterResult,
720
+ previousParams: previousSessionParams,
721
+ previousDisplayId: runtimeForAdapter.sessionDisplayId,
722
+ previousLegacySessionId: runtimeForAdapter.sessionId,
723
+ });
724
+ const rawUsage = normalizeUsageTotals(adapterResult.usage);
725
+ const sessionUsageResolution = await resolveNormalizedUsageForSession({
726
+ agentId: agent.id,
727
+ runId: run.id,
728
+ sessionId: nextSessionState.displayId ?? nextSessionState.legacySessionId,
729
+ rawUsage,
730
+ });
731
+ const normalizedUsage = sessionUsageResolution.normalizedUsage;
732
+ let outcome;
733
+ const latestRun = await getRun(run.id);
734
+ if (latestRun?.status === "cancelled") {
735
+ outcome = "cancelled";
736
+ }
737
+ else if (adapterResult.timedOut) {
738
+ outcome = "timed_out";
739
+ }
740
+ else if ((adapterResult.exitCode ?? 0) === 0 && !adapterResult.errorMessage) {
741
+ outcome = "succeeded";
742
+ }
743
+ else {
744
+ outcome = "failed";
745
+ }
746
+ let logSummary = null;
747
+ if (handle) {
748
+ logSummary = await runLogStore.finalize(handle);
749
+ }
750
+ const status = outcome === "succeeded"
751
+ ? "succeeded"
752
+ : outcome === "cancelled"
753
+ ? "cancelled"
754
+ : outcome === "timed_out"
755
+ ? "timed_out"
756
+ : "failed";
757
+ heartbeatObservationContext.status = status;
758
+ finalObservationStatus = status;
759
+ finalObservationSessionId = nextSessionState.displayId ?? nextSessionState.legacySessionId ?? finalObservationSessionId;
760
+ const adapterResultSummary = summarizeHeartbeatRunResultJson(adapterResult.resultJson);
761
+ transcriptFallbackResult = {
762
+ ts: new Date().toISOString(),
763
+ model: readNonEmptyString(adapterResult.model),
764
+ output: readNonEmptyString(adapterResult.summary)
765
+ ?? readNonEmptyString(adapterResultSummary?.result)
766
+ ?? readNonEmptyString(adapterResultSummary?.summary)
767
+ ?? readNonEmptyString(adapterResultSummary?.message)
768
+ ?? null,
769
+ usage: adapterResult.usage ?? null,
770
+ costUsd: typeof adapterResult.costUsd === "number" ? adapterResult.costUsd : null,
771
+ subtype: status,
772
+ isError: outcome !== "succeeded",
773
+ errors: adapterResult.errorMessage ? [adapterResult.errorMessage] : [],
774
+ };
775
+ const usageJson = normalizedUsage || adapterResult.costUsd != null
776
+ ? {
777
+ ...(normalizedUsage ?? {}),
778
+ ...(rawUsage ? {
779
+ rawInputTokens: rawUsage.inputTokens,
780
+ rawCachedInputTokens: rawUsage.cachedInputTokens,
781
+ rawOutputTokens: rawUsage.outputTokens,
782
+ } : {}),
783
+ ...(sessionUsageResolution.derivedFromSessionTotals ? { usageSource: "session_delta" } : {}),
784
+ ...((nextSessionState.displayId ?? nextSessionState.legacySessionId)
785
+ ? { persistedSessionId: nextSessionState.displayId ?? nextSessionState.legacySessionId }
786
+ : {}),
787
+ sessionReused: runtimeForAdapter.sessionId != null || runtimeForAdapter.sessionDisplayId != null,
788
+ taskSessionReused: taskSessionForRun != null,
789
+ freshSession: runtimeForAdapter.sessionId == null && runtimeForAdapter.sessionDisplayId == null,
790
+ sessionRotated: sessionCompaction.rotate,
791
+ sessionRotationReason: sessionCompaction.reason,
792
+ provider: readNonEmptyString(adapterResult.provider) ?? "unknown",
793
+ biller: resolveLedgerBiller(adapterResult),
794
+ model: readNonEmptyString(adapterResult.model) ?? "unknown",
795
+ ...(adapterResult.costUsd != null ? { costUsd: adapterResult.costUsd } : {}),
796
+ billingType: normalizeLedgerBillingType(adapterResult.billingType),
797
+ }
798
+ : null;
799
+ await setRunStatus(run.id, status, {
800
+ finishedAt: new Date(),
801
+ error: outcome === "succeeded"
802
+ ? null
803
+ : redactCurrentUserText(adapterResult.errorMessage ?? (outcome === "timed_out" ? "Timed out" : "Adapter failed"), currentUserRedactionOptions),
804
+ errorCode: outcome === "timed_out"
805
+ ? "timeout"
806
+ : outcome === "cancelled"
807
+ ? "cancelled"
808
+ : outcome === "failed"
809
+ ? (adapterResult.errorCode ?? "adapter_failed")
810
+ : null,
811
+ exitCode: adapterResult.exitCode,
812
+ signal: adapterResult.signal,
813
+ usageJson,
814
+ resultJson: adapterResult.resultJson ?? null,
815
+ sessionIdAfter: nextSessionState.displayId ?? nextSessionState.legacySessionId,
816
+ stdoutExcerpt,
817
+ stderrExcerpt,
818
+ logBytes: logSummary?.bytes,
819
+ logSha256: logSummary?.sha256,
820
+ logCompressed: logSummary?.compressed ?? false,
821
+ });
822
+ await setWakeupStatus(run.wakeupRequestId, outcome === "succeeded" ? "completed" : status, {
823
+ finishedAt: new Date(),
824
+ error: adapterResult.errorMessage ?? null,
825
+ });
826
+ const finalizedRun = await getRun(run.id);
827
+ if (finalizedRun) {
828
+ const transcriptUsedSkills = inferUsedSkillsFromTranscript(executionTranscript);
829
+ if (transcriptUsedSkills.length > 0) {
830
+ await appendRunEvent(finalizedRun, seq++, {
831
+ eventType: "adapter.skill_usage",
832
+ stream: "system",
833
+ level: "info",
834
+ message: "skill usage inferred from transcript",
835
+ payload: {
836
+ source: "transcript.skill_file_read",
837
+ usedSkillCount: transcriptUsedSkills.length,
838
+ usedSkillKeys: transcriptUsedSkills.map((entry) => entry.key),
839
+ usedSkills: transcriptUsedSkills,
840
+ skillEvidenceType: "used",
841
+ skillEvidenceCount: transcriptUsedSkills.length,
842
+ skillEvidenceKeys: transcriptUsedSkills.map((entry) => entry.key),
843
+ skillEvidenceSkills: transcriptUsedSkills,
844
+ },
845
+ });
846
+ }
847
+ await appendRunEvent(finalizedRun, seq++, {
848
+ eventType: "lifecycle",
849
+ stream: "system",
850
+ level: outcome === "succeeded" ? "info" : "error",
851
+ message: `run ${outcome}`,
852
+ payload: {
853
+ status,
854
+ exitCode: adapterResult.exitCode,
855
+ },
856
+ });
857
+ await releaseIssueExecutionAndPromote(finalizedRun);
858
+ }
859
+ if (finalizedRun) {
860
+ await updateRuntimeState(agent, finalizedRun, adapterResult, {
861
+ legacySessionId: nextSessionState.legacySessionId,
862
+ }, normalizedUsage);
863
+ if (taskKey) {
864
+ if (adapterResult.clearSession || (!nextSessionState.params && !nextSessionState.displayId)) {
865
+ await clearTaskSessions(agent.orgId, agent.id, {
866
+ taskKey,
867
+ agentRuntimeType: agent.agentRuntimeType,
868
+ });
869
+ }
870
+ else {
871
+ await upsertTaskSession({
872
+ orgId: agent.orgId,
873
+ agentId: agent.id,
874
+ agentRuntimeType: agent.agentRuntimeType,
875
+ taskKey,
876
+ sessionParamsJson: nextSessionState.params,
877
+ sessionDisplayId: nextSessionState.displayId,
878
+ lastRunId: finalizedRun.id,
879
+ lastError: outcome === "succeeded" ? null : (adapterResult.errorMessage ?? "run_failed"),
880
+ });
881
+ }
882
+ }
883
+ await emitHeartbeatLiveEval(finalizedRun.id);
884
+ }
885
+ await finalizeAgentStatus(agent.id, outcome);
886
+ }
887
+ catch (err) {
888
+ const isWorkspacePreflightFailure = isWorkspacePermissionPreflightError(err) ||
889
+ isManagedWorkspaceConfigurationError(err);
890
+ const message = redactCurrentUserText(err instanceof Error ? err.message : "Unknown adapter failure", await getCurrentUserRedactionOptions());
891
+ heartbeatObservationContext.status = "failed";
892
+ finalObservationStatus = "failed";
893
+ transcriptFallbackResult = {
894
+ ts: new Date().toISOString(),
895
+ output: message,
896
+ subtype: "failed",
897
+ isError: true,
898
+ errors: [message],
899
+ };
900
+ logger.error({ err, runId }, "heartbeat execution failed");
901
+ let logSummary = null;
902
+ if (handle) {
903
+ try {
904
+ logSummary = await runLogStore.finalize(handle);
905
+ }
906
+ catch (finalizeErr) {
907
+ logger.warn({ err: finalizeErr, runId }, "failed to finalize run log after error");
908
+ }
909
+ }
910
+ const failedRun = await setRunStatus(run.id, "failed", {
911
+ error: message,
912
+ errorCode: isWorkspacePreflightFailure ? err.errorCode : "adapter_failed",
913
+ finishedAt: new Date(),
914
+ stdoutExcerpt,
915
+ stderrExcerpt,
916
+ logBytes: logSummary?.bytes,
917
+ logSha256: logSummary?.sha256,
918
+ logCompressed: logSummary?.compressed ?? false,
919
+ });
920
+ await setWakeupStatus(run.wakeupRequestId, "failed", {
921
+ finishedAt: new Date(),
922
+ error: message,
923
+ });
924
+ if (failedRun) {
925
+ await appendRunEvent(failedRun, seq++, {
926
+ eventType: isWorkspacePreflightFailure ? "runtime.workspace_preflight_failed" : "error",
927
+ stream: "system",
928
+ level: "error",
929
+ message,
930
+ ...(isWorkspacePreflightFailure
931
+ ? {
932
+ payload: {
933
+ errorCode: err.errorCode,
934
+ failure: err.failure,
935
+ },
936
+ }
937
+ : {}),
938
+ });
939
+ await releaseIssueExecutionAndPromote(failedRun);
940
+ if (!isWorkspacePreflightFailure) {
941
+ await updateRuntimeState(agent, failedRun, {
942
+ exitCode: null,
943
+ signal: null,
944
+ timedOut: false,
945
+ errorMessage: message,
946
+ }, {
947
+ legacySessionId: runtimeForAdapter.sessionId,
948
+ });
949
+ if (taskKey && (previousSessionParams || previousSessionDisplayId || taskSession)) {
950
+ await upsertTaskSession({
951
+ orgId: agent.orgId,
952
+ agentId: agent.id,
953
+ agentRuntimeType: agent.agentRuntimeType,
954
+ taskKey,
955
+ sessionParamsJson: previousSessionParams,
956
+ sessionDisplayId: previousSessionDisplayId,
957
+ lastRunId: failedRun.id,
958
+ lastError: message,
959
+ });
960
+ }
961
+ }
962
+ await emitHeartbeatLiveEval(failedRun.id);
963
+ }
964
+ await finalizeAgentStatus(agent.id, "failed");
965
+ }
966
+ finally {
967
+ stdoutTranscriptBuffer = appendTranscriptEntriesFromChunk({
968
+ buffer: stdoutTranscriptBuffer,
969
+ chunk: "",
970
+ transcript: executionTranscript,
971
+ parser: stdoutTranscriptParser,
972
+ finalize: true,
973
+ kind: "stdout",
974
+ });
975
+ stderrTranscriptBuffer = appendTranscriptEntriesFromChunk({
976
+ buffer: stderrTranscriptBuffer,
977
+ chunk: "",
978
+ transcript: executionTranscript,
979
+ finalize: true,
980
+ kind: "stderr",
981
+ });
982
+ try {
983
+ const transcriptStats = emitExecutionTranscriptTree({
984
+ context: heartbeatObservationContext,
985
+ parentObservation: observation,
986
+ transcript: executionTranscript,
987
+ initialTurnInput: modelTurnInput,
988
+ fallbackResult: transcriptFallbackResult,
989
+ });
990
+ finalObservationOutput = transcriptStats.finalOutput ?? transcriptFallbackResult?.output ?? null;
991
+ finalObservationSessionId = transcriptStats.finalSessionId ?? finalObservationSessionId;
992
+ }
993
+ catch (error) {
994
+ logger.warn({
995
+ runId: run.id,
996
+ err: error instanceof Error ? error.message : String(error),
997
+ }, "Failed to export heartbeat transcript tree to Langfuse");
998
+ }
999
+ updateExecutionObservation(observation, heartbeatObservationContext, {
1000
+ input: rootObservationInput,
1001
+ output: finalObservationOutput,
1002
+ level: finalObservationStatus === "failed" || finalObservationStatus === "timed_out" ? "ERROR" : "DEFAULT",
1003
+ statusMessage: finalObservationStatus ?? undefined,
1004
+ });
1005
+ updateExecutionTraceIO(observation, {
1006
+ input: rootObservationInput,
1007
+ output: finalObservationOutput,
1008
+ });
1009
+ updateExecutionTraceSession(observation, finalObservationSessionId);
1010
+ }
1011
+ });
1012
+ }
1013
+ catch (outerErr) {
1014
+ // Setup code before adapter.execute threw (e.g. ensureRuntimeState, resolveWorkspaceForRun).
1015
+ // The inner catch did not fire, so we must record the failure here.
1016
+ const message = outerErr instanceof Error ? outerErr.message : "Unknown setup failure";
1017
+ logger.error({ err: outerErr, runId }, "heartbeat execution setup failed");
1018
+ await setRunStatus(runId, "failed", {
1019
+ error: message,
1020
+ errorCode: "adapter_failed",
1021
+ finishedAt: new Date(),
1022
+ }).catch(() => undefined);
1023
+ await setWakeupStatus(run.wakeupRequestId, "failed", {
1024
+ finishedAt: new Date(),
1025
+ error: message,
1026
+ }).catch(() => undefined);
1027
+ const failedRun = await getRun(runId).catch(() => null);
1028
+ if (failedRun) {
1029
+ // Emit a run-log event so the failure is visible in the run timeline,
1030
+ // consistent with what the inner catch block does for adapter failures.
1031
+ await appendRunEvent(failedRun, 1, {
1032
+ eventType: "error",
1033
+ stream: "system",
1034
+ level: "error",
1035
+ message,
1036
+ }).catch(() => undefined);
1037
+ await emitHeartbeatLiveEval(failedRun.id).catch(() => undefined);
1038
+ await releaseIssueExecutionAndPromote(failedRun).catch(() => undefined);
1039
+ }
1040
+ // Ensure the agent is not left stuck in "running" if the inner catch handler's
1041
+ // DB calls threw (e.g. a transient DB error in finalizeAgentStatus).
1042
+ await finalizeAgentStatus(run.agentId, "failed").catch(() => undefined);
1043
+ }
1044
+ finally {
1045
+ await releaseRuntimeServicesForRun(run.id).catch(() => undefined);
1046
+ activeRunExecutions.delete(run.id);
1047
+ await startNextQueuedRunForAgent(run.agentId);
1048
+ }
1049
+ }
1050
+ return { executeRun };
1051
+ }
1052
+ //# sourceMappingURL=heartbeat.execute.js.map