very-happy-cli 0.2.165 → 0.2.167

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 (198) hide show
  1. package/README.md +1 -1
  2. package/dist/{AcpBackend-DCfNt9bD.cjs → AcpBackend-D1IKJGz_.cjs} +3 -3
  3. package/dist/{AcpBackend-C11FnVw5.mjs → AcpBackend-kFZlee5E.mjs} +3 -3
  4. package/dist/{AcpSessionManager-BQnDJvct.mjs → AcpSessionManager-B7FIrsys.mjs} +1 -1
  5. package/dist/{AcpSessionManager-9yN2iH4b.cjs → AcpSessionManager-Zf00QnlL.cjs} +1 -1
  6. package/dist/{BasePermissionHandler-BwQHxl6M.cjs → BasePermissionHandler-DHxYAK5L.cjs} +1 -1
  7. package/dist/{BasePermissionHandler-CwJ48yiB.mjs → BasePermissionHandler-DS0kRTNI.mjs} +1 -1
  8. package/dist/{BaseReasoningProcessor-ClF2g1qz.mjs → BaseReasoningProcessor-BRtCCt7q.mjs} +1 -1
  9. package/dist/{BaseReasoningProcessor-81lf_M8G.cjs → BaseReasoningProcessor-CsjVdt_H.cjs} +1 -1
  10. package/dist/{agentGuidance-CQuNlNx8.mjs → agentGuidance-BDYt2Qy2.mjs} +4 -2
  11. package/dist/{agentGuidance-B5NATuFa.cjs → agentGuidance-BtBx2xxE.cjs} +4 -1
  12. package/dist/{agentHome-DvR176E5.mjs → agentHome-Ct-VXFeG.mjs} +4 -4
  13. package/dist/{agentHome-D3Nn82kI.cjs → agentHome-DeAWzhSe.cjs} +4 -4
  14. package/dist/{api-AzdzTKFs.cjs → api-BZYLRDM9.cjs} +93 -13
  15. package/dist/{api-DTVPUE7g.mjs → api-CReZazeT.mjs} +93 -13
  16. package/dist/{apiMachine-B_cJldfa.cjs → apiMachine-BgMxGPsR.cjs} +2173 -66
  17. package/dist/{apiMachine-BQ-b4Lu3.mjs → apiMachine-CWndf1Vn.mjs} +2176 -69
  18. package/dist/{attachmentContent-muDCe4Gy.cjs → attachmentContent-HcJqFQW8.cjs} +2 -2
  19. package/dist/{attachmentContent-dzIs-wis.mjs → attachmentContent-j875mwU7.mjs} +2 -2
  20. package/dist/{attachmentLimits-eJZ4ZBjF.cjs → attachmentLimits-BEYEEBm8.cjs} +40 -2
  21. package/dist/{attachmentLimits-B8nzhw-i.mjs → attachmentLimits-CxG3T18E.mjs} +40 -2
  22. package/dist/{auth-Jtmvh1w4.mjs → auth-BIHuc7vY.mjs} +10 -10
  23. package/dist/{auth-BY5ujhGn.mjs → auth-CFS9Lfgv.mjs} +5 -5
  24. package/dist/{auth-DtP-B4gf.cjs → auth-Myr2Q42x.cjs} +10 -10
  25. package/dist/{auth-CfLd3phE.cjs → auth-VzWpbo5P.cjs} +5 -5
  26. package/dist/{auto-ClNnbSoF.cjs → auto-Bf6Dr7_o.cjs} +85 -21
  27. package/dist/{auto-DjWfR1UB.mjs → auto-Df9-zmuN.mjs} +84 -22
  28. package/dist/{bootstrap-D_ExGrY2.mjs → bootstrap-BSOxYpaP.mjs} +2 -2
  29. package/dist/{bootstrap-B1dMZA-u.cjs → bootstrap-Dj8WBiR2.cjs} +2 -2
  30. package/dist/{browser-mwzpOmcw.mjs → browser-BCFIHOvo.mjs} +1 -1
  31. package/dist/{browser-_gV7tcPs.cjs → browser-BoCV40yC.cjs} +1 -1
  32. package/dist/{claudeLocal-G5UmJ81F.cjs → claudeLocal-CGsq7Kul.cjs} +7 -7
  33. package/dist/{claudeLocal-BeHToEK5.mjs → claudeLocal-D5-eA9SC.mjs} +7 -7
  34. package/dist/{claudeLocalLauncher-Cq6bqAT4.mjs → claudeLocalLauncher-C9Cc438l.mjs} +15 -12
  35. package/dist/{claudeLocalLauncher-B4y2BsmO.cjs → claudeLocalLauncher-Cf9QeYDT.cjs} +15 -12
  36. package/dist/{claudeSessionFork-CDJq_b9r.cjs → claudeSessionFork-Byd8zD1U.cjs} +1 -1
  37. package/dist/{claudeSessionFork-CokUhS4r.mjs → claudeSessionFork-CMzAva8G.mjs} +1 -1
  38. package/dist/{client-Do7cGPEq.cjs → client-BKnKRLSt.cjs} +3 -3
  39. package/dist/{client-CJZKBZCE.mjs → client-C7FYMer0.mjs} +2 -2
  40. package/dist/{client-uN9d6Git.cjs → client-D0T5-6Ds.cjs} +2 -2
  41. package/dist/{client-BwaWdlCm.mjs → client-Dsfy_SAb.mjs} +3 -3
  42. package/dist/codex/happyMcpStdioBridge.cjs +23 -18
  43. package/dist/codex/happyMcpStdioBridge.mjs +22 -17
  44. package/dist/{codexAppServerClient-B0QaMQsC.mjs → codexAppServerClient-Dd_4TxHv.mjs} +48 -4
  45. package/dist/{codexAppServerClient-BuSdeUxT.cjs → codexAppServerClient-TiW9OBk4.cjs} +47 -3
  46. package/dist/{codexCommand-C3gdjMAw.mjs → codexCommand-BZSr4MKI.mjs} +170 -69
  47. package/dist/{codexCommand-YdYmykAR.cjs → codexCommand-Bxryqh90.cjs} +170 -69
  48. package/dist/{config-CGCIFRCN.mjs → config-C_Pj7yxV.mjs} +3 -3
  49. package/dist/{config-ChoHFnfO.cjs → config-DXPash-r.cjs} +3 -3
  50. package/dist/{configuration-BE61XNsg.cjs → configuration-C3piBtxY.cjs} +1 -1
  51. package/dist/{configuration-L1qcGTFM.mjs → configuration-WspKd2C2.mjs} +2 -2
  52. package/dist/{connect-D5IKfcfd.cjs → connect-BN-IBElA.cjs} +14 -14
  53. package/dist/{connect-CFD0Em6a.mjs → connect-DGPZs5px.mjs} +14 -14
  54. package/dist/{context-DaCCB4cm.mjs → context-Cr6a3NTg.mjs} +1 -1
  55. package/dist/{context-3WVw8qPz.cjs → context-Jrq4-eCZ.cjs} +1 -1
  56. package/dist/{controlClient-RWTlQA4_.cjs → controlClient-BI6Fw3fQ.cjs} +28 -5
  57. package/dist/{controlClient-Ci7HTMII.mjs → controlClient-DTheOlvC.mjs} +27 -6
  58. package/dist/{createSessionMetadata-CWR-AB2A.mjs → createSessionMetadata-BEZ4DIDA.mjs} +57 -5
  59. package/dist/{createSessionMetadata-CPGTztXP.cjs → createSessionMetadata-zQSz3hgk.cjs} +56 -3
  60. package/dist/defaultPermissionMode-Cif_RHGb.mjs +191 -0
  61. package/dist/defaultPermissionMode-DNKNzk7l.cjs +197 -0
  62. package/dist/{deterministicJson-BBwG-Ase.mjs → deterministicJson-BMMifViN.mjs} +36 -52
  63. package/dist/{deterministicJson-C4Jo2RWy.cjs → deterministicJson-C7O2ulKY.cjs} +41 -59
  64. package/dist/{doctor-ZOQLE5AH.cjs → doctor-BykBaMTr.cjs} +6 -6
  65. package/dist/{doctor-CAC6qY9Z.mjs → doctor-D1KKyPzB.mjs} +6 -6
  66. package/dist/{assistantTools-BsrG3PD-.cjs → downloadTarget-CWTb2-EM.cjs} +44 -6
  67. package/dist/{assistantTools-DPGga5lM.mjs → downloadTarget-Cp48jrIP.mjs} +45 -8
  68. package/dist/{ensureDaemonRunning-b1pvEFcS.mjs → ensureDaemonRunning-Ba5fYoxb.mjs} +5 -5
  69. package/dist/{ensureDaemonRunning-mIgX2vnc.cjs → ensureDaemonRunning-CCxX7MoP.cjs} +5 -5
  70. package/dist/{handleResumeCommand-CTGbZkCL.mjs → handleResumeCommand-BTUGlNjB.mjs} +5 -5
  71. package/dist/{handleResumeCommand-DGNhbv-3.cjs → handleResumeCommand-yPdDQHqz.cjs} +5 -5
  72. package/dist/{index-vVWpCoTr.mjs → index-B0HEEYGh.mjs} +22 -5
  73. package/dist/{index-BzIxE0Eu.cjs → index-BjhKqDa0.cjs} +3 -3
  74. package/dist/{index-BgzjPv07.mjs → index-C3_83bqS.mjs} +3 -3
  75. package/dist/{index-DqlyNgt4.cjs → index-C9hI8a10.cjs} +26 -4
  76. package/dist/{index-DjtBengz.mjs → index-CE2GgPbr.mjs} +40 -39
  77. package/dist/{index-Diu6HdWH.mjs → index-D8m8Ripb.mjs} +4 -4
  78. package/dist/{index-DrSPR59N.cjs → index-DifM62wX.cjs} +39 -38
  79. package/dist/{index-DIodyAqF.cjs → index-PNMQPKhz.cjs} +4 -4
  80. package/dist/index.cjs +2 -2
  81. package/dist/index.mjs +2 -2
  82. package/dist/{install-BO_W7VhL.mjs → install-BdvKiOQw.mjs} +2 -0
  83. package/dist/{install-Cp_aB-NQ.mjs → install-C0-QFn9s.mjs} +3 -3
  84. package/dist/{install-Cs5qAPrB.cjs → install-Cf6AFSWC.cjs} +2 -0
  85. package/dist/{install-DrUQk2DJ.cjs → install-CqZVeze8.cjs} +3 -3
  86. package/dist/lib.cjs +12 -12
  87. package/dist/lib.d.cts +116 -2
  88. package/dist/lib.d.mts +116 -2
  89. package/dist/lib.mjs +12 -12
  90. package/dist/{lidState-BLHLmhwd.mjs → lidState-B2ZxdREe.mjs} +1 -1
  91. package/dist/{lidState-z9ekRpZu.cjs → lidState-Bc2K9H9l.cjs} +1 -1
  92. package/dist/{localHappyAgentAuth-BWvmc_Hg.mjs → localHappyAgentAuth-B5XPEMwk.mjs} +1 -1
  93. package/dist/{localHappyAgentAuth-BCx0y1qW.cjs → localHappyAgentAuth-T5GOvRha.cjs} +1 -1
  94. package/dist/{logger-D0hkk7Vo.cjs → logger-B_MWPbZz.cjs} +2 -2
  95. package/dist/{logger-CknSVkIe.mjs → logger-CbBv3q_b.mjs} +2 -2
  96. package/dist/{machineMetadata-BDCYOXQg.cjs → machineMetadata-BafS4JY8.cjs} +4 -3
  97. package/dist/{machineMetadata-Cj1DoFot.mjs → machineMetadata-DHg238U4.mjs} +4 -3
  98. package/dist/{main-COAPGIso.cjs → main-DNrA0qBy.cjs} +45 -45
  99. package/dist/{main-CKUfkVG_.mjs → main-DXAK0n7x.mjs} +45 -45
  100. package/dist/{manager-BQ4flvQZ.mjs → manager-BEsI4qt3.mjs} +9 -3
  101. package/dist/{manager-Cly8xVIR.cjs → manager-HrEj442o.cjs} +8 -2
  102. package/dist/{mcp-BILnw4si.cjs → mcp-AvPOhDXy.cjs} +24 -19
  103. package/dist/{mcp-DeYUfpo8.mjs → mcp-BotAjCdD.mjs} +23 -18
  104. package/dist/mirrorProtocol-BdcN6QlN.cjs +1270 -0
  105. package/dist/mirrorProtocol-BwHm8odn.mjs +1247 -0
  106. package/dist/{package-UkmvSFsg.cjs → package-C9ZP9bpX.cjs} +7 -7
  107. package/dist/{package-VIUXrYZ1.mjs → package-DU1DxhH9.mjs} +7 -7
  108. package/dist/{peerTools-CttfOxti.cjs → peerTools-Dkbu7gag.cjs} +4 -4
  109. package/dist/{peerTools-SWITnkqz.mjs → peerTools-os2DVjA0.mjs} +4 -4
  110. package/dist/{persistence-C6ztVW1W.cjs → persistence-BYGl0QYw.cjs} +147 -25
  111. package/dist/{persistence-DujtUH94.mjs → persistence-ON0zpHfb.mjs} +123 -12
  112. package/dist/{piRunnerArgs-BVJHIjlk.mjs → piRunnerArgs-CYsnT9sV.mjs} +1 -1
  113. package/dist/{piRunnerArgs-tBQg6xDw.cjs → piRunnerArgs-DpbvstUX.cjs} +1 -1
  114. package/dist/{piRuntime-DZzjF9It.cjs → piRuntime-CDnILlCd.cjs} +1 -1
  115. package/dist/{piRuntime-DKFA8u8t.mjs → piRuntime-CmEid-wu.mjs} +1 -1
  116. package/dist/{piTerminal-BTSaFlpV.mjs → piTerminal-0eNlXSlL.mjs} +17 -17
  117. package/dist/{piTerminal-t5pQHCPT.cjs → piTerminal-B57TgMON.cjs} +17 -17
  118. package/dist/precheckCompat-CWOi5c9L.cjs +29 -0
  119. package/dist/precheckCompat-DeEbilbr.mjs +26 -0
  120. package/dist/rateLimitWindows-CusGIqlq.cjs +258 -0
  121. package/dist/rateLimitWindows-vZ9Bo7aT.mjs +248 -0
  122. package/dist/{registerCommonHandlers-BR0J4g64.mjs → registerCommonHandlers-B0PVff2U.mjs} +2 -2
  123. package/dist/{registerCommonHandlers--8ds2auE.cjs → registerCommonHandlers-DVYB3iVn.cjs} +2 -2
  124. package/dist/{registerKillSessionHandler-Czz0tdki.mjs → registerKillSessionHandler-BJMHJHXe.mjs} +15 -10
  125. package/dist/{registerKillSessionHandler-CI23l8aJ.cjs → registerKillSessionHandler-BwXGKtg_.cjs} +15 -10
  126. package/dist/{remoteSessionClient-DCAUHgPz.mjs → remoteSessionClient-BzPXSC21.mjs} +5 -5
  127. package/dist/{remoteSessionClient-BAkIwM2S.cjs → remoteSessionClient-PyUAIhwK.cjs} +5 -5
  128. package/dist/{tools-BVRoGcQH.mjs → reportProgressTool-BvB13EwC.mjs} +67 -10
  129. package/dist/{tools-mWqsE6ji.cjs → reportProgressTool-D4KB_4cP.cjs} +73 -9
  130. package/dist/{run-CkKujjn8.cjs → run-BC8jzq_h.cjs} +558 -122
  131. package/dist/{run-B75qm2I6.mjs → run-O2M8LsWf.mjs} +556 -120
  132. package/dist/{runClaude-B1T9DLLi.cjs → runClaude-C7jPa8VP.cjs} +93 -26
  133. package/dist/{runClaude-aBfBweec.mjs → runClaude-DGkr5E7s.mjs} +93 -26
  134. package/dist/{runClaudeDeps-BGjNGfuZ.cjs → runClaudeDeps-5kzncqME.cjs} +113 -35
  135. package/dist/{runClaudeDeps-BOrPP4J1.mjs → runClaudeDeps-CX_TxS78.mjs} +116 -37
  136. package/dist/{runGemini-BuAA_OQb.cjs → runGemini-BfYA4Uqc.cjs} +43 -36
  137. package/dist/{runGemini-a-V7JE-J.mjs → runGemini-CwmGBH3L.mjs} +43 -36
  138. package/dist/{runOpenClaw-DUSwXg1A.mjs → runOpenClaw-BYAPYFyL.mjs} +18 -18
  139. package/dist/{runOpenClaw-BBVffIh9.cjs → runOpenClaw-C72jut7v.cjs} +18 -18
  140. package/dist/{sandbox-Fd2G5yaq.cjs → sandbox-Bqkp8IT7.cjs} +4 -4
  141. package/dist/{sandbox-Brb_5wzc.mjs → sandbox-DlVnK1Vi.mjs} +4 -4
  142. package/dist/{selfCheck-NuJKMInJ.cjs → selfCheck-B4lLZplk.cjs} +34 -34
  143. package/dist/selfCheck-DYTGBdIO.mjs +84 -0
  144. package/dist/{send-DEQJiq_x.mjs → send-B5bWW9Tl.mjs} +8 -8
  145. package/dist/{send-4dgHKC3u.cjs → send-BCwS6n_s.cjs} +8 -8
  146. package/dist/{server-C6AlUFkw.mjs → server-CEJfRQfj.mjs} +4 -4
  147. package/dist/{server-DWGcDmHG.cjs → server-CFWZehnC.cjs} +6 -6
  148. package/dist/{sessionLock-Dm8QyGo4.mjs → sessionLock-AwOYsKT7.mjs} +12 -4
  149. package/dist/{sessionLock-B1GgaO1q.cjs → sessionLock-LBWNjpHf.cjs} +12 -3
  150. package/dist/{sessionModeFile-BvOEJ4Fl.cjs → sessionModeFile-CyPuZRIU.cjs} +1 -1
  151. package/dist/{sessionModeFile-CuNAWCKL.mjs → sessionModeFile-fvFn1JVG.mjs} +1 -1
  152. package/dist/{sessionOps-DG5MMEp_.mjs → sessionOps-DZRH4-hV.mjs} +4 -4
  153. package/dist/{sessionOps-JP64uJmc.cjs → sessionOps-DzbZI3Eq.cjs} +4 -4
  154. package/dist/{sessionScanner-DqSk5Ol_.mjs → sessionScanner-Q_Ei2flB.mjs} +75 -19
  155. package/dist/{sessionScanner-BBPEgJ5S.cjs → sessionScanner-i-cgwFVw.cjs} +75 -19
  156. package/dist/{sessions-4isbBAWi.mjs → sessions-DAmjMAZN.mjs} +9 -9
  157. package/dist/{sessions-DgJuw_i0.cjs → sessions-DYK5hD4T.cjs} +9 -9
  158. package/dist/{setupOfflineReconnection-_MoZtsro.mjs → setupOfflineReconnection-BfDBxNdo.mjs} +2 -2
  159. package/dist/{setupOfflineReconnection-CKJKVIUS.cjs → setupOfflineReconnection-C2LO3hSP.cjs} +2 -2
  160. package/dist/{spawn-BTOG4tTm.mjs → spawn-BmjG5j5Y.mjs} +15 -14
  161. package/dist/{spawn-CshERWbY.cjs → spawn-GK_sXE8h.cjs} +15 -14
  162. package/dist/{spawnAgents-Czi2VDzj.mjs → spawnAgents-HDaE3C0-.mjs} +1 -1
  163. package/dist/{spawnAgents-McixdtV1.cjs → spawnAgents-vglexX9N.cjs} +1 -1
  164. package/dist/{spawnHappyCLI-Dc4xYm8P.mjs → spawnHappyCLI-B2h0P4b5.mjs} +1 -1
  165. package/dist/{spawnHappyCLI-Dd5_8Vex.cjs → spawnHappyCLI-J4iEhfyZ.cjs} +1 -1
  166. package/dist/specialCommands-DisVxagO.mjs +93 -0
  167. package/dist/specialCommands-DmJMKspE.cjs +96 -0
  168. package/dist/{startFileWatcher-B0VlG-Fn.mjs → startFileWatcher-CeK1k5gt.mjs} +1 -1
  169. package/dist/{startFileWatcher-1LedLBY-.cjs → startFileWatcher-xKo8AoYl.cjs} +1 -1
  170. package/dist/{streamRelay-C0AffuX6.cjs → streamRelay-Ce9sgcOV.cjs} +1 -1
  171. package/dist/{streamRelay-BzMEEvJU.mjs → streamRelay-Iogsh51a.mjs} +1 -1
  172. package/dist/{sync-DwUUGGFz.cjs → sync-Bvc-vh6C.cjs} +1 -1
  173. package/dist/{sync-Dfm6K2te.mjs → sync-CCwYpJMS.mjs} +1 -1
  174. package/dist/{systemPrompt-D41Zw1a3.mjs → systemPrompt-BNIkP3tR.mjs} +3 -3
  175. package/dist/{systemPrompt-CB1Ls0AE.cjs → systemPrompt-DwOddbuG.cjs} +3 -3
  176. package/dist/{teams-D8Ly3i6u.mjs → teams-DRrLBcys.mjs} +7 -7
  177. package/dist/{teams-NWv2ji16.cjs → teams-GHMCRZOw.cjs} +7 -7
  178. package/dist/{time-BbzJ7PJQ.cjs → time-BXvtjhe9.cjs} +1 -1
  179. package/dist/{time-v1Y_qEJp.mjs → time-PG5Dfwdv.mjs} +1 -1
  180. package/dist/{titleGenerator-cH6IkPRi.cjs → titleGenerator-B07bZA0V.cjs} +2 -2
  181. package/dist/{titleGenerator-BhoblAQY.mjs → titleGenerator-CIzfpfZW.mjs} +1 -1
  182. package/dist/{todo-D1hgWV6d.cjs → todo-B0aeoNu3.cjs} +6 -6
  183. package/dist/{todo-CuNct-fw.mjs → todo-CfL7SBFc.mjs} +6 -6
  184. package/dist/{tools-jof0Bu54.mjs → tools-D91mq5Ib.mjs} +1 -1
  185. package/dist/{tools-c2fb0CF5.cjs → tools-DJIANHSh.cjs} +1 -1
  186. package/dist/transcriptCursor-B7T_gkQ0.mjs +102 -0
  187. package/dist/transcriptCursor-DcXGLeSc.cjs +106 -0
  188. package/dist/{uninstall-BB7WYYAk.mjs → uninstall-5xz3Xvhf.mjs} +3 -3
  189. package/dist/{uninstall-VPH5GfrA.cjs → uninstall-AtzOfdrj.cjs} +3 -3
  190. package/package.json +7 -7
  191. package/scripts/terminal_status_forwarder.cjs +89 -0
  192. package/dist/defaultPermissionMode-BnxJPVHT.mjs +0 -4
  193. package/dist/defaultPermissionMode-CxmTXUQR.cjs +0 -7
  194. package/dist/mirrorProtocol-BNLtoWjO.mjs +0 -170
  195. package/dist/mirrorProtocol-BUtmg1ws.cjs +0 -186
  196. package/dist/selfCheck-BgwJ3NGS.mjs +0 -84
  197. package/dist/specialCommands-BSqhYg5X.mjs +0 -52
  198. package/dist/specialCommands-DSsTeRej.cjs +0 -54
