@rudderhq/server 0.7.2 → 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 (428) hide show
  1. package/dist/agent-runtimes/registry.d.ts.map +1 -1
  2. package/dist/agent-runtimes/registry.js +0 -2
  3. package/dist/agent-runtimes/registry.js.map +1 -1
  4. package/dist/app.d.ts.map +1 -1
  5. package/dist/app.js +1 -5
  6. package/dist/app.js.map +1 -1
  7. package/dist/bootstrap/create-http-app.d.ts +1 -2
  8. package/dist/bootstrap/create-http-app.d.ts.map +1 -1
  9. package/dist/bootstrap/create-http-app.js +13 -12
  10. package/dist/bootstrap/create-http-app.js.map +1 -1
  11. package/dist/bootstrap/register-api-routes.d.ts +1 -2
  12. package/dist/bootstrap/register-api-routes.d.ts.map +1 -1
  13. package/dist/bootstrap/register-api-routes.js +20 -4
  14. package/dist/bootstrap/register-api-routes.js.map +1 -1
  15. package/dist/middleware/logger.js +2 -2
  16. package/dist/middleware/logger.js.map +1 -1
  17. package/dist/middleware/logger.test.js +26 -10
  18. package/dist/middleware/logger.test.js.map +1 -1
  19. package/dist/routes/agent-issue-creation.d.ts +25 -0
  20. package/dist/routes/agent-issue-creation.d.ts.map +1 -0
  21. package/dist/routes/agent-issue-creation.js +201 -0
  22. package/dist/routes/agent-issue-creation.js.map +1 -0
  23. package/dist/routes/app-builder.d.ts +3 -1
  24. package/dist/routes/app-builder.d.ts.map +1 -1
  25. package/dist/routes/app-builder.js +31 -11
  26. package/dist/routes/app-builder.js.map +1 -1
  27. package/dist/routes/computer.d.ts +30 -0
  28. package/dist/routes/computer.d.ts.map +1 -0
  29. package/dist/routes/computer.js +231 -0
  30. package/dist/routes/computer.js.map +1 -0
  31. package/dist/routes/health.d.ts.map +1 -1
  32. package/dist/routes/health.js +2 -0
  33. package/dist/routes/health.js.map +1 -1
  34. package/dist/routes/instance-settings.d.ts.map +1 -1
  35. package/dist/routes/instance-settings.js +3 -0
  36. package/dist/routes/instance-settings.js.map +1 -1
  37. package/dist/routes/issues.comments-attachments.d.ts.map +1 -1
  38. package/dist/routes/issues.comments-attachments.js +90 -8
  39. package/dist/routes/issues.comments-attachments.js.map +1 -1
  40. package/dist/routes/issues.d.ts.map +1 -1
  41. package/dist/routes/issues.js +12 -1
  42. package/dist/routes/issues.js.map +1 -1
  43. package/dist/routes/issues.mutations.d.ts.map +1 -1
  44. package/dist/routes/issues.mutations.js +85 -33
  45. package/dist/routes/issues.mutations.js.map +1 -1
  46. package/dist/routes/managed-mcp-runtime.d.ts.map +1 -1
  47. package/dist/routes/managed-mcp-runtime.js +109 -7
  48. package/dist/routes/managed-mcp-runtime.js.map +1 -1
  49. package/dist/routes/rudder-plugins.d.ts +4 -0
  50. package/dist/routes/rudder-plugins.d.ts.map +1 -0
  51. package/dist/routes/rudder-plugins.js +213 -0
  52. package/dist/routes/rudder-plugins.js.map +1 -0
  53. package/dist/services/activity-log.d.ts +0 -3
  54. package/dist/services/activity-log.d.ts.map +1 -1
  55. package/dist/services/activity-log.js +0 -33
  56. package/dist/services/activity-log.js.map +1 -1
  57. package/dist/services/activity.d.ts +3 -3
  58. package/dist/services/agent-issue-creation.d.ts +344 -0
  59. package/dist/services/agent-issue-creation.d.ts.map +1 -0
  60. package/dist/services/agent-issue-creation.js +675 -0
  61. package/dist/services/agent-issue-creation.js.map +1 -0
  62. package/dist/services/agent-run-context.d.ts.map +1 -1
  63. package/dist/services/agent-run-context.js +13 -2
  64. package/dist/services/agent-run-context.js.map +1 -1
  65. package/dist/services/app-builder.d.ts.map +1 -1
  66. package/dist/services/app-builder.js +24 -3
  67. package/dist/services/app-builder.js.map +1 -1
  68. package/dist/services/chat-assistant.d.ts.map +1 -1
  69. package/dist/services/chat-assistant.helpers.d.ts +1 -1
  70. package/dist/services/chat-assistant.js +11 -2
  71. package/dist/services/chat-assistant.js.map +1 -1
  72. package/dist/services/chat-generation-protocol.test.js +2 -2
  73. package/dist/services/chat-generation-protocol.test.js.map +1 -1
  74. package/dist/services/chats.d.ts +2 -2
  75. package/dist/services/computer-broker.d.ts +35 -0
  76. package/dist/services/computer-broker.d.ts.map +1 -0
  77. package/dist/services/computer-broker.js +211 -0
  78. package/dist/services/computer-broker.js.map +1 -0
  79. package/dist/services/computer-broker.test.d.ts +2 -0
  80. package/dist/services/computer-broker.test.d.ts.map +1 -0
  81. package/dist/services/computer-broker.test.js +70 -0
  82. package/dist/services/computer-broker.test.js.map +1 -0
  83. package/dist/services/computer-capability.d.ts +13 -0
  84. package/dist/services/computer-capability.d.ts.map +1 -0
  85. package/dist/services/computer-capability.js +11 -0
  86. package/dist/services/computer-capability.js.map +1 -0
  87. package/dist/services/computer-capability.test.d.ts +2 -0
  88. package/dist/services/computer-capability.test.d.ts.map +1 -0
  89. package/dist/services/computer-capability.test.js +27 -0
  90. package/dist/services/computer-capability.test.js.map +1 -0
  91. package/dist/services/finance.d.ts +1 -1
  92. package/dist/services/index.d.ts +2 -0
  93. package/dist/services/index.d.ts.map +1 -1
  94. package/dist/services/index.js +2 -0
  95. package/dist/services/index.js.map +1 -1
  96. package/dist/services/instance-settings.d.ts.map +1 -1
  97. package/dist/services/instance-settings.js +15 -2
  98. package/dist/services/instance-settings.js.map +1 -1
  99. package/dist/services/integrations/agent-integrations.d.ts +1 -1
  100. package/dist/services/issues.d.ts +86 -1
  101. package/dist/services/issues.d.ts.map +1 -1
  102. package/dist/services/issues.helpers.d.ts +4 -0
  103. package/dist/services/issues.helpers.d.ts.map +1 -1
  104. package/dist/services/issues.helpers.js +28 -6
  105. package/dist/services/issues.helpers.js.map +1 -1
  106. package/dist/services/issues.js +207 -127
  107. package/dist/services/issues.js.map +1 -1
  108. package/dist/services/knowledge-portability/organization-portability.files.d.ts +1 -1
  109. package/dist/services/knowledge-portability/organization-skills.catalog.d.ts +7 -1
  110. package/dist/services/knowledge-portability/organization-skills.catalog.d.ts.map +1 -1
  111. package/dist/services/knowledge-portability/organization-skills.catalog.js +10 -0
  112. package/dist/services/knowledge-portability/organization-skills.catalog.js.map +1 -1
  113. package/dist/services/knowledge-portability/organization-skills.d.ts +1 -0
  114. package/dist/services/knowledge-portability/organization-skills.d.ts.map +1 -1
  115. package/dist/services/knowledge-portability/organization-skills.js +36 -3
  116. package/dist/services/knowledge-portability/organization-skills.js.map +1 -1
  117. package/dist/services/mcp/managed-bindings.d.ts +3 -1
  118. package/dist/services/mcp/managed-bindings.d.ts.map +1 -1
  119. package/dist/services/mcp/managed-bindings.js +20 -3
  120. package/dist/services/mcp/managed-bindings.js.map +1 -1
  121. package/dist/services/mcp/managed-client.d.ts +15 -0
  122. package/dist/services/mcp/managed-client.d.ts.map +1 -1
  123. package/dist/services/mcp/managed-client.js +23 -1
  124. package/dist/services/mcp/managed-client.js.map +1 -1
  125. package/dist/services/mcp/managed-client.test.js +73 -9
  126. package/dist/services/mcp/managed-client.test.js.map +1 -1
  127. package/dist/services/messenger.d.ts +2 -2
  128. package/dist/services/messenger.d.ts.map +1 -1
  129. package/dist/services/messenger.js +126 -49
  130. package/dist/services/messenger.js.map +1 -1
  131. package/dist/services/product-analytics.d.ts +1 -1
  132. package/dist/services/rudder-plugins.d.ts +107 -0
  133. package/dist/services/rudder-plugins.d.ts.map +1 -0
  134. package/dist/services/rudder-plugins.js +1746 -0
  135. package/dist/services/rudder-plugins.js.map +1 -0
  136. package/dist/services/rudder-plugins.test.d.ts +2 -0
  137. package/dist/services/rudder-plugins.test.d.ts.map +1 -0
  138. package/dist/services/rudder-plugins.test.js +191 -0
  139. package/dist/services/rudder-plugins.test.js.map +1 -0
  140. package/dist/services/runtime-kernel/heartbeat.core.d.ts +1 -0
  141. package/dist/services/runtime-kernel/heartbeat.core.d.ts.map +1 -1
  142. package/dist/services/runtime-kernel/heartbeat.core.js +1 -1
  143. package/dist/services/runtime-kernel/heartbeat.core.js.map +1 -1
  144. package/dist/services/runtime-kernel/heartbeat.d.ts +53 -0
  145. package/dist/services/runtime-kernel/heartbeat.d.ts.map +1 -1
  146. package/dist/services/runtime-kernel/heartbeat.js +227 -107
  147. package/dist/services/runtime-kernel/heartbeat.js.map +1 -1
  148. package/dist/services/runtime-kernel/heartbeat.recovery.d.ts.map +1 -1
  149. package/dist/services/runtime-kernel/heartbeat.recovery.js +23 -2
  150. package/dist/services/runtime-kernel/heartbeat.recovery.js.map +1 -1
  151. package/dist/services/runtime-kernel/heartbeat.terminal.d.ts +14 -1
  152. package/dist/services/runtime-kernel/heartbeat.terminal.d.ts.map +1 -1
  153. package/dist/services/runtime-kernel/heartbeat.terminal.js +31 -0
  154. package/dist/services/runtime-kernel/heartbeat.terminal.js.map +1 -1
  155. package/dist/services/runtime-kernel/heartbeat.wakeup.d.ts.map +1 -1
  156. package/dist/services/runtime-kernel/heartbeat.wakeup.js +35 -3
  157. package/dist/services/runtime-kernel/heartbeat.wakeup.js.map +1 -1
  158. package/package.json +18 -18
  159. package/resources/bundled-skills/app-builder/SKILL.md +39 -9
  160. package/resources/bundled-skills/app-builder/assets/scaffold/app/globals.css +109 -16
  161. package/resources/bundled-skills/app-builder/assets/scaffold/components/contacts-workspace.tsx +176 -152
  162. package/resources/bundled-skills/app-builder/assets/scaffold/components/ui/alert.tsx +12 -0
  163. package/resources/bundled-skills/app-builder/assets/scaffold/components/ui/badge.tsx +27 -0
  164. package/resources/bundled-skills/app-builder/assets/scaffold/components/ui/button.tsx +9 -7
  165. package/resources/bundled-skills/app-builder/assets/scaffold/components/ui/card.tsx +15 -3
  166. package/resources/bundled-skills/app-builder/assets/scaffold/components/ui/empty.tsx +18 -0
  167. package/resources/bundled-skills/app-builder/assets/scaffold/components/ui/field.tsx +23 -0
  168. package/resources/bundled-skills/app-builder/assets/scaffold/components/ui/input.tsx +1 -1
  169. package/resources/bundled-skills/app-builder/assets/scaffold/components/ui/label.tsx +1 -1
  170. package/resources/bundled-skills/app-builder/assets/scaffold/components/ui/separator.tsx +6 -0
  171. package/resources/bundled-skills/app-builder/assets/scaffold/components/ui/skeleton.tsx +6 -0
  172. package/resources/bundled-skills/app-builder/assets/scaffold/components/ui/table.tsx +30 -0
  173. package/resources/bundled-skills/app-builder/assets/scaffold/components.json +20 -0
  174. package/resources/bundled-skills/app-builder/assets/scaffold/next-env.d.ts +1 -1
  175. package/resources/bundled-skills/app-builder/assets/scaffold/next.config.ts +19 -0
  176. package/resources/bundled-skills/app-builder/assets/scaffold/package.json +2 -1
  177. package/resources/bundled-skills/app-builder/assets/scaffold/rudder.app.json +1 -1
  178. package/resources/bundled-skills/app-builder/assets/scaffold/rudder.ui.json +13 -0
  179. package/resources/bundled-skills/app-builder/assets/scaffold/scripts/validate-rudder-ui.mjs +50 -0
  180. package/resources/bundled-skills/app-builder/assets/scaffold/tests/e2e/app.spec.ts +35 -1
  181. package/resources/bundled-skills/app-builder/evals/evals.json +2 -1
  182. package/resources/bundled-skills/app-builder/references/design-guidelines.md +19 -2
  183. package/resources/bundled-skills/app-builder/references/rudder-ui-preset.md +73 -0
  184. package/resources/bundled-skills/app-builder/references/scaffold-contract.md +12 -0
  185. package/resources/bundled-skills/app-builder/references/verification.md +6 -0
  186. package/resources/bundled-skills/app-builder/scripts/report-build-status.mjs +83 -0
  187. package/resources/bundled-skills/rudder-docs/SKILL.md +2 -2
  188. package/resources/bundled-skills/rudder-docs/evals/retrieval-authority-evals.json +40 -0
  189. package/resources/bundled-skills/rudder-docs/evals/trigger-evals.json +2 -2
  190. package/resources/bundled-skills/rudder-docs/references/api-reference.md +0 -2
  191. package/resources/bundled-skills/rudder-docs/references/plugin-authoring.md +38 -114
  192. package/resources/bundled-skills/rudder-docs/references/source-map.md +2 -0
  193. package/skills/app-builder/SKILL.md +39 -9
  194. package/skills/app-builder/assets/scaffold/app/globals.css +109 -16
  195. package/skills/app-builder/assets/scaffold/components/contacts-workspace.tsx +176 -152
  196. package/skills/app-builder/assets/scaffold/components/ui/alert.tsx +12 -0
  197. package/skills/app-builder/assets/scaffold/components/ui/badge.tsx +27 -0
  198. package/skills/app-builder/assets/scaffold/components/ui/button.tsx +9 -7
  199. package/skills/app-builder/assets/scaffold/components/ui/card.tsx +15 -3
  200. package/skills/app-builder/assets/scaffold/components/ui/empty.tsx +18 -0
  201. package/skills/app-builder/assets/scaffold/components/ui/field.tsx +23 -0
  202. package/skills/app-builder/assets/scaffold/components/ui/input.tsx +1 -1
  203. package/skills/app-builder/assets/scaffold/components/ui/label.tsx +1 -1
  204. package/skills/app-builder/assets/scaffold/components/ui/separator.tsx +6 -0
  205. package/skills/app-builder/assets/scaffold/components/ui/skeleton.tsx +6 -0
  206. package/skills/app-builder/assets/scaffold/components/ui/table.tsx +30 -0
  207. package/skills/app-builder/assets/scaffold/components.json +20 -0
  208. package/skills/app-builder/assets/scaffold/next-env.d.ts +1 -1
  209. package/skills/app-builder/assets/scaffold/next.config.ts +19 -0
  210. package/skills/app-builder/assets/scaffold/package.json +2 -1
  211. package/skills/app-builder/assets/scaffold/rudder.app.json +1 -1
  212. package/skills/app-builder/assets/scaffold/rudder.ui.json +13 -0
  213. package/skills/app-builder/assets/scaffold/scripts/validate-rudder-ui.mjs +50 -0
  214. package/skills/app-builder/assets/scaffold/tests/e2e/app.spec.ts +35 -1
  215. package/skills/app-builder/evals/evals.json +2 -1
  216. package/skills/app-builder/references/design-guidelines.md +19 -2
  217. package/skills/app-builder/references/rudder-ui-preset.md +73 -0
  218. package/skills/app-builder/references/scaffold-contract.md +12 -0
  219. package/skills/app-builder/references/verification.md +6 -0
  220. package/skills/app-builder/scripts/report-build-status.mjs +83 -0
  221. package/skills/rudder-docs/SKILL.md +2 -2
  222. package/skills/rudder-docs/evals/retrieval-authority-evals.json +40 -0
  223. package/skills/rudder-docs/evals/trigger-evals.json +2 -2
  224. package/skills/rudder-docs/references/api-reference.md +0 -2
  225. package/skills/rudder-docs/references/plugin-authoring.md +38 -114
  226. package/skills/rudder-docs/references/source-map.md +2 -0
  227. package/ui-dist/assets/{LibraryLiveSurface-cHCJmmsl.js → LibraryLiveSurface-CoGcDfo0.js} +1 -1
  228. package/ui-dist/assets/{abnfDiagram-VRR7QNED-BORJvkew.js → abnfDiagram-VRR7QNED-BnPHHNfu.js} +1 -1
  229. package/ui-dist/assets/{arc-DPUzhx87.js → arc-CAvqQQR_.js} +1 -1
  230. package/ui-dist/assets/{architectureDiagram-ZJ3FMSHR-Bz_hY8LM.js → architectureDiagram-ZJ3FMSHR-DDa31YAK.js} +1 -1
  231. package/ui-dist/assets/{blockDiagram-677ZJIJ3-Bq1X3YkP.js → blockDiagram-677ZJIJ3-DDXLU9Ej.js} +1 -1
  232. package/ui-dist/assets/{c4Diagram-LMCZKHZV-BawEM9Pc.js → c4Diagram-LMCZKHZV-zEm0rHCp.js} +1 -1
  233. package/ui-dist/assets/channel-M_3GhwHQ.js +1 -0
  234. package/ui-dist/assets/{chunk-2Q5K7J3B-D0D5ZOaA.js → chunk-2Q5K7J3B-y1Rw45sz.js} +1 -1
  235. package/ui-dist/assets/{chunk-32BRIVSS-T90P7lug.js → chunk-32BRIVSS-Cq8cQBba.js} +1 -1
  236. package/ui-dist/assets/{chunk-5VM5RSS4-jcAERTgh.js → chunk-5VM5RSS4-CjQA6jGI.js} +1 -1
  237. package/ui-dist/assets/{chunk-EX3LRPZG-t9-JXwnR.js → chunk-EX3LRPZG-VVYt7jh3.js} +1 -1
  238. package/ui-dist/assets/{chunk-JWPE2WC7-hqgD1saC.js → chunk-JWPE2WC7-BJC3ISop.js} +1 -1
  239. package/ui-dist/assets/{chunk-MOJQB5TN-BsSUoYzd.js → chunk-MOJQB5TN-ClZgTqQk.js} +1 -1
  240. package/ui-dist/assets/{chunk-RYQCIY6F-YcdDh2Zn.js → chunk-RYQCIY6F-DRei3pn2.js} +1 -1
  241. package/ui-dist/assets/{chunk-V7JOEXUC-ChFyH9Su.js → chunk-V7JOEXUC-BGWrQfpZ.js} +1 -1
  242. package/ui-dist/assets/{chunk-VR4S4FIN-BjVK8IyX.js → chunk-VR4S4FIN-BBYT57Lt.js} +1 -1
  243. package/ui-dist/assets/{chunk-XXDRQBXY-D-TvO9vT.js → chunk-XXDRQBXY-D7P4SoZB.js} +1 -1
  244. package/ui-dist/assets/classDiagram-OUVF2IWQ-G44FJFnB.js +1 -0
  245. package/ui-dist/assets/classDiagram-v2-EOCWNBFH-G44FJFnB.js +1 -0
  246. package/ui-dist/assets/{cose-bilkent-JH36ORCC-DBwhASJG.js → cose-bilkent-JH36ORCC-mJXY7GQo.js} +1 -1
  247. package/ui-dist/assets/{cynefin-VYW2F7L2-SlCRmwl2.js → cynefin-VYW2F7L2-C-I_lPmH.js} +1 -1
  248. package/ui-dist/assets/{cynefinDiagram-TSTJHNR4-DImV6N_p.js → cynefinDiagram-TSTJHNR4-Bm1S_w7H.js} +1 -1
  249. package/ui-dist/assets/{dagre-VKFMJZFB-FH4Wv8Zn.js → dagre-VKFMJZFB-BuPIm1AB.js} +1 -1
  250. package/ui-dist/assets/{diagram-FQU43EPY-CrZvQjId.js → diagram-FQU43EPY-DTBCuV0W.js} +1 -1
  251. package/ui-dist/assets/{diagram-G47NLZAW-B7IGl_T3.js → diagram-G47NLZAW-B4CK8uR2.js} +1 -1
  252. package/ui-dist/assets/{diagram-NH7WQ7WH-CB4i7H1a.js → diagram-NH7WQ7WH-BkbS0GkL.js} +1 -1
  253. package/ui-dist/assets/{diagram-OA4YK3LP-DNyWPYY9.js → diagram-OA4YK3LP-C_mkRe0c.js} +1 -1
  254. package/ui-dist/assets/{diagram-WEI45ONY-BAhxbhpi.js → diagram-WEI45ONY-CHUb3TIJ.js} +1 -1
  255. package/ui-dist/assets/{ebnfDiagram-CCIWWBDH-ClXtQ9qt.js → ebnfDiagram-CCIWWBDH-D_lN4ZOY.js} +1 -1
  256. package/ui-dist/assets/{erDiagram-Q63AITRT-DGXiMYfn.js → erDiagram-Q63AITRT-CRnDqcsy.js} +1 -1
  257. package/ui-dist/assets/{flowDiagram-23GEKE2U-CdZ-02zc.js → flowDiagram-23GEKE2U-ChELY-8y.js} +1 -1
  258. package/ui-dist/assets/{ganttDiagram-NO4QXBWP-TxhzNpta.js → ganttDiagram-NO4QXBWP-QIML25-M.js} +1 -1
  259. package/ui-dist/assets/{gitGraphDiagram-IHSO6WYX-D6Q_w6wR.js → gitGraphDiagram-IHSO6WYX-TB_AKH8l.js} +1 -1
  260. package/ui-dist/assets/{graph-CxNmbpl9.js → graph-HKPvyYQ1.js} +1 -1
  261. package/ui-dist/assets/{index-C12QC1Ex.js → index-Ar0zIwom.js} +1 -1
  262. package/ui-dist/assets/{index-CW21qWFm.js → index-BeNxgoKd.js} +1 -1
  263. package/ui-dist/assets/{index-BujwWE3j.js → index-CB-UdrKN.js} +1 -1
  264. package/ui-dist/assets/{index-Cx6oIZPm.js → index-CfpFS1Tl.js} +555 -581
  265. package/ui-dist/assets/{index-C_nwI4Yj.js → index-CjIeIR2m.js} +1 -1
  266. package/ui-dist/assets/{index-Rau2cGm0.js → index-DCgbySwf.js} +1 -1
  267. package/ui-dist/assets/{index-Do78GymY.js → index-DDMaBNLI.js} +1 -1
  268. package/ui-dist/assets/{index-DU2LI7f9.js → index-DSZmO4bA.js} +1 -1
  269. package/ui-dist/assets/{index-BA9tMBhO.js → index-DfzFi2fx.js} +1 -1
  270. package/ui-dist/assets/{index-BoTz5S-X.js → index-DmEf_U5I.js} +1 -1
  271. package/ui-dist/assets/{index-kbWUQ1um.js → index-OfGDMJiA.js} +1 -1
  272. package/ui-dist/assets/{index-AkhgKOxC.js → index-ZzX8P4M5.js} +1 -1
  273. package/ui-dist/assets/{index-BQ87dGIq.js → index-fDtlbG8Y.js} +1 -1
  274. package/ui-dist/assets/{index-CXnqg1Oq.js → index-gdvFtffQ.js} +1 -1
  275. package/ui-dist/assets/index-noipz8bE.css +1 -0
  276. package/ui-dist/assets/{index-Bxz75ICF.js → index-rnOTiIXd.js} +1 -1
  277. package/ui-dist/assets/{infoDiagram-FWYZ7A6U-CnJd4-Jq.js → infoDiagram-FWYZ7A6U-DUR3sDTd.js} +1 -1
  278. package/ui-dist/assets/{ishikawaDiagram-FXEZZL3T-Bq-qc3pD.js → ishikawaDiagram-FXEZZL3T-CcnYT0s0.js} +1 -1
  279. package/ui-dist/assets/{journeyDiagram-5HDEW3XC-NSmpUGUA.js → journeyDiagram-5HDEW3XC-CqfbG8T1.js} +1 -1
  280. package/ui-dist/assets/{kanban-definition-HUTT4EX6-D7pgWtfA.js → kanban-definition-HUTT4EX6-CYwQM9eR.js} +1 -1
  281. package/ui-dist/assets/{layout-BRuo6LWe.js → layout-B2IlJgLE.js} +1 -1
  282. package/ui-dist/assets/{linear-CkaWI9Nd.js → linear-CcEPcfbO.js} +1 -1
  283. package/ui-dist/assets/{map-CgA6tTpZ.js → map-Bmhfvlpu.js} +1 -1
  284. package/ui-dist/assets/{mermaid.core-DrXOt-P6.js → mermaid.core-T9Q0CuQx.js} +4 -4
  285. package/ui-dist/assets/{mindmap-definition-LN4V7U3C-D9ImeWBe.js → mindmap-definition-LN4V7U3C-CRjQlwN4.js} +1 -1
  286. package/ui-dist/assets/{pegDiagram-2B236MQR-Cq-zZ_zz.js → pegDiagram-2B236MQR-DenccdY8.js} +1 -1
  287. package/ui-dist/assets/{pieDiagram-ENE6RG2P-FgNgy726.js → pieDiagram-ENE6RG2P-CPiTrJcY.js} +1 -1
  288. package/ui-dist/assets/{quadrantDiagram-ABIIQ3AL-BxQbmGmi.js → quadrantDiagram-ABIIQ3AL-fKbvGl_-.js} +1 -1
  289. package/ui-dist/assets/{railroadDiagram-RFXS5EU6-CrpbkPH2.js → railroadDiagram-RFXS5EU6-D6uOjEmA.js} +1 -1
  290. package/ui-dist/assets/{requirementDiagram-TGXJPOKE-DQ-65ZW6.js → requirementDiagram-TGXJPOKE-CQIQ387O.js} +1 -1
  291. package/ui-dist/assets/{sankeyDiagram-HTMAVEWB-Bom0lMZm.js → sankeyDiagram-HTMAVEWB-CKrnONJL.js} +1 -1
  292. package/ui-dist/assets/{sequenceDiagram-DBY2YBRQ-C1MSDLDj.js → sequenceDiagram-DBY2YBRQ-C3vaOiZO.js} +1 -1
  293. package/ui-dist/assets/{sizeCapture-X5ZJPWSS-Bn1vxebD.js → sizeCapture-X5ZJPWSS-F39EvxY0.js} +1 -1
  294. package/ui-dist/assets/{stateDiagram-2N3HPSRC-GRRQpmzI.js → stateDiagram-2N3HPSRC-Bq2sVFQq.js} +1 -1
  295. package/ui-dist/assets/stateDiagram-v2-6OUMAXLB-B94IPtHC.js +1 -0
  296. package/ui-dist/assets/{swimlanes-5IMT3BWC-BcOOCZ4q.js → swimlanes-5IMT3BWC-CSrygB7m.js} +2 -2
  297. package/ui-dist/assets/swimlanesDiagram-G3AALYLV-9WQr2_E9.js +8 -0
  298. package/ui-dist/assets/{timeline-definition-FHXFAJF6-gi6amswh.js → timeline-definition-FHXFAJF6-DSMMlntv.js} +1 -1
  299. package/ui-dist/assets/{vennDiagram-L72KCM5P-B9uqeyQt.js → vennDiagram-L72KCM5P-D5XH96zV.js} +1 -1
  300. package/ui-dist/assets/{wardleyDiagram-EHGQE667-BnqWAMiE.js → wardleyDiagram-EHGQE667-BXX2RFsU.js} +1 -1
  301. package/ui-dist/assets/{xychartDiagram-FW5EYKEG-BJXKltIN.js → xychartDiagram-FW5EYKEG-awBW2lwG.js} +1 -1
  302. package/ui-dist/index.html +2 -2
  303. package/dist/bootstrap/plugin-host-runtime.d.ts +0 -116
  304. package/dist/bootstrap/plugin-host-runtime.d.ts.map +0 -1
  305. package/dist/bootstrap/plugin-host-runtime.js +0 -179
  306. package/dist/bootstrap/plugin-host-runtime.js.map +0 -1
  307. package/dist/bundled-plugins/plugin-linear/README.md +0 -22
  308. package/dist/bundled-plugins/plugin-linear/dist/manifest.js +0 -183
  309. package/dist/bundled-plugins/plugin-linear/dist/manifest.js.map +0 -7
  310. package/dist/bundled-plugins/plugin-linear/dist/ui/index.js +0 -1285
  311. package/dist/bundled-plugins/plugin-linear/dist/ui/index.js.map +0 -7
  312. package/dist/bundled-plugins/plugin-linear/dist/worker.js +0 -10699
  313. package/dist/bundled-plugins/plugin-linear/dist/worker.js.map +0 -7
  314. package/dist/bundled-plugins/plugin-linear/package.json +0 -42
  315. package/dist/routes/plugin-ui-static.d.ts +0 -70
  316. package/dist/routes/plugin-ui-static.d.ts.map +0 -1
  317. package/dist/routes/plugin-ui-static.js +0 -375
  318. package/dist/routes/plugin-ui-static.js.map +0 -1
  319. package/dist/routes/plugins.d.ts +0 -120
  320. package/dist/routes/plugins.d.ts.map +0 -1
  321. package/dist/routes/plugins.js +0 -1125
  322. package/dist/routes/plugins.js.map +0 -1
  323. package/dist/routes/plugins.operations-routes.d.ts +0 -28
  324. package/dist/routes/plugins.operations-routes.d.ts.map +0 -1
  325. package/dist/routes/plugins.operations-routes.js +0 -720
  326. package/dist/routes/plugins.operations-routes.js.map +0 -1
  327. package/dist/services/plugin-capability-validator.d.ts +0 -108
  328. package/dist/services/plugin-capability-validator.d.ts.map +0 -1
  329. package/dist/services/plugin-capability-validator.js +0 -268
  330. package/dist/services/plugin-capability-validator.js.map +0 -1
  331. package/dist/services/plugin-config-validator.d.ts +0 -26
  332. package/dist/services/plugin-config-validator.d.ts.map +0 -1
  333. package/dist/services/plugin-config-validator.js +0 -41
  334. package/dist/services/plugin-config-validator.js.map +0 -1
  335. package/dist/services/plugin-dev-watcher.d.ts +0 -47
  336. package/dist/services/plugin-dev-watcher.d.ts.map +0 -1
  337. package/dist/services/plugin-dev-watcher.js +0 -275
  338. package/dist/services/plugin-dev-watcher.js.map +0 -1
  339. package/dist/services/plugin-event-bus.d.ts +0 -149
  340. package/dist/services/plugin-event-bus.d.ts.map +0 -1
  341. package/dist/services/plugin-event-bus.js +0 -258
  342. package/dist/services/plugin-event-bus.js.map +0 -1
  343. package/dist/services/plugin-host-service-cleanup.d.ts +0 -14
  344. package/dist/services/plugin-host-service-cleanup.d.ts.map +0 -1
  345. package/dist/services/plugin-host-service-cleanup.js +0 -37
  346. package/dist/services/plugin-host-service-cleanup.js.map +0 -1
  347. package/dist/services/plugin-host-services.d.ts +0 -13
  348. package/dist/services/plugin-host-services.d.ts.map +0 -1
  349. package/dist/services/plugin-host-services.js +0 -933
  350. package/dist/services/plugin-host-services.js.map +0 -1
  351. package/dist/services/plugin-job-coordinator.d.ts +0 -81
  352. package/dist/services/plugin-job-coordinator.d.ts.map +0 -1
  353. package/dist/services/plugin-job-coordinator.js +0 -172
  354. package/dist/services/plugin-job-coordinator.js.map +0 -1
  355. package/dist/services/plugin-job-scheduler.d.ts +0 -163
  356. package/dist/services/plugin-job-scheduler.d.ts.map +0 -1
  357. package/dist/services/plugin-job-scheduler.js +0 -452
  358. package/dist/services/plugin-job-scheduler.js.map +0 -1
  359. package/dist/services/plugin-job-store.d.ts +0 -208
  360. package/dist/services/plugin-job-store.d.ts.map +0 -1
  361. package/dist/services/plugin-job-store.js +0 -350
  362. package/dist/services/plugin-job-store.js.map +0 -1
  363. package/dist/services/plugin-lifecycle.d.ts +0 -240
  364. package/dist/services/plugin-lifecycle.d.ts.map +0 -1
  365. package/dist/services/plugin-lifecycle.js +0 -439
  366. package/dist/services/plugin-lifecycle.js.map +0 -1
  367. package/dist/services/plugin-loader.core.d.ts +0 -40
  368. package/dist/services/plugin-loader.core.d.ts.map +0 -1
  369. package/dist/services/plugin-loader.core.js +0 -879
  370. package/dist/services/plugin-loader.core.js.map +0 -1
  371. package/dist/services/plugin-loader.d.ts +0 -30
  372. package/dist/services/plugin-loader.d.ts.map +0 -1
  373. package/dist/services/plugin-loader.helpers.d.ts +0 -495
  374. package/dist/services/plugin-loader.helpers.d.ts.map +0 -1
  375. package/dist/services/plugin-loader.helpers.js +0 -238
  376. package/dist/services/plugin-loader.helpers.js.map +0 -1
  377. package/dist/services/plugin-loader.js +0 -30
  378. package/dist/services/plugin-loader.js.map +0 -1
  379. package/dist/services/plugin-loader.worker-paths.d.ts +0 -37
  380. package/dist/services/plugin-loader.worker-paths.d.ts.map +0 -1
  381. package/dist/services/plugin-loader.worker-paths.js +0 -62
  382. package/dist/services/plugin-loader.worker-paths.js.map +0 -1
  383. package/dist/services/plugin-log-retention.d.ts +0 -20
  384. package/dist/services/plugin-log-retention.d.ts.map +0 -1
  385. package/dist/services/plugin-log-retention.js +0 -63
  386. package/dist/services/plugin-log-retention.js.map +0 -1
  387. package/dist/services/plugin-manifest-validator.d.ts +0 -90
  388. package/dist/services/plugin-manifest-validator.d.ts.map +0 -1
  389. package/dist/services/plugin-manifest-validator.js +0 -72
  390. package/dist/services/plugin-manifest-validator.js.map +0 -1
  391. package/dist/services/plugin-registry.d.ts +0 -2542
  392. package/dist/services/plugin-registry.d.ts.map +0 -1
  393. package/dist/services/plugin-registry.js +0 -536
  394. package/dist/services/plugin-registry.js.map +0 -1
  395. package/dist/services/plugin-runtime-sandbox.d.ts +0 -40
  396. package/dist/services/plugin-runtime-sandbox.d.ts.map +0 -1
  397. package/dist/services/plugin-runtime-sandbox.js +0 -154
  398. package/dist/services/plugin-runtime-sandbox.js.map +0 -1
  399. package/dist/services/plugin-secrets-handler.d.ts +0 -81
  400. package/dist/services/plugin-secrets-handler.d.ts.map +0 -1
  401. package/dist/services/plugin-secrets-handler.js +0 -275
  402. package/dist/services/plugin-secrets-handler.js.map +0 -1
  403. package/dist/services/plugin-state-store.d.ts +0 -92
  404. package/dist/services/plugin-state-store.d.ts.map +0 -1
  405. package/dist/services/plugin-state-store.js +0 -190
  406. package/dist/services/plugin-state-store.js.map +0 -1
  407. package/dist/services/plugin-stream-bus.d.ts +0 -29
  408. package/dist/services/plugin-stream-bus.d.ts.map +0 -1
  409. package/dist/services/plugin-stream-bus.js +0 -48
  410. package/dist/services/plugin-stream-bus.js.map +0 -1
  411. package/dist/services/plugin-tool-dispatcher.d.ts +0 -180
  412. package/dist/services/plugin-tool-dispatcher.d.ts.map +0 -1
  413. package/dist/services/plugin-tool-dispatcher.js +0 -224
  414. package/dist/services/plugin-tool-dispatcher.js.map +0 -1
  415. package/dist/services/plugin-tool-registry.d.ts +0 -192
  416. package/dist/services/plugin-tool-registry.d.ts.map +0 -1
  417. package/dist/services/plugin-tool-registry.js +0 -224
  418. package/dist/services/plugin-tool-registry.js.map +0 -1
  419. package/dist/services/plugin-worker-manager.d.ts +0 -260
  420. package/dist/services/plugin-worker-manager.d.ts.map +0 -1
  421. package/dist/services/plugin-worker-manager.js +0 -836
  422. package/dist/services/plugin-worker-manager.js.map +0 -1
  423. package/ui-dist/assets/channel-C08AyYJr.js +0 -1
  424. package/ui-dist/assets/classDiagram-OUVF2IWQ-BIXq6fec.js +0 -1
  425. package/ui-dist/assets/classDiagram-v2-EOCWNBFH-BIXq6fec.js +0 -1
  426. package/ui-dist/assets/index-BmXb0yC1.css +0 -1
  427. package/ui-dist/assets/stateDiagram-v2-6OUMAXLB-KvSJhiLM.js +0 -1
  428. package/ui-dist/assets/swimlanesDiagram-G3AALYLV-Cr92NnJ4.js +0 -8
