very-happy-cli 0.2.176 → 0.2.178

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 (188) hide show
  1. package/dist/{AcpBackend-9_ZI1Bv3.cjs → AcpBackend-CDkAQXYf.cjs} +188 -37
  2. package/dist/{AcpBackend-COp6D8gl.mjs → AcpBackend-DCQXHRzT.mjs} +187 -38
  3. package/dist/{AcpSessionManager-DykjzBM4.mjs → AcpSessionManager-BXrQcqwC.mjs} +1 -1
  4. package/dist/{AcpSessionManager-CjdJLofq.cjs → AcpSessionManager-DckmUZza.cjs} +1 -1
  5. package/dist/{BasePermissionHandler-ChMkmsGD.mjs → BasePermissionHandler-BVlrEhIi.mjs} +1 -1
  6. package/dist/{BasePermissionHandler-DPvLN7aR.cjs → BasePermissionHandler-DyLmKKtO.cjs} +1 -1
  7. package/dist/{agentHome-D61ZMLXM.mjs → agentHome-C1xi37as.mjs} +5 -5
  8. package/dist/{agentHome-BKi7tsE9.cjs → agentHome-CEp9RMyK.cjs} +5 -5
  9. package/dist/{api-CbwDDXJt.mjs → api-Dib0dmqC.mjs} +19 -12
  10. package/dist/{api-Buc_ejoA.cjs → api-JANhFdZV.cjs} +18 -11
  11. package/dist/{apiMachine-CS7t3Rg-.mjs → apiMachine-DNTJidYH.mjs} +26 -16
  12. package/dist/{apiMachine--PXoXwKq.cjs → apiMachine-QhK-sKcr.cjs} +25 -15
  13. package/dist/{attachmentContent-BQYc8KpE.mjs → attachmentContent-DkkdpSSJ.mjs} +2 -2
  14. package/dist/{attachmentContent-CFzzTeV9.cjs → attachmentContent-bpQTBJ0y.cjs} +2 -2
  15. package/dist/{attachmentLimits-DtFqqiwR.cjs → attachmentLimits-SqeAHrVC.cjs} +1 -1
  16. package/dist/{attachmentLimits-Di1Z93lN.mjs → attachmentLimits-UyFn8fkQ.mjs} +1 -1
  17. package/dist/{auth-B3xMoveE.mjs → auth-BRjd2esb.mjs} +6 -6
  18. package/dist/{auth-CBkmRIGw.mjs → auth-DNct7VUi.mjs} +9 -9
  19. package/dist/{auth-CpO3ZUMz.cjs → auth-DgIV0Cvt.cjs} +6 -6
  20. package/dist/{auth-LPvsVriN.cjs → auth-omWDtgR8.cjs} +9 -9
  21. package/dist/{authRelay-DSAvg1uv.mjs → authRelay-DhQhkBvX.mjs} +1 -1
  22. package/dist/{authRelay-BdYkC1Po.cjs → authRelay-Dy1qU9td.cjs} +1 -0
  23. package/dist/{auto-Dm3EIKT7.cjs → auto-CI16FZmX.cjs} +17 -16
  24. package/dist/{auto-DHGch_zK.mjs → auto-DKGFOJBo.mjs} +19 -18
  25. package/dist/{backgroundTaskActivity-8PdPxrvy.mjs → backgroundTaskActivity-BVwJBl02.mjs} +1 -1
  26. package/dist/{bootstrap-CxuBAkJU.mjs → bootstrap-BUagGC_-.mjs} +2 -2
  27. package/dist/{bootstrap-BboDz_w2.cjs → bootstrap-DCQ87Aan.cjs} +2 -2
  28. package/dist/{browser-GQZJxD2n.cjs → browser-CSKhc0Bl.cjs} +1 -1
  29. package/dist/{browser-BvARP-YR.mjs → browser-Dj_DYQEh.mjs} +1 -1
  30. package/dist/{claudeLocal-B9EhFmD7.mjs → claudeLocal-CCCvAeMd.mjs} +6 -6
  31. package/dist/{claudeLocal-D-mujSX1.cjs → claudeLocal-CdIVnOZp.cjs} +5 -5
  32. package/dist/{claudeLocalLauncher-Tbrx6TXF.cjs → claudeLocalLauncher-21-xh5gc.cjs} +15 -18
  33. package/dist/{claudeLocalLauncher-Bdl-9aU_.mjs → claudeLocalLauncher-BmrpaRYJ.mjs} +16 -19
  34. package/dist/{claudeSessionFork-D_DKvDKE.mjs → claudeSessionFork-DvxMKAmY.mjs} +1 -1
  35. package/dist/{claudeSessionFork-sOz97qqW.cjs → claudeSessionFork-kYCP1IJB.cjs} +1 -1
  36. package/dist/{client-Cg6ABRe-.mjs → client-BTX9hsbr.mjs} +3 -3
  37. package/dist/{client-D9pEOhn4.cjs → client-C4zKGjiJ.cjs} +2 -2
  38. package/dist/{client-Ryu9fllj.mjs → client-CnlkkrZO.mjs} +2 -2
  39. package/dist/{client-D7sSU04O.cjs → client-Dnza1hgN.cjs} +3 -3
  40. package/dist/codex/happyMcpStdioBridge.cjs +16 -16
  41. package/dist/codex/happyMcpStdioBridge.mjs +17 -17
  42. package/dist/{codexAppServerClient-DsIUkVnX.cjs → codexAppServerClient-CRlBWGn3.cjs} +6 -54
  43. package/dist/{codexAppServerClient-C70pJ-BB.mjs → codexAppServerClient-DvkpQgyv.mjs} +10 -58
  44. package/dist/{codexCommand-DWbA3pJN.mjs → codexCommand-BxjogBzU.mjs} +44 -66
  45. package/dist/{codexCommand-Aycux-B7.cjs → codexCommand-DzxIWXIT.cjs} +44 -66
  46. package/dist/{BaseReasoningProcessor-Dnf16mtJ.cjs → codexTermination-C28FzlLb.cjs} +25 -1
  47. package/dist/{BaseReasoningProcessor-pjvLSTQF.mjs → codexTermination-ySDNMEhd.mjs} +25 -2
  48. package/dist/{config-BcL0bxO5.cjs → config-BFB5uJ4t.cjs} +3 -3
  49. package/dist/{config-Bztmzu8z.mjs → config-DwfEpFr3.mjs} +3 -3
  50. package/dist/{configuration-CpBrilxV.cjs → configuration-4TGMrjul.cjs} +1 -1
  51. package/dist/{configuration-BAwOtWFY.mjs → configuration-DVrb61aY.mjs} +1 -1
  52. package/dist/{connect-BeWQ4MMA.mjs → connect-C7FPY0PI.mjs} +15 -15
  53. package/dist/{connect-BBNCMTi8.cjs → connect-QH2VJGBG.cjs} +14 -14
  54. package/dist/{context-j114QJre.mjs → context-B3XPVJlj.mjs} +1 -1
  55. package/dist/{context-Hk0j2Y9-.cjs → context-JoKu0V54.cjs} +1 -1
  56. package/dist/{controlClient-bs_YqwDl.cjs → controlClient-BTaZlbC6.cjs} +3 -3
  57. package/dist/{controlClient-00KYAjsI.mjs → controlClient-BYKyGyxj.mjs} +4 -4
  58. package/dist/{createSessionMetadata-xlycGog5.mjs → createSessionMetadata-8Fuj2-IV.mjs} +2 -2
  59. package/dist/{createSessionMetadata-D4Sj6H95.cjs → createSessionMetadata-B2NynaWZ.cjs} +2 -2
  60. package/dist/{defaultPermissionMode-B97ox9p1.mjs → defaultPermissionMode-B8kJG9uI.mjs} +2 -2
  61. package/dist/{defaultPermissionMode-CMsiaRzr.cjs → defaultPermissionMode-BEWCqJU-.cjs} +2 -2
  62. package/dist/{deterministicJson-aHxtYLha.cjs → deterministicJson-BjNQsAjO.cjs} +9 -9
  63. package/dist/{deterministicJson-ucyv8j6b.mjs → deterministicJson-C5ZwZ7hu.mjs} +9 -9
  64. package/dist/{doctor-D554c6Bg.mjs → doctor-0BiGwJXk.mjs} +9 -9
  65. package/dist/{doctor-BXkNXcok.cjs → doctor-BshRnjLi.cjs} +8 -8
  66. package/dist/{downloadTarget-CmdlljZW.cjs → downloadTarget-BN5vZt3K.cjs} +6 -6
  67. package/dist/{downloadTarget-2_zMvt2N.mjs → downloadTarget-DJPwAZlu.mjs} +6 -6
  68. package/dist/{ensureDaemonRunning-CY7iC--U.cjs → ensureDaemonRunning-C5QfToCe.cjs} +5 -5
  69. package/dist/{ensureDaemonRunning-DJlziY-m.mjs → ensureDaemonRunning-CSmb_mqt.mjs} +5 -5
  70. package/dist/{handleResumeCommand-lSVnvTNC.cjs → handleResumeCommand-BwnUZmbo.cjs} +6 -6
  71. package/dist/{handleResumeCommand-CNTnXBXA.mjs → handleResumeCommand-CgjpsdDe.mjs} +6 -6
  72. package/dist/{index-MwTVbeGW.cjs → index-BRClDe07.cjs} +3 -3
  73. package/dist/{index-DhARRePz.cjs → index-BYOZ_8WZ.cjs} +5 -5
  74. package/dist/{index-59hR7nVz.mjs → index-BYgfern_.mjs} +3 -3
  75. package/dist/{index-DY3I8j0W.mjs → index-BehVbAsA.mjs} +144 -90
  76. package/dist/{index-CxSLrTPA.mjs → index-Bvldtdny.mjs} +5 -5
  77. package/dist/{index-B6UGRQ7h.mjs → index-CEjJnq05.mjs} +3 -0
  78. package/dist/{index-DMy3OCBe.mjs → index-Clqlu17M.mjs} +2 -2
  79. package/dist/{index-D3kI0hDR.cjs → index-DFPT4HOO.cjs} +3 -0
  80. package/dist/{index-De8L5lFK.cjs → index-_l1Sdmbi.cjs} +2 -1
  81. package/dist/{index-jeD70GGH.cjs → index-piJPsTsm.cjs} +142 -88
  82. package/dist/index.cjs +2 -2
  83. package/dist/index.mjs +2 -2
  84. package/dist/{install-DXUEtGfU.cjs → install-TO4taKW7.cjs} +3 -3
  85. package/dist/{install-DytIJ_Ia.mjs → install-fYWHrPcC.mjs} +3 -3
  86. package/dist/lib.cjs +13 -13
  87. package/dist/lib.d.cts +10 -1
  88. package/dist/lib.d.mts +10 -1
  89. package/dist/lib.mjs +14 -14
  90. package/dist/{lidState-UasMvPzw.cjs → lidState-BeOwj6eW.cjs} +2 -2
  91. package/dist/{lidState-CduPmrM0.mjs → lidState-DNMlIhX0.mjs} +2 -2
  92. package/dist/{localHappyAgentAuth-DL8JjHTV.mjs → localHappyAgentAuth-BezKSFDi.mjs} +2 -2
  93. package/dist/{localHappyAgentAuth-CA02WOny.cjs → localHappyAgentAuth-Br-mgogg.cjs} +2 -2
  94. package/dist/{logger-CihCDWDw.mjs → logger--vAVtXB_.mjs} +2 -2
  95. package/dist/{logger-zoO54Zsy.cjs → logger-DXTWlPzP.cjs} +2 -2
  96. package/dist/{machineMetadata-DEZcQ_CQ.mjs → machineMetadata-B1H9gNbN.mjs} +3 -3
  97. package/dist/{machineMetadata-BAKVtr-k.cjs → machineMetadata-DcUupMje.cjs} +3 -3
  98. package/dist/{main-DyJfNlL_.mjs → main-CshDb5-1.mjs} +45 -45
  99. package/dist/{main-BIvxyX71.cjs → main-DoMFJ2Cl.cjs} +45 -45
  100. package/dist/{manager-2Il8XJVq.mjs → manager-BEsI4qt3.mjs} +1 -1
  101. package/dist/{mcp-yoIdGe6C.mjs → mcp-DKT_lrvQ.mjs} +16 -16
  102. package/dist/{mcp-Dd11vHij.cjs → mcp-pNc1EbQf.cjs} +15 -15
  103. package/dist/{mirrorProtocol-BukXB5s3.mjs → mirrorProtocol-6IFGPpjJ.mjs} +3 -3
  104. package/dist/{mirrorProtocol-D-hF_SE5.cjs → mirrorProtocol-qKflWTX_.cjs} +3 -3
  105. package/dist/{package-ayqGDKSp.mjs → package-B7B03ejW.mjs} +7 -7
  106. package/dist/{package-A7zOGx8B.cjs → package-DY4zTbKS.cjs} +7 -7
  107. package/dist/{peerTools-DDMSViPu.mjs → peerTools-3R9RUARX.mjs} +4 -4
  108. package/dist/{peerTools-dPc9hRC5.cjs → peerTools-iy3_6Yc5.cjs} +4 -4
  109. package/dist/{persistence-Cih2AWml.cjs → persistence-BfX72dne.cjs} +14 -3
  110. package/dist/{persistence-Dy3lmall.mjs → persistence-DTk4sNpd.mjs} +14 -4
  111. package/dist/{piRunnerArgs-D3z3-1VJ.mjs → piRunnerArgs-AT8QJY7x.mjs} +1 -1
  112. package/dist/{piRunnerArgs-BuJgnUI5.cjs → piRunnerArgs-CRQVR9o-.cjs} +1 -1
  113. package/dist/{piRuntime-B-SPcWIr.cjs → piRuntime-BHRT5MKO.cjs} +1 -1
  114. package/dist/{piRuntime-kVGue-_5.mjs → piRuntime-E44qTVQ4.mjs} +1 -1
  115. package/dist/{piTerminal-aEtVdCJ2.mjs → piTerminal-De8nbciM.mjs} +18 -18
  116. package/dist/{piTerminal-DSxK5aAm.cjs → piTerminal-hI4WFdWm.cjs} +17 -17
  117. package/dist/processTree-CMHWlVse.cjs +66 -0
  118. package/dist/processTree-CP5IvQ2Z.mjs +61 -0
  119. package/dist/{rateLimitWindows-82izLQy8.cjs → rateLimitWindows-Czb7_7cK.cjs} +1 -1
  120. package/dist/{rateLimitWindows-E5DRjfE6.mjs → rateLimitWindows-XrJiiBpU.mjs} +1 -1
  121. package/dist/{registerCommonHandlers-CqO075-X.cjs → registerCommonHandlers-C0_fyBQ0.cjs} +2 -2
  122. package/dist/{registerCommonHandlers-Bm7CMqMv.mjs → registerCommonHandlers-CvIedVRf.mjs} +2 -2
  123. package/dist/{registerKillSessionHandler-WQra3T9B.cjs → registerKillSessionHandler-DYl7l4Ts.cjs} +6 -6
  124. package/dist/{registerKillSessionHandler-D02OY4vi.mjs → registerKillSessionHandler-gwJ5lTf0.mjs} +6 -6
  125. package/dist/{remoteSessionClient-f3DYorl8.cjs → remoteSessionClient-BRTIOX5b.cjs} +5 -5
  126. package/dist/{remoteSessionClient-Buh6NejV.mjs → remoteSessionClient-DRb2Jr5s.mjs} +5 -5
  127. package/dist/{reportProgressTool-C2gn_HWD.cjs → reportProgressTool-B9nCzbkL.cjs} +2 -2
  128. package/dist/{reportProgressTool-C5aSoKYX.mjs → reportProgressTool-D5tEoXMW.mjs} +2 -2
  129. package/dist/{run-Drxogp0j.mjs → run-BQ_FGaOL.mjs} +106 -38
  130. package/dist/{run-CDEmq6Zs.cjs → run-CKe_WeLW.cjs} +106 -38
  131. package/dist/{runClaude-yEcZTCt_.cjs → runClaude-MHI5IKM-.cjs} +27 -23
  132. package/dist/{runClaude-BF6U2Js7.mjs → runClaude-zrrNcQC_.mjs} +28 -24
  133. package/dist/{runClaudeDeps-Bl4ndq7N.mjs → runClaudeDeps-CVBCokOS.mjs} +394 -96
  134. package/dist/{runClaudeDeps-CnNNFjlI.cjs → runClaudeDeps-RRw-Nusc.cjs} +388 -90
  135. package/dist/{runGemini-DDVDRNg4.cjs → runGemini-D7Lg9yCr.cjs} +209 -194
  136. package/dist/{runGemini-C3wt7iv7.mjs → runGemini-kipag2ag.mjs} +209 -194
  137. package/dist/{runOpenClaw-CY6YHAvj.mjs → runOpenClaw-C_lRY3Do.mjs} +20 -20
  138. package/dist/{runOpenClaw-BzlVA_9Q.cjs → runOpenClaw-DCcQ0L2N.cjs} +19 -19
  139. package/dist/{sandbox-CX_wLwpq.mjs → sandbox-BSyXFVFp.mjs} +5 -5
  140. package/dist/{sandbox-0UNHR3hP.cjs → sandbox-dMwPTmjm.cjs} +5 -5
  141. package/dist/selfCheck-CF7XGJPb.mjs +84 -0
  142. package/dist/{selfCheck-FNwMFY8p.cjs → selfCheck-DkzDDUsE.cjs} +35 -35
  143. package/dist/{send-CpEGYict.mjs → send-C-k9nsd3.mjs} +10 -10
  144. package/dist/{send-BQkl25g0.cjs → send-dxC0miIA.cjs} +9 -9
  145. package/dist/{server-BodFZ5sW.cjs → server-B-W6P7Qr.cjs} +7 -7
  146. package/dist/{server-DnINX_Lm.mjs → server-DxoTYNlw.mjs} +5 -5
  147. package/dist/{sessionLock-Ddn-fhZ0.mjs → sessionLock-DBdtZGOL.mjs} +3 -3
  148. package/dist/{sessionLock-DOj6mMXn.cjs → sessionLock-DWX6BbiU.cjs} +3 -3
  149. package/dist/{sessionModeFile-DDbonFR_.mjs → sessionModeFile-ByLbXTbg.mjs} +1 -1
  150. package/dist/{sessionModeFile-DVukoSp7.cjs → sessionModeFile-CLLdidiJ.cjs} +1 -1
  151. package/dist/{sessionOps-Nryt1DZt.cjs → sessionOps-BAnr7n8t.cjs} +5 -5
  152. package/dist/{sessionOps-B1vQ25GS.mjs → sessionOps-BVoXe12O.mjs} +6 -6
  153. package/dist/{sessionScanner-DCr3ofhR.mjs → sessionScanner-BtxoeluY.mjs} +34 -4
  154. package/dist/{sessionScanner-D1h-cdte.cjs → sessionScanner-CDOYsEUD.cjs} +34 -3
  155. package/dist/{sessions-DpAN6Ft9.mjs → sessions-C3sZJkzI.mjs} +11 -11
  156. package/dist/{sessions-D2HsTbLf.cjs → sessions-hAitoN-m.cjs} +10 -10
  157. package/dist/{setupOfflineReconnection-B9Tw1Ouj.cjs → setupOfflineReconnection-C2EeYTFH.cjs} +2 -2
  158. package/dist/{setupOfflineReconnection-DQHEp330.mjs → setupOfflineReconnection-_eD4cuUT.mjs} +2 -2
  159. package/dist/{spawn-CvDZ38hi.cjs → spawn-Bc9v7pIf.cjs} +15 -14
  160. package/dist/{spawn-CNjm1yOi.mjs → spawn-qNrB2CD_.mjs} +17 -16
  161. package/dist/{spawnAgents-CCjJifAW.cjs → spawnAgents-BVEaz35W.cjs} +1 -1
  162. package/dist/{spawnAgents-BjtmjBvP.mjs → spawnAgents-Bw6j4tqz.mjs} +1 -1
  163. package/dist/{spawnHappyCLI-C8Vl56wB.mjs → spawnHappyCLI-C2stUioM.mjs} +1 -1
  164. package/dist/{spawnHappyCLI-ahi4j6Mh.cjs → spawnHappyCLI-fzUagkKV.cjs} +1 -1
  165. package/dist/{specialCommands-BpqnGrOP.cjs → specialCommands-BJ-nqY4s.cjs} +3 -3
  166. package/dist/{specialCommands-DfVMGXTl.mjs → specialCommands-C6W-rVyh.mjs} +3 -3
  167. package/dist/{startFileWatcher-Ddn3L0u3.cjs → startFileWatcher-Bqlqjt93.cjs} +1 -1
  168. package/dist/{startFileWatcher-DXJXY4AE.mjs → startFileWatcher-CR09Snmz.mjs} +1 -1
  169. package/dist/{streamRelay-Cx01enfe.cjs → streamRelay-9kBPpbvU.cjs} +1 -1
  170. package/dist/{streamRelay-_qCd873P.mjs → streamRelay-CJoMk_d2.mjs} +1 -1
  171. package/dist/{sync-BKvgkhPs.mjs → sync-DbW07iQS.mjs} +1 -1
  172. package/dist/{sync-BgZuthoS.cjs → sync-Dhmtk66S.cjs} +1 -1
  173. package/dist/{systemPrompt-C6O1cHUg.cjs → systemPrompt-3PYi3EUY.cjs} +2 -2
  174. package/dist/{systemPrompt-DuPem6c9.mjs → systemPrompt-CQcuUmVp.mjs} +2 -2
  175. package/dist/{teams-CffMBBfU.mjs → teams-CwF4Z2fA.mjs} +7 -7
  176. package/dist/{teams-DifEhhmk.cjs → teams-DpxLcUU_.cjs} +7 -7
  177. package/dist/{time-s8CaneqW.cjs → time-A6zR3Iy6.cjs} +1 -1
  178. package/dist/{time-DxCTiteK.mjs → time-BuGWTVP6.mjs} +1 -1
  179. package/dist/{titleGenerator-B5T7QSzu.mjs → titleGenerator-BGEzNWC9.mjs} +1 -1
  180. package/dist/{titleGenerator-CXr7t6cf.cjs → titleGenerator-D26gvNaS.cjs} +2 -2
  181. package/dist/{todo-B41GKMcI.cjs → todo-73g3NCIO.cjs} +7 -7
  182. package/dist/{todo-DNO7s8td.mjs → todo-DrZc76H5.mjs} +7 -7
  183. package/dist/{tools-697R1uqn.mjs → tools-BtsrQnNS.mjs} +1 -1
  184. package/dist/{tools-lotMyxIE.cjs → tools-CxJp4T1T.cjs} +1 -1
  185. package/dist/{uninstall-CYO7EDjO.mjs → uninstall-DOb2mTwV.mjs} +3 -3
  186. package/dist/{uninstall-CRu96len.cjs → uninstall-DWNYvewQ.cjs} +3 -3
  187. package/package.json +7 -7
  188. package/dist/selfCheck-ClVv8NK3.mjs +0 -84