@@ -0,0 +1,84 @@
1
+ import { p as packageJson } from './package-DU1DxhH9.mjs';
2
+
3
+ const LAZY_MODULES = [
4
+ // Entry
5
+ ["main", () => import('./main-DXAK0n7x.mjs')],
6
+ ["selfCheck", () => Promise.resolve().then(function () { return selfCheck; })],
7
+ // Subcommands (main.ts)
8
+ ["api/api", () => import('./api-CReZazeT.mjs').then(function (n) { return n.b; })],
9
+ ["claude/claudeCliPath", () => import('./claudeCliPath-BqkaH2oR.mjs')],
10
+ ["claude/runClaude", () => import('./runClaude-DGkr5E7s.mjs')],
11
+ ["commands/agentHome", () => import('./agentHome-Ct-VXFeG.mjs')],
12
+ ["commands/auth", () => import('./auth-BIHuc7vY.mjs')],
13
+ ["commands/auto", () => import('./auto-Df9-zmuN.mjs')],
14
+ ["commands/codexCommand", () => import('./codexCommand-BZSr4MKI.mjs')],
15
+ ["commands/connect", () => import('./connect-DGPZs5px.mjs')],
16
+ ["commands/installPiTools", () => import('./installPiTools-B_CdM5_2.mjs')],
17
+ ["commands/installTerminalHooks", () => import('./installTerminalHooks-By7gBMEF.mjs')],
18
+ ["commands/mcp", () => import('./mcp-BotAjCdD.mjs')],
19
+ ["commands/piTerminal", () => import('./piTerminal-0eNlXSlL.mjs')],
20
+ ["commands/sandbox", () => import('./sandbox-DlVnK1Vi.mjs')],
21
+ ["commands/send", () => import('./send-B5bWW9Tl.mjs')],
22
+ ["commands/server", () => import('./server-CEJfRQfj.mjs')],
23
+ ["commands/sessions", () => import('./sessions-DAmjMAZN.mjs')],
24
+ ["commands/spawn", () => import('./spawn-BmjG5j5Y.mjs')],
25
+ ["commands/teams", () => import('./teams-DRrLBcys.mjs')],
26
+ ["commands/todo", () => import('./todo-CfL7SBFc.mjs')],
27
+ ["daemon/doctor", () => import('./doctor-BPkYWSuq.mjs')],
28
+ ["daemon/install", () => import('./install-C0-QFn9s.mjs')],
29
+ ["daemon/run", () => import('./run-O2M8LsWf.mjs')],
30
+ ["daemon/uninstall", () => import('./uninstall-5xz3Xvhf.mjs')],
31
+ ["resume/handleResumeCommand", () => import('./handleResumeCommand-BTUGlNjB.mjs')],
32
+ ["ui/doctor", () => import('./doctor-D1KKyPzB.mjs').then(function (n) { return n.d; })],
33
+ ["agent/acp", () => import('./index-CE2GgPbr.mjs')],
34
+ ["gemini/runGemini", () => import('./runGemini-CwmGBH3L.mjs')],
35
+ ["gemini/utils/config", () => import('./config-C_Pj7yxV.mjs')],
36
+ ["openclaw/runOpenClaw", () => import('./runOpenClaw-BYAPYFyL.mjs')],
37
+ ["persistence", () => import('./persistence-ON0zpHfb.mjs').then(function (n) { return n.E; })],
38
+ // Deferred halves of the runners and clients
39
+ ["api/apiMachine", () => import('./apiMachine-CWndf1Vn.mjs')],
40
+ ["claude/runClaudeDeps", () => import('./runClaudeDeps-CX_TxS78.mjs')],
41
+ ["claude/claudeLocal", () => import('./claudeLocal-D5-eA9SC.mjs')],
42
+ ["claude/claudeLocalLauncher", () => import('./claudeLocalLauncher-C9Cc438l.mjs')],
43
+ ["claude/sdk", () => import('./index-B6UGRQ7h.mjs')],
44
+ ["assistant/bootstrap", () => import('./bootstrap-BSOxYpaP.mjs')],
45
+ ["agentHome", () => import('./index-D8m8Ripb.mjs')],
46
+ ["ui/ink/RemoteModeDisplay", () => import('./RemoteModeDisplay-D-HewyXg.mjs')],
47
+ // External packages imported on demand
48
+ ["expo-server-sdk", () => import('expo-server-sdk')],
49
+ ["ink", () => import('ink')],
50
+ ["react", () => import('react')]
51
+ ];
52
+
53
+ async function runSelfCheck(modules = LAZY_MODULES) {
54
+ const failures = [];
55
+ for (const [name, load] of modules) {
56
+ try {
57
+ await load();
58
+ } catch (error) {
59
+ failures.push({ name, error: error instanceof Error ? error.message : String(error) });
60
+ }
61
+ }
62
+ return failures;
63
+ }
64
+ async function selfCheckMain(opts = {}) {
65
+ const started = Date.now();
66
+ const failures = await runSelfCheck();
67
+ if (failures.length > 0) {
68
+ for (const failure of failures) {
69
+ console.error(`very-happy: failed to load ${failure.name}: ${failure.error}`);
70
+ }
71
+ return 1;
72
+ }
73
+ if (opts.verbose) console.log(`self-check: ${LAZY_MODULES.length} modules loaded in ${Date.now() - started}ms`);
74
+ console.log(`very-happy version: ${packageJson.version}`);
75
+ return 0;
76
+ }
77
+
78
+ var selfCheck = /*#__PURE__*/Object.freeze({
79
+ __proto__: null,
80
+ runSelfCheck: runSelfCheck,
81
+ selfCheckMain: selfCheckMain
82
+ });
83
+
84
+ export { runSelfCheck, selfCheckMain };
@@ -1,22 +1,22 @@
1
1
  import chalk from 'chalk';
