@rudderhq/server 0.4.5 → 0.4.6-canary.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/app.d.ts.map +1 -1
- package/dist/app.js +2 -0
- package/dist/app.js.map +1 -1
- package/dist/auth/better-auth.d.ts +15 -3
- package/dist/auth/better-auth.d.ts.map +1 -1
- package/dist/auth/better-auth.js.map +1 -1
- package/dist/bootstrap/plugin-host-runtime.d.ts +8 -8
- 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 +27 -32
- package/dist/bundled-plugins/plugin-linear/dist/worker.js.map +2 -2
- package/dist/bundled-plugins/plugin-linear/package.json +1 -1
- package/dist/config.d.ts +0 -8
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +1 -30
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -18
- package/dist/index.js.map +1 -1
- package/dist/local-runtime.d.ts +0 -3
- package/dist/local-runtime.d.ts.map +1 -1
- package/dist/local-runtime.js +0 -34
- package/dist/local-runtime.js.map +1 -1
- package/dist/middleware/auth.d.ts.map +1 -1
- package/dist/middleware/auth.js +14 -2
- package/dist/middleware/auth.js.map +1 -1
- package/dist/onboarding-assets/ceo/SOUL.md +8 -5
- package/dist/routes/access-onboarding.helpers.d.ts.map +1 -1
- package/dist/routes/access-onboarding.helpers.js +2 -24
- package/dist/routes/access-onboarding.helpers.js.map +1 -1
- package/dist/routes/access.helpers.d.ts +1 -1
- package/dist/routes/approvals.d.ts.map +1 -1
- package/dist/routes/approvals.js +1 -89
- package/dist/routes/approvals.js.map +1 -1
- package/dist/routes/browser.d.ts +30 -0
- package/dist/routes/browser.d.ts.map +1 -0
- package/dist/routes/browser.js +263 -0
- package/dist/routes/browser.js.map +1 -0
- package/dist/routes/chats.d.ts.map +1 -1
- package/dist/routes/chats.js +13 -232
- 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 +46 -227
- 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 +26 -146
- package/dist/routes/instance-settings.js.map +1 -1
- package/dist/routes/onboarding.d.ts.map +1 -1
- package/dist/routes/onboarding.js +33 -31
- package/dist/routes/onboarding.js.map +1 -1
- package/dist/routes/plugin-ui-static.d.ts.map +1 -1
- package/dist/routes/plugin-ui-static.js +2 -4
- package/dist/routes/plugin-ui-static.js.map +1 -1
- package/dist/routes/plugins.d.ts.map +1 -1
- package/dist/routes/plugins.js +2 -4
- package/dist/routes/plugins.js.map +1 -1
- package/dist/services/access.d.ts +23 -23
- package/dist/services/activity-log.d.ts.map +1 -1
- package/dist/services/activity-log.js +2 -40
- package/dist/services/activity-log.js.map +1 -1
- package/dist/services/activity.d.ts +13 -13
- package/dist/services/agent-run-context.d.ts +2 -1
- package/dist/services/agent-run-context.d.ts.map +1 -1
- package/dist/services/agent-run-context.js +29 -4
- package/dist/services/agent-run-context.js.map +1 -1
- package/dist/services/agents.d.ts +36 -36
- package/dist/services/approvals.d.ts +18 -18
- package/dist/services/assets.d.ts +6 -6
- package/dist/services/automation-chat-output.d.ts +1 -1
- package/dist/services/automations.d.ts +37 -37
- package/dist/services/automations.d.ts.map +1 -1
- package/dist/services/automations.js +2 -6
- package/dist/services/automations.js.map +1 -1
- package/dist/services/board-auth.d.ts +38 -38
- package/dist/services/browser-broker.d.ts +43 -0
- package/dist/services/browser-broker.d.ts.map +1 -0
- package/dist/services/browser-broker.js +173 -0
- package/dist/services/browser-broker.js.map +1 -0
- package/dist/services/browser-broker.test.d.ts +2 -0
- package/dist/services/browser-broker.test.d.ts.map +1 -0
- package/dist/services/browser-broker.test.js +154 -0
- package/dist/services/browser-broker.test.js.map +1 -0
- package/dist/services/browser-capability.d.ts +20 -0
- package/dist/services/browser-capability.d.ts.map +1 -0
- package/dist/services/browser-capability.js +29 -0
- package/dist/services/browser-capability.js.map +1 -0
- package/dist/services/calendar.d.ts +34 -34
- package/dist/services/chat-agent-runs.d.ts.map +1 -1
- package/dist/services/chat-agent-runs.js +2 -4
- 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.js +6 -4
- package/dist/services/chat-assistant.js.map +1 -1
- package/dist/services/chat-assistant.runtime-batch.d.ts +3 -0
- package/dist/services/chat-assistant.runtime-batch.d.ts.map +1 -0
- package/dist/services/chat-assistant.runtime-batch.js +16 -0
- package/dist/services/chat-assistant.runtime-batch.js.map +1 -0
- package/dist/services/chat-work-manifest.d.ts +7 -0
- package/dist/services/chat-work-manifest.d.ts.map +1 -0
- package/dist/services/chat-work-manifest.js +235 -0
- package/dist/services/chat-work-manifest.js.map +1 -0
- package/dist/services/chats.d.ts +64 -64
- package/dist/services/chats.d.ts.map +1 -1
- package/dist/services/chats.js +2 -4
- package/dist/services/chats.js.map +1 -1
- package/dist/services/costs.d.ts +2 -2
- package/dist/services/costs.d.ts.map +1 -1
- package/dist/services/costs.js +0 -32
- package/dist/services/costs.js.map +1 -1
- package/dist/services/finance.d.ts +11 -11
- package/dist/services/goals.d.ts +20 -20
- package/dist/services/heartbeat.d.ts +1 -1
- package/dist/services/heartbeat.d.ts.map +1 -1
- package/dist/services/heartbeat.js +1 -1
- package/dist/services/heartbeat.js.map +1 -1
- package/dist/services/instance-settings.d.ts +3 -1
- package/dist/services/instance-settings.d.ts.map +1 -1
- package/dist/services/instance-settings.js +30 -1
- package/dist/services/instance-settings.js.map +1 -1
- package/dist/services/integrations/agent-integrations.d.ts +8 -8
- package/dist/services/integrations/custom-integrations.d.ts +3 -3
- package/dist/services/integrations/feishu/inbound-dispatcher-db.d.ts.map +1 -1
- package/dist/services/integrations/feishu/inbound-dispatcher-db.js +10 -11
- package/dist/services/integrations/feishu/inbound-dispatcher-db.js.map +1 -1
- package/dist/services/integrations/feishu/user-bindings.d.ts.map +1 -1
- package/dist/services/integrations/feishu/user-bindings.js +2 -4
- package/dist/services/integrations/feishu/user-bindings.js.map +1 -1
- package/dist/services/issue-approvals.d.ts +3 -3
- package/dist/services/issues.comments-attachments.d.ts +8 -8
- package/dist/services/issues.d.ts +19 -19
- package/dist/services/issues.helpers.d.ts.map +1 -1
- package/dist/services/issues.helpers.js +2 -6
- package/dist/services/issues.helpers.js.map +1 -1
- package/dist/services/knowledge-portability/organization-skills.d.ts +2 -1
- package/dist/services/knowledge-portability/organization-skills.d.ts.map +1 -1
- package/dist/services/knowledge-portability/organization-skills.js +16 -6
- package/dist/services/knowledge-portability/organization-skills.js.map +1 -1
- package/dist/services/messenger.d.ts +3 -3
- package/dist/services/messenger.d.ts.map +1 -1
- package/dist/services/messenger.js +3 -0
- package/dist/services/messenger.js.map +1 -1
- package/dist/services/organization-intelligence-profiles.d.ts.map +1 -1
- package/dist/services/organization-intelligence-profiles.js +2 -0
- package/dist/services/organization-intelligence-profiles.js.map +1 -1
- package/dist/services/orgs.d.ts +1 -1
- package/dist/services/orgs.d.ts.map +1 -1
- package/dist/services/orgs.js +2 -10
- package/dist/services/orgs.js.map +1 -1
- package/dist/services/plugin-job-scheduler.d.ts.map +1 -1
- package/dist/services/plugin-job-scheduler.js +20 -132
- package/dist/services/plugin-job-scheduler.js.map +1 -1
- package/dist/services/plugin-registry.d.ts +71 -71
- package/dist/services/plugin-registry.d.ts.map +1 -1
- package/dist/services/plugin-registry.js +2 -5
- package/dist/services/plugin-registry.js.map +1 -1
- package/dist/services/postgres-errors.d.ts +6 -0
- package/dist/services/postgres-errors.d.ts.map +1 -0
- package/dist/services/postgres-errors.js +30 -0
- package/dist/services/postgres-errors.js.map +1 -0
- package/dist/services/projects.d.ts +2 -2
- package/dist/services/run-intelligence.d.ts +0 -5
- package/dist/services/run-intelligence.d.ts.map +1 -1
- package/dist/services/run-intelligence.js +1 -11
- package/dist/services/run-intelligence.js.map +1 -1
- package/dist/services/runtime-kernel/heartbeat.core.d.ts +1 -34
- package/dist/services/runtime-kernel/heartbeat.core.d.ts.map +1 -1
- package/dist/services/runtime-kernel/heartbeat.core.js +0 -35
- package/dist/services/runtime-kernel/heartbeat.core.js.map +1 -1
- package/dist/services/runtime-kernel/heartbeat.d.ts +29 -29
- package/dist/services/runtime-kernel/heartbeat.d.ts.map +1 -1
- package/dist/services/runtime-kernel/heartbeat.execute.d.ts.map +1 -1
- package/dist/services/runtime-kernel/heartbeat.execute.js +849 -950
- package/dist/services/runtime-kernel/heartbeat.execute.js.map +1 -1
- package/dist/services/runtime-kernel/heartbeat.js +2 -119
- package/dist/services/runtime-kernel/heartbeat.js.map +1 -1
- package/dist/services/runtime-kernel/heartbeat.sessions.d.ts.map +1 -1
- package/dist/services/runtime-kernel/heartbeat.sessions.js +1 -1
- package/dist/services/runtime-kernel/heartbeat.sessions.js.map +1 -1
- package/dist/services/runtime-kernel/model-fallback.d.ts +2 -0
- package/dist/services/runtime-kernel/model-fallback.d.ts.map +1 -1
- package/dist/services/runtime-kernel/model-fallback.js +108 -9
- package/dist/services/runtime-kernel/model-fallback.js.map +1 -1
- package/dist/services/secrets.d.ts +20 -20
- package/dist/services/workspace-operations.d.ts.map +1 -1
- package/dist/services/workspace-operations.js +48 -74
- package/dist/services/workspace-operations.js.map +1 -1
- package/dist/services/workspace-runtime.services.d.ts +3 -3
- package/package.json +19 -23
- package/resources/bundled-skills/browser/SKILL.md +49 -0
- package/resources/bundled-skills/browser/agents/openai.yaml +4 -0
- package/resources/bundled-skills/browser/references/tool-contract.md +73 -0
- package/resources/bundled-skills/rudder/SKILL.md +5 -2
- package/resources/bundled-skills/rudder/references/cli-reference.md +17 -0
- package/skills/browser/SKILL.md +49 -0
- package/skills/browser/agents/openai.yaml +4 -0
- package/skills/browser/references/tool-contract.md +73 -0
- package/skills/rudder/SKILL.md +5 -2
- package/skills/rudder/references/cli-reference.md +17 -0
- package/ui-dist/assets/abnfDiagram-VRR7QNED-UdnRjOt5.js +1 -0
- package/ui-dist/assets/arc-DqWAOCPb.js +1 -0
- package/ui-dist/assets/architectureDiagram-ZJ3FMSHR-C0BVszD_.js +36 -0
- package/ui-dist/assets/blockDiagram-677ZJIJ3-jI1GYvsK.js +132 -0
- package/ui-dist/assets/c4Diagram-LMCZKHZV-BUskTH8O.js +10 -0
- package/ui-dist/assets/channel-DuVz3zrR.js +1 -0
- package/ui-dist/assets/{chunk-QZHKN3VN-CoUe43bE.js → chunk-2Q5K7J3B-DnXbkSRv.js} +1 -1
- package/ui-dist/assets/{chunk-JSJVCQXG-CGWgDKBb.js → chunk-32BRIVSS-CItDm5nZ.js} +1 -1
- package/ui-dist/assets/{chunk-FMBD7UC4-D_yZ_WmF.js → chunk-5VM5RSS4-DDWOtVg4.js} +1 -1
- package/ui-dist/assets/chunk-EX3LRPZG-3P2vrzg-.js +231 -0
- package/ui-dist/assets/{chunk-4BX2VUAB-Cd0jMFjT.js → chunk-JWPE2WC7-Cddilj_R.js} +1 -1
- package/ui-dist/assets/chunk-MOJQB5TN-lFfFNAzo.js +88 -0
- package/ui-dist/assets/chunk-RYQCIY6F-Bx6usdO8.js +1 -0
- package/ui-dist/assets/chunk-V7JOEXUC-DJJZibRk.js +206 -0
- package/ui-dist/assets/{chunk-KX2RTZJC-PgfQ6Dqz.js → chunk-VR4S4FIN-JsA7MsJ2.js} +1 -1
- package/ui-dist/assets/{chunk-55IACEB6-C-AmshGj.js → chunk-XXDRQBXY-ieRhxMcL.js} +1 -1
- package/ui-dist/assets/classDiagram-OUVF2IWQ-CPg_NswG.js +1 -0
- package/ui-dist/assets/classDiagram-v2-EOCWNBFH-CPg_NswG.js +1 -0
- package/ui-dist/assets/{cose-bilkent-S5V4N54A-jsoDVyK9.js → cose-bilkent-JH36ORCC-C8RKSRW3.js} +1 -1
- package/ui-dist/assets/cynefin-VYW2F7L2-BpLH3NYF.js +178 -0
- package/ui-dist/assets/cynefinDiagram-TSTJHNR4-BE910bVh.js +62 -0
- package/ui-dist/assets/cytoscape.esm-DTSO7Bv0.js +331 -0
- package/ui-dist/assets/dagre-VKFMJZFB-Y3oEC2I7.js +4 -0
- package/ui-dist/assets/diagram-FQU43EPY-CRR8acur.js +3 -0
- package/ui-dist/assets/diagram-G47NLZAW-CYMkvxPa.js +24 -0
- package/ui-dist/assets/diagram-NH7WQ7WH-5pDqjsg8.js +24 -0
- package/ui-dist/assets/diagram-OA4YK3LP-BLftqX4w.js +30 -0
- package/ui-dist/assets/diagram-WEI45ONY-C8Wlpiya.js +41 -0
- package/ui-dist/assets/ebnfDiagram-CCIWWBDH-BkNqh_K_.js +1 -0
- package/ui-dist/assets/erDiagram-Q63AITRT-BMii4oU_.js +85 -0
- package/ui-dist/assets/flowDiagram-23GEKE2U-DDZzMurM.js +156 -0
- package/ui-dist/assets/ganttDiagram-NO4QXBWP-CAVNlZo_.js +292 -0
- package/ui-dist/assets/gitGraphDiagram-IHSO6WYX-CnVqJTno.js +106 -0
- package/ui-dist/assets/graph-UuBzmM6i.js +1 -0
- package/ui-dist/assets/{index-BBL80GJ3.js → index-B8KTqTd-.js} +1 -1
- package/ui-dist/assets/{index-BSRzECfZ.js → index-BCFDdipt.js} +1 -1
- package/ui-dist/assets/{index-Be_UUduv.js → index-BCRNL8Ur.js} +1 -1
- package/ui-dist/assets/{index-DgfqS5r-.js → index-BoYg6lnD.js} +1 -1
- package/ui-dist/assets/{index-LKZoMmLm.js → index-ByMcYjRc.js} +1 -1
- package/ui-dist/assets/index-C0SZ-iPk.css +1 -0
- package/ui-dist/assets/{index-DDvz8goz.js → index-CE8o_odr.js} +1 -1
- package/ui-dist/assets/{index-C2Ne_Flh.js → index-CUD9_zON.js} +1 -1
- package/ui-dist/assets/{index-Cd5DOkgF.js → index-CfJwloTV.js} +1 -1
- package/ui-dist/assets/{index-CMRK9PUO.js → index-Cps6JXnH.js} +1 -1
- package/ui-dist/assets/{index-CkdLQ1A4.js → index-DFFkOhH6.js} +1 -1
- package/ui-dist/assets/{index-ipqs2akW.js → index-DLcjSOvN.js} +1 -1
- package/ui-dist/assets/{index-B-4En24L.js → index-D_zjkSK9.js} +1 -1
- package/ui-dist/assets/{index-CjLYHamo.js → index-DhkpIEG5.js} +1 -1
- package/ui-dist/assets/{index-B4KMgdrI.js → index-HkHmJ1SI.js} +1 -1
- package/ui-dist/assets/{index-Dxe3o4t_.js → index-QU8L2MDH.js} +1 -1
- package/ui-dist/assets/{index-1Ubio04r.js → index-QXiy-HtS.js} +1 -1
- package/ui-dist/assets/{index-BXbeltXq.js → index-XYoWwmC5.js} +1 -1
- package/ui-dist/assets/{index-BL10wT_h.js → index-eXis7jEz.js} +454 -470
- package/ui-dist/assets/infoDiagram-FWYZ7A6U-zHkiZLiR.js +2 -0
- package/ui-dist/assets/{ishikawaDiagram-PHBUUO56-C08ZUJEU.js → ishikawaDiagram-FXEZZL3T-Box-AMwH.js} +3 -3
- package/ui-dist/assets/journeyDiagram-5HDEW3XC-CFIzHPs2.js +139 -0
- package/ui-dist/assets/{kanban-definition-K7BYSVSG-BcJd4-9s.js → kanban-definition-HUTT4EX6-DHqpBUqM.js} +8 -8
- package/ui-dist/assets/katex-C5jXJg4s.js +257 -0
- package/ui-dist/assets/layout-C-yC2nBc.js +1 -0
- package/ui-dist/assets/{linear-CqN63wCD.js → linear-DUNXAcN5.js} +1 -1
- package/ui-dist/assets/map-BercEElL.js +1 -0
- package/ui-dist/assets/mermaid.core-Nehb2FR-.js +314 -0
- package/ui-dist/assets/mindmap-definition-LN4V7U3C-D0zryK2s.js +96 -0
- package/ui-dist/assets/pegDiagram-2B236MQR-C5vq9Ju0.js +1 -0
- package/ui-dist/assets/pieDiagram-ENE6RG2P-D0VOjPBZ.js +39 -0
- package/ui-dist/assets/quadrantDiagram-ABIIQ3AL-B8xuixyw.js +7 -0
- package/ui-dist/assets/railroadDiagram-RFXS5EU6-Bf9YgNO5.js +1 -0
- package/ui-dist/assets/requirementDiagram-TGXJPOKE-CDEqlFZu.js +84 -0
- package/ui-dist/assets/sankeyDiagram-HTMAVEWB-C7PsAz-L.js +40 -0
- package/ui-dist/assets/sequenceDiagram-DBY2YBRQ-DzvSiGUe.js +162 -0
- package/ui-dist/assets/sizeCapture-X5ZJPWSS-DSGNUJ8t.js +1 -0
- package/ui-dist/assets/stateDiagram-2N3HPSRC-BZtTZHzp.js +1 -0
- package/ui-dist/assets/stateDiagram-v2-6OUMAXLB-BGgjQnDH.js +1 -0
- package/ui-dist/assets/swimlanes-5IMT3BWC-DV7m1IAS.js +2 -0
- package/ui-dist/assets/swimlanesDiagram-G3AALYLV-QL5BklQV.js +8 -0
- package/ui-dist/assets/timeline-definition-FHXFAJF6-BMOmWJRu.js +120 -0
- package/ui-dist/assets/vennDiagram-L72KCM5P-DS6i029a.js +34 -0
- package/ui-dist/assets/wardleyDiagram-EHGQE667-Ai7opcM1.js +78 -0
- package/ui-dist/assets/xychartDiagram-FW5EYKEG-BlA47Exk.js +7 -0
- package/ui-dist/index.html +2 -2
- package/dist/langfuse-transcript.d.ts +0 -33
- package/dist/langfuse-transcript.d.ts.map +0 -1
- package/dist/langfuse-transcript.js +0 -401
- package/dist/langfuse-transcript.js.map +0 -1
- package/dist/langfuse.d.ts +0 -93
- package/dist/langfuse.d.ts.map +0 -1
- package/dist/langfuse.js +0 -420
- package/dist/langfuse.js.map +0 -1
- package/ui-dist/assets/_basePickBy-Cniq5QAz.js +0 -1
- package/ui-dist/assets/_baseUniq-aSj0wr7H.js +0 -1
- package/ui-dist/assets/arc-C4Mg91_a.js +0 -1
- package/ui-dist/assets/architectureDiagram-2XIMDMQ5-DfqLRajq.js +0 -36
- package/ui-dist/assets/blockDiagram-WCTKOSBZ-BbefXkmh.js +0 -132
- package/ui-dist/assets/c4Diagram-IC4MRINW-BVPjmrfV.js +0 -10
- package/ui-dist/assets/channel-B-bxwuub.js +0 -1
- package/ui-dist/assets/chunk-NQ4KR5QH-D78Rqvef.js +0 -220
- package/ui-dist/assets/chunk-WL4C6EOR-CaI2CXRo.js +0 -189
- package/ui-dist/assets/classDiagram-VBA2DB6C-oNkrSzge.js +0 -1
- package/ui-dist/assets/classDiagram-v2-RAHNMMFH-oNkrSzge.js +0 -1
- package/ui-dist/assets/clone-D1LQw6bn.js +0 -1
- package/ui-dist/assets/cytoscape.esm-BQaXIfA_.js +0 -331
- package/ui-dist/assets/dagre-KLK3FWXG-Cedmep7r.js +0 -4
- package/ui-dist/assets/diagram-E7M64L7V-BWIKKX1f.js +0 -24
- package/ui-dist/assets/diagram-IFDJBPK2-De8ij4wb.js +0 -43
- package/ui-dist/assets/diagram-P4PSJMXO-DfqKc5zd.js +0 -24
- package/ui-dist/assets/erDiagram-INFDFZHY-CacJL_tU.js +0 -70
- package/ui-dist/assets/flowDiagram-PKNHOUZH-CQbuZmQW.js +0 -162
- package/ui-dist/assets/ganttDiagram-A5KZAMGK-uMPy8GwP.js +0 -292
- package/ui-dist/assets/gitGraphDiagram-K3NZZRJ6-D10Ck-1y.js +0 -65
- package/ui-dist/assets/graph-DMAYpSbz.js +0 -1
- package/ui-dist/assets/index-yhZee3iu.css +0 -1
- package/ui-dist/assets/infoDiagram-LFFYTUFH-WdYfk1ti.js +0 -2
- package/ui-dist/assets/journeyDiagram-4ABVD52K-A3rlVmO2.js +0 -139
- package/ui-dist/assets/katex-B1X10hvy.js +0 -261
- package/ui-dist/assets/layout-BjkotBZ2.js +0 -1
- package/ui-dist/assets/mermaid.core-D3iDEDQJ.js +0 -255
- package/ui-dist/assets/mindmap-definition-YRQLILUH-Cm-NQlLA.js +0 -68
- package/ui-dist/assets/pieDiagram-SKSYHLDU-BaDPvveA.js +0 -30
- package/ui-dist/assets/quadrantDiagram-337W2JSQ-0dX4kokb.js +0 -7
- package/ui-dist/assets/requirementDiagram-Z7DCOOCP-BdbJFOUK.js +0 -73
- package/ui-dist/assets/sankeyDiagram-WA2Y5GQK-ZMXNjh7n.js +0 -10
- package/ui-dist/assets/sequenceDiagram-2WXFIKYE-DfR6JqDW.js +0 -145
- package/ui-dist/assets/stateDiagram-RAJIS63D-BcGX6JIu.js +0 -1
- package/ui-dist/assets/stateDiagram-v2-FVOUBMTO-D1SMoFW3.js +0 -1
- package/ui-dist/assets/timeline-definition-YZTLITO2-DrIAH8-G.js +0 -61
- package/ui-dist/assets/treemap-KZPCXAKY-DEopGTtM.js +0 -162
- package/ui-dist/assets/vennDiagram-LZ73GAT5-CM3yysPE.js +0 -34
- package/ui-dist/assets/xychartDiagram-JWTSCODW-C34pUeNV.js +0 -7
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
import { heartbeatRuns } from "@rudderhq/db";
|
|
2
|
+
import { eq } from "drizzle-orm";
|
|
3
|
+
import { Router } from "express";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
import { forbidden, unprocessable } from "../errors.js";
|
|
6
|
+
import { logger } from "../middleware/logger.js";
|
|
7
|
+
import { BROWSER_ACTIONS, BrowserBrokerError, browserBrokerRegistry, } from "../services/browser-broker.js";
|
|
8
|
+
import { resolveBrowserCapability } from "../services/browser-capability.js";
|
|
9
|
+
import { instanceSettingsService, logActivity } from "../services/index.js";
|
|
10
|
+
import { assertInstanceAdmin } from "./authz.js";
|
|
11
|
+
const brokerRegistrationSchema = z.object({
|
|
12
|
+
endpoint: z.string().min(1).max(2_048),
|
|
13
|
+
token: z.string().min(32).max(512),
|
|
14
|
+
}).strict();
|
|
15
|
+
const safeWebUrlSchema = z.string().min(1).max(8_192).refine((value) => {
|
|
16
|
+
try {
|
|
17
|
+
const parsed = new URL(value);
|
|
18
|
+
return parsed.protocol === "http:" || parsed.protocol === "https:";
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
}, "Browser URL must use http or https.");
|
|
24
|
+
const tabIdSchema = z.string().trim().min(1).max(160);
|
|
25
|
+
const refSchema = z.string().trim().min(1).max(160);
|
|
26
|
+
const browserActionSchemas = {
|
|
27
|
+
tabs: z.object({}).strict(),
|
|
28
|
+
open: z.object({ url: safeWebUrlSchema }).strict(),
|
|
29
|
+
navigate: z.object({ tabId: tabIdSchema, url: safeWebUrlSchema }).strict(),
|
|
30
|
+
read: z.object({ tabId: tabIdSchema }).strict(),
|
|
31
|
+
click: z.object({ tabId: tabIdSchema, ref: refSchema }).strict(),
|
|
32
|
+
type: z.object({
|
|
33
|
+
tabId: tabIdSchema,
|
|
34
|
+
ref: refSchema,
|
|
35
|
+
text: z.string().max(100_000),
|
|
36
|
+
submit: z.boolean().optional(),
|
|
37
|
+
}).strict(),
|
|
38
|
+
screenshot: z.object({ tabId: tabIdSchema }).strict(),
|
|
39
|
+
close: z.object({ tabId: tabIdSchema }).strict(),
|
|
40
|
+
};
|
|
41
|
+
function sendBrowserError(res, status, code, message) {
|
|
42
|
+
res.status(status).json({ error: message, code });
|
|
43
|
+
}
|
|
44
|
+
function requireLocalBrowser(deploymentMode) {
|
|
45
|
+
if (deploymentMode !== "local_trusted") {
|
|
46
|
+
throw unprocessable("Rudder Browser is available only in local_trusted mode.");
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function requireAgentBrowserIdentity(req, res) {
|
|
50
|
+
if (req.actor.type !== "agent" || !req.actor.orgId || !req.actor.agentId) {
|
|
51
|
+
throw forbidden("Agent access required");
|
|
52
|
+
}
|
|
53
|
+
if (req.actor.source !== "agent_jwt") {
|
|
54
|
+
sendBrowserError(res, 403, "browser_run_credential_required", "Rudder Browser tools require a run-scoped runtime credential.");
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
if (!req.actor.runId) {
|
|
58
|
+
sendBrowserError(res, 400, "browser_run_required", "Rudder Browser tools require a runtime-owned run ID.");
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
orgId: req.actor.orgId,
|
|
63
|
+
agentId: req.actor.agentId,
|
|
64
|
+
runId: req.actor.runId,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
function safeOrigin(value) {
|
|
68
|
+
if (typeof value !== "string")
|
|
69
|
+
return null;
|
|
70
|
+
try {
|
|
71
|
+
const parsed = new URL(value);
|
|
72
|
+
return parsed.protocol === "http:" || parsed.protocol === "https:" ? parsed.origin : null;
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
function browserBrokerStatus(code) {
|
|
79
|
+
if (code === "browser_unavailable")
|
|
80
|
+
return 503;
|
|
81
|
+
if (code === "browser_disabled")
|
|
82
|
+
return 409;
|
|
83
|
+
if (code === "browser_tab_limit")
|
|
84
|
+
return 429;
|
|
85
|
+
if (code === "browser_timeout")
|
|
86
|
+
return 504;
|
|
87
|
+
if (code === "browser_result_too_large")
|
|
88
|
+
return 413;
|
|
89
|
+
if (code === "browser_tab_forbidden")
|
|
90
|
+
return 403;
|
|
91
|
+
if (code === "browser_tab_not_found" || code === "browser_ref_not_found")
|
|
92
|
+
return 404;
|
|
93
|
+
if (code === "browser_invalid_argument" || code === "browser_unsafe_url")
|
|
94
|
+
return 422;
|
|
95
|
+
return 502;
|
|
96
|
+
}
|
|
97
|
+
export function browserRoutes(db, options) {
|
|
98
|
+
const router = Router();
|
|
99
|
+
const registry = options.registry ?? browserBrokerRegistry;
|
|
100
|
+
const settings = instanceSettingsService(db);
|
|
101
|
+
const getBrowserSettings = options.getBrowserSettings ?? (() => settings.getBrowser());
|
|
102
|
+
const findRun = options.findRun ?? (async (runId) => db
|
|
103
|
+
.select({
|
|
104
|
+
id: heartbeatRuns.id,
|
|
105
|
+
orgId: heartbeatRuns.orgId,
|
|
106
|
+
agentId: heartbeatRuns.agentId,
|
|
107
|
+
status: heartbeatRuns.status,
|
|
108
|
+
})
|
|
109
|
+
.from(heartbeatRuns)
|
|
110
|
+
.where(eq(heartbeatRuns.id, runId))
|
|
111
|
+
.then((rows) => rows[0] ?? null));
|
|
112
|
+
const recordActivity = options.recordActivity ?? ((event) => logActivity(db, event));
|
|
113
|
+
router.put("/instance/browser/broker", async (req, res) => {
|
|
114
|
+
assertInstanceAdmin(req);
|
|
115
|
+
requireLocalBrowser(options.deploymentMode);
|
|
116
|
+
const parsed = brokerRegistrationSchema.safeParse(req.body);
|
|
117
|
+
if (!parsed.success) {
|
|
118
|
+
sendBrowserError(res, 400, "browser_broker_invalid_registration", "Browser Broker registration is invalid.");
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
try {
|
|
122
|
+
registry.register(parsed.data);
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
if (error instanceof BrowserBrokerError) {
|
|
126
|
+
sendBrowserError(res, 400, error.code, error.message);
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
throw error;
|
|
130
|
+
}
|
|
131
|
+
res.status(204).end();
|
|
132
|
+
});
|
|
133
|
+
router.delete("/instance/browser/broker", async (req, res) => {
|
|
134
|
+
assertInstanceAdmin(req);
|
|
135
|
+
requireLocalBrowser(options.deploymentMode);
|
|
136
|
+
const parsed = z.object({ token: z.string().min(32).max(512) }).strict().safeParse(req.body);
|
|
137
|
+
if (!parsed.success) {
|
|
138
|
+
sendBrowserError(res, 400, "browser_broker_invalid_registration", "Browser Broker credential is invalid.");
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
registry.unregister(parsed.data.token);
|
|
142
|
+
res.status(204).end();
|
|
143
|
+
});
|
|
144
|
+
router.post("/browser/:action", async (req, res) => {
|
|
145
|
+
if (options.deploymentMode !== "local_trusted") {
|
|
146
|
+
sendBrowserError(res, 403, "browser_runtime_unsupported", "Rudder Browser tools are available only in local_trusted mode.");
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
const identity = requireAgentBrowserIdentity(req, res);
|
|
150
|
+
if (!identity)
|
|
151
|
+
return;
|
|
152
|
+
const action = req.params.action;
|
|
153
|
+
if (!BROWSER_ACTIONS.includes(action)) {
|
|
154
|
+
sendBrowserError(res, 404, "browser_action_not_found", "Unknown Rudder Browser action.");
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
const parsed = browserActionSchemas[action].safeParse(req.body ?? {});
|
|
158
|
+
if (!parsed.success) {
|
|
159
|
+
sendBrowserError(res, 400, "browser_invalid_argument", "Rudder Browser arguments are invalid.");
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
const actionArgs = parsed.data;
|
|
163
|
+
const browserSettings = await getBrowserSettings();
|
|
164
|
+
const browserCapability = resolveBrowserCapability({
|
|
165
|
+
deploymentMode: options.deploymentMode,
|
|
166
|
+
browserEnabled: browserSettings.enabled,
|
|
167
|
+
agentRuntimeType: req.actor.adapterType,
|
|
168
|
+
});
|
|
169
|
+
if (!browserCapability.instanceEligible) {
|
|
170
|
+
sendBrowserError(res, 409, "browser_disabled", "Rudder Browser is disabled in Settings.");
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
if (!browserCapability.runEligible) {
|
|
174
|
+
sendBrowserError(res, 403, "browser_runtime_unsupported", "The current Agent runtime does not support Rudder Browser tools.");
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
if (!registry.isAvailable()) {
|
|
178
|
+
sendBrowserError(res, 503, "browser_unavailable", "Rudder Browser is unavailable because Desktop is not connected.");
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
const run = await findRun(identity.runId);
|
|
182
|
+
if (!run || run.orgId !== identity.orgId || run.agentId !== identity.agentId) {
|
|
183
|
+
sendBrowserError(res, 403, "browser_run_forbidden", "The current run does not own this Browser session.");
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
if (run.status !== "running") {
|
|
187
|
+
sendBrowserError(res, 409, "browser_run_inactive", "The current run is no longer active.");
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
const requestedTabId = typeof actionArgs.tabId === "string" ? actionArgs.tabId : identity.runId;
|
|
191
|
+
const requestedOrigin = safeOrigin(actionArgs.url);
|
|
192
|
+
await recordActivity({
|
|
193
|
+
orgId: identity.orgId,
|
|
194
|
+
actorType: "agent",
|
|
195
|
+
actorId: identity.agentId,
|
|
196
|
+
agentId: identity.agentId,
|
|
197
|
+
runId: identity.runId,
|
|
198
|
+
action: `agent.browser.${action}.requested`,
|
|
199
|
+
entityType: "browser_tab",
|
|
200
|
+
entityId: requestedTabId,
|
|
201
|
+
details: {
|
|
202
|
+
action,
|
|
203
|
+
status: "requested",
|
|
204
|
+
...(requestedOrigin ? { origin: requestedOrigin } : {}),
|
|
205
|
+
},
|
|
206
|
+
});
|
|
207
|
+
let result;
|
|
208
|
+
try {
|
|
209
|
+
result = await registry.forward({ identity, action, args: actionArgs });
|
|
210
|
+
}
|
|
211
|
+
catch (error) {
|
|
212
|
+
if (error instanceof BrowserBrokerError) {
|
|
213
|
+
void recordActivity({
|
|
214
|
+
orgId: identity.orgId,
|
|
215
|
+
actorType: "agent",
|
|
216
|
+
actorId: identity.agentId,
|
|
217
|
+
agentId: identity.agentId,
|
|
218
|
+
runId: identity.runId,
|
|
219
|
+
action: `agent.browser.${action}.failed`,
|
|
220
|
+
entityType: "browser_tab",
|
|
221
|
+
entityId: requestedTabId,
|
|
222
|
+
details: { action, status: "failed", code: error.code },
|
|
223
|
+
}).catch((activityError) => {
|
|
224
|
+
logger.warn({ err: activityError, action, runId: identity.runId }, "failed to record Browser action failure");
|
|
225
|
+
});
|
|
226
|
+
sendBrowserError(res, browserBrokerStatus(error.code), error.code, error.message);
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
throw error;
|
|
230
|
+
}
|
|
231
|
+
const resultRecord = typeof result === "object" && result !== null && !Array.isArray(result)
|
|
232
|
+
? result
|
|
233
|
+
: {};
|
|
234
|
+
const tabId = typeof actionArgs.tabId === "string"
|
|
235
|
+
? actionArgs.tabId
|
|
236
|
+
: typeof resultRecord.tabId === "string"
|
|
237
|
+
? resultRecord.tabId
|
|
238
|
+
: identity.runId;
|
|
239
|
+
const origin = requestedOrigin ?? safeOrigin(resultRecord.url);
|
|
240
|
+
void recordActivity({
|
|
241
|
+
orgId: identity.orgId,
|
|
242
|
+
actorType: "agent",
|
|
243
|
+
actorId: identity.agentId,
|
|
244
|
+
agentId: identity.agentId,
|
|
245
|
+
runId: identity.runId,
|
|
246
|
+
action: `agent.browser.${action}`,
|
|
247
|
+
entityType: "browser_tab",
|
|
248
|
+
entityId: tabId,
|
|
249
|
+
details: {
|
|
250
|
+
action,
|
|
251
|
+
status: "completed",
|
|
252
|
+
...(origin ? { origin } : {}),
|
|
253
|
+
},
|
|
254
|
+
}).catch((error) => {
|
|
255
|
+
// The durable intent prevents an unlogged side effect. Returning the
|
|
256
|
+
// successful Broker result avoids an unsafe Agent retry.
|
|
257
|
+
logger.warn({ err: error, action, runId: identity.runId }, "failed to record Browser action completion");
|
|
258
|
+
});
|
|
259
|
+
res.json(result ?? {});
|
|
260
|
+
});
|
|
261
|
+
return router;
|
|
262
|
+
}
|
|
263
|
+
//# sourceMappingURL=browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/routes/browser.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chats.d.ts","sourceRoot":"","sources":["../../src/routes/chats.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"chats.d.ts","sourceRoot":"","sources":["../../src/routes/chats.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AA+DvC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAK1D,wBAAgB,UAAU,CAAC,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,cAAc,8CAujDzD"}
|
package/dist/routes/chats.js
CHANGED
|
@@ -4,8 +4,6 @@ import multer from "multer";
|
|
|
4
4
|
import { randomUUID } from "node:crypto";
|
|
5
5
|
import { isAllowedContentType, MAX_ATTACHMENT_BYTES } from "../attachment-types.js";
|
|
6
6
|
import { conflict, forbidden, HttpError, unauthorized, unprocessable } from "../errors.js";
|
|
7
|
-
import { emitExecutionTranscriptTree } from "../langfuse-transcript.js";
|
|
8
|
-
import { observeExecutionEvent, updateExecutionObservation, updateExecutionTraceIO, withExecutionObservation, } from "../langfuse.js";
|
|
9
7
|
import { logger } from "../middleware/logger.js";
|
|
10
8
|
import { validate } from "../middleware/validate.js";
|
|
11
9
|
import { assertTimeZone } from "../services/automations.scheduler.js";
|
|
@@ -13,10 +11,9 @@ import { chatAgentRunService } from "../services/chat-agent-runs.js";
|
|
|
13
11
|
import { CHAT_ASSISTANT_USER_ERROR_MESSAGE, chatAssistantService, ChatAssistantStreamError, userVisiblePartialBodyFromError, } from "../services/chat-assistant.js";
|
|
14
12
|
import { cancelAndReleaseActiveChatGeneration, claimChatGeneration, getActiveChatGeneration, hasActiveChatGeneration } from "../services/chat-generation-locks.js";
|
|
15
13
|
import { buildChatTitlePromptFromMessages, chatTitleGenerationService, } from "../services/chat-title-generation.js";
|
|
14
|
+
import { chatWorkManifestService } from "../services/chat-work-manifest.js";
|
|
16
15
|
import { validateCron } from "../services/cron.js";
|
|
17
16
|
import { accessService, agentService, automationService, chatService, goalService, heartbeatService, issueService, logActivity, operatorProfileService, organizationService, productIntelligenceService, projectService, } from "../services/index.js";
|
|
18
|
-
import { sanitizeStartupContextPromptForPersistence } from "../services/runtime-kernel/heartbeat.core.js";
|
|
19
|
-
import { summarizeRuntimeSkillsForTrace } from "../services/runtime-trace-metadata.js";
|
|
20
17
|
import { runtimeResultText, sanitizeGeneratedTitle, } from "../services/title-generation.js";
|
|
21
18
|
import { assertBoard, assertCompanyAccess, getActorInfo } from "./authz.js";
|
|
22
19
|
import { wakeIssueAssigneeAfterChatConversion } from "./chat-issue-assignment-wakeup.js";
|
|
@@ -33,6 +30,7 @@ export function chatRoutes(db, storage) {
|
|
|
33
30
|
const access = accessService(db);
|
|
34
31
|
const assistantSvc = chatAssistantService(db, storage);
|
|
35
32
|
const chatRunsSvc = chatAgentRunService(db);
|
|
33
|
+
const workManifestSvc = chatWorkManifestService(db);
|
|
36
34
|
const operatorProfiles = operatorProfileService(db);
|
|
37
35
|
const heartbeat = heartbeatService(db);
|
|
38
36
|
const productIntelligence = productIntelligenceService(db);
|
|
@@ -180,106 +178,6 @@ export function chatRoutes(db, storage) {
|
|
|
180
178
|
}
|
|
181
179
|
throw unauthorized();
|
|
182
180
|
}
|
|
183
|
-
function buildChatObservabilityContext(conversation, input) {
|
|
184
|
-
return {
|
|
185
|
-
surface: input.surface ?? "chat_action",
|
|
186
|
-
rootExecutionId: input.rootExecutionId,
|
|
187
|
-
orgId: conversation.orgId,
|
|
188
|
-
agentId: conversation.preferredAgentId ?? null,
|
|
189
|
-
issueId: input.issueId ?? conversation.primaryIssueId ?? null,
|
|
190
|
-
sessionKey: conversation.id,
|
|
191
|
-
runtime: input.runtime ?? null,
|
|
192
|
-
trigger: input.trigger,
|
|
193
|
-
status: input.status ?? null,
|
|
194
|
-
metadata: {
|
|
195
|
-
conversationId: conversation.id,
|
|
196
|
-
...(input.metadata ?? {}),
|
|
197
|
-
},
|
|
198
|
-
};
|
|
199
|
-
}
|
|
200
|
-
async function withChatObservation(context, input, fn) {
|
|
201
|
-
let executionError = null;
|
|
202
|
-
try {
|
|
203
|
-
return await withExecutionObservation(context, input, async (observation) => {
|
|
204
|
-
try {
|
|
205
|
-
return await fn(observation);
|
|
206
|
-
}
|
|
207
|
-
catch (error) {
|
|
208
|
-
executionError = error;
|
|
209
|
-
throw error;
|
|
210
|
-
}
|
|
211
|
-
});
|
|
212
|
-
}
|
|
213
|
-
catch (error) {
|
|
214
|
-
if (executionError && error === executionError) {
|
|
215
|
-
throw error;
|
|
216
|
-
}
|
|
217
|
-
logger.warn({
|
|
218
|
-
rootExecutionId: context.rootExecutionId,
|
|
219
|
-
trigger: context.trigger,
|
|
220
|
-
err: error instanceof Error ? error.message : String(error),
|
|
221
|
-
}, "Failed to emit Langfuse chat observation");
|
|
222
|
-
return fn(null);
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
async function emitChatObservationEvent(context, input) {
|
|
226
|
-
try {
|
|
227
|
-
await observeExecutionEvent(context, input);
|
|
228
|
-
}
|
|
229
|
-
catch (error) {
|
|
230
|
-
logger.warn({
|
|
231
|
-
rootExecutionId: context.rootExecutionId,
|
|
232
|
-
eventName: input.name,
|
|
233
|
-
err: error instanceof Error ? error.message : String(error),
|
|
234
|
-
}, "Failed to emit Langfuse chat event");
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
function summarizeChatObservationMessages(messages) {
|
|
238
|
-
const proposalMessage = messages.find((message) => message.kind === "issue_proposal" || message.kind === "operation_proposal");
|
|
239
|
-
const systemEventMessage = messages.find((message) => message.kind === "system_event");
|
|
240
|
-
const systemPayload = systemEventMessage?.structuredPayload && typeof systemEventMessage.structuredPayload === "object"
|
|
241
|
-
? systemEventMessage.structuredPayload
|
|
242
|
-
: null;
|
|
243
|
-
return {
|
|
244
|
-
createdMessageIds: messages.map((message) => message.id),
|
|
245
|
-
assistantKind: proposalMessage?.kind ?? messages.find((message) => message.role === "assistant")?.kind ?? null,
|
|
246
|
-
approvalId: proposalMessage?.approvalId ?? null,
|
|
247
|
-
issueId: typeof systemPayload?.issueId === "string" ? systemPayload.issueId : null,
|
|
248
|
-
issueIdentifier: typeof systemPayload?.issueIdentifier === "string" ? systemPayload.issueIdentifier : null,
|
|
249
|
-
eventType: typeof systemPayload?.eventType === "string" ? systemPayload.eventType : null,
|
|
250
|
-
};
|
|
251
|
-
}
|
|
252
|
-
function modelTurnInputFromInvocationMeta(invocationMeta) {
|
|
253
|
-
const prompt = sanitizeStartupContextPromptForPersistence(invocationMeta.prompt);
|
|
254
|
-
return typeof prompt === "string" && prompt.trim().length > 0
|
|
255
|
-
? prompt
|
|
256
|
-
: undefined;
|
|
257
|
-
}
|
|
258
|
-
function buildChatTraceInput(input, invocationMeta) {
|
|
259
|
-
return {
|
|
260
|
-
conversationId: input.conversationId,
|
|
261
|
-
body: input.body,
|
|
262
|
-
userMessageId: input.userMessageId,
|
|
263
|
-
instruction: typeof invocationMeta?.prompt === "string" && invocationMeta.prompt.trim().length > 0
|
|
264
|
-
? sanitizeStartupContextPromptForPersistence(invocationMeta.prompt)
|
|
265
|
-
: null,
|
|
266
|
-
promptMetrics: invocationMeta?.promptMetrics ?? null,
|
|
267
|
-
};
|
|
268
|
-
}
|
|
269
|
-
function mergeChatInvocationTraceMetadata(context, invocationMeta) {
|
|
270
|
-
context.metadata = {
|
|
271
|
-
...(context.metadata ?? {}),
|
|
272
|
-
runtimeAgentType: invocationMeta.agentRuntimeType,
|
|
273
|
-
runtimeCommand: invocationMeta.command,
|
|
274
|
-
runtimeCwd: invocationMeta.cwd ?? null,
|
|
275
|
-
runtimeCommandNotes: invocationMeta.commandNotes ?? [],
|
|
276
|
-
runtimePromptMetrics: invocationMeta.promptMetrics ?? null,
|
|
277
|
-
runtimePromptCaptured: typeof invocationMeta.prompt === "string" && invocationMeta.prompt.length > 0,
|
|
278
|
-
...(Array.isArray(invocationMeta.loadedSkills)
|
|
279
|
-
? summarizeRuntimeSkillsForTrace(invocationMeta.loadedSkills)
|
|
280
|
-
: {}),
|
|
281
|
-
};
|
|
282
|
-
}
|
|
283
181
|
async function logChatMessagesAdded(conversation, messages, actor) {
|
|
284
182
|
await Promise.all(messages.map((message) => logActivity(db, {
|
|
285
183
|
orgId: conversation.orgId,
|
|
@@ -999,6 +897,15 @@ export function chatRoutes(db, storage) {
|
|
|
999
897
|
const refreshed = await svc.getById(conversation.id, userId);
|
|
1000
898
|
res.json(await assistantSvc.enrichConversation(refreshed));
|
|
1001
899
|
});
|
|
900
|
+
router.get("/chats/:id/work-manifest", async (req, res) => {
|
|
901
|
+
const conversation = await assertConversationAccess(req, req.params.id);
|
|
902
|
+
if (!conversation) {
|
|
903
|
+
res.status(404).json({ error: "Chat conversation not found" });
|
|
904
|
+
return;
|
|
905
|
+
}
|
|
906
|
+
await workManifestSvc.reconcileConversation(conversation.id);
|
|
907
|
+
res.json(await workManifestSvc.getConversationManifest(conversation.id));
|
|
908
|
+
});
|
|
1002
909
|
router.patch("/chats/:id", validate(updateChatConversationSchema), async (req, res) => {
|
|
1003
910
|
const existing = await assertConversationAccess(req, req.params.id);
|
|
1004
911
|
if (!existing) {
|
|
@@ -1391,43 +1298,17 @@ export function chatRoutes(db, storage) {
|
|
|
1391
1298
|
res.status(202).json({ queued: item });
|
|
1392
1299
|
return;
|
|
1393
1300
|
}
|
|
1394
|
-
let chatObservation = null;
|
|
1395
1301
|
try {
|
|
1396
1302
|
const userMessage = await addUserMessage(conversation, req.body.body, actor, req.body.editUserMessageId ?? null);
|
|
1397
1303
|
if (!req.body.editUserMessageId) {
|
|
1398
1304
|
startChatTitleGeneration(conversation, userMessage);
|
|
1399
1305
|
}
|
|
1400
1306
|
const turnContext = turnContextFromUserMessage(userMessage);
|
|
1401
|
-
chatObservation = buildChatObservabilityContext(conversation, {
|
|
1402
|
-
surface: "chat_turn",
|
|
1403
|
-
rootExecutionId: turnContext.chatTurnId,
|
|
1404
|
-
trigger: "assistant_reply",
|
|
1405
|
-
runtime: assistantAvailability.agentRuntimeType ?? null,
|
|
1406
|
-
metadata: {
|
|
1407
|
-
stream: false,
|
|
1408
|
-
userMessageId: userMessage.id,
|
|
1409
|
-
editUserMessageId: req.body.editUserMessageId ?? null,
|
|
1410
|
-
},
|
|
1411
|
-
});
|
|
1412
|
-
const traceInputBase = {
|
|
1413
|
-
conversationId: conversation.id,
|
|
1414
|
-
body: req.body.body,
|
|
1415
|
-
userMessageId: userMessage.id,
|
|
1416
|
-
};
|
|
1417
|
-
let currentChatTraceInput = buildChatTraceInput(traceInputBase);
|
|
1418
1307
|
let activeChatRunId = null;
|
|
1419
|
-
const persistedAssistantMessages = await
|
|
1420
|
-
name: "chat_turn",
|
|
1421
|
-
asType: "agent",
|
|
1422
|
-
input: currentChatTraceInput,
|
|
1423
|
-
}, async (observation) => {
|
|
1308
|
+
const persistedAssistantMessages = await (async () => {
|
|
1424
1309
|
const assistantInput = await loadAssistantInput(conversation, actor);
|
|
1425
1310
|
const transcript = [];
|
|
1426
|
-
const observedTranscript = [];
|
|
1427
|
-
let modelTurnInput;
|
|
1428
1311
|
let fallbackOutput = null;
|
|
1429
|
-
let finalChatOutput = null;
|
|
1430
|
-
let finalChatStatus = "completed";
|
|
1431
1312
|
try {
|
|
1432
1313
|
const streamed = await assistantSvc.streamChatAssistantReply({
|
|
1433
1314
|
...assistantInput,
|
|
@@ -1438,44 +1319,21 @@ export function chatRoutes(db, storage) {
|
|
|
1438
1319
|
onRunCreated: (runId) => {
|
|
1439
1320
|
activeChatRunId = runId;
|
|
1440
1321
|
},
|
|
1441
|
-
onInvocationMeta: async (meta) => {
|
|
1442
|
-
modelTurnInput = modelTurnInputFromInvocationMeta(meta);
|
|
1443
|
-
currentChatTraceInput = buildChatTraceInput(traceInputBase, meta);
|
|
1444
|
-
mergeChatInvocationTraceMetadata(chatObservation, meta);
|
|
1445
|
-
updateExecutionObservation(observation, chatObservation, {
|
|
1446
|
-
input: currentChatTraceInput,
|
|
1447
|
-
});
|
|
1448
|
-
updateExecutionTraceIO(observation, { input: currentChatTraceInput });
|
|
1449
|
-
},
|
|
1450
1322
|
onTranscriptEntry: async (entry) => {
|
|
1451
1323
|
transcript.push(entry);
|
|
1452
1324
|
},
|
|
1453
|
-
onObservedTranscriptEntry: async (entry) => {
|
|
1454
|
-
observedTranscript.push(entry);
|
|
1455
|
-
},
|
|
1456
1325
|
});
|
|
1457
1326
|
fallbackOutput = streamed.partialBody;
|
|
1458
1327
|
if (streamed.outcome !== "completed") {
|
|
1459
|
-
finalChatStatus = "failed";
|
|
1460
1328
|
throw new Error("Chat assistant reply was stopped before completion");
|
|
1461
1329
|
}
|
|
1462
1330
|
const created = await persistAssistantReply(req, assistantInput.conversation, actor, streamed.reply, turnContext, transcript, streamed.replyingAgentId, null, activeChatRunId);
|
|
1463
1331
|
await linkChatRunMessages(assistantInput.conversation, activeChatRunId, created);
|
|
1464
|
-
finalChatOutput = streamed.reply.body;
|
|
1465
1332
|
await logChatMessagesAdded(assistantInput.conversation, created, {
|
|
1466
1333
|
actorType: "system",
|
|
1467
1334
|
actorId: "chat-assistant",
|
|
1468
1335
|
agentId: streamed.replyingAgentId,
|
|
1469
1336
|
});
|
|
1470
|
-
const summary = summarizeChatObservationMessages(created);
|
|
1471
|
-
await emitChatObservationEvent(chatObservation, {
|
|
1472
|
-
name: "chat.reply.persisted",
|
|
1473
|
-
metadata: {
|
|
1474
|
-
transcriptEntries: transcript.length,
|
|
1475
|
-
observedTranscriptEntries: observedTranscript.length,
|
|
1476
|
-
...summary,
|
|
1477
|
-
},
|
|
1478
|
-
});
|
|
1479
1337
|
return created;
|
|
1480
1338
|
}
|
|
1481
1339
|
catch (error) {
|
|
@@ -1483,8 +1341,6 @@ export function chatRoutes(db, storage) {
|
|
|
1483
1341
|
fallbackOutput = userVisiblePartialBodyFromError(error);
|
|
1484
1342
|
const failurePayload = recoverableFailurePayload(error, activeChatRunId);
|
|
1485
1343
|
const failureBody = fallbackOutput || recoverableFailureBody(failurePayload) || CHAT_ASSISTANT_USER_ERROR_MESSAGE;
|
|
1486
|
-
const failure = failurePayload?.recoverableFailure;
|
|
1487
|
-
const failureCode = typeof failure?.code === "string" ? failure.code : "chat_runtime_exception";
|
|
1488
1344
|
const failedMessage = await persistPartialAssistantMessage(assistantInput.conversation, failureBody, "failed", turnContext, transcript, chatReplyingAgentId(assistantInput.conversation), null, activeChatRunId, failurePayload);
|
|
1489
1345
|
const failedMessages = failedMessage ? [failedMessage] : [];
|
|
1490
1346
|
await linkChatRunMessages(assistantInput.conversation, activeChatRunId, failedMessages);
|
|
@@ -1495,84 +1351,16 @@ export function chatRoutes(db, storage) {
|
|
|
1495
1351
|
agentId: chatReplyingAgentId(assistantInput.conversation),
|
|
1496
1352
|
});
|
|
1497
1353
|
}
|
|
1498
|
-
await emitChatObservationEvent(chatObservation, {
|
|
1499
|
-
name: "chat.reply.failed",
|
|
1500
|
-
level: "ERROR",
|
|
1501
|
-
metadata: {
|
|
1502
|
-
failedMessageId: failedMessage?.id ?? null,
|
|
1503
|
-
runId: activeChatRunId,
|
|
1504
|
-
errorCode: failureCode,
|
|
1505
|
-
transcriptEntries: transcript.length,
|
|
1506
|
-
observedTranscriptEntries: observedTranscript.length,
|
|
1507
|
-
error: error.message,
|
|
1508
|
-
},
|
|
1509
|
-
statusMessage: failureCode,
|
|
1510
|
-
});
|
|
1511
1354
|
fallbackOutput = failureBody;
|
|
1512
|
-
finalChatStatus = "failed";
|
|
1513
1355
|
return failedMessages;
|
|
1514
1356
|
}
|
|
1515
|
-
finalChatStatus = "failed";
|
|
1516
1357
|
throw error;
|
|
1517
1358
|
}
|
|
1518
|
-
|
|
1519
|
-
try {
|
|
1520
|
-
const observationFallbackOutput = finalChatOutput
|
|
1521
|
-
|| fallbackOutput
|
|
1522
|
-
|| (finalChatStatus === "failed" ? CHAT_ASSISTANT_USER_ERROR_MESSAGE : null);
|
|
1523
|
-
const transcriptStats = emitExecutionTranscriptTree({
|
|
1524
|
-
context: chatObservation,
|
|
1525
|
-
parentObservation: observation,
|
|
1526
|
-
transcript: observedTranscript,
|
|
1527
|
-
initialTurnInput: modelTurnInput,
|
|
1528
|
-
fallbackResult: observationFallbackOutput
|
|
1529
|
-
? {
|
|
1530
|
-
output: observationFallbackOutput,
|
|
1531
|
-
subtype: finalChatStatus,
|
|
1532
|
-
isError: finalChatStatus === "failed",
|
|
1533
|
-
}
|
|
1534
|
-
: null,
|
|
1535
|
-
});
|
|
1536
|
-
finalChatOutput = finalChatOutput
|
|
1537
|
-
|| fallbackOutput
|
|
1538
|
-
|| (finalChatStatus === "failed" ? observationFallbackOutput : transcriptStats.finalOutput)
|
|
1539
|
-
|| null;
|
|
1540
|
-
}
|
|
1541
|
-
catch (error) {
|
|
1542
|
-
logger.warn({
|
|
1543
|
-
rootExecutionId: chatObservation.rootExecutionId,
|
|
1544
|
-
err: error instanceof Error ? error.message : String(error),
|
|
1545
|
-
}, "Failed to export chat transcript tree to Langfuse");
|
|
1546
|
-
}
|
|
1547
|
-
updateExecutionObservation(observation, {
|
|
1548
|
-
...chatObservation,
|
|
1549
|
-
status: finalChatStatus,
|
|
1550
|
-
}, {
|
|
1551
|
-
input: currentChatTraceInput,
|
|
1552
|
-
output: finalChatOutput,
|
|
1553
|
-
level: finalChatStatus === "failed" ? "ERROR" : "DEFAULT",
|
|
1554
|
-
statusMessage: finalChatStatus,
|
|
1555
|
-
});
|
|
1556
|
-
updateExecutionTraceIO(observation, {
|
|
1557
|
-
input: currentChatTraceInput,
|
|
1558
|
-
output: finalChatOutput,
|
|
1559
|
-
});
|
|
1560
|
-
}
|
|
1561
|
-
});
|
|
1359
|
+
})();
|
|
1562
1360
|
const createdMessages = [userMessage, ...persistedAssistantMessages];
|
|
1563
1361
|
res.status(201).json({ messages: createdMessages });
|
|
1564
1362
|
}
|
|
1565
1363
|
catch (err) {
|
|
1566
|
-
if (chatObservation) {
|
|
1567
|
-
await emitChatObservationEvent(chatObservation, {
|
|
1568
|
-
name: "chat.reply.failed",
|
|
1569
|
-
level: "ERROR",
|
|
1570
|
-
metadata: {
|
|
1571
|
-
error: err instanceof Error ? err.message : String(err),
|
|
1572
|
-
},
|
|
1573
|
-
statusMessage: err instanceof Error ? err.message : "chat_reply_failed",
|
|
1574
|
-
});
|
|
1575
|
-
}
|
|
1576
1364
|
logger.warn({ err, conversationId: conversation.id }, "chat assistant reply failed");
|
|
1577
1365
|
if (err instanceof HttpError) {
|
|
1578
1366
|
throw err;
|
|
@@ -1607,13 +1395,6 @@ export function chatRoutes(db, storage) {
|
|
|
1607
1395
|
isMultipartRequest,
|
|
1608
1396
|
uploadedMessageFiles,
|
|
1609
1397
|
validateUploadedMessageFiles,
|
|
1610
|
-
buildChatObservabilityContext,
|
|
1611
|
-
withChatObservation,
|
|
1612
|
-
emitChatObservationEvent,
|
|
1613
|
-
summarizeChatObservationMessages,
|
|
1614
|
-
modelTurnInputFromInvocationMeta,
|
|
1615
|
-
buildChatTraceInput,
|
|
1616
|
-
mergeChatInvocationTraceMetadata,
|
|
1617
1398
|
logChatMessagesAdded,
|
|
1618
1399
|
assertContextLinksBelongToCompany,
|
|
1619
1400
|
turnContextFromUserMessage,
|