@@ -1,70 +1,70 @@
1
- import { i as isClaudeSessionId, g as extractCompleteLines, h as decideBackfill, j as parseTerminalHookPayload, k as decideMirrorBinding, M as MIRROR_BACKFILL_LINES_DEFAULT, m as mirrorLineKey, n as mirrorLocalId, o as initializeOwnedWorktree, e as summarizeSpawnSessionForLog, q as startAgentVersionChecks, W as WORKTREE_CAPABILITY_VERSION, t as currentWorktreeService } from './mirrorProtocol-BukXB5s3.mjs';
2
- import { P as PI_ADAPTER_INSTALL_HINT, s as sanitizeSpawnModel } from './piRunnerArgs-D3z3-1VJ.mjs';
1
+ import { i as isClaudeSessionId, g as extractCompleteLines, h as decideBackfill, j as parseTerminalHookPayload, k as decideMirrorBinding, M as MIRROR_BACKFILL_LINES_DEFAULT, m as mirrorLineKey, n as mirrorLocalId, o as initializeOwnedWorktree, e as summarizeSpawnSessionForLog, q as startAgentVersionChecks, W as WORKTREE_CAPABILITY_VERSION, t as currentWorktreeService } from './mirrorProtocol-6IFGPpjJ.mjs';
2
+ import { P as PI_ADAPTER_INSTALL_HINT, s as sanitizeSpawnModel } from './piRunnerArgs-AT8QJY7x.mjs';
3
3
  import fs from 'fs/promises';
