very-happy-cli 0.2.188 → 0.2.190
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/{AcpBackend-2loP7MpF.mjs → AcpBackend-Dd1h-Rgt.mjs} +3 -3
- package/dist/{AcpBackend-B8AYkp5n.cjs → AcpBackend-dkRv9QHm.cjs} +3 -3
- package/dist/{AcpSessionManager-CLqo9R9Y.cjs → AcpSessionManager-AqWAqahm.cjs} +3 -3
- package/dist/{AcpSessionManager-C17doAoR.mjs → AcpSessionManager-QBZ-CIf7.mjs} +4 -4
- package/dist/{BasePermissionHandler-CrfyUmqO.mjs → BasePermissionHandler-CLp1ge-4.mjs} +1 -1
- package/dist/{BasePermissionHandler-C8UEcFz0.cjs → BasePermissionHandler-CpSugp7Z.cjs} +1 -1
- package/dist/{acpSessionResume-OuYlLGxL.cjs → acpSessionResume-CZao6QEd.cjs} +1 -1
- package/dist/{acpSessionResume-F705a1cF.mjs → acpSessionResume-CcpDuIO5.mjs} +1 -1
- package/dist/{agentHome-Dc7LYF3d.mjs → agentHome-BJGRA2Kx.mjs} +4 -4
- package/dist/{agentHome-DsKHJ_Sf.cjs → agentHome-fIUqT-pn.cjs} +4 -4
- package/dist/{api-BOqjYd5r.cjs → api-CXL6jp-p.cjs} +18 -9
- package/dist/{api-DNKa7kVy.mjs → api-Dw8gFsQi.mjs} +19 -10
- package/dist/{apiMachine-Di1G9ECW.mjs → apiMachine-BBNEtjf7.mjs} +56 -15
- package/dist/{apiMachine--rcPpMmt.cjs → apiMachine-C6UqHoPF.cjs} +55 -14
- package/dist/{attachmentContent-C9S4ekAz.mjs → attachmentContent-CC4yIrSm.mjs} +2 -2
- package/dist/{attachmentContent-BFRMLong.cjs → attachmentContent-NmVfKp-B.cjs} +2 -2
- package/dist/{auth-CXmI92aj.cjs → auth-Bb_SL2os.cjs} +5 -5
- package/dist/{auth-Bzwo_vOM.mjs → auth-Bh6SUoGi.mjs} +8 -8
- package/dist/{auth-BNhhk2Fr.mjs → auth-Bj0psrD2.mjs} +5 -5
- package/dist/{auth-CQtfznF0.cjs → auth-DKa4MsAi.cjs} +8 -8
- package/dist/{auto-DXLdaX5O.cjs → auto-C9Qohh0P.cjs} +17 -16
- package/dist/{auto-DHYOLnXB.mjs → auto-DK7pbCnV.mjs} +19 -18
- package/dist/{bootstrap-Di38SnpN.mjs → bootstrap-Ct9Nb4sv.mjs} +2 -2
- package/dist/{bootstrap-eJ1l7VYl.cjs → bootstrap-DBJB0y-H.cjs} +2 -2
- package/dist/{browser-6Cg7G6bb.mjs → browser-BGxDRhHy.mjs} +1 -1
- package/dist/{browser-D3uBFRQu.cjs → browser-CLJWcodR.cjs} +1 -1
- package/dist/{claudeLocal-BBaE4QF_.cjs → claudeLocal-B6YDYlnY.cjs} +4 -4
- package/dist/{claudeLocal-CqaEs-81.mjs → claudeLocal-Ux31hZyC.mjs} +5 -5
- package/dist/{claudeLocalLauncher-BDUPxtsI.mjs → claudeLocalLauncher-D06QijMw.mjs} +10 -10
- package/dist/{claudeLocalLauncher-wPxKtH_P.cjs → claudeLocalLauncher-DFvmF8rC.cjs} +9 -9
- package/dist/{claudeSessionFork-DzWFzj9m.mjs → claudeSessionFork-D2GI7P59.mjs} +1 -1
- package/dist/{claudeSessionFork-CmY25Fl3.cjs → claudeSessionFork-DTLZ2rek.cjs} +1 -1
- package/dist/{client-DmY03OZZ.cjs → client-Bffkrs5p.cjs} +2 -2
- package/dist/{client-C2HcMqRF.cjs → client-CARZ_lNS.cjs} +3 -3
- package/dist/{client-agH03Irm.cjs → client-CMKGrnmT.cjs} +2 -2
- package/dist/{client-DWws_aQK.mjs → client-CnGNYidN.mjs} +2 -2
- package/dist/{client-qJ0y8fus.mjs → client-CtL0Vtww.mjs} +4 -4
- package/dist/{client-DcDE6Ifk.mjs → client-DZkBUoh9.mjs} +2 -2
- package/dist/codex/happyMcpStdioBridge.cjs +16 -15
- package/dist/codex/happyMcpStdioBridge.mjs +17 -16
- package/dist/{codexAppServerClient-DgE99i7X.mjs → codexAppServerClient-CLc5nhLT.mjs} +37 -6
- package/dist/{codexAppServerClient-DwzC8LR0.cjs → codexAppServerClient-CpT9F6EM.cjs} +37 -6
- package/dist/{codexCommand-1vFEA1KT.cjs → codexCommand-39kH99SJ.cjs} +148 -61
- package/dist/{codexCommand-DUSVzbKh.mjs → codexCommand-Dliq3EBv.mjs} +143 -56
- package/dist/{codexTermination-DuDPyBRR.cjs → codexTermination-ByW7tRjr.cjs} +1 -1
- package/dist/{codexTermination-Bybovr2z.mjs → codexTermination-ORIw0gpU.mjs} +1 -1
- package/dist/{codexThreadFork-DNekT4nQ.cjs → codexThreadFork-5kwoKjMu.cjs} +11 -17
- package/dist/{codexThreadFork-R76RU5H0.mjs → codexThreadFork-DobPd19R.mjs} +11 -17
- package/dist/{config-C4xOL5bH.cjs → config-CeIzCsfj.cjs} +3 -3
- package/dist/{config-BrzZ0O-6.mjs → config-CxSsGO1Z.mjs} +3 -3
- package/dist/{configuration-BZHpFD7K.mjs → configuration-Dechcvd-.mjs} +1 -1
- package/dist/{configuration-DyPW9mVa.cjs → configuration-Dt5lKW3P.cjs} +1 -1
- package/dist/{connect-DurKwMEo.cjs → connect-NPDzIVC6.cjs} +12 -12
- package/dist/{connect-Cw_INlj8.mjs → connect-UwQHvCpR.mjs} +13 -13
- package/dist/{context-2xDvjkQp.cjs → context-BdZssgF0.cjs} +1 -1
- package/dist/{context-t7YV0aZc.mjs → context-C9JbJoNe.mjs} +1 -1
- package/dist/{controlClient-DvFaPsg6.cjs → controlClient-BRk65BRO.cjs} +3 -3
- package/dist/{controlClient-Bw56NIrj.mjs → controlClient-D7NGfmtq.mjs} +3 -3
- package/dist/{createSessionMetadata-Dpg6bV6f.cjs → createSessionMetadata-B_HZCDj_.cjs} +2 -2
- package/dist/{createSessionMetadata-Dn5BkLfU.mjs → createSessionMetadata-DyhFKAby.mjs} +2 -2
- package/dist/defaultPermissionMode-BnxJPVHT.mjs +4 -0
- package/dist/defaultPermissionMode-CxmTXUQR.cjs +7 -0
- package/dist/{deterministicJson-D0BrV1FD.cjs → deterministicJson-BEygolBQ.cjs} +12 -12
- package/dist/{deterministicJson-CsRckxVq.mjs → deterministicJson-DNmMVhFu.mjs} +13 -13
- package/dist/{doctor-CYe4d9kU.cjs → doctor-B9lW1WlG.cjs} +7 -7
- package/dist/{doctor-B4HQiW6j.mjs → doctor-BdBi7TFZ.mjs} +7 -7
- package/dist/{downloadTarget-tYMV_VHo.mjs → downloadTarget-CGojGjaN.mjs} +6 -6
- package/dist/{downloadTarget-CuhBVvuC.cjs → downloadTarget-DS0zT2AU.cjs} +6 -6
- package/dist/{ensureDaemonRunning-DVtIG9z7.mjs → ensureDaemonRunning-BOdbryDM.mjs} +5 -5
- package/dist/{ensureDaemonRunning-Ce3BlWiR.cjs → ensureDaemonRunning-Bibp6vhe.cjs} +5 -5
- package/dist/exitAfterFlush-AbKNZM0N.mjs +23 -0
- package/dist/exitAfterFlush-DIT_sIxR.cjs +25 -0
- package/dist/{handleResumeCommand-BU1uMNyv.mjs → handleResumeCommand-CgLzBYne.mjs} +5 -5
- package/dist/{handleResumeCommand-CLxsmAW0.cjs → handleResumeCommand-DXOuWr4p.cjs} +5 -5
- package/dist/{agentAttachments-Dbw8iMCZ.cjs → heldInput-BOtqFO2r.cjs} +27 -0
- package/dist/heldInput-C69lA2dH.mjs +44 -0
- package/dist/{index-KwuXqLwe.cjs → index-Bs5FD8JF.cjs} +4 -4
- package/dist/{index-ChX0eVXw.mjs → index-CBHfkQNY.mjs} +142 -60
- package/dist/{index-DoXbGEAi.cjs → index-CwRW11hT.cjs} +3 -3
- package/dist/{index-CVHRt3SS.mjs → index-DUByZsKe.mjs} +4 -4
- package/dist/{index-wWJJAQRk.cjs → index-DXSIi6j_.cjs} +4 -4
- package/dist/{index-DDz0Ftoy.mjs → index-Db0HIC-k.mjs} +4 -4
- package/dist/{index-WKyN-bNy.mjs → index-DmqsRnV7.mjs} +1 -1
- package/dist/{index-DG1kGjkF.cjs → index-f8oDidjV.cjs} +142 -60
- package/dist/{index-B1OxWiNG.mjs → index-rNTX33in.mjs} +3 -3
- package/dist/index.cjs +2 -2
- package/dist/index.mjs +2 -2
- package/dist/{install-cAYvHxXR.cjs → install-CXIL_FYx.cjs} +3 -3
- package/dist/{install-CMa_FOWu.mjs → install-DfPrEWGG.mjs} +3 -3
- package/dist/lib.cjs +11 -11
- package/dist/lib.d.cts +61 -1
- package/dist/lib.d.mts +61 -1
- package/dist/lib.mjs +12 -12
- package/dist/{lidState-D-lsD1FS.mjs → lidState-D0DF20oG.mjs} +1 -1
- package/dist/{lidState-d1vgQ3n7.cjs → lidState-q_XFYg33.cjs} +1 -1
- package/dist/{localHappyAgentAuth-wvDp-nGj.mjs → localHappyAgentAuth-BBhM4Qk1.mjs} +1 -1
- package/dist/{localHappyAgentAuth-DucSnCg3.cjs → localHappyAgentAuth-CKNW-MXw.cjs} +1 -1
- package/dist/{logger-C3vZG6Q0.cjs → logger-BBRTTVsQ.cjs} +2 -2
- package/dist/{logger-RpzJ4d8V.mjs → logger-CL7pin9b.mjs} +2 -2
- package/dist/{machineMetadata-CiQ2_1Mq.mjs → machineMetadata-DP06qdBk.mjs} +3 -3
- package/dist/{machineMetadata-CAvFq1Jg.cjs → machineMetadata-DnFNlrVK.cjs} +3 -3
- package/dist/{main-ChpYcFZi.cjs → main-DLOXykOR.cjs} +49 -48
- package/dist/{main-IPhaImjm.mjs → main-DO7nRvhf.mjs} +49 -48
- package/dist/{mcp-CWnMvju6.mjs → mcp-C-4sPTae.mjs} +16 -15
- package/dist/{mcp-2xF232hL.cjs → mcp-Du0MgR7e.cjs} +15 -14
- package/dist/{mirrorProtocol-CVzPObON.cjs → mirrorProtocol-GuWMxLkh.cjs} +2 -2
- package/dist/{mirrorProtocol-Dr7fNq8V.mjs → mirrorProtocol-dkq2ZENA.mjs} +3 -3
- package/dist/{package-CwB8rFJt.mjs → package-C6uiXULx.mjs} +7 -7
- package/dist/{package-Gnf_935w.cjs → package-DrY090nZ.cjs} +7 -7
- package/dist/{panels-DTlTsndU.cjs → panels-4DRBKHZP.cjs} +5 -5
- package/dist/{panels-L1mSkC-y.mjs → panels-DXYdJA6n.mjs} +5 -5
- package/dist/{peerTools-C1E5cQ86.cjs → peerTools-5ZM4spcZ.cjs} +5 -5
- package/dist/{peerTools-2_8Bw9PU.mjs → peerTools-dY1aJez4.mjs} +5 -5
- package/dist/{persistence-CqtjFiD1.cjs → persistence-Bl5S3TLB.cjs} +6 -2
- package/dist/{persistence-Bn4qEbDg.mjs → persistence-Dogj7JIp.mjs} +6 -3
- package/dist/{piRunnerArgs-BI8yQRBZ.cjs → piRunnerArgs-C3jZ1M6b.cjs} +1 -1
- package/dist/{piRunnerArgs-DWBb63W9.mjs → piRunnerArgs-D8nN_Iit.mjs} +1 -1
- package/dist/{piRuntime--mQ43MSM.cjs → piRuntime-Bd9-eq6M.cjs} +1 -1
- package/dist/{piRuntime-Do8oqbm3.mjs → piRuntime-BoeMsAXK.mjs} +1 -1
- package/dist/{piTerminal-BzcvLFsP.cjs → piTerminal-C3j1ca3x.cjs} +17 -16
- package/dist/{piTerminal-GC1KHTYQ.mjs → piTerminal-GEPkIGD4.mjs} +18 -17
- package/dist/{pushNotifications-Bb-QSqXw.cjs → pushNotifications-CfspRcl-.cjs} +20 -2
- package/dist/{pushNotifications-BThg4nVd.mjs → pushNotifications-dUceOIni.mjs} +21 -3
- package/dist/{query-Bz3pocKH.cjs → query-DjsVgG3E.cjs} +1 -1
- package/dist/{query-CkgIJ_Dy.mjs → query-iYH-tm7L.mjs} +1 -1
- package/dist/{rateLimitReporter-BkHyvLru.cjs → rateLimitReporter-DUu2KydZ.cjs} +3 -3
- package/dist/{rateLimitReporter-Iw4k3Bbr.mjs → rateLimitReporter-jeVi-fym.mjs} +3 -3
- package/dist/{rateLimitWindows-Bm_dcQGW.cjs → rateLimitWindows-Bx3ROBP5.cjs} +1 -1
- package/dist/{rateLimitWindows-CQ4tIQnx.mjs → rateLimitWindows-CEn0DXaX.mjs} +1 -1
- package/dist/{registerCommonHandlers-CIs6H2DV.cjs → registerCommonHandlers-Beun-cQv.cjs} +2 -2
- package/dist/{registerCommonHandlers-CaWl9ll1.mjs → registerCommonHandlers-DWZ7mfdt.mjs} +2 -2
- package/dist/{specialCommands-BsvSoDhC.cjs → registerKillSessionHandler-CA1FFr_F.cjs} +15 -62
- package/dist/{specialCommands-DHU7TNeK.mjs → registerKillSessionHandler-CzgklwLG.mjs} +17 -60
- package/dist/{remoteSessionClient-uPj7omsw.mjs → remoteSessionClient-BiC2KDew.mjs} +5 -5
- package/dist/{remoteSessionClient-DgUMfPW4.cjs → remoteSessionClient-DGFI__5Z.cjs} +5 -5
- package/dist/{reportProgressTool-DUEq3xAL.mjs → reportProgressTool-CgPy6n_7.mjs} +3 -3
- package/dist/{reportProgressTool-CaJ8EwLq.cjs → reportProgressTool-CvPGov1F.cjs} +2 -2
- package/dist/{run-DTUJBD6p.mjs → run-B_gFgJVB.mjs} +393 -42
- package/dist/{run-DyyGMqND.cjs → run-rPqQwDi_.cjs} +391 -40
- package/dist/{runClaude-DTNvIz2J.mjs → runClaude-CykqeXK7.mjs} +26 -23
- package/dist/{runClaude-8JDaPoGQ.cjs → runClaude-DM8gm8iu.cjs} +27 -24
- package/dist/{runClaudeDeps-CgGkgg7e.mjs → runClaudeDeps-D2phXGut.mjs} +106 -46
- package/dist/{runClaudeDeps-BeLo5zss.cjs → runClaudeDeps-DGAomimZ.cjs} +101 -40
- package/dist/{runGemini-BSOdU563.cjs → runGemini-CXTeSOZp.cjs} +50 -49
- package/dist/{runGemini-eU8UOzfc.mjs → runGemini-CtWCVkj5.mjs} +49 -48
- package/dist/{runOpenClaw-D8RZiA1e.mjs → runOpenClaw-BBdjlViJ.mjs} +25 -24
- package/dist/{runOpenClaw-CYyFoGRZ.cjs → runOpenClaw-CH_9_RyZ.cjs} +26 -25
- package/dist/{sandbox-C8zfNX-4.cjs → sandbox-Bb5IMun3.cjs} +4 -4
- package/dist/{sandbox-DlPahdhl.mjs → sandbox-DGmXZ6Zz.mjs} +4 -4
- package/dist/selfCheck-BfK945YQ.mjs +86 -0
- package/dist/{selfCheck-D28nvuPJ.cjs → selfCheck-CccwNTTK.cjs} +37 -37
- package/dist/{send-DBpv-1eh.mjs → send-B6rHg8GT.mjs} +9 -8
- package/dist/{send-C58kX4qz.cjs → send-BpiXPkDo.cjs} +9 -8
- package/dist/{server-J5K6pOox.mjs → server-BkdAyHhC.mjs} +4 -4
- package/dist/{server-I_CETZzn.cjs → server-DHUzjApC.cjs} +6 -6
- package/dist/{sessionLock-DjE7O0LS.cjs → sessionLock-BFBReiKq.cjs} +134 -3
- package/dist/{sessionLock-C7Wg1RVd.mjs → sessionLock-Ca_bIo50.mjs} +121 -4
- package/dist/{sessionOps-CYjMT7Ad.mjs → sessionOps-CA2kpm66.mjs} +36 -5
- package/dist/{sessionOps-DGMpl9NB.cjs → sessionOps-DeWVqpe4.cjs} +36 -4
- package/dist/{sessionProvider-DVtxrOuM.cjs → sessionProvider-VFbtUmMR.cjs} +5 -5
- package/dist/{sessionProvider-TLiFn9kD.mjs → sessionProvider-g18IiK74.mjs} +5 -5
- package/dist/{sessionScanner-BZ1ZSn6I.cjs → sessionScanner-CGzsN8V6.cjs} +3 -3
- package/dist/{sessionScanner-CknV1IlN.mjs → sessionScanner-DDDud5re.mjs} +3 -3
- package/dist/{sessions-DU4bxkap.mjs → sessions-B4d50sCI.mjs} +36 -26
- package/dist/{sessions-CTkBKs5U.cjs → sessions-CKJPWFgu.cjs} +37 -25
- package/dist/{setupOfflineReconnection-DaOXnGuH.mjs → setupOfflineReconnection-CyPNgyCe.mjs} +2 -2
- package/dist/{setupOfflineReconnection-CQHNuP_0.cjs → setupOfflineReconnection-DPXRo_zf.cjs} +2 -2
- package/dist/{spawn-C0wZc03S.cjs → spawn-CgSJzzWS.cjs} +17 -16
- package/dist/{spawn-DdnYTtQe.mjs → spawn-CrYN_OOT.mjs} +18 -17
- package/dist/{spawnAgents-BjyU78Ue.cjs → spawnAgents-C1-4m7aN.cjs} +3 -1
- package/dist/{spawnAgents-D-7wMw-a.mjs → spawnAgents-DWCDYCQ1.mjs} +4 -2
- package/dist/{spawnHappyCLI-BJUd974I.cjs → spawnHappyCLI-CTy3p6V_.cjs} +1 -1
- package/dist/{spawnHappyCLI-CnyyJk74.mjs → spawnHappyCLI-DjbkiSH1.mjs} +1 -1
- package/dist/specialCommands-J3JFOq0J.cjs +60 -0
- package/dist/specialCommands-MXUN0wfI.mjs +54 -0
- package/dist/{startFileWatcher-DBboREco.cjs → startFileWatcher-BQs0cJA-.cjs} +1 -1
- package/dist/{startFileWatcher-CpO5Mwbr.mjs → startFileWatcher-Dedtu1vq.mjs} +1 -1
- package/dist/{defaultPermissionMode-DMTnlccv.mjs → startupSessionCreate-BKFU4v_h.mjs} +25 -6
- package/dist/{defaultPermissionMode-Dlm0q1m0.cjs → startupSessionCreate-Dxy3X4DG.cjs} +25 -7
- package/dist/{streamRelay-CqBynIon.mjs → streamRelay-P9e7Sohm.mjs} +1 -1
- package/dist/{sync-6HFRJP1h.cjs → sync-DtWB7RzA.cjs} +1 -1
- package/dist/{sync-I8NYmycF.mjs → sync-eZkXnsW_.mjs} +1 -1
- package/dist/{systemPrompt-BDWj5QSL.cjs → systemPrompt-2XOpZ1j6.cjs} +1 -1
- package/dist/{systemPrompt-C1RSY_60.mjs → systemPrompt-Bn6g6aCH.mjs} +2 -2
- package/dist/{teams-eUD7ymif.cjs → teams-ecFay4Gn.cjs} +6 -6
- package/dist/{teams-GpLFbXXE.mjs → teams-nadkqrbW.mjs} +7 -7
- package/dist/{template-CEK8MEjo.mjs → template-BiTD-jI9.mjs} +1 -1
- package/dist/{time-umG7yHkb.mjs → time-CN3TuSVG.mjs} +1 -1
- package/dist/{time-BAJRbB6U.cjs → time-gPD_EmA-.cjs} +1 -1
- package/dist/{titleGenerator-dmFlxkRs.mjs → titleGenerator-DgzTQdn2.mjs} +1 -1
- package/dist/{titleGenerator-iqb2jOF1.cjs → titleGenerator-lT5ldPuN.cjs} +2 -2
- package/dist/{todo-DsR7WnQS.cjs → todo-B1VeMk5A.cjs} +5 -5
- package/dist/{todo-CT4AJ3sH.mjs → todo-BIxd7l2Q.mjs} +6 -6
- package/dist/{tools-30E66QL_.cjs → tools-DvqbLsCF.cjs} +1 -1
- package/dist/{tools-BOWazSD6.mjs → tools-zXJpxiG_.mjs} +1 -1
- package/dist/{uninstall-DImXs6VZ.mjs → uninstall-9htK6mb7.mjs} +3 -3
- package/dist/{uninstall-BtTc9hHa.cjs → uninstall-CvIOpwB5.cjs} +3 -3
- package/package.json +7 -7
- package/dist/agentAttachments-M_B5qEF2.mjs +0 -18
- package/dist/selfCheck-4bcdHPFQ.mjs +0 -86
- package/dist/startupSessionCreate-BgaVuvQp.mjs +0 -24
- package/dist/startupSessionCreate-C1u2dtz8.cjs +0 -26
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import { o as AutomationNameSchema, d as AUTOMATION_ATTENTION_REASON_MAX_CHARS, e as AUTOMATION_SUMMARY_MAX_CHARS, c as AutomationPrecheckSchema, q as AutomationConcurrencySchema, t as AutomationActionSchema, u as AutomationTriggerSchema } from './index-
|
|
3
|
-
import { a as authenticatedAutomationsClient, b as automationRunIdFromEnv } from './client-
|
|
2
|
+
import { o as AutomationNameSchema, d as AUTOMATION_ATTENTION_REASON_MAX_CHARS, e as AUTOMATION_SUMMARY_MAX_CHARS, c as AutomationPrecheckSchema, q as AutomationConcurrencySchema, t as AutomationActionSchema, u as AutomationTriggerSchema } from './index-DmqsRnV7.mjs';
|
|
3
|
+
import { a as authenticatedAutomationsClient, b as automationRunIdFromEnv } from './client-DZkBUoh9.mjs';
|
|
4
4
|
import { u as updateAutomationChecked, c as createAutomationChecked } from './precheckCompat-DeEbilbr.mjs';
|
|
5
|
-
import { P as ProjectsUnsupportedError, a as ProjectRequestError, s as sharedProjectsClient } from './client-
|
|
5
|
+
import { P as ProjectsUnsupportedError, a as ProjectRequestError, s as sharedProjectsClient } from './client-CnGNYidN.mjs';
|
|
6
6
|
import { f as formatContextForTool } from './prompt-QHuFx9j6.mjs';
|
|
7
7
|
import { R as REPORT_PROGRESS_TOOL_NAME, d as REPORT_PROGRESS_TOOL_TITLE, e as REPORT_PROGRESS_TOOL_DESCRIPTION } from './agentGuidance-BDYt2Qy2.mjs';
|
|
8
8
|
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
var z = require('zod');
|
|
4
4
|
var index = require('./index-BOe6dKnL.cjs');
|
|
5
|
-
var client = require('./client-
|
|
5
|
+
var client = require('./client-Bffkrs5p.cjs');
|
|
6
6
|
var precheckCompat = require('./precheckCompat-CWOi5c9L.cjs');
|
|
7
|
-
var client$1 = require('./client-
|
|
7
|
+
var client$1 = require('./client-CMKGrnmT.cjs');
|
|
8
8
|
var prompt = require('./prompt-Bof2aQkI.cjs');
|
|
9
9
|
var agentGuidance = require('./agentGuidance-BtBx2xxE.cjs');
|
|
10
10
|
|
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
import { i as isClaudeSessionId, g as extractCompleteLines, h as decideBackfill, j as parseTerminalHookPayload, k as decideMirrorBinding, M as MIRROR_BACKFILL_LINES_DEFAULT, m as mirrorLineKey, n as mirrorLocalId, o as initializeOwnedWorktree, e as summarizeSpawnSessionForLog, q as startAgentVersionChecks, W as WORKTREE_CAPABILITY_VERSION, t as currentWorktreeService } from './mirrorProtocol-
|
|
1
|
+
import { i as isClaudeSessionId, g as extractCompleteLines, h as decideBackfill, j as parseTerminalHookPayload, k as decideMirrorBinding, M as MIRROR_BACKFILL_LINES_DEFAULT, m as mirrorLineKey, n as mirrorLocalId, o as initializeOwnedWorktree, e as summarizeSpawnSessionForLog, q as startAgentVersionChecks, W as WORKTREE_CAPABILITY_VERSION, t as currentWorktreeService } from './mirrorProtocol-dkq2ZENA.mjs';
|
|
2
2
|
import { F as FS_MKDIR_CAPABILITY_VERSION } from './fsMkdir-DumgLTzR.mjs';
|
|
3
|
-
import { P as PI_ADAPTER_INSTALL_HINT, s as sanitizeSpawnModel } from './piRunnerArgs-
|
|
3
|
+
import { P as PI_ADAPTER_INSTALL_HINT, s as sanitizeSpawnModel } from './piRunnerArgs-D8nN_Iit.mjs';
|
|
4
4
|
import fs from 'fs/promises';
|
|
5
5
|
import os from 'os';
|
|
6
6
|
import * as tmp from 'tmp';
|
|
7
7
|
import axios from 'axios';
|
|
8
8
|
import { readFileSync, openSync, fsyncSync, closeSync, renameSync, existsSync, readdirSync, statSync, unlinkSync, realpathSync, promises, constants as constants$1, writeFileSync, mkdirSync, accessSync, readSync, rmdirSync } from 'node:fs';
|
|
9
9
|
import { join, isAbsolute, resolve, dirname, sep, basename, relative } from 'node:path';
|
|
10
|
-
import { f as ensurePrivateDirectorySync, w as writePrivateFileSync, c as configuration } from './configuration-
|
|
11
|
-
import { T as TurnActivityTracker, A as ApiClient } from './api-
|
|
12
|
-
import { S as SPAWN_AGENTS, i as isSpawnAgent, s as sanitizeSpawnPermissionMode, r as resolveSpawnPermissionMode, a as resolveFirstMessageMeta, j as joinProject } from './spawnAgents-
|
|
13
|
-
import { l as logger } from './logger-
|
|
14
|
-
import { p as pruneStaleCompileCaches } from './index-
|
|
15
|
-
import { a as authAndSetupMachineIfNeeded } from './auth-
|
|
10
|
+
import { f as ensurePrivateDirectorySync, w as writePrivateFileSync, c as configuration } from './configuration-Dechcvd-.mjs';
|
|
11
|
+
import { T as TurnActivityTracker, A as ApiClient } from './api-Dw8gFsQi.mjs';
|
|
12
|
+
import { S as SPAWN_AGENTS, i as isSpawnAgent, s as sanitizeSpawnPermissionMode, r as resolveSpawnPermissionMode, a as resolveFirstMessageMeta, j as joinProject } from './spawnAgents-DWCDYCQ1.mjs';
|
|
13
|
+
import { l as logger } from './logger-CL7pin9b.mjs';
|
|
14
|
+
import { p as pruneStaleCompileCaches } from './index-rNTX33in.mjs';
|
|
15
|
+
import { a as authAndSetupMachineIfNeeded } from './auth-Bj0psrD2.mjs';
|
|
16
16
|
import { spawn, execSync } from 'child_process';
|
|
17
|
-
import { p as packageJson } from './package-
|
|
18
|
-
import { a as globalPrefixForPackage, N as NPM_SAFE_ARG, g as getEnvironmentInfo } from './doctor-
|
|
19
|
-
import { s as spawnHappyCLI } from './spawnHappyCLI-
|
|
20
|
-
import { c as readPersistedSessions, r as readSettings, l as latchKeepAwake,
|
|
21
|
-
import { i as isDaemonRunningCurrentlyInstalledHappyVersion, s as stopDaemon, u as cleanupDaemonState } from './controlClient-
|
|
22
|
-
import { e as sendUserMessage, f as readSessionMetadata, r as readSessionTranscript, l as listAccountSessions, a as listSessions, M as MAX_READ_LIMIT, s as sessionWebUrl, g as waitForSessionKey, d as archiveSession,
|
|
17
|
+
import { p as packageJson } from './package-C6uiXULx.mjs';
|
|
18
|
+
import { a as globalPrefixForPackage, N as NPM_SAFE_ARG, g as getEnvironmentInfo } from './doctor-BdBi7TFZ.mjs';
|
|
19
|
+
import { s as spawnHappyCLI } from './spawnHappyCLI-DjbkiSH1.mjs';
|
|
20
|
+
import { c as readPersistedSessions, r as readSettings, l as latchKeepAwake, s as reportSignature, t as decideDaemonHibernation, v as nextCheckDelay, x as persistSession, d as readDaemonState, y as acquireDaemonLock, a as resolveCheckMs, z as resolveIdleMs, A as deletePersistedSessions, B as writeDaemonState, C as writeSettings, D as settingIdleMs, u as updateSettings, E as rewriteCredentialsForRelay, g as readCredentials, F as releaseDaemonLock } from './persistence-Dogj7JIp.mjs';
|
|
21
|
+
import { i as isDaemonRunningCurrentlyInstalledHappyVersion, s as stopDaemon, u as cleanupDaemonState } from './controlClient-D7NGfmtq.mjs';
|
|
22
|
+
import { e as sendUserMessage, f as readSessionMetadata, r as readSessionTranscript, l as listAccountSessions, a as listSessions, M as MAX_READ_LIMIT, s as sessionWebUrl, j as lineageOf, g as waitForSessionKey, d as archiveSession, k as analyzeLatestTurn, m as readSessionLog, n as TURN_WINDOW, p as userPromptText } from './sessionOps-CA2kpm66.mjs';
|
|
23
23
|
import fastify from 'fastify';
|
|
24
24
|
import { z } from 'zod';
|
|
25
25
|
import { validatorCompiler, serializerCompiler } from 'fastify-type-provider-zod';
|
|
@@ -27,62 +27,63 @@ import { d as decodeBase64, s as sameRelay, e as encodeBase64, h as decrypt } fr
|
|
|
27
27
|
import { randomBytes, createHash, timingSafeEqual, randomUUID } from 'node:crypto';
|
|
28
28
|
import { c as checkPreviewPath } from './previewPath-CXN4Vag0.mjs';
|
|
29
29
|
import { a as BACKGROUND_TASKS_MAX, d as BACKGROUND_TASK_DESCRIPTION_MAX, e as BackgroundTaskTracker } from './backgroundTaskActivity-8PdPxrvy.mjs';
|
|
30
|
-
import { b as sanitizeRateLimitReport } from './rateLimitWindows-
|
|
31
|
-
import { f as formatEditConflictNotice, b as SESSION_PEER_SENT_FROM, s as sendPeerMessage, l as listPeerSessions, C as CLI_PEER_SENDER_ID } from './peerTools-
|
|
30
|
+
import { b as sanitizeRateLimitReport } from './rateLimitWindows-CEn0DXaX.mjs';
|
|
31
|
+
import { f as formatEditConflictNotice, b as SESSION_PEER_SENT_FROM, s as sendPeerMessage, l as listPeerSessions, C as CLI_PEER_SENDER_ID } from './peerTools-dY1aJez4.mjs';
|
|
32
32
|
import os$1, { hostname, homedir, tmpdir } from 'node:os';
|
|
33
|
-
import { c as RemoteCallBudget, e as REMOTE_WRITE_CALLS_PER_MINUTE, d as deliverToSession, g as guardRemoteSessionOpsRequest, h as remoteError, i as REMOTE_OP_DEADLINE_MS, j as formatRemoteAuditLine, k as REMOTE_SEND_COMMIT_DEADLINE_MS, m as REMOTE_RESUME_WAIT_MS, n as capRemoteTranscript, o as capRemoteText, p as REMOTE_ANSWER_MAX_BYTES, q as REMOTE_TITLE_MAX_BYTES } from './remoteSessionClient-
|
|
34
|
-
import { assistantHome, bootstrapAssistantHome } from './bootstrap-
|
|
35
|
-
import { refreshAgentHomes, locateClaudeConversation, agentHomeSpawnEnv } from './index-
|
|
33
|
+
import { c as RemoteCallBudget, e as REMOTE_WRITE_CALLS_PER_MINUTE, d as deliverToSession, g as guardRemoteSessionOpsRequest, h as remoteError, i as REMOTE_OP_DEADLINE_MS, j as formatRemoteAuditLine, k as REMOTE_SEND_COMMIT_DEADLINE_MS, m as REMOTE_RESUME_WAIT_MS, n as capRemoteTranscript, o as capRemoteText, p as REMOTE_ANSWER_MAX_BYTES, q as REMOTE_TITLE_MAX_BYTES } from './remoteSessionClient-BiC2KDew.mjs';
|
|
34
|
+
import { assistantHome, bootstrapAssistantHome } from './bootstrap-Ct9Nb4sv.mjs';
|
|
35
|
+
import { refreshAgentHomes, locateClaudeConversation, agentHomeSpawnEnv } from './index-DUByZsKe.mjs';
|
|
36
36
|
import require$$0, { existsSync as existsSync$1, statSync as statSync$1, mkdtempSync, rmSync } from 'fs';
|
|
37
37
|
import require$$1, { join as join$1 } from 'path';
|
|
38
38
|
import { spawn as spawn$1, execFile, spawnSync } from 'node:child_process';
|
|
39
39
|
import { p as projectPath } from './projectPath-BTBIMB57.mjs';
|
|
40
40
|
import { d as daemonEndpointsMatch, r as resolveClaudeCredentialReadiness } from './doctorReadiness-C208SMN9.mjs';
|
|
41
|
-
import { o as ownerRetryPending, c as consumeOwnerRetry, s as spawnGate, a as afterStartupFailure, b as startupFailureMessage, T as TEAM_SPAWN_MAX_ATTEMPTS, d as TEAM_CLEANUP_RETRY_MS, g as getInitialMachineMetadata, e as getStartupCliAvailability, f as TEAM_RETRY_CAPABILITY_VERSION, w as withRunningCliFacts } from './machineMetadata-
|
|
41
|
+
import { o as ownerRetryPending, c as consumeOwnerRetry, s as spawnGate, a as afterStartupFailure, b as startupFailureMessage, T as TEAM_SPAWN_MAX_ATTEMPTS, d as TEAM_CLEANUP_RETRY_MS, g as getInitialMachineMetadata, e as getStartupCliAvailability, f as TEAM_RETRY_CAPABILITY_VERSION, w as withRunningCliFacts } from './machineMetadata-DP06qdBk.mjs';
|
|
42
42
|
import { M as ModelConfigError, B as BackupStore, r as readConfigFile, s as sha256, a as atomicWriteFile } from './fileStore-5qpetZS0.mjs';
|
|
43
43
|
import { c as collectSecretValues, a as parseJsonObject, b as childObject, s as setOrDelete, d as changedPaths, e as stringifyLike, f as fail, n as normalizeModelList, g as normalizeModelId, h as normalizeSecret, i as normalizeBaseUrl, u as uniq, j as baseUrlWarnings, m as maskSecret, k as getPath$1, l as normalizeProviderId, o as piAdapter, r as redactText } from './pi-CqyoZMjI.mjs';
|
|
44
44
|
import require$$3 from 'crypto';
|
|
45
45
|
import { c as commandOnPath } from './detectCLI-CSGMlV51.mjs';
|
|
46
|
-
import { buildResumeLaunch } from './handleResumeCommand-
|
|
46
|
+
import { buildResumeLaunch } from './handleResumeCommand-CgLzBYne.mjs';
|
|
47
47
|
import { n as normalizeWebPanels } from './webPanels-B2_C2-3g.mjs';
|
|
48
|
-
import { M as ServerMigrateNoticeSchema, N as isHarnessInstallId, e as AUTOMATION_SUMMARY_MAX_CHARS, Q as AUTOMATION_PRECHECK_OUTPUT_MAX_CHARS, T as AUTOMATION_PRECHECK_DEFAULT_TIMEOUT_MS, b as AUTOMATION_PRECHECK_MAX_TIMEOUT_MS, U as AUTOMATION_CLAIM_MAX_RUNS, V as AUTOMATION_DAEMON_CAPABILITY_PRECHECK, W as AUTOMATION_DEFAULT_LEASE_MS, i as isAutomationRunTerminal, X as HARNESS_INSTALL_CAPABILITY_VERSION } from './index-
|
|
48
|
+
import { M as ServerMigrateNoticeSchema, N as isHarnessInstallId, e as AUTOMATION_SUMMARY_MAX_CHARS, Q as AUTOMATION_PRECHECK_OUTPUT_MAX_CHARS, T as AUTOMATION_PRECHECK_DEFAULT_TIMEOUT_MS, b as AUTOMATION_PRECHECK_MAX_TIMEOUT_MS, U as AUTOMATION_CLAIM_MAX_RUNS, V as AUTOMATION_DAEMON_CAPABILITY_PRECHECK, W as AUTOMATION_DEFAULT_LEASE_MS, i as isAutomationRunTerminal, X as HARNESS_INSTALL_CAPABILITY_VERSION } from './index-DmqsRnV7.mjs';
|
|
49
49
|
import { access, symlink, readFile, rm, unlink, readlink, lstat, constants, rename, mkdir, copyFile, readdir, stat, open } from 'node:fs/promises';
|
|
50
50
|
import { p as parseExactVersion, c as compareExactVersions, f as fetchCliUpdateState, r as resolveCliUpdateCheckInterval, D as DEFAULT_CLI_UPDATE_CHECK_INTERVAL_MS } from './cliUpdate-Y34VGe9Y.mjs';
|
|
51
|
-
import { P as ProjectsUnsupportedError, c as createProjectsClient } from './client-
|
|
52
|
-
import {
|
|
51
|
+
import { P as ProjectsUnsupportedError, c as createProjectsClient } from './client-CnGNYidN.mjs';
|
|
52
|
+
import { d as wrapperReportsIdle, f as decideAutoRestart, s as statusFromVerdict, g as autoRestartNextCheck, h as wrapperStaleness, r as recordAttempt, i as AUTO_RESTART_MAX_ATTEMPTS, j as AUTO_RESTART_MIN_GAP_MS, p as processIdentityFields, k as readSessionLock, l as terminateProcess, n as terminateProcessTree, o as AUTO_RESTARTED_ENV, q as encodeAutoRestarted, u as resolveQuietMs, v as AUTO_RESTART_RECHECK_CAP_MS } from './sessionLock-Ca_bIo50.mjs';
|
|
53
|
+
import { c as createAutomationsClient, i as isAutomationsUnavailable, d as AutomationsRequestError } from './client-DZkBUoh9.mjs';
|
|
53
54
|
import { w as withKeychainOffPath, a as keychainIdentityFor, i as interpretSecurityRead, s as securityReadArgs, b as securityDeleteArgs, c as keychainOffShimDir, d as interpretCredentialsFile, C as CREDENTIALS_REJECTED_DETAIL, e as buildClaudeAuthState, f as claudeAuthStateChanged, r as resolveSdkClaudeBinary, g as classifyAuthStatus, h as diagnoseStores, p as parseLaunchctlPid, H as HAPPY_DAEMON_LAUNCHD_LABEL, j as classifyLineage, l as probeLaunchdJob, m as detectDaemonSupervisor, n as daemonLineage, o as probeSystemdKillMode, q as wrappersSurviveHandover, t as handoverWaitsForSessions } from './daemonSupervisor-BxohggqN.mjs';
|
|
54
55
|
import { g as getProjectPath } from './path-D2wdaNSk.mjs';
|
|
55
56
|
import { b as extractClaudeEditPaths } from './editPaths-BVfS_FFL.mjs';
|
|
56
|
-
import { s as startFileWatcher } from './startFileWatcher-
|
|
57
|
-
import { I as InvalidateSync } from './sync-
|
|
57
|
+
import { s as startFileWatcher } from './startFileWatcher-Dedtu1vq.mjs';
|
|
58
|
+
import { I as InvalidateSync } from './sync-eZkXnsW_.mjs';
|
|
58
59
|
import { R as RawJSONLinesSchema } from './types-CkqAACXx.mjs';
|
|
59
60
|
import { t as tmuxArgs, a as scrubTmuxClientEnv, s as shellescape } from './tmuxSocket-B8Yx20sT.mjs';
|
|
60
|
-
import { p as processIdentityFields, r as readSessionLock, t as terminateProcess, d as terminateProcessTree } from './sessionLock-C7Wg1RVd.mjs';
|
|
61
61
|
import { findAllHappyProcesses } from './doctor-BPkYWSuq.mjs';
|
|
62
62
|
import { T as TEAM_SKILL, a as TEAM_LEAD_PLAYBOOK, b as TEAM_MEMBER_RULES } from './resources-CLP_MpK4.mjs';
|
|
63
63
|
import { promisify } from 'node:util';
|
|
64
|
-
import { b as clipText, r as renderAction, c as clipAutomationReport, e as renderTemplate } from './template-
|
|
64
|
+
import { b as clipText, r as renderAction, c as clipAutomationReport, e as renderTemplate } from './template-BiTD-jI9.mjs';
|
|
65
65
|
import { d as describeAgentHome } from './loginShellEnv-Dw8M7tkI.mjs';
|
|
66
|
-
import './acpSessionResume-
|
|
67
|
-
import './lidState-
|
|
66
|
+
import './acpSessionResume-CcpDuIO5.mjs';
|
|
67
|
+
import './lidState-D0DF20oG.mjs';
|
|
68
68
|
import 'node:events';
|
|
69
69
|
import 'socket.io-client';
|
|
70
|
-
import './pushNotifications-
|
|
70
|
+
import './pushNotifications-dUceOIni.mjs';
|
|
71
71
|
import './contentLogMetadata-BlWI0egu.mjs';
|
|
72
72
|
import './limits-DIo7rEBR.mjs';
|
|
73
|
-
import './time-
|
|
74
|
-
import './registerCommonHandlers-
|
|
73
|
+
import './time-CN3TuSVG.mjs';
|
|
74
|
+
import './registerCommonHandlers-DWZ7mfdt.mjs';
|
|
75
75
|
import 'util';
|
|
76
76
|
import 'cross-spawn';
|
|
77
77
|
import '@paralleldrive/cuid2';
|
|
78
78
|
import 'chalk';
|
|
79
79
|
import 'node:module';
|
|
80
80
|
import 'tweetnacl';
|
|
81
|
-
import './browser-
|
|
81
|
+
import './browser-BGxDRhHy.mjs';
|
|
82
82
|
import 'open';
|
|
83
|
+
import './specialCommands-MXUN0wfI.mjs';
|
|
83
84
|
import './ids-DU6sLx4C.mjs';
|
|
84
85
|
import 'url';
|
|
85
|
-
import './localHappyAgentAuth-
|
|
86
|
+
import './localHappyAgentAuth-BBhM4Qk1.mjs';
|
|
86
87
|
import './processTreeSnapshot-CuLJDNC-.mjs';
|
|
87
88
|
import 'ps-list';
|
|
88
89
|
|
|
@@ -547,7 +548,8 @@ const WrapperIdleSnapshotSchema = z.object({
|
|
|
547
548
|
backgroundTasks: z.number().int().nonnegative(),
|
|
548
549
|
scheduledWakeups: z.number().int().nonnegative().optional(),
|
|
549
550
|
lastActivityAt: z.number(),
|
|
550
|
-
exiting: z.boolean().optional()
|
|
551
|
+
exiting: z.boolean().optional(),
|
|
552
|
+
agentVersion: z.string().max(64).optional()
|
|
551
553
|
}).passthrough();
|
|
552
554
|
const HibernateCheckBodySchema = z.object({
|
|
553
555
|
sessionId: z.string().min(1).max(200),
|
|
@@ -1515,6 +1517,7 @@ function summaryFromPersisted(id, persisted) {
|
|
|
1515
1517
|
...meta?.flavor ? { flavor: meta.flavor } : {},
|
|
1516
1518
|
...meta?.tags?.length ? { tags: [...meta.tags] } : {},
|
|
1517
1519
|
...meta?.variant ? { variant: meta.variant } : {},
|
|
1520
|
+
...lineageOf(meta),
|
|
1518
1521
|
...persisted?.savedAt !== void 0 ? { savedAt: persisted.savedAt } : {},
|
|
1519
1522
|
url: sessionWebUrl(id)
|
|
1520
1523
|
};
|
|
@@ -5273,6 +5276,253 @@ async function waitForSessionLive(sessionId, live, timeoutMs = AUTOMATION_WAKE_T
|
|
|
5273
5276
|
return true;
|
|
5274
5277
|
}
|
|
5275
5278
|
|
|
5279
|
+
function createAutoRestart(deps) {
|
|
5280
|
+
const now = () => (deps.now ?? Date.now)();
|
|
5281
|
+
const random = deps.random ?? Math.random;
|
|
5282
|
+
const statuses = /* @__PURE__ */ new Map();
|
|
5283
|
+
const attempts = /* @__PURE__ */ new Map();
|
|
5284
|
+
const agentVersions = /* @__PURE__ */ new Map();
|
|
5285
|
+
const behindSince = /* @__PURE__ */ new Map();
|
|
5286
|
+
const offline = /* @__PURE__ */ new Map();
|
|
5287
|
+
const schedule = deps.schedule ?? ((fn, ms) => {
|
|
5288
|
+
setTimeout(fn, ms).unref?.();
|
|
5289
|
+
});
|
|
5290
|
+
let inFlight = 0;
|
|
5291
|
+
let lastStartedAt = null;
|
|
5292
|
+
let publishedSignature = "";
|
|
5293
|
+
function publish() {
|
|
5294
|
+
const snapshot = Object.fromEntries([...statuses.entries()].sort(([a], [b]) => a.localeCompare(b)));
|
|
5295
|
+
const signature = JSON.stringify(snapshot);
|
|
5296
|
+
if (signature === publishedSignature) return;
|
|
5297
|
+
publishedSignature = signature;
|
|
5298
|
+
deps.publish(snapshot);
|
|
5299
|
+
}
|
|
5300
|
+
function setStatus(sessionId, status) {
|
|
5301
|
+
if (!status) {
|
|
5302
|
+
statuses.delete(sessionId);
|
|
5303
|
+
return;
|
|
5304
|
+
}
|
|
5305
|
+
const clock = behindSince.get(sessionId);
|
|
5306
|
+
const since = clock && clock.target === status.target ? clock.since : status.since;
|
|
5307
|
+
behindSince.set(sessionId, { target: status.target, since });
|
|
5308
|
+
statuses.set(sessionId, { ...status, since });
|
|
5309
|
+
}
|
|
5310
|
+
function clearSession(sessionId) {
|
|
5311
|
+
statuses.delete(sessionId);
|
|
5312
|
+
behindSince.delete(sessionId);
|
|
5313
|
+
offline.delete(sessionId);
|
|
5314
|
+
}
|
|
5315
|
+
function isLive(sessionId) {
|
|
5316
|
+
return deps.liveSessions().some((session) => session.sessionId === sessionId);
|
|
5317
|
+
}
|
|
5318
|
+
function stalenessFor(tracked, agentVersion) {
|
|
5319
|
+
return wrapperStaleness({
|
|
5320
|
+
wrapperVersion: tracked.wrapperVersion,
|
|
5321
|
+
daemonVersion: deps.daemonVersion,
|
|
5322
|
+
agentVersion,
|
|
5323
|
+
installedAgentVersion: tracked.flavor ? deps.installedAgentVersion(tracked.flavor) : null
|
|
5324
|
+
});
|
|
5325
|
+
}
|
|
5326
|
+
async function run(sessionId, staleness) {
|
|
5327
|
+
const since = statuses.get(sessionId)?.since ?? now();
|
|
5328
|
+
setStatus(sessionId, { state: "restarting", since, target: staleness.target });
|
|
5329
|
+
publish();
|
|
5330
|
+
deps.log?.(`[auto-restart] restarting ${sessionId}: ${staleness.kind} ${staleness.from} \u2192 ${staleness.target}`);
|
|
5331
|
+
try {
|
|
5332
|
+
if (deps.turnActive(sessionId) || deps.backgroundTasks(sessionId) > 0 || deps.automationRunning(sessionId)) {
|
|
5333
|
+
deps.log?.(`[auto-restart] ${sessionId} became busy before the stop; waiting`);
|
|
5334
|
+
setStatus(sessionId, { state: "waiting", reason: "turn-active", since, target: staleness.target });
|
|
5335
|
+
return;
|
|
5336
|
+
}
|
|
5337
|
+
let result;
|
|
5338
|
+
try {
|
|
5339
|
+
result = await deps.restart(sessionId, staleness);
|
|
5340
|
+
} catch (error) {
|
|
5341
|
+
result = { ok: false, error: error instanceof Error ? error.message : String(error) };
|
|
5342
|
+
}
|
|
5343
|
+
const record = recordAttempt(attempts.get(sessionId) ?? null, staleness.target, result.ok, now(), result.ok ? void 0 : result.error);
|
|
5344
|
+
if (record) attempts.set(sessionId, record);
|
|
5345
|
+
else attempts.delete(sessionId);
|
|
5346
|
+
if (result.ok) {
|
|
5347
|
+
deps.log?.(`[auto-restart] ${sessionId} restarted on ${staleness.target}`);
|
|
5348
|
+
clearSession(sessionId);
|
|
5349
|
+
agentVersions.delete(sessionId);
|
|
5350
|
+
} else {
|
|
5351
|
+
deps.log?.(`[auto-restart] ${sessionId} restart failed (attempt ${record?.attempts}): ${result.error}`);
|
|
5352
|
+
const gaveUp = (record?.attempts ?? 0) >= AUTO_RESTART_MAX_ATTEMPTS;
|
|
5353
|
+
if (!isLive(sessionId)) {
|
|
5354
|
+
offline.set(sessionId, staleness);
|
|
5355
|
+
const retryAt = gaveUp || !record ? void 0 : record.notBefore;
|
|
5356
|
+
setStatus(sessionId, { state: "failed", reason: result.error, since, target: staleness.target, offline: true, ...retryAt ? { retryAt } : {} });
|
|
5357
|
+
if (retryAt) schedule(() => {
|
|
5358
|
+
void retryOffline(sessionId);
|
|
5359
|
+
}, Math.max(0, retryAt - now()));
|
|
5360
|
+
} else {
|
|
5361
|
+
setStatus(sessionId, gaveUp ? { state: "failed", reason: result.error, since, target: staleness.target } : { state: "waiting", reason: "backoff", since, target: staleness.target });
|
|
5362
|
+
}
|
|
5363
|
+
}
|
|
5364
|
+
} finally {
|
|
5365
|
+
inFlight -= 1;
|
|
5366
|
+
publish();
|
|
5367
|
+
}
|
|
5368
|
+
}
|
|
5369
|
+
async function retryOffline(sessionId) {
|
|
5370
|
+
const staleness = offline.get(sessionId);
|
|
5371
|
+
if (!staleness || statuses.get(sessionId)?.state !== "failed" || statuses.get(sessionId)?.retryAt === void 0) return;
|
|
5372
|
+
const status = statuses.get(sessionId);
|
|
5373
|
+
const handOver = (why) => {
|
|
5374
|
+
deps.log?.(`[auto-restart] ${sessionId} offline retry skipped: ${why}`);
|
|
5375
|
+
setStatus(sessionId, { state: "failed", reason: status.reason, since: status.since, target: status.target, offline: true });
|
|
5376
|
+
publish();
|
|
5377
|
+
};
|
|
5378
|
+
if (!deps.enabled()) return handOver("switch off");
|
|
5379
|
+
if (isLive(sessionId)) {
|
|
5380
|
+
offline.delete(sessionId);
|
|
5381
|
+
return;
|
|
5382
|
+
}
|
|
5383
|
+
const server = deps.serverSession ? await deps.serverSession(sessionId).catch(() => null) : null;
|
|
5384
|
+
if (!server) return handOver("server state unknown");
|
|
5385
|
+
if (server.archived || server.active) return handOver(server.archived ? "archived" : "active elsewhere");
|
|
5386
|
+
if (isLive(sessionId) || offline.get(sessionId) !== staleness) return;
|
|
5387
|
+
const t = now();
|
|
5388
|
+
if (inFlight > 0 || lastStartedAt !== null && t - lastStartedAt < AUTO_RESTART_MIN_GAP_MS) {
|
|
5389
|
+
schedule(() => {
|
|
5390
|
+
void retryOffline(sessionId);
|
|
5391
|
+
}, AUTO_RESTART_MIN_GAP_MS + Math.round(random() * AUTO_RESTART_MIN_GAP_MS));
|
|
5392
|
+
return;
|
|
5393
|
+
}
|
|
5394
|
+
inFlight += 1;
|
|
5395
|
+
lastStartedAt = t;
|
|
5396
|
+
setStatus(sessionId, { state: "restarting", since: status.since, target: staleness.target });
|
|
5397
|
+
await run(sessionId, staleness);
|
|
5398
|
+
}
|
|
5399
|
+
async function onCheckIn(request) {
|
|
5400
|
+
let t = now();
|
|
5401
|
+
const tracked = deps.tracked(request.sessionId, request.pid);
|
|
5402
|
+
if (request.report.agentVersion) agentVersions.set(request.sessionId, request.report.agentVersion);
|
|
5403
|
+
const staleness = tracked ? stalenessFor(tracked, request.report.agentVersion) : null;
|
|
5404
|
+
if (!staleness) {
|
|
5405
|
+
const had = statuses.has(request.sessionId);
|
|
5406
|
+
clearSession(request.sessionId);
|
|
5407
|
+
if (had) publish();
|
|
5408
|
+
return { nextCheckMs: null, restarting: false };
|
|
5409
|
+
}
|
|
5410
|
+
offline.delete(request.sessionId);
|
|
5411
|
+
const previous = statuses.get(request.sessionId);
|
|
5412
|
+
if (previous?.state === "restarting") return { nextCheckMs: null, restarting: false };
|
|
5413
|
+
const attempt = attempts.get(request.sessionId) ?? null;
|
|
5414
|
+
let input = {
|
|
5415
|
+
enabled: deps.enabled(),
|
|
5416
|
+
now: t,
|
|
5417
|
+
...deps.quietMs !== void 0 ? { quietMs: deps.quietMs } : {},
|
|
5418
|
+
staleness,
|
|
5419
|
+
trackedLive: !!tracked?.live,
|
|
5420
|
+
report: request.report,
|
|
5421
|
+
turnActive: deps.turnActive(request.sessionId),
|
|
5422
|
+
backgroundTasks: deps.backgroundTasks(request.sessionId),
|
|
5423
|
+
automationRunning: deps.automationRunning(request.sessionId),
|
|
5424
|
+
resumable: false,
|
|
5425
|
+
attempt,
|
|
5426
|
+
inFlight,
|
|
5427
|
+
lastStartedAt
|
|
5428
|
+
};
|
|
5429
|
+
let verdict = decideAutoRestart({ ...input, resumable: true });
|
|
5430
|
+
if (verdict.ok) {
|
|
5431
|
+
const resumable = await deps.resumable(request.sessionId).catch(() => false);
|
|
5432
|
+
t = now();
|
|
5433
|
+
input = {
|
|
5434
|
+
...input,
|
|
5435
|
+
now: t,
|
|
5436
|
+
trackedLive: !!deps.tracked(request.sessionId, request.pid)?.live,
|
|
5437
|
+
turnActive: deps.turnActive(request.sessionId),
|
|
5438
|
+
backgroundTasks: deps.backgroundTasks(request.sessionId),
|
|
5439
|
+
automationRunning: deps.automationRunning(request.sessionId),
|
|
5440
|
+
resumable,
|
|
5441
|
+
attempt: attempts.get(request.sessionId) ?? null,
|
|
5442
|
+
inFlight,
|
|
5443
|
+
lastStartedAt
|
|
5444
|
+
};
|
|
5445
|
+
verdict = statuses.get(request.sessionId)?.state === "restarting" ? { ok: false, reason: "machine-busy" } : decideAutoRestart(input);
|
|
5446
|
+
}
|
|
5447
|
+
if (verdict.ok) {
|
|
5448
|
+
inFlight += 1;
|
|
5449
|
+
lastStartedAt = t;
|
|
5450
|
+
setStatus(request.sessionId, { state: "restarting", since: previous?.since ?? t, target: staleness.target });
|
|
5451
|
+
setImmediate(() => {
|
|
5452
|
+
void run(request.sessionId, staleness);
|
|
5453
|
+
});
|
|
5454
|
+
return { nextCheckMs: null, restarting: true };
|
|
5455
|
+
}
|
|
5456
|
+
if (input.enabled) setStatus(request.sessionId, statusFromVerdict(verdict, previous, staleness, t, attempt));
|
|
5457
|
+
else {
|
|
5458
|
+
statuses.delete(request.sessionId);
|
|
5459
|
+
if (behindSince.get(request.sessionId)?.target !== staleness.target) behindSince.set(request.sessionId, { target: staleness.target, since: t });
|
|
5460
|
+
}
|
|
5461
|
+
publish();
|
|
5462
|
+
return { nextCheckMs: autoRestartNextCheck(verdict, input, random()), restarting: false };
|
|
5463
|
+
}
|
|
5464
|
+
function sweep() {
|
|
5465
|
+
const t = now();
|
|
5466
|
+
const enabled = deps.enabled();
|
|
5467
|
+
const seen = /* @__PURE__ */ new Set();
|
|
5468
|
+
for (const session of deps.liveSessions()) {
|
|
5469
|
+
seen.add(session.sessionId);
|
|
5470
|
+
const staleness = stalenessFor(session, agentVersions.get(session.sessionId));
|
|
5471
|
+
if (!staleness) {
|
|
5472
|
+
clearSession(session.sessionId);
|
|
5473
|
+
continue;
|
|
5474
|
+
}
|
|
5475
|
+
if (statuses.get(session.sessionId)?.state === "restarting") continue;
|
|
5476
|
+
if (offline.delete(session.sessionId)) statuses.delete(session.sessionId);
|
|
5477
|
+
if (!enabled) {
|
|
5478
|
+
statuses.delete(session.sessionId);
|
|
5479
|
+
if (behindSince.get(session.sessionId)?.target !== staleness.target) behindSince.set(session.sessionId, { target: staleness.target, since: t });
|
|
5480
|
+
continue;
|
|
5481
|
+
}
|
|
5482
|
+
const previous = statuses.get(session.sessionId);
|
|
5483
|
+
if (session.startedBy === "terminal") {
|
|
5484
|
+
if (previous?.state !== "manual" || previous.reason !== "local-terminal" || previous.target !== staleness.target) {
|
|
5485
|
+
setStatus(session.sessionId, { state: "manual", reason: "local-terminal", since: t, target: staleness.target });
|
|
5486
|
+
}
|
|
5487
|
+
continue;
|
|
5488
|
+
}
|
|
5489
|
+
if (previous && previous.target === staleness.target) continue;
|
|
5490
|
+
const reports = wrapperReportsIdle({
|
|
5491
|
+
flavor: session.flavor,
|
|
5492
|
+
capabilities: session.capabilities,
|
|
5493
|
+
spawnedBy: session.spawnedBy,
|
|
5494
|
+
tags: session.tags,
|
|
5495
|
+
variant: session.variant
|
|
5496
|
+
});
|
|
5497
|
+
setStatus(session.sessionId, reports ? { state: "waiting", reason: "awaiting-check-in", since: t, target: staleness.target } : { state: "manual", reason: "no-report", since: t, target: staleness.target });
|
|
5498
|
+
}
|
|
5499
|
+
for (const id of /* @__PURE__ */ new Set([...statuses.keys(), ...behindSince.keys()])) {
|
|
5500
|
+
if (seen.has(id) || statuses.get(id)?.state === "restarting") continue;
|
|
5501
|
+
if (offline.has(id)) continue;
|
|
5502
|
+
clearSession(id);
|
|
5503
|
+
}
|
|
5504
|
+
publish();
|
|
5505
|
+
}
|
|
5506
|
+
return {
|
|
5507
|
+
onCheckIn,
|
|
5508
|
+
sweep,
|
|
5509
|
+
forget(sessionId) {
|
|
5510
|
+
agentVersions.delete(sessionId);
|
|
5511
|
+
const state = statuses.get(sessionId)?.state;
|
|
5512
|
+
if (state === "restarting" || offline.has(sessionId)) return;
|
|
5513
|
+
behindSince.delete(sessionId);
|
|
5514
|
+
if (statuses.delete(sessionId)) publish();
|
|
5515
|
+
},
|
|
5516
|
+
statuses() {
|
|
5517
|
+
return Object.fromEntries(statuses);
|
|
5518
|
+
},
|
|
5519
|
+
/** For tests / diagnostics. */
|
|
5520
|
+
inFlight() {
|
|
5521
|
+
return inFlight;
|
|
5522
|
+
}
|
|
5523
|
+
};
|
|
5524
|
+
}
|
|
5525
|
+
|
|
5276
5526
|
const CLAUDE_AUTH_PROBE_INTERVAL_MS = 10 * 60 * 1e3;
|
|
5277
5527
|
const CLAUDE_AUTH_REFRESH_INTERVAL_MS = 30 * 60 * 1e3;
|
|
5278
5528
|
const PROBE_TIMEOUT_MS = 8e3;
|
|
@@ -7407,6 +7657,7 @@ async function startDaemon() {
|
|
|
7407
7657
|
let lastHandoverHold = null;
|
|
7408
7658
|
let claudeCredentialStoreSetting = (await readSettings()).claudeCredentialStore === "file" ? "file" : "auto";
|
|
7409
7659
|
let agentHibernationSetting = (await readSettings()).agentHibernationIdleMs;
|
|
7660
|
+
let autoRestartSetting = (await readSettings()).autoRestartSessions !== false;
|
|
7410
7661
|
try {
|
|
7411
7662
|
const homes = await refreshAgentHomes();
|
|
7412
7663
|
logger.debug(`[DAEMON RUN] Claude config dir: ${describeAgentHome(homes.claudeConfigDir)}; Codex home: ${describeAgentHome(homes.codexHome)}`);
|
|
@@ -7529,6 +7780,7 @@ async function startDaemon() {
|
|
|
7529
7780
|
});
|
|
7530
7781
|
const sessionIdToFinishedSession = /* @__PURE__ */ new Map();
|
|
7531
7782
|
let teamWorker;
|
|
7783
|
+
let autoRestart;
|
|
7532
7784
|
let automationRunner;
|
|
7533
7785
|
let projectPresence;
|
|
7534
7786
|
const persisted = readPersistedSessions();
|
|
@@ -8269,6 +8521,7 @@ async function startDaemon() {
|
|
|
8269
8521
|
}
|
|
8270
8522
|
};
|
|
8271
8523
|
const restartCounts = /* @__PURE__ */ new Map();
|
|
8524
|
+
const autoRestartExits = /* @__PURE__ */ new Set();
|
|
8272
8525
|
const stopSessionAndWait = async (happySessionId, timeoutMs = 8e3) => {
|
|
8273
8526
|
const targets = /* @__PURE__ */ new Set();
|
|
8274
8527
|
for (const [pid, s] of pidToTrackedSession.entries()) {
|
|
@@ -8318,7 +8571,7 @@ async function startDaemon() {
|
|
|
8318
8571
|
const restartSessionImpl = async (happySessionId, options) => {
|
|
8319
8572
|
try {
|
|
8320
8573
|
const prior = restartCounts.get(happySessionId) ?? 0;
|
|
8321
|
-
const decision = decideRestart(prior, DEFAULT_MAX_RESTARTS);
|
|
8574
|
+
const decision = options?.auto ? { allowed: true } : decideRestart(prior, DEFAULT_MAX_RESTARTS);
|
|
8322
8575
|
if (!decision.allowed) {
|
|
8323
8576
|
return { type: "error", errorMessage: `restart:${decision.reason}` };
|
|
8324
8577
|
}
|
|
@@ -8369,7 +8622,7 @@ async function startDaemon() {
|
|
|
8369
8622
|
if (model) args.push("--model", model);
|
|
8370
8623
|
const permissionMode = sanitizeSpawnPermissionMode(options?.permissionMode ?? (options?.keepPublishedPermissionMode ? publishedRelaunchPermissionMode(metadata) : void 0));
|
|
8371
8624
|
if (permissionMode) args.push("--permission-mode", permissionMode);
|
|
8372
|
-
restartCounts.set(happySessionId, recordRestartAttempt(prior));
|
|
8625
|
+
if (!options?.auto) restartCounts.set(happySessionId, recordRestartAttempt(prior));
|
|
8373
8626
|
const teamEnv = await teamRelaunchEnvFor(happySessionId, metadata);
|
|
8374
8627
|
const result = await spawnTrackedHappyProcess({
|
|
8375
8628
|
args,
|
|
@@ -8390,7 +8643,8 @@ async function startDaemon() {
|
|
|
8390
8643
|
HAPPY_RECONNECT_SEQ: String(tracked.encryption.seq),
|
|
8391
8644
|
HAPPY_RECONNECT_METADATA_VERSION: String(tracked.encryption.metadataVersion),
|
|
8392
8645
|
HAPPY_RECONNECT_AGENT_STATE_VERSION: String(tracked.encryption.agentStateVersion),
|
|
8393
|
-
...teamEnv
|
|
8646
|
+
...teamEnv,
|
|
8647
|
+
...options?.auto ? { [AUTO_RESTARTED_ENV]: encodeAutoRestarted(options.auto.kind, options.auto.target) } : {}
|
|
8394
8648
|
}
|
|
8395
8649
|
});
|
|
8396
8650
|
if (result.type === "success") {
|
|
@@ -8433,10 +8687,11 @@ async function startDaemon() {
|
|
|
8433
8687
|
};
|
|
8434
8688
|
const onChildExited = (pid) => {
|
|
8435
8689
|
const session = pidToTrackedSession.get(pid);
|
|
8436
|
-
if (session?.happySessionId && (session.spawnedBy === "teams" || teamWorker?.hasSession(session.happySessionId))) teamWorker?.report(session.happySessionId, "exited");
|
|
8690
|
+
if (session?.happySessionId && !autoRestartExits.has(session.happySessionId) && (session.spawnedBy === "teams" || teamWorker?.hasSession(session.happySessionId))) teamWorker?.report(session.happySessionId, "exited");
|
|
8437
8691
|
if (session?.happySessionId && automationRunner?.hasSession(session.happySessionId)) automationRunner.report(session.happySessionId, "exited");
|
|
8438
8692
|
if (session?.happySessionId) turnActivity.forget(session.happySessionId);
|
|
8439
8693
|
if (session?.happySessionId) backgroundTasks.forget(session.happySessionId);
|
|
8694
|
+
if (session?.happySessionId) autoRestart?.forget(session.happySessionId);
|
|
8440
8695
|
if (session?.happySessionId) peerCoordinator.forget(session.happySessionId);
|
|
8441
8696
|
if (session?.happySessionId && daemonHibernation.consumeExit(session.happySessionId)) {
|
|
8442
8697
|
const persisted2 = readPersistedSessions()[session.happySessionId];
|
|
@@ -8517,6 +8772,84 @@ async function startDaemon() {
|
|
|
8517
8772
|
})();
|
|
8518
8773
|
};
|
|
8519
8774
|
let apiMachineRef = null;
|
|
8775
|
+
let latestAgentVersions = null;
|
|
8776
|
+
const trackedFacts = (tracked) => {
|
|
8777
|
+
const metadata = tracked.happySessionMetadataFromLocalWebhook;
|
|
8778
|
+
return {
|
|
8779
|
+
live: isPidAlive(tracked.pid),
|
|
8780
|
+
wrapperVersion: metadata?.version ?? null,
|
|
8781
|
+
flavor: metadata?.flavor ?? "claude",
|
|
8782
|
+
capabilities: metadata?.capabilities ?? null,
|
|
8783
|
+
spawnedBy: tracked.spawnedBy ?? null,
|
|
8784
|
+
tags: metadata?.tags ?? null,
|
|
8785
|
+
variant: tracked.variant ?? metadata?.variant ?? null,
|
|
8786
|
+
// The wrapper's own word: tracked.startedBy turns into "persisted" /
|
|
8787
|
+
// "recovered" across the very daemon restart an upgrade does.
|
|
8788
|
+
startedBy: metadata?.startedBy ?? null
|
|
8789
|
+
};
|
|
8790
|
+
};
|
|
8791
|
+
const autoRestartScheduler = createAutoRestart({
|
|
8792
|
+
enabled: () => autoRestartSetting,
|
|
8793
|
+
quietMs: resolveQuietMs(),
|
|
8794
|
+
daemonVersion: packageJson.version,
|
|
8795
|
+
installedAgentVersion: (flavor) => flavor === "codex" ? latestAgentVersions?.agents.find((agent) => agent.id === "codex")?.installed ?? null : null,
|
|
8796
|
+
tracked: (sessionId, pid) => {
|
|
8797
|
+
const tracked = pidToTrackedSession.get(pid);
|
|
8798
|
+
if (!tracked || tracked.happySessionId !== sessionId) return null;
|
|
8799
|
+
return trackedFacts(tracked);
|
|
8800
|
+
},
|
|
8801
|
+
liveSessions: () => [...pidToTrackedSession.values()].filter((tracked) => tracked.happySessionId && tracked.happySessionMetadataFromLocalWebhook && isPidAlive(tracked.pid)).map((tracked) => ({ sessionId: tracked.happySessionId, ...trackedFacts(tracked) })),
|
|
8802
|
+
turnActive: (sessionId) => turnActivity.activeSessions().includes(sessionId),
|
|
8803
|
+
backgroundTasks: (sessionId) => backgroundTasks.count(sessionId),
|
|
8804
|
+
automationRunning: (sessionId) => automationRunner?.hasSession(sessionId) === true,
|
|
8805
|
+
// The local copy may predate the agent's conversation id (it is the spawn
|
|
8806
|
+
// webhook's); judge the server copy, exactly as restartSessionImpl will.
|
|
8807
|
+
resumable: async (sessionId) => {
|
|
8808
|
+
const tracked = findTrackedSessionById(sessionId);
|
|
8809
|
+
const local = tracked?.happySessionMetadataFromLocalWebhook;
|
|
8810
|
+
const encryption = tracked?.encryption;
|
|
8811
|
+
if (!local || !encryption) return false;
|
|
8812
|
+
const { metadata } = await resolveRelaunchMetadata(
|
|
8813
|
+
local,
|
|
8814
|
+
() => fetchServerSessionMetadata(sessionId, encryption.encryptionKey, encryption.encryptionVariant)
|
|
8815
|
+
);
|
|
8816
|
+
return resumePrecheck(metadata, {
|
|
8817
|
+
cwdExists: (p) => existsSync$1(p),
|
|
8818
|
+
conversationExists: (cwd, claudeSessionId) => locateClaudeConversation(cwd, claudeSessionId) !== null
|
|
8819
|
+
}).ok;
|
|
8820
|
+
},
|
|
8821
|
+
restart: async (sessionId, staleness) => {
|
|
8822
|
+
autoRestartExits.add(sessionId);
|
|
8823
|
+
try {
|
|
8824
|
+
const result = await restartSession(sessionId, { keepPublishedPermissionMode: true, auto: { kind: staleness.kind, target: staleness.target } });
|
|
8825
|
+
if (result.type !== "success") return { ok: false, error: result.type === "error" ? result.errorMessage : result.type };
|
|
8826
|
+
const after = findTrackedSessionById(sessionId)?.happySessionMetadataFromLocalWebhook?.version;
|
|
8827
|
+
if (staleness.kind === "cli" && after && (compareExactVersions(after, staleness.target) ?? 0) < 0) {
|
|
8828
|
+
return { ok: false, error: `still-behind: ${after}` };
|
|
8829
|
+
}
|
|
8830
|
+
return { ok: true };
|
|
8831
|
+
} finally {
|
|
8832
|
+
autoRestartExits.delete(sessionId);
|
|
8833
|
+
}
|
|
8834
|
+
},
|
|
8835
|
+
// Offline-failure retry guard: nobody restored, archived or resumed it meanwhile.
|
|
8836
|
+
serverSession: async (sessionId) => {
|
|
8837
|
+
const response = await axios.get(`${configuration.serverUrl}/v1/sessions/${encodeURIComponent(sessionId)}`, {
|
|
8838
|
+
headers: { Authorization: `Bearer ${credentials.token}` },
|
|
8839
|
+
timeout: 1e4
|
|
8840
|
+
});
|
|
8841
|
+
const row = response.data.session;
|
|
8842
|
+
if (!row || typeof row.active !== "boolean") return null;
|
|
8843
|
+
return { active: row.active, archived: row.archivedAt != null };
|
|
8844
|
+
},
|
|
8845
|
+
publish: (sessions) => {
|
|
8846
|
+
void apiMachineRef?.setAutoRestartSessions(sessions);
|
|
8847
|
+
},
|
|
8848
|
+
log: (message) => logger.debug(`[DAEMON RUN] ${message}`)
|
|
8849
|
+
});
|
|
8850
|
+
autoRestart = autoRestartScheduler;
|
|
8851
|
+
const autoRestartSweep = setInterval(() => autoRestartScheduler.sweep(), 6e4);
|
|
8852
|
+
autoRestartSweep.unref?.();
|
|
8520
8853
|
let mirrorManagerRef = null;
|
|
8521
8854
|
const controlToken = createDaemonControlToken();
|
|
8522
8855
|
const { port: controlPort, stop: stopControlServer } = await startDaemonControlServer({
|
|
@@ -8543,7 +8876,14 @@ async function startDaemon() {
|
|
|
8543
8876
|
onRateLimits: (report) => {
|
|
8544
8877
|
apiMachineRef?.reportRateLimits(report);
|
|
8545
8878
|
},
|
|
8546
|
-
|
|
8879
|
+
// B-852: the same idle check-in also decides an automatic restart of a
|
|
8880
|
+
// stale wrapper; hibernation (exit) wins when both say yes.
|
|
8881
|
+
onHibernateCheck: async (body) => {
|
|
8882
|
+
const reply = await daemonHibernation.check(body);
|
|
8883
|
+
if (reply.hibernate) return reply;
|
|
8884
|
+
const auto = await autoRestartScheduler.onCheckIn(body);
|
|
8885
|
+
return { ...reply, nextCheckMs: Math.min(reply.nextCheckMs ?? AUTO_RESTART_RECHECK_CAP_MS, AUTO_RESTART_RECHECK_CAP_MS, auto.nextCheckMs ?? Infinity) };
|
|
8886
|
+
},
|
|
8547
8887
|
listPeers: () => peerCoordinator.list(),
|
|
8548
8888
|
// B-505: `daemon list` shows which sessions have a turn in flight, so an
|
|
8549
8889
|
// operator can check the WHOLE machine before a supervised restart.
|
|
@@ -8695,6 +9035,13 @@ async function startDaemon() {
|
|
|
8695
9035
|
daemonHibernation.invalidateBindings();
|
|
8696
9036
|
return resolveIdleMs(agentHibernationSetting);
|
|
8697
9037
|
});
|
|
9038
|
+
apiMachine.setAutoRestartHandlers(autoRestartSetting, async (enabled) => {
|
|
9039
|
+
await updateSettings((current) => ({ ...current, autoRestartSessions: enabled }));
|
|
9040
|
+
autoRestartSetting = enabled;
|
|
9041
|
+
autoRestartScheduler.sweep();
|
|
9042
|
+
return autoRestartSetting;
|
|
9043
|
+
});
|
|
9044
|
+
setTimeout(() => autoRestartScheduler.sweep(), 5e3).unref?.();
|
|
8698
9045
|
const webPanelsSync = startWebPanelsSync({
|
|
8699
9046
|
statMtime: async () => (await fs.stat(configuration.settingsFile).catch(() => null))?.mtimeMs ?? null,
|
|
8700
9047
|
readRaw: async () => (await readSettings()).webPanels,
|
|
@@ -8785,7 +9132,10 @@ async function startDaemon() {
|
|
|
8785
9132
|
if (delay !== null) logger.warn(`[DAEMON RUN] CLI update policy announced; re-checking in ${Math.round(delay / 1e3)}s`);
|
|
8786
9133
|
});
|
|
8787
9134
|
const stopAgentVersionChecks = startAgentVersionChecks(
|
|
8788
|
-
(snapshot) =>
|
|
9135
|
+
(snapshot) => {
|
|
9136
|
+
latestAgentVersions = snapshot;
|
|
9137
|
+
return apiMachine.updateDaemonState((state) => ({ ...state, status: state?.status ?? "running", agentVersions: snapshot }));
|
|
9138
|
+
},
|
|
8789
9139
|
(error) => logger.debug("[DAEMON RUN] Agent version check failed", error)
|
|
8790
9140
|
);
|
|
8791
9141
|
harnessInstaller = createHarnessInstaller({
|
|
@@ -8967,6 +9317,7 @@ async function startDaemon() {
|
|
|
8967
9317
|
logger.debug("[DAEMON RUN] Health check interval cleared");
|
|
8968
9318
|
}
|
|
8969
9319
|
clearInterval(cliUpdateInterval);
|
|
9320
|
+
clearInterval(autoRestartSweep);
|
|
8970
9321
|
policyAnnouncements.stop();
|
|
8971
9322
|
stopAgentVersionChecks();
|
|
8972
9323
|
await apiMachine.updateDaemonState((state) => ({
|