very-happy-cli 0.2.182 → 0.2.184

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 (204) hide show
  1. package/dist/{AcpBackend-DLk3gMYH.mjs → AcpBackend-Csg7Sy2P.mjs} +3 -3
  2. package/dist/{AcpBackend-JA5eu8Y0.cjs → AcpBackend-DOzn74zn.cjs} +3 -3
  3. package/dist/{AcpSessionManager-OrCww-Qv.mjs → AcpSessionManager-BRK2F2yN.mjs} +10 -3
  4. package/dist/{AcpSessionManager-DjYidq4C.cjs → AcpSessionManager-CJXDNNtq.cjs} +10 -3
  5. package/dist/{BasePermissionHandler-u-neo-iN.mjs → BasePermissionHandler-BqYwrCra.mjs} +1 -1
  6. package/dist/{BasePermissionHandler-D3PMKLBS.cjs → BasePermissionHandler-CfrnkG3v.cjs} +1 -1
  7. package/dist/{acpSessionResume-Dxo8222T.cjs → acpSessionResume-DZ65DBeE.cjs} +1 -1
  8. package/dist/{acpSessionResume-u2TwX5Jd.mjs → acpSessionResume-Dz1myMbR.mjs} +1 -1
  9. package/dist/{agentHome-D3hNrnoA.mjs → agentHome-B_tu3tFJ.mjs} +4 -4
  10. package/dist/{agentHome-CP1tCBXz.cjs → agentHome-CKAXhc8P.cjs} +4 -4
  11. package/dist/{api-C_YSQnsi.mjs → api-BpTDU2BO.mjs} +79 -12
  12. package/dist/{api-CZWcG7uh.cjs → api-rw5xkzxo.cjs} +81 -11
  13. package/dist/{apiMachine-DPGrED5C.cjs → apiMachine-Bs1XXHKs.cjs} +14 -14
  14. package/dist/{apiMachine-C_GA5Bm-.mjs → apiMachine-wp0hWG3F.mjs} +14 -14
  15. package/dist/{attachmentContent-Ckzyb1Uy.mjs → attachmentContent-CWSSGMMo.mjs} +2 -2
  16. package/dist/{attachmentContent-I_dJIevE.cjs → attachmentContent-K_Up4InS.cjs} +2 -2
  17. package/dist/{auth-BKnE7uv7.cjs → auth-C4_mXYgj.cjs} +8 -8
  18. package/dist/{auth-DOXMI-xp.mjs → auth-CBESCCCn.mjs} +8 -8
  19. package/dist/{auth-CGgpiJ5-.mjs → auth-D6kSt2sR.mjs} +5 -5
  20. package/dist/{auth-Lw_utSMV.cjs → auth-gGryJImw.cjs} +5 -5
  21. package/dist/{auto-Z56mMZnH.mjs → auto-CEucVmFR.mjs} +32 -26
  22. package/dist/{auto-CIgFHIyQ.cjs → auto-Do43AOza.cjs} +32 -25
  23. package/dist/{bootstrap-DsXp74wv.cjs → bootstrap-BPz1iX77.cjs} +2 -2
  24. package/dist/{bootstrap-D3vlOROj.mjs → bootstrap-CodyCmGt.mjs} +2 -2
  25. package/dist/{browser-CUxGoATV.mjs → browser-CqMhj8Gm.mjs} +1 -1
  26. package/dist/{browser-CZlA9AkO.cjs → browser-D9D-1eqa.cjs} +1 -1
  27. package/dist/{claudeLocal-FnTUgwCi.mjs → claudeLocal-BgIRtT3Q.mjs} +5 -5
  28. package/dist/{claudeLocal-oELvwiZL.cjs → claudeLocal-Dywp8NKr.cjs} +5 -5
  29. package/dist/{claudeLocalLauncher-CO5YHCzi.mjs → claudeLocalLauncher-CaHjZ8HW.mjs} +10 -10
  30. package/dist/{claudeLocalLauncher-QsVXEVdE.cjs → claudeLocalLauncher-_TOL73g5.cjs} +10 -10
  31. package/dist/{claudeSessionFork-Cspr6QW0.mjs → claudeSessionFork-C9nB7fs5.mjs} +1 -1
  32. package/dist/{claudeSessionFork-BA4GE5AL.cjs → claudeSessionFork-jq-_WiAu.cjs} +1 -1
  33. package/dist/{client-CDuW4MS9.cjs → client-BFDji81N.cjs} +15 -7
  34. package/dist/{client-Ctbw05Xj.mjs → client-BdbVizjk.mjs} +15 -7
  35. package/dist/{client-xnWiHqdb.cjs → client-ByZFACEw.cjs} +18 -5
  36. package/dist/{client-DK8CzUry.cjs → client-C49zFRkX.cjs} +2 -2
  37. package/dist/{client-o-meK7-a.mjs → client-CX-_2myt.mjs} +2 -2
  38. package/dist/{client-BGfmSbWc.mjs → client-DwlYk8uJ.mjs} +18 -5
  39. package/dist/codex/happyMcpStdioBridge.cjs +16 -16
  40. package/dist/codex/happyMcpStdioBridge.mjs +16 -16
  41. package/dist/{codexAppServerClient-BlsOZLul.mjs → codexAppServerClient-CmOIqiNQ.mjs} +3 -3
  42. package/dist/{codexAppServerClient-DhNDTU_i.cjs → codexAppServerClient-DF12ZSw1.cjs} +3 -3
  43. package/dist/{codexCommand-BGx5NMQR.mjs → codexCommand-BN05uEyv.mjs} +94 -60
  44. package/dist/{codexCommand-DJDPfpIs.cjs → codexCommand-H-ObWTtx.cjs} +94 -60
  45. package/dist/{codexTermination-CVhhwHZU.mjs → codexTermination-Byohgj8h.mjs} +1 -1
  46. package/dist/{codexTermination-CqPMuokw.cjs → codexTermination-RwKa8pKk.cjs} +1 -1
  47. package/dist/{config-CWAe08-Q.mjs → config-ChHLh-hf.mjs} +3 -3
  48. package/dist/{config-CHpxzXBL.cjs → config-D_wNqwxX.cjs} +3 -3
  49. package/dist/{configuration-B-CugKJ3.cjs → configuration-C9Sx-Foo.cjs} +1 -1
  50. package/dist/{configuration-YXw_Dcsb.mjs → configuration-CVgUe2qN.mjs} +1 -1
  51. package/dist/{connect-BmHvMXH2.cjs → connect-B61xJDRq.cjs} +13 -13
  52. package/dist/{connect-CPeJXHha.mjs → connect-DJEQjS7C.mjs} +13 -13
  53. package/dist/{context-BtIVqHI5.cjs → context-Bf3BG7w8.cjs} +1 -1
  54. package/dist/{context-Drzs_Z38.mjs → context-CDPfhHTo.mjs} +1 -1
  55. package/dist/{controlClient-D0kGwKYx.cjs → controlClient-BLO1_pPx.cjs} +14 -3
  56. package/dist/{controlClient-BL4hb4l3.mjs → controlClient-DMCxtwq2.mjs} +14 -4
  57. package/dist/{createSessionMetadata-L499emJn.cjs → createSessionMetadata-5Mde6Dfh.cjs} +2 -2
  58. package/dist/{createSessionMetadata-DvGDsnsn.mjs → createSessionMetadata-BYroCdrU.mjs} +2 -2
  59. package/dist/daemonSupervisor-57JYYzMf.cjs +268 -0
  60. package/dist/daemonSupervisor-DfzrtNhM.mjs +245 -0
  61. package/dist/{defaultPermissionMode-MXpZlXud.cjs → defaultPermissionMode-B7mjHQKp.cjs} +2 -2
  62. package/dist/{defaultPermissionMode-BLfxu-Yz.mjs → defaultPermissionMode-CTdxUV_3.mjs} +2 -2
  63. package/dist/{deterministicJson-CfLkBRvU.cjs → deterministicJson-C1Z9MlDX.cjs} +569 -17
  64. package/dist/{deterministicJson-B_UAbmQ4.mjs → deterministicJson-C3QXOc1N.mjs} +572 -21
  65. package/dist/{doctor-DMvlzmnE.cjs → doctor-DRdV3thy.cjs} +7 -7
  66. package/dist/{doctor-bKScPtZu.mjs → doctor-OwNmTpYh.mjs} +7 -7
  67. package/dist/{downloadTarget-J9j37eFG.mjs → downloadTarget-CNtQ8rhV.mjs} +6 -6
  68. package/dist/{downloadTarget-D33BFvew.cjs → downloadTarget-Di5bf7r0.cjs} +6 -6
  69. package/dist/{ensureDaemonRunning-2IqWROJp.cjs → ensureDaemonRunning-CMY--T9Q.cjs} +5 -5
  70. package/dist/{ensureDaemonRunning-DLvwhpNg.mjs → ensureDaemonRunning-IRV-w0wH.mjs} +5 -5
  71. package/dist/{handleResumeCommand-CjtjQ_I7.mjs → handleResumeCommand-BO00SYjG.mjs} +5 -5
  72. package/dist/{handleResumeCommand-Dp2Y-p6V.cjs → handleResumeCommand-z7wY7QVM.cjs} +5 -5
  73. package/dist/{index-DYVIbhAJ.cjs → index-B4cyX2by.cjs} +40 -40
  74. package/dist/{index-B_aNaW9w.cjs → index-BsoUsrKS.cjs} +4 -4
  75. package/dist/{index-Cllzqoes.mjs → index-C7zgeuLP.mjs} +4 -4
  76. package/dist/{index-D_LvOWUN.mjs → index-CVUiytNq.mjs} +3 -3
  77. package/dist/{index-BOT0Tg5E.mjs → index-DZvi6_tB.mjs} +4 -4
  78. package/dist/{index-BI0h2Zks.mjs → index-DisBaRvM.mjs} +277 -77
  79. package/dist/{index-CZC7egJA.cjs → index-NhmqjrGv.cjs} +3 -3
  80. package/dist/{index-oh8XEozJ.cjs → index-Ub-5xbcU.cjs} +286 -76
  81. package/dist/{index-kA46KMxN.mjs → index-_LfuIz-O.mjs} +41 -41
  82. package/dist/{index-DymOv3kK.cjs → index-wYJu2yGc.cjs} +4 -4
  83. package/dist/index.cjs +2 -2
  84. package/dist/index.mjs +2 -2
  85. package/dist/{install-D2NCbeJ-.cjs → install-BATFlr_l.cjs} +2 -2
  86. package/dist/{install-BAa_Xmof.cjs → install-CGYDeYes.cjs} +3 -3
  87. package/dist/{install-C46mkr9a.mjs → install-DeUM6h8X.mjs} +3 -3
  88. package/dist/{install-D0inLCv-.mjs → install-F3rP8tBU.mjs} +2 -2
  89. package/dist/lib.cjs +12 -12
  90. package/dist/lib.d.cts +1 -1
  91. package/dist/lib.d.mts +1 -1
  92. package/dist/lib.mjs +12 -12
  93. package/dist/{lidState-DcPvwniz.cjs → lidState-C4YgPn6y.cjs} +1 -1
  94. package/dist/{lidState-D8Iuvjgl.mjs → lidState-CBjQEwTt.mjs} +1 -1
  95. package/dist/{localHappyAgentAuth-SD6GM97y.cjs → localHappyAgentAuth-BzCuIkzi.cjs} +1 -1
  96. package/dist/{localHappyAgentAuth-D3rQDRd9.mjs → localHappyAgentAuth-CcWGU_lS.mjs} +1 -1
  97. package/dist/{logger-DK1ytCz6.cjs → logger-CrtT0opS.cjs} +2 -2
  98. package/dist/{logger-DpqihN1f.mjs → logger-D2qd0mMg.mjs} +2 -2
  99. package/dist/{machineMetadata-D4E3qoIG.mjs → machineMetadata-B2czDiTd.mjs} +3 -3
  100. package/dist/{machineMetadata-IJc6_iyx.cjs → machineMetadata-D1hlm_oF.cjs} +3 -3
  101. package/dist/{main-CpUmw7hm.mjs → main-BNYWELul.mjs} +69 -56
  102. package/dist/{main-DUXh2rgW.cjs → main-BWgWN5d1.cjs} +69 -56
  103. package/dist/{mcp-D5f3Vd-z.cjs → mcp-C18unjs1.cjs} +15 -15
  104. package/dist/{mcp-66g1TJ8P.mjs → mcp-ColtiH23.mjs} +15 -15
  105. package/dist/{mirrorProtocol-DkWOcZh9.cjs → mirrorProtocol-D4CR5I5W.cjs} +3 -3
  106. package/dist/{mirrorProtocol-bsCUcaCY.mjs → mirrorProtocol-DTHWtAE5.mjs} +3 -3
  107. package/dist/{package-BfeqAzyJ.cjs → package-DczR1k0c.cjs} +7 -7
  108. package/dist/{package-CKj8zndE.mjs → package-Ek5FOyEo.mjs} +7 -7
  109. package/dist/{panels-r8LmaBs6.mjs → panels-BIQ7FrCB.mjs} +5 -5
  110. package/dist/{panels-2PXsw9-d.cjs → panels-DYSMHhdb.cjs} +5 -5
  111. package/dist/{peerTools-D_id4d41.mjs → peerTools-CABQ6iKd.mjs} +5 -5
  112. package/dist/{peerTools-BVp1z0T_.cjs → peerTools-Cufh4Qp_.cjs} +5 -5
  113. package/dist/{persistence-jOEuAFTS.mjs → persistence-DFtgQvr6.mjs} +2 -2
  114. package/dist/{persistence-BdpwWXKh.cjs → persistence-IYH6bAXY.cjs} +2 -2
  115. package/dist/{piRunnerArgs-68I5F_M1.mjs → piRunnerArgs-CIWprC1S.mjs} +1 -1
  116. package/dist/{piRunnerArgs-vxCHKnSA.cjs → piRunnerArgs-Dgjmj8KL.cjs} +1 -1
  117. package/dist/{piRuntime-C3Dg5uni.cjs → piRuntime-C_nX977w.cjs} +2 -2
  118. package/dist/{piRuntime-DgLIard1.mjs → piRuntime-K6o4GPZ9.mjs} +2 -2
  119. package/dist/{piTerminal-DJL0w-uA.mjs → piTerminal-CRl0EZc3.mjs} +18 -18
  120. package/dist/{piTerminal-C135BcLP.cjs → piTerminal-CYhcmkyi.cjs} +18 -18
  121. package/dist/providerBinding-B-Qbx9W2.cjs +140 -0
  122. package/dist/providerBinding-CYubGg-Z.mjs +132 -0
  123. package/dist/{pushNotifications-CyQVDThC.cjs → pushNotifications-BgQ_QTgS.cjs} +3 -3
  124. package/dist/{pushNotifications-CMmRsbKv.mjs → pushNotifications-gVJWGFBP.mjs} +3 -3
  125. package/dist/{query-CPXnDURZ.mjs → query-CGp9vY4e.mjs} +1 -1
  126. package/dist/{query-CK--1fbL.cjs → query-DFreaScb.cjs} +1 -1
  127. package/dist/{rateLimitWindows-DJxnNw-X.cjs → rateLimitWindows-CeogT1b6.cjs} +1 -1
  128. package/dist/{rateLimitWindows-Cqa4AGaB.mjs → rateLimitWindows-DM_gshI4.mjs} +1 -1
  129. package/dist/{registerCommonHandlers-DbNoM39q.cjs → registerCommonHandlers-CRqKXwQt.cjs} +2 -2
  130. package/dist/{registerCommonHandlers-K8dICQO2.mjs → registerCommonHandlers-CyAtDNvs.mjs} +2 -2
  131. package/dist/{registerKillSessionHandler-DiS_go8d.cjs → registerKillSessionHandler-CX49N52L.cjs} +6 -6
  132. package/dist/{registerKillSessionHandler-O1iriOMO.mjs → registerKillSessionHandler-DGWADNla.mjs} +6 -6
  133. package/dist/{remoteSessionClient-BlURPulk.mjs → remoteSessionClient-1nycIdrG.mjs} +5 -5
  134. package/dist/{remoteSessionClient-CtV9mDko.cjs → remoteSessionClient-CuAkp19e.cjs} +5 -5
  135. package/dist/{reportProgressTool-DlD_xjzU.cjs → reportProgressTool-BS7TkeEk.cjs} +4 -4
  136. package/dist/{reportProgressTool-nCExrHZH.mjs → reportProgressTool-CdSi-uSC.mjs} +4 -4
  137. package/dist/{resources-CH1iP6Cv.mjs → resources-CLdQfe3b.mjs} +1 -1
  138. package/dist/{resources-BPyN59Iv.cjs → resources-CqwHPhdK.cjs} +1 -1
  139. package/dist/{run-drtwHYkO.mjs → run-DqjEj8M2.mjs} +101 -248
  140. package/dist/{run-BBNrcCfI.cjs → run-gVwkplx0.cjs} +111 -259
  141. package/dist/{runClaude-B3KSeby4.cjs → runClaude-CtVoFstP.cjs} +39 -24
  142. package/dist/{runClaude-CFp27Tyi.mjs → runClaude-CuSjrZSf.mjs} +39 -24
  143. package/dist/{runClaudeDeps-C_C9TCI0.cjs → runClaudeDeps-DqOgRuKq.cjs} +49 -40
  144. package/dist/{runClaudeDeps-DMcv93lA.mjs → runClaudeDeps-eazOhb6g.mjs} +54 -45
  145. package/dist/{runGemini-DzdSBAr9.cjs → runGemini-81wkPvMv.cjs} +37 -35
  146. package/dist/{runGemini-Bc6SY-hd.mjs → runGemini-B4EqAd1U.mjs} +37 -35
  147. package/dist/{runOpenClaw-DN6rEVqC.cjs → runOpenClaw-BK7ZQEKj.cjs} +18 -18
  148. package/dist/{runOpenClaw-DI0qMlgF.mjs → runOpenClaw-Brb1KKAA.mjs} +18 -18
  149. package/dist/{sandbox-DtttPBMA.cjs → sandbox-DFD6an8o.cjs} +4 -4
  150. package/dist/{sandbox-v-ffe8LR.mjs → sandbox-t43Exd4t.mjs} +4 -4
  151. package/dist/{selfCheck-B-yy6bW3.cjs → selfCheck-Bel50SH3.cjs} +37 -36
  152. package/dist/selfCheck-CwpZepG-.mjs +86 -0
  153. package/dist/{send-DpBwSZuj.mjs → send-Co9jxmc4.mjs} +8 -8
  154. package/dist/{send-ShzXYPRu.cjs → send-IR5DnG9V.cjs} +8 -8
  155. package/dist/{server-CEzKrfKj.cjs → server-CAo6a3Vw.cjs} +6 -6
  156. package/dist/{server-DScgJXxa.mjs → server-KnIeKeTb.mjs} +4 -4
  157. package/dist/{sessionLock-Dc0fadGG.cjs → sessionLock-DNGDn9oj.cjs} +3 -3
  158. package/dist/{sessionLock-B6K4SBZD.mjs → sessionLock-ha9gsQEn.mjs} +3 -3
  159. package/dist/{sessionOps-D0BPWPoh.mjs → sessionOps-Di9MC0FP.mjs} +4 -4
  160. package/dist/{sessionOps-Dx7wARjI.cjs → sessionOps-hRqzcMXB.cjs} +4 -4
  161. package/dist/sessionProvider-4Nn6e9Kd.mjs +109 -0
  162. package/dist/sessionProvider-LqE7Y_cf.cjs +114 -0
  163. package/dist/{sessionScanner-BJ35TVG6.cjs → sessionScanner-BzEtrHB8.cjs} +3 -3
  164. package/dist/{sessionScanner-9Fpgaxtf.mjs → sessionScanner-DKFKDsrW.mjs} +3 -3
  165. package/dist/{sessions-TZGGAry1.cjs → sessions-CmLiagcb.cjs} +10 -10
  166. package/dist/{sessions-CFtDlyZd.mjs → sessions-DzgMNXo5.mjs} +10 -10
  167. package/dist/{setupOfflineReconnection-Biaus-0T.mjs → setupOfflineReconnection-D4NGi3Jf.mjs} +2 -2
  168. package/dist/{setupOfflineReconnection-B1GsVA8P.cjs → setupOfflineReconnection-Dq4N2Txp.cjs} +2 -2
  169. package/dist/{spawn-CsoQ-Ecz.mjs → spawn-C6CE5PsI.mjs} +14 -14
  170. package/dist/{spawn-BRTuypQ2.cjs → spawn-tmoekkOW.cjs} +14 -14
  171. package/dist/{spawnAgents-CG211IW7.cjs → spawnAgents-D15n6tAj.cjs} +1 -1
  172. package/dist/{spawnAgents-Co-SLcx-.mjs → spawnAgents-jXo9jIYo.mjs} +1 -1
  173. package/dist/{spawnHappyCLI-D1doCjkZ.mjs → spawnHappyCLI-66grqHO0.mjs} +1 -1
  174. package/dist/{spawnHappyCLI-D47kX6jg.cjs → spawnHappyCLI-8NcKgkuy.cjs} +1 -1
  175. package/dist/{specialCommands-xSmqT_Fu.mjs → specialCommands-BO8ipH0n.mjs} +3 -3
  176. package/dist/{specialCommands-Ch-Gvy-i.cjs → specialCommands-Dq0TmY1Z.cjs} +3 -3
  177. package/dist/{startFileWatcher-CCl2fFxT.mjs → startFileWatcher-BLDkieUW.mjs} +1 -1
  178. package/dist/{startFileWatcher-gKQTstR6.cjs → startFileWatcher-CjgKvec9.cjs} +1 -1
  179. package/dist/{startupSessionCreate-DlZc8yPl.mjs → startupSessionCreate-B60THeNz.mjs} +1 -1
  180. package/dist/{startupSessionCreate-BXqoUX30.cjs → startupSessionCreate-CXRVahaU.cjs} +1 -1
  181. package/dist/{streamRelay-B-J-4St1.cjs → streamRelay-CtTpf-Li.cjs} +1 -1
  182. package/dist/{streamRelay-DnJXsi36.mjs → streamRelay-GzHxvMem.mjs} +1 -1
  183. package/dist/{sync-BbjMC3sR.mjs → sync-DJvx7RbO.mjs} +1 -1
  184. package/dist/{sync-BxMdnZzz.cjs → sync-DKSZOi6w.cjs} +1 -1
  185. package/dist/{systemPrompt-C2KojRmK.cjs → systemPrompt-Duos1BtM.cjs} +2 -2
  186. package/dist/{systemPrompt-CmSDAoIx.mjs → systemPrompt-dOOpz8L7.mjs} +2 -2
  187. package/dist/{teams-DESdalox.cjs → teams-pO5rjvPO.cjs} +9 -9
  188. package/dist/{teams-lRy1MS0Z.mjs → teams-uWiMJEe1.mjs} +9 -9
  189. package/dist/{template-BaHAmH2K.cjs → template-BLJxflCH.cjs} +32 -2
  190. package/dist/{template-CiOPa2rd.mjs → template-YlpbYGeQ.mjs} +31 -3
  191. package/dist/{time-DNLeIRgR.cjs → time-D-8GFCE7.cjs} +1 -1
  192. package/dist/{time-Cfknl7xG.mjs → time-Du0scQeJ.mjs} +1 -1
  193. package/dist/{titleGenerator-ClnMSzwC.mjs → titleGenerator-DKYj8rLY.mjs} +1 -1
  194. package/dist/{titleGenerator-YNutaU88.cjs → titleGenerator-DnKygjBP.cjs} +2 -2
  195. package/dist/{todo-DS75Mboz.cjs → todo-BFDb7O8q.cjs} +6 -6
  196. package/dist/{todo-DZbK5POc.mjs → todo-Du5dAwnt.mjs} +6 -6
  197. package/dist/{tools-BgdU0dWp.mjs → tools-DHvMVL0a.mjs} +1 -1
  198. package/dist/{tools-ClYcb1YQ.cjs → tools-DK_x86Kl.cjs} +1 -1
  199. package/dist/{uninstall-bXenFevR.mjs → uninstall-CLDEXir0.mjs} +3 -3
  200. package/dist/{uninstall-Di1vPBLV.cjs → uninstall-c3zjum2o.cjs} +3 -3
  201. package/package.json +7 -7
  202. package/dist/daemonSupervisor-B-SPSqhs.cjs +0 -13
  203. package/dist/daemonSupervisor-C6urv3_8.mjs +0 -10
  204. package/dist/selfCheck-BDfTwxqB.mjs +0 -85
