very-happy-cli 0.2.178 → 0.2.180

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 (217) hide show
  1. package/dist/{AcpBackend-DCQXHRzT.mjs → AcpBackend-B8Zi30Zh.mjs} +135 -16
  2. package/dist/{AcpBackend-CDkAQXYf.cjs → AcpBackend-DfRDtMcG.cjs} +135 -16
  3. package/dist/{AcpSessionManager-DckmUZza.cjs → AcpSessionManager-CASKOnOj.cjs} +38 -4
  4. package/dist/{AcpSessionManager-BXrQcqwC.mjs → AcpSessionManager-i8Rab0xT.mjs} +38 -4
  5. package/dist/{BasePermissionHandler-BVlrEhIi.mjs → BasePermissionHandler-26fKbRCm.mjs} +5 -2
  6. package/dist/{BasePermissionHandler-DyLmKKtO.cjs → BasePermissionHandler-BlM_tfej.cjs} +5 -2
  7. package/dist/acpSessionResume-B9l54P-X.mjs +67 -0
  8. package/dist/acpSessionResume-CR5pmgVo.cjs +74 -0
  9. package/dist/{agentHome-CEp9RMyK.cjs → agentHome-C7Sb7-Tz.cjs} +4 -4
  10. package/dist/{agentHome-C1xi37as.mjs → agentHome-CmGy0NWv.mjs} +4 -4
  11. package/dist/{api-JANhFdZV.cjs → api-DM7b1OKj.cjs} +38 -262
  12. package/dist/{api-Dib0dmqC.mjs → api-Hov8p7CA.mjs} +32 -256
  13. package/dist/{apiMachine-DNTJidYH.mjs → apiMachine-CwGEhQDT.mjs} +62 -15
  14. package/dist/{apiMachine-QhK-sKcr.cjs → apiMachine-DkGRj-Ai.cjs} +64 -17
  15. package/dist/{attachmentContent-bpQTBJ0y.cjs → attachmentContent-CEm13_gF.cjs} +4 -4
  16. package/dist/{attachmentContent-DkkdpSSJ.mjs → attachmentContent-CIn4iPEk.mjs} +2 -2
  17. package/dist/{auth-BRjd2esb.mjs → auth-BG1DY0gj.mjs} +5 -5
  18. package/dist/{auth-DgIV0Cvt.cjs → auth-CBXnm-Mj.cjs} +5 -5
  19. package/dist/{auth-omWDtgR8.cjs → auth-Dawj7pP5.cjs} +8 -8
  20. package/dist/{auth-DNct7VUi.mjs → auth-rggxMpEE.mjs} +8 -8
  21. package/dist/{auto-DKGFOJBo.mjs → auto-CXXLXGeL.mjs} +19 -18
  22. package/dist/{auto-CI16FZmX.cjs → auto-CbYOfoPS.cjs} +19 -18
  23. package/dist/{backgroundTaskActivity-BVwJBl02.mjs → backgroundTaskActivity-8PdPxrvy.mjs} +1 -1
  24. package/dist/{bootstrap-DCQ87Aan.cjs → bootstrap-DoA7okld.cjs} +2 -2
  25. package/dist/{bootstrap-BUagGC_-.mjs → bootstrap-Dt5I1SOl.mjs} +2 -2
  26. package/dist/{browser-Dj_DYQEh.mjs → browser-DUNetFT4.mjs} +1 -1
  27. package/dist/{browser-CSKhc0Bl.cjs → browser-DZ6qRtfH.cjs} +1 -1
  28. package/dist/{claudeCliPath-U4HHmV4r.cjs → claudeCliPath-GaP3UUz1.cjs} +1 -1
  29. package/dist/{claudeLocal-CdIVnOZp.cjs → claudeLocal--DNyMOSv.cjs} +8 -7
  30. package/dist/{claudeLocal-CCCvAeMd.mjs → claudeLocal-OHWQigCl.mjs} +6 -5
  31. package/dist/{claudeLocalLauncher-BmrpaRYJ.mjs → claudeLocalLauncher-BStvfa7M.mjs} +11 -10
  32. package/dist/{claudeLocalLauncher-21-xh5gc.cjs → claudeLocalLauncher-BhvPbcyH.cjs} +13 -12
  33. package/dist/{claudeSessionFork-kYCP1IJB.cjs → claudeSessionFork-Be16vzGc.cjs} +1 -1
  34. package/dist/{claudeSessionFork-DvxMKAmY.mjs → claudeSessionFork-GAVWhiKG.mjs} +1 -1
  35. package/dist/{client-C4zKGjiJ.cjs → client-BWjaHKtj.cjs} +2 -2
  36. package/dist/client-Ca5Pcgy_.mjs +71 -0
  37. package/dist/{client-CnlkkrZO.mjs → client-CnB7kRCT.mjs} +2 -2
  38. package/dist/{client-BTX9hsbr.mjs → client-D4uPb1uu.mjs} +3 -3
  39. package/dist/client-DJplzPjD.cjs +76 -0
  40. package/dist/{client-Dnza1hgN.cjs → client-D_loZ9IK.cjs} +3 -3
  41. package/dist/codex/happyMcpStdioBridge.cjs +24 -15
  42. package/dist/codex/happyMcpStdioBridge.mjs +25 -16
  43. package/dist/{codexAppServerClient-DvkpQgyv.mjs → codexAppServerClient-CO4G6OS4.mjs} +3 -3
  44. package/dist/{codexAppServerClient-CRlBWGn3.cjs → codexAppServerClient-PE-12AsW.cjs} +3 -3
  45. package/dist/{codexCommand-DzxIWXIT.cjs → codexCommand-BNoD1t1C.cjs} +127 -116
  46. package/dist/{codexCommand-BxjogBzU.mjs → codexCommand-B_xUH79E.mjs} +77 -66
  47. package/dist/{codexTermination-C28FzlLb.cjs → codexTermination-BmBbizFK.cjs} +7 -2
  48. package/dist/{codexTermination-ySDNMEhd.mjs → codexTermination-Dx48ma6e.mjs} +7 -2
  49. package/dist/{config-BFB5uJ4t.cjs → config-CtwEUxUP.cjs} +26 -26
  50. package/dist/{config-DwfEpFr3.mjs → config-DSu0Blos.mjs} +3 -3
  51. package/dist/{configuration-4TGMrjul.cjs → configuration-CYO-kPOS.cjs} +1 -1
  52. package/dist/{configuration-DVrb61aY.mjs → configuration-PxzEJumr.mjs} +1 -1
  53. package/dist/{connect-C7FPY0PI.mjs → connect-BQrg3TB6.mjs} +15 -15
  54. package/dist/{connect-QH2VJGBG.cjs → connect-Dq7wndzR.cjs} +28 -28
  55. package/dist/{context-JoKu0V54.cjs → context-6TP-iz_c.cjs} +1 -1
  56. package/dist/{context-B3XPVJlj.mjs → context-CJGRRGWW.mjs} +1 -1
  57. package/dist/{controlClient-BTaZlbC6.cjs → controlClient-Bqv5v5OM.cjs} +3 -3
  58. package/dist/{controlClient-BYKyGyxj.mjs → controlClient-DoeYovwP.mjs} +4 -4
  59. package/dist/{createSessionMetadata-8Fuj2-IV.mjs → createSessionMetadata-DDIChCx8.mjs} +2 -2
  60. package/dist/{createSessionMetadata-B2NynaWZ.cjs → createSessionMetadata-xz767pcG.cjs} +3 -3
  61. package/dist/{defaultPermissionMode-BEWCqJU-.cjs → defaultPermissionMode-PkZGsQDk.cjs} +2 -2
  62. package/dist/{defaultPermissionMode-B8kJG9uI.mjs → defaultPermissionMode-i5KzdK09.mjs} +2 -2
  63. package/dist/{detectCLI-DR9ZaN6B.cjs → detectCLI-BuYR_Qxe.cjs} +4 -4
  64. package/dist/{deterministicJson-C5ZwZ7hu.mjs → deterministicJson-CTEJDqtS.mjs} +217 -12
  65. package/dist/{deterministicJson-BjNQsAjO.cjs → deterministicJson-xqA6DaOm.cjs} +222 -16
  66. package/dist/{doctor-BshRnjLi.cjs → doctor-BrgSlfXn.cjs} +9 -9
  67. package/dist/{doctor-0BiGwJXk.mjs → doctor-IctjVh9T.mjs} +8 -8
  68. package/dist/{doctorReadiness-BCZGcN0a.cjs → doctorReadiness-Dl6yRQCy.cjs} +1 -1
  69. package/dist/{downloadTarget-BN5vZt3K.cjs → downloadTarget-CEb9che-.cjs} +6 -6
  70. package/dist/{downloadTarget-DJPwAZlu.mjs → downloadTarget-jbOz1egC.mjs} +6 -6
  71. package/dist/{ensureDaemonRunning-C5QfToCe.cjs → ensureDaemonRunning-D-HyjGIX.cjs} +6 -6
  72. package/dist/{ensureDaemonRunning-CSmb_mqt.mjs → ensureDaemonRunning-b1e8LCSM.mjs} +5 -5
  73. package/dist/{handleResumeCommand-BwnUZmbo.cjs → handleResumeCommand-BvWVuRwH.cjs} +23 -7
  74. package/dist/{handleResumeCommand-CgjpsdDe.mjs → handleResumeCommand-DpaZvm2c.mjs} +22 -6
  75. package/dist/{index-piJPsTsm.cjs → index-B2p2Mut7.cjs} +259 -53
  76. package/dist/{index-BehVbAsA.mjs → index-BUNnpGFF.mjs} +256 -50
  77. package/dist/{index-Bvldtdny.mjs → index-Bsvbgh9e.mjs} +4 -4
  78. package/dist/{index-BYOZ_8WZ.cjs → index-C64Ufj4D.cjs} +4 -4
  79. package/dist/{index-Clqlu17M.mjs → index-C6Vn5Eac.mjs} +155 -34
  80. package/dist/index-CMf5VbzG.mjs +18 -0
  81. package/dist/index-DmTlDRSL.cjs +24 -0
  82. package/dist/{index-_l1Sdmbi.cjs → index-Dv0Q48P3.cjs} +156 -33
  83. package/dist/{index-BRClDe07.cjs → index-F2UejqYs.cjs} +3 -3
  84. package/dist/{index-BYgfern_.mjs → index-wCbtF4BK.mjs} +3 -3
  85. package/dist/index.cjs +2 -2
  86. package/dist/index.mjs +2 -2
  87. package/dist/{install-BdvKiOQw.mjs → install-BX3lv3NO.mjs} +1 -1
  88. package/dist/{install-Cf6AFSWC.cjs → install-BXvf2E3o.cjs} +1 -1
  89. package/dist/{install-TO4taKW7.cjs → install-C0ANcEAW.cjs} +7 -7
  90. package/dist/{install-fYWHrPcC.mjs → install-CdzSV7qO.mjs} +3 -3
  91. package/dist/{installPiTools-BKnXjrVu.cjs → installPiTools-CL_axh_6.cjs} +1 -1
  92. package/dist/{installTerminalHooks-BQZbvxsZ.cjs → installTerminalHooks-BETLKAtd.cjs} +3 -3
  93. package/dist/lib.cjs +14 -14
  94. package/dist/lib.d.cts +239 -2
  95. package/dist/lib.d.mts +239 -2
  96. package/dist/lib.mjs +14 -14
  97. package/dist/{lidState-BeOwj6eW.cjs → lidState-DWGnm2H4.cjs} +1 -1
  98. package/dist/{lidState-DNMlIhX0.mjs → lidState-bBrmaQd2.mjs} +1 -1
  99. package/dist/{localHappyAgentAuth-Br-mgogg.cjs → localHappyAgentAuth-DZHQnIW9.cjs} +1 -1
  100. package/dist/{localHappyAgentAuth-BezKSFDi.mjs → localHappyAgentAuth-Dn1jYDpt.mjs} +1 -1
  101. package/dist/{logger--vAVtXB_.mjs → logger-BUngm5Xg.mjs} +2 -2
  102. package/dist/{logger-DXTWlPzP.cjs → logger-CphW5nUE.cjs} +2 -2
  103. package/dist/machineMetadata-BQm9YTcI.cjs +79 -0
  104. package/dist/machineMetadata-BXN_bKU3.mjs +68 -0
  105. package/dist/{main-DoMFJ2Cl.cjs → main-B2UV51nK.cjs} +112 -132
  106. package/dist/{main-CshDb5-1.mjs → main-DGkdYfEq.mjs} +106 -126
  107. package/dist/{mcp-pNc1EbQf.cjs → mcp-BFvAEIRz.cjs} +15 -15
  108. package/dist/{mcp-DKT_lrvQ.mjs → mcp-CbTtbs0f.mjs} +15 -15
  109. package/dist/{mirrorProtocol-6IFGPpjJ.mjs → mirrorProtocol-BR4luBC0.mjs} +148 -7
  110. package/dist/{mirrorProtocol-qKflWTX_.cjs → mirrorProtocol-HKPivs5o.cjs} +150 -4
  111. package/dist/{package-B7B03ejW.mjs → package-7Ld1YMhh.mjs} +8 -7
  112. package/dist/{package-DY4zTbKS.cjs → package-KhLqBDX9.cjs} +8 -7
  113. package/dist/panels-C7IVqpJk.mjs +137 -0
  114. package/dist/panels-Njf6GelF.cjs +142 -0
  115. package/dist/{peerTools-3R9RUARX.mjs → peerTools-BOlDRyhi.mjs} +60 -10
  116. package/dist/{peerTools-iy3_6Yc5.cjs → peerTools-DQNlrcqM.cjs} +60 -9
  117. package/dist/{persistence-BfX72dne.cjs → persistence-9BMYspxG.cjs} +2 -2
  118. package/dist/{persistence-DTk4sNpd.mjs → persistence-BFUOHW5h.mjs} +3 -3
  119. package/dist/{piRunnerArgs-CRQVR9o-.cjs → piRunnerArgs-DGaq6VYM.cjs} +8 -2
  120. package/dist/{piRunnerArgs-AT8QJY7x.mjs → piRunnerArgs-H2pgpA5z.mjs} +7 -1
  121. package/dist/{piRuntime-BHRT5MKO.cjs → piRuntime-CT5xv_3h.cjs} +2 -2
  122. package/dist/{piRuntime-E44qTVQ4.mjs → piRuntime-CdN0JAsa.mjs} +2 -2
  123. package/dist/{piTerminal-hI4WFdWm.cjs → piTerminal-0FBtXTHK.cjs} +18 -18
  124. package/dist/{piTerminal-De8nbciM.mjs → piTerminal-C4m9YXAV.mjs} +18 -18
  125. package/dist/processTreeSnapshot-CuLJDNC-.mjs +101 -0
  126. package/dist/processTreeSnapshot-mDbnuojn.cjs +105 -0
  127. package/dist/projectPath-C3ioB4Bu.cjs +13 -0
  128. package/dist/prompt-BOouDaTM.mjs +99 -0
  129. package/dist/prompt-lgF9IE82.cjs +105 -0
  130. package/dist/{attachmentLimits-UyFn8fkQ.mjs → pushNotifications-DCiBEVeC.mjs} +307 -3
  131. package/dist/{attachmentLimits-SqeAHrVC.cjs → pushNotifications-DI92havG.cjs} +308 -2
  132. package/dist/{index-DFPT4HOO.cjs → query-BETKBrnz.cjs} +25 -5
  133. package/dist/{index-CEjJnq05.mjs → query-ywZbQUzR.mjs} +26 -3
  134. package/dist/{rateLimitWindows-XrJiiBpU.mjs → rateLimitWindows-BkfuUB1a.mjs} +1 -1
  135. package/dist/{rateLimitWindows-Czb7_7cK.cjs → rateLimitWindows-YRIYVdo4.cjs} +1 -1
  136. package/dist/{registerCommonHandlers-C0_fyBQ0.cjs → registerCommonHandlers-C7a_dUWs.cjs} +30 -30
  137. package/dist/{registerCommonHandlers-CvIedVRf.mjs → registerCommonHandlers-CTkCvjxt.mjs} +2 -2
  138. package/dist/{registerKillSessionHandler-DYl7l4Ts.cjs → registerKillSessionHandler-CIsvBrVe.cjs} +6 -6
  139. package/dist/{registerKillSessionHandler-gwJ5lTf0.mjs → registerKillSessionHandler-CaqqRYq6.mjs} +6 -6
  140. package/dist/{remoteSessionClient-BRTIOX5b.cjs → remoteSessionClient-D843fkzL.cjs} +5 -5
  141. package/dist/{remoteSessionClient-DRb2Jr5s.mjs → remoteSessionClient-PP-mOKmw.mjs} +5 -5
  142. package/dist/{reportProgressTool-B9nCzbkL.cjs → reportProgressTool-14AXr959.cjs} +84 -2
  143. package/dist/{reportProgressTool-D5tEoXMW.mjs → reportProgressTool-ZOCNjWHr.mjs} +82 -3
  144. package/dist/{resources-JDPugcDq.cjs → resources-CvIlkzpP.cjs} +30 -0
  145. package/dist/{resources-BdFBQi8r.mjs → resources-y9jfyO-_.mjs} +30 -0
  146. package/dist/{run-CKe_WeLW.cjs → run-CAOCYYfT.cjs} +2806 -110
  147. package/dist/{run-BQ_FGaOL.mjs → run-Dajw2E5j.mjs} +2787 -91
  148. package/dist/{runClaude-zrrNcQC_.mjs → runClaude-C6oxWYbp.mjs} +49 -47
  149. package/dist/{runClaude-MHI5IKM-.cjs → runClaude-CRRKt-tm.cjs} +50 -48
  150. package/dist/{runClaudeDeps-RRw-Nusc.cjs → runClaudeDeps-B1ysqTvx.cjs} +310 -237
  151. package/dist/{runClaudeDeps-CVBCokOS.mjs → runClaudeDeps-BcZ68cX3.mjs} +297 -226
  152. package/dist/{runGemini-kipag2ag.mjs → runGemini-D7yKc4wD.mjs} +61 -55
  153. package/dist/{runGemini-D7Lg9yCr.cjs → runGemini-DtKFXqf-.cjs} +89 -83
  154. package/dist/{runOpenClaw-C_lRY3Do.mjs → runOpenClaw-C8ilyLP9.mjs} +19 -19
  155. package/dist/{runOpenClaw-DCcQ0L2N.cjs → runOpenClaw-Cq29mryb.cjs} +20 -20
  156. package/dist/{sandbox-BSyXFVFp.mjs → sandbox-CbCutma4.mjs} +4 -4
  157. package/dist/{sandbox-dMwPTmjm.cjs → sandbox-gIj-EuF4.cjs} +4 -4
  158. package/dist/{selfCheck-DkzDDUsE.cjs → selfCheck-BTGBVthv.cjs} +39 -38
  159. package/dist/selfCheck-Smt-5Xiq.mjs +85 -0
  160. package/dist/{send-dxC0miIA.cjs → send-CZf5lLw_.cjs} +8 -8
  161. package/dist/{send-C-k9nsd3.mjs → send-YZRMQvMJ.mjs} +9 -9
  162. package/dist/{server-DxoTYNlw.mjs → server-BqwXRzFZ.mjs} +4 -4
  163. package/dist/{server-B-W6P7Qr.cjs → server-CknFq6xG.cjs} +6 -6
  164. package/dist/sessionExitLifecycle-CzkLIgNZ.mjs +142 -0
  165. package/dist/sessionExitLifecycle-DFltxXU8.cjs +148 -0
  166. package/dist/{sessionLock-DWX6BbiU.cjs → sessionLock-DRZUcKHT.cjs} +38 -5
  167. package/dist/{sessionLock-DBdtZGOL.mjs → sessionLock-nBXdJxJm.mjs} +36 -5
  168. package/dist/{sessionOps-BAnr7n8t.cjs → sessionOps-BrGiU9-s.cjs} +10 -5
  169. package/dist/{sessionOps-BVoXe12O.mjs → sessionOps-C58iDeD5.mjs} +11 -6
  170. package/dist/{sessionScanner-BtxoeluY.mjs → sessionScanner-Bm57LEXe.mjs} +3 -3
  171. package/dist/{sessionScanner-CDOYsEUD.cjs → sessionScanner-CaO8bLaG.cjs} +3 -3
  172. package/dist/{sessions-C3sZJkzI.mjs → sessions-BXyBHo8n.mjs} +40 -18
  173. package/dist/{sessions-hAitoN-m.cjs → sessions-uzqPCc37.cjs} +39 -16
  174. package/dist/{setupOfflineReconnection-_eD4cuUT.mjs → setupOfflineReconnection-1Qlek3wl.mjs} +2 -2
  175. package/dist/{setupOfflineReconnection-C2EeYTFH.cjs → setupOfflineReconnection-DvvVX3TB.cjs} +2 -2
  176. package/dist/{spawn-Bc9v7pIf.cjs → spawn-DBkodJEO.cjs} +49 -18
  177. package/dist/{spawn-qNrB2CD_.mjs → spawn-vn93PhYL.mjs} +49 -18
  178. package/dist/spawnAgents-CgPMWexP.mjs +79 -0
  179. package/dist/{spawnAgents-BVEaz35W.cjs → spawnAgents-DLNMlhWJ.cjs} +37 -1
  180. package/dist/{spawnHappyCLI-C2stUioM.mjs → spawnHappyCLI-BjFZc_7V.mjs} +1 -1
  181. package/dist/{spawnHappyCLI-fzUagkKV.cjs → spawnHappyCLI-DnUZv0X2.cjs} +2 -2
  182. package/dist/{specialCommands-BJ-nqY4s.cjs → specialCommands-BRufxlqe.cjs} +3 -3
  183. package/dist/{specialCommands-C6W-rVyh.mjs → specialCommands-D3ND9bdg.mjs} +3 -3
  184. package/dist/{startFileWatcher-Bqlqjt93.cjs → startFileWatcher-D9cYzZOq.cjs} +1 -1
  185. package/dist/{startFileWatcher-CR09Snmz.mjs → startFileWatcher-DXJ7yB5v.mjs} +1 -1
  186. package/dist/startupSessionCreate-kdr3m1uX.cjs +26 -0
  187. package/dist/startupSessionCreate-uZ6BM0ty.mjs +24 -0
  188. package/dist/{streamRelay-CJoMk_d2.mjs → streamRelay-DnMCMMfV.mjs} +1 -1
  189. package/dist/{streamRelay-9kBPpbvU.cjs → streamRelay-Dy6amlzx.cjs} +1 -1
  190. package/dist/{sync-Dhmtk66S.cjs → sync-Bn-idAoy.cjs} +1 -1
  191. package/dist/{sync-DbW07iQS.mjs → sync-BvVhDO40.mjs} +1 -1
  192. package/dist/{systemPrompt-CQcuUmVp.mjs → systemPrompt-CIZcJuJF.mjs} +4 -3
  193. package/dist/{systemPrompt-3PYi3EUY.cjs → systemPrompt-DlyEk35T.cjs} +4 -3
  194. package/dist/{teams-DpxLcUU_.cjs → teams-BLeRpDxv.cjs} +8 -8
  195. package/dist/{teams-CwF4Z2fA.mjs → teams-DLY3B5yi.mjs} +8 -8
  196. package/dist/{time-A6zR3Iy6.cjs → time-Cjv0zxQO.cjs} +1 -1
  197. package/dist/{time-BuGWTVP6.mjs → time-D3ETL7Jb.mjs} +1 -1
  198. package/dist/{titleGenerator-D26gvNaS.cjs → titleGenerator-Cgp5ihFb.cjs} +10 -9
  199. package/dist/{titleGenerator-BGEzNWC9.mjs → titleGenerator-Uzbd4utr.mjs} +9 -8
  200. package/dist/{todo-DrZc76H5.mjs → todo-C9Ga-oEM.mjs} +6 -6
  201. package/dist/{todo-73g3NCIO.cjs → todo-pOMcEECE.cjs} +6 -6
  202. package/dist/{tools-CxJp4T1T.cjs → tools-BL7Byl_x.cjs} +1 -1
  203. package/dist/{tools-BtsrQnNS.mjs → tools-Cho7iIWf.mjs} +1 -1
  204. package/dist/{uninstall-DWNYvewQ.cjs → uninstall-CbayEVoV.cjs} +6 -6
  205. package/dist/{uninstall-DOb2mTwV.mjs → uninstall-CvZHVY9C.mjs} +3 -3
  206. package/dist/webPanels-B2_C2-3g.mjs +49 -0
  207. package/dist/webPanels-FCgFKvVe.cjs +53 -0
  208. package/package.json +8 -7
  209. package/dist/machineMetadata-B1H9gNbN.mjs +0 -39
  210. package/dist/machineMetadata-DcUupMje.cjs +0 -42
  211. package/dist/messageBuffer-BWlGgR3A.mjs +0 -71
  212. package/dist/messageBuffer-fJMH6uY8.cjs +0 -73
  213. package/dist/projectPath-ChLhdOyt.cjs +0 -13
  214. package/dist/selfCheck-CF7XGJPb.mjs +0 -84
  215. package/dist/sessionModeFile-ByLbXTbg.mjs +0 -32
  216. package/dist/sessionModeFile-CLLdidiJ.cjs +0 -36
  217. package/dist/spawnAgents-Bw6j4tqz.mjs +0 -45
