very-happy-cli 0.2.166 → 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 (178) hide show
  1. package/dist/{AcpBackend-20VHOXwb.cjs → AcpBackend-D1IKJGz_.cjs} +3 -3
  2. package/dist/{AcpBackend-tRWk7yi7.mjs → AcpBackend-kFZlee5E.mjs} +3 -3
  3. package/dist/{BasePermissionHandler-COKc4pmt.cjs → BasePermissionHandler-DHxYAK5L.cjs} +1 -1
  4. package/dist/{BasePermissionHandler-CDCLIrZJ.mjs → BasePermissionHandler-DS0kRTNI.mjs} +1 -1
  5. package/dist/{BaseReasoningProcessor-BDVKvooR.mjs → BaseReasoningProcessor-BRtCCt7q.mjs} +1 -1
  6. package/dist/{BaseReasoningProcessor-DAGQdkNp.cjs → BaseReasoningProcessor-CsjVdt_H.cjs} +1 -1
  7. package/dist/{agentHome-2IbIjKCa.mjs → agentHome-Ct-VXFeG.mjs} +4 -4
  8. package/dist/{agentHome-KVWj6nCl.cjs → agentHome-DeAWzhSe.cjs} +4 -4
  9. package/dist/{api-DnNL5fLw.cjs → api-BZYLRDM9.cjs} +88 -10
  10. package/dist/{api-Cmz3XS4P.mjs → api-CReZazeT.mjs} +88 -10
  11. package/dist/{apiMachine-DeoQ8QbZ.cjs → apiMachine-BgMxGPsR.cjs} +50 -15
  12. package/dist/{apiMachine-B6ySCFe0.mjs → apiMachine-CWndf1Vn.mjs} +50 -15
  13. package/dist/{attachmentContent-DPWxHgX4.cjs → attachmentContent-HcJqFQW8.cjs} +2 -2
  14. package/dist/{attachmentContent-CTXapi-_.mjs → attachmentContent-j875mwU7.mjs} +2 -2
  15. package/dist/{attachmentLimits-BfgKV5iE.cjs → attachmentLimits-BEYEEBm8.cjs} +13 -1
  16. package/dist/{attachmentLimits-C1PCCM79.mjs → attachmentLimits-CxG3T18E.mjs} +13 -1
  17. package/dist/{auth-BMaBjRAj.mjs → auth-BIHuc7vY.mjs} +10 -10
  18. package/dist/{auth-pzWIFdOD.mjs → auth-CFS9Lfgv.mjs} +5 -5
  19. package/dist/{auth-D4-eQz85.cjs → auth-Myr2Q42x.cjs} +10 -10
  20. package/dist/{auth-ietHtvwu.cjs → auth-VzWpbo5P.cjs} +5 -5
  21. package/dist/{auto-DOWTQDPa.cjs → auto-Bf6Dr7_o.cjs} +14 -14
  22. package/dist/{auto-DL75Dx3I.mjs → auto-Df9-zmuN.mjs} +14 -14
  23. package/dist/{bootstrap-XE8A7Ut2.mjs → bootstrap-BSOxYpaP.mjs} +2 -2
  24. package/dist/{bootstrap-BpXIc2wn.cjs → bootstrap-Dj8WBiR2.cjs} +2 -2
  25. package/dist/{browser-DDFi1T8C.mjs → browser-BCFIHOvo.mjs} +1 -1
  26. package/dist/{browser-CcG8GLRV.cjs → browser-BoCV40yC.cjs} +1 -1
  27. package/dist/{claudeLocal-DXBXwIOG.cjs → claudeLocal-CGsq7Kul.cjs} +5 -5
  28. package/dist/{claudeLocal-DmM5Oyhv.mjs → claudeLocal-D5-eA9SC.mjs} +5 -5
  29. package/dist/{claudeLocalLauncher-Cs4eUC3P.mjs → claudeLocalLauncher-C9Cc438l.mjs} +10 -10
  30. package/dist/{claudeLocalLauncher-C41Y6Kp4.cjs → claudeLocalLauncher-Cf9QeYDT.cjs} +10 -10
  31. package/dist/{claudeSessionFork-Cs0I3eGI.cjs → claudeSessionFork-Byd8zD1U.cjs} +1 -1
  32. package/dist/{claudeSessionFork-BdLnc2Hv.mjs → claudeSessionFork-CMzAva8G.mjs} +1 -1
  33. package/dist/{client-JISJx2f-.cjs → client-BKnKRLSt.cjs} +3 -3
  34. package/dist/{client-GjTnsq6F.mjs → client-C7FYMer0.mjs} +2 -2
  35. package/dist/{client-DJ0kX_8M.cjs → client-D0T5-6Ds.cjs} +2 -2
  36. package/dist/{client-CbK33y_s.mjs → client-Dsfy_SAb.mjs} +3 -3
  37. package/dist/codex/happyMcpStdioBridge.cjs +14 -14
  38. package/dist/codex/happyMcpStdioBridge.mjs +14 -14
  39. package/dist/{codexAppServerClient-CldXEojt.mjs → codexAppServerClient-Dd_4TxHv.mjs} +4 -4
  40. package/dist/{codexAppServerClient-BTjn2ZCZ.cjs → codexAppServerClient-TiW9OBk4.cjs} +4 -4
  41. package/dist/{codexCommand-DjMU-Ijf.mjs → codexCommand-BZSr4MKI.mjs} +137 -56
  42. package/dist/{codexCommand-BpD0N1F7.cjs → codexCommand-Bxryqh90.cjs} +137 -56
  43. package/dist/{config-DjSJKatx.mjs → config-C_Pj7yxV.mjs} +3 -3
  44. package/dist/{config-DuLL0Ppe.cjs → config-DXPash-r.cjs} +3 -3
  45. package/dist/{configuration-B0cb3xA3.cjs → configuration-C3piBtxY.cjs} +1 -1
  46. package/dist/{configuration-D2v3puap.mjs → configuration-WspKd2C2.mjs} +2 -2
  47. package/dist/{connect-B7JWEzyg.cjs → connect-BN-IBElA.cjs} +13 -13
  48. package/dist/{connect-CnNNyM9I.mjs → connect-DGPZs5px.mjs} +13 -13
  49. package/dist/{context-DjfqLWzE.mjs → context-Cr6a3NTg.mjs} +1 -1
  50. package/dist/{context-BFUpYT39.cjs → context-Jrq4-eCZ.cjs} +1 -1
  51. package/dist/{controlClient-CmnHGcyl.cjs → controlClient-BI6Fw3fQ.cjs} +18 -3
  52. package/dist/{controlClient-BMUJfUeF.mjs → controlClient-DTheOlvC.mjs} +18 -4
  53. package/dist/{createSessionMetadata-DU0bCg2m.mjs → createSessionMetadata-BEZ4DIDA.mjs} +57 -5
  54. package/dist/{createSessionMetadata-DbfRBhRu.cjs → createSessionMetadata-zQSz3hgk.cjs} +56 -3
  55. package/dist/defaultPermissionMode-Cif_RHGb.mjs +191 -0
  56. package/dist/defaultPermissionMode-DNKNzk7l.cjs +197 -0
  57. package/dist/{deterministicJson-D-WPUrZb.mjs → deterministicJson-BMMifViN.mjs} +8 -8
  58. package/dist/{deterministicJson-Dp3TVyap.cjs → deterministicJson-C7O2ulKY.cjs} +8 -8
  59. package/dist/{doctor-CkJmdPbi.cjs → doctor-BykBaMTr.cjs} +6 -6
  60. package/dist/{doctor-BlXXyQ1L.mjs → doctor-D1KKyPzB.mjs} +6 -6
  61. package/dist/{downloadTarget-CiQqRIc-.cjs → downloadTarget-CWTb2-EM.cjs} +6 -6
  62. package/dist/{downloadTarget-DjSwMHun.mjs → downloadTarget-Cp48jrIP.mjs} +6 -6
  63. package/dist/{ensureDaemonRunning-CAQag1zE.mjs → ensureDaemonRunning-Ba5fYoxb.mjs} +5 -5
  64. package/dist/{ensureDaemonRunning-C_aIOhgG.cjs → ensureDaemonRunning-CCxX7MoP.cjs} +5 -5
  65. package/dist/{handleResumeCommand-Ci7wacT-.mjs → handleResumeCommand-BTUGlNjB.mjs} +5 -5
  66. package/dist/{handleResumeCommand-6KzBGDnl.cjs → handleResumeCommand-yPdDQHqz.cjs} +5 -5
  67. package/dist/{index-CaFCAlX8.cjs → index-BjhKqDa0.cjs} +3 -3
  68. package/dist/{index-HQsigW_J.mjs → index-C3_83bqS.mjs} +3 -3
  69. package/dist/{index-WGCT6SSV.mjs → index-CE2GgPbr.mjs} +34 -34
  70. package/dist/{index-DQplgo0W.mjs → index-D8m8Ripb.mjs} +4 -4
  71. package/dist/{index-DBmNwMX9.cjs → index-DifM62wX.cjs} +33 -33
  72. package/dist/{index-DEKIgZUo.cjs → index-PNMQPKhz.cjs} +4 -4
  73. package/dist/index.cjs +2 -2
  74. package/dist/index.mjs +2 -2
  75. package/dist/{install-oJUvsFu9.mjs → install-C0-QFn9s.mjs} +3 -3
  76. package/dist/{install-CejEiRGW.cjs → install-CqZVeze8.cjs} +3 -3
  77. package/dist/lib.cjs +11 -11
  78. package/dist/lib.d.cts +61 -0
  79. package/dist/lib.d.mts +61 -0
  80. package/dist/lib.mjs +11 -11
  81. package/dist/{lidState-BfximpjX.mjs → lidState-B2ZxdREe.mjs} +1 -1
  82. package/dist/{lidState-D8BmnJV1.cjs → lidState-Bc2K9H9l.cjs} +1 -1
  83. package/dist/{localHappyAgentAuth-Ct1aXwqd.mjs → localHappyAgentAuth-B5XPEMwk.mjs} +1 -1
  84. package/dist/{localHappyAgentAuth-d7B6S_o7.cjs → localHappyAgentAuth-T5GOvRha.cjs} +1 -1
  85. package/dist/{logger-JTcJU-uL.cjs → logger-B_MWPbZz.cjs} +2 -2
  86. package/dist/{logger-BpQcwNnt.mjs → logger-CbBv3q_b.mjs} +2 -2
  87. package/dist/{machineMetadata-BBg_Njw3.cjs → machineMetadata-BafS4JY8.cjs} +4 -3
  88. package/dist/{machineMetadata-CBdxABeI.mjs → machineMetadata-DHg238U4.mjs} +4 -3
  89. package/dist/{main-C16fOGgn.cjs → main-DNrA0qBy.cjs} +45 -45
  90. package/dist/{main-B5b1gA3K.mjs → main-DXAK0n7x.mjs} +45 -45
  91. package/dist/{manager-BQ4flvQZ.mjs → manager-BEsI4qt3.mjs} +9 -3
  92. package/dist/{manager-Cly8xVIR.cjs → manager-HrEj442o.cjs} +8 -2
  93. package/dist/{mcp-BnNiBBax.cjs → mcp-AvPOhDXy.cjs} +14 -14
  94. package/dist/{mcp-DGNWgVdv.mjs → mcp-BotAjCdD.mjs} +14 -14
  95. package/dist/mirrorProtocol-BdcN6QlN.cjs +1270 -0
  96. package/dist/mirrorProtocol-BwHm8odn.mjs +1247 -0
  97. package/dist/{package-C1XvUQFy.cjs → package-C9ZP9bpX.cjs} +7 -7
  98. package/dist/{package-BqwrPxL0.mjs → package-DU1DxhH9.mjs} +7 -7
  99. package/dist/{peerTools-DPvbcs8V.cjs → peerTools-Dkbu7gag.cjs} +4 -4
  100. package/dist/{peerTools-CeCe-3lk.mjs → peerTools-os2DVjA0.mjs} +4 -4
  101. package/dist/{persistence-2Xp_o6x6.cjs → persistence-BYGl0QYw.cjs} +147 -25
  102. package/dist/{persistence-B9LmhAE2.mjs → persistence-ON0zpHfb.mjs} +123 -12
  103. package/dist/{piRunnerArgs-7FaTyNOq.mjs → piRunnerArgs-CYsnT9sV.mjs} +1 -1
  104. package/dist/{piRunnerArgs-DI29dDNo.cjs → piRunnerArgs-DpbvstUX.cjs} +1 -1
  105. package/dist/{piRuntime-R8XVChxK.cjs → piRuntime-CDnILlCd.cjs} +1 -1
  106. package/dist/{piRuntime-0qEK5AqE.mjs → piRuntime-CmEid-wu.mjs} +1 -1
  107. package/dist/{piTerminal-zcQKc8Sp.mjs → piTerminal-0eNlXSlL.mjs} +16 -16
  108. package/dist/{piTerminal-Ccj0KNPr.cjs → piTerminal-B57TgMON.cjs} +16 -16
  109. package/dist/{rateLimitWindows-C2Jk3Ih7.cjs → rateLimitWindows-CusGIqlq.cjs} +1 -1
  110. package/dist/{rateLimitWindows-Dhfhbtqu.mjs → rateLimitWindows-vZ9Bo7aT.mjs} +1 -1
  111. package/dist/{registerCommonHandlers-DdfGsFbM.mjs → registerCommonHandlers-B0PVff2U.mjs} +2 -2
  112. package/dist/{registerCommonHandlers-Aha_KfM3.cjs → registerCommonHandlers-DVYB3iVn.cjs} +2 -2
  113. package/dist/{registerKillSessionHandler-DboQlGcH.mjs → registerKillSessionHandler-BJMHJHXe.mjs} +14 -9
  114. package/dist/{registerKillSessionHandler-CjitOpUA.cjs → registerKillSessionHandler-BwXGKtg_.cjs} +14 -9
  115. package/dist/{remoteSessionClient-B2DtWuNP.mjs → remoteSessionClient-BzPXSC21.mjs} +5 -5
  116. package/dist/{remoteSessionClient-BwI8rpQw.cjs → remoteSessionClient-PyUAIhwK.cjs} +5 -5
  117. package/dist/{reportProgressTool-DnAD8wOa.mjs → reportProgressTool-BvB13EwC.mjs} +1 -1
  118. package/dist/{reportProgressTool-B-Rcy0s3.cjs → reportProgressTool-D4KB_4cP.cjs} +1 -1
  119. package/dist/{run-Bh66Xs40.cjs → run-BC8jzq_h.cjs} +323 -37
  120. package/dist/{run-DPEwJpQR.mjs → run-O2M8LsWf.mjs} +322 -36
  121. package/dist/{runClaude-C-lJdAKD.cjs → runClaude-C7jPa8VP.cjs} +87 -25
  122. package/dist/{runClaude-DLr_nBzw.mjs → runClaude-DGkr5E7s.mjs} +87 -25
  123. package/dist/{runClaudeDeps-vWWLod7J.cjs → runClaudeDeps-5kzncqME.cjs} +100 -31
  124. package/dist/{runClaudeDeps-C7JV7nXG.mjs → runClaudeDeps-CX_TxS78.mjs} +105 -36
  125. package/dist/{runGemini-o-CUSayc.cjs → runGemini-BfYA4Uqc.cjs} +32 -32
  126. package/dist/{runGemini-tH6sLw-G.mjs → runGemini-CwmGBH3L.mjs} +32 -32
  127. package/dist/{runOpenClaw-C5DZvVhn.mjs → runOpenClaw-BYAPYFyL.mjs} +16 -16
  128. package/dist/{runOpenClaw-D24f35l0.cjs → runOpenClaw-C72jut7v.cjs} +16 -16
  129. package/dist/{sandbox-TJZJ6ngw.cjs → sandbox-Bqkp8IT7.cjs} +4 -4
  130. package/dist/{sandbox-BaL1aslA.mjs → sandbox-DlVnK1Vi.mjs} +4 -4
  131. package/dist/{selfCheck-Dugi0Nk_.cjs → selfCheck-B4lLZplk.cjs} +34 -34
  132. package/dist/selfCheck-DYTGBdIO.mjs +84 -0
  133. package/dist/{send-DDcJ3ayi.mjs → send-B5bWW9Tl.mjs} +8 -8
  134. package/dist/{send-CkWOSYmU.cjs → send-BCwS6n_s.cjs} +8 -8
  135. package/dist/{server-CUjRvQSd.mjs → server-CEJfRQfj.mjs} +4 -4
  136. package/dist/{server-7qFQ8J2u.cjs → server-CFWZehnC.cjs} +6 -6
  137. package/dist/{sessionLock-DqVyHFAQ.mjs → sessionLock-AwOYsKT7.mjs} +12 -4
  138. package/dist/{sessionLock-DfhNICyS.cjs → sessionLock-LBWNjpHf.cjs} +12 -3
  139. package/dist/{sessionModeFile-CIznKD7O.cjs → sessionModeFile-CyPuZRIU.cjs} +1 -1
  140. package/dist/{sessionModeFile-M4OpiyrF.mjs → sessionModeFile-fvFn1JVG.mjs} +1 -1
  141. package/dist/{sessionOps-BnaEaOKs.mjs → sessionOps-DZRH4-hV.mjs} +4 -4
  142. package/dist/{sessionOps-DOyy4gkY.cjs → sessionOps-DzbZI3Eq.cjs} +4 -4
  143. package/dist/{sessionScanner-CcuOn9uU.mjs → sessionScanner-Q_Ei2flB.mjs} +3 -3
  144. package/dist/{sessionScanner-Cu1yKlj4.cjs → sessionScanner-i-cgwFVw.cjs} +3 -3
  145. package/dist/{sessions-C9O91rL1.mjs → sessions-DAmjMAZN.mjs} +9 -9
  146. package/dist/{sessions-BQgk5Kw8.cjs → sessions-DYK5hD4T.cjs} +9 -9
  147. package/dist/{setupOfflineReconnection-Byy8aeKT.mjs → setupOfflineReconnection-BfDBxNdo.mjs} +2 -2
  148. package/dist/{setupOfflineReconnection-DFmQ8s6I.cjs → setupOfflineReconnection-C2LO3hSP.cjs} +2 -2
  149. package/dist/{spawn-EZ2yrtWd.mjs → spawn-BmjG5j5Y.mjs} +13 -13
  150. package/dist/{spawn-BS7LPmSm.cjs → spawn-GK_sXE8h.cjs} +13 -13
  151. package/dist/{spawnHappyCLI-BAa49m0q.mjs → spawnHappyCLI-B2h0P4b5.mjs} +1 -1
  152. package/dist/{spawnHappyCLI-DyaldIe5.cjs → spawnHappyCLI-J4iEhfyZ.cjs} +1 -1
  153. package/dist/{specialCommands-CCWtwIGZ.mjs → specialCommands-DisVxagO.mjs} +3 -3
  154. package/dist/{specialCommands-DouFaJ_0.cjs → specialCommands-DmJMKspE.cjs} +3 -3
  155. package/dist/{startFileWatcher-Dfs4whzr.mjs → startFileWatcher-CeK1k5gt.mjs} +1 -1
  156. package/dist/{startFileWatcher-DQbbypJv.cjs → startFileWatcher-xKo8AoYl.cjs} +1 -1
  157. package/dist/{sync-x_lI_3j_.cjs → sync-Bvc-vh6C.cjs} +1 -1
  158. package/dist/{sync-BLpH13Kb.mjs → sync-CCwYpJMS.mjs} +1 -1
  159. package/dist/{systemPrompt-BanyDihy.mjs → systemPrompt-BNIkP3tR.mjs} +1 -1
  160. package/dist/{systemPrompt-4erwILTB.cjs → systemPrompt-DwOddbuG.cjs} +1 -1
  161. package/dist/{teams-D6BOT3lR.mjs → teams-DRrLBcys.mjs} +6 -6
  162. package/dist/{teams-DzetlGWC.cjs → teams-GHMCRZOw.cjs} +6 -6
  163. package/dist/{time-T0YmeOhS.cjs → time-BXvtjhe9.cjs} +1 -1
  164. package/dist/{time-CfDKj6Bx.mjs → time-PG5Dfwdv.mjs} +1 -1
  165. package/dist/{titleGenerator-CoMxqKfP.cjs → titleGenerator-B07bZA0V.cjs} +2 -2
  166. package/dist/{titleGenerator-ChImQ4q-.mjs → titleGenerator-CIzfpfZW.mjs} +1 -1
  167. package/dist/{todo-CZZebKZg.cjs → todo-B0aeoNu3.cjs} +5 -5
  168. package/dist/{todo-SVtYxGON.mjs → todo-CfL7SBFc.mjs} +5 -5
  169. package/dist/{tools-3X2z3YDe.mjs → tools-D91mq5Ib.mjs} +1 -1
  170. package/dist/{tools-IJ0TAcJs.cjs → tools-DJIANHSh.cjs} +1 -1
  171. package/dist/{uninstall-CypD-kr1.mjs → uninstall-5xz3Xvhf.mjs} +3 -3
  172. package/dist/{uninstall-CqqCWj7w.cjs → uninstall-AtzOfdrj.cjs} +3 -3
  173. package/package.json +7 -7
  174. package/dist/defaultPermissionMode-BnxJPVHT.mjs +0 -4
  175. package/dist/defaultPermissionMode-CxmTXUQR.cjs +0 -7
  176. package/dist/mirrorProtocol-BEGk2--0.cjs +0 -266
  177. package/dist/mirrorProtocol-h5WHpdhh.mjs +0 -248
  178. package/dist/selfCheck-DPi4lqme.mjs +0 -84
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var z = require('zod');
4
- var client = require('./client-JISJx2f-.cjs');
4
+ var client = require('./client-BKnKRLSt.cjs');
5
5
 