4
4
  import * as tmp from 'tmp';
5
5
  import axios from 'axios';
6
- import { T as TurnActivityTracker, A as ApiClient } from './api-CbwDDXJt.mjs';
7
- import { S as SPAWN_AGENTS, i as isSpawnAgent, s as sanitizeSpawnPermissionMode, r as resolveSpawnPermissionMode, a as resolveFirstMessageMeta } from './spawnAgents-BjtmjBvP.mjs';
8
- import { l as logger } from './logger-CihCDWDw.mjs';
6
+ import { T as TurnActivityTracker, A as ApiClient } from './api-Dib0dmqC.mjs';
7
+ import { S as SPAWN_AGENTS, i as isSpawnAgent, s as sanitizeSpawnPermissionMode, r as resolveSpawnPermissionMode, a as resolveFirstMessageMeta } from './spawnAgents-Bw6j4tqz.mjs';
8
+ import { l as logger } from './logger--vAVtXB_.mjs';
9
9
  import { readdirSync, statSync, unlinkSync, realpathSync, mkdirSync, writeFileSync, accessSync, constants as constants$1, existsSync, readFileSync, openSync, fsyncSync, closeSync, renameSync } from 'node:fs';
10
10
  import { join, isAbsolute, resolve, dirname, sep, basename, delimiter } from 'node:path';