2
2
  import { readFileSync } from 'node:fs';
3
3
  import { resolve } from 'node:path';
4
- import { readPersistedSessions } from './persistence-DujtUH94.mjs';
5
- import { s as sessionWebUrl } from './sessionOps-DG5MMEp_.mjs';
6
- import { d as deliverToSession, s as sendRemoteMessage } from './remoteSessionClient-DCAUHgPz.mjs';
4
+ import { b as readPersistedSessions } from './persistence-ON0zpHfb.mjs';
5
+ import { s as sessionWebUrl } from './sessionOps-DZRH4-hV.mjs';
6
+ import { d as deliverToSession, s as sendRemoteMessage } from './remoteSessionClient-BzPXSC21.mjs';
7
7
  import 'node:fs/promises';
8
- import './configuration-L1qcGTFM.mjs';
8
+ import './configuration-WspKd2C2.mjs';
9
9
  import 'node:os';
10
- import './package-VIUXrYZ1.mjs';
10
+ import './package-DU1DxhH9.mjs';
11
11
  import 'zod';
12
12
  import './authRelay-DSAvg1uv.mjs';
13
13
  import 'node:crypto';
14
14
  import 'tweetnacl';
15
- import './logger-CknSVkIe.mjs';
15
+ import './logger-CbBv3q_b.mjs';
16
16
  import 'node:util';
