@rudderhq/server 0.7.3 → 0.7.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 (268) hide show
  1. package/dist/agent-runtimes/index.d.ts +1 -1
  2. package/dist/agent-runtimes/index.d.ts.map +1 -1
  3. package/dist/agent-runtimes/types.d.ts +1 -1
  4. package/dist/agent-runtimes/types.d.ts.map +1 -1
  5. package/dist/bootstrap/register-api-routes.d.ts.map +1 -1
  6. package/dist/bootstrap/register-api-routes.js +2 -0
  7. package/dist/bootstrap/register-api-routes.js.map +1 -1
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +10 -1
  10. package/dist/index.js.map +1 -1
  11. package/dist/redaction.d.ts +4 -0
  12. package/dist/redaction.d.ts.map +1 -1
  13. package/dist/redaction.js +15 -0
  14. package/dist/redaction.js.map +1 -1
  15. package/dist/routes/app-builder.d.ts.map +1 -1
  16. package/dist/routes/app-builder.js +1 -13
  17. package/dist/routes/app-builder.js.map +1 -1
  18. package/dist/routes/approvals.d.ts.map +1 -1
  19. package/dist/routes/approvals.js +36 -9
  20. package/dist/routes/approvals.js.map +1 -1
  21. package/dist/routes/chats.d.ts.map +1 -1
  22. package/dist/routes/chats.js +25 -8
  23. package/dist/routes/chats.js.map +1 -1
  24. package/dist/routes/chats.preflight.d.ts +2 -1
  25. package/dist/routes/chats.preflight.d.ts.map +1 -1
  26. package/dist/routes/chats.preflight.js +7 -0
  27. package/dist/routes/chats.preflight.js.map +1 -1
  28. package/dist/routes/chats.stream-routes.d.ts.map +1 -1
  29. package/dist/routes/chats.stream-routes.js +14 -3
  30. package/dist/routes/chats.stream-routes.js.map +1 -1
  31. package/dist/routes/chats.stream-support.d.ts.map +1 -1
  32. package/dist/routes/chats.stream-support.js +8 -0
  33. package/dist/routes/chats.stream-support.js.map +1 -1
  34. package/dist/routes/goals.d.ts.map +1 -1
  35. package/dist/routes/goals.js +176 -27
  36. package/dist/routes/goals.js.map +1 -1
  37. package/dist/routes/index.d.ts +1 -0
  38. package/dist/routes/index.d.ts.map +1 -1
  39. package/dist/routes/index.js +1 -0
  40. package/dist/routes/index.js.map +1 -1
  41. package/dist/routes/issues.d.ts.map +1 -1
  42. package/dist/routes/issues.js +2 -1
  43. package/dist/routes/issues.js.map +1 -1
  44. package/dist/routes/issues.mutations.d.ts.map +1 -1
  45. package/dist/routes/issues.mutations.js +121 -19
  46. package/dist/routes/issues.mutations.js.map +1 -1
  47. package/dist/routes/managed-mcp-runtime.js +1 -1
  48. package/dist/routes/managed-mcp-runtime.js.map +1 -1
  49. package/dist/routes/organization-skills.d.ts.map +1 -1
  50. package/dist/routes/organization-skills.js +23 -1
  51. package/dist/routes/organization-skills.js.map +1 -1
  52. package/dist/routes/orgs.d.ts.map +1 -1
  53. package/dist/routes/orgs.js +5 -0
  54. package/dist/routes/orgs.js.map +1 -1
  55. package/dist/routes/requests.d.ts +3 -0
  56. package/dist/routes/requests.d.ts.map +1 -0
  57. package/dist/routes/requests.js +122 -0
  58. package/dist/routes/requests.js.map +1 -0
  59. package/dist/routes/rudder-plugins.d.ts.map +1 -1
  60. package/dist/routes/rudder-plugins.js +1 -11
  61. package/dist/routes/rudder-plugins.js.map +1 -1
  62. package/dist/services/activity-log.d.ts.map +1 -1
  63. package/dist/services/activity-log.js +19 -9
  64. package/dist/services/activity-log.js.map +1 -1
  65. package/dist/services/agent-run-context.d.ts.map +1 -1
  66. package/dist/services/agent-run-context.js +2 -7
  67. package/dist/services/agent-run-context.js.map +1 -1
  68. package/dist/services/agents.d.ts +14 -14
  69. package/dist/services/agents.d.ts.map +1 -1
  70. package/dist/services/agents.js +2 -1
  71. package/dist/services/agents.js.map +1 -1
  72. package/dist/services/chat-agent-runs.d.ts +1 -0
  73. package/dist/services/chat-agent-runs.d.ts.map +1 -1
  74. package/dist/services/chat-agent-runs.js +1 -0
  75. package/dist/services/chat-agent-runs.js.map +1 -1
  76. package/dist/services/chat-assistant.d.ts.map +1 -1
  77. package/dist/services/chat-assistant.helpers.d.ts +2 -0
  78. package/dist/services/chat-assistant.helpers.d.ts.map +1 -1
  79. package/dist/services/chat-assistant.helpers.js +25 -0
  80. package/dist/services/chat-assistant.helpers.js.map +1 -1
  81. package/dist/services/chat-assistant.js +46 -9
  82. package/dist/services/chat-assistant.js.map +1 -1
  83. package/dist/services/chat-queued-message-materialization.d.ts +1 -1
  84. package/dist/services/chats.create.d.ts +2 -2
  85. package/dist/services/chats.create.d.ts.map +1 -1
  86. package/dist/services/chats.d.ts +13 -13
  87. package/dist/services/chats.d.ts.map +1 -1
  88. package/dist/services/chats.helpers.d.ts +2 -2
  89. package/dist/services/chats.helpers.d.ts.map +1 -1
  90. package/dist/services/chats.helpers.goal-context.test.d.ts +2 -0
  91. package/dist/services/chats.helpers.goal-context.test.d.ts.map +1 -0
  92. package/dist/services/chats.helpers.goal-context.test.js +40 -0
  93. package/dist/services/chats.helpers.goal-context.test.js.map +1 -0
  94. package/dist/services/chats.helpers.js +27 -2
  95. package/dist/services/chats.helpers.js.map +1 -1
  96. package/dist/services/chats.js.map +1 -1
  97. package/dist/services/finance.d.ts +1 -1
  98. package/dist/services/goals.d.ts +267 -244
  99. package/dist/services/goals.d.ts.map +1 -1
  100. package/dist/services/goals.js +1279 -297
  101. package/dist/services/goals.js.map +1 -1
  102. package/dist/services/index.d.ts +2 -1
  103. package/dist/services/index.d.ts.map +1 -1
  104. package/dist/services/index.js +2 -1
  105. package/dist/services/index.js.map +1 -1
  106. package/dist/services/instance-settings.d.ts.map +1 -1
  107. package/dist/services/instance-settings.js +6 -14
  108. package/dist/services/instance-settings.js.map +1 -1
  109. package/dist/services/issues.d.ts +16 -16
  110. package/dist/services/knowledge-portability/organization-skills.d.ts +2 -1
  111. package/dist/services/knowledge-portability/organization-skills.d.ts.map +1 -1
  112. package/dist/services/knowledge-portability/organization-skills.js +52 -17
  113. package/dist/services/knowledge-portability/organization-skills.js.map +1 -1
  114. package/dist/services/mcp/managed-bindings.d.ts +1 -3
  115. package/dist/services/mcp/managed-bindings.d.ts.map +1 -1
  116. package/dist/services/mcp/managed-bindings.js +2 -3
  117. package/dist/services/mcp/managed-bindings.js.map +1 -1
  118. package/dist/services/messenger.d.ts +2 -2
  119. package/dist/services/messenger.d.ts.map +1 -1
  120. package/dist/services/messenger.js +76 -17
  121. package/dist/services/messenger.js.map +1 -1
  122. package/dist/services/orgs.d.ts.map +1 -1
  123. package/dist/services/orgs.js +3 -1
  124. package/dist/services/orgs.js.map +1 -1
  125. package/dist/services/product-analytics.d.ts +1 -1
  126. package/dist/services/requests.d.ts +919 -0
  127. package/dist/services/requests.d.ts.map +1 -0
  128. package/dist/services/requests.js +532 -0
  129. package/dist/services/requests.js.map +1 -0
  130. package/dist/services/rudder-plugins.d.ts.map +1 -1
  131. package/dist/services/rudder-plugins.js +20 -5
  132. package/dist/services/rudder-plugins.js.map +1 -1
  133. package/dist/services/rudder-plugins.test.js +10 -0
  134. package/dist/services/rudder-plugins.test.js.map +1 -1
  135. package/dist/services/runtime-kernel/assignment-run-guardrail.d.ts +65 -0
  136. package/dist/services/runtime-kernel/assignment-run-guardrail.d.ts.map +1 -0
  137. package/dist/services/runtime-kernel/assignment-run-guardrail.js +204 -0
  138. package/dist/services/runtime-kernel/assignment-run-guardrail.js.map +1 -0
  139. package/dist/services/runtime-kernel/assignment-run-guardrail.test.d.ts +2 -0
  140. package/dist/services/runtime-kernel/assignment-run-guardrail.test.d.ts.map +1 -0
  141. package/dist/services/runtime-kernel/assignment-run-guardrail.test.js +114 -0
  142. package/dist/services/runtime-kernel/assignment-run-guardrail.test.js.map +1 -0
  143. package/dist/services/runtime-kernel/heartbeat.d.ts +12 -0
  144. package/dist/services/runtime-kernel/heartbeat.d.ts.map +1 -1
  145. package/dist/services/runtime-kernel/heartbeat.execute.d.ts.map +1 -1
  146. package/dist/services/runtime-kernel/heartbeat.execute.js +138 -7
  147. package/dist/services/runtime-kernel/heartbeat.execute.js.map +1 -1
  148. package/dist/services/runtime-kernel/heartbeat.js +93 -1
  149. package/dist/services/runtime-kernel/heartbeat.js.map +1 -1
  150. package/dist/services/runtime-kernel/heartbeat.recovery.d.ts +2 -0
  151. package/dist/services/runtime-kernel/heartbeat.recovery.d.ts.map +1 -1
  152. package/dist/services/runtime-kernel/heartbeat.recovery.js +18 -3
  153. package/dist/services/runtime-kernel/heartbeat.recovery.js.map +1 -1
  154. package/dist/services/runtime-kernel/heartbeat.sessions.js +1 -1
  155. package/dist/services/runtime-kernel/heartbeat.sessions.js.map +1 -1
  156. package/dist/services/runtime-kernel/heartbeat.terminal.d.ts.map +1 -1
  157. package/dist/services/runtime-kernel/heartbeat.terminal.js +15 -1
  158. package/dist/services/runtime-kernel/heartbeat.terminal.js.map +1 -1
  159. package/dist/services/runtime-kernel/heartbeat.wakeup.d.ts +1 -0
  160. package/dist/services/runtime-kernel/heartbeat.wakeup.d.ts.map +1 -1
  161. package/dist/services/runtime-kernel/heartbeat.wakeup.js +89 -3
  162. package/dist/services/runtime-kernel/heartbeat.wakeup.js.map +1 -1
  163. package/dist/services/side-chats.d.ts +0 -2
  164. package/dist/services/side-chats.d.ts.map +1 -1
  165. package/dist/services/side-chats.js +4 -12
  166. package/dist/services/side-chats.js.map +1 -1
  167. package/dist/services/workspace-backup-v2.d.ts +127 -0
  168. package/dist/services/workspace-backup-v2.d.ts.map +1 -0
  169. package/dist/services/workspace-backup-v2.js +964 -0
  170. package/dist/services/workspace-backup-v2.js.map +1 -0
  171. package/dist/services/workspace-backup-v2.test.d.ts +2 -0
  172. package/dist/services/workspace-backup-v2.test.d.ts.map +1 -0
  173. package/dist/services/workspace-backup-v2.test.js +318 -0
  174. package/dist/services/workspace-backup-v2.test.js.map +1 -0
  175. package/dist/services/workspace-backups.d.ts +46 -1
  176. package/dist/services/workspace-backups.d.ts.map +1 -1
  177. package/dist/services/workspace-backups.js +579 -60
  178. package/dist/services/workspace-backups.js.map +1 -1
  179. package/dist/services/workspace-runtime.services.d.ts +1 -1
  180. package/package.json +14 -14
  181. package/resources/bundled-skills/rudder-docs/references/cli-reference.md +7 -2
  182. package/resources/bundled-skills/rudder-docs/references/operating-practices.md +10 -6
  183. package/skills/rudder-docs/references/cli-reference.md +7 -2
  184. package/skills/rudder-docs/references/operating-practices.md +10 -6
  185. package/ui-dist/assets/{LibraryLiveSurface-CoGcDfo0.js → LibraryLiveSurface-nSMExVEC.js} +1 -1
  186. package/ui-dist/assets/{abnfDiagram-VRR7QNED-BnPHHNfu.js → abnfDiagram-VRR7QNED-Av8TM585.js} +1 -1
  187. package/ui-dist/assets/addon-fit-DzFhQGnx.js +1 -0
  188. package/ui-dist/assets/{arc-CAvqQQR_.js → arc-Bc-Gf4Fc.js} +1 -1
  189. package/ui-dist/assets/{architectureDiagram-ZJ3FMSHR-DDa31YAK.js → architectureDiagram-ZJ3FMSHR-BOph0PHz.js} +1 -1
  190. package/ui-dist/assets/{blockDiagram-677ZJIJ3-DDXLU9Ej.js → blockDiagram-677ZJIJ3-BCUhdmf3.js} +1 -1
  191. package/ui-dist/assets/{c4Diagram-LMCZKHZV-zEm0rHCp.js → c4Diagram-LMCZKHZV-B_3pH6bx.js} +1 -1
  192. package/ui-dist/assets/channel-CyoUWdeD.js +1 -0
  193. package/ui-dist/assets/{chunk-2Q5K7J3B-y1Rw45sz.js → chunk-2Q5K7J3B-C4gdcZxO.js} +1 -1
  194. package/ui-dist/assets/{chunk-32BRIVSS-Cq8cQBba.js → chunk-32BRIVSS-JxQV72by.js} +1 -1
  195. package/ui-dist/assets/{chunk-5VM5RSS4-CjQA6jGI.js → chunk-5VM5RSS4-f0zO1uV_.js} +1 -1
  196. package/ui-dist/assets/{chunk-EX3LRPZG-VVYt7jh3.js → chunk-EX3LRPZG-Bbn2Dpmg.js} +1 -1
  197. package/ui-dist/assets/{chunk-JWPE2WC7-BJC3ISop.js → chunk-JWPE2WC7-B118_FhP.js} +1 -1
  198. package/ui-dist/assets/{chunk-MOJQB5TN-ClZgTqQk.js → chunk-MOJQB5TN-CEcGkJ3p.js} +1 -1
  199. package/ui-dist/assets/{chunk-RYQCIY6F-DRei3pn2.js → chunk-RYQCIY6F-C-WY_ozP.js} +1 -1
  200. package/ui-dist/assets/{chunk-V7JOEXUC-BGWrQfpZ.js → chunk-V7JOEXUC-DS5sjH7p.js} +1 -1
  201. package/ui-dist/assets/{chunk-VR4S4FIN-BBYT57Lt.js → chunk-VR4S4FIN-COyRk9XW.js} +1 -1
  202. package/ui-dist/assets/{chunk-XXDRQBXY-D7P4SoZB.js → chunk-XXDRQBXY-Cd2T_1Uf.js} +1 -1
  203. package/ui-dist/assets/classDiagram-OUVF2IWQ-BETmcliY.js +1 -0
  204. package/ui-dist/assets/classDiagram-v2-EOCWNBFH-BETmcliY.js +1 -0
  205. package/ui-dist/assets/{cose-bilkent-JH36ORCC-mJXY7GQo.js → cose-bilkent-JH36ORCC-iEFFQ2c7.js} +1 -1
  206. package/ui-dist/assets/{cynefin-VYW2F7L2-C-I_lPmH.js → cynefin-VYW2F7L2-Bp-sv4UP.js} +1 -1
  207. package/ui-dist/assets/{cynefinDiagram-TSTJHNR4-Bm1S_w7H.js → cynefinDiagram-TSTJHNR4-CET_eOH5.js} +1 -1
  208. package/ui-dist/assets/{dagre-VKFMJZFB-BuPIm1AB.js → dagre-VKFMJZFB-BkxxZr0z.js} +1 -1
  209. package/ui-dist/assets/{diagram-FQU43EPY-DTBCuV0W.js → diagram-FQU43EPY-2b0kz8hj.js} +1 -1
  210. package/ui-dist/assets/{diagram-G47NLZAW-B4CK8uR2.js → diagram-G47NLZAW-CWgvA-UY.js} +1 -1
  211. package/ui-dist/assets/{diagram-NH7WQ7WH-BkbS0GkL.js → diagram-NH7WQ7WH-DKoSLHQw.js} +1 -1
  212. package/ui-dist/assets/{diagram-OA4YK3LP-C_mkRe0c.js → diagram-OA4YK3LP-BtpJ7ObO.js} +1 -1
  213. package/ui-dist/assets/{diagram-WEI45ONY-CHUb3TIJ.js → diagram-WEI45ONY-cTRv44yL.js} +1 -1
  214. package/ui-dist/assets/{ebnfDiagram-CCIWWBDH-D_lN4ZOY.js → ebnfDiagram-CCIWWBDH-BMwUwEZM.js} +1 -1
  215. package/ui-dist/assets/{erDiagram-Q63AITRT-CRnDqcsy.js → erDiagram-Q63AITRT-B9qW6I5c.js} +1 -1
  216. package/ui-dist/assets/{flowDiagram-23GEKE2U-ChELY-8y.js → flowDiagram-23GEKE2U-Cb1rJFcp.js} +1 -1
  217. package/ui-dist/assets/{ganttDiagram-NO4QXBWP-QIML25-M.js → ganttDiagram-NO4QXBWP-CiicdHPl.js} +1 -1
  218. package/ui-dist/assets/{gitGraphDiagram-IHSO6WYX-TB_AKH8l.js → gitGraphDiagram-IHSO6WYX-Cge-AgEB.js} +1 -1
  219. package/ui-dist/assets/{graph-HKPvyYQ1.js → graph-0wCGCEs4.js} +1 -1
  220. package/ui-dist/assets/{index-DmEf_U5I.js → index-5dD5l_7S.js} +1 -1
  221. package/ui-dist/assets/{index-gdvFtffQ.js → index-BOnG5igl.js} +1 -1
  222. package/ui-dist/assets/index-BT7dphT4.css +32 -0
  223. package/ui-dist/assets/{index-rnOTiIXd.js → index-BXR0UEnQ.js} +1 -1
  224. package/ui-dist/assets/{index-ZzX8P4M5.js → index-B_c6Qzui.js} +1 -1
  225. package/ui-dist/assets/{index-OfGDMJiA.js → index-BhIqb_sb.js} +1 -1
  226. package/ui-dist/assets/{index-CjIeIR2m.js → index-BjGW8ROf.js} +1 -1
  227. package/ui-dist/assets/{index-CfpFS1Tl.js → index-BqpG2FnL.js} +565 -564
  228. package/ui-dist/assets/{index-DDMaBNLI.js → index-C3ghnZSF.js} +1 -1
  229. package/ui-dist/assets/{index-BeNxgoKd.js → index-CB9X8t3F.js} +1 -1
  230. package/ui-dist/assets/{index-fDtlbG8Y.js → index-CcDlhtvT.js} +1 -1
  231. package/ui-dist/assets/{index-Ar0zIwom.js → index-D1w6UIRX.js} +1 -1
  232. package/ui-dist/assets/{index-CB-UdrKN.js → index-DN9Yo10m.js} +1 -1
  233. package/ui-dist/assets/{index-DSZmO4bA.js → index-DP30MjES.js} +1 -1
  234. package/ui-dist/assets/{index-DfzFi2fx.js → index-DXRvkZMv.js} +1 -1
  235. package/ui-dist/assets/{index-DCgbySwf.js → index-Dy-AXx6E.js} +1 -1
  236. package/ui-dist/assets/{infoDiagram-FWYZ7A6U-DUR3sDTd.js → infoDiagram-FWYZ7A6U-R2pgAXHR.js} +1 -1
  237. package/ui-dist/assets/{ishikawaDiagram-FXEZZL3T-CcnYT0s0.js → ishikawaDiagram-FXEZZL3T-BJivveWk.js} +1 -1
  238. package/ui-dist/assets/{journeyDiagram-5HDEW3XC-CqfbG8T1.js → journeyDiagram-5HDEW3XC-CLlN_hss.js} +1 -1
  239. package/ui-dist/assets/{kanban-definition-HUTT4EX6-CYwQM9eR.js → kanban-definition-HUTT4EX6-CCRtDa5s.js} +1 -1
  240. package/ui-dist/assets/{layout-B2IlJgLE.js → layout-BgygArKO.js} +1 -1
  241. package/ui-dist/assets/{linear-CcEPcfbO.js → linear-ZTGN1Bax.js} +1 -1
  242. package/ui-dist/assets/{map-Bmhfvlpu.js → map-BheoFUge.js} +1 -1
  243. package/ui-dist/assets/{mermaid.core-T9Q0CuQx.js → mermaid.core-D4HYOaQr.js} +4 -4
  244. package/ui-dist/assets/{mindmap-definition-LN4V7U3C-CRjQlwN4.js → mindmap-definition-LN4V7U3C-B25TPfzP.js} +1 -1
  245. package/ui-dist/assets/{pegDiagram-2B236MQR-DenccdY8.js → pegDiagram-2B236MQR-CWrV5tQE.js} +1 -1
  246. package/ui-dist/assets/{pieDiagram-ENE6RG2P-CPiTrJcY.js → pieDiagram-ENE6RG2P-BQTq4Jp6.js} +1 -1
  247. package/ui-dist/assets/{quadrantDiagram-ABIIQ3AL-fKbvGl_-.js → quadrantDiagram-ABIIQ3AL-C5TwZIzz.js} +1 -1
  248. package/ui-dist/assets/{railroadDiagram-RFXS5EU6-D6uOjEmA.js → railroadDiagram-RFXS5EU6--wv7_omb.js} +1 -1
  249. package/ui-dist/assets/{requirementDiagram-TGXJPOKE-CQIQ387O.js → requirementDiagram-TGXJPOKE-D80O_sgV.js} +1 -1
  250. package/ui-dist/assets/{sankeyDiagram-HTMAVEWB-CKrnONJL.js → sankeyDiagram-HTMAVEWB-Cz0SmDPj.js} +1 -1
  251. package/ui-dist/assets/{sequenceDiagram-DBY2YBRQ-C3vaOiZO.js → sequenceDiagram-DBY2YBRQ-jmLYUOQ2.js} +1 -1
  252. package/ui-dist/assets/{sizeCapture-X5ZJPWSS-F39EvxY0.js → sizeCapture-X5ZJPWSS-C1FqwoMN.js} +1 -1
  253. package/ui-dist/assets/{stateDiagram-2N3HPSRC-Bq2sVFQq.js → stateDiagram-2N3HPSRC-CZa7Dj75.js} +1 -1
  254. package/ui-dist/assets/stateDiagram-v2-6OUMAXLB-CEUECJmS.js +1 -0
  255. package/ui-dist/assets/{swimlanes-5IMT3BWC-CSrygB7m.js → swimlanes-5IMT3BWC-CbHndCqy.js} +2 -2
  256. package/ui-dist/assets/swimlanesDiagram-G3AALYLV-4TgYo_NT.js +8 -0
  257. package/ui-dist/assets/{timeline-definition-FHXFAJF6-DSMMlntv.js → timeline-definition-FHXFAJF6-CFOg8vuA.js} +1 -1
  258. package/ui-dist/assets/{vennDiagram-L72KCM5P-D5XH96zV.js → vennDiagram-L72KCM5P-1dSr5CoN.js} +1 -1
  259. package/ui-dist/assets/{wardleyDiagram-EHGQE667-BXX2RFsU.js → wardleyDiagram-EHGQE667-CAMneCxP.js} +1 -1
  260. package/ui-dist/assets/xterm-M5ke8gUF.js +9 -0
  261. package/ui-dist/assets/{xychartDiagram-FW5EYKEG-awBW2lwG.js → xychartDiagram-FW5EYKEG-DxVyl1x4.js} +1 -1
  262. package/ui-dist/index.html +2 -2
  263. package/ui-dist/assets/channel-M_3GhwHQ.js +0 -1
  264. package/ui-dist/assets/classDiagram-OUVF2IWQ-G44FJFnB.js +0 -1
  265. package/ui-dist/assets/classDiagram-v2-EOCWNBFH-G44FJFnB.js +0 -1
  266. package/ui-dist/assets/index-noipz8bE.css +0 -1
  267. package/ui-dist/assets/stateDiagram-v2-6OUMAXLB-B94IPtHC.js +0 -1
  268. package/ui-dist/assets/swimlanesDiagram-G3AALYLV-9WQr2_E9.js +0 -8