11
- import { p as pruneStaleCompileCaches } from './index-59hR7nVz.mjs';
12
- import { a as authAndSetupMachineIfNeeded } from './auth-B3xMoveE.mjs';
13
- import { c as configuration, f as ensurePrivateDirectorySync, w as writePrivateFileSync } from './configuration-BAwOtWFY.mjs';
11
+ import { p as pruneStaleCompileCaches } from './index-BYgfern_.mjs';
12
+ import { a as authAndSetupMachineIfNeeded } from './auth-BRjd2esb.mjs';
13
+ import { c as configuration, f as ensurePrivateDirectorySync, w as writePrivateFileSync } from './configuration-DVrb61aY.mjs';
14
14
  import { spawn, execSync } from 'child_process';
15
- import { p as packageJson } from './package-ayqGDKSp.mjs';
16
- import { a as globalPrefixForPackage, g as getEnvironmentInfo } from './doctor-D554c6Bg.mjs';
17
- import { s as spawnHappyCLI } from './spawnHappyCLI-C8Vl56wB.mjs';
18
- import { b as readPersistedSessions, r as readSettings, l as latchKeepAwake, q as reportSignature, s as decideDaemonHibernation, t as nextCheckDelay, v as persistSession, d as readDaemonState, x as acquireDaemonLock, a as resolveCheckMs, y as resolveIdleMs, z as deletePersistedSessions, A as writeDaemonState, B as writeSettings, C as settingIdleMs, u as updateSettings, D as releaseDaemonLock } from './persistence-Dy3lmall.mjs';
19
- import { i as isDaemonRunningCurrentlyInstalledHappyVersion, b as stopDaemon, t as cleanupDaemonState } from './controlClient-00KYAjsI.mjs';
20
- import { e as sendUserMessage, f as readSessionMetadata, r as readSessionTranscript, l as listAccountSessions, a as listSessions, M as MAX_READ_LIMIT, s as sessionWebUrl, g as waitForSessionKey, d as archiveSession, j as analyzeLatestTurn, k as readSessionLog, m as TURN_WINDOW, n as userPromptText } from './sessionOps-B1vQ25GS.mjs';
15
+ import { p as packageJson } from './package-B7B03ejW.mjs';
16
+ import { g as globalPrefixForPackage, a as getEnvironmentInfo } from './doctor-0BiGwJXk.mjs';
17
+ import { s as spawnHappyCLI } from './spawnHappyCLI-C2stUioM.mjs';
18
+ import { b as readPersistedSessions, r as readSettings, l as latchKeepAwake, q as reportSignature, s as decideDaemonHibernation, t as nextCheckDelay, v as persistSession, d as readDaemonState, x as acquireDaemonLock, a as resolveCheckMs, y as resolveIdleMs, z as deletePersistedSessions, A as writeDaemonState, B as writeSettings, C as settingIdleMs, u as updateSettings, D as rewriteCredentialsForRelay, g as readCredentials, E as releaseDaemonLock } from './persistence-DTk4sNpd.mjs';
19
+ import { i as isDaemonRunningCurrentlyInstalledHappyVersion, b as stopDaemon, o as cleanupDaemonState } from './controlClient-BYKyGyxj.mjs';
20
+ import { e as sendUserMessage, f as readSessionMetadata, r as readSessionTranscript, l as listAccountSessions, a as listSessions, M as MAX_READ_LIMIT, s as sessionWebUrl, g as waitForSessionKey, d as archiveSession, j as analyzeLatestTurn, k as readSessionLog, m as TURN_WINDOW, n as userPromptText } from './sessionOps-BVoXe12O.mjs';
21
21
  import fastify from 'fastify';
22
22
  import { z } from 'zod';
23
23
  import { validatorCompiler, serializerCompiler } from 'fastify-type-provider-zod';
24
- import { d as decodeBase64, e as encodeBase64, h as decrypt } from './authRelay-DSAvg1uv.mjs';
24
+ import { d as decodeBase64, s as sameRelay, e as encodeBase64, h as decrypt } from './authRelay-DhQhkBvX.mjs';
25
25
  import { randomBytes, createHash, timingSafeEqual, randomUUID } from 'node:crypto';
26
26
  import { c as checkPreviewPath } from './previewPath-CXN4Vag0.mjs';
27
- import { a as BACKGROUND_TASKS_MAX, d as BACKGROUND_TASK_DESCRIPTION_MAX, e as BackgroundTaskTracker } from './backgroundTaskActivity-8PdPxrvy.mjs';
28
- import { b as sanitizeRateLimitReport } from './rateLimitWindows-E5DRjfE6.mjs';
29
- import { f as formatEditConflictNotice, b as SESSION_PEER_SENT_FROM, s as sendPeerMessage, l as listPeerSessions, C as CLI_PEER_SENDER_ID } from './peerTools-DDMSViPu.mjs';
27
+ import { a as BACKGROUND_TASKS_MAX, c as BACKGROUND_TASK_DESCRIPTION_MAX, d as BackgroundTaskTracker } from './backgroundTaskActivity-BVwJBl02.mjs';
28
+ import { b as sanitizeRateLimitReport } from './rateLimitWindows-XrJiiBpU.mjs';
29
+ import { f as formatEditConflictNotice, b as SESSION_PEER_SENT_FROM, s as sendPeerMessage, l as listPeerSessions, C as CLI_PEER_SENDER_ID } from './peerTools-3R9RUARX.mjs';
30
30
  import os, { hostname, homedir, userInfo, tmpdir } from 'node:os';
31
- import { c as RemoteCallBudget, e as REMOTE_WRITE_CALLS_PER_MINUTE, d as deliverToSession, g as guardRemoteSessionOpsRequest, h as remoteError, i as REMOTE_OP_DEADLINE_MS, j as formatRemoteAuditLine, k as REMOTE_SEND_COMMIT_DEADLINE_MS, m as REMOTE_RESUME_WAIT_MS, n as capRemoteTranscript, o as capRemoteText, p as REMOTE_ANSWER_MAX_BYTES, q as REMOTE_TITLE_MAX_BYTES } from './remoteSessionClient-Buh6NejV.mjs';
32
- import { assistantHome, bootstrapAssistantHome } from './bootstrap-CxuBAkJU.mjs';
33
- import { refreshAgentHomes, locateClaudeConversation, agentHomeSpawnEnv } from './index-CxSLrTPA.mjs';
31
+ import { c as RemoteCallBudget, e as REMOTE_WRITE_CALLS_PER_MINUTE, d as deliverToSession, g as guardRemoteSessionOpsRequest, h as remoteError, i as REMOTE_OP_DEADLINE_MS, j as formatRemoteAuditLine, k as REMOTE_SEND_COMMIT_DEADLINE_MS, m as REMOTE_RESUME_WAIT_MS, n as capRemoteTranscript, o as capRemoteText, p as REMOTE_ANSWER_MAX_BYTES, q as REMOTE_TITLE_MAX_BYTES } from './remoteSessionClient-DRb2Jr5s.mjs';
32
+ import { assistantHome, bootstrapAssistantHome } from './bootstrap-BUagGC_-.mjs';
33
+ import { refreshAgentHomes, locateClaudeConversation, agentHomeSpawnEnv } from './index-Bvldtdny.mjs';
34
34
  import { existsSync as existsSync$1, statSync as statSync$1, mkdtempSync, rmSync } from 'fs';
35
35
  import { join as join$1 } from 'path';
36
36
  import { spawn as spawn$1, execFile, spawnSync } from 'node:child_process';
37
37
  import { p as projectPath } from './projectPath-BTBIMB57.mjs';
38
38
  import { d as daemonEndpointsMatch, r as resolveClaudeCredentialReadiness } from './doctorReadiness-C208SMN9.mjs';
