@rudderhq/server 0.6.6-canary.2 → 0.6.6-canary.21

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 (291) hide show
  1. package/dist/bootstrap/register-api-routes.d.ts.map +1 -1
  2. package/dist/bootstrap/register-api-routes.js +2 -0
  3. package/dist/bootstrap/register-api-routes.js.map +1 -1
  4. package/dist/bundled-plugins/plugin-linear/dist/worker.js +77 -5
  5. package/dist/bundled-plugins/plugin-linear/dist/worker.js.map +3 -3
  6. package/dist/routes/access.d.ts.map +1 -1
  7. package/dist/routes/access.js +6 -0
  8. package/dist/routes/access.js.map +1 -1
  9. package/dist/routes/app-builder.d.ts +3 -0
  10. package/dist/routes/app-builder.d.ts.map +1 -0
  11. package/dist/routes/app-builder.js +305 -0
  12. package/dist/routes/app-builder.js.map +1 -0
  13. package/dist/routes/health.d.ts.map +1 -1
  14. package/dist/routes/health.js +1 -0
  15. package/dist/routes/health.js.map +1 -1
  16. package/dist/routes/index.d.ts +1 -0
  17. package/dist/routes/index.d.ts.map +1 -1
  18. package/dist/routes/index.js +1 -0
  19. package/dist/routes/index.js.map +1 -1
  20. package/dist/routes/issues.mutations.d.ts.map +1 -1
  21. package/dist/routes/issues.mutations.js +1 -5
  22. package/dist/routes/issues.mutations.js.map +1 -1
  23. package/dist/services/agent-run-context.d.ts.map +1 -1
  24. package/dist/services/agent-run-context.js +8 -2
  25. package/dist/services/agent-run-context.js.map +1 -1
  26. package/dist/services/agents.d.ts +13 -13
  27. package/dist/services/app-builder.d.ts +13 -0
  28. package/dist/services/app-builder.d.ts.map +1 -0
  29. package/dist/services/app-builder.js +241 -0
  30. package/dist/services/app-builder.js.map +1 -0
  31. package/dist/services/approvals.d.ts +3 -3
  32. package/dist/services/budgets.d.ts +1 -6
  33. package/dist/services/budgets.d.ts.map +1 -1
  34. package/dist/services/budgets.js +30 -103
  35. package/dist/services/budgets.js.map +1 -1
  36. package/dist/services/chat-annotation-copy-lineage.d.ts.map +1 -1
  37. package/dist/services/chat-annotation-copy-lineage.js +6 -1
  38. package/dist/services/chat-annotation-copy-lineage.js.map +1 -1
  39. package/dist/services/chat-assistant.annotations.d.ts.map +1 -1
  40. package/dist/services/chat-assistant.annotations.js +4 -1
  41. package/dist/services/chat-assistant.annotations.js.map +1 -1
  42. package/dist/services/chat-assistant.annotations.test.js +18 -2
  43. package/dist/services/chat-assistant.annotations.test.js.map +1 -1
  44. package/dist/services/chat-inline-annotation-validation.d.ts.map +1 -1
  45. package/dist/services/chat-inline-annotation-validation.js +75 -7
  46. package/dist/services/chat-inline-annotation-validation.js.map +1 -1
  47. package/dist/services/chat-inline-annotations.test.js +113 -0
  48. package/dist/services/chat-inline-annotations.test.js.map +1 -1
  49. package/dist/services/chat-message-branch.d.ts +5 -0
  50. package/dist/services/chat-message-branch.d.ts.map +1 -0
  51. package/dist/services/chat-message-branch.js +9 -0
  52. package/dist/services/chat-message-branch.js.map +1 -0
  53. package/dist/services/chat-work-manifest.d.ts.map +1 -1
  54. package/dist/services/chat-work-manifest.js +6 -0
  55. package/dist/services/chat-work-manifest.js.map +1 -1
  56. package/dist/services/chats.d.ts +12 -12
  57. package/dist/services/chats.d.ts.map +1 -1
  58. package/dist/services/chats.inline-visual-persistence.d.ts.map +1 -1
  59. package/dist/services/chats.inline-visual-persistence.js +7 -0
  60. package/dist/services/chats.inline-visual-persistence.js.map +1 -1
  61. package/dist/services/chats.js +12 -11
  62. package/dist/services/chats.js.map +1 -1
  63. package/dist/services/dashboard.d.ts +0 -1
  64. package/dist/services/dashboard.d.ts.map +1 -1
  65. package/dist/services/dashboard.js +0 -1
  66. package/dist/services/dashboard.js.map +1 -1
  67. package/dist/services/index.d.ts +1 -0
  68. package/dist/services/index.d.ts.map +1 -1
  69. package/dist/services/index.js +1 -0
  70. package/dist/services/index.js.map +1 -1
  71. package/dist/services/instance-settings.d.ts.map +1 -1
  72. package/dist/services/instance-settings.js +4 -6
  73. package/dist/services/instance-settings.js.map +1 -1
  74. package/dist/services/issue-approvals.d.ts +1 -1
  75. package/dist/services/issues.d.ts +2 -2
  76. package/dist/services/knowledge-portability/organization-skills.d.ts.map +1 -1
  77. package/dist/services/knowledge-portability/organization-skills.js +6 -2
  78. package/dist/services/knowledge-portability/organization-skills.js.map +1 -1
  79. package/dist/services/legacy-operator-state.d.ts +14 -0
  80. package/dist/services/legacy-operator-state.d.ts.map +1 -0
  81. package/dist/services/legacy-operator-state.js +245 -0
  82. package/dist/services/legacy-operator-state.js.map +1 -0
  83. package/dist/services/local-account-auth.d.ts.map +1 -1
  84. package/dist/services/local-account-auth.js +21 -3
  85. package/dist/services/local-account-auth.js.map +1 -1
  86. package/dist/services/messenger.d.ts +3 -3
  87. package/dist/services/orgs.d.ts +1 -1
  88. package/dist/services/projects.d.ts +1 -1
  89. package/dist/services/runtime-kernel/heartbeat.d.ts.map +1 -1
  90. package/dist/services/runtime-kernel/heartbeat.misc.d.ts.map +1 -1
  91. package/dist/services/runtime-kernel/heartbeat.misc.js +5 -10
  92. package/dist/services/runtime-kernel/heartbeat.misc.js.map +1 -1
  93. package/dist/services/secrets.d.ts +1 -1
  94. package/dist/services/side-chats.d.ts.map +1 -1
  95. package/dist/services/side-chats.js +30 -15
  96. package/dist/services/side-chats.js.map +1 -1
  97. package/package.json +14 -14
  98. package/resources/bundled-skills/app-builder/SKILL.md +87 -0
  99. package/resources/bundled-skills/app-builder/agents/openai.yaml +14 -0
  100. package/resources/bundled-skills/app-builder/assets/scaffold/.env.example +3 -0
  101. package/resources/bundled-skills/app-builder/assets/scaffold/app/api/%5F%5Frudder/health/route.ts +20 -0
  102. package/resources/bundled-skills/app-builder/assets/scaffold/app/api/contacts/[id]/route.ts +39 -0
  103. package/resources/bundled-skills/app-builder/assets/scaffold/app/api/contacts/route.ts +31 -0
  104. package/resources/bundled-skills/app-builder/assets/scaffold/app/api/data/export/route.ts +19 -0
  105. package/resources/bundled-skills/app-builder/assets/scaffold/app/api/data/import/route.ts +40 -0
  106. package/resources/bundled-skills/app-builder/assets/scaffold/app/globals.css +32 -0
  107. package/resources/bundled-skills/app-builder/assets/scaffold/app/layout.tsx +15 -0
  108. package/resources/bundled-skills/app-builder/assets/scaffold/app/page.tsx +9 -0
  109. package/resources/bundled-skills/app-builder/assets/scaffold/components/contacts-workspace.tsx +292 -0
  110. package/resources/bundled-skills/app-builder/assets/scaffold/components/ui/button.tsx +42 -0
  111. package/resources/bundled-skills/app-builder/assets/scaffold/components/ui/card.tsx +19 -0
  112. package/resources/bundled-skills/app-builder/assets/scaffold/components/ui/input.tsx +17 -0
  113. package/resources/bundled-skills/app-builder/assets/scaffold/components/ui/label.tsx +6 -0
  114. package/resources/bundled-skills/app-builder/assets/scaffold/data/.gitkeep +1 -0
  115. package/resources/bundled-skills/app-builder/assets/scaffold/drizzle.config.ts +18 -0
  116. package/resources/bundled-skills/app-builder/assets/scaffold/instrumentation.ts +5 -0
  117. package/resources/bundled-skills/app-builder/assets/scaffold/lib/data-transfer.ts +44 -0
  118. package/resources/bundled-skills/app-builder/assets/scaffold/lib/db/client.ts +78 -0
  119. package/resources/bundled-skills/app-builder/assets/scaffold/lib/db/schema.ts +35 -0
  120. package/resources/bundled-skills/app-builder/assets/scaffold/lib/domain.ts +18 -0
  121. package/resources/bundled-skills/app-builder/assets/scaffold/lib/jobs/runner.ts +56 -0
  122. package/resources/bundled-skills/app-builder/assets/scaffold/lib/utils.ts +6 -0
  123. package/resources/bundled-skills/app-builder/assets/scaffold/migrations/0000_app_builder_foundation.sql +27 -0
  124. package/resources/bundled-skills/app-builder/assets/scaffold/migrations/meta/_journal.json +13 -0
  125. package/resources/bundled-skills/app-builder/assets/scaffold/next-env.d.ts +6 -0
  126. package/resources/bundled-skills/app-builder/assets/scaffold/next.config.ts +8 -0
  127. package/resources/bundled-skills/app-builder/assets/scaffold/package.json +47 -0
  128. package/resources/bundled-skills/app-builder/assets/scaffold/playwright.config.ts +30 -0
  129. package/resources/bundled-skills/app-builder/assets/scaffold/pnpm-lock.yaml +2687 -0
  130. package/resources/bundled-skills/app-builder/assets/scaffold/postcss.config.mjs +5 -0
  131. package/resources/bundled-skills/app-builder/assets/scaffold/rudder.app.json +32 -0
  132. package/resources/bundled-skills/app-builder/assets/scaffold/scripts/migrate.ts +21 -0
  133. package/resources/bundled-skills/app-builder/assets/scaffold/scripts/seed.ts +31 -0
  134. package/resources/bundled-skills/app-builder/assets/scaffold/scripts/snapshot.ts +17 -0
  135. package/resources/bundled-skills/app-builder/assets/scaffold/tests/e2e/app.spec.ts +50 -0
  136. package/resources/bundled-skills/app-builder/assets/scaffold/tests/unit/data-transfer.test.ts +28 -0
  137. package/resources/bundled-skills/app-builder/assets/scaffold/tests/unit/domain.test.ts +23 -0
  138. package/resources/bundled-skills/app-builder/assets/scaffold/tsconfig.json +41 -0
  139. package/resources/bundled-skills/app-builder/assets/scaffold/vitest.config.ts +14 -0
  140. package/resources/bundled-skills/app-builder/evals/evals.json +53 -0
  141. package/resources/bundled-skills/app-builder/references/data-safety.md +38 -0
  142. package/resources/bundled-skills/app-builder/references/design-guidelines.md +20 -0
  143. package/resources/bundled-skills/app-builder/references/migrations-and-promotion.md +36 -0
  144. package/resources/bundled-skills/app-builder/references/scaffold-contract.md +62 -0
  145. package/resources/bundled-skills/app-builder/references/verification.md +23 -0
  146. package/resources/bundled-skills/app-builder/scripts/scaffold.mjs +58 -0
  147. package/resources/bundled-skills/app-builder/scripts/validate-manifest.mjs +63 -0
  148. package/skills/app-builder/SKILL.md +87 -0
  149. package/skills/app-builder/agents/openai.yaml +14 -0
  150. package/skills/app-builder/assets/scaffold/.env.example +3 -0
  151. package/skills/app-builder/assets/scaffold/app/api/%5F%5Frudder/health/route.ts +20 -0
  152. package/skills/app-builder/assets/scaffold/app/api/contacts/[id]/route.ts +39 -0
  153. package/skills/app-builder/assets/scaffold/app/api/contacts/route.ts +31 -0
  154. package/skills/app-builder/assets/scaffold/app/api/data/export/route.ts +19 -0
  155. package/skills/app-builder/assets/scaffold/app/api/data/import/route.ts +40 -0
  156. package/skills/app-builder/assets/scaffold/app/globals.css +32 -0
  157. package/skills/app-builder/assets/scaffold/app/layout.tsx +15 -0
  158. package/skills/app-builder/assets/scaffold/app/page.tsx +9 -0
  159. package/skills/app-builder/assets/scaffold/components/contacts-workspace.tsx +292 -0
  160. package/skills/app-builder/assets/scaffold/components/ui/button.tsx +42 -0
  161. package/skills/app-builder/assets/scaffold/components/ui/card.tsx +19 -0
  162. package/skills/app-builder/assets/scaffold/components/ui/input.tsx +17 -0
  163. package/skills/app-builder/assets/scaffold/components/ui/label.tsx +6 -0
  164. package/skills/app-builder/assets/scaffold/data/.gitkeep +1 -0
  165. package/skills/app-builder/assets/scaffold/drizzle.config.ts +18 -0
  166. package/skills/app-builder/assets/scaffold/instrumentation.ts +5 -0
  167. package/skills/app-builder/assets/scaffold/lib/data-transfer.ts +44 -0
  168. package/skills/app-builder/assets/scaffold/lib/db/client.ts +78 -0
  169. package/skills/app-builder/assets/scaffold/lib/db/schema.ts +35 -0
  170. package/skills/app-builder/assets/scaffold/lib/domain.ts +18 -0
  171. package/skills/app-builder/assets/scaffold/lib/jobs/runner.ts +56 -0
  172. package/skills/app-builder/assets/scaffold/lib/utils.ts +6 -0
  173. package/skills/app-builder/assets/scaffold/migrations/0000_app_builder_foundation.sql +27 -0
  174. package/skills/app-builder/assets/scaffold/migrations/meta/_journal.json +13 -0
  175. package/skills/app-builder/assets/scaffold/next-env.d.ts +6 -0
  176. package/skills/app-builder/assets/scaffold/next.config.ts +8 -0
  177. package/skills/app-builder/assets/scaffold/package.json +47 -0
  178. package/skills/app-builder/assets/scaffold/playwright.config.ts +30 -0
  179. package/skills/app-builder/assets/scaffold/pnpm-lock.yaml +2687 -0
  180. package/skills/app-builder/assets/scaffold/postcss.config.mjs +5 -0
  181. package/skills/app-builder/assets/scaffold/rudder.app.json +32 -0
  182. package/skills/app-builder/assets/scaffold/scripts/migrate.ts +21 -0
  183. package/skills/app-builder/assets/scaffold/scripts/seed.ts +31 -0
  184. package/skills/app-builder/assets/scaffold/scripts/snapshot.ts +17 -0
  185. package/skills/app-builder/assets/scaffold/tests/e2e/app.spec.ts +50 -0
  186. package/skills/app-builder/assets/scaffold/tests/unit/data-transfer.test.ts +28 -0
  187. package/skills/app-builder/assets/scaffold/tests/unit/domain.test.ts +23 -0
  188. package/skills/app-builder/assets/scaffold/tsconfig.json +41 -0
  189. package/skills/app-builder/assets/scaffold/vitest.config.ts +14 -0
  190. package/skills/app-builder/evals/evals.json +53 -0
  191. package/skills/app-builder/references/data-safety.md +38 -0
  192. package/skills/app-builder/references/design-guidelines.md +20 -0
  193. package/skills/app-builder/references/migrations-and-promotion.md +36 -0
  194. package/skills/app-builder/references/scaffold-contract.md +62 -0
  195. package/skills/app-builder/references/verification.md +23 -0
  196. package/skills/app-builder/scripts/scaffold.mjs +58 -0
  197. package/skills/app-builder/scripts/validate-manifest.mjs +63 -0
  198. package/ui-dist/assets/LibraryLiveSurface-Cd6wYgzJ.js +1 -0
  199. package/ui-dist/assets/{abnfDiagram-VRR7QNED-BdM6grBK.js → abnfDiagram-VRR7QNED-H2QkzWSq.js} +1 -1
  200. package/ui-dist/assets/{arc-B8Tukeix.js → arc-BIrLdSup.js} +1 -1
  201. package/ui-dist/assets/{architectureDiagram-ZJ3FMSHR-DP_lYJIS.js → architectureDiagram-ZJ3FMSHR-C68uQC9x.js} +1 -1
  202. package/ui-dist/assets/{blockDiagram-677ZJIJ3-D_QKZNjP.js → blockDiagram-677ZJIJ3-DolMzRCT.js} +1 -1
  203. package/ui-dist/assets/{c4Diagram-LMCZKHZV-DJwVavN4.js → c4Diagram-LMCZKHZV-U6f3_L6P.js} +1 -1
  204. package/ui-dist/assets/channel-B_YTptSv.js +1 -0
  205. package/ui-dist/assets/{chunk-2Q5K7J3B-BjdKg2cx.js → chunk-2Q5K7J3B-BRJijXIZ.js} +1 -1
  206. package/ui-dist/assets/{chunk-32BRIVSS-C_u4l725.js → chunk-32BRIVSS-Belug4Vy.js} +1 -1
  207. package/ui-dist/assets/{chunk-5VM5RSS4-DtzEQCc9.js → chunk-5VM5RSS4-BAP9C4WC.js} +1 -1
  208. package/ui-dist/assets/{chunk-EX3LRPZG-Ds_gCBVz.js → chunk-EX3LRPZG-BorLutQY.js} +1 -1
  209. package/ui-dist/assets/{chunk-JWPE2WC7-CHX9VuQf.js → chunk-JWPE2WC7-MCTTrlhK.js} +1 -1
  210. package/ui-dist/assets/{chunk-MOJQB5TN-D_pj9OWe.js → chunk-MOJQB5TN-BEBLFyze.js} +1 -1
  211. package/ui-dist/assets/{chunk-RYQCIY6F-aMYmnUaJ.js → chunk-RYQCIY6F-gzlBaUJ5.js} +1 -1
  212. package/ui-dist/assets/{chunk-V7JOEXUC-Db3LrL-P.js → chunk-V7JOEXUC-Djyk9uKC.js} +1 -1
  213. package/ui-dist/assets/{chunk-VR4S4FIN-BssuUpMr.js → chunk-VR4S4FIN-lxRoHimg.js} +1 -1
  214. package/ui-dist/assets/{chunk-XXDRQBXY-DVzY-_Tv.js → chunk-XXDRQBXY-Ceus5xtJ.js} +1 -1
  215. package/ui-dist/assets/classDiagram-OUVF2IWQ-iR-TAS1r.js +1 -0
  216. package/ui-dist/assets/classDiagram-v2-EOCWNBFH-iR-TAS1r.js +1 -0
  217. package/ui-dist/assets/{cose-bilkent-JH36ORCC-Ch-fM2pW.js → cose-bilkent-JH36ORCC-8gSFuEzG.js} +1 -1
  218. package/ui-dist/assets/{cynefin-VYW2F7L2-C7gJeesr.js → cynefin-VYW2F7L2-Sr3yYkcO.js} +1 -1
  219. package/ui-dist/assets/{cynefinDiagram-TSTJHNR4-BwMpD6aZ.js → cynefinDiagram-TSTJHNR4-BrgLR8Pm.js} +1 -1
  220. package/ui-dist/assets/{dagre-VKFMJZFB-8TgHu2tj.js → dagre-VKFMJZFB-BH4QYWTM.js} +1 -1
  221. package/ui-dist/assets/{diagram-FQU43EPY-ChODej8C.js → diagram-FQU43EPY-hpkOd3am.js} +1 -1
  222. package/ui-dist/assets/{diagram-G47NLZAW-CVq1GXvV.js → diagram-G47NLZAW-CSBB9Flk.js} +1 -1
  223. package/ui-dist/assets/{diagram-NH7WQ7WH-D1IO7xe3.js → diagram-NH7WQ7WH-CgNJflW8.js} +1 -1
  224. package/ui-dist/assets/{diagram-OA4YK3LP-CKlttJto.js → diagram-OA4YK3LP-DqQFUFQv.js} +1 -1
  225. package/ui-dist/assets/{diagram-WEI45ONY-DigjsORo.js → diagram-WEI45ONY-QAnSfiw3.js} +1 -1
  226. package/ui-dist/assets/{ebnfDiagram-CCIWWBDH-CZwO7RGO.js → ebnfDiagram-CCIWWBDH--YVRXF7-.js} +1 -1
  227. package/ui-dist/assets/{erDiagram-Q63AITRT-C3fFVPod.js → erDiagram-Q63AITRT-CRH_K_mE.js} +1 -1
  228. package/ui-dist/assets/{flowDiagram-23GEKE2U-CpccWfFo.js → flowDiagram-23GEKE2U-CwyXvJ5b.js} +1 -1
  229. package/ui-dist/assets/{ganttDiagram-NO4QXBWP-g3KL--4W.js → ganttDiagram-NO4QXBWP-B41Y9cwF.js} +1 -1
  230. package/ui-dist/assets/{gitGraphDiagram-IHSO6WYX-Bn59AW1B.js → gitGraphDiagram-IHSO6WYX-CW7LKrym.js} +1 -1
  231. package/ui-dist/assets/{graph-LZSMW9ku.js → graph-B2oDVjJO.js} +1 -1
  232. package/ui-dist/assets/{index-CrU5g0XU.js → index-3zFxfIXc.js} +565 -561
  233. package/ui-dist/assets/index-BDWwQIJI.js +1 -0
  234. package/ui-dist/assets/{index-CVwGLbgm.js → index-BOLgWo9p.js} +1 -1
  235. package/ui-dist/assets/{index-C3e6slEn.js → index-BdhCuwEn.js} +1 -1
  236. package/ui-dist/assets/{index-CPIoQKcG.js → index-BzBuqR8a.js} +1 -1
  237. package/ui-dist/assets/index-CJ8Y6mRU.js +7 -0
  238. package/ui-dist/assets/index-CNJdbN2c.js +1 -0
  239. package/ui-dist/assets/index-CRRh2Q50.js +1 -0
  240. package/ui-dist/assets/{index-BI9d3zXw.js → index-CS_SCGq-.js} +2 -2
  241. package/ui-dist/assets/{index-C5hYxLM9.js → index-CWZ6QjAd.js} +1 -1
  242. package/ui-dist/assets/index-CiBZqJye.js +1 -0
  243. package/ui-dist/assets/{index-BG46qMXw.js → index-D7jFNS5a.js} +1 -1
  244. package/ui-dist/assets/index-DEdvpket.js +1 -0
  245. package/ui-dist/assets/index-DQRYID5z.js +1 -0
  246. package/ui-dist/assets/index-DTv8W0av.css +1 -0
  247. package/ui-dist/assets/{index-BqhkUdAT.js → index-Df6CE5HD.js} +1 -1
  248. package/ui-dist/assets/{index-BLUJslyp.js → index-DhMy-JmC.js} +1 -1
  249. package/ui-dist/assets/{index-ZFb9ZHAH.js → index-Z1lC3yRm.js} +5 -5
  250. package/ui-dist/assets/index-_QsesMkH.js +1 -0
  251. package/ui-dist/assets/{infoDiagram-FWYZ7A6U-uxPSmmcv.js → infoDiagram-FWYZ7A6U-DyzTlql6.js} +1 -1
  252. package/ui-dist/assets/{ishikawaDiagram-FXEZZL3T-BeKQmaaL.js → ishikawaDiagram-FXEZZL3T-B9FXEgF4.js} +1 -1
  253. package/ui-dist/assets/{journeyDiagram-5HDEW3XC-Cnqh1Fyp.js → journeyDiagram-5HDEW3XC-BG_Kqf0Y.js} +1 -1
  254. package/ui-dist/assets/{kanban-definition-HUTT4EX6-DRvoG8e7.js → kanban-definition-HUTT4EX6-CIZgF9a-.js} +1 -1
  255. package/ui-dist/assets/{layout-By7bOuHZ.js → layout-ua-GqVIZ.js} +1 -1
  256. package/ui-dist/assets/{linear-D-kfwm1O.js → linear-CQqDskaQ.js} +1 -1
  257. package/ui-dist/assets/{map-d3zaWROJ.js → map-DFw_ZSS_.js} +1 -1
  258. package/ui-dist/assets/{mermaid.core-1JtOXpMA.js → mermaid.core-BVJ3bsf4.js} +4 -4
  259. package/ui-dist/assets/{mindmap-definition-LN4V7U3C-D8Jge-_m.js → mindmap-definition-LN4V7U3C-Dp1UsqtW.js} +1 -1
  260. package/ui-dist/assets/{pegDiagram-2B236MQR-UCd9-Gfd.js → pegDiagram-2B236MQR-BDUL53zP.js} +1 -1
  261. package/ui-dist/assets/{pieDiagram-ENE6RG2P-DffPYn-P.js → pieDiagram-ENE6RG2P-CgSzQLOQ.js} +1 -1
  262. package/ui-dist/assets/{quadrantDiagram-ABIIQ3AL-Ds1lQ25G.js → quadrantDiagram-ABIIQ3AL-B0YmTMhz.js} +1 -1
  263. package/ui-dist/assets/{railroadDiagram-RFXS5EU6-P_pLStbY.js → railroadDiagram-RFXS5EU6-BvTcxcz9.js} +1 -1
  264. package/ui-dist/assets/{requirementDiagram-TGXJPOKE-E_1U7w_T.js → requirementDiagram-TGXJPOKE-fkKI0lRC.js} +1 -1
  265. package/ui-dist/assets/{sankeyDiagram-HTMAVEWB-DFgwdZz7.js → sankeyDiagram-HTMAVEWB-BSOcxgQK.js} +1 -1
  266. package/ui-dist/assets/{sequenceDiagram-DBY2YBRQ-CbI2EnTH.js → sequenceDiagram-DBY2YBRQ-DrAQ-gvA.js} +1 -1
  267. package/ui-dist/assets/{sizeCapture-X5ZJPWSS-Axl0diWc.js → sizeCapture-X5ZJPWSS-CdXaDJu7.js} +1 -1
  268. package/ui-dist/assets/{stateDiagram-2N3HPSRC-DxZLENhX.js → stateDiagram-2N3HPSRC-CPtjImOw.js} +1 -1
  269. package/ui-dist/assets/stateDiagram-v2-6OUMAXLB-BntLUyuz.js +1 -0
  270. package/ui-dist/assets/{swimlanes-5IMT3BWC-1G26qvUm.js → swimlanes-5IMT3BWC-BiAgJ_7N.js} +2 -2
  271. package/ui-dist/assets/swimlanesDiagram-G3AALYLV-BwiyiniO.js +8 -0
  272. package/ui-dist/assets/{timeline-definition-FHXFAJF6-B0Ha5bZS.js → timeline-definition-FHXFAJF6-Biw5JBPT.js} +1 -1
  273. package/ui-dist/assets/{vennDiagram-L72KCM5P-BskD_1N5.js → vennDiagram-L72KCM5P-B2sQcNFx.js} +1 -1
  274. package/ui-dist/assets/{wardleyDiagram-EHGQE667-1wE4bYQ8.js → wardleyDiagram-EHGQE667-CKi9r9aK.js} +1 -1
  275. package/ui-dist/assets/{xychartDiagram-FW5EYKEG-DfcOAfb8.js → xychartDiagram-FW5EYKEG-D-0Bf_Kv.js} +1 -1
  276. package/ui-dist/index.html +2 -2
  277. package/ui-dist/assets/LibraryLiveSurface-CUgoFYvG.js +0 -1
  278. package/ui-dist/assets/channel-Cd4sqN24.js +0 -1
  279. package/ui-dist/assets/classDiagram-OUVF2IWQ-Bi3tsM-q.js +0 -1
  280. package/ui-dist/assets/classDiagram-v2-EOCWNBFH-Bi3tsM-q.js +0 -1
  281. package/ui-dist/assets/index-BQv2nBgV.js +0 -1
  282. package/ui-dist/assets/index-BkbdH2n-.js +0 -1
  283. package/ui-dist/assets/index-C-qWhcfC.css +0 -1
  284. package/ui-dist/assets/index-CLETiubs.js +0 -7
  285. package/ui-dist/assets/index-CLnCobCG.js +0 -1
  286. package/ui-dist/assets/index-CQLLvEua.js +0 -1
  287. package/ui-dist/assets/index-ChTD9DV4.js +0 -1
  288. package/ui-dist/assets/index-CiyYjAsy.js +0 -1
  289. package/ui-dist/assets/index-EqVfudOJ.js +0 -1
  290. package/ui-dist/assets/stateDiagram-v2-6OUMAXLB-KzYOpJ1T.js +0 -1
  291. package/ui-dist/assets/swimlanesDiagram-G3AALYLV--Vi3kUvi.js +0 -8
