very-happy-cli 0.2.165 → 0.2.166

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 (190) hide show
  1. package/README.md +1 -1
  2. package/dist/{AcpBackend-DCfNt9bD.cjs → AcpBackend-20VHOXwb.cjs} +3 -3
  3. package/dist/{AcpBackend-C11FnVw5.mjs → AcpBackend-tRWk7yi7.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-CwJ48yiB.mjs → BasePermissionHandler-CDCLIrZJ.mjs} +1 -1
  7. package/dist/{BasePermissionHandler-BwQHxl6M.cjs → BasePermissionHandler-COKc4pmt.cjs} +1 -1
  8. package/dist/{BaseReasoningProcessor-ClF2g1qz.mjs → BaseReasoningProcessor-BDVKvooR.mjs} +1 -1
  9. package/dist/{BaseReasoningProcessor-81lf_M8G.cjs → BaseReasoningProcessor-DAGQdkNp.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-2IbIjKCa.mjs} +4 -4
  13. package/dist/{agentHome-D3Nn82kI.cjs → agentHome-KVWj6nCl.cjs} +4 -4
  14. package/dist/{api-DTVPUE7g.mjs → api-Cmz3XS4P.mjs} +14 -12
  15. package/dist/{api-AzdzTKFs.cjs → api-DnNL5fLw.cjs} +14 -12
  16. package/dist/{apiMachine-BQ-b4Lu3.mjs → apiMachine-B6ySCFe0.mjs} +2137 -65
  17. package/dist/{apiMachine-B_cJldfa.cjs → apiMachine-DeoQ8QbZ.cjs} +2134 -62
  18. package/dist/{attachmentContent-dzIs-wis.mjs → attachmentContent-CTXapi-_.mjs} +2 -2
  19. package/dist/{attachmentContent-muDCe4Gy.cjs → attachmentContent-DPWxHgX4.cjs} +2 -2
  20. package/dist/{attachmentLimits-eJZ4ZBjF.cjs → attachmentLimits-BfgKV5iE.cjs} +28 -2
  21. package/dist/{attachmentLimits-B8nzhw-i.mjs → attachmentLimits-C1PCCM79.mjs} +28 -2
  22. package/dist/{auth-Jtmvh1w4.mjs → auth-BMaBjRAj.mjs} +8 -8
  23. package/dist/{auth-DtP-B4gf.cjs → auth-D4-eQz85.cjs} +8 -8
  24. package/dist/{auth-CfLd3phE.cjs → auth-ietHtvwu.cjs} +5 -5
  25. package/dist/{auth-BY5ujhGn.mjs → auth-pzWIFdOD.mjs} +5 -5
  26. package/dist/{auto-DjWfR1UB.mjs → auto-DL75Dx3I.mjs} +83 -21
  27. package/dist/{auto-ClNnbSoF.cjs → auto-DOWTQDPa.cjs} +84 -20
  28. package/dist/{bootstrap-B1dMZA-u.cjs → bootstrap-BpXIc2wn.cjs} +2 -2
  29. package/dist/{bootstrap-D_ExGrY2.mjs → bootstrap-XE8A7Ut2.mjs} +2 -2
  30. package/dist/{browser-_gV7tcPs.cjs → browser-CcG8GLRV.cjs} +1 -1
  31. package/dist/{browser-mwzpOmcw.mjs → browser-DDFi1T8C.mjs} +1 -1
  32. package/dist/{claudeLocal-G5UmJ81F.cjs → claudeLocal-DXBXwIOG.cjs} +6 -6
  33. package/dist/{claudeLocal-BeHToEK5.mjs → claudeLocal-DmM5Oyhv.mjs} +6 -6
  34. package/dist/{claudeLocalLauncher-B4y2BsmO.cjs → claudeLocalLauncher-C41Y6Kp4.cjs} +14 -11
  35. package/dist/{claudeLocalLauncher-Cq6bqAT4.mjs → claudeLocalLauncher-Cs4eUC3P.mjs} +14 -11
  36. package/dist/{claudeSessionFork-CokUhS4r.mjs → claudeSessionFork-BdLnc2Hv.mjs} +1 -1
  37. package/dist/{claudeSessionFork-CDJq_b9r.cjs → claudeSessionFork-Cs0I3eGI.cjs} +1 -1
  38. package/dist/{client-BwaWdlCm.mjs → client-CbK33y_s.mjs} +3 -3
  39. package/dist/{client-uN9d6Git.cjs → client-DJ0kX_8M.cjs} +2 -2
  40. package/dist/{client-CJZKBZCE.mjs → client-GjTnsq6F.mjs} +2 -2
  41. package/dist/{client-Do7cGPEq.cjs → client-JISJx2f-.cjs} +3 -3
  42. package/dist/codex/happyMcpStdioBridge.cjs +23 -18
  43. package/dist/codex/happyMcpStdioBridge.mjs +22 -17
  44. package/dist/{codexAppServerClient-BuSdeUxT.cjs → codexAppServerClient-BTjn2ZCZ.cjs} +46 -2
  45. package/dist/{codexAppServerClient-B0QaMQsC.mjs → codexAppServerClient-CldXEojt.mjs} +47 -3
  46. package/dist/{codexCommand-YdYmykAR.cjs → codexCommand-BpD0N1F7.cjs} +71 -51
  47. package/dist/{codexCommand-C3gdjMAw.mjs → codexCommand-DjMU-Ijf.mjs} +71 -51
  48. package/dist/{config-CGCIFRCN.mjs → config-DjSJKatx.mjs} +3 -3
  49. package/dist/{config-ChoHFnfO.cjs → config-DuLL0Ppe.cjs} +3 -3
  50. package/dist/{configuration-BE61XNsg.cjs → configuration-B0cb3xA3.cjs} +1 -1
  51. package/dist/{configuration-L1qcGTFM.mjs → configuration-D2v3puap.mjs} +1 -1
  52. package/dist/{connect-D5IKfcfd.cjs → connect-B7JWEzyg.cjs} +13 -13
  53. package/dist/{connect-CFD0Em6a.mjs → connect-CnNNyM9I.mjs} +13 -13
  54. package/dist/{context-3WVw8qPz.cjs → context-BFUpYT39.cjs} +1 -1
  55. package/dist/{context-DaCCB4cm.mjs → context-DjfqLWzE.mjs} +1 -1
  56. package/dist/{controlClient-Ci7HTMII.mjs → controlClient-BMUJfUeF.mjs} +13 -6
  57. package/dist/{controlClient-RWTlQA4_.cjs → controlClient-CmnHGcyl.cjs} +13 -5
  58. package/dist/{createSessionMetadata-CWR-AB2A.mjs → createSessionMetadata-DU0bCg2m.mjs} +2 -2
  59. package/dist/{createSessionMetadata-CPGTztXP.cjs → createSessionMetadata-DbfRBhRu.cjs} +2 -2
  60. package/dist/{deterministicJson-BBwG-Ase.mjs → deterministicJson-D-WPUrZb.mjs} +36 -52
  61. package/dist/{deterministicJson-C4Jo2RWy.cjs → deterministicJson-Dp3TVyap.cjs} +41 -59
  62. package/dist/{doctor-CAC6qY9Z.mjs → doctor-BlXXyQ1L.mjs} +6 -6
  63. package/dist/{doctor-ZOQLE5AH.cjs → doctor-CkJmdPbi.cjs} +6 -6
  64. package/dist/{assistantTools-BsrG3PD-.cjs → downloadTarget-CiQqRIc-.cjs} +44 -6
  65. package/dist/{assistantTools-DPGga5lM.mjs → downloadTarget-DjSwMHun.mjs} +45 -8
  66. package/dist/{ensureDaemonRunning-b1pvEFcS.mjs → ensureDaemonRunning-CAQag1zE.mjs} +5 -5
  67. package/dist/{ensureDaemonRunning-mIgX2vnc.cjs → ensureDaemonRunning-C_aIOhgG.cjs} +5 -5
  68. package/dist/{handleResumeCommand-DGNhbv-3.cjs → handleResumeCommand-6KzBGDnl.cjs} +5 -5
  69. package/dist/{handleResumeCommand-CTGbZkCL.mjs → handleResumeCommand-Ci7wacT-.mjs} +5 -5
  70. package/dist/{index-vVWpCoTr.mjs → index-B0HEEYGh.mjs} +22 -5
  71. package/dist/{index-DqlyNgt4.cjs → index-C9hI8a10.cjs} +26 -4
  72. package/dist/{index-BzIxE0Eu.cjs → index-CaFCAlX8.cjs} +3 -3
  73. package/dist/{index-DrSPR59N.cjs → index-DBmNwMX9.cjs} +39 -38
  74. package/dist/{index-DIodyAqF.cjs → index-DEKIgZUo.cjs} +4 -4
  75. package/dist/{index-Diu6HdWH.mjs → index-DQplgo0W.mjs} +4 -4
  76. package/dist/{index-BgzjPv07.mjs → index-HQsigW_J.mjs} +3 -3
  77. package/dist/{index-DjtBengz.mjs → index-WGCT6SSV.mjs} +40 -39
  78. package/dist/index.cjs +2 -2
  79. package/dist/index.mjs +2 -2
  80. package/dist/{install-BO_W7VhL.mjs → install-BdvKiOQw.mjs} +2 -0
  81. package/dist/{install-DrUQk2DJ.cjs → install-CejEiRGW.cjs} +3 -3
  82. package/dist/{install-Cs5qAPrB.cjs → install-Cf6AFSWC.cjs} +2 -0
  83. package/dist/{install-Cp_aB-NQ.mjs → install-oJUvsFu9.mjs} +3 -3
  84. package/dist/lib.cjs +12 -12
  85. package/dist/lib.d.cts +55 -2
  86. package/dist/lib.d.mts +55 -2
  87. package/dist/lib.mjs +12 -12
  88. package/dist/{lidState-BLHLmhwd.mjs → lidState-BfximpjX.mjs} +1 -1
  89. package/dist/{lidState-z9ekRpZu.cjs → lidState-D8BmnJV1.cjs} +1 -1
  90. package/dist/{localHappyAgentAuth-BWvmc_Hg.mjs → localHappyAgentAuth-Ct1aXwqd.mjs} +1 -1
  91. package/dist/{localHappyAgentAuth-BCx0y1qW.cjs → localHappyAgentAuth-d7B6S_o7.cjs} +1 -1
  92. package/dist/{logger-CknSVkIe.mjs → logger-BpQcwNnt.mjs} +2 -2
  93. package/dist/{logger-D0hkk7Vo.cjs → logger-JTcJU-uL.cjs} +2 -2
  94. package/dist/{machineMetadata-BDCYOXQg.cjs → machineMetadata-BBg_Njw3.cjs} +3 -3
  95. package/dist/{machineMetadata-Cj1DoFot.mjs → machineMetadata-CBdxABeI.mjs} +3 -3
  96. package/dist/{main-CKUfkVG_.mjs → main-B5b1gA3K.mjs} +44 -44
  97. package/dist/{main-COAPGIso.cjs → main-C16fOGgn.cjs} +44 -44
  98. package/dist/{mcp-BILnw4si.cjs → mcp-BnNiBBax.cjs} +24 -19
  99. package/dist/{mcp-DeYUfpo8.mjs → mcp-DGNWgVdv.mjs} +23 -18
  100. package/dist/{mirrorProtocol-BUtmg1ws.cjs → mirrorProtocol-BEGk2--0.cjs} +80 -0
  101. package/dist/{mirrorProtocol-BNLtoWjO.mjs → mirrorProtocol-h5WHpdhh.mjs} +79 -1
  102. package/dist/{package-VIUXrYZ1.mjs → package-BqwrPxL0.mjs} +7 -7
  103. package/dist/{package-UkmvSFsg.cjs → package-C1XvUQFy.cjs} +7 -7
  104. package/dist/{peerTools-SWITnkqz.mjs → peerTools-CeCe-3lk.mjs} +4 -4
  105. package/dist/{peerTools-CttfOxti.cjs → peerTools-DPvbcs8V.cjs} +4 -4
  106. package/dist/{persistence-C6ztVW1W.cjs → persistence-2Xp_o6x6.cjs} +3 -3
  107. package/dist/{persistence-DujtUH94.mjs → persistence-B9LmhAE2.mjs} +3 -3
  108. package/dist/{piRunnerArgs-BVJHIjlk.mjs → piRunnerArgs-7FaTyNOq.mjs} +1 -1
  109. package/dist/{piRunnerArgs-tBQg6xDw.cjs → piRunnerArgs-DI29dDNo.cjs} +1 -1
  110. package/dist/{piRuntime-DKFA8u8t.mjs → piRuntime-0qEK5AqE.mjs} +1 -1
  111. package/dist/{piRuntime-DZzjF9It.cjs → piRuntime-R8XVChxK.cjs} +1 -1
  112. package/dist/{piTerminal-t5pQHCPT.cjs → piTerminal-Ccj0KNPr.cjs} +17 -17
  113. package/dist/{piTerminal-BTSaFlpV.mjs → piTerminal-zcQKc8Sp.mjs} +17 -17
  114. package/dist/precheckCompat-CWOi5c9L.cjs +29 -0
  115. package/dist/precheckCompat-DeEbilbr.mjs +26 -0
  116. package/dist/rateLimitWindows-C2Jk3Ih7.cjs +258 -0
  117. package/dist/rateLimitWindows-Dhfhbtqu.mjs +248 -0
  118. package/dist/{registerCommonHandlers--8ds2auE.cjs → registerCommonHandlers-Aha_KfM3.cjs} +2 -2
  119. package/dist/{registerCommonHandlers-BR0J4g64.mjs → registerCommonHandlers-DdfGsFbM.mjs} +2 -2
  120. package/dist/{registerKillSessionHandler-CI23l8aJ.cjs → registerKillSessionHandler-CjitOpUA.cjs} +6 -6
  121. package/dist/{registerKillSessionHandler-Czz0tdki.mjs → registerKillSessionHandler-DboQlGcH.mjs} +6 -6
  122. package/dist/{remoteSessionClient-DCAUHgPz.mjs → remoteSessionClient-B2DtWuNP.mjs} +5 -5
  123. package/dist/{remoteSessionClient-BAkIwM2S.cjs → remoteSessionClient-BwI8rpQw.cjs} +5 -5
  124. package/dist/{tools-mWqsE6ji.cjs → reportProgressTool-B-Rcy0s3.cjs} +73 -9
  125. package/dist/{tools-BVRoGcQH.mjs → reportProgressTool-DnAD8wOa.mjs} +67 -10
  126. package/dist/{run-CkKujjn8.cjs → run-Bh66Xs40.cjs} +268 -118
  127. package/dist/{run-B75qm2I6.mjs → run-DPEwJpQR.mjs} +266 -116
  128. package/dist/{runClaude-B1T9DLLi.cjs → runClaude-C-lJdAKD.cjs} +25 -20
  129. package/dist/{runClaude-aBfBweec.mjs → runClaude-DLr_nBzw.mjs} +25 -20
  130. package/dist/{runClaudeDeps-BOrPP4J1.mjs → runClaudeDeps-C7JV7nXG.mjs} +47 -37
  131. package/dist/{runClaudeDeps-BGjNGfuZ.cjs → runClaudeDeps-vWWLod7J.cjs} +44 -35
  132. package/dist/{runGemini-BuAA_OQb.cjs → runGemini-o-CUSayc.cjs} +42 -35
  133. package/dist/{runGemini-a-V7JE-J.mjs → runGemini-tH6sLw-G.mjs} +42 -35
  134. package/dist/{runOpenClaw-DUSwXg1A.mjs → runOpenClaw-C5DZvVhn.mjs} +18 -18
  135. package/dist/{runOpenClaw-BBVffIh9.cjs → runOpenClaw-D24f35l0.cjs} +18 -18
  136. package/dist/{sandbox-Brb_5wzc.mjs → sandbox-BaL1aslA.mjs} +4 -4
  137. package/dist/{sandbox-Fd2G5yaq.cjs → sandbox-TJZJ6ngw.cjs} +4 -4
  138. package/dist/selfCheck-DPi4lqme.mjs +84 -0
  139. package/dist/{selfCheck-NuJKMInJ.cjs → selfCheck-Dugi0Nk_.cjs} +34 -34
  140. package/dist/{send-4dgHKC3u.cjs → send-CkWOSYmU.cjs} +8 -8
  141. package/dist/{send-DEQJiq_x.mjs → send-DDcJ3ayi.mjs} +8 -8
  142. package/dist/{server-DWGcDmHG.cjs → server-7qFQ8J2u.cjs} +6 -6
  143. package/dist/{server-C6AlUFkw.mjs → server-CUjRvQSd.mjs} +4 -4
  144. package/dist/{sessionLock-B1GgaO1q.cjs → sessionLock-DfhNICyS.cjs} +2 -2
  145. package/dist/{sessionLock-Dm8QyGo4.mjs → sessionLock-DqVyHFAQ.mjs} +2 -2
  146. package/dist/{sessionModeFile-BvOEJ4Fl.cjs → sessionModeFile-CIznKD7O.cjs} +1 -1
  147. package/dist/{sessionModeFile-CuNAWCKL.mjs → sessionModeFile-M4OpiyrF.mjs} +1 -1
  148. package/dist/{sessionOps-DG5MMEp_.mjs → sessionOps-BnaEaOKs.mjs} +4 -4
  149. package/dist/{sessionOps-JP64uJmc.cjs → sessionOps-DOyy4gkY.cjs} +4 -4
  150. package/dist/{sessionScanner-DqSk5Ol_.mjs → sessionScanner-CcuOn9uU.mjs} +75 -19
  151. package/dist/{sessionScanner-BBPEgJ5S.cjs → sessionScanner-Cu1yKlj4.cjs} +75 -19
  152. package/dist/{sessions-DgJuw_i0.cjs → sessions-BQgk5Kw8.cjs} +9 -9
  153. package/dist/{sessions-4isbBAWi.mjs → sessions-C9O91rL1.mjs} +9 -9
  154. package/dist/{setupOfflineReconnection-_MoZtsro.mjs → setupOfflineReconnection-Byy8aeKT.mjs} +2 -2
  155. package/dist/{setupOfflineReconnection-CKJKVIUS.cjs → setupOfflineReconnection-DFmQ8s6I.cjs} +2 -2
  156. package/dist/{spawn-CshERWbY.cjs → spawn-BS7LPmSm.cjs} +13 -12
  157. package/dist/{spawn-BTOG4tTm.mjs → spawn-EZ2yrtWd.mjs} +13 -12
  158. package/dist/{spawnAgents-Czi2VDzj.mjs → spawnAgents-HDaE3C0-.mjs} +1 -1
  159. package/dist/{spawnAgents-McixdtV1.cjs → spawnAgents-vglexX9N.cjs} +1 -1
  160. package/dist/{spawnHappyCLI-Dc4xYm8P.mjs → spawnHappyCLI-BAa49m0q.mjs} +1 -1
  161. package/dist/{spawnHappyCLI-Dd5_8Vex.cjs → spawnHappyCLI-DyaldIe5.cjs} +1 -1
  162. package/dist/specialCommands-CCWtwIGZ.mjs +93 -0
  163. package/dist/specialCommands-DouFaJ_0.cjs +96 -0
  164. package/dist/{startFileWatcher-1LedLBY-.cjs → startFileWatcher-DQbbypJv.cjs} +1 -1
  165. package/dist/{startFileWatcher-B0VlG-Fn.mjs → startFileWatcher-Dfs4whzr.mjs} +1 -1
  166. package/dist/{streamRelay-C0AffuX6.cjs → streamRelay-Ce9sgcOV.cjs} +1 -1
  167. package/dist/{streamRelay-BzMEEvJU.mjs → streamRelay-Iogsh51a.mjs} +1 -1
  168. package/dist/{sync-Dfm6K2te.mjs → sync-BLpH13Kb.mjs} +1 -1
  169. package/dist/{sync-DwUUGGFz.cjs → sync-x_lI_3j_.cjs} +1 -1
  170. package/dist/{systemPrompt-CB1Ls0AE.cjs → systemPrompt-4erwILTB.cjs} +3 -3
  171. package/dist/{systemPrompt-D41Zw1a3.mjs → systemPrompt-BanyDihy.mjs} +3 -3
  172. package/dist/{teams-D8Ly3i6u.mjs → teams-D6BOT3lR.mjs} +7 -7
  173. package/dist/{teams-NWv2ji16.cjs → teams-DzetlGWC.cjs} +7 -7
  174. package/dist/{time-v1Y_qEJp.mjs → time-CfDKj6Bx.mjs} +1 -1
  175. package/dist/{time-BbzJ7PJQ.cjs → time-T0YmeOhS.cjs} +1 -1
  176. package/dist/{titleGenerator-BhoblAQY.mjs → titleGenerator-ChImQ4q-.mjs} +1 -1
  177. package/dist/{titleGenerator-cH6IkPRi.cjs → titleGenerator-CoMxqKfP.cjs} +2 -2
  178. package/dist/{todo-D1hgWV6d.cjs → todo-CZZebKZg.cjs} +6 -6
  179. package/dist/{todo-CuNct-fw.mjs → todo-SVtYxGON.mjs} +6 -6
  180. package/dist/{tools-jof0Bu54.mjs → tools-3X2z3YDe.mjs} +1 -1
  181. package/dist/{tools-c2fb0CF5.cjs → tools-IJ0TAcJs.cjs} +1 -1
  182. package/dist/transcriptCursor-B7T_gkQ0.mjs +102 -0
  183. package/dist/transcriptCursor-DcXGLeSc.cjs +106 -0
  184. package/dist/{uninstall-VPH5GfrA.cjs → uninstall-CqqCWj7w.cjs} +3 -3
  185. package/dist/{uninstall-BB7WYYAk.mjs → uninstall-CypD-kr1.mjs} +3 -3
  186. package/package.json +7 -7
  187. package/scripts/terminal_status_forwarder.cjs +89 -0
  188. package/dist/selfCheck-BgwJ3NGS.mjs +0 -84
  189. package/dist/specialCommands-BSqhYg5X.mjs +0 -52
  190. package/dist/specialCommands-DSsTeRej.cjs +0 -54
