very-happy-cli 0.2.200 → 0.2.202
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-CwSShYPI.cjs → AcpBackend-BRcPXur6.cjs} +3 -3
- package/dist/{AcpBackend-Cnp6WNn8.mjs → AcpBackend-Z51picBa.mjs} +3 -3
- package/dist/{AcpSessionManager-C4O3jhT_.mjs → AcpSessionManager-BCGqL1Em.mjs} +2 -2
- package/dist/{AcpSessionManager-DqW99tOL.cjs → AcpSessionManager-BckOYH3I.cjs} +2 -2
- package/dist/{BasePermissionHandler-CgqjIUyG.cjs → BasePermissionHandler-BYIY3kxs.cjs} +1 -1
- package/dist/{BasePermissionHandler-8Msj0Z8j.mjs → BasePermissionHandler-BhJjr-wB.mjs} +1 -1
- package/dist/{account-BIxPuBEs.mjs → account-B-HTHZKw.mjs} +11 -11
- package/dist/{account-DcNh2_SN.cjs → account-B0Wu7rJR.cjs} +11 -11
- package/dist/{accountService-BDJo14mY.cjs → accountService-Cns8UYGI.cjs} +4 -4
- package/dist/{accountService-ELazcp3V.mjs → accountService-DEpIq6CF.mjs} +4 -4
- package/dist/{acpSessionResume-De_sTG30.mjs → acpSessionResume-BKjQRT4V.mjs} +1 -1
- package/dist/{acpSessionResume-B_W8uTI6.cjs → acpSessionResume-C8Kd8eK6.cjs} +1 -1
- package/dist/{agentHome-C-900jC1.mjs → agentHome-BXiCouR4.mjs} +4 -4
- package/dist/{agentHome-C-usjJwB.cjs → agentHome-DnxSf1ox.cjs} +4 -4
- package/dist/{api-BPWRzeNF.cjs → api-B-FB-s4z.cjs} +10 -10
- package/dist/{api-DCUiAds-.mjs → api-Cu1OFHDM.mjs} +10 -10
- package/dist/{apiMachine-DjhbA1rL.cjs → apiMachine-DCWgI1l_.cjs} +28 -18
- package/dist/{apiMachine-CJl4m3V3.mjs → apiMachine-DYGPILVb.mjs} +28 -18
- package/dist/{attachmentContent-BKIq6EXR.mjs → attachmentContent-Dq8P5ODq.mjs} +2 -2
- package/dist/{attachmentContent-C2f1UEP9.cjs → attachmentContent-dXwHB_3C.cjs} +2 -2
- package/dist/{auth-h6oU63Ni.cjs → auth-BVNBE4B1.cjs} +8 -8
- package/dist/{auth-8jKFCZOX.mjs → auth-CgdE-j7z.mjs} +5 -5
- package/dist/{auth-uLRHXOGY.mjs → auth-D11uvx2P.mjs} +8 -8
- package/dist/{auth-oAnLi4Tl.cjs → auth-DpIHm7Lb.cjs} +5 -5
- package/dist/{auto-Bpa5iA1A.cjs → auto-Ba2b-il4.cjs} +17 -17
- package/dist/{auto-A5arQ-bI.mjs → auto-WdjHKP9R.mjs} +17 -17
- package/dist/{bootstrap-BkLFgEGF.mjs → bootstrap-BTYJf2w8.mjs} +2 -2
- package/dist/{bootstrap-DUKAKxrJ.cjs → bootstrap-CsZO_jkL.cjs} +2 -2
- package/dist/{browser-Ds-N-Dup.cjs → browser-DgufCq1K.cjs} +1 -1
- package/dist/{browser-BAlw0rns.mjs → browser-Dx3UOVPP.mjs} +1 -1
- package/dist/{claudeAccountEnv-D33xXRE7.cjs → claudeAccountEnv-Btp39mfa.cjs} +1 -1
- package/dist/{claudeAccountEnv-CI8RlIB9.mjs → claudeAccountEnv-DowsOlDB.mjs} +1 -1
- package/dist/{claudeLocal-BbsOT-EF.cjs → claudeLocal-Q0FgzhTu.cjs} +5 -5
- package/dist/{claudeLocal-X48n0RhP.mjs → claudeLocal-ylDKcvX0.mjs} +5 -5
- package/dist/{claudeLocalLauncher-D18gRtxz.mjs → claudeLocalLauncher-CtybsaR8.mjs} +10 -10
- package/dist/{claudeLocalLauncher-D1jS3iK4.cjs → claudeLocalLauncher-D2rZvuaW.cjs} +10 -10
- package/dist/{claudeSessionFork-Bkxn40Y8.cjs → claudeSessionFork-BrstQPE4.cjs} +1 -1
- package/dist/{claudeSessionFork-n1vMiFcP.mjs → claudeSessionFork-DRLxmv9j.mjs} +1 -1
- package/dist/{client-BnoN4P4t.cjs → client-CNWx72ZT.cjs} +2 -2
- package/dist/{client-C8BTmcrh.cjs → client-Ch4Azlny.cjs} +4 -4
- package/dist/{client-BgxQ9aej.mjs → client-Cj7D61by.mjs} +3 -3
- package/dist/{client-Blpuk2Hr.mjs → client-D0oBXuEe.mjs} +2 -2
- package/dist/{client-C0qjAgZ_.mjs → client-DJsXNJWO.mjs} +4 -4
- package/dist/{client-BXwIqRha.mjs → client-DfT_CRwl.mjs} +2 -2
- package/dist/{client-D0_UOmC1.cjs → client-Dq7jaxb2.cjs} +2 -2
- package/dist/{client-1zIbVVX5.cjs → client-xV99weGP.cjs} +3 -3
- package/dist/codex/happyMcpStdioBridge.cjs +18 -18
- package/dist/codex/happyMcpStdioBridge.mjs +18 -18
- package/dist/{codexAccount-BAezf1fY.mjs → codexAccount-CieIQLOX.mjs} +1 -1
- package/dist/{codexAccount-DfeCHUOU.cjs → codexAccount-D-OBY29W.cjs} +1 -1
- package/dist/{codexAppServerClient-xBeqblCj.cjs → codexAppServerClient-BwBPZonh.cjs} +3 -3
- package/dist/{codexAppServerClient-By4ntTIr.mjs → codexAppServerClient-DtdCZ7_b.mjs} +3 -3
- package/dist/{codexCommand-CgzJe-Ti.cjs → codexCommand-CsY9YFiG.cjs} +53 -52
- package/dist/{codexCommand-C7BVsmPu.mjs → codexCommand-D92AQCLU.mjs} +49 -48
- package/dist/{codexTermination-DVrdQx3Q.cjs → codexTermination-BbXG2oFT.cjs} +1 -1
- package/dist/{codexTermination-BS0sLBKS.mjs → codexTermination-rhIxjRMJ.mjs} +1 -1
- package/dist/{config-D3jidXDu.mjs → config-BnN1yFyi.mjs} +3 -3
- package/dist/{config-4R0rnthZ.cjs → config-Zhkmfb3O.cjs} +3 -3
- package/dist/{configuration-4pG95tsq.mjs → configuration-CQaLZMa-.mjs} +1 -1
- package/dist/{configuration-ClUt7pqs.cjs → configuration-DZUnfWp2.cjs} +1 -1
- package/dist/{connect-Da2NQJ3K.cjs → connect-BToTf3Gy.cjs} +13 -13
- package/dist/{connect-Do5qcqmg.mjs → connect-DY5QLfbI.mjs} +13 -13
- package/dist/{context-wMsIGwBw.cjs → context-BHydzPZw.cjs} +1 -1
- package/dist/{context-Cf05DtNM.mjs → context-ByTvtMXZ.mjs} +1 -1
- package/dist/{controlClient-SYDFcIkk.cjs → controlClient-Bfwe0Xpt.cjs} +3 -3
- package/dist/{controlClient-bqCKl9Nv.mjs → controlClient-Cqhd8ynk.mjs} +3 -3
- package/dist/{createSessionMetadata-msQTEvvn.cjs → createSessionMetadata-D_qa01wq.cjs} +2 -2
- package/dist/{createSessionMetadata-CQkxe_4T.mjs → createSessionMetadata-tmhDzhJZ.mjs} +2 -2
- package/dist/{daemonAccounts-B8xnkprW.mjs → daemonAccounts-D5shoCLt.mjs} +3 -3
- package/dist/{daemonAccounts-Ch_rSTSX.cjs → daemonAccounts-ciidbU2h.cjs} +2 -2
- package/dist/{defaultPermissionMode-BETWd5Lf.cjs → defaultPermissionMode-Cs_Tv83b.cjs} +1 -1
- package/dist/{defaultPermissionMode-Cl3OvdHp.mjs → defaultPermissionMode-DgeiMMqy.mjs} +1 -1
- package/dist/{deterministicJson-CQ8jkArF.cjs → deterministicJson-CbUdClvO.cjs} +67 -20
- package/dist/{deterministicJson-BRAeReBK.mjs → deterministicJson-DRL1Gs_c.mjs} +68 -21
- package/dist/{doctor-C9D-t20z.cjs → doctor-DHCmWcwR.cjs} +7 -7
- package/dist/{doctor-Dy7z3qvy.mjs → doctor-Wu0yZ80l.mjs} +7 -7
- package/dist/{downloadTarget-DfoOSrYi.cjs → downloadTarget-BoJrjpEe.cjs} +6 -6
- package/dist/{downloadTarget-Diq-GBu4.mjs → downloadTarget-G72yKQcM.mjs} +6 -6
- package/dist/{ensureDaemonRunning-LqrgqVG3.mjs → ensureDaemonRunning-BKGybp3s.mjs} +5 -5
- package/dist/{ensureDaemonRunning-Df76EtKd.cjs → ensureDaemonRunning-CnkyGd9x.cjs} +5 -5
- package/dist/{format-CbliQN8V.mjs → format-BSx-Nv2p.mjs} +2 -1
- package/dist/{format-P9_M_7ga.cjs → format-DePME4uu.cjs} +2 -1
- package/dist/{handleResumeCommand-Dz4Aw_aZ.mjs → handleResumeCommand-DrJdhjLD.mjs} +5 -5
- package/dist/{handleResumeCommand-CjCtwrrm.cjs → handleResumeCommand-uKzhaOVC.cjs} +5 -5
- package/dist/{index-BiutHOAO.cjs → index-44o_qMvE.cjs} +14 -4
- package/dist/{index-CdOnhx2X.cjs → index-BKXqaux4.cjs} +4 -4
- package/dist/{index-Sdvy1Lsf.mjs → index-BcYJJV-f.mjs} +3 -3
- package/dist/{index-ByBOdEvG.cjs → index-Bi7Lmykl.cjs} +47 -46
- package/dist/{index-BNBXrqRE.mjs → index-C-eSUhXW.mjs} +4 -4
- package/dist/{index-kwsivEs-.mjs → index-CiRMvS73.mjs} +14 -5
- package/dist/{index-DUwOmhnq.cjs → index-CoBaGAA4.cjs} +3 -3
- package/dist/{index-CjMA70-R.mjs → index-CowtCbZ_.mjs} +46 -45
- package/dist/{index-CbzettaI.cjs → index-DDOCSeEj.cjs} +4 -4
- package/dist/{index-XP-qcJQ3.mjs → index-fNsf-8K-.mjs} +4 -4
- package/dist/index.cjs +2 -2
- package/dist/index.mjs +2 -2
- package/dist/{install-DMXd8Z4c.mjs → install-0TkucJrC.mjs} +3 -3
- package/dist/{install-C4dKrmxR.cjs → install-Ddc8TlWE.cjs} +3 -3
- package/dist/{issue-BijeNKIT.cjs → issue-CIfzJuaS.cjs} +8 -8
- package/dist/{issue-COytLvGE.mjs → issue-CML2xa46.mjs} +8 -8
- package/dist/lib.cjs +12 -12
- package/dist/lib.d.cts +4 -0
- package/dist/lib.d.mts +4 -0
- package/dist/lib.mjs +12 -12
- package/dist/{localHappyAgentAuth-DeDQjw24.mjs → localHappyAgentAuth-BUX4E1ug.mjs} +1 -1
- package/dist/{localHappyAgentAuth-CjtNcaI0.cjs → localHappyAgentAuth-WLqXQbc6.cjs} +1 -1
- package/dist/{logger-BLMi8oJK.mjs → logger-BEVIGYKL.mjs} +17 -3
- package/dist/{logger-D28MY1Bv.cjs → logger-Dhc0l3xH.cjs} +17 -2
- package/dist/{machineMetadata-D8OWVD4l.mjs → machineMetadata-BQdp_ihk.mjs} +3 -3
- package/dist/{machineMetadata-BzjrIn_N.cjs → machineMetadata-ixKckJ7k.cjs} +3 -3
- package/dist/{main-DoJIcSOh.cjs → main-BNBYOcQb.cjs} +49 -49
- package/dist/{main-c0fCuBON.mjs → main-BzQSe4Zu.mjs} +49 -49
- package/dist/{mcp-DKkBFGUa.mjs → mcp-BueI4Bel.mjs} +18 -18
- package/dist/{mcp-CEtvR6tG.cjs → mcp-BwskAxOK.cjs} +18 -18
- package/dist/{mirrorProtocol-DFQLXDBI.mjs → mirrorProtocol-5aFYsCCe.mjs} +3 -3
- package/dist/{mirrorProtocol-CCl9dtzh.cjs → mirrorProtocol-DGMmhArw.cjs} +3 -3
- package/dist/{package-BFSsS_dl.cjs → package-CAmlKYcH.cjs} +7 -7
- package/dist/{package-DbGqY8Ej.mjs → package-aOUtHYRZ.mjs} +7 -7
- package/dist/{panels-2yIO9FxQ.mjs → panels-BeVMgmRW.mjs} +5 -5
- package/dist/{panels-BqLXIQif.cjs → panels-By2IDfXv.cjs} +5 -5
- package/dist/{peerTools-4GYKxr8J.mjs → peerTools-BkRgJomj.mjs} +5 -5
- package/dist/{peerTools-Z8V2E0AF.cjs → peerTools-dgllF1wT.cjs} +5 -5
- package/dist/{persistence-TpVFA5-I.cjs → persistence-05BAS4Ou.cjs} +12 -2
- package/dist/{persistence-DbOKjdUD.mjs → persistence-EuUaQKL7.mjs} +12 -3
- package/dist/{piRunnerArgs-Bdj0sjAT.mjs → piRunnerArgs-CygWrAwY.mjs} +1 -1
- package/dist/{piRunnerArgs-DOEJJymf.cjs → piRunnerArgs-DkjCRPYn.cjs} +1 -1
- package/dist/{piRuntime-B0QZykV7.mjs → piRuntime-LRW_t6ME.mjs} +1 -1
- package/dist/{piRuntime-DiRayy91.cjs → piRuntime-zY2jIQod.cjs} +1 -1
- package/dist/{piTerminal-DciFqPEi.cjs → piTerminal-BfZshXGh.cjs} +20 -20
- package/dist/{piTerminal-DGF4X7C-.mjs → piTerminal-BhlPA1HR.mjs} +20 -20
- package/dist/{pushNotifications-CrCTpDiN.mjs → pushNotifications-B7Ga8Zyf.mjs} +3 -3
- package/dist/{pushNotifications-C1i2W1GQ.cjs → pushNotifications-DaVlLe7N.cjs} +3 -3
- package/dist/{query-CrSvcV32.mjs → query-BQLtwpr9.mjs} +1 -1
- package/dist/{query-BkOpCpRo.cjs → query-CX0Of89i.cjs} +1 -1
- package/dist/{rateLimitWindows-BREA7OZj.cjs → rateLimitWindows-CpSOlXBt.cjs} +1 -1
- package/dist/{rateLimitWindows-DZVrafmm.mjs → rateLimitWindows-hv2zLYid.mjs} +1 -1
- package/dist/{reconnectGate-YQ5jXJfY.cjs → reconnectGate-B_aJrehH.cjs} +1 -1
- package/dist/{reconnectGate-COxAZTv8.mjs → reconnectGate-DO_ZQmJE.mjs} +1 -1
- package/dist/{registerCommonHandlers-Cfl_dEWs.mjs → registerCommonHandlers-BEpK4WD2.mjs} +2 -2
- package/dist/{registerCommonHandlers-D95IxqDN.cjs → registerCommonHandlers-em2elV3l.cjs} +2 -2
- package/dist/{registerKillSessionHandler-DoE6xgH3.mjs → registerKillSessionHandler-D-dDzI2n.mjs} +6 -6
- package/dist/{registerKillSessionHandler-DJJXtc_L.cjs → registerKillSessionHandler-D4ZQvsH2.cjs} +6 -6
- package/dist/{registerSideQuestionHandler-DsRz-aD9.cjs → registerSideQuestionHandler-BIOLUe2U.cjs} +4 -4
- package/dist/{registerSideQuestionHandler-Dv00rqcy.mjs → registerSideQuestionHandler-okUy9Q_-.mjs} +4 -4
- package/dist/{remoteSessionClient-DleOeQlN.cjs → remoteSessionClient-BLWFXMBo.cjs} +5 -5
- package/dist/{remoteSessionClient-BFd_D9ka.mjs → remoteSessionClient-CzjLyL9c.mjs} +5 -5
- package/dist/{reportProgressTool-D4xKY9Ur.mjs → reportProgressTool-CNi0Vqqm.mjs} +5 -5
- package/dist/{reportProgressTool-DtEpDqv3.cjs → reportProgressTool-DcNBXBw8.cjs} +5 -5
- package/dist/{run-iDEMW4js.mjs → run-D59Gb4SQ.mjs} +272 -73
- package/dist/{run-CVAIFpsp.cjs → run-bzlz4DI1.cjs} +272 -73
- package/dist/{runClaude-DvHdLJaV.mjs → runClaude-DZtdmcXK.mjs} +26 -25
- package/dist/{runClaude-gucCQBma.cjs → runClaude-kVp1PKab.cjs} +29 -28
- package/dist/{runClaudeDeps-CQ8vvqUQ.cjs → runClaudeDeps-BHv9FkVz.cjs} +43 -42
- package/dist/{runClaudeDeps-DkFWFwVc.mjs → runClaudeDeps-D83tR1KP.mjs} +49 -48
- package/dist/{runGemini-B2lXQDru.mjs → runGemini-DLc_bL4E.mjs} +36 -35
- package/dist/{runGemini-C0vqJYtS.cjs → runGemini-W-0t7skM.cjs} +36 -35
- package/dist/{runOpenClaw-DNV7GX73.cjs → runOpenClaw-BsqbOw8R.cjs} +18 -18
- package/dist/{runOpenClaw-Ddb6sOkY.mjs → runOpenClaw-mm-hKxMC.mjs} +18 -18
- package/dist/{sandbox-Cw0cPDDh.mjs → sandbox-DXbKl-Os.mjs} +4 -4
- package/dist/{sandbox-FA0RlaZg.cjs → sandbox-DrWJss7J.cjs} +4 -4
- package/dist/selfCheck-B1XdrEbN.mjs +89 -0
- package/dist/{selfCheck-DFC8fzhF.cjs → selfCheck-CVXucSXR.cjs} +40 -40
- package/dist/{send-CwgqPftE.mjs → send-Cdda78Iw.mjs} +8 -8
- package/dist/{send-BFd-5b_Q.cjs → send-D7pRBaht.cjs} +8 -8
- package/dist/{server-DwOdMGAP.cjs → server-BI6defPs.cjs} +6 -6
- package/dist/{server-C_4Fk45r.mjs → server-CNilQcJK.mjs} +4 -4
- package/dist/{sessionLock-DglhFHzB.cjs → sessionLock-Bjsy90aM.cjs} +3 -3
- package/dist/{sessionLock-CphKQyav.mjs → sessionLock-CVjlaRSL.mjs} +3 -3
- package/dist/sessionMetadata-B44cL4Xj.cjs +29 -0
- package/dist/sessionMetadata-C1eoAi89.mjs +25 -0
- package/dist/{sessionOps-D-uFSTHk.mjs → sessionOps-CV5RUpwG.mjs} +4 -4
- package/dist/{sessionOps-CIFvoFPA.cjs → sessionOps-CvmOHwGP.cjs} +4 -4
- package/dist/{sessionProvider-B0daO-Ln.cjs → sessionProvider-4sWr0Myr.cjs} +10 -10
- package/dist/{sessionProvider-D8y7K8bK.mjs → sessionProvider-BmO4ahnt.mjs} +10 -10
- package/dist/{sessionScanner-DQAOP6pU.mjs → sessionScanner-34Q0vTR3.mjs} +3 -3
- package/dist/{sessionScanner-CWflbWoH.cjs → sessionScanner-DZBiEOyb.cjs} +3 -3
- package/dist/{sessions-CaO_-AI7.mjs → sessions-Cl435KQT.mjs} +10 -10
- package/dist/{sessions-CzpI76qj.cjs → sessions-DjAXZWTX.cjs} +10 -10
- package/dist/{setupOfflineReconnection-Ck-p0YPb.mjs → setupOfflineReconnection-BC5FJTkc.mjs} +2 -2
- package/dist/{setupOfflineReconnection-BZHRoKDx.cjs → setupOfflineReconnection-zebrb6U_.cjs} +2 -2
- package/dist/{spawn-DyjOa4nf.cjs → spawn-C8cJK9-m.cjs} +14 -14
- package/dist/{spawn-BEJxfj60.mjs → spawn-DqWdgMt_.mjs} +14 -14
- package/dist/{spawnAgents-XObVj6zN.mjs → spawnAgents-BclZYkov.mjs} +1 -1
- package/dist/{spawnAgents-IiuqX0S5.cjs → spawnAgents-DvbEDCIq.cjs} +1 -1
- package/dist/{spawnHappyCLI-Cc9kKpcq.mjs → spawnHappyCLI-BckHSjR0.mjs} +1 -1
- package/dist/{spawnHappyCLI-C3XuIB2N.cjs → spawnHappyCLI-CeWgULMt.cjs} +1 -1
- package/dist/{startFileWatcher-t3K1y9kY.mjs → startFileWatcher-BXiBlfVr.mjs} +1 -1
- package/dist/{startFileWatcher-CeDJl9mN.cjs → startFileWatcher-CXZYt0y9.cjs} +1 -1
- package/dist/{sessionMetadata-DyTJ0Ki5.cjs → startupSessionCreate-CycB-kwu.cjs} +3 -14
- package/dist/{sessionMetadata-V7Z7F-cj.mjs → startupSessionCreate-D8hODW7I.mjs} +4 -14
- package/dist/{store-DOZAMV4W.cjs → store-Cpb1LMNW.cjs} +1 -1
- package/dist/{store-CqNAE-0v.mjs → store-DWmjM4Ex.mjs} +1 -1
- package/dist/{streamRelay-Dyp4x44P.cjs → streamRelay-4XiiNB3N.cjs} +1 -1
- package/dist/{streamRelay-7D7v0hvk.mjs → streamRelay-DdGOsW8v.mjs} +1 -1
- package/dist/{sync-s1pUqWGm.mjs → sync-BfM5OKSS.mjs} +1 -1
- package/dist/{sync-BvxhuW9R.cjs → sync-CyUWevwD.cjs} +1 -1
- package/dist/{systemPrompt-CCdSrtn3.cjs → systemPrompt-BUZQDf4k.cjs} +2 -2
- package/dist/{systemPrompt-CLYTbBhV.mjs → systemPrompt-Tu_2ixE3.mjs} +2 -2
- package/dist/{teams-BVp5F_xN.mjs → teams-Cpdqvfe3.mjs} +7 -7
- package/dist/{teams-D2q1DQWz.cjs → teams-KjHee0Vg.cjs} +7 -7
- package/dist/{template-M1YGFYUT.cjs → template-3fV9bi0X.cjs} +1 -1
- package/dist/{template-oBrR0saD.mjs → template-CtRLg2PG.mjs} +1 -1
- package/dist/{time-qd46L189.mjs → time-BQWf06hA.mjs} +1 -1
- package/dist/{time-D-v2Cd9e.cjs → time-CbOTVtAt.cjs} +1 -1
- package/dist/{titleGenerator-CSYqcorn.cjs → titleGenerator-CpiQkf_r.cjs} +3 -3
- package/dist/{titleGenerator-BdeHi3IY.mjs → titleGenerator-DYnqd0oI.mjs} +2 -2
- package/dist/{todo-Dq_YuJvj.cjs → todo-Cp6bRp62.cjs} +26 -18
- package/dist/{todo-DiEhLgUZ.mjs → todo-DVrsXyKn.mjs} +26 -18
- package/dist/{tools-CY2zrdd5.cjs → tools-BFQm7xny.cjs} +1 -1
- package/dist/{tools-DR7GWBBV.mjs → tools-XGAJepvT.mjs} +1 -1
- package/dist/{uninstall-BvwDZVU9.mjs → uninstall-C2LF0vtR.mjs} +3 -3
- package/dist/{uninstall-BHhHjbzE.cjs → uninstall-Cyqq90JW.cjs} +3 -3
- package/dist/{wrapperAccount-ejUjAQaM.cjs → wrapperAccount-nGGMJDBF.cjs} +2 -2
- package/dist/{wrapperAccount-CpDsQL15.mjs → wrapperAccount-z8Swrd08.mjs} +2 -2
- package/package.json +7 -7
- package/dist/selfCheck-B-hKig8I.mjs +0 -89
|
@@ -1,28 +1,29 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var mirrorProtocol = require('./mirrorProtocol-
|
|
3
|
+
var mirrorProtocol = require('./mirrorProtocol-DGMmhArw.cjs');
|
|
4
4
|
var fsMkdir = require('./fsMkdir-0K3yENml.cjs');
|
|
5
|
-
var piRunnerArgs = require('./piRunnerArgs-
|
|
5
|
+
var piRunnerArgs = require('./piRunnerArgs-DkjCRPYn.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
|
+
var sessionMetadata = require('./sessionMetadata-B44cL4Xj.cjs');
|
|
10
11
|
var node_fs = require('node:fs');
|
|
11
12
|
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-
|
|
13
|
+
var configuration = require('./configuration-DZUnfWp2.cjs');
|
|
14
|
+
var api = require('./api-B-FB-s4z.cjs');
|
|
15
|
+
var spawnAgents = require('./spawnAgents-DvbEDCIq.cjs');
|
|
16
|
+
var logger = require('./logger-Dhc0l3xH.cjs');
|
|
17
|
+
var index$2 = require('./index-CoBaGAA4.cjs');
|
|
18
|
+
var auth = require('./auth-DpIHm7Lb.cjs');
|
|
18
19
|
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-
|
|
25
|
-
var index = require('./index-
|
|
20
|
+
var _package = require('./package-CAmlKYcH.cjs');
|
|
21
|
+
var doctor = require('./doctor-DHCmWcwR.cjs');
|
|
22
|
+
var spawnHappyCLI = require('./spawnHappyCLI-CeWgULMt.cjs');
|
|
23
|
+
var persistence = require('./persistence-05BAS4Ou.cjs');
|
|
24
|
+
var controlClient = require('./controlClient-Bfwe0Xpt.cjs');
|
|
25
|
+
var sessionOps = require('./sessionOps-CvmOHwGP.cjs');
|
|
26
|
+
var index = require('./index-44o_qMvE.cjs');
|
|
26
27
|
var fastify = require('fastify');
|
|
27
28
|
var z = require('zod');
|
|
28
29
|
var fastifyTypeProviderZod = require('fastify-type-provider-zod');
|
|
@@ -30,69 +31,69 @@ var authRelay = require('./authRelay-Dy1qU9td.cjs');
|
|
|
30
31
|
var node_crypto = require('node:crypto');
|
|
31
32
|
var previewPath = require('./previewPath-B0rBdhy1.cjs');
|
|
32
33
|
var backgroundTaskActivity = require('./backgroundTaskActivity-CBvUdj39.cjs');
|
|
33
|
-
var rateLimitWindows = require('./rateLimitWindows-
|
|
34
|
-
var peerTools = require('./peerTools-
|
|
34
|
+
var rateLimitWindows = require('./rateLimitWindows-CpSOlXBt.cjs');
|
|
35
|
+
var peerTools = require('./peerTools-dgllF1wT.cjs');
|
|
35
36
|
var os = require('node:os');
|
|
36
|
-
var remoteSessionClient = require('./remoteSessionClient-
|
|
37
|
-
var bootstrap = require('./bootstrap-
|
|
38
|
-
var index$1 = require('./index-
|
|
37
|
+
var remoteSessionClient = require('./remoteSessionClient-BLWFXMBo.cjs');
|
|
38
|
+
var bootstrap = require('./bootstrap-CsZO_jkL.cjs');
|
|
39
|
+
var index$1 = require('./index-DDOCSeEj.cjs');
|
|
39
40
|
var require$$0 = require('fs');
|
|
40
41
|
var require$$1 = require('path');
|
|
41
42
|
var node_child_process = require('node:child_process');
|
|
42
43
|
var projectPath = require('./projectPath-C3ioB4Bu.cjs');
|
|
43
44
|
var doctorReadiness = require('./doctorReadiness-Dl6yRQCy.cjs');
|
|
44
|
-
var machineMetadata = require('./machineMetadata-
|
|
45
|
+
var machineMetadata = require('./machineMetadata-ixKckJ7k.cjs');
|
|
45
46
|
var fileStore = require('./fileStore-7qhnbs6N.cjs');
|
|
46
47
|
var pi = require('./pi-DlsrPCTa.cjs');
|
|
47
|
-
var codexAccount = require('./codexAccount-
|
|
48
|
+
var codexAccount = require('./codexAccount-D-OBY29W.cjs');
|
|
48
49
|
var require$$3 = require('crypto');
|
|
49
50
|
var detectCLI = require('./detectCLI-BuYR_Qxe.cjs');
|
|
50
|
-
var handleResumeCommand = require('./handleResumeCommand-
|
|
51
|
+
var handleResumeCommand = require('./handleResumeCommand-uKzhaOVC.cjs');
|
|
51
52
|
var webPanels = require('./webPanels-FCgFKvVe.cjs');
|
|
52
53
|
var promises = require('node:fs/promises');
|
|
53
54
|
var cliUpdate = require('./cliUpdate-DsKXPFYp.cjs');
|
|
54
|
-
var client = require('./client-
|
|
55
|
-
var sessionLock = require('./sessionLock-
|
|
56
|
-
var client$1 = require('./client-
|
|
55
|
+
var client = require('./client-CNWx72ZT.cjs');
|
|
56
|
+
var sessionLock = require('./sessionLock-Bjsy90aM.cjs');
|
|
57
|
+
var client$1 = require('./client-Dq7jaxb2.cjs');
|
|
57
58
|
var daemonSupervisor = require('./daemonSupervisor-alqGPANc.cjs');
|
|
58
|
-
var accountService = require('./accountService-
|
|
59
|
-
var daemonAccounts = require('./daemonAccounts-
|
|
59
|
+
var accountService = require('./accountService-Cns8UYGI.cjs');
|
|
60
|
+
var daemonAccounts = require('./daemonAccounts-ciidbU2h.cjs');
|
|
60
61
|
var path$1 = require('./path-B7zW-WwE.cjs');
|
|
61
62
|
var editPaths = require('./editPaths-Bqp4OFPw.cjs');
|
|
62
|
-
var startFileWatcher = require('./startFileWatcher-
|
|
63
|
-
var sync = require('./sync-
|
|
63
|
+
var startFileWatcher = require('./startFileWatcher-CXZYt0y9.cjs');
|
|
64
|
+
var sync = require('./sync-CyUWevwD.cjs');
|
|
64
65
|
var types = require('./types-CRS-srZK.cjs');
|
|
65
66
|
var tmuxSocket = require('./tmuxSocket-Dg11Olx0.cjs');
|
|
66
67
|
var processTermination = require('./processTermination-f17wxlMb.cjs');
|
|
67
68
|
var doctor$1 = require('./doctor-CJpFhHoK.cjs');
|
|
68
69
|
var resources = require('./resources-BZ_Be0qM.cjs');
|
|
69
70
|
var node_util = require('node:util');
|
|
70
|
-
var template = require('./template-
|
|
71
|
-
var client$2 = require('./client-
|
|
71
|
+
var template = require('./template-3fV9bi0X.cjs');
|
|
72
|
+
var client$2 = require('./client-xV99weGP.cjs');
|
|
72
73
|
var loginShellEnv = require('./loginShellEnv-BkuYtExZ.cjs');
|
|
73
|
-
var store = require('./store-
|
|
74
|
-
require('./acpSessionResume-
|
|
75
|
-
require('./pushNotifications-
|
|
74
|
+
var store = require('./store-Cpb1LMNW.cjs');
|
|
75
|
+
require('./acpSessionResume-C8Kd8eK6.cjs');
|
|
76
|
+
require('./pushNotifications-DaVlLe7N.cjs');
|
|
76
77
|
require('./contentLogMetadata-ZSFk_NjQ.cjs');
|
|
77
|
-
require('./reconnectGate-
|
|
78
|
+
require('./reconnectGate-B_aJrehH.cjs');
|
|
78
79
|
require('node:events');
|
|
79
80
|
require('socket.io-client');
|
|
80
81
|
require('./limits-C-a7gr04.cjs');
|
|
81
|
-
require('./time-
|
|
82
|
-
require('./registerCommonHandlers-
|
|
82
|
+
require('./time-CbOTVtAt.cjs');
|
|
83
|
+
require('./registerCommonHandlers-em2elV3l.cjs');
|
|
83
84
|
require('util');
|
|
84
85
|
require('cross-spawn');
|
|
85
86
|
require('@paralleldrive/cuid2');
|
|
86
87
|
require('chalk');
|
|
87
88
|
require('node:module');
|
|
88
89
|
require('tweetnacl');
|
|
89
|
-
require('./browser-
|
|
90
|
+
require('./browser-DgufCq1K.cjs');
|
|
90
91
|
require('open');
|
|
91
92
|
require('./specialCommands-J3JFOq0J.cjs');
|
|
92
93
|
require('./ids-B6ZC0HGt.cjs');
|
|
93
94
|
require('url');
|
|
94
|
-
require('./localHappyAgentAuth-
|
|
95
|
-
require('./claudeAccountEnv-
|
|
95
|
+
require('./localHappyAgentAuth-WLqXQbc6.cjs');
|
|
96
|
+
require('./claudeAccountEnv-Btp39mfa.cjs');
|
|
96
97
|
require('node:readline');
|
|
97
98
|
require('node-pty');
|
|
98
99
|
require('./processTreeSnapshot-D5iNblp6.cjs');
|
|
@@ -3914,8 +3915,9 @@ function createUpdateController(deps) {
|
|
|
3914
3915
|
outcome = { state, version, detail, at: now(), ...manualVersion ? { source: "manual" } : {} };
|
|
3915
3916
|
deps.publish(snapshot());
|
|
3916
3917
|
}
|
|
3918
|
+
const superseded = () => !!deps.owned && !deps.owned();
|
|
3917
3919
|
async function evaluate() {
|
|
3918
|
-
if (!policy || running) return;
|
|
3920
|
+
if (!policy || running || superseded()) return;
|
|
3919
3921
|
const target = manualVersion ?? policy.autoUpdateVersion ?? null;
|
|
3920
3922
|
if (outcome?.version === target && ["failed", "installed", "manual_required"].includes(outcome.state)) {
|
|
3921
3923
|
const fingerprint = JSON.stringify([policy.checkedAt, outcome.state, outcome.version, outcome.detail, manualVersion, autoUpdateEnabled]);
|
|
@@ -4007,19 +4009,23 @@ function createUpdateController(deps) {
|
|
|
4007
4009
|
}
|
|
4008
4010
|
}
|
|
4009
4011
|
async function refresh() {
|
|
4010
|
-
if (
|
|
4012
|
+
if (superseded()) return "superseded";
|
|
4013
|
+
if (blocked) return "blocked";
|
|
4014
|
+
if (operation) return "busy";
|
|
4011
4015
|
operation = "refresh";
|
|
4012
4016
|
try {
|
|
4013
4017
|
const next = await deps.policy();
|
|
4014
|
-
if (!next) return;
|
|
4018
|
+
if (!next) return "unavailable";
|
|
4015
4019
|
if (manualVersion && !validManualTarget(next, manualVersion)) manualVersion = null;
|
|
4016
4020
|
policy = next;
|
|
4017
4021
|
await evaluate();
|
|
4022
|
+
return policyStale() ? "stale" : "ok";
|
|
4018
4023
|
} finally {
|
|
4019
4024
|
operation = null;
|
|
4020
4025
|
}
|
|
4021
4026
|
}
|
|
4022
4027
|
async function retry(version) {
|
|
4028
|
+
if (superseded()) return { error: "daemon_superseded" };
|
|
4023
4029
|
if (operation || blocked) return { error: blocked ? "manual_recovery_required" : "update_in_progress" };
|
|
4024
4030
|
if (typeof version !== "string" || outcome?.state !== "failed" || outcome.version !== version) {
|
|
4025
4031
|
return { error: "no_matching_failed_update" };
|
|
@@ -4044,6 +4050,7 @@ function createUpdateController(deps) {
|
|
|
4044
4050
|
}
|
|
4045
4051
|
}
|
|
4046
4052
|
async function request(version) {
|
|
4053
|
+
if (superseded()) return { error: "daemon_superseded" };
|
|
4047
4054
|
if (operation || blocked) return { error: blocked ? "manual_recovery_required" : "update_in_progress" };
|
|
4048
4055
|
operation = "request";
|
|
4049
4056
|
try {
|
|
@@ -4087,7 +4094,8 @@ function createUpdateController(deps) {
|
|
|
4087
4094
|
handoverHold = { reason, at: now() };
|
|
4088
4095
|
publish("failed", manualVersion ?? policy?.autoUpdateVersion ?? null, "handover_preflight_failed");
|
|
4089
4096
|
}
|
|
4090
|
-
|
|
4097
|
+
const policyStale = () => !policy || now() - policy.checkedAt > 65 * 6e4;
|
|
4098
|
+
return { refresh, retry, request, tick, withHandover, holdHandover, policyStale, isRunning: () => running, currentTarget: () => policy?.autoUpdateVersion ?? null };
|
|
4091
4099
|
}
|
|
4092
4100
|
|
|
4093
4101
|
const defaults = {
|
|
@@ -4296,6 +4304,132 @@ function createPolicyAnnouncementHandler(deps) {
|
|
|
4296
4304
|
};
|
|
4297
4305
|
}
|
|
4298
4306
|
|
|
4307
|
+
const POLICY_REFRESH_MIN_INTERVAL_MS = 5 * 6e4;
|
|
4308
|
+
const POLICY_REFRESH_RETRY_MS = 3e4;
|
|
4309
|
+
const POLICY_REFRESH_MAX_BACKOFF_MS = 30 * 6e4;
|
|
4310
|
+
const WAKE_GAP_SLACK_MS = 2 * 6e4;
|
|
4311
|
+
function createPolicyRefreshTrigger(deps) {
|
|
4312
|
+
const now = deps.now ?? Date.now;
|
|
4313
|
+
const minIntervalMs = deps.minIntervalMs ?? POLICY_REFRESH_MIN_INTERVAL_MS;
|
|
4314
|
+
const retryMs = deps.retryMs ?? POLICY_REFRESH_RETRY_MS;
|
|
4315
|
+
const maxBackoffMs = deps.maxBackoffMs ?? POLICY_REFRESH_MAX_BACKOFF_MS;
|
|
4316
|
+
const setTimer = deps.setTimer ?? ((fn, ms) => {
|
|
4317
|
+
const t = setTimeout(fn, ms);
|
|
4318
|
+
t.unref?.();
|
|
4319
|
+
return t;
|
|
4320
|
+
});
|
|
4321
|
+
const clearTimer = deps.clearTimer ?? ((handle) => clearTimeout(handle));
|
|
4322
|
+
const log = (message, level) => deps.log?.(message, level);
|
|
4323
|
+
let lastSuccessAt = null;
|
|
4324
|
+
let lastAttemptAt = null;
|
|
4325
|
+
let lastBypassAt = null;
|
|
4326
|
+
let failures = 0;
|
|
4327
|
+
let inFlight = false;
|
|
4328
|
+
let timer = null;
|
|
4329
|
+
let stopped = false;
|
|
4330
|
+
const backoff = (n) => n <= 0 ? retryMs : Math.min(retryMs * 2 ** (n - 1), maxBackoffMs);
|
|
4331
|
+
function earliestRun(reason) {
|
|
4332
|
+
const windowEnd = lastSuccessAt === null ? 0 : lastSuccessAt + minIntervalMs;
|
|
4333
|
+
const retryAt = lastAttemptAt === null ? 0 : lastAttemptAt + backoff(failures);
|
|
4334
|
+
if (retryAt <= Math.max(windowEnd, now())) return { at: windowEnd, bypass: false };
|
|
4335
|
+
const mayBypass = (reason === "connect" || reason === "wake") && (lastBypassAt === null || now() - lastBypassAt >= minIntervalMs);
|
|
4336
|
+
return mayBypass ? { at: windowEnd, bypass: true } : { at: retryAt, bypass: false };
|
|
4337
|
+
}
|
|
4338
|
+
function defer(ms) {
|
|
4339
|
+
if (timer !== null) return;
|
|
4340
|
+
timer = setTimer(() => {
|
|
4341
|
+
timer = null;
|
|
4342
|
+
request("scheduled");
|
|
4343
|
+
}, Math.max(0, ms));
|
|
4344
|
+
}
|
|
4345
|
+
function run(reason) {
|
|
4346
|
+
inFlight = true;
|
|
4347
|
+
lastAttemptAt = now();
|
|
4348
|
+
log(`CLI update policy refresh (${reason})`, failures === 0 ? "warn" : "debug");
|
|
4349
|
+
void deps.refresh().catch(() => "unavailable").then((result) => {
|
|
4350
|
+
inFlight = false;
|
|
4351
|
+
if (result === "superseded") {
|
|
4352
|
+
stop();
|
|
4353
|
+
return;
|
|
4354
|
+
}
|
|
4355
|
+
if (result === "ok") {
|
|
4356
|
+
if (failures > 0) log(`CLI update policy refresh recovered after ${failures} failed attempt(s)`, "warn");
|
|
4357
|
+
lastSuccessAt = now();
|
|
4358
|
+
failures = 0;
|
|
4359
|
+
return;
|
|
4360
|
+
}
|
|
4361
|
+
if (result === "busy") lastAttemptAt = now();
|
|
4362
|
+
else {
|
|
4363
|
+
if (result === "stale") lastSuccessAt = now();
|
|
4364
|
+
failures += 1;
|
|
4365
|
+
const stepUp = failures === 1 || backoff(failures) > backoff(failures - 1);
|
|
4366
|
+
const next = result === "blocked" ? "waiting for the next connect / wake / hourly check" : `next try in ${Math.round(backoff(failures) / 1e3)}s`;
|
|
4367
|
+
log(`CLI update policy refresh (${reason}) read no fresh policy (${result}, ${failures} in a row); ${next}`, stepUp ? "warn" : "debug");
|
|
4368
|
+
}
|
|
4369
|
+
if (stopped || result === "blocked") return;
|
|
4370
|
+
defer(earliestRun("scheduled").at - now());
|
|
4371
|
+
});
|
|
4372
|
+
}
|
|
4373
|
+
function request(reason) {
|
|
4374
|
+
if (stopped) return "stopped";
|
|
4375
|
+
if (inFlight) return "in-flight";
|
|
4376
|
+
const { at, bypass } = earliestRun(reason);
|
|
4377
|
+
const wait = at - now();
|
|
4378
|
+
if (wait > 0) {
|
|
4379
|
+
defer(wait);
|
|
4380
|
+
return "deferred";
|
|
4381
|
+
}
|
|
4382
|
+
if (bypass) lastBypassAt = now();
|
|
4383
|
+
if (timer !== null) {
|
|
4384
|
+
clearTimer(timer);
|
|
4385
|
+
timer = null;
|
|
4386
|
+
}
|
|
4387
|
+
run(reason);
|
|
4388
|
+
return "run";
|
|
4389
|
+
}
|
|
4390
|
+
function stop() {
|
|
4391
|
+
stopped = true;
|
|
4392
|
+
if (timer !== null) clearTimer(timer);
|
|
4393
|
+
timer = null;
|
|
4394
|
+
}
|
|
4395
|
+
return {
|
|
4396
|
+
request,
|
|
4397
|
+
/** Any other refresh (startup, hourly, announcement) that read a policy restarts the window (and a fresh one ends the backoff); one that found us superseded stops it. */
|
|
4398
|
+
noteRefreshed(result) {
|
|
4399
|
+
if (result === "ok" || result === "stale") lastSuccessAt = now();
|
|
4400
|
+
if (result === "ok") failures = 0;
|
|
4401
|
+
else if (result === "superseded") stop();
|
|
4402
|
+
},
|
|
4403
|
+
stop
|
|
4404
|
+
};
|
|
4405
|
+
}
|
|
4406
|
+
function createWakeDetector(intervalMs, now = Date.now, slackMs = WAKE_GAP_SLACK_MS) {
|
|
4407
|
+
let last = null;
|
|
4408
|
+
return {
|
|
4409
|
+
/** Call once per heartbeat; true when the process was just suspended. */
|
|
4410
|
+
beat() {
|
|
4411
|
+
const at = now();
|
|
4412
|
+
const woke = last !== null && at - last > intervalMs + slackMs;
|
|
4413
|
+
last = at;
|
|
4414
|
+
return woke;
|
|
4415
|
+
}
|
|
4416
|
+
};
|
|
4417
|
+
}
|
|
4418
|
+
|
|
4419
|
+
function createDaemonOwnership(deps) {
|
|
4420
|
+
let superseded = false;
|
|
4421
|
+
return {
|
|
4422
|
+
owns() {
|
|
4423
|
+
if (superseded) return false;
|
|
4424
|
+
const ownerPid = deps.statePid();
|
|
4425
|
+
if (ownerPid === null || ownerPid === deps.pid) return true;
|
|
4426
|
+
superseded = true;
|
|
4427
|
+
deps.onSuperseded(ownerPid);
|
|
4428
|
+
return false;
|
|
4429
|
+
}
|
|
4430
|
+
};
|
|
4431
|
+
}
|
|
4432
|
+
|
|
4299
4433
|
const HARNESS_INSTALL_CATALOG = Object.freeze({
|
|
4300
4434
|
claude: Object.freeze({ packages: [{ name: "@anthropic-ai/claude-code", spec: "latest" }], commands: ["claude"], minNode: "22.0.0", scripts: true }),
|
|
4301
4435
|
codex: Object.freeze({ packages: [{ name: "@openai/codex", spec: "latest" }], commands: ["codex"], minNode: "16.0.0", scripts: false }),
|
|
@@ -7074,6 +7208,7 @@ function listIssueReceipts(home, now = Date.now()) {
|
|
|
7074
7208
|
|
|
7075
7209
|
const ISSUE_POLL_MS = 5e3;
|
|
7076
7210
|
const ISSUE_SPAWNED_BY = "issue";
|
|
7211
|
+
const ISSUE_SPAWN_UNKNOWN_GRACE_MS = 6e4;
|
|
7077
7212
|
const FIRST_MESSAGE_KEY_WAIT_MS = 1e4;
|
|
7078
7213
|
function issueKeyFromPrompt(prompt) {
|
|
7079
7214
|
return /^You are assigned issue ([A-Z]+-\d{1,9}):/.exec(prompt)?.[1] ?? null;
|
|
@@ -7125,10 +7260,35 @@ function createIssueWorker(deps) {
|
|
|
7125
7260
|
writeIssueReceipt(home, receipt);
|
|
7126
7261
|
return receipt;
|
|
7127
7262
|
};
|
|
7128
|
-
|
|
7129
|
-
|
|
7130
|
-
|
|
7131
|
-
|
|
7263
|
+
const now = deps.now ?? Date.now;
|
|
7264
|
+
const unknownSpawns = /* @__PURE__ */ new Map();
|
|
7265
|
+
async function fail(receipt, error) {
|
|
7266
|
+
await client.fail(receipt.dispatchId, { machineId: deps.machineId, claimId: receipt.claimId, error: error.slice(0, 4e3) });
|
|
7267
|
+
save({ ...receipt, phase: "failed" });
|
|
7268
|
+
deps.log(`Issue dispatch ${receipt.dispatchId} failed`);
|
|
7269
|
+
}
|
|
7270
|
+
function holdUnknown(view, receipt, reason) {
|
|
7271
|
+
const held = unknownSpawns.get(view.id);
|
|
7272
|
+
unknownSpawns.set(view.id, { view, receipt, reason, deadline: held?.deadline ?? now() + ISSUE_SPAWN_UNKNOWN_GRACE_MS });
|
|
7273
|
+
deps.log(`Issue dispatch ${view.id} spawn outcome unknown; re-checking`);
|
|
7274
|
+
}
|
|
7275
|
+
async function recheckUnknown() {
|
|
7276
|
+
for (const [id, held] of [...unknownSpawns]) {
|
|
7277
|
+
if (closed) return;
|
|
7278
|
+
const matches = persistedRunSessions(held.view.runId);
|
|
7279
|
+
try {
|
|
7280
|
+
if (matches.length === 1) {
|
|
7281
|
+
unknownSpawns.delete(id);
|
|
7282
|
+
await afterSpawn(held.view, save({ ...held.receipt, sessionId: matches[0], phase: "spawned" }));
|
|
7283
|
+
} else if (matches.length > 1 || now() >= held.deadline) {
|
|
7284
|
+
unknownSpawns.delete(id);
|
|
7285
|
+
await fail(held.receipt, matches.length > 1 ? `Spawn produced ${matches.length} sessions for this run; stop the extra ones and retry` : `Session did not start within ${Math.round(ISSUE_SPAWN_UNKNOWN_GRACE_MS / 1e3)} s (${held.reason}); check the machine before retrying`);
|
|
7286
|
+
}
|
|
7287
|
+
} catch (error) {
|
|
7288
|
+
if (httpCode(error) === "issue_dispatch_claim_mismatch" || error instanceof client$2.IssuesUnsupportedError) unknownSpawns.delete(id);
|
|
7289
|
+
deps.log(`Issue dispatch ${id} remains pending${error instanceof client$2.IssueRequestError && error.code ? ` (${error.code})` : ""}`);
|
|
7290
|
+
}
|
|
7291
|
+
}
|
|
7132
7292
|
}
|
|
7133
7293
|
async function complete(receipt) {
|
|
7134
7294
|
let lastError;
|
|
@@ -7187,7 +7347,7 @@ function createIssueWorker(deps) {
|
|
|
7187
7347
|
await fail({ ...receipt, phase: "claimed" }, accountUnavailableError(spawned.errorMessage, "issue") ?? spawned.errorMessage);
|
|
7188
7348
|
return;
|
|
7189
7349
|
}
|
|
7190
|
-
if (spawned.type === "error" && spawned.startupExit?.exited) {
|
|
7350
|
+
if (spawned.type === "error" && (spawned.startupExit?.exited || spawned.notStarted)) {
|
|
7191
7351
|
await fail(receipt, `Session failed to start: ${spawned.errorMessage}`);
|
|
7192
7352
|
return;
|
|
7193
7353
|
}
|
|
@@ -7198,25 +7358,36 @@ function createIssueWorker(deps) {
|
|
|
7198
7358
|
if (spawned.type !== "success") {
|
|
7199
7359
|
const matches = persistedRunSessions(view.runId);
|
|
7200
7360
|
if (matches.length !== 1) {
|
|
7201
|
-
|
|
7361
|
+
holdUnknown(view, receipt, spawned.errorMessage);
|
|
7202
7362
|
return;
|
|
7203
7363
|
}
|
|
7204
7364
|
receipt = save({ ...receipt, sessionId: matches[0], phase: "spawned" });
|
|
7205
7365
|
} else {
|
|
7206
7366
|
receipt = save({ ...receipt, sessionId: spawned.sessionId, phase: "spawned" });
|
|
7207
7367
|
}
|
|
7208
|
-
|
|
7209
|
-
if (spawn.projectId && deps.joinProject) await deps.joinProject(receipt.sessionId, spawn.projectId).catch(() => void 0);
|
|
7210
|
-
}
|
|
7211
|
-
if (receipt.phase === "spawning") {
|
|
7368
|
+
} else if (receipt.phase === "spawning") {
|
|
7212
7369
|
const matches = persistedRunSessions(view.runId);
|
|
7213
7370
|
if (matches.length !== 1) {
|
|
7214
|
-
|
|
7371
|
+
holdUnknown(view, receipt, "the spawn was interrupted by a daemon restart");
|
|
7215
7372
|
return;
|
|
7216
7373
|
}
|
|
7217
7374
|
receipt = save({ ...receipt, sessionId: matches[0], phase: "spawned" });
|
|
7218
|
-
|
|
7375
|
+
} else {
|
|
7376
|
+
if (receipt.sessionId && !receipt.ended) runBySession.set(receipt.sessionId, view.runId);
|
|
7377
|
+
await deliverAndComplete(view, receipt);
|
|
7378
|
+
return;
|
|
7219
7379
|
}
|
|
7380
|
+
await afterSpawn(view, receipt);
|
|
7381
|
+
}
|
|
7382
|
+
async function afterSpawn(view, receipt) {
|
|
7383
|
+
runBySession.set(receipt.sessionId, view.runId);
|
|
7384
|
+
const projectId = view.spawn?.projectId;
|
|
7385
|
+
if (projectId && deps.joinProject) await deps.joinProject(receipt.sessionId, projectId).catch(() => void 0);
|
|
7386
|
+
await deliverAndComplete(view, receipt);
|
|
7387
|
+
}
|
|
7388
|
+
async function deliverAndComplete(view, receipt) {
|
|
7389
|
+
const spawn = view.spawn;
|
|
7390
|
+
const agent = spawn.agent;
|
|
7220
7391
|
if (receipt.phase === "spawned") {
|
|
7221
7392
|
const sessionId = receipt.sessionId;
|
|
7222
7393
|
const mode = spawnAgents.sanitizeSpawnPermissionMode(spawn.permissionMode ?? void 0);
|
|
@@ -7307,6 +7478,7 @@ function createIssueWorker(deps) {
|
|
|
7307
7478
|
if (running || closed || Date.now() < retryAt) return;
|
|
7308
7479
|
running = true;
|
|
7309
7480
|
try {
|
|
7481
|
+
await recheckUnknown();
|
|
7310
7482
|
let dispatches;
|
|
7311
7483
|
try {
|
|
7312
7484
|
dispatches = (await client.poll(deps.machineId)).dispatches ?? [];
|
|
@@ -7788,7 +7960,8 @@ async function startDaemon() {
|
|
|
7788
7960
|
logger.logger.debug(`[DAEMON RUN] Directory creation failed: ${errorMessage}`);
|
|
7789
7961
|
return {
|
|
7790
7962
|
type: "error",
|
|
7791
|
-
errorMessage
|
|
7963
|
+
errorMessage,
|
|
7964
|
+
notStarted: true
|
|
7792
7965
|
};
|
|
7793
7966
|
}
|
|
7794
7967
|
}
|
|
@@ -7847,11 +8020,11 @@ async function startDaemon() {
|
|
|
7847
8020
|
const requested = forkSpawnAccount(options.agentProfileId, options.parentSessionId, (id) => accountServiceRef.sessionAccount(id));
|
|
7848
8021
|
spawnAccountId = accountServiceRef.resolveSpawnAccount(accountAgent, requested);
|
|
7849
8022
|
} catch (error) {
|
|
7850
|
-
return { type: "error", errorMessage: error instanceof Error ? error.message : String(error) };
|
|
8023
|
+
return { type: "error", errorMessage: error instanceof Error ? error.message : String(error), notStarted: true };
|
|
7851
8024
|
}
|
|
7852
8025
|
if (spawnAccountId) extraEnv[store.SPAWN_ACCOUNT_ENV] = spawnAccountId;
|
|
7853
8026
|
} else if (options.agentProfileId) {
|
|
7854
|
-
return { type: "error", errorMessage: `agent-profile-unavailable:agent-mismatch: accounts are not supported for ${options.agent} yet
|
|
8027
|
+
return { type: "error", errorMessage: `agent-profile-unavailable:agent-mismatch: accounts are not supported for ${options.agent} yet`, notStarted: true };
|
|
7855
8028
|
}
|
|
7856
8029
|
const claudeAuthStatus = claudeAuthServiceRef?.current()?.status;
|
|
7857
8030
|
if ((options.agent ?? "claude") === "claude" && claudeAuthStatus && !spawnAccountId) {
|
|
@@ -7878,7 +8051,8 @@ async function startDaemon() {
|
|
|
7878
8051
|
logger.logger.warn(`[DAEMON RUN] ${errorMessage}`);
|
|
7879
8052
|
return {
|
|
7880
8053
|
type: "error",
|
|
7881
|
-
errorMessage
|
|
8054
|
+
errorMessage,
|
|
8055
|
+
notStarted: true
|
|
7882
8056
|
};
|
|
7883
8057
|
}
|
|
7884
8058
|
let tmuxSessionName = extraEnv.TMUX_SESSION_NAME;
|
|
@@ -7899,7 +8073,8 @@ async function startDaemon() {
|
|
|
7899
8073
|
if (!spawnAgents.isSpawnAgent(agent)) {
|
|
7900
8074
|
return {
|
|
7901
8075
|
type: "error",
|
|
7902
|
-
errorMessage: `Unsupported agent type: '${options.agent}'. Please update your CLI to the latest version
|
|
8076
|
+
errorMessage: `Unsupported agent type: '${options.agent}'. Please update your CLI to the latest version.`,
|
|
8077
|
+
notStarted: true
|
|
7903
8078
|
};
|
|
7904
8079
|
}
|
|
7905
8080
|
const resumeId = agent === "claude" ? options.resumeClaudeSessionId : agent === "codex" ? options.resumeCodexThreadId : void 0;
|
|
@@ -7985,7 +8160,8 @@ async function startDaemon() {
|
|
|
7985
8160
|
default:
|
|
7986
8161
|
return {
|
|
7987
8162
|
type: "error",
|
|
7988
|
-
errorMessage: `Unsupported agent type: '${options.agent}'. Please update your CLI to the latest version
|
|
8163
|
+
errorMessage: `Unsupported agent type: '${options.agent}'. Please update your CLI to the latest version.`,
|
|
8164
|
+
notStarted: true
|
|
7989
8165
|
};
|
|
7990
8166
|
}
|
|
7991
8167
|
const args = [
|
|
@@ -8055,7 +8231,8 @@ async function startDaemon() {
|
|
|
8055
8231
|
logger.logger.debug("[DAEMON RUN] Failed to spawn process - no PID returned");
|
|
8056
8232
|
return Promise.resolve({
|
|
8057
8233
|
type: "error",
|
|
8058
|
-
errorMessage: "Failed to spawn Happy process - no PID returned"
|
|
8234
|
+
errorMessage: "Failed to spawn Happy process - no PID returned",
|
|
8235
|
+
notStarted: true
|
|
8059
8236
|
});
|
|
8060
8237
|
}
|
|
8061
8238
|
timer?.mark("spawned");
|
|
@@ -8281,7 +8458,9 @@ async function startDaemon() {
|
|
|
8281
8458
|
HAPPY_RECONNECT_SEQ: String(tracked.encryption.seq),
|
|
8282
8459
|
HAPPY_RECONNECT_METADATA_VERSION: String(tracked.encryption.metadataVersion),
|
|
8283
8460
|
HAPPY_RECONNECT_AGENT_STATE_VERSION: String(tracked.encryption.agentStateVersion),
|
|
8284
|
-
...teamEnv
|
|
8461
|
+
...teamEnv,
|
|
8462
|
+
// B-874c: an issue run's binding rides every relaunch (digest, MCP context).
|
|
8463
|
+
...sessionMetadata.issueRelaunchEnv(metadata)
|
|
8285
8464
|
}
|
|
8286
8465
|
});
|
|
8287
8466
|
if (result.type === "success") {
|
|
@@ -8423,6 +8602,8 @@ async function startDaemon() {
|
|
|
8423
8602
|
HAPPY_RECONNECT_METADATA_VERSION: String(tracked.encryption.metadataVersion),
|
|
8424
8603
|
HAPPY_RECONNECT_AGENT_STATE_VERSION: String(tracked.encryption.agentStateVersion),
|
|
8425
8604
|
...teamEnv,
|
|
8605
|
+
// B-874c: see resumeSessionImpl.
|
|
8606
|
+
...sessionMetadata.issueRelaunchEnv(metadata),
|
|
8426
8607
|
...options?.auto ? { [sessionLock.AUTO_RESTARTED_ENV]: sessionLock.encodeAutoRestarted(options.auto.kind, options.auto.target) } : {}
|
|
8427
8608
|
}
|
|
8428
8609
|
});
|
|
@@ -8871,6 +9052,14 @@ async function startDaemon() {
|
|
|
8871
9052
|
host: initialMachineMetadata.host
|
|
8872
9053
|
})).then(() => logger.logger.debug(`[DAEMON RUN] claimed the machine record for host ${initialMachineMetadata.host}`)).catch((error) => logger.logger.debug("[DAEMON RUN] could not refresh the recorded host:", error));
|
|
8873
9054
|
}
|
|
9055
|
+
const daemonOwnership = createDaemonOwnership({
|
|
9056
|
+
pid: process.pid,
|
|
9057
|
+
statePid: persistence.readDaemonStatePidSync,
|
|
9058
|
+
onSuperseded: (ownerPid) => {
|
|
9059
|
+
logger.logger.debug(`[DAEMON RUN] Somehow a different daemon (pid ${ownerPid}) was started without killing us. We should kill ourselves.`);
|
|
9060
|
+
requestShutdown("exception", "A different daemon was started without killing us. We should kill ourselves.");
|
|
9061
|
+
}
|
|
9062
|
+
});
|
|
8874
9063
|
let lastUpdateLog = "";
|
|
8875
9064
|
let harnessInstaller = null;
|
|
8876
9065
|
let handoverInFlight = false;
|
|
@@ -8893,7 +9082,9 @@ async function startDaemon() {
|
|
|
8893
9082
|
installFenced: () => !!harnessInstaller?.isRunning(),
|
|
8894
9083
|
busyGraceMs: resolveBusyInstallGrace(process.env.HAPPY_CLI_UPDATE_BUSY_GRACE_MS),
|
|
8895
9084
|
lastInstall: lastInstallStore(configuration.configuration.happyHomeDir),
|
|
9085
|
+
owned: daemonOwnership.owns,
|
|
8896
9086
|
publish: (state) => {
|
|
9087
|
+
if (!daemonOwnership.owns()) return;
|
|
8897
9088
|
cliUpdateStateRef = state;
|
|
8898
9089
|
fileState = { ...fileState, cliUpdate: state };
|
|
8899
9090
|
persistence.writeDaemonState(fileState);
|
|
@@ -8930,10 +9121,17 @@ async function startDaemon() {
|
|
|
8930
9121
|
relayMoveInFlight = null;
|
|
8931
9122
|
});
|
|
8932
9123
|
});
|
|
8933
|
-
const
|
|
9124
|
+
const policyRefresh = createPolicyRefreshTrigger({
|
|
9125
|
+
refresh: () => updateController.refresh(),
|
|
9126
|
+
log: (message, level) => level === "warn" ? logger.logger.warn(`[DAEMON RUN] ${message}`) : logger.logger.debug(`[DAEMON RUN] ${message}`)
|
|
9127
|
+
});
|
|
9128
|
+
const refreshCliUpdate = () => updateController.refresh().then(policyRefresh.noteRefreshed).catch((error) => {
|
|
8934
9129
|
logger.logger.debug("[DAEMON RUN] CLI update policy check failed:", error);
|
|
8935
9130
|
});
|
|
8936
|
-
|
|
9131
|
+
apiMachine.setControlConnectedHandler(() => {
|
|
9132
|
+
policyRefresh.request("connect");
|
|
9133
|
+
});
|
|
9134
|
+
policyRefresh.request("startup");
|
|
8937
9135
|
const cliUpdateIntervalMs = cliUpdate.resolveCliUpdateCheckInterval(process.env.HAPPY_CLI_UPDATE_CHECK_INTERVAL);
|
|
8938
9136
|
if (process.env.HAPPY_CLI_UPDATE_CHECK_INTERVAL && cliUpdateIntervalMs === cliUpdate.DEFAULT_CLI_UPDATE_CHECK_INTERVAL_MS && process.env.HAPPY_CLI_UPDATE_CHECK_INTERVAL.trim() !== String(cliUpdate.DEFAULT_CLI_UPDATE_CHECK_INTERVAL_MS)) {
|
|
8939
9137
|
logger.logger.warn(`[DAEMON RUN] Ignoring invalid HAPPY_CLI_UPDATE_CHECK_INTERVAL; using ${cliUpdate.DEFAULT_CLI_UPDATE_CHECK_INTERVAL_MS}ms`);
|
|
@@ -8970,6 +9168,7 @@ async function startDaemon() {
|
|
|
8970
9168
|
});
|
|
8971
9169
|
apiMachine.setHarnessInstallHandler((params) => harnessInstaller.request(params));
|
|
8972
9170
|
const heartbeatIntervalMs = parseInt(process.env.HAPPY_DAEMON_HEARTBEAT_INTERVAL || "60000");
|
|
9171
|
+
const wakeDetector = createWakeDetector(heartbeatIntervalMs);
|
|
8973
9172
|
const restartOnStaleVersionAndHeartbeat = setInterval(serialTask(async () => {
|
|
8974
9173
|
try {
|
|
8975
9174
|
if (process.env.DEBUG) {
|
|
@@ -8981,6 +9180,7 @@ async function startDaemon() {
|
|
|
8981
9180
|
onChildExited(pid);
|
|
8982
9181
|
}
|
|
8983
9182
|
}
|
|
9183
|
+
if (!daemonOwnership.owns()) return;
|
|
8984
9184
|
await updateController.tick();
|
|
8985
9185
|
await updateController.withHandover(async () => {
|
|
8986
9186
|
handoverInFlight = true;
|
|
@@ -9017,6 +9217,7 @@ async function startDaemon() {
|
|
|
9017
9217
|
clearInterval(restartOnStaleVersionAndHeartbeat);
|
|
9018
9218
|
clearInterval(cliUpdateInterval);
|
|
9019
9219
|
policyAnnouncements.stop();
|
|
9220
|
+
policyRefresh.stop();
|
|
9020
9221
|
stopAgentVersionChecks();
|
|
9021
9222
|
claudeAuthService.stop();
|
|
9022
9223
|
stopAccountWatch();
|
|
@@ -9044,12 +9245,9 @@ async function startDaemon() {
|
|
|
9044
9245
|
handoverInFlight = false;
|
|
9045
9246
|
}
|
|
9046
9247
|
});
|
|
9047
|
-
|
|
9048
|
-
|
|
9049
|
-
|
|
9050
|
-
requestShutdown("exception", "A different daemon was started without killing us. We should kill ourselves.");
|
|
9051
|
-
return;
|
|
9052
|
-
}
|
|
9248
|
+
if (!daemonOwnership.owns()) return;
|
|
9249
|
+
const woke = wakeDetector.beat();
|
|
9250
|
+
if (woke || updateController.policyStale()) policyRefresh.request(woke ? "wake" : "stale");
|
|
9053
9251
|
try {
|
|
9054
9252
|
fileState = withDaemonHeartbeat(fileState, (/* @__PURE__ */ new Date()).toLocaleString());
|
|
9055
9253
|
persistence.writeDaemonState(fileState);
|
|
@@ -9161,6 +9359,7 @@ async function startDaemon() {
|
|
|
9161
9359
|
clearInterval(cliUpdateInterval);
|
|
9162
9360
|
clearInterval(autoRestartSweep);
|
|
9163
9361
|
policyAnnouncements.stop();
|
|
9362
|
+
policyRefresh.stop();
|
|
9164
9363
|
stopAgentVersionChecks();
|
|
9165
9364
|
await apiMachine.updateDaemonState((state) => ({
|
|
9166
9365
|
...state,
|