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,27 +1,27 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var mirrorProtocol = require('./mirrorProtocol-
|
|
3
|
+
var mirrorProtocol = require('./mirrorProtocol-Dfl8Ahyf.cjs');
|
|
4
4
|
var fsMkdir = require('./fsMkdir-0K3yENml.cjs');
|
|
5
|
-
var piRunnerArgs = require('./piRunnerArgs-
|
|
5
|
+
var piRunnerArgs = require('./piRunnerArgs-BnFU0K73.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-DfPBa-9d.cjs');
|
|
13
|
+
var api = require('./api-BBxZ7y2z.cjs');
|
|
14
|
+
var spawnAgents = require('./spawnAgents-CtkkIFHd.cjs');
|
|
15
|
+
var logger = require('./logger-Ct2zvaq0.cjs');
|
|
16
|
+
var index$2 = require('./index-CmZusg8Q.cjs');
|
|
17
|
+
var auth = require('./auth-DnxoVkkf.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-9n7wd2dT.cjs');
|
|
20
|
+
var doctor = require('./doctor-BEU0_1Xv.cjs');
|
|
21
|
+
var spawnHappyCLI = require('./spawnHappyCLI-CF_gLi92.cjs');
|
|
22
|
+
var persistence = require('./persistence-A2NeERZJ.cjs');
|
|
23
|
+
var controlClient = require('./controlClient-C13_pSKG.cjs');
|
|
24
|
+
var sessionOps = require('./sessionOps-DXlTmS7J.cjs');
|
|
25
25
|
var fastify = require('fastify');
|
|
26
26
|
var z = require('zod');
|
|
27
27
|
var fastifyTypeProviderZod = require('fastify-type-provider-zod');
|
|
@@ -29,63 +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-B2Kx6L0S.cjs');
|
|
33
|
+
var peerTools = require('./peerTools-CElYh-5u.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-6ymeMVa4.cjs');
|
|
36
|
+
var bootstrap = require('./bootstrap-sly4qPPY.cjs');
|
|
37
|
+
var index$1 = require('./index-D3c7CLot.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-DDCVWb_x.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-Dj7oi2KO.cjs');
|
|
49
49
|
var webPanels = require('./webPanels-FCgFKvVe.cjs');
|
|
50
|
-
var index = require('./index-
|
|
50
|
+
var index = require('./index-CLUHaPU8.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-C5-C0t2a.cjs');
|
|
54
|
+
var sessionLock = require('./sessionLock-BmLA2S8K.cjs');
|
|
55
|
+
var client$1 = require('./client-BscskEBk.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-9Stpxe7p.cjs');
|
|
60
|
+
var sync = require('./sync-Ba8N6xba.cjs');
|
|
60
61
|
var types = require('./types-CRS-srZK.cjs');
|
|
61
62
|
var tmuxSocket = require('./tmuxSocket-D-Xt6Vn-.cjs');
|
|
62
|
-
var sessionLock = require('./sessionLock-DSqiP2lH.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
|
-
var template = require('./template-
|
|
66
|
+
var template = require('./template-B_5l6pkc.cjs');
|
|
67
67
|
var loginShellEnv = require('./loginShellEnv-BkuYtExZ.cjs');
|
|
68
|
-
require('./acpSessionResume-
|
|
69
|
-
require('./lidState-
|
|
68
|
+
require('./acpSessionResume-TvP_4Zq2.cjs');
|
|
69
|
+
require('./lidState-C9_DoF9i.cjs');
|
|
70
70
|
require('node:events');
|
|
71
71
|
require('socket.io-client');
|
|
72
|
-
require('./pushNotifications-
|
|
72
|
+
require('./pushNotifications-23YSd-0l.cjs');
|
|
73
73
|
require('./contentLogMetadata-ZSFk_NjQ.cjs');
|
|
74
74
|
require('./limits-C-a7gr04.cjs');
|
|
75
|
-
require('./time-
|
|
76
|
-
require('./registerCommonHandlers-
|
|
75
|
+
require('./time-Cy0a-7YX.cjs');
|
|
76
|
+
require('./registerCommonHandlers-D1MiSfcB.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-BTgZ9d4i.cjs');
|
|
84
84
|
require('open');
|
|
85
85
|
require('./specialCommands-J3JFOq0J.cjs');
|
|
86
86
|
require('./ids-B6ZC0HGt.cjs');
|
|
87
87
|
require('url');
|
|
88
|
-
require('./localHappyAgentAuth-
|
|
88
|
+
require('./localHappyAgentAuth-CCjUvOfi.cjs');
|
|
89
89
|
require('./processTreeSnapshot-mDbnuojn.cjs');
|
|
90
90
|
require('ps-list');
|
|
91
91
|
|
|
@@ -569,7 +569,8 @@ const WrapperIdleSnapshotSchema = z.z.object({
|
|
|
569
569
|
backgroundTasks: z.z.number().int().nonnegative(),
|
|
570
570
|
scheduledWakeups: z.z.number().int().nonnegative().optional(),
|
|
571
571
|
lastActivityAt: z.z.number(),
|
|
572
|
-
exiting: z.z.boolean().optional()
|
|
572
|
+
exiting: z.z.boolean().optional(),
|
|
573
|
+
agentVersion: z.z.string().max(64).optional()
|
|
573
574
|
}).passthrough();
|
|
574
575
|
const HibernateCheckBodySchema = z.z.object({
|
|
575
576
|
sessionId: z.z.string().min(1).max(200),
|
|
@@ -1537,6 +1538,7 @@ function summaryFromPersisted(id, persisted) {
|
|
|
1537
1538
|
...meta?.flavor ? { flavor: meta.flavor } : {},
|
|
1538
1539
|
...meta?.tags?.length ? { tags: [...meta.tags] } : {},
|
|
1539
1540
|
...meta?.variant ? { variant: meta.variant } : {},
|
|
1541
|
+
...sessionOps.lineageOf(meta),
|
|
1540
1542
|
...persisted?.savedAt !== void 0 ? { savedAt: persisted.savedAt } : {},
|
|
1541
1543
|
url: sessionOps.sessionWebUrl(id)
|
|
1542
1544
|
};
|
|
@@ -5295,6 +5297,253 @@ async function waitForSessionLive(sessionId, live, timeoutMs = AUTOMATION_WAKE_T
|
|
|
5295
5297
|
return true;
|
|
5296
5298
|
}
|
|
5297
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
|
+
|
|
5298
5547
|
const CLAUDE_AUTH_PROBE_INTERVAL_MS = 10 * 60 * 1e3;
|
|
5299
5548
|
const CLAUDE_AUTH_REFRESH_INTERVAL_MS = 30 * 60 * 1e3;
|
|
5300
5549
|
const PROBE_TIMEOUT_MS = 8e3;
|
|
@@ -6369,6 +6618,9 @@ async function removeTeamWorktree(resource) {
|
|
|
6369
6618
|
if (ownBranch) await git(repository, ["branch", "-D", branch]);
|
|
6370
6619
|
}
|
|
6371
6620
|
|
|
6621
|
+
function teamInitialModelMeta(model) {
|
|
6622
|
+
return model ? { model, modelIntent: model } : { modelIntent: index.MODEL_INTENT_CONFIG };
|
|
6623
|
+
}
|
|
6372
6624
|
function refusalCode(error) {
|
|
6373
6625
|
const code = axios.isAxiosError(error) ? error.response?.data?.error : void 0;
|
|
6374
6626
|
return typeof code === "string" && /^[a-z_]{1,64}$/.test(code) ? ` (${code})` : "";
|
|
@@ -6485,7 +6737,7 @@ function createTeamWorker(deps) {
|
|
|
6485
6737
|
return;
|
|
6486
6738
|
}
|
|
6487
6739
|
const key = await sessionOps.waitForSessionKey(receipt.sessionId, 1e4);
|
|
6488
|
-
await sessionOps.sendUserMessage(receipt.sessionId, key, teamInitialPrompt(op.prompt, bot?.root === true, receipt.directory), "teams", { localId: `teams-initial-${op.id}`, sentFrom: "team", ...op.model
|
|
6740
|
+
await sessionOps.sendUserMessage(receipt.sessionId, key, teamInitialPrompt(op.prompt, bot?.root === true, receipt.directory), "teams", { localId: `teams-initial-${op.id}`, sentFrom: "team", ...teamInitialModelMeta(op.model) });
|
|
6489
6741
|
receipt = { ...receipt, phase: "delivered" };
|
|
6490
6742
|
writeReceipt$1(home, receipt);
|
|
6491
6743
|
}
|
|
@@ -7429,6 +7681,7 @@ async function startDaemon() {
|
|
|
7429
7681
|
let lastHandoverHold = null;
|
|
7430
7682
|
let claudeCredentialStoreSetting = (await persistence.readSettings()).claudeCredentialStore === "file" ? "file" : "auto";
|
|
7431
7683
|
let agentHibernationSetting = (await persistence.readSettings()).agentHibernationIdleMs;
|
|
7684
|
+
let autoRestartSetting = (await persistence.readSettings()).autoRestartSessions !== false;
|
|
7432
7685
|
try {
|
|
7433
7686
|
const homes = await index$1.refreshAgentHomes();
|
|
7434
7687
|
logger.logger.debug(`[DAEMON RUN] Claude config dir: ${loginShellEnv.describeAgentHome(homes.claudeConfigDir)}; Codex home: ${loginShellEnv.describeAgentHome(homes.codexHome)}`);
|
|
@@ -7551,6 +7804,7 @@ async function startDaemon() {
|
|
|
7551
7804
|
});
|
|
7552
7805
|
const sessionIdToFinishedSession = /* @__PURE__ */ new Map();
|
|
7553
7806
|
let teamWorker;
|
|
7807
|
+
let autoRestart;
|
|
7554
7808
|
let automationRunner;
|
|
7555
7809
|
let projectPresence;
|
|
7556
7810
|
const persisted = persistence.readPersistedSessions();
|
|
@@ -8291,6 +8545,7 @@ async function startDaemon() {
|
|
|
8291
8545
|
}
|
|
8292
8546
|
};
|
|
8293
8547
|
const restartCounts = /* @__PURE__ */ new Map();
|
|
8548
|
+
const autoRestartExits = /* @__PURE__ */ new Set();
|
|
8294
8549
|
const stopSessionAndWait = async (happySessionId, timeoutMs = 8e3) => {
|
|
8295
8550
|
const targets = /* @__PURE__ */ new Set();
|
|
8296
8551
|
for (const [pid, s] of pidToTrackedSession.entries()) {
|
|
@@ -8340,7 +8595,7 @@ async function startDaemon() {
|
|
|
8340
8595
|
const restartSessionImpl = async (happySessionId, options) => {
|
|
8341
8596
|
try {
|
|
8342
8597
|
const prior = restartCounts.get(happySessionId) ?? 0;
|
|
8343
|
-
const decision = decideRestart(prior, DEFAULT_MAX_RESTARTS);
|
|
8598
|
+
const decision = options?.auto ? { allowed: true } : decideRestart(prior, DEFAULT_MAX_RESTARTS);
|
|
8344
8599
|
if (!decision.allowed) {
|
|
8345
8600
|
return { type: "error", errorMessage: `restart:${decision.reason}` };
|
|
8346
8601
|
}
|
|
@@ -8391,7 +8646,7 @@ async function startDaemon() {
|
|
|
8391
8646
|
if (model) args.push("--model", model);
|
|
8392
8647
|
const permissionMode = spawnAgents.sanitizeSpawnPermissionMode(options?.permissionMode ?? (options?.keepPublishedPermissionMode ? publishedRelaunchPermissionMode(metadata) : void 0));
|
|
8393
8648
|
if (permissionMode) args.push("--permission-mode", permissionMode);
|
|
8394
|
-
restartCounts.set(happySessionId, recordRestartAttempt(prior));
|
|
8649
|
+
if (!options?.auto) restartCounts.set(happySessionId, recordRestartAttempt(prior));
|
|
8395
8650
|
const teamEnv = await teamRelaunchEnvFor(happySessionId, metadata);
|
|
8396
8651
|
const result = await spawnTrackedHappyProcess({
|
|
8397
8652
|
args,
|
|
@@ -8412,7 +8667,8 @@ async function startDaemon() {
|
|
|
8412
8667
|
HAPPY_RECONNECT_SEQ: String(tracked.encryption.seq),
|
|
8413
8668
|
HAPPY_RECONNECT_METADATA_VERSION: String(tracked.encryption.metadataVersion),
|
|
8414
8669
|
HAPPY_RECONNECT_AGENT_STATE_VERSION: String(tracked.encryption.agentStateVersion),
|
|
8415
|
-
...teamEnv
|
|
8670
|
+
...teamEnv,
|
|
8671
|
+
...options?.auto ? { [sessionLock.AUTO_RESTARTED_ENV]: sessionLock.encodeAutoRestarted(options.auto.kind, options.auto.target) } : {}
|
|
8416
8672
|
}
|
|
8417
8673
|
});
|
|
8418
8674
|
if (result.type === "success") {
|
|
@@ -8455,10 +8711,11 @@ async function startDaemon() {
|
|
|
8455
8711
|
};
|
|
8456
8712
|
const onChildExited = (pid) => {
|
|
8457
8713
|
const session = pidToTrackedSession.get(pid);
|
|
8458
|
-
if (session?.happySessionId && (session.spawnedBy === "teams" || teamWorker?.hasSession(session.happySessionId))) teamWorker?.report(session.happySessionId, "exited");
|
|
8714
|
+
if (session?.happySessionId && !autoRestartExits.has(session.happySessionId) && (session.spawnedBy === "teams" || teamWorker?.hasSession(session.happySessionId))) teamWorker?.report(session.happySessionId, "exited");
|
|
8459
8715
|
if (session?.happySessionId && automationRunner?.hasSession(session.happySessionId)) automationRunner.report(session.happySessionId, "exited");
|
|
8460
8716
|
if (session?.happySessionId) turnActivity.forget(session.happySessionId);
|
|
8461
8717
|
if (session?.happySessionId) backgroundTasks.forget(session.happySessionId);
|
|
8718
|
+
if (session?.happySessionId) autoRestart?.forget(session.happySessionId);
|
|
8462
8719
|
if (session?.happySessionId) peerCoordinator.forget(session.happySessionId);
|
|
8463
8720
|
if (session?.happySessionId && daemonHibernation.consumeExit(session.happySessionId)) {
|
|
8464
8721
|
const persisted2 = persistence.readPersistedSessions()[session.happySessionId];
|
|
@@ -8539,6 +8796,84 @@ async function startDaemon() {
|
|
|
8539
8796
|
})();
|
|
8540
8797
|
};
|
|
8541
8798
|
let apiMachineRef = null;
|
|
8799
|
+
let latestAgentVersions = null;
|
|
8800
|
+
const trackedFacts = (tracked) => {
|
|
8801
|
+
const metadata = tracked.happySessionMetadataFromLocalWebhook;
|
|
8802
|
+
return {
|
|
8803
|
+
live: isPidAlive(tracked.pid),
|
|
8804
|
+
wrapperVersion: metadata?.version ?? null,
|
|
8805
|
+
flavor: metadata?.flavor ?? "claude",
|
|
8806
|
+
capabilities: metadata?.capabilities ?? null,
|
|
8807
|
+
spawnedBy: tracked.spawnedBy ?? null,
|
|
8808
|
+
tags: metadata?.tags ?? null,
|
|
8809
|
+
variant: tracked.variant ?? metadata?.variant ?? null,
|
|
8810
|
+
// The wrapper's own word: tracked.startedBy turns into "persisted" /
|
|
8811
|
+
// "recovered" across the very daemon restart an upgrade does.
|
|
8812
|
+
startedBy: metadata?.startedBy ?? null
|
|
8813
|
+
};
|
|
8814
|
+
};
|
|
8815
|
+
const autoRestartScheduler = createAutoRestart({
|
|
8816
|
+
enabled: () => autoRestartSetting,
|
|
8817
|
+
quietMs: sessionLock.resolveQuietMs(),
|
|
8818
|
+
daemonVersion: _package.packageJson.version,
|
|
8819
|
+
installedAgentVersion: (flavor) => flavor === "codex" ? latestAgentVersions?.agents.find((agent) => agent.id === "codex")?.installed ?? null : null,
|
|
8820
|
+
tracked: (sessionId, pid) => {
|
|
8821
|
+
const tracked = pidToTrackedSession.get(pid);
|
|
8822
|
+
if (!tracked || tracked.happySessionId !== sessionId) return null;
|
|
8823
|
+
return trackedFacts(tracked);
|
|
8824
|
+
},
|
|
8825
|
+
liveSessions: () => [...pidToTrackedSession.values()].filter((tracked) => tracked.happySessionId && tracked.happySessionMetadataFromLocalWebhook && isPidAlive(tracked.pid)).map((tracked) => ({ sessionId: tracked.happySessionId, ...trackedFacts(tracked) })),
|
|
8826
|
+
turnActive: (sessionId) => turnActivity.activeSessions().includes(sessionId),
|
|
8827
|
+
backgroundTasks: (sessionId) => backgroundTasks.count(sessionId),
|
|
8828
|
+
automationRunning: (sessionId) => automationRunner?.hasSession(sessionId) === true,
|
|
8829
|
+
// The local copy may predate the agent's conversation id (it is the spawn
|
|
8830
|
+
// webhook's); judge the server copy, exactly as restartSessionImpl will.
|
|
8831
|
+
resumable: async (sessionId) => {
|
|
8832
|
+
const tracked = findTrackedSessionById(sessionId);
|
|
8833
|
+
const local = tracked?.happySessionMetadataFromLocalWebhook;
|
|
8834
|
+
const encryption = tracked?.encryption;
|
|
8835
|
+
if (!local || !encryption) return false;
|
|
8836
|
+
const { metadata } = await resolveRelaunchMetadata(
|
|
8837
|
+
local,
|
|
8838
|
+
() => fetchServerSessionMetadata(sessionId, encryption.encryptionKey, encryption.encryptionVariant)
|
|
8839
|
+
);
|
|
8840
|
+
return resumePrecheck(metadata, {
|
|
8841
|
+
cwdExists: (p) => require$$0.existsSync(p),
|
|
8842
|
+
conversationExists: (cwd, claudeSessionId) => index$1.locateClaudeConversation(cwd, claudeSessionId) !== null
|
|
8843
|
+
}).ok;
|
|
8844
|
+
},
|
|
8845
|
+
restart: async (sessionId, staleness) => {
|
|
8846
|
+
autoRestartExits.add(sessionId);
|
|
8847
|
+
try {
|
|
8848
|
+
const result = await restartSession(sessionId, { keepPublishedPermissionMode: true, auto: { kind: staleness.kind, target: staleness.target } });
|
|
8849
|
+
if (result.type !== "success") return { ok: false, error: result.type === "error" ? result.errorMessage : result.type };
|
|
8850
|
+
const after = findTrackedSessionById(sessionId)?.happySessionMetadataFromLocalWebhook?.version;
|
|
8851
|
+
if (staleness.kind === "cli" && after && (cliUpdate.compareExactVersions(after, staleness.target) ?? 0) < 0) {
|
|
8852
|
+
return { ok: false, error: `still-behind: ${after}` };
|
|
8853
|
+
}
|
|
8854
|
+
return { ok: true };
|
|
8855
|
+
} finally {
|
|
8856
|
+
autoRestartExits.delete(sessionId);
|
|
8857
|
+
}
|
|
8858
|
+
},
|
|
8859
|
+
// Offline-failure retry guard: nobody restored, archived or resumed it meanwhile.
|
|
8860
|
+
serverSession: async (sessionId) => {
|
|
8861
|
+
const response = await axios.get(`${configuration.configuration.serverUrl}/v1/sessions/${encodeURIComponent(sessionId)}`, {
|
|
8862
|
+
headers: { Authorization: `Bearer ${credentials.token}` },
|
|
8863
|
+
timeout: 1e4
|
|
8864
|
+
});
|
|
8865
|
+
const row = response.data.session;
|
|
8866
|
+
if (!row || typeof row.active !== "boolean") return null;
|
|
8867
|
+
return { active: row.active, archived: row.archivedAt != null };
|
|
8868
|
+
},
|
|
8869
|
+
publish: (sessions) => {
|
|
8870
|
+
void apiMachineRef?.setAutoRestartSessions(sessions);
|
|
8871
|
+
},
|
|
8872
|
+
log: (message) => logger.logger.debug(`[DAEMON RUN] ${message}`)
|
|
8873
|
+
});
|
|
8874
|
+
autoRestart = autoRestartScheduler;
|
|
8875
|
+
const autoRestartSweep = setInterval(() => autoRestartScheduler.sweep(), 6e4);
|
|
8876
|
+
autoRestartSweep.unref?.();
|
|
8542
8877
|
let mirrorManagerRef = null;
|
|
8543
8878
|
const controlToken = createDaemonControlToken();
|
|
8544
8879
|
const { port: controlPort, stop: stopControlServer } = await startDaemonControlServer({
|
|
@@ -8565,7 +8900,14 @@ async function startDaemon() {
|
|
|
8565
8900
|
onRateLimits: (report) => {
|
|
8566
8901
|
apiMachineRef?.reportRateLimits(report);
|
|
8567
8902
|
},
|
|
8568
|
-
|
|
8903
|
+
// B-852: the same idle check-in also decides an automatic restart of a
|
|
8904
|
+
// stale wrapper; hibernation (exit) wins when both say yes.
|
|
8905
|
+
onHibernateCheck: async (body) => {
|
|
8906
|
+
const reply = await daemonHibernation.check(body);
|
|
8907
|
+
if (reply.hibernate) return reply;
|
|
8908
|
+
const auto = await autoRestartScheduler.onCheckIn(body);
|
|
8909
|
+
return { ...reply, nextCheckMs: Math.min(reply.nextCheckMs ?? sessionLock.AUTO_RESTART_RECHECK_CAP_MS, sessionLock.AUTO_RESTART_RECHECK_CAP_MS, auto.nextCheckMs ?? Infinity) };
|
|
8910
|
+
},
|
|
8569
8911
|
listPeers: () => peerCoordinator.list(),
|
|
8570
8912
|
// B-505: `daemon list` shows which sessions have a turn in flight, so an
|
|
8571
8913
|
// operator can check the WHOLE machine before a supervised restart.
|
|
@@ -8717,6 +9059,13 @@ async function startDaemon() {
|
|
|
8717
9059
|
daemonHibernation.invalidateBindings();
|
|
8718
9060
|
return persistence.resolveIdleMs(agentHibernationSetting);
|
|
8719
9061
|
});
|
|
9062
|
+
apiMachine.setAutoRestartHandlers(autoRestartSetting, async (enabled) => {
|
|
9063
|
+
await persistence.updateSettings((current) => ({ ...current, autoRestartSessions: enabled }));
|
|
9064
|
+
autoRestartSetting = enabled;
|
|
9065
|
+
autoRestartScheduler.sweep();
|
|
9066
|
+
return autoRestartSetting;
|
|
9067
|
+
});
|
|
9068
|
+
setTimeout(() => autoRestartScheduler.sweep(), 5e3).unref?.();
|
|
8720
9069
|
const webPanelsSync = startWebPanelsSync({
|
|
8721
9070
|
statMtime: async () => (await fs.stat(configuration.configuration.settingsFile).catch(() => null))?.mtimeMs ?? null,
|
|
8722
9071
|
readRaw: async () => (await persistence.readSettings()).webPanels,
|
|
@@ -8807,7 +9156,10 @@ async function startDaemon() {
|
|
|
8807
9156
|
if (delay !== null) logger.logger.warn(`[DAEMON RUN] CLI update policy announced; re-checking in ${Math.round(delay / 1e3)}s`);
|
|
8808
9157
|
});
|
|
8809
9158
|
const stopAgentVersionChecks = mirrorProtocol.startAgentVersionChecks(
|
|
8810
|
-
(snapshot) =>
|
|
9159
|
+
(snapshot) => {
|
|
9160
|
+
latestAgentVersions = snapshot;
|
|
9161
|
+
return apiMachine.updateDaemonState((state) => ({ ...state, status: state?.status ?? "running", agentVersions: snapshot }));
|
|
9162
|
+
},
|
|
8811
9163
|
(error) => logger.logger.debug("[DAEMON RUN] Agent version check failed", error)
|
|
8812
9164
|
);
|
|
8813
9165
|
harnessInstaller = createHarnessInstaller({
|
|
@@ -8989,6 +9341,7 @@ async function startDaemon() {
|
|
|
8989
9341
|
logger.logger.debug("[DAEMON RUN] Health check interval cleared");
|
|
8990
9342
|
}
|
|
8991
9343
|
clearInterval(cliUpdateInterval);
|
|
9344
|
+
clearInterval(autoRestartSweep);
|
|
8992
9345
|
policyAnnouncements.stop();
|
|
8993
9346
|
stopAgentVersionChecks();
|
|
8994
9347
|
await apiMachine.updateDaemonState((state) => ({
|