@@ -0,0 +1,106 @@
1
+ 'use strict';
2
+
3
+ var promises = require('node:fs/promises');
4
+ var path = require('node:path');
5
+
6
+ const TRANSCRIPT_BOUNDARY_BYTES = 64;
7
+ function planTranscriptRead(cursor, stat) {
8
+ if (!cursor) return { start: 0, reset: null, verifyAt: null };
9
+ if (cursor.dev !== stat.dev || cursor.ino !== stat.ino) return { start: 0, reset: "replaced", verifyAt: null };
10
+ if (stat.size < cursor.offset) return { start: 0, reset: "truncated", verifyAt: null };
11
+ if (cursor.boundary.length === 0) return { start: cursor.offset, reset: null, verifyAt: null };
12
+ return { start: cursor.offset, reset: null, verifyAt: cursor.offset - cursor.boundary.length };
13
+ }
14
+ function advanceTranscriptCursor(previous, stat, start, bytes) {
15
+ const lastNewline = bytes.lastIndexOf(10);
16
+ const consumed = lastNewline === -1 ? 0 : lastNewline + 1;
17
+ const lines = consumed === 0 ? [] : bytes.subarray(0, consumed).toString("utf-8").split("\n").filter((line) => line.trim().length > 0);
18
+ const carried = previous && start === previous.offset ? previous.boundary : Buffer.alloc(0);
19
+ const tail = Buffer.concat([carried, bytes.subarray(0, consumed)]);
20
+ return {
21
+ lines,
22
+ cursor: {
23
+ offset: start + consumed,
24
+ dev: stat.dev,
25
+ ino: stat.ino,
26
+ boundary: Buffer.from(tail.subarray(Math.max(0, tail.length - TRANSCRIPT_BOUNDARY_BYTES)))
27
+ }
28
+ };
29
+ }
30
+ async function readTranscriptIncrement(path, cursor, opts = {}) {
31
+ let handle;
32
+ try {
33
+ handle = await promises.open(path, "r");
34
+ } catch {
35
+ return null;
36
+ }
37
+ try {
38
+ const st = await handle.stat();
39
+ const stat = { dev: st.dev, ino: st.ino, size: st.size };
40
+ let { start, reset, verifyAt } = planTranscriptRead(cursor, stat);
41
+ if (verifyAt !== null && cursor) {
42
+ const probe = Buffer.alloc(cursor.boundary.length);
43
+ const { bytesRead: bytesRead2 } = await handle.read(probe, 0, probe.length, verifyAt);
44
+ if (bytesRead2 !== probe.length || !probe.equals(cursor.boundary)) {
45
+ start = 0;
46
+ reset = "rewritten";
47
+ }
48
+ }
49
+ const base = reset ? null : cursor;
50
+ const end = opts.limit === void 0 ? stat.size : Math.min(stat.size, Math.max(0, opts.limit));
51
+ const length = Math.max(0, end - start);
52
+ if (length === 0) {
53
+ return { lines: [], cursor: base ? { ...base, dev: stat.dev, ino: stat.ino } : advanceTranscriptCursor(null, stat, 0, Buffer.alloc(0)).cursor, reset };
54
+ }
55
+ const buffer = Buffer.alloc(length);
56
+ const { bytesRead } = await handle.read(buffer, 0, length, start);
57
+ const { lines, cursor: next } = advanceTranscriptCursor(base, stat, start, buffer.subarray(0, bytesRead));
58
+ return { lines, cursor: next, reset };
59
+ } finally {
60
+ await handle.close().catch(() => void 0);
61
+ }
62
+ }
63
+ function isValidTranscriptHint(sessionId, path$1) {
64
+ return typeof path$1 === "string" && path$1.length > 0 && path$1.length <= 4096 && path.isAbsolute(path$1) && path.basename(path$1) === `${sessionId}.jsonl`;
65
+ }
66
+ class TranscriptPathHints {
67
+ constructor(max = 64) {
68
+ this.max = max;
69
+ }
70
+ paths = /* @__PURE__ */ new Map();
71
+ listeners = /* @__PURE__ */ new Set();
72
+ /** Called synchronously whenever a session's hinted path is set/changed. */
73
+ subscribe(listener) {
74
+ this.listeners.add(listener);
75
+ return () => {
76
+ this.listeners.delete(listener);
77
+ };
78
+ }
79
+ note(sessionId, path) {
80
+ if (!isValidTranscriptHint(sessionId, path)) return false;
81
+ const changed = this.paths.get(sessionId) !== path;
82
+ this.paths.delete(sessionId);
83
+ this.paths.set(sessionId, path);
84
+ if (changed) {
85
+ for (const listener of this.listeners) {
86
+ try {
87
+ listener(sessionId, path);
88
+ } catch {
89
+ }
90
+ }
91
+ }
92
+ while (this.paths.size > this.max) {
93
+ const oldest = this.paths.keys().next().value;
94
+ if (oldest === void 0) break;
95
+ this.paths.delete(oldest);
96
+ }
97
+ return true;
98
+ }
99
+ get(sessionId) {
100
+ return this.paths.get(sessionId);
101
+ }
102
+ }
103
+
104
+ exports.TranscriptPathHints = TranscriptPathHints;
105
+ exports.isValidTranscriptHint = isValidTranscriptHint;
106
+ exports.readTranscriptIncrement = readTranscriptIncrement;
@@ -1,15 +1,15 @@
1
1
  'use strict';
