@rudderhq/server 0.3.6-canary.9 → 0.4.1
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 +37 -2
- package/dist/bundled-plugins/plugin-linear/dist/worker.js.map +2 -2
- package/dist/config.d.ts +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +15 -1
- package/dist/config.js.map +1 -1
- package/dist/home-paths.d.ts +11 -0
- package/dist/home-paths.d.ts.map +1 -1
- package/dist/home-paths.js +151 -8
- package/dist/home-paths.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +103 -26
- package/dist/index.js.map +1 -1
- package/dist/routes/activity.d.ts +1 -1
- package/dist/routes/activity.d.ts.map +1 -1
- package/dist/routes/activity.js +21 -5
- package/dist/routes/activity.js.map +1 -1
- package/dist/routes/agents.d.ts.map +1 -1
- package/dist/routes/agents.js +254 -4
- package/dist/routes/agents.js.map +1 -1
- package/dist/routes/agents.management-routes.d.ts.map +1 -1
- package/dist/routes/agents.management-routes.js +132 -40
- package/dist/routes/agents.management-routes.js.map +1 -1
- package/dist/routes/automations.d.ts +8 -0
- package/dist/routes/automations.d.ts.map +1 -1
- package/dist/routes/automations.js.map +1 -1
- package/dist/routes/chats.d.ts.map +1 -1
- package/dist/routes/chats.js +228 -115
- package/dist/routes/chats.js.map +1 -1
- package/dist/routes/chats.stream-routes.d.ts.map +1 -1
- package/dist/routes/chats.stream-routes.js +94 -5
- package/dist/routes/chats.stream-routes.js.map +1 -1
- package/dist/routes/instance-settings.d.ts.map +1 -1
- package/dist/routes/instance-settings.js +60 -9
- package/dist/routes/instance-settings.js.map +1 -1
- package/dist/routes/issues.comments-attachments.d.ts.map +1 -1
- package/dist/routes/issues.comments-attachments.js +72 -83
- package/dist/routes/issues.comments-attachments.js.map +1 -1
- package/dist/routes/issues.d.ts +8 -0
- package/dist/routes/issues.d.ts.map +1 -1
- package/dist/routes/issues.js +27 -4
- package/dist/routes/issues.js.map +1 -1
- package/dist/routes/issues.mutations.d.ts.map +1 -1
- package/dist/routes/issues.mutations.js +2 -26
- package/dist/routes/issues.mutations.js.map +1 -1
- package/dist/routes/messenger.d.ts.map +1 -1
- package/dist/routes/messenger.js +39 -1
- package/dist/routes/messenger.js.map +1 -1
- package/dist/routes/orgs.d.ts.map +1 -1
- package/dist/routes/orgs.js +16 -0
- package/dist/routes/orgs.js.map +1 -1
- package/dist/routes/plugin-ui-static.d.ts +4 -4
- package/dist/routes/plugin-ui-static.js +5 -5
- package/dist/routes/plugin-ui-static.js.map +1 -1
- package/dist/routes/plugins.d.ts +4 -4
- package/dist/routes/plugins.js +10 -10
- package/dist/routes/plugins.operations-routes.d.ts +1 -1
- package/dist/routes/plugins.operations-routes.js +2 -2
- package/dist/routes/plugins.operations-routes.js.map +1 -1
- package/dist/routes/run-intelligence.js +5 -5
- package/dist/routes/run-intelligence.js.map +1 -1
- package/dist/routes/sidebar-badges.d.ts.map +1 -1
- package/dist/routes/sidebar-badges.js +6 -10
- package/dist/routes/sidebar-badges.js.map +1 -1
- package/dist/routes/website-metadata.d.ts +8 -0
- package/dist/routes/website-metadata.d.ts.map +1 -0
- package/dist/routes/website-metadata.js +67 -0
- package/dist/routes/website-metadata.js.map +1 -0
- package/dist/services/activity.d.ts.map +1 -1
- package/dist/services/activity.js +1 -1
- package/dist/services/activity.js.map +1 -1
- package/dist/services/agent-instructions.d.ts +1 -0
- package/dist/services/agent-instructions.d.ts.map +1 -1
- package/dist/services/agent-instructions.js +57 -6
- package/dist/services/agent-instructions.js.map +1 -1
- package/dist/services/agent-run-context.d.ts +3 -1
- package/dist/services/agent-run-context.d.ts.map +1 -1
- package/dist/services/agent-run-context.js +7 -0
- package/dist/services/agent-run-context.js.map +1 -1
- package/dist/services/agent-startup-context.d.ts +2 -1
- package/dist/services/agent-startup-context.d.ts.map +1 -1
- package/dist/services/agent-startup-context.js +6 -26
- package/dist/services/agent-startup-context.js.map +1 -1
- package/dist/services/agents.d.ts +9 -1
- package/dist/services/agents.d.ts.map +1 -1
- package/dist/services/agents.js.map +1 -1
- package/dist/services/approvals.d.ts +8 -0
- package/dist/services/approvals.d.ts.map +1 -1
- package/dist/services/approvals.js.map +1 -1
- package/dist/services/automation-chat-output.d.ts +1 -1
- package/dist/services/automations.d.ts +4 -4
- package/dist/services/automations.d.ts.map +1 -1
- package/dist/services/automations.js +12 -0
- package/dist/services/automations.js.map +1 -1
- package/dist/services/budgets.d.ts +8 -0
- package/dist/services/budgets.d.ts.map +1 -1
- package/dist/services/budgets.js.map +1 -1
- package/dist/services/calendar.d.ts +2 -2
- package/dist/services/calendar.js +3 -3
- package/dist/services/calendar.js.map +1 -1
- package/dist/services/chat-agent-runs.d.ts +2 -0
- package/dist/services/chat-agent-runs.d.ts.map +1 -1
- package/dist/services/chat-agent-runs.js +6 -0
- package/dist/services/chat-agent-runs.js.map +1 -1
- package/dist/services/chat-assistant.d.ts.map +1 -1
- package/dist/services/chat-assistant.helpers.d.ts +6 -1
- package/dist/services/chat-assistant.helpers.d.ts.map +1 -1
- package/dist/services/chat-assistant.helpers.js +25 -11
- package/dist/services/chat-assistant.helpers.js.map +1 -1
- package/dist/services/chat-assistant.js +230 -95
- package/dist/services/chat-assistant.js.map +1 -1
- package/dist/services/chat-generation-locks.d.ts +6 -1
- package/dist/services/chat-generation-locks.d.ts.map +1 -1
- package/dist/services/chat-generation-locks.js +20 -2
- package/dist/services/chat-generation-locks.js.map +1 -1
- package/dist/services/chat-title-generation.d.ts +36 -0
- package/dist/services/chat-title-generation.d.ts.map +1 -0
- package/dist/services/chat-title-generation.js +107 -0
- package/dist/services/chat-title-generation.js.map +1 -0
- package/dist/services/chats.d.ts +471 -25
- package/dist/services/chats.d.ts.map +1 -1
- package/dist/services/chats.helpers.d.ts +2 -2
- package/dist/services/chats.js +681 -35
- package/dist/services/chats.js.map +1 -1
- package/dist/services/costs.d.ts +1 -1
- package/dist/services/finance.d.ts +2 -2
- package/dist/services/finance.js +1 -1
- package/dist/services/finance.js.map +1 -1
- package/dist/services/goals.d.ts +8 -0
- package/dist/services/goals.d.ts.map +1 -1
- package/dist/services/goals.js.map +1 -1
- package/dist/services/heartbeat-run-reference.d.ts +1 -0
- package/dist/services/heartbeat-run-reference.d.ts.map +1 -1
- package/dist/services/heartbeat-run-reference.js +3 -2
- package/dist/services/heartbeat-run-reference.js.map +1 -1
- package/dist/services/heartbeat-run-summary.js +1 -1
- package/dist/services/heartbeat-run-summary.js.map +1 -1
- package/dist/services/integrations/agent-integrations.d.ts +19 -0
- package/dist/services/integrations/agent-integrations.d.ts.map +1 -1
- package/dist/services/integrations/agent-integrations.js +30 -0
- package/dist/services/integrations/agent-integrations.js.map +1 -1
- package/dist/services/integrations/feishu/app-registration.d.ts +74 -0
- package/dist/services/integrations/feishu/app-registration.d.ts.map +1 -0
- package/dist/services/integrations/feishu/app-registration.js +236 -0
- package/dist/services/integrations/feishu/app-registration.js.map +1 -0
- package/dist/services/integrations/feishu/inbound-dispatcher-db.d.ts +5 -0
- package/dist/services/integrations/feishu/inbound-dispatcher-db.d.ts.map +1 -1
- package/dist/services/integrations/feishu/inbound-dispatcher-db.js +178 -7
- package/dist/services/integrations/feishu/inbound-dispatcher-db.js.map +1 -1
- package/dist/services/integrations/feishu/inbound-dispatcher.d.ts +23 -0
- package/dist/services/integrations/feishu/inbound-dispatcher.d.ts.map +1 -1
- package/dist/services/integrations/feishu/inbound-dispatcher.js +25 -0
- package/dist/services/integrations/feishu/inbound-dispatcher.js.map +1 -1
- package/dist/services/integrations/feishu/runtime-registry.d.ts +20 -0
- package/dist/services/integrations/feishu/runtime-registry.d.ts.map +1 -0
- package/dist/services/integrations/feishu/runtime-registry.js +41 -0
- package/dist/services/integrations/feishu/runtime-registry.js.map +1 -0
- package/dist/services/integrations/feishu/runtime.d.ts +39 -23
- package/dist/services/integrations/feishu/runtime.d.ts.map +1 -1
- package/dist/services/integrations/feishu/runtime.js +333 -95
- package/dist/services/integrations/feishu/runtime.js.map +1 -1
- package/dist/services/integrations/feishu/user-bindings.d.ts +22 -0
- package/dist/services/integrations/feishu/user-bindings.d.ts.map +1 -0
- package/dist/services/integrations/feishu/user-bindings.js +57 -0
- package/dist/services/integrations/feishu/user-bindings.js.map +1 -0
- package/dist/services/issue-approvals.d.ts +2 -2
- package/dist/services/issue-review-wakeup.js +1 -1
- package/dist/services/issue-review-wakeup.js.map +1 -1
- package/dist/services/issues.comments-attachments.d.ts +3 -3
- package/dist/services/issues.d.ts +14 -6
- package/dist/services/issues.d.ts.map +1 -1
- package/dist/services/issues.helpers.d.ts +12 -1
- package/dist/services/issues.helpers.d.ts.map +1 -1
- package/dist/services/issues.helpers.js +8 -0
- package/dist/services/issues.helpers.js.map +1 -1
- package/dist/services/issues.js +28 -2
- package/dist/services/issues.js.map +1 -1
- package/dist/services/knowledge-portability/organization-skills.catalog.d.ts +1 -1
- package/dist/services/library-entries.d.ts +8 -0
- package/dist/services/library-entries.d.ts.map +1 -1
- package/dist/services/library-entries.js +8 -0
- package/dist/services/library-entries.js.map +1 -1
- package/dist/services/managed-workspace-preflight.js +1 -1
- package/dist/services/managed-workspace-preflight.js.map +1 -1
- package/dist/services/messenger.d.ts +23 -4
- package/dist/services/messenger.d.ts.map +1 -1
- package/dist/services/messenger.js +187 -25
- package/dist/services/messenger.js.map +1 -1
- package/dist/services/plugin-capability-validator.d.ts +1 -1
- package/dist/services/plugin-capability-validator.js +2 -2
- package/dist/services/plugin-dev-watcher.js +1 -1
- package/dist/services/plugin-event-bus.d.ts +3 -3
- package/dist/services/plugin-event-bus.js +3 -3
- package/dist/services/plugin-job-coordinator.d.ts +1 -1
- package/dist/services/plugin-job-coordinator.js +1 -1
- package/dist/services/plugin-job-scheduler.d.ts +1 -1
- package/dist/services/plugin-job-scheduler.js +1 -1
- package/dist/services/plugin-job-store.d.ts +2 -2
- package/dist/services/plugin-job-store.js +2 -2
- package/dist/services/plugin-lifecycle.d.ts +4 -4
- package/dist/services/plugin-lifecycle.js +3 -3
- package/dist/services/plugin-loader.core.d.ts +4 -4
- package/dist/services/plugin-loader.core.js +2 -2
- package/dist/services/plugin-loader.core.js.map +1 -1
- package/dist/services/plugin-loader.d.ts +3 -3
- package/dist/services/plugin-loader.helpers.d.ts +26 -25
- package/dist/services/plugin-loader.helpers.d.ts.map +1 -1
- package/dist/services/plugin-loader.helpers.js +10 -9
- package/dist/services/plugin-loader.helpers.js.map +1 -1
- package/dist/services/plugin-loader.js +3 -3
- package/dist/services/plugin-loader.worker-paths.d.ts +3 -3
- package/dist/services/plugin-manifest-validator.d.ts +2 -2
- package/dist/services/plugin-registry.d.ts +9 -9
- package/dist/services/plugin-registry.js +1 -1
- package/dist/services/plugin-secrets-handler.d.ts +2 -2
- package/dist/services/plugin-secrets-handler.js +2 -2
- package/dist/services/plugin-state-store.d.ts +3 -3
- package/dist/services/plugin-state-store.js +3 -3
- package/dist/services/plugin-stream-bus.d.ts +1 -1
- package/dist/services/plugin-stream-bus.js +1 -1
- package/dist/services/plugin-tool-dispatcher.d.ts +2 -2
- package/dist/services/plugin-tool-dispatcher.js +2 -2
- package/dist/services/plugin-tool-registry.d.ts +2 -2
- package/dist/services/plugin-tool-registry.js +2 -2
- package/dist/services/plugin-worker-manager.d.ts +4 -4
- package/dist/services/plugin-worker-manager.d.ts.map +1 -1
- package/dist/services/plugin-worker-manager.js +8 -7
- package/dist/services/plugin-worker-manager.js.map +1 -1
- package/dist/services/run-intelligence.js +3 -3
- package/dist/services/run-intelligence.js.map +1 -1
- package/dist/services/runtime-kernel/heartbeat.core.d.ts +9 -1
- package/dist/services/runtime-kernel/heartbeat.core.d.ts.map +1 -1
- package/dist/services/runtime-kernel/heartbeat.core.js +16 -5
- package/dist/services/runtime-kernel/heartbeat.core.js.map +1 -1
- package/dist/services/runtime-kernel/heartbeat.d.ts +3 -3
- package/dist/services/runtime-kernel/heartbeat.execute.d.ts.map +1 -1
- package/dist/services/runtime-kernel/heartbeat.execute.js +17 -3
- package/dist/services/runtime-kernel/heartbeat.execute.js.map +1 -1
- package/dist/services/runtime-kernel/heartbeat.misc.js +1 -1
- package/dist/services/runtime-kernel/heartbeat.recovery.d.ts +1 -1
- package/dist/services/runtime-kernel/heartbeat.recovery.js +7 -7
- package/dist/services/runtime-kernel/heartbeat.recovery.js.map +1 -1
- package/dist/services/runtime-kernel/heartbeat.release.js +4 -4
- package/dist/services/runtime-kernel/heartbeat.release.js.map +1 -1
- package/dist/services/runtime-kernel/heartbeat.wakeup.js +1 -1
- package/dist/services/sidebar-badges.d.ts +3 -0
- package/dist/services/sidebar-badges.d.ts.map +1 -1
- package/dist/services/sidebar-badges.js +29 -1
- package/dist/services/sidebar-badges.js.map +1 -1
- package/dist/services/title-generation.d.ts +38 -0
- package/dist/services/title-generation.d.ts.map +1 -0
- package/dist/services/title-generation.js +119 -0
- package/dist/services/title-generation.js.map +1 -0
- package/dist/services/website-metadata.d.ts +17 -0
- package/dist/services/website-metadata.d.ts.map +1 -0
- package/dist/services/website-metadata.js +293 -0
- package/dist/services/website-metadata.js.map +1 -0
- package/dist/services/workspace-backups.d.ts +22 -0
- package/dist/services/workspace-backups.d.ts.map +1 -1
- package/dist/services/workspace-backups.js +161 -5
- package/dist/services/workspace-backups.js.map +1 -1
- package/dist/services/workspace-runtime.services.d.ts +1 -1
- package/package.json +15 -14
- package/resources/bundled-skills/rudder/SKILL.md +7 -6
- package/resources/bundled-skills/rudder/references/cli-reference.md +3 -3
- package/resources/bundled-skills/rudder-create-plugin/SKILL.md +2 -2
- package/skills/rudder/SKILL.md +7 -6
- package/skills/rudder/references/cli-reference.md +3 -3
- package/skills/rudder-create-plugin/SKILL.md +2 -2
- package/ui-dist/assets/{_basePickBy-CM0XatHw.js → _basePickBy-RX5N2cj2.js} +1 -1
- package/ui-dist/assets/{_baseUniq-CdBBmdoP.js → _baseUniq-Br4fg1iw.js} +1 -1
- package/ui-dist/assets/{arc-DSTtxyJ9.js → arc-B8svvCeo.js} +1 -1
- package/ui-dist/assets/{architectureDiagram-2XIMDMQ5-BkHMYb5I.js → architectureDiagram-2XIMDMQ5-C5dYOfG1.js} +1 -1
- package/ui-dist/assets/{blockDiagram-WCTKOSBZ-EYczZxwW.js → blockDiagram-WCTKOSBZ-B6XhVXfw.js} +1 -1
- package/ui-dist/assets/{c4Diagram-IC4MRINW-Xo9qijMi.js → c4Diagram-IC4MRINW-D31WV7FX.js} +1 -1
- package/ui-dist/assets/channel-BD332hbj.js +1 -0
- package/ui-dist/assets/{chunk-4BX2VUAB-CKzta1FF.js → chunk-4BX2VUAB-CxoBpj5-.js} +1 -1
- package/ui-dist/assets/{chunk-55IACEB6-BxxUB0ww.js → chunk-55IACEB6-kF3-cxbP.js} +1 -1
- package/ui-dist/assets/{chunk-FMBD7UC4-0F4oxVtY.js → chunk-FMBD7UC4-CmnJkmf-.js} +1 -1
- package/ui-dist/assets/{chunk-JSJVCQXG-CVMPMlVD.js → chunk-JSJVCQXG-U_rZ0R1l.js} +1 -1
- package/ui-dist/assets/{chunk-KX2RTZJC-lPrAWT94.js → chunk-KX2RTZJC-DB5h51jY.js} +1 -1
- package/ui-dist/assets/{chunk-NQ4KR5QH-Bufcm7Iv.js → chunk-NQ4KR5QH-D00Zb66Y.js} +1 -1
- package/ui-dist/assets/{chunk-QZHKN3VN-CucmdWnl.js → chunk-QZHKN3VN-CZOQzYse.js} +1 -1
- package/ui-dist/assets/{chunk-WL4C6EOR-Dz0oYQrJ.js → chunk-WL4C6EOR-CiFO_DRi.js} +1 -1
- package/ui-dist/assets/classDiagram-VBA2DB6C-BJA0edKB.js +1 -0
- package/ui-dist/assets/classDiagram-v2-RAHNMMFH-BJA0edKB.js +1 -0
- package/ui-dist/assets/clone-BXc7Yvje.js +1 -0
- package/ui-dist/assets/{cose-bilkent-S5V4N54A-DzyX-Er8.js → cose-bilkent-S5V4N54A-BvkdnfgN.js} +1 -1
- package/ui-dist/assets/{dagre-KLK3FWXG-BbZzCKuN.js → dagre-KLK3FWXG-DcTva6B8.js} +1 -1
- package/ui-dist/assets/{diagram-E7M64L7V-B5Rb7Bm4.js → diagram-E7M64L7V-sXDqPfE1.js} +1 -1
- package/ui-dist/assets/{diagram-IFDJBPK2-Cpu1Xc8G.js → diagram-IFDJBPK2-BVBaBBbz.js} +1 -1
- package/ui-dist/assets/{diagram-P4PSJMXO-kLfHqRlk.js → diagram-P4PSJMXO-cjQe9ndf.js} +1 -1
- package/ui-dist/assets/{erDiagram-INFDFZHY-rCnUyQUb.js → erDiagram-INFDFZHY-CFGKze0m.js} +1 -1
- package/ui-dist/assets/{flowDiagram-PKNHOUZH-BhOz8cvV.js → flowDiagram-PKNHOUZH-D7oV-h10.js} +1 -1
- package/ui-dist/assets/{ganttDiagram-A5KZAMGK-Csg9g3hz.js → ganttDiagram-A5KZAMGK-Rdv3FkwM.js} +1 -1
- package/ui-dist/assets/{gitGraphDiagram-K3NZZRJ6-DLPnSlRs.js → gitGraphDiagram-K3NZZRJ6-BejgDMgO.js} +1 -1
- package/ui-dist/assets/{graph-BrxYh68N.js → graph-FYmROErt.js} +1 -1
- package/ui-dist/assets/{index-BeZv_Z0b.js → index-4AkwW8qm.js} +1 -1
- package/ui-dist/assets/{index-Dj72ldIc.js → index-BArpEgpP.js} +1 -1
- package/ui-dist/assets/index-BPlr2F3e.css +1 -0
- package/ui-dist/assets/{index-Br07RRw1.js → index-BXKKdE9_.js} +1 -1
- package/ui-dist/assets/{index-mOyLwPeE.js → index-BeEzPu0t.js} +1 -1
- package/ui-dist/assets/{index-B6_gFYNj.js → index-BipRYXd-.js} +1 -1
- package/ui-dist/assets/{index-Bw8MgLaM.js → index-CEvBo8i0.js} +450 -445
- package/ui-dist/assets/{index-BkzdTp2b.js → index-CWj4VVKu.js} +1 -1
- package/ui-dist/assets/{index-D0rP99dj.js → index-CaLoiEJB.js} +1 -1
- package/ui-dist/assets/{index-DMkClCka.js → index-DDHYeuwy.js} +1 -1
- package/ui-dist/assets/{index-DiMeST8g.js → index-DSnSYKAK.js} +1 -1
- package/ui-dist/assets/{index-DpdsNIGb.js → index-DUeBWXLE.js} +1 -1
- package/ui-dist/assets/{index-G_y-oBne.js → index-DWxCltvd.js} +1 -1
- package/ui-dist/assets/{index-COBwmF-C.js → index-DYYXNc6j.js} +1 -1
- package/ui-dist/assets/{index-D_06pAuN.js → index-DaNviTjf.js} +1 -1
- package/ui-dist/assets/{index-BQW242nS.js → index-c9oJP_Zz.js} +1 -1
- package/ui-dist/assets/{index-Cb2qts0o.js → index-hUcZY0te.js} +1 -1
- package/ui-dist/assets/{index-D4FFno9t.js → index-ul4vjkem.js} +1 -1
- package/ui-dist/assets/{index-CsraICzz.js → index-uraSHmk-.js} +1 -1
- package/ui-dist/assets/{infoDiagram-LFFYTUFH-CRBKgiEf.js → infoDiagram-LFFYTUFH-D6ROD6kG.js} +1 -1
- package/ui-dist/assets/{ishikawaDiagram-PHBUUO56-DI3jquVE.js → ishikawaDiagram-PHBUUO56-DcVc0cdJ.js} +1 -1
- package/ui-dist/assets/{journeyDiagram-4ABVD52K-DDFZ2Q6D.js → journeyDiagram-4ABVD52K-BRufUm59.js} +1 -1
- package/ui-dist/assets/{kanban-definition-K7BYSVSG-yL5u3cXV.js → kanban-definition-K7BYSVSG-DEQ5w7B0.js} +1 -1
- package/ui-dist/assets/{layout-DDZaRkp7.js → layout-F5Axhkca.js} +1 -1
- package/ui-dist/assets/{linear-CWngWuQa.js → linear-BllnS5sO.js} +1 -1
- package/ui-dist/assets/{mermaid.core-CQuYoq9K.js → mermaid.core-CK8iLvY2.js} +4 -4
- package/ui-dist/assets/{mindmap-definition-YRQLILUH-BwSsHtTO.js → mindmap-definition-YRQLILUH-CXI6vt68.js} +1 -1
- package/ui-dist/assets/{pieDiagram-SKSYHLDU-BasUkvwH.js → pieDiagram-SKSYHLDU-DDUy_f_g.js} +1 -1
- package/ui-dist/assets/{quadrantDiagram-337W2JSQ-D0D2xp36.js → quadrantDiagram-337W2JSQ-Cpns5Yb1.js} +1 -1
- package/ui-dist/assets/{requirementDiagram-Z7DCOOCP-CztN9kDh.js → requirementDiagram-Z7DCOOCP-6p6V6XH6.js} +1 -1
- package/ui-dist/assets/{sankeyDiagram-WA2Y5GQK-2xDqN9ox.js → sankeyDiagram-WA2Y5GQK-C52tgQmQ.js} +1 -1
- package/ui-dist/assets/{sequenceDiagram-2WXFIKYE-CO3OUPIJ.js → sequenceDiagram-2WXFIKYE-CxlW_veo.js} +1 -1
- package/ui-dist/assets/{stateDiagram-RAJIS63D-DuQ1QZcT.js → stateDiagram-RAJIS63D-NFOjAzLj.js} +1 -1
- package/ui-dist/assets/stateDiagram-v2-FVOUBMTO-DblG-d9U.js +1 -0
- package/ui-dist/assets/{timeline-definition-YZTLITO2-CnOxbQeb.js → timeline-definition-YZTLITO2-DvENY4C6.js} +1 -1
- package/ui-dist/assets/{treemap-KZPCXAKY-DD77IFOl.js → treemap-KZPCXAKY-BJfIPF5s.js} +1 -1
- package/ui-dist/assets/{vennDiagram-LZ73GAT5-DOXTGJn1.js → vennDiagram-LZ73GAT5-DmGW-P4z.js} +1 -1
- package/ui-dist/assets/{xychartDiagram-JWTSCODW-DWkrcdri.js → xychartDiagram-JWTSCODW-bbLe3hqw.js} +1 -1
- package/ui-dist/brands/feishu-logo.svg +5 -0
- package/ui-dist/index.html +2 -2
- package/ui-dist/assets/channel-BRnz7pSY.js +0 -1
- package/ui-dist/assets/classDiagram-VBA2DB6C-Q3YuI9dv.js +0 -1
- package/ui-dist/assets/classDiagram-v2-RAHNMMFH-Q3YuI9dv.js +0 -1
- package/ui-dist/assets/clone-C1exIyAN.js +0 -1
- package/ui-dist/assets/index-Dz8xxyqB.css +0 -1
- package/ui-dist/assets/stateDiagram-v2-FVOUBMTO-DQbZqbl9.js +0 -1
|
@@ -393,6 +393,7 @@ function chatSummary(conversation) {
|
|
|
393
393
|
routedAgentId: conversation.routedAgentId,
|
|
394
394
|
runtimeAgentId: conversation.chatRuntime?.runtimeAgentId ?? null,
|
|
395
395
|
latestUserMessagePreview: conversation.latestUserMessagePreview,
|
|
396
|
+
...(conversation.sourceMetadata ?? {}),
|
|
396
397
|
},
|
|
397
398
|
};
|
|
398
399
|
}
|
|
@@ -555,18 +556,19 @@ function approvalCard(approval, latestComment, currentUserId, latestActivityAt)
|
|
|
555
556
|
};
|
|
556
557
|
}
|
|
557
558
|
function failedRunCard(run, agentName) {
|
|
559
|
+
const summary = failedRunUserSummary(run);
|
|
558
560
|
return {
|
|
559
561
|
id: run.id,
|
|
560
562
|
threadKey: "failed-runs",
|
|
561
563
|
kind: "failed-runs",
|
|
562
564
|
title: agentName ? `${agentName} · Failed run` : "Failed run",
|
|
563
565
|
subtitle: run.status.replaceAll("_", " "),
|
|
564
|
-
body:
|
|
565
|
-
preview:
|
|
566
|
+
body: summary,
|
|
567
|
+
preview: summary,
|
|
566
568
|
href: `/agents/${run.agentId}/runs/${run.id}`,
|
|
567
569
|
latestActivityAt: run.updatedAt ?? run.createdAt,
|
|
568
570
|
actions: [
|
|
569
|
-
buildAction("Retry", `/
|
|
571
|
+
buildAction("Retry", `/agent-runs/${run.id}/retry`, "POST"),
|
|
570
572
|
buildAction("Open run", `/agents/${run.agentId}/runs/${run.id}`, "GET"),
|
|
571
573
|
],
|
|
572
574
|
metadata: {
|
|
@@ -578,6 +580,12 @@ function failedRunCard(run, agentName) {
|
|
|
578
580
|
run: run,
|
|
579
581
|
};
|
|
580
582
|
}
|
|
583
|
+
function readNonEmptyString(value) {
|
|
584
|
+
return typeof value === "string" && value.trim().length > 0 ? value.trim() : null;
|
|
585
|
+
}
|
|
586
|
+
function failedRunUserSummary(run) {
|
|
587
|
+
return readNonEmptyString(run.resultJson?.userMessage) ?? FAILED_RUN_USER_SUMMARY;
|
|
588
|
+
}
|
|
581
589
|
function budgetCard(incident) {
|
|
582
590
|
return {
|
|
583
591
|
id: incident.id,
|
|
@@ -655,6 +663,16 @@ export function messengerService(db) {
|
|
|
655
663
|
function chatConversationIdFromThreadKey(threadKey) {
|
|
656
664
|
return threadKey.startsWith("chat:") ? threadKey.slice("chat:".length) : null;
|
|
657
665
|
}
|
|
666
|
+
function issueIdFromThreadKey(threadKey) {
|
|
667
|
+
return threadKey.startsWith("issue:") ? threadKey.slice("issue:".length) : null;
|
|
668
|
+
}
|
|
669
|
+
function isSyntheticMessengerThreadKey(threadKey) {
|
|
670
|
+
return threadKey === "issues"
|
|
671
|
+
|| threadKey === "approvals"
|
|
672
|
+
|| threadKey === "failed-runs"
|
|
673
|
+
|| threadKey === "budget-alerts"
|
|
674
|
+
|| threadKey === "join-requests";
|
|
675
|
+
}
|
|
658
676
|
async function getCustomGroupOrThrow(orgId, userId, groupId) {
|
|
659
677
|
const [group] = await db
|
|
660
678
|
.select()
|
|
@@ -665,15 +683,91 @@ export function messengerService(db) {
|
|
|
665
683
|
throw notFound("Messenger custom group not found");
|
|
666
684
|
return group;
|
|
667
685
|
}
|
|
668
|
-
async function
|
|
686
|
+
async function loadIssueThreadSummaryById(orgId, userId, issueId) {
|
|
687
|
+
const lastReadAtPromise = lastReadAtForThread(db, orgId, userId, "issues");
|
|
688
|
+
const rows = (await db.execute(issueEntryRowsQuery(orgId, userId, sql `
|
|
689
|
+
where id = ${issueId}
|
|
690
|
+
limit 1
|
|
691
|
+
`)));
|
|
692
|
+
const entry = rows[0] ? issueThreadEntryFromRow(rows[0], userId) : null;
|
|
693
|
+
if (!entry)
|
|
694
|
+
return null;
|
|
695
|
+
const [card] = await buildIssueCardsForEntries(orgId, userId, [entry], "latest");
|
|
696
|
+
if (!card)
|
|
697
|
+
return null;
|
|
698
|
+
const lastReadAt = await lastReadAtPromise;
|
|
699
|
+
const issueThreadStates = await loadThreadStates(db, orgId, userId, [`issue:${issueId}`]);
|
|
700
|
+
return splitIssueSummary(card.entry, card.item, lastReadAt, issueThreadStates.get(`issue:${issueId}`) ?? null);
|
|
701
|
+
}
|
|
702
|
+
async function loadSyntheticThreadSummaryByKey(orgId, userId, threadKey) {
|
|
703
|
+
const syntheticThreadStates = loadThreadStates(db, orgId, userId, [
|
|
704
|
+
"issues",
|
|
705
|
+
"approvals",
|
|
706
|
+
"failed-runs",
|
|
707
|
+
"budget-alerts",
|
|
708
|
+
"join-requests",
|
|
709
|
+
]);
|
|
710
|
+
switch (threadKey) {
|
|
711
|
+
case "issues": {
|
|
712
|
+
const data = await loadIssueThreadSummaryData(orgId, userId, syntheticThreadStates);
|
|
713
|
+
return data.itemCount > 0 ? data.summary : null;
|
|
714
|
+
}
|
|
715
|
+
case "approvals": {
|
|
716
|
+
const data = await loadApprovalThreadSummaryData(orgId, userId, syntheticThreadStates);
|
|
717
|
+
return data.itemCount > 0 ? data.summary : null;
|
|
718
|
+
}
|
|
719
|
+
case "failed-runs": {
|
|
720
|
+
const data = await loadFailedRunSummaryData(orgId, userId, syntheticThreadStates);
|
|
721
|
+
return data.itemCount > 0 ? data.summary : null;
|
|
722
|
+
}
|
|
723
|
+
case "budget-alerts": {
|
|
724
|
+
const data = await loadBudgetAlertData(orgId, userId, syntheticThreadStates);
|
|
725
|
+
return data.detail.items.length > 0 ? data.summary : null;
|
|
726
|
+
}
|
|
727
|
+
case "join-requests": {
|
|
728
|
+
const data = await loadJoinRequestSummaryData(orgId, userId, syntheticThreadStates);
|
|
729
|
+
return data.itemCount > 0 ? data.summary : null;
|
|
730
|
+
}
|
|
731
|
+
default:
|
|
732
|
+
return null;
|
|
733
|
+
}
|
|
734
|
+
}
|
|
735
|
+
async function findMessengerThreadSummary(orgId, userId, threadKey) {
|
|
669
736
|
const conversationId = chatConversationIdFromThreadKey(threadKey);
|
|
670
|
-
if (
|
|
671
|
-
|
|
737
|
+
if (conversationId) {
|
|
738
|
+
const conversations = await chatsSvc.listSummariesByIds(orgId, [conversationId], userId);
|
|
739
|
+
const conversation = conversations[0];
|
|
740
|
+
return conversation ? chatSummary(conversation) : null;
|
|
672
741
|
}
|
|
673
|
-
const
|
|
674
|
-
if (
|
|
675
|
-
|
|
742
|
+
const issueId = issueIdFromThreadKey(threadKey);
|
|
743
|
+
if (issueId) {
|
|
744
|
+
return loadIssueThreadSummaryById(orgId, userId, issueId);
|
|
676
745
|
}
|
|
746
|
+
return loadSyntheticThreadSummaryByKey(orgId, userId, threadKey);
|
|
747
|
+
}
|
|
748
|
+
async function ensureMessengerThreadCanBeGrouped(orgId, userId, threadKey) {
|
|
749
|
+
const summary = await findMessengerThreadSummary(orgId, userId, threadKey);
|
|
750
|
+
if (!summary) {
|
|
751
|
+
throw notFound("Messenger thread not found");
|
|
752
|
+
}
|
|
753
|
+
}
|
|
754
|
+
async function listThreadTitles(orgId, userId, threadKeys) {
|
|
755
|
+
const titles = [];
|
|
756
|
+
for (const threadKey of [...new Set(threadKeys)]) {
|
|
757
|
+
const summary = await findMessengerThreadSummary(orgId, userId, threadKey);
|
|
758
|
+
if (summary?.title)
|
|
759
|
+
titles.push(summary.title);
|
|
760
|
+
}
|
|
761
|
+
return titles;
|
|
762
|
+
}
|
|
763
|
+
async function listCustomGroupThreadTitles(orgId, userId, groupId) {
|
|
764
|
+
await getCustomGroupOrThrow(orgId, userId, groupId);
|
|
765
|
+
const entries = await db
|
|
766
|
+
.select({ threadKey: messengerCustomGroupEntries.threadKey })
|
|
767
|
+
.from(messengerCustomGroupEntries)
|
|
768
|
+
.where(and(eq(messengerCustomGroupEntries.orgId, orgId), eq(messengerCustomGroupEntries.userId, userId), eq(messengerCustomGroupEntries.groupId, groupId)))
|
|
769
|
+
.orderBy(asc(messengerCustomGroupEntries.sortOrder), asc(messengerCustomGroupEntries.createdAt));
|
|
770
|
+
return listThreadTitles(orgId, userId, entries.map((entry) => entry.threadKey));
|
|
677
771
|
}
|
|
678
772
|
async function listCustomGroups(orgId, userId) {
|
|
679
773
|
const [groups, entries] = await Promise.all([
|
|
@@ -681,17 +775,15 @@ export function messengerService(db) {
|
|
|
681
775
|
.select()
|
|
682
776
|
.from(messengerCustomGroups)
|
|
683
777
|
.where(and(eq(messengerCustomGroups.orgId, orgId), eq(messengerCustomGroups.userId, userId)))
|
|
684
|
-
.orderBy(asc(messengerCustomGroups.sortOrder), asc(messengerCustomGroups.createdAt)),
|
|
778
|
+
.orderBy(sql `${messengerCustomGroups.pinnedAt} IS NULL`, asc(messengerCustomGroups.sortOrder), asc(messengerCustomGroups.createdAt)),
|
|
685
779
|
db
|
|
686
780
|
.select()
|
|
687
781
|
.from(messengerCustomGroupEntries)
|
|
688
782
|
.where(and(eq(messengerCustomGroupEntries.orgId, orgId), eq(messengerCustomGroupEntries.userId, userId)))
|
|
689
783
|
.orderBy(asc(messengerCustomGroupEntries.sortOrder), asc(messengerCustomGroupEntries.createdAt)),
|
|
690
784
|
]);
|
|
691
|
-
const
|
|
785
|
+
const conversationIds = entries
|
|
692
786
|
.map((entry) => entry.threadKey)
|
|
693
|
-
.filter((threadKey) => Boolean(chatConversationIdFromThreadKey(threadKey)));
|
|
694
|
-
const conversationIds = chatThreadKeys
|
|
695
787
|
.map((threadKey) => chatConversationIdFromThreadKey(threadKey))
|
|
696
788
|
.filter((id) => Boolean(id));
|
|
697
789
|
const conversations = await chatsSvc.listSummariesByIds(orgId, conversationIds, userId);
|
|
@@ -699,11 +791,36 @@ export function messengerService(db) {
|
|
|
699
791
|
const summary = chatSummary(conversation);
|
|
700
792
|
return [summary.threadKey, summary];
|
|
701
793
|
}));
|
|
794
|
+
const nonChatThreadKeys = [...new Set(entries
|
|
795
|
+
.map((entry) => entry.threadKey)
|
|
796
|
+
.filter((threadKey) => !chatConversationIdFromThreadKey(threadKey)))];
|
|
797
|
+
const issueThreadKeys = nonChatThreadKeys.filter((threadKey) => Boolean(issueIdFromThreadKey(threadKey)));
|
|
798
|
+
if (nonChatThreadKeys.length > 0) {
|
|
799
|
+
const syntheticThreadKeys = nonChatThreadKeys.filter((threadKey) => !issueIdFromThreadKey(threadKey));
|
|
800
|
+
const [issueSummaries, syntheticSummaries] = await Promise.all([
|
|
801
|
+
Promise.all(issueThreadKeys.map(async (threadKey) => {
|
|
802
|
+
const issueId = issueIdFromThreadKey(threadKey);
|
|
803
|
+
return issueId ? loadIssueThreadSummaryById(orgId, userId, issueId) : null;
|
|
804
|
+
})),
|
|
805
|
+
Promise.all(syntheticThreadKeys.map((threadKey) => loadSyntheticThreadSummaryByKey(orgId, userId, threadKey))),
|
|
806
|
+
]);
|
|
807
|
+
for (const summary of issueSummaries) {
|
|
808
|
+
if (summary)
|
|
809
|
+
summaryByThreadKey.set(summary.threadKey, summary);
|
|
810
|
+
}
|
|
811
|
+
for (const summary of syntheticSummaries) {
|
|
812
|
+
if (summary)
|
|
813
|
+
summaryByThreadKey.set(summary.threadKey, summary);
|
|
814
|
+
}
|
|
815
|
+
}
|
|
702
816
|
const staleEntryIds = [];
|
|
703
817
|
const entriesByGroupId = new Map();
|
|
704
818
|
for (const entry of entries) {
|
|
705
819
|
const summary = summaryByThreadKey.get(entry.threadKey);
|
|
706
820
|
if (!summary) {
|
|
821
|
+
if (isSyntheticMessengerThreadKey(entry.threadKey)) {
|
|
822
|
+
continue;
|
|
823
|
+
}
|
|
707
824
|
staleEntryIds.push(entry.id);
|
|
708
825
|
continue;
|
|
709
826
|
}
|
|
@@ -745,6 +862,7 @@ export function messengerService(db) {
|
|
|
745
862
|
name,
|
|
746
863
|
icon,
|
|
747
864
|
sortOrder: (lastGroup?.sortOrder ?? -1) + 1,
|
|
865
|
+
pinnedAt: now,
|
|
748
866
|
updatedAt: now,
|
|
749
867
|
})
|
|
750
868
|
.returning();
|
|
@@ -755,10 +873,15 @@ export function messengerService(db) {
|
|
|
755
873
|
}
|
|
756
874
|
async function updateCustomGroup(orgId, userId, groupId, patch) {
|
|
757
875
|
await getCustomGroupOrThrow(orgId, userId, groupId);
|
|
876
|
+
const { pinned, ...groupPatch } = patch;
|
|
877
|
+
const updatePatch = {
|
|
878
|
+
...groupPatch,
|
|
879
|
+
...(typeof pinned === "boolean" ? { pinnedAt: pinned ? new Date() : null } : {}),
|
|
880
|
+
};
|
|
758
881
|
const [group] = await db
|
|
759
882
|
.update(messengerCustomGroups)
|
|
760
883
|
.set({
|
|
761
|
-
...
|
|
884
|
+
...updatePatch,
|
|
762
885
|
updatedAt: new Date(),
|
|
763
886
|
})
|
|
764
887
|
.where(and(eq(messengerCustomGroups.orgId, orgId), eq(messengerCustomGroups.userId, userId), eq(messengerCustomGroups.id, groupId)))
|
|
@@ -797,7 +920,7 @@ export function messengerService(db) {
|
|
|
797
920
|
return listCustomGroups(orgId, userId);
|
|
798
921
|
}
|
|
799
922
|
async function assignThreadToCustomGroupWithClient(client, orgId, userId, groupId, threadKey) {
|
|
800
|
-
await
|
|
923
|
+
await ensureMessengerThreadCanBeGrouped(orgId, userId, threadKey);
|
|
801
924
|
const [lastEntry] = await client
|
|
802
925
|
.select({ sortOrder: messengerCustomGroupEntries.sortOrder })
|
|
803
926
|
.from(messengerCustomGroupEntries)
|
|
@@ -1228,6 +1351,14 @@ export function messengerService(db) {
|
|
|
1228
1351
|
`));
|
|
1229
1352
|
return normalizeDate(rows[0]?.latestActivityAt ?? null);
|
|
1230
1353
|
}
|
|
1354
|
+
async function loadLatestIssueAttentionAtById(orgId, userId, issueId) {
|
|
1355
|
+
const rows = (await db.execute(sql `
|
|
1356
|
+
select max("attentionActivityAt") as "latestActivityAt"
|
|
1357
|
+
from (${issueEntryRowsQuery(orgId, userId, sql `where id = ${issueId} limit 1`)}) issue_entry_stats
|
|
1358
|
+
where "attentionActivityAt" is not null
|
|
1359
|
+
`));
|
|
1360
|
+
return normalizeDate(rows[0]?.latestActivityAt ?? null);
|
|
1361
|
+
}
|
|
1231
1362
|
async function loadLatestIssueDisplayEntry(orgId, userId) {
|
|
1232
1363
|
const rows = (await db.execute(issueEntryRowsQuery(orgId, userId, sql `
|
|
1233
1364
|
order by "latestActivityAt" desc, id asc
|
|
@@ -1423,7 +1554,6 @@ export function messengerService(db) {
|
|
|
1423
1554
|
}
|
|
1424
1555
|
async function loadApprovalThreadSummaryData(orgId, userId, threadStates) {
|
|
1425
1556
|
const lastReadAt = await lastReadAtForThread(db, orgId, userId, "approvals", threadStates);
|
|
1426
|
-
const approvalPredicate = eq(approvals.orgId, orgId);
|
|
1427
1557
|
const pendingApprovalPredicate = and(eq(approvals.orgId, orgId), eq(approvals.status, "pending"));
|
|
1428
1558
|
const [summaryRows, latestApprovalRows, latestCommentRows, unreadRows] = await Promise.all([
|
|
1429
1559
|
db
|
|
@@ -1431,11 +1561,11 @@ export function messengerService(db) {
|
|
|
1431
1561
|
itemCount: sql `count(*)::int`,
|
|
1432
1562
|
})
|
|
1433
1563
|
.from(approvals)
|
|
1434
|
-
.where(
|
|
1564
|
+
.where(pendingApprovalPredicate),
|
|
1435
1565
|
db
|
|
1436
1566
|
.select()
|
|
1437
1567
|
.from(approvals)
|
|
1438
|
-
.where(
|
|
1568
|
+
.where(pendingApprovalPredicate)
|
|
1439
1569
|
.orderBy(desc(approvals.updatedAt), desc(approvals.createdAt))
|
|
1440
1570
|
.limit(1),
|
|
1441
1571
|
db
|
|
@@ -1457,6 +1587,7 @@ export function messengerService(db) {
|
|
|
1457
1587
|
limit 1
|
|
1458
1588
|
) latest_comment on true
|
|
1459
1589
|
where ${approvals.orgId} = ${orgId}
|
|
1590
|
+
and ${approvals.status} = 'pending'
|
|
1460
1591
|
order by latest_comment.created_at desc
|
|
1461
1592
|
limit 1
|
|
1462
1593
|
`),
|
|
@@ -1485,7 +1616,7 @@ export function messengerService(db) {
|
|
|
1485
1616
|
? await db
|
|
1486
1617
|
.select()
|
|
1487
1618
|
.from(approvals)
|
|
1488
|
-
.where(and(eq(approvals.id, latestCommentRow.approvalId),
|
|
1619
|
+
.where(and(eq(approvals.id, latestCommentRow.approvalId), pendingApprovalPredicate))
|
|
1489
1620
|
.limit(1)
|
|
1490
1621
|
: [];
|
|
1491
1622
|
const candidateItems = [];
|
|
@@ -1518,6 +1649,8 @@ export function messengerService(db) {
|
|
|
1518
1649
|
agentId: heartbeatRuns.agentId,
|
|
1519
1650
|
status: heartbeatRuns.status,
|
|
1520
1651
|
error: heartbeatRuns.error,
|
|
1652
|
+
errorCode: heartbeatRuns.errorCode,
|
|
1653
|
+
resultJson: heartbeatRuns.resultJson,
|
|
1521
1654
|
stderrExcerpt: heartbeatRuns.stderrExcerpt,
|
|
1522
1655
|
stdoutExcerpt: heartbeatRuns.stdoutExcerpt,
|
|
1523
1656
|
contextSnapshot: heartbeatRuns.contextSnapshot,
|
|
@@ -1556,7 +1689,7 @@ export function messengerService(db) {
|
|
|
1556
1689
|
needsAttention: unreadCount > 0,
|
|
1557
1690
|
isPinned: false,
|
|
1558
1691
|
href: "/messenger/system/failed-runs",
|
|
1559
|
-
description: "Recent failed
|
|
1692
|
+
description: "Recent failed agent runs",
|
|
1560
1693
|
items: chronologicalItems,
|
|
1561
1694
|
},
|
|
1562
1695
|
};
|
|
@@ -1576,6 +1709,8 @@ export function messengerService(db) {
|
|
|
1576
1709
|
db
|
|
1577
1710
|
.select({
|
|
1578
1711
|
error: heartbeatRuns.error,
|
|
1712
|
+
errorCode: heartbeatRuns.errorCode,
|
|
1713
|
+
resultJson: heartbeatRuns.resultJson,
|
|
1579
1714
|
stderrExcerpt: heartbeatRuns.stderrExcerpt,
|
|
1580
1715
|
})
|
|
1581
1716
|
.from(heartbeatRuns)
|
|
@@ -1597,7 +1732,7 @@ export function messengerService(db) {
|
|
|
1597
1732
|
const unreadCount = lastReadAt ? Number(unreadRows[0]?.unreadCount ?? 0) : itemCount;
|
|
1598
1733
|
return {
|
|
1599
1734
|
itemCount,
|
|
1600
|
-
summary: systemSummary("failed-runs", "Failed runs", itemCount, normalizeDate(summaryRow?.latestActivityAt ?? null), unreadCount, lastReadAt, "No failed runs yet", latestRun ?
|
|
1735
|
+
summary: systemSummary("failed-runs", "Failed runs", itemCount, normalizeDate(summaryRow?.latestActivityAt ?? null), unreadCount, lastReadAt, "No failed runs yet", latestRun ? failedRunUserSummary(latestRun) : null),
|
|
1601
1736
|
};
|
|
1602
1737
|
}
|
|
1603
1738
|
async function loadBudgetAlertData(orgId, userId, threadStates) {
|
|
@@ -1859,15 +1994,17 @@ export function messengerService(db) {
|
|
|
1859
1994
|
return null;
|
|
1860
1995
|
return { lastReadAt: state.lastReadAt };
|
|
1861
1996
|
}
|
|
1997
|
+
const now = new Date();
|
|
1998
|
+
let effectiveReadAt = readAt;
|
|
1862
1999
|
if (threadKey.startsWith("issue:")) {
|
|
1863
2000
|
const issueId = threadKey.slice("issue:".length);
|
|
1864
2001
|
if (!await canUseIssueThread(orgId, userId, issueId))
|
|
1865
2002
|
return null;
|
|
2003
|
+
effectiveReadAt = maxDate(readAt, await loadLatestIssueAttentionAtById(orgId, userId, issueId)) ?? readAt;
|
|
2004
|
+
}
|
|
2005
|
+
else if (threadKey === "issues") {
|
|
2006
|
+
effectiveReadAt = maxDate(readAt, await loadLatestIssueAttentionAt(orgId, userId)) ?? readAt;
|
|
1866
2007
|
}
|
|
1867
|
-
const now = new Date();
|
|
1868
|
-
const effectiveReadAt = threadKey === "issues"
|
|
1869
|
-
? maxDate(readAt, await loadLatestIssueAttentionAt(orgId, userId)) ?? readAt
|
|
1870
|
-
: readAt;
|
|
1871
2008
|
const [row] = await db
|
|
1872
2009
|
.insert(messengerThreadUserStates)
|
|
1873
2010
|
.values({
|
|
@@ -1891,6 +2028,20 @@ export function messengerService(db) {
|
|
|
1891
2028
|
.returning();
|
|
1892
2029
|
return row ? { lastReadAt: row.lastReadAt } : null;
|
|
1893
2030
|
}
|
|
2031
|
+
async function dismissUnreadThreads(orgId, userId) {
|
|
2032
|
+
const summaries = await listThreadSummaries(orgId, userId);
|
|
2033
|
+
const unreadSummaries = summaries.filter((summary) => summary.unreadCount > 0);
|
|
2034
|
+
const dismissedThreadKeys = [];
|
|
2035
|
+
for (const summary of unreadSummaries) {
|
|
2036
|
+
const state = await markThreadRead(orgId, userId, summary.threadKey, normalizeDate(summary.latestActivityAt) ?? new Date());
|
|
2037
|
+
if (state)
|
|
2038
|
+
dismissedThreadKeys.push(summary.threadKey);
|
|
2039
|
+
}
|
|
2040
|
+
return {
|
|
2041
|
+
dismissedCount: dismissedThreadKeys.length,
|
|
2042
|
+
dismissedThreadKeys,
|
|
2043
|
+
};
|
|
2044
|
+
}
|
|
1894
2045
|
async function canUseIssueThread(orgId, userId, issueId) {
|
|
1895
2046
|
const [row] = await db
|
|
1896
2047
|
.select({ id: issues.id })
|
|
@@ -1901,6 +2052,14 @@ export function messengerService(db) {
|
|
|
1901
2052
|
where follow_row.org_id = ${orgId}
|
|
1902
2053
|
and follow_row.user_id = ${userId}
|
|
1903
2054
|
and follow_row.issue_id = ${issues.id}
|
|
2055
|
+
)`, sql `exists (
|
|
2056
|
+
select 1
|
|
2057
|
+
from ${activityLog} automation_notification_activity
|
|
2058
|
+
where automation_notification_activity.org_id = ${orgId}
|
|
2059
|
+
and automation_notification_activity.entity_type = 'issue'
|
|
2060
|
+
and automation_notification_activity.entity_id = ${issues.id}::text
|
|
2061
|
+
and automation_notification_activity.action = 'automation.issue_created_notification'
|
|
2062
|
+
and automation_notification_activity.details->>'userId' = ${userId}
|
|
1904
2063
|
)`)))
|
|
1905
2064
|
.limit(1);
|
|
1906
2065
|
return Boolean(row);
|
|
@@ -1947,6 +2106,8 @@ export function messengerService(db) {
|
|
|
1947
2106
|
}
|
|
1948
2107
|
return {
|
|
1949
2108
|
listCustomGroups,
|
|
2109
|
+
listThreadTitles,
|
|
2110
|
+
listCustomGroupThreadTitles,
|
|
1950
2111
|
createCustomGroup,
|
|
1951
2112
|
createCustomGroupWithEntries,
|
|
1952
2113
|
updateCustomGroup,
|
|
@@ -1964,6 +2125,7 @@ export function messengerService(db) {
|
|
|
1964
2125
|
getApprovalsThread,
|
|
1965
2126
|
getSystemThread,
|
|
1966
2127
|
getThreadState,
|
|
2128
|
+
dismissUnreadThreads,
|
|
1967
2129
|
markThreadRead,
|
|
1968
2130
|
setThreadRead: markThreadRead,
|
|
1969
2131
|
setThreadPinned,
|