@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
@@ -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