@rudderhq/server 0.7.10 → 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 (260) 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 +356 -7
  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 +68 -7
  20. package/dist/routes/goals.js.map +1 -1
  21. package/dist/routes/issues.mutations.d.ts.map +1 -1
  22. package/dist/routes/issues.mutations.js +3 -0
  23. package/dist/routes/issues.mutations.js.map +1 -1
  24. package/dist/routes/orgs.d.ts.map +1 -1
  25. package/dist/routes/orgs.js +22 -1
  26. package/dist/routes/orgs.js.map +1 -1
  27. package/dist/routes/run-intelligence.d.ts.map +1 -1
  28. package/dist/routes/run-intelligence.js +9 -0
  29. package/dist/routes/run-intelligence.js.map +1 -1
  30. package/dist/services/agent-instructions.d.ts +1 -0
  31. package/dist/services/agent-instructions.d.ts.map +1 -1
  32. package/dist/services/agent-instructions.js +124 -6
  33. package/dist/services/agent-instructions.js.map +1 -1
  34. package/dist/services/agent-run-context.d.ts.map +1 -1
  35. package/dist/services/agent-run-context.js +15 -0
  36. package/dist/services/agent-run-context.js.map +1 -1
  37. package/dist/services/agent-startup-context.d.ts +5 -1
  38. package/dist/services/agent-startup-context.d.ts.map +1 -1
  39. package/dist/services/agent-startup-context.js +67 -14
  40. package/dist/services/agent-startup-context.js.map +1 -1
  41. package/dist/services/agents.d.ts +218 -0
  42. package/dist/services/agents.d.ts.map +1 -1
  43. package/dist/services/automations.d.ts.map +1 -1
  44. package/dist/services/automations.js +3 -0
  45. package/dist/services/automations.js.map +1 -1
  46. package/dist/services/chat-agent-runs.d.ts +47 -1
  47. package/dist/services/chat-agent-runs.d.ts.map +1 -1
  48. package/dist/services/chat-agent-runs.js +91 -1
  49. package/dist/services/chat-agent-runs.js.map +1 -1
  50. package/dist/services/chat-assistant.d.ts.map +1 -1
  51. package/dist/services/chat-assistant.helpers.d.ts +12 -3
  52. package/dist/services/chat-assistant.helpers.d.ts.map +1 -1
  53. package/dist/services/chat-assistant.helpers.js +3 -0
  54. package/dist/services/chat-assistant.helpers.js.map +1 -1
  55. package/dist/services/chat-assistant.js +65 -19
  56. package/dist/services/chat-assistant.js.map +1 -1
  57. package/dist/services/chat-generation-protocol.d.ts +119 -0
  58. package/dist/services/chat-generation-protocol.d.ts.map +1 -1
  59. package/dist/services/chat-generation-protocol.js +65 -0
  60. package/dist/services/chat-generation-protocol.js.map +1 -1
  61. package/dist/services/chats.constants.d.ts +1 -1
  62. package/dist/services/chats.constants.d.ts.map +1 -1
  63. package/dist/services/chats.constants.js +1 -0
  64. package/dist/services/chats.constants.js.map +1 -1
  65. package/dist/services/chats.d.ts +213 -0
  66. package/dist/services/chats.d.ts.map +1 -1
  67. package/dist/services/chats.js +46 -1
  68. package/dist/services/chats.js.map +1 -1
  69. package/dist/services/goals.d.ts +133 -5
  70. package/dist/services/goals.d.ts.map +1 -1
  71. package/dist/services/goals.js +260 -3
  72. package/dist/services/goals.js.map +1 -1
  73. package/dist/services/heartbeat-run-reference.d.ts.map +1 -1
  74. package/dist/services/heartbeat-run-reference.js +11 -5
  75. package/dist/services/heartbeat-run-reference.js.map +1 -1
  76. package/dist/services/index.d.ts +2 -1
  77. package/dist/services/index.d.ts.map +1 -1
  78. package/dist/services/index.js +2 -1
  79. package/dist/services/index.js.map +1 -1
  80. package/dist/services/integrations/feishu/runtime.d.ts +8 -0
  81. package/dist/services/integrations/feishu/runtime.d.ts.map +1 -1
  82. package/dist/services/integrations/feishu/runtime.js +124 -1
  83. package/dist/services/integrations/feishu/runtime.js.map +1 -1
  84. package/dist/services/issues.d.ts.map +1 -1
  85. package/dist/services/issues.helpers.d.ts +8 -0
  86. package/dist/services/issues.helpers.d.ts.map +1 -1
  87. package/dist/services/issues.helpers.js +17 -1
  88. package/dist/services/issues.helpers.js.map +1 -1
  89. package/dist/services/issues.js +108 -15
  90. package/dist/services/issues.js.map +1 -1
  91. package/dist/services/messenger.d.ts.map +1 -1
  92. package/dist/services/messenger.js +12 -3
  93. package/dist/services/messenger.js.map +1 -1
  94. package/dist/services/organization-members.d.ts +27 -0
  95. package/dist/services/organization-members.d.ts.map +1 -0
  96. package/dist/services/organization-members.js +169 -0
  97. package/dist/services/organization-members.js.map +1 -0
  98. package/dist/services/organization-workspace-browser.d.ts.map +1 -1
  99. package/dist/services/organization-workspace-browser.js +44 -10
  100. package/dist/services/organization-workspace-browser.js.map +1 -1
  101. package/dist/services/product-intelligence.d.ts.map +1 -1
  102. package/dist/services/product-intelligence.js +4 -0
  103. package/dist/services/product-intelligence.js.map +1 -1
  104. package/dist/services/projects.d.ts +1 -4
  105. package/dist/services/projects.d.ts.map +1 -1
  106. package/dist/services/projects.js +27 -2
  107. package/dist/services/projects.js.map +1 -1
  108. package/dist/services/rudder-plugin-catalog.d.ts +1 -1
  109. package/dist/services/rudder-plugin-catalog.d.ts.map +1 -1
  110. package/dist/services/rudder-plugin-catalog.js +281 -15
  111. package/dist/services/rudder-plugin-catalog.js.map +1 -1
  112. package/dist/services/rudder-plugin-catalog.test.js +55 -0
  113. package/dist/services/rudder-plugin-catalog.test.js.map +1 -1
  114. package/dist/services/run-intelligence.d.ts.map +1 -1
  115. package/dist/services/run-intelligence.js +2 -1
  116. package/dist/services/run-intelligence.js.map +1 -1
  117. package/dist/services/run-log-store.d.ts +3 -0
  118. package/dist/services/run-log-store.d.ts.map +1 -1
  119. package/dist/services/run-log-store.js +124 -18
  120. package/dist/services/run-log-store.js.map +1 -1
  121. package/dist/services/runtime-kernel/assignment-run-guardrail.d.ts +80 -23
  122. package/dist/services/runtime-kernel/assignment-run-guardrail.d.ts.map +1 -1
  123. package/dist/services/runtime-kernel/assignment-run-guardrail.js +230 -5
  124. package/dist/services/runtime-kernel/assignment-run-guardrail.js.map +1 -1
  125. package/dist/services/runtime-kernel/assignment-run-guardrail.test.js +122 -2
  126. package/dist/services/runtime-kernel/assignment-run-guardrail.test.js.map +1 -1
  127. package/dist/services/runtime-kernel/heartbeat-attempt-ledger.d.ts +124 -0
  128. package/dist/services/runtime-kernel/heartbeat-attempt-ledger.d.ts.map +1 -0
  129. package/dist/services/runtime-kernel/heartbeat-attempt-ledger.js +108 -0
  130. package/dist/services/runtime-kernel/heartbeat-attempt-ledger.js.map +1 -0
  131. package/dist/services/runtime-kernel/heartbeat.core.d.ts +111 -0
  132. package/dist/services/runtime-kernel/heartbeat.core.d.ts.map +1 -1
  133. package/dist/services/runtime-kernel/heartbeat.core.js +13 -0
  134. package/dist/services/runtime-kernel/heartbeat.core.js.map +1 -1
  135. package/dist/services/runtime-kernel/heartbeat.d.ts +34 -0
  136. package/dist/services/runtime-kernel/heartbeat.d.ts.map +1 -1
  137. package/dist/services/runtime-kernel/heartbeat.execute.d.ts.map +1 -1
  138. package/dist/services/runtime-kernel/heartbeat.execute.js +312 -16
  139. package/dist/services/runtime-kernel/heartbeat.execute.js.map +1 -1
  140. package/dist/services/runtime-kernel/heartbeat.js +205 -8
  141. package/dist/services/runtime-kernel/heartbeat.js.map +1 -1
  142. package/dist/services/runtime-kernel/heartbeat.sessions.d.ts.map +1 -1
  143. package/dist/services/runtime-kernel/heartbeat.sessions.js +15 -3
  144. package/dist/services/runtime-kernel/heartbeat.sessions.js.map +1 -1
  145. package/dist/services/runtime-kernel/heartbeat.terminal.d.ts +48 -0
  146. package/dist/services/runtime-kernel/heartbeat.terminal.d.ts.map +1 -1
  147. package/dist/services/runtime-kernel/heartbeat.wakeup.js +1 -1
  148. package/dist/services/runtime-kernel/heartbeat.wakeup.js.map +1 -1
  149. package/dist/services/runtime-kernel/model-fallback.d.ts +4 -0
  150. package/dist/services/runtime-kernel/model-fallback.d.ts.map +1 -1
  151. package/dist/services/runtime-kernel/model-fallback.js +25 -4
  152. package/dist/services/runtime-kernel/model-fallback.js.map +1 -1
  153. package/dist/services/workspace-backup-v2.d.ts +20 -0
  154. package/dist/services/workspace-backup-v2.d.ts.map +1 -1
  155. package/dist/services/workspace-backup-v2.js +155 -23
  156. package/dist/services/workspace-backup-v2.js.map +1 -1
  157. package/dist/services/workspace-backup-v2.test.js +34 -2
  158. package/dist/services/workspace-backup-v2.test.js.map +1 -1
  159. package/dist/services/workspace-backups.d.ts +0 -1
  160. package/dist/services/workspace-backups.d.ts.map +1 -1
  161. package/dist/services/workspace-backups.js +18 -19
  162. package/dist/services/workspace-backups.js.map +1 -1
  163. package/dist/services/workspace-manifest-native.d.ts +10 -0
  164. package/dist/services/workspace-manifest-native.d.ts.map +1 -0
  165. package/dist/services/workspace-manifest-native.js +219 -0
  166. package/dist/services/workspace-manifest-native.js.map +1 -0
  167. package/dist/services/workspace-restore-reconciliation.d.ts +11 -0
  168. package/dist/services/workspace-restore-reconciliation.d.ts.map +1 -0
  169. package/dist/services/workspace-restore-reconciliation.js +165 -0
  170. package/dist/services/workspace-restore-reconciliation.js.map +1 -0
  171. package/package.json +14 -14
  172. package/resources/bundled-skills/rudder-docs/references/api-reference.md +8 -0
  173. package/resources/bundled-skills/rudder-docs/references/cli-reference.md +14 -8
  174. package/skills/rudder-docs/references/api-reference.md +8 -0
  175. package/skills/rudder-docs/references/cli-reference.md +14 -8
  176. package/ui-dist/assets/LibraryLiveSurface-tCWxJKp5.js +1 -0
  177. package/ui-dist/assets/{abnfDiagram-VRR7QNED-CG3j5RmW.js → abnfDiagram-VRR7QNED-BcCms-hs.js} +1 -1
  178. package/ui-dist/assets/{addon-fit-D07m_e8_.js → addon-fit-CH3xNHN4.js} +1 -1
  179. package/ui-dist/assets/{arc-B2RI9_Dw.js → arc-h5W-EkRK.js} +1 -1
  180. package/ui-dist/assets/{architectureDiagram-ZJ3FMSHR-C5v1tMZi.js → architectureDiagram-ZJ3FMSHR-Bdehm1PB.js} +1 -1
  181. package/ui-dist/assets/{blockDiagram-677ZJIJ3-CgcSNhl8.js → blockDiagram-677ZJIJ3-BJ3W91Su.js} +1 -1
  182. package/ui-dist/assets/{c4Diagram-LMCZKHZV-B7qmWb0f.js → c4Diagram-LMCZKHZV-Bnft_fRy.js} +1 -1
  183. package/ui-dist/assets/channel-G6qIOCiV.js +1 -0
  184. package/ui-dist/assets/{chunk-2Q5K7J3B-cNlq0MJR.js → chunk-2Q5K7J3B-w1SF0tSk.js} +1 -1
  185. package/ui-dist/assets/{chunk-32BRIVSS-rcxFQzYk.js → chunk-32BRIVSS-C1UzXTFZ.js} +1 -1
  186. package/ui-dist/assets/{chunk-5VM5RSS4-9PSO_t10.js → chunk-5VM5RSS4-COVI3rNd.js} +1 -1
  187. package/ui-dist/assets/{chunk-EX3LRPZG-BlOFcT4O.js → chunk-EX3LRPZG-DxQOLy7z.js} +1 -1
  188. package/ui-dist/assets/{chunk-JWPE2WC7-B2Jgd3wO.js → chunk-JWPE2WC7-KTwmElcL.js} +1 -1
  189. package/ui-dist/assets/{chunk-MOJQB5TN-CaAqG9fp.js → chunk-MOJQB5TN-BynL4lzA.js} +1 -1
  190. package/ui-dist/assets/{chunk-RYQCIY6F-BDI7azm6.js → chunk-RYQCIY6F-CJksBfuJ.js} +1 -1
  191. package/ui-dist/assets/{chunk-V7JOEXUC-B-P0KC6p.js → chunk-V7JOEXUC-C_zED5WJ.js} +1 -1
  192. package/ui-dist/assets/{chunk-VR4S4FIN-CMfw-kF9.js → chunk-VR4S4FIN-BHDtMeiT.js} +1 -1
  193. package/ui-dist/assets/{chunk-XXDRQBXY-BBVqU1YP.js → chunk-XXDRQBXY-C0VvJgte.js} +1 -1
  194. package/ui-dist/assets/classDiagram-OUVF2IWQ-D15_PFCL.js +1 -0
  195. package/ui-dist/assets/classDiagram-v2-EOCWNBFH-D15_PFCL.js +1 -0
  196. package/ui-dist/assets/{cose-bilkent-JH36ORCC-B_hARQDI.js → cose-bilkent-JH36ORCC-DsTTzpP7.js} +1 -1
  197. package/ui-dist/assets/{cynefin-VYW2F7L2-CTcM0j1n.js → cynefin-VYW2F7L2-BfULw90s.js} +1 -1
  198. package/ui-dist/assets/{cynefinDiagram-TSTJHNR4-CL7MmdPn.js → cynefinDiagram-TSTJHNR4-BukSzKVC.js} +1 -1
  199. package/ui-dist/assets/{dagre-VKFMJZFB-mhGwmtXN.js → dagre-VKFMJZFB-BbZY_Ipf.js} +1 -1
  200. package/ui-dist/assets/{diagram-FQU43EPY-BMjw7iEL.js → diagram-FQU43EPY-BTYIYn2p.js} +1 -1
  201. package/ui-dist/assets/{diagram-G47NLZAW-BsTpJwdG.js → diagram-G47NLZAW-CikY_FKi.js} +1 -1
  202. package/ui-dist/assets/{diagram-NH7WQ7WH-Ne5TlLrd.js → diagram-NH7WQ7WH-BfZ7AlT8.js} +1 -1
  203. package/ui-dist/assets/{diagram-OA4YK3LP-YVpFkzL5.js → diagram-OA4YK3LP-f5AikxJj.js} +1 -1
  204. package/ui-dist/assets/{diagram-WEI45ONY-B5uEnE3n.js → diagram-WEI45ONY-BCbG5yas.js} +1 -1
  205. package/ui-dist/assets/{ebnfDiagram-CCIWWBDH-i74y0Dqq.js → ebnfDiagram-CCIWWBDH-DT-3mJLY.js} +1 -1
  206. package/ui-dist/assets/{erDiagram-Q63AITRT-46MUSamZ.js → erDiagram-Q63AITRT-BsfOhDfe.js} +1 -1
  207. package/ui-dist/assets/{flowDiagram-23GEKE2U-C9jQx1Z9.js → flowDiagram-23GEKE2U-BfaeQCsg.js} +1 -1
  208. package/ui-dist/assets/{ganttDiagram-NO4QXBWP-BHoVYgnd.js → ganttDiagram-NO4QXBWP-CgPQruVz.js} +1 -1
  209. package/ui-dist/assets/{gitGraphDiagram-IHSO6WYX-BxCaqc4K.js → gitGraphDiagram-IHSO6WYX-CNrBFzjY.js} +1 -1
  210. package/ui-dist/assets/{graph-7yEA7MiX.js → graph-QqDTzUUJ.js} +1 -1
  211. package/ui-dist/assets/{index-55mSol35.js → index-2ZQZC89T.js} +1 -1
  212. package/ui-dist/assets/{index-Y9EFmtGV.js → index-2cYcOpZB.js} +1 -1
  213. package/ui-dist/assets/{index-Bk4h2xgb.js → index-BAt16m_U.js} +1 -1
  214. package/ui-dist/assets/{index-SnNVv85r.js → index-BY8xCKIE.js} +1 -1
  215. package/ui-dist/assets/{index-Bbr_dltJ.js → index-Befy20DN.js} +1 -1
  216. package/ui-dist/assets/{index-2l0f_0un.js → index-BfAP3xNl.js} +1 -1
  217. package/ui-dist/assets/{index-Cr_0vHJF.js → index-BogOyxlk.js} +1 -1
  218. package/ui-dist/assets/{index-BM2yCFug.js → index-BuIyK71w.js} +562 -557
  219. package/ui-dist/assets/{index-8SjcJx20.js → index-CQ92CxVC.js} +1 -1
  220. package/ui-dist/assets/{index-BMbspMfV.js → index-CQFwlD-o.js} +1 -1
  221. package/ui-dist/assets/{index-DEDA9JuC.js → index-Cu4qo_D7.js} +1 -1
  222. package/ui-dist/assets/index-DRuC5g8V.css +32 -0
  223. package/ui-dist/assets/{index-BYHrPlW0.js → index-DZ4gAeDM.js} +1 -1
  224. package/ui-dist/assets/{index-zsia7wHf.js → index-Dc_DUpPj.js} +1 -1
  225. package/ui-dist/assets/{index-CTe7L-bN.js → index-Dqv46mWS.js} +1 -1
  226. package/ui-dist/assets/{index-sorUqxO4.js → index-sFJMMyA3.js} +1 -1
  227. package/ui-dist/assets/{infoDiagram-FWYZ7A6U-tKN_HUk-.js → infoDiagram-FWYZ7A6U-BJHuaNA9.js} +1 -1
  228. package/ui-dist/assets/{ishikawaDiagram-FXEZZL3T-z7MJkWMv.js → ishikawaDiagram-FXEZZL3T-CmsA1Knp.js} +1 -1
  229. package/ui-dist/assets/{journeyDiagram-5HDEW3XC-CY9IRx-1.js → journeyDiagram-5HDEW3XC-iV_Nt9d4.js} +1 -1
  230. package/ui-dist/assets/{kanban-definition-HUTT4EX6-R6xzFCHM.js → kanban-definition-HUTT4EX6-D45s70Ny.js} +1 -1
  231. package/ui-dist/assets/{layout-BQx6ln2a.js → layout-DDC-iOzY.js} +1 -1
  232. package/ui-dist/assets/{linear-CH-dQ7Bg.js → linear-DCTJ7Pq3.js} +1 -1
  233. package/ui-dist/assets/{map-DmEHxVn2.js → map-RGy5k616.js} +1 -1
  234. package/ui-dist/assets/{mermaid.core-8TMqfMCO.js → mermaid.core-6MH04cvi.js} +4 -4
  235. package/ui-dist/assets/{mindmap-definition-LN4V7U3C-ClYlc1ss.js → mindmap-definition-LN4V7U3C-CA2LFmda.js} +1 -1
  236. package/ui-dist/assets/{pegDiagram-2B236MQR-DuQPcIJk.js → pegDiagram-2B236MQR-DDsUr2du.js} +1 -1
  237. package/ui-dist/assets/{pieDiagram-ENE6RG2P-Bc1fELpd.js → pieDiagram-ENE6RG2P-D7jEL8xK.js} +1 -1
  238. package/ui-dist/assets/{quadrantDiagram-ABIIQ3AL-DS9-N5ZO.js → quadrantDiagram-ABIIQ3AL-BsJxgVLb.js} +1 -1
  239. package/ui-dist/assets/{railroadDiagram-RFXS5EU6-BBAeUuch.js → railroadDiagram-RFXS5EU6-CBI457f6.js} +1 -1
  240. package/ui-dist/assets/{requirementDiagram-TGXJPOKE-BmDkrDi3.js → requirementDiagram-TGXJPOKE-_GAc0NOO.js} +1 -1
  241. package/ui-dist/assets/{sankeyDiagram-HTMAVEWB-APPAQqTz.js → sankeyDiagram-HTMAVEWB-DNIaj5hu.js} +1 -1
  242. package/ui-dist/assets/{sequenceDiagram-DBY2YBRQ-B9G01Gl-.js → sequenceDiagram-DBY2YBRQ-BHDZs2dc.js} +1 -1
  243. package/ui-dist/assets/{sizeCapture-X5ZJPWSS-BYjnDqoI.js → sizeCapture-X5ZJPWSS-DwKT6aTP.js} +1 -1
  244. package/ui-dist/assets/{stateDiagram-2N3HPSRC-BQkWPBAj.js → stateDiagram-2N3HPSRC-D2hDsltG.js} +1 -1
  245. package/ui-dist/assets/stateDiagram-v2-6OUMAXLB-CMTeJdkk.js +1 -0
  246. package/ui-dist/assets/{swimlanes-5IMT3BWC-Cacv4UUq.js → swimlanes-5IMT3BWC-BV8xA0iq.js} +2 -2
  247. package/ui-dist/assets/swimlanesDiagram-G3AALYLV-ChF8QLeM.js +8 -0
  248. package/ui-dist/assets/{timeline-definition-FHXFAJF6-COt3U2Pi.js → timeline-definition-FHXFAJF6-BPJMubhV.js} +1 -1
  249. package/ui-dist/assets/{vennDiagram-L72KCM5P-C7eLlxvT.js → vennDiagram-L72KCM5P-CY76J0Px.js} +1 -1
  250. package/ui-dist/assets/{wardleyDiagram-EHGQE667-Bufv0x60.js → wardleyDiagram-EHGQE667-pmNWLdE_.js} +1 -1
  251. package/ui-dist/assets/{xterm-BuWLsUNc.js → xterm-UByodpzD.js} +1 -1
  252. package/ui-dist/assets/{xychartDiagram-FW5EYKEG-9RQAf_Zw.js → xychartDiagram-FW5EYKEG-BWZC7gWV.js} +1 -1
  253. package/ui-dist/index.html +2 -2
  254. package/ui-dist/assets/LibraryLiveSurface-YMhPWwag.js +0 -1
  255. package/ui-dist/assets/channel-Cbzk2971.js +0 -1
  256. package/ui-dist/assets/classDiagram-OUVF2IWQ-hBDf22nr.js +0 -1
  257. package/ui-dist/assets/classDiagram-v2-EOCWNBFH-hBDf22nr.js +0 -1
  258. package/ui-dist/assets/index-B_CDj4oF.css +0 -32
  259. package/ui-dist/assets/stateDiagram-v2-6OUMAXLB-BucPPlgK.js +0 -1
  260. package/ui-dist/assets/swimlanesDiagram-G3AALYLV-DPpGouCd.js +0 -8
