very-happy-cli 0.2.192 → 0.2.193
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-CGHTDJd9.mjs → AcpBackend-B4PwjqHt.mjs} +3 -3
- package/dist/{AcpBackend-BQO4ShOy.cjs → AcpBackend-DtJCgftG.cjs} +3 -3
- package/dist/{AcpSessionManager-G0xD6Jbq.mjs → AcpSessionManager-BzKWgkdP.mjs} +2 -2
- package/dist/{AcpSessionManager-LlUMmcpB.cjs → AcpSessionManager-D4qshX_H.cjs} +2 -2
- package/dist/{BasePermissionHandler-N6Ip3tFt.cjs → BasePermissionHandler-5iG-cvA2.cjs} +1 -1
- package/dist/{BasePermissionHandler-BmTIg376.mjs → BasePermissionHandler-DV6UM6e9.mjs} +1 -1
- package/dist/{account-CCVT-HO_.mjs → account-Dco_nGT4.mjs} +84 -27
- package/dist/{account-DtaouikP.cjs → account-DvpA60oU.cjs} +84 -27
- package/dist/{accountService-Dd9uqde2.mjs → accountService-Cd7bnkfd.mjs} +369 -19
- package/dist/{accountService-Bddy0zwL.cjs → accountService-CuUSJDhP.cjs} +369 -19
- package/dist/{acpSessionResume-BnHDk5eD.cjs → acpSessionResume-Bk9mjXZ9.cjs} +1 -1
- package/dist/{acpSessionResume-BWEUxNtC.mjs → acpSessionResume-TQwN9ZZE.mjs} +1 -1
- package/dist/{agentHome-B0VnjkZW.mjs → agentHome-Bep8semY.mjs} +4 -4
- package/dist/{agentHome-CqQ29YY7.cjs → agentHome-c2dlgcw1.cjs} +4 -4
- package/dist/{api-hMDsC6Wg.cjs → api-CBE_a88I.cjs} +10 -10
- package/dist/{api-_LeBScjg.mjs → api-DUfunY3x.mjs} +10 -10
- package/dist/{apiMachine-CqW2m6Zr.cjs → apiMachine-BqtG0IWm.cjs} +19 -18
- package/dist/{apiMachine-CgRldeJ6.mjs → apiMachine-CU_bw5nV.mjs} +19 -18
- package/dist/{attachmentContent-BEeT2J5n.cjs → attachmentContent-B3AzuYqk.cjs} +2 -2
- package/dist/{attachmentContent-CyptLIfq.mjs → attachmentContent-KNIZxwlu.mjs} +2 -2
- package/dist/{auth-CFQikywl.mjs → auth-CZ7pKS-j.mjs} +8 -8
- package/dist/{auth-C9NvNHhL.cjs → auth-DCjxpI6Z.cjs} +5 -5
- package/dist/{auth-CA1OClsW.cjs → auth-SJ_dPw7H.cjs} +8 -8
- package/dist/{auth-DL8_J9vu.mjs → auth-jN5dNqTO.mjs} +5 -5
- package/dist/{auto-uQOxlxLp.cjs → auto-B_59RYH1.cjs} +23 -21
- package/dist/{auto-CKI05w1D.mjs → auto-DC0Sq-qB.mjs} +23 -21
- package/dist/{bootstrap-DaZ0Np7X.mjs → bootstrap-B3gMpU9e.mjs} +2 -2
- package/dist/{bootstrap-DsZGc69k.cjs → bootstrap-CoJu9VnB.cjs} +2 -2
- package/dist/{browser-BUIaSHK2.mjs → browser-LHW2hBH8.mjs} +1 -1
- package/dist/{browser-Ft0ASDm7.cjs → browser-v1pdPP1E.cjs} +1 -1
- package/dist/{claudeAccountEnv-ON24i0qv.mjs → claudeAccountEnv-BL1pR_37.mjs} +2 -1
- package/dist/{claudeAccountEnv-BOBpJ3k8.cjs → claudeAccountEnv-CEX_EMZr.cjs} +2 -1
- package/dist/{claudeLocal-B1ZVtryl.mjs → claudeLocal-BZUgA5G2.mjs} +5 -5
- package/dist/{claudeLocal-BMf9t4Fa.cjs → claudeLocal-BrzM2RBI.cjs} +5 -5
- package/dist/{claudeLocalLauncher-Bp8bqF4y.mjs → claudeLocalLauncher-A0AQyHFi.mjs} +10 -10
- package/dist/{claudeLocalLauncher-C8TeJcfF.cjs → claudeLocalLauncher-XAMpXUM7.cjs} +10 -10
- package/dist/{claudeSessionFork-YiktY55n.cjs → claudeSessionFork-Mhn2fYe_.cjs} +1 -1
- package/dist/{claudeSessionFork-8AA47z8Y.mjs → claudeSessionFork-_GwIlmMB.mjs} +1 -1
- package/dist/{client-Cxlp_D4I.mjs → client-7RnI9J0W.mjs} +2 -2
- package/dist/{client-Bm4oKvW7.mjs → client-Bde4QVIn.mjs} +4 -2
- package/dist/{client-D8XROyZc.cjs → client-CJr8Pjwm.cjs} +4 -2
- package/dist/{client-Crh8_cNx.cjs → client-D2GWkd-T.cjs} +2 -2
- package/dist/{client-CFHZfh9x.cjs → client-DLlnmAPL.cjs} +4 -4
- package/dist/{client-BmPaBnDK.mjs → client-DwbhrX6D.mjs} +4 -4
- package/dist/codex/happyMcpStdioBridge.cjs +16 -16
- package/dist/codex/happyMcpStdioBridge.mjs +16 -16
- package/dist/codexAccount-BDQjRbtI.cjs +1028 -0
- package/dist/codexAccount-NOX5pmQf.mjs +1015 -0
- package/dist/{codexAppServerClient-BWJbLCQn.mjs → codexAppServerClient-B3QJV6Ey.mjs} +18 -7
- package/dist/{codexAppServerClient-q8GHQhyC.cjs → codexAppServerClient-DWEsZUC4.cjs} +18 -7
- package/dist/{codexCommand-BgpGg-Zy.cjs → codexCommand-Bg8AmxVm.cjs} +187 -57
- package/dist/{codexCommand-BfXfRQr4.mjs → codexCommand-D1xlj4sT.mjs} +188 -58
- package/dist/{codexTermination-CVUF0X75.cjs → codexTermination-ByX9GcEJ.cjs} +1 -1
- package/dist/{codexTermination-s9fd1gkA.mjs → codexTermination-CaWAVQjZ.mjs} +1 -1
- package/dist/{config-BAjyTyYp.cjs → config-B2GGbiTv.cjs} +3 -3
- package/dist/{config-BF8XgLyc.mjs → config-C2XYEwXz.mjs} +3 -3
- package/dist/{configuration-CXEVKAyF.cjs → configuration-BBK0rmmj.cjs} +1 -1
- package/dist/{configuration-IhRiLDVe.mjs → configuration-ThKBP_zY.mjs} +1 -1
- package/dist/{connect-LZh1gr08.mjs → connect-BirnCl9q.mjs} +13 -13
- package/dist/{connect-rCS56arw.cjs → connect-C3tZs_NC.cjs} +13 -13
- package/dist/{context-DO6F5YwH.mjs → context-C0EFLnOg.mjs} +1 -1
- package/dist/{context-3_S_mWz9.cjs → context-wDp0aZBK.cjs} +1 -1
- package/dist/{controlClient-8ILulwjc.mjs → controlClient-Ckl8N1MS.mjs} +3 -3
- package/dist/{controlClient-j7p5p3_7.cjs → controlClient-DwWTns3A.cjs} +3 -3
- package/dist/{createSessionMetadata-DwdD_uVo.cjs → createSessionMetadata-DqZ6h02H.cjs} +2 -2
- package/dist/{createSessionMetadata-oyaTZm1b.mjs → createSessionMetadata-vug4Cv8z.mjs} +2 -2
- package/dist/{daemonAccounts-BCjDgoNt.cjs → daemonAccounts-CpGDY_4k.cjs} +4 -1
- package/dist/{daemonAccounts-BJgt6IJe.mjs → daemonAccounts-DwPwKxvv.mjs} +5 -2
- package/dist/{defaultPermissionMode-BFShzF55.cjs → defaultPermissionMode-BakXiqRr.cjs} +1 -1
- package/dist/{defaultPermissionMode-Lt3PUCwY.mjs → defaultPermissionMode-DF5AfeBb.mjs} +1 -1
- package/dist/{deterministicJson-Dfp-7wUZ.mjs → deterministicJson-BzX94gi3.mjs} +13 -13
- package/dist/{deterministicJson-DUN0v3St.cjs → deterministicJson-t33SsuRC.cjs} +13 -13
- package/dist/{doctor-FgUYTbAT.cjs → doctor-B9ug1LZb.cjs} +7 -7
- package/dist/{doctor-B_UwMcVT.mjs → doctor-C1zyOSXw.mjs} +7 -7
- package/dist/{downloadTarget-C0d6jRx-.mjs → downloadTarget-Baslc6jW.mjs} +6 -6
- package/dist/{downloadTarget-BrrQEDxg.cjs → downloadTarget-T1id2Gh6.cjs} +6 -6
- package/dist/{ensureDaemonRunning-KUMFfIil.mjs → ensureDaemonRunning-C6ERYK-O.mjs} +5 -5
- package/dist/{ensureDaemonRunning-Cq4FYI5Q.cjs → ensureDaemonRunning-CoAg11Zi.cjs} +5 -5
- package/dist/{handleResumeCommand-BGhVo3QH.mjs → handleResumeCommand-CrlqDuz7.mjs} +5 -5
- package/dist/{handleResumeCommand-Cl9GIL5F.cjs → handleResumeCommand-DPi-sPm7.cjs} +5 -5
- package/dist/{index-CZaLMmPC.cjs → index-B1swQJUS.cjs} +4 -4
- package/dist/{index-CQ_hLLCj.cjs → index-B2dJA8VG.cjs} +3 -3
- package/dist/{index-BzAYnYct.cjs → index-BUFrKZeQ.cjs} +198 -108
- package/dist/{index-JQDyJ3Li.mjs → index-BbdV2mzy.mjs} +3 -3
- package/dist/{index-BjXjMhGY.mjs → index-BcSPg3c5.mjs} +4 -4
- package/dist/{index-D8ODb0_U.cjs → index-Bkslzin5.cjs} +42 -42
- package/dist/{index-v5EmjT8l.mjs → index-Cn73rdtQ.mjs} +4 -4
- package/dist/{index-DYD3GM1m.mjs → index-D1YnIih6.mjs} +195 -109
- package/dist/{index-Ca1Tt96A.mjs → index-fZO4nF6e.mjs} +43 -43
- package/dist/{index-CRipkiqo.cjs → index-rocrvOYG.cjs} +4 -4
- package/dist/index.cjs +2 -2
- package/dist/index.mjs +2 -2
- package/dist/{install-ClUA9tbC.cjs → install-CArXjPfW.cjs} +3 -3
- package/dist/{install-D6EHRtAN.mjs → install-CChhyV2G.mjs} +3 -3
- package/dist/lib.cjs +12 -12
- package/dist/lib.d.cts +97 -25
- package/dist/lib.d.mts +97 -25
- package/dist/lib.mjs +12 -12
- package/dist/{lidState-CZOXXdzv.mjs → lidState-B6yYKjNK.mjs} +1 -1
- package/dist/{lidState-DqoN7zH4.cjs → lidState-B_v6qgfE.cjs} +1 -1
- package/dist/{localHappyAgentAuth-YHxDZ4x4.mjs → localHappyAgentAuth-KRlg_aI0.mjs} +1 -1
- package/dist/{localHappyAgentAuth-BnGCpHRX.cjs → localHappyAgentAuth-jJH0n67S.cjs} +1 -1
- package/dist/{logger-8su64lqR.cjs → logger-CX3x2eI4.cjs} +2 -2
- package/dist/{logger-Fd_rNvgd.mjs → logger-JV7-4Q_6.mjs} +2 -2
- package/dist/{machineMetadata-1HIIC7Bc.mjs → machineMetadata-D5-SW9kv.mjs} +3 -3
- package/dist/{machineMetadata-DYXt3p6u.cjs → machineMetadata-DhZuM0iB.cjs} +3 -3
- package/dist/{main-C_GrcYkn.cjs → main-1x1HGQEy.cjs} +47 -47
- package/dist/{main-BI6GIzUL.mjs → main-CFOdXbPD.mjs} +47 -47
- package/dist/{mcp-BycIv9oQ.cjs → mcp-BnKBSEh7.cjs} +18 -18
- package/dist/{mcp-XGoxywno.mjs → mcp-R6lMcFLO.mjs} +18 -18
- package/dist/{mirrorProtocol-DXT3rv7T.mjs → mirrorProtocol-CD4ntuZJ.mjs} +3 -3
- package/dist/{mirrorProtocol-DVnB8EO8.cjs → mirrorProtocol-DO-KtvAL.cjs} +3 -3
- package/dist/{package-6KkRAops.mjs → package-Bw3H6VLn.mjs} +7 -7
- package/dist/{package-iuLlSiSF.cjs → package-uzlvxa5S.cjs} +7 -7
- package/dist/{panels-B5Di2zb2.mjs → panels-BamhZCoZ.mjs} +5 -5
- package/dist/{panels-0C89q0Tu.cjs → panels-C46FxjmH.cjs} +5 -5
- package/dist/{peerTools-CANTX_mG.cjs → peerTools-D-VNNFw-.cjs} +5 -5
- package/dist/{peerTools-CKJ-IDM4.mjs → peerTools-WtRgTSqG.mjs} +5 -5
- package/dist/{persistence-DWcHe035.mjs → persistence-Cg4sfjQV.mjs} +2 -2
- package/dist/{persistence-B4ttN-fR.cjs → persistence-CsmAgN-C.cjs} +2 -2
- package/dist/{piRunnerArgs-Bl5GpBoN.mjs → piRunnerArgs-BbaAQvb4.mjs} +1 -1
- package/dist/{piRunnerArgs-BOkfxyak.cjs → piRunnerArgs-vnFygygF.cjs} +1 -1
- package/dist/{piRuntime-BhwxzdQf.mjs → piRuntime-Bid7TBf5.mjs} +1 -1
- package/dist/{piRuntime-DzrIiZU8.cjs → piRuntime-C2uj5Ucx.cjs} +1 -1
- package/dist/{piTerminal-BdS7ol7v.cjs → piTerminal-Ckpjfoqa.cjs} +20 -20
- package/dist/{piTerminal-DnA2CbGr.mjs → piTerminal-CqxgrI13.mjs} +20 -20
- package/dist/{pushNotifications-BqFoLye2.cjs → pushNotifications-BCg7YAiu.cjs} +3 -3
- package/dist/{pushNotifications-DkQ0yvFs.mjs → pushNotifications-BbE-qV9I.mjs} +3 -3
- package/dist/{query-BRJYSkb1.mjs → query-Bfr9O_62.mjs} +1 -1
- package/dist/{query-BQ4br3yn.cjs → query-vQ-HG394.cjs} +1 -1
- package/dist/{rateLimitReporter-DK5SQuCc.cjs → rateLimitReporter-BZ8x0-6-.cjs} +3 -3
- package/dist/{rateLimitReporter-BRbYkmuP.mjs → rateLimitReporter-CAz7VMw4.mjs} +3 -3
- package/dist/{rateLimitWindows-DBfiuYeg.cjs → rateLimitWindows-BZl6GMwQ.cjs} +1 -1
- package/dist/{rateLimitWindows-Da5AR-4u.mjs → rateLimitWindows-CRARnKaI.mjs} +1 -1
- package/dist/{registerCommonHandlers-m6pxxf2J.cjs → registerCommonHandlers-CZGmrPbT.cjs} +2 -2
- package/dist/{registerCommonHandlers-yQ7Ru-l0.mjs → registerCommonHandlers-Cj3Nl9y-.mjs} +2 -2
- package/dist/{registerKillSessionHandler-BDNpi7YO.mjs → registerKillSessionHandler-Bg9t45Ub.mjs} +6 -6
- package/dist/{registerKillSessionHandler-BAOIa_Fs.cjs → registerKillSessionHandler-C3EDnW4F.cjs} +6 -6
- package/dist/{remoteSessionClient-CZ7aaNgj.mjs → remoteSessionClient--0vfA7I5.mjs} +5 -5
- package/dist/{remoteSessionClient-iJMXRN_D.cjs → remoteSessionClient-CcSP24Zq.cjs} +5 -5
- package/dist/{reportProgressTool-DfQhPu0s.mjs → reportProgressTool-DVru7jc_.mjs} +3 -3
- package/dist/{reportProgressTool-DpFs7pSe.cjs → reportProgressTool-Ddg1yVq2.cjs} +3 -3
- package/dist/{run-p-xp1_HY.cjs → run-BTrIT_jU.cjs} +178 -847
- package/dist/{run-CwN28mcj.mjs → run-HtvH6BLi.mjs} +176 -845
- package/dist/{runClaude-DRKtAGTm.mjs → runClaude-DsHTk5Bu.mjs} +25 -25
- package/dist/{runClaude-D6U1Z575.cjs → runClaude-ipjwAHPI.cjs} +25 -25
- package/dist/{runClaudeDeps-Dkofokgb.cjs → runClaudeDeps-BKpwL6ln.cjs} +41 -41
- package/dist/{runClaudeDeps-BheVcIlD.mjs → runClaudeDeps-BV3vpeyY.mjs} +46 -46
- package/dist/{runGemini-C8q3YCc0.cjs → runGemini-B-G0_7Ab.cjs} +33 -33
- package/dist/{runGemini-owbvhFbi.mjs → runGemini-DhjK6_Fp.mjs} +33 -33
- package/dist/{runOpenClaw-Dky3-mjO.mjs → runOpenClaw-B6lawk8n.mjs} +18 -18
- package/dist/{runOpenClaw-DGeN66-t.cjs → runOpenClaw-BHIo8tkn.cjs} +18 -18
- package/dist/{sandbox-D2CPyoCA.cjs → sandbox-BAsO0ILe.cjs} +4 -4
- package/dist/{sandbox-sq_wy9Gl.mjs → sandbox-CKb7pCXg.mjs} +4 -4
- package/dist/selfCheck-CZ-t1Xzq.mjs +88 -0
- package/dist/{selfCheck-BgLvQKSt.cjs → selfCheck-D4VvVZNi.cjs} +39 -39
- package/dist/{send-Cd10YhXh.cjs → send-Cz5m39QR.cjs} +8 -8
- package/dist/{send-K9vg-8t-.mjs → send-D8ipLKMY.mjs} +8 -8
- package/dist/{server-De4W1zuK.mjs → server-CjvgT3N9.mjs} +4 -4
- package/dist/{server-DRrV64r0.cjs → server-CySyJKPH.cjs} +6 -6
- package/dist/{sessionLock-Dl6i7IgA.mjs → sessionLock-B73fhgQN.mjs} +3 -3
- package/dist/{sessionLock-BDtSzzKS.cjs → sessionLock-DdDCuNUs.cjs} +3 -3
- package/dist/{sessionOps-gU88-W9F.mjs → sessionOps-C65Iej_C.mjs} +50 -8
- package/dist/{sessionOps-DvnEH4PL.cjs → sessionOps-XSEjIqNq.cjs} +50 -8
- package/dist/{sessionProvider-CKcIo7KO.mjs → sessionProvider-CLVNkfji.mjs} +11 -9
- package/dist/{sessionProvider-CbSZeZrl.cjs → sessionProvider-Dgsty8z_.cjs} +11 -9
- package/dist/{sessionScanner-7RtcCeyD.cjs → sessionScanner-D8IVXMMH.cjs} +3 -3
- package/dist/{sessionScanner-DR32uSby.mjs → sessionScanner-MW1P9Pm9.mjs} +3 -3
- package/dist/{sessions-BvuMjgvJ.cjs → sessions-BKz7gZqg.cjs} +10 -10
- package/dist/{sessions-DTt2Eguk.mjs → sessions-Dtk_agUL.mjs} +10 -10
- package/dist/{setupOfflineReconnection-BGnvhRfb.mjs → setupOfflineReconnection-Bvdy-2xd.mjs} +2 -2
- package/dist/{setupOfflineReconnection-DduOsw6p.cjs → setupOfflineReconnection-DxMiW7OV.cjs} +2 -2
- package/dist/{spawn-DMB6rRPA.cjs → spawn-DiPkJcrQ.cjs} +26 -16
- package/dist/{spawn-CL3cUc7b.mjs → spawn-Dm4xsZBX.mjs} +26 -16
- package/dist/{spawnAgents-CClb7buD.cjs → spawnAgents-B9olJ8xn.cjs} +1 -1
- package/dist/{spawnAgents-CRMfOJhh.mjs → spawnAgents-I29H9nO8.mjs} +1 -1
- package/dist/{spawnHappyCLI-DJdhX_Qx.cjs → spawnHappyCLI-BYGOUda1.cjs} +1 -1
- package/dist/{spawnHappyCLI-Cj_6IICe.mjs → spawnHappyCLI-CnMwzjWX.mjs} +1 -1
- package/dist/{startFileWatcher-LnOmVW6H.cjs → startFileWatcher-D14W6gn-.cjs} +1 -1
- package/dist/{startFileWatcher-DikVa8kg.mjs → startFileWatcher-DePAY1T5.mjs} +1 -1
- package/dist/{startupSessionCreate-CDdaLaMq.mjs → startupSessionCreate-DoK0IvJG.mjs} +3 -3
- package/dist/{startupSessionCreate-B3ND-917.cjs → startupSessionCreate-rBHd4tc1.cjs} +3 -3
- package/dist/{store-DV__wCvP.cjs → store-CkNa6oj4.cjs} +46 -9
- package/dist/{store--XN-7MS0.mjs → store-Vej_738f.mjs} +46 -10
- package/dist/{streamRelay-DFdOaLOn.cjs → streamRelay-C0G1HOOd.cjs} +1 -1
- package/dist/{streamRelay-sABnxEXq.mjs → streamRelay-C5U-C4GS.mjs} +1 -1
- package/dist/{sync-JoEZKRo8.mjs → sync-BP6vnxVP.mjs} +1 -1
- package/dist/{sync-_2lsZ1U2.cjs → sync-WYBwkJvG.cjs} +1 -1
- package/dist/{systemPrompt-CJEvNCuW.cjs → systemPrompt-BkQlCk5_.cjs} +2 -2
- package/dist/{systemPrompt-Zq4HyrZ5.mjs → systemPrompt-aRqBmkpw.mjs} +2 -2
- package/dist/{teams-qz4LqKJ2.mjs → teams-CGmC4ygu.mjs} +7 -7
- package/dist/{teams-BNZafnrT.cjs → teams-phbpwAGD.cjs} +7 -7
- package/dist/{template-LgvBbOna.cjs → template-B9pLEP8v.cjs} +2 -2
- package/dist/{template-CJ8BWSsc.mjs → template-CL9EvQLQ.mjs} +2 -2
- package/dist/{time-CaUlWSNJ.cjs → time-BTLcO8jp.cjs} +1 -1
- package/dist/{time-bzmet4s5.mjs → time-Cw0liIqB.mjs} +1 -1
- package/dist/{titleGenerator-BuIIu_JP.cjs → titleGenerator-Y1_7ceJC.cjs} +3 -3
- package/dist/{titleGenerator-CbTtJ_1D.mjs → titleGenerator-h6TmFe-c.mjs} +2 -2
- package/dist/{todo-CQ_BTf9C.cjs → todo-BxiPiCvB.cjs} +6 -6
- package/dist/{todo-DIrVF_Ak.mjs → todo-OKcTC_VC.mjs} +6 -6
- package/dist/{tools-cLOjBvPn.mjs → tools-BR-drXZ8.mjs} +3 -2
- package/dist/{tools-BnmmFZji.cjs → tools-CcebYtLj.cjs} +3 -2
- package/dist/{uninstall-uEEGKB84.cjs → uninstall-CnDeCC-M.cjs} +3 -3
- package/dist/{uninstall-C5OuW6dE.mjs → uninstall-D3stWKD2.mjs} +3 -3
- package/dist/{wrapperAccount-DXlD3bsO.mjs → wrapperAccount-BkufO_9g.mjs} +5 -4
- package/dist/{wrapperAccount-DzoGqS2b.cjs → wrapperAccount-D2A4DuZy.cjs} +6 -3
- package/package.json +7 -7
- package/dist/selfCheck-vkfrgQ7X.mjs +0 -88
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { spawn } from 'node:child_process';
|
|
2
2
|
import { ndJsonStream, ClientSideConnection } from '@agentclientprotocol/sdk';
|
|
3
3
|
import { randomUUID } from 'node:crypto';
|
|
4
|
-
import { l as logger } from './logger-
|
|
5
|
-
import { d as delay } from './time-
|
|
4
|
+
import { l as logger } from './logger-JV7-4Q_6.mjs';
|
|
5
|
+
import { d as delay } from './time-Cw0liIqB.mjs';
|
|
6
6
|
import { c as contentLogMetadata, e as errorLogMetadata } from './contentLogMetadata-BlWI0egu.mjs';
|
|
7
7
|
import { r as readableStderrTail, a as appendStderrRing, s as stopProcessGracefully, k as killProcessTree } from './processTree-CP5IvQ2Z.mjs';
|
|
8
|
-
import { p as packageJson } from './package-
|
|
8
|
+
import { p as packageJson } from './package-Bw3H6VLn.mjs';
|
|
9
9
|
|
|
10
10
|
function acpImageBlocks(attachments, supportsImages) {
|
|
11
11
|
return attachments.filter((file) => ["image/jpeg", "image/png", "image/gif", "image/webp"].includes(file.mimeType)).map((file) => {
|
|
@@ -3,11 +3,11 @@
|
|
|
3
3
|
var node_child_process = require('node:child_process');
|
|
4
4
|
var sdk = require('@agentclientprotocol/sdk');
|
|
5
5
|
var node_crypto = require('node:crypto');
|
|
6
|
-
var logger = require('./logger-
|
|
7
|
-
var time = require('./time-
|
|
6
|
+
var logger = require('./logger-CX3x2eI4.cjs');
|
|
7
|
+
var time = require('./time-BTLcO8jp.cjs');
|
|
8
8
|
var contentLogMetadata = require('./contentLogMetadata-ZSFk_NjQ.cjs');
|
|
9
9
|
var processTree = require('./processTree-CMHWlVse.cjs');
|
|
10
|
-
var _package = require('./package-
|
|
10
|
+
var _package = require('./package-uzlvxa5S.cjs');
|
|
11
11
|
|
|
12
12
|
function acpImageBlocks(attachments, supportsImages) {
|
|
13
13
|
return attachments.filter((file) => ["image/jpeg", "image/png", "image/gif", "image/webp"].includes(file.mimeType)).map((file) => {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createId } from '@paralleldrive/cuid2';
|
|
2
|
-
import { s as streamKeyOf, k as createEnvelope } from './index-
|
|
3
|
-
import { t as textResultPayload, b as toolResultPayload } from './api-
|
|
2
|
+
import { s as streamKeyOf, k as createEnvelope } from './index-D1YnIih6.mjs';
|
|
3
|
+
import { t as textResultPayload, b as toolResultPayload } from './api-DUfunY3x.mjs';
|
|
4
4
|
|
|
5
5
|
function turnOptions(turnId, time) {
|
|
6
6
|
return turnId ? { turn: turnId, time } : { time };
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var cuid2 = require('@paralleldrive/cuid2');
|
|
4
|
-
var index = require('./index-
|
|
5
|
-
var api = require('./api-
|
|
4
|
+
var index = require('./index-BUFrKZeQ.cjs');
|
|
5
|
+
var api = require('./api-CBE_a88I.cjs');
|
|
6
6
|
|
|
7
7
|
function turnOptions(turnId, time) {
|
|
8
8
|
return turnId ? { turn: turnId, time } : { time };
|
|
@@ -1,25 +1,27 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
2
|
import { createInterface } from 'node:readline/promises';
|
|
3
|
-
import { c as configuration } from './configuration-
|
|
4
|
-
import { g as getDaemonAgentProfiles, r as restartDaemonSession, l as listDaemonSessions } from './controlClient-
|
|
5
|
-
import { A as AccountService, b as bindResultMessages, a as AccountError, l as localRestartFailure } from './accountService-
|
|
3
|
+
import { c as configuration } from './configuration-ThKBP_zY.mjs';
|
|
4
|
+
import { g as getDaemonAgentProfiles, r as restartDaemonSession, l as listDaemonSessions } from './controlClient-Ckl8N1MS.mjs';
|
|
5
|
+
import { A as AccountService, b as bindResultMessages, a as AccountError, l as localRestartFailure } from './accountService-Cd7bnkfd.mjs';
|
|
6
6
|
import 'node:fs';
|
|
7
7
|
import 'node:os';
|
|
8
8
|
import 'node:path';
|
|
9
|
-
import './package-
|
|
9
|
+
import './package-Bw3H6VLn.mjs';
|
|
10
10
|
import 'node:fs/promises';
|
|
11
|
-
import './logger-
|
|
11
|
+
import './logger-JV7-4Q_6.mjs';
|
|
12
12
|
import 'node:util';
|
|
13
|
-
import './persistence-
|
|
13
|
+
import './persistence-Cg4sfjQV.mjs';
|
|
14
14
|
import 'zod';
|
|
15
15
|
import './authRelay-DhQhkBvX.mjs';
|
|
16
16
|
import 'node:crypto';
|
|
17
17
|
import 'tweetnacl';
|
|
18
|
-
import './index-
|
|
18
|
+
import './index-D1YnIih6.mjs';
|
|
19
19
|
import '@paralleldrive/cuid2';
|
|
20
20
|
import 'node:child_process';
|
|
21
|
-
import './claudeAccountEnv-
|
|
22
|
-
import './store
|
|
21
|
+
import './claudeAccountEnv-BL1pR_37.mjs';
|
|
22
|
+
import './store-Vej_738f.mjs';
|
|
23
|
+
import './codexAccount-NOX5pmQf.mjs';
|
|
24
|
+
import 'node:readline';
|
|
23
25
|
|
|
24
26
|
const ACCOUNT_HELP = `Usage:
|
|
25
27
|
very-happy account list [--json]
|
|
@@ -27,10 +29,15 @@ const ACCOUNT_HELP = `Usage:
|
|
|
27
29
|
very-happy account login <id> sign an existing subscription account in again
|
|
28
30
|
very-happy account login --label <name> --token-stdin import a token from \`claude setup-token\`
|
|
29
31
|
very-happy account add --label <name> --base-url <url> (--key-file <path> | --key-env <VAR> | --key-stdin) [--model <id>[:<contextWindow>]]...
|
|
32
|
+
very-happy account login --agent codex [--label <name>] ChatGPT sign-in (device code) in its own Codex home
|
|
33
|
+
very-happy account login <id> sign an existing ChatGPT account in again
|
|
34
|
+
very-happy account add --agent codex --label <name> (--provider <config.toml id> | --base-url <url>) [--wire-api responses|chat]
|
|
35
|
+
(--key-file <path> | --key-env <VAR> | --key-stdin) [--model <id>]...
|
|
36
|
+
Codex API provider; the key reaches only sessions bound to it
|
|
30
37
|
very-happy account test <id>
|
|
31
38
|
very-happy account rename <id> <label>
|
|
32
39
|
very-happy account rm <id> [--force]
|
|
33
|
-
very-happy account default <id|machine>
|
|
40
|
+
very-happy account default <id|machine> [--agent codex] account new Claude (or Codex) sessions on this machine start on
|
|
34
41
|
very-happy account bind <sessionId> <id|machine> [--model <id>] [--no-restart]
|
|
35
42
|
|
|
36
43
|
Accounts belong to THIS machine: tokens and keys stay in $HAPPY_HOME_DIR
|
|
@@ -42,7 +49,7 @@ function parseAccountArgs(args) {
|
|
|
42
49
|
const flags = /* @__PURE__ */ new Map();
|
|
43
50
|
const bools = /* @__PURE__ */ new Set();
|
|
44
51
|
const positional = [];
|
|
45
|
-
const valued = /* @__PURE__ */ new Set(["--label", "--base-url", "--key-file", "--key-env", "--model"]);
|
|
52
|
+
const valued = /* @__PURE__ */ new Set(["--label", "--base-url", "--key-file", "--key-env", "--model", "--agent", "--provider", "--wire-api"]);
|
|
46
53
|
for (let i = 0; i < rest.length; i++) {
|
|
47
54
|
const arg = rest[i];
|
|
48
55
|
if (arg === "-h" || arg === "--help") return { action: "help" };
|
|
@@ -61,21 +68,34 @@ function parseAccountArgs(args) {
|
|
|
61
68
|
for (const f of flags.keys()) if (!names.includes(f)) throw new Error(`unknown option ${f}`);
|
|
62
69
|
};
|
|
63
70
|
const machineOr = (id) => id === "machine" || id === "default" ? null : id;
|
|
71
|
+
const agentFlag = () => {
|
|
72
|
+
const agent = one("--agent") ?? "claude";
|
|
73
|
+
if (agent !== "claude" && agent !== "codex") throw new Error("--agent must be claude or codex");
|
|
74
|
+
return agent;
|
|
75
|
+
};
|
|
64
76
|
switch (sub) {
|
|
65
77
|
case "list":
|
|
66
78
|
case "ls":
|
|
67
79
|
allowed(["--json"]);
|
|
68
80
|
return { action: "list", json: bools.has("--json") };
|
|
69
|
-
case "login":
|
|
70
|
-
allowed(["--label", "--token-stdin"]);
|
|
81
|
+
case "login": {
|
|
82
|
+
allowed(["--label", "--token-stdin", "--agent"]);
|
|
83
|
+
const agent = agentFlag();
|
|
71
84
|
if (positional.length > 1) throw new Error("login takes at most one account id");
|
|
72
|
-
if (!positional[0] && !one("--label")) throw new Error("login needs --label <name> (new account) or an account id (sign in again)");
|
|
73
|
-
|
|
85
|
+
if (agent === "claude" && !positional[0] && !one("--label")) throw new Error("login needs --label <name> (new account) or an account id (sign in again)");
|
|
86
|
+
if (agent === "codex" && bools.has("--token-stdin")) throw new Error("--token-stdin is for Claude accounts");
|
|
87
|
+
return { action: "login", agent, ...positional[0] ? { accountId: positional[0] } : {}, ...one("--label") ? { label: one("--label") } : {}, tokenStdin: bools.has("--token-stdin") };
|
|
88
|
+
}
|
|
74
89
|
case "add": {
|
|
75
|
-
allowed(["--label", "--base-url", "--key-file", "--key-env", "--key-stdin", "--model"]);
|
|
90
|
+
allowed(["--label", "--base-url", "--key-file", "--key-env", "--key-stdin", "--model", "--agent", "--provider", "--wire-api"]);
|
|
91
|
+
const agent = agentFlag();
|
|
76
92
|
const label = one("--label");
|
|
77
93
|
const baseUrl = one("--base-url");
|
|
78
|
-
|
|
94
|
+
const provider = one("--provider");
|
|
95
|
+
const wireApi = one("--wire-api");
|
|
96
|
+
if (agent === "claude" && (provider || wireApi)) throw new Error("--provider / --wire-api are for Codex accounts (--agent codex)");
|
|
97
|
+
if (wireApi && wireApi !== "responses" && wireApi !== "chat") throw new Error("--wire-api must be responses or chat");
|
|
98
|
+
if (!label || !baseUrl && !provider) throw new Error(agent === "codex" ? "add --agent codex needs --label and --provider or --base-url" : "add needs --label and --base-url");
|
|
79
99
|
const sources = [one("--key-file") !== void 0, one("--key-env") !== void 0, bools.has("--key-stdin")].filter(Boolean).length;
|
|
80
100
|
if (sources !== 1) throw new Error("add needs exactly one of --key-file, --key-env, --key-stdin");
|
|
81
101
|
const key = one("--key-file") !== void 0 ? { source: "file", path: one("--key-file") } : one("--key-env") !== void 0 ? { source: "env", name: one("--key-env") } : { source: "stdin" };
|
|
@@ -83,7 +103,7 @@ function parseAccountArgs(args) {
|
|
|
83
103
|
const match = m.match(/^(.+):(\d+)$/);
|
|
84
104
|
return match ? { id: match[1], contextWindow: Number(match[2]) } : m;
|
|
85
105
|
});
|
|
86
|
-
return { action: "add", label, baseUrl, key, models };
|
|
106
|
+
return { action: "add", agent, label, ...baseUrl ? { baseUrl } : {}, ...provider ? { provider } : {}, ...wireApi ? { wireApi } : {}, key, models };
|
|
87
107
|
}
|
|
88
108
|
case "test":
|
|
89
109
|
case "rm":
|
|
@@ -96,9 +116,9 @@ function parseAccountArgs(args) {
|
|
|
96
116
|
if (positional.length !== 2) throw new Error("rename needs <id> <label>");
|
|
97
117
|
return { action: "rename", accountId: positional[0], label: positional[1] };
|
|
98
118
|
case "default":
|
|
99
|
-
allowed([]);
|
|
119
|
+
allowed(["--agent"]);
|
|
100
120
|
if (positional.length !== 1) throw new Error("default needs <id|machine>");
|
|
101
|
-
return { action: "default", accountId: machineOr(positional[0]) };
|
|
121
|
+
return { action: "default", accountId: machineOr(positional[0]), ...one("--agent") ? { agent: agentFlag() } : {} };
|
|
102
122
|
case "bind":
|
|
103
123
|
allowed(["--model", "--no-restart"]);
|
|
104
124
|
if (positional.length !== 2) throw new Error("bind needs <sessionId> <id|machine>");
|
|
@@ -108,8 +128,10 @@ function parseAccountArgs(args) {
|
|
|
108
128
|
}
|
|
109
129
|
}
|
|
110
130
|
function formatAccountLine(a, isDefault, now) {
|
|
111
|
-
const kind =
|
|
131
|
+
const kind = { "claude-subscription": "subscription", "claude-api": "api", "codex-chatgpt": "codex chatgpt", "codex-provider": "codex provider" }[a.kind] ?? a.kind;
|
|
112
132
|
const extra = [];
|
|
133
|
+
if (a.email) extra.push(a.email + (a.planType ? ` (${a.planType})` : ""));
|
|
134
|
+
if (a.provider) extra.push(`provider: ${a.provider}`);
|
|
113
135
|
if (a.baseUrl) extra.push(a.baseUrl);
|
|
114
136
|
if (a.models?.length) extra.push(`models: ${a.models.join(", ")}`);
|
|
115
137
|
if (a.keySource === "file" || a.keySource === "env") extra.push(`key: ${a.keySource} ${a.keyRef ?? ""}`.trim());
|
|
@@ -130,8 +152,38 @@ async function restartOutcome(sessionId) {
|
|
|
130
152
|
const stillRunning = await listDaemonSessions().then((children) => children.some((c) => c?.happySessionId === sessionId), () => false);
|
|
131
153
|
return localRestartFailure(error, stillRunning);
|
|
132
154
|
}
|
|
155
|
+
async function loginCodexInteractive(target) {
|
|
156
|
+
const svc = new AccountService({ home: configuration.happyHomeDir });
|
|
157
|
+
try {
|
|
158
|
+
const started = await svc.loginStart({ agent: "codex", kind: "codex-chatgpt", ...target });
|
|
159
|
+
if (started.state !== "waiting-code" || !started.url || !started.userCode) throw new Error(started.error ?? "codex did not return a device code");
|
|
160
|
+
console.log(`Open ${started.url} , sign in to ChatGPT and enter this code:
|
|
161
|
+
|
|
162
|
+
${started.userCode}
|
|
163
|
+
|
|
164
|
+
Waiting (expires in 15 minutes; Ctrl-C to cancel)\u2026`);
|
|
165
|
+
const cancel = () => {
|
|
166
|
+
svc.loginCancel(started.loginId);
|
|
167
|
+
};
|
|
168
|
+
process.once("SIGINT", cancel);
|
|
169
|
+
try {
|
|
170
|
+
for (; ; ) {
|
|
171
|
+
await new Promise((r) => setTimeout(r, 1e3));
|
|
172
|
+
const status = svc.loginStatus(started.loginId);
|
|
173
|
+
if (status.state === "waiting-code" || status.state === "starting") continue;
|
|
174
|
+
if (status.state === "succeeded" && status.account) return status.account;
|
|
175
|
+
throw new Error(status.error ?? `sign-in ${status.state}`);
|
|
176
|
+
}
|
|
177
|
+
} finally {
|
|
178
|
+
process.off("SIGINT", cancel);
|
|
179
|
+
}
|
|
180
|
+
} finally {
|
|
181
|
+
await svc.settleLogins();
|
|
182
|
+
svc.dispose();
|
|
183
|
+
}
|
|
184
|
+
}
|
|
133
185
|
async function loginInteractive(target) {
|
|
134
|
-
const { spawnSetupTokenPty } = await import('./daemonAccounts-
|
|
186
|
+
const { spawnSetupTokenPty } = await import('./daemonAccounts-DwPwKxvv.mjs');
|
|
135
187
|
const { homedir } = await import('node:os');
|
|
136
188
|
const svc = new AccountService({ home: configuration.happyHomeDir, spawnPty: (env) => spawnSetupTokenPty(homedir(), env) });
|
|
137
189
|
const started = await svc.loginStart({ agent: "claude", kind: "claude-subscription", ...target });
|
|
@@ -189,13 +241,15 @@ async function handleAccountCommand(args) {
|
|
|
189
241
|
}
|
|
190
242
|
case "login": {
|
|
191
243
|
const target = { ...parsed.accountId ? { accountId: parsed.accountId } : {}, ...parsed.label ? { label: parsed.label } : {} };
|
|
192
|
-
const
|
|
244
|
+
const existing = parsed.accountId ? service.state().accounts.find((a) => a.id === parsed.accountId) : void 0;
|
|
245
|
+
const codex = parsed.agent === "codex" || existing?.agent === "codex";
|
|
246
|
+
const account = codex ? await loginCodexInteractive(target) : parsed.tokenStdin ? service.storeSubscriptionToken(await readStdin(), target) : await loginInteractive(target);
|
|
193
247
|
console.log(`Signed in: ${account.id} (${account.label}).`);
|
|
194
248
|
return;
|
|
195
249
|
}
|
|
196
250
|
case "add": {
|
|
197
251
|
const key = parsed.key.source === "stdin" ? { source: "paste", value: await readStdin() } : parsed.key;
|
|
198
|
-
const account = await service.add({ agent: "claude", kind: "claude-api", label: parsed.label, baseUrl: parsed.baseUrl, key, ...parsed.models.length ? { models: parsed.models } : {} });
|
|
252
|
+
const account = parsed.agent === "codex" ? await service.add({ agent: "codex", kind: "codex-provider", label: parsed.label, ...parsed.baseUrl ? { baseUrl: parsed.baseUrl } : {}, ...parsed.provider ? { provider: parsed.provider } : {}, ...parsed.wireApi ? { wireApi: parsed.wireApi } : {}, key, ...parsed.models.length ? { models: parsed.models } : {} }) : await service.add({ agent: "claude", kind: "claude-api", label: parsed.label, baseUrl: parsed.baseUrl, key, ...parsed.models.length ? { models: parsed.models } : {} });
|
|
199
253
|
console.log(formatAccountLine(account, false, Date.now()));
|
|
200
254
|
return;
|
|
201
255
|
}
|
|
@@ -214,10 +268,13 @@ async function handleAccountCommand(args) {
|
|
|
214
268
|
for (const [sessionId, outcome] of Object.entries(restarts ?? {})) if (outcome !== "done") console.log(chalk.dim(` ${sessionId}: restart ${outcome}`));
|
|
215
269
|
return;
|
|
216
270
|
}
|
|
217
|
-
case "default":
|
|
218
|
-
service.
|
|
219
|
-
|
|
271
|
+
case "default": {
|
|
272
|
+
const agent = parsed.agent ?? (parsed.accountId ? service.state().accounts.find((a) => a.id === parsed.accountId)?.agent : void 0) ?? "claude";
|
|
273
|
+
service.setDefault(agent, parsed.accountId);
|
|
274
|
+
const name = agent === "codex" ? "Codex" : "Claude";
|
|
275
|
+
console.log(parsed.accountId ? `New ${name} sessions on this machine start on ${parsed.accountId}.` : `New ${name} sessions on this machine use the machine login.`);
|
|
220
276
|
return;
|
|
277
|
+
}
|
|
221
278
|
case "bind": {
|
|
222
279
|
const result = await service.bind({ sessionId: parsed.sessionId, accountId: parsed.accountId, ...parsed.model ? { model: parsed.model } : {}, restart: parsed.restart });
|
|
223
280
|
const shown = bindResultMessages(result, parsed.sessionId, `${parsed.accountId ?? "machine login"}${parsed.model ? ` / ${parsed.model}` : ""}`, "account");
|
|
@@ -2,26 +2,28 @@
|
|
|
2
2
|
|
|
3
3
|
var chalk = require('chalk');
|
|
4
4
|
var promises = require('node:readline/promises');
|
|
5
|
-
var configuration = require('./configuration-
|
|
6
|
-
var controlClient = require('./controlClient-
|
|
7
|
-
var accountService = require('./accountService-
|
|
5
|
+
var configuration = require('./configuration-BBK0rmmj.cjs');
|
|
6
|
+
var controlClient = require('./controlClient-DwWTns3A.cjs');
|
|
7
|
+
var accountService = require('./accountService-CuUSJDhP.cjs');
|
|
8
8
|
require('node:fs');
|
|
9
9
|
require('node:os');
|
|
10
10
|
require('node:path');
|
|
11
|
-
require('./package-
|
|
11
|
+
require('./package-uzlvxa5S.cjs');
|
|
12
12
|
require('node:fs/promises');
|
|
13
|
-
require('./logger-
|
|
13
|
+
require('./logger-CX3x2eI4.cjs');
|
|
14
14
|
require('node:util');
|
|
15
|
-
require('./persistence-
|
|
15
|
+
require('./persistence-CsmAgN-C.cjs');
|
|
16
16
|
require('zod');
|
|
17
17
|
require('./authRelay-Dy1qU9td.cjs');
|
|
18
18
|
require('node:crypto');
|
|
19
19
|
require('tweetnacl');
|
|
20
|
-
require('./index-
|
|
20
|
+
require('./index-BUFrKZeQ.cjs');
|
|
21
21
|
require('@paralleldrive/cuid2');
|
|
22
22
|
require('node:child_process');
|
|
23
|
-
require('./claudeAccountEnv-
|
|
24
|
-
require('./store-
|
|
23
|
+
require('./claudeAccountEnv-CEX_EMZr.cjs');
|
|
24
|
+
require('./store-CkNa6oj4.cjs');
|
|
25
|
+
require('./codexAccount-BDQjRbtI.cjs');
|
|
26
|
+
require('node:readline');
|
|
25
27
|
|
|
26
28
|
const ACCOUNT_HELP = `Usage:
|
|
27
29
|
very-happy account list [--json]
|
|
@@ -29,10 +31,15 @@ const ACCOUNT_HELP = `Usage:
|
|
|
29
31
|
very-happy account login <id> sign an existing subscription account in again
|
|
30
32
|
very-happy account login --label <name> --token-stdin import a token from \`claude setup-token\`
|
|
31
33
|
very-happy account add --label <name> --base-url <url> (--key-file <path> | --key-env <VAR> | --key-stdin) [--model <id>[:<contextWindow>]]...
|
|
34
|
+
very-happy account login --agent codex [--label <name>] ChatGPT sign-in (device code) in its own Codex home
|
|
35
|
+
very-happy account login <id> sign an existing ChatGPT account in again
|
|
36
|
+
very-happy account add --agent codex --label <name> (--provider <config.toml id> | --base-url <url>) [--wire-api responses|chat]
|
|
37
|
+
(--key-file <path> | --key-env <VAR> | --key-stdin) [--model <id>]...
|
|
38
|
+
Codex API provider; the key reaches only sessions bound to it
|
|
32
39
|
very-happy account test <id>
|
|
33
40
|
very-happy account rename <id> <label>
|
|
34
41
|
very-happy account rm <id> [--force]
|
|
35
|
-
very-happy account default <id|machine>
|
|
42
|
+
very-happy account default <id|machine> [--agent codex] account new Claude (or Codex) sessions on this machine start on
|
|
36
43
|
very-happy account bind <sessionId> <id|machine> [--model <id>] [--no-restart]
|
|
37
44
|
|
|
38
45
|
Accounts belong to THIS machine: tokens and keys stay in $HAPPY_HOME_DIR
|
|
@@ -44,7 +51,7 @@ function parseAccountArgs(args) {
|
|
|
44
51
|
const flags = /* @__PURE__ */ new Map();
|
|
45
52
|
const bools = /* @__PURE__ */ new Set();
|
|
46
53
|
const positional = [];
|
|
47
|
-
const valued = /* @__PURE__ */ new Set(["--label", "--base-url", "--key-file", "--key-env", "--model"]);
|
|
54
|
+
const valued = /* @__PURE__ */ new Set(["--label", "--base-url", "--key-file", "--key-env", "--model", "--agent", "--provider", "--wire-api"]);
|
|
48
55
|
for (let i = 0; i < rest.length; i++) {
|
|
49
56
|
const arg = rest[i];
|
|
50
57
|
if (arg === "-h" || arg === "--help") return { action: "help" };
|
|
@@ -63,21 +70,34 @@ function parseAccountArgs(args) {
|
|
|
63
70
|
for (const f of flags.keys()) if (!names.includes(f)) throw new Error(`unknown option ${f}`);
|
|
64
71
|
};
|
|
65
72
|
const machineOr = (id) => id === "machine" || id === "default" ? null : id;
|
|
73
|
+
const agentFlag = () => {
|
|
74
|
+
const agent = one("--agent") ?? "claude";
|
|
75
|
+
if (agent !== "claude" && agent !== "codex") throw new Error("--agent must be claude or codex");
|
|
76
|
+
return agent;
|
|
77
|
+
};
|
|
66
78
|
switch (sub) {
|
|
67
79
|
case "list":
|
|
68
80
|
case "ls":
|
|
69
81
|
allowed(["--json"]);
|
|
70
82
|
return { action: "list", json: bools.has("--json") };
|
|
71
|
-
case "login":
|
|
72
|
-
allowed(["--label", "--token-stdin"]);
|
|
83
|
+
case "login": {
|
|
84
|
+
allowed(["--label", "--token-stdin", "--agent"]);
|
|
85
|
+
const agent = agentFlag();
|
|
73
86
|
if (positional.length > 1) throw new Error("login takes at most one account id");
|
|
74
|
-
if (!positional[0] && !one("--label")) throw new Error("login needs --label <name> (new account) or an account id (sign in again)");
|
|
75
|
-
|
|
87
|
+
if (agent === "claude" && !positional[0] && !one("--label")) throw new Error("login needs --label <name> (new account) or an account id (sign in again)");
|
|
88
|
+
if (agent === "codex" && bools.has("--token-stdin")) throw new Error("--token-stdin is for Claude accounts");
|
|
89
|
+
return { action: "login", agent, ...positional[0] ? { accountId: positional[0] } : {}, ...one("--label") ? { label: one("--label") } : {}, tokenStdin: bools.has("--token-stdin") };
|
|
90
|
+
}
|
|
76
91
|
case "add": {
|
|
77
|
-
allowed(["--label", "--base-url", "--key-file", "--key-env", "--key-stdin", "--model"]);
|
|
92
|
+
allowed(["--label", "--base-url", "--key-file", "--key-env", "--key-stdin", "--model", "--agent", "--provider", "--wire-api"]);
|
|
93
|
+
const agent = agentFlag();
|
|
78
94
|
const label = one("--label");
|
|
79
95
|
const baseUrl = one("--base-url");
|
|
80
|
-
|
|
96
|
+
const provider = one("--provider");
|
|
97
|
+
const wireApi = one("--wire-api");
|
|
98
|
+
if (agent === "claude" && (provider || wireApi)) throw new Error("--provider / --wire-api are for Codex accounts (--agent codex)");
|
|
99
|
+
if (wireApi && wireApi !== "responses" && wireApi !== "chat") throw new Error("--wire-api must be responses or chat");
|
|
100
|
+
if (!label || !baseUrl && !provider) throw new Error(agent === "codex" ? "add --agent codex needs --label and --provider or --base-url" : "add needs --label and --base-url");
|
|
81
101
|
const sources = [one("--key-file") !== void 0, one("--key-env") !== void 0, bools.has("--key-stdin")].filter(Boolean).length;
|
|
82
102
|
if (sources !== 1) throw new Error("add needs exactly one of --key-file, --key-env, --key-stdin");
|
|
83
103
|
const key = one("--key-file") !== void 0 ? { source: "file", path: one("--key-file") } : one("--key-env") !== void 0 ? { source: "env", name: one("--key-env") } : { source: "stdin" };
|
|
@@ -85,7 +105,7 @@ function parseAccountArgs(args) {
|
|
|
85
105
|
const match = m.match(/^(.+):(\d+)$/);
|
|
86
106
|
return match ? { id: match[1], contextWindow: Number(match[2]) } : m;
|
|
87
107
|
});
|
|
88
|
-
return { action: "add", label, baseUrl, key, models };
|
|
108
|
+
return { action: "add", agent, label, ...baseUrl ? { baseUrl } : {}, ...provider ? { provider } : {}, ...wireApi ? { wireApi } : {}, key, models };
|
|
89
109
|
}
|
|
90
110
|
case "test":
|
|
91
111
|
case "rm":
|
|
@@ -98,9 +118,9 @@ function parseAccountArgs(args) {
|
|
|
98
118
|
if (positional.length !== 2) throw new Error("rename needs <id> <label>");
|
|
99
119
|
return { action: "rename", accountId: positional[0], label: positional[1] };
|
|
100
120
|
case "default":
|
|
101
|
-
allowed([]);
|
|
121
|
+
allowed(["--agent"]);
|
|
102
122
|
if (positional.length !== 1) throw new Error("default needs <id|machine>");
|
|
103
|
-
return { action: "default", accountId: machineOr(positional[0]) };
|
|
123
|
+
return { action: "default", accountId: machineOr(positional[0]), ...one("--agent") ? { agent: agentFlag() } : {} };
|
|
104
124
|
case "bind":
|
|
105
125
|
allowed(["--model", "--no-restart"]);
|
|
106
126
|
if (positional.length !== 2) throw new Error("bind needs <sessionId> <id|machine>");
|
|
@@ -110,8 +130,10 @@ function parseAccountArgs(args) {
|
|
|
110
130
|
}
|
|
111
131
|
}
|
|
112
132
|
function formatAccountLine(a, isDefault, now) {
|
|
113
|
-
const kind =
|
|
133
|
+
const kind = { "claude-subscription": "subscription", "claude-api": "api", "codex-chatgpt": "codex chatgpt", "codex-provider": "codex provider" }[a.kind] ?? a.kind;
|
|
114
134
|
const extra = [];
|
|
135
|
+
if (a.email) extra.push(a.email + (a.planType ? ` (${a.planType})` : ""));
|
|
136
|
+
if (a.provider) extra.push(`provider: ${a.provider}`);
|
|
115
137
|
if (a.baseUrl) extra.push(a.baseUrl);
|
|
116
138
|
if (a.models?.length) extra.push(`models: ${a.models.join(", ")}`);
|
|
117
139
|
if (a.keySource === "file" || a.keySource === "env") extra.push(`key: ${a.keySource} ${a.keyRef ?? ""}`.trim());
|
|
@@ -132,8 +154,38 @@ async function restartOutcome(sessionId) {
|
|
|
132
154
|
const stillRunning = await controlClient.listDaemonSessions().then((children) => children.some((c) => c?.happySessionId === sessionId), () => false);
|
|
133
155
|
return accountService.localRestartFailure(error, stillRunning);
|
|
134
156
|
}
|
|
157
|
+
async function loginCodexInteractive(target) {
|
|
158
|
+
const svc = new accountService.AccountService({ home: configuration.configuration.happyHomeDir });
|
|
159
|
+
try {
|
|
160
|
+
const started = await svc.loginStart({ agent: "codex", kind: "codex-chatgpt", ...target });
|
|
161
|
+
if (started.state !== "waiting-code" || !started.url || !started.userCode) throw new Error(started.error ?? "codex did not return a device code");
|
|
162
|
+
console.log(`Open ${started.url} , sign in to ChatGPT and enter this code:
|
|
163
|
+
|
|
164
|
+
${started.userCode}
|
|
165
|
+
|
|
166
|
+
Waiting (expires in 15 minutes; Ctrl-C to cancel)\u2026`);
|
|
167
|
+
const cancel = () => {
|
|
168
|
+
svc.loginCancel(started.loginId);
|
|
169
|
+
};
|
|
170
|
+
process.once("SIGINT", cancel);
|
|
171
|
+
try {
|
|
172
|
+
for (; ; ) {
|
|
173
|
+
await new Promise((r) => setTimeout(r, 1e3));
|
|
174
|
+
const status = svc.loginStatus(started.loginId);
|
|
175
|
+
if (status.state === "waiting-code" || status.state === "starting") continue;
|
|
176
|
+
if (status.state === "succeeded" && status.account) return status.account;
|
|
177
|
+
throw new Error(status.error ?? `sign-in ${status.state}`);
|
|
178
|
+
}
|
|
179
|
+
} finally {
|
|
180
|
+
process.off("SIGINT", cancel);
|
|
181
|
+
}
|
|
182
|
+
} finally {
|
|
183
|
+
await svc.settleLogins();
|
|
184
|
+
svc.dispose();
|
|
185
|
+
}
|
|
186
|
+
}
|
|
135
187
|
async function loginInteractive(target) {
|
|
136
|
-
const { spawnSetupTokenPty } = await Promise.resolve().then(function () { return require('./daemonAccounts-
|
|
188
|
+
const { spawnSetupTokenPty } = await Promise.resolve().then(function () { return require('./daemonAccounts-CpGDY_4k.cjs'); });
|
|
137
189
|
const { homedir } = await import('node:os');
|
|
138
190
|
const svc = new accountService.AccountService({ home: configuration.configuration.happyHomeDir, spawnPty: (env) => spawnSetupTokenPty(homedir(), env) });
|
|
139
191
|
const started = await svc.loginStart({ agent: "claude", kind: "claude-subscription", ...target });
|
|
@@ -191,13 +243,15 @@ async function handleAccountCommand(args) {
|
|
|
191
243
|
}
|
|
192
244
|
case "login": {
|
|
193
245
|
const target = { ...parsed.accountId ? { accountId: parsed.accountId } : {}, ...parsed.label ? { label: parsed.label } : {} };
|
|
194
|
-
const
|
|
246
|
+
const existing = parsed.accountId ? service.state().accounts.find((a) => a.id === parsed.accountId) : void 0;
|
|
247
|
+
const codex = parsed.agent === "codex" || existing?.agent === "codex";
|
|
248
|
+
const account = codex ? await loginCodexInteractive(target) : parsed.tokenStdin ? service.storeSubscriptionToken(await readStdin(), target) : await loginInteractive(target);
|
|
195
249
|
console.log(`Signed in: ${account.id} (${account.label}).`);
|
|
196
250
|
return;
|
|
197
251
|
}
|
|
198
252
|
case "add": {
|
|
199
253
|
const key = parsed.key.source === "stdin" ? { source: "paste", value: await readStdin() } : parsed.key;
|
|
200
|
-
const account = await service.add({ agent: "claude", kind: "claude-api", label: parsed.label, baseUrl: parsed.baseUrl, key, ...parsed.models.length ? { models: parsed.models } : {} });
|
|
254
|
+
const account = parsed.agent === "codex" ? await service.add({ agent: "codex", kind: "codex-provider", label: parsed.label, ...parsed.baseUrl ? { baseUrl: parsed.baseUrl } : {}, ...parsed.provider ? { provider: parsed.provider } : {}, ...parsed.wireApi ? { wireApi: parsed.wireApi } : {}, key, ...parsed.models.length ? { models: parsed.models } : {} }) : await service.add({ agent: "claude", kind: "claude-api", label: parsed.label, baseUrl: parsed.baseUrl, key, ...parsed.models.length ? { models: parsed.models } : {} });
|
|
201
255
|
console.log(formatAccountLine(account, false, Date.now()));
|
|
202
256
|
return;
|
|
203
257
|
}
|
|
@@ -216,10 +270,13 @@ async function handleAccountCommand(args) {
|
|
|
216
270
|
for (const [sessionId, outcome] of Object.entries(restarts ?? {})) if (outcome !== "done") console.log(chalk.dim(` ${sessionId}: restart ${outcome}`));
|
|
217
271
|
return;
|
|
218
272
|
}
|
|
219
|
-
case "default":
|
|
220
|
-
service.
|
|
221
|
-
|
|
273
|
+
case "default": {
|
|
274
|
+
const agent = parsed.agent ?? (parsed.accountId ? service.state().accounts.find((a) => a.id === parsed.accountId)?.agent : void 0) ?? "claude";
|
|
275
|
+
service.setDefault(agent, parsed.accountId);
|
|
276
|
+
const name = agent === "codex" ? "Codex" : "Claude";
|
|
277
|
+
console.log(parsed.accountId ? `New ${name} sessions on this machine start on ${parsed.accountId}.` : `New ${name} sessions on this machine use the machine login.`);
|
|
222
278
|
return;
|
|
279
|
+
}
|
|
223
280
|
case "bind": {
|
|
224
281
|
const result = await service.bind({ sessionId: parsed.sessionId, accountId: parsed.accountId, ...parsed.model ? { model: parsed.model } : {}, restart: parsed.restart });
|
|
225
282
|
const shown = accountService.bindResultMessages(result, parsed.sessionId, `${parsed.accountId ?? "machine login"}${parsed.model ? ` / ${parsed.model}` : ""}`, "account");
|