@rudderhq/server 0.7.2-canary.0 → 0.7.3

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 (570) hide show
  1. package/dist/agent-runtimes/codex-models.d.ts +11 -0
  2. package/dist/agent-runtimes/codex-models.d.ts.map +1 -1
  3. package/dist/agent-runtimes/codex-models.js +155 -2
  4. package/dist/agent-runtimes/codex-models.js.map +1 -1
  5. package/dist/agent-runtimes/cursor-models.d.ts.map +1 -1
  6. package/dist/agent-runtimes/cursor-models.js +31 -9
  7. package/dist/agent-runtimes/cursor-models.js.map +1 -1
  8. package/dist/agent-runtimes/index.d.ts +1 -1
  9. package/dist/agent-runtimes/index.d.ts.map +1 -1
  10. package/dist/agent-runtimes/index.js +1 -1
  11. package/dist/agent-runtimes/index.js.map +1 -1
  12. package/dist/agent-runtimes/registry.d.ts +11 -4
  13. package/dist/agent-runtimes/registry.d.ts.map +1 -1
  14. package/dist/agent-runtimes/registry.js +52 -3
  15. package/dist/agent-runtimes/registry.js.map +1 -1
  16. package/dist/app.d.ts.map +1 -1
  17. package/dist/app.js +1 -5
  18. package/dist/app.js.map +1 -1
  19. package/dist/bootstrap/create-http-app.d.ts +1 -2
  20. package/dist/bootstrap/create-http-app.d.ts.map +1 -1
  21. package/dist/bootstrap/create-http-app.js +13 -12
  22. package/dist/bootstrap/create-http-app.js.map +1 -1
  23. package/dist/bootstrap/register-api-routes.d.ts +1 -2
  24. package/dist/bootstrap/register-api-routes.d.ts.map +1 -1
  25. package/dist/bootstrap/register-api-routes.js +20 -4
  26. package/dist/bootstrap/register-api-routes.js.map +1 -1
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +86 -30
  29. package/dist/index.js.map +1 -1
  30. package/dist/middleware/logger.js +2 -2
  31. package/dist/middleware/logger.js.map +1 -1
  32. package/dist/middleware/logger.test.js +26 -10
  33. package/dist/middleware/logger.test.js.map +1 -1
  34. package/dist/redaction.d.ts +1 -0
  35. package/dist/redaction.d.ts.map +1 -1
  36. package/dist/redaction.js +13 -0
  37. package/dist/redaction.js.map +1 -1
  38. package/dist/routes/access.helpers.d.ts +1 -1
  39. package/dist/routes/agent-issue-creation.d.ts +25 -0
  40. package/dist/routes/agent-issue-creation.d.ts.map +1 -0
  41. package/dist/routes/agent-issue-creation.js +201 -0
  42. package/dist/routes/agent-issue-creation.js.map +1 -0
  43. package/dist/routes/agents.d.ts.map +1 -1
  44. package/dist/routes/agents.js +20 -6
  45. package/dist/routes/agents.js.map +1 -1
  46. package/dist/routes/agents.management-routes.d.ts.map +1 -1
  47. package/dist/routes/agents.management-routes.js +13 -10
  48. package/dist/routes/agents.management-routes.js.map +1 -1
  49. package/dist/routes/app-builder.d.ts +3 -1
  50. package/dist/routes/app-builder.d.ts.map +1 -1
  51. package/dist/routes/app-builder.js +31 -11
  52. package/dist/routes/app-builder.js.map +1 -1
  53. package/dist/routes/approvals.d.ts.map +1 -1
  54. package/dist/routes/approvals.js +77 -1
  55. package/dist/routes/approvals.js.map +1 -1
  56. package/dist/routes/chats.d.ts.map +1 -1
  57. package/dist/routes/chats.js +1 -0
  58. package/dist/routes/chats.js.map +1 -1
  59. package/dist/routes/chats.stream-routes.d.ts.map +1 -1
  60. package/dist/routes/chats.stream-routes.js +4 -0
  61. package/dist/routes/chats.stream-routes.js.map +1 -1
  62. package/dist/routes/computer.d.ts +30 -0
  63. package/dist/routes/computer.d.ts.map +1 -0
  64. package/dist/routes/computer.js +231 -0
  65. package/dist/routes/computer.js.map +1 -0
  66. package/dist/routes/goals.d.ts.map +1 -1
  67. package/dist/routes/goals.js +349 -23
  68. package/dist/routes/goals.js.map +1 -1
  69. package/dist/routes/health.d.ts.map +1 -1
  70. package/dist/routes/health.js +3 -0
  71. package/dist/routes/health.js.map +1 -1
  72. package/dist/routes/instance-settings.d.ts.map +1 -1
  73. package/dist/routes/instance-settings.js +3 -0
  74. package/dist/routes/instance-settings.js.map +1 -1
  75. package/dist/routes/issues.comments-attachments.d.ts.map +1 -1
  76. package/dist/routes/issues.comments-attachments.js +90 -8
  77. package/dist/routes/issues.comments-attachments.js.map +1 -1
  78. package/dist/routes/issues.d.ts.map +1 -1
  79. package/dist/routes/issues.js +12 -1
  80. package/dist/routes/issues.js.map +1 -1
  81. package/dist/routes/issues.mutations.d.ts.map +1 -1
  82. package/dist/routes/issues.mutations.js +85 -33
  83. package/dist/routes/issues.mutations.js.map +1 -1
  84. package/dist/routes/managed-mcp-connections.d.ts.map +1 -1
  85. package/dist/routes/managed-mcp-connections.js +46 -7
  86. package/dist/routes/managed-mcp-connections.js.map +1 -1
  87. package/dist/routes/managed-mcp-runtime.d.ts.map +1 -1
  88. package/dist/routes/managed-mcp-runtime.js +109 -7
  89. package/dist/routes/managed-mcp-runtime.js.map +1 -1
  90. package/dist/routes/product-analytics-collector-report.d.ts +29 -0
  91. package/dist/routes/product-analytics-collector-report.d.ts.map +1 -1
  92. package/dist/routes/product-analytics-collector-report.js +57 -1
  93. package/dist/routes/product-analytics-collector-report.js.map +1 -1
  94. package/dist/routes/product-analytics-collector-report.test.d.ts +2 -0
  95. package/dist/routes/product-analytics-collector-report.test.d.ts.map +1 -0
  96. package/dist/routes/product-analytics-collector-report.test.js +50 -0
  97. package/dist/routes/product-analytics-collector-report.test.js.map +1 -0
  98. package/dist/routes/rudder-plugins.d.ts +4 -0
  99. package/dist/routes/rudder-plugins.d.ts.map +1 -0
  100. package/dist/routes/rudder-plugins.js +213 -0
  101. package/dist/routes/rudder-plugins.js.map +1 -0
  102. package/dist/services/activity-log.d.ts +0 -3
  103. package/dist/services/activity-log.d.ts.map +1 -1
  104. package/dist/services/activity-log.js +0 -33
  105. package/dist/services/activity-log.js.map +1 -1
  106. package/dist/services/activity.d.ts +3 -3
  107. package/dist/services/agent-issue-creation.d.ts +344 -0
  108. package/dist/services/agent-issue-creation.d.ts.map +1 -0
  109. package/dist/services/agent-issue-creation.js +675 -0
  110. package/dist/services/agent-issue-creation.js.map +1 -0
  111. package/dist/services/agent-run-context.d.ts.map +1 -1
  112. package/dist/services/agent-run-context.js +13 -2
  113. package/dist/services/agent-run-context.js.map +1 -1
  114. package/dist/services/app-builder.d.ts.map +1 -1
  115. package/dist/services/app-builder.js +24 -3
  116. package/dist/services/app-builder.js.map +1 -1
  117. package/dist/services/automation-chat-output.d.ts +1 -1
  118. package/dist/services/automation-chat-output.d.ts.map +1 -1
  119. package/dist/services/automation-chat-output.js +24 -14
  120. package/dist/services/automation-chat-output.js.map +1 -1
  121. package/dist/services/chat-annotation-copy-lineage.d.ts +1 -1
  122. package/dist/services/chat-assistant.d.ts.map +1 -1
  123. package/dist/services/chat-assistant.helpers.d.ts +4 -4
  124. package/dist/services/chat-assistant.helpers.d.ts.map +1 -1
  125. package/dist/services/chat-assistant.helpers.js.map +1 -1
  126. package/dist/services/chat-assistant.js +45 -13
  127. package/dist/services/chat-assistant.js.map +1 -1
  128. package/dist/services/chat-assistant.runtime-overrides.d.ts +2 -1
  129. package/dist/services/chat-assistant.runtime-overrides.d.ts.map +1 -1
  130. package/dist/services/chat-assistant.runtime-overrides.js +47 -18
  131. package/dist/services/chat-assistant.runtime-overrides.js.map +1 -1
  132. package/dist/services/chat-assistant.runtime-overrides.test.d.ts +2 -0
  133. package/dist/services/chat-assistant.runtime-overrides.test.d.ts.map +1 -0
  134. package/dist/services/chat-assistant.runtime-overrides.test.js +37 -0
  135. package/dist/services/chat-assistant.runtime-overrides.test.js.map +1 -0
  136. package/dist/services/chat-generation-protocol.d.ts.map +1 -1
  137. package/dist/services/chat-generation-protocol.js +1 -12
  138. package/dist/services/chat-generation-protocol.js.map +1 -1
  139. package/dist/services/chat-generation-protocol.test.js +16 -25
  140. package/dist/services/chat-generation-protocol.test.js.map +1 -1
  141. package/dist/services/chat-generation-provenance.d.ts.map +1 -1
  142. package/dist/services/chat-generation-provenance.js +4 -2
  143. package/dist/services/chat-generation-provenance.js.map +1 -1
  144. package/dist/services/chat-queued-message-materialization.d.ts.map +1 -1
  145. package/dist/services/chat-queued-message-materialization.js +12 -2
  146. package/dist/services/chat-queued-message-materialization.js.map +1 -1
  147. package/dist/services/chat-transcript-persistence.d.ts +49 -0
  148. package/dist/services/chat-transcript-persistence.d.ts.map +1 -0
  149. package/dist/services/chat-transcript-persistence.js +238 -0
  150. package/dist/services/chat-transcript-persistence.js.map +1 -0
  151. package/dist/services/chat-transcript-persistence.test.d.ts +2 -0
  152. package/dist/services/chat-transcript-persistence.test.d.ts.map +1 -0
  153. package/dist/services/chat-transcript-persistence.test.js +23 -0
  154. package/dist/services/chat-transcript-persistence.test.js.map +1 -0
  155. package/dist/services/chat-work-manifest.d.ts.map +1 -1
  156. package/dist/services/chat-work-manifest.js +36 -10
  157. package/dist/services/chat-work-manifest.js.map +1 -1
  158. package/dist/services/chats.annotation-persistence.d.ts.map +1 -1
  159. package/dist/services/chats.annotation-persistence.js +25 -6
  160. package/dist/services/chats.annotation-persistence.js.map +1 -1
  161. package/dist/services/chats.create.d.ts.map +1 -1
  162. package/dist/services/chats.create.js +49 -4
  163. package/dist/services/chats.create.js.map +1 -1
  164. package/dist/services/chats.d.ts +10 -10
  165. package/dist/services/chats.d.ts.map +1 -1
  166. package/dist/services/chats.inline-visual-persistence.d.ts +2 -1
  167. package/dist/services/chats.inline-visual-persistence.d.ts.map +1 -1
  168. package/dist/services/chats.inline-visual-persistence.js +19 -2
  169. package/dist/services/chats.inline-visual-persistence.js.map +1 -1
  170. package/dist/services/chats.js +177 -95
  171. package/dist/services/chats.js.map +1 -1
  172. package/dist/services/computer-broker.d.ts +35 -0
  173. package/dist/services/computer-broker.d.ts.map +1 -0
  174. package/dist/services/computer-broker.js +211 -0
  175. package/dist/services/computer-broker.js.map +1 -0
  176. package/dist/services/computer-broker.test.d.ts +2 -0
  177. package/dist/services/computer-broker.test.d.ts.map +1 -0
  178. package/dist/services/computer-broker.test.js +70 -0
  179. package/dist/services/computer-broker.test.js.map +1 -0
  180. package/dist/services/computer-capability.d.ts +13 -0
  181. package/dist/services/computer-capability.d.ts.map +1 -0
  182. package/dist/services/computer-capability.js +11 -0
  183. package/dist/services/computer-capability.js.map +1 -0
  184. package/dist/services/computer-capability.test.d.ts +2 -0
  185. package/dist/services/computer-capability.test.d.ts.map +1 -0
  186. package/dist/services/computer-capability.test.js +27 -0
  187. package/dist/services/computer-capability.test.js.map +1 -0
  188. package/dist/services/finance.d.ts +2 -2
  189. package/dist/services/goals.d.ts +2041 -126
  190. package/dist/services/goals.d.ts.map +1 -1
  191. package/dist/services/goals.js +1533 -176
  192. package/dist/services/goals.js.map +1 -1
  193. package/dist/services/index.d.ts +2 -0
  194. package/dist/services/index.d.ts.map +1 -1
  195. package/dist/services/index.js +2 -0
  196. package/dist/services/index.js.map +1 -1
  197. package/dist/services/instance-settings.d.ts.map +1 -1
  198. package/dist/services/instance-settings.js +17 -2
  199. package/dist/services/instance-settings.js.map +1 -1
  200. package/dist/services/integrations/agent-integrations.d.ts +1 -1
  201. package/dist/services/issues.d.ts +86 -1
  202. package/dist/services/issues.d.ts.map +1 -1
  203. package/dist/services/issues.helpers.d.ts +4 -0
  204. package/dist/services/issues.helpers.d.ts.map +1 -1
  205. package/dist/services/issues.helpers.js +28 -6
  206. package/dist/services/issues.helpers.js.map +1 -1
  207. package/dist/services/issues.js +208 -109
  208. package/dist/services/issues.js.map +1 -1
  209. package/dist/services/knowledge-portability/organization-portability.files.d.ts +1 -1
  210. package/dist/services/knowledge-portability/organization-skills.catalog.d.ts +7 -1
  211. package/dist/services/knowledge-portability/organization-skills.catalog.d.ts.map +1 -1
  212. package/dist/services/knowledge-portability/organization-skills.catalog.js +10 -0
  213. package/dist/services/knowledge-portability/organization-skills.catalog.js.map +1 -1
  214. package/dist/services/knowledge-portability/organization-skills.d.ts +1 -0
  215. package/dist/services/knowledge-portability/organization-skills.d.ts.map +1 -1
  216. package/dist/services/knowledge-portability/organization-skills.js +36 -3
  217. package/dist/services/knowledge-portability/organization-skills.js.map +1 -1
  218. package/dist/services/mcp/managed-bindings.d.ts +3 -1
  219. package/dist/services/mcp/managed-bindings.d.ts.map +1 -1
  220. package/dist/services/mcp/managed-bindings.js +31 -7
  221. package/dist/services/mcp/managed-bindings.js.map +1 -1
  222. package/dist/services/mcp/managed-client.d.ts +15 -0
  223. package/dist/services/mcp/managed-client.d.ts.map +1 -1
  224. package/dist/services/mcp/managed-client.js +23 -1
  225. package/dist/services/mcp/managed-client.js.map +1 -1
  226. package/dist/services/mcp/managed-client.test.js +73 -9
  227. package/dist/services/mcp/managed-client.test.js.map +1 -1
  228. package/dist/services/mcp/managed-connections.d.ts +19 -1
  229. package/dist/services/mcp/managed-connections.d.ts.map +1 -1
  230. package/dist/services/mcp/managed-connections.js +211 -37
  231. package/dist/services/mcp/managed-connections.js.map +1 -1
  232. package/dist/services/mcp/managed-runtime.js +1 -1
  233. package/dist/services/mcp/managed-runtime.js.map +1 -1
  234. package/dist/services/mcp/oauth.d.ts.map +1 -1
  235. package/dist/services/mcp/oauth.js +3 -0
  236. package/dist/services/mcp/oauth.js.map +1 -1
  237. package/dist/services/mcp/provider-registry.d.ts +24 -1
  238. package/dist/services/mcp/provider-registry.d.ts.map +1 -1
  239. package/dist/services/mcp/provider-registry.js +26 -0
  240. package/dist/services/mcp/provider-registry.js.map +1 -1
  241. package/dist/services/mcp/provider-registry.test.js +26 -0
  242. package/dist/services/mcp/provider-registry.test.js.map +1 -1
  243. package/dist/services/messenger-saved-views.d.ts.map +1 -1
  244. package/dist/services/messenger-saved-views.js +1 -0
  245. package/dist/services/messenger-saved-views.js.map +1 -1
  246. package/dist/services/messenger.d.ts +2 -2
  247. package/dist/services/messenger.d.ts.map +1 -1
  248. package/dist/services/messenger.js +142 -51
  249. package/dist/services/messenger.js.map +1 -1
  250. package/dist/services/product-analytics.d.ts +21 -5
  251. package/dist/services/product-analytics.d.ts.map +1 -1
  252. package/dist/services/product-analytics.js +47 -0
  253. package/dist/services/product-analytics.js.map +1 -1
  254. package/dist/services/product-analytics.test.js +63 -1
  255. package/dist/services/product-analytics.test.js.map +1 -1
  256. package/dist/services/rudder-plugins.d.ts +107 -0
  257. package/dist/services/rudder-plugins.d.ts.map +1 -0
  258. package/dist/services/rudder-plugins.js +1746 -0
  259. package/dist/services/rudder-plugins.js.map +1 -0
  260. package/dist/services/rudder-plugins.test.d.ts +2 -0
  261. package/dist/services/rudder-plugins.test.d.ts.map +1 -0
  262. package/dist/services/rudder-plugins.test.js +191 -0
  263. package/dist/services/rudder-plugins.test.js.map +1 -0
  264. package/dist/services/run-events.d.ts +1 -1
  265. package/dist/services/runtime-kernel/heartbeat.core.d.ts +1 -0
  266. package/dist/services/runtime-kernel/heartbeat.core.d.ts.map +1 -1
  267. package/dist/services/runtime-kernel/heartbeat.core.js +1 -1
  268. package/dist/services/runtime-kernel/heartbeat.core.js.map +1 -1
  269. package/dist/services/runtime-kernel/heartbeat.d.ts +57 -0
  270. package/dist/services/runtime-kernel/heartbeat.d.ts.map +1 -1
  271. package/dist/services/runtime-kernel/heartbeat.execute.d.ts.map +1 -1
  272. package/dist/services/runtime-kernel/heartbeat.execute.js +51 -3
  273. package/dist/services/runtime-kernel/heartbeat.execute.js.map +1 -1
  274. package/dist/services/runtime-kernel/heartbeat.js +400 -102
  275. package/dist/services/runtime-kernel/heartbeat.js.map +1 -1
  276. package/dist/services/runtime-kernel/heartbeat.recovery.d.ts.map +1 -1
  277. package/dist/services/runtime-kernel/heartbeat.recovery.js +23 -2
  278. package/dist/services/runtime-kernel/heartbeat.recovery.js.map +1 -1
  279. package/dist/services/runtime-kernel/heartbeat.terminal.d.ts +17 -2
  280. package/dist/services/runtime-kernel/heartbeat.terminal.d.ts.map +1 -1
  281. package/dist/services/runtime-kernel/heartbeat.terminal.js +33 -1
  282. package/dist/services/runtime-kernel/heartbeat.terminal.js.map +1 -1
  283. package/dist/services/runtime-kernel/heartbeat.wakeup.d.ts.map +1 -1
  284. package/dist/services/runtime-kernel/heartbeat.wakeup.js +35 -3
  285. package/dist/services/runtime-kernel/heartbeat.wakeup.js.map +1 -1
  286. package/dist/services/side-chats.d.ts.map +1 -1
  287. package/dist/services/side-chats.js +12 -0
  288. package/dist/services/side-chats.js.map +1 -1
  289. package/dist/services/workspace-runtime.services.d.ts +1 -1
  290. package/package.json +19 -17
  291. package/resources/bundled-skills/app-builder/SKILL.md +39 -9
  292. package/resources/bundled-skills/app-builder/assets/scaffold/app/globals.css +109 -16
  293. package/resources/bundled-skills/app-builder/assets/scaffold/components/contacts-workspace.tsx +176 -152
  294. package/resources/bundled-skills/app-builder/assets/scaffold/components/ui/alert.tsx +12 -0
  295. package/resources/bundled-skills/app-builder/assets/scaffold/components/ui/badge.tsx +27 -0
  296. package/resources/bundled-skills/app-builder/assets/scaffold/components/ui/button.tsx +9 -7
  297. package/resources/bundled-skills/app-builder/assets/scaffold/components/ui/card.tsx +15 -3
  298. package/resources/bundled-skills/app-builder/assets/scaffold/components/ui/empty.tsx +18 -0
  299. package/resources/bundled-skills/app-builder/assets/scaffold/components/ui/field.tsx +23 -0
  300. package/resources/bundled-skills/app-builder/assets/scaffold/components/ui/input.tsx +1 -1
  301. package/resources/bundled-skills/app-builder/assets/scaffold/components/ui/label.tsx +1 -1
  302. package/resources/bundled-skills/app-builder/assets/scaffold/components/ui/separator.tsx +6 -0
  303. package/resources/bundled-skills/app-builder/assets/scaffold/components/ui/skeleton.tsx +6 -0
  304. package/resources/bundled-skills/app-builder/assets/scaffold/components/ui/table.tsx +30 -0
  305. package/resources/bundled-skills/app-builder/assets/scaffold/components.json +20 -0
  306. package/resources/bundled-skills/app-builder/assets/scaffold/next-env.d.ts +1 -1
  307. package/resources/bundled-skills/app-builder/assets/scaffold/next.config.ts +19 -0
  308. package/resources/bundled-skills/app-builder/assets/scaffold/package.json +2 -1
  309. package/resources/bundled-skills/app-builder/assets/scaffold/rudder.app.json +1 -1
  310. package/resources/bundled-skills/app-builder/assets/scaffold/rudder.ui.json +13 -0
  311. package/resources/bundled-skills/app-builder/assets/scaffold/scripts/validate-rudder-ui.mjs +50 -0
  312. package/resources/bundled-skills/app-builder/assets/scaffold/tests/e2e/app.spec.ts +35 -1
  313. package/resources/bundled-skills/app-builder/evals/evals.json +2 -1
  314. package/resources/bundled-skills/app-builder/references/design-guidelines.md +19 -2
  315. package/resources/bundled-skills/app-builder/references/rudder-ui-preset.md +73 -0
  316. package/resources/bundled-skills/app-builder/references/scaffold-contract.md +12 -0
  317. package/resources/bundled-skills/app-builder/references/verification.md +6 -0
  318. package/resources/bundled-skills/app-builder/scripts/report-build-status.mjs +83 -0
  319. package/resources/bundled-skills/browser/SKILL.md +11 -4
  320. package/resources/bundled-skills/browser/agents/openai.yaml +2 -2
  321. package/resources/bundled-skills/browser/evals/trigger-evals.json +22 -0
  322. package/resources/bundled-skills/rudder-docs/SKILL.md +2 -2
  323. package/resources/bundled-skills/rudder-docs/evals/retrieval-authority-evals.json +40 -0
  324. package/resources/bundled-skills/rudder-docs/evals/trigger-evals.json +2 -2
  325. package/resources/bundled-skills/rudder-docs/references/api-reference.md +0 -2
  326. package/resources/bundled-skills/rudder-docs/references/plugin-authoring.md +38 -114
  327. package/resources/bundled-skills/rudder-docs/references/source-map.md +2 -0
  328. package/skills/app-builder/SKILL.md +39 -9
  329. package/skills/app-builder/assets/scaffold/app/globals.css +109 -16
  330. package/skills/app-builder/assets/scaffold/components/contacts-workspace.tsx +176 -152
  331. package/skills/app-builder/assets/scaffold/components/ui/alert.tsx +12 -0
  332. package/skills/app-builder/assets/scaffold/components/ui/badge.tsx +27 -0
  333. package/skills/app-builder/assets/scaffold/components/ui/button.tsx +9 -7
  334. package/skills/app-builder/assets/scaffold/components/ui/card.tsx +15 -3
  335. package/skills/app-builder/assets/scaffold/components/ui/empty.tsx +18 -0
  336. package/skills/app-builder/assets/scaffold/components/ui/field.tsx +23 -0
  337. package/skills/app-builder/assets/scaffold/components/ui/input.tsx +1 -1
  338. package/skills/app-builder/assets/scaffold/components/ui/label.tsx +1 -1
  339. package/skills/app-builder/assets/scaffold/components/ui/separator.tsx +6 -0
  340. package/skills/app-builder/assets/scaffold/components/ui/skeleton.tsx +6 -0
  341. package/skills/app-builder/assets/scaffold/components/ui/table.tsx +30 -0
  342. package/skills/app-builder/assets/scaffold/components.json +20 -0
  343. package/skills/app-builder/assets/scaffold/next-env.d.ts +1 -1
  344. package/skills/app-builder/assets/scaffold/next.config.ts +19 -0
  345. package/skills/app-builder/assets/scaffold/package.json +2 -1
  346. package/skills/app-builder/assets/scaffold/rudder.app.json +1 -1
  347. package/skills/app-builder/assets/scaffold/rudder.ui.json +13 -0
  348. package/skills/app-builder/assets/scaffold/scripts/validate-rudder-ui.mjs +50 -0
  349. package/skills/app-builder/assets/scaffold/tests/e2e/app.spec.ts +35 -1
  350. package/skills/app-builder/evals/evals.json +2 -1
  351. package/skills/app-builder/references/design-guidelines.md +19 -2
  352. package/skills/app-builder/references/rudder-ui-preset.md +73 -0
  353. package/skills/app-builder/references/scaffold-contract.md +12 -0
  354. package/skills/app-builder/references/verification.md +6 -0
  355. package/skills/app-builder/scripts/report-build-status.mjs +83 -0
  356. package/skills/browser/SKILL.md +11 -4
  357. package/skills/browser/agents/openai.yaml +2 -2
  358. package/skills/browser/evals/trigger-evals.json +22 -0
  359. package/skills/rudder-docs/SKILL.md +2 -2
  360. package/skills/rudder-docs/evals/retrieval-authority-evals.json +40 -0
  361. package/skills/rudder-docs/evals/trigger-evals.json +2 -2
  362. package/skills/rudder-docs/references/api-reference.md +0 -2
  363. package/skills/rudder-docs/references/plugin-authoring.md +38 -114
  364. package/skills/rudder-docs/references/source-map.md +2 -0
  365. package/ui-dist/assets/{LibraryLiveSurface-CcsYG18H.js → LibraryLiveSurface-CoGcDfo0.js} +1 -1
  366. package/ui-dist/assets/{abnfDiagram-VRR7QNED-C34K70lu.js → abnfDiagram-VRR7QNED-BnPHHNfu.js} +1 -1
  367. package/ui-dist/assets/{arc-BYztEqom.js → arc-CAvqQQR_.js} +1 -1
  368. package/ui-dist/assets/{architectureDiagram-ZJ3FMSHR-BQKKX-d7.js → architectureDiagram-ZJ3FMSHR-DDa31YAK.js} +1 -1
  369. package/ui-dist/assets/{blockDiagram-677ZJIJ3-DPfaIbqb.js → blockDiagram-677ZJIJ3-DDXLU9Ej.js} +1 -1
  370. package/ui-dist/assets/{c4Diagram-LMCZKHZV-BnwCM567.js → c4Diagram-LMCZKHZV-zEm0rHCp.js} +1 -1
  371. package/ui-dist/assets/channel-M_3GhwHQ.js +1 -0
  372. package/ui-dist/assets/{chunk-2Q5K7J3B-CFviCRuZ.js → chunk-2Q5K7J3B-y1Rw45sz.js} +1 -1
  373. package/ui-dist/assets/{chunk-32BRIVSS-FoIxWB1d.js → chunk-32BRIVSS-Cq8cQBba.js} +1 -1
  374. package/ui-dist/assets/{chunk-5VM5RSS4-EbAfuwwN.js → chunk-5VM5RSS4-CjQA6jGI.js} +1 -1
  375. package/ui-dist/assets/{chunk-EX3LRPZG-CsStqjdd.js → chunk-EX3LRPZG-VVYt7jh3.js} +1 -1
  376. package/ui-dist/assets/{chunk-JWPE2WC7-Dw5KEviU.js → chunk-JWPE2WC7-BJC3ISop.js} +1 -1
  377. package/ui-dist/assets/{chunk-MOJQB5TN-BlHlEWfj.js → chunk-MOJQB5TN-ClZgTqQk.js} +1 -1
  378. package/ui-dist/assets/{chunk-RYQCIY6F-BWw7BE01.js → chunk-RYQCIY6F-DRei3pn2.js} +1 -1
  379. package/ui-dist/assets/{chunk-V7JOEXUC-CxRvHZbj.js → chunk-V7JOEXUC-BGWrQfpZ.js} +1 -1
  380. package/ui-dist/assets/{chunk-VR4S4FIN-DZa_KwY9.js → chunk-VR4S4FIN-BBYT57Lt.js} +1 -1
  381. package/ui-dist/assets/{chunk-XXDRQBXY-Cnimf5j2.js → chunk-XXDRQBXY-D7P4SoZB.js} +1 -1
  382. package/ui-dist/assets/classDiagram-OUVF2IWQ-G44FJFnB.js +1 -0
  383. package/ui-dist/assets/classDiagram-v2-EOCWNBFH-G44FJFnB.js +1 -0
  384. package/ui-dist/assets/{cose-bilkent-JH36ORCC-COCPT6B8.js → cose-bilkent-JH36ORCC-mJXY7GQo.js} +1 -1
  385. package/ui-dist/assets/{cynefin-VYW2F7L2-C5CybQ7c.js → cynefin-VYW2F7L2-C-I_lPmH.js} +1 -1
  386. package/ui-dist/assets/{cynefinDiagram-TSTJHNR4-BDrPLGpv.js → cynefinDiagram-TSTJHNR4-Bm1S_w7H.js} +1 -1
  387. package/ui-dist/assets/{dagre-VKFMJZFB-DXxPiE9D.js → dagre-VKFMJZFB-BuPIm1AB.js} +1 -1
  388. package/ui-dist/assets/{diagram-FQU43EPY-CdC2pj_S.js → diagram-FQU43EPY-DTBCuV0W.js} +1 -1
  389. package/ui-dist/assets/{diagram-G47NLZAW-sEOwPe0_.js → diagram-G47NLZAW-B4CK8uR2.js} +1 -1
  390. package/ui-dist/assets/{diagram-NH7WQ7WH-CwoTfWmv.js → diagram-NH7WQ7WH-BkbS0GkL.js} +1 -1
  391. package/ui-dist/assets/{diagram-OA4YK3LP-Cksc-JQa.js → diagram-OA4YK3LP-C_mkRe0c.js} +1 -1
  392. package/ui-dist/assets/{diagram-WEI45ONY-1lHRkCse.js → diagram-WEI45ONY-CHUb3TIJ.js} +1 -1
  393. package/ui-dist/assets/{ebnfDiagram-CCIWWBDH-BJ6dNjJ2.js → ebnfDiagram-CCIWWBDH-D_lN4ZOY.js} +1 -1
  394. package/ui-dist/assets/{erDiagram-Q63AITRT-DVTmCmE1.js → erDiagram-Q63AITRT-CRnDqcsy.js} +1 -1
  395. package/ui-dist/assets/{flowDiagram-23GEKE2U-B2A6w103.js → flowDiagram-23GEKE2U-ChELY-8y.js} +1 -1
  396. package/ui-dist/assets/{ganttDiagram-NO4QXBWP-BoqdQOBD.js → ganttDiagram-NO4QXBWP-QIML25-M.js} +1 -1
  397. package/ui-dist/assets/{gitGraphDiagram-IHSO6WYX-BPWVpzXj.js → gitGraphDiagram-IHSO6WYX-TB_AKH8l.js} +1 -1
  398. package/ui-dist/assets/{graph-W8QGT1XQ.js → graph-HKPvyYQ1.js} +1 -1
  399. package/ui-dist/assets/{index-DTqh4VW9.js → index-Ar0zIwom.js} +1 -1
  400. package/ui-dist/assets/{index-UkFXcg--.js → index-BeNxgoKd.js} +1 -1
  401. package/ui-dist/assets/{index-CRe48ije.js → index-CB-UdrKN.js} +1 -1
  402. package/ui-dist/assets/{index-C8VKPswh.js → index-CfpFS1Tl.js} +573 -588
  403. package/ui-dist/assets/{index-BYt_CWxk.js → index-CjIeIR2m.js} +1 -1
  404. package/ui-dist/assets/{index-DFhr5xg9.js → index-DCgbySwf.js} +1 -1
  405. package/ui-dist/assets/{index-BT3SfQnV.js → index-DDMaBNLI.js} +1 -1
  406. package/ui-dist/assets/{index-96_7QHQ5.js → index-DSZmO4bA.js} +1 -1
  407. package/ui-dist/assets/{index-D5okPECv.js → index-DfzFi2fx.js} +1 -1
  408. package/ui-dist/assets/{index-CG59QbM3.js → index-DmEf_U5I.js} +1 -1
  409. package/ui-dist/assets/{index-CaNgMg06.js → index-OfGDMJiA.js} +1 -1
  410. package/ui-dist/assets/{index-CrOrmmHY.js → index-ZzX8P4M5.js} +1 -1
  411. package/ui-dist/assets/{index-9ogi82-q.js → index-fDtlbG8Y.js} +1 -1
  412. package/ui-dist/assets/{index-Cjq0R1QI.js → index-gdvFtffQ.js} +1 -1
  413. package/ui-dist/assets/index-noipz8bE.css +1 -0
  414. package/ui-dist/assets/{index-CjRwrGKt.js → index-rnOTiIXd.js} +1 -1
  415. package/ui-dist/assets/{infoDiagram-FWYZ7A6U-CGKM1qd0.js → infoDiagram-FWYZ7A6U-DUR3sDTd.js} +1 -1
  416. package/ui-dist/assets/{ishikawaDiagram-FXEZZL3T-BMINXmgJ.js → ishikawaDiagram-FXEZZL3T-CcnYT0s0.js} +1 -1
  417. package/ui-dist/assets/{journeyDiagram-5HDEW3XC-lLpvO5ye.js → journeyDiagram-5HDEW3XC-CqfbG8T1.js} +1 -1
  418. package/ui-dist/assets/{kanban-definition-HUTT4EX6-B1o_jb4m.js → kanban-definition-HUTT4EX6-CYwQM9eR.js} +1 -1
  419. package/ui-dist/assets/{layout-CfhTVz4J.js → layout-B2IlJgLE.js} +1 -1
  420. package/ui-dist/assets/{linear-Cyfw5mer.js → linear-CcEPcfbO.js} +1 -1
  421. package/ui-dist/assets/{map-BJC9PnTS.js → map-Bmhfvlpu.js} +1 -1
  422. package/ui-dist/assets/{mermaid.core-FscMPm7s.js → mermaid.core-T9Q0CuQx.js} +4 -4
  423. package/ui-dist/assets/{mindmap-definition-LN4V7U3C-DRgxKOO8.js → mindmap-definition-LN4V7U3C-CRjQlwN4.js} +1 -1
  424. package/ui-dist/assets/{pegDiagram-2B236MQR-Dvz4qHu-.js → pegDiagram-2B236MQR-DenccdY8.js} +1 -1
  425. package/ui-dist/assets/{pieDiagram-ENE6RG2P-Dk2JI7ZR.js → pieDiagram-ENE6RG2P-CPiTrJcY.js} +1 -1
  426. package/ui-dist/assets/{quadrantDiagram-ABIIQ3AL-rDcmmQtb.js → quadrantDiagram-ABIIQ3AL-fKbvGl_-.js} +1 -1
  427. package/ui-dist/assets/{railroadDiagram-RFXS5EU6-DuGw7Ver.js → railroadDiagram-RFXS5EU6-D6uOjEmA.js} +1 -1
  428. package/ui-dist/assets/{requirementDiagram-TGXJPOKE-B9FO6PRO.js → requirementDiagram-TGXJPOKE-CQIQ387O.js} +1 -1
  429. package/ui-dist/assets/{sankeyDiagram-HTMAVEWB-Dvy9IKWr.js → sankeyDiagram-HTMAVEWB-CKrnONJL.js} +1 -1
  430. package/ui-dist/assets/{sequenceDiagram-DBY2YBRQ-BMNm3icE.js → sequenceDiagram-DBY2YBRQ-C3vaOiZO.js} +1 -1
  431. package/ui-dist/assets/{sizeCapture-X5ZJPWSS-D9g2vtWC.js → sizeCapture-X5ZJPWSS-F39EvxY0.js} +1 -1
  432. package/ui-dist/assets/{stateDiagram-2N3HPSRC-kQ3-sJWr.js → stateDiagram-2N3HPSRC-Bq2sVFQq.js} +1 -1
  433. package/ui-dist/assets/stateDiagram-v2-6OUMAXLB-B94IPtHC.js +1 -0
  434. package/ui-dist/assets/{swimlanes-5IMT3BWC-Cx_ksQRH.js → swimlanes-5IMT3BWC-CSrygB7m.js} +2 -2
  435. package/ui-dist/assets/swimlanesDiagram-G3AALYLV-9WQr2_E9.js +8 -0
  436. package/ui-dist/assets/{timeline-definition-FHXFAJF6-CyArjIWu.js → timeline-definition-FHXFAJF6-DSMMlntv.js} +1 -1
  437. package/ui-dist/assets/{vennDiagram-L72KCM5P-Bjdg_skC.js → vennDiagram-L72KCM5P-D5XH96zV.js} +1 -1
  438. package/ui-dist/assets/{wardleyDiagram-EHGQE667-BLV-S7cE.js → wardleyDiagram-EHGQE667-BXX2RFsU.js} +1 -1
  439. package/ui-dist/assets/{xychartDiagram-FW5EYKEG-BTtly2sn.js → xychartDiagram-FW5EYKEG-awBW2lwG.js} +1 -1
  440. package/ui-dist/index.html +2 -2
  441. package/dist/bootstrap/plugin-host-runtime.d.ts +0 -116
  442. package/dist/bootstrap/plugin-host-runtime.d.ts.map +0 -1
  443. package/dist/bootstrap/plugin-host-runtime.js +0 -179
  444. package/dist/bootstrap/plugin-host-runtime.js.map +0 -1
  445. package/dist/bundled-plugins/plugin-linear/README.md +0 -22
  446. package/dist/bundled-plugins/plugin-linear/dist/manifest.js +0 -183
  447. package/dist/bundled-plugins/plugin-linear/dist/manifest.js.map +0 -7
  448. package/dist/bundled-plugins/plugin-linear/dist/ui/index.js +0 -1285
  449. package/dist/bundled-plugins/plugin-linear/dist/ui/index.js.map +0 -7
  450. package/dist/bundled-plugins/plugin-linear/dist/worker.js +0 -10430
  451. package/dist/bundled-plugins/plugin-linear/dist/worker.js.map +0 -7
  452. package/dist/bundled-plugins/plugin-linear/package.json +0 -42
  453. package/dist/routes/plugin-ui-static.d.ts +0 -70
  454. package/dist/routes/plugin-ui-static.d.ts.map +0 -1
  455. package/dist/routes/plugin-ui-static.js +0 -375
  456. package/dist/routes/plugin-ui-static.js.map +0 -1
  457. package/dist/routes/plugins.d.ts +0 -120
  458. package/dist/routes/plugins.d.ts.map +0 -1
  459. package/dist/routes/plugins.js +0 -1125
  460. package/dist/routes/plugins.js.map +0 -1
  461. package/dist/routes/plugins.operations-routes.d.ts +0 -28
  462. package/dist/routes/plugins.operations-routes.d.ts.map +0 -1
  463. package/dist/routes/plugins.operations-routes.js +0 -720
  464. package/dist/routes/plugins.operations-routes.js.map +0 -1
  465. package/dist/services/issue-goal-fallback.d.ts +0 -15
  466. package/dist/services/issue-goal-fallback.d.ts.map +0 -1
  467. package/dist/services/issue-goal-fallback.js +0 -27
  468. package/dist/services/issue-goal-fallback.js.map +0 -1
  469. package/dist/services/plugin-capability-validator.d.ts +0 -108
  470. package/dist/services/plugin-capability-validator.d.ts.map +0 -1
  471. package/dist/services/plugin-capability-validator.js +0 -268
  472. package/dist/services/plugin-capability-validator.js.map +0 -1
  473. package/dist/services/plugin-config-validator.d.ts +0 -26
  474. package/dist/services/plugin-config-validator.d.ts.map +0 -1
  475. package/dist/services/plugin-config-validator.js +0 -41
  476. package/dist/services/plugin-config-validator.js.map +0 -1
  477. package/dist/services/plugin-dev-watcher.d.ts +0 -47
  478. package/dist/services/plugin-dev-watcher.d.ts.map +0 -1
  479. package/dist/services/plugin-dev-watcher.js +0 -275
  480. package/dist/services/plugin-dev-watcher.js.map +0 -1
  481. package/dist/services/plugin-event-bus.d.ts +0 -149
  482. package/dist/services/plugin-event-bus.d.ts.map +0 -1
  483. package/dist/services/plugin-event-bus.js +0 -258
  484. package/dist/services/plugin-event-bus.js.map +0 -1
  485. package/dist/services/plugin-host-service-cleanup.d.ts +0 -14
  486. package/dist/services/plugin-host-service-cleanup.d.ts.map +0 -1
  487. package/dist/services/plugin-host-service-cleanup.js +0 -37
  488. package/dist/services/plugin-host-service-cleanup.js.map +0 -1
  489. package/dist/services/plugin-host-services.d.ts +0 -13
  490. package/dist/services/plugin-host-services.d.ts.map +0 -1
  491. package/dist/services/plugin-host-services.js +0 -935
  492. package/dist/services/plugin-host-services.js.map +0 -1
  493. package/dist/services/plugin-job-coordinator.d.ts +0 -81
  494. package/dist/services/plugin-job-coordinator.d.ts.map +0 -1
  495. package/dist/services/plugin-job-coordinator.js +0 -172
  496. package/dist/services/plugin-job-coordinator.js.map +0 -1
  497. package/dist/services/plugin-job-scheduler.d.ts +0 -163
  498. package/dist/services/plugin-job-scheduler.d.ts.map +0 -1
  499. package/dist/services/plugin-job-scheduler.js +0 -452
  500. package/dist/services/plugin-job-scheduler.js.map +0 -1
  501. package/dist/services/plugin-job-store.d.ts +0 -208
  502. package/dist/services/plugin-job-store.d.ts.map +0 -1
  503. package/dist/services/plugin-job-store.js +0 -350
  504. package/dist/services/plugin-job-store.js.map +0 -1
  505. package/dist/services/plugin-lifecycle.d.ts +0 -240
  506. package/dist/services/plugin-lifecycle.d.ts.map +0 -1
  507. package/dist/services/plugin-lifecycle.js +0 -439
  508. package/dist/services/plugin-lifecycle.js.map +0 -1
  509. package/dist/services/plugin-loader.core.d.ts +0 -40
  510. package/dist/services/plugin-loader.core.d.ts.map +0 -1
  511. package/dist/services/plugin-loader.core.js +0 -879
  512. package/dist/services/plugin-loader.core.js.map +0 -1
  513. package/dist/services/plugin-loader.d.ts +0 -30
  514. package/dist/services/plugin-loader.d.ts.map +0 -1
  515. package/dist/services/plugin-loader.helpers.d.ts +0 -495
  516. package/dist/services/plugin-loader.helpers.d.ts.map +0 -1
  517. package/dist/services/plugin-loader.helpers.js +0 -238
  518. package/dist/services/plugin-loader.helpers.js.map +0 -1
  519. package/dist/services/plugin-loader.js +0 -30
  520. package/dist/services/plugin-loader.js.map +0 -1
  521. package/dist/services/plugin-loader.worker-paths.d.ts +0 -37
  522. package/dist/services/plugin-loader.worker-paths.d.ts.map +0 -1
  523. package/dist/services/plugin-loader.worker-paths.js +0 -62
  524. package/dist/services/plugin-loader.worker-paths.js.map +0 -1
  525. package/dist/services/plugin-log-retention.d.ts +0 -20
  526. package/dist/services/plugin-log-retention.d.ts.map +0 -1
  527. package/dist/services/plugin-log-retention.js +0 -63
  528. package/dist/services/plugin-log-retention.js.map +0 -1
  529. package/dist/services/plugin-manifest-validator.d.ts +0 -90
  530. package/dist/services/plugin-manifest-validator.d.ts.map +0 -1
  531. package/dist/services/plugin-manifest-validator.js +0 -72
  532. package/dist/services/plugin-manifest-validator.js.map +0 -1
  533. package/dist/services/plugin-registry.d.ts +0 -2542
  534. package/dist/services/plugin-registry.d.ts.map +0 -1
  535. package/dist/services/plugin-registry.js +0 -536
  536. package/dist/services/plugin-registry.js.map +0 -1
  537. package/dist/services/plugin-runtime-sandbox.d.ts +0 -40
  538. package/dist/services/plugin-runtime-sandbox.d.ts.map +0 -1
  539. package/dist/services/plugin-runtime-sandbox.js +0 -154
  540. package/dist/services/plugin-runtime-sandbox.js.map +0 -1
  541. package/dist/services/plugin-secrets-handler.d.ts +0 -81
  542. package/dist/services/plugin-secrets-handler.d.ts.map +0 -1
  543. package/dist/services/plugin-secrets-handler.js +0 -275
  544. package/dist/services/plugin-secrets-handler.js.map +0 -1
  545. package/dist/services/plugin-state-store.d.ts +0 -92
  546. package/dist/services/plugin-state-store.d.ts.map +0 -1
  547. package/dist/services/plugin-state-store.js +0 -190
  548. package/dist/services/plugin-state-store.js.map +0 -1
  549. package/dist/services/plugin-stream-bus.d.ts +0 -29
  550. package/dist/services/plugin-stream-bus.d.ts.map +0 -1
  551. package/dist/services/plugin-stream-bus.js +0 -48
  552. package/dist/services/plugin-stream-bus.js.map +0 -1
  553. package/dist/services/plugin-tool-dispatcher.d.ts +0 -180
  554. package/dist/services/plugin-tool-dispatcher.d.ts.map +0 -1
  555. package/dist/services/plugin-tool-dispatcher.js +0 -224
  556. package/dist/services/plugin-tool-dispatcher.js.map +0 -1
  557. package/dist/services/plugin-tool-registry.d.ts +0 -192
  558. package/dist/services/plugin-tool-registry.d.ts.map +0 -1
  559. package/dist/services/plugin-tool-registry.js +0 -224
  560. package/dist/services/plugin-tool-registry.js.map +0 -1
  561. package/dist/services/plugin-worker-manager.d.ts +0 -260
  562. package/dist/services/plugin-worker-manager.d.ts.map +0 -1
  563. package/dist/services/plugin-worker-manager.js +0 -836
  564. package/dist/services/plugin-worker-manager.js.map +0 -1
  565. package/ui-dist/assets/channel-Bmzlyjow.js +0 -1
  566. package/ui-dist/assets/classDiagram-OUVF2IWQ-VR7MKiEz.js +0 -1
  567. package/ui-dist/assets/classDiagram-v2-EOCWNBFH-VR7MKiEz.js +0 -1
  568. package/ui-dist/assets/index-CxPYXL3t.css +0 -1
  569. package/ui-dist/assets/stateDiagram-v2-6OUMAXLB-BYK8scZh.js +0 -1
  570. package/ui-dist/assets/swimlanesDiagram-G3AALYLV-irU0aSS8.js +0 -8