@@ -0,0 +1,675 @@
1
+ import { agentIssueCreationRequests, agentWakeupRequests, agents, goals, heartbeatRuns, issues, projects, } from "@rudderhq/db";
2
+ import { and, asc, desc, eq, inArray, isNull, or, sql } from "drizzle-orm";
3
+ import { randomUUID } from "node:crypto";
4
+ import { conflict, forbidden, notFound, unprocessable } from "../errors.js";
5
+ import { logger } from "../middleware/logger.js";
6
+ import { logActivity } from "./activity-log.js";
7
+ const RUNTIME_OWNED_CONTEXT_KEYS = new Set([
8
+ "agentId",
9
+ "agentIssueCreationRequest",
10
+ "agentIssueCreationRequestId",
11
+ "approvalId",
12
+ "approvalStatus",
13
+ "commentId",
14
+ "createdIssueId",
15
+ "error",
16
+ "goalId",
17
+ "instruction",
18
+ "issueId",
19
+ "organizationId",
20
+ "parentId",
21
+ "projectId",
22
+ "recovery",
23
+ "relationship",
24
+ "requestedByUserId",
25
+ "role",
26
+ "runId",
27
+ "rudderScene",
28
+ "status",
29
+ "targetId",
30
+ "targetType",
31
+ "taskId",
32
+ "taskKey",
33
+ "wakeCommentId",
34
+ "wakeReason",
35
+ "wakeSource",
36
+ "wakeTriggerDetail",
37
+ "wakeupRequestId",
38
+ ]);
39
+ const ACTIVE_REQUEST_STATUSES = ["queued", "running", "deferred"];
40
+ export function sanitizeAgentIssueCreationContextSnapshot(input) {
41
+ return Object.fromEntries(Object.entries(input ?? {}).filter(([key]) => !RUNTIME_OWNED_CONTEXT_KEYS.has(key) && !key.startsWith("rudder")));
42
+ }
43
+ function sameRequest(existing, input) {
44
+ return existing.agentId === input.agentId
45
+ && existing.instruction === input.instruction
46
+ && existing.projectId === (input.projectId ?? null)
47
+ && existing.goalId === (input.goalId ?? null)
48
+ && existing.parentId === (input.parentId ?? null);
49
+ }
50
+ function requestIdsFromRunContext(contextSnapshot) {
51
+ if (!contextSnapshot || typeof contextSnapshot !== "object" || Array.isArray(contextSnapshot))
52
+ return null;
53
+ const context = contextSnapshot;
54
+ const ids = [];
55
+ const directId = context.agentIssueCreationRequestId;
56
+ if (typeof directId === "string" && directId.trim())
57
+ ids.push(directId.trim());
58
+ const nested = context.agentIssueCreationRequest;
59
+ if (nested && typeof nested === "object" && !Array.isArray(nested)) {
60
+ const nestedId = nested.id;
61
+ if (typeof nestedId === "string" && nestedId.trim())
62
+ ids.push(nestedId.trim());
63
+ }
64
+ return [...new Set(ids)];
65
+ }
66
+ function requestIdFromRunContext(contextSnapshot) {
67
+ const ids = requestIdsFromRunContext(contextSnapshot);
68
+ return ids?.length === 1 ? ids[0] : null;
69
+ }
70
+ export function getAgentIssueCreationRequestIdFromRunContext(contextSnapshot) {
71
+ return requestIdFromRunContext(contextSnapshot);
72
+ }
73
+ export function hasAgentIssueCreationRequestContext(contextSnapshot) {
74
+ return (requestIdsFromRunContext(contextSnapshot)?.length ?? 0) > 0;
75
+ }
76
+ export function agentIssueCreationService(db) {
77
+ async function publishCreatedIssueNotification(database, request, input) {
78
+ const [issue, agent] = await Promise.all([
79
+ database
80
+ .select({ identifier: issues.identifier, title: issues.title })
81
+ .from(issues)
82
+ .where(and(eq(issues.orgId, request.orgId), eq(issues.id, input.issueId)))
83
+ .then((rows) => rows[0] ?? null),
84
+ database
85
+ .select({ name: agents.name })
86
+ .from(agents)
87
+ .where(and(eq(agents.orgId, request.orgId), eq(agents.id, input.agentId)))
88
+ .then((rows) => rows[0] ?? null),
89
+ ]);
90
+ await logActivity(database, {
91
+ orgId: request.orgId,
92
+ actorType: "agent",
93
+ actorId: input.agentId,
94
+ agentId: input.agentId,
95
+ runId: input.runId,
96
+ action: "agent.issue_created_notification",
97
+ entityType: "issue",
98
+ entityId: input.issueId,
99
+ details: {
100
+ issueId: input.issueId,
101
+ identifier: issue?.identifier ?? null,
102
+ title: issue?.title ?? null,
103
+ agentId: input.agentId,
104
+ agentName: agent?.name ?? null,
105
+ requestId: request.id,
106
+ userId: request.requestedByUserId,
107
+ source: "agent.issue_created_notification",
108
+ },
109
+ idempotencyKey: `agent-issue-created-notification:${request.id}`,
110
+ });
111
+ }
112
+ async function getById(orgId, id) {
113
+ return db
114
+ .select()
115
+ .from(agentIssueCreationRequests)
116
+ .where(and(eq(agentIssueCreationRequests.orgId, orgId), eq(agentIssueCreationRequests.id, id)))
117
+ .then((rows) => rows[0] ?? null);
118
+ }
119
+ async function getByIdempotencyKey(orgId, requestedByUserId, idempotencyKey) {
120
+ return db
121
+ .select()
122
+ .from(agentIssueCreationRequests)
123
+ .where(and(eq(agentIssueCreationRequests.orgId, orgId), eq(agentIssueCreationRequests.requestedByUserId, requestedByUserId), eq(agentIssueCreationRequests.idempotencyKey, idempotencyKey)))
124
+ .then((rows) => rows[0] ?? null);
125
+ }
126
+ async function listForRequester(orgId, requestedByUserId) {
127
+ return db
128
+ .select()
129
+ .from(agentIssueCreationRequests)
130
+ .where(and(eq(agentIssueCreationRequests.orgId, orgId), eq(agentIssueCreationRequests.requestedByUserId, requestedByUserId), inArray(agentIssueCreationRequests.status, ["failed", "cancelled"]), isNull(agentIssueCreationRequests.createdIssueId)))
131
+ .orderBy(desc(agentIssueCreationRequests.updatedAt), desc(agentIssueCreationRequests.createdAt))
132
+ .limit(100);
133
+ }
134
+ async function getByRunId(orgId, agentId, runId) {
135
+ return db
136
+ .select()
137
+ .from(agentIssueCreationRequests)
138
+ .where(and(eq(agentIssueCreationRequests.orgId, orgId), eq(agentIssueCreationRequests.agentId, agentId), eq(agentIssueCreationRequests.runId, runId), inArray(agentIssueCreationRequests.status, ACTIVE_REQUEST_STATUSES)))
139
+ .then((rows) => rows[0] ?? null);
140
+ }
141
+ async function reconcileTerminalSettlements() {
142
+ const candidates = await db
143
+ .select({ request: agentIssueCreationRequests, run: heartbeatRuns })
144
+ .from(agentIssueCreationRequests)
145
+ .innerJoin(heartbeatRuns, eq(agentIssueCreationRequests.runId, heartbeatRuns.id))
146
+ .where(and(eq(agentIssueCreationRequests.orgId, heartbeatRuns.orgId), eq(agentIssueCreationRequests.agentId, heartbeatRuns.agentId), inArray(agentIssueCreationRequests.status, ACTIVE_REQUEST_STATUSES), inArray(heartbeatRuns.status, ["succeeded", "failed", "cancelled", "timed_out"])))
147
+ .orderBy(asc(agentIssueCreationRequests.updatedAt), asc(agentIssueCreationRequests.createdAt))
148
+ .limit(100);
149
+ const settledRequestIds = [];
150
+ for (const { request, run } of candidates) {
151
+ try {
152
+ const settled = await settleForRun({
153
+ orgId: request.orgId,
154
+ agentId: request.agentId,
155
+ runId: run.id,
156
+ requestId: request.id,
157
+ runStatus: run.status,
158
+ error: run.error,
159
+ });
160
+ if (settled)
161
+ settledRequestIds.push(settled.id);
162
+ }
163
+ catch (error) {
164
+ logger.warn({
165
+ err: error,
166
+ orgId: request.orgId,
167
+ agentId: request.agentId,
168
+ runId: run.id,
169
+ requestId: request.id,
170
+ }, "failed to reconcile Agent Issue creation request after terminal run");
171
+ }
172
+ }
173
+ return { scanned: candidates.length, settledRequestIds };
174
+ }
175
+ async function getNotificationIntentForRun(orgId, agentId, runId) {
176
+ const request = await db
177
+ .select()
178
+ .from(agentIssueCreationRequests)
179
+ .where(and(eq(agentIssueCreationRequests.orgId, orgId), eq(agentIssueCreationRequests.agentId, agentId), eq(agentIssueCreationRequests.runId, runId), eq(agentIssueCreationRequests.status, "succeeded")))
180
+ .then((rows) => rows.find((row) => row.createdIssueId !== null) ?? null);
181
+ if (!request?.createdIssueId)
182
+ return null;
183
+ const issue = await getAgentIssueCreationOriginIssue({
184
+ orgId,
185
+ requestId: request.id,
186
+ runId,
187
+ agentId,
188
+ issueId: request.createdIssueId,
189
+ });
190
+ if (!issue)
191
+ return null;
192
+ return {
193
+ orgId,
194
+ agentId,
195
+ runId,
196
+ requestId: request.id,
197
+ issueId: request.createdIssueId,
198
+ };
199
+ }
200
+ async function resolveForRun(orgId, agentId, runId) {
201
+ const persistedRequest = await getByRunId(orgId, agentId, runId);
202
+ const run = await db
203
+ .select({
204
+ id: heartbeatRuns.id,
205
+ orgId: heartbeatRuns.orgId,
206
+ agentId: heartbeatRuns.agentId,
207
+ status: heartbeatRuns.status,
208
+ contextSnapshot: heartbeatRuns.contextSnapshot,
209
+ })
210
+ .from(heartbeatRuns)
211
+ .where(and(eq(heartbeatRuns.orgId, orgId), eq(heartbeatRuns.agentId, agentId), eq(heartbeatRuns.id, runId)))
212
+ .then((rows) => rows[0] ?? null);
213
+ if (!run) {
214
+ const unscopedRun = await db
215
+ .select({
216
+ orgId: heartbeatRuns.orgId,
217
+ agentId: heartbeatRuns.agentId,
218
+ contextSnapshot: heartbeatRuns.contextSnapshot,
219
+ })
220
+ .from(heartbeatRuns)
221
+ .where(eq(heartbeatRuns.id, runId))
222
+ .then((rows) => rows[0] ?? null);
223
+ if (unscopedRun && hasAgentIssueCreationRequestContext(unscopedRun.contextSnapshot)) {
224
+ throw forbidden("Agent Issue creation run context does not belong to this organization and Agent");
225
+ }
226
+ return null;
227
+ }
228
+ const requestId = requestIdFromRunContext(run.contextSnapshot);
229
+ if (!requestId) {
230
+ if (hasAgentIssueCreationRequestContext(run.contextSnapshot)) {
231
+ throw conflict("Agent Issue creation run context is ambiguous");
232
+ }
233
+ if (persistedRequest) {
234
+ if (["succeeded", "failed", "cancelled", "timed_out"].includes(run.status)) {
235
+ throw conflict("Agent Issue creation run is already terminal");
236
+ }
237
+ return persistedRequest;
238
+ }
239
+ return null;
240
+ }
241
+ if (["succeeded", "failed", "cancelled", "timed_out"].includes(run.status)) {
242
+ throw conflict("Agent Issue creation run is already terminal");
243
+ }
244
+ if (persistedRequest) {
245
+ if (persistedRequest.id !== requestId) {
246
+ throw conflict("Agent Issue creation request does not match the active run");
247
+ }
248
+ return persistedRequest;
249
+ }
250
+ const request = await getById(orgId, requestId);
251
+ if (!request
252
+ || request.agentId !== agentId
253
+ || (request.runId !== null && request.runId !== run.id)
254
+ || !ACTIVE_REQUEST_STATUSES.includes(request.status)) {
255
+ throw conflict("Agent Issue creation request does not match the active run");
256
+ }
257
+ return request;
258
+ }
259
+ async function resolveTerminalRequestForRun(input) {
260
+ const persistedRequest = await db
261
+ .select()
262
+ .from(agentIssueCreationRequests)
263
+ .where(and(eq(agentIssueCreationRequests.orgId, input.orgId), eq(agentIssueCreationRequests.agentId, input.agentId), eq(agentIssueCreationRequests.runId, input.runId)))
264
+ .then((rows) => rows[0] ?? null);
265
+ const run = await db
266
+ .select({ contextSnapshot: heartbeatRuns.contextSnapshot })
267
+ .from(heartbeatRuns)
268
+ .where(and(eq(heartbeatRuns.orgId, input.orgId), eq(heartbeatRuns.agentId, input.agentId), eq(heartbeatRuns.id, input.runId)))
269
+ .then((rows) => rows[0] ?? null);
270
+ if (!run)
271
+ return null;
272
+ const contextRequestId = requestIdFromRunContext(run?.contextSnapshot);
273
+ const explicitRequestId = input.requestId?.trim() || null;
274
+ if (persistedRequest) {
275
+ if (hasAgentIssueCreationRequestContext(run.contextSnapshot) && contextRequestId !== persistedRequest.id) {
276
+ return null;
277
+ }
278
+ if (explicitRequestId !== null && explicitRequestId !== persistedRequest.id)
279
+ return null;
280
+ return { request: persistedRequest, requestId: persistedRequest.id };
281
+ }
282
+ if (!contextRequestId || (explicitRequestId !== null && explicitRequestId !== contextRequestId))
283
+ return null;
284
+ const request = await getById(input.orgId, contextRequestId);
285
+ if (!request
286
+ || request.agentId !== input.agentId
287
+ || (request.runId !== null && request.runId !== input.runId)) {
288
+ return null;
289
+ }
290
+ return { request, requestId: contextRequestId };
291
+ }
292
+ async function getSettlementIntentForRun(orgId, agentId, runId) {
293
+ const resolved = await resolveTerminalRequestForRun({ orgId, agentId, runId });
294
+ if (!resolved
295
+ || resolved.request.createdIssueId
296
+ || !ACTIVE_REQUEST_STATUSES.includes(resolved.request.status)) {
297
+ return null;
298
+ }
299
+ return {
300
+ orgId,
301
+ agentId,
302
+ runId,
303
+ requestId: resolved.requestId,
304
+ };
305
+ }
306
+ async function getAgentIssueCreationOriginIssue(input) {
307
+ const conditions = [
308
+ eq(issues.orgId, input.orgId),
309
+ eq(issues.originKind, "agent_issue_creation"),
310
+ eq(issues.originId, input.requestId),
311
+ ];
312
+ if (input.runId !== undefined && input.runId !== null) {
313
+ conditions.push(eq(issues.originRunId, input.runId));
314
+ }
315
+ if (input.agentId !== undefined && input.agentId !== null) {
316
+ conditions.push(eq(issues.createdByAgentId, input.agentId));
317
+ }
318
+ if (input.issueId)
319
+ conditions.push(eq(issues.id, input.issueId));
320
+ return db
321
+ .select({ id: issues.id, originRunId: issues.originRunId, createdByAgentId: issues.createdByAgentId })
322
+ .from(issues)
323
+ .where(and(...conditions))
324
+ .then((rows) => rows[0] ?? null);
325
+ }
326
+ async function publishNotificationForRequest(input) {
327
+ const request = await getById(input.orgId, input.requestId);
328
+ if (!request
329
+ || request.agentId !== input.agentId
330
+ || request.status !== "succeeded"
331
+ || request.createdIssueId !== input.issueId
332
+ || request.runId !== input.runId) {
333
+ throw conflict("Agent Issue creation notification does not match the completed request");
334
+ }
335
+ const issue = await getAgentIssueCreationOriginIssue({
336
+ orgId: input.orgId,
337
+ requestId: input.requestId,
338
+ runId: input.runId,
339
+ agentId: input.agentId,
340
+ issueId: input.issueId,
341
+ });
342
+ if (!issue) {
343
+ throw conflict("Agent Issue creation notification source Issue is unavailable");
344
+ }
345
+ await publishCreatedIssueNotification(db, request, {
346
+ agentId: input.agentId,
347
+ runId: input.runId,
348
+ issueId: input.issueId,
349
+ });
350
+ return request;
351
+ }
352
+ async function getWakeupByIdempotencyKey(orgId, agentId, idempotencyKey) {
353
+ return db
354
+ .select()
355
+ .from(agentWakeupRequests)
356
+ .where(and(eq(agentWakeupRequests.orgId, orgId), eq(agentWakeupRequests.agentId, agentId), eq(agentWakeupRequests.idempotencyKey, idempotencyKey)))
357
+ .then((rows) => rows[0] ?? null);
358
+ }
359
+ async function assertRequestReferences(input) {
360
+ const agent = await db
361
+ .select({ id: agents.id, orgId: agents.orgId, status: agents.status })
362
+ .from(agents)
363
+ .where(eq(agents.id, input.agentId))
364
+ .then((rows) => rows[0] ?? null);
365
+ if (!agent)
366
+ throw notFound("Agent not found");
367
+ if (agent.orgId !== input.orgId)
368
+ throw unprocessable("Agent must belong to same organization");
369
+ if (agent.status === "terminated")
370
+ throw conflict("Cannot request work from a terminated agent");
371
+ if (agent.status === "pending_approval")
372
+ throw conflict("Cannot request work from a pending approval agent");
373
+ if (input.projectId) {
374
+ const project = await db
375
+ .select({ id: projects.id, orgId: projects.orgId })
376
+ .from(projects)
377
+ .where(eq(projects.id, input.projectId))
378
+ .then((rows) => rows[0] ?? null);
379
+ if (!project)
380
+ throw notFound("Project not found");
381
+ if (project.orgId !== input.orgId)
382
+ throw unprocessable("Project must belong to same organization");
383
+ }
384
+ if (input.goalId) {
385
+ const goal = await db
386
+ .select({ id: goals.id, orgId: goals.orgId })
387
+ .from(goals)
388
+ .where(eq(goals.id, input.goalId))
389
+ .then((rows) => rows[0] ?? null);
390
+ if (!goal)
391
+ throw notFound("Goal not found");
392
+ if (goal.orgId !== input.orgId)
393
+ throw unprocessable("Goal must belong to same organization");
394
+ }
395
+ if (input.parentId) {
396
+ const parent = await db
397
+ .select({ id: issues.id, orgId: issues.orgId })
398
+ .from(issues)
399
+ .where(eq(issues.id, input.parentId))
400
+ .then((rows) => rows[0] ?? null);
401
+ if (!parent)
402
+ throw notFound("Parent issue not found");
403
+ if (parent.orgId !== input.orgId)
404
+ throw unprocessable("Parent issue must belong to same organization");
405
+ }
406
+ }
407
+ async function create(input) {
408
+ const existing = await getByIdempotencyKey(input.orgId, input.requestedByUserId, input.idempotencyKey);
409
+ if (existing) {
410
+ if (!sameRequest(existing, input)) {
411
+ throw conflict("Idempotency key is already used for a different Agent Issue request");
412
+ }
413
+ if (existing.status === "failed" || existing.status === "cancelled") {
414
+ throw conflict("Agent Issue request is already terminal; use a new idempotency key to retry");
415
+ }
416
+ return {
417
+ request: existing,
418
+ created: false,
419
+ needsAdmission: existing.status === "queued",
420
+ };
421
+ }
422
+ await assertRequestReferences(input);
423
+ const contextSnapshot = {
424
+ ...sanitizeAgentIssueCreationContextSnapshot(input.contextSnapshot),
425
+ organizationId: input.orgId,
426
+ projectId: input.projectId ?? null,
427
+ goalId: input.goalId ?? null,
428
+ parentId: input.parentId ?? null,
429
+ };
430
+ const [request] = await db
431
+ .insert(agentIssueCreationRequests)
432
+ .values({
433
+ orgId: input.orgId,
434
+ requestedByUserId: input.requestedByUserId,
435
+ agentId: input.agentId,
436
+ instruction: input.instruction,
437
+ projectId: input.projectId ?? null,
438
+ goalId: input.goalId ?? null,
439
+ parentId: input.parentId ?? null,
440
+ contextSnapshot,
441
+ idempotencyKey: input.idempotencyKey,
442
+ status: "queued",
443
+ })
444
+ .onConflictDoNothing()
445
+ .returning();
446
+ if (request)
447
+ return { request, created: true, needsAdmission: true };
448
+ const raced = await getByIdempotencyKey(input.orgId, input.requestedByUserId, input.idempotencyKey);
449
+ if (!raced)
450
+ throw conflict("Agent Issue request could not be created");
451
+ if (!sameRequest(raced, input)) {
452
+ throw conflict("Idempotency key is already used for a different Agent Issue request");
453
+ }
454
+ if (raced.status === "failed" || raced.status === "cancelled") {
455
+ throw conflict("Agent Issue request is already terminal; use a new idempotency key to retry");
456
+ }
457
+ return {
458
+ request: raced,
459
+ created: false,
460
+ needsAdmission: raced.status === "queued",
461
+ };
462
+ }
463
+ async function update(orgId, id, patch, options = {}) {
464
+ const conditions = [
465
+ eq(agentIssueCreationRequests.orgId, orgId),
466
+ eq(agentIssueCreationRequests.id, id),
467
+ ];
468
+ if (options.expectedStatuses?.length) {
469
+ conditions.push(inArray(agentIssueCreationRequests.status, options.expectedStatuses));
470
+ }
471
+ const [updated] = await db
472
+ .update(agentIssueCreationRequests)
473
+ .set({ ...patch, updatedAt: new Date() })
474
+ .where(and(...conditions))
475
+ .returning();
476
+ return updated ?? null;
477
+ }
478
+ async function retry(orgId, id, requestedByUserId) {
479
+ const existing = await getById(orgId, id);
480
+ if (!existing || existing.requestedByUserId !== requestedByUserId) {
481
+ throw notFound("Agent Issue request not found");
482
+ }
483
+ if (existing.createdIssueId) {
484
+ throw conflict("Agent Issue request already created an Issue");
485
+ }
486
+ if (existing.status !== "failed" && existing.status !== "cancelled") {
487
+ throw conflict("Only failed or cancelled Agent Issue requests can be retried", {
488
+ status: existing.status,
489
+ });
490
+ }
491
+ const [retried] = await db
492
+ .update(agentIssueCreationRequests)
493
+ .set({
494
+ status: "queued",
495
+ wakeupAttempt: sql `${agentIssueCreationRequests.wakeupAttempt} + 1`,
496
+ wakeupAttemptId: randomUUID(),
497
+ wakeupRequestId: null,
498
+ runId: null,
499
+ error: null,
500
+ startedAt: null,
501
+ finishedAt: null,
502
+ updatedAt: new Date(),
503
+ })
504
+ .where(and(eq(agentIssueCreationRequests.orgId, orgId), eq(agentIssueCreationRequests.id, id), eq(agentIssueCreationRequests.requestedByUserId, requestedByUserId), isNull(agentIssueCreationRequests.createdIssueId), inArray(agentIssueCreationRequests.status, ["failed", "cancelled"])))
505
+ .returning();
506
+ if (retried)
507
+ return retried;
508
+ const current = await getById(orgId, id);
509
+ if (!current || current.requestedByUserId !== requestedByUserId) {
510
+ throw notFound("Agent Issue request not found");
511
+ }
512
+ throw conflict("Agent Issue request changed before retry", { status: current.status });
513
+ }
514
+ async function completeForCreatedIssue(input) {
515
+ const resolved = await resolveTerminalRequestForRun(input);
516
+ if (!resolved)
517
+ return null;
518
+ const { requestId: contextRequestId } = resolved;
519
+ const createdIssue = await getAgentIssueCreationOriginIssue({
520
+ orgId: input.orgId,
521
+ requestId: contextRequestId,
522
+ runId: input.runId,
523
+ agentId: input.agentId,
524
+ issueId: input.issueId,
525
+ });
526
+ if (!createdIssue)
527
+ return null;
528
+ const updated = await db.transaction(async (tx) => {
529
+ const [updated] = await tx
530
+ .update(agentIssueCreationRequests)
531
+ .set({
532
+ status: "succeeded",
533
+ runId: input.runId,
534
+ createdIssueId: input.issueId,
535
+ finishedAt: new Date(),
536
+ error: null,
537
+ updatedAt: new Date(),
538
+ })
539
+ .where(and(eq(agentIssueCreationRequests.orgId, input.orgId), eq(agentIssueCreationRequests.agentId, input.agentId), contextRequestId
540
+ ? eq(agentIssueCreationRequests.id, contextRequestId)
541
+ : eq(agentIssueCreationRequests.runId, input.runId), or(isNull(agentIssueCreationRequests.runId), eq(agentIssueCreationRequests.runId, input.runId)), isNull(agentIssueCreationRequests.createdIssueId), inArray(agentIssueCreationRequests.status, ACTIVE_REQUEST_STATUSES)))
542
+ .returning();
543
+ return updated ?? null;
544
+ });
545
+ const completed = updated
546
+ ?? (resolved.request.status === "succeeded" && resolved.request.createdIssueId === input.issueId
547
+ ? resolved.request
548
+ : null);
549
+ if (completed) {
550
+ try {
551
+ // The request outcome is durable before notification delivery starts.
552
+ // Terminal effects provide the retry path if this immediate attempt fails.
553
+ await publishCreatedIssueNotification(db, completed, input);
554
+ }
555
+ catch (error) {
556
+ logger.warn({
557
+ err: error,
558
+ orgId: input.orgId,
559
+ agentId: input.agentId,
560
+ runId: input.runId,
561
+ requestId: completed.id,
562
+ issueId: input.issueId,
563
+ }, "failed to publish Agent Issue creation notification; terminal effects will retry");
564
+ }
565
+ }
566
+ return updated ?? null;
567
+ }
568
+ async function settleForRun(input) {
569
+ const requestId = input.requestId?.trim() || null;
570
+ const resolved = await resolveTerminalRequestForRun({ ...input, requestId });
571
+ if (!resolved)
572
+ return null;
573
+ const { request } = resolved;
574
+ const createdIssue = await getAgentIssueCreationOriginIssue({
575
+ orgId: input.orgId,
576
+ requestId: resolved.requestId,
577
+ runId: input.runId,
578
+ agentId: input.agentId,
579
+ });
580
+ if (createdIssue) {
581
+ return await completeForCreatedIssue({
582
+ orgId: input.orgId,
583
+ agentId: input.agentId,
584
+ runId: input.runId,
585
+ issueId: createdIssue.id,
586
+ requestId: resolved.requestId,
587
+ });
588
+ }
589
+ // An origin-bearing Issue with a different owner or run is not evidence
590
+ // that this request failed. Leave the request active for the producer that
591
+ // owns that origin instead of mutating it from an unrelated terminal hook.
592
+ const mismatchedOriginIssue = await getAgentIssueCreationOriginIssue({
593
+ orgId: input.orgId,
594
+ requestId: resolved.requestId,
595
+ });
596
+ if (mismatchedOriginIssue)
597
+ return null;
598
+ const requestStatus = input.runStatus === "cancelled" ? "cancelled" : "failed";
599
+ const error = input.error?.trim()
600
+ || (input.runStatus === "succeeded"
601
+ ? "Agent run completed without creating an Issue"
602
+ : `Agent run ${input.runStatus}`);
603
+ const match = [
604
+ eq(agentIssueCreationRequests.orgId, input.orgId),
605
+ eq(agentIssueCreationRequests.agentId, input.agentId),
606
+ eq(agentIssueCreationRequests.id, resolved.requestId),
607
+ or(isNull(agentIssueCreationRequests.runId), eq(agentIssueCreationRequests.runId, input.runId)),
608
+ isNull(agentIssueCreationRequests.createdIssueId),
609
+ inArray(agentIssueCreationRequests.status, ACTIVE_REQUEST_STATUSES),
610
+ ];
611
+ const [updated] = await db
612
+ .update(agentIssueCreationRequests)
613
+ .set({
614
+ status: requestStatus,
615
+ runId: input.runId,
616
+ error,
617
+ finishedAt: new Date(),
618
+ updatedAt: new Date(),
619
+ })
620
+ .where(and(...match))
621
+ .returning();
622
+ if (updated) {
623
+ try {
624
+ await logActivity(db, {
625
+ orgId: input.orgId,
626
+ actorType: "agent",
627
+ actorId: input.agentId,
628
+ agentId: input.agentId,
629
+ runId: input.runId,
630
+ action: "agent.issue_creation_failed",
631
+ entityType: "agent_issue_creation_request",
632
+ entityId: updated.id,
633
+ details: {
634
+ requestId: updated.id,
635
+ requestedByUserId: request.requestedByUserId,
636
+ userId: request.requestedByUserId,
637
+ agentId: input.agentId,
638
+ runId: input.runId,
639
+ status: requestStatus,
640
+ error,
641
+ source: "agent.issue_creation_failed",
642
+ },
643
+ idempotencyKey: `agent-issue-creation-failed:${updated.id}:${input.runId}`,
644
+ });
645
+ }
646
+ catch (activityError) {
647
+ logger.warn({
648
+ err: activityError,
649
+ orgId: input.orgId,
650
+ agentId: input.agentId,
651
+ runId: input.runId,
652
+ requestId: updated.id,
653
+ }, "failed to publish Agent Issue creation failure activity");
654
+ }
655
+ }
656
+ return updated ?? null;
657
+ }
658
+ return {
659
+ create,
660
+ completeForCreatedIssue,
661
+ getById,
662
+ getByIdempotencyKey,
663
+ listForRequester,
664
+ getNotificationIntentForRun,
665
+ getSettlementIntentForRun,
666
+ reconcileTerminalSettlements,
667
+ publishNotificationForRequest,
668
+ resolveForRun,
669
+ getWakeupByIdempotencyKey,
670
+ retry,
671
+ settleForRun,
672
+ update,
673
+ };
674
+ }
675
+ //# sourceMappingURL=agent-issue-creation.js.map