@@ -1,57 +1,60 @@
1
1
  import os from 'node:os';
2
- import { c as claimSessionOrExit, a as applyServerSnapshot, b as applyHibernationReplay, w as withoutServerSnapshot, m as mergeReconnectMetadata } from './sessionLock-DBdtZGOL.mjs';
3
- import { r as readSettings, H as HIBERNATION_CAPABILITY, a as resolveCheckMs, l as latchKeepAwake, e as evaluateWrapperIdle } from './persistence-DTk4sNpd.mjs';
4
- import { D as DEFAULT_CLAUDE_PERMISSION_MODE, H as HibernationProbe, c as commitHibernation } from './defaultPermissionMode-B8kJG9uI.mjs';
2
+ import { c as claimSessionOrExit, a as applyServerSnapshot, b as applyReconnectReplay, w as withoutServerSnapshot, m as mergeReconnectMetadata, e as exitCursorStamp } from './sessionLock-nBXdJxJm.mjs';
3
+ import { r as readSettings, H as HIBERNATION_CAPABILITY, a as resolveCheckMs, l as latchKeepAwake, e as evaluateWrapperIdle } from './persistence-BFUOHW5h.mjs';
4
+ import { D as DEFAULT_CLAUDE_PERMISSION_MODE, H as HibernationProbe, c as commitHibernation } from './defaultPermissionMode-i5KzdK09.mjs';
5
5
  import { randomUUID } from 'node:crypto';