6
6
  const TEAM_TOOL_NAMES = ["team_create", "team_join", "team_inspect", "team_delegate", "team_message", "team_submit", "team_accept", "team_return", "team_cancel", "team_handoff", "team_schedule_create", "team_schedule_pause", "team_schedule_resume", "team_schedule_cancel"];
7
7
  const id = z.z.string().min(1).max(128);
@@ -1,13 +1,13 @@
1
- import { l as logger } from './logger-BpQcwNnt.mjs';
1
+ import { l as logger } from './logger-CbBv3q_b.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-D2v3puap.mjs';
6
+ import './configuration-WspKd2C2.mjs';
7
7
  import 'node:fs';
8
8
  import 'node:os';
9
9
  import 'node:path';
10
- import './package-BqwrPxL0.mjs';
10
+ import './package-DU1DxhH9.mjs';
11
11
  import 'node:fs/promises';
12
12
 
13
13
  const PLIST_LABEL = "com.happy-cli.daemon";
@@ -1,15 +1,15 @@
1
1
  'use strict';
2
2
 
3
- var logger = require('./logger-JTcJU-uL.cjs');
3
+ var logger = require('./logger-B_MWPbZz.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-B0cb3xA3.cjs');
8
+ require('./configuration-C3piBtxY.cjs');
9
9
  require('node:fs');