@@ -1,3 +1,13 @@
1
+ // @ts-nocheck
2
+ /**
3
+ * @fileoverview Executes claimed heartbeat runs through runtime adapters,
4
+ * workspace realization, transcript persistence, and close-out release.
5
+ *
6
+ * @see doc/product/domains/execution/agent-runs.md - run execution state and evidence
7
+ * @see doc/product/domains/execution/run-admission-and-recovery.md - retry and recovery behavior
8
+ * @see doc/product/domains/agents/instruction-loading.md - AGENT.INSTRUCTIONS.001 runtime instruction frame
9
+ */
10
+ import { buildModelAttemptSpecs, isAgentRuntimeNetworkSuspension, } from "@rudderhq/agent-runtime-utils";
1
11
  import { goals, heartbeatRuns, issues, projects } from "@rudderhq/db";
2
12
  import { resolveAgentRunScene, } from "@rudderhq/shared";
3
13
  import { and, eq, sql } from "drizzle-orm";
@@ -13,12 +23,13 @@ import { publishLiveEvent } from "../live-events.js";
13
23
  import { isManagedWorkspaceConfigurationError, isWorkspacePermissionPreflightError, preflightManagedAgentWorkspace, } from "../managed-workspace-preflight.js";
14
24
  import { listProjectResourceAttachments } from "../resource-catalog.js";