6
- import { c as connectionState, A as ApiClient, s as startOfflineReconnection } from './api-Dib0dmqC.mjs';
7
- import { l as logger } from './logger--vAVtXB_.mjs';
8
- import { s as spawnOriginTags, a as sessionWorktreeMetadata } from './createSessionMetadata-8Fuj2-IV.mjs';
9
- import { p as packageJson } from './package-B7B03ejW.mjs';
10
- import { P as PROMPT_QUEUE_CAPABILITY } from './index-Clqlu17M.mjs';
6
+ import { c as connectionState, A as ApiClient, s as startOfflineReconnection } from './api-Hov8p7CA.mjs';
7
+ import { l as logger } from './logger-BUngm5Xg.mjs';
8
+ import { s as spawnOriginTags, a as sessionWorktreeMetadata } from './createSessionMetadata-DDIChCx8.mjs';
9
+ import { p as packageJson } from './package-7Ld1YMhh.mjs';
10
+ import { P as PROMPT_QUEUE_CAPABILITY, a as PROJECT_SESSION_CAPABILITY } from './index-C6Vn5Eac.mjs';
11
11
  import { F as FORK_BACKFILL_CAPABILITY, p as publishForkBackfillWhenCommitted } from './forkBackfill-DYIjlN1Z.mjs';