@@ -1,27 +1,27 @@
1
1
  'use strict';
2
2
 
3
- var mirrorProtocol = require('./mirrorProtocol-DkWOcZh9.cjs');
3
+ var mirrorProtocol = require('./mirrorProtocol-D4CR5I5W.cjs');
4
4
  var fsMkdir = require('./fsMkdir-0K3yENml.cjs');
5
- var piRunnerArgs = require('./piRunnerArgs-vxCHKnSA.cjs');
5
+ var piRunnerArgs = require('./piRunnerArgs-Dgjmj8KL.cjs');
6
6
  var fs = require('fs/promises');
7
7
  var os$1 = require('os');
8
8
  var tmp = require('tmp');
9
9
  var axios = require('axios');
10
10
  var node_fs = require('node:fs');
11
11
  var path = require('node:path');
12
- var configuration = require('./configuration-B-CugKJ3.cjs');
13
- var api = require('./api-CZWcG7uh.cjs');
14
- var spawnAgents = require('./spawnAgents-CG211IW7.cjs');
15
- var logger = require('./logger-DK1ytCz6.cjs');
16
- var index$2 = require('./index-CZC7egJA.cjs');
17
- var auth = require('./auth-Lw_utSMV.cjs');
12
+ var configuration = require('./configuration-C9Sx-Foo.cjs');
13
+ var api = require('./api-rw5xkzxo.cjs');
14
+ var spawnAgents = require('./spawnAgents-D15n6tAj.cjs');
15
+ var logger = require('./logger-CrtT0opS.cjs');
16
+ var index$2 = require('./index-NhmqjrGv.cjs');
17
+ var auth = require('./auth-gGryJImw.cjs');
18
18
  var child_process = require('child_process');