@@ -8,7 +8,9 @@ import { killChildProcessTree, parseObject } from "../../agent-runtimes/utils.js
8
8
  import { notFound } from "../../errors.js";
9
9
  import { redactCurrentUserText, redactCurrentUserValue } from "../../log-redaction.js";
10
10
  import { logger } from "../../middleware/logger.js";
11
+ import { agentIssueCreationService, getAgentIssueCreationRequestIdFromRunContext, } from "../agent-issue-creation.js";
11
12
  import { agentRunContextService } from "../agent-run-context.js";
13
+ import { approvalService } from "../approvals.js";
12
14
  import { publishAutomationRunOutputToChat } from "../automation-chat-output.js";
13
15
  import { budgetService } from "../budgets.js";
14
16
  import { costService } from "../costs.js";
@@ -31,7 +33,7 @@ import { createHeartbeatExecuteHandlers } from "./heartbeat.execute.js";
31
33
  import { createHeartbeatMiscHandlers } from "./heartbeat.misc.js";
32
34
  import { createHeartbeatRecoveryHandlers } from "./heartbeat.recovery.js";
33
35
  import { createHeartbeatReleaseHandlers } from "./heartbeat.release.js";
34
- import { checkpointHeartbeatRunTerminalEffect, claimExpiredHeartbeatRunExecution, claimHeartbeatRunTerminalEffects, completeHeartbeatRunTerminalEffects, failHeartbeatRunTerminalEffect, markHeartbeatRunProcessExited, reconcileHeartbeatRunEvidence, reconcileHeartbeatRunTerminalEffectsIntent, releaseHeartbeatRunTerminalEffectsClaim, renewHeartbeatRunExecutionLease, renewHeartbeatRunTerminalEffectsClaim, RUN_EXECUTION_LEASE_MS, setWakeupStatusMonotonic, terminalEffectNames, transitionHeartbeatRunToTerminal, } from "./heartbeat.terminal.js";
36
+ import { checkpointHeartbeatRunTerminalEffect, claimExpiredHeartbeatRunExecution, claimHeartbeatRunTerminalEffects, completeHeartbeatRunTerminalEffects, failHeartbeatRunTerminalEffect, markHeartbeatRunProcessExited, reconcileHeartbeatRunEvidence, reconcileHeartbeatRunTerminalEffectsIntent, releaseHeartbeatRunTerminalEffectsClaim, renewHeartbeatRunExecutionLease, renewHeartbeatRunTerminalEffectsClaim, RUN_EXECUTION_LEASE_MS, RUN_EXECUTION_LEASE_RENEW_INTERVAL_MS, setWakeupStatusMonotonic, terminalEffectNames, transitionHeartbeatRunToTerminal, } from "./heartbeat.terminal.js";
35
37
  import { createHeartbeatWakeupHandlers } from "./heartbeat.wakeup.js";