2
2
 
3
- var logger = require('./logger-D0hkk7Vo.cjs');
3
+ var logger = require('./logger-JTcJU-uL.cjs');
4
4
  var fs = require('fs');
5
5
  var child_process = require('child_process');
6
6
  require('chalk');
7
7
  require('node:util');
8
- require('./configuration-BE61XNsg.cjs');
8
+ require('./configuration-B0cb3xA3.cjs');
9
9
  require('node:fs');
10
10
  require('node:os');
11
11
  require('node:path');
12
- require('./package-UkmvSFsg.cjs');
12
+ require('./package-C1XvUQFy.cjs');
13
13
  require('node:fs/promises');
14
14
 
15
15
  const PLIST_LABEL = "com.happy-cli.daemon";
@@ -1,13 +1,13 @@
1
- import { l as logger } from './logger-CknSVkIe.mjs';
1
+ import { l as logger } from './logger-BpQcwNnt.mjs';
2
2
  import { existsSync, unlinkSync } from 'fs';
3
3
  import { execSync } from 'child_process';
4
4
  import 'chalk';
5
5
  import 'node:util';
6
- import './configuration-L1qcGTFM.mjs';
6
+ import './configuration-D2v3puap.mjs';
7
7
  import 'node:fs';
8
8
  import 'node:os';
