very-happy-cli 0.2.177 → 0.2.179

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 (203) hide show
  1. package/dist/{AcpBackend-B0K0WrtW.mjs → AcpBackend-CHp3y7cb.mjs} +135 -16
  2. package/dist/{AcpBackend-B-ny68XM.cjs → AcpBackend-DFipFF7-.cjs} +135 -16
  3. package/dist/{AcpSessionManager-CjdJLofq.cjs → AcpSessionManager-0zpvRJXc.cjs} +38 -4
  4. package/dist/{AcpSessionManager-DykjzBM4.mjs → AcpSessionManager-d2-rKWWa.mjs} +38 -4
  5. package/dist/{BasePermissionHandler-DR6nxuEn.cjs → BasePermissionHandler-CH3zuEkA.cjs} +5 -2
  6. package/dist/{BasePermissionHandler-hdY7kTqX.mjs → BasePermissionHandler-DdZBYIR4.mjs} +5 -2
  7. package/dist/acpSessionResume-DTGmAPLt.mjs +67 -0
  8. package/dist/acpSessionResume-oiCBnAVA.cjs +74 -0
  9. package/dist/{agentHome-BdTXEUPe.cjs → agentHome-BWcz8mz0.cjs} +5 -5
  10. package/dist/{agentHome-GRN2VfHv.mjs → agentHome-CghLvL_1.mjs} +5 -5
  11. package/dist/{api-BWX10o97.cjs → api-Cmjfr8Z7.cjs} +29 -261
  12. package/dist/{api-CKBViqI3.mjs → api-CzwFpJQc.mjs} +22 -254
  13. package/dist/{apiMachine-DttO4UFj.mjs → apiMachine-DJkTEiqy.mjs} +53 -16
  14. package/dist/{apiMachine-BYYFGgFs.cjs → apiMachine-G6OogT08.cjs} +53 -16
  15. package/dist/{attachmentContent-cPVF463_.mjs → attachmentContent-B2os4HbA.mjs} +2 -2
  16. package/dist/{attachmentContent-kJKXpkMX.cjs → attachmentContent-Bo0UAsSu.cjs} +4 -4
  17. package/dist/{auth-BmESeKuM.mjs → auth-BS6PaOOG.mjs} +6 -6
  18. package/dist/{auth-CTECt2Oz.cjs → auth-D6bBUwZa.cjs} +6 -6
  19. package/dist/{auth-CKdXb9zp.mjs → auth-DMX0xPNK.mjs} +9 -9
  20. package/dist/{auth-DNxVmVbn.cjs → auth-HEhRaNgL.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-D1ypjjfx.cjs → auto-C6I55iOh.cjs} +19 -18
  24. package/dist/{auto-Ch3203qd.mjs → auto-Cl1SEDcD.mjs} +19 -18
  25. package/dist/{bootstrap-6OI698q9.cjs → bootstrap-exVucYav.cjs} +2 -2
  26. package/dist/{bootstrap-C0s2bPFQ.mjs → bootstrap-iuyufnp3.mjs} +2 -2
  27. package/dist/{browser-DG6Uof5O.cjs → browser-BohJK12g.cjs} +1 -1
  28. package/dist/{browser-BlLWZUMx.mjs → browser-CSYum7xH.mjs} +1 -1
  29. package/dist/{claudeLocal-CcWcKnoo.mjs → claudeLocal-Dq_R3Ax_.mjs} +6 -5
  30. package/dist/{claudeLocal-CemsIArT.cjs → claudeLocal-re4yjSTx.cjs} +6 -5
  31. package/dist/{claudeLocalLauncher-A4VuevIi.cjs → claudeLocalLauncher-B4hJHpCA.cjs} +11 -10
  32. package/dist/{claudeLocalLauncher-7p6y88nj.mjs → claudeLocalLauncher-CN67lN7-.mjs} +11 -10
  33. package/dist/{claudeSessionFork-BtROOjqf.mjs → claudeSessionFork-BihfD0Ik.mjs} +1 -1
  34. package/dist/{claudeSessionFork-CbDfm8Fz.cjs → claudeSessionFork-DiSMYerV.cjs} +1 -1
  35. package/dist/{client-DyvBTYee.cjs → client-BKcK1Bi-.cjs} +3 -3
  36. package/dist/client-BhoEBnuN.mjs +71 -0
  37. package/dist/{client-COmgDDy0.cjs → client-CuVdN6PP.cjs} +2 -2
  38. package/dist/{client-BPMWutfs.mjs → client-DuTDwWSQ.mjs} +3 -3
  39. package/dist/client-ZjOsn6nZ.cjs +76 -0
  40. package/dist/{client-DG5ndWLw.mjs → client-wo9nbxuf.mjs} +2 -2
  41. package/dist/codex/happyMcpStdioBridge.cjs +25 -16
  42. package/dist/codex/happyMcpStdioBridge.mjs +25 -16
  43. package/dist/{codexAppServerClient-D-Z8qSfI.mjs → codexAppServerClient-BK3zra_1.mjs} +3 -3
  44. package/dist/{codexAppServerClient-R24WZZfg.cjs → codexAppServerClient-Dt5zxrun.cjs} +3 -3
  45. package/dist/{codexCommand-CVTkZJ1o.mjs → codexCommand-B6pY7CMh.mjs} +66 -61
  46. package/dist/{codexCommand-6hW19gsq.cjs → codexCommand-CAZ1SLjg.cjs} +89 -84
  47. package/dist/{codexTermination-CCIfwzcx.mjs → codexTermination-Cd1Eon_4.mjs} +1 -1
  48. package/dist/{codexTermination-BBU7e92y.cjs → codexTermination-DmGbHxcD.cjs} +1 -1
  49. package/dist/{config-CvsNChKX.mjs → config-2oMG_fEI.mjs} +3 -3
  50. package/dist/{config-DhdrvOLV.cjs → config-B0uK6K7n.cjs} +3 -3
  51. package/dist/{configuration-DZPy0T9Z.cjs → configuration-CMHZnp6G.cjs} +1 -1
  52. package/dist/{configuration-D55F0t16.mjs → configuration-WMi4idBB.mjs} +1 -1
  53. package/dist/{connect-CwCXMRmD.mjs → connect-BLVHhHzA.mjs} +15 -15
  54. package/dist/{connect-Wz-XZYXW.cjs → connect-uaglGrde.cjs} +15 -15
  55. package/dist/{context-BKbrZ55r.cjs → context-DXzU5bFM.cjs} +1 -1
  56. package/dist/{context-CCRpVXFo.mjs → context-DploEcoN.mjs} +1 -1
  57. package/dist/{controlClient-C4xB5J6O.mjs → controlClient-BWUJrj3t.mjs} +3 -3
  58. package/dist/{controlClient-SX8gSza2.cjs → controlClient-C-5qCt8W.cjs} +3 -3
  59. package/dist/{createSessionMetadata-Bi-m0Y_O.mjs → createSessionMetadata-3uXrJgOW.mjs} +2 -2
  60. package/dist/{createSessionMetadata-BCFmYlBo.cjs → createSessionMetadata-BkIzHALd.cjs} +2 -2
  61. package/dist/{defaultPermissionMode-wBcbBezm.mjs → defaultPermissionMode-BzxLh20a.mjs} +2 -2
  62. package/dist/{defaultPermissionMode-DMBEnXll.cjs → defaultPermissionMode-pS3vmiSg.cjs} +2 -2
  63. package/dist/{deterministicJson-ChGfQEF6.cjs → deterministicJson-B8z2GPi9.cjs} +220 -14
  64. package/dist/{deterministicJson-BkQETt8_.mjs → deterministicJson-D_whDMFd.mjs} +217 -12
  65. package/dist/{doctor-BsN3JZJn.cjs → doctor-Br1Kcy2J.cjs} +8 -8
  66. package/dist/{doctor-B9c2C9dF.mjs → doctor-CmtSsR2-.mjs} +8 -8
  67. package/dist/{downloadTarget-Dj3WoVJa.cjs → downloadTarget-BQJK_6oH.cjs} +6 -6
  68. package/dist/{downloadTarget-ByXzbDK4.mjs → downloadTarget-BoNwTIH_.mjs} +6 -6
  69. package/dist/{ensureDaemonRunning-7Wb8M7Lv.cjs → ensureDaemonRunning-BRUmsq6J.cjs} +5 -5
  70. package/dist/{ensureDaemonRunning--HYzs5Ce.mjs → ensureDaemonRunning-Czo9IHJQ.mjs} +5 -5
  71. package/dist/{handleResumeCommand-DHddBkNJ.mjs → handleResumeCommand-C8thKjqf.mjs} +22 -6
  72. package/dist/{handleResumeCommand-OmuUGYjQ.cjs → handleResumeCommand-tKD_Hpxc.cjs} +22 -6
  73. package/dist/{index-CrR4JISa.cjs → index-B0UjHlAe.cjs} +5 -5
  74. package/dist/{index-BzJNDsJq.mjs → index-BTxHphpV.mjs} +254 -49
  75. package/dist/index-BiyC7cZ3.mjs +18 -0
  76. package/dist/{index-De8L5lFK.cjs → index-C6O2vVjm.cjs} +156 -34
  77. package/dist/index-CUuc6iCn.cjs +24 -0
  78. package/dist/{index-Dhl6_bw7.mjs → index-CdQI0C9p.mjs} +5 -5
  79. package/dist/{index-D9NoYc5I.cjs → index-D09T1m8Y.cjs} +3 -3
  80. package/dist/{index-CEm0MYiS.mjs → index-D3bidoG8.mjs} +3 -3
  81. package/dist/{index-BRJzH4sc.cjs → index-DMqDMT1Q.cjs} +257 -52
  82. package/dist/{index-DMy3OCBe.mjs → index-DPOa4NhL.mjs} +154 -35
  83. package/dist/index.cjs +2 -2
  84. package/dist/index.mjs +2 -2
  85. package/dist/{install-BdvKiOQw.mjs → install-BX3lv3NO.mjs} +1 -1
  86. package/dist/{install-Cf6AFSWC.cjs → install-BXvf2E3o.cjs} +1 -1
  87. package/dist/{install-1qn-D9FS.cjs → install-CYRZxS87.cjs} +3 -3
  88. package/dist/{install-BDIUtPXi.mjs → install-hnve_9vq.mjs} +3 -3
  89. package/dist/lib.cjs +14 -14
  90. package/dist/lib.d.cts +65 -1
  91. package/dist/lib.d.mts +65 -1
  92. package/dist/lib.mjs +14 -14
  93. package/dist/{lidState-BqVsw7H1.mjs → lidState-Bb8fgXg3.mjs} +2 -2
  94. package/dist/{lidState-DxbK0qfu.cjs → lidState-Dv2wwFTj.cjs} +2 -2
  95. package/dist/{localHappyAgentAuth-D5tANdRD.cjs → localHappyAgentAuth-DjYvkXvV.cjs} +2 -2
  96. package/dist/{localHappyAgentAuth-Ce8kO2yc.mjs → localHappyAgentAuth-NEU7fax7.mjs} +2 -2
  97. package/dist/{logger-13cBr_ew.mjs → logger-BtVhHnD8.mjs} +2 -2
  98. package/dist/{logger-LvwVeATU.cjs → logger-C1GWx3gi.cjs} +2 -2
  99. package/dist/{machineMetadata-29h7vgf4.cjs → machineMetadata-CLHS9sv_.cjs} +3 -3
  100. package/dist/{machineMetadata-dMida2qq.mjs → machineMetadata-D-g--oU_.mjs} +3 -3
  101. package/dist/{main-x4nAhdH5.mjs → main-B2LWV8DI.mjs} +59 -46
  102. package/dist/{main-DpM5jaFH.cjs → main-CWhSsbtU.cjs} +59 -46
  103. package/dist/{mcp-DQv3caXs.cjs → mcp-CARUsXHV.cjs} +15 -15
  104. package/dist/{mcp-DMiFGYMT.mjs → mcp-ext92q3Y.mjs} +15 -15
  105. package/dist/{mirrorProtocol-Bz8tEabR.mjs → mirrorProtocol-BwYibqry.mjs} +3 -3
  106. package/dist/{mirrorProtocol-BfrERW7Z.cjs → mirrorProtocol-DEy2g1CB.cjs} +3 -3
  107. package/dist/{package-CjlsAaRe.mjs → package-BPPebGQF.mjs} +7 -7
  108. package/dist/{package-Ch9WGDV_.cjs → package-SgqTYsjn.cjs} +7 -7
  109. package/dist/panels-BZ0_Tt7B.mjs +137 -0
  110. package/dist/panels-D1c7q2dD.cjs +142 -0
  111. package/dist/{peerTools-CxmrKnfV.mjs → peerTools-CWKzcQ7u.mjs} +60 -10
  112. package/dist/{peerTools-DtGKWli5.cjs → peerTools-DRQETXaz.cjs} +60 -9
  113. package/dist/{persistence-DXbKOHxl.cjs → persistence-BegE7NPa.cjs} +14 -3
  114. package/dist/{persistence-C_tYtOqK.mjs → persistence-Cr-wutZ4.mjs} +14 -4
  115. package/dist/{piRunnerArgs-BVRZe2AR.cjs → piRunnerArgs-Cs-378Vz.cjs} +8 -2
  116. package/dist/{piRunnerArgs-BpHc-JZl.mjs → piRunnerArgs-DwvM_yWA.mjs} +7 -1
  117. package/dist/{piRuntime-D7eio8Ix.cjs → piRuntime-BG-1td_n.cjs} +2 -2
  118. package/dist/{piRuntime-DOdGF395.mjs → piRuntime-Bue5mnlc.mjs} +2 -2
  119. package/dist/{piTerminal-dpxz4Q8D.mjs → piTerminal-B5x9X5yV.mjs} +18 -18
  120. package/dist/{piTerminal-y_PRo2NY.cjs → piTerminal-G4z-xVyy.cjs} +18 -18
  121. package/dist/processTreeSnapshot-CuLJDNC-.mjs +101 -0
  122. package/dist/processTreeSnapshot-mDbnuojn.cjs +105 -0
  123. package/dist/prompt-BOouDaTM.mjs +99 -0
  124. package/dist/prompt-lgF9IE82.cjs +105 -0
  125. package/dist/{attachmentLimits-Di1Z93lN.mjs → pushNotifications-BdFjDjQe.mjs} +303 -3
  126. package/dist/{attachmentLimits-DtFqqiwR.cjs → pushNotifications-DaLQUyi0.cjs} +304 -2
  127. package/dist/{index-DFPT4HOO.cjs → query-Ctfg-5gy.cjs} +25 -5
  128. package/dist/{index-CEjJnq05.mjs → query-DYP_W1wp.mjs} +26 -3
  129. package/dist/{rateLimitWindows-DYHDGuzQ.mjs → rateLimitWindows-CuEqk_0g.mjs} +1 -1
  130. package/dist/{rateLimitWindows-DFnMU2Vt.cjs → rateLimitWindows-Dj_8voBK.cjs} +1 -1
  131. package/dist/{registerCommonHandlers-D8OMpBbQ.mjs → registerCommonHandlers-BAlP7SGc.mjs} +2 -2
  132. package/dist/{registerCommonHandlers-60VuTkdg.cjs → registerCommonHandlers-Cj084Sg7.cjs} +2 -2
  133. package/dist/{registerKillSessionHandler-Drhf7-Vz.mjs → registerKillSessionHandler-PD0jWtQo.mjs} +6 -6
  134. package/dist/{registerKillSessionHandler-pqChBKwO.cjs → registerKillSessionHandler-qMju0ZfF.cjs} +6 -6
  135. package/dist/{remoteSessionClient-B7NvjHD3.cjs → remoteSessionClient-B7i7MkYV.cjs} +5 -5
  136. package/dist/{remoteSessionClient-D01Hso2-.mjs → remoteSessionClient-Bn2qu5C5.mjs} +5 -5
  137. package/dist/{reportProgressTool-Du_zAK4h.cjs → reportProgressTool-CM1JFAHg.cjs} +84 -2
  138. package/dist/{reportProgressTool-B203EZCR.mjs → reportProgressTool-gHItlSzz.mjs} +82 -3
  139. package/dist/{resources-JDPugcDq.cjs → resources-CvIlkzpP.cjs} +30 -0
  140. package/dist/{resources-BdFBQi8r.mjs → resources-y9jfyO-_.mjs} +30 -0
  141. package/dist/{run-DX4Zs3Ug.mjs → run-BM4TxiyN.mjs} +249 -45
  142. package/dist/{run-DZ5jU53c.cjs → run-CNXwIe0A.cjs} +263 -59
  143. package/dist/{runClaude-ClRhHpwR.cjs → runClaude-CWhj2V4Q.cjs} +37 -41
  144. package/dist/{runClaude-CgPHXP0L.mjs → runClaude-C_3I8hvR.mjs} +37 -41
  145. package/dist/{runClaudeDeps-D2v_WDSL.cjs → runClaudeDeps-B81cOKnH.cjs} +295 -157
  146. package/dist/{runClaudeDeps-Dz2iydq4.mjs → runClaudeDeps-QGrOeDe2.mjs} +295 -160
  147. package/dist/{runGemini-DBXxpoY8.mjs → runGemini-BEdWEZLR.mjs} +61 -55
  148. package/dist/{runGemini-BtZqGFkp.cjs → runGemini-CgRLYbt5.cjs} +61 -55
  149. package/dist/{runOpenClaw-D8q8G57u.cjs → runOpenClaw-C1NVmzOL.cjs} +19 -19
  150. package/dist/{runOpenClaw-BOHpzCEU.mjs → runOpenClaw-DdQZAYj1.mjs} +19 -19
  151. package/dist/{sandbox-C452Vrsc.mjs → sandbox-DjQUdCMG.mjs} +5 -5
  152. package/dist/{sandbox-Cu9mMzjx.cjs → sandbox-nocIjliq.cjs} +5 -5
  153. package/dist/selfCheck-CjCF4C3v.mjs +85 -0
  154. package/dist/{selfCheck-gKa3uVr1.cjs → selfCheck-DCt4Uzbq.cjs} +36 -35
  155. package/dist/{send-B8HARi7x.mjs → send-Ct7X4pPU.mjs} +9 -9
  156. package/dist/{send-2Vb5eppI.cjs → send-Dydf_hwZ.cjs} +9 -9
  157. package/dist/{server-Db9Wuam3.cjs → server-CosABFbd.cjs} +7 -7
  158. package/dist/{server-BBWCIZyS.mjs → server-DTQGZMxh.mjs} +5 -5
  159. package/dist/{sessionLock-6qL_N6Rn.cjs → sessionLock-DokGab2R.cjs} +16 -3
  160. package/dist/{sessionLock-ZfvFVdUi.mjs → sessionLock-WYIyaVO4.mjs} +16 -4
  161. package/dist/{sessionOps-CdgbEJgf.mjs → sessionOps-BIGgRube.mjs} +11 -6
  162. package/dist/{sessionOps-Dmt7WUUs.cjs → sessionOps-S-qPBLFf.cjs} +11 -6
  163. package/dist/{sessionScanner-CQL_WSaC.cjs → sessionScanner-CIMM2hvZ.cjs} +3 -3
  164. package/dist/{sessionScanner-CNVaSNOn.mjs → sessionScanner-o5hnMi5e.mjs} +3 -3
  165. package/dist/{sessions-DTomHfFg.mjs → sessions-BJHEZpi2.mjs} +40 -18
  166. package/dist/{sessions-BJblG_Hx.cjs → sessions-JchI1w3z.cjs} +40 -17
  167. package/dist/{setupOfflineReconnection-DVA0VpQL.cjs → setupOfflineReconnection-CNiAt5ZP.cjs} +2 -2
  168. package/dist/{setupOfflineReconnection-C5trsV-j.mjs → setupOfflineReconnection-DMiBO2y9.mjs} +2 -2
  169. package/dist/{spawn-DRyNAqD8.cjs → spawn-6PD7nnoC.cjs} +49 -18
  170. package/dist/{spawn-CQJFgoOq.mjs → spawn-DgvUNYEo.mjs} +49 -18
  171. package/dist/{spawnAgents-CCjJifAW.cjs → spawnAgents-DsXgegHM.cjs} +37 -1
  172. package/dist/spawnAgents-P006Hqio.mjs +79 -0
  173. package/dist/{spawnHappyCLI-B_0RWxD4.mjs → spawnHappyCLI-CCOrEtf9.mjs} +1 -1
  174. package/dist/{spawnHappyCLI-ChniczJ5.cjs → spawnHappyCLI-Dywezwk6.cjs} +1 -1
  175. package/dist/{specialCommands-DkdFJi4N.mjs → specialCommands-DPcd9edP.mjs} +3 -3
  176. package/dist/{specialCommands-DbntVs0d.cjs → specialCommands-QxPpkGKf.cjs} +3 -3
  177. package/dist/{startFileWatcher-UQyTSRAP.mjs → startFileWatcher-DghDOCO4.mjs} +1 -1
  178. package/dist/{startFileWatcher-C292fhra.cjs → startFileWatcher-RECH5qY8.cjs} +1 -1
  179. package/dist/{streamRelay-_qCd873P.mjs → streamRelay-DMV_TXfS.mjs} +1 -1
  180. package/dist/{streamRelay-Cx01enfe.cjs → streamRelay-DlUWKUpo.cjs} +1 -1
  181. package/dist/{sync-C3p7-KLn.mjs → sync-CSe0Rf45.mjs} +1 -1
  182. package/dist/{sync-C7sxoUYG.cjs → sync-D23jbqVa.cjs} +1 -1
  183. package/dist/{systemPrompt-DtibzbRU.cjs → systemPrompt-BOy4kU4P.cjs} +4 -3
  184. package/dist/{systemPrompt-CdHOlyVW.mjs → systemPrompt-CFNKnh65.mjs} +4 -3
  185. package/dist/{teams-ujXr3AFn.mjs → teams-DyY669f0.mjs} +9 -9
  186. package/dist/{teams-D7O7TpVU.cjs → teams-Ov2BDT-A.cjs} +9 -9
  187. package/dist/{time-yEL6wHUF.mjs → time-65DcU6Jx.mjs} +1 -1
  188. package/dist/{time-Dg5tVB8S.cjs → time-CrwIMHta.cjs} +1 -1
  189. package/dist/{titleGenerator-BMEaDTwU.cjs → titleGenerator-CS_rh2_J.cjs} +9 -8
  190. package/dist/{titleGenerator-Dr-BtjzO.mjs → titleGenerator-CiAMxf7s.mjs} +9 -8
  191. package/dist/{todo-CvJe4M2C.mjs → todo-BDONw0sK.mjs} +7 -7
  192. package/dist/{todo-CUcFamGs.cjs → todo-KY-okGii.cjs} +7 -7
  193. package/dist/{tools-BrM3bZW5.mjs → tools-D8-PnZEG.mjs} +1 -1
  194. package/dist/{tools-DDKTB5aQ.cjs → tools-_w52DZG6.cjs} +1 -1
  195. package/dist/{uninstall-7oLuhYIu.cjs → uninstall-8vnLN-IE.cjs} +3 -3
  196. package/dist/{uninstall-CEcMMQGz.mjs → uninstall-_fjGRP9b.mjs} +3 -3
  197. package/dist/webPanels-B2_C2-3g.mjs +49 -0
  198. package/dist/webPanels-FCgFKvVe.cjs +53 -0
  199. package/package.json +7 -7
  200. package/dist/selfCheck-BAvqBwBR.mjs +0 -84
  201. package/dist/sessionModeFile-CWVq8AT9.mjs +0 -32
  202. package/dist/sessionModeFile-CsLtn_PL.cjs +0 -36
  203. package/dist/spawnAgents-BjtmjBvP.mjs +0 -45