15
25
  import { buildWorkspaceReadyComment, cleanupExecutionWorkspaceArtifacts, ensureRuntimeServicesForRun, persistAdapterManagedRuntimeServices, realizeExecutionWorkspace, releaseRuntimeServicesForRun } from "../workspace-runtime.js";
16
- import { createAssignmentRunFailureBudget, inspectAssignmentRunWorkspace, resolveProjectWorkingSetCwd, } from "./assignment-run-guardrail.js";
26
+ import { AssignmentDependencyPreflightError, createAssignmentRunFailureBudget, inspectAssignmentRunWorkspace, repairAssignmentRunWorkspace, resolveProjectWorkingSetCwd, } from "./assignment-run-guardrail.js";
27
+ import { beginHeartbeatRunAttempt, finishHeartbeatRunAttempt, markHeartbeatRunAttemptWaiting, } from "./heartbeat-attempt-ledger.js";
17
28
  import { executeAdapterWithModelFallbacks } from "./model-fallback.js";
18
29
  export { prioritizeProjectWorkspaceCandidatesForRun } from "../agent-run-context.js";
19
30
  import * as heartbeatCore from "./heartbeat.core.js";
20
31
  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, buildHeartbeatAdapterInvokePayload, sanitizeStartupContextContextForPersistence, sanitizeStartupContextPromptForPersistence, 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, resolveForbiddenRuntimeSkillMarkers, detectForbiddenRuntimeSkillMarker, normalizeLedgerBillingType, resolveLedgerBiller, normalizeBilledCostCents, resolveLedgerScopeForRun } = heartbeatCore;