9
9
  import 'node:path';
10
- import './package-VIUXrYZ1.mjs';
10
+ import './package-BqwrPxL0.mjs';
11
11
  import 'node:fs/promises';
12
12
 
13
13
  const PLIST_LABEL = "com.happy-cli.daemon";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "very-happy-cli",
3
- "version": "0.2.165",
3
+ "version": "0.2.166",
4
4
  "description": "Remote multi-agent workspace CLI with deep Claude integration, native terminal streaming, and self-hosting.",
5
5
  "author": "Kirill Dubovitskiy",
6
6
  "contributors": [
@@ -117,12 +117,12 @@
117
117
  "zod": "^4.0.0"
118
118
  },
119
119
  "optionalDependencies": {
120
- "very-happy-tools-arm64-darwin": "0.2.165",
121
- "very-happy-tools-x64-darwin": "0.2.165",
122
- "very-happy-tools-arm64-linux": "0.2.165",
123
- "very-happy-tools-x64-linux": "0.2.165",
124
- "very-happy-tools-arm64-win32": "0.2.165",
125
- "very-happy-tools-x64-win32": "0.2.165"
120
+ "very-happy-tools-arm64-darwin": "0.2.166",
121
+ "very-happy-tools-x64-darwin": "0.2.166",
122
+ "very-happy-tools-arm64-linux": "0.2.166",
123
+ "very-happy-tools-x64-linux": "0.2.166",
124
+ "very-happy-tools-arm64-win32": "0.2.166",
125
+ "very-happy-tools-x64-win32": "0.2.166"
126
126
  },
