very-happy-cli 0.2.191 → 0.2.192

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 (212) hide show
  1. package/dist/{AcpBackend-DgrIc1vH.cjs → AcpBackend-BQO4ShOy.cjs} +3 -3
  2. package/dist/{AcpBackend-CCy_9AfR.mjs → AcpBackend-CGHTDJd9.mjs} +3 -3
  3. package/dist/{AcpSessionManager-CQnxx7gD.mjs → AcpSessionManager-G0xD6Jbq.mjs} +2 -2
  4. package/dist/{AcpSessionManager-DVOzCD3P.cjs → AcpSessionManager-LlUMmcpB.cjs} +2 -2
  5. package/dist/{BasePermissionHandler-DYLN6Ec9.mjs → BasePermissionHandler-BmTIg376.mjs} +1 -1
  6. package/dist/{BasePermissionHandler-C9Ag7yvs.cjs → BasePermissionHandler-N6Ip3tFt.cjs} +1 -1
  7. package/dist/account-CCVT-HO_.mjs +240 -0
  8. package/dist/account-DtaouikP.cjs +245 -0
  9. package/dist/accountService-Bddy0zwL.cjs +571 -0
  10. package/dist/accountService-Dd9uqde2.mjs +566 -0
  11. package/dist/{acpSessionResume-Bi7pA1n_.mjs → acpSessionResume-BWEUxNtC.mjs} +1 -1
  12. package/dist/{acpSessionResume-TvP_4Zq2.cjs → acpSessionResume-BnHDk5eD.cjs} +1 -1
  13. package/dist/{agentHome-DGv105SR.mjs → agentHome-B0VnjkZW.mjs} +4 -4
  14. package/dist/{agentHome-DNUKJWOY.cjs → agentHome-CqQ29YY7.cjs} +4 -4
  15. package/dist/{api-jfeMRg5R.mjs → api-_LeBScjg.mjs} +10 -10
  16. package/dist/{api-BBxZ7y2z.cjs → api-hMDsC6Wg.cjs} +10 -10
  17. package/dist/{apiMachine-DRJ7y-BB.mjs → apiMachine-CgRldeJ6.mjs} +76 -21
  18. package/dist/{apiMachine-DqyjKBZG.cjs → apiMachine-CqW2m6Zr.cjs} +81 -26
  19. package/dist/{attachmentContent-BO2njyza.cjs → attachmentContent-BEeT2J5n.cjs} +2 -2
  20. package/dist/{attachmentContent-Dm_RIs5L.mjs → attachmentContent-CyptLIfq.mjs} +2 -2
  21. package/dist/{auth-DnxoVkkf.cjs → auth-C9NvNHhL.cjs} +5 -5
  22. package/dist/{auth-DLR3ksCF.cjs → auth-CA1OClsW.cjs} +8 -8
  23. package/dist/{auth-BYDtjVNb.mjs → auth-CFQikywl.mjs} +8 -8
  24. package/dist/{auth-DC6rg8lJ.mjs → auth-DL8_J9vu.mjs} +5 -5
  25. package/dist/{auto-D5Jhukq1.mjs → auto-CKI05w1D.mjs} +17 -17
  26. package/dist/{auto-CwO0u8hB.cjs → auto-uQOxlxLp.cjs} +17 -17
  27. package/dist/{bootstrap-rLaL3kTa.mjs → bootstrap-DaZ0Np7X.mjs} +2 -2
  28. package/dist/{bootstrap-sly4qPPY.cjs → bootstrap-DsZGc69k.cjs} +2 -2
  29. package/dist/{browser-CHpVgyni.mjs → browser-BUIaSHK2.mjs} +1 -1
  30. package/dist/{browser-BTgZ9d4i.cjs → browser-Ft0ASDm7.cjs} +1 -1
  31. package/dist/claudeAccountEnv-BOBpJ3k8.cjs +137 -0
  32. package/dist/claudeAccountEnv-ON24i0qv.mjs +132 -0
  33. package/dist/{claudeLocal-Bgb5GGsq.mjs → claudeLocal-B1ZVtryl.mjs} +5 -5
  34. package/dist/{claudeLocal-1vuTFcL8.cjs → claudeLocal-BMf9t4Fa.cjs} +5 -5
  35. package/dist/{claudeLocalLauncher-T7EfT68h.mjs → claudeLocalLauncher-Bp8bqF4y.mjs} +10 -10
  36. package/dist/{claudeLocalLauncher-DOsL6HFY.cjs → claudeLocalLauncher-C8TeJcfF.cjs} +10 -10
  37. package/dist/{claudeSessionFork-CPvi6yDX.mjs → claudeSessionFork-8AA47z8Y.mjs} +1 -1
  38. package/dist/{claudeSessionFork-Cko4SaVi.cjs → claudeSessionFork-YiktY55n.cjs} +1 -1
  39. package/dist/{client-Bi20Ka0h.mjs → client-Bm4oKvW7.mjs} +2 -2
  40. package/dist/{client-Bh1aUPh-.mjs → client-BmPaBnDK.mjs} +4 -4
  41. package/dist/{client-C-OdTbrU.cjs → client-CFHZfh9x.cjs} +4 -4
  42. package/dist/{client-BscskEBk.cjs → client-Crh8_cNx.cjs} +2 -2
  43. package/dist/{client-BXD66ZF5.mjs → client-Cxlp_D4I.mjs} +2 -2
  44. package/dist/{client-C5-C0t2a.cjs → client-D8XROyZc.cjs} +2 -2
  45. package/dist/codex/happyMcpStdioBridge.cjs +16 -16
  46. package/dist/codex/happyMcpStdioBridge.mjs +16 -16
  47. package/dist/{codexAppServerClient-DXhAf6i-.mjs → codexAppServerClient-BWJbLCQn.mjs} +3 -3
  48. package/dist/{codexAppServerClient-DKXeikEe.cjs → codexAppServerClient-q8GHQhyC.cjs} +3 -3
  49. package/dist/{codexCommand-CIaOiiOj.mjs → codexCommand-BfXfRQr4.mjs} +50 -48
  50. package/dist/{codexCommand-DvbbpYBS.cjs → codexCommand-BgpGg-Zy.cjs} +50 -48
  51. package/dist/{codexTermination-BszWfyk5.cjs → codexTermination-CVUF0X75.cjs} +1 -1
  52. package/dist/{codexTermination-BcQdEDaw.mjs → codexTermination-s9fd1gkA.mjs} +1 -1
  53. package/dist/{config-Di3Cf6js.cjs → config-BAjyTyYp.cjs} +3 -3
  54. package/dist/{config-OCEcVVK1.mjs → config-BF8XgLyc.mjs} +3 -3
  55. package/dist/{configuration-DfPBa-9d.cjs → configuration-CXEVKAyF.cjs} +1 -1
  56. package/dist/{configuration-ECqXu34R.mjs → configuration-IhRiLDVe.mjs} +1 -1
  57. package/dist/{connect-BTfAUhk8.mjs → connect-LZh1gr08.mjs} +13 -13
  58. package/dist/{connect-BPQRuOw5.cjs → connect-rCS56arw.cjs} +13 -13
  59. package/dist/{context-Co7hUaW-.cjs → context-3_S_mWz9.cjs} +1 -1
  60. package/dist/{context-CfgTFpCB.mjs → context-DO6F5YwH.mjs} +1 -1
  61. package/dist/{controlClient-ClI7A0qE.mjs → controlClient-8ILulwjc.mjs} +14 -5
  62. package/dist/{controlClient-C13_pSKG.cjs → controlClient-j7p5p3_7.cjs} +15 -4
  63. package/dist/{createSessionMetadata-Cf78KHtt.cjs → createSessionMetadata-DwdD_uVo.cjs} +2 -2
  64. package/dist/{createSessionMetadata-B0eT_Kfj.mjs → createSessionMetadata-oyaTZm1b.mjs} +2 -2
  65. package/dist/daemonAccounts-BCjDgoNt.cjs +51 -0
  66. package/dist/daemonAccounts-BJgt6IJe.mjs +27 -0
  67. package/dist/{defaultPermissionMode-oqTupStc.cjs → defaultPermissionMode-BFShzF55.cjs} +1 -1
  68. package/dist/{defaultPermissionMode-m6z2QVyP.mjs → defaultPermissionMode-Lt3PUCwY.mjs} +1 -1
  69. package/dist/{deterministicJson-CpFFgUL_.cjs → deterministicJson-DUN0v3St.cjs} +13 -13
  70. package/dist/{deterministicJson-BtSwbsok.mjs → deterministicJson-Dfp-7wUZ.mjs} +13 -13
  71. package/dist/{doctor-lsxmAK4o.mjs → doctor-B_UwMcVT.mjs} +7 -7
  72. package/dist/{doctor-BEU0_1Xv.cjs → doctor-FgUYTbAT.cjs} +7 -7
  73. package/dist/{downloadTarget-CikzJv1h.cjs → downloadTarget-BrrQEDxg.cjs} +6 -6
  74. package/dist/{downloadTarget-BXqXhNF7.mjs → downloadTarget-C0d6jRx-.mjs} +6 -6
  75. package/dist/{ensureDaemonRunning-BUuH-pbE.cjs → ensureDaemonRunning-Cq4FYI5Q.cjs} +5 -5
  76. package/dist/{ensureDaemonRunning-B_9WAlbU.mjs → ensureDaemonRunning-KUMFfIil.mjs} +5 -5
  77. package/dist/{handleResumeCommand-BK9XKH_l.mjs → handleResumeCommand-BGhVo3QH.mjs} +5 -5
  78. package/dist/{handleResumeCommand-Dj7oi2KO.cjs → handleResumeCommand-Cl9GIL5F.cjs} +5 -5
  79. package/dist/{index-BdOJOZ6J.mjs → index-BjXjMhGY.mjs} +4 -4
  80. package/dist/{index-CLUHaPU8.cjs → index-BzAYnYct.cjs} +110 -0
  81. package/dist/{index-CmZusg8Q.cjs → index-CQ_hLLCj.cjs} +3 -3
  82. package/dist/{index-Dg2NAF_-.cjs → index-CRipkiqo.cjs} +4 -4
  83. package/dist/{index-D3c7CLot.cjs → index-CZaLMmPC.cjs} +4 -4
  84. package/dist/{index-Cxso1rg4.mjs → index-Ca1Tt96A.mjs} +45 -41
  85. package/dist/{index-CauRYQKr.cjs → index-D8ODb0_U.cjs} +44 -40
  86. package/dist/{index-Bq8NKSCF.mjs → index-DYD3GM1m.mjs} +104 -1
  87. package/dist/{index-BjZnpGWX.mjs → index-JQDyJ3Li.mjs} +3 -3
  88. package/dist/{index-DuK9XYbZ.mjs → index-v5EmjT8l.mjs} +4 -4
  89. package/dist/index.cjs +2 -2
  90. package/dist/index.mjs +2 -2
  91. package/dist/{install-DXllkuy0.cjs → install-ClUA9tbC.cjs} +3 -3
  92. package/dist/{install-DTIveLOS.mjs → install-D6EHRtAN.mjs} +3 -3
  93. package/dist/lib.cjs +12 -12
  94. package/dist/lib.d.cts +282 -0
  95. package/dist/lib.d.mts +282 -0
  96. package/dist/lib.mjs +12 -12
  97. package/dist/{lidState-CD81ryTy.mjs → lidState-CZOXXdzv.mjs} +1 -1
  98. package/dist/{lidState-C9_DoF9i.cjs → lidState-DqoN7zH4.cjs} +1 -1
  99. package/dist/{localHappyAgentAuth-CCjUvOfi.cjs → localHappyAgentAuth-BnGCpHRX.cjs} +1 -1
  100. package/dist/{localHappyAgentAuth-Cg-m1lwm.mjs → localHappyAgentAuth-YHxDZ4x4.mjs} +1 -1
  101. package/dist/{logger-Ct2zvaq0.cjs → logger-8su64lqR.cjs} +2 -2
  102. package/dist/{logger-GcbI0eg2.mjs → logger-Fd_rNvgd.mjs} +2 -2
  103. package/dist/{machineMetadata-CXRmFNOV.mjs → machineMetadata-1HIIC7Bc.mjs} +3 -3
  104. package/dist/{machineMetadata-DDCVWb_x.cjs → machineMetadata-DYXt3p6u.cjs} +3 -3
  105. package/dist/{main-omGr_ONk.mjs → main-BI6GIzUL.mjs} +92 -48
  106. package/dist/{main-BHC-WIcM.cjs → main-C_GrcYkn.cjs} +92 -48
  107. package/dist/{mcp-xUzii0m8.cjs → mcp-BycIv9oQ.cjs} +18 -15
  108. package/dist/{mcp-D5hxmRAq.mjs → mcp-XGoxywno.mjs} +18 -15
  109. package/dist/{mirrorProtocol-Dfl8Ahyf.cjs → mirrorProtocol-DVnB8EO8.cjs} +3 -3
  110. package/dist/{mirrorProtocol-Lcx20Oby.mjs → mirrorProtocol-DXT3rv7T.mjs} +3 -3
  111. package/dist/{package-BsUHyqWe.mjs → package-6KkRAops.mjs} +7 -7
  112. package/dist/{package-9n7wd2dT.cjs → package-iuLlSiSF.cjs} +7 -7
  113. package/dist/{panels-BfknEmt7.cjs → panels-0C89q0Tu.cjs} +5 -5
  114. package/dist/{panels-CpEKWWbI.mjs → panels-B5Di2zb2.mjs} +5 -5
  115. package/dist/{peerTools-CElYh-5u.cjs → peerTools-CANTX_mG.cjs} +5 -5
  116. package/dist/{peerTools-CwCe6tmJ.mjs → peerTools-CKJ-IDM4.mjs} +5 -5
  117. package/dist/{persistence-A2NeERZJ.cjs → persistence-B4ttN-fR.cjs} +2 -2
  118. package/dist/{persistence-Cpw4yJs8.mjs → persistence-DWcHe035.mjs} +2 -2
  119. package/dist/{piRunnerArgs-BnFU0K73.cjs → piRunnerArgs-BOkfxyak.cjs} +1 -1
  120. package/dist/{piRunnerArgs-Bqmu16He.mjs → piRunnerArgs-Bl5GpBoN.mjs} +2 -2
  121. package/dist/{piRuntime-Cgn1b0OX.mjs → piRuntime-BhwxzdQf.mjs} +1 -1
  122. package/dist/{piRuntime-DpS9TAIs.cjs → piRuntime-DzrIiZU8.cjs} +1 -1
  123. package/dist/{piTerminal-rmve-VlI.cjs → piTerminal-BdS7ol7v.cjs} +20 -17
  124. package/dist/{piTerminal-BGdps8f3.mjs → piTerminal-DnA2CbGr.mjs} +20 -17
  125. package/dist/{pushNotifications-23YSd-0l.cjs → pushNotifications-BqFoLye2.cjs} +5 -3
  126. package/dist/{pushNotifications-XAM8__Pg.mjs → pushNotifications-DkQ0yvFs.mjs} +5 -3
  127. package/dist/{query-u2GX-I0C.cjs → query-BQ4br3yn.cjs} +1 -1
  128. package/dist/{query-SZcYnJoW.mjs → query-BRJYSkb1.mjs} +1 -1
  129. package/dist/{rateLimitReporter-COUkf446.mjs → rateLimitReporter-BRbYkmuP.mjs} +3 -3
  130. package/dist/{rateLimitReporter-CaTzBe3x.cjs → rateLimitReporter-DK5SQuCc.cjs} +3 -3
  131. package/dist/{rateLimitWindows-B2Kx6L0S.cjs → rateLimitWindows-DBfiuYeg.cjs} +1 -1
  132. package/dist/{rateLimitWindows-j_qQk0KY.mjs → rateLimitWindows-Da5AR-4u.mjs} +1 -1
  133. package/dist/reconnectEnv-B31lY4nR.cjs +27 -0
  134. package/dist/reconnectEnv-DeSvHl3q.mjs +24 -0
  135. package/dist/{registerCommonHandlers-D1MiSfcB.cjs → registerCommonHandlers-m6pxxf2J.cjs} +2 -2
  136. package/dist/{registerCommonHandlers-DRRfinzK.mjs → registerCommonHandlers-yQ7Ru-l0.mjs} +2 -2
  137. package/dist/{registerKillSessionHandler-hvCsEn7b.cjs → registerKillSessionHandler-BAOIa_Fs.cjs} +6 -6
  138. package/dist/{registerKillSessionHandler-Cpug_r5C.mjs → registerKillSessionHandler-BDNpi7YO.mjs} +6 -6
  139. package/dist/{remoteSessionClient-BdnJ_n8C.mjs → remoteSessionClient-CZ7aaNgj.mjs} +5 -5
  140. package/dist/{remoteSessionClient-6ymeMVa4.cjs → remoteSessionClient-iJMXRN_D.cjs} +5 -5
  141. package/dist/{reportProgressTool-XgQBzxoD.mjs → reportProgressTool-DfQhPu0s.mjs} +3 -3
  142. package/dist/{reportProgressTool-tzQLCLIw.cjs → reportProgressTool-DpFs7pSe.cjs} +3 -3
  143. package/dist/{run-Bt0AklUU.mjs → run-CwN28mcj.mjs} +211 -51
  144. package/dist/{run-DYL_wuj7.cjs → run-p-xp1_HY.cjs} +210 -50
  145. package/dist/{runClaude-CBEpYO4S.cjs → runClaude-D6U1Z575.cjs} +62 -44
  146. package/dist/{runClaude-C3rii_S6.mjs → runClaude-DRKtAGTm.mjs} +62 -44
  147. package/dist/{runClaudeDeps-DlVfMG4F.mjs → runClaudeDeps-BheVcIlD.mjs} +56 -47
  148. package/dist/{runClaudeDeps-CYuozSC6.cjs → runClaudeDeps-Dkofokgb.cjs} +51 -42
  149. package/dist/{runGemini-CEI3b90u.cjs → runGemini-C8q3YCc0.cjs} +33 -33
  150. package/dist/{runGemini-DkYhRk9S.mjs → runGemini-owbvhFbi.mjs} +33 -33
  151. package/dist/{runOpenClaw-BgjD6E4d.cjs → runOpenClaw-DGeN66-t.cjs} +18 -18
  152. package/dist/{runOpenClaw-DpprWCoz.mjs → runOpenClaw-Dky3-mjO.mjs} +18 -18
  153. package/dist/{sandbox-XCDUbH72.cjs → sandbox-D2CPyoCA.cjs} +4 -4
  154. package/dist/{sandbox-DJ7A7lsy.mjs → sandbox-sq_wy9Gl.mjs} +4 -4
  155. package/dist/{selfCheck-BYUDB1Uq.cjs → selfCheck-BgLvQKSt.cjs} +39 -37
  156. package/dist/selfCheck-vkfrgQ7X.mjs +88 -0
  157. package/dist/{send-CASDBCyJ.cjs → send-Cd10YhXh.cjs} +8 -8
  158. package/dist/{send-Ba63huxv.mjs → send-K9vg-8t-.mjs} +8 -8
  159. package/dist/{server-cZoV9XRt.cjs → server-DRrV64r0.cjs} +6 -6
  160. package/dist/{server-w3W0toNd.mjs → server-De4W1zuK.mjs} +4 -4
  161. package/dist/{sessionLock-BmLA2S8K.cjs → sessionLock-BDtSzzKS.cjs} +10 -3
  162. package/dist/{sessionLock-G2PMqvsh.mjs → sessionLock-Dl6i7IgA.mjs} +10 -4
  163. package/dist/{sessionOps-DXlTmS7J.cjs → sessionOps-DvnEH4PL.cjs} +4 -4
  164. package/dist/{sessionOps-DPw5k8vV.mjs → sessionOps-gU88-W9F.mjs} +4 -4
  165. package/dist/sessionProvider-CKcIo7KO.mjs +108 -0
  166. package/dist/sessionProvider-CbSZeZrl.cjs +113 -0
  167. package/dist/{sessionScanner-AHjnicxi.cjs → sessionScanner-7RtcCeyD.cjs} +3 -3
  168. package/dist/{sessionScanner-BCXpdZJN.mjs → sessionScanner-DR32uSby.mjs} +3 -3
  169. package/dist/{sessions-BiBXOBx0.cjs → sessions-BvuMjgvJ.cjs} +10 -10
  170. package/dist/{sessions-Clk8MR5Y.mjs → sessions-DTt2Eguk.mjs} +10 -10
  171. package/dist/{setupOfflineReconnection-DI-QZGYz.mjs → setupOfflineReconnection-BGnvhRfb.mjs} +2 -2
  172. package/dist/{setupOfflineReconnection-BKLfOd-i.cjs → setupOfflineReconnection-DduOsw6p.cjs} +2 -2
  173. package/dist/{spawn-4tsp1uhh.mjs → spawn-CL3cUc7b.mjs} +26 -17
  174. package/dist/{spawn-D5omsx1Q.cjs → spawn-DMB6rRPA.cjs} +26 -17
  175. package/dist/{spawnAgents-CtkkIFHd.cjs → spawnAgents-CClb7buD.cjs} +1 -1
  176. package/dist/{spawnAgents-CjoU6ZOS.mjs → spawnAgents-CRMfOJhh.mjs} +1 -1
  177. package/dist/{spawnHappyCLI-CIA9Sc_5.mjs → spawnHappyCLI-Cj_6IICe.mjs} +1 -1
  178. package/dist/{spawnHappyCLI-CF_gLi92.cjs → spawnHappyCLI-DJdhX_Qx.cjs} +1 -1
  179. package/dist/{startFileWatcher-CDO6fb2m.mjs → startFileWatcher-DikVa8kg.mjs} +1 -1
  180. package/dist/{startFileWatcher-9Stpxe7p.cjs → startFileWatcher-LnOmVW6H.cjs} +1 -1
  181. package/dist/{startupSessionCreate-CcF7rGGB.cjs → startupSessionCreate-B3ND-917.cjs} +3 -3
  182. package/dist/{startupSessionCreate-BtR4iYEC.mjs → startupSessionCreate-CDdaLaMq.mjs} +3 -3
  183. package/dist/store--XN-7MS0.mjs +269 -0
  184. package/dist/store-DV__wCvP.cjs +289 -0
  185. package/dist/{streamRelay-BhI6jqF-.cjs → streamRelay-DFdOaLOn.cjs} +1 -1
  186. package/dist/{streamRelay-DMwOMTKf.mjs → streamRelay-sABnxEXq.mjs} +1 -1
  187. package/dist/{sync-C0PRuTMj.mjs → sync-JoEZKRo8.mjs} +1 -1
  188. package/dist/{sync-Ba8N6xba.cjs → sync-_2lsZ1U2.cjs} +1 -1
  189. package/dist/{systemPrompt-DV5IReD4.cjs → systemPrompt-CJEvNCuW.cjs} +2 -2
  190. package/dist/{systemPrompt-D0q8eyjy.mjs → systemPrompt-Zq4HyrZ5.mjs} +2 -2
  191. package/dist/{teams-z3Gp-KlV.cjs → teams-BNZafnrT.cjs} +7 -7
  192. package/dist/{teams-BO3_arwM.mjs → teams-qz4LqKJ2.mjs} +7 -7
  193. package/dist/{template-DLR_0hfj.mjs → template-CJ8BWSsc.mjs} +1 -1
  194. package/dist/{template-B_5l6pkc.cjs → template-LgvBbOna.cjs} +1 -1
  195. package/dist/{time-Cy0a-7YX.cjs → time-CaUlWSNJ.cjs} +1 -1
  196. package/dist/{time-D0jvDRhn.mjs → time-bzmet4s5.mjs} +1 -1
  197. package/dist/{titleGenerator-RGHWP2YL.cjs → titleGenerator-BuIIu_JP.cjs} +17 -13
  198. package/dist/{titleGenerator-AGQsXskb.mjs → titleGenerator-CbTtJ_1D.mjs} +16 -12
  199. package/dist/{todo-CzIDPLFy.cjs → todo-CQ_BTf9C.cjs} +6 -6
  200. package/dist/{todo-BZ954vsz.mjs → todo-DIrVF_Ak.mjs} +6 -6
  201. package/dist/{tools-B1x1j6tz.cjs → tools-BnmmFZji.cjs} +1 -1
  202. package/dist/{tools-Bei5i03L.mjs → tools-cLOjBvPn.mjs} +1 -1
  203. package/dist/{uninstall-B4T_e3Mr.mjs → uninstall-C5OuW6dE.mjs} +3 -3
  204. package/dist/{uninstall-C3cnIvz1.cjs → uninstall-uEEGKB84.cjs} +3 -3
  205. package/dist/wrapperAccount-DXlD3bsO.mjs +106 -0
  206. package/dist/wrapperAccount-DzoGqS2b.cjs +110 -0
  207. package/package.json +7 -7
  208. package/dist/providerBinding-B-Qbx9W2.cjs +0 -140
  209. package/dist/providerBinding-CYubGg-Z.mjs +0 -132
  210. package/dist/selfCheck-C-rNljKV.mjs +0 -86
  211. package/dist/sessionProvider-DUn91LhJ.mjs +0 -109
  212. package/dist/sessionProvider-Dg691XQ4.cjs +0 -114