39
- import { g as getInitialMachineMetadata, a as getStartupCliAvailability } from './machineMetadata-DEZcQ_CQ.mjs';
40
- import { buildResumeLaunch } from './handleResumeCommand-CNTnXBXA.mjs';
39
+ import { g as getInitialMachineMetadata, a as getStartupCliAvailability } from './machineMetadata-B1H9gNbN.mjs';
40
+ import { buildResumeLaunch } from './handleResumeCommand-CgjpsdDe.mjs';
41
+ import { u as ServerMigrateNoticeSchema, v as AUTOMATION_SUMMARY_MAX_CHARS, w as AUTOMATION_PRECHECK_OUTPUT_MAX_CHARS, x as AUTOMATION_PRECHECK_DEFAULT_TIMEOUT_MS, a as AUTOMATION_PRECHECK_MAX_TIMEOUT_MS, y as AUTOMATION_CLAIM_MAX_RUNS, z as AUTOMATION_DAEMON_CAPABILITY_PRECHECK, D as AUTOMATION_DEFAULT_LEASE_MS, i as isAutomationRunTerminal } from './index-Clqlu17M.mjs';
41
42
  import { access, symlink, readFile, rm, unlink, readlink, lstat, constants, stat, open } from 'node:fs/promises';
42
43
  import { p as parseExactVersion, c as compareExactVersions, f as fetchCliUpdateState, r as resolveCliUpdateCheckInterval, D as DEFAULT_CLI_UPDATE_CHECK_INTERVAL_MS } from './cliUpdate-Y34VGe9Y.mjs';
43
- import { c as createAutomationsClient, i as isAutomationsUnavailable, d as AutomationsRequestError } from './client-Ryu9fllj.mjs';
44
+ import { c as createAutomationsClient, i as isAutomationsUnavailable, d as AutomationsRequestError } from './client-CnlkkrZO.mjs';
44
45
  import { createRequire } from 'node:module';
45
46
  import { g as getProjectPath } from './path-D2wdaNSk.mjs';
46
47
  import { b as extractClaudeEditPaths } from './editPaths-BVfS_FFL.mjs';
47
- import { s as startFileWatcher } from './startFileWatcher-DXJXY4AE.mjs';
48
- import { I as InvalidateSync } from './sync-BKvgkhPs.mjs';
48
+ import { s as startFileWatcher } from './startFileWatcher-CR09Snmz.mjs';
49
+ import { I as InvalidateSync } from './sync-DbW07iQS.mjs';
49
50
  import { R as RawJSONLinesSchema } from './types-CkqAACXx.mjs';
50
51
  import { t as tmuxArgs, a as scrubTmuxClientEnv, s as shellescape } from './tmuxSocket-B8Yx20sT.mjs';
51
- import { p as processIdentityFields, r as readSessionLock, t as terminateProcess } from './sessionLock-Ddn-fhZ0.mjs';
52
+ import { p as processIdentityFields, r as readSessionLock, t as terminateProcess } from './sessionLock-DBdtZGOL.mjs';
52
53
  import { findAllHappyProcesses } from './doctor-BPkYWSuq.mjs';
53
54
  import { T as TEAM_SKILL } from './resources-BdFBQi8r.mjs';
54
55
  import { promisify } from 'node:util';
55
- import { u as AUTOMATION_SUMMARY_MAX_CHARS, v as AUTOMATION_PRECHECK_OUTPUT_MAX_CHARS, w as AUTOMATION_PRECHECK_DEFAULT_TIMEOUT_MS, a as AUTOMATION_PRECHECK_MAX_TIMEOUT_MS, x as AUTOMATION_CLAIM_MAX_RUNS, y as AUTOMATION_DAEMON_CAPABILITY_PRECHECK, z as AUTOMATION_DEFAULT_LEASE_MS, i as isAutomationRunTerminal } from './index-DMy3OCBe.mjs';
56
56
  import { c as clipText, r as renderAction, b as renderTemplate } from './template-CiOPa2rd.mjs';
57
57
  import { d as detectDaemonSupervisor } from './daemonSupervisor-C6urv3_8.mjs';
58
58
  import { d as describeAgentHome } from './loginShellEnv-Dw8M7tkI.mjs';
59
- import './sessionModeFile-DDbonFR_.mjs';
60
- import './lidState-CduPmrM0.mjs';
59
+ import './sessionModeFile-ByLbXTbg.mjs';
60
+ import './lidState-DNMlIhX0.mjs';
61
61
  import 'os';
62
62
  import 'node:events';
63
63
  import 'socket.io-client';
64
- import './attachmentLimits-Di1Z93lN.mjs';
64
+ import './attachmentLimits-UyFn8fkQ.mjs';
65
65
  import './limits-DIo7rEBR.mjs';
66
- import './time-DxCTiteK.mjs';
67
- import './registerCommonHandlers-Bm7CMqMv.mjs';
66
+ import './time-BuGWTVP6.mjs';
67
+ import './registerCommonHandlers-CvIedVRf.mjs';
68
68
  import 'util';
69
69
  import 'crypto';
70
70
  import 'cross-spawn';
@@ -72,12 +72,12 @@ import '@paralleldrive/cuid2';
72
72
  import './contentLogMetadata-BlWI0egu.mjs';
73
73
  import 'chalk';
74
74
  import 'tweetnacl';
75
- import './browser-BvARP-YR.mjs';
75
+ import './browser-Dj_DYQEh.mjs';
76
76
  import 'open';
77
77
  import './ids-DU6sLx4C.mjs';
78
78
  import 'url';
79
79
  import './detectCLI-CSGMlV51.mjs';
80
- import './localHappyAgentAuth-DL8JjHTV.mjs';
80
+ import './localHappyAgentAuth-BezKSFDi.mjs';
81
81
  import 'ps-list';
82
82
 
83
83
  async function resolveRelaunchMetadata(snapshot, fetchServer) {
@@ -2030,6 +2030,52 @@ function spawnAgentUnavailableError(agent, availability) {
2030
2030
  return null;
2031
2031
  }
2032
2032
 
2033
+ function isAcceptableRelayUrl(url) {
2034
+ try {
2035
+ const parsed = new URL(url);
2036
+ const loopback = parsed.hostname === "localhost" || parsed.hostname === "127.0.0.1" || parsed.hostname === "[::1]";
2037
+ return parsed.protocol === "https:" || parsed.protocol === "http:" && loopback;
2038
+ } catch {
2039
+ return false;
2040
+ }
2041
+ }
2042
+ async function applyServerMigration(raw, deps) {
2043
+ const parsed = ServerMigrateNoticeSchema.safeParse(raw);
2044
+ if (!parsed.success) return { action: "ignored", reason: "malformed notice" };
2045
+ const notice = parsed.data;
2046
+ if (sameRelay(notice.url, deps.configuredServerUrl)) return { action: "ignored", reason: "already on that relay" };
2047
+ if (!isAcceptableRelayUrl(notice.url) || !isAcceptableRelayUrl(notice.webappUrl)) {
2048
+ return refuse(deps, `relay URL must be https: ${notice.url}`);
2049
+ }
2050
+ if (deps.env.HAPPY_SERVER_URL?.trim()) {
2051
+ return refuse(deps, `HAPPY_SERVER_URL is set in this daemon's environment; unset it (or point it at ${notice.url}) and restart the daemon`);
2052
+ }
2053
+ const credentials = await deps.readCredentials();
2054
+ if (!credentials) return refuse(deps, "no credentials on disk");
2055
+ let token;
2056
+ try {
2057
+ const response = await deps.fetch(`${notice.url}/v1/auth/migrate/complete`, {
2058
+ method: "POST",
2059
+ headers: { "content-type": "application/json", "X-Happy-Client": deps.clientId },
2060
+ body: JSON.stringify({ handoff: notice.handoff })
2061
+ });
2062
+ if (!response.ok) return refuse(deps, `${notice.url} refused the handoff (HTTP ${response.status})`);
2063
+ const body = await response.json();
2064
+ if (body.kind !== "daemon" || typeof body.token !== "string" || !body.token) return refuse(deps, `${notice.url} answered without a daemon token`);
2065
+ token = body.token;
2066
+ } catch (error) {
2067
+ return refuse(deps, `${notice.url} unreachable: ${error instanceof Error ? error.message : String(error)}`);
2068
+ }
2069
+ await deps.updateSettings((current) => ({ ...current, serverUrl: notice.url, webappUrl: notice.webappUrl }));
2070
+ await deps.rewriteCredentials(credentials, { token, authServerUrl: notice.url });
2071
+ deps.log(`[RELAY MOVE] Moved this machine from ${deps.configuredServerUrl} to ${notice.url}; handing over to a new daemon`);
2072
+ return { action: "moved", serverUrl: notice.url, webappUrl: notice.webappUrl };
2073
+ }
2074
+ function refuse(deps, reason) {
2075
+ deps.log(`[RELAY MOVE] Not moving this machine: ${reason}`);
2076
+ return { action: "refused", reason };
2077
+ }
2078
+
2033
2079
  function str(value) {
2034
2080
  return typeof value === "string" && value.length > 0 ? value : void 0;
2035
2081
  }
@@ -6007,6 +6053,27 @@ async function startDaemon() {
6007
6053
  });
