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,27 +1,27 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var mirrorProtocol = require('./mirrorProtocol-
|
|
3
|
+
var mirrorProtocol = require('./mirrorProtocol-GuWMxLkh.cjs');
|
|
4
4
|
var fsMkdir = require('./fsMkdir-0K3yENml.cjs');
|
|
5
|
-
var piRunnerArgs = require('./piRunnerArgs-
|
|
5
|
+
var piRunnerArgs = require('./piRunnerArgs-C3jZ1M6b.cjs');
|
|
6
6
|
var fs = require('fs/promises');
|
|
7
7
|
var os$1 = require('os');
|
|
8
8
|
var tmp = require('tmp');
|
|
9
9
|
var axios = require('axios');
|
|
10
10
|
var node_fs = require('node:fs');
|
|
11
11
|
var path = require('node:path');
|
|
12
|
-
var configuration = require('./configuration-
|
|
13
|
-
var api = require('./api-
|
|
14
|
-
var spawnAgents = require('./spawnAgents-
|
|
15
|
-
var logger = require('./logger-
|
|
16
|
-
var index$2 = require('./index-
|
|
17
|
-
var auth = require('./auth-
|
|
12
|
+
var configuration = require('./configuration-Dt5lKW3P.cjs');
|
|
13
|
+
var api = require('./api-CXL6jp-p.cjs');
|
|
14
|
+
var spawnAgents = require('./spawnAgents-C1-4m7aN.cjs');
|
|
15
|
+
var logger = require('./logger-BBRTTVsQ.cjs');
|
|
16
|
+
var index$2 = require('./index-CwRW11hT.cjs');
|
|
17
|
+
var auth = require('./auth-Bb_SL2os.cjs');
|
|
18
18
|
var child_process = require('child_process');
|
|
19
|
-
var _package = require('./package-
|
|
20
|
-
var doctor = require('./doctor-
|
|
21
|
-
var spawnHappyCLI = require('./spawnHappyCLI-
|
|
22
|
-
var persistence = require('./persistence-
|
|
23
|
-
var controlClient = require('./controlClient-
|
|
24
|
-
var sessionOps = require('./sessionOps-
|
|
19
|
+
var _package = require('./package-DrY090nZ.cjs');
|
|
20
|
+
var doctor = require('./doctor-B9lW1WlG.cjs');
|
|
21
|
+
var spawnHappyCLI = require('./spawnHappyCLI-CTy3p6V_.cjs');
|
|
22
|
+
var persistence = require('./persistence-Bl5S3TLB.cjs');
|
|
23
|
+
var controlClient = require('./controlClient-BRk65BRO.cjs');
|
|
24
|
+
var sessionOps = require('./sessionOps-DeWVqpe4.cjs');
|
|
25
25
|
var fastify = require('fastify');
|
|
26
26
|
var z = require('zod');
|
|
27
27
|
var fastifyTypeProviderZod = require('fastify-type-provider-zod');
|
|
@@ -29,62 +29,63 @@ var authRelay = require('./authRelay-Dy1qU9td.cjs');
|
|
|
29
29
|
var node_crypto = require('node:crypto');
|
|
30
30
|
var previewPath = require('./previewPath-B0rBdhy1.cjs');
|
|
31
31
|
var backgroundTaskActivity = require('./backgroundTaskActivity-CBvUdj39.cjs');
|
|
32
|
-
var rateLimitWindows = require('./rateLimitWindows-
|
|
33
|
-
var peerTools = require('./peerTools-
|
|
32
|
+
var rateLimitWindows = require('./rateLimitWindows-Bx3ROBP5.cjs');
|
|
33
|
+
var peerTools = require('./peerTools-5ZM4spcZ.cjs');
|
|
34
34
|
var os = require('node:os');
|
|
35
|
-
var remoteSessionClient = require('./remoteSessionClient-
|
|
36
|
-
var bootstrap = require('./bootstrap-
|
|
37
|
-
var index$1 = require('./index-
|
|
35
|
+
var remoteSessionClient = require('./remoteSessionClient-DGFI__5Z.cjs');
|
|
36
|
+
var bootstrap = require('./bootstrap-DBJB0y-H.cjs');
|
|
37
|
+
var index$1 = require('./index-Bs5FD8JF.cjs');
|
|
38
38
|
var require$$0 = require('fs');
|
|
39
39
|
var require$$1 = require('path');
|
|
40
40
|
var node_child_process = require('node:child_process');
|
|
41
41
|
var projectPath = require('./projectPath-C3ioB4Bu.cjs');
|
|
42
42
|
var doctorReadiness = require('./doctorReadiness-Dl6yRQCy.cjs');
|
|
43
|
-
var machineMetadata = require('./machineMetadata-
|
|
43
|
+
var machineMetadata = require('./machineMetadata-DnFNlrVK.cjs');
|
|
44
44
|
var fileStore = require('./fileStore-7qhnbs6N.cjs');
|
|
45
45
|
var pi = require('./pi-DlsrPCTa.cjs');
|
|
46
46
|
var require$$3 = require('crypto');
|
|
47
47
|
var detectCLI = require('./detectCLI-BuYR_Qxe.cjs');
|
|
48
|
-
var handleResumeCommand = require('./handleResumeCommand-
|
|
48
|
+
var handleResumeCommand = require('./handleResumeCommand-DXOuWr4p.cjs');
|
|
49
49
|
var webPanels = require('./webPanels-FCgFKvVe.cjs');
|
|
50
50
|
var index = require('./index-BOe6dKnL.cjs');
|
|
51
51
|
var promises = require('node:fs/promises');
|
|
52
52
|
var cliUpdate = require('./cliUpdate-DsKXPFYp.cjs');
|
|
53
|
-
var client = require('./client-
|
|
54
|
-
var
|
|
53
|
+
var client = require('./client-CMKGrnmT.cjs');
|
|
54
|
+
var sessionLock = require('./sessionLock-BFBReiKq.cjs');
|
|
55
|
+
var client$1 = require('./client-Bffkrs5p.cjs');
|
|
55
56
|
var daemonSupervisor = require('./daemonSupervisor-alqGPANc.cjs');
|
|
56
57
|
var path$1 = require('./path-B7zW-WwE.cjs');
|
|
57
58
|
var editPaths = require('./editPaths-Bqp4OFPw.cjs');
|
|
58
|
-
var startFileWatcher = require('./startFileWatcher-
|
|
59
|
-
var sync = require('./sync-
|
|
59
|
+
var startFileWatcher = require('./startFileWatcher-BQs0cJA-.cjs');
|
|
60
|
+
var sync = require('./sync-DtWB7RzA.cjs');
|
|
60
61
|
var types = require('./types-CRS-srZK.cjs');
|
|
61
62
|
var tmuxSocket = require('./tmuxSocket-D-Xt6Vn-.cjs');
|
|
62
|
-
var sessionLock = require('./sessionLock-DjE7O0LS.cjs');
|
|
63
63
|
var doctor$1 = require('./doctor-u46qYYKX.cjs');
|
|
64
64
|
var resources = require('./resources-BZ_Be0qM.cjs');
|
|
65
65
|
var node_util = require('node:util');
|
|
66
66
|
var template = require('./template-17HATY_Y.cjs');
|
|
67
67
|
var loginShellEnv = require('./loginShellEnv-BkuYtExZ.cjs');
|
|
68
|
-
require('./acpSessionResume-
|
|
69
|
-
require('./lidState-
|
|
68
|
+
require('./acpSessionResume-CZao6QEd.cjs');
|
|
69
|
+
require('./lidState-q_XFYg33.cjs');
|
|
70
70
|
require('node:events');
|
|
71
71
|
require('socket.io-client');
|
|
72
|
-
require('./pushNotifications-
|
|
72
|
+
require('./pushNotifications-CfspRcl-.cjs');
|
|
73
73
|
require('./contentLogMetadata-ZSFk_NjQ.cjs');
|
|
74
74
|
require('./limits-C-a7gr04.cjs');
|
|
75
|
-
require('./time-
|
|
76
|
-
require('./registerCommonHandlers-
|
|
75
|
+
require('./time-gPD_EmA-.cjs');
|
|
76
|
+
require('./registerCommonHandlers-Beun-cQv.cjs');
|
|
77
77
|
require('util');
|
|
78
78
|
require('cross-spawn');
|
|
79
79
|
require('@paralleldrive/cuid2');
|
|
80
80
|
require('chalk');
|
|
81
81
|
require('node:module');
|
|
82
82
|
require('tweetnacl');
|
|
83
|
-
require('./browser-
|
|
83
|
+
require('./browser-CLJWcodR.cjs');
|
|
84
84
|
require('open');
|
|
85
|
+
require('./specialCommands-J3JFOq0J.cjs');
|
|
85
86
|
require('./ids-B6ZC0HGt.cjs');
|
|
86
87
|
require('url');
|
|
87
|
-
require('./localHappyAgentAuth-
|
|
88
|
+
require('./localHappyAgentAuth-CKNW-MXw.cjs');
|
|
88
89
|
require('./processTreeSnapshot-mDbnuojn.cjs');
|
|
89
90
|
require('ps-list');
|
|
90
91
|
|
|
@@ -568,7 +569,8 @@ const WrapperIdleSnapshotSchema = z.z.object({
|
|
|
568
569
|
backgroundTasks: z.z.number().int().nonnegative(),
|
|
569
570
|
scheduledWakeups: z.z.number().int().nonnegative().optional(),
|
|
570
571
|
lastActivityAt: z.z.number(),
|
|
571
|
-
exiting: z.z.boolean().optional()
|
|
572
|
+
exiting: z.z.boolean().optional(),
|
|
573
|
+
agentVersion: z.z.string().max(64).optional()
|
|
572
574
|
}).passthrough();
|
|
573
575
|
const HibernateCheckBodySchema = z.z.object({
|
|
574
576
|
sessionId: z.z.string().min(1).max(200),
|
|
@@ -1536,6 +1538,7 @@ function summaryFromPersisted(id, persisted) {
|
|
|
1536
1538
|
...meta?.flavor ? { flavor: meta.flavor } : {},
|
|
1537
1539
|
...meta?.tags?.length ? { tags: [...meta.tags] } : {},
|
|
1538
1540
|
...meta?.variant ? { variant: meta.variant } : {},
|
|
1541
|
+
...sessionOps.lineageOf(meta),
|
|
1539
1542
|
...persisted?.savedAt !== void 0 ? { savedAt: persisted.savedAt } : {},
|
|
1540
1543
|
url: sessionOps.sessionWebUrl(id)
|
|
1541
1544
|
};
|
|
@@ -5294,6 +5297,253 @@ async function waitForSessionLive(sessionId, live, timeoutMs = AUTOMATION_WAKE_T
|
|
|
5294
5297
|
return true;
|
|
5295
5298
|
}
|
|
5296
5299
|
|
|
5300
|
+
function createAutoRestart(deps) {
|
|
5301
|
+
const now = () => (deps.now ?? Date.now)();
|
|
5302
|
+
const random = deps.random ?? Math.random;
|
|
5303
|
+
const statuses = /* @__PURE__ */ new Map();
|
|
5304
|
+
const attempts = /* @__PURE__ */ new Map();
|
|
5305
|
+
const agentVersions = /* @__PURE__ */ new Map();
|
|
5306
|
+
const behindSince = /* @__PURE__ */ new Map();
|
|
5307
|
+
const offline = /* @__PURE__ */ new Map();
|
|
5308
|
+
const schedule = deps.schedule ?? ((fn, ms) => {
|
|
5309
|
+
setTimeout(fn, ms).unref?.();
|
|
5310
|
+
});
|
|
5311
|
+
let inFlight = 0;
|
|
5312
|
+
let lastStartedAt = null;
|
|
5313
|
+
let publishedSignature = "";
|
|
5314
|
+
function publish() {
|
|
5315
|
+
const snapshot = Object.fromEntries([...statuses.entries()].sort(([a], [b]) => a.localeCompare(b)));
|
|
5316
|
+
const signature = JSON.stringify(snapshot);
|
|
5317
|
+
if (signature === publishedSignature) return;
|
|
5318
|
+
publishedSignature = signature;
|
|
5319
|
+
deps.publish(snapshot);
|
|
5320
|
+
}
|
|
5321
|
+
function setStatus(sessionId, status) {
|
|
5322
|
+
if (!status) {
|
|
5323
|
+
statuses.delete(sessionId);
|
|
5324
|
+
return;
|
|
5325
|
+
}
|
|
5326
|
+
const clock = behindSince.get(sessionId);
|
|
5327
|
+
const since = clock && clock.target === status.target ? clock.since : status.since;
|
|
5328
|
+
behindSince.set(sessionId, { target: status.target, since });
|
|
5329
|
+
statuses.set(sessionId, { ...status, since });
|
|
5330
|
+
}
|
|
5331
|
+
function clearSession(sessionId) {
|
|
5332
|
+
statuses.delete(sessionId);
|
|
5333
|
+
behindSince.delete(sessionId);
|
|
5334
|
+
offline.delete(sessionId);
|
|
5335
|
+
}
|
|
5336
|
+
function isLive(sessionId) {
|
|
5337
|
+
return deps.liveSessions().some((session) => session.sessionId === sessionId);
|
|
5338
|
+
}
|
|
5339
|
+
function stalenessFor(tracked, agentVersion) {
|
|
5340
|
+
return sessionLock.wrapperStaleness({
|
|
5341
|
+
wrapperVersion: tracked.wrapperVersion,
|
|
5342
|
+
daemonVersion: deps.daemonVersion,
|
|
5343
|
+
agentVersion,
|
|
5344
|
+
installedAgentVersion: tracked.flavor ? deps.installedAgentVersion(tracked.flavor) : null
|
|
5345
|
+
});
|
|
5346
|
+
}
|
|
5347
|
+
async function run(sessionId, staleness) {
|
|
5348
|
+
const since = statuses.get(sessionId)?.since ?? now();
|
|
5349
|
+
setStatus(sessionId, { state: "restarting", since, target: staleness.target });
|
|
5350
|
+
publish();
|
|
5351
|
+
deps.log?.(`[auto-restart] restarting ${sessionId}: ${staleness.kind} ${staleness.from} \u2192 ${staleness.target}`);
|
|
5352
|
+
try {
|
|
5353
|
+
if (deps.turnActive(sessionId) || deps.backgroundTasks(sessionId) > 0 || deps.automationRunning(sessionId)) {
|
|
5354
|
+
deps.log?.(`[auto-restart] ${sessionId} became busy before the stop; waiting`);
|
|
5355
|
+
setStatus(sessionId, { state: "waiting", reason: "turn-active", since, target: staleness.target });
|
|
5356
|
+
return;
|
|
5357
|
+
}
|
|
5358
|
+
let result;
|
|
5359
|
+
try {
|
|
5360
|
+
result = await deps.restart(sessionId, staleness);
|
|
5361
|
+
} catch (error) {
|
|
5362
|
+
result = { ok: false, error: error instanceof Error ? error.message : String(error) };
|
|
5363
|
+
}
|
|
5364
|
+
const record = sessionLock.recordAttempt(attempts.get(sessionId) ?? null, staleness.target, result.ok, now(), result.ok ? void 0 : result.error);
|
|
5365
|
+
if (record) attempts.set(sessionId, record);
|
|
5366
|
+
else attempts.delete(sessionId);
|
|
5367
|
+
if (result.ok) {
|
|
5368
|
+
deps.log?.(`[auto-restart] ${sessionId} restarted on ${staleness.target}`);
|
|
5369
|
+
clearSession(sessionId);
|
|
5370
|
+
agentVersions.delete(sessionId);
|
|
5371
|
+
} else {
|
|
5372
|
+
deps.log?.(`[auto-restart] ${sessionId} restart failed (attempt ${record?.attempts}): ${result.error}`);
|
|
5373
|
+
const gaveUp = (record?.attempts ?? 0) >= sessionLock.AUTO_RESTART_MAX_ATTEMPTS;
|
|
5374
|
+
if (!isLive(sessionId)) {
|
|
5375
|
+
offline.set(sessionId, staleness);
|
|
5376
|
+
const retryAt = gaveUp || !record ? void 0 : record.notBefore;
|
|
5377
|
+
setStatus(sessionId, { state: "failed", reason: result.error, since, target: staleness.target, offline: true, ...retryAt ? { retryAt } : {} });
|
|
5378
|
+
if (retryAt) schedule(() => {
|
|
5379
|
+
void retryOffline(sessionId);
|
|
5380
|
+
}, Math.max(0, retryAt - now()));
|
|
5381
|
+
} else {
|
|
5382
|
+
setStatus(sessionId, gaveUp ? { state: "failed", reason: result.error, since, target: staleness.target } : { state: "waiting", reason: "backoff", since, target: staleness.target });
|
|
5383
|
+
}
|
|
5384
|
+
}
|
|
5385
|
+
} finally {
|
|
5386
|
+
inFlight -= 1;
|
|
5387
|
+
publish();
|
|
5388
|
+
}
|
|
5389
|
+
}
|
|
5390
|
+
async function retryOffline(sessionId) {
|
|
5391
|
+
const staleness = offline.get(sessionId);
|
|
5392
|
+
if (!staleness || statuses.get(sessionId)?.state !== "failed" || statuses.get(sessionId)?.retryAt === void 0) return;
|
|
5393
|
+
const status = statuses.get(sessionId);
|
|
5394
|
+
const handOver = (why) => {
|
|
5395
|
+
deps.log?.(`[auto-restart] ${sessionId} offline retry skipped: ${why}`);
|
|
5396
|
+
setStatus(sessionId, { state: "failed", reason: status.reason, since: status.since, target: status.target, offline: true });
|
|
5397
|
+
publish();
|
|
5398
|
+
};
|
|
5399
|
+
if (!deps.enabled()) return handOver("switch off");
|
|
5400
|
+
if (isLive(sessionId)) {
|
|
5401
|
+
offline.delete(sessionId);
|
|
5402
|
+
return;
|
|
5403
|
+
}
|
|
5404
|
+
const server = deps.serverSession ? await deps.serverSession(sessionId).catch(() => null) : null;
|
|
5405
|
+
if (!server) return handOver("server state unknown");
|
|
5406
|
+
if (server.archived || server.active) return handOver(server.archived ? "archived" : "active elsewhere");
|
|
5407
|
+
if (isLive(sessionId) || offline.get(sessionId) !== staleness) return;
|
|
5408
|
+
const t = now();
|
|
5409
|
+
if (inFlight > 0 || lastStartedAt !== null && t - lastStartedAt < sessionLock.AUTO_RESTART_MIN_GAP_MS) {
|
|
5410
|
+
schedule(() => {
|
|
5411
|
+
void retryOffline(sessionId);
|
|
5412
|
+
}, sessionLock.AUTO_RESTART_MIN_GAP_MS + Math.round(random() * sessionLock.AUTO_RESTART_MIN_GAP_MS));
|
|
5413
|
+
return;
|
|
5414
|
+
}
|
|
5415
|
+
inFlight += 1;
|
|
5416
|
+
lastStartedAt = t;
|
|
5417
|
+
setStatus(sessionId, { state: "restarting", since: status.since, target: staleness.target });
|
|
5418
|
+
await run(sessionId, staleness);
|
|
5419
|
+
}
|
|
5420
|
+
async function onCheckIn(request) {
|
|
5421
|
+
let t = now();
|
|
5422
|
+
const tracked = deps.tracked(request.sessionId, request.pid);
|
|
5423
|
+
if (request.report.agentVersion) agentVersions.set(request.sessionId, request.report.agentVersion);
|
|
5424
|
+
const staleness = tracked ? stalenessFor(tracked, request.report.agentVersion) : null;
|
|
5425
|
+
if (!staleness) {
|
|
5426
|
+
const had = statuses.has(request.sessionId);
|
|
5427
|
+
clearSession(request.sessionId);
|
|
5428
|
+
if (had) publish();
|
|
5429
|
+
return { nextCheckMs: null, restarting: false };
|
|
5430
|
+
}
|
|
5431
|
+
offline.delete(request.sessionId);
|
|
5432
|
+
const previous = statuses.get(request.sessionId);
|
|
5433
|
+
if (previous?.state === "restarting") return { nextCheckMs: null, restarting: false };
|
|
5434
|
+
const attempt = attempts.get(request.sessionId) ?? null;
|
|
5435
|
+
let input = {
|
|
5436
|
+
enabled: deps.enabled(),
|
|
5437
|
+
now: t,
|
|
5438
|
+
...deps.quietMs !== void 0 ? { quietMs: deps.quietMs } : {},
|
|
5439
|
+
staleness,
|
|
5440
|
+
trackedLive: !!tracked?.live,
|
|
5441
|
+
report: request.report,
|
|
5442
|
+
turnActive: deps.turnActive(request.sessionId),
|
|
5443
|
+
backgroundTasks: deps.backgroundTasks(request.sessionId),
|
|
5444
|
+
automationRunning: deps.automationRunning(request.sessionId),
|
|
5445
|
+
resumable: false,
|
|
5446
|
+
attempt,
|
|
5447
|
+
inFlight,
|
|
5448
|
+
lastStartedAt
|
|
5449
|
+
};
|
|
5450
|
+
let verdict = sessionLock.decideAutoRestart({ ...input, resumable: true });
|
|
5451
|
+
if (verdict.ok) {
|
|
5452
|
+
const resumable = await deps.resumable(request.sessionId).catch(() => false);
|
|
5453
|
+
t = now();
|
|
5454
|
+
input = {
|
|
5455
|
+
...input,
|
|
5456
|
+
now: t,
|
|
5457
|
+
trackedLive: !!deps.tracked(request.sessionId, request.pid)?.live,
|
|
5458
|
+
turnActive: deps.turnActive(request.sessionId),
|
|
5459
|
+
backgroundTasks: deps.backgroundTasks(request.sessionId),
|
|
5460
|
+
automationRunning: deps.automationRunning(request.sessionId),
|
|
5461
|
+
resumable,
|
|
5462
|
+
attempt: attempts.get(request.sessionId) ?? null,
|
|
5463
|
+
inFlight,
|
|
5464
|
+
lastStartedAt
|
|
5465
|
+
};
|
|
5466
|
+
verdict = statuses.get(request.sessionId)?.state === "restarting" ? { ok: false, reason: "machine-busy" } : sessionLock.decideAutoRestart(input);
|
|
5467
|
+
}
|
|
5468
|
+
if (verdict.ok) {
|
|
5469
|
+
inFlight += 1;
|
|
5470
|
+
lastStartedAt = t;
|
|
5471
|
+
setStatus(request.sessionId, { state: "restarting", since: previous?.since ?? t, target: staleness.target });
|
|
5472
|
+
setImmediate(() => {
|
|
5473
|
+
void run(request.sessionId, staleness);
|
|
5474
|
+
});
|
|
5475
|
+
return { nextCheckMs: null, restarting: true };
|
|
5476
|
+
}
|
|
5477
|
+
if (input.enabled) setStatus(request.sessionId, sessionLock.statusFromVerdict(verdict, previous, staleness, t, attempt));
|
|
5478
|
+
else {
|
|
5479
|
+
statuses.delete(request.sessionId);
|
|
5480
|
+
if (behindSince.get(request.sessionId)?.target !== staleness.target) behindSince.set(request.sessionId, { target: staleness.target, since: t });
|
|
5481
|
+
}
|
|
5482
|
+
publish();
|
|
5483
|
+
return { nextCheckMs: sessionLock.autoRestartNextCheck(verdict, input, random()), restarting: false };
|
|
5484
|
+
}
|
|
5485
|
+
function sweep() {
|
|
5486
|
+
const t = now();
|
|
5487
|
+
const enabled = deps.enabled();
|
|
5488
|
+
const seen = /* @__PURE__ */ new Set();
|
|
5489
|
+
for (const session of deps.liveSessions()) {
|
|
5490
|
+
seen.add(session.sessionId);
|
|
5491
|
+
const staleness = stalenessFor(session, agentVersions.get(session.sessionId));
|
|
5492
|
+
if (!staleness) {
|
|
5493
|
+
clearSession(session.sessionId);
|
|
5494
|
+
continue;
|
|
5495
|
+
}
|
|
5496
|
+
if (statuses.get(session.sessionId)?.state === "restarting") continue;
|
|
5497
|
+
if (offline.delete(session.sessionId)) statuses.delete(session.sessionId);
|
|
5498
|
+
if (!enabled) {
|
|
5499
|
+
statuses.delete(session.sessionId);
|
|
5500
|
+
if (behindSince.get(session.sessionId)?.target !== staleness.target) behindSince.set(session.sessionId, { target: staleness.target, since: t });
|
|
5501
|
+
continue;
|
|
5502
|
+
}
|
|
5503
|
+
const previous = statuses.get(session.sessionId);
|
|
5504
|
+
if (session.startedBy === "terminal") {
|
|
5505
|
+
if (previous?.state !== "manual" || previous.reason !== "local-terminal" || previous.target !== staleness.target) {
|
|
5506
|
+
setStatus(session.sessionId, { state: "manual", reason: "local-terminal", since: t, target: staleness.target });
|
|
5507
|
+
}
|
|
5508
|
+
continue;
|
|
5509
|
+
}
|
|
5510
|
+
if (previous && previous.target === staleness.target) continue;
|
|
5511
|
+
const reports = sessionLock.wrapperReportsIdle({
|
|
5512
|
+
flavor: session.flavor,
|
|
5513
|
+
capabilities: session.capabilities,
|
|
5514
|
+
spawnedBy: session.spawnedBy,
|
|
5515
|
+
tags: session.tags,
|
|
5516
|
+
variant: session.variant
|
|
5517
|
+
});
|
|
5518
|
+
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 });
|
|
5519
|
+
}
|
|
5520
|
+
for (const id of /* @__PURE__ */ new Set([...statuses.keys(), ...behindSince.keys()])) {
|
|
5521
|
+
if (seen.has(id) || statuses.get(id)?.state === "restarting") continue;
|
|
5522
|
+
if (offline.has(id)) continue;
|
|
5523
|
+
clearSession(id);
|
|
5524
|
+
}
|
|
5525
|
+
publish();
|
|
5526
|
+
}
|
|
5527
|
+
return {
|
|
5528
|
+
onCheckIn,
|
|
5529
|
+
sweep,
|
|
5530
|
+
forget(sessionId) {
|
|
5531
|
+
agentVersions.delete(sessionId);
|
|
5532
|
+
const state = statuses.get(sessionId)?.state;
|
|
5533
|
+
if (state === "restarting" || offline.has(sessionId)) return;
|
|
5534
|
+
behindSince.delete(sessionId);
|
|
5535
|
+
if (statuses.delete(sessionId)) publish();
|
|
5536
|
+
},
|
|
5537
|
+
statuses() {
|
|
5538
|
+
return Object.fromEntries(statuses);
|
|
5539
|
+
},
|
|
5540
|
+
/** For tests / diagnostics. */
|
|
5541
|
+
inFlight() {
|
|
5542
|
+
return inFlight;
|
|
5543
|
+
}
|
|
5544
|
+
};
|
|
5545
|
+
}
|
|
5546
|
+
|
|
5297
5547
|
const CLAUDE_AUTH_PROBE_INTERVAL_MS = 10 * 60 * 1e3;
|
|
5298
5548
|
const CLAUDE_AUTH_REFRESH_INTERVAL_MS = 30 * 60 * 1e3;
|
|
5299
5549
|
const PROBE_TIMEOUT_MS = 8e3;
|
|
@@ -7428,6 +7678,7 @@ async function startDaemon() {
|
|
|
7428
7678
|
let lastHandoverHold = null;
|
|
7429
7679
|
let claudeCredentialStoreSetting = (await persistence.readSettings()).claudeCredentialStore === "file" ? "file" : "auto";
|
|
7430
7680
|
let agentHibernationSetting = (await persistence.readSettings()).agentHibernationIdleMs;
|
|
7681
|
+
let autoRestartSetting = (await persistence.readSettings()).autoRestartSessions !== false;
|
|
7431
7682
|
try {
|
|
7432
7683
|
const homes = await index$1.refreshAgentHomes();
|
|
7433
7684
|
logger.logger.debug(`[DAEMON RUN] Claude config dir: ${loginShellEnv.describeAgentHome(homes.claudeConfigDir)}; Codex home: ${loginShellEnv.describeAgentHome(homes.codexHome)}`);
|
|
@@ -7550,6 +7801,7 @@ async function startDaemon() {
|
|
|
7550
7801
|
});
|
|
7551
7802
|
const sessionIdToFinishedSession = /* @__PURE__ */ new Map();
|
|
7552
7803
|
let teamWorker;
|
|
7804
|
+
let autoRestart;
|
|
7553
7805
|
let automationRunner;
|
|
7554
7806
|
let projectPresence;
|
|
7555
7807
|
const persisted = persistence.readPersistedSessions();
|
|
@@ -8290,6 +8542,7 @@ async function startDaemon() {
|
|
|
8290
8542
|
}
|
|
8291
8543
|
};
|
|
8292
8544
|
const restartCounts = /* @__PURE__ */ new Map();
|
|
8545
|
+
const autoRestartExits = /* @__PURE__ */ new Set();
|
|
8293
8546
|
const stopSessionAndWait = async (happySessionId, timeoutMs = 8e3) => {
|
|
8294
8547
|
const targets = /* @__PURE__ */ new Set();
|
|
8295
8548
|
for (const [pid, s] of pidToTrackedSession.entries()) {
|
|
@@ -8339,7 +8592,7 @@ async function startDaemon() {
|
|
|
8339
8592
|
const restartSessionImpl = async (happySessionId, options) => {
|
|
8340
8593
|
try {
|
|
8341
8594
|
const prior = restartCounts.get(happySessionId) ?? 0;
|
|
8342
|
-
const decision = decideRestart(prior, DEFAULT_MAX_RESTARTS);
|
|
8595
|
+
const decision = options?.auto ? { allowed: true } : decideRestart(prior, DEFAULT_MAX_RESTARTS);
|
|
8343
8596
|
if (!decision.allowed) {
|
|
8344
8597
|
return { type: "error", errorMessage: `restart:${decision.reason}` };
|
|
8345
8598
|
}
|
|
@@ -8390,7 +8643,7 @@ async function startDaemon() {
|
|
|
8390
8643
|
if (model) args.push("--model", model);
|
|
8391
8644
|
const permissionMode = spawnAgents.sanitizeSpawnPermissionMode(options?.permissionMode ?? (options?.keepPublishedPermissionMode ? publishedRelaunchPermissionMode(metadata) : void 0));
|
|
8392
8645
|
if (permissionMode) args.push("--permission-mode", permissionMode);
|
|
8393
|
-
restartCounts.set(happySessionId, recordRestartAttempt(prior));
|
|
8646
|
+
if (!options?.auto) restartCounts.set(happySessionId, recordRestartAttempt(prior));
|
|
8394
8647
|
const teamEnv = await teamRelaunchEnvFor(happySessionId, metadata);
|
|
8395
8648
|
const result = await spawnTrackedHappyProcess({
|
|
8396
8649
|
args,
|
|
@@ -8411,7 +8664,8 @@ async function startDaemon() {
|
|
|
8411
8664
|
HAPPY_RECONNECT_SEQ: String(tracked.encryption.seq),
|
|
8412
8665
|
HAPPY_RECONNECT_METADATA_VERSION: String(tracked.encryption.metadataVersion),
|
|
8413
8666
|
HAPPY_RECONNECT_AGENT_STATE_VERSION: String(tracked.encryption.agentStateVersion),
|
|
8414
|
-
...teamEnv
|
|
8667
|
+
...teamEnv,
|
|
8668
|
+
...options?.auto ? { [sessionLock.AUTO_RESTARTED_ENV]: sessionLock.encodeAutoRestarted(options.auto.kind, options.auto.target) } : {}
|
|
8415
8669
|
}
|
|
8416
8670
|
});
|
|
8417
8671
|
if (result.type === "success") {
|
|
@@ -8454,10 +8708,11 @@ async function startDaemon() {
|
|
|
8454
8708
|
};
|
|
8455
8709
|
const onChildExited = (pid) => {
|
|
8456
8710
|
const session = pidToTrackedSession.get(pid);
|
|
8457
|
-
if (session?.happySessionId && (session.spawnedBy === "teams" || teamWorker?.hasSession(session.happySessionId))) teamWorker?.report(session.happySessionId, "exited");
|
|
8711
|
+
if (session?.happySessionId && !autoRestartExits.has(session.happySessionId) && (session.spawnedBy === "teams" || teamWorker?.hasSession(session.happySessionId))) teamWorker?.report(session.happySessionId, "exited");
|
|
8458
8712
|
if (session?.happySessionId && automationRunner?.hasSession(session.happySessionId)) automationRunner.report(session.happySessionId, "exited");
|
|
8459
8713
|
if (session?.happySessionId) turnActivity.forget(session.happySessionId);
|
|
8460
8714
|
if (session?.happySessionId) backgroundTasks.forget(session.happySessionId);
|
|
8715
|
+
if (session?.happySessionId) autoRestart?.forget(session.happySessionId);
|
|
8461
8716
|
if (session?.happySessionId) peerCoordinator.forget(session.happySessionId);
|
|
8462
8717
|
if (session?.happySessionId && daemonHibernation.consumeExit(session.happySessionId)) {
|
|
8463
8718
|
const persisted2 = persistence.readPersistedSessions()[session.happySessionId];
|
|
@@ -8538,6 +8793,84 @@ async function startDaemon() {
|
|
|
8538
8793
|
})();
|
|
8539
8794
|
};
|
|
8540
8795
|
let apiMachineRef = null;
|
|
8796
|
+
let latestAgentVersions = null;
|
|
8797
|
+
const trackedFacts = (tracked) => {
|
|
8798
|
+
const metadata = tracked.happySessionMetadataFromLocalWebhook;
|
|
8799
|
+
return {
|
|
8800
|
+
live: isPidAlive(tracked.pid),
|
|
8801
|
+
wrapperVersion: metadata?.version ?? null,
|
|
8802
|
+
flavor: metadata?.flavor ?? "claude",
|
|
8803
|
+
capabilities: metadata?.capabilities ?? null,
|
|
8804
|
+
spawnedBy: tracked.spawnedBy ?? null,
|
|
8805
|
+
tags: metadata?.tags ?? null,
|
|
8806
|
+
variant: tracked.variant ?? metadata?.variant ?? null,
|
|
8807
|
+
// The wrapper's own word: tracked.startedBy turns into "persisted" /
|
|
8808
|
+
// "recovered" across the very daemon restart an upgrade does.
|
|
8809
|
+
startedBy: metadata?.startedBy ?? null
|
|
8810
|
+
};
|
|
8811
|
+
};
|
|
8812
|
+
const autoRestartScheduler = createAutoRestart({
|
|
8813
|
+
enabled: () => autoRestartSetting,
|
|
8814
|
+
quietMs: sessionLock.resolveQuietMs(),
|
|
8815
|
+
daemonVersion: _package.packageJson.version,
|
|
8816
|
+
installedAgentVersion: (flavor) => flavor === "codex" ? latestAgentVersions?.agents.find((agent) => agent.id === "codex")?.installed ?? null : null,
|
|
8817
|
+
tracked: (sessionId, pid) => {
|
|
8818
|
+
const tracked = pidToTrackedSession.get(pid);
|
|
8819
|
+
if (!tracked || tracked.happySessionId !== sessionId) return null;
|
|
8820
|
+
return trackedFacts(tracked);
|
|
8821
|
+
},
|
|
8822
|
+
liveSessions: () => [...pidToTrackedSession.values()].filter((tracked) => tracked.happySessionId && tracked.happySessionMetadataFromLocalWebhook && isPidAlive(tracked.pid)).map((tracked) => ({ sessionId: tracked.happySessionId, ...trackedFacts(tracked) })),
|
|
8823
|
+
turnActive: (sessionId) => turnActivity.activeSessions().includes(sessionId),
|
|
8824
|
+
backgroundTasks: (sessionId) => backgroundTasks.count(sessionId),
|
|
8825
|
+
automationRunning: (sessionId) => automationRunner?.hasSession(sessionId) === true,
|
|
8826
|
+
// The local copy may predate the agent's conversation id (it is the spawn
|
|
8827
|
+
// webhook's); judge the server copy, exactly as restartSessionImpl will.
|
|
8828
|
+
resumable: async (sessionId) => {
|
|
8829
|
+
const tracked = findTrackedSessionById(sessionId);
|
|
8830
|
+
const local = tracked?.happySessionMetadataFromLocalWebhook;
|
|
8831
|
+
const encryption = tracked?.encryption;
|
|
8832
|
+
if (!local || !encryption) return false;
|
|
8833
|
+
const { metadata } = await resolveRelaunchMetadata(
|
|
8834
|
+
local,
|
|
8835
|
+
() => fetchServerSessionMetadata(sessionId, encryption.encryptionKey, encryption.encryptionVariant)
|
|
8836
|
+
);
|
|
8837
|
+
return resumePrecheck(metadata, {
|
|
8838
|
+
cwdExists: (p) => require$$0.existsSync(p),
|
|
8839
|
+
conversationExists: (cwd, claudeSessionId) => index$1.locateClaudeConversation(cwd, claudeSessionId) !== null
|
|
8840
|
+
}).ok;
|
|
8841
|
+
},
|
|
8842
|
+
restart: async (sessionId, staleness) => {
|
|
8843
|
+
autoRestartExits.add(sessionId);
|
|
8844
|
+
try {
|
|
8845
|
+
const result = await restartSession(sessionId, { keepPublishedPermissionMode: true, auto: { kind: staleness.kind, target: staleness.target } });
|
|
8846
|
+
if (result.type !== "success") return { ok: false, error: result.type === "error" ? result.errorMessage : result.type };
|
|
8847
|
+
const after = findTrackedSessionById(sessionId)?.happySessionMetadataFromLocalWebhook?.version;
|
|
8848
|
+
if (staleness.kind === "cli" && after && (cliUpdate.compareExactVersions(after, staleness.target) ?? 0) < 0) {
|
|
8849
|
+
return { ok: false, error: `still-behind: ${after}` };
|
|
8850
|
+
}
|
|
8851
|
+
return { ok: true };
|
|
8852
|
+
} finally {
|
|
8853
|
+
autoRestartExits.delete(sessionId);
|
|
8854
|
+
}
|
|
8855
|
+
},
|
|
8856
|
+
// Offline-failure retry guard: nobody restored, archived or resumed it meanwhile.
|
|
8857
|
+
serverSession: async (sessionId) => {
|
|
8858
|
+
const response = await axios.get(`${configuration.configuration.serverUrl}/v1/sessions/${encodeURIComponent(sessionId)}`, {
|
|
8859
|
+
headers: { Authorization: `Bearer ${credentials.token}` },
|
|
8860
|
+
timeout: 1e4
|
|
8861
|
+
});
|
|
8862
|
+
const row = response.data.session;
|
|
8863
|
+
if (!row || typeof row.active !== "boolean") return null;
|
|
8864
|
+
return { active: row.active, archived: row.archivedAt != null };
|
|
8865
|
+
},
|
|
8866
|
+
publish: (sessions) => {
|
|
8867
|
+
void apiMachineRef?.setAutoRestartSessions(sessions);
|
|
8868
|
+
},
|
|
8869
|
+
log: (message) => logger.logger.debug(`[DAEMON RUN] ${message}`)
|
|
8870
|
+
});
|
|
8871
|
+
autoRestart = autoRestartScheduler;
|
|
8872
|
+
const autoRestartSweep = setInterval(() => autoRestartScheduler.sweep(), 6e4);
|
|
8873
|
+
autoRestartSweep.unref?.();
|
|
8541
8874
|
let mirrorManagerRef = null;
|
|
8542
8875
|
const controlToken = createDaemonControlToken();
|
|
8543
8876
|
const { port: controlPort, stop: stopControlServer } = await startDaemonControlServer({
|
|
@@ -8564,7 +8897,14 @@ async function startDaemon() {
|
|
|
8564
8897
|
onRateLimits: (report) => {
|
|
8565
8898
|
apiMachineRef?.reportRateLimits(report);
|
|
8566
8899
|
},
|
|
8567
|
-
|
|
8900
|
+
// B-852: the same idle check-in also decides an automatic restart of a
|
|
8901
|
+
// stale wrapper; hibernation (exit) wins when both say yes.
|
|
8902
|
+
onHibernateCheck: async (body) => {
|
|
8903
|
+
const reply = await daemonHibernation.check(body);
|
|
8904
|
+
if (reply.hibernate) return reply;
|
|
8905
|
+
const auto = await autoRestartScheduler.onCheckIn(body);
|
|
8906
|
+
return { ...reply, nextCheckMs: Math.min(reply.nextCheckMs ?? sessionLock.AUTO_RESTART_RECHECK_CAP_MS, sessionLock.AUTO_RESTART_RECHECK_CAP_MS, auto.nextCheckMs ?? Infinity) };
|
|
8907
|
+
},
|
|
8568
8908
|
listPeers: () => peerCoordinator.list(),
|
|
8569
8909
|
// B-505: `daemon list` shows which sessions have a turn in flight, so an
|
|
8570
8910
|
// operator can check the WHOLE machine before a supervised restart.
|
|
@@ -8716,6 +9056,13 @@ async function startDaemon() {
|
|
|
8716
9056
|
daemonHibernation.invalidateBindings();
|
|
8717
9057
|
return persistence.resolveIdleMs(agentHibernationSetting);
|
|
8718
9058
|
});
|
|
9059
|
+
apiMachine.setAutoRestartHandlers(autoRestartSetting, async (enabled) => {
|
|
9060
|
+
await persistence.updateSettings((current) => ({ ...current, autoRestartSessions: enabled }));
|
|
9061
|
+
autoRestartSetting = enabled;
|
|
9062
|
+
autoRestartScheduler.sweep();
|
|
9063
|
+
return autoRestartSetting;
|
|
9064
|
+
});
|
|
9065
|
+
setTimeout(() => autoRestartScheduler.sweep(), 5e3).unref?.();
|
|
8719
9066
|
const webPanelsSync = startWebPanelsSync({
|
|
8720
9067
|
statMtime: async () => (await fs.stat(configuration.configuration.settingsFile).catch(() => null))?.mtimeMs ?? null,
|
|
8721
9068
|
readRaw: async () => (await persistence.readSettings()).webPanels,
|
|
@@ -8806,7 +9153,10 @@ async function startDaemon() {
|
|
|
8806
9153
|
if (delay !== null) logger.logger.warn(`[DAEMON RUN] CLI update policy announced; re-checking in ${Math.round(delay / 1e3)}s`);
|
|
8807
9154
|
});
|
|
8808
9155
|
const stopAgentVersionChecks = mirrorProtocol.startAgentVersionChecks(
|
|
8809
|
-
(snapshot) =>
|
|
9156
|
+
(snapshot) => {
|
|
9157
|
+
latestAgentVersions = snapshot;
|
|
9158
|
+
return apiMachine.updateDaemonState((state) => ({ ...state, status: state?.status ?? "running", agentVersions: snapshot }));
|
|
9159
|
+
},
|
|
8810
9160
|
(error) => logger.logger.debug("[DAEMON RUN] Agent version check failed", error)
|
|
8811
9161
|
);
|
|
8812
9162
|
harnessInstaller = createHarnessInstaller({
|
|
@@ -8988,6 +9338,7 @@ async function startDaemon() {
|
|
|
8988
9338
|
logger.logger.debug("[DAEMON RUN] Health check interval cleared");
|
|
8989
9339
|
}
|
|
8990
9340
|
clearInterval(cliUpdateInterval);
|
|
9341
|
+
clearInterval(autoRestartSweep);
|
|
8991
9342
|
policyAnnouncements.stop();
|
|
8992
9343
|
stopAgentVersionChecks();
|
|
8993
9344
|
await apiMachine.updateDaemonState((state) => ({
|