@@ -1,21 +1,20 @@
1
1
  import axios from 'axios';
2
- import { l as logger, r as redactLogValue } from './logger-13cBr_ew.mjs';
3
- import { R as RpcHandlerManager, a as answerSocketRequest, c as connectGuarded, s as socketConnectGuard, d as describeSocketAckDrop, b as safeAck, i as isRateQuotaCode, p as pauseForRateQuota, e as shouldReconnect } from './lidState-BqVsw7H1.mjs';
2
+ import { l as logger, r as redactLogValue } from './logger-BtVhHnD8.mjs';
3
+ import { R as RpcHandlerManager, a as answerSocketRequest, c as connectGuarded, s as socketConnectGuard, d as describeSocketAckDrop, b as safeAck, i as isRateQuotaCode, p as pauseForRateQuota, e as shouldReconnect } from './lidState-Bb8fgXg3.mjs';
4
4
  import { EventEmitter } from 'node:events';
5
5
  import { io } from 'socket.io-client';
6
- import { A as AsyncLock, a as MAX_CHAT_ATTACHMENT_ENCRYPTED_BYTES, U as UserMessageSchema, F as FileEventMessageSchema } from './attachmentLimits-Di1Z93lN.mjs';
7
- import { h as decrypt, d as decodeBase64, i as decryptBlob, e as encodeBase64, g as encrypt, l as libsodiumEncryptForPublicKey, j as libsodiumPublicKeyFromSecretKey, k as getRandomBytes } from './authRelay-DSAvg1uv.mjs';
6
+ import { A as AsyncLock, a as MAX_CHAT_ATTACHMENT_ENCRYPTED_BYTES, U as UserMessageSchema, F as FileEventMessageSchema, P as PushNotificationClient } from './pushNotifications-BdFjDjQe.mjs';
7
+ import { h as decrypt, d as decodeBase64, i as decryptBlob, e as encodeBase64, g as encrypt, l as libsodiumEncryptForPublicKey, j as libsodiumPublicKeyFromSecretKey, k as getRandomBytes } from './authRelay-DhQhkBvX.mjs';
8
8
  import { p as prepareClipboardText, d as prepareClipboardHistoryText } from './limits-DIo7rEBR.mjs';
