@rudderhq/server 0.7.10 → 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 +356 -7
- 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 +68 -7
- package/dist/routes/goals.js.map +1 -1
- package/dist/routes/issues.mutations.d.ts.map +1 -1
- package/dist/routes/issues.mutations.js +3 -0
- package/dist/routes/issues.mutations.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 +5 -1
- package/dist/services/agent-startup-context.d.ts.map +1 -1
- package/dist/services/agent-startup-context.js +67 -14
- 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 +65 -19
- 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 +213 -0
- package/dist/services/chats.d.ts.map +1 -1
- package/dist/services/chats.js +46 -1
- package/dist/services/chats.js.map +1 -1
- package/dist/services/goals.d.ts +133 -5
- package/dist/services/goals.d.ts.map +1 -1
- package/dist/services/goals.js +260 -3
- 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 +80 -23
- package/dist/services/runtime-kernel/assignment-run-guardrail.d.ts.map +1 -1
- package/dist/services/runtime-kernel/assignment-run-guardrail.js +230 -5
- package/dist/services/runtime-kernel/assignment-run-guardrail.js.map +1 -1
- package/dist/services/runtime-kernel/assignment-run-guardrail.test.js +122 -2
- 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 +312 -16
- package/dist/services/runtime-kernel/heartbeat.execute.js.map +1 -1
- package/dist/services/runtime-kernel/heartbeat.js +205 -8
- 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/heartbeat.wakeup.js +1 -1
- package/dist/services/runtime-kernel/heartbeat.wakeup.js.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 +14 -8
- package/skills/rudder-docs/references/api-reference.md +8 -0
- package/skills/rudder-docs/references/cli-reference.md +14 -8
- package/ui-dist/assets/LibraryLiveSurface-tCWxJKp5.js +1 -0
- package/ui-dist/assets/{abnfDiagram-VRR7QNED-CG3j5RmW.js → abnfDiagram-VRR7QNED-BcCms-hs.js} +1 -1
- package/ui-dist/assets/{addon-fit-D07m_e8_.js → addon-fit-CH3xNHN4.js} +1 -1
- package/ui-dist/assets/{arc-B2RI9_Dw.js → arc-h5W-EkRK.js} +1 -1
- package/ui-dist/assets/{architectureDiagram-ZJ3FMSHR-C5v1tMZi.js → architectureDiagram-ZJ3FMSHR-Bdehm1PB.js} +1 -1
- package/ui-dist/assets/{blockDiagram-677ZJIJ3-CgcSNhl8.js → blockDiagram-677ZJIJ3-BJ3W91Su.js} +1 -1
- package/ui-dist/assets/{c4Diagram-LMCZKHZV-B7qmWb0f.js → c4Diagram-LMCZKHZV-Bnft_fRy.js} +1 -1
- package/ui-dist/assets/channel-G6qIOCiV.js +1 -0
- package/ui-dist/assets/{chunk-2Q5K7J3B-cNlq0MJR.js → chunk-2Q5K7J3B-w1SF0tSk.js} +1 -1
- package/ui-dist/assets/{chunk-32BRIVSS-rcxFQzYk.js → chunk-32BRIVSS-C1UzXTFZ.js} +1 -1
- package/ui-dist/assets/{chunk-5VM5RSS4-9PSO_t10.js → chunk-5VM5RSS4-COVI3rNd.js} +1 -1
- package/ui-dist/assets/{chunk-EX3LRPZG-BlOFcT4O.js → chunk-EX3LRPZG-DxQOLy7z.js} +1 -1
- package/ui-dist/assets/{chunk-JWPE2WC7-B2Jgd3wO.js → chunk-JWPE2WC7-KTwmElcL.js} +1 -1
- package/ui-dist/assets/{chunk-MOJQB5TN-CaAqG9fp.js → chunk-MOJQB5TN-BynL4lzA.js} +1 -1
- package/ui-dist/assets/{chunk-RYQCIY6F-BDI7azm6.js → chunk-RYQCIY6F-CJksBfuJ.js} +1 -1
- package/ui-dist/assets/{chunk-V7JOEXUC-B-P0KC6p.js → chunk-V7JOEXUC-C_zED5WJ.js} +1 -1
- package/ui-dist/assets/{chunk-VR4S4FIN-CMfw-kF9.js → chunk-VR4S4FIN-BHDtMeiT.js} +1 -1
- package/ui-dist/assets/{chunk-XXDRQBXY-BBVqU1YP.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-B_hARQDI.js → cose-bilkent-JH36ORCC-DsTTzpP7.js} +1 -1
- package/ui-dist/assets/{cynefin-VYW2F7L2-CTcM0j1n.js → cynefin-VYW2F7L2-BfULw90s.js} +1 -1
- package/ui-dist/assets/{cynefinDiagram-TSTJHNR4-CL7MmdPn.js → cynefinDiagram-TSTJHNR4-BukSzKVC.js} +1 -1
- package/ui-dist/assets/{dagre-VKFMJZFB-mhGwmtXN.js → dagre-VKFMJZFB-BbZY_Ipf.js} +1 -1
- package/ui-dist/assets/{diagram-FQU43EPY-BMjw7iEL.js → diagram-FQU43EPY-BTYIYn2p.js} +1 -1
- package/ui-dist/assets/{diagram-G47NLZAW-BsTpJwdG.js → diagram-G47NLZAW-CikY_FKi.js} +1 -1
- package/ui-dist/assets/{diagram-NH7WQ7WH-Ne5TlLrd.js → diagram-NH7WQ7WH-BfZ7AlT8.js} +1 -1
- package/ui-dist/assets/{diagram-OA4YK3LP-YVpFkzL5.js → diagram-OA4YK3LP-f5AikxJj.js} +1 -1
- package/ui-dist/assets/{diagram-WEI45ONY-B5uEnE3n.js → diagram-WEI45ONY-BCbG5yas.js} +1 -1
- package/ui-dist/assets/{ebnfDiagram-CCIWWBDH-i74y0Dqq.js → ebnfDiagram-CCIWWBDH-DT-3mJLY.js} +1 -1
- package/ui-dist/assets/{erDiagram-Q63AITRT-46MUSamZ.js → erDiagram-Q63AITRT-BsfOhDfe.js} +1 -1
- package/ui-dist/assets/{flowDiagram-23GEKE2U-C9jQx1Z9.js → flowDiagram-23GEKE2U-BfaeQCsg.js} +1 -1
- package/ui-dist/assets/{ganttDiagram-NO4QXBWP-BHoVYgnd.js → ganttDiagram-NO4QXBWP-CgPQruVz.js} +1 -1
- package/ui-dist/assets/{gitGraphDiagram-IHSO6WYX-BxCaqc4K.js → gitGraphDiagram-IHSO6WYX-CNrBFzjY.js} +1 -1
- package/ui-dist/assets/{graph-7yEA7MiX.js → graph-QqDTzUUJ.js} +1 -1
- package/ui-dist/assets/{index-55mSol35.js → index-2ZQZC89T.js} +1 -1
- package/ui-dist/assets/{index-Y9EFmtGV.js → index-2cYcOpZB.js} +1 -1
- package/ui-dist/assets/{index-Bk4h2xgb.js → index-BAt16m_U.js} +1 -1
- package/ui-dist/assets/{index-SnNVv85r.js → index-BY8xCKIE.js} +1 -1
- package/ui-dist/assets/{index-Bbr_dltJ.js → index-Befy20DN.js} +1 -1
- package/ui-dist/assets/{index-2l0f_0un.js → index-BfAP3xNl.js} +1 -1
- package/ui-dist/assets/{index-Cr_0vHJF.js → index-BogOyxlk.js} +1 -1
- package/ui-dist/assets/{index-BM2yCFug.js → index-BuIyK71w.js} +562 -557
- package/ui-dist/assets/{index-8SjcJx20.js → index-CQ92CxVC.js} +1 -1
- package/ui-dist/assets/{index-BMbspMfV.js → index-CQFwlD-o.js} +1 -1
- package/ui-dist/assets/{index-DEDA9JuC.js → index-Cu4qo_D7.js} +1 -1
- package/ui-dist/assets/index-DRuC5g8V.css +32 -0
- package/ui-dist/assets/{index-BYHrPlW0.js → index-DZ4gAeDM.js} +1 -1
- package/ui-dist/assets/{index-zsia7wHf.js → index-Dc_DUpPj.js} +1 -1
- package/ui-dist/assets/{index-CTe7L-bN.js → index-Dqv46mWS.js} +1 -1
- package/ui-dist/assets/{index-sorUqxO4.js → index-sFJMMyA3.js} +1 -1
- package/ui-dist/assets/{infoDiagram-FWYZ7A6U-tKN_HUk-.js → infoDiagram-FWYZ7A6U-BJHuaNA9.js} +1 -1
- package/ui-dist/assets/{ishikawaDiagram-FXEZZL3T-z7MJkWMv.js → ishikawaDiagram-FXEZZL3T-CmsA1Knp.js} +1 -1
- package/ui-dist/assets/{journeyDiagram-5HDEW3XC-CY9IRx-1.js → journeyDiagram-5HDEW3XC-iV_Nt9d4.js} +1 -1
- package/ui-dist/assets/{kanban-definition-HUTT4EX6-R6xzFCHM.js → kanban-definition-HUTT4EX6-D45s70Ny.js} +1 -1
- package/ui-dist/assets/{layout-BQx6ln2a.js → layout-DDC-iOzY.js} +1 -1
- package/ui-dist/assets/{linear-CH-dQ7Bg.js → linear-DCTJ7Pq3.js} +1 -1
- package/ui-dist/assets/{map-DmEHxVn2.js → map-RGy5k616.js} +1 -1
- package/ui-dist/assets/{mermaid.core-8TMqfMCO.js → mermaid.core-6MH04cvi.js} +4 -4
- package/ui-dist/assets/{mindmap-definition-LN4V7U3C-ClYlc1ss.js → mindmap-definition-LN4V7U3C-CA2LFmda.js} +1 -1
- package/ui-dist/assets/{pegDiagram-2B236MQR-DuQPcIJk.js → pegDiagram-2B236MQR-DDsUr2du.js} +1 -1
- package/ui-dist/assets/{pieDiagram-ENE6RG2P-Bc1fELpd.js → pieDiagram-ENE6RG2P-D7jEL8xK.js} +1 -1
- package/ui-dist/assets/{quadrantDiagram-ABIIQ3AL-DS9-N5ZO.js → quadrantDiagram-ABIIQ3AL-BsJxgVLb.js} +1 -1
- package/ui-dist/assets/{railroadDiagram-RFXS5EU6-BBAeUuch.js → railroadDiagram-RFXS5EU6-CBI457f6.js} +1 -1
- package/ui-dist/assets/{requirementDiagram-TGXJPOKE-BmDkrDi3.js → requirementDiagram-TGXJPOKE-_GAc0NOO.js} +1 -1
- package/ui-dist/assets/{sankeyDiagram-HTMAVEWB-APPAQqTz.js → sankeyDiagram-HTMAVEWB-DNIaj5hu.js} +1 -1
- package/ui-dist/assets/{sequenceDiagram-DBY2YBRQ-B9G01Gl-.js → sequenceDiagram-DBY2YBRQ-BHDZs2dc.js} +1 -1
- package/ui-dist/assets/{sizeCapture-X5ZJPWSS-BYjnDqoI.js → sizeCapture-X5ZJPWSS-DwKT6aTP.js} +1 -1
- package/ui-dist/assets/{stateDiagram-2N3HPSRC-BQkWPBAj.js → stateDiagram-2N3HPSRC-D2hDsltG.js} +1 -1
- package/ui-dist/assets/stateDiagram-v2-6OUMAXLB-CMTeJdkk.js +1 -0
- package/ui-dist/assets/{swimlanes-5IMT3BWC-Cacv4UUq.js → swimlanes-5IMT3BWC-BV8xA0iq.js} +2 -2
- package/ui-dist/assets/swimlanesDiagram-G3AALYLV-ChF8QLeM.js +8 -0
- package/ui-dist/assets/{timeline-definition-FHXFAJF6-COt3U2Pi.js → timeline-definition-FHXFAJF6-BPJMubhV.js} +1 -1
- package/ui-dist/assets/{vennDiagram-L72KCM5P-C7eLlxvT.js → vennDiagram-L72KCM5P-CY76J0Px.js} +1 -1
- package/ui-dist/assets/{wardleyDiagram-EHGQE667-Bufv0x60.js → wardleyDiagram-EHGQE667-pmNWLdE_.js} +1 -1
- package/ui-dist/assets/{xterm-BuWLsUNc.js → xterm-UByodpzD.js} +1 -1
- package/ui-dist/assets/{xychartDiagram-FW5EYKEG-9RQAf_Zw.js → xychartDiagram-FW5EYKEG-BWZC7gWV.js} +1 -1
- package/ui-dist/index.html +2 -2
- package/ui-dist/assets/LibraryLiveSurface-YMhPWwag.js +0 -1
- package/ui-dist/assets/channel-Cbzk2971.js +0 -1
- package/ui-dist/assets/classDiagram-OUVF2IWQ-hBDf22nr.js +0 -1
- package/ui-dist/assets/classDiagram-v2-EOCWNBFH-hBDf22nr.js +0 -1
- package/ui-dist/assets/index-B_CDj4oF.css +0 -32
- package/ui-dist/assets/stateDiagram-v2-6OUMAXLB-BucPPlgK.js +0 -1
- package/ui-dist/assets/swimlanesDiagram-G3AALYLV-DPpGouCd.js +0 -8
|
@@ -1,3 +1,13 @@
|
|
|
1
|
+
// @ts-nocheck
|
|
2
|
+
/**
|
|
3
|
+
* @fileoverview Executes claimed heartbeat runs through runtime adapters,
|
|
4
|
+
* workspace realization, transcript persistence, and close-out release.
|
|
5
|
+
*
|
|
6
|
+
* @see doc/product/domains/execution/agent-runs.md - run execution state and evidence
|
|
7
|
+
* @see doc/product/domains/execution/run-admission-and-recovery.md - retry and recovery behavior
|
|
8
|
+
* @see doc/product/domains/agents/instruction-loading.md - AGENT.INSTRUCTIONS.001 runtime instruction frame
|
|
9
|
+
*/
|
|
10
|
+
import { buildModelAttemptSpecs, isAgentRuntimeNetworkSuspension, } from "@rudderhq/agent-runtime-utils";
|
|
1
11
|
import { goals, heartbeatRuns, issues, projects } from "@rudderhq/db";
|
|
2
12
|
import { resolveAgentRunScene, } from "@rudderhq/shared";
|
|
3
13
|
import { and, eq, sql } from "drizzle-orm";
|
|
@@ -13,12 +23,13 @@ import { publishLiveEvent } from "../live-events.js";
|
|
|
13
23
|
import { isManagedWorkspaceConfigurationError, isWorkspacePermissionPreflightError, preflightManagedAgentWorkspace, } from "../managed-workspace-preflight.js";
|
|
14
24
|
import { listProjectResourceAttachments } from "../resource-catalog.js";
|
|
15
25
|
import { buildWorkspaceReadyComment, cleanupExecutionWorkspaceArtifacts, ensureRuntimeServicesForRun, persistAdapterManagedRuntimeServices, realizeExecutionWorkspace, releaseRuntimeServicesForRun } from "../workspace-runtime.js";
|
|
16
|
-
import { createAssignmentRunFailureBudget, inspectAssignmentRunWorkspace, resolveProjectWorkingSetCwd, } from "./assignment-run-guardrail.js";
|
|
26
|
+
import { AssignmentDependencyPreflightError, createAssignmentRunFailureBudget, inspectAssignmentRunWorkspace, repairAssignmentRunWorkspace, resolveProjectWorkingSetCwd, } from "./assignment-run-guardrail.js";
|
|
27
|
+
import { beginHeartbeatRunAttempt, finishHeartbeatRunAttempt, markHeartbeatRunAttemptWaiting, } from "./heartbeat-attempt-ledger.js";
|
|
17
28
|
import { executeAdapterWithModelFallbacks } from "./model-fallback.js";
|
|
18
29
|
export { prioritizeProjectWorkspaceCandidatesForRun } from "../agent-run-context.js";
|
|
19
30
|
import * as heartbeatCore from "./heartbeat.core.js";
|
|
20
31
|
import * as heartbeatSessions from "./heartbeat.sessions.js";
|
|
21
|
-
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, buildHeartbeatAdapterInvokePayload, sanitizeStartupContextContextForPersistence, sanitizeStartupContextPromptForPersistence, 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, resolveForbiddenRuntimeSkillMarkers, detectForbiddenRuntimeSkillMarker, normalizeLedgerBillingType, resolveLedgerBiller, normalizeBilledCostCents, resolveLedgerScopeForRun } = heartbeatCore;
|
|
32
|
+
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, networkWaitBackoffMs, SESSIONED_LOCAL_ADAPTERS, heartbeatRunListColumns, appendExcerpt, appendTranscriptEntriesFromChunk, normalizeMaxConcurrentRuns, withAgentStartLock, readNonEmptyString, buildHeartbeatAdapterInvokePayload, sanitizeStartupContextContextForPersistence, sanitizeStartupContextPromptForPersistence, 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, resolveForbiddenRuntimeSkillMarkers, detectForbiddenRuntimeSkillMarker, normalizeLedgerBillingType, resolveLedgerBiller, normalizeBilledCostCents, resolveLedgerScopeForRun } = heartbeatCore;
|
|
22
33
|
const { buildExplicitResumeSessionOverride, selectRunSessionLineage, 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;
|
|
23
34
|
function buildPersistableHeartbeatContext(context) {
|
|
24
35
|
return sanitizeStartupContextContextForPersistence(context) ?? {};
|
|
@@ -123,6 +134,20 @@ export function createHeartbeatExecuteHandlers(context) {
|
|
|
123
134
|
}
|
|
124
135
|
const executionAbortController = runAbortControllers.get(run.id) ?? new AbortController();
|
|
125
136
|
runAbortControllers.set(run.id, executionAbortController);
|
|
137
|
+
let activeAttemptRef = null;
|
|
138
|
+
let networkSuspended = false;
|
|
139
|
+
const finishActiveAttempt = async (input) => {
|
|
140
|
+
const ref = activeAttemptRef;
|
|
141
|
+
activeAttemptRef = null;
|
|
142
|
+
if (!ref)
|
|
143
|
+
return;
|
|
144
|
+
try {
|
|
145
|
+
await finishHeartbeatRunAttempt(db, ref, input);
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
logger.warn({ err: error, runId: runId, attemptIndex: ref.attemptIndex }, "failed to persist heartbeat attempt terminal state");
|
|
149
|
+
}
|
|
150
|
+
};
|
|
126
151
|
try {
|
|
127
152
|
if (run.status === "queued") {
|
|
128
153
|
const claimed = await claimQueuedRun(run);
|
|
@@ -178,6 +203,7 @@ export function createHeartbeatExecuteHandlers(context) {
|
|
|
178
203
|
let finalRunOutput = null;
|
|
179
204
|
let ownsTerminalState = false;
|
|
180
205
|
let shouldCompleteTerminalEffects = false;
|
|
206
|
+
let activeAttemptSpec = null;
|
|
181
207
|
const finalizeExecutionTranscript = () => {
|
|
182
208
|
stdoutTranscriptBuffer = appendTranscriptEntriesFromChunk({
|
|
183
209
|
buffer: stdoutTranscriptBuffer,
|
|
@@ -592,6 +618,27 @@ export function createHeartbeatExecuteHandlers(context) {
|
|
|
592
618
|
sessionDisplayId: previousSessionDisplayId,
|
|
593
619
|
taskKey,
|
|
594
620
|
};
|
|
621
|
+
const attemptStride = Math.max(1, buildModelAttemptSpecs(runtimeConfig, agent.agentRuntimeType).length);
|
|
622
|
+
const recoveryAttemptOrdinal = Math.max(0, Math.floor(Number(run.networkWaitAttemptCount) || 0));
|
|
623
|
+
const attemptResumeSource = recoveryAttemptOrdinal === 0
|
|
624
|
+
? "fresh"
|
|
625
|
+
: run.recoveryCheckpoint?.continuation === "resume_same_session"
|
|
626
|
+
? "same_session"
|
|
627
|
+
: "pristine_replay";
|
|
628
|
+
const resolveLedgerAttemptIndex = (attempt) => recoveryAttemptOrdinal * attemptStride + attempt.index;
|
|
629
|
+
const recoveryStartAttemptIndex = recoveryAttemptOrdinal > 0
|
|
630
|
+
&& typeof run.recoveryCheckpoint?.fallbackIndex === "number"
|
|
631
|
+
? Math.max(0, Math.floor(run.recoveryCheckpoint.fallbackIndex))
|
|
632
|
+
: 0;
|
|
633
|
+
const persistAttempt = async (label, operation) => {
|
|
634
|
+
try {
|
|
635
|
+
return await operation();
|
|
636
|
+
}
|
|
637
|
+
catch (error) {
|
|
638
|
+
logger.warn({ err: error, runId: run.id, label }, "failed to persist heartbeat attempt ledger state");
|
|
639
|
+
return null;
|
|
640
|
+
}
|
|
641
|
+
};
|
|
595
642
|
let handle = null;
|
|
596
643
|
let stdoutExcerpt = "";
|
|
597
644
|
let stderrExcerpt = "";
|
|
@@ -631,6 +678,7 @@ export function createHeartbeatExecuteHandlers(context) {
|
|
|
631
678
|
const startedAt = run.startedAt ?? new Date();
|
|
632
679
|
const runningWithSession = await persistRunningExecutionContext(run.id, context, {
|
|
633
680
|
startedAt,
|
|
681
|
+
runningSubstate: "executing",
|
|
634
682
|
sessionIdBefore: runtimeForAdapter.sessionDisplayId ?? runtimeForAdapter.sessionId,
|
|
635
683
|
sessionParamsBeforeJson: runtimeForAdapter.sessionParams,
|
|
636
684
|
sessionReuseScope,
|
|
@@ -645,29 +693,92 @@ export function createHeartbeatExecuteHandlers(context) {
|
|
|
645
693
|
message: "run started",
|
|
646
694
|
});
|
|
647
695
|
if (assignmentGuardrailEnabled) {
|
|
648
|
-
const
|
|
696
|
+
const initialWorkspacePreflight = await inspectAssignmentRunWorkspace({
|
|
649
697
|
actualCwd: executionWorkspace.cwd,
|
|
650
698
|
projectWorkingSetCwd: configuredProjectWorkingSetCwd ?? resolvedWorkspace.cwd,
|
|
651
699
|
});
|
|
700
|
+
const dependencyRepair = initialWorkspacePreflight.ready
|
|
701
|
+
? null
|
|
702
|
+
: await repairAssignmentRunWorkspace({ preflight: initialWorkspacePreflight });
|
|
703
|
+
const workspacePreflight = dependencyRepair?.final ?? initialWorkspacePreflight;
|
|
704
|
+
if (dependencyRepair && !dependencyRepair.succeeded) {
|
|
705
|
+
await appendRunEvent(currentRun, {
|
|
706
|
+
eventType: "runtime.assignment_dependency_repair",
|
|
707
|
+
stream: "system",
|
|
708
|
+
level: "warn",
|
|
709
|
+
message: dependencyRepair.skippedReason
|
|
710
|
+
? `assignment dependency repair skipped: ${dependencyRepair.skippedReason}`
|
|
711
|
+
: "assignment dependency repair did not make the workspace ready",
|
|
712
|
+
payload: {
|
|
713
|
+
command: dependencyRepair.command,
|
|
714
|
+
attempted: dependencyRepair.attempted,
|
|
715
|
+
coalesced: dependencyRepair.coalesced,
|
|
716
|
+
rechecked: dependencyRepair.rechecked,
|
|
717
|
+
succeeded: dependencyRepair.succeeded,
|
|
718
|
+
output: dependencyRepair.output,
|
|
719
|
+
skippedReason: dependencyRepair.skippedReason,
|
|
720
|
+
workspaceFingerprint: dependencyRepair.workspaceFingerprint,
|
|
721
|
+
readinessFingerprint: dependencyRepair.readinessFingerprint,
|
|
722
|
+
initialReady: dependencyRepair.initial.ready,
|
|
723
|
+
finalReady: dependencyRepair.final.ready,
|
|
724
|
+
},
|
|
725
|
+
});
|
|
726
|
+
}
|
|
727
|
+
else if (dependencyRepair?.attempted) {
|
|
728
|
+
await appendRunEvent(currentRun, {
|
|
729
|
+
eventType: "runtime.assignment_dependency_repair",
|
|
730
|
+
stream: "system",
|
|
731
|
+
level: "info",
|
|
732
|
+
message: "assignment dependency repair completed",
|
|
733
|
+
payload: {
|
|
734
|
+
command: dependencyRepair.command,
|
|
735
|
+
attempted: dependencyRepair.attempted,
|
|
736
|
+
coalesced: dependencyRepair.coalesced,
|
|
737
|
+
rechecked: dependencyRepair.rechecked,
|
|
738
|
+
succeeded: dependencyRepair.succeeded,
|
|
739
|
+
output: dependencyRepair.output,
|
|
740
|
+
skippedReason: dependencyRepair.skippedReason,
|
|
741
|
+
workspaceFingerprint: dependencyRepair.workspaceFingerprint,
|
|
742
|
+
readinessFingerprint: dependencyRepair.readinessFingerprint,
|
|
743
|
+
initialReady: dependencyRepair.initial.ready,
|
|
744
|
+
finalReady: dependencyRepair.final.ready,
|
|
745
|
+
},
|
|
746
|
+
});
|
|
747
|
+
}
|
|
652
748
|
await appendRunEvent(currentRun, {
|
|
653
749
|
eventType: "runtime.assignment_preflight",
|
|
654
750
|
stream: "system",
|
|
655
|
-
level: workspacePreflight.
|
|
656
|
-
message: workspacePreflight.
|
|
657
|
-
?
|
|
658
|
-
|
|
659
|
-
|
|
751
|
+
level: workspacePreflight.ready ? "info" : "error",
|
|
752
|
+
message: workspacePreflight.ready
|
|
753
|
+
? dependencyRepair?.attempted
|
|
754
|
+
? "assignment run workspace preflight passed after dependency repair"
|
|
755
|
+
: "assignment run workspace preflight passed"
|
|
756
|
+
: "assignment run workspace preflight failed",
|
|
757
|
+
payload: {
|
|
758
|
+
...workspacePreflight,
|
|
759
|
+
initialReady: dependencyRepair?.initial.ready ?? workspacePreflight.ready,
|
|
760
|
+
dependencyRepair: dependencyRepair
|
|
761
|
+
? {
|
|
762
|
+
command: dependencyRepair.command,
|
|
763
|
+
attempted: dependencyRepair.attempted,
|
|
764
|
+
coalesced: dependencyRepair.coalesced,
|
|
765
|
+
rechecked: dependencyRepair.rechecked,
|
|
766
|
+
succeeded: dependencyRepair.succeeded,
|
|
767
|
+
output: dependencyRepair.output,
|
|
768
|
+
skippedReason: dependencyRepair.skippedReason,
|
|
769
|
+
}
|
|
770
|
+
: null,
|
|
771
|
+
},
|
|
660
772
|
});
|
|
661
773
|
if (!workspacePreflight.ready) {
|
|
662
|
-
throw new
|
|
663
|
-
? `Assignment startup preflight failed in ${workspacePreflight.actualCwd}. Run this recovery command once before retrying: ${workspacePreflight.recoveryCommand}`
|
|
664
|
-
: `Assignment project working set is not available: ${workspacePreflight.projectWorkingSetCwd}. Restore or remount that directory before retrying.`);
|
|
774
|
+
throw new AssignmentDependencyPreflightError(workspacePreflight, dependencyRepair);
|
|
665
775
|
}
|
|
666
776
|
}
|
|
667
777
|
handle = await runLogStore.begin({
|
|
668
778
|
orgId: run.orgId,
|
|
669
779
|
agentId: run.agentId,
|
|
670
780
|
runId,
|
|
781
|
+
append: Boolean(run.logRef),
|
|
671
782
|
});
|
|
672
783
|
await db
|
|
673
784
|
.update(heartbeatRuns)
|
|
@@ -884,11 +995,43 @@ export function createHeartbeatExecuteHandlers(context) {
|
|
|
884
995
|
requestApproval,
|
|
885
996
|
waitForApproval,
|
|
886
997
|
}, {
|
|
998
|
+
startAttemptIndex: recoveryStartAttemptIndex,
|
|
887
999
|
resolveAdapter: findServerAdapter,
|
|
888
1000
|
createAuthToken: (agentRuntimeType) => createLocalAgentJwt(agent.id, agent.orgId, agentRuntimeType, run.id) ?? undefined,
|
|
889
|
-
onAttemptStart: (
|
|
1001
|
+
onAttemptStart: async (attempt, attemptAdapter) => {
|
|
1002
|
+
activeAttemptSpec = {
|
|
1003
|
+
index: attempt.index,
|
|
1004
|
+
fallbackIndex: attempt.fallbackIndex,
|
|
1005
|
+
};
|
|
1006
|
+
activeAttemptRef = await persistAttempt("started", () => beginHeartbeatRunAttempt(db, {
|
|
1007
|
+
orgId: run.orgId,
|
|
1008
|
+
runId: run.id,
|
|
1009
|
+
agentId: run.agentId,
|
|
1010
|
+
attemptIndex: resolveLedgerAttemptIndex(attempt),
|
|
1011
|
+
fallbackIndex: attempt.fallbackIndex,
|
|
1012
|
+
runtimeType: attempt.agentRuntimeType ?? agent.agentRuntimeType,
|
|
1013
|
+
model: attempt.model,
|
|
1014
|
+
isFallback: attempt.isFallback,
|
|
1015
|
+
resumeSource: attemptResumeSource,
|
|
1016
|
+
}));
|
|
890
1017
|
stdoutTranscriptParser = attemptAdapter.parseStdoutLine ?? null;
|
|
891
1018
|
},
|
|
1019
|
+
onAttemptFailure: async (_attempt, failure) => {
|
|
1020
|
+
const failureRecord = failure && typeof failure === "object" ? failure : null;
|
|
1021
|
+
const failureMessage = failure instanceof Error
|
|
1022
|
+
? failure.message
|
|
1023
|
+
: readNonEmptyString(failureRecord?.errorMessage) ?? "Adapter fallback attempt failed";
|
|
1024
|
+
await finishActiveAttempt({
|
|
1025
|
+
status: "failed",
|
|
1026
|
+
errorCode: readNonEmptyString(failureRecord?.errorCode) ?? "adapter_failed",
|
|
1027
|
+
error: failureMessage,
|
|
1028
|
+
usageDeltaJson: failureRecord?.usage,
|
|
1029
|
+
costUsd: failureRecord?.costUsd,
|
|
1030
|
+
sessionDisplayId: readNonEmptyString(failureRecord?.sessionDisplayId)
|
|
1031
|
+
?? readNonEmptyString(failureRecord?.sessionId),
|
|
1032
|
+
sessionParamsJson: failureRecord?.sessionParams,
|
|
1033
|
+
});
|
|
1034
|
+
},
|
|
892
1035
|
});
|
|
893
1036
|
if (assignmentGuardrailCheckpoint) {
|
|
894
1037
|
adapterResult.errorMessage = "Assignment run stopped after reaching its tool failure budget";
|
|
@@ -935,6 +1078,123 @@ export function createHeartbeatExecuteHandlers(context) {
|
|
|
935
1078
|
}
|
|
936
1079
|
}
|
|
937
1080
|
}
|
|
1081
|
+
const networkSuspension = isAgentRuntimeNetworkSuspension(adapterResult.networkSuspension)
|
|
1082
|
+
? adapterResult.networkSuspension
|
|
1083
|
+
: isAgentRuntimeNetworkSuspension(adapterResult.suspension)
|
|
1084
|
+
? adapterResult.suspension
|
|
1085
|
+
: null;
|
|
1086
|
+
if (networkSuspension) {
|
|
1087
|
+
// A transport suspension is a non-terminal transition. Persist the
|
|
1088
|
+
// provider checkpoint before releasing the local execution lease so a
|
|
1089
|
+
// restart or another scheduler tick can safely claim this same Run.
|
|
1090
|
+
const now = new Date();
|
|
1091
|
+
const currentRunForWait = await getRun(run.id);
|
|
1092
|
+
const waitAttempt = (currentRunForWait?.networkWaitAttemptCount ?? 0) + 1;
|
|
1093
|
+
const backoff = networkWaitBackoffMs(waitAttempt);
|
|
1094
|
+
const jitteredBackoff = Math.max(1_000, Math.round(backoff * (0.9 + Math.random() * 0.2)));
|
|
1095
|
+
const nextRetryAt = new Date(now.getTime() + jitteredBackoff);
|
|
1096
|
+
const checkpoint = {
|
|
1097
|
+
kind: networkSuspension.kind,
|
|
1098
|
+
code: networkSuspension.code ?? "provider_transport_unavailable",
|
|
1099
|
+
transport: networkSuspension.transport,
|
|
1100
|
+
provider: networkSuspension.provider ?? adapterResult.provider ?? null,
|
|
1101
|
+
model: networkSuspension.model ?? adapterResult.model ?? null,
|
|
1102
|
+
submissionPhase: networkSuspension.submissionPhase,
|
|
1103
|
+
continuation: networkSuspension.continuation,
|
|
1104
|
+
sessionId: networkSuspension.sessionId ?? adapterResult.sessionDisplayId ?? adapterResult.sessionId ?? null,
|
|
1105
|
+
sessionParams: networkSuspension.sessionParams ?? adapterResult.sessionParams ?? null,
|
|
1106
|
+
progress: networkSuspension.progress ?? {
|
|
1107
|
+
modelOutputObserved: networkSuspension.modelOutputObserved,
|
|
1108
|
+
toolActivityObserved: networkSuspension.toolActivityObserved,
|
|
1109
|
+
},
|
|
1110
|
+
modelOutputObserved: networkSuspension.modelOutputObserved
|
|
1111
|
+
?? networkSuspension.progress?.modelOutputObserved
|
|
1112
|
+
?? false,
|
|
1113
|
+
toolActivityObserved: networkSuspension.toolActivityObserved
|
|
1114
|
+
?? networkSuspension.progress?.toolActivityObserved
|
|
1115
|
+
?? false,
|
|
1116
|
+
sideEffectRisk: networkSuspension.sideEffectRisk ?? null,
|
|
1117
|
+
attemptIndex: activeAttemptSpec?.index ?? 0,
|
|
1118
|
+
fallbackIndex: activeAttemptSpec?.fallbackIndex ?? null,
|
|
1119
|
+
message: networkSuspension.message,
|
|
1120
|
+
observedAt: now.toISOString(),
|
|
1121
|
+
};
|
|
1122
|
+
const resumedSessionId = readNonEmptyString(networkSuspension.sessionId)
|
|
1123
|
+
?? readNonEmptyString(adapterResult.sessionDisplayId)
|
|
1124
|
+
?? readNonEmptyString(adapterResult.sessionId)
|
|
1125
|
+
?? previousSessionDisplayId
|
|
1126
|
+
?? null;
|
|
1127
|
+
const resumedSessionParams = networkSuspension.sessionParams
|
|
1128
|
+
?? adapterResult.sessionParams
|
|
1129
|
+
?? runtimeForAdapter.sessionParams
|
|
1130
|
+
?? null;
|
|
1131
|
+
const waitingRun = await db
|
|
1132
|
+
.update(heartbeatRuns)
|
|
1133
|
+
.set({
|
|
1134
|
+
runningSubstate: "waiting_for_network",
|
|
1135
|
+
networkWaitStartedAt: currentRunForWait?.networkWaitStartedAt ?? now,
|
|
1136
|
+
networkWaitNextRetryAt: nextRetryAt,
|
|
1137
|
+
networkWaitAttemptCount: waitAttempt,
|
|
1138
|
+
recoveryCheckpoint: checkpoint,
|
|
1139
|
+
sessionIdBefore: resumedSessionId,
|
|
1140
|
+
sessionParamsBeforeJson: resumedSessionParams,
|
|
1141
|
+
sessionReuseScope: resumedSessionParams || resumedSessionId ? "explicit" : "none",
|
|
1142
|
+
processExitedAt: now,
|
|
1143
|
+
processPid: null,
|
|
1144
|
+
processStartedAt: null,
|
|
1145
|
+
executionOwnerToken: null,
|
|
1146
|
+
executionLeaseExpiresAt: null,
|
|
1147
|
+
updatedAt: now,
|
|
1148
|
+
})
|
|
1149
|
+
.where(and(eq(heartbeatRuns.id, run.id), eq(heartbeatRuns.status, "running"), ...(executionOwnerToken ? [eq(heartbeatRuns.executionOwnerToken, executionOwnerToken)] : [])))
|
|
1150
|
+
.returning()
|
|
1151
|
+
.then((rows) => rows[0] ?? null);
|
|
1152
|
+
if (!waitingRun)
|
|
1153
|
+
return;
|
|
1154
|
+
networkSuspended = true;
|
|
1155
|
+
const waitingAttemptRef = activeAttemptRef;
|
|
1156
|
+
activeAttemptRef = null;
|
|
1157
|
+
await persistAttempt("waiting_for_network", () => markHeartbeatRunAttemptWaiting(db, waitingAttemptRef, {
|
|
1158
|
+
submissionPhase: networkSuspension.submissionPhase,
|
|
1159
|
+
providerThreadId: networkSuspension.providerThreadId ?? adapterResult.providerThreadId,
|
|
1160
|
+
providerTurnId: networkSuspension.providerTurnId ?? adapterResult.providerTurnId,
|
|
1161
|
+
sessionDisplayId: resumedSessionId,
|
|
1162
|
+
sessionParamsJson: resumedSessionParams,
|
|
1163
|
+
checkpointJson: checkpoint,
|
|
1164
|
+
errorCode: networkSuspension.code ?? "provider_transport_unavailable",
|
|
1165
|
+
error: networkSuspension.message ?? null,
|
|
1166
|
+
suspendedAt: now,
|
|
1167
|
+
}));
|
|
1168
|
+
await appendRunEvent(waitingRun, {
|
|
1169
|
+
eventType: "network.waiting",
|
|
1170
|
+
stream: "system",
|
|
1171
|
+
level: "info",
|
|
1172
|
+
message: "run waiting for network",
|
|
1173
|
+
payload: {
|
|
1174
|
+
attempt: waitAttempt,
|
|
1175
|
+
nextRetryAt: nextRetryAt.toISOString(),
|
|
1176
|
+
backoffMs: jitteredBackoff,
|
|
1177
|
+
suspension: checkpoint,
|
|
1178
|
+
},
|
|
1179
|
+
});
|
|
1180
|
+
publishLiveEvent({
|
|
1181
|
+
orgId: waitingRun.orgId,
|
|
1182
|
+
type: "heartbeat.run.status",
|
|
1183
|
+
payload: {
|
|
1184
|
+
runId: waitingRun.id,
|
|
1185
|
+
agentId: waitingRun.agentId,
|
|
1186
|
+
status: waitingRun.status,
|
|
1187
|
+
executionPhase: "waiting_for_network",
|
|
1188
|
+
networkWaitAttemptCount: waitAttempt,
|
|
1189
|
+
networkWaitNextRetryAt: nextRetryAt.toISOString(),
|
|
1190
|
+
},
|
|
1191
|
+
});
|
|
1192
|
+
if (handle) {
|
|
1193
|
+
await runLogStore.finalize(handle).catch(() => undefined);
|
|
1194
|
+
handle = null;
|
|
1195
|
+
}
|
|
1196
|
+
return;
|
|
1197
|
+
}
|
|
938
1198
|
const nextSessionState = resolveNextSessionState({
|
|
939
1199
|
codec: sessionCodec,
|
|
940
1200
|
adapterResult,
|
|
@@ -1101,6 +1361,19 @@ export function createHeartbeatExecuteHandlers(context) {
|
|
|
1101
1361
|
expectedExecutionOwnerToken: executionOwnerToken,
|
|
1102
1362
|
});
|
|
1103
1363
|
ownsTerminalState = Boolean(claimedTerminalRun);
|
|
1364
|
+
await finishActiveAttempt({
|
|
1365
|
+
status,
|
|
1366
|
+
submissionPhase: adapterResult.submissionPhase,
|
|
1367
|
+
providerThreadId: adapterResult.providerThreadId,
|
|
1368
|
+
providerTurnId: adapterResult.providerTurnId,
|
|
1369
|
+
sessionDisplayId: nextSessionState.displayId ?? nextSessionState.legacySessionId,
|
|
1370
|
+
sessionParamsJson: adapterResult.clearSession ? {} : nextSessionState.params,
|
|
1371
|
+
usageDeltaJson: usageJson ?? adapterResult.usage,
|
|
1372
|
+
costUsd: adapterResult.costUsd,
|
|
1373
|
+
errorCode: terminalEvidence.errorCode,
|
|
1374
|
+
error: terminalEvidence.error,
|
|
1375
|
+
finishedAt: terminalEvidence.finishedAt,
|
|
1376
|
+
});
|
|
1104
1377
|
if (!claimedTerminalRun) {
|
|
1105
1378
|
await reconcileRunEvidence(run.id, terminalEvidence);
|
|
1106
1379
|
await reconcileTerminalEffectsIntent(run.id, {
|
|
@@ -1199,7 +1472,9 @@ export function createHeartbeatExecuteHandlers(context) {
|
|
|
1199
1472
|
}
|
|
1200
1473
|
}
|
|
1201
1474
|
catch (err) {
|
|
1202
|
-
const
|
|
1475
|
+
const isAssignmentDependencyPreflightFailure = err instanceof AssignmentDependencyPreflightError;
|
|
1476
|
+
const isWorkspacePreflightFailure = isAssignmentDependencyPreflightFailure ||
|
|
1477
|
+
isWorkspacePermissionPreflightError(err) ||
|
|
1203
1478
|
isManagedWorkspaceConfigurationError(err);
|
|
1204
1479
|
const message = redactCurrentUserText(err instanceof Error ? err.message : "Unknown adapter failure", await getCurrentUserRedactionOptions());
|
|
1205
1480
|
transcriptFallbackResult = {
|
|
@@ -1297,6 +1572,14 @@ export function createHeartbeatExecuteHandlers(context) {
|
|
|
1297
1572
|
expectedExecutionOwnerToken: executionOwnerToken,
|
|
1298
1573
|
});
|
|
1299
1574
|
ownsTerminalState = Boolean(claimedFailedRun);
|
|
1575
|
+
await finishActiveAttempt({
|
|
1576
|
+
status: "failed",
|
|
1577
|
+
errorCode: failureEvidence.errorCode,
|
|
1578
|
+
error: failureEvidence.error,
|
|
1579
|
+
sessionDisplayId: previousSessionDisplayId,
|
|
1580
|
+
sessionParamsJson: previousSessionParams,
|
|
1581
|
+
finishedAt: failureEvidence.finishedAt,
|
|
1582
|
+
});
|
|
1300
1583
|
if (!claimedFailedRun)
|
|
1301
1584
|
await reconcileRunEvidence(run.id, failureEvidence);
|
|
1302
1585
|
const failedRun = claimedFailedRun ?? await getRun(run.id);
|
|
@@ -1310,7 +1593,11 @@ export function createHeartbeatExecuteHandlers(context) {
|
|
|
1310
1593
|
if (ownsTerminalState) {
|
|
1311
1594
|
await appendForbiddenMarkerEvent(failedRun, buildForbiddenMarkerScan(null));
|
|
1312
1595
|
await appendRunEvent(failedRun, {
|
|
1313
|
-
eventType:
|
|
1596
|
+
eventType: isAssignmentDependencyPreflightFailure
|
|
1597
|
+
? "runtime.assignment_preflight_failed"
|
|
1598
|
+
: isWorkspacePreflightFailure
|
|
1599
|
+
? "runtime.workspace_preflight_failed"
|
|
1600
|
+
: "error",
|
|
1314
1601
|
stream: "system",
|
|
1315
1602
|
level: "error",
|
|
1316
1603
|
message,
|
|
@@ -1318,7 +1605,9 @@ export function createHeartbeatExecuteHandlers(context) {
|
|
|
1318
1605
|
? {
|
|
1319
1606
|
payload: {
|
|
1320
1607
|
errorCode: err.errorCode,
|
|
1321
|
-
|
|
1608
|
+
...(isAssignmentDependencyPreflightFailure
|
|
1609
|
+
? err.failure
|
|
1610
|
+
: { failure: err.failure }),
|
|
1322
1611
|
},
|
|
1323
1612
|
}
|
|
1324
1613
|
: {}),
|
|
@@ -1351,6 +1640,12 @@ export function createHeartbeatExecuteHandlers(context) {
|
|
|
1351
1640
|
// The inner catch did not fire, so we must record the failure here.
|
|
1352
1641
|
const message = outerErr instanceof Error ? outerErr.message : "Unknown setup failure";
|
|
1353
1642
|
logger.error({ err: outerErr, runId }, "heartbeat execution setup failed");
|
|
1643
|
+
await finishActiveAttempt({
|
|
1644
|
+
status: "failed",
|
|
1645
|
+
errorCode: "adapter_failed",
|
|
1646
|
+
error: message,
|
|
1647
|
+
finishedAt: new Date(),
|
|
1648
|
+
});
|
|
1354
1649
|
const latestRun = await getRun(runId).catch(() => null);
|
|
1355
1650
|
const claimedFailedRun = latestRun?.status === "running"
|
|
1356
1651
|
? await transitionRunToTerminal(runId, "failed", {
|
|
@@ -1388,7 +1683,8 @@ export function createHeartbeatExecuteHandlers(context) {
|
|
|
1388
1683
|
await releaseRuntimeServicesForRun(run.id).catch(() => undefined);
|
|
1389
1684
|
runAbortControllers.delete(run.id);
|
|
1390
1685
|
activeRunExecutions.delete(run.id);
|
|
1391
|
-
|
|
1686
|
+
if (!networkSuspended)
|
|
1687
|
+
await startNextQueuedRunForAgent(run.agentId);
|
|
1392
1688
|
}
|
|
1393
1689
|
}
|
|
1394
1690
|
return { executeRun };
|