very-happy-cli 0.2.166 → 0.2.167
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-20VHOXwb.cjs → AcpBackend-D1IKJGz_.cjs} +3 -3
- package/dist/{AcpBackend-tRWk7yi7.mjs → AcpBackend-kFZlee5E.mjs} +3 -3
- package/dist/{BasePermissionHandler-COKc4pmt.cjs → BasePermissionHandler-DHxYAK5L.cjs} +1 -1
- package/dist/{BasePermissionHandler-CDCLIrZJ.mjs → BasePermissionHandler-DS0kRTNI.mjs} +1 -1
- package/dist/{BaseReasoningProcessor-BDVKvooR.mjs → BaseReasoningProcessor-BRtCCt7q.mjs} +1 -1
- package/dist/{BaseReasoningProcessor-DAGQdkNp.cjs → BaseReasoningProcessor-CsjVdt_H.cjs} +1 -1
- package/dist/{agentHome-2IbIjKCa.mjs → agentHome-Ct-VXFeG.mjs} +4 -4
- package/dist/{agentHome-KVWj6nCl.cjs → agentHome-DeAWzhSe.cjs} +4 -4
- package/dist/{api-DnNL5fLw.cjs → api-BZYLRDM9.cjs} +88 -10
- package/dist/{api-Cmz3XS4P.mjs → api-CReZazeT.mjs} +88 -10
- package/dist/{apiMachine-DeoQ8QbZ.cjs → apiMachine-BgMxGPsR.cjs} +50 -15
- package/dist/{apiMachine-B6ySCFe0.mjs → apiMachine-CWndf1Vn.mjs} +50 -15
- package/dist/{attachmentContent-DPWxHgX4.cjs → attachmentContent-HcJqFQW8.cjs} +2 -2
- package/dist/{attachmentContent-CTXapi-_.mjs → attachmentContent-j875mwU7.mjs} +2 -2
- package/dist/{attachmentLimits-BfgKV5iE.cjs → attachmentLimits-BEYEEBm8.cjs} +13 -1
- package/dist/{attachmentLimits-C1PCCM79.mjs → attachmentLimits-CxG3T18E.mjs} +13 -1
- package/dist/{auth-BMaBjRAj.mjs → auth-BIHuc7vY.mjs} +10 -10
- package/dist/{auth-pzWIFdOD.mjs → auth-CFS9Lfgv.mjs} +5 -5
- package/dist/{auth-D4-eQz85.cjs → auth-Myr2Q42x.cjs} +10 -10
- package/dist/{auth-ietHtvwu.cjs → auth-VzWpbo5P.cjs} +5 -5
- package/dist/{auto-DOWTQDPa.cjs → auto-Bf6Dr7_o.cjs} +14 -14
- package/dist/{auto-DL75Dx3I.mjs → auto-Df9-zmuN.mjs} +14 -14
- package/dist/{bootstrap-XE8A7Ut2.mjs → bootstrap-BSOxYpaP.mjs} +2 -2
- package/dist/{bootstrap-BpXIc2wn.cjs → bootstrap-Dj8WBiR2.cjs} +2 -2
- package/dist/{browser-DDFi1T8C.mjs → browser-BCFIHOvo.mjs} +1 -1
- package/dist/{browser-CcG8GLRV.cjs → browser-BoCV40yC.cjs} +1 -1
- package/dist/{claudeLocal-DXBXwIOG.cjs → claudeLocal-CGsq7Kul.cjs} +5 -5
- package/dist/{claudeLocal-DmM5Oyhv.mjs → claudeLocal-D5-eA9SC.mjs} +5 -5
- package/dist/{claudeLocalLauncher-Cs4eUC3P.mjs → claudeLocalLauncher-C9Cc438l.mjs} +10 -10
- package/dist/{claudeLocalLauncher-C41Y6Kp4.cjs → claudeLocalLauncher-Cf9QeYDT.cjs} +10 -10
- package/dist/{claudeSessionFork-Cs0I3eGI.cjs → claudeSessionFork-Byd8zD1U.cjs} +1 -1
- package/dist/{claudeSessionFork-BdLnc2Hv.mjs → claudeSessionFork-CMzAva8G.mjs} +1 -1
- package/dist/{client-JISJx2f-.cjs → client-BKnKRLSt.cjs} +3 -3
- package/dist/{client-GjTnsq6F.mjs → client-C7FYMer0.mjs} +2 -2
- package/dist/{client-DJ0kX_8M.cjs → client-D0T5-6Ds.cjs} +2 -2
- package/dist/{client-CbK33y_s.mjs → client-Dsfy_SAb.mjs} +3 -3
- package/dist/codex/happyMcpStdioBridge.cjs +14 -14
- package/dist/codex/happyMcpStdioBridge.mjs +14 -14
- package/dist/{codexAppServerClient-CldXEojt.mjs → codexAppServerClient-Dd_4TxHv.mjs} +4 -4
- package/dist/{codexAppServerClient-BTjn2ZCZ.cjs → codexAppServerClient-TiW9OBk4.cjs} +4 -4
- package/dist/{codexCommand-DjMU-Ijf.mjs → codexCommand-BZSr4MKI.mjs} +137 -56
- package/dist/{codexCommand-BpD0N1F7.cjs → codexCommand-Bxryqh90.cjs} +137 -56
- package/dist/{config-DjSJKatx.mjs → config-C_Pj7yxV.mjs} +3 -3
- package/dist/{config-DuLL0Ppe.cjs → config-DXPash-r.cjs} +3 -3
- package/dist/{configuration-B0cb3xA3.cjs → configuration-C3piBtxY.cjs} +1 -1
- package/dist/{configuration-D2v3puap.mjs → configuration-WspKd2C2.mjs} +2 -2
- package/dist/{connect-B7JWEzyg.cjs → connect-BN-IBElA.cjs} +13 -13
- package/dist/{connect-CnNNyM9I.mjs → connect-DGPZs5px.mjs} +13 -13
- package/dist/{context-DjfqLWzE.mjs → context-Cr6a3NTg.mjs} +1 -1
- package/dist/{context-BFUpYT39.cjs → context-Jrq4-eCZ.cjs} +1 -1
- package/dist/{controlClient-CmnHGcyl.cjs → controlClient-BI6Fw3fQ.cjs} +18 -3
- package/dist/{controlClient-BMUJfUeF.mjs → controlClient-DTheOlvC.mjs} +18 -4
- package/dist/{createSessionMetadata-DU0bCg2m.mjs → createSessionMetadata-BEZ4DIDA.mjs} +57 -5
- package/dist/{createSessionMetadata-DbfRBhRu.cjs → createSessionMetadata-zQSz3hgk.cjs} +56 -3
- package/dist/defaultPermissionMode-Cif_RHGb.mjs +191 -0
- package/dist/defaultPermissionMode-DNKNzk7l.cjs +197 -0
- package/dist/{deterministicJson-D-WPUrZb.mjs → deterministicJson-BMMifViN.mjs} +8 -8
- package/dist/{deterministicJson-Dp3TVyap.cjs → deterministicJson-C7O2ulKY.cjs} +8 -8
- package/dist/{doctor-CkJmdPbi.cjs → doctor-BykBaMTr.cjs} +6 -6
- package/dist/{doctor-BlXXyQ1L.mjs → doctor-D1KKyPzB.mjs} +6 -6
- package/dist/{downloadTarget-CiQqRIc-.cjs → downloadTarget-CWTb2-EM.cjs} +6 -6
- package/dist/{downloadTarget-DjSwMHun.mjs → downloadTarget-Cp48jrIP.mjs} +6 -6
- package/dist/{ensureDaemonRunning-CAQag1zE.mjs → ensureDaemonRunning-Ba5fYoxb.mjs} +5 -5
- package/dist/{ensureDaemonRunning-C_aIOhgG.cjs → ensureDaemonRunning-CCxX7MoP.cjs} +5 -5
- package/dist/{handleResumeCommand-Ci7wacT-.mjs → handleResumeCommand-BTUGlNjB.mjs} +5 -5
- package/dist/{handleResumeCommand-6KzBGDnl.cjs → handleResumeCommand-yPdDQHqz.cjs} +5 -5
- package/dist/{index-CaFCAlX8.cjs → index-BjhKqDa0.cjs} +3 -3
- package/dist/{index-HQsigW_J.mjs → index-C3_83bqS.mjs} +3 -3
- package/dist/{index-WGCT6SSV.mjs → index-CE2GgPbr.mjs} +34 -34
- package/dist/{index-DQplgo0W.mjs → index-D8m8Ripb.mjs} +4 -4
- package/dist/{index-DBmNwMX9.cjs → index-DifM62wX.cjs} +33 -33
- package/dist/{index-DEKIgZUo.cjs → index-PNMQPKhz.cjs} +4 -4
- package/dist/index.cjs +2 -2
- package/dist/index.mjs +2 -2
- package/dist/{install-oJUvsFu9.mjs → install-C0-QFn9s.mjs} +3 -3
- package/dist/{install-CejEiRGW.cjs → install-CqZVeze8.cjs} +3 -3
- package/dist/lib.cjs +11 -11
- package/dist/lib.d.cts +61 -0
- package/dist/lib.d.mts +61 -0
- package/dist/lib.mjs +11 -11
- package/dist/{lidState-BfximpjX.mjs → lidState-B2ZxdREe.mjs} +1 -1
- package/dist/{lidState-D8BmnJV1.cjs → lidState-Bc2K9H9l.cjs} +1 -1
- package/dist/{localHappyAgentAuth-Ct1aXwqd.mjs → localHappyAgentAuth-B5XPEMwk.mjs} +1 -1
- package/dist/{localHappyAgentAuth-d7B6S_o7.cjs → localHappyAgentAuth-T5GOvRha.cjs} +1 -1
- package/dist/{logger-JTcJU-uL.cjs → logger-B_MWPbZz.cjs} +2 -2
- package/dist/{logger-BpQcwNnt.mjs → logger-CbBv3q_b.mjs} +2 -2
- package/dist/{machineMetadata-BBg_Njw3.cjs → machineMetadata-BafS4JY8.cjs} +4 -3
- package/dist/{machineMetadata-CBdxABeI.mjs → machineMetadata-DHg238U4.mjs} +4 -3
- package/dist/{main-C16fOGgn.cjs → main-DNrA0qBy.cjs} +45 -45
- package/dist/{main-B5b1gA3K.mjs → main-DXAK0n7x.mjs} +45 -45
- package/dist/{manager-BQ4flvQZ.mjs → manager-BEsI4qt3.mjs} +9 -3
- package/dist/{manager-Cly8xVIR.cjs → manager-HrEj442o.cjs} +8 -2
- package/dist/{mcp-BnNiBBax.cjs → mcp-AvPOhDXy.cjs} +14 -14
- package/dist/{mcp-DGNWgVdv.mjs → mcp-BotAjCdD.mjs} +14 -14
- package/dist/mirrorProtocol-BdcN6QlN.cjs +1270 -0
- package/dist/mirrorProtocol-BwHm8odn.mjs +1247 -0
- package/dist/{package-C1XvUQFy.cjs → package-C9ZP9bpX.cjs} +7 -7
- package/dist/{package-BqwrPxL0.mjs → package-DU1DxhH9.mjs} +7 -7
- package/dist/{peerTools-DPvbcs8V.cjs → peerTools-Dkbu7gag.cjs} +4 -4
- package/dist/{peerTools-CeCe-3lk.mjs → peerTools-os2DVjA0.mjs} +4 -4
- package/dist/{persistence-2Xp_o6x6.cjs → persistence-BYGl0QYw.cjs} +147 -25
- package/dist/{persistence-B9LmhAE2.mjs → persistence-ON0zpHfb.mjs} +123 -12
- package/dist/{piRunnerArgs-7FaTyNOq.mjs → piRunnerArgs-CYsnT9sV.mjs} +1 -1
- package/dist/{piRunnerArgs-DI29dDNo.cjs → piRunnerArgs-DpbvstUX.cjs} +1 -1
- package/dist/{piRuntime-R8XVChxK.cjs → piRuntime-CDnILlCd.cjs} +1 -1
- package/dist/{piRuntime-0qEK5AqE.mjs → piRuntime-CmEid-wu.mjs} +1 -1
- package/dist/{piTerminal-zcQKc8Sp.mjs → piTerminal-0eNlXSlL.mjs} +16 -16
- package/dist/{piTerminal-Ccj0KNPr.cjs → piTerminal-B57TgMON.cjs} +16 -16
- package/dist/{rateLimitWindows-C2Jk3Ih7.cjs → rateLimitWindows-CusGIqlq.cjs} +1 -1
- package/dist/{rateLimitWindows-Dhfhbtqu.mjs → rateLimitWindows-vZ9Bo7aT.mjs} +1 -1
- package/dist/{registerCommonHandlers-DdfGsFbM.mjs → registerCommonHandlers-B0PVff2U.mjs} +2 -2
- package/dist/{registerCommonHandlers-Aha_KfM3.cjs → registerCommonHandlers-DVYB3iVn.cjs} +2 -2
- package/dist/{registerKillSessionHandler-DboQlGcH.mjs → registerKillSessionHandler-BJMHJHXe.mjs} +14 -9
- package/dist/{registerKillSessionHandler-CjitOpUA.cjs → registerKillSessionHandler-BwXGKtg_.cjs} +14 -9
- package/dist/{remoteSessionClient-B2DtWuNP.mjs → remoteSessionClient-BzPXSC21.mjs} +5 -5
- package/dist/{remoteSessionClient-BwI8rpQw.cjs → remoteSessionClient-PyUAIhwK.cjs} +5 -5
- package/dist/{reportProgressTool-DnAD8wOa.mjs → reportProgressTool-BvB13EwC.mjs} +1 -1
- package/dist/{reportProgressTool-B-Rcy0s3.cjs → reportProgressTool-D4KB_4cP.cjs} +1 -1
- package/dist/{run-Bh66Xs40.cjs → run-BC8jzq_h.cjs} +323 -37
- package/dist/{run-DPEwJpQR.mjs → run-O2M8LsWf.mjs} +322 -36
- package/dist/{runClaude-C-lJdAKD.cjs → runClaude-C7jPa8VP.cjs} +87 -25
- package/dist/{runClaude-DLr_nBzw.mjs → runClaude-DGkr5E7s.mjs} +87 -25
- package/dist/{runClaudeDeps-vWWLod7J.cjs → runClaudeDeps-5kzncqME.cjs} +100 -31
- package/dist/{runClaudeDeps-C7JV7nXG.mjs → runClaudeDeps-CX_TxS78.mjs} +105 -36
- package/dist/{runGemini-o-CUSayc.cjs → runGemini-BfYA4Uqc.cjs} +32 -32
- package/dist/{runGemini-tH6sLw-G.mjs → runGemini-CwmGBH3L.mjs} +32 -32
- package/dist/{runOpenClaw-C5DZvVhn.mjs → runOpenClaw-BYAPYFyL.mjs} +16 -16
- package/dist/{runOpenClaw-D24f35l0.cjs → runOpenClaw-C72jut7v.cjs} +16 -16
- package/dist/{sandbox-TJZJ6ngw.cjs → sandbox-Bqkp8IT7.cjs} +4 -4
- package/dist/{sandbox-BaL1aslA.mjs → sandbox-DlVnK1Vi.mjs} +4 -4
- package/dist/{selfCheck-Dugi0Nk_.cjs → selfCheck-B4lLZplk.cjs} +34 -34
- package/dist/selfCheck-DYTGBdIO.mjs +84 -0
- package/dist/{send-DDcJ3ayi.mjs → send-B5bWW9Tl.mjs} +8 -8
- package/dist/{send-CkWOSYmU.cjs → send-BCwS6n_s.cjs} +8 -8
- package/dist/{server-CUjRvQSd.mjs → server-CEJfRQfj.mjs} +4 -4
- package/dist/{server-7qFQ8J2u.cjs → server-CFWZehnC.cjs} +6 -6
- package/dist/{sessionLock-DqVyHFAQ.mjs → sessionLock-AwOYsKT7.mjs} +12 -4
- package/dist/{sessionLock-DfhNICyS.cjs → sessionLock-LBWNjpHf.cjs} +12 -3
- package/dist/{sessionModeFile-CIznKD7O.cjs → sessionModeFile-CyPuZRIU.cjs} +1 -1
- package/dist/{sessionModeFile-M4OpiyrF.mjs → sessionModeFile-fvFn1JVG.mjs} +1 -1
- package/dist/{sessionOps-BnaEaOKs.mjs → sessionOps-DZRH4-hV.mjs} +4 -4
- package/dist/{sessionOps-DOyy4gkY.cjs → sessionOps-DzbZI3Eq.cjs} +4 -4
- package/dist/{sessionScanner-CcuOn9uU.mjs → sessionScanner-Q_Ei2flB.mjs} +3 -3
- package/dist/{sessionScanner-Cu1yKlj4.cjs → sessionScanner-i-cgwFVw.cjs} +3 -3
- package/dist/{sessions-C9O91rL1.mjs → sessions-DAmjMAZN.mjs} +9 -9
- package/dist/{sessions-BQgk5Kw8.cjs → sessions-DYK5hD4T.cjs} +9 -9
- package/dist/{setupOfflineReconnection-Byy8aeKT.mjs → setupOfflineReconnection-BfDBxNdo.mjs} +2 -2
- package/dist/{setupOfflineReconnection-DFmQ8s6I.cjs → setupOfflineReconnection-C2LO3hSP.cjs} +2 -2
- package/dist/{spawn-EZ2yrtWd.mjs → spawn-BmjG5j5Y.mjs} +13 -13
- package/dist/{spawn-BS7LPmSm.cjs → spawn-GK_sXE8h.cjs} +13 -13
- package/dist/{spawnHappyCLI-BAa49m0q.mjs → spawnHappyCLI-B2h0P4b5.mjs} +1 -1
- package/dist/{spawnHappyCLI-DyaldIe5.cjs → spawnHappyCLI-J4iEhfyZ.cjs} +1 -1
- package/dist/{specialCommands-CCWtwIGZ.mjs → specialCommands-DisVxagO.mjs} +3 -3
- package/dist/{specialCommands-DouFaJ_0.cjs → specialCommands-DmJMKspE.cjs} +3 -3
- package/dist/{startFileWatcher-Dfs4whzr.mjs → startFileWatcher-CeK1k5gt.mjs} +1 -1
- package/dist/{startFileWatcher-DQbbypJv.cjs → startFileWatcher-xKo8AoYl.cjs} +1 -1
- package/dist/{sync-x_lI_3j_.cjs → sync-Bvc-vh6C.cjs} +1 -1
- package/dist/{sync-BLpH13Kb.mjs → sync-CCwYpJMS.mjs} +1 -1
- package/dist/{systemPrompt-BanyDihy.mjs → systemPrompt-BNIkP3tR.mjs} +1 -1
- package/dist/{systemPrompt-4erwILTB.cjs → systemPrompt-DwOddbuG.cjs} +1 -1
- package/dist/{teams-D6BOT3lR.mjs → teams-DRrLBcys.mjs} +6 -6
- package/dist/{teams-DzetlGWC.cjs → teams-GHMCRZOw.cjs} +6 -6
- package/dist/{time-T0YmeOhS.cjs → time-BXvtjhe9.cjs} +1 -1
- package/dist/{time-CfDKj6Bx.mjs → time-PG5Dfwdv.mjs} +1 -1
- package/dist/{titleGenerator-CoMxqKfP.cjs → titleGenerator-B07bZA0V.cjs} +2 -2
- package/dist/{titleGenerator-ChImQ4q-.mjs → titleGenerator-CIzfpfZW.mjs} +1 -1
- package/dist/{todo-CZZebKZg.cjs → todo-B0aeoNu3.cjs} +5 -5
- package/dist/{todo-SVtYxGON.mjs → todo-CfL7SBFc.mjs} +5 -5
- package/dist/{tools-3X2z3YDe.mjs → tools-D91mq5Ib.mjs} +1 -1
- package/dist/{tools-IJ0TAcJs.cjs → tools-DJIANHSh.cjs} +1 -1
- package/dist/{uninstall-CypD-kr1.mjs → uninstall-5xz3Xvhf.mjs} +3 -3
- package/dist/{uninstall-CqqCWj7w.cjs → uninstall-AtzOfdrj.cjs} +3 -3
- package/package.json +7 -7
- package/dist/defaultPermissionMode-BnxJPVHT.mjs +0 -4
- package/dist/defaultPermissionMode-CxmTXUQR.cjs +0 -7
- package/dist/mirrorProtocol-BEGk2--0.cjs +0 -266
- package/dist/mirrorProtocol-h5WHpdhh.mjs +0 -248
- package/dist/selfCheck-DPi4lqme.mjs +0 -84
|
@@ -1,25 +1,25 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var mirrorProtocol = require('./mirrorProtocol-
|
|
4
|
-
var piRunnerArgs = require('./piRunnerArgs-
|
|
3
|
+
var mirrorProtocol = require('./mirrorProtocol-BdcN6QlN.cjs');
|
|
4
|
+
var piRunnerArgs = require('./piRunnerArgs-DpbvstUX.cjs');
|
|
5
5
|
var fs = require('fs/promises');
|
|
6
6
|
var tmp = require('tmp');
|
|
7
7
|
var axios = require('axios');
|
|
8
|
-
var api = require('./api-
|
|
8
|
+
var api = require('./api-BZYLRDM9.cjs');
|
|
9
9
|
var spawnAgents = require('./spawnAgents-vglexX9N.cjs');
|
|
10
|
-
var logger = require('./logger-
|
|
10
|
+
var logger = require('./logger-B_MWPbZz.cjs');
|
|
11
11
|
var node_fs = require('node:fs');
|
|
12
12
|
var path = require('node:path');
|
|
13
|
-
var index$2 = require('./index-
|
|
14
|
-
var auth = require('./auth-
|
|
15
|
-
var configuration = require('./configuration-
|
|
13
|
+
var index$2 = require('./index-BjhKqDa0.cjs');
|
|
14
|
+
var auth = require('./auth-VzWpbo5P.cjs');
|
|
15
|
+
var configuration = require('./configuration-C3piBtxY.cjs');
|
|
16
16
|
var child_process = require('child_process');
|
|
17
|
-
var _package = require('./package-
|
|
18
|
-
var doctor = require('./doctor-
|
|
19
|
-
var spawnHappyCLI = require('./spawnHappyCLI-
|
|
20
|
-
var persistence = require('./persistence-
|
|
21
|
-
var controlClient = require('./controlClient-
|
|
22
|
-
var sessionOps = require('./sessionOps-
|
|
17
|
+
var _package = require('./package-C9ZP9bpX.cjs');
|
|
18
|
+
var doctor = require('./doctor-BykBaMTr.cjs');
|
|
19
|
+
var spawnHappyCLI = require('./spawnHappyCLI-J4iEhfyZ.cjs');
|
|
20
|
+
var persistence = require('./persistence-BYGl0QYw.cjs');
|
|
21
|
+
var controlClient = require('./controlClient-BI6Fw3fQ.cjs');
|
|
22
|
+
var sessionOps = require('./sessionOps-DzbZI3Eq.cjs');
|
|
23
23
|
var fastify = require('fastify');
|
|
24
24
|
var z = require('zod');
|
|
25
25
|
var fastifyTypeProviderZod = require('fastify-type-provider-zod');
|
|
@@ -27,45 +27,45 @@ var authRelay = require('./authRelay-BdYkC1Po.cjs');
|
|
|
27
27
|
var node_crypto = require('node:crypto');
|
|
28
28
|
var previewPath = require('./previewPath-B0rBdhy1.cjs');
|
|
29
29
|
var backgroundTaskActivity = require('./backgroundTaskActivity-CBvUdj39.cjs');
|
|
30
|
-
var rateLimitWindows = require('./rateLimitWindows-
|
|
31
|
-
var peerTools = require('./peerTools-
|
|
30
|
+
var rateLimitWindows = require('./rateLimitWindows-CusGIqlq.cjs');
|
|
31
|
+
var peerTools = require('./peerTools-Dkbu7gag.cjs');
|
|
32
32
|
var os = require('node:os');
|
|
33
|
-
var remoteSessionClient = require('./remoteSessionClient-
|
|
34
|
-
var bootstrap = require('./bootstrap-
|
|
35
|
-
var index$1 = require('./index-
|
|
33
|
+
var remoteSessionClient = require('./remoteSessionClient-PyUAIhwK.cjs');
|
|
34
|
+
var bootstrap = require('./bootstrap-Dj8WBiR2.cjs');
|
|
35
|
+
var index$1 = require('./index-PNMQPKhz.cjs');
|
|
36
36
|
var fs$1 = require('fs');
|
|
37
37
|
var path$2 = require('path');
|
|
38
38
|
var node_child_process = require('node:child_process');
|
|
39
39
|
var projectPath = require('./projectPath-ChLhdOyt.cjs');
|
|
40
40
|
var doctorReadiness = require('./doctorReadiness-BCZGcN0a.cjs');
|
|
41
|
-
var machineMetadata = require('./machineMetadata-
|
|
42
|
-
var handleResumeCommand = require('./handleResumeCommand-
|
|
41
|
+
var machineMetadata = require('./machineMetadata-BafS4JY8.cjs');
|
|
42
|
+
var handleResumeCommand = require('./handleResumeCommand-yPdDQHqz.cjs');
|
|
43
43
|
var promises = require('node:fs/promises');
|
|
44
44
|
var cliUpdate = require('./cliUpdate-DsKXPFYp.cjs');
|
|
45
|
+
var client = require('./client-D0T5-6Ds.cjs');
|
|
45
46
|
var module$1 = require('node:module');
|
|
46
47
|
var path$1 = require('./path-B7zW-WwE.cjs');
|
|
47
48
|
var editPaths = require('./editPaths-Bqp4OFPw.cjs');
|
|
48
|
-
var startFileWatcher = require('./startFileWatcher-
|
|
49
|
-
var sync = require('./sync-
|
|
49
|
+
var startFileWatcher = require('./startFileWatcher-xKo8AoYl.cjs');
|
|
50
|
+
var sync = require('./sync-Bvc-vh6C.cjs');
|
|
50
51
|
var types = require('./types-CRS-srZK.cjs');
|
|
51
52
|
var tmuxSocket = require('./tmuxSocket-D-Xt6Vn-.cjs');
|
|
52
|
-
var sessionLock = require('./sessionLock-
|
|
53
|
+
var sessionLock = require('./sessionLock-LBWNjpHf.cjs');
|
|
53
54
|
var doctor$1 = require('./doctor-u46qYYKX.cjs');
|
|
54
55
|
var resources = require('./resources-JDPugcDq.cjs');
|
|
55
56
|
var node_util = require('node:util');
|
|
56
57
|
var index = require('./index-C9hI8a10.cjs');
|
|
57
|
-
var client = require('./client-DJ0kX_8M.cjs');
|
|
58
58
|
var template = require('./template-BaHAmH2K.cjs');
|
|
59
59
|
var loginShellEnv = require('./loginShellEnv-BkuYtExZ.cjs');
|
|
60
|
-
require('./sessionModeFile-
|
|
61
|
-
require('./lidState-
|
|
60
|
+
require('./sessionModeFile-CyPuZRIU.cjs');
|
|
61
|
+
require('./lidState-Bc2K9H9l.cjs');
|
|
62
62
|
require('os');
|
|
63
63
|
require('node:events');
|
|
64
64
|
require('socket.io-client');
|
|
65
|
-
require('./attachmentLimits-
|
|
65
|
+
require('./attachmentLimits-BEYEEBm8.cjs');
|
|
66
66
|
require('./limits-C-a7gr04.cjs');
|
|
67
|
-
require('./time-
|
|
68
|
-
require('./registerCommonHandlers-
|
|
67
|
+
require('./time-BXvtjhe9.cjs');
|
|
68
|
+
require('./registerCommonHandlers-DVYB3iVn.cjs');
|
|
69
69
|
require('util');
|
|
70
70
|
require('crypto');
|
|
71
71
|
require('cross-spawn');
|
|
@@ -73,12 +73,12 @@ require('@paralleldrive/cuid2');
|
|
|
73
73
|
require('./contentLogMetadata-ZSFk_NjQ.cjs');
|
|
74
74
|
require('chalk');
|
|
75
75
|
require('tweetnacl');
|
|
76
|
-
require('./browser-
|
|
76
|
+
require('./browser-BoCV40yC.cjs');
|
|
77
77
|
require('open');
|
|
78
78
|
require('./ids-B6ZC0HGt.cjs');
|
|
79
79
|
require('url');
|
|
80
80
|
require('./detectCLI-DR9ZaN6B.cjs');
|
|
81
|
-
require('./localHappyAgentAuth-
|
|
81
|
+
require('./localHappyAgentAuth-T5GOvRha.cjs');
|
|
82
82
|
require('ps-list');
|
|
83
83
|
|
|
84
84
|
var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
|
|
@@ -418,6 +418,29 @@ function isAuthorizedDaemonControlRequest(authorization, controlToken) {
|
|
|
418
418
|
return configuredTokenIsUsable && node_crypto.timingSafeEqual(expectedDigest, candidateDigest);
|
|
419
419
|
}
|
|
420
420
|
|
|
421
|
+
const WrapperIdleSnapshotSchema = z.z.object({
|
|
422
|
+
flavor: z.z.string().max(64),
|
|
423
|
+
resumable: z.z.boolean(),
|
|
424
|
+
uiSession: z.z.boolean(),
|
|
425
|
+
variant: z.z.string().max(64).optional(),
|
|
426
|
+
spawnedBy: z.z.string().max(64).optional(),
|
|
427
|
+
tags: z.z.array(z.z.string().max(128)).max(64).optional(),
|
|
428
|
+
keepAwake: z.z.boolean(),
|
|
429
|
+
keepAwakeSetting: z.z.boolean().optional(),
|
|
430
|
+
thinking: z.z.boolean(),
|
|
431
|
+
queuedInputs: z.z.number().int().nonnegative(),
|
|
432
|
+
waitingForInput: z.z.boolean(),
|
|
433
|
+
pendingRequests: z.z.number().int().nonnegative(),
|
|
434
|
+
backgroundTasks: z.z.number().int().nonnegative(),
|
|
435
|
+
scheduledWakeups: z.z.number().int().nonnegative().optional(),
|
|
436
|
+
lastActivityAt: z.z.number(),
|
|
437
|
+
exiting: z.z.boolean().optional()
|
|
438
|
+
}).passthrough();
|
|
439
|
+
const HibernateCheckBodySchema = z.z.object({
|
|
440
|
+
sessionId: z.z.string().min(1).max(200),
|
|
441
|
+
pid: z.z.number().int().positive(),
|
|
442
|
+
report: WrapperIdleSnapshotSchema
|
|
443
|
+
});
|
|
421
444
|
const BackgroundTaskInfoSchema = z.z.object({
|
|
422
445
|
id: z.z.string().min(1).max(200),
|
|
423
446
|
type: z.z.string().max(64),
|
|
@@ -451,7 +474,8 @@ function startDaemonControlServer({
|
|
|
451
474
|
onSessionEdit,
|
|
452
475
|
listPeers,
|
|
453
476
|
isTurnActive,
|
|
454
|
-
onRateLimits
|
|
477
|
+
onRateLimits,
|
|
478
|
+
onHibernateCheck
|
|
455
479
|
}) {
|
|
456
480
|
return new Promise((resolve) => {
|
|
457
481
|
const app = fastify({
|
|
@@ -534,6 +558,29 @@ function startDaemonControlServer({
|
|
|
534
558
|
onSessionStateEvent?.(sessionId, event, spawnedBy);
|
|
535
559
|
return { status: "ok" };
|
|
536
560
|
});
|
|
561
|
+
if (onHibernateCheck) {
|
|
562
|
+
typed.post("/session-hibernate-check", {
|
|
563
|
+
schema: {
|
|
564
|
+
body: HibernateCheckBodySchema,
|
|
565
|
+
response: {
|
|
566
|
+
200: z.z.object({
|
|
567
|
+
hibernate: z.z.boolean(),
|
|
568
|
+
reason: z.z.string().optional(),
|
|
569
|
+
idleMs: z.z.number().optional(),
|
|
570
|
+
nextCheckMs: z.z.number().optional(),
|
|
571
|
+
keepAwake: z.z.boolean().optional()
|
|
572
|
+
})
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
}, async (request) => {
|
|
576
|
+
try {
|
|
577
|
+
return await onHibernateCheck(request.body);
|
|
578
|
+
} catch (error) {
|
|
579
|
+
logger.logger.debug("[CONTROL SERVER] hibernate check failed:", error);
|
|
580
|
+
return { hibernate: false, reason: "error" };
|
|
581
|
+
}
|
|
582
|
+
});
|
|
583
|
+
}
|
|
537
584
|
typed.post("/list", {
|
|
538
585
|
schema: {
|
|
539
586
|
response: {
|
|
@@ -2413,6 +2460,133 @@ function createUpdateController(deps) {
|
|
|
2413
2460
|
return { refresh, retry, request, tick, withHandover, holdHandover, isRunning: () => running };
|
|
2414
2461
|
}
|
|
2415
2462
|
|
|
2463
|
+
const AUTOMATION_BINDINGS_TTL_MS = 10 * 60 * 1e3;
|
|
2464
|
+
const HIBERNATION_IN_FLIGHT_MS = 6e4;
|
|
2465
|
+
const HIBERNATION_EXIT_WAIT_MS = 15e3;
|
|
2466
|
+
async function waitForPidsToExit(pids, isAlive, timeoutMs = HIBERNATION_EXIT_WAIT_MS, sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms)), now = Date.now) {
|
|
2467
|
+
const deadline = now() + timeoutMs;
|
|
2468
|
+
while (pids.some(isAlive)) {
|
|
2469
|
+
if (now() >= deadline) return false;
|
|
2470
|
+
await sleep(100);
|
|
2471
|
+
}
|
|
2472
|
+
return true;
|
|
2473
|
+
}
|
|
2474
|
+
function createDaemonHibernation(deps) {
|
|
2475
|
+
const now = () => (deps.now ?? Date.now)();
|
|
2476
|
+
const signatures = /* @__PURE__ */ new Map();
|
|
2477
|
+
const approved = /* @__PURE__ */ new Map();
|
|
2478
|
+
let bindings = null;
|
|
2479
|
+
let bindingsInFlight = null;
|
|
2480
|
+
async function automationBound(fresh = false) {
|
|
2481
|
+
if (!fresh && bindings && now() - bindings.at < AUTOMATION_BINDINGS_TTL_MS) return bindings.ids;
|
|
2482
|
+
if (fresh && bindingsInFlight) await bindingsInFlight;
|
|
2483
|
+
if (!bindingsInFlight) {
|
|
2484
|
+
bindingsInFlight = deps.loadAutomationBindings().then((ids) => {
|
|
2485
|
+
bindings = { at: now(), ids: new Set(ids) };
|
|
2486
|
+
return bindings.ids;
|
|
2487
|
+
}).catch((error) => {
|
|
2488
|
+
deps.log?.(`[hibernate] automation bindings unknown: ${error instanceof Error ? error.message : String(error)}`);
|
|
2489
|
+
return null;
|
|
2490
|
+
}).finally(() => {
|
|
2491
|
+
bindingsInFlight = null;
|
|
2492
|
+
});
|
|
2493
|
+
}
|
|
2494
|
+
return bindingsInFlight;
|
|
2495
|
+
}
|
|
2496
|
+
function inFlight(except) {
|
|
2497
|
+
const t = now();
|
|
2498
|
+
for (const [id, at] of approved) {
|
|
2499
|
+
if (t - at > HIBERNATION_IN_FLIGHT_MS) approved.delete(id);
|
|
2500
|
+
else if (id !== except) return true;
|
|
2501
|
+
}
|
|
2502
|
+
return false;
|
|
2503
|
+
}
|
|
2504
|
+
async function check(request) {
|
|
2505
|
+
const idleMs = deps.idleMs();
|
|
2506
|
+
const t = now();
|
|
2507
|
+
const tracked = deps.tracked(request.sessionId, request.pid);
|
|
2508
|
+
const latchedBefore = deps.readKeepAwake?.(request.sessionId) ?? false;
|
|
2509
|
+
const latched = persistence.latchKeepAwake(request.report.keepAwakeSetting, latchedBefore || request.report.keepAwake);
|
|
2510
|
+
if (latched !== latchedBefore) deps.writeKeepAwake?.(request.sessionId, latched);
|
|
2511
|
+
if (latched && !request.report.keepAwake) request = { ...request, report: { ...request.report, keepAwake: true } };
|
|
2512
|
+
const signature = persistence.reportSignature(request.report);
|
|
2513
|
+
const previousSignature = signatures.get(request.sessionId);
|
|
2514
|
+
signatures.set(request.sessionId, signature);
|
|
2515
|
+
const base = {
|
|
2516
|
+
idleMs,
|
|
2517
|
+
now: t,
|
|
2518
|
+
sessionId: request.sessionId,
|
|
2519
|
+
pid: request.pid,
|
|
2520
|
+
report: request.report,
|
|
2521
|
+
trackedLive: !!tracked?.live,
|
|
2522
|
+
trackedSpawnedBy: tracked?.spawnedBy,
|
|
2523
|
+
teamsMember: deps.teamsMember(request.sessionId),
|
|
2524
|
+
turnActive: deps.turnActive(request.sessionId),
|
|
2525
|
+
backgroundTasks: deps.backgroundTasks(request.sessionId),
|
|
2526
|
+
previousSignature,
|
|
2527
|
+
hibernationInFlight: inFlight(request.sessionId)
|
|
2528
|
+
};
|
|
2529
|
+
let verdict = persistence.decideDaemonHibernation({ ...base, automationBound: /* @__PURE__ */ new Set() });
|
|
2530
|
+
if (verdict.ok || verdict.reason === "unconfirmed" || verdict.reason === "busy") {
|
|
2531
|
+
verdict = persistence.decideDaemonHibernation({ ...base, automationBound: await automationBound() });
|
|
2532
|
+
}
|
|
2533
|
+
if (verdict.ok) {
|
|
2534
|
+
verdict = persistence.decideDaemonHibernation({ ...base, automationBound: await automationBound(true) });
|
|
2535
|
+
}
|
|
2536
|
+
if (verdict.ok) {
|
|
2537
|
+
approved.set(request.sessionId, t);
|
|
2538
|
+
signatures.delete(request.sessionId);
|
|
2539
|
+
deps.log?.(`[hibernate] approved ${request.sessionId} (pid ${request.pid}, idle ${Math.round((t - request.report.lastActivityAt) / 1e3)}s)`);
|
|
2540
|
+
return { hibernate: true, idleMs, ...latched ? { keepAwake: true } : {} };
|
|
2541
|
+
}
|
|
2542
|
+
const next = verdict.reason === "unconfirmed" ? deps.checkMs : persistence.nextCheckDelay(verdict, request.report, idleMs, deps.checkMs, t);
|
|
2543
|
+
return { hibernate: false, reason: verdict.reason, idleMs, nextCheckMs: next, ...latched ? { keepAwake: true } : {} };
|
|
2544
|
+
}
|
|
2545
|
+
return {
|
|
2546
|
+
check,
|
|
2547
|
+
/** Called when the wrapper exits: true when this exit is the hibernation we approved. */
|
|
2548
|
+
consumeExit(sessionId) {
|
|
2549
|
+
const at = approved.get(sessionId);
|
|
2550
|
+
approved.delete(sessionId);
|
|
2551
|
+
signatures.delete(sessionId);
|
|
2552
|
+
return at !== void 0 && now() - at <= HIBERNATION_IN_FLIGHT_MS * 5;
|
|
2553
|
+
},
|
|
2554
|
+
/** Review P1-2: an approved hibernation whose wrapper has not exited yet. */
|
|
2555
|
+
pendingExit(sessionId) {
|
|
2556
|
+
const at = approved.get(sessionId);
|
|
2557
|
+
return at !== void 0 && now() - at <= HIBERNATION_IN_FLIGHT_MS * 5;
|
|
2558
|
+
},
|
|
2559
|
+
forget(sessionId) {
|
|
2560
|
+
signatures.delete(sessionId);
|
|
2561
|
+
},
|
|
2562
|
+
/** Drop the cached Automations bindings (e.g. after the setting changed). */
|
|
2563
|
+
invalidateBindings() {
|
|
2564
|
+
bindings = null;
|
|
2565
|
+
}
|
|
2566
|
+
};
|
|
2567
|
+
}
|
|
2568
|
+
async function collectAutomationBindings(client, machineId) {
|
|
2569
|
+
const ids = /* @__PURE__ */ new Set();
|
|
2570
|
+
const automations = await client.list(machineId);
|
|
2571
|
+
for (const automation of automations) {
|
|
2572
|
+
const action = automation.action;
|
|
2573
|
+
if (action?.kind === "send" && typeof action.sessionId === "string") ids.add(action.sessionId);
|
|
2574
|
+
if (action?.kind === "spawn" && action.sticky) {
|
|
2575
|
+
for (const sticky of await client.stickies(automation.id)) ids.add(sticky.sessionId);
|
|
2576
|
+
}
|
|
2577
|
+
}
|
|
2578
|
+
return [...ids];
|
|
2579
|
+
}
|
|
2580
|
+
const AUTOMATION_WAKE_TIMEOUT_MS = 6e4;
|
|
2581
|
+
async function waitForSessionLive(sessionId, live, timeoutMs = AUTOMATION_WAKE_TIMEOUT_MS, sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms)), now = Date.now) {
|
|
2582
|
+
const deadline = now() + timeoutMs;
|
|
2583
|
+
while (!live(sessionId)) {
|
|
2584
|
+
if (now() >= deadline) return false;
|
|
2585
|
+
await sleep(250);
|
|
2586
|
+
}
|
|
2587
|
+
return true;
|
|
2588
|
+
}
|
|
2589
|
+
|
|
2416
2590
|
const CLAUDE_KEYCHAIN_SERVICE_PREFIX = "Claude Code";
|
|
2417
2591
|
function keychainIdentity(env = process.env, deps = {}) {
|
|
2418
2592
|
const home = deps.home ?? os.homedir();
|
|
@@ -2476,7 +2650,7 @@ function parseJsonObject(text) {
|
|
|
2476
2650
|
return null;
|
|
2477
2651
|
}
|
|
2478
2652
|
}
|
|
2479
|
-
function resolveSdkClaudeBinary(platform = process.platform, arch = process.arch, resolver = (s) => module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('run-
|
|
2653
|
+
function resolveSdkClaudeBinary(platform = process.platform, arch = process.arch, resolver = (s) => module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('run-BC8jzq_h.cjs', document.baseURI).href))).resolve(s)) {
|
|
2480
2654
|
const platformArch = `${platform}-${arch}`;
|
|
2481
2655
|
const candidates = [
|
|
2482
2656
|
`@anthropic-ai/claude-agent-sdk-${platformArch}/claude`,
|
|
@@ -3558,7 +3732,7 @@ function writeReceipt$1(home, receipt) {
|
|
|
3558
3732
|
|
|
3559
3733
|
const exec = node_util.promisify(node_child_process.execFile);
|
|
3560
3734
|
const git = async (directory, args) => (await exec("git", ["-C", directory, ...args], { timeout: 3e4, maxBuffer: 2 * 1024 * 1024 })).stdout.trim();
|
|
3561
|
-
async function prepareTeamWorktree(home, repository, id) {
|
|
3735
|
+
async function prepareTeamWorktree(home, repository, id, origin = "teams") {
|
|
3562
3736
|
if (repository === "~") repository = os.homedir();
|
|
3563
3737
|
else if (repository.startsWith("~/") || process.platform === "win32" && repository.startsWith("~\\")) repository = path.join(os.homedir(), repository.slice(2));
|
|
3564
3738
|
if (!path.isAbsolute(repository) || !/^[a-zA-Z0-9_-]{1,128}$/.test(id)) throw new Error("A team task requires an absolute repository path and valid operation id");
|
|
@@ -3575,6 +3749,7 @@ async function prepareTeamWorktree(home, repository, id) {
|
|
|
3575
3749
|
if (path.resolve(common) !== path.resolve(expected)) throw new Error("Team worktree belongs to another repository");
|
|
3576
3750
|
} else {
|
|
3577
3751
|
await git(repository, ["worktree", "add", "-b", branch, directory, "HEAD"]);
|
|
3752
|
+
await mirrorProtocol.initializeOwnedWorktree({ source: repository, worktree: directory, branch, origin });
|
|
3578
3753
|
}
|
|
3579
3754
|
return { directory, repository, branch };
|
|
3580
3755
|
}
|
|
@@ -4222,6 +4397,35 @@ function createAutomationRunner(deps) {
|
|
|
4222
4397
|
}
|
|
4223
4398
|
})();
|
|
4224
4399
|
}
|
|
4400
|
+
function wakeThenSend(claimed, sessionId, text, stickyKey) {
|
|
4401
|
+
const { run, automation } = claimed;
|
|
4402
|
+
const item = track(claimed, "send", sessionId);
|
|
4403
|
+
item.waking = true;
|
|
4404
|
+
gating++;
|
|
4405
|
+
void (async () => {
|
|
4406
|
+
try {
|
|
4407
|
+
const woke = await deps.wakeHibernated(sessionId).catch(() => false);
|
|
4408
|
+
if (!tracked.has(run.id) || closed) return;
|
|
4409
|
+
item.waking = false;
|
|
4410
|
+
if (!woke || !deps.live(sessionId)) {
|
|
4411
|
+
await finish(item, { claimId: run.claimId, status: "failed", sessionId, error: `Session ${sessionId} was hibernated and could not be woken in time`, needsAttention: true, attentionReason: "session_wake_failed" });
|
|
4412
|
+
return;
|
|
4413
|
+
}
|
|
4414
|
+
persist({ runId: run.id, automationId: automation.id, kind: "send", phase: "running", claimId: run.claimId, sessionId, ...stickyKey ? { stickyKey } : {} });
|
|
4415
|
+
try {
|
|
4416
|
+
await send(sessionId, text, { localId: `automation-${run.id}` });
|
|
4417
|
+
} catch (error) {
|
|
4418
|
+
await finish(item, { claimId: run.claimId, status: "failed", sessionId, error: template.clipText(`Message delivery failed: ${error instanceof Error ? error.message : String(error)}`, index.AUTOMATION_SUMMARY_MAX_CHARS), needsAttention: true, attentionReason: "send_failed" });
|
|
4419
|
+
return;
|
|
4420
|
+
}
|
|
4421
|
+
await reportRunning(item, sessionId, stickyKey);
|
|
4422
|
+
} finally {
|
|
4423
|
+
item.waking = false;
|
|
4424
|
+
gating--;
|
|
4425
|
+
}
|
|
4426
|
+
})();
|
|
4427
|
+
}
|
|
4428
|
+
const wakeable = (sessionId) => !deps.live(sessionId) && !!deps.wakeHibernated && deps.isHibernated?.(sessionId) === true;
|
|
4225
4429
|
async function perform(claimed, action, context, env) {
|
|
4226
4430
|
const { run, automation } = claimed;
|
|
4227
4431
|
const header = automationPromptHeader(automation.name, run.id);
|
|
@@ -4249,6 +4453,11 @@ function createAutomationRunner(deps) {
|
|
|
4249
4453
|
return;
|
|
4250
4454
|
}
|
|
4251
4455
|
if (action.kind === "send") {
|
|
4456
|
+
if (wakeable(action.sessionId)) {
|
|
4457
|
+
wakeThenSend(claimed, action.sessionId, `${header}
|
|
4458
|
+
${action.prompt}`);
|
|
4459
|
+
return;
|
|
4460
|
+
}
|
|
4252
4461
|
if (!deps.live(action.sessionId)) {
|
|
4253
4462
|
await failNow(claimed, "send", `Session ${action.sessionId} is not running on this machine`, "session_not_live", action.sessionId);
|
|
4254
4463
|
return;
|
|
@@ -4277,6 +4486,11 @@ ${action.prompt}`, { localId: `automation-${run.id}` });
|
|
|
4277
4486
|
const stickyKey = action.sticky ? template.renderTemplate(action.sticky.key, context) : void 0;
|
|
4278
4487
|
if (stickyKey) {
|
|
4279
4488
|
const bound = claimed.stickies.find((sticky) => sticky.key === stickyKey);
|
|
4489
|
+
if (bound && wakeable(bound.sessionId)) {
|
|
4490
|
+
wakeThenSend(claimed, bound.sessionId, `${header}
|
|
4491
|
+
${action.prompt}`, stickyKey);
|
|
4492
|
+
return;
|
|
4493
|
+
}
|
|
4280
4494
|
if (bound && deps.live(bound.sessionId)) {
|
|
4281
4495
|
persist({ runId: run.id, automationId: automation.id, kind: "send", phase: "running", claimId: run.claimId, sessionId: bound.sessionId, stickyKey });
|
|
4282
4496
|
try {
|
|
@@ -4298,7 +4512,7 @@ ${action.prompt}`, { localId: `automation-${run.id}` });
|
|
|
4298
4512
|
}
|
|
4299
4513
|
if (action.worktree) {
|
|
4300
4514
|
try {
|
|
4301
|
-
directory = (await prepareWorktree(home, directory, `auto-${run.id}
|
|
4515
|
+
directory = (await prepareWorktree(home, directory, `auto-${run.id}`, "automation")).directory;
|
|
4302
4516
|
} catch (error) {
|
|
4303
4517
|
await failNow(claimed, "spawn", `Worktree preparation failed: ${error instanceof Error ? error.message : String(error)}`, "worktree_failed");
|
|
4304
4518
|
return;
|
|
@@ -4330,7 +4544,7 @@ ${action.prompt}`, { localId: `automation-${run.id}`, ...meta });
|
|
|
4330
4544
|
await finish(item, item.pendingFinal);
|
|
4331
4545
|
continue;
|
|
4332
4546
|
}
|
|
4333
|
-
if (item.kind === "script") continue;
|
|
4547
|
+
if (item.kind === "script" || item.waking) continue;
|
|
4334
4548
|
const sessionId = item.sessionId;
|
|
4335
4549
|
const active = deps.turnActive(sessionId);
|
|
4336
4550
|
if (active) item.sawTurn = true;
|
|
@@ -4548,6 +4762,7 @@ async function startDaemon() {
|
|
|
4548
4762
|
let cliUpdateStateRef = null;
|
|
4549
4763
|
let lastHandoverHold = null;
|
|
4550
4764
|
let claudeCredentialStoreSetting = (await persistence.readSettings()).claudeCredentialStore === "file" ? "file" : "auto";
|
|
4765
|
+
let agentHibernationSetting = (await persistence.readSettings()).agentHibernationIdleMs;
|
|
4551
4766
|
try {
|
|
4552
4767
|
const homes = await index$1.refreshAgentHomes();
|
|
4553
4768
|
logger.logger.debug(`[DAEMON RUN] Claude config dir: ${loginShellEnv.describeAgentHome(homes.claudeConfigDir)}; Codex home: ${loginShellEnv.describeAgentHome(homes.codexHome)}`);
|
|
@@ -4634,6 +4849,40 @@ async function startDaemon() {
|
|
|
4634
4849
|
const turnActivity = new api.TurnActivityTracker();
|
|
4635
4850
|
const backgroundTasks = new backgroundTaskActivity.BackgroundTaskTracker();
|
|
4636
4851
|
const peerCoordinator = createPeerCoordinator({ getChildren: () => Array.from(pidToTrackedSession.values()) });
|
|
4852
|
+
const hibernationAutomations = client.createAutomationsClient({ serverUrl: configuration.configuration.serverUrl, token: credentials.token, client: "daemon-hibernate" });
|
|
4853
|
+
const daemonHibernation = createDaemonHibernation({
|
|
4854
|
+
idleMs: () => persistence.resolveIdleMs(agentHibernationSetting),
|
|
4855
|
+
checkMs: persistence.resolveCheckMs(),
|
|
4856
|
+
tracked: (sessionId, pid) => {
|
|
4857
|
+
const tracked = pidToTrackedSession.get(pid);
|
|
4858
|
+
if (!tracked || tracked.happySessionId !== sessionId) return null;
|
|
4859
|
+
let live = false;
|
|
4860
|
+
try {
|
|
4861
|
+
process.kill(pid, 0);
|
|
4862
|
+
live = true;
|
|
4863
|
+
} catch {
|
|
4864
|
+
live = false;
|
|
4865
|
+
}
|
|
4866
|
+
return { live, ...tracked.spawnedBy ? { spawnedBy: tracked.spawnedBy } : {} };
|
|
4867
|
+
},
|
|
4868
|
+
teamsMember: (sessionId) => teamWorker?.hasSession(sessionId) === true,
|
|
4869
|
+
turnActive: (sessionId) => turnActivity.activeSessions().includes(sessionId),
|
|
4870
|
+
backgroundTasks: (sessionId) => backgroundTasks.count(sessionId),
|
|
4871
|
+
loadAutomationBindings: async () => {
|
|
4872
|
+
try {
|
|
4873
|
+
return await collectAutomationBindings(hibernationAutomations, machineId);
|
|
4874
|
+
} catch (error) {
|
|
4875
|
+
if (client.isAutomationsUnavailable(error)) return [];
|
|
4876
|
+
throw error;
|
|
4877
|
+
}
|
|
4878
|
+
},
|
|
4879
|
+
log: (message) => logger.logger.debug(`[DAEMON RUN] ${message}`),
|
|
4880
|
+
readKeepAwake: (sessionId) => persistence.readPersistedSessions()[sessionId]?.keepAwake === true,
|
|
4881
|
+
writeKeepAwake: (sessionId, value) => {
|
|
4882
|
+
const record = persistence.readPersistedSessions()[sessionId];
|
|
4883
|
+
if (record) persistence.persistSession(sessionId, { ...record, keepAwake: value || void 0 });
|
|
4884
|
+
}
|
|
4885
|
+
});
|
|
4637
4886
|
const sessionIdToFinishedSession = /* @__PURE__ */ new Map();
|
|
4638
4887
|
let teamWorker;
|
|
4639
4888
|
let automationRunner;
|
|
@@ -5247,6 +5496,13 @@ async function startDaemon() {
|
|
|
5247
5496
|
};
|
|
5248
5497
|
const resumeSessionImpl = async (happySessionId, options) => {
|
|
5249
5498
|
try {
|
|
5499
|
+
if (daemonHibernation.pendingExit(happySessionId)) {
|
|
5500
|
+
const dying = [...pidToTrackedSession.entries()].filter(([, s]) => s.happySessionId === happySessionId).map(([pid]) => pid);
|
|
5501
|
+
const exited = await waitForPidsToExit(dying, isPidAlive);
|
|
5502
|
+
logger.logger.debug(`[DAEMON RUN] resume ${happySessionId}: waited for hibernating wrapper(s) ${dying.join(", ")} \u2192 ${exited ? "exited" : "still alive after timeout"}`);
|
|
5503
|
+
if (!exited) return { type: "error", errorMessage: `Session ${happySessionId} is still going to sleep; try again in a few seconds.` };
|
|
5504
|
+
for (const pid of dying) if (pidToTrackedSession.has(pid)) onChildExited(pid);
|
|
5505
|
+
}
|
|
5250
5506
|
for (const [pid, live] of pidToTrackedSession.entries()) {
|
|
5251
5507
|
if (live.happySessionId !== happySessionId) continue;
|
|
5252
5508
|
if (isPidAlive(pid)) {
|
|
@@ -5507,6 +5763,14 @@ async function startDaemon() {
|
|
|
5507
5763
|
if (session?.happySessionId) turnActivity.forget(session.happySessionId);
|
|
5508
5764
|
if (session?.happySessionId) backgroundTasks.forget(session.happySessionId);
|
|
5509
5765
|
if (session?.happySessionId) peerCoordinator.forget(session.happySessionId);
|
|
5766
|
+
if (session?.happySessionId && daemonHibernation.consumeExit(session.happySessionId)) {
|
|
5767
|
+
const persisted2 = persistence.readPersistedSessions()[session.happySessionId];
|
|
5768
|
+
if (persisted2) {
|
|
5769
|
+
const at = Date.now();
|
|
5770
|
+
persistence.persistSession(session.happySessionId, { ...persisted2, savedAt: at, hibernatedAt: at });
|
|
5771
|
+
}
|
|
5772
|
+
logger.logger.debug(`[DAEMON RUN] Session ${session.happySessionId} hibernated (PID ${pid} exited)`);
|
|
5773
|
+
}
|
|
5510
5774
|
if (session?.happySessionId && session.encryption) {
|
|
5511
5775
|
sessionIdToFinishedSession.set(session.happySessionId, session);
|
|
5512
5776
|
logger.logger.debug(`[DAEMON RUN] Process PID ${pid} exited, preserved session ${session.happySessionId} for resume`);
|
|
@@ -5602,6 +5866,7 @@ async function startDaemon() {
|
|
|
5602
5866
|
onRateLimits: (report) => {
|
|
5603
5867
|
apiMachineRef?.reportRateLimits(report);
|
|
5604
5868
|
},
|
|
5869
|
+
onHibernateCheck: (body) => daemonHibernation.check(body),
|
|
5605
5870
|
listPeers: () => peerCoordinator.list(),
|
|
5606
5871
|
// B-505: `daemon list` shows which sessions have a turn in flight, so an
|
|
5607
5872
|
// operator can check the WHOLE machine before a supervised restart.
|
|
@@ -5723,6 +5988,13 @@ async function startDaemon() {
|
|
|
5723
5988
|
setStore: (store) => claudeAuthService.setStore(store)
|
|
5724
5989
|
});
|
|
5725
5990
|
claudeAuthService.start();
|
|
5991
|
+
apiMachine.setAgentHibernationHandlers(persistence.resolveIdleMs(agentHibernationSetting), async (requested) => {
|
|
5992
|
+
const value = requested <= 0 ? 0 : persistence.settingIdleMs(requested);
|
|
5993
|
+
await persistence.updateSettings((current) => ({ ...current, agentHibernationIdleMs: value }));
|
|
5994
|
+
agentHibernationSetting = value;
|
|
5995
|
+
daemonHibernation.invalidateBindings();
|
|
5996
|
+
return persistence.resolveIdleMs(agentHibernationSetting);
|
|
5997
|
+
});
|
|
5726
5998
|
apiMachine.connect();
|
|
5727
5999
|
if (identityConflict?.confidence === "weak") {
|
|
5728
6000
|
void apiMachine.updateMachineMetadata((current) => ({
|
|
@@ -5870,18 +6142,32 @@ async function startDaemon() {
|
|
|
5870
6142
|
live: (id) => [...pidToTrackedSession.values()].some((s) => s.happySessionId === id && isPidAlive(s.pid)),
|
|
5871
6143
|
turnActive: (id) => turnActivity.activeSessions().includes(id),
|
|
5872
6144
|
backgroundTasks: (id) => backgroundTasks.count(id),
|
|
6145
|
+
// B-587 review P2-5: a hibernated target is woken (resume) and the send
|
|
6146
|
+
// waits until its wrapper is back; anything else stays session_not_live.
|
|
6147
|
+
isHibernated: (id) => {
|
|
6148
|
+
const record = persistence.readPersistedSessions()[id];
|
|
6149
|
+
return !!record && typeof record.hibernatedAt === "number" && record.hibernatedAt >= record.savedAt;
|
|
6150
|
+
},
|
|
6151
|
+
wakeHibernated: async (id) => {
|
|
6152
|
+
const result = await resumeSession(id);
|
|
6153
|
+
if (result.type !== "success") return false;
|
|
6154
|
+
return waitForSessionLive(id, (sid) => [...pidToTrackedSession.values()].some((s) => s.happySessionId === sid && isPidAlive(s.pid)));
|
|
6155
|
+
},
|
|
5873
6156
|
log: (message) => logger.logger.debug(`[DAEMON RUN] ${message}`)
|
|
5874
6157
|
});
|
|
5875
6158
|
void apiMachine.updateMachineMetadata((current) => ({
|
|
5876
6159
|
...current ?? initialMachineMetadata,
|
|
5877
6160
|
teamsVersion: 1,
|
|
5878
|
-
teamLaunchVersion: 1
|
|
6161
|
+
teamLaunchVersion: 1,
|
|
6162
|
+
// B-586: this daemon serves the worktree-* RPCs (web gates 「在新 worktree 中」 on it).
|
|
6163
|
+
worktreeVersion: mirrorProtocol.WORKTREE_CAPABILITY_VERSION
|
|
5879
6164
|
})).catch(() => logger.logger.debug("[DAEMON RUN] Teams capability publication will retry on reconnect"));
|
|
5880
6165
|
const cleanupAndShutdown = async (source, errorMessage) => {
|
|
5881
6166
|
logger.logger.debug(`[DAEMON RUN] Starting proper cleanup (source: ${source}, errorMessage: ${errorMessage})...`);
|
|
5882
6167
|
const scrollbackFlush = apiMachine.flushTerminalScrollback();
|
|
5883
6168
|
teamWorker?.stop();
|
|
5884
6169
|
automationRunner?.stop({ killScripts: true });
|
|
6170
|
+
mirrorProtocol.currentWorktreeService()?.stopAll();
|
|
5885
6171
|
if (restartOnStaleVersionAndHeartbeat) {
|
|
5886
6172
|
clearInterval(restartOnStaleVersionAndHeartbeat);
|
|
5887
6173
|
logger.logger.debug("[DAEMON RUN] Health check interval cleared");
|