very-happy-cli 0.2.177 → 0.2.179
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-B0K0WrtW.mjs → AcpBackend-CHp3y7cb.mjs} +135 -16
- package/dist/{AcpBackend-B-ny68XM.cjs → AcpBackend-DFipFF7-.cjs} +135 -16
- package/dist/{AcpSessionManager-CjdJLofq.cjs → AcpSessionManager-0zpvRJXc.cjs} +38 -4
- package/dist/{AcpSessionManager-DykjzBM4.mjs → AcpSessionManager-d2-rKWWa.mjs} +38 -4
- package/dist/{BasePermissionHandler-DR6nxuEn.cjs → BasePermissionHandler-CH3zuEkA.cjs} +5 -2
- package/dist/{BasePermissionHandler-hdY7kTqX.mjs → BasePermissionHandler-DdZBYIR4.mjs} +5 -2
- package/dist/acpSessionResume-DTGmAPLt.mjs +67 -0
- package/dist/acpSessionResume-oiCBnAVA.cjs +74 -0
- package/dist/{agentHome-BdTXEUPe.cjs → agentHome-BWcz8mz0.cjs} +5 -5
- package/dist/{agentHome-GRN2VfHv.mjs → agentHome-CghLvL_1.mjs} +5 -5
- package/dist/{api-BWX10o97.cjs → api-Cmjfr8Z7.cjs} +29 -261
- package/dist/{api-CKBViqI3.mjs → api-CzwFpJQc.mjs} +22 -254
- package/dist/{apiMachine-DttO4UFj.mjs → apiMachine-DJkTEiqy.mjs} +53 -16
- package/dist/{apiMachine-BYYFGgFs.cjs → apiMachine-G6OogT08.cjs} +53 -16
- package/dist/{attachmentContent-cPVF463_.mjs → attachmentContent-B2os4HbA.mjs} +2 -2
- package/dist/{attachmentContent-kJKXpkMX.cjs → attachmentContent-Bo0UAsSu.cjs} +4 -4
- package/dist/{auth-BmESeKuM.mjs → auth-BS6PaOOG.mjs} +6 -6
- package/dist/{auth-CTECt2Oz.cjs → auth-D6bBUwZa.cjs} +6 -6
- package/dist/{auth-CKdXb9zp.mjs → auth-DMX0xPNK.mjs} +9 -9
- package/dist/{auth-DNxVmVbn.cjs → auth-HEhRaNgL.cjs} +9 -9
- package/dist/{authRelay-DSAvg1uv.mjs → authRelay-DhQhkBvX.mjs} +1 -1
- package/dist/{authRelay-BdYkC1Po.cjs → authRelay-Dy1qU9td.cjs} +1 -0
- package/dist/{auto-D1ypjjfx.cjs → auto-C6I55iOh.cjs} +19 -18
- package/dist/{auto-Ch3203qd.mjs → auto-Cl1SEDcD.mjs} +19 -18
- package/dist/{bootstrap-6OI698q9.cjs → bootstrap-exVucYav.cjs} +2 -2
- package/dist/{bootstrap-C0s2bPFQ.mjs → bootstrap-iuyufnp3.mjs} +2 -2
- package/dist/{browser-DG6Uof5O.cjs → browser-BohJK12g.cjs} +1 -1
- package/dist/{browser-BlLWZUMx.mjs → browser-CSYum7xH.mjs} +1 -1
- package/dist/{claudeLocal-CcWcKnoo.mjs → claudeLocal-Dq_R3Ax_.mjs} +6 -5
- package/dist/{claudeLocal-CemsIArT.cjs → claudeLocal-re4yjSTx.cjs} +6 -5
- package/dist/{claudeLocalLauncher-A4VuevIi.cjs → claudeLocalLauncher-B4hJHpCA.cjs} +11 -10
- package/dist/{claudeLocalLauncher-7p6y88nj.mjs → claudeLocalLauncher-CN67lN7-.mjs} +11 -10
- package/dist/{claudeSessionFork-BtROOjqf.mjs → claudeSessionFork-BihfD0Ik.mjs} +1 -1
- package/dist/{claudeSessionFork-CbDfm8Fz.cjs → claudeSessionFork-DiSMYerV.cjs} +1 -1
- package/dist/{client-DyvBTYee.cjs → client-BKcK1Bi-.cjs} +3 -3
- package/dist/client-BhoEBnuN.mjs +71 -0
- package/dist/{client-COmgDDy0.cjs → client-CuVdN6PP.cjs} +2 -2
- package/dist/{client-BPMWutfs.mjs → client-DuTDwWSQ.mjs} +3 -3
- package/dist/client-ZjOsn6nZ.cjs +76 -0
- package/dist/{client-DG5ndWLw.mjs → client-wo9nbxuf.mjs} +2 -2
- package/dist/codex/happyMcpStdioBridge.cjs +25 -16
- package/dist/codex/happyMcpStdioBridge.mjs +25 -16
- package/dist/{codexAppServerClient-D-Z8qSfI.mjs → codexAppServerClient-BK3zra_1.mjs} +3 -3
- package/dist/{codexAppServerClient-R24WZZfg.cjs → codexAppServerClient-Dt5zxrun.cjs} +3 -3
- package/dist/{codexCommand-CVTkZJ1o.mjs → codexCommand-B6pY7CMh.mjs} +66 -61
- package/dist/{codexCommand-6hW19gsq.cjs → codexCommand-CAZ1SLjg.cjs} +89 -84
- package/dist/{codexTermination-CCIfwzcx.mjs → codexTermination-Cd1Eon_4.mjs} +1 -1
- package/dist/{codexTermination-BBU7e92y.cjs → codexTermination-DmGbHxcD.cjs} +1 -1
- package/dist/{config-CvsNChKX.mjs → config-2oMG_fEI.mjs} +3 -3
- package/dist/{config-DhdrvOLV.cjs → config-B0uK6K7n.cjs} +3 -3
- package/dist/{configuration-DZPy0T9Z.cjs → configuration-CMHZnp6G.cjs} +1 -1
- package/dist/{configuration-D55F0t16.mjs → configuration-WMi4idBB.mjs} +1 -1
- package/dist/{connect-CwCXMRmD.mjs → connect-BLVHhHzA.mjs} +15 -15
- package/dist/{connect-Wz-XZYXW.cjs → connect-uaglGrde.cjs} +15 -15
- package/dist/{context-BKbrZ55r.cjs → context-DXzU5bFM.cjs} +1 -1
- package/dist/{context-CCRpVXFo.mjs → context-DploEcoN.mjs} +1 -1
- package/dist/{controlClient-C4xB5J6O.mjs → controlClient-BWUJrj3t.mjs} +3 -3
- package/dist/{controlClient-SX8gSza2.cjs → controlClient-C-5qCt8W.cjs} +3 -3
- package/dist/{createSessionMetadata-Bi-m0Y_O.mjs → createSessionMetadata-3uXrJgOW.mjs} +2 -2
- package/dist/{createSessionMetadata-BCFmYlBo.cjs → createSessionMetadata-BkIzHALd.cjs} +2 -2
- package/dist/{defaultPermissionMode-wBcbBezm.mjs → defaultPermissionMode-BzxLh20a.mjs} +2 -2
- package/dist/{defaultPermissionMode-DMBEnXll.cjs → defaultPermissionMode-pS3vmiSg.cjs} +2 -2
- package/dist/{deterministicJson-ChGfQEF6.cjs → deterministicJson-B8z2GPi9.cjs} +220 -14
- package/dist/{deterministicJson-BkQETt8_.mjs → deterministicJson-D_whDMFd.mjs} +217 -12
- package/dist/{doctor-BsN3JZJn.cjs → doctor-Br1Kcy2J.cjs} +8 -8
- package/dist/{doctor-B9c2C9dF.mjs → doctor-CmtSsR2-.mjs} +8 -8
- package/dist/{downloadTarget-Dj3WoVJa.cjs → downloadTarget-BQJK_6oH.cjs} +6 -6
- package/dist/{downloadTarget-ByXzbDK4.mjs → downloadTarget-BoNwTIH_.mjs} +6 -6
- package/dist/{ensureDaemonRunning-7Wb8M7Lv.cjs → ensureDaemonRunning-BRUmsq6J.cjs} +5 -5
- package/dist/{ensureDaemonRunning--HYzs5Ce.mjs → ensureDaemonRunning-Czo9IHJQ.mjs} +5 -5
- package/dist/{handleResumeCommand-DHddBkNJ.mjs → handleResumeCommand-C8thKjqf.mjs} +22 -6
- package/dist/{handleResumeCommand-OmuUGYjQ.cjs → handleResumeCommand-tKD_Hpxc.cjs} +22 -6
- package/dist/{index-CrR4JISa.cjs → index-B0UjHlAe.cjs} +5 -5
- package/dist/{index-BzJNDsJq.mjs → index-BTxHphpV.mjs} +254 -49
- package/dist/index-BiyC7cZ3.mjs +18 -0
- package/dist/{index-De8L5lFK.cjs → index-C6O2vVjm.cjs} +156 -34
- package/dist/index-CUuc6iCn.cjs +24 -0
- package/dist/{index-Dhl6_bw7.mjs → index-CdQI0C9p.mjs} +5 -5
- package/dist/{index-D9NoYc5I.cjs → index-D09T1m8Y.cjs} +3 -3
- package/dist/{index-CEm0MYiS.mjs → index-D3bidoG8.mjs} +3 -3
- package/dist/{index-BRJzH4sc.cjs → index-DMqDMT1Q.cjs} +257 -52
- package/dist/{index-DMy3OCBe.mjs → index-DPOa4NhL.mjs} +154 -35
- package/dist/index.cjs +2 -2
- package/dist/index.mjs +2 -2
- package/dist/{install-BdvKiOQw.mjs → install-BX3lv3NO.mjs} +1 -1
- package/dist/{install-Cf6AFSWC.cjs → install-BXvf2E3o.cjs} +1 -1
- package/dist/{install-1qn-D9FS.cjs → install-CYRZxS87.cjs} +3 -3
- package/dist/{install-BDIUtPXi.mjs → install-hnve_9vq.mjs} +3 -3
- package/dist/lib.cjs +14 -14
- package/dist/lib.d.cts +65 -1
- package/dist/lib.d.mts +65 -1
- package/dist/lib.mjs +14 -14
- package/dist/{lidState-BqVsw7H1.mjs → lidState-Bb8fgXg3.mjs} +2 -2
- package/dist/{lidState-DxbK0qfu.cjs → lidState-Dv2wwFTj.cjs} +2 -2
- package/dist/{localHappyAgentAuth-D5tANdRD.cjs → localHappyAgentAuth-DjYvkXvV.cjs} +2 -2
- package/dist/{localHappyAgentAuth-Ce8kO2yc.mjs → localHappyAgentAuth-NEU7fax7.mjs} +2 -2
- package/dist/{logger-13cBr_ew.mjs → logger-BtVhHnD8.mjs} +2 -2
- package/dist/{logger-LvwVeATU.cjs → logger-C1GWx3gi.cjs} +2 -2
- package/dist/{machineMetadata-29h7vgf4.cjs → machineMetadata-CLHS9sv_.cjs} +3 -3
- package/dist/{machineMetadata-dMida2qq.mjs → machineMetadata-D-g--oU_.mjs} +3 -3
- package/dist/{main-x4nAhdH5.mjs → main-B2LWV8DI.mjs} +59 -46
- package/dist/{main-DpM5jaFH.cjs → main-CWhSsbtU.cjs} +59 -46
- package/dist/{mcp-DQv3caXs.cjs → mcp-CARUsXHV.cjs} +15 -15
- package/dist/{mcp-DMiFGYMT.mjs → mcp-ext92q3Y.mjs} +15 -15
- package/dist/{mirrorProtocol-Bz8tEabR.mjs → mirrorProtocol-BwYibqry.mjs} +3 -3
- package/dist/{mirrorProtocol-BfrERW7Z.cjs → mirrorProtocol-DEy2g1CB.cjs} +3 -3
- package/dist/{package-CjlsAaRe.mjs → package-BPPebGQF.mjs} +7 -7
- package/dist/{package-Ch9WGDV_.cjs → package-SgqTYsjn.cjs} +7 -7
- package/dist/panels-BZ0_Tt7B.mjs +137 -0
- package/dist/panels-D1c7q2dD.cjs +142 -0
- package/dist/{peerTools-CxmrKnfV.mjs → peerTools-CWKzcQ7u.mjs} +60 -10
- package/dist/{peerTools-DtGKWli5.cjs → peerTools-DRQETXaz.cjs} +60 -9
- package/dist/{persistence-DXbKOHxl.cjs → persistence-BegE7NPa.cjs} +14 -3
- package/dist/{persistence-C_tYtOqK.mjs → persistence-Cr-wutZ4.mjs} +14 -4
- package/dist/{piRunnerArgs-BVRZe2AR.cjs → piRunnerArgs-Cs-378Vz.cjs} +8 -2
- package/dist/{piRunnerArgs-BpHc-JZl.mjs → piRunnerArgs-DwvM_yWA.mjs} +7 -1
- package/dist/{piRuntime-D7eio8Ix.cjs → piRuntime-BG-1td_n.cjs} +2 -2
- package/dist/{piRuntime-DOdGF395.mjs → piRuntime-Bue5mnlc.mjs} +2 -2
- package/dist/{piTerminal-dpxz4Q8D.mjs → piTerminal-B5x9X5yV.mjs} +18 -18
- package/dist/{piTerminal-y_PRo2NY.cjs → piTerminal-G4z-xVyy.cjs} +18 -18
- package/dist/processTreeSnapshot-CuLJDNC-.mjs +101 -0
- package/dist/processTreeSnapshot-mDbnuojn.cjs +105 -0
- package/dist/prompt-BOouDaTM.mjs +99 -0
- package/dist/prompt-lgF9IE82.cjs +105 -0
- package/dist/{attachmentLimits-Di1Z93lN.mjs → pushNotifications-BdFjDjQe.mjs} +303 -3
- package/dist/{attachmentLimits-DtFqqiwR.cjs → pushNotifications-DaLQUyi0.cjs} +304 -2
- package/dist/{index-DFPT4HOO.cjs → query-Ctfg-5gy.cjs} +25 -5
- package/dist/{index-CEjJnq05.mjs → query-DYP_W1wp.mjs} +26 -3
- package/dist/{rateLimitWindows-DYHDGuzQ.mjs → rateLimitWindows-CuEqk_0g.mjs} +1 -1
- package/dist/{rateLimitWindows-DFnMU2Vt.cjs → rateLimitWindows-Dj_8voBK.cjs} +1 -1
- package/dist/{registerCommonHandlers-D8OMpBbQ.mjs → registerCommonHandlers-BAlP7SGc.mjs} +2 -2
- package/dist/{registerCommonHandlers-60VuTkdg.cjs → registerCommonHandlers-Cj084Sg7.cjs} +2 -2
- package/dist/{registerKillSessionHandler-Drhf7-Vz.mjs → registerKillSessionHandler-PD0jWtQo.mjs} +6 -6
- package/dist/{registerKillSessionHandler-pqChBKwO.cjs → registerKillSessionHandler-qMju0ZfF.cjs} +6 -6
- package/dist/{remoteSessionClient-B7NvjHD3.cjs → remoteSessionClient-B7i7MkYV.cjs} +5 -5
- package/dist/{remoteSessionClient-D01Hso2-.mjs → remoteSessionClient-Bn2qu5C5.mjs} +5 -5
- package/dist/{reportProgressTool-Du_zAK4h.cjs → reportProgressTool-CM1JFAHg.cjs} +84 -2
- package/dist/{reportProgressTool-B203EZCR.mjs → reportProgressTool-gHItlSzz.mjs} +82 -3
- package/dist/{resources-JDPugcDq.cjs → resources-CvIlkzpP.cjs} +30 -0
- package/dist/{resources-BdFBQi8r.mjs → resources-y9jfyO-_.mjs} +30 -0
- package/dist/{run-DX4Zs3Ug.mjs → run-BM4TxiyN.mjs} +249 -45
- package/dist/{run-DZ5jU53c.cjs → run-CNXwIe0A.cjs} +263 -59
- package/dist/{runClaude-ClRhHpwR.cjs → runClaude-CWhj2V4Q.cjs} +37 -41
- package/dist/{runClaude-CgPHXP0L.mjs → runClaude-C_3I8hvR.mjs} +37 -41
- package/dist/{runClaudeDeps-D2v_WDSL.cjs → runClaudeDeps-B81cOKnH.cjs} +295 -157
- package/dist/{runClaudeDeps-Dz2iydq4.mjs → runClaudeDeps-QGrOeDe2.mjs} +295 -160
- package/dist/{runGemini-DBXxpoY8.mjs → runGemini-BEdWEZLR.mjs} +61 -55
- package/dist/{runGemini-BtZqGFkp.cjs → runGemini-CgRLYbt5.cjs} +61 -55
- package/dist/{runOpenClaw-D8q8G57u.cjs → runOpenClaw-C1NVmzOL.cjs} +19 -19
- package/dist/{runOpenClaw-BOHpzCEU.mjs → runOpenClaw-DdQZAYj1.mjs} +19 -19
- package/dist/{sandbox-C452Vrsc.mjs → sandbox-DjQUdCMG.mjs} +5 -5
- package/dist/{sandbox-Cu9mMzjx.cjs → sandbox-nocIjliq.cjs} +5 -5
- package/dist/selfCheck-CjCF4C3v.mjs +85 -0
- package/dist/{selfCheck-gKa3uVr1.cjs → selfCheck-DCt4Uzbq.cjs} +36 -35
- package/dist/{send-B8HARi7x.mjs → send-Ct7X4pPU.mjs} +9 -9
- package/dist/{send-2Vb5eppI.cjs → send-Dydf_hwZ.cjs} +9 -9
- package/dist/{server-Db9Wuam3.cjs → server-CosABFbd.cjs} +7 -7
- package/dist/{server-BBWCIZyS.mjs → server-DTQGZMxh.mjs} +5 -5
- package/dist/{sessionLock-6qL_N6Rn.cjs → sessionLock-DokGab2R.cjs} +16 -3
- package/dist/{sessionLock-ZfvFVdUi.mjs → sessionLock-WYIyaVO4.mjs} +16 -4
- package/dist/{sessionOps-CdgbEJgf.mjs → sessionOps-BIGgRube.mjs} +11 -6
- package/dist/{sessionOps-Dmt7WUUs.cjs → sessionOps-S-qPBLFf.cjs} +11 -6
- package/dist/{sessionScanner-CQL_WSaC.cjs → sessionScanner-CIMM2hvZ.cjs} +3 -3
- package/dist/{sessionScanner-CNVaSNOn.mjs → sessionScanner-o5hnMi5e.mjs} +3 -3
- package/dist/{sessions-DTomHfFg.mjs → sessions-BJHEZpi2.mjs} +40 -18
- package/dist/{sessions-BJblG_Hx.cjs → sessions-JchI1w3z.cjs} +40 -17
- package/dist/{setupOfflineReconnection-DVA0VpQL.cjs → setupOfflineReconnection-CNiAt5ZP.cjs} +2 -2
- package/dist/{setupOfflineReconnection-C5trsV-j.mjs → setupOfflineReconnection-DMiBO2y9.mjs} +2 -2
- package/dist/{spawn-DRyNAqD8.cjs → spawn-6PD7nnoC.cjs} +49 -18
- package/dist/{spawn-CQJFgoOq.mjs → spawn-DgvUNYEo.mjs} +49 -18
- package/dist/{spawnAgents-CCjJifAW.cjs → spawnAgents-DsXgegHM.cjs} +37 -1
- package/dist/spawnAgents-P006Hqio.mjs +79 -0
- package/dist/{spawnHappyCLI-B_0RWxD4.mjs → spawnHappyCLI-CCOrEtf9.mjs} +1 -1
- package/dist/{spawnHappyCLI-ChniczJ5.cjs → spawnHappyCLI-Dywezwk6.cjs} +1 -1
- package/dist/{specialCommands-DkdFJi4N.mjs → specialCommands-DPcd9edP.mjs} +3 -3
- package/dist/{specialCommands-DbntVs0d.cjs → specialCommands-QxPpkGKf.cjs} +3 -3
- package/dist/{startFileWatcher-UQyTSRAP.mjs → startFileWatcher-DghDOCO4.mjs} +1 -1
- package/dist/{startFileWatcher-C292fhra.cjs → startFileWatcher-RECH5qY8.cjs} +1 -1
- package/dist/{streamRelay-_qCd873P.mjs → streamRelay-DMV_TXfS.mjs} +1 -1
- package/dist/{streamRelay-Cx01enfe.cjs → streamRelay-DlUWKUpo.cjs} +1 -1
- package/dist/{sync-C3p7-KLn.mjs → sync-CSe0Rf45.mjs} +1 -1
- package/dist/{sync-C7sxoUYG.cjs → sync-D23jbqVa.cjs} +1 -1
- package/dist/{systemPrompt-DtibzbRU.cjs → systemPrompt-BOy4kU4P.cjs} +4 -3
- package/dist/{systemPrompt-CdHOlyVW.mjs → systemPrompt-CFNKnh65.mjs} +4 -3
- package/dist/{teams-ujXr3AFn.mjs → teams-DyY669f0.mjs} +9 -9
- package/dist/{teams-D7O7TpVU.cjs → teams-Ov2BDT-A.cjs} +9 -9
- package/dist/{time-yEL6wHUF.mjs → time-65DcU6Jx.mjs} +1 -1
- package/dist/{time-Dg5tVB8S.cjs → time-CrwIMHta.cjs} +1 -1
- package/dist/{titleGenerator-BMEaDTwU.cjs → titleGenerator-CS_rh2_J.cjs} +9 -8
- package/dist/{titleGenerator-Dr-BtjzO.mjs → titleGenerator-CiAMxf7s.mjs} +9 -8
- package/dist/{todo-CvJe4M2C.mjs → todo-BDONw0sK.mjs} +7 -7
- package/dist/{todo-CUcFamGs.cjs → todo-KY-okGii.cjs} +7 -7
- package/dist/{tools-BrM3bZW5.mjs → tools-D8-PnZEG.mjs} +1 -1
- package/dist/{tools-DDKTB5aQ.cjs → tools-_w52DZG6.cjs} +1 -1
- package/dist/{uninstall-7oLuhYIu.cjs → uninstall-8vnLN-IE.cjs} +3 -3
- package/dist/{uninstall-CEcMMQGz.mjs → uninstall-_fjGRP9b.mjs} +3 -3
- package/dist/webPanels-B2_C2-3g.mjs +49 -0
- package/dist/webPanels-FCgFKvVe.cjs +53 -0
- package/package.json +7 -7
- package/dist/selfCheck-BAvqBwBR.mjs +0 -84
- package/dist/sessionModeFile-CWVq8AT9.mjs +0 -32
- package/dist/sessionModeFile-CsLtn_PL.cjs +0 -36
- package/dist/spawnAgents-BjtmjBvP.mjs +0 -45
|
@@ -1,85 +1,88 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var mirrorProtocol = require('./mirrorProtocol-
|
|
4
|
-
var piRunnerArgs = require('./piRunnerArgs-
|
|
3
|
+
var mirrorProtocol = require('./mirrorProtocol-DEy2g1CB.cjs');
|
|
4
|
+
var piRunnerArgs = require('./piRunnerArgs-Cs-378Vz.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-
|
|
9
|
-
var spawnAgents = require('./spawnAgents-
|
|
10
|
-
var logger = require('./logger-
|
|
8
|
+
var api = require('./api-Cmjfr8Z7.cjs');
|
|
9
|
+
var spawnAgents = require('./spawnAgents-DsXgegHM.cjs');
|
|
10
|
+
var logger = require('./logger-C1GWx3gi.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-D09T1m8Y.cjs');
|
|
14
|
+
var auth = require('./auth-D6bBUwZa.cjs');
|
|
15
|
+
var configuration = require('./configuration-CMHZnp6G.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-SgqTYsjn.cjs');
|
|
18
|
+
var doctor = require('./doctor-Br1Kcy2J.cjs');
|
|
19
|
+
var spawnHappyCLI = require('./spawnHappyCLI-Dywezwk6.cjs');
|
|
20
|
+
var persistence = require('./persistence-BegE7NPa.cjs');
|
|
21
|
+
var controlClient = require('./controlClient-C-5qCt8W.cjs');
|
|
22
|
+
var sessionOps = require('./sessionOps-S-qPBLFf.cjs');
|
|
23
23
|
var fastify = require('fastify');
|
|
24
24
|
var z = require('zod');
|
|
25
25
|
var fastifyTypeProviderZod = require('fastify-type-provider-zod');
|
|
26
|
-
var authRelay = require('./authRelay-
|
|
26
|
+
var authRelay = require('./authRelay-Dy1qU9td.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-Dj_8voBK.cjs');
|
|
31
|
+
var peerTools = require('./peerTools-DRQETXaz.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-B7i7MkYV.cjs');
|
|
34
|
+
var bootstrap = require('./bootstrap-exVucYav.cjs');
|
|
35
|
+
var index$1 = require('./index-B0UjHlAe.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-CLHS9sv_.cjs');
|
|
42
|
+
var handleResumeCommand = require('./handleResumeCommand-tKD_Hpxc.cjs');
|
|
43
|
+
var webPanels = require('./webPanels-FCgFKvVe.cjs');
|
|
44
|
+
var index = require('./index-C6O2vVjm.cjs');
|
|
43
45
|
var promises = require('node:fs/promises');
|
|
44
46
|
var cliUpdate = require('./cliUpdate-DsKXPFYp.cjs');
|
|
45
|
-
var client = require('./client-
|
|
47
|
+
var client = require('./client-ZjOsn6nZ.cjs');
|
|
48
|
+
var client$1 = require('./client-CuVdN6PP.cjs');
|
|
46
49
|
var module$1 = require('node:module');
|
|
47
50
|
var path$1 = require('./path-B7zW-WwE.cjs');
|
|
48
51
|
var editPaths = require('./editPaths-Bqp4OFPw.cjs');
|
|
49
|
-
var startFileWatcher = require('./startFileWatcher-
|
|
50
|
-
var sync = require('./sync-
|
|
52
|
+
var startFileWatcher = require('./startFileWatcher-RECH5qY8.cjs');
|
|
53
|
+
var sync = require('./sync-D23jbqVa.cjs');
|
|
51
54
|
var types = require('./types-CRS-srZK.cjs');
|
|
52
55
|
var tmuxSocket = require('./tmuxSocket-D-Xt6Vn-.cjs');
|
|
53
|
-
var sessionLock = require('./sessionLock-
|
|
56
|
+
var sessionLock = require('./sessionLock-DokGab2R.cjs');
|
|
54
57
|
var doctor$1 = require('./doctor-u46qYYKX.cjs');
|
|
55
|
-
var resources = require('./resources-
|
|
58
|
+
var resources = require('./resources-CvIlkzpP.cjs');
|
|
56
59
|
var node_util = require('node:util');
|
|
57
|
-
var index = require('./index-De8L5lFK.cjs');
|
|
58
60
|
var template = require('./template-BaHAmH2K.cjs');
|
|
59
61
|
var daemonSupervisor = require('./daemonSupervisor-B-SPSqhs.cjs');
|
|
60
62
|
var loginShellEnv = require('./loginShellEnv-BkuYtExZ.cjs');
|
|
61
|
-
require('./
|
|
62
|
-
require('./lidState-
|
|
63
|
+
require('./acpSessionResume-oiCBnAVA.cjs');
|
|
64
|
+
require('./lidState-Dv2wwFTj.cjs');
|
|
63
65
|
require('os');
|
|
64
66
|
require('node:events');
|
|
65
67
|
require('socket.io-client');
|
|
66
|
-
require('./
|
|
68
|
+
require('./pushNotifications-DaLQUyi0.cjs');
|
|
69
|
+
require('./contentLogMetadata-ZSFk_NjQ.cjs');
|
|
67
70
|
require('./limits-C-a7gr04.cjs');
|
|
68
|
-
require('./time-
|
|
69
|
-
require('./registerCommonHandlers-
|
|
71
|
+
require('./time-CrwIMHta.cjs');
|
|
72
|
+
require('./registerCommonHandlers-Cj084Sg7.cjs');
|
|
70
73
|
require('util');
|
|
71
74
|
require('crypto');
|
|
72
75
|
require('cross-spawn');
|
|
73
76
|
require('@paralleldrive/cuid2');
|
|
74
|
-
require('./contentLogMetadata-ZSFk_NjQ.cjs');
|
|
75
77
|
require('chalk');
|
|
76
78
|
require('tweetnacl');
|
|
77
|
-
require('./browser-
|
|
79
|
+
require('./browser-BohJK12g.cjs');
|
|
78
80
|
require('open');
|
|
79
81
|
require('./ids-B6ZC0HGt.cjs');
|
|
80
82
|
require('url');
|
|
81
83
|
require('./detectCLI-DR9ZaN6B.cjs');
|
|
82
|
-
require('./localHappyAgentAuth-
|
|
84
|
+
require('./localHappyAgentAuth-DjYvkXvV.cjs');
|
|
85
|
+
require('./processTreeSnapshot-mDbnuojn.cjs');
|
|
83
86
|
require('ps-list');
|
|
84
87
|
|
|
85
88
|
var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
|
|
@@ -187,7 +190,7 @@ function startCaffeinate() {
|
|
|
187
190
|
}
|
|
188
191
|
killOrphanedCaffeinateProcesses();
|
|
189
192
|
try {
|
|
190
|
-
caffeinateProcess = child_process.spawn("caffeinate",
|
|
193
|
+
caffeinateProcess = child_process.spawn("caffeinate", caffeinateArgs(process.pid), {
|
|
191
194
|
stdio: "ignore",
|
|
192
195
|
detached: false
|
|
193
196
|
});
|
|
@@ -254,12 +257,36 @@ function setupCleanupHandlers() {
|
|
|
254
257
|
cleanup();
|
|
255
258
|
});
|
|
256
259
|
}
|
|
260
|
+
function caffeinateArgs(daemonPid) {
|
|
261
|
+
return ["-im", "-w", String(daemonPid)];
|
|
262
|
+
}
|
|
263
|
+
function orphanedLegacyCaffeinatePids(psOutput) {
|
|
264
|
+
const pids = [];
|
|
265
|
+
for (const line of psOutput.split("\n")) {
|
|
266
|
+
const m = /^\s*(\d+)\s+(\d+)\s+(.*?)\s*$/.exec(line);
|
|
267
|
+
if (!m) continue;
|
|
268
|
+
const [, pid, ppid, command] = m;
|
|
269
|
+
if (ppid !== "1") continue;
|
|
270
|
+
if (!/^(?:\/usr\/bin\/)?caffeinate -im$/.test(command)) continue;
|
|
271
|
+
pids.push(Number(pid));
|
|
272
|
+
}
|
|
273
|
+
return pids;
|
|
274
|
+
}
|
|
257
275
|
function killOrphanedCaffeinateProcesses() {
|
|
258
276
|
if (process.platform !== "darwin") return;
|
|
277
|
+
let ps;
|
|
259
278
|
try {
|
|
260
|
-
child_process.execSync(
|
|
261
|
-
|
|
262
|
-
|
|
279
|
+
ps = child_process.execSync("ps -A -o pid=,ppid=,command=", { timeout: 5e3, encoding: "utf8" });
|
|
280
|
+
} catch (error) {
|
|
281
|
+
logger.logger.debug("[caffeinate] Could not list processes; skipping orphan cleanup:", error);
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
for (const pid of orphanedLegacyCaffeinatePids(ps)) {
|
|
285
|
+
try {
|
|
286
|
+
process.kill(pid, "SIGTERM");
|
|
287
|
+
logger.logger.debug(`[caffeinate] Killed orphaned legacy caffeinate PID ${pid}`);
|
|
288
|
+
} catch {
|
|
289
|
+
}
|
|
263
290
|
}
|
|
264
291
|
}
|
|
265
292
|
|
|
@@ -369,6 +396,12 @@ function formatAssistantReportMessage(title, sessionId, event) {
|
|
|
369
396
|
|
|
370
397
|
function resumePrecheck(metadata, fs) {
|
|
371
398
|
const flavor = metadata.flavor ?? "claude";
|
|
399
|
+
if (flavor === "acp" && metadata.piSessionId) {
|
|
400
|
+
if (!metadata.path || !fs.cwdExists(metadata.path)) {
|
|
401
|
+
return { ok: false, reason: "missing-cwd", detail: `working directory ${metadata.path ?? "(none)"} does not exist` };
|
|
402
|
+
}
|
|
403
|
+
return { ok: true };
|
|
404
|
+
}
|
|
372
405
|
if (flavor !== "claude" && flavor !== "codex") {
|
|
373
406
|
return { ok: false, reason: "unsupported-flavor", detail: `flavor "${flavor}" cannot be resumed` };
|
|
374
407
|
}
|
|
@@ -2052,6 +2085,89 @@ function spawnAgentUnavailableError(agent, availability) {
|
|
|
2052
2085
|
return null;
|
|
2053
2086
|
}
|
|
2054
2087
|
|
|
2088
|
+
function startWebPanelsSync(deps) {
|
|
2089
|
+
let lastMtime;
|
|
2090
|
+
let lastProblems = "";
|
|
2091
|
+
let stopped = false;
|
|
2092
|
+
let inflight = null;
|
|
2093
|
+
const run = async () => {
|
|
2094
|
+
try {
|
|
2095
|
+
const mtime = await deps.statMtime();
|
|
2096
|
+
if (mtime === lastMtime) return;
|
|
2097
|
+
lastMtime = mtime;
|
|
2098
|
+
const { panels, problems } = webPanels.normalizeWebPanels(mtime === null ? void 0 : await deps.readRaw());
|
|
2099
|
+
const key = JSON.stringify(problems);
|
|
2100
|
+
if (problems.length > 0 && key !== lastProblems) deps.logProblems(problems);
|
|
2101
|
+
lastProblems = key;
|
|
2102
|
+
await deps.publish(panels);
|
|
2103
|
+
} catch {
|
|
2104
|
+
lastMtime = void 0;
|
|
2105
|
+
}
|
|
2106
|
+
};
|
|
2107
|
+
const tick = () => {
|
|
2108
|
+
if (stopped) return Promise.resolve();
|
|
2109
|
+
inflight ??= run().finally(() => {
|
|
2110
|
+
inflight = null;
|
|
2111
|
+
});
|
|
2112
|
+
return inflight;
|
|
2113
|
+
};
|
|
2114
|
+
void tick();
|
|
2115
|
+
const timer = setInterval(() => {
|
|
2116
|
+
void tick();
|
|
2117
|
+
}, deps.intervalMs ?? 2e3);
|
|
2118
|
+
timer.unref?.();
|
|
2119
|
+
return { stop: () => {
|
|
2120
|
+
stopped = true;
|
|
2121
|
+
clearInterval(timer);
|
|
2122
|
+
}, tick };
|
|
2123
|
+
}
|
|
2124
|
+
|
|
2125
|
+
function isAcceptableRelayUrl(url) {
|
|
2126
|
+
try {
|
|
2127
|
+
const parsed = new URL(url);
|
|
2128
|
+
const loopback = parsed.hostname === "localhost" || parsed.hostname === "127.0.0.1" || parsed.hostname === "[::1]";
|
|
2129
|
+
return parsed.protocol === "https:" || parsed.protocol === "http:" && loopback;
|
|
2130
|
+
} catch {
|
|
2131
|
+
return false;
|
|
2132
|
+
}
|
|
2133
|
+
}
|
|
2134
|
+
async function applyServerMigration(raw, deps) {
|
|
2135
|
+
const parsed = index.ServerMigrateNoticeSchema.safeParse(raw);
|
|
2136
|
+
if (!parsed.success) return { action: "ignored", reason: "malformed notice" };
|
|
2137
|
+
const notice = parsed.data;
|
|
2138
|
+
if (authRelay.sameRelay(notice.url, deps.configuredServerUrl)) return { action: "ignored", reason: "already on that relay" };
|
|
2139
|
+
if (!isAcceptableRelayUrl(notice.url) || !isAcceptableRelayUrl(notice.webappUrl)) {
|
|
2140
|
+
return refuse(deps, `relay URL must be https: ${notice.url}`);
|
|
2141
|
+
}
|
|
2142
|
+
if (deps.env.HAPPY_SERVER_URL?.trim()) {
|
|
2143
|
+
return refuse(deps, `HAPPY_SERVER_URL is set in this daemon's environment; unset it (or point it at ${notice.url}) and restart the daemon`);
|
|
2144
|
+
}
|
|
2145
|
+
const credentials = await deps.readCredentials();
|
|
2146
|
+
if (!credentials) return refuse(deps, "no credentials on disk");
|
|
2147
|
+
let token;
|
|
2148
|
+
try {
|
|
2149
|
+
const response = await deps.fetch(`${notice.url}/v1/auth/migrate/complete`, {
|
|
2150
|
+
method: "POST",
|
|
2151
|
+
headers: { "content-type": "application/json", "X-Happy-Client": deps.clientId },
|
|
2152
|
+
body: JSON.stringify({ handoff: notice.handoff })
|
|
2153
|
+
});
|
|
2154
|
+
if (!response.ok) return refuse(deps, `${notice.url} refused the handoff (HTTP ${response.status})`);
|
|
2155
|
+
const body = await response.json();
|
|
2156
|
+
if (body.kind !== "daemon" || typeof body.token !== "string" || !body.token) return refuse(deps, `${notice.url} answered without a daemon token`);
|
|
2157
|
+
token = body.token;
|
|
2158
|
+
} catch (error) {
|
|
2159
|
+
return refuse(deps, `${notice.url} unreachable: ${error instanceof Error ? error.message : String(error)}`);
|
|
2160
|
+
}
|
|
2161
|
+
await deps.updateSettings((current) => ({ ...current, serverUrl: notice.url, webappUrl: notice.webappUrl }));
|
|
2162
|
+
await deps.rewriteCredentials(credentials, { token, authServerUrl: notice.url });
|
|
2163
|
+
deps.log(`[RELAY MOVE] Moved this machine from ${deps.configuredServerUrl} to ${notice.url}; handing over to a new daemon`);
|
|
2164
|
+
return { action: "moved", serverUrl: notice.url, webappUrl: notice.webappUrl };
|
|
2165
|
+
}
|
|
2166
|
+
function refuse(deps, reason) {
|
|
2167
|
+
deps.log(`[RELAY MOVE] Not moving this machine: ${reason}`);
|
|
2168
|
+
return { action: "refused", reason };
|
|
2169
|
+
}
|
|
2170
|
+
|
|
2055
2171
|
function str(value) {
|
|
2056
2172
|
return typeof value === "string" && value.length > 0 ? value : void 0;
|
|
2057
2173
|
}
|
|
@@ -2461,6 +2577,44 @@ function createUpdateController(deps) {
|
|
|
2461
2577
|
return { refresh, retry, request, tick, withHandover, holdHandover, isRunning: () => running };
|
|
2462
2578
|
}
|
|
2463
2579
|
|
|
2580
|
+
function buildPresenceBatch(live, previous) {
|
|
2581
|
+
const current = new Set(live.map((s) => s.sessionId));
|
|
2582
|
+
const sessions = live.slice(0, 200).map((s) => ({
|
|
2583
|
+
sessionId: s.sessionId,
|
|
2584
|
+
state: s.running ? "running" : "idle",
|
|
2585
|
+
...s.flavor ? { agent: s.flavor } : {},
|
|
2586
|
+
...s.branch ? { branch: s.branch.slice(0, 200) } : {}
|
|
2587
|
+
}));
|
|
2588
|
+
const gone = [...previous].filter((id) => !current.has(id)).slice(0, 200);
|
|
2589
|
+
return { sessions, gone, current };
|
|
2590
|
+
}
|
|
2591
|
+
function createProjectPresenceReporter(deps) {
|
|
2592
|
+
let previous = /* @__PURE__ */ new Set();
|
|
2593
|
+
let running = false;
|
|
2594
|
+
async function tick() {
|
|
2595
|
+
if (running || deps.client.isDisabled()) return;
|
|
2596
|
+
running = true;
|
|
2597
|
+
try {
|
|
2598
|
+
const batch = buildPresenceBatch(deps.live(), previous);
|
|
2599
|
+
if (batch.sessions.length === 0 && batch.gone.length === 0) {
|
|
2600
|
+
previous = batch.current;
|
|
2601
|
+
return;
|
|
2602
|
+
}
|
|
2603
|
+
await deps.client.presence(deps.machineId, batch.sessions, batch.gone);
|
|
2604
|
+
previous = batch.current;
|
|
2605
|
+
} catch (error) {
|
|
2606
|
+
if (!(error instanceof client.ProjectsUnsupportedError)) deps.log(`project presence tick failed: ${String(error)}`);
|
|
2607
|
+
} finally {
|
|
2608
|
+
running = false;
|
|
2609
|
+
}
|
|
2610
|
+
}
|
|
2611
|
+
const timer = setInterval(() => {
|
|
2612
|
+
void tick();
|
|
2613
|
+
}, deps.intervalMs ?? 6e4);
|
|
2614
|
+
timer.unref?.();
|
|
2615
|
+
return { tick, stop: () => clearInterval(timer) };
|
|
2616
|
+
}
|
|
2617
|
+
|
|
2464
2618
|
const AUTOMATION_BINDINGS_TTL_MS = 10 * 60 * 1e3;
|
|
2465
2619
|
const HIBERNATION_IN_FLIGHT_MS = 6e4;
|
|
2466
2620
|
const HIBERNATION_EXIT_WAIT_MS = 15e3;
|
|
@@ -2651,7 +2805,7 @@ function parseJsonObject(text) {
|
|
|
2651
2805
|
return null;
|
|
2652
2806
|
}
|
|
2653
2807
|
}
|
|
2654
|
-
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-
|
|
2808
|
+
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-CNXwIe0A.cjs', document.baseURI).href))).resolve(s)) {
|
|
2655
2809
|
const platformArch = `${platform}-${arch}`;
|
|
2656
2810
|
const candidates = [
|
|
2657
2811
|
`@anthropic-ai/claude-agent-sdk-${platformArch}/claude`,
|
|
@@ -4262,7 +4416,7 @@ function expandHome(path$1) {
|
|
|
4262
4416
|
return path$1;
|
|
4263
4417
|
}
|
|
4264
4418
|
function isSettledByServer(error) {
|
|
4265
|
-
if (!(error instanceof client.AutomationsRequestError)) return false;
|
|
4419
|
+
if (!(error instanceof client$1.AutomationsRequestError)) return false;
|
|
4266
4420
|
if (error.status === 409 && (error.code === "run_finished" || error.code === "claim_mismatch")) return true;
|
|
4267
4421
|
return error.status === 404 && error.code === "run_not_found";
|
|
4268
4422
|
}
|
|
@@ -4271,7 +4425,7 @@ function scriptAlive(item) {
|
|
|
4271
4425
|
}
|
|
4272
4426
|
function createAutomationRunner(deps) {
|
|
4273
4427
|
const home = deps.home ?? configuration.configuration.happyHomeDir;
|
|
4274
|
-
const client
|
|
4428
|
+
const client = deps.client ?? client$1.createAutomationsClient({ serverUrl: deps.serverUrl ?? configuration.configuration.serverUrl, token: deps.token, client: "daemon-auto" });
|
|
4275
4429
|
const runScript$1 = deps.runScript ?? runScript;
|
|
4276
4430
|
const runPrecheck$1 = deps.runPrecheck ?? runPrecheck;
|
|
4277
4431
|
const readTurn = deps.readTurn ?? defaultReadTurn;
|
|
@@ -4291,9 +4445,9 @@ function createAutomationRunner(deps) {
|
|
|
4291
4445
|
}
|
|
4292
4446
|
async function finish(item, report2) {
|
|
4293
4447
|
try {
|
|
4294
|
-
await client
|
|
4448
|
+
await client.report(item.runId, report2);
|
|
4295
4449
|
} catch (error) {
|
|
4296
|
-
if (report2.status === "skipped" && error instanceof client.AutomationsRequestError && error.status === 400) {
|
|
4450
|
+
if (report2.status === "skipped" && error instanceof client$1.AutomationsRequestError && error.status === 400) {
|
|
4297
4451
|
await finish(item, { ...report2, status: "failed" });
|
|
4298
4452
|
return;
|
|
4299
4453
|
}
|
|
@@ -4319,7 +4473,7 @@ function createAutomationRunner(deps) {
|
|
|
4319
4473
|
async function reportRunning(item, sessionId, stickyKey) {
|
|
4320
4474
|
const body = { claimId: item.claimId, status: "running", ...sessionId ? { sessionId } : {}, ...stickyKey ? { stickyKey } : {} };
|
|
4321
4475
|
try {
|
|
4322
|
-
await client
|
|
4476
|
+
await client.report(item.runId, body);
|
|
4323
4477
|
} catch (error) {
|
|
4324
4478
|
if (isSettledByServer(error)) {
|
|
4325
4479
|
settleExternally(item);
|
|
@@ -4504,7 +4658,7 @@ ${action.prompt}`, { localId: `automation-${run.id}` });
|
|
|
4504
4658
|
await reportRunning(track(claimed, "send", bound.sessionId), bound.sessionId, stickyKey);
|
|
4505
4659
|
return;
|
|
4506
4660
|
}
|
|
4507
|
-
if (bound) await client
|
|
4661
|
+
if (bound) await client.deleteSticky(automation.id, stickyKey).catch(() => deps.log(`Automation ${automation.name}: stale sticky ${stickyKey} not cleared`));
|
|
4508
4662
|
}
|
|
4509
4663
|
let directory = expandHome(action.directory);
|
|
4510
4664
|
if (!path.isAbsolute(directory)) {
|
|
@@ -4527,6 +4681,7 @@ ${action.prompt}`, { localId: `automation-${run.id}` });
|
|
|
4527
4681
|
}
|
|
4528
4682
|
persist({ runId: run.id, automationId: automation.id, kind: "spawn", phase: "running", claimId: run.claimId, sessionId: spawned.sessionId, stickyKey, ...action.worktree ? { directory } : {} });
|
|
4529
4683
|
const item = track(claimed, "spawn", spawned.sessionId);
|
|
4684
|
+
if (automation.projectId && deps.joinProject) await deps.joinProject(spawned.sessionId, automation.projectId).catch(() => void 0);
|
|
4530
4685
|
try {
|
|
4531
4686
|
const capabilities = persistence.readPersistedSessions()[spawned.sessionId]?.metadata?.capabilities ?? null;
|
|
4532
4687
|
const meta = spawnAgents.resolveFirstMessageMeta({ agent, permissionMode, explicitModel: action.model ?? void 0, capabilities });
|
|
@@ -4584,7 +4739,7 @@ ${action.prompt}`, { localId: `automation-${run.id}`, ...meta });
|
|
|
4584
4739
|
item.lastLeaseAt = at;
|
|
4585
4740
|
const body = { claimId: item.claimId, leaseMs: index.AUTOMATION_DEFAULT_LEASE_MS, ...item.pendingRunning ? { status: "running", ...item.pendingRunning } : {} };
|
|
4586
4741
|
try {
|
|
4587
|
-
const run = await client
|
|
4742
|
+
const run = await client.report(item.runId, body);
|
|
4588
4743
|
item.pendingRunning = void 0;
|
|
4589
4744
|
if (index.isAutomationRunTerminal(run.status)) settleExternally(item);
|
|
4590
4745
|
} catch (error) {
|
|
@@ -4630,10 +4785,10 @@ ${action.prompt}`, { localId: `automation-${run.id}`, ...meta });
|
|
|
4630
4785
|
const capacity = AUTOMATION_MAX_CONCURRENT - tracked.size;
|
|
4631
4786
|
if (now() >= disabledUntil && capacity > 0) {
|
|
4632
4787
|
try {
|
|
4633
|
-
const claimed = await client
|
|
4788
|
+
const claimed = await client.claim({ machineId: deps.machineId, limit: capacity, leaseMs: index.AUTOMATION_DEFAULT_LEASE_MS, capabilities: [index.AUTOMATION_DAEMON_CAPABILITY_PRECHECK] });
|
|
4634
4789
|
await Promise.all(claimed.runs.map((entry) => closed ? Promise.resolve() : execute(entry).catch((error) => deps.log(`Automation run ${entry.run.id} failed to start: ${error instanceof Error ? error.message : String(error)}`))));
|
|
4635
4790
|
} catch (error) {
|
|
4636
|
-
if (client.isAutomationsUnavailable(error)) {
|
|
4791
|
+
if (client$1.isAutomationsUnavailable(error)) {
|
|
4637
4792
|
disabledUntil = now() + 6e4;
|
|
4638
4793
|
if (now() - lastUnavailableLogAt >= AUTOMATION_UNAVAILABLE_LOG_MS) {
|
|
4639
4794
|
lastUnavailableLogAt = now();
|
|
@@ -4641,7 +4796,7 @@ ${action.prompt}`, { localId: `automation-${run.id}`, ...meta });
|
|
|
4641
4796
|
}
|
|
4642
4797
|
} else {
|
|
4643
4798
|
disabledUntil = now() + 1e4;
|
|
4644
|
-
deps.log(`Automation claim failed${error instanceof client.AutomationsRequestError ? ` (${error.status})` : ""}`);
|
|
4799
|
+
deps.log(`Automation claim failed${error instanceof client$1.AutomationsRequestError ? ` (${error.status})` : ""}`);
|
|
4645
4800
|
}
|
|
4646
4801
|
}
|
|
4647
4802
|
}
|
|
@@ -4656,7 +4811,7 @@ ${action.prompt}`, { localId: `automation-${run.id}`, ...meta });
|
|
|
4656
4811
|
if (event === "idle") item.attentionReported = false;
|
|
4657
4812
|
if (event === "blocked" && !item.attentionReported) {
|
|
4658
4813
|
item.attentionReported = true;
|
|
4659
|
-
void client
|
|
4814
|
+
void client.report(item.runId, { claimId: item.claimId, needsAttention: true, attentionReason: "needs_input" }).catch(() => deps.log(`Automation run ${item.runId} attention report failed`));
|
|
4660
4815
|
}
|
|
4661
4816
|
}
|
|
4662
4817
|
}
|
|
@@ -4850,7 +5005,7 @@ async function startDaemon() {
|
|
|
4850
5005
|
const turnActivity = new api.TurnActivityTracker();
|
|
4851
5006
|
const backgroundTasks = new backgroundTaskActivity.BackgroundTaskTracker();
|
|
4852
5007
|
const peerCoordinator = createPeerCoordinator({ getChildren: () => Array.from(pidToTrackedSession.values()) });
|
|
4853
|
-
const hibernationAutomations = client.createAutomationsClient({ serverUrl: configuration.configuration.serverUrl, token: credentials.token, client: "daemon-hibernate" });
|
|
5008
|
+
const hibernationAutomations = client$1.createAutomationsClient({ serverUrl: configuration.configuration.serverUrl, token: credentials.token, client: "daemon-hibernate" });
|
|
4854
5009
|
const daemonHibernation = createDaemonHibernation({
|
|
4855
5010
|
idleMs: () => persistence.resolveIdleMs(agentHibernationSetting),
|
|
4856
5011
|
checkMs: persistence.resolveCheckMs(),
|
|
@@ -4873,7 +5028,7 @@ async function startDaemon() {
|
|
|
4873
5028
|
try {
|
|
4874
5029
|
return await collectAutomationBindings(hibernationAutomations, machineId);
|
|
4875
5030
|
} catch (error) {
|
|
4876
|
-
if (client.isAutomationsUnavailable(error)) return [];
|
|
5031
|
+
if (client$1.isAutomationsUnavailable(error)) return [];
|
|
4877
5032
|
throw error;
|
|
4878
5033
|
}
|
|
4879
5034
|
},
|
|
@@ -4887,6 +5042,7 @@ async function startDaemon() {
|
|
|
4887
5042
|
const sessionIdToFinishedSession = /* @__PURE__ */ new Map();
|
|
4888
5043
|
let teamWorker;
|
|
4889
5044
|
let automationRunner;
|
|
5045
|
+
let projectPresence;
|
|
4890
5046
|
const persisted = persistence.readPersistedSessions();
|
|
4891
5047
|
const liveHappyProcesses = await doctor$1.findAllHappyProcesses();
|
|
4892
5048
|
for (const [id, s] of Object.entries(persisted)) {
|
|
@@ -4976,6 +5132,7 @@ async function startDaemon() {
|
|
|
4976
5132
|
}
|
|
4977
5133
|
};
|
|
4978
5134
|
const assistantSpawnGate = createSpawnGate();
|
|
5135
|
+
const projectsClient = client.createProjectsClient({ token: async () => credentials.token });
|
|
4979
5136
|
const spawnSession = async (options) => {
|
|
4980
5137
|
const timer = createSpawnTimer();
|
|
4981
5138
|
await index$1.refreshAgentHomes(Date.now(), { allowStale: true });
|
|
@@ -4987,6 +5144,10 @@ async function startDaemon() {
|
|
|
4987
5144
|
result = await (options.forceNew ? assistantSpawnGate.replace(() => spawnSessionImpl(options, timer)) : assistantSpawnGate.join(() => spawnSessionImpl(options, timer)));
|
|
4988
5145
|
}
|
|
4989
5146
|
logger.logger.debug(timer.format({ agent: options.agent ?? "claude", outcome: result.type }));
|
|
5147
|
+
if (result.type === "success" && options.parentSessionId) {
|
|
5148
|
+
const outcome = await spawnAgents.joinProject(projectsClient, result.sessionId, { kind: "lineage", parentSessionId: options.parentSessionId });
|
|
5149
|
+
if (outcome.joined) logger.logger.debug(`[DAEMON RUN] fork ${result.sessionId} joined project ${outcome.projectId} (lineage)`);
|
|
5150
|
+
}
|
|
4990
5151
|
return result;
|
|
4991
5152
|
};
|
|
4992
5153
|
const currentCliAvailability = () => apiMachineRef?.getCLIAvailability() ?? startupCliAvailability;
|
|
@@ -5617,7 +5778,7 @@ async function startDaemon() {
|
|
|
5617
5778
|
resolve();
|
|
5618
5779
|
}
|
|
5619
5780
|
};
|
|
5620
|
-
const requested = sessionLock.
|
|
5781
|
+
const requested = sessionLock.terminateProcessTree(pid, () => {
|
|
5621
5782
|
const tracked = pidToTrackedSession.get(pid);
|
|
5622
5783
|
if (tracked) {
|
|
5623
5784
|
if (tracked.happySessionId && tracked.encryption) {
|
|
@@ -5733,7 +5894,7 @@ async function startDaemon() {
|
|
|
5733
5894
|
logger.logger.debug(`[DAEMON RUN] Attempting to stop session ${sessionId}`);
|
|
5734
5895
|
for (const [pid, session] of pidToTrackedSession.entries()) {
|
|
5735
5896
|
if (session.happySessionId === sessionId || sessionId.startsWith("PID-") && pid === parseInt(sessionId.replace("PID-", ""))) {
|
|
5736
|
-
const requested = sessionLock.
|
|
5897
|
+
const requested = sessionLock.terminateProcessTree(pid, (stopped) => {
|
|
5737
5898
|
if (!stopped) {
|
|
5738
5899
|
logger.logger.debug(`[DAEMON RUN] Session ${sessionId} survived SIGTERM and SIGKILL attempts`);
|
|
5739
5900
|
return;
|
|
@@ -5996,6 +6157,12 @@ async function startDaemon() {
|
|
|
5996
6157
|
daemonHibernation.invalidateBindings();
|
|
5997
6158
|
return persistence.resolveIdleMs(agentHibernationSetting);
|
|
5998
6159
|
});
|
|
6160
|
+
const webPanelsSync = startWebPanelsSync({
|
|
6161
|
+
statMtime: async () => (await fs.stat(configuration.configuration.settingsFile).catch(() => null))?.mtimeMs ?? null,
|
|
6162
|
+
readRaw: async () => (await persistence.readSettings()).webPanels,
|
|
6163
|
+
publish: (panels) => apiMachine.setWebPanels(panels),
|
|
6164
|
+
logProblems: (problems) => logger.logger.warn(`[DAEMON RUN] settings.json webPanels: skipped ${problems.length} entr${problems.length === 1 ? "y" : "ies"}: ${problems.map((p) => `#${p.index}${p.id ? ` (${p.id})` : ""} ${p.reason}`).join("; ")}`)
|
|
6165
|
+
});
|
|
5999
6166
|
apiMachine.connect();
|
|
6000
6167
|
if (identityConflict?.confidence === "weak") {
|
|
6001
6168
|
void apiMachine.updateMachineMetadata((current) => ({
|
|
@@ -6029,6 +6196,27 @@ async function startDaemon() {
|
|
|
6029
6196
|
});
|
|
6030
6197
|
apiMachine.setCliUpdateRetryHandler(updateController.retry);
|
|
6031
6198
|
apiMachine.setCliUpdateRequestHandler(updateController.request);
|
|
6199
|
+
let pendingRelayMove = null;
|
|
6200
|
+
let relayMoveInFlight = null;
|
|
6201
|
+
apiMachine.setServerMigrateHandler((notice) => {
|
|
6202
|
+
if (relayMoveInFlight || pendingRelayMove) return;
|
|
6203
|
+
relayMoveInFlight = applyServerMigration(notice, {
|
|
6204
|
+
configuredServerUrl: configuration.configuration.serverUrl,
|
|
6205
|
+
env: process.env,
|
|
6206
|
+
clientId: `cli-daemon/${configuration.configuration.currentCliVersion}`,
|
|
6207
|
+
fetch,
|
|
6208
|
+
readCredentials: persistence.readCredentials,
|
|
6209
|
+
rewriteCredentials: persistence.rewriteCredentialsForRelay,
|
|
6210
|
+
updateSettings: persistence.updateSettings,
|
|
6211
|
+
log: (message) => logger.logger.warn(message)
|
|
6212
|
+
}).then((outcome) => {
|
|
6213
|
+
if (outcome.action === "moved") pendingRelayMove = { serverUrl: outcome.serverUrl };
|
|
6214
|
+
}).catch((error) => {
|
|
6215
|
+
logger.logger.warn("[RELAY MOVE] Failed:", error);
|
|
6216
|
+
}).finally(() => {
|
|
6217
|
+
relayMoveInFlight = null;
|
|
6218
|
+
});
|
|
6219
|
+
});
|
|
6032
6220
|
const refreshCliUpdate = () => updateController.refresh().catch((error) => {
|
|
6033
6221
|
logger.logger.debug("[DAEMON RUN] CLI update policy check failed:", error);
|
|
6034
6222
|
});
|
|
@@ -6066,8 +6254,9 @@ async function startDaemon() {
|
|
|
6066
6254
|
} catch {
|
|
6067
6255
|
}
|
|
6068
6256
|
}
|
|
6069
|
-
|
|
6070
|
-
|
|
6257
|
+
const relayMove = pendingRelayMove;
|
|
6258
|
+
if ((bundleReplaced || relayMove) && !teamWorker?.busy && !automationRunner?.busy && !updateController.isRunning() && !turnActivity.hasActiveTurn() && !backgroundTasks.hasAny()) {
|
|
6259
|
+
const preflight = bundleReplaced ? await preflightNewBundle(bundlePath) : { action: "proceed" };
|
|
6071
6260
|
if (preflight.action === "hold") {
|
|
6072
6261
|
if (lastHandoverHold !== preflight.reason) {
|
|
6073
6262
|
lastHandoverHold = preflight.reason;
|
|
@@ -6078,9 +6267,10 @@ async function startDaemon() {
|
|
|
6078
6267
|
}
|
|
6079
6268
|
if (teamWorker?.busy || automationRunner?.busy || updateController.isRunning() || turnActivity.hasActiveTurn() || backgroundTasks.hasAny()) return;
|
|
6080
6269
|
lastHandoverHold = null;
|
|
6081
|
-
logger.logger.debug("[DAEMON RUN] Daemon bundle replaced on disk and verified, handing off to new daemon");
|
|
6270
|
+
logger.logger.debug(relayMove ? `[DAEMON RUN] Relay moved to ${relayMove.serverUrl}; handing off to a new daemon on the new settings` : "[DAEMON RUN] Daemon bundle replaced on disk and verified, handing off to new daemon");
|
|
6082
6271
|
teamWorker?.stop();
|
|
6083
6272
|
automationRunner?.stop();
|
|
6273
|
+
projectPresence?.stop();
|
|
6084
6274
|
clearInterval(restartOnStaleVersionAndHeartbeat);
|
|
6085
6275
|
clearInterval(cliUpdateInterval);
|
|
6086
6276
|
stopAgentVersionChecks();
|
|
@@ -6154,6 +6344,18 @@ async function startDaemon() {
|
|
|
6154
6344
|
if (result.type !== "success") return false;
|
|
6155
6345
|
return waitForSessionLive(id, (sid) => [...pidToTrackedSession.values()].some((s) => s.happySessionId === sid && isPidAlive(s.pid)));
|
|
6156
6346
|
},
|
|
6347
|
+
joinProject: (sessionId, projectId) => spawnAgents.joinProject(projectsClient, sessionId, { kind: "explicit", projectId }, { via: "automation" }),
|
|
6348
|
+
log: (message) => logger.logger.debug(`[DAEMON RUN] ${message}`)
|
|
6349
|
+
});
|
|
6350
|
+
projectPresence = createProjectPresenceReporter({
|
|
6351
|
+
machineId,
|
|
6352
|
+
client: projectsClient,
|
|
6353
|
+
live: () => [...pidToTrackedSession.values()].filter((s) => s.happySessionId && isPidAlive(s.pid)).map((s) => ({
|
|
6354
|
+
sessionId: s.happySessionId,
|
|
6355
|
+
flavor: s.happySessionMetadataFromLocalWebhook?.flavor ?? null,
|
|
6356
|
+
branch: s.happySessionMetadataFromLocalWebhook?.worktree?.branch ?? null,
|
|
6357
|
+
running: turnActivity.activeSessions().includes(s.happySessionId)
|
|
6358
|
+
})),
|
|
6157
6359
|
log: (message) => logger.logger.debug(`[DAEMON RUN] ${message}`)
|
|
6158
6360
|
});
|
|
6159
6361
|
void apiMachine.updateMachineMetadata((current) => ({
|
|
@@ -6164,10 +6366,12 @@ async function startDaemon() {
|
|
|
6164
6366
|
worktreeVersion: mirrorProtocol.WORKTREE_CAPABILITY_VERSION
|
|
6165
6367
|
})).catch(() => logger.logger.debug("[DAEMON RUN] Teams capability publication will retry on reconnect"));
|
|
6166
6368
|
const cleanupAndShutdown = async (source, errorMessage) => {
|
|
6369
|
+
webPanelsSync.stop();
|
|
6167
6370
|
logger.logger.debug(`[DAEMON RUN] Starting proper cleanup (source: ${source}, errorMessage: ${errorMessage})...`);
|
|
6168
6371
|
const scrollbackFlush = apiMachine.flushTerminalScrollback();
|
|
6169
6372
|
teamWorker?.stop();
|
|
6170
6373
|
automationRunner?.stop({ killScripts: true });
|
|
6374
|
+
projectPresence?.stop();
|
|
6171
6375
|
mirrorProtocol.currentWorktreeService()?.stopAll();
|
|
6172
6376
|
if (restartOnStaleVersionAndHeartbeat) {
|
|
6173
6377
|
clearInterval(restartOnStaleVersionAndHeartbeat);
|