36
38
  const DEFAULT_HEARTBEAT_RUN_TIMEOUT_MS = 12 * 60 * 60 * 1000;
37
39
  const DEFAULT_HEARTBEAT_RUN_INACTIVITY_TIMEOUT_MS = 30 * 60 * 1000;
@@ -41,6 +43,49 @@ const TERMINAL_EFFECT_CLAIM_RENEW_INTERVAL_MS = 60_000;
41
43
  // server process.
42
44
  const activeRunExecutions = new Set();
43
45
  const runAbortControllers = new Map();
46
+ const localExecutionLeaseStates = new Map();
47
+ const LOCAL_EXECUTION_SLEEP_GAP_MS = RUN_EXECUTION_LEASE_RENEW_INTERVAL_MS * 2;
48
+ const heartbeatRecoveryTails = new WeakMap();
49
+ function getLocalExecutionLeaseState(runId, nowMs) {
50
+ const existing = localExecutionLeaseStates.get(runId);
51
+ if (existing)
52
+ return existing;
53
+ const state = {
54
+ executionOwnerToken: null,
55
+ lastRenewedAtMs: nowMs,
56
+ sleepRecoveryUsed: false,
57
+ sleepRecoveryPending: false,
58
+ sleepRecoveryGraceUntilMs: null,
59
+ };
60
+ localExecutionLeaseStates.set(runId, state);
61
+ return state;
62
+ }
63
+ function localExecutionOwnerMatches(runId, ownerToken) {
64
+ const state = localExecutionLeaseStates.get(runId);
65
+ return !state || state.executionOwnerToken === null || state.executionOwnerToken === ownerToken;
66
+ }
67
+ function observeLocalExecutionLease(runId, now) {
68
+ const nowMs = now.getTime();
69
+ const existing = localExecutionLeaseStates.get(runId);
70
+ const state = getLocalExecutionLeaseState(runId, nowMs);
71
+ const sleepRecoveryDetected = Boolean(existing
72
+ && nowMs > existing.lastRenewedAtMs
73
+ && nowMs - existing.lastRenewedAtMs > LOCAL_EXECUTION_SLEEP_GAP_MS
74
+ && !state.sleepRecoveryUsed);
75
+ if (sleepRecoveryDetected) {
76
+ state.sleepRecoveryUsed = true;
77
+ state.sleepRecoveryPending = true;
78
+ }
79
+ state.lastRenewedAtMs = nowMs;
80
+ return sleepRecoveryDetected;
81
+ }
82
+ function pruneLocalExecutionLeaseStates() {
83
+ for (const runId of localExecutionLeaseStates.keys()) {
84
+ if (!activeRunExecutions.has(runId) && !runningProcesses.has(runId)) {
85
+ localExecutionLeaseStates.delete(runId);
86
+ }
87
+ }
88
+ }
44
89
  function formatDurationMs(ms) {
45
90
  const totalSeconds = Math.max(0, Math.round(ms / 1000));
46
91
  const hours = Math.floor(totalSeconds / 3600);
@@ -59,7 +104,9 @@ export function heartbeatService(db, testHooks) {
59
104
  });