@@ -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-Ct2zvaq0.cjs');
7
- var time = require('./time-Cy0a-7YX.cjs');
6
+ var logger = require('./logger-8su64lqR.cjs');
7
+ var time = require('./time-CaUlWSNJ.cjs');
8
8
  var contentLogMetadata = require('./contentLogMetadata-ZSFk_NjQ.cjs');
9
9
  var processTree = require('./processTree-CMHWlVse.cjs');
10
- var _package = require('./package-9n7wd2dT.cjs');
10
+ var _package = require('./package-iuLlSiSF.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,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-GcbI0eg2.mjs';
5
- import { d as delay } from './time-D0jvDRhn.mjs';
4
+ import { l as logger } from './logger-Fd_rNvgd.mjs';
5
+ import { d as delay } from './time-bzmet4s5.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-BsUHyqWe.mjs';
8
+ import { p as packageJson } from './package-6KkRAops.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) => {
@@ -1,6 +1,6 @@
1
1
  import { createId } from '@paralleldrive/cuid2';
2
- import { s as streamKeyOf, j as createEnvelope } from './index-Bq8NKSCF.mjs';
3
- import { t as textResultPayload, b as toolResultPayload } from './api-jfeMRg5R.mjs';
2
+ import { s as streamKeyOf, k as createEnvelope } from './index-DYD3GM1m.mjs';
3
+ import { t as textResultPayload, b as toolResultPayload } from './api-_LeBScjg.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-CLUHaPU8.cjs');
5
- var api = require('./api-BBxZ7y2z.cjs');
4
+ var index = require('./index-BzAYnYct.cjs');
5
+ var api = require('./api-hMDsC6Wg.cjs');
6
6
 