9
- import { b as backoff, d as delay, e as exponentialBackoffDelay } from './time-yEL6wHUF.mjs';
10
- import { c as configuration } from './configuration-D55F0t16.mjs';
9
+ import { b as backoff, d as delay, e as exponentialBackoffDelay } from './time-65DcU6Jx.mjs';
10
+ import { c as configuration } from './configuration-WMi4idBB.mjs';
11
11
  import { createHmac, randomUUID } from 'node:crypto';
12
- import { c as createEnvelope, s as streamKeyOf, R as ReleaseDrainNoticeSchema, q as RelayAssignmentResponseSchema } from './index-DMy3OCBe.mjs';
13
- import { r as registerCommonHandlers } from './registerCommonHandlers-D8OMpBbQ.mjs';
12
+ import { d as createEnvelope, s as streamKeyOf, R as ReleaseDrainNoticeSchema, t as RelayAssignmentResponseSchema } from './index-DPOa4NhL.mjs';
13
+ import { r as registerCommonHandlers } from './registerCommonHandlers-BAlP7SGc.mjs';
14
14
  import { createId } from '@paralleldrive/cuid2';
15
- import { I as InvalidateSync } from './sync-C3p7-KLn.mjs';
15
+ import { I as InvalidateSync } from './sync-CSe0Rf45.mjs';
16
16
  import { B as BackgroundTaskReporter } from './backgroundTaskActivity-BVwJBl02.mjs';
