very-happy-cli 0.2.182 → 0.2.184
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-DLk3gMYH.mjs → AcpBackend-Csg7Sy2P.mjs} +3 -3
- package/dist/{AcpBackend-JA5eu8Y0.cjs → AcpBackend-DOzn74zn.cjs} +3 -3
- package/dist/{AcpSessionManager-OrCww-Qv.mjs → AcpSessionManager-BRK2F2yN.mjs} +10 -3
- package/dist/{AcpSessionManager-DjYidq4C.cjs → AcpSessionManager-CJXDNNtq.cjs} +10 -3
- package/dist/{BasePermissionHandler-u-neo-iN.mjs → BasePermissionHandler-BqYwrCra.mjs} +1 -1
- package/dist/{BasePermissionHandler-D3PMKLBS.cjs → BasePermissionHandler-CfrnkG3v.cjs} +1 -1
- package/dist/{acpSessionResume-Dxo8222T.cjs → acpSessionResume-DZ65DBeE.cjs} +1 -1
- package/dist/{acpSessionResume-u2TwX5Jd.mjs → acpSessionResume-Dz1myMbR.mjs} +1 -1
- package/dist/{agentHome-D3hNrnoA.mjs → agentHome-B_tu3tFJ.mjs} +4 -4
- package/dist/{agentHome-CP1tCBXz.cjs → agentHome-CKAXhc8P.cjs} +4 -4
- package/dist/{api-C_YSQnsi.mjs → api-BpTDU2BO.mjs} +79 -12
- package/dist/{api-CZWcG7uh.cjs → api-rw5xkzxo.cjs} +81 -11
- package/dist/{apiMachine-DPGrED5C.cjs → apiMachine-Bs1XXHKs.cjs} +14 -14
- package/dist/{apiMachine-C_GA5Bm-.mjs → apiMachine-wp0hWG3F.mjs} +14 -14
- package/dist/{attachmentContent-Ckzyb1Uy.mjs → attachmentContent-CWSSGMMo.mjs} +2 -2
- package/dist/{attachmentContent-I_dJIevE.cjs → attachmentContent-K_Up4InS.cjs} +2 -2
- package/dist/{auth-BKnE7uv7.cjs → auth-C4_mXYgj.cjs} +8 -8
- package/dist/{auth-DOXMI-xp.mjs → auth-CBESCCCn.mjs} +8 -8
- package/dist/{auth-CGgpiJ5-.mjs → auth-D6kSt2sR.mjs} +5 -5
- package/dist/{auth-Lw_utSMV.cjs → auth-gGryJImw.cjs} +5 -5
- package/dist/{auto-Z56mMZnH.mjs → auto-CEucVmFR.mjs} +32 -26
- package/dist/{auto-CIgFHIyQ.cjs → auto-Do43AOza.cjs} +32 -25
- package/dist/{bootstrap-DsXp74wv.cjs → bootstrap-BPz1iX77.cjs} +2 -2
- package/dist/{bootstrap-D3vlOROj.mjs → bootstrap-CodyCmGt.mjs} +2 -2
- package/dist/{browser-CUxGoATV.mjs → browser-CqMhj8Gm.mjs} +1 -1
- package/dist/{browser-CZlA9AkO.cjs → browser-D9D-1eqa.cjs} +1 -1
- package/dist/{claudeLocal-FnTUgwCi.mjs → claudeLocal-BgIRtT3Q.mjs} +5 -5
- package/dist/{claudeLocal-oELvwiZL.cjs → claudeLocal-Dywp8NKr.cjs} +5 -5
- package/dist/{claudeLocalLauncher-CO5YHCzi.mjs → claudeLocalLauncher-CaHjZ8HW.mjs} +10 -10
- package/dist/{claudeLocalLauncher-QsVXEVdE.cjs → claudeLocalLauncher-_TOL73g5.cjs} +10 -10
- package/dist/{claudeSessionFork-Cspr6QW0.mjs → claudeSessionFork-C9nB7fs5.mjs} +1 -1
- package/dist/{claudeSessionFork-BA4GE5AL.cjs → claudeSessionFork-jq-_WiAu.cjs} +1 -1
- package/dist/{client-CDuW4MS9.cjs → client-BFDji81N.cjs} +15 -7
- package/dist/{client-Ctbw05Xj.mjs → client-BdbVizjk.mjs} +15 -7
- package/dist/{client-xnWiHqdb.cjs → client-ByZFACEw.cjs} +18 -5
- package/dist/{client-DK8CzUry.cjs → client-C49zFRkX.cjs} +2 -2
- package/dist/{client-o-meK7-a.mjs → client-CX-_2myt.mjs} +2 -2
- package/dist/{client-BGfmSbWc.mjs → client-DwlYk8uJ.mjs} +18 -5
- package/dist/codex/happyMcpStdioBridge.cjs +16 -16
- package/dist/codex/happyMcpStdioBridge.mjs +16 -16
- package/dist/{codexAppServerClient-BlsOZLul.mjs → codexAppServerClient-CmOIqiNQ.mjs} +3 -3
- package/dist/{codexAppServerClient-DhNDTU_i.cjs → codexAppServerClient-DF12ZSw1.cjs} +3 -3
- package/dist/{codexCommand-BGx5NMQR.mjs → codexCommand-BN05uEyv.mjs} +94 -60
- package/dist/{codexCommand-DJDPfpIs.cjs → codexCommand-H-ObWTtx.cjs} +94 -60
- package/dist/{codexTermination-CVhhwHZU.mjs → codexTermination-Byohgj8h.mjs} +1 -1
- package/dist/{codexTermination-CqPMuokw.cjs → codexTermination-RwKa8pKk.cjs} +1 -1
- package/dist/{config-CWAe08-Q.mjs → config-ChHLh-hf.mjs} +3 -3
- package/dist/{config-CHpxzXBL.cjs → config-D_wNqwxX.cjs} +3 -3
- package/dist/{configuration-B-CugKJ3.cjs → configuration-C9Sx-Foo.cjs} +1 -1
- package/dist/{configuration-YXw_Dcsb.mjs → configuration-CVgUe2qN.mjs} +1 -1
- package/dist/{connect-BmHvMXH2.cjs → connect-B61xJDRq.cjs} +13 -13
- package/dist/{connect-CPeJXHha.mjs → connect-DJEQjS7C.mjs} +13 -13
- package/dist/{context-BtIVqHI5.cjs → context-Bf3BG7w8.cjs} +1 -1
- package/dist/{context-Drzs_Z38.mjs → context-CDPfhHTo.mjs} +1 -1
- package/dist/{controlClient-D0kGwKYx.cjs → controlClient-BLO1_pPx.cjs} +14 -3
- package/dist/{controlClient-BL4hb4l3.mjs → controlClient-DMCxtwq2.mjs} +14 -4
- package/dist/{createSessionMetadata-L499emJn.cjs → createSessionMetadata-5Mde6Dfh.cjs} +2 -2
- package/dist/{createSessionMetadata-DvGDsnsn.mjs → createSessionMetadata-BYroCdrU.mjs} +2 -2
- package/dist/daemonSupervisor-57JYYzMf.cjs +268 -0
- package/dist/daemonSupervisor-DfzrtNhM.mjs +245 -0
- package/dist/{defaultPermissionMode-MXpZlXud.cjs → defaultPermissionMode-B7mjHQKp.cjs} +2 -2
- package/dist/{defaultPermissionMode-BLfxu-Yz.mjs → defaultPermissionMode-CTdxUV_3.mjs} +2 -2
- package/dist/{deterministicJson-CfLkBRvU.cjs → deterministicJson-C1Z9MlDX.cjs} +569 -17
- package/dist/{deterministicJson-B_UAbmQ4.mjs → deterministicJson-C3QXOc1N.mjs} +572 -21
- package/dist/{doctor-DMvlzmnE.cjs → doctor-DRdV3thy.cjs} +7 -7
- package/dist/{doctor-bKScPtZu.mjs → doctor-OwNmTpYh.mjs} +7 -7
- package/dist/{downloadTarget-J9j37eFG.mjs → downloadTarget-CNtQ8rhV.mjs} +6 -6
- package/dist/{downloadTarget-D33BFvew.cjs → downloadTarget-Di5bf7r0.cjs} +6 -6
- package/dist/{ensureDaemonRunning-2IqWROJp.cjs → ensureDaemonRunning-CMY--T9Q.cjs} +5 -5
- package/dist/{ensureDaemonRunning-DLvwhpNg.mjs → ensureDaemonRunning-IRV-w0wH.mjs} +5 -5
- package/dist/{handleResumeCommand-CjtjQ_I7.mjs → handleResumeCommand-BO00SYjG.mjs} +5 -5
- package/dist/{handleResumeCommand-Dp2Y-p6V.cjs → handleResumeCommand-z7wY7QVM.cjs} +5 -5
- package/dist/{index-DYVIbhAJ.cjs → index-B4cyX2by.cjs} +40 -40
- package/dist/{index-B_aNaW9w.cjs → index-BsoUsrKS.cjs} +4 -4
- package/dist/{index-Cllzqoes.mjs → index-C7zgeuLP.mjs} +4 -4
- package/dist/{index-D_LvOWUN.mjs → index-CVUiytNq.mjs} +3 -3
- package/dist/{index-BOT0Tg5E.mjs → index-DZvi6_tB.mjs} +4 -4
- package/dist/{index-BI0h2Zks.mjs → index-DisBaRvM.mjs} +277 -77
- package/dist/{index-CZC7egJA.cjs → index-NhmqjrGv.cjs} +3 -3
- package/dist/{index-oh8XEozJ.cjs → index-Ub-5xbcU.cjs} +286 -76
- package/dist/{index-kA46KMxN.mjs → index-_LfuIz-O.mjs} +41 -41
- package/dist/{index-DymOv3kK.cjs → index-wYJu2yGc.cjs} +4 -4
- package/dist/index.cjs +2 -2
- package/dist/index.mjs +2 -2
- package/dist/{install-D2NCbeJ-.cjs → install-BATFlr_l.cjs} +2 -2
- package/dist/{install-BAa_Xmof.cjs → install-CGYDeYes.cjs} +3 -3
- package/dist/{install-C46mkr9a.mjs → install-DeUM6h8X.mjs} +3 -3
- package/dist/{install-D0inLCv-.mjs → install-F3rP8tBU.mjs} +2 -2
- package/dist/lib.cjs +12 -12
- package/dist/lib.d.cts +1 -1
- package/dist/lib.d.mts +1 -1
- package/dist/lib.mjs +12 -12
- package/dist/{lidState-DcPvwniz.cjs → lidState-C4YgPn6y.cjs} +1 -1
- package/dist/{lidState-D8Iuvjgl.mjs → lidState-CBjQEwTt.mjs} +1 -1
- package/dist/{localHappyAgentAuth-SD6GM97y.cjs → localHappyAgentAuth-BzCuIkzi.cjs} +1 -1
- package/dist/{localHappyAgentAuth-D3rQDRd9.mjs → localHappyAgentAuth-CcWGU_lS.mjs} +1 -1
- package/dist/{logger-DK1ytCz6.cjs → logger-CrtT0opS.cjs} +2 -2
- package/dist/{logger-DpqihN1f.mjs → logger-D2qd0mMg.mjs} +2 -2
- package/dist/{machineMetadata-D4E3qoIG.mjs → machineMetadata-B2czDiTd.mjs} +3 -3
- package/dist/{machineMetadata-IJc6_iyx.cjs → machineMetadata-D1hlm_oF.cjs} +3 -3
- package/dist/{main-CpUmw7hm.mjs → main-BNYWELul.mjs} +69 -56
- package/dist/{main-DUXh2rgW.cjs → main-BWgWN5d1.cjs} +69 -56
- package/dist/{mcp-D5f3Vd-z.cjs → mcp-C18unjs1.cjs} +15 -15
- package/dist/{mcp-66g1TJ8P.mjs → mcp-ColtiH23.mjs} +15 -15
- package/dist/{mirrorProtocol-DkWOcZh9.cjs → mirrorProtocol-D4CR5I5W.cjs} +3 -3
- package/dist/{mirrorProtocol-bsCUcaCY.mjs → mirrorProtocol-DTHWtAE5.mjs} +3 -3
- package/dist/{package-BfeqAzyJ.cjs → package-DczR1k0c.cjs} +7 -7
- package/dist/{package-CKj8zndE.mjs → package-Ek5FOyEo.mjs} +7 -7
- package/dist/{panels-r8LmaBs6.mjs → panels-BIQ7FrCB.mjs} +5 -5
- package/dist/{panels-2PXsw9-d.cjs → panels-DYSMHhdb.cjs} +5 -5
- package/dist/{peerTools-D_id4d41.mjs → peerTools-CABQ6iKd.mjs} +5 -5
- package/dist/{peerTools-BVp1z0T_.cjs → peerTools-Cufh4Qp_.cjs} +5 -5
- package/dist/{persistence-jOEuAFTS.mjs → persistence-DFtgQvr6.mjs} +2 -2
- package/dist/{persistence-BdpwWXKh.cjs → persistence-IYH6bAXY.cjs} +2 -2
- package/dist/{piRunnerArgs-68I5F_M1.mjs → piRunnerArgs-CIWprC1S.mjs} +1 -1
- package/dist/{piRunnerArgs-vxCHKnSA.cjs → piRunnerArgs-Dgjmj8KL.cjs} +1 -1
- package/dist/{piRuntime-C3Dg5uni.cjs → piRuntime-C_nX977w.cjs} +2 -2
- package/dist/{piRuntime-DgLIard1.mjs → piRuntime-K6o4GPZ9.mjs} +2 -2
- package/dist/{piTerminal-DJL0w-uA.mjs → piTerminal-CRl0EZc3.mjs} +18 -18
- package/dist/{piTerminal-C135BcLP.cjs → piTerminal-CYhcmkyi.cjs} +18 -18
- package/dist/providerBinding-B-Qbx9W2.cjs +140 -0
- package/dist/providerBinding-CYubGg-Z.mjs +132 -0
- package/dist/{pushNotifications-CyQVDThC.cjs → pushNotifications-BgQ_QTgS.cjs} +3 -3
- package/dist/{pushNotifications-CMmRsbKv.mjs → pushNotifications-gVJWGFBP.mjs} +3 -3
- package/dist/{query-CPXnDURZ.mjs → query-CGp9vY4e.mjs} +1 -1
- package/dist/{query-CK--1fbL.cjs → query-DFreaScb.cjs} +1 -1
- package/dist/{rateLimitWindows-DJxnNw-X.cjs → rateLimitWindows-CeogT1b6.cjs} +1 -1
- package/dist/{rateLimitWindows-Cqa4AGaB.mjs → rateLimitWindows-DM_gshI4.mjs} +1 -1
- package/dist/{registerCommonHandlers-DbNoM39q.cjs → registerCommonHandlers-CRqKXwQt.cjs} +2 -2
- package/dist/{registerCommonHandlers-K8dICQO2.mjs → registerCommonHandlers-CyAtDNvs.mjs} +2 -2
- package/dist/{registerKillSessionHandler-DiS_go8d.cjs → registerKillSessionHandler-CX49N52L.cjs} +6 -6
- package/dist/{registerKillSessionHandler-O1iriOMO.mjs → registerKillSessionHandler-DGWADNla.mjs} +6 -6
- package/dist/{remoteSessionClient-BlURPulk.mjs → remoteSessionClient-1nycIdrG.mjs} +5 -5
- package/dist/{remoteSessionClient-CtV9mDko.cjs → remoteSessionClient-CuAkp19e.cjs} +5 -5
- package/dist/{reportProgressTool-DlD_xjzU.cjs → reportProgressTool-BS7TkeEk.cjs} +4 -4
- package/dist/{reportProgressTool-nCExrHZH.mjs → reportProgressTool-CdSi-uSC.mjs} +4 -4
- package/dist/{resources-CH1iP6Cv.mjs → resources-CLdQfe3b.mjs} +1 -1
- package/dist/{resources-BPyN59Iv.cjs → resources-CqwHPhdK.cjs} +1 -1
- package/dist/{run-drtwHYkO.mjs → run-DqjEj8M2.mjs} +101 -248
- package/dist/{run-BBNrcCfI.cjs → run-gVwkplx0.cjs} +111 -259
- package/dist/{runClaude-B3KSeby4.cjs → runClaude-CtVoFstP.cjs} +39 -24
- package/dist/{runClaude-CFp27Tyi.mjs → runClaude-CuSjrZSf.mjs} +39 -24
- package/dist/{runClaudeDeps-C_C9TCI0.cjs → runClaudeDeps-DqOgRuKq.cjs} +49 -40
- package/dist/{runClaudeDeps-DMcv93lA.mjs → runClaudeDeps-eazOhb6g.mjs} +54 -45
- package/dist/{runGemini-DzdSBAr9.cjs → runGemini-81wkPvMv.cjs} +37 -35
- package/dist/{runGemini-Bc6SY-hd.mjs → runGemini-B4EqAd1U.mjs} +37 -35
- package/dist/{runOpenClaw-DN6rEVqC.cjs → runOpenClaw-BK7ZQEKj.cjs} +18 -18
- package/dist/{runOpenClaw-DI0qMlgF.mjs → runOpenClaw-Brb1KKAA.mjs} +18 -18
- package/dist/{sandbox-DtttPBMA.cjs → sandbox-DFD6an8o.cjs} +4 -4
- package/dist/{sandbox-v-ffe8LR.mjs → sandbox-t43Exd4t.mjs} +4 -4
- package/dist/{selfCheck-B-yy6bW3.cjs → selfCheck-Bel50SH3.cjs} +37 -36
- package/dist/selfCheck-CwpZepG-.mjs +86 -0
- package/dist/{send-DpBwSZuj.mjs → send-Co9jxmc4.mjs} +8 -8
- package/dist/{send-ShzXYPRu.cjs → send-IR5DnG9V.cjs} +8 -8
- package/dist/{server-CEzKrfKj.cjs → server-CAo6a3Vw.cjs} +6 -6
- package/dist/{server-DScgJXxa.mjs → server-KnIeKeTb.mjs} +4 -4
- package/dist/{sessionLock-Dc0fadGG.cjs → sessionLock-DNGDn9oj.cjs} +3 -3
- package/dist/{sessionLock-B6K4SBZD.mjs → sessionLock-ha9gsQEn.mjs} +3 -3
- package/dist/{sessionOps-D0BPWPoh.mjs → sessionOps-Di9MC0FP.mjs} +4 -4
- package/dist/{sessionOps-Dx7wARjI.cjs → sessionOps-hRqzcMXB.cjs} +4 -4
- package/dist/sessionProvider-4Nn6e9Kd.mjs +109 -0
- package/dist/sessionProvider-LqE7Y_cf.cjs +114 -0
- package/dist/{sessionScanner-BJ35TVG6.cjs → sessionScanner-BzEtrHB8.cjs} +3 -3
- package/dist/{sessionScanner-9Fpgaxtf.mjs → sessionScanner-DKFKDsrW.mjs} +3 -3
- package/dist/{sessions-TZGGAry1.cjs → sessions-CmLiagcb.cjs} +10 -10
- package/dist/{sessions-CFtDlyZd.mjs → sessions-DzgMNXo5.mjs} +10 -10
- package/dist/{setupOfflineReconnection-Biaus-0T.mjs → setupOfflineReconnection-D4NGi3Jf.mjs} +2 -2
- package/dist/{setupOfflineReconnection-B1GsVA8P.cjs → setupOfflineReconnection-Dq4N2Txp.cjs} +2 -2
- package/dist/{spawn-CsoQ-Ecz.mjs → spawn-C6CE5PsI.mjs} +14 -14
- package/dist/{spawn-BRTuypQ2.cjs → spawn-tmoekkOW.cjs} +14 -14
- package/dist/{spawnAgents-CG211IW7.cjs → spawnAgents-D15n6tAj.cjs} +1 -1
- package/dist/{spawnAgents-Co-SLcx-.mjs → spawnAgents-jXo9jIYo.mjs} +1 -1
- package/dist/{spawnHappyCLI-D1doCjkZ.mjs → spawnHappyCLI-66grqHO0.mjs} +1 -1
- package/dist/{spawnHappyCLI-D47kX6jg.cjs → spawnHappyCLI-8NcKgkuy.cjs} +1 -1
- package/dist/{specialCommands-xSmqT_Fu.mjs → specialCommands-BO8ipH0n.mjs} +3 -3
- package/dist/{specialCommands-Ch-Gvy-i.cjs → specialCommands-Dq0TmY1Z.cjs} +3 -3
- package/dist/{startFileWatcher-CCl2fFxT.mjs → startFileWatcher-BLDkieUW.mjs} +1 -1
- package/dist/{startFileWatcher-gKQTstR6.cjs → startFileWatcher-CjgKvec9.cjs} +1 -1
- package/dist/{startupSessionCreate-DlZc8yPl.mjs → startupSessionCreate-B60THeNz.mjs} +1 -1
- package/dist/{startupSessionCreate-BXqoUX30.cjs → startupSessionCreate-CXRVahaU.cjs} +1 -1
- package/dist/{streamRelay-B-J-4St1.cjs → streamRelay-CtTpf-Li.cjs} +1 -1
- package/dist/{streamRelay-DnJXsi36.mjs → streamRelay-GzHxvMem.mjs} +1 -1
- package/dist/{sync-BbjMC3sR.mjs → sync-DJvx7RbO.mjs} +1 -1
- package/dist/{sync-BxMdnZzz.cjs → sync-DKSZOi6w.cjs} +1 -1
- package/dist/{systemPrompt-C2KojRmK.cjs → systemPrompt-Duos1BtM.cjs} +2 -2
- package/dist/{systemPrompt-CmSDAoIx.mjs → systemPrompt-dOOpz8L7.mjs} +2 -2
- package/dist/{teams-DESdalox.cjs → teams-pO5rjvPO.cjs} +9 -9
- package/dist/{teams-lRy1MS0Z.mjs → teams-uWiMJEe1.mjs} +9 -9
- package/dist/{template-BaHAmH2K.cjs → template-BLJxflCH.cjs} +32 -2
- package/dist/{template-CiOPa2rd.mjs → template-YlpbYGeQ.mjs} +31 -3
- package/dist/{time-DNLeIRgR.cjs → time-D-8GFCE7.cjs} +1 -1
- package/dist/{time-Cfknl7xG.mjs → time-Du0scQeJ.mjs} +1 -1
- package/dist/{titleGenerator-ClnMSzwC.mjs → titleGenerator-DKYj8rLY.mjs} +1 -1
- package/dist/{titleGenerator-YNutaU88.cjs → titleGenerator-DnKygjBP.cjs} +2 -2
- package/dist/{todo-DS75Mboz.cjs → todo-BFDb7O8q.cjs} +6 -6
- package/dist/{todo-DZbK5POc.mjs → todo-Du5dAwnt.mjs} +6 -6
- package/dist/{tools-BgdU0dWp.mjs → tools-DHvMVL0a.mjs} +1 -1
- package/dist/{tools-ClYcb1YQ.cjs → tools-DK_x86Kl.cjs} +1 -1
- package/dist/{uninstall-bXenFevR.mjs → uninstall-CLDEXir0.mjs} +3 -3
- package/dist/{uninstall-Di1vPBLV.cjs → uninstall-c3zjum2o.cjs} +3 -3
- package/package.json +7 -7
- package/dist/daemonSupervisor-B-SPSqhs.cjs +0 -13
- package/dist/daemonSupervisor-C6urv3_8.mjs +0 -10
- package/dist/selfCheck-BDfTwxqB.mjs +0 -85
|
@@ -1,27 +1,27 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var mirrorProtocol = require('./mirrorProtocol-
|
|
3
|
+
var mirrorProtocol = require('./mirrorProtocol-D4CR5I5W.cjs');
|
|
4
4
|
var fsMkdir = require('./fsMkdir-0K3yENml.cjs');
|
|
5
|
-
var piRunnerArgs = require('./piRunnerArgs-
|
|
5
|
+
var piRunnerArgs = require('./piRunnerArgs-Dgjmj8KL.cjs');
|
|
6
6
|
var fs = require('fs/promises');
|
|
7
7
|
var os$1 = require('os');
|
|
8
8
|
var tmp = require('tmp');
|
|
9
9
|
var axios = require('axios');
|
|
10
10
|
var node_fs = require('node:fs');
|
|
11
11
|
var path = require('node:path');
|
|
12
|
-
var configuration = require('./configuration-
|
|
13
|
-
var api = require('./api-
|
|
14
|
-
var spawnAgents = require('./spawnAgents-
|
|
15
|
-
var logger = require('./logger-
|
|
16
|
-
var index$2 = require('./index-
|
|
17
|
-
var auth = require('./auth-
|
|
12
|
+
var configuration = require('./configuration-C9Sx-Foo.cjs');
|
|
13
|
+
var api = require('./api-rw5xkzxo.cjs');
|
|
14
|
+
var spawnAgents = require('./spawnAgents-D15n6tAj.cjs');
|
|
15
|
+
var logger = require('./logger-CrtT0opS.cjs');
|
|
16
|
+
var index$2 = require('./index-NhmqjrGv.cjs');
|
|
17
|
+
var auth = require('./auth-gGryJImw.cjs');
|
|
18
18
|
var child_process = require('child_process');
|
|
19
|
-
var _package = require('./package-
|
|
20
|
-
var doctor = require('./doctor-
|
|
21
|
-
var spawnHappyCLI = require('./spawnHappyCLI-
|
|
22
|
-
var persistence = require('./persistence-
|
|
23
|
-
var controlClient = require('./controlClient-
|
|
24
|
-
var sessionOps = require('./sessionOps-
|
|
19
|
+
var _package = require('./package-DczR1k0c.cjs');
|
|
20
|
+
var doctor = require('./doctor-DRdV3thy.cjs');
|
|
21
|
+
var spawnHappyCLI = require('./spawnHappyCLI-8NcKgkuy.cjs');
|
|
22
|
+
var persistence = require('./persistence-IYH6bAXY.cjs');
|
|
23
|
+
var controlClient = require('./controlClient-BLO1_pPx.cjs');
|
|
24
|
+
var sessionOps = require('./sessionOps-hRqzcMXB.cjs');
|
|
25
25
|
var fastify = require('fastify');
|
|
26
26
|
var z = require('zod');
|
|
27
27
|
var fastifyTypeProviderZod = require('fastify-type-provider-zod');
|
|
@@ -29,66 +29,65 @@ var authRelay = require('./authRelay-Dy1qU9td.cjs');
|
|
|
29
29
|
var node_crypto = require('node:crypto');
|
|
30
30
|
var previewPath = require('./previewPath-B0rBdhy1.cjs');
|
|
31
31
|
var backgroundTaskActivity = require('./backgroundTaskActivity-CBvUdj39.cjs');
|
|
32
|
-
var rateLimitWindows = require('./rateLimitWindows-
|
|
33
|
-
var peerTools = require('./peerTools-
|
|
32
|
+
var rateLimitWindows = require('./rateLimitWindows-CeogT1b6.cjs');
|
|
33
|
+
var peerTools = require('./peerTools-Cufh4Qp_.cjs');
|
|
34
34
|
var os = require('node:os');
|
|
35
|
-
var remoteSessionClient = require('./remoteSessionClient-
|
|
36
|
-
var bootstrap = require('./bootstrap-
|
|
37
|
-
var index$1 = require('./index-
|
|
35
|
+
var remoteSessionClient = require('./remoteSessionClient-CuAkp19e.cjs');
|
|
36
|
+
var bootstrap = require('./bootstrap-BPz1iX77.cjs');
|
|
37
|
+
var index$1 = require('./index-BsoUsrKS.cjs');
|
|
38
38
|
var require$$0 = require('fs');
|
|
39
39
|
var require$$1 = require('path');
|
|
40
40
|
var node_child_process = require('node:child_process');
|
|
41
41
|
var projectPath = require('./projectPath-C3ioB4Bu.cjs');
|
|
42
42
|
var doctorReadiness = require('./doctorReadiness-Dl6yRQCy.cjs');
|
|
43
|
-
var machineMetadata = require('./machineMetadata-
|
|
43
|
+
var machineMetadata = require('./machineMetadata-D1hlm_oF.cjs');
|
|
44
44
|
var fileStore = require('./fileStore-7qhnbs6N.cjs');
|
|
45
45
|
var pi = require('./pi-DlsrPCTa.cjs');
|
|
46
46
|
var require$$3 = require('crypto');
|
|
47
47
|
var detectCLI = require('./detectCLI-BuYR_Qxe.cjs');
|
|
48
|
-
var handleResumeCommand = require('./handleResumeCommand-
|
|
48
|
+
var handleResumeCommand = require('./handleResumeCommand-z7wY7QVM.cjs');
|
|
49
49
|
var webPanels = require('./webPanels-FCgFKvVe.cjs');
|
|
50
|
-
var index = require('./index-
|
|
50
|
+
var index = require('./index-Ub-5xbcU.cjs');
|
|
51
51
|
var promises = require('node:fs/promises');
|
|
52
52
|
var cliUpdate = require('./cliUpdate-DsKXPFYp.cjs');
|
|
53
|
-
var client = require('./client-
|
|
54
|
-
var client$1 = require('./client-
|
|
55
|
-
var
|
|
53
|
+
var client = require('./client-C49zFRkX.cjs');
|
|
54
|
+
var client$1 = require('./client-BFDji81N.cjs');
|
|
55
|
+
var daemonSupervisor = require('./daemonSupervisor-57JYYzMf.cjs');
|
|
56
56
|
var path$1 = require('./path-B7zW-WwE.cjs');
|
|
57
57
|
var editPaths = require('./editPaths-Bqp4OFPw.cjs');
|
|
58
|
-
var startFileWatcher = require('./startFileWatcher-
|
|
59
|
-
var sync = require('./sync-
|
|
58
|
+
var startFileWatcher = require('./startFileWatcher-CjgKvec9.cjs');
|
|
59
|
+
var sync = require('./sync-DKSZOi6w.cjs');
|
|
60
60
|
var types = require('./types-CRS-srZK.cjs');
|
|
61
61
|
var tmuxSocket = require('./tmuxSocket-D-Xt6Vn-.cjs');
|
|
62
|
-
var sessionLock = require('./sessionLock-
|
|
62
|
+
var sessionLock = require('./sessionLock-DNGDn9oj.cjs');
|
|
63
63
|
var doctor$1 = require('./doctor-u46qYYKX.cjs');
|
|
64
|
-
var resources = require('./resources-
|
|
64
|
+
var resources = require('./resources-CqwHPhdK.cjs');
|
|
65
65
|
var node_util = require('node:util');
|
|
66
|
-
var template = require('./template-
|
|
67
|
-
var daemonSupervisor = require('./daemonSupervisor-B-SPSqhs.cjs');
|
|
66
|
+
var template = require('./template-BLJxflCH.cjs');
|
|
68
67
|
var loginShellEnv = require('./loginShellEnv-BkuYtExZ.cjs');
|
|
69
|
-
require('./acpSessionResume-
|
|
70
|
-
require('./lidState-
|
|
68
|
+
require('./acpSessionResume-DZ65DBeE.cjs');
|
|
69
|
+
require('./lidState-C4YgPn6y.cjs');
|
|
71
70
|
require('node:events');
|
|
72
71
|
require('socket.io-client');
|
|
73
|
-
require('./pushNotifications-
|
|
72
|
+
require('./pushNotifications-BgQ_QTgS.cjs');
|
|
74
73
|
require('./contentLogMetadata-ZSFk_NjQ.cjs');
|
|
75
74
|
require('./limits-C-a7gr04.cjs');
|
|
76
|
-
require('./time-
|
|
77
|
-
require('./registerCommonHandlers-
|
|
75
|
+
require('./time-D-8GFCE7.cjs');
|
|
76
|
+
require('./registerCommonHandlers-CRqKXwQt.cjs');
|
|
78
77
|
require('util');
|
|
79
78
|
require('cross-spawn');
|
|
80
79
|
require('@paralleldrive/cuid2');
|
|
81
80
|
require('chalk');
|
|
81
|
+
require('node:module');
|
|
82
82
|
require('tweetnacl');
|
|
83
|
-
require('./browser-
|
|
83
|
+
require('./browser-D9D-1eqa.cjs');
|
|
84
84
|
require('open');
|
|
85
85
|
require('./ids-B6ZC0HGt.cjs');
|
|
86
86
|
require('url');
|
|
87
|
-
require('./localHappyAgentAuth-
|
|
87
|
+
require('./localHappyAgentAuth-BzCuIkzi.cjs');
|
|
88
88
|
require('./processTreeSnapshot-mDbnuojn.cjs');
|
|
89
89
|
require('ps-list');
|
|
90
90
|
|
|
91
|
-
var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
|
|
92
91
|
function _interopNamespaceDefault(e) {
|
|
93
92
|
var n = Object.create(null);
|
|
94
93
|
if (e) {
|
|
@@ -594,6 +593,7 @@ function startDaemonControlServer({
|
|
|
594
593
|
stopSession,
|
|
595
594
|
spawnSession,
|
|
596
595
|
resumeSession,
|
|
596
|
+
restartSession,
|
|
597
597
|
requestShutdown,
|
|
598
598
|
onHappySessionWebhook,
|
|
599
599
|
onSessionStateEvent,
|
|
@@ -890,6 +890,34 @@ function startDaemonControlServer({
|
|
|
890
890
|
return { success: false, error: result.errorMessage };
|
|
891
891
|
}
|
|
892
892
|
});
|
|
893
|
+
typed.post("/restart-session", {
|
|
894
|
+
schema: {
|
|
895
|
+
body: z.z.object({ sessionId: z.z.string().min(1).max(200) }),
|
|
896
|
+
response: {
|
|
897
|
+
200: z.z.object({ success: z.z.boolean(), sessionId: z.z.string().optional(), error: z.z.string().optional() }),
|
|
898
|
+
500: z.z.object({ success: z.z.boolean(), error: z.z.string().optional() }),
|
|
899
|
+
503: z.z.object({ success: z.z.boolean(), error: z.z.string().optional() })
|
|
900
|
+
}
|
|
901
|
+
}
|
|
902
|
+
}, async (request, reply) => {
|
|
903
|
+
const { sessionId } = request.body;
|
|
904
|
+
if (!restartSession) {
|
|
905
|
+
reply.code(503);
|
|
906
|
+
return { success: false, error: "daemon is still starting up" };
|
|
907
|
+
}
|
|
908
|
+
logger.logger.debug(`[CONTROL SERVER] Restart session request: ${sessionId}`);
|
|
909
|
+
const result = await restartSession(sessionId, { keepPublishedPermissionMode: true });
|
|
910
|
+
switch (result.type) {
|
|
911
|
+
case "success":
|
|
912
|
+
return { success: true, sessionId: result.sessionId };
|
|
913
|
+
case "requestToApproveDirectoryCreation":
|
|
914
|
+
reply.code(500);
|
|
915
|
+
return { success: false, error: `Cannot restart: working directory ${result.directory} needs to be created first` };
|
|
916
|
+
case "error":
|
|
917
|
+
reply.code(500);
|
|
918
|
+
return { success: false, error: result.errorMessage };
|
|
919
|
+
}
|
|
920
|
+
});
|
|
893
921
|
typed.post("/terminal-hook", {
|
|
894
922
|
schema: {
|
|
895
923
|
body: z.z.any(),
|
|
@@ -5115,196 +5143,6 @@ async function waitForSessionLive(sessionId, live, timeoutMs = AUTOMATION_WAKE_T
|
|
|
5115
5143
|
return true;
|
|
5116
5144
|
}
|
|
5117
5145
|
|
|
5118
|
-
const CLAUDE_KEYCHAIN_SERVICE_PREFIX = "Claude Code";
|
|
5119
|
-
function keychainIdentity(env = process.env, deps = {}) {
|
|
5120
|
-
const home = deps.home ?? os.homedir();
|
|
5121
|
-
const secureDir = env.CLAUDE_SECURESTORAGE_CONFIG_DIR?.trim();
|
|
5122
|
-
const configDirEnv = env.CLAUDE_CONFIG_DIR?.trim();
|
|
5123
|
-
const configDir = secureDir || configDirEnv || path.join(home, ".claude");
|
|
5124
|
-
const hasCustomDir = Boolean(secureDir || configDirEnv);
|
|
5125
|
-
const dirSuffix = hasCustomDir ? "-" + node_crypto.createHash("sha256").update(configDir.normalize("NFC")).digest("hex").slice(0, 8) : "";
|
|
5126
|
-
const oauthSuffix = env.CLAUDE_CODE_OAUTH_CLIENT_ID?.trim() ? "-custom-oauth" : "";
|
|
5127
|
-
const rawAccount = env.USER || safeUsername(deps.username);
|
|
5128
|
-
const account = /^[a-zA-Z0-9._-]+$/.test(rawAccount) ? rawAccount : "claude-code-user";
|
|
5129
|
-
return {
|
|
5130
|
-
service: `${CLAUDE_KEYCHAIN_SERVICE_PREFIX}${oauthSuffix}-credentials${dirSuffix}`,
|
|
5131
|
-
account,
|
|
5132
|
-
configDir,
|
|
5133
|
-
credentialsPath: path.join(configDir, ".credentials.json")
|
|
5134
|
-
};
|
|
5135
|
-
}
|
|
5136
|
-
function safeUsername(provider) {
|
|
5137
|
-
try {
|
|
5138
|
-
return provider ? provider() : os.userInfo().username;
|
|
5139
|
-
} catch {
|
|
5140
|
-
return "";
|
|
5141
|
-
}
|
|
5142
|
-
}
|
|
5143
|
-
|
|
5144
|
-
const CLAUDE_AUTH_PROBE_VERSION = 1;
|
|
5145
|
-
const LOCAL_CREDENTIAL_SOURCE = "Claude local credentials";
|
|
5146
|
-
function classifyAuthStatus(run, credentialSource) {
|
|
5147
|
-
const localSource = credentialSource === void 0 || credentialSource === LOCAL_CREDENTIAL_SOURCE;
|
|
5148
|
-
if (run.spawnError) {
|
|
5149
|
-
return { status: "error", diagnosis: "probe-crash", detail: `could not run claude auth status: ${run.spawnError}` };
|
|
5150
|
-
}
|
|
5151
|
-
if (run.timedOut) {
|
|
5152
|
-
return { status: "error", diagnosis: "probe-timeout", detail: "claude auth status did not answer within the timeout" };
|
|
5153
|
-
}
|
|
5154
|
-
const parsed = parseJsonObject(run.stdout);
|
|
5155
|
-
if (!parsed) {
|
|
5156
|
-
if (!localSource) return { status: "unknown", authMethod: credentialSource, detail: `auth status unparseable under ${credentialSource}` };
|
|
5157
|
-
return { status: "error", diagnosis: "probe-crash", detail: `claude auth status returned no JSON (exit ${run.exitCode ?? "null"})` };
|
|
5158
|
-
}
|
|
5159
|
-
const authMethod = typeof parsed.authMethod === "string" ? parsed.authMethod : void 0;
|
|
5160
|
-
const subscriptionType = typeof parsed.subscriptionType === "string" ? parsed.subscriptionType : void 0;
|
|
5161
|
-
if (parsed.loggedIn === true) {
|
|
5162
|
-
return { status: "ok", authMethod: localSource ? authMethod : credentialSource, subscriptionType };
|
|
5163
|
-
}
|
|
5164
|
-
if (!localSource) {
|
|
5165
|
-
return { status: "unknown", authMethod: credentialSource, detail: `Claude Code reports loggedIn=false under ${credentialSource}; not a local-credential failure` };
|
|
5166
|
-
}
|
|
5167
|
-
return { status: "not-logged-in", authMethod, subscriptionType, detail: "Claude Code in the daemon context reports it is not logged in" };
|
|
5168
|
-
}
|
|
5169
|
-
function parseJsonObject(text) {
|
|
5170
|
-
const trimmed = text.trim();
|
|
5171
|
-
if (!trimmed) return null;
|
|
5172
|
-
const start = trimmed.indexOf("{");
|
|
5173
|
-
if (start < 0) return null;
|
|
5174
|
-
try {
|
|
5175
|
-
const value = JSON.parse(trimmed.slice(start));
|
|
5176
|
-
return value && typeof value === "object" && !Array.isArray(value) ? value : null;
|
|
5177
|
-
} catch {
|
|
5178
|
-
return null;
|
|
5179
|
-
}
|
|
5180
|
-
}
|
|
5181
|
-
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-BBNrcCfI.cjs', document.baseURI).href))).resolve(s)) {
|
|
5182
|
-
const platformArch = `${platform}-${arch}`;
|
|
5183
|
-
const candidates = [
|
|
5184
|
-
`@anthropic-ai/claude-agent-sdk-${platformArch}/claude`,
|
|
5185
|
-
`@anthropic-ai/claude-agent-sdk-${platformArch}/claude.exe`
|
|
5186
|
-
];
|
|
5187
|
-
for (const candidate of candidates) {
|
|
5188
|
-
try {
|
|
5189
|
-
return resolver(candidate);
|
|
5190
|
-
} catch {
|
|
5191
|
-
}
|
|
5192
|
-
}
|
|
5193
|
-
return null;
|
|
5194
|
-
}
|
|
5195
|
-
function interpretSecurityRead(result) {
|
|
5196
|
-
if (result.error === "ENOENT") return { kind: "unsupported" };
|
|
5197
|
-
if (result.error === "timeout") return { kind: "error", detail: "security timed out" };
|
|
5198
|
-
if (result.exitCode === 44) return { kind: "absent" };
|
|
5199
|
-
if (result.exitCode === 36) return { kind: "unreadable" };
|
|
5200
|
-
if (result.exitCode !== 0) return { kind: "error", detail: `security exited ${result.exitCode ?? "null"}` };
|
|
5201
|
-
const raw = result.stdout.trim();
|
|
5202
|
-
if (!raw) return { kind: "absent" };
|
|
5203
|
-
const parsed = parseJsonObject(raw);
|
|
5204
|
-
const oauth = parsed && typeof parsed.claudeAiOauth === "object" && parsed.claudeAiOauth ? parsed.claudeAiOauth : null;
|
|
5205
|
-
if (!oauth) return { kind: "present", accessToken: "", refreshToken: "", raw };
|
|
5206
|
-
return {
|
|
5207
|
-
kind: "present",
|
|
5208
|
-
accessToken: typeof oauth.accessToken === "string" ? oauth.accessToken : "",
|
|
5209
|
-
refreshToken: typeof oauth.refreshToken === "string" ? oauth.refreshToken : "",
|
|
5210
|
-
raw
|
|
5211
|
-
};
|
|
5212
|
-
}
|
|
5213
|
-
function interpretCredentialsFile(text) {
|
|
5214
|
-
if (text === null) return { exists: false, hasTokens: false, refreshToken: "" };
|
|
5215
|
-
const parsed = parseJsonObject(text);
|
|
5216
|
-
const oauth = parsed && typeof parsed.claudeAiOauth === "object" && parsed.claudeAiOauth ? parsed.claudeAiOauth : null;
|
|
5217
|
-
const access = oauth && typeof oauth.accessToken === "string" ? oauth.accessToken : "";
|
|
5218
|
-
const refresh = oauth && typeof oauth.refreshToken === "string" ? oauth.refreshToken : "";
|
|
5219
|
-
return { exists: true, hasTokens: access.length > 0 && refresh.length > 0, refreshToken: refresh };
|
|
5220
|
-
}
|
|
5221
|
-
function tokenTail(token) {
|
|
5222
|
-
return token ? node_crypto.createHash("sha256").update(token).digest("hex").slice(-6) : "";
|
|
5223
|
-
}
|
|
5224
|
-
const CREDENTIALS_REJECTED_DETAIL = "Credentials exist but Claude Code rejects them in the daemon context \u2014 the refresh token has most likely been rotated away by another store or another machine using the same credentials. Log in again with `claude` on this machine.";
|
|
5225
|
-
function diagnoseStores(input) {
|
|
5226
|
-
const { status, keychain, file } = input;
|
|
5227
|
-
if (keychain.kind === "present") {
|
|
5228
|
-
const empty = keychain.accessToken.length === 0 && keychain.refreshToken.length === 0;
|
|
5229
|
-
if (empty && file.hasTokens && status === "not-logged-in") {
|
|
5230
|
-
return {
|
|
5231
|
-
diagnosis: "keychain-empty-item",
|
|
5232
|
-
repairable: "delete-empty-keychain-item",
|
|
5233
|
-
keychainRaw: keychain.raw,
|
|
5234
|
-
detail: "The login keychain holds a Claude Code credentials item with empty tokens; Claude Code prefers it over the valid ~/.claude/.credentials.json and reports not logged in."
|
|
5235
|
-
};
|
|
5236
|
-
}
|
|
5237
|
-
if (!empty && file.hasTokens && tokenTail(keychain.refreshToken) !== tokenTail(file.refreshToken)) {
|
|
5238
|
-
return {
|
|
5239
|
-
diagnosis: "store-divergence",
|
|
5240
|
-
detail: "Keychain and ~/.claude/.credentials.json hold different refresh tokens; one of them will stop working at its next refresh. Treat the daemon-context login as canonical, or pin credentialStore=file."
|
|
5241
|
-
};
|
|
5242
|
-
}
|
|
5243
|
-
return {};
|
|
5244
|
-
}
|
|
5245
|
-
if ((keychain.kind === "absent" || keychain.kind === "unreadable" || keychain.kind === "unsupported") && !file.hasTokens) {
|
|
5246
|
-
return { diagnosis: "no-credentials", detail: "No Claude Code credentials found for this daemon context; log in with `claude` on this machine." };
|
|
5247
|
-
}
|
|
5248
|
-
if (keychain.kind === "unreadable" && file.hasTokens && status === "not-logged-in") {
|
|
5249
|
-
return { diagnosis: "credentials-rejected", detail: CREDENTIALS_REJECTED_DETAIL };
|
|
5250
|
-
}
|
|
5251
|
-
if (keychain.kind === "error") {
|
|
5252
|
-
return { detail: `keychain check failed: ${keychain.detail}` };
|
|
5253
|
-
}
|
|
5254
|
-
return {};
|
|
5255
|
-
}
|
|
5256
|
-
function securityReadArgs(identity) {
|
|
5257
|
-
return ["find-generic-password", "-s", identity.service, "-a", identity.account, "-w"];
|
|
5258
|
-
}
|
|
5259
|
-
function securityDeleteArgs(identity) {
|
|
5260
|
-
return ["delete-generic-password", "-s", identity.service, "-a", identity.account];
|
|
5261
|
-
}
|
|
5262
|
-
const HAPPY_DAEMON_LAUNCHD_LABEL = "com.mereith.happy-daemon";
|
|
5263
|
-
function classifyLineage(input) {
|
|
5264
|
-
if (input.platform !== "darwin") return "other";
|
|
5265
|
-
const label = input.label ?? HAPPY_DAEMON_LAUNCHD_LABEL;
|
|
5266
|
-
if (input.env.XPC_SERVICE_NAME !== label) return "other";
|
|
5267
|
-
if (input.launchdJobPid !== null && input.ancestorPids.includes(input.launchdJobPid)) return "launchd";
|
|
5268
|
-
return "inherited-env";
|
|
5269
|
-
}
|
|
5270
|
-
function parseLaunchctlPid(printOutput) {
|
|
5271
|
-
const match = /^\s*pid\s*=\s*(\d+)/m.exec(printOutput);
|
|
5272
|
-
return match ? Number(match[1]) : null;
|
|
5273
|
-
}
|
|
5274
|
-
function keychainOffShimDir(happyLibDir) {
|
|
5275
|
-
return path.join(happyLibDir, "scripts", "shims", "keychain-off");
|
|
5276
|
-
}
|
|
5277
|
-
function withKeychainOffPath(path$1, shimDir) {
|
|
5278
|
-
const parts = (path$1 ?? "").split(path.delimiter).filter((p) => p && p !== shimDir);
|
|
5279
|
-
return [shimDir, ...parts].join(path.delimiter);
|
|
5280
|
-
}
|
|
5281
|
-
function buildClaudeAuthState(input) {
|
|
5282
|
-
const { classification, diagnosis } = input;
|
|
5283
|
-
const detail = (diagnosis?.detail ?? classification.detail)?.slice(0, 200);
|
|
5284
|
-
const state = {
|
|
5285
|
-
probeVersion: CLAUDE_AUTH_PROBE_VERSION,
|
|
5286
|
-
daemonPid: input.daemonPid,
|
|
5287
|
-
status: classification.status,
|
|
5288
|
-
context: { platform: input.platform, lineage: input.lineage, credentialStore: input.credentialStore },
|
|
5289
|
-
checkedAt: input.now ?? Date.now()
|
|
5290
|
-
};
|
|
5291
|
-
if (classification.authMethod) state.authMethod = classification.authMethod;
|
|
5292
|
-
if (classification.subscriptionType) state.subscriptionType = classification.subscriptionType;
|
|
5293
|
-
const diag = diagnosis?.diagnosis ?? classification.diagnosis;
|
|
5294
|
-
if (diag) state.diagnosis = diag;
|
|
5295
|
-
if (detail) state.detail = detail;
|
|
5296
|
-
if (diagnosis?.repairable) state.repairable = diagnosis.repairable;
|
|
5297
|
-
return state;
|
|
5298
|
-
}
|
|
5299
|
-
function claudeAuthStateChanged(prev, next) {
|
|
5300
|
-
if (!prev) return true;
|
|
5301
|
-
const strip = ({ checkedAt: _c, ...rest }) => JSON.stringify(rest);
|
|
5302
|
-
return strip(prev) !== strip(next);
|
|
5303
|
-
}
|
|
5304
|
-
function keychainIdentityFor(env) {
|
|
5305
|
-
return keychainIdentity(env);
|
|
5306
|
-
}
|
|
5307
|
-
|
|
5308
5146
|
const CLAUDE_AUTH_PROBE_INTERVAL_MS = 10 * 60 * 1e3;
|
|
5309
5147
|
const CLAUDE_AUTH_REFRESH_INTERVAL_MS = 30 * 60 * 1e3;
|
|
5310
5148
|
const PROBE_TIMEOUT_MS = 8e3;
|
|
@@ -5315,6 +5153,7 @@ class ClaudeAuthService {
|
|
|
5315
5153
|
this.opts = opts;
|
|
5316
5154
|
this.env = opts.env ?? process.env;
|
|
5317
5155
|
this.platform = opts.platform ?? process.platform;
|
|
5156
|
+
this.lineage = opts.lineage ?? null;
|
|
5318
5157
|
}
|
|
5319
5158
|
timer = null;
|
|
5320
5159
|
signalTimer = null;
|
|
@@ -5355,7 +5194,7 @@ class ClaudeAuthService {
|
|
|
5355
5194
|
if (this.opts.getCredentialStore() !== "file") return {};
|
|
5356
5195
|
const shim = this.resolveShimDir();
|
|
5357
5196
|
if (!shim) return {};
|
|
5358
|
-
return { PATH: withKeychainOffPath(this.env.PATH, shim) };
|
|
5197
|
+
return { PATH: daemonSupervisor.withKeychainOffPath(this.env.PATH, shim) };
|
|
5359
5198
|
}
|
|
5360
5199
|
effectiveCredentialStore() {
|
|
5361
5200
|
if (this.opts.getCredentialStore() !== "file") return "auto";
|
|
@@ -5379,8 +5218,8 @@ class ClaudeAuthService {
|
|
|
5379
5218
|
const state = await this.probe("repair-precheck", true);
|
|
5380
5219
|
const seen = this.lastDiagnosis;
|
|
5381
5220
|
if (state.diagnosis !== "keychain-empty-item" || !seen?.keychainRaw) return { error: "precondition-failed", claudeAuth: state };
|
|
5382
|
-
const identity = keychainIdentityFor(this.env);
|
|
5383
|
-
const again = interpretSecurityRead(await this.security(securityReadArgs(identity)));
|
|
5221
|
+
const identity = daemonSupervisor.keychainIdentityFor(this.env);
|
|
5222
|
+
const again = daemonSupervisor.interpretSecurityRead(await this.security(daemonSupervisor.securityReadArgs(identity)));
|
|
5384
5223
|
if (again.kind !== "present" || again.raw !== seen.keychainRaw || again.accessToken || again.refreshToken) {
|
|
5385
5224
|
return { error: "precondition-failed", claudeAuth: state };
|
|
5386
5225
|
}
|
|
@@ -5391,7 +5230,7 @@ class ClaudeAuthService {
|
|
|
5391
5230
|
} catch (error) {
|
|
5392
5231
|
return { error: `backup-failed: ${String(error)}`, claudeAuth: state };
|
|
5393
5232
|
}
|
|
5394
|
-
const del = await this.security(securityDeleteArgs(identity));
|
|
5233
|
+
const del = await this.security(daemonSupervisor.securityDeleteArgs(identity));
|
|
5395
5234
|
if (del.exitCode !== 0) return { error: `delete-failed: security exited ${del.exitCode ?? "null"}`, claudeAuth: state };
|
|
5396
5235
|
logger.logger.debug("[CLAUDE AUTH] deleted empty-token keychain item after backup");
|
|
5397
5236
|
const after = await this.probe("repair-done", true);
|
|
@@ -5399,7 +5238,7 @@ class ClaudeAuthService {
|
|
|
5399
5238
|
}
|
|
5400
5239
|
// ── internals ────────────────────────────────────────────────────────
|
|
5401
5240
|
resolveShimDir() {
|
|
5402
|
-
const dir = keychainOffShimDir(this.opts.happyLibDir);
|
|
5241
|
+
const dir = daemonSupervisor.keychainOffShimDir(this.opts.happyLibDir);
|
|
5403
5242
|
const bin = path.join(dir, "security");
|
|
5404
5243
|
try {
|
|
5405
5244
|
if (!node_fs.statSync(bin).isFile()) return null;
|
|
@@ -5419,20 +5258,20 @@ class ClaudeAuthService {
|
|
|
5419
5258
|
diagnosis = await this.diagnose(classification.status);
|
|
5420
5259
|
this.lastDiagnosis = diagnosis;
|
|
5421
5260
|
} else if (classification.status === "not-logged-in") {
|
|
5422
|
-
const file = interpretCredentialsFile(this.readCredentialsFile());
|
|
5261
|
+
const file = daemonSupervisor.interpretCredentialsFile(this.readCredentialsFile());
|
|
5423
5262
|
if (!file.hasTokens) {
|
|
5424
5263
|
diagnosis = {
|
|
5425
5264
|
diagnosis: "no-credentials",
|
|
5426
5265
|
detail: store === "file" ? "credentialStore=file and ~/.claude/.credentials.json has no tokens; log in with `claude` from a terminal on this machine." : "No Claude Code credentials found for this daemon context; log in with `claude` on this machine."
|
|
5427
5266
|
};
|
|
5428
5267
|
} else {
|
|
5429
|
-
diagnosis = { diagnosis: "credentials-rejected", detail: CREDENTIALS_REJECTED_DETAIL };
|
|
5268
|
+
diagnosis = { diagnosis: "credentials-rejected", detail: daemonSupervisor.CREDENTIALS_REJECTED_DETAIL };
|
|
5430
5269
|
}
|
|
5431
5270
|
}
|
|
5432
5271
|
if (storeRequested === "file" && store === "auto") {
|
|
5433
|
-
diagnosis = { ...diagnosis ?? {}, detail: `credentialStore=file requested but the keychain-off shim is missing under ${keychainOffShimDir(this.opts.happyLibDir)}; running in auto mode.` };
|
|
5272
|
+
diagnosis = { ...diagnosis ?? {}, detail: `credentialStore=file requested but the keychain-off shim is missing under ${daemonSupervisor.keychainOffShimDir(this.opts.happyLibDir)}; running in auto mode.` };
|
|
5434
5273
|
}
|
|
5435
|
-
const state = buildClaudeAuthState({
|
|
5274
|
+
const state = daemonSupervisor.buildClaudeAuthState({
|
|
5436
5275
|
daemonPid: process.pid,
|
|
5437
5276
|
platform: this.platform,
|
|
5438
5277
|
lineage: await this.resolveLineage(),
|
|
@@ -5441,7 +5280,7 @@ class ClaudeAuthService {
|
|
|
5441
5280
|
diagnosis,
|
|
5442
5281
|
now: this.opts.now?.() ?? Date.now()
|
|
5443
5282
|
});
|
|
5444
|
-
const changed = claudeAuthStateChanged(this.last, state);
|
|
5283
|
+
const changed = daemonSupervisor.claudeAuthStateChanged(this.last, state);
|
|
5445
5284
|
const stale = state.checkedAt - this.lastPublishedAt >= CLAUDE_AUTH_REFRESH_INTERVAL_MS;
|
|
5446
5285
|
if (changed) {
|
|
5447
5286
|
logger.logger.debug(`[CLAUDE AUTH] ${reason}: status=${state.status} diagnosis=${state.diagnosis ?? "-"} lineage=${state.context.lineage} store=${state.context.credentialStore}`);
|
|
@@ -5459,7 +5298,7 @@ class ClaudeAuthService {
|
|
|
5459
5298
|
return state;
|
|
5460
5299
|
}
|
|
5461
5300
|
async runAuthStatus() {
|
|
5462
|
-
const binary = resolveSdkClaudeBinary(this.platform, process.arch);
|
|
5301
|
+
const binary = daemonSupervisor.resolveSdkClaudeBinary(this.platform, process.arch);
|
|
5463
5302
|
if (!binary) {
|
|
5464
5303
|
return { status: "claude-missing", diagnosis: "sdk-binary-missing", detail: "The Claude Code binary bundled with the Agent SDK is missing; remote sessions cannot start." };
|
|
5465
5304
|
}
|
|
@@ -5504,16 +5343,16 @@ class ClaudeAuthService {
|
|
|
5504
5343
|
done({ stdout, exitCode: code, timedOut: false });
|
|
5505
5344
|
});
|
|
5506
5345
|
});
|
|
5507
|
-
return classifyAuthStatus(run, this.opts.credentialSource);
|
|
5346
|
+
return daemonSupervisor.classifyAuthStatus(run, this.opts.credentialSource);
|
|
5508
5347
|
}
|
|
5509
5348
|
async diagnose(status) {
|
|
5510
|
-
const identity = keychainIdentityFor(this.env);
|
|
5511
|
-
const keychain = interpretSecurityRead(await this.security(securityReadArgs(identity)));
|
|
5512
|
-
const file = interpretCredentialsFile(this.readCredentialsFile(identity.credentialsPath));
|
|
5513
|
-
return diagnoseStores({ status, keychain, file });
|
|
5349
|
+
const identity = daemonSupervisor.keychainIdentityFor(this.env);
|
|
5350
|
+
const keychain = daemonSupervisor.interpretSecurityRead(await this.security(daemonSupervisor.securityReadArgs(identity)));
|
|
5351
|
+
const file = daemonSupervisor.interpretCredentialsFile(this.readCredentialsFile(identity.credentialsPath));
|
|
5352
|
+
return daemonSupervisor.diagnoseStores({ status, keychain, file });
|
|
5514
5353
|
}
|
|
5515
5354
|
readCredentialsFile(path) {
|
|
5516
|
-
const target = path ?? keychainIdentityFor(this.env).credentialsPath;
|
|
5355
|
+
const target = path ?? daemonSupervisor.keychainIdentityFor(this.env).credentialsPath;
|
|
5517
5356
|
try {
|
|
5518
5357
|
return node_fs.existsSync(target) ? node_fs.readFileSync(target, "utf8") : null;
|
|
5519
5358
|
} catch {
|
|
@@ -5538,9 +5377,9 @@ class ClaudeAuthService {
|
|
|
5538
5377
|
return this.lineage;
|
|
5539
5378
|
}
|
|
5540
5379
|
const uid = typeof process.getuid === "function" ? process.getuid() : null;
|
|
5541
|
-
const launchdJobPid = uid === null ? null : parseLaunchctlPid(await this.exec("launchctl", ["print", `gui/${uid}/${HAPPY_DAEMON_LAUNCHD_LABEL}`]));
|
|
5380
|
+
const launchdJobPid = uid === null ? null : daemonSupervisor.parseLaunchctlPid(await this.exec("launchctl", ["print", `gui/${uid}/${daemonSupervisor.HAPPY_DAEMON_LAUNCHD_LABEL}`]));
|
|
5542
5381
|
const ancestors = await this.ancestorPids();
|
|
5543
|
-
this.lineage = classifyLineage({ platform: this.platform, env: this.env, launchdJobPid, ancestorPids: ancestors });
|
|
5382
|
+
this.lineage = daemonSupervisor.classifyLineage({ platform: this.platform, env: this.env, launchdJobPid, ancestorPids: ancestors });
|
|
5544
5383
|
return this.lineage;
|
|
5545
5384
|
}
|
|
5546
5385
|
async ancestorPids() {
|
|
@@ -6378,6 +6217,10 @@ async function removeTeamWorktree(resource) {
|
|
|
6378
6217
|
if (ownBranch) await git(repository, ["branch", "-D", branch]);
|
|
6379
6218
|
}
|
|
6380
6219
|
|
|
6220
|
+
function refusalCode(error) {
|
|
6221
|
+
const code = axios.isAxiosError(error) ? error.response?.data?.error : void 0;
|
|
6222
|
+
return typeof code === "string" && /^[a-z_]{1,64}$/.test(code) ? ` (${code})` : "";
|
|
6223
|
+
}
|
|
6381
6224
|
function persistedSpawnMatches(operationId) {
|
|
6382
6225
|
return Object.entries(persistence.readPersistedSessions()).filter(([, entry]) => entry.metadata?.teamOperationId === operationId);
|
|
6383
6226
|
}
|
|
@@ -6412,6 +6255,7 @@ function createTeamWorker(deps) {
|
|
|
6412
6255
|
writeReceipt$1(home, receipt);
|
|
6413
6256
|
}
|
|
6414
6257
|
if (receipt.phase === "completed") return;
|
|
6258
|
+
let sessionStopped = false;
|
|
6415
6259
|
try {
|
|
6416
6260
|
if (op.type === "spawn") {
|
|
6417
6261
|
if (machineMetadata.ownerRetryPending(op, receipt) && (receipt.phase === "prepared" || receipt.phase === "spawning" && persistedSpawnMatches(op.id).length === 0)) {
|
|
@@ -6508,10 +6352,11 @@ function createTeamWorker(deps) {
|
|
|
6508
6352
|
return;
|
|
6509
6353
|
}
|
|
6510
6354
|
const bot = team.bots.find((candidate) => candidate.id === op.botId);
|
|
6511
|
-
if (!bot ||
|
|
6355
|
+
if (!bot || op.sessionId && bot.transferredTo?.sessionId === op.sessionId) throw new Error("Worker binding changed; preserve resources for reconciliation");
|
|
6512
6356
|
if (op.sessionId) {
|
|
6513
6357
|
await deps.stopAndWait(op.sessionId);
|
|
6514
6358
|
await sessionOps.archiveSession(op.sessionId);
|
|
6359
|
+
sessionStopped = true;
|
|
6515
6360
|
}
|
|
6516
6361
|
if (team.archivedAt !== void 0) {
|
|
6517
6362
|
await complete(op, receipt);
|
|
@@ -6534,7 +6379,7 @@ function createTeamWorker(deps) {
|
|
|
6534
6379
|
} catch {
|
|
6535
6380
|
}
|
|
6536
6381
|
}
|
|
6537
|
-
await action(op.teamId, `failure-${op.id}-${receipt.phase}-${node_crypto.createHash("sha256").update(detail).digest("hex").slice(0, 12)}`, { type: "fail-operation", operationId: op.id, machineId: deps.machineId, claimId: receipt.claimId, error: detail.slice(0, 1e3), unknown }).catch(() => {
|
|
6382
|
+
await action(op.teamId, `failure-${op.id}-${receipt.phase}-${node_crypto.createHash("sha256").update(detail).digest("hex").slice(0, 12)}${sessionStopped ? "-stopped" : ""}`, { type: "fail-operation", operationId: op.id, machineId: deps.machineId, claimId: receipt.claimId, error: detail.slice(0, 1e3), unknown, ...sessionStopped ? { sessionStopped: true } : {} }).catch(() => {
|
|
6538
6383
|
});
|
|
6539
6384
|
deps.log(`Teams operation ${op.id} ${unknown ? "needs reconciliation" : "will retry"}`);
|
|
6540
6385
|
}
|
|
@@ -6614,8 +6459,8 @@ Use the teams tools to inspect current task state before acting. This message is
|
|
|
6614
6459
|
if (closed) break;
|
|
6615
6460
|
try {
|
|
6616
6461
|
await execute(op);
|
|
6617
|
-
} catch {
|
|
6618
|
-
deps.log(`Teams operation ${op.id} remains pending`);
|
|
6462
|
+
} catch (error) {
|
|
6463
|
+
deps.log(`Teams operation ${op.id} remains pending${refusalCode(error)}`);
|
|
6619
6464
|
}
|
|
6620
6465
|
}
|
|
6621
6466
|
await flushEvents(data.teams ?? []);
|
|
@@ -6953,7 +6798,9 @@ function createAutomationRunner(deps) {
|
|
|
6953
6798
|
function persist(receipt) {
|
|
6954
6799
|
writeReceipt(home, receipt, now());
|
|
6955
6800
|
}
|
|
6956
|
-
async function finish(item,
|
|
6801
|
+
async function finish(item, input) {
|
|
6802
|
+
const { report: report2, clipped } = template.clipAutomationReport(input);
|
|
6803
|
+
if (clipped.length) deps.log(`Automation run ${item.runId} report clipped: ${clipped.map((c) => `${c.field} ${c.from}\u2192${c.to}`).join(", ")}`);
|
|
6957
6804
|
try {
|
|
6958
6805
|
await client.report(item.runId, report2);
|
|
6959
6806
|
} catch (error) {
|
|
@@ -8390,7 +8237,7 @@ async function startDaemon() {
|
|
|
8390
8237
|
}
|
|
8391
8238
|
const model = sanitizeResumeModel(options?.model);
|
|
8392
8239
|
if (model) args.push("--model", model);
|
|
8393
|
-
const permissionMode = spawnAgents.sanitizeSpawnPermissionMode(options?.permissionMode);
|
|
8240
|
+
const permissionMode = spawnAgents.sanitizeSpawnPermissionMode(options?.permissionMode ?? (options?.keepPublishedPermissionMode ? publishedRelaunchPermissionMode(metadata) : void 0));
|
|
8394
8241
|
if (permissionMode) args.push("--permission-mode", permissionMode);
|
|
8395
8242
|
restartCounts.set(happySessionId, recordRestartAttempt(prior));
|
|
8396
8243
|
const teamEnv = await teamRelaunchEnvFor(happySessionId, metadata);
|
|
@@ -8549,6 +8396,8 @@ async function startDaemon() {
|
|
|
8549
8396
|
spawnSession,
|
|
8550
8397
|
resumeSession,
|
|
8551
8398
|
// B-501: `very-happy send --resume`
|
|
8399
|
+
restartSession,
|
|
8400
|
+
// B-794: `very-happy session provider`
|
|
8552
8401
|
requestShutdown: () => requestShutdown("happy-cli"),
|
|
8553
8402
|
onHappySessionWebhook,
|
|
8554
8403
|
onSessionStateEvent,
|
|
@@ -8593,8 +8442,10 @@ async function startDaemon() {
|
|
|
8593
8442
|
}
|
|
8594
8443
|
});
|
|
8595
8444
|
const daemonClaudeCredentials = doctorReadiness.resolveClaudeCredentialReadiness();
|
|
8596
|
-
const
|
|
8597
|
-
|
|
8445
|
+
const launchdJob = process.platform === "darwin" ? await daemonSupervisor.probeLaunchdJob() : null;
|
|
8446
|
+
const daemonSupervisor$1 = daemonSupervisor.detectDaemonSupervisor(process.env, process.platform, launchdJob);
|
|
8447
|
+
const lineage = daemonSupervisor.daemonLineage(daemonSupervisor$1, process.env, process.platform, launchdJob);
|
|
8448
|
+
logger.logger.debug(`[DAEMON RUN] Supervisor: ${daemonSupervisor$1} (lineage ${lineage}${launchdJob ? `, launchd job pid ${launchdJob.jobPid ?? "-"}` : ""})`);
|
|
8598
8449
|
let fileState = {
|
|
8599
8450
|
pid: process.pid,
|
|
8600
8451
|
httpPort: controlPort,
|
|
@@ -8677,7 +8528,8 @@ async function startDaemon() {
|
|
|
8677
8528
|
await persistence.writeSettings({ ...settings, claudeCredentialStore: store });
|
|
8678
8529
|
claudeCredentialStoreSetting = store;
|
|
8679
8530
|
},
|
|
8680
|
-
publish: (state) => apiMachine.setClaudeAuthState(state)
|
|
8531
|
+
publish: (state) => apiMachine.setClaudeAuthState(state),
|
|
8532
|
+
lineage
|
|
8681
8533
|
});
|
|
8682
8534
|
claudeAuthServiceRef = claudeAuthService;
|
|
8683
8535
|
apiMachine.setClaudeAuthHandlers({
|
|
@@ -8854,8 +8706,8 @@ async function startDaemon() {
|
|
|
8854
8706
|
await controlClient.cleanupDaemonState();
|
|
8855
8707
|
await persistence.releaseDaemonLock(daemonLockHandle);
|
|
8856
8708
|
await stopCaffeinate();
|
|
8857
|
-
if (daemonSupervisor$1
|
|
8858
|
-
logger.logger.debug(`[DAEMON RUN]
|
|
8709
|
+
if (daemonSupervisor$1 !== "none") {
|
|
8710
|
+
logger.logger.debug(`[DAEMON RUN] ${daemonSupervisor$1}-supervised: exiting ${HANDOVER_EXIT_CODE} for the supervisor to restart on the new bundle`);
|
|
8859
8711
|
process.exit(HANDOVER_EXIT_CODE);
|
|
8860
8712
|
}
|
|
8861
8713
|
try {
|