@@ -0,0 +1,204 @@
1
+ import { execFile } from "node:child_process";
2
+ import fs from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { promisify } from "node:util";
5
+ export const ASSIGNMENT_RUN_CONSECUTIVE_FAILURE_LIMIT = 3;
6
+ export const ASSIGNMENT_RUN_TOTAL_FAILURE_LIMIT = 25;
7
+ const execFileAsync = promisify(execFile);
8
+ export function resolveProjectWorkingSetCwd(resources) {
9
+ const workingSet = resources.find((entry) => entry.role === "working_set"
10
+ && entry.resource?.kind === "directory"
11
+ && entry.resource.sourceType === "external"
12
+ && typeof entry.resource.locator === "string"
13
+ && path.isAbsolute(entry.resource.locator));
14
+ return workingSet?.resource?.locator?.trim() || null;
15
+ }
16
+ function compactFailureText(value) {
17
+ return value
18
+ .replace(/\x1b\[[0-9;]*m/g, "")
19
+ .replace(/\b[0-9a-f]{8}-[0-9a-f-]{27,}\b/gi, "<uuid>")
20
+ .replace(/\b\d{4}-\d{2}-\d{2}T\S+\b/g, "<timestamp>")
21
+ .replace(/\/[^\s:'\"]+/g, "<path>")
22
+ .replace(/\b\d+\b/g, "<n>")
23
+ .replace(/\s+/g, " ")
24
+ .trim()
25
+ .toLowerCase();
26
+ }
27
+ function commandIdentity(entry, toolUseId) {
28
+ if (!entry)
29
+ return `tool-use:${toolUseId}`;
30
+ return compactFailureText(JSON.stringify(entry.input)).slice(0, 500);
31
+ }
32
+ export function fingerprintToolFailure(entry, call) {
33
+ return `${entry.toolName ?? call?.name ?? "unknown"}:${commandIdentity(call, entry.toolUseId)}:${compactFailureText(entry.content).slice(0, 500)}`;
34
+ }
35
+ function inferRecoveryCommand(entry) {
36
+ const content = entry.content.toLowerCase();
37
+ if (content.includes("node_modules") || content.includes("cannot find module") || content.includes("module not found")) {
38
+ return "pnpm install --frozen-lockfile";
39
+ }
40
+ if (content.includes("unexpected store") || content.includes("virtual store") || content.includes("store-dir")) {
41
+ return "pnpm install --force";
42
+ }
43
+ return null;
44
+ }
45
+ export function createAssignmentRunFailureBudget() {
46
+ let failureCount = 0;
47
+ let lastFingerprint = null;
48
+ let consecutiveFailureCount = 0;
49
+ let processedEntryCount = 0;
50
+ let checkpoint = null;
51
+ const callsById = new Map();
52
+ return {
53
+ observe(entries) {
54
+ if (checkpoint)
55
+ return checkpoint;
56
+ const nextEntries = entries.slice(processedEntryCount);
57
+ processedEntryCount = entries.length;
58
+ for (const entry of nextEntries) {
59
+ if (entry.kind === "tool_call" && entry.toolUseId) {
60
+ callsById.set(entry.toolUseId, entry);
61
+ continue;
62
+ }
63
+ if (entry.kind !== "tool_result")
64
+ continue;
65
+ if (!entry.isError) {
66
+ lastFingerprint = null;
67
+ consecutiveFailureCount = 0;
68
+ continue;
69
+ }
70
+ failureCount += 1;
71
+ const fingerprint = fingerprintToolFailure(entry, callsById.get(entry.toolUseId));
72
+ consecutiveFailureCount = fingerprint === lastFingerprint ? consecutiveFailureCount + 1 : 1;
73
+ lastFingerprint = fingerprint;
74
+ const reason = consecutiveFailureCount >= ASSIGNMENT_RUN_CONSECUTIVE_FAILURE_LIMIT
75
+ ? "repeated_failure"
76
+ : failureCount >= ASSIGNMENT_RUN_TOTAL_FAILURE_LIMIT
77
+ ? "total_failure_budget"
78
+ : null;
79
+ if (reason) {
80
+ checkpoint = {
81
+ reason,
82
+ failureCount,
83
+ consecutiveFailureCount,
84
+ fingerprint,
85
+ toolName: entry.toolName ?? "unknown",
86
+ unresolvedError: entry.content.slice(0, 2_000),
87
+ nextRecoveryCommand: inferRecoveryCommand(entry),
88
+ };
89
+ return checkpoint;
90
+ }
91
+ }
92
+ return null;
93
+ },
94
+ snapshot() {
95
+ return { failureCount, consecutiveFailureCount, checkpoint };
96
+ },
97
+ };
98
+ }
99
+ async function pathExists(candidate) {
100
+ return fs.access(candidate).then(() => true, () => false);
101
+ }
102
+ async function readText(candidate) {
103
+ return fs.readFile(candidate, "utf8").catch(() => "");
104
+ }
105
+ function parseJsonObject(contents) {
106
+ try {
107
+ const parsed = JSON.parse(contents);
108
+ return parsed && typeof parsed === "object" && !Array.isArray(parsed)
109
+ ? parsed
110
+ : {};
111
+ }
112
+ catch {
113
+ return {};
114
+ }
115
+ }
116
+ function yamlScalar(contents, key) {
117
+ const match = contents.match(new RegExp(`^${key}:\\s*(.+?)\\s*$`, "m"));
118
+ return match?.[1]?.replace(/^['"]|['"]$/g, "").trim() || null;
119
+ }
120
+ async function runPreflightCommand(command, args, cwd) {
121
+ return execFileAsync(command, args, {
122
+ cwd,
123
+ timeout: 10_000,
124
+ maxBuffer: 512 * 1024,
125
+ env: { ...process.env, CI: "1" },
126
+ }).then(({ stdout }) => ({ ok: true, output: stdout.trim().slice(0, 500) }), (error) => ({
127
+ ok: false,
128
+ output: error instanceof Error ? error.message.slice(0, 500) : String(error).slice(0, 500),
129
+ }));
130
+ }
131
+ export async function inspectAssignmentRunWorkspace(input) {
132
+ const packageJsonPath = path.join(input.actualCwd, "package.json");
133
+ const pnpmLockPath = path.join(input.actualCwd, "pnpm-lock.yaml");
134
+ const virtualStorePath = path.join(input.actualCwd, "node_modules", ".pnpm");
135
+ const modulesManifestPath = path.join(input.actualCwd, "node_modules", ".modules.yaml");
136
+ const [cwdPresent, projectWorkingSetPresent, packageJsonPresent, pnpmLockPresent, nodeModulesPresent, pnpmVirtualStorePresent] = await Promise.all([
137
+ fs.stat(input.actualCwd).then((stat) => stat.isDirectory(), () => false),
138
+ fs.stat(input.projectWorkingSetCwd).then((stat) => stat.isDirectory(), () => false),
139
+ pathExists(packageJsonPath),
140
+ pathExists(pnpmLockPath),
141
+ pathExists(path.join(input.actualCwd, "node_modules")),
142
+ pathExists(virtualStorePath),
143
+ ]);
144
+ const packageJson = packageJsonPresent ? parseJsonObject(await readText(packageJsonPath)) : {};
145
+ const expectedPackageManager = typeof packageJson.packageManager === "string" ? packageJson.packageManager : null;
146
+ const modulesManifest = nodeModulesPresent ? await readText(modulesManifestPath) : "";
147
+ const installedPackageManager = yamlScalar(modulesManifest, "packageManager");
148
+ const configuredStoreDir = yamlScalar(modulesManifest, "storeDir");
149
+ const configuredVirtualStoreDir = yamlScalar(modulesManifest, "virtualStoreDir");
150
+ const nodeCommand = packageJsonPresent ? await runPreflightCommand("node", ["--version"], input.actualCwd) : null;
151
+ const pnpmCommand = pnpmLockPresent ? await runPreflightCommand("pnpm", ["--version"], input.actualCwd) : null;
152
+ const dependencyGraph = pnpmLockPresent && nodeModulesPresent && pnpmVirtualStorePresent
153
+ ? await runPreflightCommand("pnpm", ["list", "--depth", "-1", "--offline", "--json"], input.actualCwd)
154
+ : null;
155
+ const packageManagerMatches = !expectedPackageManager
156
+ || !installedPackageManager
157
+ || expectedPackageManager === installedPackageManager;
158
+ const storeDirPresent = !configuredStoreDir || await pathExists(path.isAbsolute(configuredStoreDir) ? configuredStoreDir : path.join(input.actualCwd, configuredStoreDir));
159
+ const virtualStoreMatches = !configuredVirtualStoreDir || configuredVirtualStoreDir === ".pnpm";
160
+ const ready = cwdPresent
161
+ && projectWorkingSetPresent
162
+ && (!packageJsonPresent || Boolean(nodeCommand?.ok))
163
+ && (!pnpmLockPresent || Boolean(pnpmCommand?.ok))
164
+ && (!packageJsonPresent || nodeModulesPresent)
165
+ && (!pnpmLockPresent || pnpmVirtualStorePresent)
166
+ && packageManagerMatches
167
+ && storeDirPresent
168
+ && virtualStoreMatches
169
+ && (!dependencyGraph || dependencyGraph.ok);
170
+ const recoveryCommand = ready
171
+ ? null
172
+ : pnpmLockPresent
173
+ ? (packageManagerMatches && storeDirPresent && virtualStoreMatches
174
+ ? "pnpm install --frozen-lockfile"
175
+ : "pnpm install --force")
176
+ : packageJsonPresent
177
+ ? "npm install"
178
+ : null;
179
+ return {
180
+ actualCwd: input.actualCwd,
181
+ projectWorkingSetCwd: input.projectWorkingSetCwd,
182
+ cwdPresent,
183
+ projectWorkingSetPresent,
184
+ cwdMatchesProjectWorkingSet: path.resolve(input.actualCwd) === path.resolve(input.projectWorkingSetCwd),
185
+ packageManager: pnpmLockPresent ? "pnpm" : packageJsonPresent ? "unknown" : "none",
186
+ packageJsonPresent,
187
+ pnpmLockPresent,
188
+ nodeModulesPresent,
189
+ pnpmVirtualStorePresent,
190
+ expectedPackageManager,
191
+ installedPackageManager,
192
+ configuredStoreDir,
193
+ configuredVirtualStoreDir,
194
+ packageManagerMatches,
195
+ storeDirPresent,
196
+ virtualStoreMatches,
197
+ nodeCommandAvailable: nodeCommand?.ok ?? null,
198
+ pnpmCommandAvailable: pnpmCommand?.ok ?? null,
199
+ dependencyGraphAvailable: dependencyGraph?.ok ?? null,
200
+ ready,
201
+ recoveryCommand,
202
+ };
203
+ }
204
+ //# sourceMappingURL=assignment-run-guardrail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assignment-run-guardrail.js","sourceRoot":"","sources":["../../../src/services/runtime-kernel/assignment-run-guardrail.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=assignment-run-guardrail.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assignment-run-guardrail.test.d.ts","sourceRoot":"","sources":["../../../src/services/runtime-kernel/assignment-run-guardrail.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,114 @@
1
+ import fs from "node:fs/promises";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import { afterEach, describe, expect, it } from "vitest";
5
+ import { ASSIGNMENT_RUN_TOTAL_FAILURE_LIMIT, createAssignmentRunFailureBudget, fingerprintToolFailure, inspectAssignmentRunWorkspace, resolveProjectWorkingSetCwd, } from "./assignment-run-guardrail.js";
6
+ const tempDirs = [];
7
+ afterEach(async () => {
8
+ await Promise.all(tempDirs.splice(0).map((dir) => fs.rm(dir, { recursive: true, force: true })));
9
+ });
10
+ function failure(content, toolUseId = "tool-1", toolName = "exec_command") {
11
+ return {
12
+ kind: "tool_result",
13
+ ts: new Date().toISOString(),
14
+ toolUseId,
15
+ toolName,
16
+ content,
17
+ isError: true,
18
+ };
19
+ }
20
+ function call(command, toolUseId = "tool-1") {
21
+ return {
22
+ kind: "tool_call",
23
+ ts: new Date().toISOString(),
24
+ name: "exec_command",
25
+ toolUseId,
26
+ input: { cmd: command },
27
+ };
28
+ }
29
+ describe("assignment run guardrail", () => {
30
+ it("normalizes dynamic paths, timestamps, ids, and numbers in failure fingerprints", () => {
31
+ const first = failure("2026-08-13T01:02:03Z /tmp/run-123 failed with code 1");
32
+ const second = failure("2026-08-13T02:03:04Z /private/run-456 failed with code 2");
33
+ expect(fingerprintToolFailure(first, call("pnpm test", "tool-1"))).toBe(fingerprintToolFailure(second, call("pnpm test", "tool-2")));
34
+ });
35
+ it("checkpoints after the same failure fingerprint occurs three times", () => {
36
+ const budget = createAssignmentRunFailureBudget();
37
+ expect(budget.observe([call("pnpm test", "tool-1"), failure("Cannot find module /tmp/a", "tool-1")])).toBeNull();
38
+ expect(budget.observe([
39
+ call("pnpm test", "tool-1"),
40
+ failure("Cannot find module /tmp/a", "tool-1"),
41
+ call("pnpm test", "tool-2"),
42
+ failure("Cannot find module /tmp/b", "tool-2"),
43
+ ])).toBeNull();
44
+ expect(budget.observe([
45
+ call("pnpm test", "tool-1"),
46
+ failure("Cannot find module /tmp/a", "tool-1"),
47
+ call("pnpm test", "tool-2"),
48
+ failure("Cannot find module /tmp/b", "tool-2"),
49
+ call("pnpm test", "tool-3"),
50
+ failure("Cannot find module /tmp/c", "tool-3"),
51
+ ])).toMatchObject({
52
+ reason: "repeated_failure",
53
+ failureCount: 3,
54
+ consecutiveFailureCount: 3,
55
+ nextRecoveryCommand: "pnpm install --frozen-lockfile",
56
+ });
57
+ });
58
+ it("resets repeated failure streaks after a successful tool result", () => {
59
+ const budget = createAssignmentRunFailureBudget();
60
+ const entries = [
61
+ call("pnpm test", "tool-1"), failure("same error", "tool-1"),
62
+ call("pnpm test", "tool-ok"), { ...failure("ok", "tool-ok"), isError: false },
63
+ call("pnpm test", "tool-2"), failure("same error", "tool-2"),
64
+ call("pnpm test", "tool-3"), failure("same error", "tool-3"),
65
+ ];
66
+ expect(budget.observe(entries)).toBeNull();
67
+ expect(budget.snapshot()).toMatchObject({ consecutiveFailureCount: 2 });
68
+ });
69
+ it("does not combine identical errors from different commands", () => {
70
+ const budget = createAssignmentRunFailureBudget();
71
+ const entries = [
72
+ call("pnpm test", "tool-1"), failure("same error", "tool-1"),
73
+ call("pnpm typecheck", "tool-2"), failure("same error", "tool-2"),
74
+ call("pnpm test", "tool-3"), failure("same error", "tool-3"),
75
+ ];
76
+ expect(budget.observe(entries)).toBeNull();
77
+ expect(budget.snapshot()).toMatchObject({ consecutiveFailureCount: 1 });
78
+ });
79
+ it("checkpoints at the total failure budget when fingerprints vary", () => {
80
+ const budget = createAssignmentRunFailureBudget();
81
+ const entries = Array.from({ length: ASSIGNMENT_RUN_TOTAL_FAILURE_LIMIT }, (_, index) => [
82
+ call(`tool-${index}`, `tool-${index}`),
83
+ failure(`distinct failure marker-${String.fromCharCode(65 + index)} value`, `tool-${index}`, `tool-${index}`),
84
+ ]).flat();
85
+ expect(budget.observe(entries)).toMatchObject({
86
+ reason: "total_failure_budget",
87
+ failureCount: ASSIGNMENT_RUN_TOTAL_FAILURE_LIMIT,
88
+ });
89
+ });
90
+ it("reports workspace and package-manager readiness without mutating the repo", async () => {
91
+ const cwd = await fs.mkdtemp(path.join(os.tmpdir(), "assignment-preflight-"));
92
+ tempDirs.push(cwd);
93
+ await fs.writeFile(path.join(cwd, "package.json"), "{}", "utf8");
94
+ await fs.writeFile(path.join(cwd, "pnpm-lock.yaml"), "lockfileVersion: '9.0'", "utf8");
95
+ await expect(inspectAssignmentRunWorkspace({ actualCwd: cwd, projectWorkingSetCwd: cwd })).resolves.toMatchObject({
96
+ cwdMatchesProjectWorkingSet: true,
97
+ packageManager: "pnpm",
98
+ packageJsonPresent: true,
99
+ nodeModulesPresent: false,
100
+ recoveryCommand: "pnpm install --frozen-lockfile",
101
+ });
102
+ });
103
+ it("resolves only an external directory working set as the project repo root", () => {
104
+ expect(resolveProjectWorkingSetCwd([
105
+ { role: "reference", resource: { kind: "directory", sourceType: "external", locator: "/tmp/reference" } },
106
+ { role: "working_set", resource: { kind: "file", sourceType: "external", locator: "/tmp/readme.md" } },
107
+ { role: "working_set", resource: { kind: "directory", sourceType: "external", locator: "/tmp/repo" } },
108
+ ])).toBe("/tmp/repo");
109
+ expect(resolveProjectWorkingSetCwd([
110
+ { role: "working_set", resource: { kind: "directory", sourceType: "library", locator: "projects/rudder" } },
111
+ ])).toBeNull();
112
+ });
113
+ });
114
+ //# sourceMappingURL=assignment-run-guardrail.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assignment-run-guardrail.test.js","sourceRoot":"","sources":["../../../src/services/runtime-kernel/assignment-run-guardrail.test.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,12 @@
1
1
  import type { Db } from "@rudderhq/db";
2
+ import { heartbeatRuns } from "@rudderhq/db";
2
3
  import type { AgentSkillAnalytics, HeartbeatRun } from "@rudderhq/shared";
3
4
  import { type BudgetEnforcementScope } from "../budgets.js";
4
5
  export { prioritizeProjectWorkspaceCandidatesForRun, type ResolvedWorkspaceForRun } from "../agent-run-context.js";
6
+ import type { WakeupOptions } from "./heartbeat.core.js";
5
7
  export declare function heartbeatService(db: Db, testHooks?: {
6
8
  afterIssuePromotionCommitted?: (outcome: unknown) => Promise<void> | void;
9
+ beforeRunClaim?: (run: typeof heartbeatRuns.$inferSelect) => Promise<void> | void;
7
10
  beforeRunExecutionLeaseRenewal?: (input: {
8
11
  runId: string;
9
12
  ownerToken: string;
@@ -756,6 +759,15 @@ export declare function heartbeatService(db: Db, testHooks?: {
756
759
  retryOfRunId: string | null;
757
760
  processLossRetryCount: number;
758
761
  }[]>;
762
+ resumePendingWakeupRequests: (opts?: {
763
+ orgId?: string;
764
+ startImmediately?: boolean;
765
+ }) => Promise<{
766
+ checked: number;
767
+ resumed: number;
768
+ deferred: number;
769
+ terminalized: number;
770
+ }>;
759
771
  resumeQueuedRuns: () => Promise<void>;
760
772
  tickTimers: (now?: Date) => Promise<{
761
773
  checked: number;
@@ -1 +1 @@
1
- {"version":3,"file":"heartbeat.d.ts","sourceRoot":"","sources":["../../../src/services/runtime-kernel/heartbeat.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"heartbeat.d.ts","sourceRoot":"","sources":["../../../src/services/runtime-kernel/heartbeat.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"heartbeat.execute.d.ts","sourceRoot":"","sources":["../../../src/services/runtime-kernel/heartbeat.execute.ts"],"names":[],"mappings":"AAyDA,OAAO,EAAE,0CAA0C,EAAE,KAAK,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAsCnH,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,GAAG;wBA2CxB,MAAM,SAAS;QAAE,iBAAiB,CAAC,EAAE,OAAO,CAAA;KAAE;EAuvChF"}
1
+ {"version":3,"file":"heartbeat.execute.d.ts","sourceRoot":"","sources":["../../../src/services/runtime-kernel/heartbeat.execute.ts"],"names":[],"mappings":"AAiEA,OAAO,EAAE,0CAA0C,EAAE,KAAK,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAsCnH,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,GAAG;wBA2CxB,MAAM,SAAS;QAAE,iBAAiB,CAAC,EAAE,OAAO,CAAA;KAAE;EA83ChF"}
@@ -1,4 +1,4 @@
1
- import { heartbeatRuns, issues, projects } from "@rudderhq/db";
1
+ import { goals, heartbeatRuns, issues, projects } from "@rudderhq/db";
2
2
  import { resolveAgentRunScene, } from "@rudderhq/shared";
3
3
  import { and, eq, sql } from "drizzle-orm";
4
4
  import { createLocalAgentJwt } from "../../agent-auth-jwt.js";
@@ -11,7 +11,9 @@ import { buildExecutionWorkspaceAdapterConfig, issueExecutionWorkspaceModeForPer
11
11
  import { summarizeHeartbeatRunResultJson } from "../heartbeat-run-summary.js";
12
12
  import { publishLiveEvent } from "../live-events.js";
13
13
  import { isManagedWorkspaceConfigurationError, isWorkspacePermissionPreflightError, preflightManagedAgentWorkspace, } from "../managed-workspace-preflight.js";
14
+ import { listProjectResourceAttachments } from "../resource-catalog.js";
14
15
  import { buildWorkspaceReadyComment, cleanupExecutionWorkspaceArtifacts, ensureRuntimeServicesForRun, persistAdapterManagedRuntimeServices, realizeExecutionWorkspace, releaseRuntimeServicesForRun } from "../workspace-runtime.js";
16
+ import { createAssignmentRunFailureBudget, inspectAssignmentRunWorkspace, resolveProjectWorkingSetCwd, } from "./assignment-run-guardrail.js";
15
17
  import { executeAdapterWithModelFallbacks } from "./model-fallback.js";
16
18
  export { prioritizeProjectWorkspaceCandidatesForRun } from "../agent-run-context.js";
17
19
  import * as heartbeatCore from "./heartbeat.core.js";
@@ -196,6 +198,12 @@ export function createHeartbeatExecuteHandlers(context) {
196
198
  await ensureRuntimeState(agent);
197
199
  const context = parseObject(run.contextSnapshot);
198
200
  delete context.rudderGitIdentity;
201
+ const assignmentContinuationAttempt = Math.max(0, Math.floor(Number(context.assignmentGuardrailContinuationAttempt) || 0));
202
+ const assignmentGuardrailEnabled = run.invocationSource === "assignment"
203
+ || context.wakeSource === "assignment"
204
+ || assignmentContinuationAttempt > 0;
205
+ const assignmentFailureBudget = assignmentGuardrailEnabled ? createAssignmentRunFailureBudget() : null;
206
+ let assignmentGuardrailCheckpoint = null;
199
207
  const taskKey = deriveTaskKey(context, null);
200
208
  const sessionCodec = getAgentRuntimeSessionCodec(agent.agentRuntimeType);
201
209
  const issueId = readNonEmptyString(context.issueId);
@@ -218,9 +226,25 @@ export function createHeartbeatExecuteHandlers(context) {
218
226
  .where(and(eq(issues.id, issueId), eq(issues.orgId, agent.orgId)))
219
227
  .then((rows) => rows[0] ?? null)
220
228
  : null;
229
+ const goalId = readNonEmptyString(context.goalId);
230
+ const goalContext = goalId
231
+ ? await db
232
+ .select({
233
+ id: goals.id,
234
+ ownerAgentId: goals.ownerAgentId,
235
+ ownerAgentRuntimeOverrides: goals.ownerAgentRuntimeOverrides,
236
+ })
237
+ .from(goals)
238
+ .where(and(eq(goals.id, goalId), eq(goals.orgId, agent.orgId)))
239
+ .then((rows) => rows[0] ?? null)
240
+ : null;
221
241
  const issueAssigneeOverrides = issueContext && issueContext.assigneeAgentId === agent.id
222
242
  ? parseIssueAssigneeAgentRuntimeOverrides(issueContext.assigneeAgentRuntimeOverrides)
223
243
  : null;
244
+ const goalOwnerOverrides = goalContext && goalContext.ownerAgentId === agent.id
245
+ ? parseIssueAssigneeAgentRuntimeOverrides(goalContext.ownerAgentRuntimeOverrides)
246
+ : null;
247
+ const runtimeOverrides = issueContext ? issueAssigneeOverrides : goalOwnerOverrides;
224
248
  const issueExecutionWorkspaceSettings = parseIssueExecutionWorkspaceSettings(issueContext?.executionWorkspaceSettings);
225
249
  const contextProjectId = readNonEmptyString(context.projectId);
226
250
  const executionProjectId = issueContext?.projectId ?? contextProjectId;
@@ -272,18 +296,38 @@ export function createHeartbeatExecuteHandlers(context) {
272
296
  const executionWorkspaceMode = resolveExecutionWorkspaceMode({
273
297
  projectPolicy: projectExecutionWorkspacePolicy,
274
298
  issueSettings: issueExecutionWorkspaceSettings,
275
- legacyUseProjectWorkspace: issueAssigneeOverrides?.useProjectWorkspace ?? null,
299
+ legacyUseProjectWorkspace: runtimeOverrides?.useProjectWorkspace ?? null,
276
300
  });
277
- const resolvedWorkspace = await runContextSvc.resolveWorkspaceForRun(agent, context, previousSessionParams, { useProjectWorkspace: executionWorkspaceMode !== "agent_default" });
301
+ let resolvedWorkspace = await runContextSvc.resolveWorkspaceForRun(agent, context, previousSessionParams, { useProjectWorkspace: executionWorkspaceMode !== "agent_default" });
302
+ let configuredProjectWorkingSetCwd = null;
303
+ if (assignmentGuardrailEnabled && executionProjectId) {
304
+ const projectResources = await listProjectResourceAttachments(db, agent.orgId, executionProjectId);
305
+ const projectWorkingSetCwd = resolveProjectWorkingSetCwd(projectResources);
306
+ configuredProjectWorkingSetCwd = projectWorkingSetCwd;
307
+ if (projectWorkingSetCwd) {
308
+ const workingSetAvailable = await inspectAssignmentRunWorkspace({
309
+ actualCwd: projectWorkingSetCwd,
310
+ projectWorkingSetCwd,
311
+ }).then((result) => result.cwdPresent);
312
+ if (workingSetAvailable) {
313
+ resolvedWorkspace = {
314
+ ...resolvedWorkspace,
315
+ cwd: projectWorkingSetCwd,
316
+ source: "project_primary",
317
+ projectId: executionProjectId,
318
+ };
319
+ }
320
+ }
321
+ }
278
322
  const workspaceManagedConfig = buildExecutionWorkspaceAdapterConfig({
279
323
  agentConfig: config,
280
324
  projectPolicy: projectExecutionWorkspacePolicy,
281
325
  issueSettings: issueExecutionWorkspaceSettings,
282
326
  mode: executionWorkspaceMode,
283
- legacyUseProjectWorkspace: issueAssigneeOverrides?.useProjectWorkspace ?? null,
327
+ legacyUseProjectWorkspace: runtimeOverrides?.useProjectWorkspace ?? null,
284
328
  });
285
- const mergedConfig = issueAssigneeOverrides?.agentRuntimeConfig
286
- ? { ...workspaceManagedConfig, ...issueAssigneeOverrides.agentRuntimeConfig }
329
+ const mergedConfig = runtimeOverrides?.agentRuntimeConfig
330
+ ? { ...workspaceManagedConfig, ...runtimeOverrides.agentRuntimeConfig }
287
331
  : workspaceManagedConfig;
288
332
  const { resolvedConfig, runtimeConfig, runtimeSkillEntries, secretKeys } = await runContextSvc.prepareRuntimeConfig({
289
333
  scene: "heartbeat",
@@ -600,6 +644,26 @@ export function createHeartbeatExecuteHandlers(context) {
600
644
  level: "info",
601
645
  message: "run started",
602
646
  });
647
+ if (assignmentGuardrailEnabled) {
648
+ const workspacePreflight = await inspectAssignmentRunWorkspace({
649
+ actualCwd: executionWorkspace.cwd,
650
+ projectWorkingSetCwd: configuredProjectWorkingSetCwd ?? resolvedWorkspace.cwd,
651
+ });
652
+ await appendRunEvent(currentRun, {
653
+ eventType: "runtime.assignment_preflight",
654
+ 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,
660
+ });
661
+ 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.`);
665
+ }
666
+ }
603
667
  handle = await runLogStore.begin({
604
668
  orgId: run.orgId,
605
669
  agentId: run.agentId,
@@ -661,6 +725,28 @@ export function createHeartbeatExecuteHandlers(context) {
661
725
  parser: stdoutTranscriptParser,
662
726
  kind: "stdout",
663
727
  });
728
+ const checkpoint = assignmentFailureBudget?.observe(executionTranscript) ?? null;
729
+ if (checkpoint && !assignmentGuardrailCheckpoint) {
730
+ const completedWorkSummary = [...executionTranscript]
731
+ .reverse()
732
+ .find((entry) => entry.kind === "assistant" && entry.text.trim())?.text
733
+ .trim()
734
+ .slice(0, 2_000)
735
+ ?? "No reliable completed-work summary was emitted before the guardrail stopped this run.";
736
+ assignmentGuardrailCheckpoint = { ...checkpoint, completedWorkSummary };
737
+ const continuationRequired = assignmentContinuationAttempt < 1;
738
+ await appendRunEvent(currentRun, {
739
+ eventType: "runtime.assignment_guardrail",
740
+ stream: "system",
741
+ level: "warn",
742
+ message: "assignment run failure budget reached; checkpoint requested",
743
+ payload: {
744
+ ...assignmentGuardrailCheckpoint,
745
+ continuationRequired,
746
+ },
747
+ });
748
+ executionAbortController.abort("assignment_run_failure_budget");
749
+ }
664
750
  return;
665
751
  }
666
752
  stderrTranscriptBuffer = appendTranscriptEntriesFromChunk({
@@ -783,7 +869,10 @@ export function createHeartbeatExecuteHandlers(context) {
783
869
  runId: run.id,
784
870
  agent,
785
871
  runtime: runtimeForAdapter,
786
- config: runtimeConfig,
872
+ config: {
873
+ ...runtimeConfig,
874
+ cwd: executionWorkspace.cwd,
875
+ },
787
876
  context,
788
877
  onLog,
789
878
  onMeta: onAdapterMeta,
@@ -801,6 +890,15 @@ export function createHeartbeatExecuteHandlers(context) {
801
890
  stdoutTranscriptParser = attemptAdapter.parseStdoutLine ?? null;
802
891
  },
803
892
  });
893
+ if (assignmentGuardrailCheckpoint) {
894
+ adapterResult.errorMessage = "Assignment run stopped after reaching its tool failure budget";
895
+ adapterResult.errorCode = "assignment_run_failure_budget";
896
+ adapterResult.exitCode = adapterResult.exitCode ?? 1;
897
+ adapterResult.resultJson = {
898
+ ...(adapterResult.resultJson ?? {}),
899
+ assignmentGuardrailCheckpoint,
900
+ };
901
+ }
804
902
  const adapterManagedRuntimeServices = adapterResult.runtimeServices
805
903
  ? await persistAdapterManagedRuntimeServices({
806
904
  db,
@@ -1065,6 +1163,39 @@ export function createHeartbeatExecuteHandlers(context) {
1065
1163
  if (ownsTerminalState || finalizedRun.terminalEffectsPending) {
1066
1164
  shouldCompleteTerminalEffects = true;
1067
1165
  }
1166
+ if (ownsTerminalState && assignmentGuardrailCheckpoint) {
1167
+ const continuationRequired = assignmentContinuationAttempt < 1;
1168
+ await appendRunEvent(finalizedRun, {
1169
+ eventType: "runtime.assignment_checkpoint",
1170
+ stream: "system",
1171
+ level: "warn",
1172
+ message: "assignment run checkpoint created",
1173
+ payload: {
1174
+ completed: assignmentGuardrailCheckpoint.completedWorkSummary,
1175
+ unresolvedError: assignmentGuardrailCheckpoint.unresolvedError,
1176
+ nextRecoveryCommand: assignmentGuardrailCheckpoint.nextRecoveryCommand,
1177
+ continuationRequired,
1178
+ failureCount: assignmentGuardrailCheckpoint.failureCount,
1179
+ fingerprint: assignmentGuardrailCheckpoint.fingerprint,
1180
+ },
1181
+ });
1182
+ if (continuationRequired) {
1183
+ await enqueueRecoveryRun(finalizedRun, agent, {
1184
+ recoveryTrigger: "automatic",
1185
+ source: "automation",
1186
+ triggerDetail: "system",
1187
+ wakeReason: "assignment_failure_budget_continuation",
1188
+ requestedByActorType: "system",
1189
+ requestedByActorId: null,
1190
+ contextPatch: {
1191
+ assignmentGuardrailContinuationAttempt: assignmentContinuationAttempt + 1,
1192
+ assignmentGuardrailCheckpoint,
1193
+ },
1194
+ startImmediately: false,
1195
+ now: new Date(),
1196
+ });
1197
+ }
1198
+ }
1068
1199
  }
1069
1200
  }
1070
1201
  catch (err) {