17
17
  import 'axios';
18
- import './controlClient-Ci7HTMII.mjs';
19
- import './time-v1Y_qEJp.mjs';
18
+ import './controlClient-DTheOlvC.mjs';
19
+ import './time-PG5Dfwdv.mjs';
20
20
  import 'socket.io-client';
21
21
  import './backgroundTaskActivity-8PdPxrvy.mjs';
22
22
 
@@ -3,22 +3,22 @@
3
3
  var chalk = require('chalk');
4
4
  var node_fs = require('node:fs');
5
5
  var path = require('node:path');
6
- var persistence = require('./persistence-C6ztVW1W.cjs');
7
- var sessionOps = require('./sessionOps-JP64uJmc.cjs');
8
- var remoteSessionClient = require('./remoteSessionClient-BAkIwM2S.cjs');
6
+ var persistence = require('./persistence-BYGl0QYw.cjs');
7
+ var sessionOps = require('./sessionOps-DzbZI3Eq.cjs');
8
+ var remoteSessionClient = require('./remoteSessionClient-PyUAIhwK.cjs');
9
9
  require('node:fs/promises');
10
- require('./configuration-BE61XNsg.cjs');
10
+ require('./configuration-C3piBtxY.cjs');
11
11
  require('node:os');
12
- require('./package-UkmvSFsg.cjs');
12
+ require('./package-C9ZP9bpX.cjs');
13
13
  require('zod');
