very-happy-cli 0.2.192 → 0.2.194

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.
Files changed (210) hide show
  1. package/dist/{AcpBackend-CGHTDJd9.mjs → AcpBackend-C3Kx0QJb.mjs} +3 -3
  2. package/dist/{AcpBackend-BQO4ShOy.cjs → AcpBackend-DJzsue14.cjs} +3 -3
  3. package/dist/{AcpSessionManager-LlUMmcpB.cjs → AcpSessionManager-Bc3iafB1.cjs} +2 -2
  4. package/dist/{AcpSessionManager-G0xD6Jbq.mjs → AcpSessionManager-SteuoqMY.mjs} +2 -2
  5. package/dist/{BasePermissionHandler-BmTIg376.mjs → BasePermissionHandler-D2pNcAXn.mjs} +1 -1
  6. package/dist/{BasePermissionHandler-N6Ip3tFt.cjs → BasePermissionHandler-DKzNFVCh.cjs} +1 -1
  7. package/dist/{account-DtaouikP.cjs → account-ByVjlvFj.cjs} +84 -27
  8. package/dist/{account-CCVT-HO_.mjs → account-DC2YyU24.mjs} +84 -27
  9. package/dist/{accountService-Dd9uqde2.mjs → accountService-Cd7bnkfd.mjs} +369 -19
  10. package/dist/{accountService-Bddy0zwL.cjs → accountService-CuUSJDhP.cjs} +369 -19
  11. package/dist/{acpSessionResume-BWEUxNtC.mjs → acpSessionResume-B6VClxKQ.mjs} +1 -1
  12. package/dist/{acpSessionResume-BnHDk5eD.cjs → acpSessionResume-DHHgbNnk.cjs} +1 -1
  13. package/dist/{agentHome-B0VnjkZW.mjs → agentHome-9caXwo7k.mjs} +4 -4
  14. package/dist/{agentHome-CqQ29YY7.cjs → agentHome-Bov1aHYS.cjs} +4 -4
  15. package/dist/{api-_LeBScjg.mjs → api-aE60mNjs.mjs} +10 -10
  16. package/dist/{api-hMDsC6Wg.cjs → api-wYwQCJml.cjs} +10 -10
  17. package/dist/{apiMachine-CgRldeJ6.mjs → apiMachine-CvNB38Xg.mjs} +36 -19
  18. package/dist/{apiMachine-CqW2m6Zr.cjs → apiMachine-DwaqfM9Q.cjs} +36 -19
  19. package/dist/{attachmentContent-CyptLIfq.mjs → attachmentContent-C2ymY_-w.mjs} +2 -2
  20. package/dist/{attachmentContent-BEeT2J5n.cjs → attachmentContent-DB8ZsxGE.cjs} +2 -2
  21. package/dist/{auth-CFQikywl.mjs → auth-BYtmGgE1.mjs} +8 -8
  22. package/dist/{auth-CA1OClsW.cjs → auth-Bce0Zk3q.cjs} +8 -8
  23. package/dist/{auth-DL8_J9vu.mjs → auth-CWO6cQ4G.mjs} +5 -5
  24. package/dist/{auth-C9NvNHhL.cjs → auth-boIcb7iq.cjs} +5 -5
  25. package/dist/{auto-uQOxlxLp.cjs → auto-AaggdihK.cjs} +24 -22
  26. package/dist/{auto-CKI05w1D.mjs → auto-B-kopWQx.mjs} +24 -22
  27. package/dist/{bootstrap-DaZ0Np7X.mjs → bootstrap-CiWwfHB2.mjs} +2 -2
  28. package/dist/{bootstrap-DsZGc69k.cjs → bootstrap-kywZ0tvD.cjs} +2 -2
  29. package/dist/{browser-BUIaSHK2.mjs → browser-CFfZM3yg.mjs} +1 -1
  30. package/dist/{browser-Ft0ASDm7.cjs → browser-Do2MFdq6.cjs} +1 -1
  31. package/dist/{claudeAccountEnv-ON24i0qv.mjs → claudeAccountEnv-BL1pR_37.mjs} +2 -1
  32. package/dist/{claudeAccountEnv-BOBpJ3k8.cjs → claudeAccountEnv-CEX_EMZr.cjs} +2 -1
  33. package/dist/{claudeLocal-B1ZVtryl.mjs → claudeLocal-B47NjZfB.mjs} +5 -5
  34. package/dist/{claudeLocal-BMf9t4Fa.cjs → claudeLocal-DLd8ogcH.cjs} +5 -5
  35. package/dist/{claudeLocalLauncher-Bp8bqF4y.mjs → claudeLocalLauncher-5DDuHpCD.mjs} +10 -10
  36. package/dist/{claudeLocalLauncher-C8TeJcfF.cjs → claudeLocalLauncher-D_UTQ4o_.cjs} +10 -10
  37. package/dist/{claudeSessionFork-YiktY55n.cjs → claudeSessionFork-4g6-Sk3Q.cjs} +104 -38
  38. package/dist/{claudeSessionFork-8AA47z8Y.mjs → claudeSessionFork-BrJTncNL.mjs} +105 -40
  39. package/dist/{client-Crh8_cNx.cjs → client-BIg2LPVx.cjs} +2 -2
  40. package/dist/{client-CFHZfh9x.cjs → client-BfDga3xi.cjs} +4 -4
  41. package/dist/{client-Bm4oKvW7.mjs → client-Cbxr9VUE.mjs} +4 -2
  42. package/dist/{client-D8XROyZc.cjs → client-CsfPUxLy.cjs} +4 -2
  43. package/dist/{client-BmPaBnDK.mjs → client-DS5JEsHs.mjs} +4 -4
  44. package/dist/{client-Cxlp_D4I.mjs → client-OjYRPhZs.mjs} +2 -2
  45. package/dist/codex/happyMcpStdioBridge.cjs +16 -16
  46. package/dist/codex/happyMcpStdioBridge.mjs +16 -16
  47. package/dist/codexAccount-BDQjRbtI.cjs +1028 -0
  48. package/dist/codexAccount-NOX5pmQf.mjs +1015 -0
  49. package/dist/{codexAppServerClient-q8GHQhyC.cjs → codexAppServerClient-Bj5vN7sb.cjs} +18 -7
  50. package/dist/{codexAppServerClient-BWJbLCQn.mjs → codexAppServerClient-HKAm8f_D.mjs} +18 -7
  51. package/dist/{codexCommand-BfXfRQr4.mjs → codexCommand-655pR6CR.mjs} +188 -58
  52. package/dist/{codexCommand-BgpGg-Zy.cjs → codexCommand-DtbDjHZp.cjs} +187 -57
  53. package/dist/{codexTermination-CVUF0X75.cjs → codexTermination-CX_FHKT5.cjs} +1 -1
  54. package/dist/{codexTermination-s9fd1gkA.mjs → codexTermination-DxLR-bb5.mjs} +1 -1
  55. package/dist/{codexThreadFork-5kwoKjMu.cjs → codexThreadFork-C6ZmcT2z.cjs} +22 -1
  56. package/dist/{codexThreadFork-DobPd19R.mjs → codexThreadFork-CVzAqELg.mjs} +22 -2
  57. package/dist/{config-BF8XgLyc.mjs → config-CIvXVGlP.mjs} +3 -3
  58. package/dist/{config-BAjyTyYp.cjs → config-Cv-A-Bw0.cjs} +3 -3
  59. package/dist/{configuration-CXEVKAyF.cjs → configuration-2Pbg3a0H.cjs} +1 -1
  60. package/dist/{configuration-IhRiLDVe.mjs → configuration-rTcdHkhE.mjs} +1 -1
  61. package/dist/{connect-LZh1gr08.mjs → connect-B9Bl68PF.mjs} +13 -13
  62. package/dist/{connect-rCS56arw.cjs → connect-BAYNAE8A.cjs} +13 -13
  63. package/dist/{context-DO6F5YwH.mjs → context-C7QarZMk.mjs} +1 -1
  64. package/dist/{context-3_S_mWz9.cjs → context-CLTyu_tQ.cjs} +1 -1
  65. package/dist/{controlClient-8ILulwjc.mjs → controlClient-BIdGnYBo.mjs} +3 -3
  66. package/dist/{controlClient-j7p5p3_7.cjs → controlClient-CIqHL07h.cjs} +3 -3
  67. package/dist/{createSessionMetadata-DwdD_uVo.cjs → createSessionMetadata-BHjzRzPc.cjs} +2 -2
  68. package/dist/{createSessionMetadata-oyaTZm1b.mjs → createSessionMetadata-PrN-dT7K.mjs} +2 -2
  69. package/dist/{daemonAccounts-BCjDgoNt.cjs → daemonAccounts-CpGDY_4k.cjs} +4 -1
  70. package/dist/{daemonAccounts-BJgt6IJe.mjs → daemonAccounts-DwPwKxvv.mjs} +5 -2
  71. package/dist/{defaultPermissionMode-BFShzF55.cjs → defaultPermissionMode-BakXiqRr.cjs} +1 -1
  72. package/dist/{defaultPermissionMode-Lt3PUCwY.mjs → defaultPermissionMode-DF5AfeBb.mjs} +1 -1
  73. package/dist/{deterministicJson-Dfp-7wUZ.mjs → deterministicJson-DFwJ57jR.mjs} +13 -13
  74. package/dist/{deterministicJson-DUN0v3St.cjs → deterministicJson-ZBFn1jtS.cjs} +13 -13
  75. package/dist/{doctor-B_UwMcVT.mjs → doctor-CFYpAXvt.mjs} +7 -7
  76. package/dist/{doctor-FgUYTbAT.cjs → doctor-yyM-zii7.cjs} +7 -7
  77. package/dist/{downloadTarget-C0d6jRx-.mjs → downloadTarget-CVPBZMnY.mjs} +6 -6
  78. package/dist/{downloadTarget-BrrQEDxg.cjs → downloadTarget-DlmqPQp9.cjs} +6 -6
  79. package/dist/{ensureDaemonRunning-KUMFfIil.mjs → ensureDaemonRunning-B6Y-CMWe.mjs} +5 -5
  80. package/dist/{ensureDaemonRunning-Cq4FYI5Q.cjs → ensureDaemonRunning-D2ny0yon.cjs} +5 -5
  81. package/dist/{handleResumeCommand-Cl9GIL5F.cjs → handleResumeCommand-D-mGugcu.cjs} +5 -5
  82. package/dist/{handleResumeCommand-BGhVo3QH.mjs → handleResumeCommand-DlrDcV5B.mjs} +5 -5
  83. package/dist/{index-CQ_hLLCj.cjs → index-2Fcq3AGX.cjs} +3 -3
  84. package/dist/{index-CRipkiqo.cjs → index-5c33fqLQ.cjs} +4 -4
  85. package/dist/{index-JQDyJ3Li.mjs → index-BJsenPFp.mjs} +3 -3
  86. package/dist/{index-BzAYnYct.cjs → index-BUFrKZeQ.cjs} +198 -108
  87. package/dist/{index-D8ODb0_U.cjs → index-BWvmUCQF.cjs} +42 -42
  88. package/dist/{index-v5EmjT8l.mjs → index-Bi3dVJ0S.mjs} +4 -4
  89. package/dist/{index-CZaLMmPC.cjs → index-CPkSLWP_.cjs} +4 -4
  90. package/dist/{index-DYD3GM1m.mjs → index-D1YnIih6.mjs} +195 -109
  91. package/dist/{index-BjXjMhGY.mjs → index-DEN6vfEY.mjs} +4 -4
  92. package/dist/{index-Ca1Tt96A.mjs → index-DuDD9khO.mjs} +43 -43
  93. package/dist/index.cjs +2 -2
  94. package/dist/index.mjs +2 -2
  95. package/dist/{install-ClUA9tbC.cjs → install-BOA4nEbm.cjs} +3 -3
  96. package/dist/{install-D6EHRtAN.mjs → install-BVYL-wSO.mjs} +3 -3
  97. package/dist/lib.cjs +12 -12
  98. package/dist/lib.d.cts +97 -25
  99. package/dist/lib.d.mts +97 -25
  100. package/dist/lib.mjs +12 -12
  101. package/dist/{lidState-DqoN7zH4.cjs → lidState-DYeb7Wud.cjs} +1 -1
  102. package/dist/{lidState-CZOXXdzv.mjs → lidState-zy20u7T3.mjs} +1 -1
  103. package/dist/{localHappyAgentAuth-YHxDZ4x4.mjs → localHappyAgentAuth-CBsX08VJ.mjs} +1 -1
  104. package/dist/{localHappyAgentAuth-BnGCpHRX.cjs → localHappyAgentAuth-CScN2McN.cjs} +1 -1
  105. package/dist/{logger-8su64lqR.cjs → logger-CepF8C5Z.cjs} +2 -2
  106. package/dist/{logger-Fd_rNvgd.mjs → logger-SGCwRIV5.mjs} +2 -2
  107. package/dist/{machineMetadata-1HIIC7Bc.mjs → machineMetadata-ClJfd7ay.mjs} +3 -3
  108. package/dist/{machineMetadata-DYXt3p6u.cjs → machineMetadata-ObK4hjF0.cjs} +3 -3
  109. package/dist/{main-BI6GIzUL.mjs → main-C7ZcZVBY.mjs} +47 -47
  110. package/dist/{main-C_GrcYkn.cjs → main-mhXOpUV7.cjs} +47 -47
  111. package/dist/{mcp-XGoxywno.mjs → mcp-BuCpkYTY.mjs} +18 -18
  112. package/dist/{mcp-BycIv9oQ.cjs → mcp-Zz7m0j8A.cjs} +18 -18
  113. package/dist/{mirrorProtocol-DXT3rv7T.mjs → mirrorProtocol-B0H9UTBM.mjs} +3 -3
  114. package/dist/{mirrorProtocol-DVnB8EO8.cjs → mirrorProtocol-IhICxf0K.cjs} +3 -3
  115. package/dist/{package-iuLlSiSF.cjs → package-C7WgesIw.cjs} +7 -7
  116. package/dist/{package-6KkRAops.mjs → package-Q_ELj5DL.mjs} +7 -7
  117. package/dist/{panels-B5Di2zb2.mjs → panels-Cm69UXgE.mjs} +5 -5
  118. package/dist/{panels-0C89q0Tu.cjs → panels-yyxpwZnk.cjs} +5 -5
  119. package/dist/{peerTools-CANTX_mG.cjs → peerTools-BcZAbqBL.cjs} +5 -5
  120. package/dist/{peerTools-CKJ-IDM4.mjs → peerTools-DUg9RduG.mjs} +5 -5
  121. package/dist/{persistence-B4ttN-fR.cjs → persistence-D0gNvqXe.cjs} +2 -2
  122. package/dist/{persistence-DWcHe035.mjs → persistence-mr4Y484W.mjs} +2 -2
  123. package/dist/{piRunnerArgs-Bl5GpBoN.mjs → piRunnerArgs-CGjpl4iF.mjs} +1 -1
  124. package/dist/{piRunnerArgs-BOkfxyak.cjs → piRunnerArgs-DK_DDkYW.cjs} +1 -1
  125. package/dist/{piRuntime-DzrIiZU8.cjs → piRuntime-CtZRNOEb.cjs} +1 -1
  126. package/dist/{piRuntime-BhwxzdQf.mjs → piRuntime-HUA19wG8.mjs} +1 -1
  127. package/dist/{piTerminal-DnA2CbGr.mjs → piTerminal-Bgy1W9mA.mjs} +20 -20
  128. package/dist/{piTerminal-BdS7ol7v.cjs → piTerminal-D9OPouek.cjs} +20 -20
  129. package/dist/{pushNotifications-BqFoLye2.cjs → pushNotifications-CH0XVPQe.cjs} +3 -3
  130. package/dist/{pushNotifications-DkQ0yvFs.mjs → pushNotifications-DjEl8G0a.mjs} +3 -3
  131. package/dist/{query-BQ4br3yn.cjs → query-Df3WhSA0.cjs} +1 -1
  132. package/dist/{query-BRJYSkb1.mjs → query-DmIo5OXf.mjs} +1 -1
  133. package/dist/{rateLimitReporter-BRbYkmuP.mjs → rateLimitReporter-B_PZClib.mjs} +3 -3
  134. package/dist/{rateLimitReporter-DK5SQuCc.cjs → rateLimitReporter-M_IKRRS7.cjs} +3 -3
  135. package/dist/{rateLimitWindows-DBfiuYeg.cjs → rateLimitWindows-B9PERFm1.cjs} +1 -1
  136. package/dist/{rateLimitWindows-Da5AR-4u.mjs → rateLimitWindows-a2yE3kCv.mjs} +1 -1
  137. package/dist/{registerCommonHandlers-yQ7Ru-l0.mjs → registerCommonHandlers-CND00Dpj.mjs} +2 -2
  138. package/dist/{registerCommonHandlers-m6pxxf2J.cjs → registerCommonHandlers-D4uXC0he.cjs} +2 -2
  139. package/dist/{registerKillSessionHandler-BDNpi7YO.mjs → registerKillSessionHandler-CwyHwm_n.mjs} +6 -6
  140. package/dist/{registerKillSessionHandler-BAOIa_Fs.cjs → registerKillSessionHandler-DQKsD9CW.cjs} +6 -6
  141. package/dist/{remoteSessionClient-iJMXRN_D.cjs → remoteSessionClient-DOWgca08.cjs} +5 -5
  142. package/dist/{remoteSessionClient-CZ7aaNgj.mjs → remoteSessionClient-mIr_9OL_.mjs} +5 -5
  143. package/dist/{reportProgressTool-DpFs7pSe.cjs → reportProgressTool-BLw2_Ohi.cjs} +3 -3
  144. package/dist/{reportProgressTool-DfQhPu0s.mjs → reportProgressTool-DTKlUlHv.mjs} +3 -3
  145. package/dist/{run-p-xp1_HY.cjs → run-1V6DLzTY.cjs} +178 -847
  146. package/dist/{run-CwN28mcj.mjs → run-bfxXYL5N.mjs} +176 -845
  147. package/dist/{runClaude-DRKtAGTm.mjs → runClaude-BgvDhl2p.mjs} +25 -25
  148. package/dist/{runClaude-D6U1Z575.cjs → runClaude-DuFgZZwO.cjs} +25 -25
  149. package/dist/{runClaudeDeps-BheVcIlD.mjs → runClaudeDeps-CX7GtH7O.mjs} +46 -46
  150. package/dist/{runClaudeDeps-Dkofokgb.cjs → runClaudeDeps-DeVinBmE.cjs} +41 -41
  151. package/dist/{runGemini-owbvhFbi.mjs → runGemini-Cd27u-7R.mjs} +33 -33
  152. package/dist/{runGemini-C8q3YCc0.cjs → runGemini-DiYSk3s1.cjs} +33 -33
  153. package/dist/{runOpenClaw-Dky3-mjO.mjs → runOpenClaw-CWkkfRSo.mjs} +18 -18
  154. package/dist/{runOpenClaw-DGeN66-t.cjs → runOpenClaw-DyQnBzpy.cjs} +18 -18
  155. package/dist/{sandbox-D2CPyoCA.cjs → sandbox-BAXXYewR.cjs} +4 -4
  156. package/dist/{sandbox-sq_wy9Gl.mjs → sandbox-C35zDrkc.mjs} +4 -4
  157. package/dist/selfCheck-DKMF0Dyu.mjs +88 -0
  158. package/dist/{selfCheck-BgLvQKSt.cjs → selfCheck-R71q-x7u.cjs} +39 -39
  159. package/dist/{send-Cd10YhXh.cjs → send-3Wa9th3D.cjs} +8 -8
  160. package/dist/{send-K9vg-8t-.mjs → send-DiSaR5Bk.mjs} +8 -8
  161. package/dist/{server-DRrV64r0.cjs → server-BJu2bFBy.cjs} +6 -6
  162. package/dist/{server-De4W1zuK.mjs → server-BxMJxaE6.mjs} +4 -4
  163. package/dist/{sessionLock-BDtSzzKS.cjs → sessionLock-BJ1ngLgm.cjs} +3 -3
  164. package/dist/{sessionLock-Dl6i7IgA.mjs → sessionLock-dbi4JPhP.mjs} +3 -3
  165. package/dist/{sessionOps-DvnEH4PL.cjs → sessionOps-BUlpeaUe.cjs} +50 -8
  166. package/dist/{sessionOps-gU88-W9F.mjs → sessionOps-C9wRmCBg.mjs} +51 -9
  167. package/dist/{sessionProvider-CKcIo7KO.mjs → sessionProvider-BEHfI5gs.mjs} +11 -9
  168. package/dist/{sessionProvider-CbSZeZrl.cjs → sessionProvider-DYD6JepE.cjs} +11 -9
  169. package/dist/{sessionScanner-7RtcCeyD.cjs → sessionScanner-BwbjEoSf.cjs} +3 -3
  170. package/dist/{sessionScanner-DR32uSby.mjs → sessionScanner-CFITViIZ.mjs} +3 -3
  171. package/dist/{sessions-BvuMjgvJ.cjs → sessions-C-wBd0fN.cjs} +10 -10
  172. package/dist/{sessions-DTt2Eguk.mjs → sessions-wOcO2X-k.mjs} +10 -10
  173. package/dist/{setupOfflineReconnection-DduOsw6p.cjs → setupOfflineReconnection-Bd6XsWhA.cjs} +2 -2
  174. package/dist/{setupOfflineReconnection-BGnvhRfb.mjs → setupOfflineReconnection-BrljmbqX.mjs} +2 -2
  175. package/dist/{spawn-CL3cUc7b.mjs → spawn-BPioepNz.mjs} +66 -22
  176. package/dist/{spawn-DMB6rRPA.cjs → spawn-Crprnq9Z.cjs} +66 -22
  177. package/dist/{spawnAgents-CClb7buD.cjs → spawnAgents-B9olJ8xn.cjs} +1 -1
  178. package/dist/{spawnAgents-CRMfOJhh.mjs → spawnAgents-I29H9nO8.mjs} +1 -1
  179. package/dist/{spawnHappyCLI-Cj_6IICe.mjs → spawnHappyCLI-BA1bTIiO.mjs} +1 -1
  180. package/dist/{spawnHappyCLI-DJdhX_Qx.cjs → spawnHappyCLI-C0XAWy8V.cjs} +1 -1
  181. package/dist/{startFileWatcher-DikVa8kg.mjs → startFileWatcher-COCEjNT8.mjs} +1 -1
  182. package/dist/{startFileWatcher-LnOmVW6H.cjs → startFileWatcher-Ca5izs24.cjs} +1 -1
  183. package/dist/{startupSessionCreate-CDdaLaMq.mjs → startupSessionCreate-BnEPBxsJ.mjs} +3 -3
  184. package/dist/{startupSessionCreate-B3ND-917.cjs → startupSessionCreate-Cmg1gkKS.cjs} +3 -3
  185. package/dist/{store-DV__wCvP.cjs → store-CkNa6oj4.cjs} +46 -9
  186. package/dist/{store--XN-7MS0.mjs → store-Vej_738f.mjs} +46 -10
  187. package/dist/{streamRelay-DFdOaLOn.cjs → streamRelay-C0G1HOOd.cjs} +1 -1
  188. package/dist/{streamRelay-sABnxEXq.mjs → streamRelay-C5U-C4GS.mjs} +1 -1
  189. package/dist/{sync-_2lsZ1U2.cjs → sync-BfrnSdL1.cjs} +1 -1
  190. package/dist/{sync-JoEZKRo8.mjs → sync-DVcNkv8e.mjs} +1 -1
  191. package/dist/{systemPrompt-Zq4HyrZ5.mjs → systemPrompt-BxZebU75.mjs} +2 -2
  192. package/dist/{systemPrompt-CJEvNCuW.cjs → systemPrompt-Os5ca7pu.cjs} +2 -2
  193. package/dist/{teams-BNZafnrT.cjs → teams--pv0QFMA.cjs} +7 -7
  194. package/dist/{teams-qz4LqKJ2.mjs → teams-CNB3DE_n.mjs} +7 -7
  195. package/dist/{template-LgvBbOna.cjs → template-B9pLEP8v.cjs} +2 -2
  196. package/dist/{template-CJ8BWSsc.mjs → template-CL9EvQLQ.mjs} +2 -2
  197. package/dist/{time-bzmet4s5.mjs → time-0Ru4clBD.mjs} +1 -1
  198. package/dist/{time-CaUlWSNJ.cjs → time-Da5GIiCa.cjs} +1 -1
  199. package/dist/{titleGenerator-BuIIu_JP.cjs → titleGenerator-9xIXHA5K.cjs} +3 -3
  200. package/dist/{titleGenerator-CbTtJ_1D.mjs → titleGenerator-CaCzpYyA.mjs} +2 -2
  201. package/dist/{todo-DIrVF_Ak.mjs → todo-CZXHl2Lg.mjs} +6 -6
  202. package/dist/{todo-CQ_BTf9C.cjs → todo-DUY_J3l_.cjs} +6 -6
  203. package/dist/{tools-cLOjBvPn.mjs → tools-DqA2Jt2R.mjs} +3 -2
  204. package/dist/{tools-BnmmFZji.cjs → tools-hPD2Hvei.cjs} +3 -2
  205. package/dist/{uninstall-C5OuW6dE.mjs → uninstall-CjMzELYw.mjs} +3 -3
  206. package/dist/{uninstall-uEEGKB84.cjs → uninstall-rTvdpRLt.cjs} +3 -3
  207. package/dist/{wrapperAccount-DXlD3bsO.mjs → wrapperAccount-BkufO_9g.mjs} +5 -4
  208. package/dist/{wrapperAccount-DzoGqS2b.cjs → wrapperAccount-D2A4DuZy.cjs} +6 -3
  209. package/package.json +7 -7
  210. 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-Fd_rNvgd.mjs';
