@rudderhq/server 0.2.5-canary.9 → 0.2.5
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/plugin-host-runtime.d.ts +39 -39
- package/dist/bundled-plugins/plugin-linear/dist/worker.js +101 -147
- package/dist/bundled-plugins/plugin-linear/dist/worker.js.map +2 -2
- package/dist/bundled-plugins/plugin-linear/package.json +1 -1
- package/dist/routes/access-onboarding.helpers.d.ts +142 -0
- package/dist/routes/access-onboarding.helpers.d.ts.map +1 -0
- package/dist/routes/access-onboarding.helpers.js +762 -0
- package/dist/routes/access-onboarding.helpers.js.map +1 -0
- package/dist/routes/access.d.ts +2 -48
- package/dist/routes/access.d.ts.map +1 -1
- package/dist/routes/access.helpers.d.ts +109 -0
- package/dist/routes/access.helpers.d.ts.map +1 -0
- package/dist/routes/access.helpers.js +460 -0
- package/dist/routes/access.helpers.js.map +1 -0
- package/dist/routes/access.js +6 -1218
- package/dist/routes/access.js.map +1 -1
- package/dist/routes/agents.d.ts.map +1 -1
- package/dist/routes/agents.js +55 -1057
- package/dist/routes/agents.js.map +1 -1
- package/dist/routes/agents.management-routes.d.ts +12 -0
- package/dist/routes/agents.management-routes.d.ts.map +1 -0
- package/dist/routes/agents.management-routes.js +1067 -0
- package/dist/routes/agents.management-routes.js.map +1 -0
- package/dist/routes/chats.d.ts.map +1 -1
- package/dist/routes/chats.js +42 -652
- package/dist/routes/chats.js.map +1 -1
- package/dist/routes/chats.stream-routes.d.ts +12 -0
- package/dist/routes/chats.stream-routes.d.ts.map +1 -0
- package/dist/routes/chats.stream-routes.js +666 -0
- package/dist/routes/chats.stream-routes.js.map +1 -0
- package/dist/routes/issues.comments-attachments.d.ts +12 -0
- package/dist/routes/issues.comments-attachments.d.ts.map +1 -0
- package/dist/routes/issues.comments-attachments.js +511 -0
- package/dist/routes/issues.comments-attachments.js.map +1 -0
- package/dist/routes/issues.d.ts.map +1 -1
- package/dist/routes/issues.js +43 -1128
- package/dist/routes/issues.js.map +1 -1
- package/dist/routes/issues.mutations.d.ts +12 -0
- package/dist/routes/issues.mutations.d.ts.map +1 -0
- package/dist/routes/issues.mutations.js +635 -0
- package/dist/routes/issues.mutations.js.map +1 -0
- package/dist/routes/plugins.d.ts.map +1 -1
- package/dist/routes/plugins.js +14 -694
- package/dist/routes/plugins.js.map +1 -1
- package/dist/routes/plugins.operations-routes.d.ts +28 -0
- package/dist/routes/plugins.operations-routes.d.ts.map +1 -0
- package/dist/routes/plugins.operations-routes.js +720 -0
- package/dist/routes/plugins.operations-routes.js.map +1 -0
- package/dist/services/access.d.ts +21 -21
- package/dist/services/activity.d.ts +19 -19
- package/dist/services/agents.d.ts +158 -158
- package/dist/services/approvals.d.ts +29 -29
- package/dist/services/assets.d.ts +8 -8
- package/dist/services/automations.d.ts +41 -27
- package/dist/services/automations.d.ts.map +1 -1
- package/dist/services/automations.js +287 -110
- package/dist/services/automations.js.map +1 -1
- package/dist/services/automations.scheduler.d.ts +9 -0
- package/dist/services/automations.scheduler.d.ts.map +1 -0
- package/dist/services/automations.scheduler.js +101 -0
- package/dist/services/automations.scheduler.js.map +1 -0
- package/dist/services/board-auth.d.ts +32 -32
- package/dist/services/calendar.d.ts +26 -26
- package/dist/services/chat-assistant.d.ts +3 -47
- package/dist/services/chat-assistant.d.ts.map +1 -1
- package/dist/services/chat-assistant.helpers.d.ts +156 -0
- package/dist/services/chat-assistant.helpers.d.ts.map +1 -0
- package/dist/services/chat-assistant.helpers.js +862 -0
- package/dist/services/chat-assistant.helpers.js.map +1 -0
- package/dist/services/chat-assistant.js +2 -861
- package/dist/services/chat-assistant.js.map +1 -1
- package/dist/services/chats.d.ts +149 -247
- package/dist/services/chats.d.ts.map +1 -1
- package/dist/services/chats.helpers.d.ts +117 -0
- package/dist/services/chats.helpers.d.ts.map +1 -0
- package/dist/services/chats.helpers.js +285 -0
- package/dist/services/chats.helpers.js.map +1 -0
- package/dist/services/chats.js +6 -286
- package/dist/services/chats.js.map +1 -1
- package/dist/services/costs.d.ts +8 -8
- package/dist/services/finance.d.ts +18 -18
- package/dist/services/goals.d.ts +30 -30
- package/dist/services/heartbeat.d.ts +3 -1
- package/dist/services/heartbeat.d.ts.map +1 -1
- package/dist/services/heartbeat.js +3 -1
- package/dist/services/heartbeat.js.map +1 -1
- package/dist/services/issue-approvals.d.ts +4 -4
- package/dist/services/issue-review-wakeup.d.ts +3 -3
- package/dist/services/issues.comments-attachments.d.ts +141 -0
- package/dist/services/issues.comments-attachments.d.ts.map +1 -0
- package/dist/services/issues.comments-attachments.js +313 -0
- package/dist/services/issues.comments-attachments.js.map +1 -0
- package/dist/services/issues.d.ts +205 -256
- package/dist/services/issues.d.ts.map +1 -1
- package/dist/services/issues.helpers.d.ts +87 -0
- package/dist/services/issues.helpers.d.ts.map +1 -0
- package/dist/services/issues.helpers.js +270 -0
- package/dist/services/issues.helpers.js.map +1 -0
- package/dist/services/issues.js +5 -569
- package/dist/services/issues.js.map +1 -1
- package/dist/services/knowledge-portability/organization-portability.core.d.ts +210 -0
- package/dist/services/knowledge-portability/organization-portability.core.d.ts.map +1 -0
- package/dist/services/knowledge-portability/organization-portability.core.js +997 -0
- package/dist/services/knowledge-portability/organization-portability.core.js.map +1 -0
- package/dist/services/knowledge-portability/organization-portability.d.ts +6 -28
- package/dist/services/knowledge-portability/organization-portability.d.ts.map +1 -1
- package/dist/services/knowledge-portability/organization-portability.export.d.ts +24 -0
- package/dist/services/knowledge-portability/organization-portability.export.d.ts.map +1 -0
- package/dist/services/knowledge-portability/organization-portability.export.js +607 -0
- package/dist/services/knowledge-portability/organization-portability.export.js.map +1 -0
- package/dist/services/knowledge-portability/organization-portability.files.d.ts +69 -0
- package/dist/services/knowledge-portability/organization-portability.files.d.ts.map +1 -0
- package/dist/services/knowledge-portability/organization-portability.files.js +597 -0
- package/dist/services/knowledge-portability/organization-portability.files.js.map +1 -0
- package/dist/services/knowledge-portability/organization-portability.import.d.ts +31 -0
- package/dist/services/knowledge-portability/organization-portability.import.d.ts.map +1 -0
- package/dist/services/knowledge-portability/organization-portability.import.js +575 -0
- package/dist/services/knowledge-portability/organization-portability.import.js.map +1 -0
- package/dist/services/knowledge-portability/organization-portability.js +37 -3848
- package/dist/services/knowledge-portability/organization-portability.js.map +1 -1
- package/dist/services/knowledge-portability/organization-portability.package.d.ts +72 -0
- package/dist/services/knowledge-portability/organization-portability.package.d.ts.map +1 -0
- package/dist/services/knowledge-portability/organization-portability.package.js +749 -0
- package/dist/services/knowledge-portability/organization-portability.package.js.map +1 -0
- package/dist/services/knowledge-portability/organization-portability.preview.d.ts +18 -0
- package/dist/services/knowledge-portability/organization-portability.preview.d.ts.map +1 -0
- package/dist/services/knowledge-portability/organization-portability.preview.js +333 -0
- package/dist/services/knowledge-portability/organization-portability.preview.js.map +1 -0
- package/dist/services/knowledge-portability/organization-portability.resolve-source.d.ts +4 -0
- package/dist/services/knowledge-portability/organization-portability.resolve-source.d.ts.map +1 -0
- package/dist/services/knowledge-portability/organization-portability.resolve-source.js +86 -0
- package/dist/services/knowledge-portability/organization-portability.resolve-source.js.map +1 -0
- package/dist/services/knowledge-portability/organization-skills.catalog.d.ts +221 -0
- package/dist/services/knowledge-portability/organization-skills.catalog.d.ts.map +1 -0
- package/dist/services/knowledge-portability/organization-skills.catalog.js +999 -0
- package/dist/services/knowledge-portability/organization-skills.catalog.js.map +1 -0
- package/dist/services/knowledge-portability/organization-skills.d.ts +4 -75
- package/dist/services/knowledge-portability/organization-skills.d.ts.map +1 -1
- package/dist/services/knowledge-portability/organization-skills.js +11 -2008
- package/dist/services/knowledge-portability/organization-skills.js.map +1 -1
- package/dist/services/knowledge-portability/organization-skills.scans.d.ts +16 -0
- package/dist/services/knowledge-portability/organization-skills.scans.d.ts.map +1 -0
- package/dist/services/knowledge-portability/organization-skills.scans.js +300 -0
- package/dist/services/knowledge-portability/organization-skills.scans.js.map +1 -0
- package/dist/services/knowledge-portability/organization-skills.sources.d.ts +68 -0
- package/dist/services/knowledge-portability/organization-skills.sources.d.ts.map +1 -0
- package/dist/services/knowledge-portability/organization-skills.sources.js +728 -0
- package/dist/services/knowledge-portability/organization-skills.sources.js.map +1 -0
- package/dist/services/messenger.d.ts +2 -2
- package/dist/services/messenger.js +2 -2
- package/dist/services/messenger.js.map +1 -1
- package/dist/services/organization-skills.d.ts +3 -1
- package/dist/services/organization-skills.d.ts.map +1 -1
- package/dist/services/organization-skills.js +3 -1
- package/dist/services/organization-skills.js.map +1 -1
- package/dist/services/orgs.d.ts +9 -9
- package/dist/services/plugin-loader.core.d.ts +14 -0
- package/dist/services/plugin-loader.core.d.ts.map +1 -0
- package/dist/services/plugin-loader.core.js +905 -0
- package/dist/services/plugin-loader.core.js.map +1 -0
- package/dist/services/plugin-loader.d.ts +3 -440
- package/dist/services/plugin-loader.d.ts.map +1 -1
- package/dist/services/plugin-loader.helpers.d.ts +468 -0
- package/dist/services/plugin-loader.helpers.d.ts.map +1 -0
- package/dist/services/plugin-loader.helpers.js +263 -0
- package/dist/services/plugin-loader.helpers.js.map +1 -0
- package/dist/services/plugin-loader.js +3 -1191
- package/dist/services/plugin-loader.js.map +1 -1
- package/dist/services/plugin-loader.worker-paths.d.ts +7 -0
- package/dist/services/plugin-loader.worker-paths.d.ts.map +1 -0
- package/dist/services/plugin-loader.worker-paths.js +85 -0
- package/dist/services/plugin-loader.worker-paths.js.map +1 -0
- package/dist/services/plugin-registry.d.ts +123 -123
- package/dist/services/projects.d.ts +8 -8
- package/dist/services/runtime-kernel/heartbeat.core.d.ts +725 -0
- package/dist/services/runtime-kernel/heartbeat.core.d.ts.map +1 -0
- package/dist/services/runtime-kernel/heartbeat.core.js +525 -0
- package/dist/services/runtime-kernel/heartbeat.core.js.map +1 -0
- package/dist/services/runtime-kernel/heartbeat.d.ts +38 -259
- package/dist/services/runtime-kernel/heartbeat.d.ts.map +1 -1
- package/dist/services/runtime-kernel/heartbeat.execute.d.ts +5 -0
- package/dist/services/runtime-kernel/heartbeat.execute.d.ts.map +1 -0
- package/dist/services/runtime-kernel/heartbeat.execute.js +1052 -0
- package/dist/services/runtime-kernel/heartbeat.execute.js.map +1 -0
- package/dist/services/runtime-kernel/heartbeat.js +50 -4142
- package/dist/services/runtime-kernel/heartbeat.js.map +1 -1
- package/dist/services/runtime-kernel/heartbeat.misc.d.ts +30 -0
- package/dist/services/runtime-kernel/heartbeat.misc.d.ts.map +1 -0
- package/dist/services/runtime-kernel/heartbeat.misc.js +483 -0
- package/dist/services/runtime-kernel/heartbeat.misc.js.map +1 -0
- package/dist/services/runtime-kernel/heartbeat.recovery.d.ts +38 -0
- package/dist/services/runtime-kernel/heartbeat.recovery.d.ts.map +1 -0
- package/dist/services/runtime-kernel/heartbeat.recovery.js +605 -0
- package/dist/services/runtime-kernel/heartbeat.recovery.js.map +1 -0
- package/dist/services/runtime-kernel/heartbeat.release.d.ts +6 -0
- package/dist/services/runtime-kernel/heartbeat.release.d.ts.map +1 -0
- package/dist/services/runtime-kernel/heartbeat.release.js +398 -0
- package/dist/services/runtime-kernel/heartbeat.release.js.map +1 -0
- package/dist/services/runtime-kernel/heartbeat.sessions.d.ts +229 -0
- package/dist/services/runtime-kernel/heartbeat.sessions.d.ts.map +1 -0
- package/dist/services/runtime-kernel/heartbeat.sessions.js +708 -0
- package/dist/services/runtime-kernel/heartbeat.sessions.js.map +1 -0
- package/dist/services/runtime-kernel/heartbeat.wakeup.d.ts +5 -0
- package/dist/services/runtime-kernel/heartbeat.wakeup.d.ts.map +1 -0
- package/dist/services/runtime-kernel/heartbeat.wakeup.js +552 -0
- package/dist/services/runtime-kernel/heartbeat.wakeup.js.map +1 -0
- package/dist/services/secrets.d.ts +25 -25
- package/dist/services/sidebar-badges.js +1 -1
- package/dist/services/sidebar-badges.js.map +1 -1
- package/dist/services/workspace-runtime.comments.d.ts +6 -0
- package/dist/services/workspace-runtime.comments.d.ts.map +1 -0
- package/dist/services/workspace-runtime.comments.js +17 -0
- package/dist/services/workspace-runtime.comments.js.map +1 -0
- package/dist/services/workspace-runtime.d.ts +4 -163
- package/dist/services/workspace-runtime.d.ts.map +1 -1
- package/dist/services/workspace-runtime.helpers.d.ts +163 -0
- package/dist/services/workspace-runtime.helpers.d.ts.map +1 -0
- package/dist/services/workspace-runtime.helpers.js +360 -0
- package/dist/services/workspace-runtime.helpers.js.map +1 -0
- package/dist/services/workspace-runtime.js +4 -1236
- package/dist/services/workspace-runtime.js.map +1 -1
- package/dist/services/workspace-runtime.lifecycle.d.ts +35 -0
- package/dist/services/workspace-runtime.lifecycle.d.ts.map +1 -0
- package/dist/services/workspace-runtime.lifecycle.js +266 -0
- package/dist/services/workspace-runtime.lifecycle.js.map +1 -0
- package/dist/services/workspace-runtime.services.d.ts +140 -0
- package/dist/services/workspace-runtime.services.d.ts.map +1 -0
- package/dist/services/workspace-runtime.services.js +606 -0
- package/dist/services/workspace-runtime.services.js.map +1 -0
- package/package.json +21 -15
- package/ui-dist/assets/{_basePickBy-B5mJzzqZ.js → _basePickBy-N8I9ml5Y.js} +1 -1
- package/ui-dist/assets/{_baseUniq-B10Ec09o.js → _baseUniq-BuSlpRSQ.js} +1 -1
- package/ui-dist/assets/{arc-Bw7wimOa.js → arc-qX-dPyA1.js} +1 -1
- package/ui-dist/assets/{architectureDiagram-2XIMDMQ5-DZr0XEvv.js → architectureDiagram-2XIMDMQ5-DhjkbXsp.js} +1 -1
- package/ui-dist/assets/{blockDiagram-WCTKOSBZ-D0jl0LgB.js → blockDiagram-WCTKOSBZ-JS-tTu3J.js} +1 -1
- package/ui-dist/assets/{c4Diagram-IC4MRINW-BEFxBnEm.js → c4Diagram-IC4MRINW-4DqwCWIx.js} +1 -1
- package/ui-dist/assets/channel-CccCW5_a.js +1 -0
- package/ui-dist/assets/{chunk-4BX2VUAB-Cbul1GoA.js → chunk-4BX2VUAB-T37SqBpp.js} +1 -1
- package/ui-dist/assets/{chunk-55IACEB6-DuouC3bT.js → chunk-55IACEB6-BSj9hdqK.js} +1 -1
- package/ui-dist/assets/{chunk-FMBD7UC4-bN1jF9xw.js → chunk-FMBD7UC4-Dkrlh0Wk.js} +1 -1
- package/ui-dist/assets/{chunk-JSJVCQXG-B0-Ij6ZF.js → chunk-JSJVCQXG-C0ZE3QdB.js} +1 -1
- package/ui-dist/assets/{chunk-KX2RTZJC-BjI3IEjI.js → chunk-KX2RTZJC-DOZQM9gW.js} +1 -1
- package/ui-dist/assets/{chunk-NQ4KR5QH-MUoGr46n.js → chunk-NQ4KR5QH-5Yr3U2k8.js} +1 -1
- package/ui-dist/assets/{chunk-QZHKN3VN-CQoI9Ouy.js → chunk-QZHKN3VN-CvKTufwF.js} +1 -1
- package/ui-dist/assets/{chunk-WL4C6EOR-DSJh3iDp.js → chunk-WL4C6EOR-IoEM0jyx.js} +1 -1
- package/ui-dist/assets/classDiagram-VBA2DB6C-JKk4tCW2.js +1 -0
- package/ui-dist/assets/classDiagram-v2-RAHNMMFH-JKk4tCW2.js +1 -0
- package/ui-dist/assets/clone-Onaweg8D.js +1 -0
- package/ui-dist/assets/{cose-bilkent-S5V4N54A-BPepglgB.js → cose-bilkent-S5V4N54A-CTvr1OFj.js} +1 -1
- package/ui-dist/assets/{dagre-KLK3FWXG-DhnHVZkt.js → dagre-KLK3FWXG-UZ-SNjVK.js} +1 -1
- package/ui-dist/assets/{diagram-E7M64L7V-DNvXtoOO.js → diagram-E7M64L7V-D7RAN0Hr.js} +1 -1
- package/ui-dist/assets/{diagram-IFDJBPK2-DhGlDTgn.js → diagram-IFDJBPK2-B4LViaFR.js} +1 -1
- package/ui-dist/assets/{diagram-P4PSJMXO-BmXEloWS.js → diagram-P4PSJMXO-CY1be7ak.js} +1 -1
- package/ui-dist/assets/{erDiagram-INFDFZHY-BTYVzaLM.js → erDiagram-INFDFZHY-Dca0KkvJ.js} +1 -1
- package/ui-dist/assets/{flowDiagram-PKNHOUZH-CqMNQUVv.js → flowDiagram-PKNHOUZH-i-qMvfwg.js} +1 -1
- package/ui-dist/assets/{ganttDiagram-A5KZAMGK-B2le_64a.js → ganttDiagram-A5KZAMGK-Wxq2lhbh.js} +1 -1
- package/ui-dist/assets/{gitGraphDiagram-K3NZZRJ6-BtxOBq5A.js → gitGraphDiagram-K3NZZRJ6-DwzgPlAY.js} +1 -1
- package/ui-dist/assets/{graph-C5E6qFfm.js → graph-BAqf89Tz.js} +1 -1
- package/ui-dist/assets/{index-Piq-IPXt.js → index-4eCzaLuY.js} +1 -1
- package/ui-dist/assets/{index-DT6UN2ec.js → index-8uu-nKqK.js} +1 -1
- package/ui-dist/assets/{index-T5NVZ3nR.js → index-B-1NEcI_.js} +1 -1
- package/ui-dist/assets/{index-D-MoarxG.js → index-B0b_3Eu5.js} +1 -1
- package/ui-dist/assets/{index-CZiP3FBQ.js → index-B8v0eZjP.js} +1 -1
- package/ui-dist/assets/{index-C1Ga66FM.js → index-BN7Moj3u.js} +1 -1
- package/ui-dist/assets/{index-xBUfBdQn.js → index-BSpxh3cY.js} +1 -1
- package/ui-dist/assets/{index-CQcMWp51.js → index-BY44RIi9.js} +1 -1
- package/ui-dist/assets/{index-3a93sZNI.js → index-BhyQJhdZ.js} +1 -1
- package/ui-dist/assets/{index-BsVDit5y.js → index-BkPL_iGU.js} +1 -1
- package/ui-dist/assets/{index-88lBSTsW.js → index-BsPfoHXS.js} +1 -1
- package/ui-dist/assets/{index-CyJtcUF0.js → index-BstW7nmv.js} +1 -1
- package/ui-dist/assets/{index-BvZ0Ptfl.js → index-BwB67Zyz.js} +1 -1
- package/ui-dist/assets/index-C2peSkmT.css +1 -0
- package/ui-dist/assets/{index-vkCrQLeX.js → index-C3ktOsS_.js} +1 -1
- package/ui-dist/assets/{index-D2hZpQJT.js → index-CMyABlS-.js} +1 -1
- package/ui-dist/assets/{index-C4WCPEY4.js → index-CyBJ8ujC.js} +1 -1
- package/ui-dist/assets/{index-Bf7NB_lK.js → index-DAxM2W3O.js} +1 -1
- package/ui-dist/assets/{index-Dq7H6-Lm.js → index-DVZXPmhk.js} +1 -1
- package/ui-dist/assets/{index-CskDu6A3.js → index-Dc19uAyw.js} +1 -1
- package/ui-dist/assets/index-DzHrwZu1.js +1511 -0
- package/ui-dist/assets/{index-B20JneLK.js → index-LJuf53Ye.js} +1 -1
- package/ui-dist/assets/{index-D6McTDMQ.js → index-Ugw5VWWz.js} +1 -1
- package/ui-dist/assets/{index-CcVGS6HJ.js → index-YGraEFR7.js} +1 -1
- package/ui-dist/assets/{infoDiagram-LFFYTUFH-BiCCZcIW.js → infoDiagram-LFFYTUFH-jLmDtFVR.js} +1 -1
- package/ui-dist/assets/{ishikawaDiagram-PHBUUO56-BiwBemM5.js → ishikawaDiagram-PHBUUO56-6OGMyLT8.js} +1 -1
- package/ui-dist/assets/{journeyDiagram-4ABVD52K-D8RGr2xl.js → journeyDiagram-4ABVD52K-yQjl6E0t.js} +1 -1
- package/ui-dist/assets/{kanban-definition-K7BYSVSG-C733Fj-E.js → kanban-definition-K7BYSVSG-DkdCeQlS.js} +1 -1
- package/ui-dist/assets/{layout-CM4c3NA_.js → layout-CqSYvZ_w.js} +1 -1
- package/ui-dist/assets/{linear-DzH21Xsf.js → linear-B8xGZaoi.js} +1 -1
- package/ui-dist/assets/{mermaid.core-Z2rpoVP2.js → mermaid.core-AKL_cdyk.js} +4 -4
- package/ui-dist/assets/{mindmap-definition-YRQLILUH-DylLLj9w.js → mindmap-definition-YRQLILUH-Zr-dXC0x.js} +1 -1
- package/ui-dist/assets/{pieDiagram-SKSYHLDU-617wI_rr.js → pieDiagram-SKSYHLDU-BvDAU-Nk.js} +1 -1
- package/ui-dist/assets/{quadrantDiagram-337W2JSQ-lxoCPJIL.js → quadrantDiagram-337W2JSQ-Dn9kM62o.js} +1 -1
- package/ui-dist/assets/{requirementDiagram-Z7DCOOCP-C5XydQ9-.js → requirementDiagram-Z7DCOOCP-GIsIh7Sd.js} +1 -1
- package/ui-dist/assets/{sankeyDiagram-WA2Y5GQK--grmq-Q8.js → sankeyDiagram-WA2Y5GQK-CUCuBkuf.js} +1 -1
- package/ui-dist/assets/{sequenceDiagram-2WXFIKYE-BS2PeYH-.js → sequenceDiagram-2WXFIKYE-MDpUY2HM.js} +1 -1
- package/ui-dist/assets/{stateDiagram-RAJIS63D-CeuZtj2z.js → stateDiagram-RAJIS63D-BymMpuUU.js} +1 -1
- package/ui-dist/assets/stateDiagram-v2-FVOUBMTO-Bi2oCU6d.js +1 -0
- package/ui-dist/assets/{timeline-definition-YZTLITO2-DxHdMpRr.js → timeline-definition-YZTLITO2-B6ofPhhy.js} +1 -1
- package/ui-dist/assets/{treemap-KZPCXAKY-Bv1ZlC5h.js → treemap-KZPCXAKY-DnLO6w1l.js} +1 -1
- package/ui-dist/assets/{vennDiagram-LZ73GAT5-DvpZSXY2.js → vennDiagram-LZ73GAT5-D0MyZIDl.js} +1 -1
- package/ui-dist/assets/{xychartDiagram-JWTSCODW-DttOu1GC.js → xychartDiagram-JWTSCODW-rADY1iUG.js} +1 -1
- package/ui-dist/index.html +2 -2
- package/ui-dist/assets/channel-DGUh6rEi.js +0 -1
- package/ui-dist/assets/classDiagram-VBA2DB6C-1ntk2IOV.js +0 -1
- package/ui-dist/assets/classDiagram-v2-RAHNMMFH-1ntk2IOV.js +0 -1
- package/ui-dist/assets/clone-BpddY88c.js +0 -1
- package/ui-dist/assets/index-C8AD6s7S.js +0 -1510
- package/ui-dist/assets/index-Ded0dPwB.css +0 -1
- package/ui-dist/assets/stateDiagram-v2-FVOUBMTO-DXq0yC5C.js +0 -1
|
@@ -0,0 +1,708 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { and, eq } from "drizzle-orm";
|
|
3
|
+
import { agents, authUsers, issueComments, issues, } from "@rudderhq/db";
|
|
4
|
+
import { getServerAdapter } from "../../agent-runtimes/index.js";
|
|
5
|
+
import { parseObject, asNumber } from "../../agent-runtimes/utils.js";
|
|
6
|
+
import { resolveDefaultAgentWorkspaceDir, } from "../../home-paths.js";
|
|
7
|
+
import { resolveSessionCompactionPolicy, } from "@rudderhq/agent-runtime-utils";
|
|
8
|
+
export { prioritizeProjectWorkspaceCandidatesForRun } from "../agent-run-context.js";
|
|
9
|
+
import * as heartbeatCore from "./heartbeat.core.js";
|
|
10
|
+
const { MAX_LIVE_LOG_CHUNK_BYTES, HEARTBEAT_MAX_CONCURRENT_RUNS_DEFAULT, HEARTBEAT_MAX_CONCURRENT_RUNS_MIN, HEARTBEAT_MAX_CONCURRENT_RUNS_MAX, DEFERRED_WAKE_CONTEXT_KEY, DETACHED_PROCESS_ERROR_CODE, ORPHANED_PROCESS_TERMINATION_GRACE_MS, ORPHANED_PROCESS_KILL_WAIT_MS, ORPHANED_PROCESS_POLL_INTERVAL_MS, startLocksByAgent, MAX_RECOVERY_CHAIN_DEPTH, ISSUE_PASSIVE_FOLLOWUP_REASON, ISSUE_PASSIVE_FOLLOWUP_WAKE_SOURCE, ISSUE_PASSIVE_FOLLOWUP_FAILURE_REASON, ISSUE_PASSIVE_FOLLOWUP_MAX_ATTEMPTS, ISSUE_REVIEW_CLOSEOUT_REASON, ISSUE_REVIEW_CLOSEOUT_FAILURE_REASON, ISSUE_REVIEW_CLOSEOUT_MAX_ATTEMPTS, ISSUE_PASSIVE_FOLLOWUP_COOLDOWN_MS_BY_ATTEMPT, ISSUE_PASSIVE_FOLLOWUP_TIMER_CONTINUITY_MAX_WINDOW_MS, SESSIONED_LOCAL_ADAPTERS, heartbeatRunListColumns, appendExcerpt, appendTranscriptEntriesFromChunk, normalizeMaxConcurrentRuns, withAgentStartLock, readNonEmptyString, resolveHeartbeatObservabilitySurface, buildHeartbeatObservationName, compactTraceText, buildIssueRunTraceName, buildHeartbeatRuntimeTraceMetadata, buildHeartbeatAdapterInvokePayload, buildRecentDateKeys, buildDateKeysBetween, fallbackSkillLabel, normalizeLoadedSkill, normalizeLoadedSkillForPayload, emptySkillEvidenceCounts, incrementSkillEvidenceCount, strongestSkillEvidence, resolveSkillEvidence, readSkillEvidenceFromPayload, extractSkillSlugFromPath, collectSkillPathsFromText, collectStringValues, normalizeSkillUseFromPath, dedupeSkillUses, collectSkillUsesFromText, readToolCommandInput, isCommandTranscriptTool, isReadTranscriptTool, inferUsedSkillsFromTranscript, normalizeSkillCandidate, addSkillCandidate, readSkillReferenceSlug, collectSkillReferences, inferUsedSkillsFromPrompt, normalizeLedgerBillingType, resolveLedgerBiller, normalizeBilledCostCents, resolveLedgerScopeForRun } = heartbeatCore;
|
|
11
|
+
export function buildExplicitResumeSessionOverride(input) {
|
|
12
|
+
const desiredDisplayId = truncateDisplayId(input.resumeRunSessionIdAfter ?? input.resumeRunSessionIdBefore);
|
|
13
|
+
const taskSessionParams = normalizeSessionParams(input.sessionCodec.deserialize(input.taskSession?.sessionParamsJson ?? null));
|
|
14
|
+
const taskSessionDisplayId = truncateDisplayId(input.taskSession?.sessionDisplayId ??
|
|
15
|
+
(input.sessionCodec.getDisplayId ? input.sessionCodec.getDisplayId(taskSessionParams) : null) ??
|
|
16
|
+
readNonEmptyString(taskSessionParams?.sessionId));
|
|
17
|
+
const canReuseTaskSessionParams = input.taskSession != null &&
|
|
18
|
+
(input.taskSession.lastRunId === input.resumeFromRunId ||
|
|
19
|
+
(!!desiredDisplayId && taskSessionDisplayId === desiredDisplayId));
|
|
20
|
+
const sessionParams = canReuseTaskSessionParams
|
|
21
|
+
? taskSessionParams
|
|
22
|
+
: desiredDisplayId
|
|
23
|
+
? { sessionId: desiredDisplayId }
|
|
24
|
+
: null;
|
|
25
|
+
const sessionDisplayId = desiredDisplayId ?? (canReuseTaskSessionParams ? taskSessionDisplayId : null);
|
|
26
|
+
if (!sessionDisplayId && !sessionParams)
|
|
27
|
+
return null;
|
|
28
|
+
return {
|
|
29
|
+
sessionDisplayId,
|
|
30
|
+
sessionParams,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
export function normalizeUsageTotals(usage) {
|
|
34
|
+
if (!usage)
|
|
35
|
+
return null;
|
|
36
|
+
return {
|
|
37
|
+
inputTokens: Math.max(0, Math.floor(asNumber(usage.inputTokens, 0))),
|
|
38
|
+
cachedInputTokens: Math.max(0, Math.floor(asNumber(usage.cachedInputTokens, 0))),
|
|
39
|
+
outputTokens: Math.max(0, Math.floor(asNumber(usage.outputTokens, 0))),
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
export function readRawUsageTotals(usageJson) {
|
|
43
|
+
const parsed = parseObject(usageJson);
|
|
44
|
+
if (Object.keys(parsed).length === 0)
|
|
45
|
+
return null;
|
|
46
|
+
const inputTokens = Math.max(0, Math.floor(asNumber(parsed.rawInputTokens, asNumber(parsed.inputTokens, 0))));
|
|
47
|
+
const cachedInputTokens = Math.max(0, Math.floor(asNumber(parsed.rawCachedInputTokens, asNumber(parsed.cachedInputTokens, 0))));
|
|
48
|
+
const outputTokens = Math.max(0, Math.floor(asNumber(parsed.rawOutputTokens, asNumber(parsed.outputTokens, 0))));
|
|
49
|
+
if (inputTokens <= 0 && cachedInputTokens <= 0 && outputTokens <= 0) {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
return {
|
|
53
|
+
inputTokens,
|
|
54
|
+
cachedInputTokens,
|
|
55
|
+
outputTokens,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
export function deriveNormalizedUsageDelta(current, previous) {
|
|
59
|
+
if (!current)
|
|
60
|
+
return null;
|
|
61
|
+
if (!previous)
|
|
62
|
+
return { ...current };
|
|
63
|
+
const inputTokens = current.inputTokens >= previous.inputTokens
|
|
64
|
+
? current.inputTokens - previous.inputTokens
|
|
65
|
+
: current.inputTokens;
|
|
66
|
+
const cachedInputTokens = current.cachedInputTokens >= previous.cachedInputTokens
|
|
67
|
+
? current.cachedInputTokens - previous.cachedInputTokens
|
|
68
|
+
: current.cachedInputTokens;
|
|
69
|
+
const outputTokens = current.outputTokens >= previous.outputTokens
|
|
70
|
+
? current.outputTokens - previous.outputTokens
|
|
71
|
+
: current.outputTokens;
|
|
72
|
+
return {
|
|
73
|
+
inputTokens: Math.max(0, inputTokens),
|
|
74
|
+
cachedInputTokens: Math.max(0, cachedInputTokens),
|
|
75
|
+
outputTokens: Math.max(0, outputTokens),
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
export function formatCount(value) {
|
|
79
|
+
if (typeof value !== "number" || !Number.isFinite(value))
|
|
80
|
+
return "0";
|
|
81
|
+
return value.toLocaleString("en-US");
|
|
82
|
+
}
|
|
83
|
+
export function parseSessionCompactionPolicy(agent) {
|
|
84
|
+
return resolveSessionCompactionPolicy(agent.agentRuntimeType, agent.runtimeConfig).policy;
|
|
85
|
+
}
|
|
86
|
+
export function resolveRuntimeSessionParamsForWorkspace(input) {
|
|
87
|
+
const { orgId, agent, previousSessionParams, resolvedWorkspace } = input;
|
|
88
|
+
const previousSessionId = readNonEmptyString(previousSessionParams?.sessionId);
|
|
89
|
+
if (!previousSessionId) {
|
|
90
|
+
return {
|
|
91
|
+
sessionParams: previousSessionParams,
|
|
92
|
+
warning: null,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
const canonicalAgentCwd = readNonEmptyString(resolvedWorkspace.cwd) ?? resolveDefaultAgentWorkspaceDir(orgId, agent);
|
|
96
|
+
if (!canonicalAgentCwd) {
|
|
97
|
+
return {
|
|
98
|
+
sessionParams: previousSessionParams,
|
|
99
|
+
warning: null,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
const previousCwd = readNonEmptyString(previousSessionParams?.cwd);
|
|
103
|
+
if (previousCwd && path.resolve(previousCwd) === path.resolve(canonicalAgentCwd)) {
|
|
104
|
+
return {
|
|
105
|
+
sessionParams: previousSessionParams,
|
|
106
|
+
warning: null,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
const previousWorkspaceId = readNonEmptyString(previousSessionParams?.workspaceId);
|
|
110
|
+
const migratedSessionParams = {
|
|
111
|
+
...(previousSessionParams ?? {}),
|
|
112
|
+
cwd: canonicalAgentCwd,
|
|
113
|
+
};
|
|
114
|
+
if (!previousWorkspaceId ||
|
|
115
|
+
!resolvedWorkspace.workspaceId ||
|
|
116
|
+
previousWorkspaceId === resolvedWorkspace.workspaceId) {
|
|
117
|
+
if (resolvedWorkspace.workspaceId)
|
|
118
|
+
migratedSessionParams.workspaceId = resolvedWorkspace.workspaceId;
|
|
119
|
+
if (resolvedWorkspace.repoUrl)
|
|
120
|
+
migratedSessionParams.repoUrl = resolvedWorkspace.repoUrl;
|
|
121
|
+
if (resolvedWorkspace.repoRef)
|
|
122
|
+
migratedSessionParams.repoRef = resolvedWorkspace.repoRef;
|
|
123
|
+
}
|
|
124
|
+
return {
|
|
125
|
+
sessionParams: migratedSessionParams,
|
|
126
|
+
warning: previousCwd
|
|
127
|
+
? `Agent workspace "${canonicalAgentCwd}" is now the canonical run workspace. ` +
|
|
128
|
+
`Attempting to resume session "${previousSessionId}" that was previously saved in "${previousCwd}".`
|
|
129
|
+
: `Agent workspace "${canonicalAgentCwd}" is now the canonical run workspace. ` +
|
|
130
|
+
`Attempting to resume session "${previousSessionId}" with the canonical agent workspace attached.`,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
export function parseIssueAssigneeAgentRuntimeOverrides(raw) {
|
|
134
|
+
const parsed = parseObject(raw);
|
|
135
|
+
const parsedAdapterConfig = parseObject(parsed.agentRuntimeConfig);
|
|
136
|
+
const agentRuntimeConfig = Object.keys(parsedAdapterConfig).length > 0 ? parsedAdapterConfig : null;
|
|
137
|
+
const useProjectWorkspace = typeof parsed.useProjectWorkspace === "boolean"
|
|
138
|
+
? parsed.useProjectWorkspace
|
|
139
|
+
: null;
|
|
140
|
+
if (!agentRuntimeConfig && useProjectWorkspace === null)
|
|
141
|
+
return null;
|
|
142
|
+
return {
|
|
143
|
+
agentRuntimeConfig,
|
|
144
|
+
useProjectWorkspace,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
export function deriveTaskKey(contextSnapshot, payload) {
|
|
148
|
+
return (readNonEmptyString(contextSnapshot?.taskKey) ??
|
|
149
|
+
readNonEmptyString(contextSnapshot?.taskId) ??
|
|
150
|
+
readNonEmptyString(contextSnapshot?.issueId) ??
|
|
151
|
+
readNonEmptyString(payload?.taskKey) ??
|
|
152
|
+
readNonEmptyString(payload?.taskId) ??
|
|
153
|
+
readNonEmptyString(payload?.issueId) ??
|
|
154
|
+
null);
|
|
155
|
+
}
|
|
156
|
+
export function shouldResetTaskSessionForWake(contextSnapshot) {
|
|
157
|
+
if (contextSnapshot?.forceFreshSession === true)
|
|
158
|
+
return true;
|
|
159
|
+
const wakeReason = readNonEmptyString(contextSnapshot?.wakeReason);
|
|
160
|
+
if (wakeReason === "issue_assigned")
|
|
161
|
+
return true;
|
|
162
|
+
return false;
|
|
163
|
+
}
|
|
164
|
+
export function formatRuntimeWorkspaceWarningLog(warning) {
|
|
165
|
+
return {
|
|
166
|
+
stream: "stdout",
|
|
167
|
+
chunk: `[rudder] ${warning}\n`,
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
export function describeSessionResetReason(contextSnapshot) {
|
|
171
|
+
if (contextSnapshot?.forceFreshSession === true)
|
|
172
|
+
return "forceFreshSession was requested";
|
|
173
|
+
const wakeReason = readNonEmptyString(contextSnapshot?.wakeReason);
|
|
174
|
+
if (wakeReason === "issue_assigned")
|
|
175
|
+
return "wake reason is issue_assigned";
|
|
176
|
+
return null;
|
|
177
|
+
}
|
|
178
|
+
export function deriveCommentId(contextSnapshot, payload) {
|
|
179
|
+
return (readNonEmptyString(contextSnapshot?.wakeCommentId) ??
|
|
180
|
+
readNonEmptyString(contextSnapshot?.commentId) ??
|
|
181
|
+
readNonEmptyString(payload?.commentId) ??
|
|
182
|
+
null);
|
|
183
|
+
}
|
|
184
|
+
export function enrichWakeContextSnapshot(input) {
|
|
185
|
+
const { contextSnapshot, reason, source, triggerDetail, payload } = input;
|
|
186
|
+
const issueIdFromPayload = readNonEmptyString(payload?.["issueId"]);
|
|
187
|
+
const commentIdFromPayload = readNonEmptyString(payload?.["commentId"]);
|
|
188
|
+
const taskKey = deriveTaskKey(contextSnapshot, payload);
|
|
189
|
+
const wakeCommentId = deriveCommentId(contextSnapshot, payload);
|
|
190
|
+
if (!readNonEmptyString(contextSnapshot["wakeReason"]) && reason) {
|
|
191
|
+
contextSnapshot.wakeReason = reason;
|
|
192
|
+
}
|
|
193
|
+
if (!readNonEmptyString(contextSnapshot["issueId"]) && issueIdFromPayload) {
|
|
194
|
+
contextSnapshot.issueId = issueIdFromPayload;
|
|
195
|
+
}
|
|
196
|
+
if (!readNonEmptyString(contextSnapshot["taskId"]) && issueIdFromPayload) {
|
|
197
|
+
contextSnapshot.taskId = issueIdFromPayload;
|
|
198
|
+
}
|
|
199
|
+
if (!readNonEmptyString(contextSnapshot["taskKey"]) && taskKey) {
|
|
200
|
+
contextSnapshot.taskKey = taskKey;
|
|
201
|
+
}
|
|
202
|
+
if (!readNonEmptyString(contextSnapshot["commentId"]) && commentIdFromPayload) {
|
|
203
|
+
contextSnapshot.commentId = commentIdFromPayload;
|
|
204
|
+
}
|
|
205
|
+
if (!readNonEmptyString(contextSnapshot["wakeCommentId"]) && wakeCommentId) {
|
|
206
|
+
contextSnapshot.wakeCommentId = wakeCommentId;
|
|
207
|
+
}
|
|
208
|
+
if (!readNonEmptyString(contextSnapshot["wakeSource"]) && source) {
|
|
209
|
+
contextSnapshot.wakeSource = source;
|
|
210
|
+
}
|
|
211
|
+
if (!readNonEmptyString(contextSnapshot["wakeTriggerDetail"]) && triggerDetail) {
|
|
212
|
+
contextSnapshot.wakeTriggerDetail = triggerDetail;
|
|
213
|
+
}
|
|
214
|
+
return {
|
|
215
|
+
contextSnapshot,
|
|
216
|
+
issueIdFromPayload,
|
|
217
|
+
commentIdFromPayload,
|
|
218
|
+
taskKey,
|
|
219
|
+
wakeCommentId,
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
export function mergeCoalescedContextSnapshot(existingRaw, incoming) {
|
|
223
|
+
const existing = parseObject(existingRaw);
|
|
224
|
+
const merged = {
|
|
225
|
+
...existing,
|
|
226
|
+
...incoming,
|
|
227
|
+
};
|
|
228
|
+
const commentId = deriveCommentId(incoming, null);
|
|
229
|
+
if (commentId) {
|
|
230
|
+
merged.commentId = commentId;
|
|
231
|
+
merged.wakeCommentId = commentId;
|
|
232
|
+
}
|
|
233
|
+
return merged;
|
|
234
|
+
}
|
|
235
|
+
export function issueCommentAuthorKind(comment) {
|
|
236
|
+
if (comment.authorAgentId)
|
|
237
|
+
return "agent";
|
|
238
|
+
if (comment.authorUserId)
|
|
239
|
+
return "user";
|
|
240
|
+
return "system";
|
|
241
|
+
}
|
|
242
|
+
export function issueCommentAuthorLabel(comment) {
|
|
243
|
+
if (comment.authorAgentId) {
|
|
244
|
+
return comment.authorAgentName?.trim() || `Agent ${comment.authorAgentId.slice(0, 8)}`;
|
|
245
|
+
}
|
|
246
|
+
if (comment.authorUserId) {
|
|
247
|
+
return comment.authorUserName?.trim() || `User ${comment.authorUserId.slice(0, 8)}`;
|
|
248
|
+
}
|
|
249
|
+
return "System";
|
|
250
|
+
}
|
|
251
|
+
export function buildDeferredWakePayload(payload, contextSnapshot, issueId) {
|
|
252
|
+
const deferredPayload = { ...(payload ?? {}) };
|
|
253
|
+
if (issueId && !readNonEmptyString(deferredPayload.issueId)) {
|
|
254
|
+
deferredPayload.issueId = issueId;
|
|
255
|
+
}
|
|
256
|
+
deferredPayload[DEFERRED_WAKE_CONTEXT_KEY] = contextSnapshot;
|
|
257
|
+
return deferredPayload;
|
|
258
|
+
}
|
|
259
|
+
export function readDeferredWakeContext(payloadRaw) {
|
|
260
|
+
const payload = parseObject(payloadRaw);
|
|
261
|
+
return parseObject(payload[DEFERRED_WAKE_CONTEXT_KEY]);
|
|
262
|
+
}
|
|
263
|
+
export function readDeferredWakePayload(payloadRaw) {
|
|
264
|
+
const payload = parseObject(payloadRaw);
|
|
265
|
+
delete payload[DEFERRED_WAKE_CONTEXT_KEY];
|
|
266
|
+
return payload;
|
|
267
|
+
}
|
|
268
|
+
export function deriveDeferredWakeTaskKey(payloadRaw) {
|
|
269
|
+
const payload = readDeferredWakePayload(payloadRaw);
|
|
270
|
+
const contextSnapshot = readDeferredWakeContext(payloadRaw);
|
|
271
|
+
return deriveTaskKey(contextSnapshot, payload);
|
|
272
|
+
}
|
|
273
|
+
export async function hydrateWakeContextSnapshot(db, orgId, contextSnapshot) {
|
|
274
|
+
const issueId = readNonEmptyString(contextSnapshot.issueId);
|
|
275
|
+
const commentId = deriveCommentId(contextSnapshot, null);
|
|
276
|
+
const issueContext = parseObject(contextSnapshot.issue);
|
|
277
|
+
const commentContext = parseObject(contextSnapshot.comment);
|
|
278
|
+
const needsIssueContext = !!issueId &&
|
|
279
|
+
(!readNonEmptyString(issueContext.id) ||
|
|
280
|
+
!readNonEmptyString(issueContext.title) ||
|
|
281
|
+
!readNonEmptyString(issueContext.status) ||
|
|
282
|
+
!("priority" in issueContext) ||
|
|
283
|
+
!("description" in issueContext));
|
|
284
|
+
const needsProjectId = !!issueId && !readNonEmptyString(contextSnapshot.projectId);
|
|
285
|
+
const needsCommentContext = !!commentId &&
|
|
286
|
+
(!readNonEmptyString(commentContext.id) ||
|
|
287
|
+
!readNonEmptyString(commentContext.body) ||
|
|
288
|
+
!readNonEmptyString(commentContext.authorKind) ||
|
|
289
|
+
!readNonEmptyString(commentContext.authorLabel) ||
|
|
290
|
+
!readNonEmptyString(commentContext.createdAt));
|
|
291
|
+
if (!needsIssueContext && !needsProjectId && !needsCommentContext)
|
|
292
|
+
return;
|
|
293
|
+
if (issueId && (needsIssueContext || needsProjectId)) {
|
|
294
|
+
const issueRow = await db
|
|
295
|
+
.select({
|
|
296
|
+
id: issues.id,
|
|
297
|
+
title: issues.title,
|
|
298
|
+
description: issues.description,
|
|
299
|
+
status: issues.status,
|
|
300
|
+
priority: issues.priority,
|
|
301
|
+
projectId: issues.projectId,
|
|
302
|
+
})
|
|
303
|
+
.from(issues)
|
|
304
|
+
.where(and(eq(issues.id, issueId), eq(issues.orgId, orgId)))
|
|
305
|
+
.then((rows) => rows[0] ?? null);
|
|
306
|
+
if (issueRow) {
|
|
307
|
+
contextSnapshot.issue = {
|
|
308
|
+
...issueContext,
|
|
309
|
+
id: readNonEmptyString(issueContext.id) ?? issueRow.id,
|
|
310
|
+
title: readNonEmptyString(issueContext.title) ?? issueRow.title,
|
|
311
|
+
description: "description" in issueContext ? issueContext.description : issueRow.description,
|
|
312
|
+
status: readNonEmptyString(issueContext.status) ?? issueRow.status,
|
|
313
|
+
priority: "priority" in issueContext ? issueContext.priority : issueRow.priority,
|
|
314
|
+
};
|
|
315
|
+
if (!readNonEmptyString(contextSnapshot.projectId) && issueRow.projectId) {
|
|
316
|
+
contextSnapshot.projectId = issueRow.projectId;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
if (commentId && needsCommentContext) {
|
|
321
|
+
const commentConditions = [eq(issueComments.id, commentId), eq(issueComments.orgId, orgId)];
|
|
322
|
+
if (issueId) {
|
|
323
|
+
commentConditions.push(eq(issueComments.issueId, issueId));
|
|
324
|
+
}
|
|
325
|
+
const commentRow = await db
|
|
326
|
+
.select({
|
|
327
|
+
id: issueComments.id,
|
|
328
|
+
body: issueComments.body,
|
|
329
|
+
authorAgentId: issueComments.authorAgentId,
|
|
330
|
+
authorUserId: issueComments.authorUserId,
|
|
331
|
+
authorAgentName: agents.name,
|
|
332
|
+
authorUserName: authUsers.name,
|
|
333
|
+
createdAt: issueComments.createdAt,
|
|
334
|
+
})
|
|
335
|
+
.from(issueComments)
|
|
336
|
+
.leftJoin(agents, eq(issueComments.authorAgentId, agents.id))
|
|
337
|
+
.leftJoin(authUsers, eq(issueComments.authorUserId, authUsers.id))
|
|
338
|
+
.where(and(...commentConditions))
|
|
339
|
+
.then((rows) => rows[0] ?? null);
|
|
340
|
+
if (commentRow) {
|
|
341
|
+
contextSnapshot.comment = {
|
|
342
|
+
...commentContext,
|
|
343
|
+
id: readNonEmptyString(commentContext.id) ?? commentRow.id,
|
|
344
|
+
body: readNonEmptyString(commentContext.body) ?? commentRow.body,
|
|
345
|
+
authorAgentId: "authorAgentId" in commentContext ? commentContext.authorAgentId : commentRow.authorAgentId,
|
|
346
|
+
authorUserId: "authorUserId" in commentContext ? commentContext.authorUserId : commentRow.authorUserId,
|
|
347
|
+
authorKind: readNonEmptyString(commentContext.authorKind) ?? issueCommentAuthorKind(commentRow),
|
|
348
|
+
authorLabel: readNonEmptyString(commentContext.authorLabel) ?? issueCommentAuthorLabel(commentRow),
|
|
349
|
+
createdAt: readNonEmptyString(commentContext.createdAt) ?? commentRow.createdAt.toISOString(),
|
|
350
|
+
};
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
export function firstNonEmptyLine(value) {
|
|
355
|
+
if (typeof value !== "string")
|
|
356
|
+
return null;
|
|
357
|
+
const line = value
|
|
358
|
+
.split("\n")
|
|
359
|
+
.map((chunk) => chunk.trim())
|
|
360
|
+
.find(Boolean);
|
|
361
|
+
return line ?? null;
|
|
362
|
+
}
|
|
363
|
+
export function deriveRecoveryFailureKind(run) {
|
|
364
|
+
return (readNonEmptyString(run.errorCode) ??
|
|
365
|
+
(run.status === "timed_out" ? "timed_out" : null) ??
|
|
366
|
+
run.status);
|
|
367
|
+
}
|
|
368
|
+
export function deriveRecoveryFailureSummary(run) {
|
|
369
|
+
return (firstNonEmptyLine(run.error) ??
|
|
370
|
+
firstNonEmptyLine(run.stderrExcerpt) ??
|
|
371
|
+
firstNonEmptyLine(run.stdoutExcerpt) ??
|
|
372
|
+
(run.status === "timed_out" ? "The run timed out before it completed." : null) ??
|
|
373
|
+
"The previous run failed before it completed.");
|
|
374
|
+
}
|
|
375
|
+
export function mergeMissingRecoveryContextFields(target, source) {
|
|
376
|
+
const keysToBackfill = [
|
|
377
|
+
"issueId",
|
|
378
|
+
"taskId",
|
|
379
|
+
"taskKey",
|
|
380
|
+
"projectId",
|
|
381
|
+
"projectWorkspaceId",
|
|
382
|
+
"commentId",
|
|
383
|
+
"wakeCommentId",
|
|
384
|
+
"issue",
|
|
385
|
+
"comment",
|
|
386
|
+
"source",
|
|
387
|
+
"wakeSource",
|
|
388
|
+
"wakeTriggerDetail",
|
|
389
|
+
];
|
|
390
|
+
for (const key of keysToBackfill) {
|
|
391
|
+
if (!(key in target) || target[key] === null || target[key] === undefined || target[key] === "") {
|
|
392
|
+
const value = source[key];
|
|
393
|
+
if (value !== null && value !== undefined && value !== "") {
|
|
394
|
+
target[key] = value;
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
export async function hydrateRecoveryBaseContextSnapshot(run, getRunById) {
|
|
400
|
+
const mergedContext = { ...parseObject(run.contextSnapshot) };
|
|
401
|
+
let ancestorRunId = readNonEmptyString(run.retryOfRunId);
|
|
402
|
+
let depth = 0;
|
|
403
|
+
while (ancestorRunId && depth < MAX_RECOVERY_CHAIN_DEPTH) {
|
|
404
|
+
const ancestorRun = await getRunById(ancestorRunId);
|
|
405
|
+
if (!ancestorRun)
|
|
406
|
+
break;
|
|
407
|
+
mergeMissingRecoveryContextFields(mergedContext, parseObject(ancestorRun.contextSnapshot));
|
|
408
|
+
ancestorRunId = readNonEmptyString(ancestorRun.retryOfRunId);
|
|
409
|
+
depth += 1;
|
|
410
|
+
}
|
|
411
|
+
return mergedContext;
|
|
412
|
+
}
|
|
413
|
+
export function buildRecoveryContextSnapshot(input) {
|
|
414
|
+
const { baseContextSnapshot, run, recoveryTrigger, wakeReason, wakeSource, triggerDetail } = input;
|
|
415
|
+
const failureKind = deriveRecoveryFailureKind(run);
|
|
416
|
+
const failureSummary = deriveRecoveryFailureSummary(run);
|
|
417
|
+
const recovery = {
|
|
418
|
+
originalRunId: run.id,
|
|
419
|
+
failureKind,
|
|
420
|
+
failureSummary,
|
|
421
|
+
recoveryTrigger,
|
|
422
|
+
recoveryMode: "continue_preferred",
|
|
423
|
+
};
|
|
424
|
+
return {
|
|
425
|
+
...baseContextSnapshot,
|
|
426
|
+
wakeReason,
|
|
427
|
+
wakeSource,
|
|
428
|
+
wakeTriggerDetail: triggerDetail,
|
|
429
|
+
retryOfRunId: run.id,
|
|
430
|
+
retryReason: failureKind,
|
|
431
|
+
recovery,
|
|
432
|
+
};
|
|
433
|
+
}
|
|
434
|
+
export function normalizePassiveFollowupContext(raw) {
|
|
435
|
+
const parsed = parseObject(raw);
|
|
436
|
+
const originRunId = readNonEmptyString(parsed.originRunId);
|
|
437
|
+
if (!originRunId)
|
|
438
|
+
return null;
|
|
439
|
+
const attempt = Math.max(0, Math.floor(asNumber(parsed.attempt, 0)));
|
|
440
|
+
return {
|
|
441
|
+
originRunId,
|
|
442
|
+
previousRunId: readNonEmptyString(parsed.previousRunId),
|
|
443
|
+
attempt,
|
|
444
|
+
maxAttempts: Math.max(1, Math.floor(asNumber(parsed.maxAttempts, ISSUE_PASSIVE_FOLLOWUP_MAX_ATTEMPTS))),
|
|
445
|
+
reason: ISSUE_PASSIVE_FOLLOWUP_FAILURE_REASON,
|
|
446
|
+
queuedAt: readNonEmptyString(parsed.queuedAt),
|
|
447
|
+
};
|
|
448
|
+
}
|
|
449
|
+
export function normalizeReviewCloseoutContext(raw) {
|
|
450
|
+
const parsed = parseObject(raw);
|
|
451
|
+
const originRunId = readNonEmptyString(parsed.originRunId);
|
|
452
|
+
if (!originRunId)
|
|
453
|
+
return null;
|
|
454
|
+
const attempt = Math.max(0, Math.floor(asNumber(parsed.attempt, 0)));
|
|
455
|
+
return {
|
|
456
|
+
originRunId,
|
|
457
|
+
previousRunId: readNonEmptyString(parsed.previousRunId),
|
|
458
|
+
attempt,
|
|
459
|
+
maxAttempts: Math.max(1, Math.floor(asNumber(parsed.maxAttempts, ISSUE_REVIEW_CLOSEOUT_MAX_ATTEMPTS))),
|
|
460
|
+
reason: ISSUE_REVIEW_CLOSEOUT_FAILURE_REASON,
|
|
461
|
+
};
|
|
462
|
+
}
|
|
463
|
+
export function passiveFollowupCooldownMs(attempt) {
|
|
464
|
+
return ISSUE_PASSIVE_FOLLOWUP_COOLDOWN_MS_BY_ATTEMPT.get(attempt) ?? 5 * 60 * 1000;
|
|
465
|
+
}
|
|
466
|
+
export function issueHasReviewer(issue) {
|
|
467
|
+
return Boolean(issue.reviewerAgentId || issue.reviewerUserId);
|
|
468
|
+
}
|
|
469
|
+
export function isAgentEligibleForTimerContinuation(agent) {
|
|
470
|
+
return (agent.status !== "paused" &&
|
|
471
|
+
agent.status !== "terminated" &&
|
|
472
|
+
agent.status !== "pending_approval");
|
|
473
|
+
}
|
|
474
|
+
export function hasCredibleTimerContinuation(input) {
|
|
475
|
+
if (!input.policy.enabled || input.policy.intervalSec <= 0)
|
|
476
|
+
return false;
|
|
477
|
+
if (!isAgentEligibleForTimerContinuation(input.agent))
|
|
478
|
+
return false;
|
|
479
|
+
const intervalMs = input.policy.intervalSec * 1000;
|
|
480
|
+
const nearTermWindowMs = Math.min(intervalMs * 2, ISSUE_PASSIVE_FOLLOWUP_TIMER_CONTINUITY_MAX_WINDOW_MS);
|
|
481
|
+
const lastHeartbeatMs = input.agent.lastHeartbeatAt
|
|
482
|
+
? new Date(input.agent.lastHeartbeatAt).getTime()
|
|
483
|
+
: new Date(input.agent.createdAt).getTime();
|
|
484
|
+
const runFinishedMs = input.run.finishedAt
|
|
485
|
+
? new Date(input.run.finishedAt).getTime()
|
|
486
|
+
: input.now.getTime();
|
|
487
|
+
const baselineMs = Math.max(lastHeartbeatMs, runFinishedMs);
|
|
488
|
+
const nextTimerMs = baselineMs + intervalMs;
|
|
489
|
+
return Math.max(0, nextTimerMs - input.now.getTime()) <= nearTermWindowMs;
|
|
490
|
+
}
|
|
491
|
+
export function buildPassiveFollowupContextSnapshot(input) {
|
|
492
|
+
const baseContext = { ...parseObject(input.run.contextSnapshot) };
|
|
493
|
+
delete baseContext.recovery;
|
|
494
|
+
delete baseContext.retryOfRunId;
|
|
495
|
+
delete baseContext.retryReason;
|
|
496
|
+
const taskKey = deriveTaskKey(baseContext, { issueId: input.issue.id }) ?? input.issue.id;
|
|
497
|
+
return {
|
|
498
|
+
...baseContext,
|
|
499
|
+
issueId: input.issue.id,
|
|
500
|
+
taskId: input.issue.id,
|
|
501
|
+
taskKey,
|
|
502
|
+
projectId: readNonEmptyString(baseContext.projectId) ?? input.issue.projectId ?? undefined,
|
|
503
|
+
wakeReason: ISSUE_PASSIVE_FOLLOWUP_REASON,
|
|
504
|
+
wakeSource: ISSUE_PASSIVE_FOLLOWUP_WAKE_SOURCE,
|
|
505
|
+
wakeTriggerDetail: "system",
|
|
506
|
+
issue: {
|
|
507
|
+
id: input.issue.id,
|
|
508
|
+
title: input.issue.title,
|
|
509
|
+
description: input.issue.description,
|
|
510
|
+
status: input.issue.status,
|
|
511
|
+
priority: input.issue.priority,
|
|
512
|
+
},
|
|
513
|
+
passiveFollowup: {
|
|
514
|
+
originRunId: input.originRunId,
|
|
515
|
+
previousRunId: input.run.id,
|
|
516
|
+
attempt: input.attempt,
|
|
517
|
+
maxAttempts: ISSUE_PASSIVE_FOLLOWUP_MAX_ATTEMPTS,
|
|
518
|
+
reason: ISSUE_PASSIVE_FOLLOWUP_FAILURE_REASON,
|
|
519
|
+
queuedAt: input.now.toISOString(),
|
|
520
|
+
},
|
|
521
|
+
...(issueHasReviewer(input.issue)
|
|
522
|
+
? {
|
|
523
|
+
reviewGate: {
|
|
524
|
+
reviewerAgentId: input.issue.reviewerAgentId,
|
|
525
|
+
reviewerUserId: input.issue.reviewerUserId,
|
|
526
|
+
closeOutRequirement: "Move the issue to in_review when work is ready, or to blocked/cancelled if it cannot proceed.",
|
|
527
|
+
},
|
|
528
|
+
}
|
|
529
|
+
: {}),
|
|
530
|
+
};
|
|
531
|
+
}
|
|
532
|
+
export function runTaskKey(run) {
|
|
533
|
+
return deriveTaskKey(run.contextSnapshot, null);
|
|
534
|
+
}
|
|
535
|
+
export function isSameTaskScope(left, right) {
|
|
536
|
+
return (left ?? null) === (right ?? null);
|
|
537
|
+
}
|
|
538
|
+
export function isTrackedLocalChildProcessAdapter(agentRuntimeType) {
|
|
539
|
+
return SESSIONED_LOCAL_ADAPTERS.has(agentRuntimeType);
|
|
540
|
+
}
|
|
541
|
+
// A positive liveness check means some process currently owns the PID.
|
|
542
|
+
// On Linux, PIDs can be recycled, so this is a best-effort signal rather
|
|
543
|
+
// than proof that the original child is still alive.
|
|
544
|
+
export function isProcessAlive(pid) {
|
|
545
|
+
if (typeof pid !== "number" || !Number.isInteger(pid) || pid <= 0)
|
|
546
|
+
return false;
|
|
547
|
+
try {
|
|
548
|
+
process.kill(pid, 0);
|
|
549
|
+
return true;
|
|
550
|
+
}
|
|
551
|
+
catch (error) {
|
|
552
|
+
const code = error?.code;
|
|
553
|
+
if (code === "EPERM")
|
|
554
|
+
return true;
|
|
555
|
+
if (code === "ESRCH")
|
|
556
|
+
return false;
|
|
557
|
+
return false;
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
export async function waitForProcessExit(pid, timeoutMs) {
|
|
561
|
+
const deadline = Date.now() + Math.max(0, timeoutMs);
|
|
562
|
+
while (Date.now() < deadline) {
|
|
563
|
+
if (!isProcessAlive(pid))
|
|
564
|
+
return true;
|
|
565
|
+
await new Promise((resolve) => setTimeout(resolve, ORPHANED_PROCESS_POLL_INTERVAL_MS));
|
|
566
|
+
}
|
|
567
|
+
return !isProcessAlive(pid);
|
|
568
|
+
}
|
|
569
|
+
export async function terminateOrphanedProcess(pid) {
|
|
570
|
+
if (!isProcessAlive(pid)) {
|
|
571
|
+
return {
|
|
572
|
+
stillAlive: false,
|
|
573
|
+
terminationSignal: null,
|
|
574
|
+
error: null,
|
|
575
|
+
};
|
|
576
|
+
}
|
|
577
|
+
let terminationSignal = null;
|
|
578
|
+
try {
|
|
579
|
+
process.kill(pid, "SIGTERM");
|
|
580
|
+
terminationSignal = "SIGTERM";
|
|
581
|
+
}
|
|
582
|
+
catch (error) {
|
|
583
|
+
const code = error?.code;
|
|
584
|
+
if (code === "ESRCH") {
|
|
585
|
+
return {
|
|
586
|
+
stillAlive: false,
|
|
587
|
+
terminationSignal: null,
|
|
588
|
+
error: null,
|
|
589
|
+
};
|
|
590
|
+
}
|
|
591
|
+
return {
|
|
592
|
+
stillAlive: isProcessAlive(pid),
|
|
593
|
+
terminationSignal,
|
|
594
|
+
error: `SIGTERM failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
595
|
+
};
|
|
596
|
+
}
|
|
597
|
+
if (await waitForProcessExit(pid, ORPHANED_PROCESS_TERMINATION_GRACE_MS)) {
|
|
598
|
+
return {
|
|
599
|
+
stillAlive: false,
|
|
600
|
+
terminationSignal,
|
|
601
|
+
error: null,
|
|
602
|
+
};
|
|
603
|
+
}
|
|
604
|
+
try {
|
|
605
|
+
process.kill(pid, "SIGKILL");
|
|
606
|
+
terminationSignal = "SIGKILL";
|
|
607
|
+
}
|
|
608
|
+
catch (error) {
|
|
609
|
+
const code = error?.code;
|
|
610
|
+
if (code === "ESRCH") {
|
|
611
|
+
return {
|
|
612
|
+
stillAlive: false,
|
|
613
|
+
terminationSignal,
|
|
614
|
+
error: null,
|
|
615
|
+
};
|
|
616
|
+
}
|
|
617
|
+
return {
|
|
618
|
+
stillAlive: isProcessAlive(pid),
|
|
619
|
+
terminationSignal,
|
|
620
|
+
error: `SIGKILL failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
621
|
+
};
|
|
622
|
+
}
|
|
623
|
+
const exitedAfterKill = await waitForProcessExit(pid, ORPHANED_PROCESS_KILL_WAIT_MS);
|
|
624
|
+
return {
|
|
625
|
+
stillAlive: !exitedAfterKill,
|
|
626
|
+
terminationSignal,
|
|
627
|
+
error: exitedAfterKill ? null : `Timed out waiting for child pid ${pid} to exit after ${terminationSignal}`,
|
|
628
|
+
};
|
|
629
|
+
}
|
|
630
|
+
export function truncateDisplayId(value, max = 128) {
|
|
631
|
+
if (!value)
|
|
632
|
+
return null;
|
|
633
|
+
return value.length > max ? value.slice(0, max) : value;
|
|
634
|
+
}
|
|
635
|
+
export function normalizeAgentNameKey(value) {
|
|
636
|
+
if (typeof value !== "string")
|
|
637
|
+
return null;
|
|
638
|
+
const normalized = value.trim().toLowerCase();
|
|
639
|
+
return normalized.length > 0 ? normalized : null;
|
|
640
|
+
}
|
|
641
|
+
export const defaultSessionCodec = {
|
|
642
|
+
deserialize(raw) {
|
|
643
|
+
const asObj = parseObject(raw);
|
|
644
|
+
if (Object.keys(asObj).length > 0)
|
|
645
|
+
return asObj;
|
|
646
|
+
const sessionId = readNonEmptyString(raw?.sessionId);
|
|
647
|
+
if (sessionId)
|
|
648
|
+
return { sessionId };
|
|
649
|
+
return null;
|
|
650
|
+
},
|
|
651
|
+
serialize(params) {
|
|
652
|
+
if (!params || Object.keys(params).length === 0)
|
|
653
|
+
return null;
|
|
654
|
+
return params;
|
|
655
|
+
},
|
|
656
|
+
getDisplayId(params) {
|
|
657
|
+
return readNonEmptyString(params?.sessionId);
|
|
658
|
+
},
|
|
659
|
+
};
|
|
660
|
+
export function getAgentRuntimeSessionCodec(agentRuntimeType) {
|
|
661
|
+
const adapter = getServerAdapter(agentRuntimeType);
|
|
662
|
+
return adapter.sessionCodec ?? defaultSessionCodec;
|
|
663
|
+
}
|
|
664
|
+
export function normalizeSessionParams(params) {
|
|
665
|
+
if (!params)
|
|
666
|
+
return null;
|
|
667
|
+
return Object.keys(params).length > 0 ? params : null;
|
|
668
|
+
}
|
|
669
|
+
export function resolveNextSessionState(input) {
|
|
670
|
+
const { codec, adapterResult, previousParams, previousDisplayId, previousLegacySessionId } = input;
|
|
671
|
+
if (adapterResult.clearSession) {
|
|
672
|
+
return {
|
|
673
|
+
params: null,
|
|
674
|
+
displayId: null,
|
|
675
|
+
legacySessionId: null,
|
|
676
|
+
};
|
|
677
|
+
}
|
|
678
|
+
const explicitParams = adapterResult.sessionParams;
|
|
679
|
+
const hasExplicitParams = adapterResult.sessionParams !== undefined;
|
|
680
|
+
const hasExplicitSessionId = adapterResult.sessionId !== undefined;
|
|
681
|
+
const explicitSessionId = readNonEmptyString(adapterResult.sessionId);
|
|
682
|
+
const hasExplicitDisplay = adapterResult.sessionDisplayId !== undefined;
|
|
683
|
+
const explicitDisplayId = readNonEmptyString(adapterResult.sessionDisplayId);
|
|
684
|
+
const shouldUsePrevious = !hasExplicitParams && !hasExplicitSessionId && !hasExplicitDisplay;
|
|
685
|
+
const candidateParams = hasExplicitParams
|
|
686
|
+
? explicitParams
|
|
687
|
+
: hasExplicitSessionId
|
|
688
|
+
? (explicitSessionId ? { sessionId: explicitSessionId } : null)
|
|
689
|
+
: previousParams;
|
|
690
|
+
const serialized = normalizeSessionParams(codec.serialize(normalizeSessionParams(candidateParams) ?? null));
|
|
691
|
+
const deserialized = normalizeSessionParams(codec.deserialize(serialized));
|
|
692
|
+
const displayId = truncateDisplayId(explicitDisplayId ??
|
|
693
|
+
(codec.getDisplayId ? codec.getDisplayId(deserialized) : null) ??
|
|
694
|
+
readNonEmptyString(deserialized?.sessionId) ??
|
|
695
|
+
(shouldUsePrevious ? previousDisplayId : null) ??
|
|
696
|
+
explicitSessionId ??
|
|
697
|
+
(shouldUsePrevious ? previousLegacySessionId : null));
|
|
698
|
+
const legacySessionId = explicitSessionId ??
|
|
699
|
+
readNonEmptyString(deserialized?.sessionId) ??
|
|
700
|
+
displayId ??
|
|
701
|
+
(shouldUsePrevious ? previousLegacySessionId : null);
|
|
702
|
+
return {
|
|
703
|
+
params: serialized,
|
|
704
|
+
displayId,
|
|
705
|
+
legacySessionId,
|
|
706
|
+
};
|
|
707
|
+
}
|
|
708
|
+
//# sourceMappingURL=heartbeat.sessions.js.map
|