7
7
  function turnOptions(turnId, time) {
8
8
  return turnId ? { turn: turnId, time } : { time };
@@ -1,4 +1,4 @@
1
- import { l as logger } from './logger-GcbI0eg2.mjs';
1
+ import { l as logger } from './logger-Fd_rNvgd.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-Ct2zvaq0.cjs');
3
+ var logger = require('./logger-8su64lqR.cjs');
4
4
 
5
5
  class BasePermissionHandler {
6
6
  pendingRequests = /* @__PURE__ */ new Map();
@@ -0,0 +1,240 @@
1
+ import chalk from 'chalk';
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';
6
+ import 'node:fs';
7
+ import 'node:os';
8
+ import 'node:path';
9
+ import './package-6KkRAops.mjs';
10
+ import 'node:fs/promises';
11
+ import './logger-Fd_rNvgd.mjs';
12
+ import 'node:util';
13
+ import './persistence-DWcHe035.mjs';
14
+ import 'zod';
15
+ import './authRelay-DhQhkBvX.mjs';
16
+ import 'node:crypto';
17
+ import 'tweetnacl';
18
+ import './index-DYD3GM1m.mjs';
19
+ import '@paralleldrive/cuid2';
20
+ import 'node:child_process';
21
+ import './claudeAccountEnv-ON24i0qv.mjs';
22
+ import './store--XN-7MS0.mjs';
23
+
24
+ const ACCOUNT_HELP = `Usage:
25
+ very-happy account list [--json]
26
+ very-happy account login --label <name> Claude subscription (claude setup-token, pick the org in the browser)
27
+ very-happy account login <id> sign an existing subscription account in again
28
+ very-happy account login --label <name> --token-stdin import a token from \`claude setup-token\`
29
+ very-happy account add --label <name> --base-url <url> (--key-file <path> | --key-env <VAR> | --key-stdin) [--model <id>[:<contextWindow>]]...
30
+ very-happy account test <id>
31
+ very-happy account rename <id> <label>
32
+ very-happy account rm <id> [--force]
33
+ very-happy account default <id|machine> account new Claude sessions on this machine start on
34
+ very-happy account bind <sessionId> <id|machine> [--model <id>] [--no-restart]
35
+
36
+ Accounts belong to THIS machine: tokens and keys stay in $HAPPY_HOME_DIR
37
+ (0600) and are never sent to the server. A session bound to an account that
38
+ is missing or expired refuses to run \u2014 it never falls back to the machine login.`;
39
+ function parseAccountArgs(args) {
40
+ const [sub, ...rest] = args;
41
+ if (!sub || sub === "-h" || sub === "--help" || sub === "help") return { action: "help" };
42
+ const flags = /* @__PURE__ */ new Map();
43
+ const bools = /* @__PURE__ */ new Set();
44
+ const positional = [];
45
+ const valued = /* @__PURE__ */ new Set(["--label", "--base-url", "--key-file", "--key-env", "--model"]);
46
+ for (let i = 0; i < rest.length; i++) {
47
+ const arg = rest[i];
48
+ if (arg === "-h" || arg === "--help") return { action: "help" };
49
+ const eq = arg.indexOf("=");
50
+ const name = arg.startsWith("--") && eq > 0 ? arg.slice(0, eq) : arg;
51
+ if (valued.has(name)) {
52
+ const value = eq > 0 && arg.startsWith("--") ? arg.slice(eq + 1) : rest[++i];
53
+ if (value === void 0 || value === "") throw new Error(`${name} needs a value`);
54
+ flags.set(name, [...flags.get(name) ?? [], value]);
55
+ } else if (arg.startsWith("--")) bools.add(arg);
56
+ else positional.push(arg);
57
+ }
58
+ const one = (name) => flags.get(name)?.at(-1);
59
+ const allowed = (names) => {
60
+ for (const b of bools) if (!names.includes(b)) throw new Error(`unknown option ${b}`);
61
+ for (const f of flags.keys()) if (!names.includes(f)) throw new Error(`unknown option ${f}`);
62
+ };
63
+ const machineOr = (id) => id === "machine" || id === "default" ? null : id;
64
+ switch (sub) {
65
+ case "list":
66
+ case "ls":
67
+ allowed(["--json"]);
68
+ return { action: "list", json: bools.has("--json") };
69
+ case "login":
70
+ allowed(["--label", "--token-stdin"]);
71
+ 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") };
74
+ case "add": {
75
+ allowed(["--label", "--base-url", "--key-file", "--key-env", "--key-stdin", "--model"]);
76
+ const label = one("--label");
77
+ const baseUrl = one("--base-url");
78
+ if (!label || !baseUrl) throw new Error("add needs --label and --base-url");
79
+ const sources = [one("--key-file") !== void 0, one("--key-env") !== void 0, bools.has("--key-stdin")].filter(Boolean).length;
80
+ if (sources !== 1) throw new Error("add needs exactly one of --key-file, --key-env, --key-stdin");
81
+ 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" };
82
+ const models = (flags.get("--model") ?? []).map((m) => {
83
+ const match = m.match(/^(.+):(\d+)$/);
84
+ return match ? { id: match[1], contextWindow: Number(match[2]) } : m;
85
+ });
86
+ return { action: "add", label, baseUrl, key, models };
87
+ }
88
+ case "test":
89
+ case "rm":
90
+ case "remove":
91
+ allowed(sub === "test" ? [] : ["--force"]);
92
+ if (positional.length !== 1) throw new Error(`${sub} needs exactly one account id`);
93
+ return sub === "test" ? { action: "test", accountId: positional[0] } : { action: "rm", accountId: positional[0], force: bools.has("--force") };
94
+ case "rename":
95
+ allowed([]);
96
+ if (positional.length !== 2) throw new Error("rename needs <id> <label>");
97
+ return { action: "rename", accountId: positional[0], label: positional[1] };
98
+ case "default":
99
+ allowed([]);
100
+ if (positional.length !== 1) throw new Error("default needs <id|machine>");
101
+ return { action: "default", accountId: machineOr(positional[0]) };
102
+ case "bind":
103
+ allowed(["--model", "--no-restart"]);
104
+ if (positional.length !== 2) throw new Error("bind needs <sessionId> <id|machine>");
105
+ return { action: "bind", sessionId: positional[0], accountId: machineOr(positional[1]), ...one("--model") ? { model: one("--model") } : {}, restart: !bools.has("--no-restart") };
106
+ default:
107
+ throw new Error(`unknown account command "${sub}"`);
108
+ }
109
+ }
110
+ function formatAccountLine(a, isDefault, now) {
111
+ const kind = a.kind === "claude-subscription" ? "subscription" : a.kind === "claude-api" ? "api" : a.kind;
112
+ const extra = [];
113
+ if (a.baseUrl) extra.push(a.baseUrl);
114
+ if (a.models?.length) extra.push(`models: ${a.models.join(", ")}`);
115
+ if (a.keySource === "file" || a.keySource === "env") extra.push(`key: ${a.keySource} ${a.keyRef ?? ""}`.trim());
116
+ if (a.expiresAt) extra.push(`expires ${new Date(a.expiresAt).toISOString().slice(0, 10)}${a.expiresAt - now < 30 * 864e5 && a.expiresAt > now ? " (soon)" : ""}`);
117
+ if (a.legacy) extra.push("from providers.json (read-only)");
118
+ if (a.statusDetail) extra.push(a.statusDetail);
119
+ return `${isDefault ? "*" : " "} ${a.id} ${a.label} [${kind}] ${a.status}${extra.length ? ` \u2014 ${extra.join(" \xB7 ")}` : ""}`;
120
+ }
121
+ async function readStdin() {
122
+ const chunks = [];
123
+ for await (const chunk of process.stdin) chunks.push(Buffer.from(chunk));
124
+ return Buffer.concat(chunks).toString("utf8").trim();
125
+ }
126
+ async function restartOutcome(sessionId) {
127
+ const result = await restartDaemonSession(sessionId);
128
+ if (result.success) return { ok: true };
129
+ const error = result.error ?? "restart failed";
130
+ const stillRunning = await listDaemonSessions().then((children) => children.some((c) => c?.happySessionId === sessionId), () => false);
131
+ return localRestartFailure(error, stillRunning);
132
+ }
133
+ async function loginInteractive(target) {
134
+ const { spawnSetupTokenPty } = await import('./daemonAccounts-BJgt6IJe.mjs');
135
+ const { homedir } = await import('node:os');
136
+ const svc = new AccountService({ home: configuration.happyHomeDir, spawnPty: (env) => spawnSetupTokenPty(homedir(), env) });
137
+ const started = await svc.loginStart({ agent: "claude", kind: "claude-subscription", ...target });
138
+ if (started.state !== "waiting-code" || !started.url) throw new Error(started.error ?? "claude setup-token did not print a sign-in URL");
139
+ console.log("Open this link, choose the organization, authorize, then paste the code shown on the page:\n");
140
+ console.log(started.url + "\n");
141
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
142
+ let code;
143
+ try {
144
+ code = (await rl.question("Code: ")).trim();
145
+ } finally {
146
+ rl.close();
147
+ }
148
+ if (!code) {
149
+ svc.loginCancel(started.loginId);
150
+ throw new Error("no code entered; login canceled");
151
+ }
152
+ svc.loginSubmit({ loginId: started.loginId, code });
153
+ for (; ; ) {
154
+ await new Promise((r) => setTimeout(r, 500));
155
+ const status = svc.loginStatus(started.loginId);
156
+ if (status.state === "exchanging") continue;
157
+ svc.dispose();
158
+ if (status.state === "succeeded" && status.account) return status.account;
159
+ throw new Error(status.error ?? `login ${status.state}`);
160
+ }
161
+ }
162
+ async function handleAccountCommand(args) {
163
+ const parsed = parseAccountArgs(args);
164
+ if (parsed.action === "help") {
165
+ console.log(ACCOUNT_HELP);
166
+ return;
167
+ }
168
+ const service = new AccountService({ home: configuration.happyHomeDir, restartSession: restartOutcome });
169
+ try {
170
+ switch (parsed.action) {
171
+ case "list": {
172
+ const daemonState = await getDaemonAgentProfiles().catch(() => null);
173
+ const state = daemonState ?? service.state();
174
+ if (parsed.json) {
175
+ console.log(JSON.stringify({ accounts: state.accounts, defaults: state.defaults }, null, 2));
176
+ return;
177
+ }
178
+ if (state.accounts.length === 0) {
179
+ console.log("No accounts. Sessions use this machine's own Claude login. Add one with `very-happy account login --label <name>`.");
180
+ return;
181
+ }
182
+ const now = Date.now();
183
+ for (const a of state.accounts) console.log(formatAccountLine(a, state.defaults[a.agent] === a.id, now));
184
+ if (!daemonState && state.accounts.some((a) => a.keySource === "env")) {
185
+ console.log(chalk.dim("Daemon not running: --key-env accounts were checked against THIS shell's environment; the daemon's may differ."));
186
+ }
187
+ if (!state.defaults.claude) console.log(chalk.dim("New sessions use the machine login (no default account)."));
188
+ return;
189
+ }
190
+ case "login": {
191
+ 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);
193
+ console.log(`Signed in: ${account.id} (${account.label}).`);
194
+ return;
195
+ }
196
+ case "add": {
197
+ 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 } : {} });
199
+ console.log(formatAccountLine(account, false, Date.now()));
200
+ return;
201
+ }
202
+ case "test": {
203
+ const account = await service.test(parsed.accountId);
204
+ console.log(formatAccountLine(account, false, Date.now()));
205
+ if (account.status !== "ok") process.exitCode = 1;
206
+ return;
207
+ }
208
+ case "rename":
209
+ console.log(formatAccountLine(service.rename(parsed.accountId, parsed.label), false, Date.now()));
210
+ return;
211
+ case "rm": {
212
+ const { sessions, restarts } = await service.remove(parsed.accountId, parsed.force);
213
+ console.log(`Removed ${parsed.accountId}.${sessions.length ? ` ${sessions.length} bound session(s) restarted and refuse to run until switched.` : ""}`);
214
+ for (const [sessionId, outcome] of Object.entries(restarts ?? {})) if (outcome !== "done") console.log(chalk.dim(` ${sessionId}: restart ${outcome}`));
215
+ return;
216
+ }
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.");
220
+ return;
221
+ case "bind": {
222
+ const result = await service.bind({ sessionId: parsed.sessionId, accountId: parsed.accountId, ...parsed.model ? { model: parsed.model } : {}, restart: parsed.restart });
223
+ const shown = bindResultMessages(result, parsed.sessionId, `${parsed.accountId ?? "machine login"}${parsed.model ? ` / ${parsed.model}` : ""}`, "account");
224
+ for (const line of shown.out) console.log(line);
225
+ for (const line of shown.err) console.error(chalk.yellow(line));
226
+ if (shown.exitCode) process.exitCode = shown.exitCode;
227
+ return;
228
+ }
229
+ }
230
+ } catch (error) {
231
+ if (error instanceof AccountError) {
232
+ const extra = error.sessions?.length ? `
233
+ sessions: ${error.sessions.join(", ")}` : "";
234
+ throw new Error(`${error.message} [${error.code}]${extra}`);
235
+ }
236
+ throw error;
237
+ }
238
+ }
239
+
240
+ export { ACCOUNT_HELP, formatAccountLine, handleAccountCommand, parseAccountArgs };
@@ -0,0 +1,245 @@
1
+ 'use strict';
2
+
3
+ var chalk = require('chalk');
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');
8
+ require('node:fs');
9
+ require('node:os');
10
+ require('node:path');
11
+ require('./package-iuLlSiSF.cjs');
12
+ require('node:fs/promises');
13
+ require('./logger-8su64lqR.cjs');
14
+ require('node:util');
15
+ require('./persistence-B4ttN-fR.cjs');
16
+ require('zod');
17
+ require('./authRelay-Dy1qU9td.cjs');
18
+ require('node:crypto');
19
+ require('tweetnacl');
20
+ require('./index-BzAYnYct.cjs');
21
+ require('@paralleldrive/cuid2');
22
+ require('node:child_process');
23
+ require('./claudeAccountEnv-BOBpJ3k8.cjs');
24
+ require('./store-DV__wCvP.cjs');
25
+
26
+ const ACCOUNT_HELP = `Usage:
27
+ very-happy account list [--json]
28
+ very-happy account login --label <name> Claude subscription (claude setup-token, pick the org in the browser)
29
+ very-happy account login <id> sign an existing subscription account in again
30
+ very-happy account login --label <name> --token-stdin import a token from \`claude setup-token\`
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 test <id>
33
+ very-happy account rename <id> <label>
34
+ very-happy account rm <id> [--force]
35
+ very-happy account default <id|machine> account new Claude sessions on this machine start on
36
+ very-happy account bind <sessionId> <id|machine> [--model <id>] [--no-restart]
37
+
38
+ Accounts belong to THIS machine: tokens and keys stay in $HAPPY_HOME_DIR
39
+ (0600) and are never sent to the server. A session bound to an account that
40
+ is missing or expired refuses to run \u2014 it never falls back to the machine login.`;
41
+ function parseAccountArgs(args) {
42
+ const [sub, ...rest] = args;
43
+ if (!sub || sub === "-h" || sub === "--help" || sub === "help") return { action: "help" };
44
+ const flags = /* @__PURE__ */ new Map();
45
+ const bools = /* @__PURE__ */ new Set();
46
+ const positional = [];
47
+ const valued = /* @__PURE__ */ new Set(["--label", "--base-url", "--key-file", "--key-env", "--model"]);
48
+ for (let i = 0; i < rest.length; i++) {
49
+ const arg = rest[i];
50
+ if (arg === "-h" || arg === "--help") return { action: "help" };
51
+ const eq = arg.indexOf("=");
52
+ const name = arg.startsWith("--") && eq > 0 ? arg.slice(0, eq) : arg;
53
+ if (valued.has(name)) {
54
+ const value = eq > 0 && arg.startsWith("--") ? arg.slice(eq + 1) : rest[++i];
55
+ if (value === void 0 || value === "") throw new Error(`${name} needs a value`);
56
+ flags.set(name, [...flags.get(name) ?? [], value]);
57
+ } else if (arg.startsWith("--")) bools.add(arg);
58
+ else positional.push(arg);
59
+ }
60
+ const one = (name) => flags.get(name)?.at(-1);
61
+ const allowed = (names) => {
62
+ for (const b of bools) if (!names.includes(b)) throw new Error(`unknown option ${b}`);
63
+ for (const f of flags.keys()) if (!names.includes(f)) throw new Error(`unknown option ${f}`);
64
+ };
65
+ const machineOr = (id) => id === "machine" || id === "default" ? null : id;
66
+ switch (sub) {
67
+ case "list":
68
+ case "ls":
69
+ allowed(["--json"]);
70
+ return { action: "list", json: bools.has("--json") };
71
+ case "login":
72
+ allowed(["--label", "--token-stdin"]);
73
+ 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") };
76
+ case "add": {
77
+ allowed(["--label", "--base-url", "--key-file", "--key-env", "--key-stdin", "--model"]);
78
+ const label = one("--label");
79
+ const baseUrl = one("--base-url");
80
+ if (!label || !baseUrl) throw new Error("add needs --label and --base-url");
81
+ const sources = [one("--key-file") !== void 0, one("--key-env") !== void 0, bools.has("--key-stdin")].filter(Boolean).length;
82
+ if (sources !== 1) throw new Error("add needs exactly one of --key-file, --key-env, --key-stdin");
83
+ 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" };
84
+ const models = (flags.get("--model") ?? []).map((m) => {
85
+ const match = m.match(/^(.+):(\d+)$/);
86
+ return match ? { id: match[1], contextWindow: Number(match[2]) } : m;
87
+ });
88
+ return { action: "add", label, baseUrl, key, models };
89
+ }
90
+ case "test":
91
+ case "rm":
92
+ case "remove":
93
+ allowed(sub === "test" ? [] : ["--force"]);
94
+ if (positional.length !== 1) throw new Error(`${sub} needs exactly one account id`);
95
+ return sub === "test" ? { action: "test", accountId: positional[0] } : { action: "rm", accountId: positional[0], force: bools.has("--force") };
96
+ case "rename":
97
+ allowed([]);
98
+ if (positional.length !== 2) throw new Error("rename needs <id> <label>");
99
+ return { action: "rename", accountId: positional[0], label: positional[1] };
100
+ case "default":
101
+ allowed([]);
102
+ if (positional.length !== 1) throw new Error("default needs <id|machine>");
103
+ return { action: "default", accountId: machineOr(positional[0]) };
104
+ case "bind":
105
+ allowed(["--model", "--no-restart"]);
106
+ if (positional.length !== 2) throw new Error("bind needs <sessionId> <id|machine>");
107
+ return { action: "bind", sessionId: positional[0], accountId: machineOr(positional[1]), ...one("--model") ? { model: one("--model") } : {}, restart: !bools.has("--no-restart") };
108
+ default:
109
+ throw new Error(`unknown account command "${sub}"`);
110
+ }
111
+ }
112
+ function formatAccountLine(a, isDefault, now) {
113
+ const kind = a.kind === "claude-subscription" ? "subscription" : a.kind === "claude-api" ? "api" : a.kind;
114
+ const extra = [];
115
+ if (a.baseUrl) extra.push(a.baseUrl);
116
+ if (a.models?.length) extra.push(`models: ${a.models.join(", ")}`);
117
+ if (a.keySource === "file" || a.keySource === "env") extra.push(`key: ${a.keySource} ${a.keyRef ?? ""}`.trim());
118
+ if (a.expiresAt) extra.push(`expires ${new Date(a.expiresAt).toISOString().slice(0, 10)}${a.expiresAt - now < 30 * 864e5 && a.expiresAt > now ? " (soon)" : ""}`);
119
+ if (a.legacy) extra.push("from providers.json (read-only)");
120
+ if (a.statusDetail) extra.push(a.statusDetail);
121
+ return `${isDefault ? "*" : " "} ${a.id} ${a.label} [${kind}] ${a.status}${extra.length ? ` \u2014 ${extra.join(" \xB7 ")}` : ""}`;
122
+ }
123
+ async function readStdin() {
124
+ const chunks = [];
125
+ for await (const chunk of process.stdin) chunks.push(Buffer.from(chunk));
126
+ return Buffer.concat(chunks).toString("utf8").trim();
127
+ }
128
+ async function restartOutcome(sessionId) {
129
+ const result = await controlClient.restartDaemonSession(sessionId);
130
+ if (result.success) return { ok: true };
131
+ const error = result.error ?? "restart failed";
132
+ const stillRunning = await controlClient.listDaemonSessions().then((children) => children.some((c) => c?.happySessionId === sessionId), () => false);
133
+ return accountService.localRestartFailure(error, stillRunning);
134
+ }
135
+ async function loginInteractive(target) {
136
+ const { spawnSetupTokenPty } = await Promise.resolve().then(function () { return require('./daemonAccounts-BCjDgoNt.cjs'); });
137
+ const { homedir } = await import('node:os');
138
+ const svc = new accountService.AccountService({ home: configuration.configuration.happyHomeDir, spawnPty: (env) => spawnSetupTokenPty(homedir(), env) });
139
+ const started = await svc.loginStart({ agent: "claude", kind: "claude-subscription", ...target });
140
+ if (started.state !== "waiting-code" || !started.url) throw new Error(started.error ?? "claude setup-token did not print a sign-in URL");
141
+ console.log("Open this link, choose the organization, authorize, then paste the code shown on the page:\n");
142
+ console.log(started.url + "\n");
143
+ const rl = promises.createInterface({ input: process.stdin, output: process.stdout });
144
+ let code;
145
+ try {
146
+ code = (await rl.question("Code: ")).trim();
147
+ } finally {
148
+ rl.close();
149
+ }
150
+ if (!code) {
151
+ svc.loginCancel(started.loginId);
152
+ throw new Error("no code entered; login canceled");
153
+ }
154
+ svc.loginSubmit({ loginId: started.loginId, code });
155
+ for (; ; ) {
156
+ await new Promise((r) => setTimeout(r, 500));
157
+ const status = svc.loginStatus(started.loginId);
158
+ if (status.state === "exchanging") continue;
159
+ svc.dispose();
160
+ if (status.state === "succeeded" && status.account) return status.account;
161
+ throw new Error(status.error ?? `login ${status.state}`);
162
+ }
163
+ }
164
+ async function handleAccountCommand(args) {
165
+ const parsed = parseAccountArgs(args);
166
+ if (parsed.action === "help") {
167
+ console.log(ACCOUNT_HELP);
168
+ return;
169
+ }
170
+ const service = new accountService.AccountService({ home: configuration.configuration.happyHomeDir, restartSession: restartOutcome });
171
+ try {
172
+ switch (parsed.action) {
173
+ case "list": {
174
+ const daemonState = await controlClient.getDaemonAgentProfiles().catch(() => null);
175
+ const state = daemonState ?? service.state();
176
+ if (parsed.json) {
177
+ console.log(JSON.stringify({ accounts: state.accounts, defaults: state.defaults }, null, 2));
178
+ return;
179
+ }
180
+ if (state.accounts.length === 0) {
181
+ console.log("No accounts. Sessions use this machine's own Claude login. Add one with `very-happy account login --label <name>`.");
182
+ return;
183
+ }
184
+ const now = Date.now();
185
+ for (const a of state.accounts) console.log(formatAccountLine(a, state.defaults[a.agent] === a.id, now));
186
+ if (!daemonState && state.accounts.some((a) => a.keySource === "env")) {
187
+ console.log(chalk.dim("Daemon not running: --key-env accounts were checked against THIS shell's environment; the daemon's may differ."));
188
+ }
189
+ if (!state.defaults.claude) console.log(chalk.dim("New sessions use the machine login (no default account)."));
190
+ return;
191
+ }
192
+ case "login": {
193
+ 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);
195
+ console.log(`Signed in: ${account.id} (${account.label}).`);
196
+ return;
197
+ }
198
+ case "add": {
199
+ 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 } : {} });
201
+ console.log(formatAccountLine(account, false, Date.now()));
202
+ return;
203
+ }
204
+ case "test": {
205
+ const account = await service.test(parsed.accountId);
206
+ console.log(formatAccountLine(account, false, Date.now()));
207
+ if (account.status !== "ok") process.exitCode = 1;
208
+ return;
209
+ }
210
+ case "rename":
211
+ console.log(formatAccountLine(service.rename(parsed.accountId, parsed.label), false, Date.now()));
212
+ return;
213
+ case "rm": {
214
+ const { sessions, restarts } = await service.remove(parsed.accountId, parsed.force);
215
+ console.log(`Removed ${parsed.accountId}.${sessions.length ? ` ${sessions.length} bound session(s) restarted and refuse to run until switched.` : ""}`);
216
+ for (const [sessionId, outcome] of Object.entries(restarts ?? {})) if (outcome !== "done") console.log(chalk.dim(` ${sessionId}: restart ${outcome}`));
217
+ return;
218
+ }
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.");
222
+ return;
223
+ case "bind": {
224
+ const result = await service.bind({ sessionId: parsed.sessionId, accountId: parsed.accountId, ...parsed.model ? { model: parsed.model } : {}, restart: parsed.restart });
225
+ const shown = accountService.bindResultMessages(result, parsed.sessionId, `${parsed.accountId ?? "machine login"}${parsed.model ? ` / ${parsed.model}` : ""}`, "account");
226
+ for (const line of shown.out) console.log(line);
227
+ for (const line of shown.err) console.error(chalk.yellow(line));
228
+ if (shown.exitCode) process.exitCode = shown.exitCode;
229
+ return;
230
+ }
231
+ }
232
+ } catch (error) {
233
+ if (error instanceof accountService.AccountError) {
234
+ const extra = error.sessions?.length ? `
235
+ sessions: ${error.sessions.join(", ")}` : "";
236
+ throw new Error(`${error.message} [${error.code}]${extra}`);
237
+ }
238
+ throw error;
239
+ }
240
+ }
241
+
242
+ exports.ACCOUNT_HELP = ACCOUNT_HELP;
243
+ exports.formatAccountLine = formatAccountLine;
244
+ exports.handleAccountCommand = handleAccountCommand;
245
+ exports.parseAccountArgs = parseAccountArgs;