6008
6054
  apiMachine.setCliUpdateRetryHandler(updateController.retry);
6009
6055
  apiMachine.setCliUpdateRequestHandler(updateController.request);
6056
+ let pendingRelayMove = null;
6057
+ let relayMoveInFlight = null;
6058
+ apiMachine.setServerMigrateHandler((notice) => {
6059
+ if (relayMoveInFlight || pendingRelayMove) return;
6060
+ relayMoveInFlight = applyServerMigration(notice, {
6061
+ configuredServerUrl: configuration.serverUrl,
6062
+ env: process.env,
6063
+ clientId: `cli-daemon/${configuration.currentCliVersion}`,
6064
+ fetch,
6065
+ readCredentials,
6066
+ rewriteCredentials: rewriteCredentialsForRelay,
6067
+ updateSettings,
6068
+ log: (message) => logger.warn(message)
6069
+ }).then((outcome) => {
6070
+ if (outcome.action === "moved") pendingRelayMove = { serverUrl: outcome.serverUrl };
6071
+ }).catch((error) => {
6072
+ logger.warn("[RELAY MOVE] Failed:", error);
6073
+ }).finally(() => {
6074
+ relayMoveInFlight = null;
6075
+ });
6076
+ });
6010
6077
  const refreshCliUpdate = () => updateController.refresh().catch((error) => {
6011
6078
  logger.debug("[DAEMON RUN] CLI update policy check failed:", error);
6012
6079
  });
@@ -6044,8 +6111,9 @@ async function startDaemon() {
6044
6111
  } catch {
6045
6112
  }
6046
6113
  }