@@ -0,0 +1,241 @@
1
+ import { appBuilderApps, chatConversations, heartbeatRuns, projects, } from "@rudderhq/db";
2
+ import { and, desc, eq } from "drizzle-orm";
3
+ import { conflict, notFound, unprocessable } from "../errors.js";
4
+ function toAppBuilderApp(row) {
5
+ return {
6
+ id: row.id,
7
+ orgId: row.orgId,
8
+ projectId: row.projectId ?? null,
9
+ conversationId: row.conversationId ?? null,
10
+ name: row.name,
11
+ sourceRoot: row.sourceRoot,
12
+ scaffoldVersion: row.scaffoldVersion,
13
+ buildStatus: row.buildStatus,
14
+ latestBuildRunId: row.latestBuildRunId ?? null,
15
+ latestVerificationRunId: row.latestVerificationRunId ?? null,
16
+ desktopInstallationId: row.desktopInstallationId ?? null,
17
+ appPublicId: row.appPublicId ?? null,
18
+ localBindingId: row.localBindingId ?? null,
19
+ createdAt: row.createdAt,
20
+ updatedAt: row.updatedAt,
21
+ };
22
+ }
23
+ function postgresErrorCode(error) {
24
+ let current = error;
25
+ for (let depth = 0; depth < 4 && current && typeof current === "object"; depth += 1) {
26
+ const candidate = current;
27
+ if (typeof candidate.code === "string")
28
+ return candidate.code;
29
+ current = candidate.cause;
30
+ }
31
+ return null;
32
+ }
33
+ function isUniqueViolation(error) {
34
+ return postgresErrorCode(error) === "23505";
35
+ }
36
+ function readContextProjectId(contextSnapshot) {
37
+ const projectId = contextSnapshot?.projectId;
38
+ return typeof projectId === "string" && projectId.length > 0 ? projectId : null;
39
+ }
40
+ export function appBuilderService(db) {
41
+ async function assertProjectInOrganization(orgId, projectId) {
42
+ const [project] = await db
43
+ .select({ id: projects.id })
44
+ .from(projects)
45
+ .where(and(eq(projects.id, projectId), eq(projects.orgId, orgId)))
46
+ .limit(1);
47
+ if (!project)
48
+ throw notFound("Project not found");
49
+ }
50
+ async function assertConversationInOrganization(orgId, conversationId) {
51
+ const [conversation] = await db
52
+ .select({ id: chatConversations.id })
53
+ .from(chatConversations)
54
+ .where(and(eq(chatConversations.id, conversationId), eq(chatConversations.orgId, orgId)))
55
+ .limit(1);
56
+ if (!conversation) {
57
+ throw unprocessable("App Builder conversation must belong to the Project organization");
58
+ }
59
+ }
60
+ async function getRowById(orgId, appId) {
61
+ const [row] = await db
62
+ .select()
63
+ .from(appBuilderApps)
64
+ .where(and(eq(appBuilderApps.orgId, orgId), eq(appBuilderApps.id, appId)))
65
+ .limit(1);
66
+ return row ?? null;
67
+ }
68
+ async function requireRowById(orgId, appId) {
69
+ const row = await getRowById(orgId, appId);
70
+ if (!row)
71
+ throw notFound("App Builder app not found");
72
+ return row;
73
+ }
74
+ async function getRowForProject(orgId, projectId) {
75
+ const [row] = await db
76
+ .select()
77
+ .from(appBuilderApps)
78
+ .where(and(eq(appBuilderApps.orgId, orgId), eq(appBuilderApps.projectId, projectId)))
79
+ .limit(1);
80
+ return row ?? null;
81
+ }
82
+ async function assertRunScope(app, runId, runKind) {
83
+ const [run] = await db
84
+ .select({
85
+ id: heartbeatRuns.id,
86
+ chatConversationId: heartbeatRuns.chatConversationId,
87
+ contextSnapshot: heartbeatRuns.contextSnapshot,
88
+ })
89
+ .from(heartbeatRuns)
90
+ .where(and(eq(heartbeatRuns.id, runId), eq(heartbeatRuns.orgId, app.orgId)))
91
+ .limit(1);
92
+ if (!run) {
93
+ throw unprocessable(`The ${runKind} run must belong to the App Builder organization`);
94
+ }
95
+ if (app.projectId
96
+ && readContextProjectId(run.contextSnapshot) !== app.projectId) {
97
+ throw unprocessable(`The ${runKind} run must belong to the App Builder Project`);
98
+ }
99
+ if (app.conversationId && run.chatConversationId !== app.conversationId) {
100
+ throw unprocessable(`The ${runKind} run must belong to the App Builder conversation`);
101
+ }
102
+ }
103
+ return {
104
+ async listForOrganization(orgId) {
105
+ const rows = await db
106
+ .select()
107
+ .from(appBuilderApps)
108
+ .where(eq(appBuilderApps.orgId, orgId))
109
+ .orderBy(desc(appBuilderApps.updatedAt));
110
+ return rows.map(toAppBuilderApp);
111
+ },
112
+ async getForProject(orgId, projectId) {
113
+ const row = await getRowForProject(orgId, projectId);
114
+ return row ? toAppBuilderApp(row) : null;
115
+ },
116
+ async getById(orgId, appId) {
117
+ const row = await getRowById(orgId, appId);
118
+ return row ? toAppBuilderApp(row) : null;
119
+ },
120
+ async create(orgId, input) {
121
+ if (input.projectId) {
122
+ await assertProjectInOrganization(orgId, input.projectId);
123
+ }
124
+ if (input.conversationId) {
125
+ await assertConversationInOrganization(orgId, input.conversationId);
126
+ }
127
+ if (input.projectId) {
128
+ const existing = await getRowForProject(orgId, input.projectId);
129
+ if (existing) {
130
+ throw conflict("This Project already has an App Builder app");
131
+ }
132
+ }
133
+ const [sourceRootOwner] = await db
134
+ .select({ id: appBuilderApps.id })
135
+ .from(appBuilderApps)
136
+ .where(and(eq(appBuilderApps.orgId, orgId), eq(appBuilderApps.sourceRoot, input.sourceRoot)))
137
+ .limit(1);
138
+ if (sourceRootOwner) {
139
+ throw conflict("This App Builder source root is already in use");
140
+ }
141
+ try {
142
+ const [created] = await db
143
+ .insert(appBuilderApps)
144
+ .values({
145
+ orgId,
146
+ projectId: input.projectId ?? null,
147
+ conversationId: input.conversationId ?? null,
148
+ name: input.name,
149
+ sourceRoot: input.sourceRoot,
150
+ scaffoldVersion: input.scaffoldVersion,
151
+ buildStatus: "preparing",
152
+ })
153
+ .returning();
154
+ return toAppBuilderApp(created);
155
+ }
156
+ catch (error) {
157
+ if (isUniqueViolation(error)) {
158
+ throw conflict("The Project or source root already has an App Builder app");
159
+ }
160
+ throw error;
161
+ }
162
+ },
163
+ async updateBuild(orgId, appId, input) {
164
+ const existing = await requireRowById(orgId, appId);
165
+ if (input.runId) {
166
+ await assertRunScope(existing, input.runId, input.runKind);
167
+ }
168
+ const runUpdate = "runId" in input
169
+ ? input.runKind === "verification"
170
+ ? { latestVerificationRunId: input.runId ?? null }
171
+ : { latestBuildRunId: input.runId ?? null }
172
+ : {};
173
+ const updateScope = input.expectedStatus
174
+ ? and(eq(appBuilderApps.orgId, orgId), eq(appBuilderApps.id, appId), eq(appBuilderApps.buildStatus, input.expectedStatus))
175
+ : and(eq(appBuilderApps.orgId, orgId), eq(appBuilderApps.id, appId));
176
+ const [updated] = await db
177
+ .update(appBuilderApps)
178
+ .set({
179
+ buildStatus: input.status,
180
+ ...runUpdate,
181
+ updatedAt: new Date(),
182
+ })
183
+ .where(updateScope)
184
+ .returning();
185
+ if (!updated) {
186
+ throw conflict("The App build state changed in another window");
187
+ }
188
+ return toAppBuilderApp(updated);
189
+ },
190
+ async attachConversation(orgId, appId, input) {
191
+ await requireRowById(orgId, appId);
192
+ await assertConversationInOrganization(orgId, input.conversationId);
193
+ const [updated] = await db
194
+ .update(appBuilderApps)
195
+ .set({
196
+ conversationId: input.conversationId,
197
+ updatedAt: new Date(),
198
+ })
199
+ .where(and(eq(appBuilderApps.orgId, orgId), eq(appBuilderApps.id, appId)))
200
+ .returning();
201
+ return toAppBuilderApp(updated);
202
+ },
203
+ async bindLocalRuntime(orgId, appId, binding) {
204
+ await requireRowById(orgId, appId);
205
+ try {
206
+ const [updated] = await db
207
+ .update(appBuilderApps)
208
+ .set({
209
+ desktopInstallationId: binding.desktopInstallationId,
210
+ appPublicId: binding.appPublicId,
211
+ localBindingId: binding.localBindingId,
212
+ updatedAt: new Date(),
213
+ })
214
+ .where(and(eq(appBuilderApps.orgId, orgId), eq(appBuilderApps.id, appId)))
215
+ .returning();
216
+ return toAppBuilderApp(updated);
217
+ }
218
+ catch (error) {
219
+ if (isUniqueViolation(error)) {
220
+ throw conflict("This local App Builder binding is already in use");
221
+ }
222
+ throw error;
223
+ }
224
+ },
225
+ async clearLocalBinding(orgId, appId) {
226
+ await requireRowById(orgId, appId);
227
+ const [updated] = await db
228
+ .update(appBuilderApps)
229
+ .set({
230
+ desktopInstallationId: null,
231
+ appPublicId: null,
232
+ localBindingId: null,
233
+ updatedAt: new Date(),
234
+ })
235
+ .where(and(eq(appBuilderApps.orgId, orgId), eq(appBuilderApps.id, appId)))
236
+ .returning();
237
+ return toAppBuilderApp(updated);
238
+ },
239
+ };
240
+ }
241
+ //# sourceMappingURL=app-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-builder.js","sourceRoot":"","sources":["../../src/services/app-builder.ts"],"names":[],"mappings":"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"}
@@ -455,9 +455,9 @@ export declare function approvalService(db: Db): {
455
455
  status: string;
456
456
  id: string;
457
457
  updatedAt: Date;
458
+ type: string;
458
459
  orgId: string;
459
460
  createdAt: Date;
460
- type: string;
461
461
  payload: Record<string, unknown>;
462
462
  decisionNote: string | null;
463
463
  requestedByAgentId: string | null;
@@ -470,9 +470,9 @@ export declare function approvalService(db: Db): {
470
470
  status: string;
471
471
  id: string;
472
472
  updatedAt: Date;
473
+ type: string;
473
474
  orgId: string;
474
475
  createdAt: Date;
475
- type: string;
476
476
  payload: Record<string, unknown>;
477
477
  decisionNote: string | null;
478
478
  requestedByAgentId: string | null;
@@ -487,9 +487,9 @@ export declare function approvalService(db: Db): {
487
487
  status: string;
488
488
  id: string;
489
489
  updatedAt: Date;
490
+ type: string;
490
491
  orgId: string;
491
492
  createdAt: Date;
492
- type: string;
493
493
  payload: Record<string, unknown>;
494
494
  decisionNote: string | null;
495
495
  requestedByAgentId: string | null;
@@ -26,7 +26,7 @@ export declare function budgetService(db: Db, hooks?: BudgetServiceHooks): {
26
26
  }>;
27
27
  overview: (orgId: string) => Promise<BudgetOverview>;
28
28
  evaluateCostEvent: (event: typeof costEvents.$inferSelect) => Promise<void>;
29
- getInvocationBlock: (orgId: string, agentId: string, context?: {
29
+ getInvocationBlock: (orgId: string, agentId: string, _context?: {
30
30
  issueId?: string | null;
31
31
  projectId?: string | null;
32
32
  }) => Promise<{
@@ -39,11 +39,6 @@ export declare function budgetService(db: Db, hooks?: BudgetServiceHooks): {
39
39
  scopeId: string;
40
40
  scopeName: string;
41
41
  reason: string;
42
- } | {
43
- scopeType: "project";
44
- scopeId: string;
45
- scopeName: string;
46
- reason: string;
47
42
  } | null>;
48
43
  resolveIncident: (orgId: string, incidentId: string, input: BudgetIncidentResolutionInput, actorUserId: string) => Promise<BudgetIncident>;
49
44
  };
@@ -1 +1 @@
1
- {"version":3,"file":"budgets.d.ts","sourceRoot":"","sources":["../../src/services/budgets.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAKL,UAAU,EAGX,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EACV,cAAc,EACd,6BAA6B,EAE7B,cAAc,EACd,YAAY,EACZ,mBAAmB,EACnB,uBAAuB,EACvB,eAAe,EAGhB,MAAM,kBAAkB,CAAC;AAe1B,MAAM,MAAM,sBAAsB,GAAG;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,eAAe,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvE,CAAC;AAuKF,wBAAgB,aAAa,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,GAAE,kBAAuB;0BA+RpC,MAAM,KAAG,OAAO,CAAC,YAAY,EAAE,CAAC;0BAWnD,MAAM,SACN,uBAAuB,eACjB,MAAM,GAAG,IAAI,KACzB,OAAO,CAAC,mBAAmB,CAAC;0BAuHtB,MAAM,YACH,MAAM,eACH,MAAM,GAAG,IAAI,KACzB,OAAO,CAAC;QAAE,EAAE,EAAE,IAAI,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;sBAuElB,MAAM,KAAG,OAAO,CAAC,cAAc,CAAC;+BAoBvB,OAAO,UAAU,CAAC,YAAY;gCAsEtD,MAAM,WACJ,MAAM,YACL;QAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE;;;;;;;;;;;;;;;;6BAkJzD,MAAM,cACD,MAAM,SACX,6BAA6B,eACvB,MAAM,KAClB,OAAO,CAAC,cAAc,CAAC;EAyF7B"}
1
+ {"version":3,"file":"budgets.d.ts","sourceRoot":"","sources":["../../src/services/budgets.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAKL,UAAU,EAEX,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EACV,cAAc,EACd,6BAA6B,EAE7B,cAAc,EACd,YAAY,EACZ,mBAAmB,EACnB,uBAAuB,EACvB,eAAe,EAGhB,MAAM,kBAAkB,CAAC;AAe1B,MAAM,MAAM,sBAAsB,GAAG;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,eAAe,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvE,CAAC;AAkJF,wBAAgB,aAAa,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,GAAE,kBAAuB;0BAuQpC,MAAM,KAAG,OAAO,CAAC,YAAY,EAAE,CAAC;0BAanD,MAAM,SACN,uBAAuB,eACjB,MAAM,GAAG,IAAI,KACzB,OAAO,CAAC,mBAAmB,CAAC;0BAuHtB,MAAM,YACH,MAAM,eACH,MAAM,GAAG,IAAI,KACzB,OAAO,CAAC;QAAE,EAAE,EAAE,IAAI,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;sBA2ElB,MAAM,KAAG,OAAO,CAAC,cAAc,CAAC;+BAyBvB,OAAO,UAAU,CAAC,YAAY;gCAqEtD,MAAM,WACJ,MAAM,aACJ;QAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE;;;;;;;;;;;6BAmG1D,MAAM,cACD,MAAM,SACX,6BAA6B,eACvB,MAAM,KAClB,OAAO,CAAC,cAAc,CAAC;EAoG7B"}
@@ -1,4 +1,4 @@
1
- import { agents, approvals, budgetIncidents, budgetPolicies, costEvents, organizations, projects, } from "@rudderhq/db";
1
+ import { agents, approvals, budgetIncidents, budgetPolicies, costEvents, organizations, } from "@rudderhq/db";
2
2
  import { and, desc, eq, gte, inArray, lt, ne, sql } from "drizzle-orm";
3
3
  import { notFound, unprocessable } from "../errors.js";
4
4
  import { logActivity } from "./activity-log.js";
@@ -54,42 +54,22 @@ async function resolveScopeRecord(db, scopeType, scopeId) {
54
54
  pauseReason: row.pauseReason ?? null,
55
55
  };
56
56
  }
57
- if (scopeType === "agent") {
58
- const row = await db
59
- .select({
60
- orgId: agents.orgId,
61
- name: agents.name,
62
- status: agents.status,
63
- pauseReason: agents.pauseReason,
64
- })
65
- .from(agents)
66
- .where(eq(agents.id, scopeId))
67
- .then((rows) => rows[0] ?? null);
68
- if (!row)
69
- throw notFound("Agent not found");
70
- return {
71
- orgId: row.orgId,
72
- name: row.name,
73
- paused: row.status === "paused",
74
- pauseReason: row.pauseReason ?? null,
75
- };
76
- }
77
57
  const row = await db
78
58
  .select({
79
- orgId: projects.orgId,
80
- name: projects.name,
81
- pauseReason: projects.pauseReason,
82
- pausedAt: projects.pausedAt,
59
+ orgId: agents.orgId,
60
+ name: agents.name,
61
+ status: agents.status,
62
+ pauseReason: agents.pauseReason,
83
63
  })
84
- .from(projects)
85
- .where(eq(projects.id, scopeId))
64
+ .from(agents)
65
+ .where(eq(agents.id, scopeId))
86
66
  .then((rows) => rows[0] ?? null);
87
67
  if (!row)
88
- throw notFound("Project not found");
68
+ throw notFound("Agent not found");
89
69
  return {
90
70
  orgId: row.orgId,
91
71
  name: row.name,
92
- paused: Boolean(row.pausedAt),
72
+ paused: row.status === "paused",
93
73
  pauseReason: row.pauseReason ?? null,
94
74
  };
95
75
  }
@@ -99,8 +79,6 @@ async function computeObservedAmount(db, policy) {
99
79
  const conditions = [eq(costEvents.orgId, policy.orgId)];
100
80
  if (policy.scopeType === "agent")
101
81
  conditions.push(eq(costEvents.agentId, policy.scopeId));
102
- if (policy.scopeType === "project")
103
- conditions.push(eq(costEvents.projectId, policy.scopeId));
104
82
  const { start, end } = resolveWindow(policy.windowKind);
105
83
  if (policy.windowKind === "calendar_month_utc") {
106
84
  conditions.push(gte(costEvents.occurredAt, start));
@@ -160,17 +138,6 @@ export function budgetService(db, hooks = {}) {
160
138
  .where(and(eq(agents.id, policy.scopeId), inArray(agents.status, ["active", "idle", "running", "error"])));
161
139
  return;
162
140
  }
163
- if (policy.scopeType === "project") {
164
- await db
165
- .update(projects)
166
- .set({
167
- pauseReason: "budget",
168
- pausedAt: now,
169
- updatedAt: now,
170
- })
171
- .where(eq(projects.id, policy.scopeId));
172
- return;
173
- }
174
141
  await db
175
142
  .update(organizations)
176
143
  .set({
@@ -203,17 +170,6 @@ export function budgetService(db, hooks = {}) {
203
170
  .where(and(eq(agents.id, policy.scopeId), eq(agents.pauseReason, "budget")));
204
171
  return;
205
172
  }
206
- if (policy.scopeType === "project") {
207
- await database
208
- .update(projects)
209
- .set({
210
- pauseReason: null,
211
- pausedAt: null,
212
- updatedAt: now,
213
- })
214
- .where(and(eq(projects.id, policy.scopeId), eq(projects.pauseReason, "budget")));
215
- return;
216
- }
217
173
  await database
218
174
  .update(organizations)
219
175
  .set({
@@ -392,7 +348,9 @@ export function budgetService(db, hooks = {}) {
392
348
  return {
393
349
  listPolicies: async (orgId) => {
394
350
  const rows = await listPolicyRows(orgId);
395
- return rows.map((row) => ({
351
+ return rows
352
+ .filter((row) => row.scopeType === "organization" || row.scopeType === "agent")
353
+ .map((row) => ({
396
354
  ...row,
397
355
  scopeType: row.scopeType,
398
356
  metric: row.metric,
@@ -405,7 +363,7 @@ export function budgetService(db, hooks = {}) {
405
363
  throw unprocessable("Budget scope does not belong to organization");
406
364
  }
407
365
  const metric = input.metric ?? "billed_cents";
408
- const windowKind = input.windowKind ?? (input.scopeType === "project" ? "lifetime" : "calendar_month_utc");
366
+ const windowKind = input.windowKind ?? "calendar_month_utc";
409
367
  const amount = Math.max(0, Math.floor(input.amount));
410
368
  const nextIsActive = amount > 0 && (input.isActive ?? true);
411
369
  const existing = await db
@@ -507,7 +465,9 @@ export function budgetService(db, hooks = {}) {
507
465
  return db.transaction(async (tx) => {
508
466
  const txDb = tx;
509
467
  const policy = await getPolicyRow(policyId, txDb);
510
- if (policy.orgId !== orgId || !policy.isActive) {
468
+ if (policy.orgId !== orgId
469
+ || !policy.isActive
470
+ || (policy.scopeType !== "organization" && policy.scopeType !== "agent")) {
511
471
  throw notFound("Budget policy not found");
512
472
  }
513
473
  const now = new Date();
@@ -564,12 +524,12 @@ export function budgetService(db, hooks = {}) {
564
524
  },
565
525
  overview: async (orgId) => {
566
526
  const rows = await listPolicyRows(orgId);
567
- const activeRows = rows.filter((row) => row.isActive);
527
+ const activeRows = rows.filter((row) => row.isActive && (row.scopeType === "organization" || row.scopeType === "agent"));
568
528
  const policies = await Promise.all(activeRows.map((row) => buildPolicySummary(row)));
569
529
  const activeIncidentRows = await db
570
530
  .select()
571
531
  .from(budgetIncidents)
572
- .where(and(eq(budgetIncidents.orgId, orgId), eq(budgetIncidents.status, "open")))
532
+ .where(and(eq(budgetIncidents.orgId, orgId), eq(budgetIncidents.status, "open"), inArray(budgetIncidents.scopeType, ["organization", "agent"])))
573
533
  .orderBy(desc(budgetIncidents.createdAt));
574
534
  const activeIncidents = await hydrateIncidentRows(activeIncidentRows);
575
535
  return {
@@ -577,7 +537,6 @@ export function budgetService(db, hooks = {}) {
577
537
  policies,
578
538
  activeIncidents,
579
539
  pausedAgentCount: policies.filter((policy) => policy.scopeType === "agent" && policy.paused).length,
580
- pausedProjectCount: policies.filter((policy) => policy.scopeType === "project" && policy.paused).length,
581
540
  pendingApprovalCount: activeIncidents.filter((incident) => incident.approvalStatus === "pending").length,
582
541
  };
583
542
  },
@@ -585,14 +544,12 @@ export function budgetService(db, hooks = {}) {
585
544
  const candidatePolicies = await db
586
545
  .select()
587
546
  .from(budgetPolicies)
588
- .where(and(eq(budgetPolicies.orgId, event.orgId), eq(budgetPolicies.isActive, true), inArray(budgetPolicies.scopeType, ["organization", "agent", "project"])));
547
+ .where(and(eq(budgetPolicies.orgId, event.orgId), eq(budgetPolicies.isActive, true), inArray(budgetPolicies.scopeType, ["organization", "agent"])));
589
548
  const relevantPolicies = candidatePolicies.filter((policy) => {
590
549
  if (policy.scopeType === "organization")
591
550
  return policy.scopeId === event.orgId;
592
551
  if (policy.scopeType === "agent")
593
552
  return policy.scopeId === event.agentId;
594
- if (policy.scopeType === "project")
595
- return Boolean(event.projectId) && policy.scopeId === event.projectId;
596
553
  return false;
597
554
  });
598
555
  for (const policy of relevantPolicies) {
@@ -643,7 +600,7 @@ export function budgetService(db, hooks = {}) {
643
600
  }
644
601
  }
645
602
  },
646
- getInvocationBlock: async (orgId, agentId, context) => {
603
+ getInvocationBlock: async (orgId, agentId, _context) => {
647
604
  const agent = await db
648
605
  .select({
649
606
  status: agents.status,
@@ -717,46 +674,7 @@ export function budgetService(db, hooks = {}) {
717
674
  };
718
675
  }
719
676
  }
720
- const candidateProjectId = context?.projectId ?? null;
721
- if (!candidateProjectId)
722
- return null;
723
- const project = await db
724
- .select({
725
- id: projects.id,
726
- name: projects.name,
727
- orgId: projects.orgId,
728
- pauseReason: projects.pauseReason,
729
- pausedAt: projects.pausedAt,
730
- })
731
- .from(projects)
732
- .where(eq(projects.id, candidateProjectId))
733
- .then((rows) => rows[0] ?? null);
734
- if (!project || project.orgId !== orgId)
735
- return null;
736
- const projectPolicy = await db
737
- .select()
738
- .from(budgetPolicies)
739
- .where(and(eq(budgetPolicies.orgId, orgId), eq(budgetPolicies.scopeType, "project"), eq(budgetPolicies.scopeId, project.id), eq(budgetPolicies.isActive, true), eq(budgetPolicies.metric, "billed_cents")))
740
- .then((rows) => rows[0] ?? null);
741
- if (projectPolicy && projectPolicy.hardStopEnabled && projectPolicy.amount > 0) {
742
- const observed = await computeObservedAmount(db, projectPolicy);
743
- if (observed >= projectPolicy.amount) {
744
- return {
745
- scopeType: "project",
746
- scopeId: project.id,
747
- scopeName: project.name,
748
- reason: "Project cannot start work because its budget hard-stop is still exceeded.",
749
- };
750
- }
751
- }
752
- if (!project.pausedAt || project.pauseReason !== "budget")
753
- return null;
754
- return {
755
- scopeType: "project",
756
- scopeId: project.id,
757
- scopeName: project.name,
758
- reason: "Project is paused because its budget hard-stop was reached.",
759
- };
677
+ return null;
760
678
  },
761
679
  resolveIncident: async (orgId, incidentId, input, actorUserId) => {
762
680
  const incident = await db
@@ -768,7 +686,16 @@ export function budgetService(db, hooks = {}) {
768
686
  throw notFound("Budget incident not found");
769
687
  if (incident.orgId !== orgId)
770
688
  throw notFound("Budget incident not found");
689
+ if (incident.scopeType !== "organization" && incident.scopeType !== "agent") {
690
+ throw notFound("Budget incident not found");
691
+ }
771
692
  const policy = await getPolicyRow(incident.policyId);
693
+ if (policy.orgId !== orgId
694
+ || policy.scopeType !== incident.scopeType
695
+ || policy.scopeId !== incident.scopeId
696
+ || (policy.scopeType !== "organization" && policy.scopeType !== "agent")) {
697
+ throw notFound("Budget incident not found");
698
+ }
772
699
  if (input.action === "raise_budget_and_resume") {
773
700
  const nextAmount = Math.max(0, Math.floor(input.amount ?? 0));
774
701
  const currentObserved = await computeObservedAmount(db, policy);