17
- import { k as notifyDaemonTurnEvent, m as notifyDaemonBackgroundTasks } from './controlClient-C4xB5J6O.mjs';
18
- import { c as contentLogMetadata } from './contentLogMetadata-BlWI0egu.mjs';
17
+ import { k as notifyDaemonTurnEvent, m as notifyDaemonBackgroundTasks } from './controlClient-BWUJrj3t.mjs';
19
18
  import chalk from 'chalk';
20
19
 
21
20
  async function hmac_sha512(key, data) {
@@ -1956,6 +1955,17 @@ class ApiSessionClient extends EventEmitter {
1956
1955
  * own line, so a launcher sends the matching session event only when this
1957
1956
  * says the turn-end did not carry it).
1958
1957
  */
1958
+ /**
1959
+ * B-495: close the turn a fork backfill left open. History, not a live
1960
+ * turn end — so no `turn-ended` tap (board analyzer, completion hooks).
1961
+ */
1962
+ closeReplayedClaudeTurn() {
1963
+ const mapped = closeClaudeTurnWithStatus(this.claudeSessionProtocolState, "completed");
1964
+ this.claudeSessionProtocolState.currentTurnId = mapped.currentTurnId;
1965
+ for (const envelope of mapped.envelopes) {
1966
+ this.sendSessionProtocolMessage(envelope);
1967
+ }
1968
+ }
1959
1969
  closeClaudeSessionTurn(status = "completed", meta) {
1960
1970
  this.emit("turn-ended", status);
1961
1971
  const mapped = closeClaudeTurnWithStatus(this.claudeSessionProtocolState, status, meta);
@@ -2435,248 +2445,6 @@ class ApiSessionClient extends EventEmitter {
2435
2445
  }
2436
2446
  }
2437
2447
 
2438
- function getSessionTitle(metadata) {
2439
- const summaryText = metadata?.summary?.text?.trim();
2440
- if (summaryText) {
2441
- return summaryText;
2442
- }
2443
- const path = metadata?.path?.trim();
2444
- if (!path) {
2445
- return "Session";
2446
- }
2447
- const segments = path.split(/[\\/]/).filter(Boolean);
2448
- return segments[segments.length - 1] || "Session";
2449
- }
2450
- function getSessionNotificationUrl(data) {
2451
- const sessionId = data?.sessionId;
2452
- if (typeof sessionId !== "string") {
2453
- return null;
2454
- }
2455
- const trimmedSessionId = sessionId.trim();
2456
- if (!trimmedSessionId) {
2457
- return null;
2458
- }
2459
- return `/session/${encodeURIComponent(trimmedSessionId)}`;
2460
- }
2461
- function getSessionNotificationTitle(kind) {
2462
- switch (kind) {
2463
- case "done":
2464
- return "It's ready!";
2465
- case "permission":
2466
- return "Permission request";
2467
- case "question":
2468
- return "Clarification needed";
2469
- }
2470
- }
2471
- function getSessionNotificationBody(metadata) {
2472
- return getSessionTitle(metadata);
2473
- }
2474
- function getSessionNotificationCopy(kind, metadata) {
2475
- return {
2476
- title: getSessionNotificationTitle(kind),
2477
- body: getSessionNotificationBody(metadata)
2478
- };
2479
- }
2480
- class PushNotificationClient {
2481
- token;
2482
- baseUrl;
2483
- expoLoad = null;
2484
- constructor(token, baseUrl = "https://api.cluster-fluster.com") {
2485
- this.token = token;
2486
- this.baseUrl = baseUrl;
2487
- }
2488
- loadExpo() {
2489
- if (!this.expoLoad) {
2490
- const load = import('expo-server-sdk').then(({ Expo }) => ({ Expo, expo: new Expo() }));
2491
- load.catch(() => {
2492
- if (this.expoLoad === load) this.expoLoad = null;
2493
- });
2494
- this.expoLoad = load;
2495
- }
2496
- return this.expoLoad;
2497
- }
2498
- /**
2499
- * Fetch all push tokens for the authenticated user.
2500
- * Retries up to 3 times with exponential backoff on transient errors.
2501
- */
2502
- async fetchPushTokens() {
2503
- const maxAttempts = 3;
2504
- for (let attempt = 1; attempt <= maxAttempts; attempt++) {
2505
- try {
2506
- const response = await axios.get(
2507
- `${this.baseUrl}/v1/push-tokens`,
2508
- {
2509
- headers: {
2510
- "Authorization": `Bearer ${this.token}`,
2511
- "Content-Type": "application/json",
2512
- "X-Happy-Client": `cli-daemon/${configuration.currentCliVersion}`
2513
- }
2514
- }
2515
- );
2516
- logger.debug(`Fetched ${response.data.tokens.length} push tokens`);
2517
- response.data.tokens.forEach((token, index) => {
2518
- logger.debug(`[PUSH] Token ${index + 1}: id=${token.id}, created=${new Date(token.createdAt).toISOString()}, updated=${new Date(token.updatedAt).toISOString()}`);
2519
- });
2520
- return response.data.tokens;
2521
- } catch (error) {
2522
- logger.debug(`[PUSH] [ERROR] Failed to fetch push tokens (attempt ${attempt}/${maxAttempts}):`, error);
2523
- if (attempt < maxAttempts) {
2524
- const delay = 1e3 * Math.pow(2, attempt - 1);
2525
- await new Promise((resolve) => setTimeout(resolve, delay));
2526
- }
2527
- }
2528
- }
2529
- logger.debug("[PUSH] [ERROR] All push token fetch attempts failed");
2530
- return [];
2531
- }
2532
- /**
2533
- * Send push notification via Expo Push API with retry
2534
- * @param messages - Array of push messages to send
2535
- */
2536
- async sendPushNotifications(messages) {
2537
- logger.debug(`Sending ${messages.length} push notifications`);
2538
- const { Expo, expo } = await this.loadExpo();
2539
- const validMessages = messages.filter((message) => {
2540
- if (Array.isArray(message.to)) {
2541
- return message.to.every((token) => Expo.isExpoPushToken(token));
2542
- }
2543
- return Expo.isExpoPushToken(message.to);
2544
- });
2545
- if (validMessages.length === 0) {
2546
- logger.debug("No valid Expo push tokens found");
2547
- return;
2548
- }
2549
- const chunks = expo.chunkPushNotifications(validMessages);
2550
- for (const chunk of chunks) {
2551
- const startTime = Date.now();
2552
- const timeout = 3e5;
2553
- let attempt = 0;
2554
- while (true) {
2555
- try {
2556
- const ticketChunk = await expo.sendPushNotificationsAsync(chunk);
2557
- const errors = ticketChunk.filter((ticket) => ticket.status === "error");
2558
- if (errors.length > 0) {
2559
- const errorDetails = errors.map((e) => ({ message: e.message, details: e.details }));
2560
- logger.debug("[PUSH] Some notifications failed:", errorDetails);
2561
- }
2562
- if (errors.length === ticketChunk.length) {
2563
- throw new Error("All push notifications in chunk failed");
2564
- }
2565
- break;
2566
- } catch (error) {
2567
- const elapsed = Date.now() - startTime;
2568
- if (elapsed >= timeout) {
2569
- logger.debug("[PUSH] Timeout reached after 5 minutes, giving up on chunk");
2570
- break;
2571
- }
2572
- attempt++;
2573
- const delay = Math.min(1e3 * Math.pow(2, attempt), 3e4);
2574
- const remainingTime = timeout - elapsed;
2575
- const waitTime = Math.min(delay, remainingTime);
2576
- if (waitTime > 0) {
2577
- logger.debug(`[PUSH] Retrying in ${waitTime}ms (attempt ${attempt})`);
2578
- await new Promise((resolve) => setTimeout(resolve, waitTime));
2579
- }
2580
- }
2581
- }
2582
- }
2583
- logger.debug(`Push notifications sent successfully`);
2584
- }
2585
- /**
2586
- * Send a push notification to all registered devices for the user
2587
- * @param title - Notification title
2588
- * @param body - Notification body
2589
- * @param data - Additional data to send with the notification
2590
- */
2591
- sendToAllDevices(title, body, data) {
2592
- logger.debug("[PUSH] sendToAllDevices called:", {
2593
- title: contentLogMetadata(title),
2594
- body: contentLogMetadata(body),
2595
- dataKeyCount: data ? Object.keys(data).length : 0
2596
- });
2597
- (async () => {
2598
- try {
2599
- logger.debug("[PUSH] Fetching push tokens...");
2600
- const tokens = await this.fetchPushTokens();
2601
- logger.debug(`[PUSH] Fetched ${tokens.length} push tokens`);
2602
- tokens.forEach((token, index) => {
2603
- logger.debug(`[PUSH] Using token ${index + 1}: id=${token.id}`);
2604
- });
2605
- if (tokens.length === 0) {
2606
- logger.debug("No push tokens found for user");
2607
- return;
2608
- }
2609
- const messages = tokens.map((token, index) => {
2610
- logger.debug(`[PUSH] Creating message ${index + 1} for token`);
2611
- return {
2612
- to: token.token,
2613
- title,
2614
- body: body && body.length > 0 ? body : void 0,
2615
- data,
2616
- // TODO: For brutalist session artwork, attach rich media via a public HTTPS image URL.
2617
- // Bundled app asset paths / require(...) / local file paths will not work in push payloads.
2618
- // iOS also needs a Notification Service Extension to render richContent.image reliably.
2619
- sound: "default",
2620
- priority: "high"
2621
- };
2622
- });
2623
- logger.debug(`[PUSH] Sending ${messages.length} push notifications...`);
2624
- await this.sendPushNotifications(messages);
2625
- logger.debug("[PUSH] Push notifications sent successfully");
2626
- } catch (error) {
2627
- logger.debug("[PUSH] Error sending to all devices:", error);
2628
- }
2629
- })();
2630
- }
2631
- /**
2632
- * Routes session-event pushes through the server so it can apply
2633
- * presence-based suppression (active desktop/web, mobile foreground).
2634
- * Falls back to direct Expo send only when sessionId is missing — that
2635
- * shouldn't happen for session notifications but guards against regressions.
2636
- */
2637
- sendSessionNotification(params) {
2638
- const { title, body } = getSessionNotificationCopy(params.kind, params.metadata);
2639
- const sessionTitle = getSessionNotificationBody(params.metadata);
2640
- const url = getSessionNotificationUrl(params.data);
2641
- const payloadData = {
2642
- ...params.data,
2643
- kind: params.kind,
2644
- sessionTitle,
2645
- ...url ? { url } : {}
2646
- };
2647
- const sessionId = typeof params.data?.sessionId === "string" ? params.data.sessionId : null;
2648
- if (!sessionId) {
2649
- logger.debug("[PUSH] sendSessionNotification: missing sessionId, falling back to direct send");
2650
- this.sendToAllDevices(title, body, payloadData);
2651
- return;
2652
- }
2653
- void (async () => {
2654
- try {
2655
- await axios.post(
2656
- `${this.baseUrl}/v1/sessions/${encodeURIComponent(sessionId)}/push-event`,
2657
- {
2658
- kind: params.kind,
2659
- title,
2660
- body,
2661
- data: payloadData
2662
- },
2663
- {
2664
- headers: {
2665
- "Authorization": `Bearer ${this.token}`,
2666
- "Content-Type": "application/json",
2667
- "X-Happy-Client": `cli-daemon/${configuration.currentCliVersion}`
2668
- },
2669
- timeout: 15e3
2670
- }
2671
- );
2672
- logger.debug(`[PUSH] sendSessionNotification dispatched via server (kind=${params.kind})`);
2673
- } catch (error) {
2674
- logger.debug("[PUSH] sendSessionNotification failed:", error);
2675
- }
2676
- })();
2677
- }
2678
- }
2679
-
2680
2448
  function startOfflineReconnection(config) {
2681
2449
  let reconnected = false;
2682
2450
  let session = null;
@@ -3171,7 +2939,7 @@ class ApiClient {
3171
2939
  return new ApiSessionClient(this.credential.token, session, opts);
3172
2940
  }
3173
2941
  async machineSyncClient(machine) {
3174
- const { ApiMachineClient } = await import('./apiMachine-DttO4UFj.mjs');
2942
+ const { ApiMachineClient } = await import('./apiMachine-DJkTEiqy.mjs');
3175
2943
  return new ApiMachineClient(this.credential.token, machine);
3176
2944
  }
3177
2945
  push() {
@@ -1,41 +1,42 @@
1
1
  import { io } from 'socket.io-client';
2
- import { l as logger } from './logger-13cBr_ew.mjs';
3
- import { R as RpcHandlerManager, i as isRateQuotaCode, p as pauseForRateQuota, s as socketConnectGuard, c as connectGuarded, a as answerSocketRequest, e as shouldReconnect, d as describeSocketAckDrop } from './lidState-BqVsw7H1.mjs';
4
- import { i as isClaudeSessionId, s as stableVersion, a as sanitizeTagList, p as pickMirrorForTerminal, l as liveSnapshotChanged, b as sanitizeLiveSnapshot, c as serializeLiveSnapshot, r as registerWorktreeHandlers, d as configureWorktreeService, e as summarizeSpawnSessionForLog, f as parseMirrorSendParams } from './mirrorProtocol-Bz8tEabR.mjs';
5
- import { c as configuration } from './configuration-D55F0t16.mjs';
2
+ import { a as webPanelsSignature } from './webPanels-B2_C2-3g.mjs';
3
+ import { l as logger } from './logger-BtVhHnD8.mjs';
4
+ import { R as RpcHandlerManager, i as isRateQuotaCode, p as pauseForRateQuota, s as socketConnectGuard, c as connectGuarded, a as answerSocketRequest, e as shouldReconnect, d as describeSocketAckDrop } from './lidState-Bb8fgXg3.mjs';
5
+ import { i as isClaudeSessionId, s as stableVersion, a as sanitizeTagList, p as pickMirrorForTerminal, l as liveSnapshotChanged, b as sanitizeLiveSnapshot, c as serializeLiveSnapshot, r as registerWorktreeHandlers, d as configureWorktreeService, e as summarizeSpawnSessionForLog, f as parseMirrorSendParams } from './mirrorProtocol-BwYibqry.mjs';
6
+ import { c as configuration } from './configuration-WMi4idBB.mjs';
6
7
  import { w as withCurrentCliUpdateState } from './cliUpdate-Y34VGe9Y.mjs';
7
- import { r as registerCommonHandlers } from './registerCommonHandlers-D8OMpBbQ.mjs';
8
+ import { r as registerCommonHandlers } from './registerCommonHandlers-BAlP7SGc.mjs';
8
9
  import { stat, readdir, lstat, open, readFile, rm, mkdir, chmod, writeFile, rename } from 'node:fs/promises';
9
10
  import { join, isAbsolute, resolve } from 'node:path';
10
11
  import os, { homedir } from 'node:os';
11
12
  import { spawn, execFile, spawnSync } from 'node:child_process';
12
- import { r as readSettings, b as readPersistedSessions, o as readTrackedClaudeSessionIds, p as readTrackedCodexThreadIds } from './persistence-C_tYtOqK.mjs';
13
- import { e as encodeBase64, g as encrypt, h as decrypt, d as decodeBase64 } from './authRelay-DSAvg1uv.mjs';
13
+ import { r as readSettings, c as readPersistedSessions, o as readTrackedClaudeSessionIds, p as readTrackedCodexThreadIds } from './persistence-Cr-wutZ4.mjs';
14
+ import { e as encodeBase64, g as encrypt, h as decrypt, d as decodeBase64 } from './authRelay-DhQhkBvX.mjs';
14
15
  import { p as prepareClipboardText, d as prepareClipboardHistoryText } from './limits-DIo7rEBR.mjs';
15
- import { b as backoff, d as delay } from './time-yEL6wHUF.mjs';
16
+ import { b as backoff, d as delay } from './time-65DcU6Jx.mjs';
16
17
  import * as pty from 'node-pty';
17
18
  import { a as attachStartupCommand, v as validateTerminalTags, d as deriveAutoTitle, T as TMUX_SESSION_ID_RE, i as isSafeTmuxSessionName, b as isVhSessionName, U as USER_SESSIONS_FORMAT, p as parseUserSessions, L as LIST_SESSIONS_FORMAT, c as parseSessionListLine, e as LIST_FIELD_SEP, s as sendToVhTerminal } from './terminals-Dlg0x3nY.mjs';
18
19
  import { t as tmuxArgs, V as VH_TMUX_SOCKET_ENV, a as scrubTmuxClientEnv } from './tmuxSocket-B8Yx20sT.mjs';
19
- import { locateClaudeConversation, refreshAgentHomes } from './index-Dhl6_bw7.mjs';
20
+ import { locateClaudeConversation, refreshAgentHomes } from './index-CdQI0C9p.mjs';
20
21
  import { randomBytes } from 'node:crypto';
21
22
  import { readdirSync, unlinkSync, existsSync, mkdirSync, writeFileSync, readFileSync, statSync, chmodSync, renameSync, rmSync, accessSync, constants } from 'node:fs';
22
23
  import axios from 'axios';
23
24
  import { p as projectPath } from './projectPath-BTBIMB57.mjs';
24
25
  import { a as isValidTerminalId } from './ids-DU6sLx4C.mjs';
25
26
  import { d as detectCLIAvailability } from './detectCLI-CSGMlV51.mjs';
26
- import { d as detectResumeSupport } from './localHappyAgentAuth-Ce8kO2yc.mjs';
27
+ import { d as detectResumeSupport } from './localHappyAgentAuth-NEU7fax7.mjs';
27
28
  import { g as getProjectPath, a as getClaudeProjectsRoot } from './path-D2wdaNSk.mjs';
28
29
  import { i as isVeryHappyOneShotPrompt } from './oneShotPrompts-DT4p6RNd.mjs';
29
- import { f as forkSession, F as ForkSourceMissingError, d as discardForkedSession, l as listClaudeRewindPoints, a as forkAndTruncateSession, b as ForkTruncateUuidNotFoundError, c as forkBeforeUserMessage } from './claudeSessionFork-BtROOjqf.mjs';
30
- import { C as CodexAppServerClient } from './codexAppServerClient-D-Z8qSfI.mjs';
31
- import { t as RelayCandidatesResponseSchema, q as RelayAssignmentResponseSchema, R as ReleaseDrainNoticeSchema } from './index-DMy3OCBe.mjs';
30
+ import { f as forkSession, F as ForkSourceMissingError, d as discardForkedSession, l as listClaudeRewindPoints, a as forkAndTruncateSession, b as ForkTruncateUuidNotFoundError, c as forkBeforeUserMessage } from './claudeSessionFork-BihfD0Ik.mjs';
31
+ import { C as CodexAppServerClient } from './codexAppServerClient-BK3zra_1.mjs';
32
+ import { v as RelayCandidatesResponseSchema, t as RelayAssignmentResponseSchema, R as ReleaseDrainNoticeSchema } from './index-DPOa4NhL.mjs';
32
33
  import { f as forkCodexThread, C as CodexForkRewindPointNotFoundError, l as listCodexRewindPoints, a as forkCodexBeforeUserMessage } from './codexThreadFork-R76RU5H0.mjs';
33
- import { p as planRateLimitWrite, m as mergeRateLimitReports } from './rateLimitWindows-DYHDGuzQ.mjs';
34
+ import { p as planRateLimitWrite, m as mergeRateLimitReports } from './rateLimitWindows-CuEqk_0g.mjs';
34
35
  import 'chalk';
35
36
  import 'node:util';
36
37
  import 'os';
37
38
  import 'child_process';
38
- import './package-CjlsAaRe.mjs';
39
+ import './package-BPPebGQF.mjs';
39
40
  import 'util';
40
41
  import 'fs/promises';
41
42
  import 'crypto';
@@ -10468,6 +10469,9 @@ class ApiMachineClient {
10468
10469
  claudeAuthState = null;
10469
10470
  /** B-587: the machine's hibernation threshold, published as a capability. */
10470
10471
  agentHibernationIdleMs = null;
10472
+ /** B-510: last normalized `webPanels` (null = never set → field not written). */
10473
+ webPanels = null;
10474
+ webPanelsSignatureSent = null;
10471
10475
  rateLimitPushChain = Promise.resolve();
10472
10476
  rateLimitPublisher = new RateLimitPublisher({
10473
10477
  getCurrent: () => this.machine.daemonState?.rateLimits,
@@ -10647,6 +10651,27 @@ class ApiMachineClient {
10647
10651
  return { agentHibernation: { idleMs } };
10648
10652
  });
10649
10653
  }
10654
+ /**
10655
+ * B-510: mirror the local `webPanels` declaration into daemonState. Every
10656
+ * daemonState write is a CAS + DB write + broadcast, so an unchanged list
10657
+ * (same signature as the last one sent) writes nothing.
10658
+ */
10659
+ setWebPanels(panels) {
10660
+ this.webPanels = panels;
10661
+ const signature = webPanelsSignature(panels);
10662
+ if (signature === this.webPanelsSignatureSent || !this.socket?.connected) return Promise.resolve();
10663
+ const attempt = this.cliUpdatePushChain.then(() => this.updateDaemonState((current) => ({
10664
+ ...current ?? {},
10665
+ status: current?.status ?? "running",
10666
+ webPanels: { panels, updatedAt: Date.now() }
10667
+ }))).then(() => {
10668
+ this.webPanelsSignatureSent = signature;
10669
+ }).catch((error) => {
10670
+ logger.debug("[API MACHINE] Failed to publish web panels:", error);
10671
+ });
10672
+ this.cliUpdatePushChain = attempt.then(() => void 0);
10673
+ return attempt;
10674
+ }
10650
10675
  publishAgentHibernation() {
10651
10676
  const idleMs = this.agentHibernationIdleMs;
10652
10677
  if (idleMs === null || !this.socket?.connected) return Promise.resolve();
@@ -11381,9 +11406,12 @@ class ApiMachineClient {
11381
11406
  // leaves a stale-pid value visible longer than needed.
11382
11407
  ...this.claudeAuthState ? { claudeAuth: this.claudeAuthState } : {},
11383
11408
  // B-587 capability + setting (same restamp discipline).
11384
- ...this.agentHibernationIdleMs !== null ? { agentHibernation: { idleMs: this.agentHibernationIdleMs, rpcAvailable: true, detectedAt: now } } : {}
11409
+ ...this.agentHibernationIdleMs !== null ? { agentHibernation: { idleMs: this.agentHibernationIdleMs, rpcAvailable: true, detectedAt: now } } : {},
11410
+ // B-510: re-ship the declared panels (also clears a stale list).
11411
+ ...Array.isArray(this.webPanels) ? { webPanels: { panels: this.webPanels, updatedAt: now } } : {}
11385
11412
  };
11386
11413
  });
11414
+ if (Array.isArray(this.webPanels)) this.webPanelsSignatureSent = webPanelsSignature(this.webPanels);
11387
11415
  this.webTerminal.startListTracking((terminals) => this.pushTerminalList(terminals));
11388
11416
  if (!rpcAlreadyRegistered) this.rpcHandlerManager.onSocketConnect(socket);
11389
11417
  this.syncResumeSessionRpcRegistration();
@@ -11423,6 +11451,15 @@ class ApiMachineClient {
11423
11451
  if (!parsed.success || parsed.data.deadline <= Date.now()) return;
11424
11452
  void this.startReleaseHandover(parsed.data);
11425
11453
  });
11454
+ socket.on("server-migrate", (data) => {
11455
+ if (this.socket !== socket) return;
11456
+ this.serverMigrateHandler?.(data);
11457
+ });
11458
+ }
11459
+ serverMigrateHandler = null;
11460
+ /** B-635: the daemon decides what to do with a relay-migration notice (daemon/serverMigration.ts). */
11461
+ setServerMigrateHandler(handler) {
11462
+ this.serverMigrateHandler = handler;
11426
11463
  }
11427
11464
  startReleaseHandover(notice) {
11428
11465
  if (this.handoverInFlight) return this.handoverInFlight;
@@ -1,43 +1,44 @@
1
1
  'use strict';
2
2
 
3
3
  var socket_ioClient = require('socket.io-client');
4
- var logger = require('./logger-LvwVeATU.cjs');
5
- var lidState = require('./lidState-DxbK0qfu.cjs');
6
- var mirrorProtocol = require('./mirrorProtocol-BfrERW7Z.cjs');
7
- var configuration = require('./configuration-DZPy0T9Z.cjs');
4
+ var webPanels = require('./webPanels-FCgFKvVe.cjs');
5
+ var logger = require('./logger-C1GWx3gi.cjs');
6
+ var lidState = require('./lidState-Dv2wwFTj.cjs');
7
+ var mirrorProtocol = require('./mirrorProtocol-DEy2g1CB.cjs');
8
+ var configuration = require('./configuration-CMHZnp6G.cjs');
8
9
  var cliUpdate = require('./cliUpdate-DsKXPFYp.cjs');
9
- var registerCommonHandlers = require('./registerCommonHandlers-60VuTkdg.cjs');
10
+ var registerCommonHandlers = require('./registerCommonHandlers-Cj084Sg7.cjs');
10
11
  var promises = require('node:fs/promises');
11
12
  var path = require('node:path');
12
13
  var os = require('node:os');
13
14
  var node_child_process = require('node:child_process');
14
- var persistence = require('./persistence-DXbKOHxl.cjs');
15
- var authRelay = require('./authRelay-BdYkC1Po.cjs');
15
+ var persistence = require('./persistence-BegE7NPa.cjs');
16
+ var authRelay = require('./authRelay-Dy1qU9td.cjs');
16
17
  var limits = require('./limits-C-a7gr04.cjs');
17
- var time = require('./time-Dg5tVB8S.cjs');
18
+ var time = require('./time-CrwIMHta.cjs');
18
19
  var pty = require('node-pty');
19
20
  var terminals = require('./terminals-B_bfC9c2.cjs');
20
21
  var tmuxSocket = require('./tmuxSocket-D-Xt6Vn-.cjs');
21
- var index = require('./index-CrR4JISa.cjs');
22
+ var index = require('./index-B0UjHlAe.cjs');
22
23
  var node_crypto = require('node:crypto');
23
24
  var node_fs = require('node:fs');
24
25
  var axios = require('axios');
25
26
  var projectPath = require('./projectPath-ChLhdOyt.cjs');
26
27
  var ids = require('./ids-B6ZC0HGt.cjs');
27
28
  var detectCLI = require('./detectCLI-DR9ZaN6B.cjs');
28
- var localHappyAgentAuth = require('./localHappyAgentAuth-D5tANdRD.cjs');
29
+ var localHappyAgentAuth = require('./localHappyAgentAuth-DjYvkXvV.cjs');
29
30
  var path$1 = require('./path-B7zW-WwE.cjs');
30
31
  var oneShotPrompts = require('./oneShotPrompts-CL0dip9C.cjs');
31
- var claudeSessionFork = require('./claudeSessionFork-CbDfm8Fz.cjs');
32
- var codexAppServerClient = require('./codexAppServerClient-R24WZZfg.cjs');
33
- var index$1 = require('./index-De8L5lFK.cjs');
32
+ var claudeSessionFork = require('./claudeSessionFork-DiSMYerV.cjs');
33
+ var codexAppServerClient = require('./codexAppServerClient-Dt5zxrun.cjs');
34
+ var index$1 = require('./index-C6O2vVjm.cjs');
34
35
  var codexThreadFork = require('./codexThreadFork-DNekT4nQ.cjs');
35
- var rateLimitWindows = require('./rateLimitWindows-DFnMU2Vt.cjs');
36
+ var rateLimitWindows = require('./rateLimitWindows-Dj_8voBK.cjs');
36
37
  require('chalk');
37
38
  require('node:util');
38
39
  require('os');
39
40
  require('child_process');
40
- require('./package-Ch9WGDV_.cjs');
41
+ require('./package-SgqTYsjn.cjs');
41
42
  require('util');
42
43
  require('fs/promises');
43
44
  require('crypto');
@@ -10489,6 +10490,9 @@ class ApiMachineClient {
10489
10490
  claudeAuthState = null;
10490
10491
  /** B-587: the machine's hibernation threshold, published as a capability. */
10491
10492
  agentHibernationIdleMs = null;
10493
+ /** B-510: last normalized `webPanels` (null = never set → field not written). */
10494
+ webPanels = null;
10495
+ webPanelsSignatureSent = null;
10492
10496
  rateLimitPushChain = Promise.resolve();
10493
10497
  rateLimitPublisher = new RateLimitPublisher({
10494
10498
  getCurrent: () => this.machine.daemonState?.rateLimits,
@@ -10668,6 +10672,27 @@ class ApiMachineClient {
10668
10672
  return { agentHibernation: { idleMs } };
10669
10673
  });
10670
10674
  }
10675
+ /**
10676
+ * B-510: mirror the local `webPanels` declaration into daemonState. Every
10677
+ * daemonState write is a CAS + DB write + broadcast, so an unchanged list
10678
+ * (same signature as the last one sent) writes nothing.
10679
+ */
10680
+ setWebPanels(panels) {
10681
+ this.webPanels = panels;
10682
+ const signature = webPanels.webPanelsSignature(panels);
10683
+ if (signature === this.webPanelsSignatureSent || !this.socket?.connected) return Promise.resolve();
10684
+ const attempt = this.cliUpdatePushChain.then(() => this.updateDaemonState((current) => ({
10685
+ ...current ?? {},
10686
+ status: current?.status ?? "running",
10687
+ webPanels: { panels, updatedAt: Date.now() }
10688
+ }))).then(() => {
10689
+ this.webPanelsSignatureSent = signature;
10690
+ }).catch((error) => {
10691
+ logger.logger.debug("[API MACHINE] Failed to publish web panels:", error);
10692
+ });
10693
+ this.cliUpdatePushChain = attempt.then(() => void 0);
10694
+ return attempt;
10695
+ }
10671
10696
  publishAgentHibernation() {
10672
10697
  const idleMs = this.agentHibernationIdleMs;
10673
10698
  if (idleMs === null || !this.socket?.connected) return Promise.resolve();
@@ -11402,9 +11427,12 @@ class ApiMachineClient {
11402
11427
  // leaves a stale-pid value visible longer than needed.
11403
11428
  ...this.claudeAuthState ? { claudeAuth: this.claudeAuthState } : {},
11404
11429
  // B-587 capability + setting (same restamp discipline).
11405
- ...this.agentHibernationIdleMs !== null ? { agentHibernation: { idleMs: this.agentHibernationIdleMs, rpcAvailable: true, detectedAt: now } } : {}
11430
+ ...this.agentHibernationIdleMs !== null ? { agentHibernation: { idleMs: this.agentHibernationIdleMs, rpcAvailable: true, detectedAt: now } } : {},
11431
+ // B-510: re-ship the declared panels (also clears a stale list).
11432
+ ...Array.isArray(this.webPanels) ? { webPanels: { panels: this.webPanels, updatedAt: now } } : {}
11406
11433
  };
11407
11434
  });
11435
+ if (Array.isArray(this.webPanels)) this.webPanelsSignatureSent = webPanels.webPanelsSignature(this.webPanels);
11408
11436
  this.webTerminal.startListTracking((terminals) => this.pushTerminalList(terminals));
11409
11437
  if (!rpcAlreadyRegistered) this.rpcHandlerManager.onSocketConnect(socket);
11410
11438
  this.syncResumeSessionRpcRegistration();
@@ -11444,6 +11472,15 @@ class ApiMachineClient {
11444
11472
  if (!parsed.success || parsed.data.deadline <= Date.now()) return;
11445
11473
  void this.startReleaseHandover(parsed.data);
11446
11474
  });
11475
+ socket.on("server-migrate", (data) => {
11476
+ if (this.socket !== socket) return;
11477
+ this.serverMigrateHandler?.(data);
11478
+ });
11479
+ }
11480
+ serverMigrateHandler = null;
11481
+ /** B-635: the daemon decides what to do with a relay-migration notice (daemon/serverMigration.ts). */
11482
+ setServerMigrateHandler(handler) {
11483
+ this.serverMigrateHandler = handler;
11447
11484
  }