32
+ 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, networkWaitBackoffMs, SESSIONED_LOCAL_ADAPTERS, heartbeatRunListColumns, appendExcerpt, appendTranscriptEntriesFromChunk, normalizeMaxConcurrentRuns, withAgentStartLock, readNonEmptyString, buildHeartbeatAdapterInvokePayload, sanitizeStartupContextContextForPersistence, sanitizeStartupContextPromptForPersistence, 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, resolveForbiddenRuntimeSkillMarkers, detectForbiddenRuntimeSkillMarker, normalizeLedgerBillingType, resolveLedgerBiller, normalizeBilledCostCents, resolveLedgerScopeForRun } = heartbeatCore;
22
33
  const { buildExplicitResumeSessionOverride, selectRunSessionLineage, 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
34
  function buildPersistableHeartbeatContext(context) {
24
35
  return sanitizeStartupContextContextForPersistence(context) ?? {};
@@ -123,6 +134,20 @@ export function createHeartbeatExecuteHandlers(context) {
123
134
  }
124
135
  const executionAbortController = runAbortControllers.get(run.id) ?? new AbortController();
125
136
  runAbortControllers.set(run.id, executionAbortController);
137
+ let activeAttemptRef = null;
138
+ let networkSuspended = false;
139
+ const finishActiveAttempt = async (input) => {
140
+ const ref = activeAttemptRef;
141
+ activeAttemptRef = null;
142
+ if (!ref)
143
+ return;
144
+ try {
145
+ await finishHeartbeatRunAttempt(db, ref, input);
146
+ }
147
+ catch (error) {
148
+ logger.warn({ err: error, runId: runId, attemptIndex: ref.attemptIndex }, "failed to persist heartbeat attempt terminal state");
149
+ }
150
+ };
126
151
  try {
127
152
  if (run.status === "queued") {
128
153
  const claimed = await claimQueuedRun(run);
@@ -178,6 +203,7 @@ export function createHeartbeatExecuteHandlers(context) {
178
203
  let finalRunOutput = null;
179
204
  let ownsTerminalState = false;
180
205
  let shouldCompleteTerminalEffects = false;
206
+ let activeAttemptSpec = null;
181
207
  const finalizeExecutionTranscript = () => {
182
208
  stdoutTranscriptBuffer = appendTranscriptEntriesFromChunk({
183
209
  buffer: stdoutTranscriptBuffer,
@@ -592,6 +618,27 @@ export function createHeartbeatExecuteHandlers(context) {
592
618
  sessionDisplayId: previousSessionDisplayId,
593
619
  taskKey,
594
620
  };
621
+ const attemptStride = Math.max(1, buildModelAttemptSpecs(runtimeConfig, agent.agentRuntimeType).length);
622
+ const recoveryAttemptOrdinal = Math.max(0, Math.floor(Number(run.networkWaitAttemptCount) || 0));
623
+ const attemptResumeSource = recoveryAttemptOrdinal === 0
624
+ ? "fresh"
625
+ : run.recoveryCheckpoint?.continuation === "resume_same_session"
626
+ ? "same_session"
627
+ : "pristine_replay";
628
+ const resolveLedgerAttemptIndex = (attempt) => recoveryAttemptOrdinal * attemptStride + attempt.index;
629
+ const recoveryStartAttemptIndex = recoveryAttemptOrdinal > 0
630
+ && typeof run.recoveryCheckpoint?.fallbackIndex === "number"
631
+ ? Math.max(0, Math.floor(run.recoveryCheckpoint.fallbackIndex))
632
+ : 0;
633
+ const persistAttempt = async (label, operation) => {
634
+ try {
635
+ return await operation();
636
+ }
637
+ catch (error) {
638
+ logger.warn({ err: error, runId: run.id, label }, "failed to persist heartbeat attempt ledger state");
639
+ return null;
640
+ }
641
+ };
595
642
  let handle = null;
596
643
  let stdoutExcerpt = "";
597
644
  let stderrExcerpt = "";
@@ -631,6 +678,7 @@ export function createHeartbeatExecuteHandlers(context) {
631
678
  const startedAt = run.startedAt ?? new Date();
632
679
  const runningWithSession = await persistRunningExecutionContext(run.id, context, {
633
680
  startedAt,
681
+ runningSubstate: "executing",
634
682
  sessionIdBefore: runtimeForAdapter.sessionDisplayId ?? runtimeForAdapter.sessionId,
635
683
  sessionParamsBeforeJson: runtimeForAdapter.sessionParams,
636
684
  sessionReuseScope,
@@ -645,29 +693,92 @@ export function createHeartbeatExecuteHandlers(context) {
645
693
  message: "run started",
646
694
  });
647
695
  if (assignmentGuardrailEnabled) {
648
- const workspacePreflight = await inspectAssignmentRunWorkspace({
696
+ const initialWorkspacePreflight = await inspectAssignmentRunWorkspace({
649
697
  actualCwd: executionWorkspace.cwd,
650
698
  projectWorkingSetCwd: configuredProjectWorkingSetCwd ?? resolvedWorkspace.cwd,
651
699
  });
700
+ const dependencyRepair = initialWorkspacePreflight.ready
701
+ ? null
702
+ : await repairAssignmentRunWorkspace({ preflight: initialWorkspacePreflight });
703
+ const workspacePreflight = dependencyRepair?.final ?? initialWorkspacePreflight;
704
+ if (dependencyRepair && !dependencyRepair.succeeded) {
705
+ await appendRunEvent(currentRun, {
706
+ eventType: "runtime.assignment_dependency_repair",
707
+ stream: "system",
708
+ level: "warn",
709
+ message: dependencyRepair.skippedReason
710
+ ? `assignment dependency repair skipped: ${dependencyRepair.skippedReason}`
711
+ : "assignment dependency repair did not make the workspace ready",
712
+ payload: {
713
+ command: dependencyRepair.command,
714
+ attempted: dependencyRepair.attempted,
715
+ coalesced: dependencyRepair.coalesced,
716
+ rechecked: dependencyRepair.rechecked,
717
+ succeeded: dependencyRepair.succeeded,
718
+ output: dependencyRepair.output,
719
+ skippedReason: dependencyRepair.skippedReason,
720
+ workspaceFingerprint: dependencyRepair.workspaceFingerprint,
721
+ readinessFingerprint: dependencyRepair.readinessFingerprint,
722
+ initialReady: dependencyRepair.initial.ready,
723
+ finalReady: dependencyRepair.final.ready,
724
+ },
725
+ });
726
+ }
727
+ else if (dependencyRepair?.attempted) {
728
+ await appendRunEvent(currentRun, {
729
+ eventType: "runtime.assignment_dependency_repair",
730
+ stream: "system",
731
+ level: "info",
732
+ message: "assignment dependency repair completed",
733
+ payload: {
734
+ command: dependencyRepair.command,
735
+ attempted: dependencyRepair.attempted,
736
+ coalesced: dependencyRepair.coalesced,
737
+ rechecked: dependencyRepair.rechecked,
738
+ succeeded: dependencyRepair.succeeded,
739
+ output: dependencyRepair.output,
740
+ skippedReason: dependencyRepair.skippedReason,
741
+ workspaceFingerprint: dependencyRepair.workspaceFingerprint,
742
+ readinessFingerprint: dependencyRepair.readinessFingerprint,
743
+ initialReady: dependencyRepair.initial.ready,
744
+ finalReady: dependencyRepair.final.ready,
745
+ },
746
+ });
747
+ }
652
748
  await appendRunEvent(currentRun, {
653
749
  eventType: "runtime.assignment_preflight",
654
750
  stream: "system",
655
- level: workspacePreflight.cwdMatchesProjectWorkingSet ? "info" : "warn",
656
- message: workspacePreflight.cwdMatchesProjectWorkingSet
657
- ? "assignment run workspace preflight passed"
658
- : "assignment run workspace differs from project working set",
659
- payload: workspacePreflight,
751
+ level: workspacePreflight.ready ? "info" : "error",
752
+ message: workspacePreflight.ready
753
+ ? dependencyRepair?.attempted
754
+ ? "assignment run workspace preflight passed after dependency repair"
755
+ : "assignment run workspace preflight passed"
756
+ : "assignment run workspace preflight failed",
757
+ payload: {
758
+ ...workspacePreflight,
759
+ initialReady: dependencyRepair?.initial.ready ?? workspacePreflight.ready,
760
+ dependencyRepair: dependencyRepair
761
+ ? {
762
+ command: dependencyRepair.command,
763
+ attempted: dependencyRepair.attempted,
764
+ coalesced: dependencyRepair.coalesced,
765
+ rechecked: dependencyRepair.rechecked,
766
+ succeeded: dependencyRepair.succeeded,
767
+ output: dependencyRepair.output,
768
+ skippedReason: dependencyRepair.skippedReason,
769
+ }
770
+ : null,
771
+ },
660
772
  });
661
773
  if (!workspacePreflight.ready) {
662
- throw new Error(workspacePreflight.recoveryCommand
663
- ? `Assignment startup preflight failed in ${workspacePreflight.actualCwd}. Run this recovery command once before retrying: ${workspacePreflight.recoveryCommand}`
664
- : `Assignment project working set is not available: ${workspacePreflight.projectWorkingSetCwd}. Restore or remount that directory before retrying.`);
774
+ throw new AssignmentDependencyPreflightError(workspacePreflight, dependencyRepair);
665
775
  }
666
776
  }
667
777
  handle = await runLogStore.begin({
668
778
  orgId: run.orgId,
669
779
  agentId: run.agentId,
670
780
  runId,
781
+ append: Boolean(run.logRef),
671
782
  });
672
783
  await db
673
784
  .update(heartbeatRuns)
@@ -884,11 +995,43 @@ export function createHeartbeatExecuteHandlers(context) {
884
995
  requestApproval,
885
996
  waitForApproval,
886
997
  }, {
998
+ startAttemptIndex: recoveryStartAttemptIndex,
887
999
  resolveAdapter: findServerAdapter,
888
1000
  createAuthToken: (agentRuntimeType) => createLocalAgentJwt(agent.id, agent.orgId, agentRuntimeType, run.id) ?? undefined,
889
- onAttemptStart: (_attempt, attemptAdapter) => {
1001
+ onAttemptStart: async (attempt, attemptAdapter) => {
1002
+ activeAttemptSpec = {
1003
+ index: attempt.index,
1004
+ fallbackIndex: attempt.fallbackIndex,
1005
+ };
1006
+ activeAttemptRef = await persistAttempt("started", () => beginHeartbeatRunAttempt(db, {
1007
+ orgId: run.orgId,
1008
+ runId: run.id,
1009
+ agentId: run.agentId,
1010
+ attemptIndex: resolveLedgerAttemptIndex(attempt),
1011
+ fallbackIndex: attempt.fallbackIndex,
1012
+ runtimeType: attempt.agentRuntimeType ?? agent.agentRuntimeType,
1013
+ model: attempt.model,
1014
+ isFallback: attempt.isFallback,
1015
+ resumeSource: attemptResumeSource,
1016
+ }));
890
1017
  stdoutTranscriptParser = attemptAdapter.parseStdoutLine ?? null;
891
1018
  },
1019
+ onAttemptFailure: async (_attempt, failure) => {
1020
+ const failureRecord = failure && typeof failure === "object" ? failure : null;
1021
+ const failureMessage = failure instanceof Error
1022
+ ? failure.message
1023
+ : readNonEmptyString(failureRecord?.errorMessage) ?? "Adapter fallback attempt failed";
1024
+ await finishActiveAttempt({
1025
+ status: "failed",
1026
+ errorCode: readNonEmptyString(failureRecord?.errorCode) ?? "adapter_failed",
1027
+ error: failureMessage,
1028
+ usageDeltaJson: failureRecord?.usage,
1029
+ costUsd: failureRecord?.costUsd,
1030
+ sessionDisplayId: readNonEmptyString(failureRecord?.sessionDisplayId)
1031
+ ?? readNonEmptyString(failureRecord?.sessionId),
1032
+ sessionParamsJson: failureRecord?.sessionParams,
1033
+ });
1034
+ },
892
1035
  });
893
1036
  if (assignmentGuardrailCheckpoint) {
894
1037
  adapterResult.errorMessage = "Assignment run stopped after reaching its tool failure budget";
@@ -935,6 +1078,123 @@ export function createHeartbeatExecuteHandlers(context) {
935
1078
  }
936
1079
  }
937
1080
  }
1081
+ const networkSuspension = isAgentRuntimeNetworkSuspension(adapterResult.networkSuspension)
1082
+ ? adapterResult.networkSuspension
1083
+ : isAgentRuntimeNetworkSuspension(adapterResult.suspension)
1084
+ ? adapterResult.suspension
1085
+ : null;
1086
+ if (networkSuspension) {
1087
+ // A transport suspension is a non-terminal transition. Persist the
1088
+ // provider checkpoint before releasing the local execution lease so a
1089
+ // restart or another scheduler tick can safely claim this same Run.
1090
+ const now = new Date();
1091
+ const currentRunForWait = await getRun(run.id);
1092
+ const waitAttempt = (currentRunForWait?.networkWaitAttemptCount ?? 0) + 1;
1093
+ const backoff = networkWaitBackoffMs(waitAttempt);
1094
+ const jitteredBackoff = Math.max(1_000, Math.round(backoff * (0.9 + Math.random() * 0.2)));
1095
+ const nextRetryAt = new Date(now.getTime() + jitteredBackoff);
1096
+ const checkpoint = {
1097
+ kind: networkSuspension.kind,
1098
+ code: networkSuspension.code ?? "provider_transport_unavailable",
1099
+ transport: networkSuspension.transport,
1100
+ provider: networkSuspension.provider ?? adapterResult.provider ?? null,
1101
+ model: networkSuspension.model ?? adapterResult.model ?? null,
1102
+ submissionPhase: networkSuspension.submissionPhase,
1103
+ continuation: networkSuspension.continuation,
1104
+ sessionId: networkSuspension.sessionId ?? adapterResult.sessionDisplayId ?? adapterResult.sessionId ?? null,
1105
+ sessionParams: networkSuspension.sessionParams ?? adapterResult.sessionParams ?? null,
1106
+ progress: networkSuspension.progress ?? {
1107
+ modelOutputObserved: networkSuspension.modelOutputObserved,
1108
+ toolActivityObserved: networkSuspension.toolActivityObserved,
1109
+ },
1110
+ modelOutputObserved: networkSuspension.modelOutputObserved
1111
+ ?? networkSuspension.progress?.modelOutputObserved
1112
+ ?? false,
1113
+ toolActivityObserved: networkSuspension.toolActivityObserved
1114
+ ?? networkSuspension.progress?.toolActivityObserved
1115
+ ?? false,
1116
+ sideEffectRisk: networkSuspension.sideEffectRisk ?? null,
1117
+ attemptIndex: activeAttemptSpec?.index ?? 0,
1118
+ fallbackIndex: activeAttemptSpec?.fallbackIndex ?? null,
1119
+ message: networkSuspension.message,
1120
+ observedAt: now.toISOString(),
1121
+ };
1122
+ const resumedSessionId = readNonEmptyString(networkSuspension.sessionId)
1123
+ ?? readNonEmptyString(adapterResult.sessionDisplayId)
1124
+ ?? readNonEmptyString(adapterResult.sessionId)
1125
+ ?? previousSessionDisplayId
1126
+ ?? null;
1127
+ const resumedSessionParams = networkSuspension.sessionParams
1128
+ ?? adapterResult.sessionParams
1129
+ ?? runtimeForAdapter.sessionParams
1130
+ ?? null;
1131
+ const waitingRun = await db
1132
+ .update(heartbeatRuns)
1133
+ .set({
1134
+ runningSubstate: "waiting_for_network",
1135
+ networkWaitStartedAt: currentRunForWait?.networkWaitStartedAt ?? now,
1136
+ networkWaitNextRetryAt: nextRetryAt,
1137
+ networkWaitAttemptCount: waitAttempt,
1138
+ recoveryCheckpoint: checkpoint,
1139
+ sessionIdBefore: resumedSessionId,
1140
+ sessionParamsBeforeJson: resumedSessionParams,
1141
+ sessionReuseScope: resumedSessionParams || resumedSessionId ? "explicit" : "none",
1142
+ processExitedAt: now,
1143
+ processPid: null,
1144
+ processStartedAt: null,
1145
+ executionOwnerToken: null,
1146
+ executionLeaseExpiresAt: null,
1147
+ updatedAt: now,
1148
+ })
1149
+ .where(and(eq(heartbeatRuns.id, run.id), eq(heartbeatRuns.status, "running"), ...(executionOwnerToken ? [eq(heartbeatRuns.executionOwnerToken, executionOwnerToken)] : [])))
1150
+ .returning()
1151
+ .then((rows) => rows[0] ?? null);
1152
+ if (!waitingRun)
1153
+ return;
1154
+ networkSuspended = true;
1155
+ const waitingAttemptRef = activeAttemptRef;
1156
+ activeAttemptRef = null;
1157
+ await persistAttempt("waiting_for_network", () => markHeartbeatRunAttemptWaiting(db, waitingAttemptRef, {
1158
+ submissionPhase: networkSuspension.submissionPhase,
1159
+ providerThreadId: networkSuspension.providerThreadId ?? adapterResult.providerThreadId,
1160
+ providerTurnId: networkSuspension.providerTurnId ?? adapterResult.providerTurnId,
1161
+ sessionDisplayId: resumedSessionId,
1162
+ sessionParamsJson: resumedSessionParams,
1163
+ checkpointJson: checkpoint,
1164
+ errorCode: networkSuspension.code ?? "provider_transport_unavailable",
1165
+ error: networkSuspension.message ?? null,
1166
+ suspendedAt: now,
1167
+ }));
1168
+ await appendRunEvent(waitingRun, {
1169
+ eventType: "network.waiting",
1170
+ stream: "system",
1171
+ level: "info",
1172
+ message: "run waiting for network",
1173
+ payload: {
1174
+ attempt: waitAttempt,
1175
+ nextRetryAt: nextRetryAt.toISOString(),
1176
+ backoffMs: jitteredBackoff,
1177
+ suspension: checkpoint,
1178
+ },
1179
+ });
1180
+ publishLiveEvent({
1181
+ orgId: waitingRun.orgId,
1182
+ type: "heartbeat.run.status",
1183
+ payload: {
1184
+ runId: waitingRun.id,
1185
+ agentId: waitingRun.agentId,
1186
+ status: waitingRun.status,
1187
+ executionPhase: "waiting_for_network",
1188
+ networkWaitAttemptCount: waitAttempt,
1189
+ networkWaitNextRetryAt: nextRetryAt.toISOString(),
1190
+ },
1191
+ });
1192
+ if (handle) {
1193
+ await runLogStore.finalize(handle).catch(() => undefined);
1194
+ handle = null;
1195
+ }
1196
+ return;
1197
+ }
938
1198
  const nextSessionState = resolveNextSessionState({
939
1199
  codec: sessionCodec,
940
1200
  adapterResult,
@@ -1101,6 +1361,19 @@ export function createHeartbeatExecuteHandlers(context) {
1101
1361
  expectedExecutionOwnerToken: executionOwnerToken,
1102
1362
  });
1103
1363
  ownsTerminalState = Boolean(claimedTerminalRun);
1364
+ await finishActiveAttempt({
1365
+ status,
1366
+ submissionPhase: adapterResult.submissionPhase,
1367
+ providerThreadId: adapterResult.providerThreadId,
1368
+ providerTurnId: adapterResult.providerTurnId,
1369
+ sessionDisplayId: nextSessionState.displayId ?? nextSessionState.legacySessionId,
1370
+ sessionParamsJson: adapterResult.clearSession ? {} : nextSessionState.params,
1371
+ usageDeltaJson: usageJson ?? adapterResult.usage,
1372
+ costUsd: adapterResult.costUsd,
1373
+ errorCode: terminalEvidence.errorCode,
1374
+ error: terminalEvidence.error,
1375
+ finishedAt: terminalEvidence.finishedAt,
1376
+ });
1104
1377
  if (!claimedTerminalRun) {
1105
1378
  await reconcileRunEvidence(run.id, terminalEvidence);
1106
1379
  await reconcileTerminalEffectsIntent(run.id, {
@@ -1199,7 +1472,9 @@ export function createHeartbeatExecuteHandlers(context) {
1199
1472
  }
1200
1473
  }
1201
1474
  catch (err) {
1202
- const isWorkspacePreflightFailure = isWorkspacePermissionPreflightError(err) ||
1475
+ const isAssignmentDependencyPreflightFailure = err instanceof AssignmentDependencyPreflightError;
1476
+ const isWorkspacePreflightFailure = isAssignmentDependencyPreflightFailure ||
1477
+ isWorkspacePermissionPreflightError(err) ||
1203
1478
  isManagedWorkspaceConfigurationError(err);
1204
1479
  const message = redactCurrentUserText(err instanceof Error ? err.message : "Unknown adapter failure", await getCurrentUserRedactionOptions());
1205
1480
  transcriptFallbackResult = {
@@ -1297,6 +1572,14 @@ export function createHeartbeatExecuteHandlers(context) {
1297
1572
  expectedExecutionOwnerToken: executionOwnerToken,
1298
1573
  });
1299
1574
  ownsTerminalState = Boolean(claimedFailedRun);
1575
+ await finishActiveAttempt({
1576
+ status: "failed",
1577
+ errorCode: failureEvidence.errorCode,
1578
+ error: failureEvidence.error,
1579
+ sessionDisplayId: previousSessionDisplayId,
1580
+ sessionParamsJson: previousSessionParams,
1581
+ finishedAt: failureEvidence.finishedAt,
1582
+ });
1300
1583
  if (!claimedFailedRun)
1301
1584
  await reconcileRunEvidence(run.id, failureEvidence);
1302
1585
  const failedRun = claimedFailedRun ?? await getRun(run.id);
@@ -1310,7 +1593,11 @@ export function createHeartbeatExecuteHandlers(context) {
1310
1593
  if (ownsTerminalState) {
1311
1594
  await appendForbiddenMarkerEvent(failedRun, buildForbiddenMarkerScan(null));
1312
1595
  await appendRunEvent(failedRun, {
1313
- eventType: isWorkspacePreflightFailure ? "runtime.workspace_preflight_failed" : "error",
1596
+ eventType: isAssignmentDependencyPreflightFailure
1597
+ ? "runtime.assignment_preflight_failed"
1598
+ : isWorkspacePreflightFailure
1599
+ ? "runtime.workspace_preflight_failed"
1600
+ : "error",
1314
1601
  stream: "system",
1315
1602
  level: "error",
1316
1603
  message,
@@ -1318,7 +1605,9 @@ export function createHeartbeatExecuteHandlers(context) {
1318
1605
  ? {
1319
1606
  payload: {
1320
1607
  errorCode: err.errorCode,
1321
- failure: err.failure,
1608
+ ...(isAssignmentDependencyPreflightFailure
1609
+ ? err.failure
1610
+ : { failure: err.failure }),
1322
1611
  },
1323
1612
  }
1324
1613
  : {}),
@@ -1351,6 +1640,12 @@ export function createHeartbeatExecuteHandlers(context) {
1351
1640
  // The inner catch did not fire, so we must record the failure here.
1352
1641
  const message = outerErr instanceof Error ? outerErr.message : "Unknown setup failure";
1353
1642
  logger.error({ err: outerErr, runId }, "heartbeat execution setup failed");
1643
+ await finishActiveAttempt({
1644
+ status: "failed",
1645
+ errorCode: "adapter_failed",
1646
+ error: message,
1647
+ finishedAt: new Date(),
1648
+ });
1354
1649
  const latestRun = await getRun(runId).catch(() => null);
1355
1650
  const claimedFailedRun = latestRun?.status === "running"
1356
1651
  ? await transitionRunToTerminal(runId, "failed", {
@@ -1388,7 +1683,8 @@ export function createHeartbeatExecuteHandlers(context) {
1388
1683
  await releaseRuntimeServicesForRun(run.id).catch(() => undefined);
1389
1684
  runAbortControllers.delete(run.id);
1390
1685
  activeRunExecutions.delete(run.id);
1391
- await startNextQueuedRunForAgent(run.agentId);
1686
+ if (!networkSuspended)
1687
+ await startNextQueuedRunForAgent(run.agentId);
1392
1688
  }
1393
1689
  }
1394
1690
  return { executeRun };