6047
- if (bundleReplaced && !teamWorker?.busy && !automationRunner?.busy && !updateController.isRunning() && !turnActivity.hasActiveTurn() && !backgroundTasks.hasAny()) {
6048
- const preflight = await preflightNewBundle(bundlePath);
6114
+ const relayMove = pendingRelayMove;
6115
+ if ((bundleReplaced || relayMove) && !teamWorker?.busy && !automationRunner?.busy && !updateController.isRunning() && !turnActivity.hasActiveTurn() && !backgroundTasks.hasAny()) {
6116
+ const preflight = bundleReplaced ? await preflightNewBundle(bundlePath) : { action: "proceed" };
6049
6117
  if (preflight.action === "hold") {
6050
6118
  if (lastHandoverHold !== preflight.reason) {
6051
6119
  lastHandoverHold = preflight.reason;
@@ -6056,7 +6124,7 @@ async function startDaemon() {
6056
6124
  }
6057
6125
  if (teamWorker?.busy || automationRunner?.busy || updateController.isRunning() || turnActivity.hasActiveTurn() || backgroundTasks.hasAny()) return;
6058
6126
  lastHandoverHold = null;
6059
- logger.debug("[DAEMON RUN] Daemon bundle replaced on disk and verified, handing off to new daemon");
6127
+ logger.debug(relayMove ? `[DAEMON RUN] Relay moved to ${relayMove.serverUrl}; handing off to a new daemon on the new settings` : "[DAEMON RUN] Daemon bundle replaced on disk and verified, handing off to new daemon");
6060
6128
  teamWorker?.stop();
6061
6129
  automationRunner?.stop();
6062
6130
  clearInterval(restartOnStaleVersionAndHeartbeat);
@@ -1,72 +1,72 @@
1
1
  'use strict';
2
2
 
3
- var mirrorProtocol = require('./mirrorProtocol-D-hF_SE5.cjs');
4
- var piRunnerArgs = require('./piRunnerArgs-BuJgnUI5.cjs');
3
+ var mirrorProtocol = require('./mirrorProtocol-qKflWTX_.cjs');
4
+ var piRunnerArgs = require('./piRunnerArgs-CRQVR9o-.cjs');
5
5
  var fs = require('fs/promises');
6
6
  var tmp = require('tmp');
7
7
  var axios = require('axios');
8
- var api = require('./api-Buc_ejoA.cjs');
9
- var spawnAgents = require('./spawnAgents-CCjJifAW.cjs');
10
- var logger = require('./logger-zoO54Zsy.cjs');
8
+ var api = require('./api-JANhFdZV.cjs');
9
+ var spawnAgents = require('./spawnAgents-BVEaz35W.cjs');
10
+ var logger = require('./logger-DXTWlPzP.cjs');
11
11
  var node_fs = require('node:fs');
12
12
  var path = require('node:path');
13
- var index$2 = require('./index-MwTVbeGW.cjs');
14
- var auth = require('./auth-CpO3ZUMz.cjs');
15
- var configuration = require('./configuration-CpBrilxV.cjs');
13
+ var index$2 = require('./index-BRClDe07.cjs');
14
+ var auth = require('./auth-DgIV0Cvt.cjs');
15
+ var configuration = require('./configuration-4TGMrjul.cjs');
16
16
  var child_process = require('child_process');
17
- var _package = require('./package-A7zOGx8B.cjs');
18
- var doctor = require('./doctor-BXkNXcok.cjs');
19
- var spawnHappyCLI = require('./spawnHappyCLI-ahi4j6Mh.cjs');
20
- var persistence = require('./persistence-Cih2AWml.cjs');
21
- var controlClient = require('./controlClient-bs_YqwDl.cjs');
22
- var sessionOps = require('./sessionOps-Nryt1DZt.cjs');
17
+ var _package = require('./package-DY4zTbKS.cjs');
18
+ var doctor = require('./doctor-BshRnjLi.cjs');
19
+ var spawnHappyCLI = require('./spawnHappyCLI-fzUagkKV.cjs');
20
+ var persistence = require('./persistence-BfX72dne.cjs');
21
+ var controlClient = require('./controlClient-BTaZlbC6.cjs');
22
+ var sessionOps = require('./sessionOps-BAnr7n8t.cjs');
23
23
  var fastify = require('fastify');
24
24
  var z = require('zod');
25
25
  var fastifyTypeProviderZod = require('fastify-type-provider-zod');
26
- var authRelay = require('./authRelay-BdYkC1Po.cjs');
26
+ var authRelay = require('./authRelay-Dy1qU9td.cjs');
27
27
  var node_crypto = require('node:crypto');
28
28
  var previewPath = require('./previewPath-B0rBdhy1.cjs');
29
29
  var backgroundTaskActivity = require('./backgroundTaskActivity-CBvUdj39.cjs');
30
- var rateLimitWindows = require('./rateLimitWindows-82izLQy8.cjs');
31
- var peerTools = require('./peerTools-dPc9hRC5.cjs');
30
+ var rateLimitWindows = require('./rateLimitWindows-Czb7_7cK.cjs');
31
+ var peerTools = require('./peerTools-iy3_6Yc5.cjs');
32
32
  var os = require('node:os');
33
- var remoteSessionClient = require('./remoteSessionClient-f3DYorl8.cjs');
34
- var bootstrap = require('./bootstrap-BboDz_w2.cjs');
35
- var index$1 = require('./index-DhARRePz.cjs');
33
+ var remoteSessionClient = require('./remoteSessionClient-BRTIOX5b.cjs');
34
+ var bootstrap = require('./bootstrap-DCQ87Aan.cjs');
35
+ var index$1 = require('./index-BYOZ_8WZ.cjs');
36
36
  var fs$1 = require('fs');
37
37
  var path$2 = require('path');
38
38
  var node_child_process = require('node:child_process');
39
39
  var projectPath = require('./projectPath-ChLhdOyt.cjs');
40
40
  var doctorReadiness = require('./doctorReadiness-BCZGcN0a.cjs');
41
- var machineMetadata = require('./machineMetadata-BAKVtr-k.cjs');
42
- var handleResumeCommand = require('./handleResumeCommand-lSVnvTNC.cjs');
41
+ var machineMetadata = require('./machineMetadata-DcUupMje.cjs');
42
+ var handleResumeCommand = require('./handleResumeCommand-BwnUZmbo.cjs');
43
+ var index = require('./index-_l1Sdmbi.cjs');
43
44
  var promises = require('node:fs/promises');
44
45
  var cliUpdate = require('./cliUpdate-DsKXPFYp.cjs');
45
- var client = require('./client-D9pEOhn4.cjs');
46
+ var client = require('./client-C4zKGjiJ.cjs');
46
47
  var module$1 = require('node:module');
47
48
  var path$1 = require('./path-B7zW-WwE.cjs');
48
49
  var editPaths = require('./editPaths-Bqp4OFPw.cjs');
49
- var startFileWatcher = require('./startFileWatcher-Ddn3L0u3.cjs');
50
- var sync = require('./sync-BgZuthoS.cjs');
50
+ var startFileWatcher = require('./startFileWatcher-Bqlqjt93.cjs');
51
+ var sync = require('./sync-Dhmtk66S.cjs');
51
52
  var types = require('./types-CRS-srZK.cjs');
52
53
  var tmuxSocket = require('./tmuxSocket-D-Xt6Vn-.cjs');
53
- var sessionLock = require('./sessionLock-DOj6mMXn.cjs');
54
+ var sessionLock = require('./sessionLock-DWX6BbiU.cjs');
54
55
  var doctor$1 = require('./doctor-u46qYYKX.cjs');
55
56
  var resources = require('./resources-JDPugcDq.cjs');
56
57
  var node_util = require('node:util');
57
- var index = require('./index-De8L5lFK.cjs');
58
58
  var template = require('./template-BaHAmH2K.cjs');
59
59
  var daemonSupervisor = require('./daemonSupervisor-B-SPSqhs.cjs');
60
60
  var loginShellEnv = require('./loginShellEnv-BkuYtExZ.cjs');
61
- require('./sessionModeFile-DVukoSp7.cjs');
62
- require('./lidState-UasMvPzw.cjs');
61
+ require('./sessionModeFile-CLLdidiJ.cjs');
62
+ require('./lidState-BeOwj6eW.cjs');
63
63
  require('os');
64
64
  require('node:events');
65
65
  require('socket.io-client');
66
- require('./attachmentLimits-DtFqqiwR.cjs');
66
+ require('./attachmentLimits-SqeAHrVC.cjs');
67
67
  require('./limits-C-a7gr04.cjs');
68
- require('./time-s8CaneqW.cjs');
69
- require('./registerCommonHandlers-CqO075-X.cjs');
68
+ require('./time-A6zR3Iy6.cjs');
69
+ require('./registerCommonHandlers-C0_fyBQ0.cjs');
70
70
  require('util');
71
71
  require('crypto');
72
72
  require('cross-spawn');
@@ -74,12 +74,12 @@ require('@paralleldrive/cuid2');
74
74
  require('./contentLogMetadata-ZSFk_NjQ.cjs');
75
75
  require('chalk');
76
76
  require('tweetnacl');
77
- require('./browser-GQZJxD2n.cjs');
77
+ require('./browser-CSKhc0Bl.cjs');
78
78
  require('open');
79
79
  require('./ids-B6ZC0HGt.cjs');
80
80
  require('url');
81
81
  require('./detectCLI-DR9ZaN6B.cjs');
82
- require('./localHappyAgentAuth-CA02WOny.cjs');
82
+ require('./localHappyAgentAuth-Br-mgogg.cjs');
83
83
  require('ps-list');
84
84
 
85
85
  var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
@@ -2052,6 +2052,52 @@ function spawnAgentUnavailableError(agent, availability) {
2052
2052
  return null;
2053
2053
  }
2054
2054
 
2055
+ function isAcceptableRelayUrl(url) {
2056
+ try {
2057
+ const parsed = new URL(url);
2058
+ const loopback = parsed.hostname === "localhost" || parsed.hostname === "127.0.0.1" || parsed.hostname === "[::1]";
2059
+ return parsed.protocol === "https:" || parsed.protocol === "http:" && loopback;
2060
+ } catch {
2061
+ return false;
2062
+ }
2063
+ }
2064
+ async function applyServerMigration(raw, deps) {
2065
+ const parsed = index.ServerMigrateNoticeSchema.safeParse(raw);
2066
+ if (!parsed.success) return { action: "ignored", reason: "malformed notice" };
2067
+ const notice = parsed.data;
2068
+ if (authRelay.sameRelay(notice.url, deps.configuredServerUrl)) return { action: "ignored", reason: "already on that relay" };
2069
+ if (!isAcceptableRelayUrl(notice.url) || !isAcceptableRelayUrl(notice.webappUrl)) {
2070
+ return refuse(deps, `relay URL must be https: ${notice.url}`);
2071
+ }
2072
+ if (deps.env.HAPPY_SERVER_URL?.trim()) {
2073
+ return refuse(deps, `HAPPY_SERVER_URL is set in this daemon's environment; unset it (or point it at ${notice.url}) and restart the daemon`);
2074
+ }
2075
+ const credentials = await deps.readCredentials();
2076
+ if (!credentials) return refuse(deps, "no credentials on disk");
2077
+ let token;
2078
+ try {
2079
+ const response = await deps.fetch(`${notice.url}/v1/auth/migrate/complete`, {
2080
+ method: "POST",
2081
+ headers: { "content-type": "application/json", "X-Happy-Client": deps.clientId },
2082
+ body: JSON.stringify({ handoff: notice.handoff })
2083
+ });
2084
+ if (!response.ok) return refuse(deps, `${notice.url} refused the handoff (HTTP ${response.status})`);
2085
+ const body = await response.json();
2086
+ if (body.kind !== "daemon" || typeof body.token !== "string" || !body.token) return refuse(deps, `${notice.url} answered without a daemon token`);
2087
+ token = body.token;
2088
+ } catch (error) {
2089
+ return refuse(deps, `${notice.url} unreachable: ${error instanceof Error ? error.message : String(error)}`);
2090
+ }
2091
+ await deps.updateSettings((current) => ({ ...current, serverUrl: notice.url, webappUrl: notice.webappUrl }));
2092
+ await deps.rewriteCredentials(credentials, { token, authServerUrl: notice.url });
2093
+ deps.log(`[RELAY MOVE] Moved this machine from ${deps.configuredServerUrl} to ${notice.url}; handing over to a new daemon`);
2094
+ return { action: "moved", serverUrl: notice.url, webappUrl: notice.webappUrl };
2095
+ }
2096
+ function refuse(deps, reason) {
2097
+ deps.log(`[RELAY MOVE] Not moving this machine: ${reason}`);
2098
+ return { action: "refused", reason };
2099
+ }
2100
+
2055
2101
  function str(value) {
2056
2102
  return typeof value === "string" && value.length > 0 ? value : void 0;
2057
2103
  }
@@ -2651,7 +2697,7 @@ function parseJsonObject(text) {
2651
2697
  return null;
2652
2698
  }
2653
2699
  }
2654
- 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-CDEmq6Zs.cjs', document.baseURI).href))).resolve(s)) {
2700
+ 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-CKe_WeLW.cjs', document.baseURI).href))).resolve(s)) {
2655
2701
  const platformArch = `${platform}-${arch}`;
2656
2702
  const candidates = [
2657
2703
  `@anthropic-ai/claude-agent-sdk-${platformArch}/claude`,
@@ -6029,6 +6075,27 @@ async function startDaemon() {
6029
6075
  });
6030
6076
  apiMachine.setCliUpdateRetryHandler(updateController.retry);
6031
6077
  apiMachine.setCliUpdateRequestHandler(updateController.request);
6078
+ let pendingRelayMove = null;
6079
+ let relayMoveInFlight = null;
6080
+ apiMachine.setServerMigrateHandler((notice) => {
6081
+ if (relayMoveInFlight || pendingRelayMove) return;
6082
+ relayMoveInFlight = applyServerMigration(notice, {
6083
+ configuredServerUrl: configuration.configuration.serverUrl,
6084
+ env: process.env,
6085
+ clientId: `cli-daemon/${configuration.configuration.currentCliVersion}`,
6086
+ fetch,
6087
+ readCredentials: persistence.readCredentials,
6088
+ rewriteCredentials: persistence.rewriteCredentialsForRelay,
6089
+ updateSettings: persistence.updateSettings,
6090
+ log: (message) => logger.logger.warn(message)
6091
+ }).then((outcome) => {
6092
+ if (outcome.action === "moved") pendingRelayMove = { serverUrl: outcome.serverUrl };
6093
+ }).catch((error) => {
6094
+ logger.logger.warn("[RELAY MOVE] Failed:", error);
6095
+ }).finally(() => {
6096
+ relayMoveInFlight = null;
6097
+ });
6098
+ });
6032
6099
  const refreshCliUpdate = () => updateController.refresh().catch((error) => {
6033
6100
  logger.logger.debug("[DAEMON RUN] CLI update policy check failed:", error);
6034
6101
  });
@@ -6066,8 +6133,9 @@ async function startDaemon() {
6066
6133
  } catch {
6067
6134
  }
6068
6135
  }
6069
- if (bundleReplaced && !teamWorker?.busy && !automationRunner?.busy && !updateController.isRunning() && !turnActivity.hasActiveTurn() && !backgroundTasks.hasAny()) {
6070
- const preflight = await preflightNewBundle(bundlePath);
6136
+ const relayMove = pendingRelayMove;
6137
+ if ((bundleReplaced || relayMove) && !teamWorker?.busy && !automationRunner?.busy && !updateController.isRunning() && !turnActivity.hasActiveTurn() && !backgroundTasks.hasAny()) {
6138
+ const preflight = bundleReplaced ? await preflightNewBundle(bundlePath) : { action: "proceed" };
6071
6139
  if (preflight.action === "hold") {
6072
6140
  if (lastHandoverHold !== preflight.reason) {
6073
6141
  lastHandoverHold = preflight.reason;
@@ -6078,7 +6146,7 @@ async function startDaemon() {
6078
6146
  }
6079
6147
  if (teamWorker?.busy || automationRunner?.busy || updateController.isRunning() || turnActivity.hasActiveTurn() || backgroundTasks.hasAny()) return;
6080
6148
  lastHandoverHold = null;
6081
- logger.logger.debug("[DAEMON RUN] Daemon bundle replaced on disk and verified, handing off to new daemon");
6149
+ logger.logger.debug(relayMove ? `[DAEMON RUN] Relay moved to ${relayMove.serverUrl}; handing off to a new daemon on the new settings` : "[DAEMON RUN] Daemon bundle replaced on disk and verified, handing off to new daemon");
6082
6150
  teamWorker?.stop();
6083
6151
  automationRunner?.stop();
6084
6152
  clearInterval(restartOnStaleVersionAndHeartbeat);
@@ -1,59 +1,59 @@
1
1
  'use strict';
2
2
 
3
3
  var os = require('node:os');
4
- var sessionLock = require('./sessionLock-DOj6mMXn.cjs');
5
- var persistence = require('./persistence-Cih2AWml.cjs');
6
- var defaultPermissionMode = require('./defaultPermissionMode-CMsiaRzr.cjs');
4
+ var sessionLock = require('./sessionLock-DWX6BbiU.cjs');
5
+ var persistence = require('./persistence-BfX72dne.cjs');
6
+ var defaultPermissionMode = require('./defaultPermissionMode-BEWCqJU-.cjs');
7
7
  var node_crypto = require('node:crypto');
8
- var api = require('./api-Buc_ejoA.cjs');
9
- var logger = require('./logger-zoO54Zsy.cjs');
10
- var createSessionMetadata = require('./createSessionMetadata-D4Sj6H95.cjs');
11
- var _package = require('./package-A7zOGx8B.cjs');
12
- var index = require('./index-De8L5lFK.cjs');
8
+ var api = require('./api-JANhFdZV.cjs');
9
+ var logger = require('./logger-DXTWlPzP.cjs');
10
+ var createSessionMetadata = require('./createSessionMetadata-B2NynaWZ.cjs');
11
+ var _package = require('./package-DY4zTbKS.cjs');
12
+ var index = require('./index-_l1Sdmbi.cjs');
13
13
  var forkBackfill = require('./forkBackfill-8eLDeS73.cjs');
14
- var configuration = require('./configuration-CpBrilxV.cjs');
15
- var controlClient = require('./controlClient-bs_YqwDl.cjs');
16
- var machineMetadata = require('./machineMetadata-BAKVtr-k.cjs');
14
+ var configuration = require('./configuration-4TGMrjul.cjs');
15
+ var controlClient = require('./controlClient-BTaZlbC6.cjs');
16
+ var machineMetadata = require('./machineMetadata-DcUupMje.cjs');
17
17
  var projectPath = require('./projectPath-ChLhdOyt.cjs');
18
18
  var path = require('node:path');
19
19
  var permissionMode = require('./permissionMode-CrV-XuMs.cjs');
20
- var authRelay = require('./authRelay-BdYkC1Po.cjs');
20
+ var authRelay = require('./authRelay-Dy1qU9td.cjs');
21
21
  var promises = require('node:fs/promises');
22
- var attachmentContent = require('./attachmentContent-CFzzTeV9.cjs');
22
+ var attachmentContent = require('./attachmentContent-bpQTBJ0y.cjs');
23
23
  var transcriptCursor = require('./transcriptCursor-DcXGLeSc.cjs');
24
24
  var startupPlan = require('./startupPlan-BLMbfQIH.cjs');
25
25
  require('node:fs');
26
26
  require('zod');
27
27
  require('axios');
28
- require('./lidState-UasMvPzw.cjs');
28
+ require('./lidState-BeOwj6eW.cjs');
29
29
  require('os');
30
30
  require('child_process');
31
31
  require('node:events');
32
32
  require('socket.io-client');
33
- require('./attachmentLimits-DtFqqiwR.cjs');
33
+ require('./attachmentLimits-SqeAHrVC.cjs');
34
34
  require('./limits-C-a7gr04.cjs');
35
- require('./time-s8CaneqW.cjs');
36
- require('./registerCommonHandlers-CqO075-X.cjs');
35
+ require('./time-A6zR3Iy6.cjs');
36
+ require('./registerCommonHandlers-C0_fyBQ0.cjs');
37
37
  require('util');
38
38
  require('fs/promises');
39
39
  require('crypto');
40
40
  require('path');
41
41
  require('cross-spawn');
42
42
  require('@paralleldrive/cuid2');
43
- require('./sync-BgZuthoS.cjs');
43
+ require('./sync-Dhmtk66S.cjs');
44
44
  require('./backgroundTaskActivity-CBvUdj39.cjs');
45
45
  require('./contentLogMetadata-ZSFk_NjQ.cjs');
46
46
  require('chalk');
47
47
  require('node:util');
48
48
  require('./detectCLI-DR9ZaN6B.cjs');
49
49
  require('fs');
50
- require('./localHappyAgentAuth-CA02WOny.cjs');
50
+ require('./localHappyAgentAuth-Br-mgogg.cjs');
51
51
  require('tweetnacl');
52
52
  require('url');
53
53
 
54
54
  const DEFAULT_CLAUDE_MODEL = void 0;
55
55
  const DEFAULT_CLAUDE_EFFORT = void 0;
56
- const importRunClaudeDeps = () => Promise.resolve().then(function () { return require('./runClaudeDeps-CnNNFjlI.cjs'); });
56
+ const importRunClaudeDeps = () => Promise.resolve().then(function () { return require('./runClaudeDeps-RRw-Nusc.cjs'); });
57
57
  async function runClaude(credentials, options = {}) {
58
58
  logger.logger.debug(`[CLAUDE] ===== CLAUDE MODE STARTING =====`);
59
59
  logger.logger.debug(`[CLAUDE] This is the Claude agent, NOT Gemini`);
@@ -67,7 +67,7 @@ async function runClaude(credentials, options = {}) {
67
67
  const isAssistantVariant = process.env.HAPPY_SESSION_VARIANT === "assistant";
68
68
  if (isAssistantVariant) {
69
69
  try {
70
- const { bootstrapAssistantHome } = await Promise.resolve().then(function () { return require('./bootstrap-BboDz_w2.cjs'); });
70
+ const { bootstrapAssistantHome } = await Promise.resolve().then(function () { return require('./bootstrap-DCQ87Aan.cjs'); });
71
71
  await bootstrapAssistantHome();
72
72
  } catch (error) {
73
73
  logger.logger.debug("[START] Assistant home bootstrap failed:", error);
@@ -187,7 +187,7 @@ async function runClaude(credentials, options = {}) {
187
187
  }
188
188
  if (!response) {
189
189
  let offlineSessionId = null;
190
- const { claudeLocal } = await Promise.resolve().then(function () { return require('./claudeLocal-D-mujSX1.cjs'); });
190
+ const { claudeLocal } = await Promise.resolve().then(function () { return require('./claudeLocal-CdIVnOZp.cjs'); });
191
191
  const { createSessionScanner: createSessionScanner2 } = await loadDeps();
192
192
  const reconnection = api.startOfflineReconnection({
193
193
  serverUrl: configuration.configuration.serverUrl,
@@ -769,7 +769,11 @@ async function runClaude(credentials, options = {}) {
769
769
  const accepted = await currentSession?.trySteer({
770
770
  message: message.content.text,
771
771
  mode: enhancedMode,
772
- attachments: attachmentsForThisMessage
772
+ attachments: attachmentsForThisMessage,
773
+ // B-631: the localKey rides along as the steer's uuid, so Claude
774
+ // Code's command_lifecycle / interrupt receipt can name it when a
775
+ // Stop sweeps it before the model read it.
776
+ localKey: message.localKey
773
777
  }) === true;
774
778
  if (accepted) {
775
779
  logger.logger.debug("User message steered into current turn:", {