14
14
  require('./authRelay-BdYkC1Po.cjs');
15
15
  require('node:crypto');
16
16
  require('tweetnacl');
17
- require('./logger-D0hkk7Vo.cjs');
17
+ require('./logger-B_MWPbZz.cjs');
18
18
  require('node:util');
19
19
  require('axios');
20
- require('./controlClient-RWTlQA4_.cjs');
21
- require('./time-BbzJ7PJQ.cjs');
20
+ require('./controlClient-BI6Fw3fQ.cjs');
21
+ require('./time-BXvtjhe9.cjs');
22
22
  require('socket.io-client');
23
23
  require('./backgroundTaskActivity-CBvUdj39.cjs');
24
24
 
@@ -6,15 +6,15 @@ import { createRequire } from 'node:module';
6
6
  import { randomBytes } from 'node:crypto';
7
7
  import { spawn } from 'node:child_process';
8
8
  import { createInterface } from 'node:readline/promises';
9
- import { c as configuration } from './configuration-L1qcGTFM.mjs';
10
- import { updateSettings } from './persistence-DujtUH94.mjs';
9
+ import { c as configuration } from './configuration-WspKd2C2.mjs';
10
+ import { u as updateSettings } from './persistence-ON0zpHfb.mjs';
11
11
  import 'node:os';
12
- import './package-VIUXrYZ1.mjs';
12
+ import './package-DU1DxhH9.mjs';
13
13
  import 'node:fs/promises';
14
14
  import 'zod';
15
15
  import './authRelay-DSAvg1uv.mjs';
16
16
  import 'tweetnacl';
17
- import './logger-CknSVkIe.mjs';
17
+ import './logger-CbBv3q_b.mjs';
18
18
  import 'node:util';
19
19
 
20
20
  function resolveLocalSignupBootstrap(configuredMode, configuredInviteCodes, generatedInviteCode) {
@@ -8,15 +8,15 @@ var module$1 = require('node:module');
8
8
  var node_crypto = require('node:crypto');
9
9
  var node_child_process = require('node:child_process');
10
10
  var promises = require('node:readline/promises');
11
- var configuration = require('./configuration-BE61XNsg.cjs');
12
- var persistence = require('./persistence-C6ztVW1W.cjs');
11
+ var configuration = require('./configuration-C3piBtxY.cjs');
12
+ var persistence = require('./persistence-BYGl0QYw.cjs');
13
13
  require('node:os');
14
- require('./package-UkmvSFsg.cjs');
14
+ require('./package-C9ZP9bpX.cjs');
15
15
  require('node:fs/promises');
16
16
  require('zod');
17
17
  require('./authRelay-BdYkC1Po.cjs');
18
18
  require('tweetnacl');
19
- require('./logger-D0hkk7Vo.cjs');
19
+ require('./logger-B_MWPbZz.cjs');
20
20
  require('node:util');
21
21
 
22
22
  var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
@@ -33,9 +33,9 @@ function resolveLocalSignupBootstrap(configuredMode, configuredInviteCodes, gene
33
33
  };
34
34
  }
35
35
 
36
- const __filename$1 = node_url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('server-DWGcDmHG.cjs', document.baseURI).href)));
36
+ const __filename$1 = node_url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('server-CFWZehnC.cjs', document.baseURI).href)));
37
37
  const __dirname$1 = path.dirname(__filename$1);