60
105
  const runLogStore = getRunLogStore();
61
106
  const runContextSvc = agentRunContextService(db);
107
+ const approvalsSvc = approvalService(db);
62
108
  const issuesSvc = issueService(db);
109
+ const agentIssueCreationSvc = agentIssueCreationService(db);
63
110
  const executionWorkspacesSvc = runWorkspaceService(db);
64
111
  const workspaceOperationsSvc = workspaceOperationService(db);
65
112
  const budgetHooks = {
@@ -448,6 +495,44 @@ export function heartbeatService(db, testHooks) {
448
495
  return updated;
449
496
  }
450
497
  async function transitionRunToTerminal(runId, status, patch, opts) {
498
+ const runBeforeTerminal = await getRun(runId);
499
+ const agentIssueCreationSettlement = runBeforeTerminal
500
+ ? await (async () => {
501
+ const contextRequestId = getAgentIssueCreationRequestIdFromRunContext(runBeforeTerminal.contextSnapshot);
502
+ if (contextRequestId) {
503
+ return {
504
+ orgId: runBeforeTerminal.orgId,
505
+ agentId: runBeforeTerminal.agentId,
506
+ runId: runBeforeTerminal.id,
507
+ requestId: contextRequestId,
508
+ };
509
+ }
510
+ return await agentIssueCreationSvc
511
+ .getSettlementIntentForRun(runBeforeTerminal.orgId, runBeforeTerminal.agentId, runBeforeTerminal.id)
512
+ .catch((error) => {
513
+ logger.warn({ err: error, runId }, "failed to resolve Agent Issue creation settlement terminal effect");
514
+ return null;
515
+ });
516
+ })()
517
+ : null;
518
+ const agentIssueCreationNotification = runBeforeTerminal
519
+ ? await agentIssueCreationSvc
520
+ .getNotificationIntentForRun(runBeforeTerminal.orgId, runBeforeTerminal.agentId, runId)
521
+ .catch((error) => {
522
+ logger.warn({ err: error, runId }, "failed to resolve Agent Issue creation notification terminal effect");
523
+ return null;
524
+ })
525
+ : null;
526
+ const terminalEffectsIntent = {
527
+ version: 1,
528
+ ...(opts?.terminalEffectsIntent ?? {}),
529
+ ...(agentIssueCreationSettlement
530
+ ? { agentIssueCreationSettlement }
531
+ : {}),
532
+ ...(agentIssueCreationNotification
533
+ ? { agentIssueCreationNotification }
534
+ : {}),
535
+ };
451
536
  const updated = await transitionHeartbeatRunToTerminal(db, {
452
537
  runId,
453
538
  status,
@@ -455,12 +540,43 @@ export function heartbeatService(db, testHooks) {
455
540
  expectedStatuses: opts?.expectedStatuses,
456
541
  activityWatermark: opts?.activityWatermark,
457
542
  terminalEffectsPending: opts?.terminalEffectsPending,
458
- terminalEffectsIntent: opts?.terminalEffectsIntent,
543
+ terminalEffectsIntent,
459
544
  processExitedAt: opts?.processExitedAt,
460
545
  expectedExecutionOwnerToken: opts?.expectedExecutionOwnerToken,
461
546
  });
462
- if (updated)
547
+ if (updated) {
463
548
  publishRunStatus(updated);
549
+ const context = parseObject(updated.contextSnapshot);
550
+ const requestId = agentIssueCreationSettlement?.requestId
551
+ ?? getAgentIssueCreationRequestIdFromRunContext(context);
552
+ if (requestId) {
553
+ const settledRequest = await agentIssueCreationSvc.settleForRun({
554
+ orgId: updated.orgId,
555
+ agentId: updated.agentId,
556
+ runId: updated.id,
557
+ requestId,
558
+ runStatus: updated.status,
559
+ error: updated.error,
560
+ }).catch((error) => {
561
+ logger.warn({ err: error, orgId: updated.orgId, agentId: updated.agentId, runId: updated.id, requestId }, "failed to settle Agent Issue creation request after run termination");
562
+ return null;
563
+ });
564
+ if (settledRequest?.status === "succeeded" && settledRequest.createdIssueId) {
565
+ await reconcileTerminalEffectsIntent(updated.id, {
566
+ version: 1,
567
+ agentIssueCreationNotification: {
568
+ orgId: updated.orgId,
569
+ agentId: updated.agentId,
570
+ runId: updated.id,
571
+ requestId: settledRequest.id,
572
+ issueId: settledRequest.createdIssueId,
573
+ },
574
+ }).catch((error) => {
575
+ logger.warn({ err: error, orgId: updated.orgId, agentId: updated.agentId, runId: updated.id, requestId }, "failed to record Agent Issue creation notification terminal effect");
576
+ });
577
+ }
578
+ }
579
+ }
464
580
  return updated;
465
581
  }
466
582
  async function reconcileRunEvidence(runId, patch) {
@@ -590,8 +706,105 @@ export function heartbeatService(db, testHooks) {
590
706
  async function acknowledgeRunProcessExit(runId) {
591
707
  return markHeartbeatRunProcessExited(db, runId);
592
708
  }
593
- async function renewRunExecutionLease(runId, ownerToken) {
594
- return renewHeartbeatRunExecutionLease(db, runId, ownerToken);
709
+ function abortRunExecution(runId) {
710
+ const controller = runAbortControllers.get(runId);
711
+ if (controller) {
712
+ controller.abort();
713
+ return;
714
+ }
715
+ const tracked = runningProcesses.get(runId);
716
+ if (tracked)
717
+ killChildProcessTree(tracked.child, false);
718
+ }
719
+ async function renewRunExecutionLease(runId, ownerToken, now = new Date(), opts) {
720
+ await testHooks?.beforeRunExecutionLeaseRenewal?.({ runId, ownerToken });
721
+ const knownState = localExecutionLeaseStates.get(runId);
722
+ if (knownState && knownState.executionOwnerToken !== null && knownState.executionOwnerToken !== ownerToken) {
723
+ knownState.sleepRecoveryPending = false;
724
+ return null;
725
+ }
726
+ const sleepRecoveryDetected = opts?.observeSleep !== false
727
+ ? observeLocalExecutionLease(runId, now)
728
+ : false;
729
+ const state = localExecutionLeaseStates.get(runId);
730
+ if (state && state.executionOwnerToken === null) {
731
+ state.executionOwnerToken = ownerToken;
732
+ }
733
+ if (state && state.executionOwnerToken !== ownerToken) {
734
+ state.sleepRecoveryPending = false;
735
+ return null;
736
+ }
737
+ const renewed = await renewHeartbeatRunExecutionLease(db, runId, ownerToken, now, {
738
+ touchActivity: opts?.touchActivity || sleepRecoveryDetected,
739
+ });
740
+ if (!renewed) {
741
+ if (state)
742
+ state.sleepRecoveryPending = false;
743
+ }
744
+ return renewed;
745
+ }
746
+ async function preserveLiveExecutionAfterSleep(run, now) {
747
+ if (!activeRunExecutions.has(run.id) && !runningProcesses.has(run.id))
748
+ return false;
749
+ if (!localExecutionOwnerMatches(run.id, run.executionOwnerToken)) {
750
+ abortRunExecution(run.id);
751
+ return true;
752
+ }
753
+ if (!run.executionOwnerToken || !run.executionLeaseExpiresAt)
754
+ return false;
755
+ observeLocalExecutionLease(run.id, now);
756
+ const state = localExecutionLeaseStates.get(run.id);
757
+ if (state && state.executionOwnerToken === null) {
758
+ state.executionOwnerToken = run.executionOwnerToken;
759
+ }
760
+ const nowMs = now.getTime();
761
+ if (state
762
+ && state.sleepRecoveryGraceUntilMs !== null
763
+ && nowMs < state.sleepRecoveryGraceUntilMs) {
764
+ return true;
765
+ }
766
+ const wakeGracePending = state?.sleepRecoveryPending === true;
767
+ if (wakeGracePending) {
768
+ state.sleepRecoveryPending = false;
769
+ }
770
+ else if (new Date(run.executionLeaseExpiresAt).getTime() > now.getTime()) {
771
+ return false;
772
+ }
773
+ else if (state?.sleepRecoveryUsed) {
774
+ return false;
775
+ }
776
+ else if (state) {
777
+ state.sleepRecoveryUsed = true;
778
+ }
779
+ const renewed = await renewRunExecutionLease(run.id, run.executionOwnerToken, now, {
780
+ observeSleep: false,
781
+ touchActivity: true,
782
+ });
783
+ if (!renewed) {
784
+ abortRunExecution(run.id);
785
+ }
786
+ else if (state) {
787
+ state.sleepRecoveryGraceUntilMs = nowMs + RUN_EXECUTION_LEASE_RENEW_INTERVAL_MS;
788
+ }
789
+ return true;
790
+ }
791
+ async function withHeartbeatRecoveryLock(task) {
792
+ const dbKey = db;
793
+ const previous = heartbeatRecoveryTails.get(dbKey) ?? Promise.resolve();
794
+ let release;
795
+ const current = new Promise((resolve) => {
796
+ release = resolve;
797
+ });
798
+ heartbeatRecoveryTails.set(dbKey, current);
799
+ await previous;
800
+ try {
801
+ return await task();
802
+ }
803
+ finally {
804
+ release();
805
+ if (heartbeatRecoveryTails.get(dbKey) === current)
806
+ heartbeatRecoveryTails.delete(dbKey);
807
+ }
595
808
  }
596
809
  async function countRunningRunsForAgent(agentId, excludeRunId) {
597
810
  const pendingExecutionIds = [...activeRunExecutions].filter((runId) => runId !== excludeRunId);
@@ -836,126 +1049,152 @@ export function heartbeatService(db, testHooks) {
836
1049
  });
837
1050
  }
838
1051
  }
839
- async function reapOrphanedRuns(opts) {
1052
+ async function reapOrphanedRunsLocked(opts) {
1053
+ pruneLocalExecutionLeaseStates();
840
1054
  const staleThresholdMs = opts?.staleThresholdMs ?? 0;
841
1055
  const now = opts?.now ?? new Date();
842
1056
  const recoveryCutoff = opts?.recoveryCutoff ?? now;
843
- // Find all runs stuck in "running" state (queued runs are legitimately waiting; resumeQueuedRuns handles them)
844
- const activeRuns = await db
845
- .select({
846
- run: heartbeatRuns,
847
- agentRuntimeType: agents.agentRuntimeType,
848
- })
849
- .from(heartbeatRuns)
850
- .innerJoin(agents, eq(heartbeatRuns.agentId, agents.id))
851
- .where(or(eq(heartbeatRuns.status, "running"), eq(heartbeatRuns.terminalEffectsPending, true)));
852
1057
  const reaped = [];
853
- for (const { run, agentRuntimeType } of activeRuns) {
854
- if (run.terminalEffectsPending) {
855
- if (!run.processExitedAt) {
856
- const exited = await terminateRunProcessAndWait(run, agentRuntimeType);
857
- if (!exited || activeRunExecutions.has(run.id))
1058
+ try {
1059
+ // Find all runs stuck in "running" state (queued runs are legitimately waiting; resumeQueuedRuns handles them)
1060
+ const activeRuns = await db
1061
+ .select({
1062
+ run: heartbeatRuns,
1063
+ agentRuntimeType: agents.agentRuntimeType,
1064
+ })
1065
+ .from(heartbeatRuns)
1066
+ .innerJoin(agents, eq(heartbeatRuns.agentId, agents.id))
1067
+ .where(or(eq(heartbeatRuns.status, "running"), eq(heartbeatRuns.terminalEffectsPending, true)));
1068
+ for (const { run, agentRuntimeType } of activeRuns) {
1069
+ if (run.terminalEffectsPending) {
1070
+ if (!run.processExitedAt) {
1071
+ const exited = await terminateRunProcessAndWait(run, agentRuntimeType);
1072
+ if (!exited || activeRunExecutions.has(run.id))
1073
+ continue;
1074
+ await acknowledgeRunProcessExit(run.id);
1075
+ }
1076
+ const completed = await completeTerminalControlEffects(run);
1077
+ if (!completed)
1078
+ continue;
1079
+ reaped.push(run.id);
1080
+ continue;
1081
+ }
1082
+ // Apply staleness threshold to avoid false positives
1083
+ if (staleThresholdMs > 0) {
1084
+ const refTime = run.updatedAt ? new Date(run.updatedAt).getTime() : 0;
1085
+ if (now.getTime() - refTime < staleThresholdMs)
858
1086
  continue;
859
- await acknowledgeRunProcessExit(run.id);
860
1087
  }
861
- const completed = await completeTerminalControlEffects(run);
862
- if (!completed)
1088
+ // The lease timer pauses while the host sleeps, but the child process
1089
+ // and this server's execution registry can remain alive. Preserve that
1090
+ // local execution instead of turning it into a process-loss retry.
1091
+ if (activeRunExecutions.has(run.id) || runningProcesses.has(run.id)) {
1092
+ if (!localExecutionOwnerMatches(run.id, run.executionOwnerToken)) {
1093
+ abortRunExecution(run.id);
1094
+ continue;
1095
+ }
1096
+ if (run.executionOwnerToken) {
1097
+ const renewed = await renewRunExecutionLease(run.id, run.executionOwnerToken, now);
1098
+ if (!renewed)
1099
+ abortRunExecution(run.id);
1100
+ }
863
1101
  continue;
864
- reaped.push(run.id);
865
- continue;
866
- }
867
- // Apply staleness threshold to avoid false positives
868
- if (staleThresholdMs > 0) {
869
- const refTime = run.updatedAt ? new Date(run.updatedAt).getTime() : 0;
870
- if (now.getTime() - refTime < staleThresholdMs)
1102
+ }
1103
+ const recoveryClaim = await claimExpiredHeartbeatRunExecution(db, run.id, { now, recoveryCutoff });
1104
+ if (!recoveryClaim)
871
1105
  continue;
872
- }
873
- const recoveryClaim = await claimExpiredHeartbeatRunExecution(db, run.id, { now, recoveryCutoff });
874
- if (!recoveryClaim)
875
- continue;
876
- const claimedRun = recoveryClaim.run;
877
- const tracksLocalChild = isTrackedLocalChildProcessAdapter(agentRuntimeType);
878
- let detachedTerminationMessage = null;
879
- if (!claimedRun.processExitedAt && tracksLocalChild && claimedRun.processPid && isProcessAlive(claimedRun.processPid)) {
880
- const termination = await terminateOrphanedProcess(claimedRun.processPid);
881
- if (termination.stillAlive) {
882
- const detachedMessage = termination.error
883
- ? `Lost in-memory process handle, child pid ${claimedRun.processPid} is still alive, and Rudder could not terminate it: ${termination.error}`
884
- : `Lost in-memory process handle, but child pid ${claimedRun.processPid} is still alive`;
885
- const detachedRun = await setRunStatus(claimedRun.id, "running", {
886
- error: detachedMessage,
887
- errorCode: DETACHED_PROCESS_ERROR_CODE,
888
- });
889
- if (detachedRun) {
890
- await appendRunEvent(detachedRun, {
891
- eventType: "lifecycle",
892
- stream: "system",
893
- level: "warn",
894
- message: detachedMessage,
895
- payload: {
896
- processPid: claimedRun.processPid,
897
- },
1106
+ const claimedRun = recoveryClaim.run;
1107
+ const tracksLocalChild = isTrackedLocalChildProcessAdapter(agentRuntimeType);
1108
+ let detachedTerminationMessage = null;
1109
+ if (!claimedRun.processExitedAt && tracksLocalChild && claimedRun.processPid && isProcessAlive(claimedRun.processPid)) {
1110
+ const termination = await terminateOrphanedProcess(claimedRun.processPid);
1111
+ if (termination.stillAlive) {
1112
+ const detachedMessage = termination.error
1113
+ ? `Lost in-memory process handle, child pid ${claimedRun.processPid} is still alive, and Rudder could not terminate it: ${termination.error}`
1114
+ : `Lost in-memory process handle, but child pid ${claimedRun.processPid} is still alive`;
1115
+ const detachedRun = await setRunStatus(claimedRun.id, "running", {
1116
+ error: detachedMessage,
1117
+ errorCode: DETACHED_PROCESS_ERROR_CODE,
898
1118
  });
1119
+ if (detachedRun) {
1120
+ await appendRunEvent(detachedRun, {
1121
+ eventType: "lifecycle",
1122
+ stream: "system",
1123
+ level: "warn",
1124
+ message: detachedMessage,
1125
+ payload: {
1126
+ processPid: claimedRun.processPid,
1127
+ },
1128
+ });
1129
+ }
1130
+ continue;
899
1131
  }
1132
+ detachedTerminationMessage = termination.terminationSignal
1133
+ ? `Terminated detached child pid ${claimedRun.processPid} with ${termination.terminationSignal} after Rudder lost its process handle`
1134
+ : `Detached child pid ${claimedRun.processPid} exited before Rudder could terminate it`;
1135
+ }
1136
+ const shouldRetry = tracksLocalChild && !!claimedRun.processPid && (claimedRun.processLossRetryCount ?? 0) < 1;
1137
+ const baseMessage = claimedRun.processPid
1138
+ ? `Process lost -- child pid ${claimedRun.processPid} is no longer running`
1139
+ : "Process lost -- server may have restarted";
1140
+ let finalizedRun = await transitionRunToTerminal(claimedRun.id, "failed", {
1141
+ error: shouldRetry ? `${baseMessage}; retrying once` : baseMessage,
1142
+ errorCode: "process_lost",
1143
+ finishedAt: now,
1144
+ }, {
1145
+ processExitedAt: now,
1146
+ terminalEffectsIntent: shouldRetry ? { version: 1, processLossRetry: true } : { version: 1 },
1147
+ expectedExecutionOwnerToken: recoveryClaim.ownerToken,
1148
+ });
1149
+ if (!finalizedRun)
900
1150
  continue;
1151
+ await setWakeupStatus(claimedRun.wakeupRequestId, "failed", {
1152
+ finishedAt: now,
1153
+ error: shouldRetry ? `${baseMessage}; retrying once` : baseMessage,
1154
+ });
1155
+ if (detachedTerminationMessage) {
1156
+ await appendRunEvent(finalizedRun, {
1157
+ eventType: "lifecycle",
1158
+ stream: "system",
1159
+ level: "warn",
1160
+ message: detachedTerminationMessage,
1161
+ payload: {
1162
+ ...(claimedRun.processPid ? { processPid: claimedRun.processPid } : {}),
1163
+ },
1164
+ });
901
1165
  }
902
- detachedTerminationMessage = termination.terminationSignal
903
- ? `Terminated detached child pid ${claimedRun.processPid} with ${termination.terminationSignal} after Rudder lost its process handle`
904
- : `Detached child pid ${claimedRun.processPid} exited before Rudder could terminate it`;
905
- }
906
- const shouldRetry = tracksLocalChild && !!claimedRun.processPid && (claimedRun.processLossRetryCount ?? 0) < 1;
907
- const baseMessage = claimedRun.processPid
908
- ? `Process lost -- child pid ${claimedRun.processPid} is no longer running`
909
- : "Process lost -- server may have restarted";
910
- let finalizedRun = await transitionRunToTerminal(claimedRun.id, "failed", {
911
- error: shouldRetry ? `${baseMessage}; retrying once` : baseMessage,
912
- errorCode: "process_lost",
913
- finishedAt: now,
914
- }, {
915
- processExitedAt: now,
916
- terminalEffectsIntent: shouldRetry ? { version: 1, processLossRetry: true } : { version: 1 },
917
- expectedExecutionOwnerToken: recoveryClaim.ownerToken,
918
- });
919
- if (!finalizedRun)
920
- continue;
921
- await setWakeupStatus(claimedRun.wakeupRequestId, "failed", {
922
- finishedAt: now,
923
- error: shouldRetry ? `${baseMessage}; retrying once` : baseMessage,
924
- });
925
- if (detachedTerminationMessage) {
926
1166
  await appendRunEvent(finalizedRun, {
927
1167
  eventType: "lifecycle",
928
1168
  stream: "system",
929
- level: "warn",
930
- message: detachedTerminationMessage,
1169
+ level: "error",
1170
+ message: shouldRetry
1171
+ ? `${baseMessage}; retry will be queued after terminal effects complete`
1172
+ : baseMessage,
931
1173
  payload: {
932
1174
  ...(claimedRun.processPid ? { processPid: claimedRun.processPid } : {}),
933
1175
  },
934
1176
  });
1177
+ const completed = await completeTerminalControlEffects(finalizedRun);
1178
+ runningProcesses.delete(claimedRun.id);
1179
+ if (!completed)
1180
+ continue;
1181
+ reaped.push(claimedRun.id);
935
1182
  }
936
- await appendRunEvent(finalizedRun, {
937
- eventType: "lifecycle",
938
- stream: "system",
939
- level: "error",
940
- message: shouldRetry
941
- ? `${baseMessage}; retry will be queued after terminal effects complete`
942
- : baseMessage,
943
- payload: {
944
- ...(claimedRun.processPid ? { processPid: claimedRun.processPid } : {}),
945
- },
1183
+ }
1184
+ finally {
1185
+ // Terminal effects are the fast path. Keep a request-scoped sweep as a
1186
+ // second durable path for runs whose effect was lost or dead-lettered.
1187
+ await agentIssueCreationSvc.reconcileTerminalSettlements().catch((error) => {
1188
+ logger.warn({ err: error }, "failed to reconcile terminal Agent Issue creation requests");
946
1189
  });
947
- const completed = await completeTerminalControlEffects(finalizedRun);
948
- runningProcesses.delete(claimedRun.id);
949
- if (!completed)
950
- continue;
951
- reaped.push(claimedRun.id);
952
1190
  }
953
1191
  if (reaped.length > 0) {
954
1192
  logger.warn({ reapedCount: reaped.length, runIds: reaped }, "reaped orphaned heartbeat runs");
955
1193
  }
956
1194
  return { reaped: reaped.length, runIds: reaped };
957
1195
  }
958
- async function reapInactiveRuns(opts) {
1196
+ async function reapInactiveRunsLocked(opts) {
1197
+ pruneLocalExecutionLeaseStates();
959
1198
  const maxInactivityMs = opts?.maxInactivityMs ?? DEFAULT_HEARTBEAT_RUN_INACTIVITY_TIMEOUT_MS;
960
1199
  if (!Number.isFinite(maxInactivityMs) || maxInactivityMs <= 0) {
961
1200
  return { timedOut: 0, runIds: [] };
@@ -977,6 +1216,8 @@ export function heartbeatService(db, testHooks) {
977
1216
  for (const { run, agentRuntimeType, lastEventAt, eventCount } of activeRuns) {
978
1217
  if (opts?.recoveryCutoff && new Date(run.createdAt).getTime() >= opts.recoveryCutoff.getTime())
979
1218
  continue;
1219
+ if (await preserveLiveExecutionAfterSleep(run, now))
1220
+ continue;
980
1221
  const activityTimes = [
981
1222
  run.updatedAt,
982
1223
  lastEventAt,
@@ -1041,7 +1282,8 @@ export function heartbeatService(db, testHooks) {
1041
1282
  }
1042
1283
  return { timedOut: timedOut.length, runIds: timedOut };
1043
1284
  }
1044
- async function reapTimedOutRuns(opts) {
1285
+ async function reapTimedOutRunsLocked(opts) {
1286
+ pruneLocalExecutionLeaseStates();
1045
1287
  const maxRuntimeMs = opts?.maxRuntimeMs ?? DEFAULT_HEARTBEAT_RUN_TIMEOUT_MS;
1046
1288
  if (!Number.isFinite(maxRuntimeMs) || maxRuntimeMs <= 0) {
1047
1289
  return { timedOut: 0, runIds: [] };
@@ -1059,6 +1301,8 @@ export function heartbeatService(db, testHooks) {
1059
1301
  for (const { run, agentRuntimeType } of activeRuns) {
1060
1302
  if (opts?.recoveryCutoff && new Date(run.createdAt).getTime() >= opts.recoveryCutoff.getTime())
1061
1303
  continue;
1304
+ if (await preserveLiveExecutionAfterSleep(run, now))
1305
+ continue;
1062
1306
  const startedAt = run.startedAt ? new Date(run.startedAt).getTime() : null;
1063
1307
  if (!startedAt || !Number.isFinite(startedAt))
1064
1308
  continue;
@@ -1110,6 +1354,15 @@ export function heartbeatService(db, testHooks) {
1110
1354
  }
1111
1355
  return { timedOut: timedOut.length, runIds: timedOut };
1112
1356
  }
1357
+ async function reapOrphanedRuns(opts) {
1358
+ return withHeartbeatRecoveryLock(() => reapOrphanedRunsLocked(opts));
1359
+ }
1360
+ async function reapInactiveRuns(opts) {
1361
+ return withHeartbeatRecoveryLock(() => reapInactiveRunsLocked(opts));
1362
+ }
1363
+ async function reapTimedOutRuns(opts) {
1364
+ return withHeartbeatRecoveryLock(() => reapTimedOutRunsLocked(opts));
1365
+ }
1113
1366
  async function resumeQueuedRuns() {
1114
1367
  const queuedRuns = await db
1115
1368
  .select({ agentId: heartbeatRuns.agentId })
@@ -1300,6 +1553,45 @@ export function heartbeatService(db, testHooks) {
1300
1553
  lastError: taskSessionIntent.lastError ?? null,
1301
1554
  }));
1302
1555
  }
1556
+ const agentIssueCreationSettlement = intent.agentIssueCreationSettlement;
1557
+ if (agentIssueCreationSettlement) {
1558
+ await runClaimedEffect("agent_issue_creation_settlement", async () => {
1559
+ const settledRequest = await agentIssueCreationSvc.settleForRun({
1560
+ orgId: agentIssueCreationSettlement.orgId,
1561
+ agentId: agentIssueCreationSettlement.agentId,
1562
+ runId: agentIssueCreationSettlement.runId,
1563
+ requestId: agentIssueCreationSettlement.requestId,
1564
+ runStatus: current.status,
1565
+ error: current.error,
1566
+ });
1567
+ const request = settledRequest
1568
+ ?? await agentIssueCreationSvc.getById(agentIssueCreationSettlement.orgId, agentIssueCreationSettlement.requestId);
1569
+ if (request?.status === "succeeded" && request.createdIssueId) {
1570
+ const notificationIntent = {
1571
+ orgId: agentIssueCreationSettlement.orgId,
1572
+ agentId: agentIssueCreationSettlement.agentId,
1573
+ runId: agentIssueCreationSettlement.runId,
1574
+ requestId: request.id,
1575
+ issueId: request.createdIssueId,
1576
+ };
1577
+ intent.agentIssueCreationNotification ??= notificationIntent;
1578
+ await reconcileTerminalEffectsIntent(current.id, {
1579
+ version: 1,
1580
+ agentIssueCreationNotification: notificationIntent,
1581
+ });
1582
+ }
1583
+ else if (request
1584
+ && !request.createdIssueId
1585
+ && ["queued", "running", "deferred"].includes(request.status)) {
1586
+ throw new Error("Agent Issue creation request remained active after terminal settlement");
1587
+ }
1588
+ return settledRequest;
1589
+ });
1590
+ }
1591
+ const agentIssueCreationNotification = intent.agentIssueCreationNotification;
1592
+ if (agentIssueCreationNotification) {
1593
+ await runClaimedEffect("agent_issue_creation_notification", () => agentIssueCreationSvc.publishNotificationForRequest(agentIssueCreationNotification));
1594
+ }
1303
1595
  if (intent.processLossRetry) {
1304
1596
  await runClaimedEffect("process_loss_retry", () => {
1305
1597
  if (!agent)
@@ -1407,8 +1699,8 @@ export function heartbeatService(db, testHooks) {
1407
1699
  });
1408
1700
  }
1409
1701
  const baseContext = {
1410
- db, instanceSettings, getCurrentUserRedactionOptions, runLogStore, runContextSvc, issuesSvc, executionWorkspacesSvc, workspaceOperationsSvc, activeRunExecutions, runAbortControllers, budgetHooks, budgets,
1411
- getAgent, getRun, getRuntimeState, getTaskSession, getLatestRunForSession, getOldestRunForSession, resolveNormalizedUsageForSession, evaluateSessionCompaction, resolveSessionBeforeForWakeup, resolveExplicitResumeSessionOverride, upsertTaskSession, clearTaskSessions, ensureRuntimeState, setRunStatus, transitionRunToTerminal, reconcileRunEvidence, reconcileTerminalEffectsIntent, setWakeupStatus, updateWakeupRequestRecord, insertWakeupRequestRecord, appendRunEvent, persistRunProcessMetadata, clearDetachedRunWarning, terminateRunProcessAndWait, acknowledgeRunProcessExit, renewRunExecutionLease, countRunningRunsForAgent, claimQueuedRun, finalizeAgentStatus, completeTerminalControlEffects, reapOrphanedRuns, reapInactiveRuns, reapTimedOutRuns, resumeQueuedRuns, updateRuntimeState, startNextQueuedRunForAgent,
1702
+ db, approvalsSvc, instanceSettings, getCurrentUserRedactionOptions, runLogStore, runContextSvc, issuesSvc, executionWorkspacesSvc, workspaceOperationsSvc, activeRunExecutions, runAbortControllers, budgetHooks, budgets,
1703
+ getAgent, getRun, getRuntimeState, getTaskSession, getLatestRunForSession, getOldestRunForSession, resolveNormalizedUsageForSession, evaluateSessionCompaction, resolveSessionBeforeForWakeup, resolveExplicitResumeSessionOverride, upsertTaskSession, clearTaskSessions, ensureRuntimeState, setRunStatus, transitionRunToTerminal, reconcileRunEvidence, reconcileTerminalEffectsIntent, setWakeupStatus, updateWakeupRequestRecord, insertWakeupRequestRecord, appendRunEvent, persistRunProcessMetadata, clearDetachedRunWarning, terminateRunProcessAndWait, acknowledgeRunProcessExit, abortRunExecution, renewRunExecutionLease, countRunningRunsForAgent, claimQueuedRun, finalizeAgentStatus, completeTerminalControlEffects, reapOrphanedRuns, reapInactiveRuns, reapTimedOutRuns, resumeQueuedRuns, updateRuntimeState, startNextQueuedRunForAgent,
1412
1704
  };
1413
1705
  const recoveryHandlers = createHeartbeatRecoveryHandlers({ ...baseContext, startNextQueuedRunForAgent });
1414
1706
  const wakeupHandlers = createHeartbeatWakeupHandlers({
@@ -1423,7 +1715,12 @@ export function heartbeatService(db, testHooks) {
1423
1715
  ...wakeupHandlers,
1424
1716
  afterIssuePromotionCommitted: testHooks?.afterIssuePromotionCommitted,
1425
1717
  });
1426
- const executeHandlers = createHeartbeatExecuteHandlers({ ...baseContext, ...recoveryHandlers, ...releaseHandlers, ...wakeupHandlers });
1718
+ const executeHandlers = createHeartbeatExecuteHandlers({
1719
+ ...baseContext,
1720
+ ...recoveryHandlers,
1721
+ ...releaseHandlers,
1722
+ ...wakeupHandlers,
1723
+ });
1427
1724
  const miscHandlers = createHeartbeatMiscHandlers({ ...baseContext, ...recoveryHandlers, ...releaseHandlers, ...wakeupHandlers, ...executeHandlers });
1428
1725
  const { enqueueRecoveryRun, enqueueProcessLossRetry, evaluatePassiveIssueClosureForLockedIssue, parseHeartbeatPolicy } = recoveryHandlers;
1429
1726
  const { enqueueWakeup } = wakeupHandlers;
@@ -1649,6 +1946,7 @@ export function heartbeatService(db, testHooks) {
1649
1946
  reapOrphanedRuns,
1650
1947
  reapInactiveRuns,
1651
1948
  reapTimedOutRuns,
1949
+ startNextQueuedRunForAgent,
1652
1950
  resumeQueuedRuns,
1653
1951
  tickTimers: async (now = new Date()) => {
1654
1952
  const allAgents = await db.select().from(agents);