@rudderhq/server 0.7.11 → 0.7.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bootstrap/register-api-routes.d.ts.map +1 -1
- package/dist/bootstrap/register-api-routes.js +1 -1
- package/dist/bootstrap/register-api-routes.js.map +1 -1
- package/dist/bootstrap/types.d.ts +7 -0
- package/dist/bootstrap/types.d.ts.map +1 -1
- package/dist/index.js +18 -3
- package/dist/index.js.map +1 -1
- package/dist/routes/agents.management-routes.d.ts.map +1 -1
- package/dist/routes/agents.management-routes.js +2 -0
- package/dist/routes/agents.management-routes.js.map +1 -1
- package/dist/routes/chats.d.ts +2 -1
- package/dist/routes/chats.d.ts.map +1 -1
- package/dist/routes/chats.js +334 -4
- 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 +55 -3
- package/dist/routes/chats.stream-routes.js.map +1 -1
- package/dist/routes/goals.d.ts.map +1 -1
- package/dist/routes/goals.js +10 -3
- package/dist/routes/goals.js.map +1 -1
- package/dist/routes/orgs.d.ts.map +1 -1
- package/dist/routes/orgs.js +22 -1
- package/dist/routes/orgs.js.map +1 -1
- package/dist/routes/run-intelligence.d.ts.map +1 -1
- package/dist/routes/run-intelligence.js +9 -0
- package/dist/routes/run-intelligence.js.map +1 -1
- package/dist/services/agent-instructions.d.ts +1 -0
- package/dist/services/agent-instructions.d.ts.map +1 -1
- package/dist/services/agent-instructions.js +124 -6
- package/dist/services/agent-instructions.js.map +1 -1
- package/dist/services/agent-run-context.d.ts.map +1 -1
- package/dist/services/agent-run-context.js +15 -0
- package/dist/services/agent-run-context.js.map +1 -1
- package/dist/services/agent-startup-context.d.ts +4 -0
- package/dist/services/agent-startup-context.d.ts.map +1 -1
- package/dist/services/agent-startup-context.js +57 -13
- package/dist/services/agent-startup-context.js.map +1 -1
- package/dist/services/agents.d.ts +218 -0
- package/dist/services/agents.d.ts.map +1 -1
- package/dist/services/automations.d.ts.map +1 -1
- package/dist/services/automations.js +3 -0
- package/dist/services/automations.js.map +1 -1
- package/dist/services/chat-agent-runs.d.ts +47 -1
- package/dist/services/chat-agent-runs.d.ts.map +1 -1
- package/dist/services/chat-agent-runs.js +91 -1
- package/dist/services/chat-agent-runs.js.map +1 -1
- package/dist/services/chat-assistant.d.ts.map +1 -1
- package/dist/services/chat-assistant.helpers.d.ts +12 -3
- package/dist/services/chat-assistant.helpers.d.ts.map +1 -1
- package/dist/services/chat-assistant.helpers.js +3 -0
- package/dist/services/chat-assistant.helpers.js.map +1 -1
- package/dist/services/chat-assistant.js +54 -18
- package/dist/services/chat-assistant.js.map +1 -1
- package/dist/services/chat-generation-protocol.d.ts +119 -0
- package/dist/services/chat-generation-protocol.d.ts.map +1 -1
- package/dist/services/chat-generation-protocol.js +65 -0
- package/dist/services/chat-generation-protocol.js.map +1 -1
- package/dist/services/chats.constants.d.ts +1 -1
- package/dist/services/chats.constants.d.ts.map +1 -1
- package/dist/services/chats.constants.js +1 -0
- package/dist/services/chats.constants.js.map +1 -1
- package/dist/services/chats.d.ts +128 -0
- package/dist/services/chats.d.ts.map +1 -1
- package/dist/services/chats.js +10 -0
- package/dist/services/chats.js.map +1 -1
- package/dist/services/goals.d.ts +36 -0
- package/dist/services/goals.d.ts.map +1 -1
- package/dist/services/goals.js +21 -1
- package/dist/services/goals.js.map +1 -1
- package/dist/services/heartbeat-run-reference.d.ts.map +1 -1
- package/dist/services/heartbeat-run-reference.js +11 -5
- package/dist/services/heartbeat-run-reference.js.map +1 -1
- package/dist/services/index.d.ts +2 -1
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +2 -1
- package/dist/services/index.js.map +1 -1
- package/dist/services/integrations/feishu/runtime.d.ts +8 -0
- package/dist/services/integrations/feishu/runtime.d.ts.map +1 -1
- package/dist/services/integrations/feishu/runtime.js +124 -1
- package/dist/services/integrations/feishu/runtime.js.map +1 -1
- package/dist/services/issues.d.ts.map +1 -1
- package/dist/services/issues.helpers.d.ts +8 -0
- package/dist/services/issues.helpers.d.ts.map +1 -1
- package/dist/services/issues.helpers.js +17 -1
- package/dist/services/issues.helpers.js.map +1 -1
- package/dist/services/issues.js +108 -15
- package/dist/services/issues.js.map +1 -1
- package/dist/services/messenger.d.ts.map +1 -1
- package/dist/services/messenger.js +12 -3
- package/dist/services/messenger.js.map +1 -1
- package/dist/services/organization-members.d.ts +27 -0
- package/dist/services/organization-members.d.ts.map +1 -0
- package/dist/services/organization-members.js +169 -0
- package/dist/services/organization-members.js.map +1 -0
- package/dist/services/organization-workspace-browser.d.ts.map +1 -1
- package/dist/services/organization-workspace-browser.js +44 -10
- package/dist/services/organization-workspace-browser.js.map +1 -1
- package/dist/services/product-intelligence.d.ts.map +1 -1
- package/dist/services/product-intelligence.js +4 -0
- package/dist/services/product-intelligence.js.map +1 -1
- package/dist/services/projects.d.ts +1 -4
- package/dist/services/projects.d.ts.map +1 -1
- package/dist/services/projects.js +27 -2
- package/dist/services/projects.js.map +1 -1
- package/dist/services/rudder-plugin-catalog.d.ts +1 -1
- package/dist/services/rudder-plugin-catalog.d.ts.map +1 -1
- package/dist/services/rudder-plugin-catalog.js +281 -15
- package/dist/services/rudder-plugin-catalog.js.map +1 -1
- package/dist/services/rudder-plugin-catalog.test.js +55 -0
- package/dist/services/rudder-plugin-catalog.test.js.map +1 -1
- package/dist/services/run-intelligence.d.ts.map +1 -1
- package/dist/services/run-intelligence.js +2 -1
- package/dist/services/run-intelligence.js.map +1 -1
- package/dist/services/run-log-store.d.ts +3 -0
- package/dist/services/run-log-store.d.ts.map +1 -1
- package/dist/services/run-log-store.js +124 -18
- package/dist/services/run-log-store.js.map +1 -1
- package/dist/services/runtime-kernel/assignment-run-guardrail.d.ts +2 -0
- package/dist/services/runtime-kernel/assignment-run-guardrail.d.ts.map +1 -1
- package/dist/services/runtime-kernel/assignment-run-guardrail.js +5 -3
- package/dist/services/runtime-kernel/assignment-run-guardrail.js.map +1 -1
- package/dist/services/runtime-kernel/assignment-run-guardrail.test.js +20 -0
- package/dist/services/runtime-kernel/assignment-run-guardrail.test.js.map +1 -1
- package/dist/services/runtime-kernel/heartbeat-attempt-ledger.d.ts +124 -0
- package/dist/services/runtime-kernel/heartbeat-attempt-ledger.d.ts.map +1 -0
- package/dist/services/runtime-kernel/heartbeat-attempt-ledger.js +108 -0
- package/dist/services/runtime-kernel/heartbeat-attempt-ledger.js.map +1 -0
- package/dist/services/runtime-kernel/heartbeat.core.d.ts +111 -0
- package/dist/services/runtime-kernel/heartbeat.core.d.ts.map +1 -1
- package/dist/services/runtime-kernel/heartbeat.core.js +13 -0
- package/dist/services/runtime-kernel/heartbeat.core.js.map +1 -1
- package/dist/services/runtime-kernel/heartbeat.d.ts +34 -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 +229 -3
- package/dist/services/runtime-kernel/heartbeat.execute.js.map +1 -1
- package/dist/services/runtime-kernel/heartbeat.js +161 -6
- package/dist/services/runtime-kernel/heartbeat.js.map +1 -1
- package/dist/services/runtime-kernel/heartbeat.sessions.d.ts.map +1 -1
- package/dist/services/runtime-kernel/heartbeat.sessions.js +15 -3
- package/dist/services/runtime-kernel/heartbeat.sessions.js.map +1 -1
- package/dist/services/runtime-kernel/heartbeat.terminal.d.ts +48 -0
- package/dist/services/runtime-kernel/heartbeat.terminal.d.ts.map +1 -1
- package/dist/services/runtime-kernel/model-fallback.d.ts +4 -0
- package/dist/services/runtime-kernel/model-fallback.d.ts.map +1 -1
- package/dist/services/runtime-kernel/model-fallback.js +25 -4
- package/dist/services/runtime-kernel/model-fallback.js.map +1 -1
- package/dist/services/workspace-backup-v2.d.ts +20 -0
- package/dist/services/workspace-backup-v2.d.ts.map +1 -1
- package/dist/services/workspace-backup-v2.js +155 -23
- package/dist/services/workspace-backup-v2.js.map +1 -1
- package/dist/services/workspace-backup-v2.test.js +34 -2
- package/dist/services/workspace-backup-v2.test.js.map +1 -1
- package/dist/services/workspace-backups.d.ts +0 -1
- package/dist/services/workspace-backups.d.ts.map +1 -1
- package/dist/services/workspace-backups.js +18 -19
- package/dist/services/workspace-backups.js.map +1 -1
- package/dist/services/workspace-manifest-native.d.ts +10 -0
- package/dist/services/workspace-manifest-native.d.ts.map +1 -0
- package/dist/services/workspace-manifest-native.js +219 -0
- package/dist/services/workspace-manifest-native.js.map +1 -0
- package/dist/services/workspace-restore-reconciliation.d.ts +11 -0
- package/dist/services/workspace-restore-reconciliation.d.ts.map +1 -0
- package/dist/services/workspace-restore-reconciliation.js +165 -0
- package/dist/services/workspace-restore-reconciliation.js.map +1 -0
- package/package.json +14 -14
- package/resources/bundled-skills/rudder-docs/references/api-reference.md +8 -0
- package/resources/bundled-skills/rudder-docs/references/cli-reference.md +5 -2
- package/skills/rudder-docs/references/api-reference.md +8 -0
- package/skills/rudder-docs/references/cli-reference.md +5 -2
- package/ui-dist/assets/LibraryLiveSurface-tCWxJKp5.js +1 -0
- package/ui-dist/assets/{abnfDiagram-VRR7QNED-BggxrEZR.js → abnfDiagram-VRR7QNED-BcCms-hs.js} +1 -1
- package/ui-dist/assets/{addon-fit-Cc1gOtSX.js → addon-fit-CH3xNHN4.js} +1 -1
- package/ui-dist/assets/{arc-0kNrc9xt.js → arc-h5W-EkRK.js} +1 -1
- package/ui-dist/assets/{architectureDiagram-ZJ3FMSHR-BOCa-5ab.js → architectureDiagram-ZJ3FMSHR-Bdehm1PB.js} +1 -1
- package/ui-dist/assets/{blockDiagram-677ZJIJ3-CQU5jcsO.js → blockDiagram-677ZJIJ3-BJ3W91Su.js} +1 -1
- package/ui-dist/assets/{c4Diagram-LMCZKHZV-ChgWIw5O.js → c4Diagram-LMCZKHZV-Bnft_fRy.js} +1 -1
- package/ui-dist/assets/channel-G6qIOCiV.js +1 -0
- package/ui-dist/assets/{chunk-2Q5K7J3B-B4yrwesI.js → chunk-2Q5K7J3B-w1SF0tSk.js} +1 -1
- package/ui-dist/assets/{chunk-32BRIVSS-mhAeSMlR.js → chunk-32BRIVSS-C1UzXTFZ.js} +1 -1
- package/ui-dist/assets/{chunk-5VM5RSS4-BmS_u59G.js → chunk-5VM5RSS4-COVI3rNd.js} +1 -1
- package/ui-dist/assets/{chunk-EX3LRPZG-DXoTKkLG.js → chunk-EX3LRPZG-DxQOLy7z.js} +1 -1
- package/ui-dist/assets/{chunk-JWPE2WC7-Bj9myT03.js → chunk-JWPE2WC7-KTwmElcL.js} +1 -1
- package/ui-dist/assets/{chunk-MOJQB5TN-OAoJna8Y.js → chunk-MOJQB5TN-BynL4lzA.js} +1 -1
- package/ui-dist/assets/{chunk-RYQCIY6F-AGLA7TJn.js → chunk-RYQCIY6F-CJksBfuJ.js} +1 -1
- package/ui-dist/assets/{chunk-V7JOEXUC-YGM2tDK2.js → chunk-V7JOEXUC-C_zED5WJ.js} +1 -1
- package/ui-dist/assets/{chunk-VR4S4FIN-DqaZn9Ty.js → chunk-VR4S4FIN-BHDtMeiT.js} +1 -1
- package/ui-dist/assets/{chunk-XXDRQBXY-Cpqn_8Bl.js → chunk-XXDRQBXY-C0VvJgte.js} +1 -1
- package/ui-dist/assets/classDiagram-OUVF2IWQ-D15_PFCL.js +1 -0
- package/ui-dist/assets/classDiagram-v2-EOCWNBFH-D15_PFCL.js +1 -0
- package/ui-dist/assets/{cose-bilkent-JH36ORCC-BVe-X26w.js → cose-bilkent-JH36ORCC-DsTTzpP7.js} +1 -1
- package/ui-dist/assets/{cynefin-VYW2F7L2-DlDrrBWp.js → cynefin-VYW2F7L2-BfULw90s.js} +1 -1
- package/ui-dist/assets/{cynefinDiagram-TSTJHNR4-BSHvFeGh.js → cynefinDiagram-TSTJHNR4-BukSzKVC.js} +1 -1
- package/ui-dist/assets/{dagre-VKFMJZFB-tUm70k9h.js → dagre-VKFMJZFB-BbZY_Ipf.js} +1 -1
- package/ui-dist/assets/{diagram-FQU43EPY-C5kjITq7.js → diagram-FQU43EPY-BTYIYn2p.js} +1 -1
- package/ui-dist/assets/{diagram-G47NLZAW-BrbHgt8r.js → diagram-G47NLZAW-CikY_FKi.js} +1 -1
- package/ui-dist/assets/{diagram-NH7WQ7WH-DT7PdghT.js → diagram-NH7WQ7WH-BfZ7AlT8.js} +1 -1
- package/ui-dist/assets/{diagram-OA4YK3LP-wOjhRHRo.js → diagram-OA4YK3LP-f5AikxJj.js} +1 -1
- package/ui-dist/assets/{diagram-WEI45ONY-Dz9vtaDT.js → diagram-WEI45ONY-BCbG5yas.js} +1 -1
- package/ui-dist/assets/{ebnfDiagram-CCIWWBDH-BT5TzIA6.js → ebnfDiagram-CCIWWBDH-DT-3mJLY.js} +1 -1
- package/ui-dist/assets/{erDiagram-Q63AITRT-DLCpoOEP.js → erDiagram-Q63AITRT-BsfOhDfe.js} +1 -1
- package/ui-dist/assets/{flowDiagram-23GEKE2U-DfF2COjh.js → flowDiagram-23GEKE2U-BfaeQCsg.js} +1 -1
- package/ui-dist/assets/{ganttDiagram-NO4QXBWP-1d0KDwQs.js → ganttDiagram-NO4QXBWP-CgPQruVz.js} +1 -1
- package/ui-dist/assets/{gitGraphDiagram-IHSO6WYX-COLjS1ZR.js → gitGraphDiagram-IHSO6WYX-CNrBFzjY.js} +1 -1
- package/ui-dist/assets/{graph-B7fcgpw_.js → graph-QqDTzUUJ.js} +1 -1
- package/ui-dist/assets/{index-CZYXpHv4.js → index-2ZQZC89T.js} +1 -1
- package/ui-dist/assets/{index-COLwjKBR.js → index-2cYcOpZB.js} +1 -1
- package/ui-dist/assets/{index-CMNULCMJ.js → index-BAt16m_U.js} +1 -1
- package/ui-dist/assets/{index-BczgTMAn.js → index-BY8xCKIE.js} +1 -1
- package/ui-dist/assets/{index-CbqgXGcs.js → index-Befy20DN.js} +1 -1
- package/ui-dist/assets/{index-CgkYyYx9.js → index-BfAP3xNl.js} +1 -1
- package/ui-dist/assets/{index-DTc5LpTU.js → index-BogOyxlk.js} +1 -1
- package/ui-dist/assets/{index-DttnaNlV.js → index-BuIyK71w.js} +559 -559
- package/ui-dist/assets/{index-CH8I9acP.js → index-CQ92CxVC.js} +1 -1
- package/ui-dist/assets/{index-Denv6wuU.js → index-CQFwlD-o.js} +1 -1
- package/ui-dist/assets/{index-B6zSdXAR.js → index-Cu4qo_D7.js} +1 -1
- package/ui-dist/assets/index-DRuC5g8V.css +32 -0
- package/ui-dist/assets/{index-vtghjwab.js → index-DZ4gAeDM.js} +1 -1
- package/ui-dist/assets/{index-CTIfCQqR.js → index-Dc_DUpPj.js} +1 -1
- package/ui-dist/assets/{index-CXg1YCeI.js → index-Dqv46mWS.js} +1 -1
- package/ui-dist/assets/{index-D27Bbc-x.js → index-sFJMMyA3.js} +1 -1
- package/ui-dist/assets/{infoDiagram-FWYZ7A6U-Bg4YQUu2.js → infoDiagram-FWYZ7A6U-BJHuaNA9.js} +1 -1
- package/ui-dist/assets/{ishikawaDiagram-FXEZZL3T-BtgUVI_I.js → ishikawaDiagram-FXEZZL3T-CmsA1Knp.js} +1 -1
- package/ui-dist/assets/{journeyDiagram-5HDEW3XC-BGHGjvN4.js → journeyDiagram-5HDEW3XC-iV_Nt9d4.js} +1 -1
- package/ui-dist/assets/{kanban-definition-HUTT4EX6-DekQSNo8.js → kanban-definition-HUTT4EX6-D45s70Ny.js} +1 -1
- package/ui-dist/assets/{layout-Bsw9hK6u.js → layout-DDC-iOzY.js} +1 -1
- package/ui-dist/assets/{linear-D8D1R-4C.js → linear-DCTJ7Pq3.js} +1 -1
- package/ui-dist/assets/{map-BUIcuf4c.js → map-RGy5k616.js} +1 -1
- package/ui-dist/assets/{mermaid.core-CYZMLemV.js → mermaid.core-6MH04cvi.js} +4 -4
- package/ui-dist/assets/{mindmap-definition-LN4V7U3C-mjS9avIS.js → mindmap-definition-LN4V7U3C-CA2LFmda.js} +1 -1
- package/ui-dist/assets/{pegDiagram-2B236MQR-Buziry9m.js → pegDiagram-2B236MQR-DDsUr2du.js} +1 -1
- package/ui-dist/assets/{pieDiagram-ENE6RG2P-B_9BmFEg.js → pieDiagram-ENE6RG2P-D7jEL8xK.js} +1 -1
- package/ui-dist/assets/{quadrantDiagram-ABIIQ3AL-BxFdUA8s.js → quadrantDiagram-ABIIQ3AL-BsJxgVLb.js} +1 -1
- package/ui-dist/assets/{railroadDiagram-RFXS5EU6-pJh_afC-.js → railroadDiagram-RFXS5EU6-CBI457f6.js} +1 -1
- package/ui-dist/assets/{requirementDiagram-TGXJPOKE-BGgk3AxL.js → requirementDiagram-TGXJPOKE-_GAc0NOO.js} +1 -1
- package/ui-dist/assets/{sankeyDiagram-HTMAVEWB-DdPKE4bs.js → sankeyDiagram-HTMAVEWB-DNIaj5hu.js} +1 -1
- package/ui-dist/assets/{sequenceDiagram-DBY2YBRQ-xlik6FjZ.js → sequenceDiagram-DBY2YBRQ-BHDZs2dc.js} +1 -1
- package/ui-dist/assets/{sizeCapture-X5ZJPWSS-D_zKAjvf.js → sizeCapture-X5ZJPWSS-DwKT6aTP.js} +1 -1
- package/ui-dist/assets/{stateDiagram-2N3HPSRC-BGQP8giG.js → stateDiagram-2N3HPSRC-D2hDsltG.js} +1 -1
- package/ui-dist/assets/stateDiagram-v2-6OUMAXLB-CMTeJdkk.js +1 -0
- package/ui-dist/assets/{swimlanes-5IMT3BWC-ZhE8oAxR.js → swimlanes-5IMT3BWC-BV8xA0iq.js} +2 -2
- package/ui-dist/assets/swimlanesDiagram-G3AALYLV-ChF8QLeM.js +8 -0
- package/ui-dist/assets/{timeline-definition-FHXFAJF6-CUqfijnL.js → timeline-definition-FHXFAJF6-BPJMubhV.js} +1 -1
- package/ui-dist/assets/{vennDiagram-L72KCM5P-B_rqTUA0.js → vennDiagram-L72KCM5P-CY76J0Px.js} +1 -1
- package/ui-dist/assets/{wardleyDiagram-EHGQE667-BTvjybDi.js → wardleyDiagram-EHGQE667-pmNWLdE_.js} +1 -1
- package/ui-dist/assets/{xterm-CRpDYL2s.js → xterm-UByodpzD.js} +1 -1
- package/ui-dist/assets/{xychartDiagram-FW5EYKEG-ZBbwueZ5.js → xychartDiagram-FW5EYKEG-BWZC7gWV.js} +1 -1
- package/ui-dist/index.html +2 -2
- package/ui-dist/assets/LibraryLiveSurface-De1p59PK.js +0 -1
- package/ui-dist/assets/channel-eAoWqZqJ.js +0 -1
- package/ui-dist/assets/classDiagram-OUVF2IWQ-c94PI6yY.js +0 -1
- package/ui-dist/assets/classDiagram-v2-EOCWNBFH-c94PI6yY.js +0 -1
- package/ui-dist/assets/index-RSbihTRP.css +0 -32
- package/ui-dist/assets/stateDiagram-v2-6OUMAXLB-BMEtuB93.js +0 -1
- package/ui-dist/assets/swimlanesDiagram-G3AALYLV-Bdh18WfM.js +0 -8
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { hasSessionCompactionThresholds } from "@rudderhq/agent-runtime-utils";
|
|
2
2
|
import { agentRuntimeState, agents, agentTaskSessions, agentWakeupRequests, goalResultProposals, goals, heartbeatRunEvents, heartbeatRuns, issues, organizations } from "@rudderhq/db";
|
|
3
3
|
import { summarizeTokenUsage, toHeartbeatRun } from "@rudderhq/shared";
|
|
4
|
-
import { and, asc, desc, eq, gt, gte, inArray, lte, ne, or, sql } from "drizzle-orm";
|
|
4
|
+
import { and, asc, desc, eq, gt, gte, inArray, isNull, lte, ne, or, sql } from "drizzle-orm";
|
|
5
5
|
import { randomUUID } from "node:crypto";
|
|
6
6
|
import { runningProcesses } from "../../agent-runtimes/index.js";
|
|
7
7
|
import { killChildProcessTree, parseObject } from "../../agent-runtimes/utils.js";
|
|
@@ -24,10 +24,11 @@ import { recordProductAnalyticsEvent } from "../product-analytics.js";
|
|
|
24
24
|
import { appendHeartbeatRunEvent } from "../run-events.js";
|
|
25
25
|
import { getRunLogStore } from "../run-log-store.js";
|
|
26
26
|
import { workspaceOperationService } from "../workspace-operations.js";
|
|
27
|
+
import { finishLatestHeartbeatRunAttempt } from "./heartbeat-attempt-ledger.js";
|
|
27
28
|
export { prioritizeProjectWorkspaceCandidatesForRun } from "../agent-run-context.js";
|
|
28
29
|
import * as heartbeatCore from "./heartbeat.core.js";
|
|
29
30
|
import * as heartbeatSessions from "./heartbeat.sessions.js";
|
|
30
|
-
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, isIssueCommentMentionWake, 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;
|
|
31
|
+
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, NETWORK_WAIT_MAX_ATTEMPTS, NETWORK_WAIT_EXHAUSTED_ERROR_CODE, NETWORK_WAIT_EXHAUSTED_ERROR, SESSIONED_LOCAL_ADAPTERS, heartbeatRunListColumns, appendExcerpt, appendTranscriptEntriesFromChunk, normalizeMaxConcurrentRuns, withAgentStartLock, readNonEmptyString, isIssueCommentMentionWake, 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;
|
|
31
32
|
const { buildExplicitResumeSessionOverride, normalizeUsageTotals, readRawUsageTotals, deriveNormalizedUsageDelta, formatCount, parseSessionCompactionPolicy, resolveRuntimeSessionParamsForWorkspace, parseIssueAssigneeAgentRuntimeOverrides, deriveTaskKey, shouldResetTaskSessionForWake, formatRuntimeWorkspaceWarningLog, describeSessionResetReason, deriveCommentId, enrichWakeContextSnapshot, mergeCoalescedContextSnapshot, issueCommentAuthorKind, issueCommentAuthorLabel, buildDeferredWakePayload, readDeferredWakeContext, readDeferredWakePayload, deriveDeferredWakeTaskKey, hydrateWakeContextSnapshot, firstNonEmptyLine, deriveRecoveryFailureKind, deriveRecoveryFailureSummary, mergeMissingRecoveryContextFields, hydrateRecoveryBaseContextSnapshot, buildRecoveryContextSnapshot, normalizePassiveFollowupContext, normalizeReviewCloseoutContext, passiveFollowupCooldownMs, issueHasReviewer, isAgentEligibleForTimerContinuation, hasCredibleTimerContinuation, buildPassiveFollowupContextSnapshot, runTaskKey, isSameTaskScope, isTrackedLocalChildProcessAdapter, isProcessAlive, waitForProcessExit, terminateOrphanedProcess, truncateDisplayId, normalizeAgentNameKey, defaultSessionCodec, getAgentRuntimeSessionCodec, normalizeSessionParams, resolveNextSessionState } = heartbeatSessions;
|
|
32
33
|
import { createHeartbeatExecuteHandlers } from "./heartbeat.execute.js";
|
|
33
34
|
import { createHeartbeatMiscHandlers } from "./heartbeat.misc.js";
|
|
@@ -546,6 +547,19 @@ export function heartbeatService(db, testHooks) {
|
|
|
546
547
|
});
|
|
547
548
|
if (updated) {
|
|
548
549
|
publishRunStatus(updated);
|
|
550
|
+
await finishLatestHeartbeatRunAttempt(db, updated.id, {
|
|
551
|
+
status,
|
|
552
|
+
usageDeltaJson: updated.usageJson,
|
|
553
|
+
costUsd: updated.usageJson?.costUsd,
|
|
554
|
+
sessionDisplayId: updated.sessionIdAfter,
|
|
555
|
+
sessionParamsJson: updated.sessionParamsAfterJson,
|
|
556
|
+
errorCode: updated.errorCode,
|
|
557
|
+
error: updated.error,
|
|
558
|
+
finishedAt: updated.finishedAt ?? new Date(),
|
|
559
|
+
}).catch((error) => {
|
|
560
|
+
logger.warn({ err: error, runId: updated.id }, "failed to persist heartbeat attempt terminal state");
|
|
561
|
+
return null;
|
|
562
|
+
});
|
|
549
563
|
const context = parseObject(updated.contextSnapshot);
|
|
550
564
|
const requestId = agentIssueCreationSettlement?.requestId
|
|
551
565
|
?? getAgentIssueCreationRequestIdFromRunContext(context);
|
|
@@ -1002,6 +1016,7 @@ export function heartbeatService(db, testHooks) {
|
|
|
1002
1016
|
.update(heartbeatRuns)
|
|
1003
1017
|
.set({
|
|
1004
1018
|
status: "running",
|
|
1019
|
+
runningSubstate: "executing",
|
|
1005
1020
|
startedAt: currentRun.startedAt ?? claimedAt,
|
|
1006
1021
|
sessionIdBefore: sessionSelection.sessionDisplayId ?? readNonEmptyString(sessionSelection.sessionParams?.sessionId),
|
|
1007
1022
|
sessionParamsBeforeJson: sessionSelection.sessionParams,
|
|
@@ -1130,7 +1145,7 @@ export function heartbeatService(db, testHooks) {
|
|
|
1130
1145
|
})
|
|
1131
1146
|
.from(heartbeatRuns)
|
|
1132
1147
|
.innerJoin(agents, eq(heartbeatRuns.agentId, agents.id))
|
|
1133
|
-
.where(or(eq(heartbeatRuns.status, "running"), eq(heartbeatRuns.terminalEffectsPending, true)));
|
|
1148
|
+
.where(or(and(eq(heartbeatRuns.status, "running"), or(isNull(heartbeatRuns.runningSubstate), ne(heartbeatRuns.runningSubstate, "waiting_for_network"))), eq(heartbeatRuns.terminalEffectsPending, true)));
|
|
1134
1149
|
for (const { run, agentRuntimeType } of activeRuns) {
|
|
1135
1150
|
if (run.terminalEffectsPending) {
|
|
1136
1151
|
if (!run.processExitedAt) {
|
|
@@ -1276,7 +1291,7 @@ export function heartbeatService(db, testHooks) {
|
|
|
1276
1291
|
.from(heartbeatRuns)
|
|
1277
1292
|
.innerJoin(agents, eq(heartbeatRuns.agentId, agents.id))
|
|
1278
1293
|
.leftJoin(heartbeatRunEvents, eq(heartbeatRunEvents.runId, heartbeatRuns.id))
|
|
1279
|
-
.where(eq(heartbeatRuns.status, "running"))
|
|
1294
|
+
.where(and(eq(heartbeatRuns.status, "running"), or(isNull(heartbeatRuns.runningSubstate), ne(heartbeatRuns.runningSubstate, "waiting_for_network"))))
|
|
1280
1295
|
.groupBy(heartbeatRuns.id, agents.agentRuntimeType);
|
|
1281
1296
|
const timedOut = [];
|
|
1282
1297
|
for (const { run, agentRuntimeType, lastEventAt, eventCount } of activeRuns) {
|
|
@@ -1362,7 +1377,7 @@ export function heartbeatService(db, testHooks) {
|
|
|
1362
1377
|
})
|
|
1363
1378
|
.from(heartbeatRuns)
|
|
1364
1379
|
.innerJoin(agents, eq(heartbeatRuns.agentId, agents.id))
|
|
1365
|
-
.where(eq(heartbeatRuns.status, "running"));
|
|
1380
|
+
.where(and(eq(heartbeatRuns.status, "running"), or(isNull(heartbeatRuns.runningSubstate), ne(heartbeatRuns.runningSubstate, "waiting_for_network"))));
|
|
1366
1381
|
const timedOut = [];
|
|
1367
1382
|
for (const { run, agentRuntimeType } of activeRuns) {
|
|
1368
1383
|
if (opts?.recoveryCutoff && new Date(run.createdAt).getTime() >= opts.recoveryCutoff.getTime())
|
|
@@ -1372,7 +1387,7 @@ export function heartbeatService(db, testHooks) {
|
|
|
1372
1387
|
const startedAt = run.startedAt ? new Date(run.startedAt).getTime() : null;
|
|
1373
1388
|
if (!startedAt || !Number.isFinite(startedAt))
|
|
1374
1389
|
continue;
|
|
1375
|
-
const runtimeMs = now.getTime() - startedAt;
|
|
1390
|
+
const runtimeMs = Math.max(0, now.getTime() - startedAt - (run.networkWaitDurationMs ?? 0));
|
|
1376
1391
|
if (runtimeMs < maxRuntimeMs)
|
|
1377
1392
|
continue;
|
|
1378
1393
|
const message = `Run exceeded maximum duration of ${formatDurationMs(maxRuntimeMs)}`;
|
|
@@ -1797,6 +1812,145 @@ export function heartbeatService(db, testHooks) {
|
|
|
1797
1812
|
const { releaseIssueExecutionAndPromote } = releaseHandlers;
|
|
1798
1813
|
const { executeRun } = executeHandlers;
|
|
1799
1814
|
const { resumeDeferredWakeupsForAgent, listProjectScopedRunIds, listProjectScopedWakeupIds, cancelPendingWakeupsForBudgetScope, cancelRunInternal, cancelActiveForAgentInternal, cancelBudgetScopeWork, retryRunInternal, buildSkillAnalytics } = miscHandlers;
|
|
1815
|
+
async function recoverNetworkWaitingRunsLocked(opts) {
|
|
1816
|
+
const now = opts?.now ?? new Date();
|
|
1817
|
+
const candidates = await db
|
|
1818
|
+
.select()
|
|
1819
|
+
.from(heartbeatRuns)
|
|
1820
|
+
.where(and(eq(heartbeatRuns.status, "running"), eq(heartbeatRuns.runningSubstate, "waiting_for_network"), or(isNull(heartbeatRuns.networkWaitNextRetryAt), lte(heartbeatRuns.networkWaitNextRetryAt, now))))
|
|
1821
|
+
.orderBy(asc(heartbeatRuns.networkWaitNextRetryAt), asc(heartbeatRuns.updatedAt))
|
|
1822
|
+
.limit(100);
|
|
1823
|
+
const resumed = [];
|
|
1824
|
+
for (const candidate of candidates) {
|
|
1825
|
+
if (activeRunExecutions.has(candidate.id))
|
|
1826
|
+
continue;
|
|
1827
|
+
const agent = await getAgent(candidate.agentId);
|
|
1828
|
+
if (!agent || ["paused", "terminated", "pending_approval"].includes(agent.status))
|
|
1829
|
+
continue;
|
|
1830
|
+
const checkpoint = candidate.recoveryCheckpoint ?? {};
|
|
1831
|
+
const continuation = checkpoint.continuation;
|
|
1832
|
+
const submissionPhase = checkpoint.submissionPhase;
|
|
1833
|
+
const pristineReplayAllowed = continuation === "fresh_if_pristine"
|
|
1834
|
+
&& submissionPhase === "pre_submission"
|
|
1835
|
+
&& checkpoint.modelOutputObserved !== true
|
|
1836
|
+
&& checkpoint.toolActivityObserved !== true
|
|
1837
|
+
&& checkpoint.sideEffectRisk === "none";
|
|
1838
|
+
const sameSessionAllowed = continuation === "resume_same_session"
|
|
1839
|
+
&& (typeof checkpoint.sessionId === "string"
|
|
1840
|
+
|| Boolean(candidate.sessionIdBefore)
|
|
1841
|
+
|| Boolean(candidate.sessionParamsBeforeJson));
|
|
1842
|
+
if (!pristineReplayAllowed && !sameSessionAllowed) {
|
|
1843
|
+
const unsafe = await transitionRunToTerminal(candidate.id, "failed", {
|
|
1844
|
+
finishedAt: now,
|
|
1845
|
+
error: "Network recovery cannot safely resume this provider attempt",
|
|
1846
|
+
errorCode: "network_resume_unsafe",
|
|
1847
|
+
}, {
|
|
1848
|
+
expectedStatuses: ["running"],
|
|
1849
|
+
processExitedAt: now,
|
|
1850
|
+
});
|
|
1851
|
+
if (unsafe) {
|
|
1852
|
+
await setWakeupStatus(candidate.wakeupRequestId, "failed", {
|
|
1853
|
+
finishedAt: now,
|
|
1854
|
+
error: "Network recovery cannot safely resume this provider attempt",
|
|
1855
|
+
});
|
|
1856
|
+
await appendRunEvent(unsafe, {
|
|
1857
|
+
eventType: "network.resume_unsafe",
|
|
1858
|
+
stream: "system",
|
|
1859
|
+
level: "error",
|
|
1860
|
+
message: "network recovery failed closed because continuation was unsafe",
|
|
1861
|
+
payload: {
|
|
1862
|
+
continuation: continuation ?? null,
|
|
1863
|
+
submissionPhase: submissionPhase ?? null,
|
|
1864
|
+
},
|
|
1865
|
+
});
|
|
1866
|
+
}
|
|
1867
|
+
continue;
|
|
1868
|
+
}
|
|
1869
|
+
if ((candidate.networkWaitAttemptCount ?? 0) >= NETWORK_WAIT_MAX_ATTEMPTS) {
|
|
1870
|
+
const claim = await claimExpiredHeartbeatRunExecution(db, candidate.id, { now });
|
|
1871
|
+
if (!claim)
|
|
1872
|
+
continue;
|
|
1873
|
+
if (candidate.chatConversationId && testHooks?.onNetworkWaitingRun) {
|
|
1874
|
+
await Promise.resolve(testHooks.onNetworkWaitingRun({
|
|
1875
|
+
...claim.run,
|
|
1876
|
+
networkRecoveryExhausted: true,
|
|
1877
|
+
})).catch((error) => {
|
|
1878
|
+
logger.warn({ err: error, runId: candidate.id }, "network retry exhaustion handler failed");
|
|
1879
|
+
});
|
|
1880
|
+
}
|
|
1881
|
+
const exhausted = await transitionRunToTerminal(candidate.id, "failed", {
|
|
1882
|
+
finishedAt: now,
|
|
1883
|
+
error: NETWORK_WAIT_EXHAUSTED_ERROR,
|
|
1884
|
+
errorCode: NETWORK_WAIT_EXHAUSTED_ERROR_CODE,
|
|
1885
|
+
}, {
|
|
1886
|
+
expectedStatuses: ["running"],
|
|
1887
|
+
processExitedAt: now,
|
|
1888
|
+
expectedExecutionOwnerToken: claim.ownerToken,
|
|
1889
|
+
});
|
|
1890
|
+
if (exhausted) {
|
|
1891
|
+
await setWakeupStatus(candidate.wakeupRequestId, "failed", {
|
|
1892
|
+
finishedAt: now,
|
|
1893
|
+
error: NETWORK_WAIT_EXHAUSTED_ERROR,
|
|
1894
|
+
});
|
|
1895
|
+
await appendRunEvent(exhausted, {
|
|
1896
|
+
eventType: "network.retry_exhausted",
|
|
1897
|
+
stream: "system",
|
|
1898
|
+
level: "error",
|
|
1899
|
+
message: "network recovery retry policy exhausted",
|
|
1900
|
+
payload: {
|
|
1901
|
+
attempt: candidate.networkWaitAttemptCount,
|
|
1902
|
+
maxAttempts: NETWORK_WAIT_MAX_ATTEMPTS,
|
|
1903
|
+
transport: checkpoint.transport ?? null,
|
|
1904
|
+
provider: checkpoint.provider ?? null,
|
|
1905
|
+
model: checkpoint.model ?? null,
|
|
1906
|
+
},
|
|
1907
|
+
});
|
|
1908
|
+
}
|
|
1909
|
+
continue;
|
|
1910
|
+
}
|
|
1911
|
+
const claim = await claimExpiredHeartbeatRunExecution(db, candidate.id, { now });
|
|
1912
|
+
if (!claim)
|
|
1913
|
+
continue;
|
|
1914
|
+
const waitStartedAt = candidate.networkWaitStartedAt ? new Date(candidate.networkWaitStartedAt).getTime() : now.getTime();
|
|
1915
|
+
const waitedMs = Math.max(0, now.getTime() - waitStartedAt);
|
|
1916
|
+
const resumedRun = await db
|
|
1917
|
+
.update(heartbeatRuns)
|
|
1918
|
+
.set({
|
|
1919
|
+
runningSubstate: "executing",
|
|
1920
|
+
networkWaitStartedAt: null,
|
|
1921
|
+
networkWaitNextRetryAt: null,
|
|
1922
|
+
networkWaitDurationMs: sql `${heartbeatRuns.networkWaitDurationMs} + ${waitedMs}`,
|
|
1923
|
+
executionOwnerToken: claim.ownerToken,
|
|
1924
|
+
executionLeaseExpiresAt: new Date(now.getTime() + RUN_EXECUTION_LEASE_MS),
|
|
1925
|
+
updatedAt: now,
|
|
1926
|
+
})
|
|
1927
|
+
.where(and(eq(heartbeatRuns.id, candidate.id), eq(heartbeatRuns.status, "running"), eq(heartbeatRuns.runningSubstate, "waiting_for_network"), eq(heartbeatRuns.executionOwnerToken, claim.ownerToken)))
|
|
1928
|
+
.returning()
|
|
1929
|
+
.then((rows) => rows[0] ?? null);
|
|
1930
|
+
if (!resumedRun)
|
|
1931
|
+
continue;
|
|
1932
|
+
await appendRunEvent(resumedRun, {
|
|
1933
|
+
eventType: "network.resumed",
|
|
1934
|
+
stream: "system",
|
|
1935
|
+
level: "info",
|
|
1936
|
+
message: "run resumed after network recovery",
|
|
1937
|
+
payload: { waitedMs, attempt: resumedRun.networkWaitAttemptCount },
|
|
1938
|
+
});
|
|
1939
|
+
resumed.push(resumedRun.id);
|
|
1940
|
+
if (resumedRun.chatConversationId && testHooks?.onNetworkWaitingRun) {
|
|
1941
|
+
const handled = await testHooks.onNetworkWaitingRun(resumedRun);
|
|
1942
|
+
if (handled)
|
|
1943
|
+
continue;
|
|
1944
|
+
}
|
|
1945
|
+
void executeRun(resumedRun.id).catch((error) => {
|
|
1946
|
+
logger.error({ err: error, runId: resumedRun.id }, "network-wait heartbeat recovery failed");
|
|
1947
|
+
});
|
|
1948
|
+
}
|
|
1949
|
+
return { resumed: resumed.length, runIds: resumed };
|
|
1950
|
+
}
|
|
1951
|
+
async function recoverNetworkWaitingRuns(opts) {
|
|
1952
|
+
return withHeartbeatRecoveryLock(() => recoverNetworkWaitingRunsLocked(opts));
|
|
1953
|
+
}
|
|
1800
1954
|
async function resumePendingWakeupRequests(opts = {}) {
|
|
1801
1955
|
const pendingWakeups = await db.select().from(agentWakeupRequests).where(and(opts.orgId ? eq(agentWakeupRequests.orgId, opts.orgId) : undefined, inArray(agentWakeupRequests.status, [
|
|
1802
1956
|
"queued",
|
|
@@ -2079,6 +2233,7 @@ export function heartbeatService(db, testHooks) {
|
|
|
2079
2233
|
reapOrphanedRuns,
|
|
2080
2234
|
reapInactiveRuns,
|
|
2081
2235
|
reapTimedOutRuns,
|
|
2236
|
+
recoverNetworkWaitingRuns,
|
|
2082
2237
|
startNextQueuedRunForAgent,
|
|
2083
2238
|
resumePendingWakeupRequests,
|
|
2084
2239
|
resumeQueuedRuns,
|