38
- const require_ = module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('server-DWGcDmHG.cjs', document.baseURI).href)));
38
+ const require_ = module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('server-CFWZehnC.cjs', document.baseURI).href)));
39
39
  const PRISMA_QUERY_ENGINE_FILES = {
40
40
  "arm64-darwin": "libquery_engine-darwin-arm64.dylib.node",
41
41
  "x64-darwin": "libquery_engine-darwin.dylib.node",
@@ -1,7 +1,8 @@
1
+ import { k as hibernationReplaySeq } from './persistence-ON0zpHfb.mjs';
1
2
  import { existsSync, readFileSync, unlinkSync, mkdirSync, renameSync } from 'node:fs';
2
3
  import { join } from 'node:path';
3
- import { c as configuration, w as writePrivateFileSync } from './configuration-L1qcGTFM.mjs';
4
- import { l as logger } from './logger-CknSVkIe.mjs';
4
+ import { c as configuration, w as writePrivateFileSync } from './configuration-WspKd2C2.mjs';
5
+ import { l as logger } from './logger-CbBv3q_b.mjs';
5
6
 
6
7
  const PROCESS_IDENTITY_FIELDS = [
7
8
  "hostPid",
@@ -36,7 +37,9 @@ function mergeReconnectMetadata(server, local, now) {
36
37
  lifecycleState: "running",
37
38
  lifecycleStateSince: now,
38
39
  archivedBy: void 0,
39
- archiveReason: void 0
40
+ archiveReason: void 0,
41
+ // B-587: awake again — the hibernation stamp no longer describes us.
42
+ hibernation: void 0
40
43
  };
41
44
  }
42
45
  function applyServerSnapshot(response, snapshot) {
@@ -52,6 +55,11 @@ function applyServerSnapshot(response, snapshot) {
52
55
  function withoutServerSnapshot(response) {
53
56
  return { ...response, metadataVersion: 0, agentStateVersion: 0 };
54
57
  }
58
+ function applyHibernationReplay(response) {
59
+ const replaySeq = hibernationReplaySeq(response.metadata, response.seq);
60
+ if (replaySeq === null) return { response, replaying: false };
61
+ return { response: { ...response, seq: replaySeq }, replaying: true };
62
+ }
55
63
 
56
64
  const runtime = {
57
65
  signal: (pid, signal) => process.kill(pid, signal),
@@ -194,4 +202,4 @@ async function claimSessionOrExit(happySessionId, options) {
194
202
  process.on("exit", () => releaseSessionLock(happySessionId));
195
203
  }
196
204
 
197
- export { applyServerSnapshot as a, claimSessionOrExit as c, mergeReconnectMetadata as m, processIdentityFields as p, readSessionLock as r, terminateProcess as t, withoutServerSnapshot as w };
205
+ export { applyServerSnapshot as a, applyHibernationReplay as b, claimSessionOrExit as c, mergeReconnectMetadata as m, processIdentityFields as p, readSessionLock as r, terminateProcess as t, withoutServerSnapshot as w };
@@ -1,9 +1,10 @@
1
1
  'use strict';
2
2
 
3
+ var persistence = require('./persistence-BYGl0QYw.cjs');
3
4
  var node_fs = require('node:fs');
4
5
  var path = require('node:path');
5
- var configuration = require('./configuration-BE61XNsg.cjs');
6
- var logger = require('./logger-D0hkk7Vo.cjs');
6
+ var configuration = require('./configuration-C3piBtxY.cjs');
7
+ var logger = require('./logger-B_MWPbZz.cjs');
7
8
 
8
9
  const PROCESS_IDENTITY_FIELDS = [
9
10
  "hostPid",
@@ -38,7 +39,9 @@ function mergeReconnectMetadata(server, local, now) {
38
39
  lifecycleState: "running",
39
40
  lifecycleStateSince: now,
40
41
  archivedBy: void 0,
41
- archiveReason: void 0
42
+ archiveReason: void 0,
43
+ // B-587: awake again — the hibernation stamp no longer describes us.
44
+ hibernation: void 0
42
45
  };
43
46
  }
44
47
  function applyServerSnapshot(response, snapshot) {
@@ -54,6 +57,11 @@ function applyServerSnapshot(response, snapshot) {
54
57
  function withoutServerSnapshot(response) {
55
58
  return { ...response, metadataVersion: 0, agentStateVersion: 0 };
56
59
  }
60
+ function applyHibernationReplay(response) {
61
+ const replaySeq = persistence.hibernationReplaySeq(response.metadata, response.seq);
62
+ if (replaySeq === null) return { response, replaying: false };
63
+ return { response: { ...response, seq: replaySeq }, replaying: true };
64
+ }
57
65
 
58
66
  const runtime = {
59
67
  signal: (pid, signal) => process.kill(pid, signal),
@@ -196,6 +204,7 @@ async function claimSessionOrExit(happySessionId, options) {
196
204
  process.on("exit", () => releaseSessionLock(happySessionId));
197
205
  }
198
206
 
207
+ exports.applyHibernationReplay = applyHibernationReplay;
199
208
  exports.applyServerSnapshot = applyServerSnapshot;
200
209
  exports.claimSessionOrExit = claimSessionOrExit;
201
210
  exports.mergeReconnectMetadata = mergeReconnectMetadata;
@@ -2,7 +2,7 @@
2
2
 
3
3
  var node_fs = require('node:fs');
4
4
  var path = require('node:path');
5
- var configuration = require('./configuration-BE61XNsg.cjs');
5
+ var configuration = require('./configuration-C3piBtxY.cjs');
6
6
 
7
7
  const SESSION_MODE_DIR = "session-modes";
8
8
  const ACP_PERMISSION_MODES = ["default", "acceptEdits", "plan", "bypassPermissions"];
@@ -1,6 +1,6 @@
1
1
  import { mkdirSync, renameSync, existsSync, unlinkSync } from 'node:fs';
2
2
  import { join } from 'node:path';
3
- import { w as writePrivateFileSync, c as configuration } from './configuration-L1qcGTFM.mjs';
3
+ import { w as writePrivateFileSync, c as configuration } from './configuration-WspKd2C2.mjs';
4
4
 
5
5
  const SESSION_MODE_DIR = "session-modes";
6
6
  const ACP_PERMISSION_MODES = ["default", "acceptEdits", "plan", "bypassPermissions"];
@@ -1,10 +1,10 @@
1
1
  import axios from 'axios';
2
- import { c as configuration } from './configuration-L1qcGTFM.mjs';
2
+ import { c as configuration } from './configuration-WspKd2C2.mjs';
3
3
  import { e as encodeBase64, g as encrypt, d as decodeBase64, h as decrypt } from './authRelay-DSAvg1uv.mjs';
4
- import { l as listDaemonSessions, s as stopDaemonSession } from './controlClient-Ci7HTMII.mjs';
5
- import { readCredentialsForConfiguredRelay, readPersistedSessions } from './persistence-DujtUH94.mjs';
4
+ import { l as listDaemonSessions, s as stopDaemonSession } from './controlClient-DTheOlvC.mjs';
5
+ import { c as readCredentialsForConfiguredRelay, b as readPersistedSessions } from './persistence-ON0zpHfb.mjs';
6
6
  import { randomUUID } from 'node:crypto';
7
- import { d as delay } from './time-v1Y_qEJp.mjs';
7
+ import { d as delay } from './time-PG5Dfwdv.mjs';
8
8
  import { io } from 'socket.io-client';
9
9
  import { b as backgroundTasksReport } from './backgroundTaskActivity-8PdPxrvy.mjs';
10
10
 
@@ -1,12 +1,12 @@
1
1
  'use strict';
2
2
 
3
3
  var axios = require('axios');
4
- var configuration = require('./configuration-BE61XNsg.cjs');
4
+ var configuration = require('./configuration-C3piBtxY.cjs');
5
5
  var authRelay = require('./authRelay-BdYkC1Po.cjs');
6
- var controlClient = require('./controlClient-RWTlQA4_.cjs');
7
- var persistence = require('./persistence-C6ztVW1W.cjs');
6
+ var controlClient = require('./controlClient-BI6Fw3fQ.cjs');
7
+ var persistence = require('./persistence-BYGl0QYw.cjs');
8
8
  var node_crypto = require('node:crypto');
9
- var time = require('./time-BbzJ7PJQ.cjs');
9
+ var time = require('./time-BXvtjhe9.cjs');
10
10
  var socket_ioClient = require('socket.io-client');
11
11
  var backgroundTaskActivity = require('./backgroundTaskActivity-CBvUdj39.cjs');
12
12
 
@@ -1,9 +1,10 @@
1
- import { I as InvalidateSync } from './sync-Dfm6K2te.mjs';
1
+ import { I as InvalidateSync } from './sync-CCwYpJMS.mjs';
2
2
  import { R as RawJSONLinesSchema } from './types-CkqAACXx.mjs';
3
3
  import { join } from 'node:path';
4
- import { readFile } from 'node:fs/promises';
5
- import { l as logger } from './logger-CknSVkIe.mjs';
6
- import { s as startFileWatcher } from './startFileWatcher-B0VlG-Fn.mjs';
4
+ import { statSync } from 'node:fs';
5
+ import { r as readTranscriptIncrement, i as isValidTranscriptHint } from './transcriptCursor-B7T_gkQ0.mjs';
6
+ import { l as logger } from './logger-CbBv3q_b.mjs';
7
+ import { s as startFileWatcher } from './startFileWatcher-CeK1k5gt.mjs';
7
8
  import { g as getProjectPath } from './path-D2wdaNSk.mjs';
8
9
 
9
10
  class Future {
@@ -40,8 +41,60 @@ async function createSessionScanner(opts) {
40
41
  let watchers = /* @__PURE__ */ new Map();
41
42
  let processedMessageKeys = /* @__PURE__ */ new Set();
42
43
  let deadSessions = /* @__PURE__ */ new Set();
44
+ const cursors = /* @__PURE__ */ new Map();
45
+ const watcherPaths = /* @__PURE__ */ new Map();
46
+ const premarkedSessions = /* @__PURE__ */ new Set();
47
+ const premarkLimits = /* @__PURE__ */ new Map();
48
+ const transcriptPathFor = (sessionId) => {
49
+ const hinted = opts.transcriptPathHints?.get(sessionId);
50
+ return isValidTranscriptHint(sessionId, hinted) ? hinted : join(projectDir, `${sessionId}.jsonl`);
51
+ };
52
+ const readSessionMessages = async (sessionId) => {
53
+ const path = transcriptPathFor(sessionId);
54
+ const state = cursors.get(sessionId);
55
+ const pathChanged = state !== void 0 && state.path !== path;
56
+ const cursor = state && !pathChanged ? state.cursor : null;
57
+ logger.debug(`[SESSION_SCANNER] Reading session file: ${path}`);
58
+ let premarkCursor = null;
59
+ if (pathChanged && premarkedSessions.has(sessionId)) {
60
+ const limit = premarkLimits.get(sessionId);
61
+ const old = await readTranscriptIncrement(path, null, limit && limit.path === path ? { limit: limit.size } : {});
62
+ if (old) {
63
+ const history = parseSessionLines(old.lines);
64
+ logger.debug(`[SESSION_SCANNER] Transcript path for ${sessionId} changed; pre-marking ${history.length} existing messages`);
65
+ for (const m of history) processedMessageKeys.add(messageKey(m));
66
+ premarkCursor = old.cursor;
67
+ }
68
+ premarkLimits.delete(sessionId);
69
+ }
70
+ const result = await readTranscriptIncrement(path, premarkCursor ?? cursor);
71
+ if (!result) {
72
+ cursors.set(sessionId, { path, cursor: null });
73
+ logger.debug(`[SESSION_SCANNER] Session file not found: ${path}`);
74
+ return [];
75
+ }
76
+ if (result.reset) {
77
+ logger.debug(`[SESSION_SCANNER] Transcript ${sessionId} was ${result.reset}; re-reading from the start`);
78
+ }
79
+ cursors.set(sessionId, { path, cursor: result.cursor });
80
+ return parseSessionLines(result.lines);
81
+ };
82
+ let invalidateNow = () => {
83
+ };
84
+ const unsubscribeHints = opts.transcriptPathHints?.subscribe((sessionId, path) => {
85
+ if (premarkedSessions.has(sessionId)) {
86
+ let size = 0;
87
+ try {
88
+ size = statSync(path).size;
89
+ } catch {
90
+ }
91
+ premarkLimits.set(sessionId, { path, size });
92
+ }
93
+ invalidateNow();
94
+ });
43
95
  if (opts.sessionId) {
44
- let messages = await readSessionLog(projectDir, opts.sessionId);
96
+ premarkedSessions.add(opts.sessionId);
97
+ let messages = await readSessionMessages(opts.sessionId);
45
98
  logger.debug(`[SESSION_SCANNER] Marking ${messages.length} existing messages as processed from session ${opts.sessionId}`);
46
99
  for (let m of messages) {
47
100
  processedMessageKeys.add(messageKey(m));
@@ -64,7 +117,7 @@ async function createSessionScanner(opts) {
64
117
  }
65
118
  }
66
119
  for (let session of sessions) {
67
- const sessionMessages = await readSessionLog(projectDir, session);
120
+ const sessionMessages = await readSessionMessages(session);
68
121
  let skipped = 0;
69
122
  let sent = 0;
70
123
  for (let file of sessionMessages) {
@@ -89,10 +142,19 @@ async function createSessionScanner(opts) {
89
142
  }
90
143
  }
91
144
  for (let p of sessions) {
145
+ const path = transcriptPathFor(p);
146
+ if (watchers.has(p) && watcherPaths.get(p) !== path) {
147
+ logger.debug(`[SESSION_SCANNER] Transcript path for ${p} changed; re-attaching watcher`);
148
+ watchers.get(p)?.();
149
+ watchers.delete(p);
150
+ watcherPaths.delete(p);
151
+ sync.invalidate();
152
+ }
92
153
  if (!watchers.has(p) && !deadSessions.has(p)) {
93
154
  logger.debug(`[SESSION_SCANNER] Starting watcher for session: ${p}`);
155
+ watcherPaths.set(p, path);
94
156
  watchers.set(p, startFileWatcher(
95
- join(projectDir, `${p}.jsonl`),
157
+ path,
96
158
  () => {
97
159
  sync.invalidate();
98
160
  },
@@ -102,6 +164,7 @@ async function createSessionScanner(opts) {
102
164
  logger.debug(`[SESSION_SCANNER] Session ${p} transcript never appeared \u2014 dropping it`);
103
165
  watchers.get(p)?.();
104
166
  watchers.delete(p);
167
+ watcherPaths.delete(p);
105
168
  deadSessions.add(p);
106
169
  pendingSessions.delete(p);
107
170
  }
@@ -110,12 +173,14 @@ async function createSessionScanner(opts) {
110
173
  }
111
174
  }
112
175
  });
176
+ invalidateNow = () => sync.invalidate();
113
177
  await sync.invalidateAndAwait();
114
178
  const intervalId = setInterval(() => {
115
179
  sync.invalidate();
116
180
  }, 3e3);
117
181
  return {
118
182
  cleanup: async () => {
183
+ unsubscribeHints?.();
119
184
  clearInterval(intervalId);
120
185
  for (let w of watchers.values()) {
121
186
  w();
@@ -141,7 +206,8 @@ async function createSessionScanner(opts) {
141
206
  return;
142
207
  }
143
208
  if (options?.treatExistingAsProcessed) {
144
- const existing = await readSessionLog(projectDir, sessionId);
209
+ premarkedSessions.add(sessionId);
210
+ const existing = await readSessionMessages(sessionId);
145
211
  logger.debug(`[SESSION_SCANNER] Pre-marking ${existing.length} existing messages as processed for new session ${sessionId}`);
146
212
  for (const m of existing) {
147
213
  processedMessageKeys.add(messageKey(m));
@@ -169,17 +235,7 @@ function messageKey(message) {
169
235
  throw Error();
170
236
  }
171
237
  }
172
- async function readSessionLog(projectDir, sessionId) {
173
- const expectedSessionFile = join(projectDir, `${sessionId}.jsonl`);
174
- logger.debug(`[SESSION_SCANNER] Reading session file: ${expectedSessionFile}`);
175
- let file;
176
- try {
177
- file = await readFile(expectedSessionFile, "utf-8");
178
- } catch (error) {
179
- logger.debug(`[SESSION_SCANNER] Session file not found: ${expectedSessionFile}`);
180
- return [];
181
- }
182
- let lines = file.split("\n");
238
+ function parseSessionLines(lines) {
183
239
  let messages = [];
184
240
  for (let l of lines) {
185
241
  try {
@@ -1,11 +1,12 @@
1
1
  'use strict';
2
2
 
3
- var sync = require('./sync-DwUUGGFz.cjs');
3
+ var sync = require('./sync-Bvc-vh6C.cjs');
4
4
  var types = require('./types-CRS-srZK.cjs');
5
5
  var path$1 = require('node:path');
6
- var promises = require('node:fs/promises');
7
- var logger = require('./logger-D0hkk7Vo.cjs');
8
- var startFileWatcher = require('./startFileWatcher-1LedLBY-.cjs');
6
+ var node_fs = require('node:fs');
7
+ var transcriptCursor = require('./transcriptCursor-DcXGLeSc.cjs');
8
+ var logger = require('./logger-B_MWPbZz.cjs');
9
+ var startFileWatcher = require('./startFileWatcher-xKo8AoYl.cjs');
9
10
  var path = require('./path-B7zW-WwE.cjs');
10
11
 
11
12
  class Future {
@@ -42,8 +43,60 @@ async function createSessionScanner(opts) {
42
43
  let watchers = /* @__PURE__ */ new Map();
43
44
  let processedMessageKeys = /* @__PURE__ */ new Set();
44
45
  let deadSessions = /* @__PURE__ */ new Set();
46
+ const cursors = /* @__PURE__ */ new Map();
47
+ const watcherPaths = /* @__PURE__ */ new Map();
48
+ const premarkedSessions = /* @__PURE__ */ new Set();
49
+ const premarkLimits = /* @__PURE__ */ new Map();
50
+ const transcriptPathFor = (sessionId) => {
51
+ const hinted = opts.transcriptPathHints?.get(sessionId);
52
+ return transcriptCursor.isValidTranscriptHint(sessionId, hinted) ? hinted : path$1.join(projectDir, `${sessionId}.jsonl`);
53
+ };
54
+ const readSessionMessages = async (sessionId) => {
55
+ const path = transcriptPathFor(sessionId);
56
+ const state = cursors.get(sessionId);
57
+ const pathChanged = state !== void 0 && state.path !== path;
58
+ const cursor = state && !pathChanged ? state.cursor : null;
59
+ logger.logger.debug(`[SESSION_SCANNER] Reading session file: ${path}`);
60
+ let premarkCursor = null;
61
+ if (pathChanged && premarkedSessions.has(sessionId)) {
62
+ const limit = premarkLimits.get(sessionId);
63
+ const old = await transcriptCursor.readTranscriptIncrement(path, null, limit && limit.path === path ? { limit: limit.size } : {});
64
+ if (old) {
65
+ const history = parseSessionLines(old.lines);
66
+ logger.logger.debug(`[SESSION_SCANNER] Transcript path for ${sessionId} changed; pre-marking ${history.length} existing messages`);
67
+ for (const m of history) processedMessageKeys.add(messageKey(m));
68
+ premarkCursor = old.cursor;
69
+ }
70
+ premarkLimits.delete(sessionId);
71
+ }
72
+ const result = await transcriptCursor.readTranscriptIncrement(path, premarkCursor ?? cursor);
73
+ if (!result) {
74
+ cursors.set(sessionId, { path, cursor: null });
75
+ logger.logger.debug(`[SESSION_SCANNER] Session file not found: ${path}`);
76
+ return [];
77
+ }
78
+ if (result.reset) {
79
+ logger.logger.debug(`[SESSION_SCANNER] Transcript ${sessionId} was ${result.reset}; re-reading from the start`);
80
+ }
81
+ cursors.set(sessionId, { path, cursor: result.cursor });
82
+ return parseSessionLines(result.lines);
83
+ };
84
+ let invalidateNow = () => {
85
+ };
86
+ const unsubscribeHints = opts.transcriptPathHints?.subscribe((sessionId, path) => {
87
+ if (premarkedSessions.has(sessionId)) {
88
+ let size = 0;
89
+ try {
90
+ size = node_fs.statSync(path).size;
91
+ } catch {
92
+ }
93
+ premarkLimits.set(sessionId, { path, size });
94
+ }
95
+ invalidateNow();
96
+ });
45
97
  if (opts.sessionId) {
46
- let messages = await readSessionLog(projectDir, opts.sessionId);
98
+ premarkedSessions.add(opts.sessionId);
99
+ let messages = await readSessionMessages(opts.sessionId);
47
100
  logger.logger.debug(`[SESSION_SCANNER] Marking ${messages.length} existing messages as processed from session ${opts.sessionId}`);
48
101
  for (let m of messages) {
49
102
  processedMessageKeys.add(messageKey(m));
@@ -66,7 +119,7 @@ async function createSessionScanner(opts) {
66
119
  }
67
120
  }
68
121
  for (let session of sessions) {
69
- const sessionMessages = await readSessionLog(projectDir, session);
122
+ const sessionMessages = await readSessionMessages(session);
70
123
  let skipped = 0;
71
124
  let sent = 0;
72
125
  for (let file of sessionMessages) {
@@ -91,10 +144,19 @@ async function createSessionScanner(opts) {
91
144
  }
92
145
  }
93
146
  for (let p of sessions) {
147
+ const path = transcriptPathFor(p);
148
+ if (watchers.has(p) && watcherPaths.get(p) !== path) {
149
+ logger.logger.debug(`[SESSION_SCANNER] Transcript path for ${p} changed; re-attaching watcher`);
150
+ watchers.get(p)?.();
151
+ watchers.delete(p);
152
+ watcherPaths.delete(p);
153
+ sync$1.invalidate();
154
+ }
94
155
  if (!watchers.has(p) && !deadSessions.has(p)) {
95
156
  logger.logger.debug(`[SESSION_SCANNER] Starting watcher for session: ${p}`);
157
+ watcherPaths.set(p, path);
96
158
  watchers.set(p, startFileWatcher.startFileWatcher(
97
- path$1.join(projectDir, `${p}.jsonl`),
159
+ path,
98
160
  () => {
99
161
  sync$1.invalidate();
100
162
  },
@@ -104,6 +166,7 @@ async function createSessionScanner(opts) {
104
166
  logger.logger.debug(`[SESSION_SCANNER] Session ${p} transcript never appeared \u2014 dropping it`);
105
167
  watchers.get(p)?.();
106
168
  watchers.delete(p);
169
+ watcherPaths.delete(p);
107
170
  deadSessions.add(p);
108
171
  pendingSessions.delete(p);
109
172
  }
@@ -112,12 +175,14 @@ async function createSessionScanner(opts) {
112
175
  }
113
176
  }
114
177
  });
178
+ invalidateNow = () => sync$1.invalidate();
115
179
  await sync$1.invalidateAndAwait();
116
180
  const intervalId = setInterval(() => {
117
181
  sync$1.invalidate();
118
182
  }, 3e3);
119
183
  return {
120
184
  cleanup: async () => {
185
+ unsubscribeHints?.();
121
186
  clearInterval(intervalId);
122
187
  for (let w of watchers.values()) {
123
188
  w();
@@ -143,7 +208,8 @@ async function createSessionScanner(opts) {
143
208
  return;
144
209
  }
145
210
  if (options?.treatExistingAsProcessed) {
146
- const existing = await readSessionLog(projectDir, sessionId);
211
+ premarkedSessions.add(sessionId);
212
+ const existing = await readSessionMessages(sessionId);
147
213
  logger.logger.debug(`[SESSION_SCANNER] Pre-marking ${existing.length} existing messages as processed for new session ${sessionId}`);
148
214
  for (const m of existing) {
149
215
  processedMessageKeys.add(messageKey(m));
@@ -171,17 +237,7 @@ function messageKey(message) {
171
237
  throw Error();
172
238
  }
173
239
  }
174
- async function readSessionLog(projectDir, sessionId) {
175
- const expectedSessionFile = path$1.join(projectDir, `${sessionId}.jsonl`);
176
- logger.logger.debug(`[SESSION_SCANNER] Reading session file: ${expectedSessionFile}`);
177
- let file;
178
- try {
179
- file = await promises.readFile(expectedSessionFile, "utf-8");
180
- } catch (error) {
181
- logger.logger.debug(`[SESSION_SCANNER] Session file not found: ${expectedSessionFile}`);
182
- return [];
183
- }
184
- let lines = file.split("\n");
240
+ function parseSessionLines(lines) {
185
241
  let messages = [];
186
242
  for (let l of lines) {
187
243
  try {