127
127
  "devDependencies": {
128
128
  "@slopus/happy-wire": "workspace:*",
@@ -0,0 +1,89 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Terminal Status Hook Forwarder (B-547)
4
+ *
5
+ * Wired ONLY through the per-terminal `--settings` file the daemon writes
6
+ * when it types a `claude …` command into a vh web terminal (never into the
7
+ * user's ~/.claude/settings.json). Usage, as built by terminalHookCommand():
8
+ *
9
+ * node terminal_status_forwarder.cjs <terminalId> <happyHome> <claudePid>
10
+ *
11
+ * Reads claude's hook JSON from stdin, keeps a small whitelist of fields
12
+ * (no prompt text, no tool input/output, no assistant text — the prompt is
13
+ * reduced to a short hash used only as a turn identity), and POSTs it to the
14
+ * daemon's /terminal-agent-hook with the control token from daemon.state.json.
15
+ *
16
+ * Contract with claude: write NOTHING to stdout (PermissionRequest /
17
+ * UserPromptSubmit treat stdout as a decision / extra context) and always
18
+ * exit 0. Every failure is silent.
19
+ */
20
+
21
+ const http = require('http');
22
+ const fs = require('fs');
23
+ const path = require('path');
24
+ const crypto = require('crypto');
25
+
26
+ const [terminalId, happyHome, claudePid] = process.argv.slice(2);
27
+ if (!terminalId || !/^[A-Za-z0-9_-]{1,64}$/.test(terminalId) || !happyHome) process.exit(0);
28
+
29
+ let port = null;
30
+ let controlToken = null;
31
+ try {
32
+ const state = JSON.parse(fs.readFileSync(path.join(happyHome, 'daemon.state.json'), 'utf-8'));
33
+ if (state && typeof state.httpPort === 'number') port = state.httpPort;
34
+ if (state && typeof state.controlToken === 'string') controlToken = state.controlToken;
35
+ } catch {
36
+ // no daemon → nothing to report to
37
+ }
38
+
39
+ const FIELDS = [
40
+ 'hook_event_name', 'session_id', 'transcript_path', 'cwd', 'prompt_id', 'agent_id',
41
+ 'source', 'notification_type', 'trigger', 'reason', 'tool_name',
42
+ ];
43
+
44
+ const chunks = [];
45
+ process.stdin.on('data', (chunk) => chunks.push(chunk));
46
+ process.stdin.on('end', () => {
47
+ if (!port) process.exit(0);
48
+ let input = {};
49
+ try {
50
+ input = JSON.parse(Buffer.concat(chunks).toString('utf-8'));
51
+ } catch {
52
+ process.exit(0);
53
+ }
54
+ if (!input || typeof input !== 'object') process.exit(0);
55
+ const payload = { terminalId };
56
+ for (const key of FIELDS) {
57
+ if (typeof input[key] === 'string' && input[key].length <= 4096) payload[key] = input[key];
58
+ }
59
+ if (claudePid && /^\d{1,10}$/.test(claudePid)) payload.claudePid = Number(claudePid);
60
+ if (typeof input.prompt === 'string') {
61
+ payload.promptHash = crypto.createHash('sha256').update(input.prompt).digest('hex').slice(0, 16);
62
+ }
63
+ // Older Claude Notification payloads carry no notification_type.
64
+ if (input.hook_event_name === 'Notification' && typeof input.notification_type !== 'string'
65
+ && typeof input.message === 'string' && /permission/i.test(input.message)) {
66
+ payload.permissionHint = true;
67
+ }
68
+ const body = Buffer.from(JSON.stringify(payload));
69
+ const req = http.request({
70
+ host: '127.0.0.1',
71
+ port,
72
+ method: 'POST',
73
+ path: '/terminal-agent-hook',
74
+ timeout: 2000,
75
+ headers: {
76
+ 'Content-Type': 'application/json',
77
+ 'Content-Length': body.length,
78
+ ...(controlToken ? { Authorization: `Bearer ${controlToken}` } : {}),
79
+ },
80
+ }, (res) => {
81
+ res.resume();
82
+ res.on('end', () => process.exit(0));
83
+ });
84
+ req.on('timeout', () => req.destroy());
85
+ req.on('error', () => process.exit(0));
86
+ req.end(body);
87
+ });
88
+ process.stdin.on('error', () => process.exit(0));
89
+ process.stdin.resume();
@@ -1,84 +0,0 @@
1
- import { p as packageJson } from './package-VIUXrYZ1.mjs';
2
-
3
- const LAZY_MODULES = [
4
- // Entry
5
- ["main", () => import('./main-CKUfkVG_.mjs')],
6
- ["selfCheck", () => Promise.resolve().then(function () { return selfCheck; })],
7
- // Subcommands (main.ts)
8
- ["api/api", () => import('./api-DTVPUE7g.mjs').then(function (n) { return n.b; })],
9
- ["claude/claudeCliPath", () => import('./claudeCliPath-BqkaH2oR.mjs')],
10
- ["claude/runClaude", () => import('./runClaude-aBfBweec.mjs')],
11
- ["commands/agentHome", () => import('./agentHome-DvR176E5.mjs')],
12
- ["commands/auth", () => import('./auth-Jtmvh1w4.mjs')],
13
- ["commands/auto", () => import('./auto-DjWfR1UB.mjs')],
14
- ["commands/codexCommand", () => import('./codexCommand-C3gdjMAw.mjs')],
15
- ["commands/connect", () => import('./connect-CFD0Em6a.mjs')],
16
- ["commands/installPiTools", () => import('./installPiTools-B_CdM5_2.mjs')],
17
- ["commands/installTerminalHooks", () => import('./installTerminalHooks-By7gBMEF.mjs')],
18
- ["commands/mcp", () => import('./mcp-DeYUfpo8.mjs')],
19
- ["commands/piTerminal", () => import('./piTerminal-BTSaFlpV.mjs')],
20
- ["commands/sandbox", () => import('./sandbox-Brb_5wzc.mjs')],
21
- ["commands/send", () => import('./send-DEQJiq_x.mjs')],
22
- ["commands/server", () => import('./server-C6AlUFkw.mjs')],
23
- ["commands/sessions", () => import('./sessions-4isbBAWi.mjs')],
24
- ["commands/spawn", () => import('./spawn-BTOG4tTm.mjs')],
25
- ["commands/teams", () => import('./teams-D8Ly3i6u.mjs')],
26
- ["commands/todo", () => import('./todo-CuNct-fw.mjs')],
27
- ["daemon/doctor", () => import('./doctor-BPkYWSuq.mjs')],
28
- ["daemon/install", () => import('./install-Cp_aB-NQ.mjs')],
29
- ["daemon/run", () => import('./run-B75qm2I6.mjs')],
30
- ["daemon/uninstall", () => import('./uninstall-BB7WYYAk.mjs')],
31
- ["resume/handleResumeCommand", () => import('./handleResumeCommand-CTGbZkCL.mjs')],
32
- ["ui/doctor", () => import('./doctor-CAC6qY9Z.mjs').then(function (n) { return n.d; })],
33
- ["agent/acp", () => import('./index-DjtBengz.mjs')],
34
- ["gemini/runGemini", () => import('./runGemini-a-V7JE-J.mjs')],
35
- ["gemini/utils/config", () => import('./config-CGCIFRCN.mjs')],
36
- ["openclaw/runOpenClaw", () => import('./runOpenClaw-DUSwXg1A.mjs')],
37
- ["persistence", () => import('./persistence-DujtUH94.mjs')],
38
- // Deferred halves of the runners and clients
39
- ["api/apiMachine", () => import('./apiMachine-BQ-b4Lu3.mjs')],
40
- ["claude/runClaudeDeps", () => import('./runClaudeDeps-BOrPP4J1.mjs')],
41
- ["claude/claudeLocal", () => import('./claudeLocal-BeHToEK5.mjs')],
42
- ["claude/claudeLocalLauncher", () => import('./claudeLocalLauncher-Cq6bqAT4.mjs')],
43
- ["claude/sdk", () => import('./index-B6UGRQ7h.mjs')],
44
- ["assistant/bootstrap", () => import('./bootstrap-D_ExGrY2.mjs')],
45
- ["agentHome", () => import('./index-Diu6HdWH.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,52 +0,0 @@
1
- function parseCompact(message) {
2
- const trimmed = message.trim();
3
- if (trimmed === "/compact") {
4
- return {
5
- isCompact: true,
6
- originalMessage: trimmed
7
- };
8
- }
9
- if (trimmed.startsWith("/compact ")) {
10
- return {
11
- isCompact: true,
12
- originalMessage: trimmed
13
- };
14
- }
15
- return {
16
- isCompact: false,
17
- originalMessage: message
18
- };
19
- }
20
- function parseClear(message) {
21
- const trimmed = message.trim();
22
- return {
23
- isClear: trimmed === "/clear"
24
- };
25
- }
26
- function parseSpecialCommand(message) {
27
- const compactResult = parseCompact(message);
28
- if (compactResult.isCompact) {
29
- return {
30
- type: "compact",
31
- originalMessage: compactResult.originalMessage
32
- };
33
- }
34
- const clearResult = parseClear(message);
35
- if (clearResult.isClear) {
36
- return {
37
- type: "clear"
38
- };
39
- }
40
- const trimmed = message.trim().toLowerCase();
41
- if (trimmed === "/mcp") {
42
- return { type: "mcp" };
43
- }
44
- if (trimmed === "/skills") {
45
- return { type: "skills" };
46
- }
47
- return {
48
- type: null
49
- };
50
- }
51
-
52
- export { parseSpecialCommand as p };
@@ -1,54 +0,0 @@
1
- 'use strict';
2
-
3
- function parseCompact(message) {
4
- const trimmed = message.trim();
5
- if (trimmed === "/compact") {
6
- return {
7
- isCompact: true,
8
- originalMessage: trimmed
9
- };
10
- }
11
- if (trimmed.startsWith("/compact ")) {
12
- return {
13
- isCompact: true,
14
- originalMessage: trimmed
15
- };
16
- }
17
- return {
18
- isCompact: false,
19
- originalMessage: message
20
- };
21
- }
22
- function parseClear(message) {
23
- const trimmed = message.trim();
24
- return {
25
- isClear: trimmed === "/clear"
26
- };
27
- }
28
- function parseSpecialCommand(message) {
29
- const compactResult = parseCompact(message);
30
- if (compactResult.isCompact) {
31
- return {
32
- type: "compact",
33
- originalMessage: compactResult.originalMessage
34
- };
35
- }
36
- const clearResult = parseClear(message);
37
- if (clearResult.isClear) {
38
- return {
39
- type: "clear"
40
- };
41
- }
42
- const trimmed = message.trim().toLowerCase();
43
- if (trimmed === "/mcp") {
44
- return { type: "mcp" };
45
- }
46
- if (trimmed === "/skills") {
47
- return { type: "skills" };
48
- }
49
- return {
50
- type: null
51
- };
52
- }
53
-
54
- exports.parseSpecialCommand = parseSpecialCommand;