19
- var _package = require('./package-BfeqAzyJ.cjs');
20
- var doctor = require('./doctor-DMvlzmnE.cjs');
21
- var spawnHappyCLI = require('./spawnHappyCLI-D47kX6jg.cjs');
22
- var persistence = require('./persistence-BdpwWXKh.cjs');
23
- var controlClient = require('./controlClient-D0kGwKYx.cjs');
24
- var sessionOps = require('./sessionOps-Dx7wARjI.cjs');
19
+ var _package = require('./package-DczR1k0c.cjs');
20
+ var doctor = require('./doctor-DRdV3thy.cjs');
21
+ var spawnHappyCLI = require('./spawnHappyCLI-8NcKgkuy.cjs');
22
+ var persistence = require('./persistence-IYH6bAXY.cjs');
23
+ var controlClient = require('./controlClient-BLO1_pPx.cjs');
24
+ var sessionOps = require('./sessionOps-hRqzcMXB.cjs');
25
25
  var fastify = require('fastify');
26
26
  var z = require('zod');
27
27
  var fastifyTypeProviderZod = require('fastify-type-provider-zod');
@@ -29,66 +29,65 @@ var authRelay = require('./authRelay-Dy1qU9td.cjs');
29
29
  var node_crypto = require('node:crypto');
