very-happy-cli 0.2.189 → 0.2.191
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-fj16v_cf.mjs → AcpBackend-CCy_9AfR.mjs} +3 -3
- package/dist/{AcpBackend-DRPJ2g9G.cjs → AcpBackend-DgrIc1vH.cjs} +3 -3
- package/dist/{AcpSessionManager-BZPmUDL5.mjs → AcpSessionManager-CQnxx7gD.mjs} +2 -2
- package/dist/{AcpSessionManager-DM-KKg6v.cjs → AcpSessionManager-DVOzCD3P.cjs} +2 -2
- package/dist/{BasePermissionHandler-DjM16uJz.cjs → BasePermissionHandler-C9Ag7yvs.cjs} +1 -1
- package/dist/{BasePermissionHandler-CVtH-snr.mjs → BasePermissionHandler-DYLN6Ec9.mjs} +1 -1
- package/dist/{acpSessionResume-Dxl1LRAT.mjs → acpSessionResume-Bi7pA1n_.mjs} +1 -1
- package/dist/{acpSessionResume-2BTMsB7_.cjs → acpSessionResume-TvP_4Zq2.cjs} +1 -1
- package/dist/{agentHome-CHctmMzZ.mjs → agentHome-DGv105SR.mjs} +4 -4
- package/dist/{agentHome-W17n1gnH.cjs → agentHome-DNUKJWOY.cjs} +4 -4
- package/dist/{api-BDuuyys8.cjs → api-BBxZ7y2z.cjs} +19 -10
- package/dist/{api-B0yN68XH.mjs → api-jfeMRg5R.mjs} +19 -10
- package/dist/{apiMachine-mc9CsKuS.mjs → apiMachine-DRJ7y-BB.mjs} +56 -15
- package/dist/{apiMachine-iddD-F19.cjs → apiMachine-DqyjKBZG.cjs} +56 -15
- package/dist/{attachmentContent-Cc5b7TPr.cjs → attachmentContent-BO2njyza.cjs} +2 -2
- package/dist/{attachmentContent-CcIdMfAx.mjs → attachmentContent-Dm_RIs5L.mjs} +2 -2
- package/dist/{auth-DNAgkUkB.mjs → auth-BYDtjVNb.mjs} +8 -8
- package/dist/{auth-CyrVvWHF.mjs → auth-DC6rg8lJ.mjs} +5 -5
- package/dist/{auth-B7tVmyfX.cjs → auth-DLR3ksCF.cjs} +8 -8
- package/dist/{auth-DQKSpaEf.cjs → auth-DnxoVkkf.cjs} +5 -5
- package/dist/{auto-CetlumDo.cjs → auto-CwO0u8hB.cjs} +18 -18
- package/dist/{auto-BklCipw1.mjs → auto-D5Jhukq1.mjs} +18 -18
- package/dist/{bootstrap-DfXwkUQb.mjs → bootstrap-rLaL3kTa.mjs} +2 -2
- package/dist/{bootstrap-CDY-Vz8q.cjs → bootstrap-sly4qPPY.cjs} +2 -2
- package/dist/{browser-D1yzC0Tu.cjs → browser-BTgZ9d4i.cjs} +1 -1
- package/dist/{browser-vb0k1zfI.mjs → browser-CHpVgyni.mjs} +1 -1
- package/dist/{claudeLocal-2dJIiTIq.cjs → claudeLocal-1vuTFcL8.cjs} +5 -5
- package/dist/{claudeLocal-Bid_rC_v.mjs → claudeLocal-Bgb5GGsq.mjs} +5 -5
- package/dist/{claudeLocalLauncher-Jm5oQX5Z.cjs → claudeLocalLauncher-DOsL6HFY.cjs} +10 -10
- package/dist/{claudeLocalLauncher-5pzpETxd.mjs → claudeLocalLauncher-T7EfT68h.mjs} +10 -10
- package/dist/{claudeSessionFork-DzecSBO4.mjs → claudeSessionFork-CPvi6yDX.mjs} +1 -1
- package/dist/{claudeSessionFork-DsbcuDEJ.cjs → claudeSessionFork-Cko4SaVi.cjs} +1 -1
- package/dist/{client-CvjjadIE.mjs → client-BXD66ZF5.mjs} +2 -2
- package/dist/{client-C9Ecbtko.mjs → client-Bh1aUPh-.mjs} +4 -4
- package/dist/{client-B161HwAk.mjs → client-Bi20Ka0h.mjs} +2 -2
- package/dist/{client-D0aYWt53.cjs → client-BscskEBk.cjs} +2 -2
- package/dist/{client-BNmFaRXZ.cjs → client-C-OdTbrU.cjs} +4 -4
- package/dist/{client-DIfxYk7B.cjs → client-C5-C0t2a.cjs} +2 -2
- package/dist/codex/happyMcpStdioBridge.cjs +16 -16
- package/dist/codex/happyMcpStdioBridge.mjs +16 -16
- package/dist/{codexAppServerClient-CO9f4Jr8.cjs → codexAppServerClient-DKXeikEe.cjs} +13 -6
- package/dist/{codexAppServerClient-BlVmpjR-.mjs → codexAppServerClient-DXhAf6i-.mjs} +13 -6
- package/dist/{codexCommand-CAMR4g5o.mjs → codexCommand-CIaOiiOj.mjs} +137 -55
- package/dist/{codexCommand-BfoRP6E9.cjs → codexCommand-DvbbpYBS.cjs} +141 -59
- package/dist/{codexTermination-BvGlN02_.mjs → codexTermination-BcQdEDaw.mjs} +1 -1
- package/dist/{codexTermination-IrLZQzKC.cjs → codexTermination-BszWfyk5.cjs} +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-BGFqQGvh.cjs → config-Di3Cf6js.cjs} +3 -3
- package/dist/{config-CtMgGPvf.mjs → config-OCEcVVK1.mjs} +3 -3
- package/dist/{configuration-C0ctLGW2.cjs → configuration-DfPBa-9d.cjs} +1 -1
- package/dist/{configuration-1FabKklB.mjs → configuration-ECqXu34R.mjs} +1 -1
- package/dist/{connect-DSw-2f52.cjs → connect-BPQRuOw5.cjs} +13 -13
- package/dist/{connect-0lSugpjf.mjs → connect-BTfAUhk8.mjs} +13 -13
- package/dist/{context-BgxbXWKS.mjs → context-CfgTFpCB.mjs} +1 -1
- package/dist/{context-D-hEk5pC.cjs → context-Co7hUaW-.cjs} +1 -1
- package/dist/{controlClient-F7hAEEy2.cjs → controlClient-C13_pSKG.cjs} +3 -3
- package/dist/{controlClient-DwNnNAUx.mjs → controlClient-ClI7A0qE.mjs} +3 -3
- package/dist/{createSessionMetadata-CG6Klinp.mjs → createSessionMetadata-B0eT_Kfj.mjs} +2 -2
- package/dist/{createSessionMetadata-DezS33OM.cjs → createSessionMetadata-Cf78KHtt.cjs} +2 -2
- package/dist/defaultPermissionMode-m6z2QVyP.mjs +43 -0
- package/dist/defaultPermissionMode-oqTupStc.cjs +49 -0
- package/dist/{deterministicJson-BMwgK21e.mjs → deterministicJson-BtSwbsok.mjs} +13 -13
- package/dist/{deterministicJson-D0LU_XbO.cjs → deterministicJson-CpFFgUL_.cjs} +13 -13
- package/dist/{doctor-wVNvRarN.cjs → doctor-BEU0_1Xv.cjs} +7 -7
- package/dist/{doctor-D16hySse.mjs → doctor-lsxmAK4o.mjs} +7 -7
- package/dist/{downloadTarget-C6tqaXGm.mjs → downloadTarget-BXqXhNF7.mjs} +6 -6
- package/dist/{downloadTarget-aNcCxVRL.cjs → downloadTarget-CikzJv1h.cjs} +6 -6
- package/dist/{ensureDaemonRunning-CIghxgDR.cjs → ensureDaemonRunning-BUuH-pbE.cjs} +5 -5
- package/dist/{ensureDaemonRunning-DZq8bvsp.mjs → ensureDaemonRunning-B_9WAlbU.mjs} +5 -5
- package/dist/exitAfterFlush-AbKNZM0N.mjs +23 -0
- package/dist/exitAfterFlush-DIT_sIxR.cjs +25 -0
- package/dist/{handleResumeCommand-BNnD7EuD.mjs → handleResumeCommand-BK9XKH_l.mjs} +5 -5
- package/dist/{handleResumeCommand-CMUTygsm.cjs → handleResumeCommand-Dj7oi2KO.cjs} +5 -5
- package/dist/{agentAttachments-Dbw8iMCZ.cjs → heldInput-BOtqFO2r.cjs} +27 -0
- package/dist/heldInput-C69lA2dH.mjs +44 -0
- package/dist/{index-BCQr-5Ei.mjs → index-BdOJOZ6J.mjs} +4 -4
- package/dist/{index-CKd20r1W.mjs → index-BjZnpGWX.mjs} +3 -3
- package/dist/{index-WKyN-bNy.mjs → index-Bq8NKSCF.mjs} +65 -1
- package/dist/{index-BOe6dKnL.cjs → index-CLUHaPU8.cjs} +76 -0
- package/dist/{index-CnzsOD19.cjs → index-CauRYQKr.cjs} +133 -54
- package/dist/{index-4TpmBb2Q.cjs → index-CmZusg8Q.cjs} +3 -3
- package/dist/{index-BuiG8hmg.mjs → index-Cxso1rg4.mjs} +133 -54
- package/dist/{index-De02DNu5.cjs → index-D3c7CLot.cjs} +4 -4
- package/dist/{index-B81qV_F_.cjs → index-Dg2NAF_-.cjs} +4 -4
- package/dist/{index-Df0bc_et.mjs → index-DuK9XYbZ.mjs} +4 -4
- package/dist/index.cjs +2 -2
- package/dist/index.mjs +2 -2
- package/dist/{install-23ehAdTD.mjs → install-DTIveLOS.mjs} +3 -3
- package/dist/{install-DNbIEJUk.cjs → install-DXllkuy0.cjs} +3 -3
- package/dist/lib.cjs +12 -12
- package/dist/lib.d.cts +63 -1
- package/dist/lib.d.mts +63 -1
- package/dist/lib.mjs +12 -12
- package/dist/{lidState-B4dHJCeS.cjs → lidState-C9_DoF9i.cjs} +1 -1
- package/dist/{lidState-q5Its2Hm.mjs → lidState-CD81ryTy.mjs} +1 -1
- package/dist/{localHappyAgentAuth-CG2nPD_H.cjs → localHappyAgentAuth-CCjUvOfi.cjs} +1 -1
- package/dist/{localHappyAgentAuth-C_G5u5lY.mjs → localHappyAgentAuth-Cg-m1lwm.mjs} +1 -1
- package/dist/{logger-BP1SW7Cs.cjs → logger-Ct2zvaq0.cjs} +2 -2
- package/dist/{logger-DOKH3Zbh.mjs → logger-GcbI0eg2.mjs} +2 -2
- package/dist/{machineMetadata-D-5qeIqd.mjs → machineMetadata-CXRmFNOV.mjs} +3 -3
- package/dist/{machineMetadata-BKX3ov9g.cjs → machineMetadata-DDCVWb_x.cjs} +3 -3
- package/dist/{main-ndpVIaSG.cjs → main-BHC-WIcM.cjs} +49 -48
- package/dist/{main-DODz8DQE.mjs → main-omGr_ONk.mjs} +49 -48
- package/dist/{mcp-BBwbSODp.mjs → mcp-D5hxmRAq.mjs} +15 -15
- package/dist/{mcp-Bc4U4exu.cjs → mcp-xUzii0m8.cjs} +15 -15
- package/dist/{mirrorProtocol-CiA3hO2y.cjs → mirrorProtocol-Dfl8Ahyf.cjs} +3 -3
- package/dist/{mirrorProtocol-D2vTWteS.mjs → mirrorProtocol-Lcx20Oby.mjs} +3 -3
- package/dist/{package-CYDdLA6R.cjs → package-9n7wd2dT.cjs} +7 -7
- package/dist/{package-DTcaIhjW.mjs → package-BsUHyqWe.mjs} +7 -7
- package/dist/{panels-C2xZ8rqU.cjs → panels-BfknEmt7.cjs} +5 -5
- package/dist/{panels-DCaLxlSL.mjs → panels-CpEKWWbI.mjs} +5 -5
- package/dist/{peerTools-B4315xjX.cjs → peerTools-CElYh-5u.cjs} +5 -5
- package/dist/{peerTools-BtrUnSwz.mjs → peerTools-CwCe6tmJ.mjs} +5 -5
- package/dist/{persistence-CrzC7yr_.cjs → persistence-A2NeERZJ.cjs} +6 -2
- package/dist/{persistence-0INrP3aB.mjs → persistence-Cpw4yJs8.mjs} +6 -3
- package/dist/{piRunnerArgs-BtzW_kfh.cjs → piRunnerArgs-BnFU0K73.cjs} +1 -1
- package/dist/{piRunnerArgs-DRuxMlX1.mjs → piRunnerArgs-Bqmu16He.mjs} +1 -1
- package/dist/{piRuntime-BMAFpIBV.mjs → piRuntime-Cgn1b0OX.mjs} +1 -1
- package/dist/{piRuntime-DEbPE_kW.cjs → piRuntime-DpS9TAIs.cjs} +1 -1
- package/dist/{piTerminal-DQXV8_we.mjs → piTerminal-BGdps8f3.mjs} +17 -17
- package/dist/{piTerminal-MtxDtBE2.cjs → piTerminal-rmve-VlI.cjs} +17 -17
- package/dist/{pushNotifications-CalIS9sq.cjs → pushNotifications-23YSd-0l.cjs} +28 -3
- package/dist/{pushNotifications-Cq1s8YVK.mjs → pushNotifications-XAM8__Pg.mjs} +28 -3
- package/dist/{query-BYiPBHPC.mjs → query-SZcYnJoW.mjs} +1 -1
- package/dist/{query-CE2XDhhw.cjs → query-u2GX-I0C.cjs} +1 -1
- package/dist/{rateLimitReporter-DR5LXuiQ.mjs → rateLimitReporter-COUkf446.mjs} +3 -3
- package/dist/{rateLimitReporter-BKmoOZQi.cjs → rateLimitReporter-CaTzBe3x.cjs} +3 -3
- package/dist/{rateLimitWindows-Cs56YJCH.cjs → rateLimitWindows-B2Kx6L0S.cjs} +1 -1
- package/dist/{rateLimitWindows-5vIuNjko.mjs → rateLimitWindows-j_qQk0KY.mjs} +1 -1
- package/dist/{registerCommonHandlers-DZPozYxc.cjs → registerCommonHandlers-D1MiSfcB.cjs} +2 -2
- package/dist/{registerCommonHandlers-DWkTysjD.mjs → registerCommonHandlers-DRRfinzK.mjs} +2 -2
- package/dist/{registerKillSessionHandler-CSCTRIbI.mjs → registerKillSessionHandler-Cpug_r5C.mjs} +16 -6
- package/dist/{registerKillSessionHandler-DhCjrs44.cjs → registerKillSessionHandler-hvCsEn7b.cjs} +16 -6
- package/dist/{remoteSessionClient-Dq8XTLQP.cjs → remoteSessionClient-6ymeMVa4.cjs} +5 -5
- package/dist/{remoteSessionClient-Vfj_5g2-.mjs → remoteSessionClient-BdnJ_n8C.mjs} +5 -5
- package/dist/{reportProgressTool-B7zmX7NJ.mjs → reportProgressTool-XgQBzxoD.mjs} +3 -3
- package/dist/{reportProgressTool-DznxPKES.cjs → reportProgressTool-tzQLCLIw.cjs} +3 -3
- package/dist/{run-DSfNcR62.mjs → run-Bt0AklUU.mjs} +396 -43
- package/dist/{run-Ca8BiNCp.cjs → run-DYL_wuj7.cjs} +396 -43
- package/dist/{runClaude-hoepv-0X.mjs → runClaude-C3rii_S6.mjs} +47 -27
- package/dist/{runClaude-ClQQcgoO.cjs → runClaude-CBEpYO4S.cjs} +49 -29
- package/dist/{runClaudeDeps-ck5_GYlP.cjs → runClaudeDeps-CYuozSC6.cjs} +187 -61
- package/dist/{runClaudeDeps-D_v8t2SK.mjs → runClaudeDeps-DlVfMG4F.mjs} +192 -66
- package/dist/{runGemini-Cj0XsMiM.cjs → runGemini-CEI3b90u.cjs} +33 -33
- package/dist/{runGemini-CTr2-cYG.mjs → runGemini-DkYhRk9S.mjs} +33 -33
- package/dist/{runOpenClaw-BoN1e3lP.cjs → runOpenClaw-BgjD6E4d.cjs} +18 -18
- package/dist/{runOpenClaw-CdDMntiV.mjs → runOpenClaw-DpprWCoz.mjs} +18 -18
- package/dist/{sandbox-DcaWB-Ou.mjs → sandbox-DJ7A7lsy.mjs} +4 -4
- package/dist/{sandbox-BY2h19gc.cjs → sandbox-XCDUbH72.cjs} +4 -4
- package/dist/{selfCheck-DFS_GUaQ.cjs → selfCheck-BYUDB1Uq.cjs} +37 -37
- package/dist/selfCheck-C-rNljKV.mjs +86 -0
- package/dist/{send-UBTHHNvZ.mjs → send-Ba63huxv.mjs} +8 -8
- package/dist/{send-BMsUYU6g.cjs → send-CASDBCyJ.cjs} +8 -8
- package/dist/{server-YrHMHNz1.cjs → server-cZoV9XRt.cjs} +6 -6
- package/dist/{server-Dt3mCtfQ.mjs → server-w3W0toNd.mjs} +4 -4
- package/dist/{sessionLock-DSqiP2lH.cjs → sessionLock-BmLA2S8K.cjs} +134 -3
- package/dist/{sessionLock-tEFvFXLD.mjs → sessionLock-G2PMqvsh.mjs} +121 -4
- package/dist/{sessionOps-CljctDs5.mjs → sessionOps-DPw5k8vV.mjs} +15 -5
- package/dist/{sessionOps-BzeOKIEF.cjs → sessionOps-DXlTmS7J.cjs} +15 -4
- package/dist/{sessionProvider-BnUFSJXM.mjs → sessionProvider-DUn91LhJ.mjs} +5 -5
- package/dist/{sessionProvider-ORgzmkXy.cjs → sessionProvider-Dg691XQ4.cjs} +5 -5
- package/dist/{sessionScanner-Cr6PJ3PT.cjs → sessionScanner-AHjnicxi.cjs} +3 -3
- package/dist/{sessionScanner-DZUlkdF6.mjs → sessionScanner-BCXpdZJN.mjs} +3 -3
- package/dist/{sessions-aIo_HjmY.cjs → sessions-BiBXOBx0.cjs} +36 -25
- package/dist/{sessions-15cag-su.mjs → sessions-Clk8MR5Y.mjs} +35 -26
- package/dist/{setupOfflineReconnection-tV0Q1dgR.cjs → setupOfflineReconnection-BKLfOd-i.cjs} +2 -2
- package/dist/{setupOfflineReconnection-B7I8R2Ex.mjs → setupOfflineReconnection-DI-QZGYz.mjs} +2 -2
- package/dist/{spawn-ByrQgruJ.mjs → spawn-4tsp1uhh.mjs} +15 -15
- package/dist/{spawn-VG-HjJiR.cjs → spawn-D5omsx1Q.cjs} +15 -15
- package/dist/{spawnAgents-Bh1RPShN.mjs → spawnAgents-CjoU6ZOS.mjs} +8 -2
- package/dist/{spawnAgents-C1-4m7aN.cjs → spawnAgents-CtkkIFHd.cjs} +8 -2
- package/dist/{spawnHappyCLI-CxiR2Qoy.cjs → spawnHappyCLI-CF_gLi92.cjs} +1 -1
- package/dist/{spawnHappyCLI-CEsXwz5V.mjs → spawnHappyCLI-CIA9Sc_5.mjs} +1 -1
- package/dist/{startFileWatcher-C-XCZ5t2.cjs → startFileWatcher-9Stpxe7p.cjs} +1 -1
- package/dist/{startFileWatcher-DkEeeAtL.mjs → startFileWatcher-CDO6fb2m.mjs} +1 -1
- package/dist/{defaultPermissionMode-e2bIIJG4.mjs → startupSessionCreate-BtR4iYEC.mjs} +25 -6
- package/dist/{defaultPermissionMode-5EvgRq38.cjs → startupSessionCreate-CcF7rGGB.cjs} +25 -7
- package/dist/{streamRelay-D9a4cBEa.cjs → streamRelay-BhI6jqF-.cjs} +1 -1
- package/dist/{streamRelay-CqBynIon.mjs → streamRelay-DMwOMTKf.mjs} +1 -1
- package/dist/{sync-CoChLEIg.cjs → sync-Ba8N6xba.cjs} +1 -1
- package/dist/{sync-BvDMkKAN.mjs → sync-C0PRuTMj.mjs} +1 -1
- package/dist/{systemPrompt-CgDaPigN.mjs → systemPrompt-D0q8eyjy.mjs} +2 -2
- package/dist/{systemPrompt-Dy_Rf-0Z.cjs → systemPrompt-DV5IReD4.cjs} +2 -2
- package/dist/{teams-BC4_e5hR.mjs → teams-BO3_arwM.mjs} +7 -7
- package/dist/{teams-DPvfLAk8.cjs → teams-z3Gp-KlV.cjs} +7 -7
- package/dist/{template-17HATY_Y.cjs → template-B_5l6pkc.cjs} +1 -1
- package/dist/{template-CEK8MEjo.mjs → template-DLR_0hfj.mjs} +1 -1
- package/dist/{time-XwEZxKGc.cjs → time-Cy0a-7YX.cjs} +1 -1
- package/dist/{time-CUK37wiV.mjs → time-D0jvDRhn.mjs} +1 -1
- package/dist/{titleGenerator-DWRVdqMU.mjs → titleGenerator-AGQsXskb.mjs} +1 -1
- package/dist/{titleGenerator-DVX0NZUn.cjs → titleGenerator-RGHWP2YL.cjs} +2 -2
- package/dist/{todo-BNMGXneA.mjs → todo-BZ954vsz.mjs} +6 -6
- package/dist/{todo-CKGrSrRE.cjs → todo-CzIDPLFy.cjs} +6 -6
- package/dist/{tools-CjMafO_D.cjs → tools-B1x1j6tz.cjs} +1 -1
- package/dist/{tools-CCIEAVbB.mjs → tools-Bei5i03L.mjs} +1 -1
- package/dist/{uninstall-CJvJ7gjr.mjs → uninstall-B4T_e3Mr.mjs} +3 -3
- package/dist/{uninstall-BdFbTXnL.cjs → uninstall-C3cnIvz1.cjs} +3 -3
- package/package.json +7 -7
- package/dist/agentAttachments-M_B5qEF2.mjs +0 -18
- package/dist/selfCheck-BQ_H2Sns.mjs +0 -86
- package/dist/startupSessionCreate-CYc8mra-.cjs +0 -26
- package/dist/startupSessionCreate-npXe2TdN.mjs +0 -24
|
@@ -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-Lcx20Oby.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-Bqmu16He.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-ECqXu34R.mjs';
|
|
11
|
+
import { T as TurnActivityTracker, A as ApiClient } from './api-jfeMRg5R.mjs';
|
|
12
|
+
import { S as SPAWN_AGENTS, i as isSpawnAgent, s as sanitizeSpawnPermissionMode, r as resolveSpawnPermissionMode, a as resolveFirstMessageMeta, j as joinProject } from './spawnAgents-CjoU6ZOS.mjs';
|
|
13
|
+
import { l as logger } from './logger-GcbI0eg2.mjs';
|
|
14
|
+
import { p as pruneStaleCompileCaches } from './index-BjZnpGWX.mjs';
|
|
15
|
+
import { a as authAndSetupMachineIfNeeded } from './auth-DC6rg8lJ.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-BsUHyqWe.mjs';
|
|
18
|
+
import { a as globalPrefixForPackage, N as NPM_SAFE_ARG, g as getEnvironmentInfo } from './doctor-lsxmAK4o.mjs';
|
|
19
|
+
import { s as spawnHappyCLI } from './spawnHappyCLI-CIA9Sc_5.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-Cpw4yJs8.mjs';
|
|
21
|
+
import { i as isDaemonRunningCurrentlyInstalledHappyVersion, s as stopDaemon, u as cleanupDaemonState } from './controlClient-ClI7A0qE.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-DPw5k8vV.mjs';
|
|
23
23
|
import fastify from 'fastify';
|
|
24
24
|
import { z } from 'zod';
|
|
25
25
|
import { validatorCompiler, serializerCompiler } from 'fastify-type-provider-zod';
|
|
@@ -27,63 +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-j_qQk0KY.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-CwCe6tmJ.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-BdnJ_n8C.mjs';
|
|
34
|
+
import { assistantHome, bootstrapAssistantHome } from './bootstrap-rLaL3kTa.mjs';
|
|
35
|
+
import { refreshAgentHomes, locateClaudeConversation, agentHomeSpawnEnv } from './index-DuK9XYbZ.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-CXRmFNOV.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-BK9XKH_l.mjs';
|
|
47
47
|
import { n as normalizeWebPanels } from './webPanels-B2_C2-3g.mjs';
|
|
48
|
-
import {
|
|
48
|
+
import { $ as ServerMigrateNoticeSchema, a0 as isHarnessInstallId, a1 as MODEL_INTENT_CONFIG, f as AUTOMATION_SUMMARY_MAX_CHARS, a2 as AUTOMATION_PRECHECK_OUTPUT_MAX_CHARS, a3 as AUTOMATION_PRECHECK_DEFAULT_TIMEOUT_MS, c as AUTOMATION_PRECHECK_MAX_TIMEOUT_MS, a4 as AUTOMATION_CLAIM_MAX_RUNS, a5 as AUTOMATION_DAEMON_CAPABILITY_PRECHECK, a6 as AUTOMATION_DEFAULT_LEASE_MS, i as isAutomationRunTerminal, a7 as HARNESS_INSTALL_CAPABILITY_VERSION } from './index-Bq8NKSCF.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-Bi20Ka0h.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-G2PMqvsh.mjs';
|
|
53
|
+
import { c as createAutomationsClient, i as isAutomationsUnavailable, d as AutomationsRequestError } from './client-BXD66ZF5.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-CDO6fb2m.mjs';
|
|
58
|
+
import { I as InvalidateSync } from './sync-C0PRuTMj.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-tEFvFXLD.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-DLR_0hfj.mjs';
|
|
65
65
|
import { d as describeAgentHome } from './loginShellEnv-Dw8M7tkI.mjs';
|
|
66
|
-
import './acpSessionResume-
|
|
67
|
-
import './lidState-
|
|
66
|
+
import './acpSessionResume-Bi7pA1n_.mjs';
|
|
67
|
+
import './lidState-CD81ryTy.mjs';
|
|
68
68
|
import 'node:events';
|
|
69
69
|
import 'socket.io-client';
|
|
70
|
-
import './pushNotifications-
|
|
70
|
+
import './pushNotifications-XAM8__Pg.mjs';
|
|
71
71
|
import './contentLogMetadata-BlWI0egu.mjs';
|
|
72
72
|
import './limits-DIo7rEBR.mjs';
|
|
73
|
-
import './time-
|
|
74
|
-
import './registerCommonHandlers-
|
|
73
|
+
import './time-D0jvDRhn.mjs';
|
|
74
|
+
import './registerCommonHandlers-DRRfinzK.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-CHpVgyni.mjs';
|
|
82
82
|
import 'open';
|
|
83
83
|
import './specialCommands-MXUN0wfI.mjs';
|
|
84
84
|
import './ids-DU6sLx4C.mjs';
|
|
85
85
|
import 'url';
|
|
86
|
-
import './localHappyAgentAuth-
|
|
86
|
+
import './localHappyAgentAuth-Cg-m1lwm.mjs';
|
|
87
87
|
import './processTreeSnapshot-CuLJDNC-.mjs';
|
|
88
88
|
import 'ps-list';
|
|
89
89
|
|
|
@@ -548,7 +548,8 @@ const WrapperIdleSnapshotSchema = z.object({
|
|
|
548
548
|
backgroundTasks: z.number().int().nonnegative(),
|
|
549
549
|
scheduledWakeups: z.number().int().nonnegative().optional(),
|
|
550
550
|
lastActivityAt: z.number(),
|
|
551
|
-
exiting: z.boolean().optional()
|
|
551
|
+
exiting: z.boolean().optional(),
|
|
552
|
+
agentVersion: z.string().max(64).optional()
|
|
552
553
|
}).passthrough();
|
|
553
554
|
const HibernateCheckBodySchema = z.object({
|
|
554
555
|
sessionId: z.string().min(1).max(200),
|
|
@@ -1516,6 +1517,7 @@ function summaryFromPersisted(id, persisted) {
|
|
|
1516
1517
|
...meta?.flavor ? { flavor: meta.flavor } : {},
|
|
1517
1518
|
...meta?.tags?.length ? { tags: [...meta.tags] } : {},
|
|
1518
1519
|
...meta?.variant ? { variant: meta.variant } : {},
|
|
1520
|
+
...lineageOf(meta),
|
|
1519
1521
|
...persisted?.savedAt !== void 0 ? { savedAt: persisted.savedAt } : {},
|
|
1520
1522
|
url: sessionWebUrl(id)
|
|
1521
1523
|
};
|
|
@@ -5274,6 +5276,253 @@ async function waitForSessionLive(sessionId, live, timeoutMs = AUTOMATION_WAKE_T
|
|
|
5274
5276
|
return true;
|
|
5275
5277
|
}
|
|
5276
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
|
+
|
|
5277
5526
|
const CLAUDE_AUTH_PROBE_INTERVAL_MS = 10 * 60 * 1e3;
|
|
5278
5527
|
const CLAUDE_AUTH_REFRESH_INTERVAL_MS = 30 * 60 * 1e3;
|
|
5279
5528
|
const PROBE_TIMEOUT_MS = 8e3;
|
|
@@ -6348,6 +6597,9 @@ async function removeTeamWorktree(resource) {
|
|
|
6348
6597
|
if (ownBranch) await git(repository, ["branch", "-D", branch]);
|
|
6349
6598
|
}
|
|
6350
6599
|
|
|
6600
|
+
function teamInitialModelMeta(model) {
|
|
6601
|
+
return model ? { model, modelIntent: model } : { modelIntent: MODEL_INTENT_CONFIG };
|
|
6602
|
+
}
|
|
6351
6603
|
function refusalCode(error) {
|
|
6352
6604
|
const code = axios.isAxiosError(error) ? error.response?.data?.error : void 0;
|
|
6353
6605
|
return typeof code === "string" && /^[a-z_]{1,64}$/.test(code) ? ` (${code})` : "";
|
|
@@ -6464,7 +6716,7 @@ function createTeamWorker(deps) {
|
|
|
6464
6716
|
return;
|
|
6465
6717
|
}
|
|
6466
6718
|
const key = await waitForSessionKey(receipt.sessionId, 1e4);
|
|
6467
|
-
await sendUserMessage(receipt.sessionId, key, teamInitialPrompt(op.prompt, bot?.root === true, receipt.directory), "teams", { localId: `teams-initial-${op.id}`, sentFrom: "team", ...op.model
|
|
6719
|
+
await sendUserMessage(receipt.sessionId, key, teamInitialPrompt(op.prompt, bot?.root === true, receipt.directory), "teams", { localId: `teams-initial-${op.id}`, sentFrom: "team", ...teamInitialModelMeta(op.model) });
|
|
6468
6720
|
receipt = { ...receipt, phase: "delivered" };
|
|
6469
6721
|
writeReceipt$1(home, receipt);
|
|
6470
6722
|
}
|
|
@@ -7408,6 +7660,7 @@ async function startDaemon() {
|
|
|
7408
7660
|
let lastHandoverHold = null;
|
|
7409
7661
|
let claudeCredentialStoreSetting = (await readSettings()).claudeCredentialStore === "file" ? "file" : "auto";
|
|
7410
7662
|
let agentHibernationSetting = (await readSettings()).agentHibernationIdleMs;
|
|
7663
|
+
let autoRestartSetting = (await readSettings()).autoRestartSessions !== false;
|
|
7411
7664
|
try {
|
|
7412
7665
|
const homes = await refreshAgentHomes();
|
|
7413
7666
|
logger.debug(`[DAEMON RUN] Claude config dir: ${describeAgentHome(homes.claudeConfigDir)}; Codex home: ${describeAgentHome(homes.codexHome)}`);
|
|
@@ -7530,6 +7783,7 @@ async function startDaemon() {
|
|
|
7530
7783
|
});
|
|
7531
7784
|
const sessionIdToFinishedSession = /* @__PURE__ */ new Map();
|
|
7532
7785
|
let teamWorker;
|
|
7786
|
+
let autoRestart;
|
|
7533
7787
|
let automationRunner;
|
|
7534
7788
|
let projectPresence;
|
|
7535
7789
|
const persisted = readPersistedSessions();
|
|
@@ -8270,6 +8524,7 @@ async function startDaemon() {
|
|
|
8270
8524
|
}
|
|
8271
8525
|
};
|
|
8272
8526
|
const restartCounts = /* @__PURE__ */ new Map();
|
|
8527
|
+
const autoRestartExits = /* @__PURE__ */ new Set();
|
|
8273
8528
|
const stopSessionAndWait = async (happySessionId, timeoutMs = 8e3) => {
|
|
8274
8529
|
const targets = /* @__PURE__ */ new Set();
|
|
8275
8530
|
for (const [pid, s] of pidToTrackedSession.entries()) {
|
|
@@ -8319,7 +8574,7 @@ async function startDaemon() {
|
|
|
8319
8574
|
const restartSessionImpl = async (happySessionId, options) => {
|
|
8320
8575
|
try {
|
|
8321
8576
|
const prior = restartCounts.get(happySessionId) ?? 0;
|
|
8322
|
-
const decision = decideRestart(prior, DEFAULT_MAX_RESTARTS);
|
|
8577
|
+
const decision = options?.auto ? { allowed: true } : decideRestart(prior, DEFAULT_MAX_RESTARTS);
|
|
8323
8578
|
if (!decision.allowed) {
|
|
8324
8579
|
return { type: "error", errorMessage: `restart:${decision.reason}` };
|
|
8325
8580
|
}
|
|
@@ -8370,7 +8625,7 @@ async function startDaemon() {
|
|
|
8370
8625
|
if (model) args.push("--model", model);
|
|
8371
8626
|
const permissionMode = sanitizeSpawnPermissionMode(options?.permissionMode ?? (options?.keepPublishedPermissionMode ? publishedRelaunchPermissionMode(metadata) : void 0));
|
|
8372
8627
|
if (permissionMode) args.push("--permission-mode", permissionMode);
|
|
8373
|
-
restartCounts.set(happySessionId, recordRestartAttempt(prior));
|
|
8628
|
+
if (!options?.auto) restartCounts.set(happySessionId, recordRestartAttempt(prior));
|
|
8374
8629
|
const teamEnv = await teamRelaunchEnvFor(happySessionId, metadata);
|
|
8375
8630
|
const result = await spawnTrackedHappyProcess({
|
|
8376
8631
|
args,
|
|
@@ -8391,7 +8646,8 @@ async function startDaemon() {
|
|
|
8391
8646
|
HAPPY_RECONNECT_SEQ: String(tracked.encryption.seq),
|
|
8392
8647
|
HAPPY_RECONNECT_METADATA_VERSION: String(tracked.encryption.metadataVersion),
|
|
8393
8648
|
HAPPY_RECONNECT_AGENT_STATE_VERSION: String(tracked.encryption.agentStateVersion),
|
|
8394
|
-
...teamEnv
|
|
8649
|
+
...teamEnv,
|
|
8650
|
+
...options?.auto ? { [AUTO_RESTARTED_ENV]: encodeAutoRestarted(options.auto.kind, options.auto.target) } : {}
|
|
8395
8651
|
}
|
|
8396
8652
|
});
|
|
8397
8653
|
if (result.type === "success") {
|
|
@@ -8434,10 +8690,11 @@ async function startDaemon() {
|
|
|
8434
8690
|
};
|
|
8435
8691
|
const onChildExited = (pid) => {
|
|
8436
8692
|
const session = pidToTrackedSession.get(pid);
|
|
8437
|
-
if (session?.happySessionId && (session.spawnedBy === "teams" || teamWorker?.hasSession(session.happySessionId))) teamWorker?.report(session.happySessionId, "exited");
|
|
8693
|
+
if (session?.happySessionId && !autoRestartExits.has(session.happySessionId) && (session.spawnedBy === "teams" || teamWorker?.hasSession(session.happySessionId))) teamWorker?.report(session.happySessionId, "exited");
|
|
8438
8694
|
if (session?.happySessionId && automationRunner?.hasSession(session.happySessionId)) automationRunner.report(session.happySessionId, "exited");
|
|
8439
8695
|
if (session?.happySessionId) turnActivity.forget(session.happySessionId);
|
|
8440
8696
|
if (session?.happySessionId) backgroundTasks.forget(session.happySessionId);
|
|
8697
|
+
if (session?.happySessionId) autoRestart?.forget(session.happySessionId);
|
|
8441
8698
|
if (session?.happySessionId) peerCoordinator.forget(session.happySessionId);
|
|
8442
8699
|
if (session?.happySessionId && daemonHibernation.consumeExit(session.happySessionId)) {
|
|
8443
8700
|
const persisted2 = readPersistedSessions()[session.happySessionId];
|
|
@@ -8518,6 +8775,84 @@ async function startDaemon() {
|
|
|
8518
8775
|
})();
|
|
8519
8776
|
};
|
|
8520
8777
|
let apiMachineRef = null;
|
|
8778
|
+
let latestAgentVersions = null;
|
|
8779
|
+
const trackedFacts = (tracked) => {
|
|
8780
|
+
const metadata = tracked.happySessionMetadataFromLocalWebhook;
|
|
8781
|
+
return {
|
|
8782
|
+
live: isPidAlive(tracked.pid),
|
|
8783
|
+
wrapperVersion: metadata?.version ?? null,
|
|
8784
|
+
flavor: metadata?.flavor ?? "claude",
|
|
8785
|
+
capabilities: metadata?.capabilities ?? null,
|
|
8786
|
+
spawnedBy: tracked.spawnedBy ?? null,
|
|
8787
|
+
tags: metadata?.tags ?? null,
|
|
8788
|
+
variant: tracked.variant ?? metadata?.variant ?? null,
|
|
8789
|
+
// The wrapper's own word: tracked.startedBy turns into "persisted" /
|
|
8790
|
+
// "recovered" across the very daemon restart an upgrade does.
|
|
8791
|
+
startedBy: metadata?.startedBy ?? null
|
|
8792
|
+
};
|
|
8793
|
+
};
|
|
8794
|
+
const autoRestartScheduler = createAutoRestart({
|
|
8795
|
+
enabled: () => autoRestartSetting,
|
|
8796
|
+
quietMs: resolveQuietMs(),
|
|
8797
|
+
daemonVersion: packageJson.version,
|
|
8798
|
+
installedAgentVersion: (flavor) => flavor === "codex" ? latestAgentVersions?.agents.find((agent) => agent.id === "codex")?.installed ?? null : null,
|
|
8799
|
+
tracked: (sessionId, pid) => {
|
|
8800
|
+
const tracked = pidToTrackedSession.get(pid);
|
|
8801
|
+
if (!tracked || tracked.happySessionId !== sessionId) return null;
|
|
8802
|
+
return trackedFacts(tracked);
|
|
8803
|
+
},
|
|
8804
|
+
liveSessions: () => [...pidToTrackedSession.values()].filter((tracked) => tracked.happySessionId && tracked.happySessionMetadataFromLocalWebhook && isPidAlive(tracked.pid)).map((tracked) => ({ sessionId: tracked.happySessionId, ...trackedFacts(tracked) })),
|
|
8805
|
+
turnActive: (sessionId) => turnActivity.activeSessions().includes(sessionId),
|
|
8806
|
+
backgroundTasks: (sessionId) => backgroundTasks.count(sessionId),
|
|
8807
|
+
automationRunning: (sessionId) => automationRunner?.hasSession(sessionId) === true,
|
|
8808
|
+
// The local copy may predate the agent's conversation id (it is the spawn
|
|
8809
|
+
// webhook's); judge the server copy, exactly as restartSessionImpl will.
|
|
8810
|
+
resumable: async (sessionId) => {
|
|
8811
|
+
const tracked = findTrackedSessionById(sessionId);
|
|
8812
|
+
const local = tracked?.happySessionMetadataFromLocalWebhook;
|
|
8813
|
+
const encryption = tracked?.encryption;
|
|
8814
|
+
if (!local || !encryption) return false;
|
|
8815
|
+
const { metadata } = await resolveRelaunchMetadata(
|
|
8816
|
+
local,
|
|
8817
|
+
() => fetchServerSessionMetadata(sessionId, encryption.encryptionKey, encryption.encryptionVariant)
|
|
8818
|
+
);
|
|
8819
|
+
return resumePrecheck(metadata, {
|
|
8820
|
+
cwdExists: (p) => existsSync$1(p),
|
|
8821
|
+
conversationExists: (cwd, claudeSessionId) => locateClaudeConversation(cwd, claudeSessionId) !== null
|
|
8822
|
+
}).ok;
|
|
8823
|
+
},
|
|
8824
|
+
restart: async (sessionId, staleness) => {
|
|
8825
|
+
autoRestartExits.add(sessionId);
|
|
8826
|
+
try {
|
|
8827
|
+
const result = await restartSession(sessionId, { keepPublishedPermissionMode: true, auto: { kind: staleness.kind, target: staleness.target } });
|
|
8828
|
+
if (result.type !== "success") return { ok: false, error: result.type === "error" ? result.errorMessage : result.type };
|
|
8829
|
+
const after = findTrackedSessionById(sessionId)?.happySessionMetadataFromLocalWebhook?.version;
|
|
8830
|
+
if (staleness.kind === "cli" && after && (compareExactVersions(after, staleness.target) ?? 0) < 0) {
|
|
8831
|
+
return { ok: false, error: `still-behind: ${after}` };
|
|
8832
|
+
}
|
|
8833
|
+
return { ok: true };
|
|
8834
|
+
} finally {
|
|
8835
|
+
autoRestartExits.delete(sessionId);
|
|
8836
|
+
}
|
|
8837
|
+
},
|
|
8838
|
+
// Offline-failure retry guard: nobody restored, archived or resumed it meanwhile.
|
|
8839
|
+
serverSession: async (sessionId) => {
|
|
8840
|
+
const response = await axios.get(`${configuration.serverUrl}/v1/sessions/${encodeURIComponent(sessionId)}`, {
|
|
8841
|
+
headers: { Authorization: `Bearer ${credentials.token}` },
|
|
8842
|
+
timeout: 1e4
|
|
8843
|
+
});
|
|
8844
|
+
const row = response.data.session;
|
|
8845
|
+
if (!row || typeof row.active !== "boolean") return null;
|
|
8846
|
+
return { active: row.active, archived: row.archivedAt != null };
|
|
8847
|
+
},
|
|
8848
|
+
publish: (sessions) => {
|
|
8849
|
+
void apiMachineRef?.setAutoRestartSessions(sessions);
|
|
8850
|
+
},
|
|
8851
|
+
log: (message) => logger.debug(`[DAEMON RUN] ${message}`)
|
|
8852
|
+
});
|
|
8853
|
+
autoRestart = autoRestartScheduler;
|
|
8854
|
+
const autoRestartSweep = setInterval(() => autoRestartScheduler.sweep(), 6e4);
|
|
8855
|
+
autoRestartSweep.unref?.();
|
|
8521
8856
|
let mirrorManagerRef = null;
|
|
8522
8857
|
const controlToken = createDaemonControlToken();
|
|
8523
8858
|
const { port: controlPort, stop: stopControlServer } = await startDaemonControlServer({
|
|
@@ -8544,7 +8879,14 @@ async function startDaemon() {
|
|
|
8544
8879
|
onRateLimits: (report) => {
|
|
8545
8880
|
apiMachineRef?.reportRateLimits(report);
|
|
8546
8881
|
},
|
|
8547
|
-
|
|
8882
|
+
// B-852: the same idle check-in also decides an automatic restart of a
|
|
8883
|
+
// stale wrapper; hibernation (exit) wins when both say yes.
|
|
8884
|
+
onHibernateCheck: async (body) => {
|
|
8885
|
+
const reply = await daemonHibernation.check(body);
|
|
8886
|
+
if (reply.hibernate) return reply;
|
|
8887
|
+
const auto = await autoRestartScheduler.onCheckIn(body);
|
|
8888
|
+
return { ...reply, nextCheckMs: Math.min(reply.nextCheckMs ?? AUTO_RESTART_RECHECK_CAP_MS, AUTO_RESTART_RECHECK_CAP_MS, auto.nextCheckMs ?? Infinity) };
|
|
8889
|
+
},
|
|
8548
8890
|
listPeers: () => peerCoordinator.list(),
|
|
8549
8891
|
// B-505: `daemon list` shows which sessions have a turn in flight, so an
|
|
8550
8892
|
// operator can check the WHOLE machine before a supervised restart.
|
|
@@ -8696,6 +9038,13 @@ async function startDaemon() {
|
|
|
8696
9038
|
daemonHibernation.invalidateBindings();
|
|
8697
9039
|
return resolveIdleMs(agentHibernationSetting);
|
|
8698
9040
|
});
|
|
9041
|
+
apiMachine.setAutoRestartHandlers(autoRestartSetting, async (enabled) => {
|
|
9042
|
+
await updateSettings((current) => ({ ...current, autoRestartSessions: enabled }));
|
|
9043
|
+
autoRestartSetting = enabled;
|
|
9044
|
+
autoRestartScheduler.sweep();
|
|
9045
|
+
return autoRestartSetting;
|
|
9046
|
+
});
|
|
9047
|
+
setTimeout(() => autoRestartScheduler.sweep(), 5e3).unref?.();
|
|
8699
9048
|
const webPanelsSync = startWebPanelsSync({
|
|
8700
9049
|
statMtime: async () => (await fs.stat(configuration.settingsFile).catch(() => null))?.mtimeMs ?? null,
|
|
8701
9050
|
readRaw: async () => (await readSettings()).webPanels,
|
|
@@ -8786,7 +9135,10 @@ async function startDaemon() {
|
|
|
8786
9135
|
if (delay !== null) logger.warn(`[DAEMON RUN] CLI update policy announced; re-checking in ${Math.round(delay / 1e3)}s`);
|
|
8787
9136
|
});
|
|
8788
9137
|
const stopAgentVersionChecks = startAgentVersionChecks(
|
|
8789
|
-
(snapshot) =>
|
|
9138
|
+
(snapshot) => {
|
|
9139
|
+
latestAgentVersions = snapshot;
|
|
9140
|
+
return apiMachine.updateDaemonState((state) => ({ ...state, status: state?.status ?? "running", agentVersions: snapshot }));
|
|
9141
|
+
},
|
|
8790
9142
|
(error) => logger.debug("[DAEMON RUN] Agent version check failed", error)
|
|
8791
9143
|
);
|
|
8792
9144
|
harnessInstaller = createHarnessInstaller({
|
|
@@ -8968,6 +9320,7 @@ async function startDaemon() {
|
|
|
8968
9320
|
logger.debug("[DAEMON RUN] Health check interval cleared");
|
|
8969
9321
|
}
|
|
8970
9322
|
clearInterval(cliUpdateInterval);
|
|
9323
|
+
clearInterval(autoRestartSweep);
|
|
8971
9324
|
policyAnnouncements.stop();
|
|
8972
9325
|
stopAgentVersionChecks();
|
|
8973
9326
|
await apiMachine.updateDaemonState((state) => ({
|