@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.
- package/dist/bootstrap/register-api-routes.d.ts.map +1 -1
- package/dist/bootstrap/register-api-routes.js +2 -0
- package/dist/bootstrap/register-api-routes.js.map +1 -1
- package/dist/bundled-plugins/plugin-linear/dist/worker.js +77 -5
- package/dist/bundled-plugins/plugin-linear/dist/worker.js.map +3 -3
- package/dist/routes/access.d.ts.map +1 -1
- package/dist/routes/access.js +6 -0
- package/dist/routes/access.js.map +1 -1
- package/dist/routes/app-builder.d.ts +3 -0
- package/dist/routes/app-builder.d.ts.map +1 -0
- package/dist/routes/app-builder.js +305 -0
- package/dist/routes/app-builder.js.map +1 -0
- package/dist/routes/health.d.ts.map +1 -1
- package/dist/routes/health.js +1 -0
- package/dist/routes/health.js.map +1 -1
- package/dist/routes/index.d.ts +1 -0
- package/dist/routes/index.d.ts.map +1 -1
- package/dist/routes/index.js +1 -0
- package/dist/routes/index.js.map +1 -1
- package/dist/routes/issues.mutations.d.ts.map +1 -1
- package/dist/routes/issues.mutations.js +1 -5
- package/dist/routes/issues.mutations.js.map +1 -1
- package/dist/services/agent-run-context.d.ts.map +1 -1
- package/dist/services/agent-run-context.js +8 -2
- package/dist/services/agent-run-context.js.map +1 -1
- package/dist/services/agents.d.ts +13 -13
- package/dist/services/app-builder.d.ts +13 -0
- package/dist/services/app-builder.d.ts.map +1 -0
- package/dist/services/app-builder.js +241 -0
- package/dist/services/app-builder.js.map +1 -0
- package/dist/services/approvals.d.ts +3 -3
- package/dist/services/budgets.d.ts +1 -6
- package/dist/services/budgets.d.ts.map +1 -1
- package/dist/services/budgets.js +30 -103
- package/dist/services/budgets.js.map +1 -1
- package/dist/services/chat-annotation-copy-lineage.d.ts.map +1 -1
- package/dist/services/chat-annotation-copy-lineage.js +6 -1
- package/dist/services/chat-annotation-copy-lineage.js.map +1 -1
- package/dist/services/chat-assistant.annotations.d.ts.map +1 -1
- package/dist/services/chat-assistant.annotations.js +4 -1
- package/dist/services/chat-assistant.annotations.js.map +1 -1
- package/dist/services/chat-assistant.annotations.test.js +18 -2
- package/dist/services/chat-assistant.annotations.test.js.map +1 -1
- package/dist/services/chat-inline-annotation-validation.d.ts.map +1 -1
- package/dist/services/chat-inline-annotation-validation.js +75 -7
- package/dist/services/chat-inline-annotation-validation.js.map +1 -1
- package/dist/services/chat-inline-annotations.test.js +113 -0
- package/dist/services/chat-inline-annotations.test.js.map +1 -1
- package/dist/services/chat-message-branch.d.ts +5 -0
- package/dist/services/chat-message-branch.d.ts.map +1 -0
- package/dist/services/chat-message-branch.js +9 -0
- package/dist/services/chat-message-branch.js.map +1 -0
- package/dist/services/chat-work-manifest.d.ts.map +1 -1
- package/dist/services/chat-work-manifest.js +6 -0
- package/dist/services/chat-work-manifest.js.map +1 -1
- package/dist/services/chats.d.ts +12 -12
- package/dist/services/chats.d.ts.map +1 -1
- package/dist/services/chats.inline-visual-persistence.d.ts.map +1 -1
- package/dist/services/chats.inline-visual-persistence.js +7 -0
- package/dist/services/chats.inline-visual-persistence.js.map +1 -1
- package/dist/services/chats.js +12 -11
- package/dist/services/chats.js.map +1 -1
- package/dist/services/dashboard.d.ts +0 -1
- package/dist/services/dashboard.d.ts.map +1 -1
- package/dist/services/dashboard.js +0 -1
- package/dist/services/dashboard.js.map +1 -1
- package/dist/services/index.d.ts +1 -0
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +1 -0
- package/dist/services/index.js.map +1 -1
- package/dist/services/instance-settings.d.ts.map +1 -1
- package/dist/services/instance-settings.js +4 -6
- package/dist/services/instance-settings.js.map +1 -1
- package/dist/services/issue-approvals.d.ts +1 -1
- package/dist/services/issues.d.ts +2 -2
- package/dist/services/knowledge-portability/organization-skills.d.ts.map +1 -1
- package/dist/services/knowledge-portability/organization-skills.js +6 -2
- package/dist/services/knowledge-portability/organization-skills.js.map +1 -1
- package/dist/services/legacy-operator-state.d.ts +14 -0
- package/dist/services/legacy-operator-state.d.ts.map +1 -0
- package/dist/services/legacy-operator-state.js +245 -0
- package/dist/services/legacy-operator-state.js.map +1 -0
- package/dist/services/local-account-auth.d.ts.map +1 -1
- package/dist/services/local-account-auth.js +21 -3
- package/dist/services/local-account-auth.js.map +1 -1
- package/dist/services/messenger.d.ts +3 -3
- package/dist/services/orgs.d.ts +1 -1
- package/dist/services/projects.d.ts +1 -1
- package/dist/services/runtime-kernel/heartbeat.d.ts.map +1 -1
- package/dist/services/runtime-kernel/heartbeat.misc.d.ts.map +1 -1
- package/dist/services/runtime-kernel/heartbeat.misc.js +5 -10
- package/dist/services/runtime-kernel/heartbeat.misc.js.map +1 -1
- package/dist/services/secrets.d.ts +1 -1
- package/dist/services/side-chats.d.ts.map +1 -1
- package/dist/services/side-chats.js +30 -15
- package/dist/services/side-chats.js.map +1 -1
- package/package.json +14 -14
- package/resources/bundled-skills/app-builder/SKILL.md +87 -0
- package/resources/bundled-skills/app-builder/agents/openai.yaml +14 -0
- package/resources/bundled-skills/app-builder/assets/scaffold/.env.example +3 -0
- package/resources/bundled-skills/app-builder/assets/scaffold/app/api/%5F%5Frudder/health/route.ts +20 -0
- package/resources/bundled-skills/app-builder/assets/scaffold/app/api/contacts/[id]/route.ts +39 -0
- package/resources/bundled-skills/app-builder/assets/scaffold/app/api/contacts/route.ts +31 -0
- package/resources/bundled-skills/app-builder/assets/scaffold/app/api/data/export/route.ts +19 -0
- package/resources/bundled-skills/app-builder/assets/scaffold/app/api/data/import/route.ts +40 -0
- package/resources/bundled-skills/app-builder/assets/scaffold/app/globals.css +32 -0
- package/resources/bundled-skills/app-builder/assets/scaffold/app/layout.tsx +15 -0
- package/resources/bundled-skills/app-builder/assets/scaffold/app/page.tsx +9 -0
- package/resources/bundled-skills/app-builder/assets/scaffold/components/contacts-workspace.tsx +292 -0
- package/resources/bundled-skills/app-builder/assets/scaffold/components/ui/button.tsx +42 -0
- package/resources/bundled-skills/app-builder/assets/scaffold/components/ui/card.tsx +19 -0
- package/resources/bundled-skills/app-builder/assets/scaffold/components/ui/input.tsx +17 -0
- package/resources/bundled-skills/app-builder/assets/scaffold/components/ui/label.tsx +6 -0
- package/resources/bundled-skills/app-builder/assets/scaffold/data/.gitkeep +1 -0
- package/resources/bundled-skills/app-builder/assets/scaffold/drizzle.config.ts +18 -0
- package/resources/bundled-skills/app-builder/assets/scaffold/instrumentation.ts +5 -0
- package/resources/bundled-skills/app-builder/assets/scaffold/lib/data-transfer.ts +44 -0
- package/resources/bundled-skills/app-builder/assets/scaffold/lib/db/client.ts +78 -0
- package/resources/bundled-skills/app-builder/assets/scaffold/lib/db/schema.ts +35 -0
- package/resources/bundled-skills/app-builder/assets/scaffold/lib/domain.ts +18 -0
- package/resources/bundled-skills/app-builder/assets/scaffold/lib/jobs/runner.ts +56 -0
- package/resources/bundled-skills/app-builder/assets/scaffold/lib/utils.ts +6 -0
- package/resources/bundled-skills/app-builder/assets/scaffold/migrations/0000_app_builder_foundation.sql +27 -0
- package/resources/bundled-skills/app-builder/assets/scaffold/migrations/meta/_journal.json +13 -0
- package/resources/bundled-skills/app-builder/assets/scaffold/next-env.d.ts +6 -0
- package/resources/bundled-skills/app-builder/assets/scaffold/next.config.ts +8 -0
- package/resources/bundled-skills/app-builder/assets/scaffold/package.json +47 -0
- package/resources/bundled-skills/app-builder/assets/scaffold/playwright.config.ts +30 -0
- package/resources/bundled-skills/app-builder/assets/scaffold/pnpm-lock.yaml +2687 -0
- package/resources/bundled-skills/app-builder/assets/scaffold/postcss.config.mjs +5 -0
- package/resources/bundled-skills/app-builder/assets/scaffold/rudder.app.json +32 -0
- package/resources/bundled-skills/app-builder/assets/scaffold/scripts/migrate.ts +21 -0
- package/resources/bundled-skills/app-builder/assets/scaffold/scripts/seed.ts +31 -0
- package/resources/bundled-skills/app-builder/assets/scaffold/scripts/snapshot.ts +17 -0
- package/resources/bundled-skills/app-builder/assets/scaffold/tests/e2e/app.spec.ts +50 -0
- package/resources/bundled-skills/app-builder/assets/scaffold/tests/unit/data-transfer.test.ts +28 -0
- package/resources/bundled-skills/app-builder/assets/scaffold/tests/unit/domain.test.ts +23 -0
- package/resources/bundled-skills/app-builder/assets/scaffold/tsconfig.json +41 -0
- package/resources/bundled-skills/app-builder/assets/scaffold/vitest.config.ts +14 -0
- package/resources/bundled-skills/app-builder/evals/evals.json +53 -0
- package/resources/bundled-skills/app-builder/references/data-safety.md +38 -0
- package/resources/bundled-skills/app-builder/references/design-guidelines.md +20 -0
- package/resources/bundled-skills/app-builder/references/migrations-and-promotion.md +36 -0
- package/resources/bundled-skills/app-builder/references/scaffold-contract.md +62 -0
- package/resources/bundled-skills/app-builder/references/verification.md +23 -0
- package/resources/bundled-skills/app-builder/scripts/scaffold.mjs +58 -0
- package/resources/bundled-skills/app-builder/scripts/validate-manifest.mjs +63 -0
- package/skills/app-builder/SKILL.md +87 -0
- package/skills/app-builder/agents/openai.yaml +14 -0
- package/skills/app-builder/assets/scaffold/.env.example +3 -0
- package/skills/app-builder/assets/scaffold/app/api/%5F%5Frudder/health/route.ts +20 -0
- package/skills/app-builder/assets/scaffold/app/api/contacts/[id]/route.ts +39 -0
- package/skills/app-builder/assets/scaffold/app/api/contacts/route.ts +31 -0
- package/skills/app-builder/assets/scaffold/app/api/data/export/route.ts +19 -0
- package/skills/app-builder/assets/scaffold/app/api/data/import/route.ts +40 -0
- package/skills/app-builder/assets/scaffold/app/globals.css +32 -0
- package/skills/app-builder/assets/scaffold/app/layout.tsx +15 -0
- package/skills/app-builder/assets/scaffold/app/page.tsx +9 -0
- package/skills/app-builder/assets/scaffold/components/contacts-workspace.tsx +292 -0
- package/skills/app-builder/assets/scaffold/components/ui/button.tsx +42 -0
- package/skills/app-builder/assets/scaffold/components/ui/card.tsx +19 -0
- package/skills/app-builder/assets/scaffold/components/ui/input.tsx +17 -0
- package/skills/app-builder/assets/scaffold/components/ui/label.tsx +6 -0
- package/skills/app-builder/assets/scaffold/data/.gitkeep +1 -0
- package/skills/app-builder/assets/scaffold/drizzle.config.ts +18 -0
- package/skills/app-builder/assets/scaffold/instrumentation.ts +5 -0
- package/skills/app-builder/assets/scaffold/lib/data-transfer.ts +44 -0
- package/skills/app-builder/assets/scaffold/lib/db/client.ts +78 -0
- package/skills/app-builder/assets/scaffold/lib/db/schema.ts +35 -0
- package/skills/app-builder/assets/scaffold/lib/domain.ts +18 -0
- package/skills/app-builder/assets/scaffold/lib/jobs/runner.ts +56 -0
- package/skills/app-builder/assets/scaffold/lib/utils.ts +6 -0
- package/skills/app-builder/assets/scaffold/migrations/0000_app_builder_foundation.sql +27 -0
- package/skills/app-builder/assets/scaffold/migrations/meta/_journal.json +13 -0
- package/skills/app-builder/assets/scaffold/next-env.d.ts +6 -0
- package/skills/app-builder/assets/scaffold/next.config.ts +8 -0
- package/skills/app-builder/assets/scaffold/package.json +47 -0
- package/skills/app-builder/assets/scaffold/playwright.config.ts +30 -0
- package/skills/app-builder/assets/scaffold/pnpm-lock.yaml +2687 -0
- package/skills/app-builder/assets/scaffold/postcss.config.mjs +5 -0
- package/skills/app-builder/assets/scaffold/rudder.app.json +32 -0
- package/skills/app-builder/assets/scaffold/scripts/migrate.ts +21 -0
- package/skills/app-builder/assets/scaffold/scripts/seed.ts +31 -0
- package/skills/app-builder/assets/scaffold/scripts/snapshot.ts +17 -0
- package/skills/app-builder/assets/scaffold/tests/e2e/app.spec.ts +50 -0
- package/skills/app-builder/assets/scaffold/tests/unit/data-transfer.test.ts +28 -0
- package/skills/app-builder/assets/scaffold/tests/unit/domain.test.ts +23 -0
- package/skills/app-builder/assets/scaffold/tsconfig.json +41 -0
- package/skills/app-builder/assets/scaffold/vitest.config.ts +14 -0
- package/skills/app-builder/evals/evals.json +53 -0
- package/skills/app-builder/references/data-safety.md +38 -0
- package/skills/app-builder/references/design-guidelines.md +20 -0
- package/skills/app-builder/references/migrations-and-promotion.md +36 -0
- package/skills/app-builder/references/scaffold-contract.md +62 -0
- package/skills/app-builder/references/verification.md +23 -0
- package/skills/app-builder/scripts/scaffold.mjs +58 -0
- package/skills/app-builder/scripts/validate-manifest.mjs +63 -0
- package/ui-dist/assets/LibraryLiveSurface-Cd6wYgzJ.js +1 -0
- package/ui-dist/assets/{abnfDiagram-VRR7QNED-BdM6grBK.js → abnfDiagram-VRR7QNED-H2QkzWSq.js} +1 -1
- package/ui-dist/assets/{arc-B8Tukeix.js → arc-BIrLdSup.js} +1 -1
- package/ui-dist/assets/{architectureDiagram-ZJ3FMSHR-DP_lYJIS.js → architectureDiagram-ZJ3FMSHR-C68uQC9x.js} +1 -1
- package/ui-dist/assets/{blockDiagram-677ZJIJ3-D_QKZNjP.js → blockDiagram-677ZJIJ3-DolMzRCT.js} +1 -1
- package/ui-dist/assets/{c4Diagram-LMCZKHZV-DJwVavN4.js → c4Diagram-LMCZKHZV-U6f3_L6P.js} +1 -1
- package/ui-dist/assets/channel-B_YTptSv.js +1 -0
- package/ui-dist/assets/{chunk-2Q5K7J3B-BjdKg2cx.js → chunk-2Q5K7J3B-BRJijXIZ.js} +1 -1
- package/ui-dist/assets/{chunk-32BRIVSS-C_u4l725.js → chunk-32BRIVSS-Belug4Vy.js} +1 -1
- package/ui-dist/assets/{chunk-5VM5RSS4-DtzEQCc9.js → chunk-5VM5RSS4-BAP9C4WC.js} +1 -1
- package/ui-dist/assets/{chunk-EX3LRPZG-Ds_gCBVz.js → chunk-EX3LRPZG-BorLutQY.js} +1 -1
- package/ui-dist/assets/{chunk-JWPE2WC7-CHX9VuQf.js → chunk-JWPE2WC7-MCTTrlhK.js} +1 -1
- package/ui-dist/assets/{chunk-MOJQB5TN-D_pj9OWe.js → chunk-MOJQB5TN-BEBLFyze.js} +1 -1
- package/ui-dist/assets/{chunk-RYQCIY6F-aMYmnUaJ.js → chunk-RYQCIY6F-gzlBaUJ5.js} +1 -1
- package/ui-dist/assets/{chunk-V7JOEXUC-Db3LrL-P.js → chunk-V7JOEXUC-Djyk9uKC.js} +1 -1
- package/ui-dist/assets/{chunk-VR4S4FIN-BssuUpMr.js → chunk-VR4S4FIN-lxRoHimg.js} +1 -1
- package/ui-dist/assets/{chunk-XXDRQBXY-DVzY-_Tv.js → chunk-XXDRQBXY-Ceus5xtJ.js} +1 -1
- package/ui-dist/assets/classDiagram-OUVF2IWQ-iR-TAS1r.js +1 -0
- package/ui-dist/assets/classDiagram-v2-EOCWNBFH-iR-TAS1r.js +1 -0
- package/ui-dist/assets/{cose-bilkent-JH36ORCC-Ch-fM2pW.js → cose-bilkent-JH36ORCC-8gSFuEzG.js} +1 -1
- package/ui-dist/assets/{cynefin-VYW2F7L2-C7gJeesr.js → cynefin-VYW2F7L2-Sr3yYkcO.js} +1 -1
- package/ui-dist/assets/{cynefinDiagram-TSTJHNR4-BwMpD6aZ.js → cynefinDiagram-TSTJHNR4-BrgLR8Pm.js} +1 -1
- package/ui-dist/assets/{dagre-VKFMJZFB-8TgHu2tj.js → dagre-VKFMJZFB-BH4QYWTM.js} +1 -1
- package/ui-dist/assets/{diagram-FQU43EPY-ChODej8C.js → diagram-FQU43EPY-hpkOd3am.js} +1 -1
- package/ui-dist/assets/{diagram-G47NLZAW-CVq1GXvV.js → diagram-G47NLZAW-CSBB9Flk.js} +1 -1
- package/ui-dist/assets/{diagram-NH7WQ7WH-D1IO7xe3.js → diagram-NH7WQ7WH-CgNJflW8.js} +1 -1
- package/ui-dist/assets/{diagram-OA4YK3LP-CKlttJto.js → diagram-OA4YK3LP-DqQFUFQv.js} +1 -1
- package/ui-dist/assets/{diagram-WEI45ONY-DigjsORo.js → diagram-WEI45ONY-QAnSfiw3.js} +1 -1
- package/ui-dist/assets/{ebnfDiagram-CCIWWBDH-CZwO7RGO.js → ebnfDiagram-CCIWWBDH--YVRXF7-.js} +1 -1
- package/ui-dist/assets/{erDiagram-Q63AITRT-C3fFVPod.js → erDiagram-Q63AITRT-CRH_K_mE.js} +1 -1
- package/ui-dist/assets/{flowDiagram-23GEKE2U-CpccWfFo.js → flowDiagram-23GEKE2U-CwyXvJ5b.js} +1 -1
- package/ui-dist/assets/{ganttDiagram-NO4QXBWP-g3KL--4W.js → ganttDiagram-NO4QXBWP-B41Y9cwF.js} +1 -1
- package/ui-dist/assets/{gitGraphDiagram-IHSO6WYX-Bn59AW1B.js → gitGraphDiagram-IHSO6WYX-CW7LKrym.js} +1 -1
- package/ui-dist/assets/{graph-LZSMW9ku.js → graph-B2oDVjJO.js} +1 -1
- package/ui-dist/assets/{index-CrU5g0XU.js → index-3zFxfIXc.js} +565 -561
- package/ui-dist/assets/index-BDWwQIJI.js +1 -0
- package/ui-dist/assets/{index-CVwGLbgm.js → index-BOLgWo9p.js} +1 -1
- package/ui-dist/assets/{index-C3e6slEn.js → index-BdhCuwEn.js} +1 -1
- package/ui-dist/assets/{index-CPIoQKcG.js → index-BzBuqR8a.js} +1 -1
- package/ui-dist/assets/index-CJ8Y6mRU.js +7 -0
- package/ui-dist/assets/index-CNJdbN2c.js +1 -0
- package/ui-dist/assets/index-CRRh2Q50.js +1 -0
- package/ui-dist/assets/{index-BI9d3zXw.js → index-CS_SCGq-.js} +2 -2
- package/ui-dist/assets/{index-C5hYxLM9.js → index-CWZ6QjAd.js} +1 -1
- package/ui-dist/assets/index-CiBZqJye.js +1 -0
- package/ui-dist/assets/{index-BG46qMXw.js → index-D7jFNS5a.js} +1 -1
- package/ui-dist/assets/index-DEdvpket.js +1 -0
- package/ui-dist/assets/index-DQRYID5z.js +1 -0
- package/ui-dist/assets/index-DTv8W0av.css +1 -0
- package/ui-dist/assets/{index-BqhkUdAT.js → index-Df6CE5HD.js} +1 -1
- package/ui-dist/assets/{index-BLUJslyp.js → index-DhMy-JmC.js} +1 -1
- package/ui-dist/assets/{index-ZFb9ZHAH.js → index-Z1lC3yRm.js} +5 -5
- package/ui-dist/assets/index-_QsesMkH.js +1 -0
- package/ui-dist/assets/{infoDiagram-FWYZ7A6U-uxPSmmcv.js → infoDiagram-FWYZ7A6U-DyzTlql6.js} +1 -1
- package/ui-dist/assets/{ishikawaDiagram-FXEZZL3T-BeKQmaaL.js → ishikawaDiagram-FXEZZL3T-B9FXEgF4.js} +1 -1
- package/ui-dist/assets/{journeyDiagram-5HDEW3XC-Cnqh1Fyp.js → journeyDiagram-5HDEW3XC-BG_Kqf0Y.js} +1 -1
- package/ui-dist/assets/{kanban-definition-HUTT4EX6-DRvoG8e7.js → kanban-definition-HUTT4EX6-CIZgF9a-.js} +1 -1
- package/ui-dist/assets/{layout-By7bOuHZ.js → layout-ua-GqVIZ.js} +1 -1
- package/ui-dist/assets/{linear-D-kfwm1O.js → linear-CQqDskaQ.js} +1 -1
- package/ui-dist/assets/{map-d3zaWROJ.js → map-DFw_ZSS_.js} +1 -1
- package/ui-dist/assets/{mermaid.core-1JtOXpMA.js → mermaid.core-BVJ3bsf4.js} +4 -4
- package/ui-dist/assets/{mindmap-definition-LN4V7U3C-D8Jge-_m.js → mindmap-definition-LN4V7U3C-Dp1UsqtW.js} +1 -1
- package/ui-dist/assets/{pegDiagram-2B236MQR-UCd9-Gfd.js → pegDiagram-2B236MQR-BDUL53zP.js} +1 -1
- package/ui-dist/assets/{pieDiagram-ENE6RG2P-DffPYn-P.js → pieDiagram-ENE6RG2P-CgSzQLOQ.js} +1 -1
- package/ui-dist/assets/{quadrantDiagram-ABIIQ3AL-Ds1lQ25G.js → quadrantDiagram-ABIIQ3AL-B0YmTMhz.js} +1 -1
- package/ui-dist/assets/{railroadDiagram-RFXS5EU6-P_pLStbY.js → railroadDiagram-RFXS5EU6-BvTcxcz9.js} +1 -1
- package/ui-dist/assets/{requirementDiagram-TGXJPOKE-E_1U7w_T.js → requirementDiagram-TGXJPOKE-fkKI0lRC.js} +1 -1
- package/ui-dist/assets/{sankeyDiagram-HTMAVEWB-DFgwdZz7.js → sankeyDiagram-HTMAVEWB-BSOcxgQK.js} +1 -1
- package/ui-dist/assets/{sequenceDiagram-DBY2YBRQ-CbI2EnTH.js → sequenceDiagram-DBY2YBRQ-DrAQ-gvA.js} +1 -1
- package/ui-dist/assets/{sizeCapture-X5ZJPWSS-Axl0diWc.js → sizeCapture-X5ZJPWSS-CdXaDJu7.js} +1 -1
- package/ui-dist/assets/{stateDiagram-2N3HPSRC-DxZLENhX.js → stateDiagram-2N3HPSRC-CPtjImOw.js} +1 -1
- package/ui-dist/assets/stateDiagram-v2-6OUMAXLB-BntLUyuz.js +1 -0
- package/ui-dist/assets/{swimlanes-5IMT3BWC-1G26qvUm.js → swimlanes-5IMT3BWC-BiAgJ_7N.js} +2 -2
- package/ui-dist/assets/swimlanesDiagram-G3AALYLV-BwiyiniO.js +8 -0
- package/ui-dist/assets/{timeline-definition-FHXFAJF6-B0Ha5bZS.js → timeline-definition-FHXFAJF6-Biw5JBPT.js} +1 -1
- package/ui-dist/assets/{vennDiagram-L72KCM5P-BskD_1N5.js → vennDiagram-L72KCM5P-B2sQcNFx.js} +1 -1
- package/ui-dist/assets/{wardleyDiagram-EHGQE667-1wE4bYQ8.js → wardleyDiagram-EHGQE667-CKi9r9aK.js} +1 -1
- package/ui-dist/assets/{xychartDiagram-FW5EYKEG-DfcOAfb8.js → xychartDiagram-FW5EYKEG-D-0Bf_Kv.js} +1 -1
- package/ui-dist/index.html +2 -2
- package/ui-dist/assets/LibraryLiveSurface-CUgoFYvG.js +0 -1
- package/ui-dist/assets/channel-Cd4sqN24.js +0 -1
- package/ui-dist/assets/classDiagram-OUVF2IWQ-Bi3tsM-q.js +0 -1
- package/ui-dist/assets/classDiagram-v2-EOCWNBFH-Bi3tsM-q.js +0 -1
- package/ui-dist/assets/index-BQv2nBgV.js +0 -1
- package/ui-dist/assets/index-BkbdH2n-.js +0 -1
- package/ui-dist/assets/index-C-qWhcfC.css +0 -1
- package/ui-dist/assets/index-CLETiubs.js +0 -7
- package/ui-dist/assets/index-CLnCobCG.js +0 -1
- package/ui-dist/assets/index-CQLLvEua.js +0 -1
- package/ui-dist/assets/index-ChTD9DV4.js +0 -1
- package/ui-dist/assets/index-CiyYjAsy.js +0 -1
- package/ui-dist/assets/index-EqVfudOJ.js +0 -1
- package/ui-dist/assets/stateDiagram-v2-6OUMAXLB-KzYOpJ1T.js +0 -1
- 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,
|
|
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,
|
|
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"}
|
package/dist/services/budgets.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { agents, approvals, budgetIncidents, budgetPolicies, costEvents, organizations,
|
|
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:
|
|
80
|
-
name:
|
|
81
|
-
|
|
82
|
-
|
|
59
|
+
orgId: agents.orgId,
|
|
60
|
+
name: agents.name,
|
|
61
|
+
status: agents.status,
|
|
62
|
+
pauseReason: agents.pauseReason,
|
|
83
63
|
})
|
|
84
|
-
.from(
|
|
85
|
-
.where(eq(
|
|
64
|
+
.from(agents)
|
|
65
|
+
.where(eq(agents.id, scopeId))
|
|
86
66
|
.then((rows) => rows[0] ?? null);
|
|
87
67
|
if (!row)
|
|
88
|
-
throw notFound("
|
|
68
|
+
throw notFound("Agent not found");
|
|
89
69
|
return {
|
|
90
70
|
orgId: row.orgId,
|
|
91
71
|
name: row.name,
|
|
92
|
-
paused:
|
|
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
|
|
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 ??
|
|
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
|
|
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"
|
|
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,
|
|
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
|
-
|
|
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);
|