@rudderhq/server 0.7.1 → 0.7.2
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/agent-runtimes/codex-models.d.ts +11 -0
- package/dist/agent-runtimes/codex-models.d.ts.map +1 -1
- package/dist/agent-runtimes/codex-models.js +155 -2
- package/dist/agent-runtimes/codex-models.js.map +1 -1
- package/dist/agent-runtimes/cursor-models.d.ts.map +1 -1
- package/dist/agent-runtimes/cursor-models.js +31 -9
- package/dist/agent-runtimes/cursor-models.js.map +1 -1
- package/dist/agent-runtimes/index.d.ts +1 -1
- package/dist/agent-runtimes/index.d.ts.map +1 -1
- package/dist/agent-runtimes/index.js +1 -1
- package/dist/agent-runtimes/index.js.map +1 -1
- package/dist/agent-runtimes/registry.d.ts +11 -4
- package/dist/agent-runtimes/registry.d.ts.map +1 -1
- package/dist/agent-runtimes/registry.js +54 -3
- package/dist/agent-runtimes/registry.js.map +1 -1
- package/dist/bundled-plugins/plugin-linear/dist/worker.js +287 -18
- package/dist/bundled-plugins/plugin-linear/dist/worker.js.map +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +86 -30
- package/dist/index.js.map +1 -1
- package/dist/redaction.d.ts +1 -0
- package/dist/redaction.d.ts.map +1 -1
- package/dist/redaction.js +13 -0
- package/dist/redaction.js.map +1 -1
- package/dist/routes/access.helpers.d.ts +1 -1
- package/dist/routes/agents.d.ts.map +1 -1
- package/dist/routes/agents.js +20 -6
- 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 +13 -10
- package/dist/routes/agents.management-routes.js.map +1 -1
- package/dist/routes/approvals.d.ts.map +1 -1
- package/dist/routes/approvals.js +77 -1
- package/dist/routes/approvals.js.map +1 -1
- package/dist/routes/chats.d.ts.map +1 -1
- package/dist/routes/chats.js +1 -0
- 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 +4 -0
- package/dist/routes/chats.stream-routes.js.map +1 -1
- package/dist/routes/goals.d.ts.map +1 -1
- package/dist/routes/goals.js +349 -23
- package/dist/routes/goals.js.map +1 -1
- 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/managed-mcp-connections.d.ts.map +1 -1
- package/dist/routes/managed-mcp-connections.js +46 -7
- package/dist/routes/managed-mcp-connections.js.map +1 -1
- package/dist/routes/product-analytics-collector-report.d.ts +29 -0
- package/dist/routes/product-analytics-collector-report.d.ts.map +1 -1
- package/dist/routes/product-analytics-collector-report.js +57 -1
- package/dist/routes/product-analytics-collector-report.js.map +1 -1
- package/dist/routes/product-analytics-collector-report.test.d.ts +2 -0
- package/dist/routes/product-analytics-collector-report.test.d.ts.map +1 -0
- package/dist/routes/product-analytics-collector-report.test.js +50 -0
- package/dist/routes/product-analytics-collector-report.test.js.map +1 -0
- package/dist/services/automation-chat-output.d.ts +1 -1
- package/dist/services/automation-chat-output.d.ts.map +1 -1
- package/dist/services/automation-chat-output.js +24 -14
- package/dist/services/automation-chat-output.js.map +1 -1
- package/dist/services/chat-annotation-copy-lineage.d.ts +1 -1
- package/dist/services/chat-assistant.d.ts.map +1 -1
- package/dist/services/chat-assistant.helpers.d.ts +3 -3
- package/dist/services/chat-assistant.helpers.d.ts.map +1 -1
- package/dist/services/chat-assistant.helpers.js.map +1 -1
- package/dist/services/chat-assistant.js +34 -11
- package/dist/services/chat-assistant.js.map +1 -1
- package/dist/services/chat-assistant.runtime-overrides.d.ts +2 -1
- package/dist/services/chat-assistant.runtime-overrides.d.ts.map +1 -1
- package/dist/services/chat-assistant.runtime-overrides.js +47 -18
- package/dist/services/chat-assistant.runtime-overrides.js.map +1 -1
- package/dist/services/chat-assistant.runtime-overrides.test.d.ts +2 -0
- package/dist/services/chat-assistant.runtime-overrides.test.d.ts.map +1 -0
- package/dist/services/chat-assistant.runtime-overrides.test.js +37 -0
- package/dist/services/chat-assistant.runtime-overrides.test.js.map +1 -0
- package/dist/services/chat-generation-protocol.d.ts.map +1 -1
- package/dist/services/chat-generation-protocol.js +1 -12
- package/dist/services/chat-generation-protocol.js.map +1 -1
- package/dist/services/chat-generation-protocol.test.js +14 -23
- package/dist/services/chat-generation-protocol.test.js.map +1 -1
- package/dist/services/chat-generation-provenance.d.ts.map +1 -1
- package/dist/services/chat-generation-provenance.js +4 -2
- package/dist/services/chat-generation-provenance.js.map +1 -1
- package/dist/services/chat-queued-message-materialization.d.ts.map +1 -1
- package/dist/services/chat-queued-message-materialization.js +12 -2
- package/dist/services/chat-queued-message-materialization.js.map +1 -1
- package/dist/services/chat-transcript-persistence.d.ts +49 -0
- package/dist/services/chat-transcript-persistence.d.ts.map +1 -0
- package/dist/services/chat-transcript-persistence.js +238 -0
- package/dist/services/chat-transcript-persistence.js.map +1 -0
- package/dist/services/chat-transcript-persistence.test.d.ts +2 -0
- package/dist/services/chat-transcript-persistence.test.d.ts.map +1 -0
- package/dist/services/chat-transcript-persistence.test.js +23 -0
- package/dist/services/chat-transcript-persistence.test.js.map +1 -0
- package/dist/services/chat-work-manifest.d.ts.map +1 -1
- package/dist/services/chat-work-manifest.js +36 -10
- package/dist/services/chat-work-manifest.js.map +1 -1
- package/dist/services/chats.annotation-persistence.d.ts.map +1 -1
- package/dist/services/chats.annotation-persistence.js +25 -6
- package/dist/services/chats.annotation-persistence.js.map +1 -1
- package/dist/services/chats.create.d.ts.map +1 -1
- package/dist/services/chats.create.js +49 -4
- package/dist/services/chats.create.js.map +1 -1
- package/dist/services/chats.d.ts +8 -8
- package/dist/services/chats.d.ts.map +1 -1
- package/dist/services/chats.inline-visual-persistence.d.ts +2 -1
- package/dist/services/chats.inline-visual-persistence.d.ts.map +1 -1
- package/dist/services/chats.inline-visual-persistence.js +19 -2
- package/dist/services/chats.inline-visual-persistence.js.map +1 -1
- package/dist/services/chats.js +177 -95
- package/dist/services/chats.js.map +1 -1
- package/dist/services/finance.d.ts +1 -1
- package/dist/services/goals.d.ts +2041 -126
- package/dist/services/goals.d.ts.map +1 -1
- package/dist/services/goals.js +1533 -176
- package/dist/services/goals.js.map +1 -1
- package/dist/services/instance-settings.d.ts.map +1 -1
- package/dist/services/instance-settings.js +2 -0
- package/dist/services/instance-settings.js.map +1 -1
- package/dist/services/issues.d.ts.map +1 -1
- package/dist/services/issues.js +35 -16
- package/dist/services/issues.js.map +1 -1
- package/dist/services/mcp/managed-bindings.d.ts.map +1 -1
- package/dist/services/mcp/managed-bindings.js +11 -4
- package/dist/services/mcp/managed-bindings.js.map +1 -1
- package/dist/services/mcp/managed-connections.d.ts +19 -1
- package/dist/services/mcp/managed-connections.d.ts.map +1 -1
- package/dist/services/mcp/managed-connections.js +211 -37
- package/dist/services/mcp/managed-connections.js.map +1 -1
- package/dist/services/mcp/managed-runtime.js +1 -1
- package/dist/services/mcp/managed-runtime.js.map +1 -1
- package/dist/services/mcp/oauth.d.ts.map +1 -1
- package/dist/services/mcp/oauth.js +3 -0
- package/dist/services/mcp/oauth.js.map +1 -1
- package/dist/services/mcp/provider-registry.d.ts +24 -1
- package/dist/services/mcp/provider-registry.d.ts.map +1 -1
- package/dist/services/mcp/provider-registry.js +26 -0
- package/dist/services/mcp/provider-registry.js.map +1 -1
- package/dist/services/mcp/provider-registry.test.js +26 -0
- package/dist/services/mcp/provider-registry.test.js.map +1 -1
- package/dist/services/messenger-saved-views.d.ts.map +1 -1
- package/dist/services/messenger-saved-views.js +1 -0
- package/dist/services/messenger-saved-views.js.map +1 -1
- package/dist/services/messenger.d.ts.map +1 -1
- package/dist/services/messenger.js +16 -2
- package/dist/services/messenger.js.map +1 -1
- package/dist/services/plugin-host-services.d.ts.map +1 -1
- package/dist/services/plugin-host-services.js +5 -7
- package/dist/services/plugin-host-services.js.map +1 -1
- package/dist/services/product-analytics.d.ts +20 -4
- package/dist/services/product-analytics.d.ts.map +1 -1
- package/dist/services/product-analytics.js +47 -0
- package/dist/services/product-analytics.js.map +1 -1
- package/dist/services/product-analytics.test.js +63 -1
- package/dist/services/product-analytics.test.js.map +1 -1
- package/dist/services/run-events.d.ts +1 -1
- package/dist/services/runtime-kernel/heartbeat.d.ts +4 -0
- 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 +51 -3
- package/dist/services/runtime-kernel/heartbeat.execute.js.map +1 -1
- package/dist/services/runtime-kernel/heartbeat.js +187 -9
- package/dist/services/runtime-kernel/heartbeat.js.map +1 -1
- package/dist/services/runtime-kernel/heartbeat.terminal.d.ts +3 -1
- package/dist/services/runtime-kernel/heartbeat.terminal.d.ts.map +1 -1
- package/dist/services/runtime-kernel/heartbeat.terminal.js +2 -1
- package/dist/services/runtime-kernel/heartbeat.terminal.js.map +1 -1
- package/dist/services/side-chats.d.ts.map +1 -1
- package/dist/services/side-chats.js +12 -0
- package/dist/services/side-chats.js.map +1 -1
- package/dist/services/workspace-runtime.services.d.ts +1 -1
- package/package.json +16 -14
- package/resources/bundled-skills/browser/SKILL.md +11 -4
- package/resources/bundled-skills/browser/agents/openai.yaml +2 -2
- package/resources/bundled-skills/browser/evals/trigger-evals.json +22 -0
- package/skills/browser/SKILL.md +11 -4
- package/skills/browser/agents/openai.yaml +2 -2
- package/skills/browser/evals/trigger-evals.json +22 -0
- package/ui-dist/assets/{LibraryLiveSurface-CZED7oKj.js → LibraryLiveSurface-cHCJmmsl.js} +1 -1
- package/ui-dist/assets/{abnfDiagram-VRR7QNED-BoPyIoAq.js → abnfDiagram-VRR7QNED-BORJvkew.js} +1 -1
- package/ui-dist/assets/{arc-DTYs4RCH.js → arc-DPUzhx87.js} +1 -1
- package/ui-dist/assets/{architectureDiagram-ZJ3FMSHR-BGfp2S_3.js → architectureDiagram-ZJ3FMSHR-Bz_hY8LM.js} +1 -1
- package/ui-dist/assets/{blockDiagram-677ZJIJ3-aW0EGIUf.js → blockDiagram-677ZJIJ3-Bq1X3YkP.js} +1 -1
- package/ui-dist/assets/{c4Diagram-LMCZKHZV--1itKgA2.js → c4Diagram-LMCZKHZV-BawEM9Pc.js} +1 -1
- package/ui-dist/assets/channel-C08AyYJr.js +1 -0
- package/ui-dist/assets/{chunk-2Q5K7J3B-ZIqIozPQ.js → chunk-2Q5K7J3B-D0D5ZOaA.js} +1 -1
- package/ui-dist/assets/{chunk-32BRIVSS-DiwBEZVQ.js → chunk-32BRIVSS-T90P7lug.js} +1 -1
- package/ui-dist/assets/{chunk-5VM5RSS4-CLOrTmL8.js → chunk-5VM5RSS4-jcAERTgh.js} +1 -1
- package/ui-dist/assets/{chunk-EX3LRPZG-D6xZzF47.js → chunk-EX3LRPZG-t9-JXwnR.js} +1 -1
- package/ui-dist/assets/{chunk-JWPE2WC7-B9tYvTZl.js → chunk-JWPE2WC7-hqgD1saC.js} +1 -1
- package/ui-dist/assets/{chunk-MOJQB5TN-D_qo-SzM.js → chunk-MOJQB5TN-BsSUoYzd.js} +1 -1
- package/ui-dist/assets/{chunk-RYQCIY6F-ChPHGc2P.js → chunk-RYQCIY6F-YcdDh2Zn.js} +1 -1
- package/ui-dist/assets/{chunk-V7JOEXUC-Dk6GbZYp.js → chunk-V7JOEXUC-ChFyH9Su.js} +1 -1
- package/ui-dist/assets/{chunk-VR4S4FIN-B6AREC1T.js → chunk-VR4S4FIN-BjVK8IyX.js} +1 -1
- package/ui-dist/assets/{chunk-XXDRQBXY-CUyO-JUr.js → chunk-XXDRQBXY-D-TvO9vT.js} +1 -1
- package/ui-dist/assets/classDiagram-OUVF2IWQ-BIXq6fec.js +1 -0
- package/ui-dist/assets/classDiagram-v2-EOCWNBFH-BIXq6fec.js +1 -0
- package/ui-dist/assets/{cose-bilkent-JH36ORCC-BCxIInLZ.js → cose-bilkent-JH36ORCC-DBwhASJG.js} +1 -1
- package/ui-dist/assets/{cynefin-VYW2F7L2-DqsnpnHA.js → cynefin-VYW2F7L2-SlCRmwl2.js} +1 -1
- package/ui-dist/assets/{cynefinDiagram-TSTJHNR4-BD7QQNLW.js → cynefinDiagram-TSTJHNR4-DImV6N_p.js} +1 -1
- package/ui-dist/assets/{dagre-VKFMJZFB-DaE160f7.js → dagre-VKFMJZFB-FH4Wv8Zn.js} +1 -1
- package/ui-dist/assets/{diagram-FQU43EPY-DZ0c59y8.js → diagram-FQU43EPY-CrZvQjId.js} +1 -1
- package/ui-dist/assets/{diagram-G47NLZAW-C_413g5E.js → diagram-G47NLZAW-B7IGl_T3.js} +1 -1
- package/ui-dist/assets/{diagram-NH7WQ7WH-D_o9pXB-.js → diagram-NH7WQ7WH-CB4i7H1a.js} +1 -1
- package/ui-dist/assets/{diagram-OA4YK3LP-BI2xMqiW.js → diagram-OA4YK3LP-DNyWPYY9.js} +1 -1
- package/ui-dist/assets/{diagram-WEI45ONY-hhM8R_14.js → diagram-WEI45ONY-BAhxbhpi.js} +1 -1
- package/ui-dist/assets/{ebnfDiagram-CCIWWBDH-DfFgEtmG.js → ebnfDiagram-CCIWWBDH-ClXtQ9qt.js} +1 -1
- package/ui-dist/assets/{erDiagram-Q63AITRT-CCw4ysHK.js → erDiagram-Q63AITRT-DGXiMYfn.js} +1 -1
- package/ui-dist/assets/{flowDiagram-23GEKE2U-CzC1SMmo.js → flowDiagram-23GEKE2U-CdZ-02zc.js} +1 -1
- package/ui-dist/assets/{ganttDiagram-NO4QXBWP-CbPJIrIw.js → ganttDiagram-NO4QXBWP-TxhzNpta.js} +1 -1
- package/ui-dist/assets/{gitGraphDiagram-IHSO6WYX-jCxJ66_C.js → gitGraphDiagram-IHSO6WYX-D6Q_w6wR.js} +1 -1
- package/ui-dist/assets/{graph-BfNZ9Jzj.js → graph-CxNmbpl9.js} +1 -1
- package/ui-dist/assets/{index-D00XdcOq.js → index-AkhgKOxC.js} +1 -1
- package/ui-dist/assets/{index-DiMDROQY.js → index-BA9tMBhO.js} +1 -1
- package/ui-dist/assets/{index-DmjAbzHq.js → index-BQ87dGIq.js} +1 -1
- package/ui-dist/assets/index-BmXb0yC1.css +1 -0
- package/ui-dist/assets/{index-B8q4cbOz.js → index-BoTz5S-X.js} +1 -1
- package/ui-dist/assets/{index-D_K-9VDs.js → index-BujwWE3j.js} +1 -1
- package/ui-dist/assets/{index-Chop-Dpa.js → index-Bxz75ICF.js} +1 -1
- package/ui-dist/assets/{index-BKn4zRjf.js → index-C12QC1Ex.js} +1 -1
- package/ui-dist/assets/{index-BjxRqzZK.js → index-CW21qWFm.js} +1 -1
- package/ui-dist/assets/{index-ByUFNj0O.js → index-CXnqg1Oq.js} +1 -1
- package/ui-dist/assets/{index-B3h9Vdxx.js → index-C_nwI4Yj.js} +1 -1
- package/ui-dist/assets/{index-Ck-ZNQeD.js → index-Cx6oIZPm.js} +572 -561
- package/ui-dist/assets/{index-BE1vSI6a.js → index-DU2LI7f9.js} +1 -1
- package/ui-dist/assets/{index-SkHIC7Ma.js → index-Do78GymY.js} +1 -1
- package/ui-dist/assets/{index-Bwo-C8W5.js → index-Rau2cGm0.js} +1 -1
- package/ui-dist/assets/{index-BULll2e0.js → index-kbWUQ1um.js} +1 -1
- package/ui-dist/assets/{infoDiagram-FWYZ7A6U-BkDimGw3.js → infoDiagram-FWYZ7A6U-CnJd4-Jq.js} +1 -1
- package/ui-dist/assets/{ishikawaDiagram-FXEZZL3T-BAyUfn6x.js → ishikawaDiagram-FXEZZL3T-Bq-qc3pD.js} +1 -1
- package/ui-dist/assets/{journeyDiagram-5HDEW3XC-DlbpTZHG.js → journeyDiagram-5HDEW3XC-NSmpUGUA.js} +1 -1
- package/ui-dist/assets/{kanban-definition-HUTT4EX6-Cd67S14K.js → kanban-definition-HUTT4EX6-D7pgWtfA.js} +1 -1
- package/ui-dist/assets/{layout-Dc4YEiCC.js → layout-BRuo6LWe.js} +1 -1
- package/ui-dist/assets/{linear-BhRsbD_5.js → linear-CkaWI9Nd.js} +1 -1
- package/ui-dist/assets/{map-CEWybj6z.js → map-CgA6tTpZ.js} +1 -1
- package/ui-dist/assets/{mermaid.core-CqqAFYNg.js → mermaid.core-DrXOt-P6.js} +4 -4
- package/ui-dist/assets/{mindmap-definition-LN4V7U3C-CCb-XmEi.js → mindmap-definition-LN4V7U3C-D9ImeWBe.js} +1 -1
- package/ui-dist/assets/{pegDiagram-2B236MQR-CqUV14VZ.js → pegDiagram-2B236MQR-Cq-zZ_zz.js} +1 -1
- package/ui-dist/assets/{pieDiagram-ENE6RG2P-Dn_M_GRM.js → pieDiagram-ENE6RG2P-FgNgy726.js} +1 -1
- package/ui-dist/assets/{quadrantDiagram-ABIIQ3AL-rAEhJDr2.js → quadrantDiagram-ABIIQ3AL-BxQbmGmi.js} +1 -1
- package/ui-dist/assets/{railroadDiagram-RFXS5EU6-iE2o_jkH.js → railroadDiagram-RFXS5EU6-CrpbkPH2.js} +1 -1
- package/ui-dist/assets/{requirementDiagram-TGXJPOKE-BFyKBR1h.js → requirementDiagram-TGXJPOKE-DQ-65ZW6.js} +1 -1
- package/ui-dist/assets/{sankeyDiagram-HTMAVEWB-DRa_2YB6.js → sankeyDiagram-HTMAVEWB-Bom0lMZm.js} +1 -1
- package/ui-dist/assets/{sequenceDiagram-DBY2YBRQ-BG8VIjD7.js → sequenceDiagram-DBY2YBRQ-C1MSDLDj.js} +1 -1
- package/ui-dist/assets/{sizeCapture-X5ZJPWSS-CS1xlbzG.js → sizeCapture-X5ZJPWSS-Bn1vxebD.js} +1 -1
- package/ui-dist/assets/{stateDiagram-2N3HPSRC-BSl2RUJ1.js → stateDiagram-2N3HPSRC-GRRQpmzI.js} +1 -1
- package/ui-dist/assets/stateDiagram-v2-6OUMAXLB-KvSJhiLM.js +1 -0
- package/ui-dist/assets/{swimlanes-5IMT3BWC-BT8Hrm9J.js → swimlanes-5IMT3BWC-BcOOCZ4q.js} +2 -2
- package/ui-dist/assets/swimlanesDiagram-G3AALYLV-Cr92NnJ4.js +8 -0
- package/ui-dist/assets/{timeline-definition-FHXFAJF6-CfYIqEuQ.js → timeline-definition-FHXFAJF6-gi6amswh.js} +1 -1
- package/ui-dist/assets/{vennDiagram-L72KCM5P-C8zBH7o9.js → vennDiagram-L72KCM5P-B9uqeyQt.js} +1 -1
- package/ui-dist/assets/{wardleyDiagram-EHGQE667-D5HyFfI9.js → wardleyDiagram-EHGQE667-BnqWAMiE.js} +1 -1
- package/ui-dist/assets/{xychartDiagram-FW5EYKEG-CGItJmLx.js → xychartDiagram-FW5EYKEG-BJXKltIN.js} +1 -1
- package/ui-dist/index.html +2 -2
- package/dist/services/issue-goal-fallback.d.ts +0 -15
- package/dist/services/issue-goal-fallback.d.ts.map +0 -1
- package/dist/services/issue-goal-fallback.js +0 -27
- package/dist/services/issue-goal-fallback.js.map +0 -1
- package/ui-dist/assets/channel-DLNwhPnC.js +0 -1
- package/ui-dist/assets/classDiagram-OUVF2IWQ-JsIc-rlc.js +0 -1
- package/ui-dist/assets/classDiagram-v2-EOCWNBFH-JsIc-rlc.js +0 -1
- package/ui-dist/assets/index-CxPYXL3t.css +0 -1
- package/ui-dist/assets/stateDiagram-v2-6OUMAXLB-DUVNSzI8.js +0 -1
- package/ui-dist/assets/swimlanesDiagram-G3AALYLV-DfLFj7sh.js +0 -8
package/dist/services/chats.js
CHANGED
|
@@ -12,12 +12,13 @@ import { chatGenerationProtocolService } from "./chat-generation-protocol.js";
|
|
|
12
12
|
import { validateCanonicalChatInlineAnnotations } from "./chat-inline-annotation-validation.js";
|
|
13
13
|
import { selectedChatMessageBranchCondition } from "./chat-message-branch.js";
|
|
14
14
|
import { hydrateQueuedMessage, materializeQueuedUserMessage, normalizeQueuedMessagePayload, QUEUED_ANNOTATION_ASSETS_KEY, queuedAnnotationAssetState, queuedMessageMutationFingerprint, withQueuedAnnotationAssetState, } from "./chat-queued-message-materialization.js";
|
|
15
|
+
import { compareChatGenerationSelection, listChatGenerationTranscripts, listDetachedChatTranscripts, listDetachedChatTranscriptSummaries, loadChatTranscripts, replaceDetachedChatTranscript, selectChatTranscript, transcriptSummaryFromSources, } from "./chat-transcript-persistence.js";
|
|
15
16
|
import { createChatAnnotationMessagePersistence } from "./chats.annotation-persistence.js";
|
|
16
17
|
import { listActiveChatGenerationIds, listPendingChatProposalConversationIds, } from "./chats.attention-order.js";
|
|
17
18
|
import { ACTIVE_CHAT_GENERATION_STATUSES, CHAT_GENERATION_CONTROL_LEASE_MS, NATIVE_STEER_GENERATION_STATUSES, SERVER_QUEUE_RUNNING_STATUSES, } from "./chats.constants.js";
|
|
18
19
|
import { createChatConversation, createChatWithInitialMessage } from "./chats.create.js";
|
|
19
20
|
import { conversationMutability, nextForkTitle } from "./chats.fork-helpers.js";
|
|
20
|
-
import { buildSearchSnippet, CHAT_TRANSCRIPT_KEY, chatTranscriptFromPayload,
|
|
21
|
+
import { buildSearchSnippet, CHAT_TRANSCRIPT_KEY, chatTranscriptFromPayload, contentPath, escapeLikePattern, incomingMessagePreviewSql, issueProposalFromPayload, isVisibleIncomingChatMessage, listContextLinksForConversationIds, listPrimaryIssues, operationProposalDecisionStatusFromPayload, operationProposalFromPayload, resolveContextEntities, safeTrim, stripChatMetadataFromPayload, textContains, truncatePreview, visibleIncomingMessageSql, withOperationProposalDecisionState, } from "./chats.helpers.js";
|
|
21
22
|
import { copyForkChatMessages, listRecentUserChatMessages, updateTrustedInlineVisualMappings, } from "./chats.inline-visual-persistence.js";
|
|
22
23
|
import { createQueuedMessageWithStagedAttachments as createQueuedMessageWithStagedAttachmentsInDb } from "./chats.queued-message-create.js";
|
|
23
24
|
import { findQueuedMessageReplay, updateChatAgentRuntimeInvariant, } from "./chats.runtime-controls.js";
|
|
@@ -27,7 +28,7 @@ import { normalizeLocalLibraryPathMarkdown } from "./library-path-markdown.js";
|
|
|
27
28
|
import { removeMessengerCustomGroupEntriesForItem } from "./messenger-saved-views.js";
|
|
28
29
|
import { organizationService } from "./orgs.js";
|
|
29
30
|
import { sanitizePostgresJsonValue } from "./postgres-json.js";
|
|
30
|
-
import { completeProductAnalyticsWorkCycle } from "./product-analytics.js";
|
|
31
|
+
import { completeProductAnalyticsWorkCycle, recordProductAnalyticsChatCreated, } from "./product-analytics.js";
|
|
31
32
|
const CHAT_TITLE_MAX_LENGTH = 200;
|
|
32
33
|
class InvalidQueueDeliveryActionLinkError extends Error {
|
|
33
34
|
}
|
|
@@ -2316,7 +2317,7 @@ export function chatService(db) {
|
|
|
2316
2317
|
const nativeSteerMessageIds = rows
|
|
2317
2318
|
.filter((row) => row.role === "user" && row.structuredPayload?.source === "steer")
|
|
2318
2319
|
.map((row) => row.id);
|
|
2319
|
-
const [attachmentsByMessageId, approvalsById, generationMessageRows, linkedSteerQueueRows] = await Promise.all([
|
|
2320
|
+
const [attachmentsByMessageId, approvalsById, generationMessageRows, linkedSteerQueueRows, detachedTranscriptByMessageId] = await Promise.all([
|
|
2320
2321
|
listAttachmentsForMessageIds(rows.map((row) => row.id)),
|
|
2321
2322
|
listApprovalsForMessages(rows),
|
|
2322
2323
|
assistantMessageIds.length > 0
|
|
@@ -2326,11 +2327,12 @@ export function chatService(db) {
|
|
|
2326
2327
|
generationId: chatGenerationEvents.generationId,
|
|
2327
2328
|
generationCreatedAt: chatGenerations.createdAt,
|
|
2328
2329
|
eventRecordedAt: chatGenerationEvents.recordedAt,
|
|
2330
|
+
generationSeq: chatGenerationEvents.generationSeq,
|
|
2329
2331
|
})
|
|
2330
2332
|
.from(chatGenerationEvents)
|
|
2331
2333
|
.innerJoin(chatGenerations, eq(chatGenerations.id, chatGenerationEvents.generationId))
|
|
2332
2334
|
.where(and(inArray(chatGenerationEvents.assistantMessageId, assistantMessageIds), inArray(chatGenerationEvents.orgId, [...new Set(rows.map((row) => row.orgId))])))
|
|
2333
|
-
.orderBy(desc(chatGenerations.createdAt), desc(chatGenerationEvents.recordedAt), desc(chatGenerationEvents.generationSeq))
|
|
2335
|
+
.orderBy(desc(chatGenerations.createdAt), desc(chatGenerationEvents.recordedAt), desc(chatGenerationEvents.generationSeq), desc(chatGenerationEvents.generationId))
|
|
2334
2336
|
: Promise.resolve([]),
|
|
2335
2337
|
nativeSteerMessageIds.length > 0
|
|
2336
2338
|
? db
|
|
@@ -2344,6 +2346,9 @@ export function chatService(db) {
|
|
|
2344
2346
|
.from(chatQueuedMessages)
|
|
2345
2347
|
.where(or(inArray(chatQueuedMessages.sourceMessageId, nativeSteerMessageIds), inArray(chatQueuedMessages.continuationMessageId, nativeSteerMessageIds)))
|
|
2346
2348
|
: Promise.resolve([]),
|
|
2349
|
+
includeTranscript
|
|
2350
|
+
? listDetachedChatTranscripts(db, rows)
|
|
2351
|
+
: Promise.resolve(new Map()),
|
|
2347
2352
|
]);
|
|
2348
2353
|
const generationIds = [...new Set(generationMessageRows.map((row) => row.generationId))];
|
|
2349
2354
|
const generationsById = generationIds.length === 0
|
|
@@ -2360,9 +2365,10 @@ export function chatService(db) {
|
|
|
2360
2365
|
.map((generation) => [generation.id, generation]));
|
|
2361
2366
|
const messageById = new Map(rows.map((row) => [row.id, row]));
|
|
2362
2367
|
const generationIdByAssistantMessageId = new Map();
|
|
2368
|
+
const generationSelectionByAssistantMessageId = new Map();
|
|
2363
2369
|
for (const generationMessageRow of generationMessageRows) {
|
|
2364
2370
|
const assistantMessageId = generationMessageRow.assistantMessageId;
|
|
2365
|
-
if (!assistantMessageId
|
|
2371
|
+
if (!assistantMessageId)
|
|
2366
2372
|
continue;
|
|
2367
2373
|
const message = messageById.get(assistantMessageId);
|
|
2368
2374
|
const generation = generationsById.get(generationMessageRow.generationId);
|
|
@@ -2370,6 +2376,16 @@ export function chatService(db) {
|
|
|
2370
2376
|
continue;
|
|
2371
2377
|
if (generation.orgId !== message.orgId || generation.conversationId !== message.conversationId)
|
|
2372
2378
|
continue;
|
|
2379
|
+
const candidate = {
|
|
2380
|
+
generationId: generationMessageRow.generationId,
|
|
2381
|
+
generationCreatedAt: generationMessageRow.generationCreatedAt,
|
|
2382
|
+
eventRecordedAt: generationMessageRow.eventRecordedAt,
|
|
2383
|
+
generationSeq: generationMessageRow.generationSeq,
|
|
2384
|
+
};
|
|
2385
|
+
const current = generationSelectionByAssistantMessageId.get(assistantMessageId);
|
|
2386
|
+
if (current && compareChatGenerationSelection(candidate, current) <= 0)
|
|
2387
|
+
continue;
|
|
2388
|
+
generationSelectionByAssistantMessageId.set(assistantMessageId, candidate);
|
|
2373
2389
|
generationIdByAssistantMessageId.set(assistantMessageId, generationMessageRow.generationId);
|
|
2374
2390
|
}
|
|
2375
2391
|
const steerDispositionByMessageId = new Map();
|
|
@@ -2418,6 +2434,11 @@ export function chatService(db) {
|
|
|
2418
2434
|
const generationId = generationIdByAssistantMessageId.get(messageId);
|
|
2419
2435
|
return Boolean(generationId && nativeSteerTargetGenerationIds.has(generationId));
|
|
2420
2436
|
});
|
|
2437
|
+
const hydratedDetachedTranscriptByMessageId = includeTranscript
|
|
2438
|
+
? detachedTranscriptByMessageId
|
|
2439
|
+
: nativeSteerAssistantMessageIds.length > 0
|
|
2440
|
+
? await listDetachedChatTranscripts(db, rows)
|
|
2441
|
+
: detachedTranscriptByMessageId;
|
|
2421
2442
|
const assistantGenerationIds = [
|
|
2422
2443
|
...new Set(generationIdByAssistantMessageId.values()),
|
|
2423
2444
|
];
|
|
@@ -2484,6 +2505,9 @@ export function chatService(db) {
|
|
|
2484
2505
|
});
|
|
2485
2506
|
}
|
|
2486
2507
|
}
|
|
2508
|
+
const detachedTranscriptSummaryByMessageId = includeTranscript
|
|
2509
|
+
? new Map()
|
|
2510
|
+
: await listDetachedChatTranscriptSummaries(db, rows);
|
|
2487
2511
|
const nativeSteerTranscriptPayloadByMessageId = new Map();
|
|
2488
2512
|
if (nativeSteerAssistantMessageIds.length > 0) {
|
|
2489
2513
|
const transcriptPayloadRows = await db
|
|
@@ -2504,13 +2528,22 @@ export function chatService(db) {
|
|
|
2504
2528
|
const transcriptPayload = nativeSteerTranscriptPayloadByMessageId.get(row.id) ?? row.structuredPayload;
|
|
2505
2529
|
const ledgerTranscript = transcriptByAssistantMessageId.get(row.id);
|
|
2506
2530
|
const transcript = includeRowTranscript
|
|
2507
|
-
?
|
|
2508
|
-
|
|
2509
|
-
:
|
|
2531
|
+
? selectChatTranscript({
|
|
2532
|
+
ledger: ledgerTranscript,
|
|
2533
|
+
detached: hydratedDetachedTranscriptByMessageId.get(row.id),
|
|
2534
|
+
legacyPayload: transcriptPayload,
|
|
2535
|
+
})
|
|
2510
2536
|
: [];
|
|
2511
2537
|
const transcriptSummary = includeRowTranscript
|
|
2512
|
-
?
|
|
2513
|
-
|
|
2538
|
+
? transcriptSummaryFromSources({
|
|
2539
|
+
ledger: ledgerTranscript,
|
|
2540
|
+
detached: hydratedDetachedTranscriptByMessageId.get(row.id),
|
|
2541
|
+
legacyPayload: transcriptPayload,
|
|
2542
|
+
})
|
|
2543
|
+
: transcriptSummaryByAssistantMessageId.get(row.id)
|
|
2544
|
+
?? detachedTranscriptSummaryByMessageId.get(row.id)
|
|
2545
|
+
?? row.transcriptSummary
|
|
2546
|
+
?? null;
|
|
2514
2547
|
const structuredPayload = effectiveStructuredPayload(row);
|
|
2515
2548
|
return {
|
|
2516
2549
|
...row,
|
|
@@ -2763,6 +2796,17 @@ export function chatService(db) {
|
|
|
2763
2796
|
.returning();
|
|
2764
2797
|
if (!child)
|
|
2765
2798
|
throw new Error("Failed to create forked chat conversation");
|
|
2799
|
+
await recordProductAnalyticsChatCreated(tx, {
|
|
2800
|
+
orgId: input.orgId,
|
|
2801
|
+
conversationId: child.id,
|
|
2802
|
+
createdAt: child.createdAt,
|
|
2803
|
+
createdByUserId: input.createdByUserId,
|
|
2804
|
+
actorType: "human",
|
|
2805
|
+
actorId: input.userId,
|
|
2806
|
+
creationPath: "fork",
|
|
2807
|
+
planMode: child.planMode,
|
|
2808
|
+
initialRole: "system",
|
|
2809
|
+
});
|
|
2766
2810
|
const contextLinks = await tx
|
|
2767
2811
|
.select()
|
|
2768
2812
|
.from(chatContextLinks)
|
|
@@ -2799,6 +2843,7 @@ export function chatService(db) {
|
|
|
2799
2843
|
sourceConversation: source,
|
|
2800
2844
|
targetConversationId: child.id,
|
|
2801
2845
|
orgId: input.orgId,
|
|
2846
|
+
transcriptBySourceMessageId: await loadChatTranscripts(tx, forkMessages),
|
|
2802
2847
|
});
|
|
2803
2848
|
const [systemEvent] = await tx
|
|
2804
2849
|
.insert(chatMessages)
|
|
@@ -3102,6 +3147,9 @@ export function chatService(db) {
|
|
|
3102
3147
|
const row = await db
|
|
3103
3148
|
.select({
|
|
3104
3149
|
id: chatMessages.id,
|
|
3150
|
+
orgId: chatMessages.orgId,
|
|
3151
|
+
conversationId: chatMessages.conversationId,
|
|
3152
|
+
role: chatMessages.role,
|
|
3105
3153
|
structuredPayload: chatMessages.structuredPayload,
|
|
3106
3154
|
})
|
|
3107
3155
|
.from(chatMessages)
|
|
@@ -3109,44 +3157,17 @@ export function chatService(db) {
|
|
|
3109
3157
|
.then((rows) => rows[0] ?? null);
|
|
3110
3158
|
if (!row)
|
|
3111
3159
|
return null;
|
|
3112
|
-
const generation = await
|
|
3113
|
-
|
|
3114
|
-
|
|
3115
|
-
|
|
3116
|
-
})
|
|
3117
|
-
.from(chatGenerationEvents)
|
|
3118
|
-
.innerJoin(chatGenerations, eq(chatGenerations.id, chatGenerationEvents.generationId))
|
|
3119
|
-
.where(eq(chatGenerationEvents.assistantMessageId, messageId))
|
|
3120
|
-
.orderBy(desc(chatGenerations.createdAt), desc(chatGenerationEvents.recordedAt), desc(chatGenerationEvents.generationSeq))
|
|
3121
|
-
.limit(1)
|
|
3122
|
-
.then((rows) => rows[0] ?? null);
|
|
3123
|
-
const transcript = generation
|
|
3124
|
-
? await db
|
|
3125
|
-
.select({
|
|
3126
|
-
generationId: chatGenerationEvents.generationId,
|
|
3127
|
-
generationSeq: chatGenerationEvents.generationSeq,
|
|
3128
|
-
payload: chatGenerationEvents.payload,
|
|
3129
|
-
})
|
|
3130
|
-
.from(chatGenerationEvents)
|
|
3131
|
-
.where(and(eq(chatGenerationEvents.generationId, generation.generationId), eq(chatGenerationEvents.assistantMessageId, messageId), eq(chatGenerationEvents.eventKind, "transcript"), generation.acceptedThroughSeq === null
|
|
3132
|
-
? undefined
|
|
3133
|
-
: lte(chatGenerationEvents.generationSeq, generation.acceptedThroughSeq)))
|
|
3134
|
-
.orderBy(asc(chatGenerationEvents.generationSeq))
|
|
3135
|
-
.then((events) => events.flatMap((event) => {
|
|
3136
|
-
const entry = event.payload.entry;
|
|
3137
|
-
return entry && typeof entry === "object" && !Array.isArray(entry)
|
|
3138
|
-
? [withChatTranscriptGenerationProvenance(entry, {
|
|
3139
|
-
generationId: event.generationId,
|
|
3140
|
-
generationSeq: event.generationSeq,
|
|
3141
|
-
})]
|
|
3142
|
-
: [];
|
|
3143
|
-
}))
|
|
3144
|
-
: [];
|
|
3160
|
+
const [generation, detached] = await Promise.all([
|
|
3161
|
+
listChatGenerationTranscripts(db, [row]),
|
|
3162
|
+
listDetachedChatTranscripts(db, [row]),
|
|
3163
|
+
]);
|
|
3145
3164
|
return {
|
|
3146
3165
|
messageId: row.id,
|
|
3147
|
-
transcript:
|
|
3148
|
-
|
|
3149
|
-
:
|
|
3166
|
+
transcript: selectChatTranscript({
|
|
3167
|
+
ledger: generation.transcriptByMessageId.get(row.id),
|
|
3168
|
+
detached: detached.get(row.id),
|
|
3169
|
+
legacyPayload: row.structuredPayload,
|
|
3170
|
+
}),
|
|
3150
3171
|
};
|
|
3151
3172
|
}
|
|
3152
3173
|
async function getMessage(conversationId, messageId) {
|
|
@@ -3160,27 +3181,59 @@ export function chatService(db) {
|
|
|
3160
3181
|
const [hydrated] = await hydrateMessages([row]);
|
|
3161
3182
|
return hydrated ? hydrated : null;
|
|
3162
3183
|
}
|
|
3184
|
+
async function transcriptSnapshotForWrite(database, message, requestedTranscript) {
|
|
3185
|
+
// Generation events are the canonical live source. Never duplicate their
|
|
3186
|
+
// transcript into the detached snapshot table during a metadata update.
|
|
3187
|
+
if (message.role === "assistant") {
|
|
3188
|
+
const generation = await listChatGenerationTranscripts(database, [message]);
|
|
3189
|
+
if ((generation.transcriptByMessageId.get(message.id)?.length ?? 0) > 0)
|
|
3190
|
+
return [];
|
|
3191
|
+
}
|
|
3192
|
+
if (requestedTranscript !== undefined)
|
|
3193
|
+
return requestedTranscript;
|
|
3194
|
+
const detached = await listDetachedChatTranscripts(database, [message]);
|
|
3195
|
+
return selectChatTranscript({
|
|
3196
|
+
ledger: undefined,
|
|
3197
|
+
detached: detached.get(message.id),
|
|
3198
|
+
legacyPayload: message.structuredPayload,
|
|
3199
|
+
});
|
|
3200
|
+
}
|
|
3163
3201
|
async function addMessage(conversationId, input) {
|
|
3164
3202
|
const durableBody = input.role === "user"
|
|
3165
3203
|
? input.body
|
|
3166
3204
|
: await normalizeLocalLibraryPathMarkdown(input.body, input.orgId);
|
|
3167
|
-
const
|
|
3168
|
-
|
|
3169
|
-
|
|
3170
|
-
|
|
3171
|
-
|
|
3172
|
-
|
|
3173
|
-
|
|
3174
|
-
|
|
3175
|
-
|
|
3176
|
-
|
|
3177
|
-
|
|
3178
|
-
|
|
3179
|
-
|
|
3180
|
-
|
|
3181
|
-
|
|
3182
|
-
|
|
3183
|
-
|
|
3205
|
+
const sanitizedPayload = sanitizeChatStructuredPayload(input.structuredPayload ?? null);
|
|
3206
|
+
const transcriptFromPayload = chatTranscriptFromPayload(sanitizedPayload);
|
|
3207
|
+
const transcript = input.transcript ?? transcriptFromPayload;
|
|
3208
|
+
const { message } = await db.transaction(async (tx) => {
|
|
3209
|
+
const [inserted] = await tx
|
|
3210
|
+
.insert(chatMessages)
|
|
3211
|
+
.values({
|
|
3212
|
+
orgId: input.orgId,
|
|
3213
|
+
conversationId,
|
|
3214
|
+
role: input.role,
|
|
3215
|
+
kind: input.kind,
|
|
3216
|
+
status: input.status ?? "completed",
|
|
3217
|
+
body: durableBody,
|
|
3218
|
+
structuredPayload: stripChatMetadataFromPayload(sanitizedPayload),
|
|
3219
|
+
approvalId: input.approvalId ?? null,
|
|
3220
|
+
runId: input.runId ?? null,
|
|
3221
|
+
replyingAgentId: input.replyingAgentId ?? null,
|
|
3222
|
+
chatTurnId: input.chatTurnId ?? null,
|
|
3223
|
+
turnVariant: input.turnVariant ?? 0,
|
|
3224
|
+
})
|
|
3225
|
+
.returning();
|
|
3226
|
+
if (!inserted)
|
|
3227
|
+
throw new Error("Failed to create chat message");
|
|
3228
|
+
if (transcript.length > 0) {
|
|
3229
|
+
await replaceDetachedChatTranscript(tx, {
|
|
3230
|
+
orgId: input.orgId,
|
|
3231
|
+
messageId: inserted.id,
|
|
3232
|
+
entries: transcript,
|
|
3233
|
+
});
|
|
3234
|
+
}
|
|
3235
|
+
return { message: inserted };
|
|
3236
|
+
});
|
|
3184
3237
|
if (!message)
|
|
3185
3238
|
throw new Error("Failed to create chat message");
|
|
3186
3239
|
if (input.role === "user" || isVisibleIncomingChatMessage(message)) {
|
|
@@ -3213,29 +3266,43 @@ export function chatService(db) {
|
|
|
3213
3266
|
const visibleContentChanged = (durableInputBody !== undefined && safeTrim(durableInputBody) !== safeTrim(existing.body)) ||
|
|
3214
3267
|
(input.kind !== undefined && input.kind !== existing.kind) ||
|
|
3215
3268
|
(input.approvalId !== undefined && input.approvalId !== existing.approvalId);
|
|
3216
|
-
const
|
|
3217
|
-
|
|
3218
|
-
.
|
|
3219
|
-
|
|
3220
|
-
|
|
3221
|
-
|
|
3222
|
-
|
|
3223
|
-
|
|
3224
|
-
|
|
3225
|
-
|
|
3226
|
-
|
|
3227
|
-
|
|
3228
|
-
|
|
3229
|
-
|
|
3230
|
-
|
|
3231
|
-
|
|
3232
|
-
|
|
3233
|
-
|
|
3234
|
-
|
|
3235
|
-
|
|
3236
|
-
|
|
3237
|
-
|
|
3238
|
-
|
|
3269
|
+
const hasPayloadUpdate = input.structuredPayload !== undefined || input.transcript !== undefined;
|
|
3270
|
+
const sanitizedPayload = input.structuredPayload !== undefined
|
|
3271
|
+
? sanitizeChatStructuredPayload(input.structuredPayload)
|
|
3272
|
+
: sanitizeChatStructuredPayload(stripChatMetadataFromPayload(existing.structuredPayload));
|
|
3273
|
+
const requestedTranscript = input.transcript !== undefined
|
|
3274
|
+
? input.transcript
|
|
3275
|
+
: input.structuredPayload !== undefined && Object.hasOwn(sanitizedPayload ?? {}, CHAT_TRANSCRIPT_KEY)
|
|
3276
|
+
? chatTranscriptFromPayload(sanitizedPayload)
|
|
3277
|
+
: undefined;
|
|
3278
|
+
const { updated } = await db.transaction(async (tx) => {
|
|
3279
|
+
const transcript = hasPayloadUpdate
|
|
3280
|
+
? await transcriptSnapshotForWrite(tx, existing, requestedTranscript)
|
|
3281
|
+
: null;
|
|
3282
|
+
const [next] = await tx
|
|
3283
|
+
.update(chatMessages)
|
|
3284
|
+
.set({
|
|
3285
|
+
...(becameVisibleIncoming ? { createdAt: now } : {}),
|
|
3286
|
+
...(input.kind !== undefined ? { kind: input.kind } : {}),
|
|
3287
|
+
...(input.status !== undefined ? { status: input.status } : {}),
|
|
3288
|
+
...(durableInputBody !== undefined ? { body: durableInputBody } : {}),
|
|
3289
|
+
...(hasPayloadUpdate ? { structuredPayload: stripChatMetadataFromPayload(sanitizedPayload) } : {}),
|
|
3290
|
+
...(input.approvalId !== undefined ? { approvalId: input.approvalId } : {}),
|
|
3291
|
+
...(input.runId !== undefined ? { runId: input.runId } : {}),
|
|
3292
|
+
...(input.replyingAgentId !== undefined ? { replyingAgentId: input.replyingAgentId } : {}),
|
|
3293
|
+
updatedAt: now,
|
|
3294
|
+
})
|
|
3295
|
+
.where(and(eq(chatMessages.conversationId, conversationId), eq(chatMessages.id, messageId)))
|
|
3296
|
+
.returning();
|
|
3297
|
+
if (next && transcript !== null) {
|
|
3298
|
+
await replaceDetachedChatTranscript(tx, {
|
|
3299
|
+
orgId: existing.orgId,
|
|
3300
|
+
messageId: existing.id,
|
|
3301
|
+
entries: transcript,
|
|
3302
|
+
});
|
|
3303
|
+
}
|
|
3304
|
+
return { updated: next };
|
|
3305
|
+
});
|
|
3239
3306
|
if (!updated)
|
|
3240
3307
|
return null;
|
|
3241
3308
|
if ((existing.role === "user" && input.body !== undefined) ||
|
|
@@ -3281,15 +3348,30 @@ export function chatService(db) {
|
|
|
3281
3348
|
.then((rows) => rows[0] ?? null);
|
|
3282
3349
|
if (!existing)
|
|
3283
3350
|
return null;
|
|
3284
|
-
const
|
|
3285
|
-
|
|
3286
|
-
|
|
3287
|
-
|
|
3288
|
-
|
|
3289
|
-
|
|
3290
|
-
|
|
3291
|
-
|
|
3292
|
-
|
|
3351
|
+
const sanitizedPayload = sanitizeChatStructuredPayload(structuredPayload);
|
|
3352
|
+
const requestedTranscript = Object.hasOwn(sanitizedPayload ?? {}, CHAT_TRANSCRIPT_KEY)
|
|
3353
|
+
? chatTranscriptFromPayload(sanitizedPayload)
|
|
3354
|
+
: undefined;
|
|
3355
|
+
const { updated } = await db.transaction(async (tx) => {
|
|
3356
|
+
const transcript = await transcriptSnapshotForWrite(tx, existing, requestedTranscript);
|
|
3357
|
+
const [next] = await tx
|
|
3358
|
+
.update(chatMessages)
|
|
3359
|
+
.set({
|
|
3360
|
+
structuredPayload: stripChatMetadataFromPayload(sanitizedPayload),
|
|
3361
|
+
updatedAt: new Date(),
|
|
3362
|
+
})
|
|
3363
|
+
.where(and(eq(chatMessages.conversationId, conversationId), eq(chatMessages.id, messageId)))
|
|
3364
|
+
.returning();
|
|
3365
|
+
if (next) {
|
|
3366
|
+
await replaceDetachedChatTranscript(tx, {
|
|
3367
|
+
orgId: existing.orgId,
|
|
3368
|
+
messageId: existing.id,
|
|
3369
|
+
entries: transcript,
|
|
3370
|
+
});
|
|
3371
|
+
}
|
|
3372
|
+
return { updated: next };
|
|
3373
|
+
});
|
|
3374
|
+
const [hydrated] = await hydrateMessages(updated ? [updated] : []);
|
|
3293
3375
|
return hydrated ?? null;
|
|
3294
3376
|
}
|
|
3295
3377
|
async function addContextLink(conversationId, orgId, input) {
|