5
- import { d as delay } from './time-bzmet4s5.mjs';
4
+ import { l as logger } from './logger-SGCwRIV5.mjs';
5
+ import { d as delay } from './time-0Ru4clBD.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-6KkRAops.mjs';
8
+ import { p as packageJson } from './package-Q_ELj5DL.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-8su64lqR.cjs');
7
- var time = require('./time-CaUlWSNJ.cjs');
6
+ var logger = require('./logger-CepF8C5Z.cjs');
7
+ var time = require('./time-Da5GIiCa.cjs');
8
8
  var contentLogMetadata = require('./contentLogMetadata-ZSFk_NjQ.cjs');
9
9
  var processTree = require('./processTree-CMHWlVse.cjs');
10
- var _package = require('./package-iuLlSiSF.cjs');
10
+ var _package = require('./package-C7WgesIw.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,8 +1,8 @@
1
1
  'use strict';
2
2
 
3
3
  var cuid2 = require('@paralleldrive/cuid2');
4
- var index = require('./index-BzAYnYct.cjs');
5
- var api = require('./api-hMDsC6Wg.cjs');
4
+ var index = require('./index-BUFrKZeQ.cjs');
5
+ var api = require('./api-wYwQCJml.cjs');
6
6
 
7
7
  function turnOptions(turnId, time) {
8
8
  return turnId ? { turn: turnId, time } : { time };
@@ -1,6 +1,6 @@
1
1
  import { createId } from '@paralleldrive/cuid2';
2
- import { s as streamKeyOf, k as createEnvelope } from './index-DYD3GM1m.mjs';
3
- import { t as textResultPayload, b as toolResultPayload } from './api-_LeBScjg.mjs';
2
+ import { s as streamKeyOf, k as createEnvelope } from './index-D1YnIih6.mjs';
3
+ import { t as textResultPayload, b as toolResultPayload } from './api-aE60mNjs.mjs';
4
4
 
5
5
  function turnOptions(turnId, time) {
6
6
  return turnId ? { turn: turnId, time } : { time };
@@ -1,4 +1,4 @@
1
- import { l as logger } from './logger-Fd_rNvgd.mjs';
1
+ import { l as logger } from './logger-SGCwRIV5.mjs';
2
2
 
3
3
  class BasePermissionHandler {
4
4
  pendingRequests = /* @__PURE__ */ new Map();
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var logger = require('./logger-8su64lqR.cjs');
3
+ var logger = require('./logger-CepF8C5Z.cjs');
4
4
 
5
5
  class BasePermissionHandler {
6
6
  pendingRequests = /* @__PURE__ */ new Map();
@@ -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-CXEVKAyF.cjs');
6
- var controlClient = require('./controlClient-j7p5p3_7.cjs');
7
- var accountService = require('./accountService-Bddy0zwL.cjs');
5
+ var configuration = require('./configuration-2Pbg3a0H.cjs');
6
+ var controlClient = require('./controlClient-CIqHL07h.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-iuLlSiSF.cjs');
11
+ require('./package-C7WgesIw.cjs');
12
12
  require('node:fs/promises');
13
- require('./logger-8su64lqR.cjs');
13
+ require('./logger-CepF8C5Z.cjs');
14
14
  require('node:util');
15
- require('./persistence-B4ttN-fR.cjs');
15
+ require('./persistence-D0gNvqXe.cjs');
16
16
  require('zod');
17
17
  require('./authRelay-Dy1qU9td.cjs');
18
18
  require('node:crypto');
19
19
  require('tweetnacl');
20
- require('./index-BzAYnYct.cjs');
20
+ require('./index-BUFrKZeQ.cjs');
21
21
  require('@paralleldrive/cuid2');
22
22
  require('node:child_process');
23
- require('./claudeAccountEnv-BOBpJ3k8.cjs');
24
- require('./store-DV__wCvP.cjs');
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> account new Claude sessions on this machine start on
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
- return { action: "login", ...positional[0] ? { accountId: positional[0] } : {}, ...one("--label") ? { label: one("--label") } : {}, tokenStdin: bools.has("--token-stdin") };
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
- if (!label || !baseUrl) throw new Error("add needs --label and --base-url");
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 = a.kind === "claude-subscription" ? "subscription" : a.kind === "claude-api" ? "api" : a.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-BCjDgoNt.cjs'); });
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 account = parsed.tokenStdin ? service.storeSubscriptionToken(await readStdin(), target) : await loginInteractive(target);
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.setDefault("claude", parsed.accountId);
221
- console.log(parsed.accountId ? `New Claude sessions on this machine start on ${parsed.accountId}.` : "New Claude sessions on this machine use the machine login.");
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");
@@ -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-IhRiLDVe.mjs';
4
- import { g as getDaemonAgentProfiles, r as restartDaemonSession, l as listDaemonSessions } from './controlClient-8ILulwjc.mjs';
5
- import { A as AccountService, b as bindResultMessages, a as AccountError, l as localRestartFailure } from './accountService-Dd9uqde2.mjs';
3
+ import { c as configuration } from './configuration-rTcdHkhE.mjs';
4
+ import { g as getDaemonAgentProfiles, r as restartDaemonSession, l as listDaemonSessions } from './controlClient-BIdGnYBo.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-6KkRAops.mjs';
9
+ import './package-Q_ELj5DL.mjs';
10
10
  import 'node:fs/promises';
11
- import './logger-Fd_rNvgd.mjs';
11
+ import './logger-SGCwRIV5.mjs';
12
12
  import 'node:util';
13
- import './persistence-DWcHe035.mjs';
13
+ import './persistence-mr4Y484W.mjs';
14
14
  import 'zod';
15
15
  import './authRelay-DhQhkBvX.mjs';
16
16
  import 'node:crypto';
17
17
  import 'tweetnacl';
18
- import './index-DYD3GM1m.mjs';
18
+ import './index-D1YnIih6.mjs';
19
19
  import '@paralleldrive/cuid2';
20
20
  import 'node:child_process';
21
- import './claudeAccountEnv-ON24i0qv.mjs';
22
- import './store--XN-7MS0.mjs';
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> account new Claude sessions on this machine start on
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
- return { action: "login", ...positional[0] ? { accountId: positional[0] } : {}, ...one("--label") ? { label: one("--label") } : {}, tokenStdin: bools.has("--token-stdin") };
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
- if (!label || !baseUrl) throw new Error("add needs --label and --base-url");
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 = a.kind === "claude-subscription" ? "subscription" : a.kind === "claude-api" ? "api" : a.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-BJgt6IJe.mjs');
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 account = parsed.tokenStdin ? service.storeSubscriptionToken(await readStdin(), target) : await loginInteractive(target);
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.setDefault("claude", parsed.accountId);
219
- console.log(parsed.accountId ? `New Claude sessions on this machine start on ${parsed.accountId}.` : "New Claude sessions on this machine use the machine login.");
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");