12
- import { c as configuration } from './configuration-DVrb61aY.mjs';
13
- import { n as notifyDaemonSessionStarted, c as checkDaemonHibernation } from './controlClient-BYKyGyxj.mjs';
14
- import { g as getInitialMachineMetadata } from './machineMetadata-B1H9gNbN.mjs';
12
+ import { c as configuration } from './configuration-PxzEJumr.mjs';
13
+ import { n as notifyDaemonSessionStarted, c as checkDaemonHibernation } from './controlClient-DoeYovwP.mjs';
14
+ import { g as getInitialMachineMetadata } from './machineMetadata-BXN_bKU3.mjs';
15
15
  import { p as projectPath } from './projectPath-BTBIMB57.mjs';
16
16
  import { resolve, join } from 'node:path';
17
+ import { c as createSessionForStartup } from './startupSessionCreate-uZ6BM0ty.mjs';
17
18
  import { a as applySandboxPermissionPolicy, r as resolveInitialClaudePermissionMode, m as mapToClaudeMode, b as reconcilePublishedPermissionMode } from './permissionMode-CH4FoZfU.mjs';
18
19
  import { d as decodeBase64, e as encodeBase64 } from './authRelay-DhQhkBvX.mjs';
19
20
  import { readFile } from 'node:fs/promises';
