very-happy-cli 0.2.199 → 0.2.201
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-Bo6bOamG.mjs → AcpBackend-BNinFMHZ.mjs} +3 -3
- package/dist/{AcpBackend-HhZ8nrIh.cjs → AcpBackend-CMFlng3C.cjs} +3 -3
- package/dist/{AcpSessionManager--7nDgA9S.cjs → AcpSessionManager-CPgoICjp.cjs} +2 -2
- package/dist/{AcpSessionManager-C-pkJKO2.mjs → AcpSessionManager-Dg6gKavf.mjs} +2 -2
- package/dist/{BasePermissionHandler-Ffp54Ntg.mjs → BasePermissionHandler-DwcfWUjr.mjs} +1 -1
- package/dist/{BasePermissionHandler-al7UXWRq.cjs → BasePermissionHandler-c-NaRa_E.cjs} +1 -1
- package/dist/{account-DCIz-iyL.cjs → account-D23SGj7p.cjs} +11 -11
- package/dist/{account-Bnk1yyGS.mjs → account-pzgzyIXW.mjs} +11 -11
- package/dist/{accountService-B59oKwa4.cjs → accountService-Cns8UYGI.cjs} +4 -4
- package/dist/{accountService-WPnOpkvs.mjs → accountService-DEpIq6CF.mjs} +4 -4
- package/dist/{acpSessionResume-CfogEHtT.cjs → acpSessionResume-DklOhwir.cjs} +1 -1
- package/dist/{acpSessionResume-BVroOlVN.mjs → acpSessionResume-urFpnGsk.mjs} +1 -1
- package/dist/{agentHome-Y3bMEtCp.cjs → agentHome-BTwMaYw1.cjs} +4 -4
- package/dist/{agentHome-CHTzSiu4.mjs → agentHome-DyrLqr8b.mjs} +4 -4
- package/dist/{api-DibgCucH.mjs → api-1CD4oRSW.mjs} +16 -10
- package/dist/{api-CgzfmyYS.cjs → api-KVVs-GkM.cjs} +16 -10
- package/dist/{apiMachine-DSI5mKlh.cjs → apiMachine-1sd5IVIB.cjs} +18 -18
- package/dist/{apiMachine-BUaFSi27.mjs → apiMachine-BDVE6MOn.mjs} +18 -18
- package/dist/{attachmentContent-D9wq3bok.mjs → attachmentContent-CeF54XeO.mjs} +2 -2
- package/dist/{attachmentContent-JWUS5uhH.cjs → attachmentContent-f3BbOKqz.cjs} +2 -2
- package/dist/{auth-DFMJQDNF.mjs → auth-CV2H-smf.mjs} +8 -8
- package/dist/{auth-B6H2wHTy.cjs → auth-CXCX-iJ-.cjs} +5 -5
- package/dist/{auth-BjWk9sHU.mjs → auth-WCd2S1zA.mjs} +5 -5
- package/dist/{auth-BXav16o0.cjs → auth-eielZ6Sc.cjs} +8 -8
- package/dist/{auto-CMO-VQYN.cjs → auto-49cRCADN.cjs} +17 -17
- package/dist/{auto-DOhQ2OU5.mjs → auto-BsCE_UHT.mjs} +17 -17
- package/dist/{bootstrap-CY7Db_VV.mjs → bootstrap-D_1MskAl.mjs} +2 -2
- package/dist/{bootstrap-Brd_jnA2.cjs → bootstrap-N1PY4ypX.cjs} +2 -2
- package/dist/{browser-BhncBLE4.cjs → browser-B0SEB6r3.cjs} +1 -1
- package/dist/{browser-BpwBEJDU.mjs → browser-DL3QIQLS.mjs} +1 -1
- package/dist/{claudeAccountEnv-z_ecsJAP.cjs → claudeAccountEnv-Btp39mfa.cjs} +1 -1
- package/dist/{claudeAccountEnv-CYwfvK1u.mjs → claudeAccountEnv-DowsOlDB.mjs} +1 -1
- package/dist/{claudeLocal-coKrsYmR.mjs → claudeLocal-DRMWkdCC.mjs} +5 -5
- package/dist/{claudeLocal-Co_DyW-D.cjs → claudeLocal-Ix69XJ1t.cjs} +5 -5
- package/dist/{claudeLocalLauncher-BFnLc0R-.mjs → claudeLocalLauncher-D4tU6R5n.mjs} +10 -10
- package/dist/{claudeLocalLauncher-CNDrO3b6.cjs → claudeLocalLauncher-rDojqNoa.cjs} +10 -10
- package/dist/{claudeSessionFork-BuDN5SkN.cjs → claudeSessionFork-C_X08LFh.cjs} +1 -1
- package/dist/{claudeSessionFork-dOOc9hpA.mjs → claudeSessionFork-H0ZVQALg.mjs} +1 -1
- package/dist/{client-B5uvkdLn.mjs → client-4YWjreN3.mjs} +2 -2
- package/dist/{client-DKPLBLvx.mjs → client-BgInTvr6.mjs} +2 -2
- package/dist/{client-KbhVRYjy.cjs → client-BoymtYLP.cjs} +2 -2
- package/dist/{client-Ng-oAhlX.mjs → client-CK-jvgM1.mjs} +4 -4
- package/dist/client-CMUlpYcy.mjs +114 -0
- package/dist/{client-CBbUzTcm.cjs → client-DGqnrSg4.cjs} +4 -4
- package/dist/client-DI8Rxsbw.cjs +120 -0
- package/dist/{client-BKyTA9Hf.cjs → client-P1VkI76z.cjs} +2 -2
- package/dist/codex/happyMcpStdioBridge.cjs +25 -16
- package/dist/codex/happyMcpStdioBridge.mjs +25 -16
- package/dist/{codexAccount-DeFAjaHW.mjs → codexAccount-CieIQLOX.mjs} +1 -1
- package/dist/{codexAccount-8Wv5enLR.cjs → codexAccount-D-OBY29W.cjs} +1 -1
- package/dist/{codexAppServerClient-6QmZ2Tn5.cjs → codexAppServerClient-BnMR-DRn.cjs} +3 -3
- package/dist/{codexAppServerClient-BAcU_XN8.mjs → codexAppServerClient-aDrsSyjS.mjs} +3 -3
- package/dist/{codexCommand-CCeaWZ-1.mjs → codexCommand-BCpJzf3q.mjs} +51 -46
- package/dist/{codexCommand-hJYa82Af.cjs → codexCommand-C3oEEpOa.cjs} +51 -46
- package/dist/{codexTermination-BX0sCNFy.mjs → codexTermination-B5haG5wJ.mjs} +1 -1
- package/dist/{codexTermination-DKjQcC3e.cjs → codexTermination-DXhw5Pzi.cjs} +1 -1
- package/dist/{config-171VOPLq.cjs → config-CdGiZZKy.cjs} +3 -3
- package/dist/{config-9iXYh_zS.mjs → config-D9wjo4oa.mjs} +3 -3
- package/dist/{configuration-D9k5yIzV.mjs → configuration-DhEqAYzz.mjs} +1 -1
- package/dist/{configuration-CAzuk0Xs.cjs → configuration-LWFmTxty.cjs} +1 -1
- package/dist/{connect-MlXU2FE3.cjs → connect-BZLD0aVm.cjs} +13 -13
- package/dist/{connect-BEhKtsEn.mjs → connect-CY_EMXQs.mjs} +13 -13
- package/dist/{context-CI9LnDu1.cjs → context-BbZ18lX0.cjs} +1 -1
- package/dist/{context-WVEuAdf2.mjs → context-UzqWaA7f.mjs} +1 -1
- package/dist/{controlClient-DhFAPGHz.mjs → controlClient-PaIiDxM6.mjs} +3 -3
- package/dist/{controlClient-Bb188cU0.cjs → controlClient-TVMpETsR.cjs} +3 -3
- package/dist/{createSessionMetadata-BIK0Xz31.mjs → createSessionMetadata-BWb81WZg.mjs} +3 -2
- package/dist/{createSessionMetadata-C2EQi_od.cjs → createSessionMetadata-hGZeo_nR.cjs} +3 -2
- package/dist/{daemonAccounts-DD5YBwku.mjs → daemonAccounts-D5shoCLt.mjs} +3 -3
- package/dist/{daemonAccounts-nLyHz8WB.cjs → daemonAccounts-ciidbU2h.cjs} +2 -2
- package/dist/{defaultPermissionMode-BA1fgIpW.cjs → defaultPermissionMode-Cs_Tv83b.cjs} +1 -1
- package/dist/{defaultPermissionMode-Dmw3lpdN.mjs → defaultPermissionMode-DgeiMMqy.mjs} +1 -1
- package/dist/{deterministicJson-DCzFgRiT.cjs → deterministicJson-BpDDS7c9.cjs} +121 -24
- package/dist/{deterministicJson-BJ7LY5-S.mjs → deterministicJson-Cg3z7uUX.mjs} +117 -20
- package/dist/{doctor-jAPeyoi6.mjs → doctor-BanQ3jQg.mjs} +7 -7
- package/dist/{doctor-CH_pTY3Q.cjs → doctor-DOzji0f7.cjs} +7 -7
- package/dist/{downloadTarget-BhMm1keb.mjs → downloadTarget-BCSXmPRE.mjs} +6 -6
- package/dist/{downloadTarget-CZS0BVu2.cjs → downloadTarget-BhIAhyEV.cjs} +6 -6
- package/dist/{ensureDaemonRunning-BjbC8PuJ.mjs → ensureDaemonRunning-BZGBE838.mjs} +5 -5
- package/dist/{ensureDaemonRunning-CTKaWMED.cjs → ensureDaemonRunning-DMOCzvQP.cjs} +5 -5
- package/dist/format-BxGkJUki.mjs +71 -0
- package/dist/format-CgiY6uup.cjs +75 -0
- package/dist/{handleResumeCommand-DbFTdwoc.mjs → handleResumeCommand-BRV-9h0o.mjs} +5 -5
- package/dist/{handleResumeCommand-DsaEUiax.cjs → handleResumeCommand-ChnR-12l.cjs} +5 -5
- package/dist/{index-BnT8yvlF.cjs → index-44o_qMvE.cjs} +72 -3
- package/dist/{index-DuoMPw0y.cjs → index-B7HlUXOX.cjs} +4 -4
- package/dist/{index-qVJYCmRA.cjs → index-BuOzDU17.cjs} +4 -4
- package/dist/{index-DcfbjaVL.mjs → index-C_Y9426m.mjs} +3 -3
- package/dist/{index-BQvPYTNM.mjs → index-CiRMvS73.mjs} +59 -4
- package/dist/{index-BEKb2cxz.mjs → index-D5abHQNL.mjs} +48 -43
- package/dist/{index-DL6ONx6v.cjs → index-DnEgpRo4.cjs} +3 -3
- package/dist/{index-DpQ9OLYi.mjs → index-Do1r62PF.mjs} +4 -4
- package/dist/{index-DdJRSpLB.cjs → index-DuOthh8V.cjs} +47 -42
- package/dist/{index-BAjoMeJi.mjs → index-HJFzeG0B.mjs} +4 -4
- package/dist/index.cjs +2 -2
- package/dist/index.mjs +2 -2
- package/dist/{install-CJcRTQVK.mjs → install-BurTXawL.mjs} +3 -3
- package/dist/{install-5nblS8vW.cjs → install-CUAUG3u4.cjs} +3 -3
- package/dist/issue-DpMsnOFm.mjs +229 -0
- package/dist/issue-feEUrjV0.cjs +237 -0
- package/dist/lib.cjs +12 -12
- package/dist/lib.d.cts +7 -0
- package/dist/lib.d.mts +7 -0
- package/dist/lib.mjs +12 -12
- package/dist/{localHappyAgentAuth-Bsk_VyUN.cjs → localHappyAgentAuth-DxlQgaer.cjs} +1 -1
- package/dist/{localHappyAgentAuth-CD896cy4.mjs → localHappyAgentAuth-kg2RFvOy.mjs} +1 -1
- package/dist/{logger-n9NOzHhK.mjs → logger-CFrzcRHD.mjs} +17 -3
- package/dist/{logger-LsJ3Cl5o.cjs → logger-Hyhy2boA.cjs} +17 -2
- package/dist/{machineMetadata-CUU2NSYl.cjs → machineMetadata-BLymhM03.cjs} +3 -3
- package/dist/{machineMetadata-Bc7FwngX.mjs → machineMetadata-DiStbYik.mjs} +3 -3
- package/dist/{main-CEu9zJ4x.cjs → main-7G17Noc3.cjs} +58 -48
- package/dist/{main-CzItRviV.mjs → main-D1rk-68I.mjs} +58 -48
- package/dist/{mcp-yK3ynz_E.mjs → mcp-C0DMPeTt.mjs} +18 -18
- package/dist/{mcp-CPW1yQdX.cjs → mcp-DUeAS-D6.cjs} +18 -18
- package/dist/{mirrorProtocol-5bgkr1Or.cjs → mirrorProtocol-YUoEuIYO.cjs} +3 -3
- package/dist/{mirrorProtocol-CoXxepvL.mjs → mirrorProtocol-dRyartIG.mjs} +3 -3
- package/dist/{package-D7V1BX2I.cjs → package-06cGlmeD.cjs} +7 -7
- package/dist/{package-CCF6FHr2.mjs → package-DxE8PttX.mjs} +7 -7
- package/dist/{panels-CF5n641F.mjs → panels-BUqmsRE0.mjs} +5 -5
- package/dist/{panels-9DdVhaxc.cjs → panels-D0GHfIJC.cjs} +5 -5
- package/dist/{peerTools-gR_3dwdA.mjs → peerTools-BiFpxXdf.mjs} +5 -5
- package/dist/{peerTools-Dv6bgHkW.cjs → peerTools-CTCyRdg2.cjs} +5 -5
- package/dist/{persistence-B5U9rC15.mjs → persistence-CF7oV1oH.mjs} +2 -2
- package/dist/{persistence-Dl3sBrCF.cjs → persistence-_W9tE-bW.cjs} +2 -2
- package/dist/{piRunnerArgs-DOV74xAt.mjs → piRunnerArgs-Cfc-F-FJ.mjs} +1 -1
- package/dist/{piRunnerArgs-rygeUdRz.cjs → piRunnerArgs-T2cAiaGW.cjs} +1 -1
- package/dist/{piRuntime-BvxCy9qQ.cjs → piRuntime-BzECTca4.cjs} +1 -1
- package/dist/{piRuntime-dtlRpOYa.mjs → piRuntime-CzYkZrYV.mjs} +1 -1
- package/dist/{piTerminal-Bx6c5Jyd.mjs → piTerminal-0tOAYsFm.mjs} +20 -20
- package/dist/{piTerminal-ClaMS-57.cjs → piTerminal-WF--dHaC.cjs} +20 -20
- package/dist/{pushNotifications-pHkbUkqT.mjs → pushNotifications-CxX10K6n.mjs} +3 -3
- package/dist/{pushNotifications-IZaTtVDG.cjs → pushNotifications-DdzTbrA3.cjs} +3 -3
- package/dist/{query-D_3rFFWe.mjs → query-Bkh7d52V.mjs} +1 -1
- package/dist/{query-BVqnfxlX.cjs → query-Cwx4pv91.cjs} +1 -1
- package/dist/{rateLimitWindows-DnLJ-gve.mjs → rateLimitWindows-DdUMUEoy.mjs} +1 -1
- package/dist/{rateLimitWindows-C7xi99Eb.cjs → rateLimitWindows-DjJjgjt4.cjs} +1 -1
- package/dist/{reconnectGate-CHI12y0Y.cjs → reconnectGate-DeDhtQJW.cjs} +1 -1
- package/dist/{reconnectGate-DPDXEkOX.mjs → reconnectGate-uTLj82tS.mjs} +1 -1
- package/dist/{registerCommonHandlers-BrTglZnC.mjs → registerCommonHandlers-BYrmi-A4.mjs} +2 -2
- package/dist/{registerCommonHandlers-CUCw-rad.cjs → registerCommonHandlers-BrEtSwNk.cjs} +2 -2
- package/dist/{registerKillSessionHandler-Bo697Mt0.cjs → registerKillSessionHandler-Bp3g11wW.cjs} +6 -6
- package/dist/{registerKillSessionHandler-BJSVT1iq.mjs → registerKillSessionHandler-Cuzq6ecP.mjs} +6 -6
- package/dist/{registerSideQuestionHandler-BFPCMrmC.mjs → registerSideQuestionHandler-BmEWWaZW.mjs} +4 -4
- package/dist/{registerSideQuestionHandler-HNpsU_20.cjs → registerSideQuestionHandler-ChIbHl_g.cjs} +4 -4
- package/dist/{remoteSessionClient-Blz-z9jM.mjs → remoteSessionClient-Dj2rV8Az.mjs} +5 -5
- package/dist/{remoteSessionClient-9NzkfL13.cjs → remoteSessionClient-DoxfnpnK.cjs} +5 -5
- package/dist/{reportProgressTool-CW9rSnwQ.cjs → reportProgressTool-DvZhaEiN.cjs} +113 -3
- package/dist/{reportProgressTool-B2-RFomn.mjs → reportProgressTool-qo0QIFNd.mjs} +111 -4
- package/dist/{run-9aB7U4BF.cjs → run-BqlWdDTL.cjs} +447 -50
- package/dist/{run-BXyfDvCk.mjs → run-mHeOSOEt.mjs} +447 -50
- package/dist/{runClaude-B4ohp5Dk.cjs → runClaude-MjIrNrxT.cjs} +28 -25
- package/dist/{runClaude-BKpWJdCX.mjs → runClaude-Z4BVFEdC.mjs} +28 -25
- package/dist/{runClaudeDeps-B0x5BCqC.mjs → runClaudeDeps-8RXtu0Zc.mjs} +49 -46
- package/dist/{runClaudeDeps-gqSYeQkl.cjs → runClaudeDeps-tPqwAl_m.cjs} +43 -40
- package/dist/{runGemini-BvV5k9b3.mjs → runGemini-DG3jIxWv.mjs} +36 -33
- package/dist/{runGemini-BMzDy7hY.cjs → runGemini-uc-fViXY.cjs} +36 -33
- package/dist/{runOpenClaw-UcIDMHm7.mjs → runOpenClaw-C4676Sdl.mjs} +18 -18
- package/dist/{runOpenClaw-3Cx3C2ww.cjs → runOpenClaw-DZtoCmSG.cjs} +18 -18
- package/dist/{sandbox-QJdxjmxr.cjs → sandbox-DS7uZ71y.cjs} +4 -4
- package/dist/{sandbox-BC-KbWe7.mjs → sandbox-r29ys6I4.mjs} +4 -4
- package/dist/selfCheck-BmT9ihpR.mjs +89 -0
- package/dist/{selfCheck-Be_M5coh.cjs → selfCheck-CSZ-wx1W.cjs} +40 -39
- package/dist/{send-x789D5ci.mjs → send-BGApHm-z.mjs} +8 -8
- package/dist/{send-DhWp8M8B.cjs → send-CrmLy9lW.cjs} +8 -8
- package/dist/{server-kPDtS-DX.cjs → server-CjwXsTKP.cjs} +6 -6
- package/dist/{server-D-aSnlWI.mjs → server-hutEAAn1.mjs} +4 -4
- package/dist/{sessionLock-JWBEd8g_.mjs → sessionLock-Dj9_lShU.mjs} +3 -3
- package/dist/{sessionLock-CuPN9xfW.cjs → sessionLock-unMOEniJ.cjs} +3 -3
- package/dist/sessionMetadata-B44cL4Xj.cjs +29 -0
- package/dist/sessionMetadata-C1eoAi89.mjs +25 -0
- package/dist/{sessionOps-VS1baPz_.mjs → sessionOps-BmhqmPPd.mjs} +4 -4
- package/dist/{sessionOps-CYNOycqT.cjs → sessionOps-SxZr9veq.cjs} +4 -4
- package/dist/{sessionProvider-iRLKuR9V.mjs → sessionProvider-CPlvR0nT.mjs} +10 -10
- package/dist/{sessionProvider-DksA6icp.cjs → sessionProvider-DLlqS4y6.cjs} +10 -10
- package/dist/{sessionScanner--X2Pzlra.cjs → sessionScanner-B7nZ1i40.cjs} +3 -3
- package/dist/{sessionScanner-CAxiFc_3.mjs → sessionScanner-DvVZpLHG.mjs} +3 -3
- package/dist/{sessions-Dca1UgiF.mjs → sessions-BIYm43CM.mjs} +10 -10
- package/dist/{sessions-BrnP53eO.cjs → sessions-CQQW7u6X.cjs} +10 -10
- package/dist/{setupOfflineReconnection-nguxOn4s.mjs → setupOfflineReconnection-BELrtMGG.mjs} +2 -2
- package/dist/{setupOfflineReconnection-Dwg6nHnP.cjs → setupOfflineReconnection-D7WJTAi_.cjs} +2 -2
- package/dist/{spawn-DDyMxQ7Z.cjs → spawn-CuWcPkkN.cjs} +14 -14
- package/dist/{spawn-BJMU9zbZ.mjs → spawn-DnPu7h2o.mjs} +14 -14
- package/dist/{spawnAgents-SeUX5gIq.mjs → spawnAgents-BclZYkov.mjs} +1 -1
- package/dist/{spawnAgents-B8GT4JQX.cjs → spawnAgents-DvbEDCIq.cjs} +1 -1
- package/dist/{spawnHappyCLI-Cvk2ZMYj.cjs → spawnHappyCLI-CI7Ax4mF.cjs} +1 -1
- package/dist/{spawnHappyCLI-DnT_QEdn.mjs → spawnHappyCLI-D6OcgFDR.mjs} +1 -1
- package/dist/{startFileWatcher-Djf0SdmK.mjs → startFileWatcher-BiWGhlGW.mjs} +1 -1
- package/dist/{startFileWatcher-DLfkP-IW.cjs → startFileWatcher-DBW14aP2.cjs} +1 -1
- package/dist/{startupSessionCreate-CxwJb5m9.cjs → startupSessionCreate-DFl54ozj.cjs} +3 -3
- package/dist/{startupSessionCreate-f1g6pp6E.mjs → startupSessionCreate-DbBpGQo9.mjs} +3 -3
- package/dist/{store-D41VdZcL.cjs → store-Cpb1LMNW.cjs} +1 -1
- package/dist/{store-DnaIrYLA.mjs → store-DWmjM4Ex.mjs} +1 -1
- package/dist/{streamRelay-BT9ew0Mk.cjs → streamRelay-4XiiNB3N.cjs} +1 -1
- package/dist/{streamRelay-DEBIU6Ak.mjs → streamRelay-DdGOsW8v.mjs} +1 -1
- package/dist/{sync-B-B5mc8Z.cjs → sync-C764ZzE6.cjs} +1 -1
- package/dist/{sync-Dfr1zgLx.mjs → sync-CcBrziWp.mjs} +1 -1
- package/dist/{systemPrompt-DAQq-bKB.mjs → systemPrompt-9i7bQypR.mjs} +2 -2
- package/dist/{systemPrompt-pxNDR5u8.cjs → systemPrompt-Xy3Dfj1l.cjs} +2 -2
- package/dist/{teams-BuXDbvzq.mjs → teams-BAWOVbdF.mjs} +7 -7
- package/dist/{teams-CBMB5SvT.cjs → teams-VlmzLDSs.cjs} +7 -7
- package/dist/{template-CB4gXtUX.cjs → template-3fV9bi0X.cjs} +1 -1
- package/dist/{template-DE9JMShn.mjs → template-CtRLg2PG.mjs} +1 -1
- package/dist/{time-DTaj0RVK.cjs → time-CDBZWYDb.cjs} +1 -1
- package/dist/{time-PqfO1O58.mjs → time-DJF2csbV.mjs} +1 -1
- package/dist/{titleGenerator-BP5gqicG.cjs → titleGenerator-BYP3fNFo.cjs} +3 -3
- package/dist/{titleGenerator-DVnEGxoB.mjs → titleGenerator-DR9evHBh.mjs} +2 -2
- package/dist/todo-BkFvwx_z.cjs +210 -0
- package/dist/{todo-DaJPxDVT.mjs → todo-DDDQdB-G.mjs} +103 -12
- package/dist/{tools-G3_fMSjb.cjs → tools-BjiRW_Rg.cjs} +1 -1
- package/dist/{tools-B4W8kWU8.mjs → tools-CDktvjWL.mjs} +1 -1
- package/dist/{uninstall-ByWgUWHg.mjs → uninstall-BcMGkwJ0.mjs} +3 -3
- package/dist/{uninstall-C0pua8G4.cjs → uninstall-D5INt3TC.cjs} +3 -3
- package/dist/{wrapperAccount-CsxMfnCK.cjs → wrapperAccount-nGGMJDBF.cjs} +2 -2
- package/dist/{wrapperAccount-BDeMsgbw.mjs → wrapperAccount-z8Swrd08.mjs} +2 -2
- package/package.json +7 -7
- package/dist/selfCheck-NWjxjpSx.mjs +0 -88
- package/dist/todo-BXsQ5-iD.cjs +0 -119
|
@@ -1,28 +1,29 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var mirrorProtocol = require('./mirrorProtocol-
|
|
3
|
+
var mirrorProtocol = require('./mirrorProtocol-YUoEuIYO.cjs');
|
|
4
4
|
var fsMkdir = require('./fsMkdir-0K3yENml.cjs');
|
|
5
|
-
var piRunnerArgs = require('./piRunnerArgs-
|
|
5
|
+
var piRunnerArgs = require('./piRunnerArgs-T2cAiaGW.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-LWFmTxty.cjs');
|
|
14
|
+
var api = require('./api-KVVs-GkM.cjs');
|
|
15
|
+
var spawnAgents = require('./spawnAgents-DvbEDCIq.cjs');
|
|
16
|
+
var logger = require('./logger-Hyhy2boA.cjs');
|
|
17
|
+
var index$2 = require('./index-DnEgpRo4.cjs');
|
|
18
|
+
var auth = require('./auth-CXCX-iJ-.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-06cGlmeD.cjs');
|
|
21
|
+
var doctor = require('./doctor-DOzji0f7.cjs');
|
|
22
|
+
var spawnHappyCLI = require('./spawnHappyCLI-CI7Ax4mF.cjs');
|
|
23
|
+
var persistence = require('./persistence-_W9tE-bW.cjs');
|
|
24
|
+
var controlClient = require('./controlClient-TVMpETsR.cjs');
|
|
25
|
+
var sessionOps = require('./sessionOps-SxZr9veq.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,68 +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-DjJjgjt4.cjs');
|
|
35
|
+
var peerTools = require('./peerTools-CTCyRdg2.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-DoxfnpnK.cjs');
|
|
38
|
+
var bootstrap = require('./bootstrap-N1PY4ypX.cjs');
|
|
39
|
+
var index$1 = require('./index-BuOzDU17.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-BLymhM03.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-ChnR-12l.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-BoymtYLP.cjs');
|
|
56
|
+
var sessionLock = require('./sessionLock-unMOEniJ.cjs');
|
|
57
|
+
var client$1 = require('./client-P1VkI76z.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-DBW14aP2.cjs');
|
|
64
|
+
var sync = require('./sync-C764ZzE6.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 template = require('./template-3fV9bi0X.cjs');
|
|
72
|
+
var client$2 = require('./client-DI8Rxsbw.cjs');
|
|
71
73
|
var loginShellEnv = require('./loginShellEnv-BkuYtExZ.cjs');
|
|
72
|
-
var store = require('./store-
|
|
73
|
-
require('./acpSessionResume-
|
|
74
|
-
require('./pushNotifications-
|
|
74
|
+
var store = require('./store-Cpb1LMNW.cjs');
|
|
75
|
+
require('./acpSessionResume-DklOhwir.cjs');
|
|
76
|
+
require('./pushNotifications-DdzTbrA3.cjs');
|
|
75
77
|
require('./contentLogMetadata-ZSFk_NjQ.cjs');
|
|
76
|
-
require('./reconnectGate-
|
|
78
|
+
require('./reconnectGate-DeDhtQJW.cjs');
|
|
77
79
|
require('node:events');
|
|
78
80
|
require('socket.io-client');
|
|
79
81
|
require('./limits-C-a7gr04.cjs');
|
|
80
|
-
require('./time-
|
|
81
|
-
require('./registerCommonHandlers-
|
|
82
|
+
require('./time-CDBZWYDb.cjs');
|
|
83
|
+
require('./registerCommonHandlers-BrEtSwNk.cjs');
|
|
82
84
|
require('util');
|
|
83
85
|
require('cross-spawn');
|
|
84
86
|
require('@paralleldrive/cuid2');
|
|
85
87
|
require('chalk');
|
|
86
88
|
require('node:module');
|
|
87
89
|
require('tweetnacl');
|
|
88
|
-
require('./browser-
|
|
90
|
+
require('./browser-B0SEB6r3.cjs');
|
|
89
91
|
require('open');
|
|
90
92
|
require('./specialCommands-J3JFOq0J.cjs');
|
|
91
93
|
require('./ids-B6ZC0HGt.cjs');
|
|
92
94
|
require('url');
|
|
93
|
-
require('./localHappyAgentAuth-
|
|
94
|
-
require('./claudeAccountEnv-
|
|
95
|
+
require('./localHappyAgentAuth-DxlQgaer.cjs');
|
|
96
|
+
require('./claudeAccountEnv-Btp39mfa.cjs');
|
|
95
97
|
require('node:readline');
|
|
96
98
|
require('node-pty');
|
|
97
99
|
require('./processTreeSnapshot-D5iNblp6.cjs');
|
|
@@ -7028,6 +7030,375 @@ ${action.prompt}`, { localId: `automation-${run.id}`, ...meta });
|
|
|
7028
7030
|
};
|
|
7029
7031
|
}
|
|
7030
7032
|
|
|
7033
|
+
const ID = /^[A-Za-z0-9_-]{1,128}$/;
|
|
7034
|
+
const ISSUE_RECEIPT_TTL_MS = 7 * 24 * 36e5;
|
|
7035
|
+
function dir(home) {
|
|
7036
|
+
return path.join(home, "issues", "receipts");
|
|
7037
|
+
}
|
|
7038
|
+
function readIssueReceipt(home, dispatchId) {
|
|
7039
|
+
if (!ID.test(dispatchId)) return null;
|
|
7040
|
+
try {
|
|
7041
|
+
return JSON.parse(node_fs.readFileSync(path.join(dir(home), `${dispatchId}.json`), "utf8"));
|
|
7042
|
+
} catch {
|
|
7043
|
+
return null;
|
|
7044
|
+
}
|
|
7045
|
+
}
|
|
7046
|
+
function writeIssueReceipt(home, receipt) {
|
|
7047
|
+
if (!ID.test(receipt.dispatchId)) throw new Error("Invalid dispatch id");
|
|
7048
|
+
configuration.ensurePrivateDirectorySync(dir(home));
|
|
7049
|
+
configuration.writePrivateFileSync(path.join(dir(home), `${receipt.dispatchId}.json`), JSON.stringify({ ...receipt, updatedAt: Date.now() }));
|
|
7050
|
+
}
|
|
7051
|
+
function listIssueReceipts(home, now = Date.now()) {
|
|
7052
|
+
let files;
|
|
7053
|
+
try {
|
|
7054
|
+
files = node_fs.readdirSync(dir(home));
|
|
7055
|
+
} catch {
|
|
7056
|
+
return [];
|
|
7057
|
+
}
|
|
7058
|
+
const out = [];
|
|
7059
|
+
for (const file of files) {
|
|
7060
|
+
if (!file.endsWith(".json")) continue;
|
|
7061
|
+
const path$1 = path.join(dir(home), file);
|
|
7062
|
+
try {
|
|
7063
|
+
const receipt = JSON.parse(node_fs.readFileSync(path$1, "utf8"));
|
|
7064
|
+
const at = typeof receipt.updatedAt === "number" ? receipt.updatedAt : node_fs.statSync(path$1).mtimeMs;
|
|
7065
|
+
if (now - at > ISSUE_RECEIPT_TTL_MS) {
|
|
7066
|
+
node_fs.unlinkSync(path$1);
|
|
7067
|
+
continue;
|
|
7068
|
+
}
|
|
7069
|
+
out.push(receipt);
|
|
7070
|
+
} catch {
|
|
7071
|
+
}
|
|
7072
|
+
}
|
|
7073
|
+
return out;
|
|
7074
|
+
}
|
|
7075
|
+
|
|
7076
|
+
const ISSUE_POLL_MS = 5e3;
|
|
7077
|
+
const ISSUE_SPAWNED_BY = "issue";
|
|
7078
|
+
const ISSUE_SPAWN_UNKNOWN_GRACE_MS = 6e4;
|
|
7079
|
+
const FIRST_MESSAGE_KEY_WAIT_MS = 1e4;
|
|
7080
|
+
function issueKeyFromPrompt(prompt) {
|
|
7081
|
+
return /^You are assigned issue ([A-Z]+-\d{1,9}):/.exec(prompt)?.[1] ?? null;
|
|
7082
|
+
}
|
|
7083
|
+
function issueSpawnAccount(spawn) {
|
|
7084
|
+
if (spawn.agentProfile === void 0) return void 0;
|
|
7085
|
+
return spawn.agentProfile === null ? null : spawn.agentProfile.id;
|
|
7086
|
+
}
|
|
7087
|
+
function issueAccountRefusal(resolve, agent, requested) {
|
|
7088
|
+
if (!resolve) return null;
|
|
7089
|
+
if (agent !== "claude" && agent !== "codex") return typeof requested === "string" ? `Account unavailable (agent-mismatch): accounts are not supported for ${agent} yet` : null;
|
|
7090
|
+
try {
|
|
7091
|
+
resolve(agent, requested);
|
|
7092
|
+
return null;
|
|
7093
|
+
} catch (error) {
|
|
7094
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
7095
|
+
return accountUnavailableError(message, "issue");
|
|
7096
|
+
}
|
|
7097
|
+
}
|
|
7098
|
+
function issueExitEvent(exit) {
|
|
7099
|
+
if (!exit) return "exited";
|
|
7100
|
+
if (exit.signal) return ["SIGTERM", "SIGINT", "SIGHUP"].includes(exit.signal) ? "exited" : "crashed";
|
|
7101
|
+
return exit.code === 0 || exit.code === null || exit.code === 130 || exit.code === 143 ? "exited" : "crashed";
|
|
7102
|
+
}
|
|
7103
|
+
function persistedRunSessions(runId) {
|
|
7104
|
+
return Object.entries(persistence.readPersistedSessions()).filter(([, entry]) => entry.metadata?.issue?.runId === runId).map(([sessionId]) => sessionId);
|
|
7105
|
+
}
|
|
7106
|
+
function httpCode(error) {
|
|
7107
|
+
return error instanceof client$2.IssueRequestError ? error.code : null;
|
|
7108
|
+
}
|
|
7109
|
+
function createIssueWorker(deps) {
|
|
7110
|
+
const home = deps.home ?? configuration.configuration.happyHomeDir;
|
|
7111
|
+
const client = deps.client;
|
|
7112
|
+
const send = deps.send ?? (async (sessionId, text, options) => {
|
|
7113
|
+
const key = await sessionOps.waitForSessionKey(sessionId, FIRST_MESSAGE_KEY_WAIT_MS);
|
|
7114
|
+
await sessionOps.sendUserMessage(sessionId, key, text, "issue", options);
|
|
7115
|
+
});
|
|
7116
|
+
const capabilities = deps.capabilities ?? ((sessionId) => persistence.readPersistedSessions()[sessionId]?.metadata?.capabilities ?? null);
|
|
7117
|
+
let running = false;
|
|
7118
|
+
let closed = false;
|
|
7119
|
+
let retryAt = 0;
|
|
7120
|
+
const runBySession = /* @__PURE__ */ new Map();
|
|
7121
|
+
const lastEvent = /* @__PURE__ */ new Map();
|
|
7122
|
+
const events = [];
|
|
7123
|
+
for (const r of listIssueReceipts(home)) {
|
|
7124
|
+
if (r.kind === "spawn" && r.sessionId && !r.ended && (r.phase === "delivered" || r.phase === "completed")) runBySession.set(r.sessionId, r.runId);
|
|
7125
|
+
}
|
|
7126
|
+
const save = (receipt) => {
|
|
7127
|
+
writeIssueReceipt(home, receipt);
|
|
7128
|
+
return receipt;
|
|
7129
|
+
};
|
|
7130
|
+
const now = deps.now ?? Date.now;
|
|
7131
|
+
const unknownSpawns = /* @__PURE__ */ new Map();
|
|
7132
|
+
async function fail(receipt, error) {
|
|
7133
|
+
await client.fail(receipt.dispatchId, { machineId: deps.machineId, claimId: receipt.claimId, error: error.slice(0, 4e3) });
|
|
7134
|
+
save({ ...receipt, phase: "failed" });
|
|
7135
|
+
deps.log(`Issue dispatch ${receipt.dispatchId} failed`);
|
|
7136
|
+
}
|
|
7137
|
+
function holdUnknown(view, receipt, reason) {
|
|
7138
|
+
const held = unknownSpawns.get(view.id);
|
|
7139
|
+
unknownSpawns.set(view.id, { view, receipt, reason, deadline: held?.deadline ?? now() + ISSUE_SPAWN_UNKNOWN_GRACE_MS });
|
|
7140
|
+
deps.log(`Issue dispatch ${view.id} spawn outcome unknown; re-checking`);
|
|
7141
|
+
}
|
|
7142
|
+
async function recheckUnknown() {
|
|
7143
|
+
for (const [id, held] of [...unknownSpawns]) {
|
|
7144
|
+
if (closed) return;
|
|
7145
|
+
const matches = persistedRunSessions(held.view.runId);
|
|
7146
|
+
try {
|
|
7147
|
+
if (matches.length === 1) {
|
|
7148
|
+
unknownSpawns.delete(id);
|
|
7149
|
+
await afterSpawn(held.view, save({ ...held.receipt, sessionId: matches[0], phase: "spawned" }));
|
|
7150
|
+
} else if (matches.length > 1 || now() >= held.deadline) {
|
|
7151
|
+
unknownSpawns.delete(id);
|
|
7152
|
+
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`);
|
|
7153
|
+
}
|
|
7154
|
+
} catch (error) {
|
|
7155
|
+
if (httpCode(error) === "issue_dispatch_claim_mismatch" || error instanceof client$2.IssuesUnsupportedError) unknownSpawns.delete(id);
|
|
7156
|
+
deps.log(`Issue dispatch ${id} remains pending${error instanceof client$2.IssueRequestError && error.code ? ` (${error.code})` : ""}`);
|
|
7157
|
+
}
|
|
7158
|
+
}
|
|
7159
|
+
}
|
|
7160
|
+
async function complete(receipt) {
|
|
7161
|
+
let lastError;
|
|
7162
|
+
for (let attempt = 0; attempt < 3; attempt++) {
|
|
7163
|
+
try {
|
|
7164
|
+
await client.complete(receipt.dispatchId, { machineId: deps.machineId, claimId: receipt.claimId, sessionId: receipt.sessionId });
|
|
7165
|
+
save({ ...receipt, phase: "completed" });
|
|
7166
|
+
return;
|
|
7167
|
+
} catch (error) {
|
|
7168
|
+
lastError = error;
|
|
7169
|
+
if (httpCode(error) === "issue_dispatch_claim_mismatch" || error instanceof client$2.IssuesUnsupportedError) break;
|
|
7170
|
+
await new Promise((resolve) => setTimeout(resolve, 500 * (attempt + 1)));
|
|
7171
|
+
}
|
|
7172
|
+
}
|
|
7173
|
+
throw lastError;
|
|
7174
|
+
}
|
|
7175
|
+
async function runSpawn(view, receipt) {
|
|
7176
|
+
const spawn = view.spawn;
|
|
7177
|
+
if (receipt.phase === "failed") {
|
|
7178
|
+
await fail(receipt, "This dispatch already failed on this machine");
|
|
7179
|
+
return;
|
|
7180
|
+
}
|
|
7181
|
+
if (!spawn) {
|
|
7182
|
+
await fail(receipt, "Dispatch has no spawn payload");
|
|
7183
|
+
return;
|
|
7184
|
+
}
|
|
7185
|
+
const agent = spawn.agent;
|
|
7186
|
+
if (receipt.phase === "claimed") {
|
|
7187
|
+
if (!index.ISSUE_ASSIGNABLE_AGENTS.includes(agent)) {
|
|
7188
|
+
await fail(receipt, `Agent "${agent}" cannot run issues on this machine`);
|
|
7189
|
+
return;
|
|
7190
|
+
}
|
|
7191
|
+
if (!path.isAbsolute(spawn.directory)) {
|
|
7192
|
+
await fail(receipt, `Directory must be absolute: ${spawn.directory}`);
|
|
7193
|
+
return;
|
|
7194
|
+
}
|
|
7195
|
+
const account = issueSpawnAccount(spawn);
|
|
7196
|
+
const refusal = issueAccountRefusal(deps.resolveAccount, agent, account);
|
|
7197
|
+
if (refusal) {
|
|
7198
|
+
await fail(receipt, refusal);
|
|
7199
|
+
return;
|
|
7200
|
+
}
|
|
7201
|
+
const mode = spawnAgents.sanitizeSpawnPermissionMode(spawn.permissionMode ?? void 0);
|
|
7202
|
+
const permissionMode = spawnAgents.resolveSpawnPermissionMode(agent, mode ?? void 0);
|
|
7203
|
+
const key = issueKeyFromPrompt(spawn.prompt);
|
|
7204
|
+
receipt = save({ ...receipt, phase: "spawning" });
|
|
7205
|
+
const spawned = await deps.spawn({
|
|
7206
|
+
directory: spawn.directory,
|
|
7207
|
+
agent,
|
|
7208
|
+
permissionMode,
|
|
7209
|
+
spawnedBy: ISSUE_SPAWNED_BY,
|
|
7210
|
+
environmentVariables: { VH_ISSUE_ID: view.issueId, VH_ISSUE_RUN_ID: view.runId, ...key ? { VH_ISSUE_KEY: key } : {} },
|
|
7211
|
+
...account !== void 0 ? { agentProfileId: account } : {}
|
|
7212
|
+
});
|
|
7213
|
+
if (spawned.type === "error" && index.agentProfileUnavailableReason(spawned.errorMessage)) {
|
|
7214
|
+
await fail({ ...receipt, phase: "claimed" }, accountUnavailableError(spawned.errorMessage, "issue") ?? spawned.errorMessage);
|
|
7215
|
+
return;
|
|
7216
|
+
}
|
|
7217
|
+
if (spawned.type === "error" && (spawned.startupExit?.exited || spawned.notStarted)) {
|
|
7218
|
+
await fail(receipt, `Session failed to start: ${spawned.errorMessage}`);
|
|
7219
|
+
return;
|
|
7220
|
+
}
|
|
7221
|
+
if (spawned.type === "requestToApproveDirectoryCreation") {
|
|
7222
|
+
await fail(receipt, `Directory does not exist on this machine: ${spawn.directory}`);
|
|
7223
|
+
return;
|
|
7224
|
+
}
|
|
7225
|
+
if (spawned.type !== "success") {
|
|
7226
|
+
const matches = persistedRunSessions(view.runId);
|
|
7227
|
+
if (matches.length !== 1) {
|
|
7228
|
+
holdUnknown(view, receipt, spawned.errorMessage);
|
|
7229
|
+
return;
|
|
7230
|
+
}
|
|
7231
|
+
receipt = save({ ...receipt, sessionId: matches[0], phase: "spawned" });
|
|
7232
|
+
} else {
|
|
7233
|
+
receipt = save({ ...receipt, sessionId: spawned.sessionId, phase: "spawned" });
|
|
7234
|
+
}
|
|
7235
|
+
} else if (receipt.phase === "spawning") {
|
|
7236
|
+
const matches = persistedRunSessions(view.runId);
|
|
7237
|
+
if (matches.length !== 1) {
|
|
7238
|
+
holdUnknown(view, receipt, "the spawn was interrupted by a daemon restart");
|
|
7239
|
+
return;
|
|
7240
|
+
}
|
|
7241
|
+
receipt = save({ ...receipt, sessionId: matches[0], phase: "spawned" });
|
|
7242
|
+
} else {
|
|
7243
|
+
if (receipt.sessionId && !receipt.ended) runBySession.set(receipt.sessionId, view.runId);
|
|
7244
|
+
await deliverAndComplete(view, receipt);
|
|
7245
|
+
return;
|
|
7246
|
+
}
|
|
7247
|
+
await afterSpawn(view, receipt);
|
|
7248
|
+
}
|
|
7249
|
+
async function afterSpawn(view, receipt) {
|
|
7250
|
+
runBySession.set(receipt.sessionId, view.runId);
|
|
7251
|
+
const projectId = view.spawn?.projectId;
|
|
7252
|
+
if (projectId && deps.joinProject) await deps.joinProject(receipt.sessionId, projectId).catch(() => void 0);
|
|
7253
|
+
await deliverAndComplete(view, receipt);
|
|
7254
|
+
}
|
|
7255
|
+
async function deliverAndComplete(view, receipt) {
|
|
7256
|
+
const spawn = view.spawn;
|
|
7257
|
+
const agent = spawn.agent;
|
|
7258
|
+
if (receipt.phase === "spawned") {
|
|
7259
|
+
const sessionId = receipt.sessionId;
|
|
7260
|
+
const mode = spawnAgents.sanitizeSpawnPermissionMode(spawn.permissionMode ?? void 0);
|
|
7261
|
+
const permissionMode = spawnAgents.resolveSpawnPermissionMode(agent, mode ?? void 0);
|
|
7262
|
+
const meta = spawnAgents.resolveFirstMessageMeta({ agent, permissionMode, explicitModel: spawn.model ?? void 0, capabilities: capabilities(sessionId) });
|
|
7263
|
+
try {
|
|
7264
|
+
await send(sessionId, spawn.prompt, { localId: `${index.ISSUE_DISPATCH_LOCAL_ID_PREFIX}${view.id}`, sentFrom: index.ISSUE_SENT_FROM, ...meta });
|
|
7265
|
+
} catch (error) {
|
|
7266
|
+
await fail(receipt, `First message failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
7267
|
+
return;
|
|
7268
|
+
}
|
|
7269
|
+
receipt = save({ ...receipt, phase: "delivered" });
|
|
7270
|
+
}
|
|
7271
|
+
if (receipt.phase === "delivered" || receipt.phase === "completed") {
|
|
7272
|
+
await complete(receipt);
|
|
7273
|
+
lastEvent.set(receipt.sessionId, "running");
|
|
7274
|
+
}
|
|
7275
|
+
}
|
|
7276
|
+
async function runMessage(view, receipt) {
|
|
7277
|
+
const message = view.message;
|
|
7278
|
+
if (receipt.phase === "failed") {
|
|
7279
|
+
await fail(receipt, "Session is not running on this machine");
|
|
7280
|
+
return;
|
|
7281
|
+
}
|
|
7282
|
+
if (!message) {
|
|
7283
|
+
await fail(receipt, "Dispatch has no message payload");
|
|
7284
|
+
return;
|
|
7285
|
+
}
|
|
7286
|
+
if (receipt.phase === "claimed") {
|
|
7287
|
+
if (!deps.live(message.sessionId)) {
|
|
7288
|
+
await fail(receipt, "Session is not running on this machine");
|
|
7289
|
+
return;
|
|
7290
|
+
}
|
|
7291
|
+
try {
|
|
7292
|
+
await send(message.sessionId, message.text, { localId: `${index.ISSUE_DISPATCH_LOCAL_ID_PREFIX}${view.id}`, sentFrom: index.ISSUE_SENT_FROM });
|
|
7293
|
+
} catch (error) {
|
|
7294
|
+
await fail(receipt, `Message delivery failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
7295
|
+
return;
|
|
7296
|
+
}
|
|
7297
|
+
receipt = save({ ...receipt, sessionId: message.sessionId, phase: "delivered" });
|
|
7298
|
+
}
|
|
7299
|
+
await complete({ ...receipt, sessionId: receipt.sessionId ?? message.sessionId });
|
|
7300
|
+
}
|
|
7301
|
+
async function execute(polled) {
|
|
7302
|
+
let claimed;
|
|
7303
|
+
try {
|
|
7304
|
+
claimed = (await client.claim(polled.id, deps.machineId)).dispatch;
|
|
7305
|
+
} catch (error) {
|
|
7306
|
+
const code = httpCode(error);
|
|
7307
|
+
if (code === "issue_dispatch_claim_mismatch" || code === "issue_run_not_current" || code === "issue_dispatch_not_found") return;
|
|
7308
|
+
throw error;
|
|
7309
|
+
}
|
|
7310
|
+
if (!claimed.claimId) throw new Error("Dispatch claim did not return a claim id");
|
|
7311
|
+
const prior = readIssueReceipt(home, claimed.id);
|
|
7312
|
+
const receipt = save(prior ? { ...prior, claimId: claimed.claimId } : { dispatchId: claimed.id, kind: claimed.kind === "message" ? "message" : "spawn", runId: claimed.runId, issueId: claimed.issueId, claimId: claimed.claimId, phase: "claimed", updatedAt: Date.now() });
|
|
7313
|
+
if (claimed.kind === "message") await runMessage(claimed, receipt);
|
|
7314
|
+
else if (claimed.kind === "spawn") await runSpawn(claimed, receipt);
|
|
7315
|
+
else await fail(receipt, `Unknown dispatch kind "${claimed.kind}"`);
|
|
7316
|
+
}
|
|
7317
|
+
let flushing = false;
|
|
7318
|
+
async function flushEvents() {
|
|
7319
|
+
if (flushing) return;
|
|
7320
|
+
flushing = true;
|
|
7321
|
+
try {
|
|
7322
|
+
await drainEvents();
|
|
7323
|
+
} finally {
|
|
7324
|
+
flushing = false;
|
|
7325
|
+
}
|
|
7326
|
+
}
|
|
7327
|
+
async function drainEvents() {
|
|
7328
|
+
while (events.length && !closed) {
|
|
7329
|
+
const next = events[0];
|
|
7330
|
+
try {
|
|
7331
|
+
await client.sessionEvent(next.runId, { machineId: deps.machineId, sessionId: next.sessionId, event: next.event });
|
|
7332
|
+
} catch (error) {
|
|
7333
|
+
const code = httpCode(error);
|
|
7334
|
+
if (!(error instanceof client$2.IssuesUnsupportedError) && code !== "issue_run_not_found" && !(error instanceof client$2.IssueRequestError && error.status < 500 && error.status !== 429)) return;
|
|
7335
|
+
}
|
|
7336
|
+
events.shift();
|
|
7337
|
+
if (next.event === "exited" || next.event === "crashed") {
|
|
7338
|
+
runBySession.delete(next.sessionId);
|
|
7339
|
+
lastEvent.delete(next.sessionId);
|
|
7340
|
+
for (const r of listIssueReceipts(home)) if (r.sessionId === next.sessionId && r.kind === "spawn") save({ ...r, ended: true });
|
|
7341
|
+
}
|
|
7342
|
+
}
|
|
7343
|
+
}
|
|
7344
|
+
async function tick() {
|
|
7345
|
+
if (running || closed || Date.now() < retryAt) return;
|
|
7346
|
+
running = true;
|
|
7347
|
+
try {
|
|
7348
|
+
await recheckUnknown();
|
|
7349
|
+
let dispatches;
|
|
7350
|
+
try {
|
|
7351
|
+
dispatches = (await client.poll(deps.machineId)).dispatches ?? [];
|
|
7352
|
+
} catch (error) {
|
|
7353
|
+
if (!(error instanceof client$2.IssuesUnsupportedError)) {
|
|
7354
|
+
retryAt = Date.now() + 3e4;
|
|
7355
|
+
deps.log(`Issue dispatch poll unavailable${error instanceof client$2.IssueRequestError ? ` (${error.status}${error.code ? ` ${error.code}` : ""})` : ""}`);
|
|
7356
|
+
}
|
|
7357
|
+
return;
|
|
7358
|
+
}
|
|
7359
|
+
for (const dispatch of dispatches) {
|
|
7360
|
+
if (closed) break;
|
|
7361
|
+
try {
|
|
7362
|
+
await execute(dispatch);
|
|
7363
|
+
} catch (error) {
|
|
7364
|
+
deps.log(`Issue dispatch ${dispatch.id} remains pending${error instanceof client$2.IssueRequestError && error.code ? ` (${error.code})` : ""}`);
|
|
7365
|
+
}
|
|
7366
|
+
}
|
|
7367
|
+
await flushEvents();
|
|
7368
|
+
} finally {
|
|
7369
|
+
running = false;
|
|
7370
|
+
}
|
|
7371
|
+
}
|
|
7372
|
+
let timer;
|
|
7373
|
+
if (deps.autoStart !== false) {
|
|
7374
|
+
timer = setInterval(() => {
|
|
7375
|
+
void tick();
|
|
7376
|
+
}, ISSUE_POLL_MS);
|
|
7377
|
+
timer.unref();
|
|
7378
|
+
void tick();
|
|
7379
|
+
}
|
|
7380
|
+
return {
|
|
7381
|
+
tick,
|
|
7382
|
+
hasSession: (sessionId) => runBySession.has(sessionId),
|
|
7383
|
+
/** Daemon hooks (turn start/end, wrapper exit) → run session event; deduplicated per session. */
|
|
7384
|
+
report(sessionId, event) {
|
|
7385
|
+
const runId = runBySession.get(sessionId);
|
|
7386
|
+
if (!runId || closed || lastEvent.get(sessionId) === event) return;
|
|
7387
|
+
lastEvent.set(sessionId, event);
|
|
7388
|
+
events.push({ sessionId, runId, event });
|
|
7389
|
+
if (events.length > 500) events.splice(0, events.length - 500);
|
|
7390
|
+
void flushEvents();
|
|
7391
|
+
},
|
|
7392
|
+
get busy() {
|
|
7393
|
+
return running;
|
|
7394
|
+
},
|
|
7395
|
+
stop: () => {
|
|
7396
|
+
closed = true;
|
|
7397
|
+
if (timer) clearInterval(timer);
|
|
7398
|
+
}
|
|
7399
|
+
};
|
|
7400
|
+
}
|
|
7401
|
+
|
|
7031
7402
|
function daemonExitCode(source) {
|
|
7032
7403
|
return source === "exception" ? 1 : 0;
|
|
7033
7404
|
}
|
|
@@ -7183,6 +7554,7 @@ async function startDaemon() {
|
|
|
7183
7554
|
logger.logger.debug("[DAEMON RUN] Auth and machine setup complete");
|
|
7184
7555
|
const pidToTrackedSession = /* @__PURE__ */ new Map();
|
|
7185
7556
|
const turnActivity = new api.TurnActivityTracker();
|
|
7557
|
+
turnActivity.onEvent((sessionId, event) => issueWorker?.report(sessionId, event === "turn_started" ? "running" : "idle"));
|
|
7186
7558
|
const backgroundTasks = new backgroundTaskActivity.BackgroundTaskTracker();
|
|
7187
7559
|
const peerCoordinator = createPeerCoordinator({ getChildren: () => Array.from(pidToTrackedSession.values()) });
|
|
7188
7560
|
const hibernationAutomations = client$1.createAutomationsClient({ serverUrl: configuration.configuration.serverUrl, token: credentials.token, client: "daemon-hibernate" });
|
|
@@ -7218,6 +7590,7 @@ async function startDaemon() {
|
|
|
7218
7590
|
let autoRestart;
|
|
7219
7591
|
let bundleReplacedSeen = false;
|
|
7220
7592
|
let automationRunner;
|
|
7593
|
+
let issueWorker;
|
|
7221
7594
|
let projectPresence;
|
|
7222
7595
|
const persisted = persistence.readPersistedSessions();
|
|
7223
7596
|
const liveHappyProcesses = await doctor$1.findAllHappyProcesses();
|
|
@@ -7454,7 +7827,8 @@ async function startDaemon() {
|
|
|
7454
7827
|
logger.logger.debug(`[DAEMON RUN] Directory creation failed: ${errorMessage}`);
|
|
7455
7828
|
return {
|
|
7456
7829
|
type: "error",
|
|
7457
|
-
errorMessage
|
|
7830
|
+
errorMessage,
|
|
7831
|
+
notStarted: true
|
|
7458
7832
|
};
|
|
7459
7833
|
}
|
|
7460
7834
|
}
|
|
@@ -7513,11 +7887,11 @@ async function startDaemon() {
|
|
|
7513
7887
|
const requested = forkSpawnAccount(options.agentProfileId, options.parentSessionId, (id) => accountServiceRef.sessionAccount(id));
|
|
7514
7888
|
spawnAccountId = accountServiceRef.resolveSpawnAccount(accountAgent, requested);
|
|
7515
7889
|
} catch (error) {
|
|
7516
|
-
return { type: "error", errorMessage: error instanceof Error ? error.message : String(error) };
|
|
7890
|
+
return { type: "error", errorMessage: error instanceof Error ? error.message : String(error), notStarted: true };
|
|
7517
7891
|
}
|
|
7518
7892
|
if (spawnAccountId) extraEnv[store.SPAWN_ACCOUNT_ENV] = spawnAccountId;
|
|
7519
7893
|
} else if (options.agentProfileId) {
|
|
7520
|
-
return { type: "error", errorMessage: `agent-profile-unavailable:agent-mismatch: accounts are not supported for ${options.agent} yet
|
|
7894
|
+
return { type: "error", errorMessage: `agent-profile-unavailable:agent-mismatch: accounts are not supported for ${options.agent} yet`, notStarted: true };
|
|
7521
7895
|
}
|
|
7522
7896
|
const claudeAuthStatus = claudeAuthServiceRef?.current()?.status;
|
|
7523
7897
|
if ((options.agent ?? "claude") === "claude" && claudeAuthStatus && !spawnAccountId) {
|
|
@@ -7544,7 +7918,8 @@ async function startDaemon() {
|
|
|
7544
7918
|
logger.logger.warn(`[DAEMON RUN] ${errorMessage}`);
|
|
7545
7919
|
return {
|
|
7546
7920
|
type: "error",
|
|
7547
|
-
errorMessage
|
|
7921
|
+
errorMessage,
|
|
7922
|
+
notStarted: true
|
|
7548
7923
|
};
|
|
7549
7924
|
}
|
|
7550
7925
|
let tmuxSessionName = extraEnv.TMUX_SESSION_NAME;
|
|
@@ -7565,7 +7940,8 @@ async function startDaemon() {
|
|
|
7565
7940
|
if (!spawnAgents.isSpawnAgent(agent)) {
|
|
7566
7941
|
return {
|
|
7567
7942
|
type: "error",
|
|
7568
|
-
errorMessage: `Unsupported agent type: '${options.agent}'. Please update your CLI to the latest version
|
|
7943
|
+
errorMessage: `Unsupported agent type: '${options.agent}'. Please update your CLI to the latest version.`,
|
|
7944
|
+
notStarted: true
|
|
7569
7945
|
};
|
|
7570
7946
|
}
|
|
7571
7947
|
const resumeId = agent === "claude" ? options.resumeClaudeSessionId : agent === "codex" ? options.resumeCodexThreadId : void 0;
|
|
@@ -7651,7 +8027,8 @@ async function startDaemon() {
|
|
|
7651
8027
|
default:
|
|
7652
8028
|
return {
|
|
7653
8029
|
type: "error",
|
|
7654
|
-
errorMessage: `Unsupported agent type: '${options.agent}'. Please update your CLI to the latest version
|
|
8030
|
+
errorMessage: `Unsupported agent type: '${options.agent}'. Please update your CLI to the latest version.`,
|
|
8031
|
+
notStarted: true
|
|
7655
8032
|
};
|
|
7656
8033
|
}
|
|
7657
8034
|
const args = [
|
|
@@ -7721,7 +8098,8 @@ async function startDaemon() {
|
|
|
7721
8098
|
logger.logger.debug("[DAEMON RUN] Failed to spawn process - no PID returned");
|
|
7722
8099
|
return Promise.resolve({
|
|
7723
8100
|
type: "error",
|
|
7724
|
-
errorMessage: "Failed to spawn Happy process - no PID returned"
|
|
8101
|
+
errorMessage: "Failed to spawn Happy process - no PID returned",
|
|
8102
|
+
notStarted: true
|
|
7725
8103
|
});
|
|
7726
8104
|
}
|
|
7727
8105
|
timer?.mark("spawned");
|
|
@@ -7739,7 +8117,7 @@ async function startDaemon() {
|
|
|
7739
8117
|
happyProcess.on("exit", (code, signal) => {
|
|
7740
8118
|
logger.logger.debug(`[DAEMON RUN] Child PID ${happyProcess.pid} exited with code ${code}, signal ${signal}`);
|
|
7741
8119
|
if (happyProcess.pid) {
|
|
7742
|
-
onChildExited(happyProcess.pid);
|
|
8120
|
+
onChildExited(happyProcess.pid, { code, signal });
|
|
7743
8121
|
}
|
|
7744
8122
|
});
|
|
7745
8123
|
happyProcess.on("error", (error) => {
|
|
@@ -7947,7 +8325,9 @@ async function startDaemon() {
|
|
|
7947
8325
|
HAPPY_RECONNECT_SEQ: String(tracked.encryption.seq),
|
|
7948
8326
|
HAPPY_RECONNECT_METADATA_VERSION: String(tracked.encryption.metadataVersion),
|
|
7949
8327
|
HAPPY_RECONNECT_AGENT_STATE_VERSION: String(tracked.encryption.agentStateVersion),
|
|
7950
|
-
...teamEnv
|
|
8328
|
+
...teamEnv,
|
|
8329
|
+
// B-874c: an issue run's binding rides every relaunch (digest, MCP context).
|
|
8330
|
+
...sessionMetadata.issueRelaunchEnv(metadata)
|
|
7951
8331
|
}
|
|
7952
8332
|
});
|
|
7953
8333
|
if (result.type === "success") {
|
|
@@ -8089,6 +8469,8 @@ async function startDaemon() {
|
|
|
8089
8469
|
HAPPY_RECONNECT_METADATA_VERSION: String(tracked.encryption.metadataVersion),
|
|
8090
8470
|
HAPPY_RECONNECT_AGENT_STATE_VERSION: String(tracked.encryption.agentStateVersion),
|
|
8091
8471
|
...teamEnv,
|
|
8472
|
+
// B-874c: see resumeSessionImpl.
|
|
8473
|
+
...sessionMetadata.issueRelaunchEnv(metadata),
|
|
8092
8474
|
...options?.auto ? { [sessionLock.AUTO_RESTARTED_ENV]: sessionLock.encodeAutoRestarted(options.auto.kind, options.auto.target) } : {}
|
|
8093
8475
|
}
|
|
8094
8476
|
});
|
|
@@ -8130,8 +8512,11 @@ async function startDaemon() {
|
|
|
8130
8512
|
logger.logger.debug(`[DAEMON RUN] Session ${sessionId} not found`);
|
|
8131
8513
|
return false;
|
|
8132
8514
|
};
|
|
8133
|
-
const onChildExited = (pid) => {
|
|
8515
|
+
const onChildExited = (pid, exit) => {
|
|
8134
8516
|
const session = pidToTrackedSession.get(pid);
|
|
8517
|
+
if (session?.happySessionId && !autoRestartExits.has(session.happySessionId) && issueWorker?.hasSession(session.happySessionId)) {
|
|
8518
|
+
issueWorker.report(session.happySessionId, daemonHibernation.pendingExit(session.happySessionId) ? "idle" : issueExitEvent(exit));
|
|
8519
|
+
}
|
|
8135
8520
|
if (session?.happySessionId && !autoRestartExits.has(session.happySessionId) && (session.spawnedBy === "teams" || teamWorker?.hasSession(session.happySessionId))) teamWorker?.report(session.happySessionId, "exited");
|
|
8136
8521
|
if (session?.happySessionId && automationRunner?.hasSession(session.happySessionId)) automationRunner.report(session.happySessionId, "exited");
|
|
8137
8522
|
if (session?.happySessionId) turnActivity.forget(session.happySessionId);
|
|
@@ -8661,6 +9046,7 @@ async function startDaemon() {
|
|
|
8661
9046
|
const sessionsHold = () => daemonSupervisor.handoverWaitsForSessions({ bundleReplaced, relayMove: !!relayMove, sparesWrappers: handoverSparesWrappers }) && (turnActivity.hasActiveTurn() || backgroundTasks.hasAny());
|
|
8662
9047
|
if ((bundleReplaced || relayMove) && !teamWorker?.busy && !automationRunner?.busy && !updateController.isRunning() && !harnessInstaller?.isRunning() && !sessionsHold()) {
|
|
8663
9048
|
const preflight = bundleReplaced ? await preflightNewBundle(bundlePath) : { action: "proceed" };
|
|
9049
|
+
if (issueWorker?.busy) return;
|
|
8664
9050
|
if (preflight.action === "hold") {
|
|
8665
9051
|
if (lastHandoverHold !== preflight.reason) {
|
|
8666
9052
|
lastHandoverHold = preflight.reason;
|
|
@@ -8674,6 +9060,7 @@ async function startDaemon() {
|
|
|
8674
9060
|
logger.logger.debug(relayMove ? `[DAEMON RUN] Relay moved to ${relayMove.serverUrl}; handing off to a new daemon on the new settings` : "[DAEMON RUN] Daemon bundle replaced on disk and verified, handing off to new daemon");
|
|
8675
9061
|
teamWorker?.stop();
|
|
8676
9062
|
automationRunner?.stop();
|
|
9063
|
+
issueWorker?.stop();
|
|
8677
9064
|
projectPresence?.stop();
|
|
8678
9065
|
clearInterval(restartOnStaleVersionAndHeartbeat);
|
|
8679
9066
|
clearInterval(cliUpdateInterval);
|
|
@@ -8770,6 +9157,15 @@ async function startDaemon() {
|
|
|
8770
9157
|
} : {},
|
|
8771
9158
|
log: (message) => logger.logger.debug(`[DAEMON RUN] ${message}`)
|
|
8772
9159
|
});
|
|
9160
|
+
issueWorker = createIssueWorker({
|
|
9161
|
+
machineId,
|
|
9162
|
+
client: client$2.createIssuesClient({ token: async () => credentials.token }),
|
|
9163
|
+
spawn: spawnSession,
|
|
9164
|
+
live: (id) => [...pidToTrackedSession.values()].some((s) => s.happySessionId === id && isPidAlive(s.pid)),
|
|
9165
|
+
...accountServiceRef ? { resolveAccount: (agent, requested) => accountServiceRef.resolveSpawnAccount(agent, requested) } : {},
|
|
9166
|
+
joinProject: (sessionId, projectId) => spawnAgents.joinProject(projectsClient, sessionId, { kind: "explicit", projectId }, { via: "issue" }),
|
|
9167
|
+
log: (message) => logger.logger.debug(`[DAEMON RUN] ${message}`)
|
|
9168
|
+
});
|
|
8773
9169
|
projectPresence = createProjectPresenceReporter({
|
|
8774
9170
|
machineId,
|
|
8775
9171
|
client: projectsClient,
|
|
@@ -8803,6 +9199,7 @@ async function startDaemon() {
|
|
|
8803
9199
|
const scrollbackFlush = apiMachine.flushTerminalScrollback();
|
|
8804
9200
|
teamWorker?.stop();
|
|
8805
9201
|
automationRunner?.stop({ killScripts: true });
|
|
9202
|
+
issueWorker?.stop();
|
|
8806
9203
|
projectPresence?.stop();
|
|
8807
9204
|
mirrorProtocol.currentWorktreeService()?.stopAll();
|
|
8808
9205
|
if (restartOnStaleVersionAndHeartbeat) {
|