11448
11485
  startReleaseHandover(notice) {
11449
11486
  if (this.handoverInFlight) return this.handoverInFlight;
@@ -1,8 +1,8 @@
1
1
  import { randomUUID } from 'node:crypto';
2
2
  import { writeFile, rename, unlink } from 'node:fs/promises';
3
3
  import { join, basename } from 'node:path';
4
- import { M as MAX_CHAT_ATTACHMENT_SOURCE_BYTES } from './attachmentLimits-Di1Z93lN.mjs';
5
- import { e as ensurePrivateDirectory, h as hardenPrivateFile } from './configuration-D55F0t16.mjs';
4
+ import { M as MAX_CHAT_ATTACHMENT_SOURCE_BYTES } from './pushNotifications-BdFjDjQe.mjs';
5
+ import { e as ensurePrivateDirectory, h as hardenPrivateFile } from './configuration-WMi4idBB.mjs';
6
6
 
7
7
  const CLAUDE_ATTACHMENT_KINDS = [
8
8
  "image/jpeg",
@@ -3,8 +3,8 @@
3
3
  var node_crypto = require('node:crypto');
4
4
  var promises = require('node:fs/promises');
5
5
  var path = require('node:path');
6
- var attachmentLimits = require('./attachmentLimits-DtFqqiwR.cjs');
7
- var configuration = require('./configuration-DZPy0T9Z.cjs');
6
+ var pushNotifications = require('./pushNotifications-DaLQUyi0.cjs');
7
+ var configuration = require('./configuration-CMHZnp6G.cjs');
8
8
 
9
9
  const CLAUDE_ATTACHMENT_KINDS = [
10
10
  "image/jpeg",
@@ -34,8 +34,8 @@ async function stageClaudeAttachments(attachments, options) {
34
34
  await configuration.ensurePrivateDirectory(sessionDir);
35
35
  const staged = [];
36
36
  for (const attachment of attachments) {
37
- if (attachment.data.length > attachmentLimits.MAX_CHAT_ATTACHMENT_SOURCE_BYTES) {
38
- throw new Error(`Attachment exceeds the ${attachmentLimits.MAX_CHAT_ATTACHMENT_SOURCE_BYTES / 1024 / 1024} MB limit`);
37
+ if (attachment.data.length > pushNotifications.MAX_CHAT_ATTACHMENT_SOURCE_BYTES) {
38
+ throw new Error(`Attachment exceeds the ${pushNotifications.MAX_CHAT_ATTACHMENT_SOURCE_BYTES / 1024 / 1024} MB limit`);
39
39
  }
40
40
  const name = safeFileName(attachment.name || "file");
41
41
  const targetPath = path.join(sessionDir, uniqueFileName(name));
@@ -1,12 +1,12 @@
1
- import { e as encodeBase64, c as credentialRelayProblem, f as encodeBase64Url, d as decodeBase64 } from './authRelay-DSAvg1uv.mjs';
2
- import { c as configuration } from './configuration-D55F0t16.mjs';
1
+ import { e as encodeBase64, c as credentialRelayProblem, f as encodeBase64Url, d as decodeBase64 } from './authRelay-DhQhkBvX.mjs';
2
+ import { c as configuration } from './configuration-WMi4idBB.mjs';
3
3
  import { randomUUID, randomBytes } from 'node:crypto';
4
4
  import tweetnacl from 'tweetnacl';
5
5
  import axios from 'axios';
6
- import { d as delay } from './time-yEL6wHUF.mjs';
7
- import { g as readCredentials, m as readSettingsOutcome, u as updateSettings, w as writeCredentialsLegacy, n as writeCredentialsDataKey } from './persistence-C_tYtOqK.mjs';
8
- import { o as openBrowser } from './browser-BlLWZUMx.mjs';
9
- import { l as logger } from './logger-13cBr_ew.mjs';
6
+ import { d as delay } from './time-65DcU6Jx.mjs';
7
+ import { g as readCredentials, k as readSettingsOutcome, u as updateSettings, w as writeCredentialsLegacy, m as writeCredentialsDataKey } from './persistence-Cr-wutZ4.mjs';
8
+ import { o as openBrowser } from './browser-CSYum7xH.mjs';
9
+ import { l as logger } from './logger-BtVhHnD8.mjs';
10
10
 
11
11
  function generateWebAuthUrl(publicKey) {
12
12
  const publicKeyBase64 = encodeBase64(publicKey, "base64url");
@@ -1,14 +1,14 @@
1
1
  'use strict';
2
2
 
3
- var authRelay = require('./authRelay-BdYkC1Po.cjs');
4
- var configuration = require('./configuration-DZPy0T9Z.cjs');
3
+ var authRelay = require('./authRelay-Dy1qU9td.cjs');
4
+ var configuration = require('./configuration-CMHZnp6G.cjs');
5
5
  var node_crypto = require('node:crypto');
6
6
  var tweetnacl = require('tweetnacl');
7
7
  var axios = require('axios');
8
- var time = require('./time-Dg5tVB8S.cjs');
9
- var persistence = require('./persistence-DXbKOHxl.cjs');
10
- var browser = require('./browser-DG6Uof5O.cjs');
11
- var logger = require('./logger-LvwVeATU.cjs');
8
+ var time = require('./time-CrwIMHta.cjs');
9
+ var persistence = require('./persistence-BegE7NPa.cjs');
10
+ var browser = require('./browser-BohJK12g.cjs');
11
+ var logger = require('./logger-C1GWx3gi.cjs');
12
12
 
13
13
  function generateWebAuthUrl(publicKey) {
14
14
  const publicKeyBase64 = authRelay.encodeBase64(publicKey, "base64url");