30
30
  var previewPath = require('./previewPath-B0rBdhy1.cjs');
31
31
  var backgroundTaskActivity = require('./backgroundTaskActivity-CBvUdj39.cjs');
32
- var rateLimitWindows = require('./rateLimitWindows-DJxnNw-X.cjs');
33
- var peerTools = require('./peerTools-BVp1z0T_.cjs');
32
+ var rateLimitWindows = require('./rateLimitWindows-CeogT1b6.cjs');
33
+ var peerTools = require('./peerTools-Cufh4Qp_.cjs');
34
34
  var os = require('node:os');
35
- var remoteSessionClient = require('./remoteSessionClient-CtV9mDko.cjs');
36
- var bootstrap = require('./bootstrap-DsXp74wv.cjs');
37
- var index$1 = require('./index-B_aNaW9w.cjs');
35
+ var remoteSessionClient = require('./remoteSessionClient-CuAkp19e.cjs');
36
+ var bootstrap = require('./bootstrap-BPz1iX77.cjs');
37
+ var index$1 = require('./index-BsoUsrKS.cjs');
38
38
  var require$$0 = require('fs');
39
39
  var require$$1 = require('path');
40
40
  var node_child_process = require('node:child_process');
41
41
  var projectPath = require('./projectPath-C3ioB4Bu.cjs');
42
42
  var doctorReadiness = require('./doctorReadiness-Dl6yRQCy.cjs');
43
- var machineMetadata = require('./machineMetadata-IJc6_iyx.cjs');
43
+ var machineMetadata = require('./machineMetadata-D1hlm_oF.cjs');
44
44
  var fileStore = require('./fileStore-7qhnbs6N.cjs');
45
45
  var pi = require('./pi-DlsrPCTa.cjs');
46
46
  var require$$3 = require('crypto');
47
47
  var detectCLI = require('./detectCLI-BuYR_Qxe.cjs');
48
- var handleResumeCommand = require('./handleResumeCommand-Dp2Y-p6V.cjs');
48
+ var handleResumeCommand = require('./handleResumeCommand-z7wY7QVM.cjs');
49
49
  var webPanels = require('./webPanels-FCgFKvVe.cjs');
50
- var index = require('./index-oh8XEozJ.cjs');
50
+ var index = require('./index-Ub-5xbcU.cjs');
51
51
  var promises = require('node:fs/promises');
52
52
  var cliUpdate = require('./cliUpdate-DsKXPFYp.cjs');
53
- var client = require('./client-DK8CzUry.cjs');
54
- var client$1 = require('./client-CDuW4MS9.cjs');
55
- var module$1 = require('node:module');
53
+ var client = require('./client-C49zFRkX.cjs');
54
+ var client$1 = require('./client-BFDji81N.cjs');
55
+ var daemonSupervisor = require('./daemonSupervisor-57JYYzMf.cjs');
56
56
  var path$1 = require('./path-B7zW-WwE.cjs');
57
57
  var editPaths = require('./editPaths-Bqp4OFPw.cjs');
58
- var startFileWatcher = require('./startFileWatcher-gKQTstR6.cjs');
59
- var sync = require('./sync-BxMdnZzz.cjs');
58
+ var startFileWatcher = require('./startFileWatcher-CjgKvec9.cjs');
59
+ var sync = require('./sync-DKSZOi6w.cjs');
60
60
  var types = require('./types-CRS-srZK.cjs');
61
61
  var tmuxSocket = require('./tmuxSocket-D-Xt6Vn-.cjs');
62
- var sessionLock = require('./sessionLock-Dc0fadGG.cjs');
62
+ var sessionLock = require('./sessionLock-DNGDn9oj.cjs');
63
63
  var doctor$1 = require('./doctor-u46qYYKX.cjs');
64
- var resources = require('./resources-BPyN59Iv.cjs');
64
+ var resources = require('./resources-CqwHPhdK.cjs');
65
65
  var node_util = require('node:util');
66
- var template = require('./template-BaHAmH2K.cjs');
67
- var daemonSupervisor = require('./daemonSupervisor-B-SPSqhs.cjs');
66
+ var template = require('./template-BLJxflCH.cjs');
68
67
  var loginShellEnv = require('./loginShellEnv-BkuYtExZ.cjs');
69
- require('./acpSessionResume-Dxo8222T.cjs');
70
- require('./lidState-DcPvwniz.cjs');
68
+ require('./acpSessionResume-DZ65DBeE.cjs');
69
+ require('./lidState-C4YgPn6y.cjs');
71
70
  require('node:events');
72
71
  require('socket.io-client');
73
- require('./pushNotifications-CyQVDThC.cjs');
72
+ require('./pushNotifications-BgQ_QTgS.cjs');
74
73
  require('./contentLogMetadata-ZSFk_NjQ.cjs');