20
- import { C as CLAUDE_ATTACHMENT_KINDS, s as stripAttachmentManifest } from './attachmentContent-DkkdpSSJ.mjs';
21
+ import { C as CLAUDE_ATTACHMENT_KINDS, s as stripAttachmentManifest } from './attachmentContent-CIn4iPEk.mjs';
21
22
  import { T as TranscriptPathHints } from './transcriptCursor-B7T_gkQ0.mjs';
22
23
  import { p as planClaudeStartup } from './startupPlan-DFMyNgAs.mjs';
23
24
  import 'node:fs';
25
+ import './processTreeSnapshot-CuLJDNC-.mjs';
26
+ import 'node:child_process';
24
27
  import 'zod';
25
28
  import 'axios';
26
- import './lidState-DNMlIhX0.mjs';
29
+ import './lidState-bBrmaQd2.mjs';
27
30
  import 'os';
28
31
  import 'child_process';
29
32
  import 'node:events';
30
33
  import 'socket.io-client';
31
- import './attachmentLimits-UyFn8fkQ.mjs';
34
+ import './pushNotifications-DCiBEVeC.mjs';
35
+ import './contentLogMetadata-BlWI0egu.mjs';
32
36
  import './limits-DIo7rEBR.mjs';
33
- import './time-BuGWTVP6.mjs';
34
- import './registerCommonHandlers-CvIedVRf.mjs';
37
+ import './time-D3ETL7Jb.mjs';
38
+ import './registerCommonHandlers-CTkCvjxt.mjs';
35
39
  import 'util';
36
40
  import 'fs/promises';
37
41
  import 'crypto';
38
42
  import 'path';
39
43
  import 'cross-spawn';
40
44
  import '@paralleldrive/cuid2';
41
- import './sync-DbW07iQS.mjs';
42
- import './backgroundTaskActivity-BVwJBl02.mjs';
43
- import './contentLogMetadata-BlWI0egu.mjs';
45
+ import './sync-BvVhDO40.mjs';
46
+ import './backgroundTaskActivity-8PdPxrvy.mjs';
44
47
  import 'chalk';
45
48
  import 'node:util';
46
49
  import './detectCLI-CSGMlV51.mjs';
47
50
  import 'fs';
48
- import './localHappyAgentAuth-BezKSFDi.mjs';
51
+ import './localHappyAgentAuth-Dn1jYDpt.mjs';
49
52
  import 'tweetnacl';
50
53
  import 'url';
51
54
 
52
55
  const DEFAULT_CLAUDE_MODEL = void 0;
53
56
  const DEFAULT_CLAUDE_EFFORT = void 0;