10
10
  require('node:os');
11
11
  require('node:path');
12
- require('./package-C1XvUQFy.cjs');
12
+ require('./package-C9ZP9bpX.cjs');
13
13
  require('node:fs/promises');
14
14
 
15
15
  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.166",
3
+ "version": "0.2.167",
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.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"
120
+ "very-happy-tools-arm64-darwin": "0.2.167",
121
+ "very-happy-tools-x64-darwin": "0.2.167",
122
+ "very-happy-tools-arm64-linux": "0.2.167",
123
+ "very-happy-tools-x64-linux": "0.2.167",
124
+ "very-happy-tools-arm64-win32": "0.2.167",
125
+ "very-happy-tools-x64-win32": "0.2.167"
126
126
  },
127
127
  "devDependencies": {
128
128
  "@slopus/happy-wire": "workspace:*",
@@ -1,4 +0,0 @@
1
- const DEFAULT_CLAUDE_PERMISSION_MODE = "default";
2
- const DEFAULT_CODEX_PERMISSION_MODE = "default";
3
-
4
- export { DEFAULT_CLAUDE_PERMISSION_MODE as D, DEFAULT_CODEX_PERMISSION_MODE as a };
@@ -1,7 +0,0 @@
1
- 'use strict';
2
-
3
- const DEFAULT_CLAUDE_PERMISSION_MODE = "default";
4
- const DEFAULT_CODEX_PERMISSION_MODE = "default";
5
-
6
- exports.DEFAULT_CLAUDE_PERMISSION_MODE = DEFAULT_CLAUDE_PERMISSION_MODE;
7
- exports.DEFAULT_CODEX_PERMISSION_MODE = DEFAULT_CODEX_PERMISSION_MODE;
@@ -1,266 +0,0 @@
1
- 'use strict';
2
-
3
- var node_child_process = require('node:child_process');
4
- var index = require('./index-C9hI8a10.cjs');
5
- var _package = require('./package-C1XvUQFy.cjs');
6
-
7
- function summarizeSpawnSessionForLog(value) {
8
- const input = value && typeof value === "object" ? value : {};
9
- const environmentVariables = input.environmentVariables && typeof input.environmentVariables === "object" ? input.environmentVariables : {};
10
- return {
11
- ...typeof input.agent === "string" ? { agent: input.agent } : {},
12
- ...typeof input.variant === "string" ? { variant: input.variant } : {},
13
- ...typeof input.sessionId === "string" ? { sessionId: input.sessionId } : {},
14
- hasDirectory: typeof input.directory === "string" && input.directory.length > 0,
15
- hasToken: typeof input.token === "string" && input.token.length > 0,
16
- environmentVariableNames: Object.keys(environmentVariables).sort(),
17
- resumesClaude: typeof input.resumeClaudeSessionId === "string" && input.resumeClaudeSessionId.length > 0,
18
- resumesCodex: typeof input.resumeCodexThreadId === "string" && input.resumeCodexThreadId.length > 0,
19
- importsClaude: typeof input.importedFromClaudeSessionId === "string" && input.importedFromClaudeSessionId.length > 0,
20
- forceNew: input.forceNew === true,
21
- ...typeof input.permissionMode === "string" ? { permissionMode: input.permissionMode } : {}
22
- };
23
- }
24
-
25
- function sanitizeGeometry(cols, rows) {
26
- const ok = (v) => typeof v === "number" && Number.isInteger(v) && v >= 2 && v <= 1e4;
27
- return ok(cols) && ok(rows) ? { cols, rows } : void 0;
28
- }
29
- function sanitizeTagList(value) {
30
- if (!Array.isArray(value)) return void 0;
31
- const out = [];
32
- for (const tag of value) {
33
- if (typeof tag !== "string") continue;
34
- const clean = tag.trim();
35
- if (clean && !out.includes(clean)) out.push(clean);
36
- if (out.length >= 64) break;
37
- }
38
- return out;
39
- }
40
- const LIVE_SNAPSHOT_TTL_MS = 14 * 24 * 60 * 60 * 1e3;
41
- const LIVE_SNAPSHOT_MAX = 100;
42
- function sanitizeLiveSnapshot(raw, now, ttlMs = LIVE_SNAPSHOT_TTL_MS, max = LIVE_SNAPSHOT_MAX) {
43
- const out = /* @__PURE__ */ new Map();
44
- if (!raw || typeof raw !== "object" || Array.isArray(raw)) return out;
45
- const rows = [];
46
- for (const [id, value] of Object.entries(raw)) {
47
- if (!id || !value || typeof value !== "object") continue;
48
- const { title, cwd, seenAt, tags, manual, attachTmux, cols: rawCols, rows: rawRows } = value;
49
- if (typeof seenAt !== "number" || !Number.isFinite(seenAt)) continue;
50
- if (now - seenAt >= ttlMs) continue;
51
- const tagList = sanitizeTagList(tags);
52
- rows.push([id, {
53
- title: typeof title === "string" && title.trim() ? title : void 0,
54
- cwd: typeof cwd === "string" && cwd ? cwd : void 0,
55
- ...tagList !== void 0 ? { tags: tagList } : {},
56
- ...manual === true ? { manual: true } : {},
57
- ...typeof attachTmux === "string" && attachTmux ? { attachTmux } : {},
58
- ...sanitizeGeometry(rawCols, rawRows) ?? {},
59
- seenAt
60
- }]);
61
- }
62
- rows.sort((a, b) => b[1].seenAt - a[1].seenAt);
63
- for (const [id, info] of rows.slice(0, max)) out.set(id, info);
64
- return out;
65
- }
66
- function serializeLiveSnapshot(map, max = LIVE_SNAPSHOT_MAX) {
67
- const rows = [...map.entries()].sort((a, b) => b[1].seenAt - a[1].seenAt).slice(0, max);
68
- const out = {};
69
- for (const [id, info] of rows) out[id] = info;
70
- return out;
71
- }
72
- function liveSnapshotChanged(prev, next) {
73
- if (prev.size !== next.size) return true;
74
- for (const [id, info] of next) {
75
- const before = prev.get(id);
76
- if (!before) return true;
77
- if (before.title !== info.title || before.cwd !== info.cwd) return true;
78
- if (!!before.manual !== !!info.manual) return true;
79
- if ((before.attachTmux ?? "") !== (info.attachTmux ?? "")) return true;
80
- if ((before.tags ?? []).join("\0") !== (info.tags ?? []).join("\0")) return true;
81
- if (before.cols !== info.cols || before.rows !== info.rows) return true;
82
- }
83
- return false;
84
- }
85
- const CLAUDE_SESSION_ID_RE = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/;
86
- function isClaudeSessionId(value) {
87
- return typeof value === "string" && CLAUDE_SESSION_ID_RE.test(value);
88
- }
89
- function pickMirrorForTerminal(sessions, terminalId) {
90
- if (!terminalId) return null;
91
- let best = null;
92
- for (const [id, session] of Object.entries(sessions || {})) {
93
- const meta = session?.metadata;
94
- if (!meta || meta.terminalId !== terminalId) continue;
95
- const savedAt = typeof session.savedAt === "number" ? session.savedAt : 0;
96
- if (best && savedAt <= best.savedAt) continue;
97
- best = {
98
- id,
99
- savedAt,
100
- claude: isClaudeSessionId(meta.claudeSessionId) ? meta.claudeSessionId : void 0
101
- };
102
- }
103
- return best ? { sessionId: best.id, claudeSessionId: best.claude } : null;
104
- }
105
-
106
- const AGENT_CHECK_INTERVAL = 6 * 60 * 60 * 1e3;
107
- function stableVersion(value) {
108
- const match = value.trim().match(/(?:^|\s|v)(\d+\.\d+\.\d+)([-+][\w.-]+)?(?=\s|$)/);
109
- return match && !match[2] ? match[1] : null;
110
- }
111
- function newerVersion(current, latest) {
112
- const a = current.split(".").map(Number), b = latest.split(".").map(Number);
113
- for (let i = 0; i < 3; i++) {
114
- if (b[i] !== a[i]) return b[i] > a[i];
115
- }
116
- return false;
117
- }
118
- const runVersionCommand = (command, args, shell) => new Promise((resolve, reject) => {
119
- node_child_process.execFile(
120
- command,
121
- args,
122
- { timeout: 5e3, maxBuffer: 32 * 1024, windowsHide: true, shell },
123
- (error, stdout) => error ? reject(error) : resolve(stdout)
124
- );
125
- });
126
- async function probeAgentVersion(command, platform = process.platform, run = runVersionCommand) {
127
- if (platform === "win32") {
128
- try {
129
- await run("where.exe", [command], false);
130
- } catch (error) {
131
- return { version: null, missing: error.code === 1 };
132
- }
133
- }
134
- try {
135
- return { version: stableVersion(await run(command, ["--version"], platform === "win32")), missing: false };
136
- } catch (error) {
137
- return { version: null, missing: error.code === "ENOENT" };
138
- }
139
- }
140
- async function registryVersion(name) {
141
- const response = await fetch(`https://registry.npmjs.org/${encodeURIComponent(name)}/latest`, { signal: AbortSignal.timeout(5e3) });
142
- if (!response.ok) throw new Error("Registry unavailable");
143
- const data = await response.json();
144
- return typeof data.version === "string" ? stableVersion(data.version) : null;
145
- }
146
- async function detectAgentVersions(deps = { probe: probeAgentVersion, registryVersion }, now = Date.now()) {
147
- const agents = await Promise.all(index.AGENT_VERSION_SOURCES.map(async (source) => {
148
- const local = source.command ? await deps.probe(source.command).catch(() => ({ version: null, missing: false })) : { version: stableVersion(_package.packageJson.dependencies["@anthropic-ai/claude-agent-sdk"]), missing: false };
149
- if (local.missing) return { id: source.id, installed: null, latest: null, status: "not-installed" };
150
- const latest = await deps.registryVersion(source.package).catch(() => null);
151
- const installed = local.version;
152
- const status = !installed || !latest ? "unknown" : newerVersion(installed, latest) ? "update-available" : "current";
153
- return { id: source.id, installed, latest, status };
154
- }));
155
- return { checkedAt: now, daemonPid: process.pid, agents };
156
- }
157
- function startAgentVersionChecks(publish, onError, detect = detectAgentVersions) {
158
- let stopped = false, pending = false;
159
- async function refresh() {
160
- if (stopped || pending) return;
161
- pending = true;
162
- try {
163
- const snapshot = await detect();
164
- if (!stopped) await publish(snapshot);
165
- } catch (error) {
166
- onError(error);
167
- } finally {
168
- pending = false;
169
- }
170
- }
171
- void refresh();
172
- const timer = setInterval(() => void refresh(), AGENT_CHECK_INTERVAL);
173
- timer.unref();
174
- return () => {
175
- stopped = true;
176
- clearInterval(timer);
177
- };
178
- }
179
-
180
- function parseTerminalHookPayload(body) {
181
- if (!body || typeof body !== "object") return null;
182
- const raw = body;
183
- const eventName = raw.hook_event_name;
184
- if (eventName !== "SessionStart" && eventName !== "SessionEnd") return null;
185
- const claudeSessionId = typeof raw.session_id === "string" && raw.session_id.length > 0 ? raw.session_id : typeof raw.sessionId === "string" && raw.sessionId.length > 0 ? raw.sessionId : null;
186
- if (!claudeSessionId) return null;
187
- const terminalId = typeof raw.terminalId === "string" && raw.terminalId.length > 0 ? raw.terminalId : null;
188
- if (!terminalId) return null;
189
- return {
190
- event: eventName,
191
- claudeSessionId,
192
- terminalId,
193
- transcriptPath: typeof raw.transcript_path === "string" && raw.transcript_path.length > 0 ? raw.transcript_path : void 0,
194
- cwd: typeof raw.cwd === "string" && raw.cwd.length > 0 ? raw.cwd : void 0,
195
- source: typeof raw.source === "string" && raw.source.length > 0 ? raw.source : void 0
196
- };
197
- }
198
- const FRESH_CONVERSATION_SOURCES = /* @__PURE__ */ new Set(["startup", "clear"]);
199
- function decideMirrorBinding(event, binding) {
200
- if (event.event === "SessionEnd") {
201
- if (!binding) return { action: "ignore", reason: "no binding for terminal" };
202
- if (binding.claudeSessionId !== event.claudeSessionId) {
203
- return { action: "ignore", reason: "stale SessionEnd for a superseded claude session" };
204
- }
205
- if (binding.status === "ended") return { action: "ignore", reason: "already ended" };
206
- return { action: "end" };
207
- }
208
- if (!binding) return { action: "create" };
209
- if (binding.status === "active" && binding.claudeSessionId === event.claudeSessionId) {
210
- return { action: "ignore", reason: "duplicate SessionStart for the bound session" };
211
- }
212
- if (FRESH_CONVERSATION_SOURCES.has(event.source ?? "startup")) {
213
- return { action: "create", replaces: binding };
214
- }
215
- return { action: "continue" };
216
- }
217
- function mirrorLineKey(message) {
218
- if (message.type === "summary") return `summary-${message.leafUuid}`;
219
- if (message.type === "user" || message.type === "assistant" || message.type === "system") {
220
- return message.uuid;
221
- }
222
- return null;
223
- }
224
- function mirrorLocalId(lineKey, envelopeIndex) {
225
- return `mirror:${lineKey}:${envelopeIndex}`;
226
- }
227
- function extractCompleteLines(buf) {
228
- const lastNl = buf.lastIndexOf(10);
229
- if (lastNl === -1) return { lines: [], consumedBytes: 0 };
230
- const text = buf.subarray(0, lastNl).toString("utf-8");
231
- const lines = text.split("\n").filter((l) => l.trim().length > 0);
232
- return { lines, consumedBytes: lastNl + 1 };
233
- }
234
- const MIRROR_SEND_MAX_CHARS = 16384;
235
- function parseMirrorSendParams(params, isValidTerminalId) {
236
- if (!params || typeof params !== "object") return { error: "invalid params" };
237
- const { terminalId, text, submit } = params;
238
- if (!isValidTerminalId(terminalId)) return { error: "invalid terminalId" };
239
- if (typeof text !== "string" || text.length === 0) return { error: "text is required" };
240
- if (text.length > MIRROR_SEND_MAX_CHARS) return { error: `text too long (max ${MIRROR_SEND_MAX_CHARS} chars)` };
241
- return { terminalId, text, submit: submit !== false };
242
- }
243
- const MIRROR_BACKFILL_LINES_DEFAULT = 500;
244
- function decideBackfill(messages, maxLines) {
245
- const cap = Math.max(0, Math.floor(maxLines));
246
- if (messages.length <= cap) return { replay: messages, truncated: false };
247
- return { replay: messages.slice(messages.length - cap), truncated: true };
248
- }
249
-
250
- exports.MIRROR_BACKFILL_LINES_DEFAULT = MIRROR_BACKFILL_LINES_DEFAULT;
251
- exports.decideBackfill = decideBackfill;
252
- exports.decideMirrorBinding = decideMirrorBinding;
253
- exports.extractCompleteLines = extractCompleteLines;
254
- exports.isClaudeSessionId = isClaudeSessionId;
255
- exports.liveSnapshotChanged = liveSnapshotChanged;
256
- exports.mirrorLineKey = mirrorLineKey;
257
- exports.mirrorLocalId = mirrorLocalId;
258
- exports.parseMirrorSendParams = parseMirrorSendParams;
259
- exports.parseTerminalHookPayload = parseTerminalHookPayload;
260
- exports.pickMirrorForTerminal = pickMirrorForTerminal;
261
- exports.sanitizeLiveSnapshot = sanitizeLiveSnapshot;
262
- exports.sanitizeTagList = sanitizeTagList;
263
- exports.serializeLiveSnapshot = serializeLiveSnapshot;
264
- exports.stableVersion = stableVersion;
265
- exports.startAgentVersionChecks = startAgentVersionChecks;
266
- exports.summarizeSpawnSessionForLog = summarizeSpawnSessionForLog;
@@ -1,248 +0,0 @@
1
- import { execFile } from 'node:child_process';
2
- import { p as AGENT_VERSION_SOURCES } from './index-B0HEEYGh.mjs';
3
- import { p as packageJson } from './package-BqwrPxL0.mjs';
4
-
5
- function summarizeSpawnSessionForLog(value) {
6
- const input = value && typeof value === "object" ? value : {};
7
- const environmentVariables = input.environmentVariables && typeof input.environmentVariables === "object" ? input.environmentVariables : {};
8
- return {
9
- ...typeof input.agent === "string" ? { agent: input.agent } : {},
10
- ...typeof input.variant === "string" ? { variant: input.variant } : {},
11
- ...typeof input.sessionId === "string" ? { sessionId: input.sessionId } : {},
12
- hasDirectory: typeof input.directory === "string" && input.directory.length > 0,
13
- hasToken: typeof input.token === "string" && input.token.length > 0,
14
- environmentVariableNames: Object.keys(environmentVariables).sort(),
15
- resumesClaude: typeof input.resumeClaudeSessionId === "string" && input.resumeClaudeSessionId.length > 0,
16
- resumesCodex: typeof input.resumeCodexThreadId === "string" && input.resumeCodexThreadId.length > 0,
17
- importsClaude: typeof input.importedFromClaudeSessionId === "string" && input.importedFromClaudeSessionId.length > 0,
18
- forceNew: input.forceNew === true,
19
- ...typeof input.permissionMode === "string" ? { permissionMode: input.permissionMode } : {}
20
- };
21
- }
22
-
23
- function sanitizeGeometry(cols, rows) {
24
- const ok = (v) => typeof v === "number" && Number.isInteger(v) && v >= 2 && v <= 1e4;
25
- return ok(cols) && ok(rows) ? { cols, rows } : void 0;
26
- }
27
- function sanitizeTagList(value) {
28
- if (!Array.isArray(value)) return void 0;
29
- const out = [];
30
- for (const tag of value) {
31
- if (typeof tag !== "string") continue;
32
- const clean = tag.trim();
33
- if (clean && !out.includes(clean)) out.push(clean);
34
- if (out.length >= 64) break;
35
- }
36
- return out;
37
- }
38
- const LIVE_SNAPSHOT_TTL_MS = 14 * 24 * 60 * 60 * 1e3;
39
- const LIVE_SNAPSHOT_MAX = 100;
40
- function sanitizeLiveSnapshot(raw, now, ttlMs = LIVE_SNAPSHOT_TTL_MS, max = LIVE_SNAPSHOT_MAX) {
41
- const out = /* @__PURE__ */ new Map();
42
- if (!raw || typeof raw !== "object" || Array.isArray(raw)) return out;
43
- const rows = [];
44
- for (const [id, value] of Object.entries(raw)) {
45
- if (!id || !value || typeof value !== "object") continue;
46
- const { title, cwd, seenAt, tags, manual, attachTmux, cols: rawCols, rows: rawRows } = value;
47
- if (typeof seenAt !== "number" || !Number.isFinite(seenAt)) continue;
48
- if (now - seenAt >= ttlMs) continue;
49
- const tagList = sanitizeTagList(tags);
50
- rows.push([id, {
51
- title: typeof title === "string" && title.trim() ? title : void 0,
52
- cwd: typeof cwd === "string" && cwd ? cwd : void 0,
53
- ...tagList !== void 0 ? { tags: tagList } : {},
54
- ...manual === true ? { manual: true } : {},
55
- ...typeof attachTmux === "string" && attachTmux ? { attachTmux } : {},
56
- ...sanitizeGeometry(rawCols, rawRows) ?? {},
57
- seenAt
58
- }]);
59
- }
60
- rows.sort((a, b) => b[1].seenAt - a[1].seenAt);
61
- for (const [id, info] of rows.slice(0, max)) out.set(id, info);
62
- return out;
63
- }
64
- function serializeLiveSnapshot(map, max = LIVE_SNAPSHOT_MAX) {
65
- const rows = [...map.entries()].sort((a, b) => b[1].seenAt - a[1].seenAt).slice(0, max);
66
- const out = {};
67
- for (const [id, info] of rows) out[id] = info;
68
- return out;
69
- }
70
- function liveSnapshotChanged(prev, next) {
71
- if (prev.size !== next.size) return true;
72
- for (const [id, info] of next) {
73
- const before = prev.get(id);
74
- if (!before) return true;
75
- if (before.title !== info.title || before.cwd !== info.cwd) return true;
76
- if (!!before.manual !== !!info.manual) return true;
77
- if ((before.attachTmux ?? "") !== (info.attachTmux ?? "")) return true;
78
- if ((before.tags ?? []).join("\0") !== (info.tags ?? []).join("\0")) return true;
79
- if (before.cols !== info.cols || before.rows !== info.rows) return true;
80
- }
81
- return false;
82
- }
83
- const CLAUDE_SESSION_ID_RE = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/;
84
- function isClaudeSessionId(value) {
85
- return typeof value === "string" && CLAUDE_SESSION_ID_RE.test(value);
86
- }
87
- function pickMirrorForTerminal(sessions, terminalId) {
88
- if (!terminalId) return null;
89
- let best = null;
90
- for (const [id, session] of Object.entries(sessions || {})) {
91
- const meta = session?.metadata;
92
- if (!meta || meta.terminalId !== terminalId) continue;
93
- const savedAt = typeof session.savedAt === "number" ? session.savedAt : 0;
94
- if (best && savedAt <= best.savedAt) continue;
95
- best = {
96
- id,
97
- savedAt,
98
- claude: isClaudeSessionId(meta.claudeSessionId) ? meta.claudeSessionId : void 0
99
- };
100
- }
101
- return best ? { sessionId: best.id, claudeSessionId: best.claude } : null;
102
- }
103
-
104
- const AGENT_CHECK_INTERVAL = 6 * 60 * 60 * 1e3;
105
- function stableVersion(value) {
106
- const match = value.trim().match(/(?:^|\s|v)(\d+\.\d+\.\d+)([-+][\w.-]+)?(?=\s|$)/);
107
- return match && !match[2] ? match[1] : null;
108
- }
109
- function newerVersion(current, latest) {
110
- const a = current.split(".").map(Number), b = latest.split(".").map(Number);
111
- for (let i = 0; i < 3; i++) {
112
- if (b[i] !== a[i]) return b[i] > a[i];
113
- }
114
- return false;
115
- }
116
- const runVersionCommand = (command, args, shell) => new Promise((resolve, reject) => {
117
- execFile(
118
- command,
119
- args,
120
- { timeout: 5e3, maxBuffer: 32 * 1024, windowsHide: true, shell },
121
- (error, stdout) => error ? reject(error) : resolve(stdout)
122
- );
123
- });
124
- async function probeAgentVersion(command, platform = process.platform, run = runVersionCommand) {
125
- if (platform === "win32") {
126
- try {
127
- await run("where.exe", [command], false);
128
- } catch (error) {
129
- return { version: null, missing: error.code === 1 };
130
- }
131
- }
132
- try {
133
- return { version: stableVersion(await run(command, ["--version"], platform === "win32")), missing: false };
134
- } catch (error) {
135
- return { version: null, missing: error.code === "ENOENT" };
136
- }
137
- }
138
- async function registryVersion(name) {
139
- const response = await fetch(`https://registry.npmjs.org/${encodeURIComponent(name)}/latest`, { signal: AbortSignal.timeout(5e3) });
140
- if (!response.ok) throw new Error("Registry unavailable");
141
- const data = await response.json();
142
- return typeof data.version === "string" ? stableVersion(data.version) : null;
143
- }
144
- async function detectAgentVersions(deps = { probe: probeAgentVersion, registryVersion }, now = Date.now()) {
145
- const agents = await Promise.all(AGENT_VERSION_SOURCES.map(async (source) => {
146
- const local = source.command ? await deps.probe(source.command).catch(() => ({ version: null, missing: false })) : { version: stableVersion(packageJson.dependencies["@anthropic-ai/claude-agent-sdk"]), missing: false };
147
- if (local.missing) return { id: source.id, installed: null, latest: null, status: "not-installed" };
148
- const latest = await deps.registryVersion(source.package).catch(() => null);
149
- const installed = local.version;
150
- const status = !installed || !latest ? "unknown" : newerVersion(installed, latest) ? "update-available" : "current";
151
- return { id: source.id, installed, latest, status };
152
- }));
153
- return { checkedAt: now, daemonPid: process.pid, agents };
154
- }
155
- function startAgentVersionChecks(publish, onError, detect = detectAgentVersions) {
156
- let stopped = false, pending = false;
157
- async function refresh() {
158
- if (stopped || pending) return;
159
- pending = true;
160
- try {
161
- const snapshot = await detect();
162
- if (!stopped) await publish(snapshot);
163
- } catch (error) {
164
- onError(error);
165
- } finally {
166
- pending = false;
167
- }
168
- }
169
- void refresh();
170
- const timer = setInterval(() => void refresh(), AGENT_CHECK_INTERVAL);
171
- timer.unref();
172
- return () => {
173
- stopped = true;
174
- clearInterval(timer);
175
- };
176
- }
177
-
178
- function parseTerminalHookPayload(body) {
179
- if (!body || typeof body !== "object") return null;
180
- const raw = body;
181
- const eventName = raw.hook_event_name;
182
- if (eventName !== "SessionStart" && eventName !== "SessionEnd") return null;
183
- const claudeSessionId = typeof raw.session_id === "string" && raw.session_id.length > 0 ? raw.session_id : typeof raw.sessionId === "string" && raw.sessionId.length > 0 ? raw.sessionId : null;
184
- if (!claudeSessionId) return null;
185
- const terminalId = typeof raw.terminalId === "string" && raw.terminalId.length > 0 ? raw.terminalId : null;
186
- if (!terminalId) return null;
187
- return {
188
- event: eventName,
189
- claudeSessionId,
190
- terminalId,
191
- transcriptPath: typeof raw.transcript_path === "string" && raw.transcript_path.length > 0 ? raw.transcript_path : void 0,
192
- cwd: typeof raw.cwd === "string" && raw.cwd.length > 0 ? raw.cwd : void 0,
193
- source: typeof raw.source === "string" && raw.source.length > 0 ? raw.source : void 0
194
- };
195
- }
196
- const FRESH_CONVERSATION_SOURCES = /* @__PURE__ */ new Set(["startup", "clear"]);
197
- function decideMirrorBinding(event, binding) {
198
- if (event.event === "SessionEnd") {
199
- if (!binding) return { action: "ignore", reason: "no binding for terminal" };
200
- if (binding.claudeSessionId !== event.claudeSessionId) {
201
- return { action: "ignore", reason: "stale SessionEnd for a superseded claude session" };
202
- }
203
- if (binding.status === "ended") return { action: "ignore", reason: "already ended" };
204
- return { action: "end" };
205
- }
206
- if (!binding) return { action: "create" };
207
- if (binding.status === "active" && binding.claudeSessionId === event.claudeSessionId) {
208
- return { action: "ignore", reason: "duplicate SessionStart for the bound session" };
209
- }
210
- if (FRESH_CONVERSATION_SOURCES.has(event.source ?? "startup")) {
211
- return { action: "create", replaces: binding };
212
- }
213
- return { action: "continue" };
214
- }
215
- function mirrorLineKey(message) {
216
- if (message.type === "summary") return `summary-${message.leafUuid}`;
217
- if (message.type === "user" || message.type === "assistant" || message.type === "system") {
218
- return message.uuid;
219
- }
220
- return null;
221
- }
222
- function mirrorLocalId(lineKey, envelopeIndex) {
223
- return `mirror:${lineKey}:${envelopeIndex}`;
224
- }
225
- function extractCompleteLines(buf) {
226
- const lastNl = buf.lastIndexOf(10);
227
- if (lastNl === -1) return { lines: [], consumedBytes: 0 };
228
- const text = buf.subarray(0, lastNl).toString("utf-8");
229
- const lines = text.split("\n").filter((l) => l.trim().length > 0);
230
- return { lines, consumedBytes: lastNl + 1 };
231
- }
232
- const MIRROR_SEND_MAX_CHARS = 16384;
233
- function parseMirrorSendParams(params, isValidTerminalId) {
234
- if (!params || typeof params !== "object") return { error: "invalid params" };
235
- const { terminalId, text, submit } = params;
236
- if (!isValidTerminalId(terminalId)) return { error: "invalid terminalId" };
237
- if (typeof text !== "string" || text.length === 0) return { error: "text is required" };
238
- if (text.length > MIRROR_SEND_MAX_CHARS) return { error: `text too long (max ${MIRROR_SEND_MAX_CHARS} chars)` };
239
- return { terminalId, text, submit: submit !== false };
240
- }
241
- const MIRROR_BACKFILL_LINES_DEFAULT = 500;
242
- function decideBackfill(messages, maxLines) {
243
- const cap = Math.max(0, Math.floor(maxLines));
244
- if (messages.length <= cap) return { replay: messages, truncated: false };
245
- return { replay: messages.slice(messages.length - cap), truncated: true };
246
- }
247
-
248
- export { MIRROR_BACKFILL_LINES_DEFAULT as M, sanitizeTagList as a, sanitizeLiveSnapshot as b, serializeLiveSnapshot as c, summarizeSpawnSessionForLog as d, parseMirrorSendParams as e, extractCompleteLines as f, decideBackfill as g, parseTerminalHookPayload as h, isClaudeSessionId as i, decideMirrorBinding as j, mirrorLocalId as k, liveSnapshotChanged as l, mirrorLineKey as m, startAgentVersionChecks as n, pickMirrorForTerminal as p, stableVersion as s };