75
74
  require('./limits-C-a7gr04.cjs');
76
- require('./time-DNLeIRgR.cjs');
77
- require('./registerCommonHandlers-DbNoM39q.cjs');
75
+ require('./time-D-8GFCE7.cjs');
76
+ require('./registerCommonHandlers-CRqKXwQt.cjs');
78
77
  require('util');
79
78
  require('cross-spawn');
80
79
  require('@paralleldrive/cuid2');
81
80
  require('chalk');
81
+ require('node:module');
82
82
  require('tweetnacl');
83
- require('./browser-CZlA9AkO.cjs');
83
+ require('./browser-D9D-1eqa.cjs');
84
84
  require('open');
85
85
  require('./ids-B6ZC0HGt.cjs');
86
86
  require('url');
87
- require('./localHappyAgentAuth-SD6GM97y.cjs');
87
+ require('./localHappyAgentAuth-BzCuIkzi.cjs');
88
88
  require('./processTreeSnapshot-mDbnuojn.cjs');
89
89
  require('ps-list');
90
90
 
91
- var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
92
91
  function _interopNamespaceDefault(e) {
93
92
  var n = Object.create(null);
94
93
  if (e) {
@@ -594,6 +593,7 @@ function startDaemonControlServer({
594
593
  stopSession,
595
594
  spawnSession,
596
595
  resumeSession,
596
+ restartSession,
597
597
  requestShutdown,
598
598
  onHappySessionWebhook,
599
599
  onSessionStateEvent,
@@ -890,6 +890,34 @@ function startDaemonControlServer({
890
890
  return { success: false, error: result.errorMessage };
891
891
  }
892
892
  });
893
+ typed.post("/restart-session", {
894
+ schema: {
895
+ body: z.z.object({ sessionId: z.z.string().min(1).max(200) }),
896
+ response: {
897
+ 200: z.z.object({ success: z.z.boolean(), sessionId: z.z.string().optional(), error: z.z.string().optional() }),
898
+ 500: z.z.object({ success: z.z.boolean(), error: z.z.string().optional() }),
899
+ 503: z.z.object({ success: z.z.boolean(), error: z.z.string().optional() })
900
+ }
901
+ }
902
+ }, async (request, reply) => {
903
+ const { sessionId } = request.body;
904
+ if (!restartSession) {
905
+ reply.code(503);
906
+ return { success: false, error: "daemon is still starting up" };
907
+ }
908
+ logger.logger.debug(`[CONTROL SERVER] Restart session request: ${sessionId}`);
909
+ const result = await restartSession(sessionId, { keepPublishedPermissionMode: true });
910
+ switch (result.type) {
911
+ case "success":
912
+ return { success: true, sessionId: result.sessionId };
913
+ case "requestToApproveDirectoryCreation":
914
+ reply.code(500);
915
+ return { success: false, error: `Cannot restart: working directory ${result.directory} needs to be created first` };
916
+ case "error":
917
+ reply.code(500);
918
+ return { success: false, error: result.errorMessage };
919
+ }
920
+ });
893
921
  typed.post("/terminal-hook", {
894
922
  schema: {
895
923
  body: z.z.any(),
@@ -5115,196 +5143,6 @@ async function waitForSessionLive(sessionId, live, timeoutMs = AUTOMATION_WAKE_T
5115
5143
  return true;
5116
5144
  }
5117
5145
 
5118
- const CLAUDE_KEYCHAIN_SERVICE_PREFIX = "Claude Code";
5119
- function keychainIdentity(env = process.env, deps = {}) {
5120
- const home = deps.home ?? os.homedir();
5121
- const secureDir = env.CLAUDE_SECURESTORAGE_CONFIG_DIR?.trim();
5122
- const configDirEnv = env.CLAUDE_CONFIG_DIR?.trim();
5123
- const configDir = secureDir || configDirEnv || path.join(home, ".claude");
5124
- const hasCustomDir = Boolean(secureDir || configDirEnv);
5125
- const dirSuffix = hasCustomDir ? "-" + node_crypto.createHash("sha256").update(configDir.normalize("NFC")).digest("hex").slice(0, 8) : "";
5126
- const oauthSuffix = env.CLAUDE_CODE_OAUTH_CLIENT_ID?.trim() ? "-custom-oauth" : "";
5127
- const rawAccount = env.USER || safeUsername(deps.username);
5128
- const account = /^[a-zA-Z0-9._-]+$/.test(rawAccount) ? rawAccount : "claude-code-user";
5129
- return {
5130
- service: `${CLAUDE_KEYCHAIN_SERVICE_PREFIX}${oauthSuffix}-credentials${dirSuffix}`,
5131
- account,
5132
- configDir,
5133
- credentialsPath: path.join(configDir, ".credentials.json")
5134
- };
5135
- }
5136
- function safeUsername(provider) {
5137
- try {
5138
- return provider ? provider() : os.userInfo().username;
5139
- } catch {
5140
- return "";
5141
- }
5142
- }
5143
-
5144
- const CLAUDE_AUTH_PROBE_VERSION = 1;
5145
- const LOCAL_CREDENTIAL_SOURCE = "Claude local credentials";
5146
- function classifyAuthStatus(run, credentialSource) {
5147
- const localSource = credentialSource === void 0 || credentialSource === LOCAL_CREDENTIAL_SOURCE;
5148
- if (run.spawnError) {
5149
- return { status: "error", diagnosis: "probe-crash", detail: `could not run claude auth status: ${run.spawnError}` };
5150
- }
5151
- if (run.timedOut) {
5152
- return { status: "error", diagnosis: "probe-timeout", detail: "claude auth status did not answer within the timeout" };
5153
- }
5154
- const parsed = parseJsonObject(run.stdout);
5155
- if (!parsed) {
5156
- if (!localSource) return { status: "unknown", authMethod: credentialSource, detail: `auth status unparseable under ${credentialSource}` };
5157
- return { status: "error", diagnosis: "probe-crash", detail: `claude auth status returned no JSON (exit ${run.exitCode ?? "null"})` };
5158
- }
5159
- const authMethod = typeof parsed.authMethod === "string" ? parsed.authMethod : void 0;
5160
- const subscriptionType = typeof parsed.subscriptionType === "string" ? parsed.subscriptionType : void 0;
5161
- if (parsed.loggedIn === true) {
5162
- return { status: "ok", authMethod: localSource ? authMethod : credentialSource, subscriptionType };
5163
- }
5164
- if (!localSource) {
5165
- return { status: "unknown", authMethod: credentialSource, detail: `Claude Code reports loggedIn=false under ${credentialSource}; not a local-credential failure` };
5166
- }
5167
- return { status: "not-logged-in", authMethod, subscriptionType, detail: "Claude Code in the daemon context reports it is not logged in" };
5168
- }
5169
- function parseJsonObject(text) {
5170
- const trimmed = text.trim();
5171
- if (!trimmed) return null;
5172
- const start = trimmed.indexOf("{");
5173
- if (start < 0) return null;
5174
- try {
5175
- const value = JSON.parse(trimmed.slice(start));
5176
- return value && typeof value === "object" && !Array.isArray(value) ? value : null;
5177
- } catch {
5178
- return null;
5179
- }
5180
- }
5181
- function resolveSdkClaudeBinary(platform = process.platform, arch = process.arch, resolver = (s) => module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('run-BBNrcCfI.cjs', document.baseURI).href))).resolve(s)) {
5182
- const platformArch = `${platform}-${arch}`;
5183
- const candidates = [
5184
- `@anthropic-ai/claude-agent-sdk-${platformArch}/claude`,
5185
- `@anthropic-ai/claude-agent-sdk-${platformArch}/claude.exe`
5186
- ];
5187
- for (const candidate of candidates) {
5188
- try {
5189
- return resolver(candidate);
5190
- } catch {
5191
- }
5192
- }
5193
- return null;
5194
- }
5195
- function interpretSecurityRead(result) {
5196
- if (result.error === "ENOENT") return { kind: "unsupported" };
5197
- if (result.error === "timeout") return { kind: "error", detail: "security timed out" };
5198
- if (result.exitCode === 44) return { kind: "absent" };
5199
- if (result.exitCode === 36) return { kind: "unreadable" };
5200
- if (result.exitCode !== 0) return { kind: "error", detail: `security exited ${result.exitCode ?? "null"}` };
5201
- const raw = result.stdout.trim();
5202
- if (!raw) return { kind: "absent" };
5203
- const parsed = parseJsonObject(raw);
5204
- const oauth = parsed && typeof parsed.claudeAiOauth === "object" && parsed.claudeAiOauth ? parsed.claudeAiOauth : null;
5205
- if (!oauth) return { kind: "present", accessToken: "", refreshToken: "", raw };
5206
- return {
5207
- kind: "present",
5208
- accessToken: typeof oauth.accessToken === "string" ? oauth.accessToken : "",
5209
- refreshToken: typeof oauth.refreshToken === "string" ? oauth.refreshToken : "",
5210
- raw
5211
- };
5212
- }
5213
- function interpretCredentialsFile(text) {
5214
- if (text === null) return { exists: false, hasTokens: false, refreshToken: "" };
5215
- const parsed = parseJsonObject(text);
5216
- const oauth = parsed && typeof parsed.claudeAiOauth === "object" && parsed.claudeAiOauth ? parsed.claudeAiOauth : null;
5217
- const access = oauth && typeof oauth.accessToken === "string" ? oauth.accessToken : "";
5218
- const refresh = oauth && typeof oauth.refreshToken === "string" ? oauth.refreshToken : "";
5219
- return { exists: true, hasTokens: access.length > 0 && refresh.length > 0, refreshToken: refresh };
5220
- }
5221
- function tokenTail(token) {
5222
- return token ? node_crypto.createHash("sha256").update(token).digest("hex").slice(-6) : "";
5223
- }
5224
- const CREDENTIALS_REJECTED_DETAIL = "Credentials exist but Claude Code rejects them in the daemon context \u2014 the refresh token has most likely been rotated away by another store or another machine using the same credentials. Log in again with `claude` on this machine.";
5225
- function diagnoseStores(input) {
5226
- const { status, keychain, file } = input;
5227
- if (keychain.kind === "present") {
5228
- const empty = keychain.accessToken.length === 0 && keychain.refreshToken.length === 0;
5229
- if (empty && file.hasTokens && status === "not-logged-in") {
5230
- return {
5231
- diagnosis: "keychain-empty-item",
5232
- repairable: "delete-empty-keychain-item",
5233
- keychainRaw: keychain.raw,
5234
- detail: "The login keychain holds a Claude Code credentials item with empty tokens; Claude Code prefers it over the valid ~/.claude/.credentials.json and reports not logged in."
5235
- };
5236
- }
5237
- if (!empty && file.hasTokens && tokenTail(keychain.refreshToken) !== tokenTail(file.refreshToken)) {
5238
- return {
5239
- diagnosis: "store-divergence",
5240
- detail: "Keychain and ~/.claude/.credentials.json hold different refresh tokens; one of them will stop working at its next refresh. Treat the daemon-context login as canonical, or pin credentialStore=file."
5241
- };
5242
- }
5243
- return {};
5244
- }
5245
- if ((keychain.kind === "absent" || keychain.kind === "unreadable" || keychain.kind === "unsupported") && !file.hasTokens) {
5246
- return { diagnosis: "no-credentials", detail: "No Claude Code credentials found for this daemon context; log in with `claude` on this machine." };
5247
- }
5248
- if (keychain.kind === "unreadable" && file.hasTokens && status === "not-logged-in") {
5249
- return { diagnosis: "credentials-rejected", detail: CREDENTIALS_REJECTED_DETAIL };
5250
- }
5251
- if (keychain.kind === "error") {
5252
- return { detail: `keychain check failed: ${keychain.detail}` };
5253
- }
5254
- return {};
5255
- }
5256
- function securityReadArgs(identity) {
5257
- return ["find-generic-password", "-s", identity.service, "-a", identity.account, "-w"];
5258
- }
5259
- function securityDeleteArgs(identity) {
5260
- return ["delete-generic-password", "-s", identity.service, "-a", identity.account];
5261
- }
5262
- const HAPPY_DAEMON_LAUNCHD_LABEL = "com.mereith.happy-daemon";
5263
- function classifyLineage(input) {
5264
- if (input.platform !== "darwin") return "other";
5265
- const label = input.label ?? HAPPY_DAEMON_LAUNCHD_LABEL;
5266
- if (input.env.XPC_SERVICE_NAME !== label) return "other";
5267
- if (input.launchdJobPid !== null && input.ancestorPids.includes(input.launchdJobPid)) return "launchd";
5268
- return "inherited-env";
5269
- }
5270
- function parseLaunchctlPid(printOutput) {
5271
- const match = /^\s*pid\s*=\s*(\d+)/m.exec(printOutput);
5272
- return match ? Number(match[1]) : null;
5273
- }
5274
- function keychainOffShimDir(happyLibDir) {
5275
- return path.join(happyLibDir, "scripts", "shims", "keychain-off");
5276
- }
5277
- function withKeychainOffPath(path$1, shimDir) {
5278
- const parts = (path$1 ?? "").split(path.delimiter).filter((p) => p && p !== shimDir);
5279
- return [shimDir, ...parts].join(path.delimiter);
5280
- }
5281
- function buildClaudeAuthState(input) {
5282
- const { classification, diagnosis } = input;
5283
- const detail = (diagnosis?.detail ?? classification.detail)?.slice(0, 200);
5284
- const state = {
5285
- probeVersion: CLAUDE_AUTH_PROBE_VERSION,
5286
- daemonPid: input.daemonPid,
5287
- status: classification.status,
5288
- context: { platform: input.platform, lineage: input.lineage, credentialStore: input.credentialStore },
5289
- checkedAt: input.now ?? Date.now()
5290
- };
5291
- if (classification.authMethod) state.authMethod = classification.authMethod;
5292
- if (classification.subscriptionType) state.subscriptionType = classification.subscriptionType;
5293
- const diag = diagnosis?.diagnosis ?? classification.diagnosis;
5294
- if (diag) state.diagnosis = diag;
5295
- if (detail) state.detail = detail;
5296
- if (diagnosis?.repairable) state.repairable = diagnosis.repairable;
5297
- return state;
5298
- }
5299
- function claudeAuthStateChanged(prev, next) {
5300
- if (!prev) return true;
5301
- const strip = ({ checkedAt: _c, ...rest }) => JSON.stringify(rest);
5302
- return strip(prev) !== strip(next);
5303
- }
5304
- function keychainIdentityFor(env) {
5305
- return keychainIdentity(env);
5306
- }
5307
-
5308
5146
  const CLAUDE_AUTH_PROBE_INTERVAL_MS = 10 * 60 * 1e3;
5309
5147
  const CLAUDE_AUTH_REFRESH_INTERVAL_MS = 30 * 60 * 1e3;
5310
5148
  const PROBE_TIMEOUT_MS = 8e3;
@@ -5315,6 +5153,7 @@ class ClaudeAuthService {
5315
5153
  this.opts = opts;
5316
5154
  this.env = opts.env ?? process.env;
5317
5155
  this.platform = opts.platform ?? process.platform;
5156
+ this.lineage = opts.lineage ?? null;
5318
5157
  }
5319
5158
  timer = null;
5320
5159
  signalTimer = null;
@@ -5355,7 +5194,7 @@ class ClaudeAuthService {
5355
5194
  if (this.opts.getCredentialStore() !== "file") return {};
5356
5195
  const shim = this.resolveShimDir();
5357
5196
  if (!shim) return {};
5358
- return { PATH: withKeychainOffPath(this.env.PATH, shim) };
5197
+ return { PATH: daemonSupervisor.withKeychainOffPath(this.env.PATH, shim) };
5359
5198
  }
5360
5199
  effectiveCredentialStore() {
5361
5200
  if (this.opts.getCredentialStore() !== "file") return "auto";
@@ -5379,8 +5218,8 @@ class ClaudeAuthService {
5379
5218
  const state = await this.probe("repair-precheck", true);
5380
5219
  const seen = this.lastDiagnosis;
5381
5220
  if (state.diagnosis !== "keychain-empty-item" || !seen?.keychainRaw) return { error: "precondition-failed", claudeAuth: state };
5382
- const identity = keychainIdentityFor(this.env);
5383
- const again = interpretSecurityRead(await this.security(securityReadArgs(identity)));
5221
+ const identity = daemonSupervisor.keychainIdentityFor(this.env);
5222
+ const again = daemonSupervisor.interpretSecurityRead(await this.security(daemonSupervisor.securityReadArgs(identity)));
5384
5223
  if (again.kind !== "present" || again.raw !== seen.keychainRaw || again.accessToken || again.refreshToken) {
5385
5224
  return { error: "precondition-failed", claudeAuth: state };
5386
5225
  }
@@ -5391,7 +5230,7 @@ class ClaudeAuthService {
5391
5230
  } catch (error) {
5392
5231
  return { error: `backup-failed: ${String(error)}`, claudeAuth: state };
5393
5232
  }
5394
- const del = await this.security(securityDeleteArgs(identity));
5233
+ const del = await this.security(daemonSupervisor.securityDeleteArgs(identity));
5395
5234
  if (del.exitCode !== 0) return { error: `delete-failed: security exited ${del.exitCode ?? "null"}`, claudeAuth: state };
5396
5235
  logger.logger.debug("[CLAUDE AUTH] deleted empty-token keychain item after backup");
5397
5236
  const after = await this.probe("repair-done", true);
@@ -5399,7 +5238,7 @@ class ClaudeAuthService {
5399
5238
  }
5400
5239
  // ── internals ────────────────────────────────────────────────────────
5401
5240
  resolveShimDir() {
5402
- const dir = keychainOffShimDir(this.opts.happyLibDir);
5241
+ const dir = daemonSupervisor.keychainOffShimDir(this.opts.happyLibDir);
5403
5242
  const bin = path.join(dir, "security");
5404
5243
  try {
5405
5244
  if (!node_fs.statSync(bin).isFile()) return null;
@@ -5419,20 +5258,20 @@ class ClaudeAuthService {
5419
5258
  diagnosis = await this.diagnose(classification.status);
5420
5259
  this.lastDiagnosis = diagnosis;
5421
5260
  } else if (classification.status === "not-logged-in") {
5422
- const file = interpretCredentialsFile(this.readCredentialsFile());
5261
+ const file = daemonSupervisor.interpretCredentialsFile(this.readCredentialsFile());
5423
5262
  if (!file.hasTokens) {
5424
5263
  diagnosis = {
5425
5264
  diagnosis: "no-credentials",
5426
5265
  detail: store === "file" ? "credentialStore=file and ~/.claude/.credentials.json has no tokens; log in with `claude` from a terminal on this machine." : "No Claude Code credentials found for this daemon context; log in with `claude` on this machine."
5427
5266
  };
5428
5267
  } else {
5429
- diagnosis = { diagnosis: "credentials-rejected", detail: CREDENTIALS_REJECTED_DETAIL };
5268
+ diagnosis = { diagnosis: "credentials-rejected", detail: daemonSupervisor.CREDENTIALS_REJECTED_DETAIL };
5430
5269
  }
5431
5270
  }
5432
5271
  if (storeRequested === "file" && store === "auto") {
5433
- diagnosis = { ...diagnosis ?? {}, detail: `credentialStore=file requested but the keychain-off shim is missing under ${keychainOffShimDir(this.opts.happyLibDir)}; running in auto mode.` };
5272
+ diagnosis = { ...diagnosis ?? {}, detail: `credentialStore=file requested but the keychain-off shim is missing under ${daemonSupervisor.keychainOffShimDir(this.opts.happyLibDir)}; running in auto mode.` };
5434
5273
  }
5435
- const state = buildClaudeAuthState({
5274
+ const state = daemonSupervisor.buildClaudeAuthState({
5436
5275
  daemonPid: process.pid,
5437
5276
  platform: this.platform,
5438
5277
  lineage: await this.resolveLineage(),
@@ -5441,7 +5280,7 @@ class ClaudeAuthService {
5441
5280
  diagnosis,
5442
5281
  now: this.opts.now?.() ?? Date.now()
5443
5282
  });
5444
- const changed = claudeAuthStateChanged(this.last, state);
5283
+ const changed = daemonSupervisor.claudeAuthStateChanged(this.last, state);
5445
5284
  const stale = state.checkedAt - this.lastPublishedAt >= CLAUDE_AUTH_REFRESH_INTERVAL_MS;
5446
5285
  if (changed) {
5447
5286
  logger.logger.debug(`[CLAUDE AUTH] ${reason}: status=${state.status} diagnosis=${state.diagnosis ?? "-"} lineage=${state.context.lineage} store=${state.context.credentialStore}`);
@@ -5459,7 +5298,7 @@ class ClaudeAuthService {
5459
5298
  return state;
5460
5299
  }
5461
5300
  async runAuthStatus() {
5462
- const binary = resolveSdkClaudeBinary(this.platform, process.arch);
5301
+ const binary = daemonSupervisor.resolveSdkClaudeBinary(this.platform, process.arch);
5463
5302
  if (!binary) {
5464
5303
  return { status: "claude-missing", diagnosis: "sdk-binary-missing", detail: "The Claude Code binary bundled with the Agent SDK is missing; remote sessions cannot start." };
5465
5304
  }
@@ -5504,16 +5343,16 @@ class ClaudeAuthService {
5504
5343
  done({ stdout, exitCode: code, timedOut: false });
5505
5344
  });
5506
5345
  });
5507
- return classifyAuthStatus(run, this.opts.credentialSource);
5346
+ return daemonSupervisor.classifyAuthStatus(run, this.opts.credentialSource);
5508
5347
  }
5509
5348
  async diagnose(status) {
5510
- const identity = keychainIdentityFor(this.env);
5511
- const keychain = interpretSecurityRead(await this.security(securityReadArgs(identity)));
5512
- const file = interpretCredentialsFile(this.readCredentialsFile(identity.credentialsPath));
5513
- return diagnoseStores({ status, keychain, file });
5349
+ const identity = daemonSupervisor.keychainIdentityFor(this.env);
5350
+ const keychain = daemonSupervisor.interpretSecurityRead(await this.security(daemonSupervisor.securityReadArgs(identity)));
5351
+ const file = daemonSupervisor.interpretCredentialsFile(this.readCredentialsFile(identity.credentialsPath));
5352
+ return daemonSupervisor.diagnoseStores({ status, keychain, file });
5514
5353
  }
5515
5354
  readCredentialsFile(path) {
5516
- const target = path ?? keychainIdentityFor(this.env).credentialsPath;
5355
+ const target = path ?? daemonSupervisor.keychainIdentityFor(this.env).credentialsPath;
5517
5356
  try {
5518
5357
  return node_fs.existsSync(target) ? node_fs.readFileSync(target, "utf8") : null;
5519
5358
  } catch {
@@ -5538,9 +5377,9 @@ class ClaudeAuthService {
5538
5377
  return this.lineage;
5539
5378
  }
5540
5379
  const uid = typeof process.getuid === "function" ? process.getuid() : null;
5541
- const launchdJobPid = uid === null ? null : parseLaunchctlPid(await this.exec("launchctl", ["print", `gui/${uid}/${HAPPY_DAEMON_LAUNCHD_LABEL}`]));
5380
+ const launchdJobPid = uid === null ? null : daemonSupervisor.parseLaunchctlPid(await this.exec("launchctl", ["print", `gui/${uid}/${daemonSupervisor.HAPPY_DAEMON_LAUNCHD_LABEL}`]));
5542
5381
  const ancestors = await this.ancestorPids();
5543
- this.lineage = classifyLineage({ platform: this.platform, env: this.env, launchdJobPid, ancestorPids: ancestors });
5382
+ this.lineage = daemonSupervisor.classifyLineage({ platform: this.platform, env: this.env, launchdJobPid, ancestorPids: ancestors });
5544
5383
  return this.lineage;
5545
5384
  }
5546
5385
  async ancestorPids() {
@@ -6378,6 +6217,10 @@ async function removeTeamWorktree(resource) {
6378
6217
  if (ownBranch) await git(repository, ["branch", "-D", branch]);
6379
6218
  }
6380
6219
 
6220
+ function refusalCode(error) {
6221
+ const code = axios.isAxiosError(error) ? error.response?.data?.error : void 0;
6222
+ return typeof code === "string" && /^[a-z_]{1,64}$/.test(code) ? ` (${code})` : "";
6223
+ }
6381
6224
  function persistedSpawnMatches(operationId) {
6382
6225
  return Object.entries(persistence.readPersistedSessions()).filter(([, entry]) => entry.metadata?.teamOperationId === operationId);
6383
6226
  }
@@ -6412,6 +6255,7 @@ function createTeamWorker(deps) {
6412
6255
  writeReceipt$1(home, receipt);
6413
6256
  }
6414
6257
  if (receipt.phase === "completed") return;
6258
+ let sessionStopped = false;
6415
6259
  try {
6416
6260
  if (op.type === "spawn") {
6417
6261
  if (machineMetadata.ownerRetryPending(op, receipt) && (receipt.phase === "prepared" || receipt.phase === "spawning" && persistedSpawnMatches(op.id).length === 0)) {
@@ -6508,10 +6352,11 @@ function createTeamWorker(deps) {
6508
6352
  return;
6509
6353
  }
6510
6354
  const bot = team.bots.find((candidate) => candidate.id === op.botId);
6511
- if (!bot || bot.generation !== op.generation || bot.sessionId !== op.sessionId) throw new Error("Worker binding changed; preserve resources for reconciliation");
6355
+ if (!bot || op.sessionId && bot.transferredTo?.sessionId === op.sessionId) throw new Error("Worker binding changed; preserve resources for reconciliation");
6512
6356
  if (op.sessionId) {
6513
6357
  await deps.stopAndWait(op.sessionId);
6514
6358
  await sessionOps.archiveSession(op.sessionId);
6359
+ sessionStopped = true;
6515
6360
  }
6516
6361
  if (team.archivedAt !== void 0) {
6517
6362
  await complete(op, receipt);
@@ -6534,7 +6379,7 @@ function createTeamWorker(deps) {
6534
6379
  } catch {
6535
6380
  }
6536
6381
  }
6537
- await action(op.teamId, `failure-${op.id}-${receipt.phase}-${node_crypto.createHash("sha256").update(detail).digest("hex").slice(0, 12)}`, { type: "fail-operation", operationId: op.id, machineId: deps.machineId, claimId: receipt.claimId, error: detail.slice(0, 1e3), unknown }).catch(() => {
6382
+ await action(op.teamId, `failure-${op.id}-${receipt.phase}-${node_crypto.createHash("sha256").update(detail).digest("hex").slice(0, 12)}${sessionStopped ? "-stopped" : ""}`, { type: "fail-operation", operationId: op.id, machineId: deps.machineId, claimId: receipt.claimId, error: detail.slice(0, 1e3), unknown, ...sessionStopped ? { sessionStopped: true } : {} }).catch(() => {
6538
6383
  });
6539
6384
  deps.log(`Teams operation ${op.id} ${unknown ? "needs reconciliation" : "will retry"}`);
6540
6385
  }
@@ -6614,8 +6459,8 @@ Use the teams tools to inspect current task state before acting. This message is
6614
6459
  if (closed) break;
6615
6460
  try {
6616
6461
  await execute(op);
6617
- } catch {
6618
- deps.log(`Teams operation ${op.id} remains pending`);
6462
+ } catch (error) {
6463
+ deps.log(`Teams operation ${op.id} remains pending${refusalCode(error)}`);
6619
6464
  }
6620
6465
  }
6621
6466
  await flushEvents(data.teams ?? []);
@@ -6953,7 +6798,9 @@ function createAutomationRunner(deps) {
6953
6798
  function persist(receipt) {
6954
6799
  writeReceipt(home, receipt, now());
6955
6800
  }
6956
- async function finish(item, report2) {
6801
+ async function finish(item, input) {
6802
+ const { report: report2, clipped } = template.clipAutomationReport(input);
6803
+ if (clipped.length) deps.log(`Automation run ${item.runId} report clipped: ${clipped.map((c) => `${c.field} ${c.from}\u2192${c.to}`).join(", ")}`);
6957
6804
  try {
6958
6805
  await client.report(item.runId, report2);
6959
6806
  } catch (error) {
@@ -8390,7 +8237,7 @@ async function startDaemon() {
8390
8237
  }
8391
8238
  const model = sanitizeResumeModel(options?.model);
8392
8239
  if (model) args.push("--model", model);
8393
- const permissionMode = spawnAgents.sanitizeSpawnPermissionMode(options?.permissionMode);
8240
+ const permissionMode = spawnAgents.sanitizeSpawnPermissionMode(options?.permissionMode ?? (options?.keepPublishedPermissionMode ? publishedRelaunchPermissionMode(metadata) : void 0));
8394
8241
  if (permissionMode) args.push("--permission-mode", permissionMode);
8395
8242
  restartCounts.set(happySessionId, recordRestartAttempt(prior));
8396
8243
  const teamEnv = await teamRelaunchEnvFor(happySessionId, metadata);
@@ -8549,6 +8396,8 @@ async function startDaemon() {
8549
8396
  spawnSession,
8550
8397
  resumeSession,
8551
8398
  // B-501: `very-happy send --resume`
8399
+ restartSession,
8400
+ // B-794: `very-happy session provider`
8552
8401
  requestShutdown: () => requestShutdown("happy-cli"),
8553
8402
  onHappySessionWebhook,
8554
8403
  onSessionStateEvent,
@@ -8593,8 +8442,10 @@ async function startDaemon() {
8593
8442
  }
8594
8443
  });
8595
8444
  const daemonClaudeCredentials = doctorReadiness.resolveClaudeCredentialReadiness();
8596
- const daemonSupervisor$1 = daemonSupervisor.detectDaemonSupervisor(process.env);
8597
- logger.logger.debug(`[DAEMON RUN] Supervisor: ${daemonSupervisor$1}`);
8445
+ const launchdJob = process.platform === "darwin" ? await daemonSupervisor.probeLaunchdJob() : null;
8446
+ const daemonSupervisor$1 = daemonSupervisor.detectDaemonSupervisor(process.env, process.platform, launchdJob);
8447
+ const lineage = daemonSupervisor.daemonLineage(daemonSupervisor$1, process.env, process.platform, launchdJob);
8448
+ logger.logger.debug(`[DAEMON RUN] Supervisor: ${daemonSupervisor$1} (lineage ${lineage}${launchdJob ? `, launchd job pid ${launchdJob.jobPid ?? "-"}` : ""})`);
8598
8449
  let fileState = {
8599
8450
  pid: process.pid,
8600
8451
  httpPort: controlPort,
@@ -8677,7 +8528,8 @@ async function startDaemon() {
8677
8528
  await persistence.writeSettings({ ...settings, claudeCredentialStore: store });
8678
8529
  claudeCredentialStoreSetting = store;
8679
8530
  },
8680
- publish: (state) => apiMachine.setClaudeAuthState(state)
8531
+ publish: (state) => apiMachine.setClaudeAuthState(state),
8532
+ lineage
8681
8533
  });
8682
8534
  claudeAuthServiceRef = claudeAuthService;
8683
8535
  apiMachine.setClaudeAuthHandlers({
@@ -8854,8 +8706,8 @@ async function startDaemon() {
8854
8706
  await controlClient.cleanupDaemonState();
8855
8707
  await persistence.releaseDaemonLock(daemonLockHandle);
8856
8708
  await stopCaffeinate();
8857
- if (daemonSupervisor$1 === "systemd") {
8858
- logger.logger.debug(`[DAEMON RUN] systemd-supervised: exiting ${HANDOVER_EXIT_CODE} for the unit to restart on the new bundle`);
8709
+ if (daemonSupervisor$1 !== "none") {
8710
+ logger.logger.debug(`[DAEMON RUN] ${daemonSupervisor$1}-supervised: exiting ${HANDOVER_EXIT_CODE} for the supervisor to restart on the new bundle`);
8859
8711
  process.exit(HANDOVER_EXIT_CODE);
8860
8712
  }
8861
8713
  try {