54
- const importRunClaudeDeps = () => import('./runClaudeDeps-CVBCokOS.mjs');
57
+ const importRunClaudeDeps = () => import('./runClaudeDeps-BcZ68cX3.mjs');
55
58
  async function runClaude(credentials, options = {}) {
56
59
  logger.debug(`[CLAUDE] ===== CLAUDE MODE STARTING =====`);
57
60
  logger.debug(`[CLAUDE] This is the Claude agent, NOT Gemini`);
@@ -65,7 +68,7 @@ async function runClaude(credentials, options = {}) {
65
68
  const isAssistantVariant = process.env.HAPPY_SESSION_VARIANT === "assistant";
66
69
  if (isAssistantVariant) {
67
70
  try {
68
- const { bootstrapAssistantHome } = await import('./bootstrap-BUagGC_-.mjs');
71
+ const { bootstrapAssistantHome } = await import('./bootstrap-Dt5I1SOl.mjs');
69
72
  await bootstrapAssistantHome();
70
73
  } catch (error) {
71
74
  logger.debug("[START] Assistant home bootstrap failed:", error);
@@ -140,7 +143,7 @@ async function runClaude(credentials, options = {}) {
140
143
  // a brand-new session cannot pick a PDF until after sending once.
141
144
  attachmentKinds: [...CLAUDE_ATTACHMENT_KINDS],
142
145
  queueCancellation: true,
143
- capabilities: ["claude-steer-v1", "claude-live-permission-v1", "claude-live-permission-v2", "claude-btw-v1", "claude-runtime-controls-v1", "claude-opus-5-5-v1", PROMPT_QUEUE_CAPABILITY, FORK_BACKFILL_CAPABILITY, HIBERNATION_CAPABILITY],
146
+ capabilities: ["claude-steer-v1", "claude-live-permission-v1", "claude-live-permission-v2", "claude-btw-v1", "claude-runtime-controls-v1", "claude-opus-5-5-v1", PROMPT_QUEUE_CAPABILITY, FORK_BACKFILL_CAPABILITY, HIBERNATION_CAPABILITY, PROJECT_SESSION_CAPABILITY],
144
147
  // Effective mode this process enforces. Kept current by
145
148
  // publishPermissionMode below; the web renders it instead of guessing.
146
149
  permissionMode: mapToClaudeMode(initialPermissionMode ?? "default"),
@@ -181,11 +184,11 @@ async function runClaude(credentials, options = {}) {
181
184
  agentStateVersion: parseInt(reconnectAgentStateVersion || "0", 10)
182
185
  };
183
186
  } else {
184
- response = await api.getOrCreateSession({ tag: sessionTag, metadata, state });
187
+ response = await createSessionForStartup(() => api.getOrCreateSession({ tag: sessionTag, metadata, state }), { startedBy: options.startedBy, log: (m) => logger.debug(m) });
185
188
  }
186
189
  if (!response) {
187
190
  let offlineSessionId = null;
188
- const { claudeLocal } = await import('./claudeLocal-CCCvAeMd.mjs');
191
+ const { claudeLocal } = await import('./claudeLocal-OHWQigCl.mjs');
189
192
  const { createSessionScanner: createSessionScanner2 } = await loadDeps();
190
193
  const reconnection = startOfflineReconnection({
191
194
  serverUrl: configuration.serverUrl,
@@ -233,16 +236,18 @@ async function runClaude(credentials, options = {}) {
233
236
  }
234
237
  let reconnectSeeded = false;
235
238
  let wakingFromHibernation = false;
239
+ let reconnectReplay = null;
236
240
  if (reconnectSessionId) {
237
241
  const snapshot = await api.getSession(response.id, response.encryptionKey, response.encryptionVariant);
238
242
  if (snapshot.ok) {
239
243
  response = applyServerSnapshot(response, snapshot.session);
240
244
  reconnectSeeded = true;
241
245
  logger.debug(`[START] Reconnect seeded from server: seq=${snapshot.session.seq} metadataVersion=${snapshot.session.metadataVersion}`);
242
- const wake = applyHibernationReplay(response);
246
+ const wake = applyReconnectReplay(response);
243
247
  response = wake.response;
244
- wakingFromHibernation = wake.replaying;
245
- if (wake.replaying) logger.debug(`[START] Waking from hibernation: replaying records after seq=${response.seq}`);
248
+ reconnectReplay = wake.replay;
249
+ wakingFromHibernation = wake.replay?.source === "hibernation";
250
+ if (wake.replay) logger.debug(`[START] Resuming (${wake.replay.source}): replaying records after seq=${response.seq}`);
246
251
  } else {
247
252
  response = withoutServerSnapshot(response);
248
253
  logger.debug(`[START] Reconnect without server snapshot (${snapshot.reason}); skipping existing messages`);
@@ -307,7 +312,9 @@ async function runClaude(credentials, options = {}) {
307
312
  claudeCheckSession,
308
313
  createSessionScanner,
309
314
  getProjectPath,
310
- RawJSONLinesSchema,
315
+ replayClaudeForkJsonl,
316
+ snapshotTree,
317
+ terminateSurvivors,
311
318
  TitleGenerator,
312
319
  BoardAnalyzer,
313
320
  FileRateLimiter,
@@ -334,7 +341,7 @@ async function runClaude(credentials, options = {}) {
334
341
  if (reconnectSessionId) {
335
342
  session.suppressNextArchiveSignal();
336
343
  if (!reconnectSeeded) session.skipExistingMessages();
337
- if (!wakingFromHibernation) void session.cancelUndeliveredQueuedInputs();
344
+ if (!wakingFromHibernation) void session.cancelUndeliveredQueuedInputs(reconnectReplay ? { maxSeq: reconnectReplay.seq } : void 0);
338
345
  session.updateMetadata((meta) => ({
339
346
  ...mergeReconnectMetadata(meta, metadata, Date.now()),
340
347
  queueCancellation: true,
@@ -349,21 +356,10 @@ async function runClaude(credentials, options = {}) {
349
356
  const jsonlPath = join(getProjectPath(workingDirectory), `${forkClaudeSessionId}.jsonl`);
350
357
  try {
351
358
  const file = await readFile(jsonlPath, "utf-8");
352
- const lines = file.split("\n");
353
- let backfilled = 0;
354
- for (const line of lines) {
355
- if (line.trim().length === 0) continue;
356
- let parsed;
357
- try {
358
- parsed = JSON.parse(line);
359
- } catch {
360
- continue;
361
- }
362
- const result = RawJSONLinesSchema.safeParse(parsed);
363
- if (!result.success) continue;
364
- session.sendClaudeSessionMessage(result.data);
365
- backfilled += 1;
366
- }
359
+ const backfilled = replayClaudeForkJsonl(file, {
360
+ send: (line) => session.sendClaudeSessionMessage(line),
361
+ closeTurn: () => session.closeReplayedClaudeTurn()
362
+ });
367
363
  logger.debug(`[FORK BACKFILL] Replayed ${backfilled} historical messages from ${jsonlPath}`);
368
364
  session.updateMetadata((meta) => ({ ...meta, claudeSessionId: forkClaudeSessionId }));
369
365
  void publishForkBackfillWhenCommitted(session, { count: backfilled }).then((published) => logger.debug(`[FORK BACKFILL] ${published ? "Committed" : "Session closed before commit of"} ${backfilled} replayed messages`));
@@ -447,7 +443,7 @@ async function runClaude(credentials, options = {}) {
447
443
  session.sendClaudeSessionMessage(raw);
448
444
  }
449
445
  });
450
- const happyServer = await startHappyServer(session, { assistant: isAssistantVariant, selfReportState: boardSelfReport });
446
+ const happyServer = await startHappyServer(session, { assistant: isAssistantVariant, selfReportState: boardSelfReport, push: { sendAttention: (input) => api.push().sendAttention(input) } });
451
447
  logger.debug(`[START] Happy MCP server started at ${happyServer.url}`);
452
448
  let currentSession = null;
453
449
  const prewarmHookGate = new PrewarmHookGate();
@@ -801,12 +797,16 @@ async function runClaude(credentials, options = {}) {
801
797
  logger.debug(`[START] Received termination signal, cleaning up (archive=${intent === "archive"})...`);
802
798
  promptQueueDrain.close();
803
799
  cleanupPrewarm();
800
+ const wrapperTree = snapshotTree(process.pid);
804
801
  try {
805
802
  if (session) {
803
+ const exitCursor = intent === "offline" ? exitCursorStamp(session.messageCursor, Date.now()) : void 0;
804
+ if (exitCursor) session.freezeInbound();
806
805
  currentSession?.cleanup();
807
806
  await settleSessionOnExit(session.sessionId, intent, {
808
807
  updateMetadata: (handler) => session.updateMetadata(handler),
809
- updateMetadataAndWait: (handler) => session.updateMetadataAndWait(handler),
808
+ updateMetadataAndWait: (handler, timeoutMs) => session.updateMetadataAndWait(handler, timeoutMs),
809
+ exitCursor,
810
810
  sendSessionDeath: () => session.sendSessionDeath(),
811
811
  archiveSession: (id) => api.archiveSession(id),
812
812
  deactivateSession: (id) => api.deactivateSession(id),
@@ -820,9 +820,11 @@ async function runClaude(credentials, options = {}) {
820
820
  cleanupHookSettingsFile(hookSettingsPath);
821
821
  await remoteScanner.cleanup();
822
822
  logger.debug("[START] Cleanup complete, exiting");
823
+ await terminateSurvivors(wrapperTree);
823
824
  process.exit(0);
824
825
  } catch (error) {
825
826
  logger.debug("[START] Error during cleanup:", error);
827
+ await terminateSurvivors(wrapperTree).catch(() => void 0);
826
828
  process.exit(1);
827
829
  }
828
830
  };
@@ -1,59 +1,62 @@
1
1
  'use strict';
2
2
 
3
3
  var os = require('node:os');
4
- var sessionLock = require('./sessionLock-DWX6BbiU.cjs');
5
- var persistence = require('./persistence-BfX72dne.cjs');
6
- var defaultPermissionMode = require('./defaultPermissionMode-BEWCqJU-.cjs');
4
+ var sessionLock = require('./sessionLock-DRZUcKHT.cjs');
5
+ var persistence = require('./persistence-9BMYspxG.cjs');
6
+ var defaultPermissionMode = require('./defaultPermissionMode-PkZGsQDk.cjs');
7
7
  var node_crypto = require('node:crypto');
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');
8
+ var api = require('./api-DM7b1OKj.cjs');
9
+ var logger = require('./logger-CphW5nUE.cjs');
10
+ var createSessionMetadata = require('./createSessionMetadata-xz767pcG.cjs');
11
+ var _package = require('./package-KhLqBDX9.cjs');
12
+ var index = require('./index-Dv0Q48P3.cjs');
13
13
  var forkBackfill = require('./forkBackfill-8eLDeS73.cjs');
14
- var configuration = require('./configuration-4TGMrjul.cjs');
15
- var controlClient = require('./controlClient-BTaZlbC6.cjs');
16
- var machineMetadata = require('./machineMetadata-DcUupMje.cjs');
17
- var projectPath = require('./projectPath-ChLhdOyt.cjs');
14
+ var configuration = require('./configuration-CYO-kPOS.cjs');
15
+ var controlClient = require('./controlClient-Bqv5v5OM.cjs');
16
+ var machineMetadata = require('./machineMetadata-BQm9YTcI.cjs');
17
+ var projectPath = require('./projectPath-C3ioB4Bu.cjs');
18
18
  var path = require('node:path');
19
+ var startupSessionCreate = require('./startupSessionCreate-kdr3m1uX.cjs');
19
20
  var permissionMode = require('./permissionMode-CrV-XuMs.cjs');
20
21
  var authRelay = require('./authRelay-Dy1qU9td.cjs');
21
22
  var promises = require('node:fs/promises');
22
- var attachmentContent = require('./attachmentContent-bpQTBJ0y.cjs');
23
+ var attachmentContent = require('./attachmentContent-CEm13_gF.cjs');
23
24
  var transcriptCursor = require('./transcriptCursor-DcXGLeSc.cjs');
24
25
  var startupPlan = require('./startupPlan-BLMbfQIH.cjs');
25
26
  require('node:fs');
27
+ require('./processTreeSnapshot-mDbnuojn.cjs');
28
+ require('node:child_process');
26
29
  require('zod');
27
30
  require('axios');
28
- require('./lidState-BeOwj6eW.cjs');
31
+ require('./lidState-DWGnm2H4.cjs');
29
32
  require('os');
30
33
  require('child_process');
31
34
  require('node:events');
32
35
  require('socket.io-client');
33
- require('./attachmentLimits-SqeAHrVC.cjs');
36
+ require('./pushNotifications-DI92havG.cjs');
37
+ require('./contentLogMetadata-ZSFk_NjQ.cjs');
34
38
  require('./limits-C-a7gr04.cjs');
35
- require('./time-A6zR3Iy6.cjs');
36
- require('./registerCommonHandlers-C0_fyBQ0.cjs');
39
+ require('./time-Cjv0zxQO.cjs');
40
+ require('./registerCommonHandlers-C7a_dUWs.cjs');
37
41
  require('util');
38
42
  require('fs/promises');
39
43
  require('crypto');
40
44
  require('path');
41
45
  require('cross-spawn');
42
46
  require('@paralleldrive/cuid2');
43
- require('./sync-Dhmtk66S.cjs');
47
+ require('./sync-Bn-idAoy.cjs');
44
48
  require('./backgroundTaskActivity-CBvUdj39.cjs');
45
- require('./contentLogMetadata-ZSFk_NjQ.cjs');
46
49
  require('chalk');
47
50
  require('node:util');
48
- require('./detectCLI-DR9ZaN6B.cjs');
51
+ require('./detectCLI-BuYR_Qxe.cjs');
49
52
  require('fs');
50
- require('./localHappyAgentAuth-Br-mgogg.cjs');
53
+ require('./localHappyAgentAuth-DZHQnIW9.cjs');
51
54
  require('tweetnacl');
52
55
  require('url');
53
56
 
54
57
  const DEFAULT_CLAUDE_MODEL = void 0;
55
58
  const DEFAULT_CLAUDE_EFFORT = void 0;
56
- const importRunClaudeDeps = () => Promise.resolve().then(function () { return require('./runClaudeDeps-RRw-Nusc.cjs'); });
59
+ const importRunClaudeDeps = () => Promise.resolve().then(function () { return require('./runClaudeDeps-B1ysqTvx.cjs'); });
57
60
  async function runClaude(credentials, options = {}) {
58
61
  logger.logger.debug(`[CLAUDE] ===== CLAUDE MODE STARTING =====`);
59
62
  logger.logger.debug(`[CLAUDE] This is the Claude agent, NOT Gemini`);
@@ -67,7 +70,7 @@ async function runClaude(credentials, options = {}) {
67
70
  const isAssistantVariant = process.env.HAPPY_SESSION_VARIANT === "assistant";
68
71
  if (isAssistantVariant) {
69
72
  try {
70
- const { bootstrapAssistantHome } = await Promise.resolve().then(function () { return require('./bootstrap-DCQ87Aan.cjs'); });
73
+ const { bootstrapAssistantHome } = await Promise.resolve().then(function () { return require('./bootstrap-DoA7okld.cjs'); });
71
74
  await bootstrapAssistantHome();
72
75
  } catch (error) {
73
76
  logger.logger.debug("[START] Assistant home bootstrap failed:", error);
@@ -142,7 +145,7 @@ async function runClaude(credentials, options = {}) {
142
145
  // a brand-new session cannot pick a PDF until after sending once.
143
146
  attachmentKinds: [...attachmentContent.CLAUDE_ATTACHMENT_KINDS],
144
147
  queueCancellation: true,
145
- capabilities: ["claude-steer-v1", "claude-live-permission-v1", "claude-live-permission-v2", "claude-btw-v1", "claude-runtime-controls-v1", "claude-opus-5-5-v1", index.PROMPT_QUEUE_CAPABILITY, forkBackfill.FORK_BACKFILL_CAPABILITY, persistence.HIBERNATION_CAPABILITY],
148
+ capabilities: ["claude-steer-v1", "claude-live-permission-v1", "claude-live-permission-v2", "claude-btw-v1", "claude-runtime-controls-v1", "claude-opus-5-5-v1", index.PROMPT_QUEUE_CAPABILITY, forkBackfill.FORK_BACKFILL_CAPABILITY, persistence.HIBERNATION_CAPABILITY, index.PROJECT_SESSION_CAPABILITY],
146
149
  // Effective mode this process enforces. Kept current by
147
150
  // publishPermissionMode below; the web renders it instead of guessing.
148
151
  permissionMode: permissionMode.mapToClaudeMode(initialPermissionMode ?? "default"),
@@ -183,11 +186,11 @@ async function runClaude(credentials, options = {}) {
183
186
  agentStateVersion: parseInt(reconnectAgentStateVersion || "0", 10)
184
187
  };
185
188
  } else {
186
- response = await api$1.getOrCreateSession({ tag: sessionTag, metadata, state });
189
+ response = await startupSessionCreate.createSessionForStartup(() => api$1.getOrCreateSession({ tag: sessionTag, metadata, state }), { startedBy: options.startedBy, log: (m) => logger.logger.debug(m) });
187
190
  }
188
191
  if (!response) {
189
192
  let offlineSessionId = null;
190
- const { claudeLocal } = await Promise.resolve().then(function () { return require('./claudeLocal-CdIVnOZp.cjs'); });
193
+ const { claudeLocal } = await Promise.resolve().then(function () { return require('./claudeLocal--DNyMOSv.cjs'); });
191
194
  const { createSessionScanner: createSessionScanner2 } = await loadDeps();
192
195
  const reconnection = api.startOfflineReconnection({
193
196
  serverUrl: configuration.configuration.serverUrl,
@@ -235,16 +238,18 @@ async function runClaude(credentials, options = {}) {
235
238
  }
236
239
  let reconnectSeeded = false;
237
240
  let wakingFromHibernation = false;
241
+ let reconnectReplay = null;
238
242
  if (reconnectSessionId) {
239
243
  const snapshot = await api$1.getSession(response.id, response.encryptionKey, response.encryptionVariant);
240
244
  if (snapshot.ok) {
241
245
  response = sessionLock.applyServerSnapshot(response, snapshot.session);
242
246
  reconnectSeeded = true;
243
247
  logger.logger.debug(`[START] Reconnect seeded from server: seq=${snapshot.session.seq} metadataVersion=${snapshot.session.metadataVersion}`);
244
- const wake = sessionLock.applyHibernationReplay(response);
248
+ const wake = sessionLock.applyReconnectReplay(response);
245
249
  response = wake.response;
246
- wakingFromHibernation = wake.replaying;
247
- if (wake.replaying) logger.logger.debug(`[START] Waking from hibernation: replaying records after seq=${response.seq}`);
250
+ reconnectReplay = wake.replay;
251
+ wakingFromHibernation = wake.replay?.source === "hibernation";
252
+ if (wake.replay) logger.logger.debug(`[START] Resuming (${wake.replay.source}): replaying records after seq=${response.seq}`);
248
253
  } else {
249
254
  response = sessionLock.withoutServerSnapshot(response);
250
255
  logger.logger.debug(`[START] Reconnect without server snapshot (${snapshot.reason}); skipping existing messages`);
@@ -309,7 +314,9 @@ async function runClaude(credentials, options = {}) {
309
314
  claudeCheckSession,
310
315
  createSessionScanner,
311
316
  getProjectPath,
312
- RawJSONLinesSchema,
317
+ replayClaudeForkJsonl,
318
+ snapshotTree,
319
+ terminateSurvivors,
313
320
  TitleGenerator,
314
321
  BoardAnalyzer,
315
322
  FileRateLimiter,
@@ -336,7 +343,7 @@ async function runClaude(credentials, options = {}) {
336
343
  if (reconnectSessionId) {
337
344
  session.suppressNextArchiveSignal();
338
345
  if (!reconnectSeeded) session.skipExistingMessages();
339
- if (!wakingFromHibernation) void session.cancelUndeliveredQueuedInputs();
346
+ if (!wakingFromHibernation) void session.cancelUndeliveredQueuedInputs(reconnectReplay ? { maxSeq: reconnectReplay.seq } : void 0);
340
347
  session.updateMetadata((meta) => ({
341
348
  ...sessionLock.mergeReconnectMetadata(meta, metadata, Date.now()),
342
349
  queueCancellation: true,
@@ -351,21 +358,10 @@ async function runClaude(credentials, options = {}) {
351
358
  const jsonlPath = path.join(getProjectPath(workingDirectory), `${forkClaudeSessionId}.jsonl`);
352
359
  try {
353
360
  const file = await promises.readFile(jsonlPath, "utf-8");
354
- const lines = file.split("\n");
355
- let backfilled = 0;
356
- for (const line of lines) {
357
- if (line.trim().length === 0) continue;
358
- let parsed;
359
- try {
360
- parsed = JSON.parse(line);
361
- } catch {
362
- continue;
363
- }
364
- const result = RawJSONLinesSchema.safeParse(parsed);
365
- if (!result.success) continue;
366
- session.sendClaudeSessionMessage(result.data);
367
- backfilled += 1;
368
- }
361
+ const backfilled = replayClaudeForkJsonl(file, {
362
+ send: (line) => session.sendClaudeSessionMessage(line),
363
+ closeTurn: () => session.closeReplayedClaudeTurn()
364
+ });
369
365
  logger.logger.debug(`[FORK BACKFILL] Replayed ${backfilled} historical messages from ${jsonlPath}`);
370
366
  session.updateMetadata((meta) => ({ ...meta, claudeSessionId: forkClaudeSessionId }));
371
367
  void forkBackfill.publishForkBackfillWhenCommitted(session, { count: backfilled }).then((published) => logger.logger.debug(`[FORK BACKFILL] ${published ? "Committed" : "Session closed before commit of"} ${backfilled} replayed messages`));
@@ -449,7 +445,7 @@ async function runClaude(credentials, options = {}) {
449
445
  session.sendClaudeSessionMessage(raw);
450
446
  }
451
447
  });
452
- const happyServer = await startHappyServer(session, { assistant: isAssistantVariant, selfReportState: boardSelfReport });
448
+ const happyServer = await startHappyServer(session, { assistant: isAssistantVariant, selfReportState: boardSelfReport, push: { sendAttention: (input) => api$1.push().sendAttention(input) } });
453
449
  logger.logger.debug(`[START] Happy MCP server started at ${happyServer.url}`);
454
450
  let currentSession = null;
455
451
  const prewarmHookGate = new PrewarmHookGate();
@@ -803,12 +799,16 @@ async function runClaude(credentials, options = {}) {
803
799
  logger.logger.debug(`[START] Received termination signal, cleaning up (archive=${intent === "archive"})...`);
804
800
  promptQueueDrain.close();
805
801
  cleanupPrewarm();
802
+ const wrapperTree = snapshotTree(process.pid);
806
803
  try {
807
804
  if (session) {
805
+ const exitCursor = intent === "offline" ? sessionLock.exitCursorStamp(session.messageCursor, Date.now()) : void 0;
806
+ if (exitCursor) session.freezeInbound();
808
807
  currentSession?.cleanup();
809
808
  await settleSessionOnExit(session.sessionId, intent, {
810
809
  updateMetadata: (handler) => session.updateMetadata(handler),
811
- updateMetadataAndWait: (handler) => session.updateMetadataAndWait(handler),
810
+ updateMetadataAndWait: (handler, timeoutMs) => session.updateMetadataAndWait(handler, timeoutMs),
811
+ exitCursor,
812
812
  sendSessionDeath: () => session.sendSessionDeath(),
813
813
  archiveSession: (id) => api$1.archiveSession(id),
814
814
  deactivateSession: (id) => api$1.deactivateSession(id),
@@ -822,9 +822,11 @@ async function runClaude(credentials, options = {}) {
822
822
  cleanupHookSettingsFile(hookSettingsPath);
823
823
  await remoteScanner.cleanup();
824
824
  logger.logger.debug("[START] Cleanup complete, exiting");
825
+ await terminateSurvivors(wrapperTree);
825
826
  process.exit(0);
826
827
  } catch (error) {
827
828
  logger.logger.debug("[START] Error during cleanup:", error);
829
+ await terminateSurvivors(wrapperTree).catch(() => void 0);
828
830
  process.exit(1);
829
831
  }
830
832
  };