very-happy-cli 0.2.202 → 0.2.204

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 (222) hide show
  1. package/dist/{AcpBackend-Z51picBa.mjs → AcpBackend-BBfcpIDj.mjs} +3 -3
  2. package/dist/{AcpBackend-BRcPXur6.cjs → AcpBackend-BupxHXGp.cjs} +3 -3
  3. package/dist/{AcpSessionManager-BCGqL1Em.mjs → AcpSessionManager-B9UkPYGi.mjs} +2 -2
  4. package/dist/{AcpSessionManager-BckOYH3I.cjs → AcpSessionManager-JJrnenKM.cjs} +2 -2
  5. package/dist/{BasePermissionHandler-BYIY3kxs.cjs → BasePermissionHandler-86_xnisC.cjs} +1 -1
  6. package/dist/{BasePermissionHandler-BhJjr-wB.mjs → BasePermissionHandler-tGylJLUH.mjs} +1 -1
  7. package/dist/{account-B-HTHZKw.mjs → account-BRqUOj_D.mjs} +11 -11
  8. package/dist/{account-B0Wu7rJR.cjs → account-C91_R-kw.cjs} +11 -11
  9. package/dist/{accountService-DEpIq6CF.mjs → accountService-CqrWNH8K.mjs} +4 -4
  10. package/dist/{accountService-Cns8UYGI.cjs → accountService-SOeB_21A.cjs} +4 -4
  11. package/dist/{acpSessionResume-BKjQRT4V.mjs → acpSessionResume-CZQ91ano.mjs} +1 -1
  12. package/dist/{acpSessionResume-C8Kd8eK6.cjs → acpSessionResume-DK8EjIY0.cjs} +1 -1
  13. package/dist/{agentHome-BXiCouR4.mjs → agentHome-71zGywwx.mjs} +4 -4
  14. package/dist/{agentHome-DnxSf1ox.cjs → agentHome-BZvbPuy1.cjs} +4 -4
  15. package/dist/{api-Cu1OFHDM.mjs → api-BYh1VGBa.mjs} +107 -18
  16. package/dist/{api-B-FB-s4z.cjs → api-BoJA-zK3.cjs} +107 -18
  17. package/dist/{apiMachine-DYGPILVb.mjs → apiMachine--_eI4PTv.mjs} +105 -21
  18. package/dist/{apiMachine-DCWgI1l_.cjs → apiMachine-CA58NM_V.cjs} +105 -21
  19. package/dist/{attachmentContent-Dq8P5ODq.mjs → attachmentContent-D95cCBX5.mjs} +2 -2
  20. package/dist/{attachmentContent-dXwHB_3C.cjs → attachmentContent-y621KwMz.cjs} +2 -2
  21. package/dist/{auth-DpIHm7Lb.cjs → auth-CAkpHr8F.cjs} +5 -5
  22. package/dist/{auth-D11uvx2P.mjs → auth-DCzFx5BN.mjs} +8 -8
  23. package/dist/{auth-CgdE-j7z.mjs → auth-DRJ_WPn3.mjs} +5 -5
  24. package/dist/{auth-BVNBE4B1.cjs → auth-Dofm64Kp.cjs} +8 -8
  25. package/dist/{auto-WdjHKP9R.mjs → auto-CrgOy5OR.mjs} +18 -18
  26. package/dist/{auto-Ba2b-il4.cjs → auto-D4IBwJEE.cjs} +18 -18
  27. package/dist/{bootstrap-CsZO_jkL.cjs → bootstrap-D16MMPNP.cjs} +2 -2
  28. package/dist/{bootstrap-BTYJf2w8.mjs → bootstrap-PnL2FX64.mjs} +2 -2
  29. package/dist/{browser-Dx3UOVPP.mjs → browser-D2enJJfv.mjs} +1 -1
  30. package/dist/{browser-DgufCq1K.cjs → browser-DK2GfyEr.cjs} +1 -1
  31. package/dist/{claudeAccountEnv-Btp39mfa.cjs → claudeAccountEnv-BTZjHTpF.cjs} +1 -1
  32. package/dist/{claudeAccountEnv-DowsOlDB.mjs → claudeAccountEnv-C6Wl-ZbT.mjs} +1 -1
  33. package/dist/{claudeLocal-ylDKcvX0.mjs → claudeLocal-BbzN1qly.mjs} +5 -5
  34. package/dist/{claudeLocal-Q0FgzhTu.cjs → claudeLocal-DaqiRW9N.cjs} +5 -5
  35. package/dist/{claudeLocalLauncher-D2rZvuaW.cjs → claudeLocalLauncher-B0qbyOUc.cjs} +10 -10
  36. package/dist/{claudeLocalLauncher-CtybsaR8.mjs → claudeLocalLauncher-D7bhZ9rp.mjs} +10 -10
  37. package/dist/claudeLongContext-BR_zdjUp.cjs +239 -0
  38. package/dist/claudeLongContext-CZ60xo5p.mjs +219 -0
  39. package/dist/{claudeSessionFork-DRLxmv9j.mjs → claudeSessionFork-BPF3cpGs.mjs} +1 -1
  40. package/dist/{claudeSessionFork-BrstQPE4.cjs → claudeSessionFork-lcajftLB.cjs} +1 -1
  41. package/dist/{client-DfT_CRwl.mjs → client-BH4s6mzX.mjs} +2 -2
  42. package/dist/{client-D0oBXuEe.mjs → client-BHt14nix.mjs} +2 -2
  43. package/dist/{client-xV99weGP.cjs → client-ByK8-iRd.cjs} +3 -3
  44. package/dist/{client-CNWx72ZT.cjs → client-CqmT_ur8.cjs} +2 -2
  45. package/dist/{client-Dq7jaxb2.cjs → client-D5_YDMpA.cjs} +2 -2
  46. package/dist/{client-DJsXNJWO.mjs → client-Og5iNZ6S.mjs} +17 -8
  47. package/dist/{client-Cj7D61by.mjs → client-t1vQ7gho.mjs} +3 -3
  48. package/dist/{client-Ch4Azlny.cjs → client-xA44FUnf.cjs} +17 -8
  49. package/dist/codex/happyMcpStdioBridge.cjs +20 -19
  50. package/dist/codex/happyMcpStdioBridge.mjs +20 -19
  51. package/dist/{codexAccount-CieIQLOX.mjs → codexAccount-BPQ-lPhH.mjs} +1 -1
  52. package/dist/{codexAccount-D-OBY29W.cjs → codexAccount-BjaHvmKH.cjs} +1 -1
  53. package/dist/{codexAppServerClient-DtdCZ7_b.mjs → codexAppServerClient-CvL3eBlM.mjs} +3 -3
  54. package/dist/{codexAppServerClient-BwBPZonh.cjs → codexAppServerClient-CyLtj1kP.cjs} +3 -3
  55. package/dist/{codexCommand-CsY9YFiG.cjs → codexCommand-B0Slfvne.cjs} +67 -56
  56. package/dist/{codexCommand-D92AQCLU.mjs → codexCommand-CXytYlk9.mjs} +67 -56
  57. package/dist/{codexTermination-BbXG2oFT.cjs → codexTermination-CykPnK3G.cjs} +1 -1
  58. package/dist/{codexTermination-rhIxjRMJ.mjs → codexTermination-D0sBaTvW.mjs} +1 -1
  59. package/dist/{config-Zhkmfb3O.cjs → config-7Z5qIB3k.cjs} +3 -3
  60. package/dist/{config-BnN1yFyi.mjs → config-DeXK_5y4.mjs} +3 -3
  61. package/dist/{configuration-DZUnfWp2.cjs → configuration-CDqmWkHO.cjs} +1 -1
  62. package/dist/{configuration-CQaLZMa-.mjs → configuration-D_YrWa_i.mjs} +1 -1
  63. package/dist/{connect-DY5QLfbI.mjs → connect-CivOym_v.mjs} +13 -13
  64. package/dist/{connect-BToTf3Gy.cjs → connect-D_tzdR4l.cjs} +13 -13
  65. package/dist/{context-ByTvtMXZ.mjs → context-DXfkj_FL.mjs} +1 -1
  66. package/dist/{context-BHydzPZw.cjs → context-k2CbuBtp.cjs} +1 -1
  67. package/dist/{controlClient-Bfwe0Xpt.cjs → controlClient-BS86Ksm8.cjs} +12 -3
  68. package/dist/{controlClient-Cqhd8ynk.mjs → controlClient-Daki7wgo.mjs} +12 -4
  69. package/dist/{createSessionMetadata-D_qa01wq.cjs → createSessionMetadata-2s80RDL1.cjs} +2 -2
  70. package/dist/{createSessionMetadata-tmhDzhJZ.mjs → createSessionMetadata-B_hQ8lDn.mjs} +2 -2
  71. package/dist/{daemonAccounts-ciidbU2h.cjs → daemonAccounts-BOoI7-sw.cjs} +2 -2
  72. package/dist/{daemonAccounts-D5shoCLt.mjs → daemonAccounts-BtkmoJmC.mjs} +3 -3
  73. package/dist/{defaultPermissionMode-DgeiMMqy.mjs → defaultPermissionMode-CYQi7vqJ.mjs} +1 -1
  74. package/dist/{defaultPermissionMode-Cs_Tv83b.cjs → defaultPermissionMode-DmLYaaL8.cjs} +1 -1
  75. package/dist/{deterministicJson-DRL1Gs_c.mjs → deterministicJson-DKiOtrSA.mjs} +23 -16
  76. package/dist/{deterministicJson-CbUdClvO.cjs → deterministicJson-lwG_VzWd.cjs} +23 -16
  77. package/dist/{doctor-DHCmWcwR.cjs → doctor-C0kONAQn.cjs} +7 -7
  78. package/dist/{doctor-Wu0yZ80l.mjs → doctor-DegBfYjz.mjs} +7 -7
  79. package/dist/{downloadTarget-BoJrjpEe.cjs → downloadTarget-BTEVg8t6.cjs} +6 -6
  80. package/dist/{downloadTarget-G72yKQcM.mjs → downloadTarget-osakJyyA.mjs} +6 -6
  81. package/dist/{ensureDaemonRunning-BKGybp3s.mjs → ensureDaemonRunning-ED6UVEbk.mjs} +5 -5
  82. package/dist/{ensureDaemonRunning-CnkyGd9x.cjs → ensureDaemonRunning-vxHxmXo2.cjs} +5 -5
  83. package/dist/exitNotice-BhRrv8dx.cjs +88 -0
  84. package/dist/exitNotice-D1tMULzu.mjs +79 -0
  85. package/dist/{forkBackfill-DYIjlN1Z.mjs → forkBackfill-C9EfJ64O.mjs} +28 -2
  86. package/dist/{forkBackfill-8eLDeS73.cjs → forkBackfill-D2WW91fz.cjs} +28 -1
  87. package/dist/{format-DePME4uu.cjs → format-9KvRMdvY.cjs} +1 -1
  88. package/dist/{format-BSx-Nv2p.mjs → format-DJwRUrQm.mjs} +1 -1
  89. package/dist/{handleResumeCommand-uKzhaOVC.cjs → handleResumeCommand-0lsgLgBB.cjs} +5 -5
  90. package/dist/{handleResumeCommand-DrJdhjLD.mjs → handleResumeCommand-PfKmR-hv.mjs} +5 -5
  91. package/dist/{index-C-eSUhXW.mjs → index-BNcFxRSt.mjs} +4 -4
  92. package/dist/{index-44o_qMvE.cjs → index-BYL_X3gP.cjs} +27 -6
  93. package/dist/{index-Bi7Lmykl.cjs → index-B_narjYR.cjs} +45 -44
  94. package/dist/{index-DDOCSeEj.cjs → index-Bm_9wBaO.cjs} +4 -4
  95. package/dist/{index-CoBaGAA4.cjs → index-C7yXrMau.cjs} +3 -3
  96. package/dist/{index-BcYJJV-f.mjs → index-CUJZx4cs.mjs} +3 -3
  97. package/dist/{index-fNsf-8K-.mjs → index-CUeuMsap.mjs} +4 -4
  98. package/dist/{index-CowtCbZ_.mjs → index-D1rxFJ2b.mjs} +46 -45
  99. package/dist/{index-CiRMvS73.mjs → index-DWk-WTU-.mjs} +24 -7
  100. package/dist/{index-BKXqaux4.cjs → index-l8Xg3Mbf.cjs} +4 -4
  101. package/dist/index.cjs +2 -2
  102. package/dist/index.mjs +2 -2
  103. package/dist/{install-0TkucJrC.mjs → install-B593oYZs.mjs} +3 -3
  104. package/dist/{install-Ddc8TlWE.cjs → install-C0I1a5sL.cjs} +3 -3
  105. package/dist/{issue-CIfzJuaS.cjs → issue-CJrXCpnf.cjs} +8 -8
  106. package/dist/{issue-CML2xa46.mjs → issue-D9ukoK-U.mjs} +8 -8
  107. package/dist/lib.cjs +12 -12
  108. package/dist/lib.d.cts +42 -1
  109. package/dist/lib.d.mts +42 -1
  110. package/dist/lib.mjs +12 -12
  111. package/dist/{localHappyAgentAuth-BUX4E1ug.mjs → localHappyAgentAuth-CxNcSjMM.mjs} +1 -1
  112. package/dist/{localHappyAgentAuth-WLqXQbc6.cjs → localHappyAgentAuth-D3GKuEC2.cjs} +1 -1
  113. package/dist/{logger-BEVIGYKL.mjs → logger-BcdURxNR.mjs} +2 -2
  114. package/dist/{logger-Dhc0l3xH.cjs → logger-C8anCmdW.cjs} +2 -2
  115. package/dist/{machineMetadata-BQdp_ihk.mjs → machineMetadata-BQaQQk6Z.mjs} +3 -3
  116. package/dist/{machineMetadata-ixKckJ7k.cjs → machineMetadata-DYWtdEtE.cjs} +3 -3
  117. package/dist/{main-BNBYOcQb.cjs → main-Bw7qSCWA.cjs} +48 -48
  118. package/dist/{main-BzQSe4Zu.mjs → main-KsUdHnwc.mjs} +48 -48
  119. package/dist/{mcp-BwskAxOK.cjs → mcp-CxPUFOEd.cjs} +20 -18
  120. package/dist/{mcp-BueI4Bel.mjs → mcp-OeLaQ2XR.mjs} +20 -18
  121. package/dist/{mirrorProtocol-5aFYsCCe.mjs → mirrorProtocol-Sj0yEHHU.mjs} +3 -3
  122. package/dist/{mirrorProtocol-DGMmhArw.cjs → mirrorProtocol-cTQcrW55.cjs} +3 -3
  123. package/dist/{package-CAmlKYcH.cjs → package-DkpXQvp1.cjs} +7 -7
  124. package/dist/{package-aOUtHYRZ.mjs → package-Dx3hbh9J.mjs} +7 -7
  125. package/dist/{panels-By2IDfXv.cjs → panels-CPNZnwCH.cjs} +5 -5
  126. package/dist/{panels-BeVMgmRW.mjs → panels-DKYO14Sq.mjs} +5 -5
  127. package/dist/{peerTools-BkRgJomj.mjs → peerTools-DYFslv6R.mjs} +5 -5
  128. package/dist/{peerTools-dgllF1wT.cjs → peerTools-DpCWFxI6.cjs} +5 -5
  129. package/dist/{persistence-EuUaQKL7.mjs → persistence-3iZXGbfb.mjs} +2 -2
  130. package/dist/{persistence-05BAS4Ou.cjs → persistence-Ch78xygf.cjs} +2 -2
  131. package/dist/{piRunnerArgs-DkjCRPYn.cjs → piRunnerArgs-CA6jqQ0k.cjs} +1 -1
  132. package/dist/{piRunnerArgs-CygWrAwY.mjs → piRunnerArgs-DEuYl6FL.mjs} +1 -1
  133. package/dist/{piRuntime-zY2jIQod.cjs → piRuntime-BIVHf-hN.cjs} +1 -1
  134. package/dist/{piRuntime-LRW_t6ME.mjs → piRuntime-CyN43ILm.mjs} +1 -1
  135. package/dist/{piTerminal-BhlPA1HR.mjs → piTerminal-DXz5L73L.mjs} +22 -20
  136. package/dist/{piTerminal-BfZshXGh.cjs → piTerminal-Hw4StZWN.cjs} +22 -20
  137. package/dist/{pushNotifications-DaVlLe7N.cjs → pushNotifications-D2ejrxlN.cjs} +17 -3
  138. package/dist/{pushNotifications-B7Ga8Zyf.mjs → pushNotifications-Db1NGJiA.mjs} +17 -3
  139. package/dist/{query-BQLtwpr9.mjs → query-CeYpZWVb.mjs} +1 -1
  140. package/dist/{query-CX0Of89i.cjs → query-velpFYxW.cjs} +1 -1
  141. package/dist/{rateLimitWindows-hv2zLYid.mjs → rateLimitWindows-BSQttrPk.mjs} +1 -1
  142. package/dist/{rateLimitWindows-CpSOlXBt.cjs → rateLimitWindows-C78D8Uf-.cjs} +1 -1
  143. package/dist/{reconnectGate-DO_ZQmJE.mjs → reconnectGate-Ie4nSKNl.mjs} +1 -1
  144. package/dist/{reconnectGate-B_aJrehH.cjs → reconnectGate-S9yNiuY7.cjs} +1 -1
  145. package/dist/{registerCommonHandlers-em2elV3l.cjs → registerCommonHandlers-51llVpLx.cjs} +2 -2
  146. package/dist/{registerCommonHandlers-BEpK4WD2.mjs → registerCommonHandlers-BR7BeGX3.mjs} +2 -2
  147. package/dist/{registerKillSessionHandler-D4ZQvsH2.cjs → registerKillSessionHandler-BjY79qBi.cjs} +6 -6
  148. package/dist/{registerKillSessionHandler-D-dDzI2n.mjs → registerKillSessionHandler-RbWPmKnK.mjs} +6 -6
  149. package/dist/{registerSideQuestionHandler-BIOLUe2U.cjs → registerSideQuestionHandler-B1Xk7dFK.cjs} +4 -4
  150. package/dist/{registerSideQuestionHandler-okUy9Q_-.mjs → registerSideQuestionHandler-BbYT7QfR.mjs} +4 -4
  151. package/dist/{remoteSessionClient-CzjLyL9c.mjs → remoteSessionClient-Ddns3U8M.mjs} +5 -5
  152. package/dist/{remoteSessionClient-BLWFXMBo.cjs → remoteSessionClient-r-UnqHor.cjs} +5 -5
  153. package/dist/{reportProgressTool-DcNBXBw8.cjs → reportProgressTool-ByadxJtc.cjs} +5 -5
  154. package/dist/{reportProgressTool-CNi0Vqqm.mjs → reportProgressTool-C3sf9D8m.mjs} +5 -5
  155. package/dist/{run-D59Gb4SQ.mjs → run-jsINwBOz.mjs} +200 -55
  156. package/dist/{run-bzlz4DI1.cjs → run-r5sY3wHk.cjs} +200 -55
  157. package/dist/{runClaude-kVp1PKab.cjs → runClaude-CRKsRfnq.cjs} +53 -38
  158. package/dist/{runClaude-DZtdmcXK.mjs → runClaude-D8CuiZhi.mjs} +44 -29
  159. package/dist/{runClaudeDeps-BHv9FkVz.cjs → runClaudeDeps-BiVzNIE6.cjs} +129 -61
  160. package/dist/{runClaudeDeps-D83tR1KP.mjs → runClaudeDeps-CUuPWcg9.mjs} +125 -57
  161. package/dist/{runGemini-W-0t7skM.cjs → runGemini-DANnc0BW.cjs} +36 -35
  162. package/dist/{runGemini-DLc_bL4E.mjs → runGemini-cqVZjPT6.mjs} +36 -35
  163. package/dist/{runOpenClaw-mm-hKxMC.mjs → runOpenClaw-B6V2nz8J.mjs} +18 -18
  164. package/dist/{runOpenClaw-BsqbOw8R.cjs → runOpenClaw-CGwc6mfJ.cjs} +18 -18
  165. package/dist/{sandbox-DrWJss7J.cjs → sandbox-CNheYPva.cjs} +4 -4
  166. package/dist/{sandbox-DXbKl-Os.mjs → sandbox-JYBMckKE.mjs} +4 -4
  167. package/dist/{selfCheck-CVXucSXR.cjs → selfCheck-DtSEBt0g.cjs} +40 -40
  168. package/dist/selfCheck-Jjy_wMw3.mjs +89 -0
  169. package/dist/{send-Cdda78Iw.mjs → send-BHrbbGJ7.mjs} +8 -8
  170. package/dist/{send-D7pRBaht.cjs → send-DNdJR3n8.cjs} +8 -8
  171. package/dist/{server-BI6defPs.cjs → server-CvP_b3eb.cjs} +6 -6
  172. package/dist/{server-CNilQcJK.mjs → server-DhQjVsyZ.mjs} +4 -4
  173. package/dist/{sessionLock-CVjlaRSL.mjs → sessionLock-5i516L-w.mjs} +21 -4
  174. package/dist/{sessionLock-Bjsy90aM.cjs → sessionLock-UkF8M3j5.cjs} +22 -3
  175. package/dist/{sessionOps-CvmOHwGP.cjs → sessionOps-D77IeFSt.cjs} +4 -4
  176. package/dist/{sessionOps-CV5RUpwG.mjs → sessionOps-DX49XNAT.mjs} +4 -4
  177. package/dist/{sessionProvider-BmO4ahnt.mjs → sessionProvider-C5xW4Dt3.mjs} +10 -10
  178. package/dist/{sessionProvider-4sWr0Myr.cjs → sessionProvider-mSI2UgLX.cjs} +10 -10
  179. package/dist/{sessionScanner-DZBiEOyb.cjs → sessionScanner-B1Am8D4Y.cjs} +3 -3
  180. package/dist/{sessionScanner-34Q0vTR3.mjs → sessionScanner-BZkOnp5a.mjs} +3 -3
  181. package/dist/{sessions-Cl435KQT.mjs → sessions-ClQFpjcA.mjs} +10 -10
  182. package/dist/{sessions-DjAXZWTX.cjs → sessions-DDDEiHVR.cjs} +10 -10
  183. package/dist/{setupOfflineReconnection-zebrb6U_.cjs → setupOfflineReconnection-Cn2_vuvO.cjs} +2 -2
  184. package/dist/{setupOfflineReconnection-BC5FJTkc.mjs → setupOfflineReconnection-PjK9laDd.mjs} +2 -2
  185. package/dist/{spawn-DqWdgMt_.mjs → spawn-BJGaxdot.mjs} +15 -15
  186. package/dist/{spawn-C8cJK9-m.cjs → spawn-DOj-sY6W.cjs} +15 -15
  187. package/dist/{spawnAgents-BclZYkov.mjs → spawnAgents-CcFKtKdX.mjs} +2 -1
  188. package/dist/{spawnAgents-DvbEDCIq.cjs → spawnAgents-D4lR468W.cjs} +2 -1
  189. package/dist/{spawnHappyCLI-BckHSjR0.mjs → spawnHappyCLI-CpOMz9hX.mjs} +1 -1
  190. package/dist/{spawnHappyCLI-CeWgULMt.cjs → spawnHappyCLI-DvxZ7elP.cjs} +1 -1
  191. package/dist/{startFileWatcher-CXZYt0y9.cjs → startFileWatcher-1ar7WS96.cjs} +1 -1
  192. package/dist/{startFileWatcher-BXiBlfVr.mjs → startFileWatcher-CPbPNFGY.mjs} +1 -1
  193. package/dist/{startupSessionCreate-CycB-kwu.cjs → startupSessionCreate-COc5Nnr9.cjs} +3 -3
  194. package/dist/{startupSessionCreate-D8hODW7I.mjs → startupSessionCreate-CnVaUZ16.mjs} +3 -3
  195. package/dist/{store-Cpb1LMNW.cjs → store-DGMILdMn.cjs} +1 -1
  196. package/dist/{store-DWmjM4Ex.mjs → store-Fge1h9wy.mjs} +1 -1
  197. package/dist/{streamRelay-DdGOsW8v.mjs → streamRelay-MaaYNNuh.mjs} +1 -1
  198. package/dist/{streamRelay-4XiiNB3N.cjs → streamRelay-keuifCPQ.cjs} +1 -1
  199. package/dist/{sync-BfM5OKSS.mjs → sync-BZji3J2r.mjs} +1 -1
  200. package/dist/{sync-CyUWevwD.cjs → sync-DzInYE_l.cjs} +1 -1
  201. package/dist/{systemPrompt-BUZQDf4k.cjs → systemPrompt-CvpjNmQL.cjs} +2 -2
  202. package/dist/{systemPrompt-Tu_2ixE3.mjs → systemPrompt-Dhdq8hGf.mjs} +2 -2
  203. package/dist/{teams-KjHee0Vg.cjs → teams-CRCbDPob.cjs} +20 -9
  204. package/dist/{teams-Cpdqvfe3.mjs → teams-CVW4ZvmW.mjs} +20 -9
  205. package/dist/{template-3fV9bi0X.cjs → template-ChUotPTL.cjs} +1 -1
  206. package/dist/{template-CtRLg2PG.mjs → template-D8fzlO58.mjs} +1 -1
  207. package/dist/{time-BQWf06hA.mjs → time-BWVJTcWI.mjs} +1 -1
  208. package/dist/{time-CbOTVtAt.cjs → time-UUMqbIq8.cjs} +1 -1
  209. package/dist/{titleGenerator-CpiQkf_r.cjs → titleGenerator-BHOA2Wkx.cjs} +3 -3
  210. package/dist/{titleGenerator-DYnqd0oI.mjs → titleGenerator-Ck82YoB7.mjs} +2 -2
  211. package/dist/{todo-DVrsXyKn.mjs → todo-Cf52TlmX.mjs} +8 -8
  212. package/dist/{todo-Cp6bRp62.cjs → todo-Cwo7joub.cjs} +8 -8
  213. package/dist/{tools-BFQm7xny.cjs → tools-DEErCtZG.cjs} +47 -27
  214. package/dist/{tools-XGAJepvT.mjs → tools-DmNaOlUF.mjs} +47 -27
  215. package/dist/{uninstall-C2LF0vtR.mjs → uninstall-B85MiNK2.mjs} +3 -3
  216. package/dist/{uninstall-Cyqq90JW.cjs → uninstall-CoAK4ANz.cjs} +3 -3
  217. package/dist/{wrapperAccount-nGGMJDBF.cjs → wrapperAccount-BHMM9I6g.cjs} +2 -2
  218. package/dist/{wrapperAccount-z8Swrd08.mjs → wrapperAccount-CwaA-n1S.mjs} +2 -2
  219. package/package.json +7 -7
  220. package/dist/permissionMode-CH4FoZfU.mjs +0 -80
  221. package/dist/permissionMode-CrV-XuMs.cjs +0 -87
  222. package/dist/selfCheck-B1XdrEbN.mjs +0 -89
@@ -1,45 +1,45 @@
1
1
  import { io } from 'socket.io-client';
2
2
  import { a as webPanelsSignature } from './webPanels-B2_C2-3g.mjs';
3
- import { l as logger } from './logger-BEVIGYKL.mjs';
4
- import { R as RpcHandlerManager, i as isRateQuotaCode, p as pauseForRateQuota, s as socketConnectGuard, c as connectGuarded, a as answerSocketRequest, e as shouldReconnect, f as createReconnectGate, d as describeSocketAckDrop } from './reconnectGate-DO_ZQmJE.mjs';
5
- import { i as isClaudeSessionId, s as stableVersion, a as sanitizeTagList, p as projectField, b as pickMirrorForTerminal, l as liveSnapshotChanged, c as sanitizeLiveSnapshot, d as serializeLiveSnapshot, r as registerWorktreeHandlers, e as configureWorktreeService, f as summarizeSpawnSessionForLog, g as parseMirrorSendParams } from './mirrorProtocol-5aFYsCCe.mjs';
6
- import { c as configuration } from './configuration-CQaLZMa-.mjs';
3
+ import { l as logger } from './logger-BcdURxNR.mjs';
4
+ import { R as RpcHandlerManager, i as isRateQuotaCode, p as pauseForRateQuota, s as socketConnectGuard, c as connectGuarded, a as answerSocketRequest, e as shouldReconnect, f as createReconnectGate, d as describeSocketAckDrop } from './reconnectGate-Ie4nSKNl.mjs';
5
+ import { i as isClaudeSessionId, s as stableVersion, a as sanitizeTagList, p as projectField, b as pickMirrorForTerminal, l as liveSnapshotChanged, c as sanitizeLiveSnapshot, d as serializeLiveSnapshot, r as registerWorktreeHandlers, e as configureWorktreeService, f as summarizeSpawnSessionForLog, g as parseMirrorSendParams } from './mirrorProtocol-Sj0yEHHU.mjs';
6
+ import { c as configuration } from './configuration-D_YrWa_i.mjs';
7
7
  import { w as withCurrentCliUpdateState } from './cliUpdate-Y34VGe9Y.mjs';
8
- import { r as registerCommonHandlers } from './registerCommonHandlers-BEpK4WD2.mjs';
8
+ import { r as registerCommonHandlers } from './registerCommonHandlers-BR7BeGX3.mjs';
9
9
  import { stat, readdir, lstat, open, readFile, rm, mkdir, chmod, writeFile, rename } from 'node:fs/promises';
10
10
  import { join, isAbsolute, resolve } from 'node:path';
11
11
  import os, { homedir } from 'node:os';
12
12
  import { f as fsMkdir } from './fsMkdir-DumgLTzR.mjs';
13
13
  import { spawn, execFile, spawnSync } from 'node:child_process';
14
- import { r as readSettings, c as readPersistedSessions, p as readTrackedClaudeSessionIds, q as readTrackedCodexThreadIds } from './persistence-EuUaQKL7.mjs';
14
+ import { r as readSettings, c as readPersistedSessions, p as readTrackedClaudeSessionIds, q as readTrackedCodexThreadIds } from './persistence-3iZXGbfb.mjs';
15
15
  import { M as ModelConfigError } from './fileStore-5qpetZS0.mjs';
16
- import { al as AGENT_PROFILE_RPC, am as RelayCandidatesResponseSchema, ag as RelayAssignmentResponseSchema, af as ReleaseDrainNoticeSchema } from './index-CiRMvS73.mjs';
17
- import { a as AccountError } from './accountService-DEpIq6CF.mjs';
16
+ import { am as AGENT_PROFILE_RPC, an as RelayCandidatesResponseSchema, ah as RelayAssignmentResponseSchema, ag as ReleaseDrainNoticeSchema } from './index-DWk-WTU-.mjs';
17
+ import { a as AccountError } from './accountService-CqrWNH8K.mjs';
18
18
  import { e as encodeBase64, g as encrypt, h as decrypt, d as decodeBase64 } from './authRelay-DhQhkBvX.mjs';
19
19
  import { p as prepareClipboardText, d as prepareClipboardHistoryText } from './limits-DIo7rEBR.mjs';
20
- import { b as backoff, d as delay } from './time-BQWf06hA.mjs';
20
+ import { b as backoff, d as delay } from './time-BWVJTcWI.mjs';
21
21
  import * as pty from 'node-pty';
22
22
  import { a as attachStartupCommand, v as validateTerminalTags, d as deriveAutoTitle, T as TMUX_SESSION_ID_RE, i as isSafeTmuxSessionName, b as isVhSessionName, U as USER_SESSIONS_FORMAT, p as parseUserSessions, L as LIST_SESSIONS_FORMAT, c as parseSessionListLine, e as LIST_FIELD_SEP, s as sendToVhTerminal } from './terminals-Dc38XmZv.mjs';
23
23
  import { t as tmuxArgs, V as VH_TMUX_SOCKET_ENV, v as validateTerminalProjectId, a as scrubTmuxClientEnv } from './tmuxSocket-BmZyixRM.mjs';
24
- import { locateClaudeConversation, refreshAgentHomes } from './index-fNsf-8K-.mjs';
24
+ import { locateClaudeConversation, refreshAgentHomes } from './index-CUeuMsap.mjs';
25
25
  import { randomBytes } from 'node:crypto';
26
26
  import { readdirSync, unlinkSync, existsSync, mkdirSync, writeFileSync, readFileSync, statSync, chmodSync, renameSync, rmSync, accessSync, constants } from 'node:fs';
27
27
  import axios from 'axios';
28
28
  import { p as projectPath } from './projectPath-BTBIMB57.mjs';
29
29
  import { a as isValidTerminalId } from './ids-DU6sLx4C.mjs';
30
30
  import { d as detectCLIAvailability } from './detectCLI-CSGMlV51.mjs';
31
- import { d as detectResumeSupport } from './localHappyAgentAuth-BUX4E1ug.mjs';
31
+ import { d as detectResumeSupport } from './localHappyAgentAuth-CxNcSjMM.mjs';
32
32
  import { g as getProjectPath, a as getClaudeProjectsRoot } from './path-D2wdaNSk.mjs';
33
33
  import { i as isVeryHappyOneShotPrompt } from './oneShotPrompts-DT4p6RNd.mjs';
34
- import { f as forkSession, F as ForkSourceMissingError, d as discardForkedSession, l as listClaudeRewindPoints, b as forkAndTruncateSession, c as ForkTruncateUuidNotFoundError, e as forkBeforeUserMessage, a as forkCompletedTurns } from './claudeSessionFork-DRLxmv9j.mjs';
35
- import { C as CodexAppServerClient } from './codexAppServerClient-DtdCZ7_b.mjs';
34
+ import { f as forkSession, F as ForkSourceMissingError, d as discardForkedSession, l as listClaudeRewindPoints, b as forkAndTruncateSession, c as ForkTruncateUuidNotFoundError, e as forkBeforeUserMessage, a as forkCompletedTurns } from './claudeSessionFork-BPF3cpGs.mjs';
35
+ import { C as CodexAppServerClient } from './codexAppServerClient-CvL3eBlM.mjs';
36
36
  import { f as forkCodexThread, C as CodexForkRewindPointNotFoundError, l as listCodexRewindPoints, b as forkCodexBeforeUserMessage, a as forkCodexCompletedTurns } from './codexThreadFork-CVzAqELg.mjs';
37
- import { p as planRateLimitWrite, m as mergeRateLimitReports } from './rateLimitWindows-hv2zLYid.mjs';
37
+ import { p as planRateLimitWrite, m as mergeRateLimitReports } from './rateLimitWindows-BSQttrPk.mjs';
38
38
  import 'chalk';
39
39
  import 'node:util';
40
40
  import 'os';
41
41
  import 'child_process';
42
- import './package-aOUtHYRZ.mjs';
42
+ import './package-Dx3hbh9J.mjs';
43
43
  import 'util';
44
44
  import 'fs/promises';
45
45
  import 'crypto';
@@ -47,9 +47,9 @@ import 'path';
47
47
  import 'cross-spawn';
48
48
  import 'zod';
49
49
  import '@paralleldrive/cuid2';
50
- import './claudeAccountEnv-DowsOlDB.mjs';
51
- import './store-DWmjM4Ex.mjs';
52
- import './codexAccount-CieIQLOX.mjs';
50
+ import './claudeAccountEnv-C6Wl-ZbT.mjs';
51
+ import './store-Fge1h9wy.mjs';
52
+ import './codexAccount-BPQ-lPhH.mjs';
53
53
  import 'node:readline';
54
54
  import 'tweetnacl';
55
55
  import './terminalTitleSuggest-CeKsX_V6.mjs';
@@ -7029,6 +7029,18 @@ function tmuxNewSessionArgs(session, cols, rows, cwd, envFlags, shell) {
7029
7029
  }
7030
7030
  return args;
7031
7031
  }
7032
+ function viewOnlyGeometry(live, tmuxWindow, requested) {
7033
+ if (live) return { cols: live.cols, rows: live.rows };
7034
+ if (tmuxWindow) return tmuxWindow;
7035
+ return requested;
7036
+ }
7037
+ function parseTmuxWindowSize(out) {
7038
+ const m = /^(\d+)\s+(\d+)\s*$/.exec((out ?? "").trim());
7039
+ if (!m) return null;
7040
+ const cols = Number(m[1]);
7041
+ const rows = Number(m[2]);
7042
+ return cols >= 2 && rows >= 2 && cols <= 1e4 && rows <= 1e4 ? { cols, rows } : null;
7043
+ }
7032
7044
  function shouldUseDirectPtyFallback(attachOnly, createdNew, sessionAlive) {
7033
7045
  return !attachOnly && !createdNew && !sessionAlive;
7034
7046
  }
@@ -8107,6 +8119,41 @@ class WebTerminalManager {
8107
8119
  resetSubscribers() {
8108
8120
  for (const s of this.terminals.values()) s.subscribers = 0;
8109
8121
  }
8122
+ /** B-878: share grants that attached a terminal view-only, by terminal id. */
8123
+ viewOnlyShares = /* @__PURE__ */ new Map();
8124
+ noteShareAttach(terminalId, grantId, viewOnly) {
8125
+ if (typeof grantId !== "string" || !grantId) return;
8126
+ const set = this.viewOnlyShares.get(terminalId) ?? /* @__PURE__ */ new Set();
8127
+ if (viewOnly) set.add(grantId);
8128
+ else set.delete(grantId);
8129
+ if (set.size > 0) this.viewOnlyShares.set(terminalId, set);
8130
+ else this.viewOnlyShares.delete(terminalId);
8131
+ }
8132
+ /**
8133
+ * B-878 second layer: input / resize tagged with a grant that attached this
8134
+ * terminal view-only is dropped (the broker should never forward it). Logs
8135
+ * the fact only — never the bytes.
8136
+ */
8137
+ dropViewOnlyShareEvent(kind, terminalId, grantId) {
8138
+ if (typeof terminalId !== "string" || typeof grantId !== "string") return false;
8139
+ if (!this.viewOnlyShares.get(terminalId)?.has(grantId)) return false;
8140
+ logger.debug(`[WEB TERMINAL] dropped ${kind} from a view-only share on ${terminalId}`);
8141
+ return true;
8142
+ }
8143
+ /** B-878: the tmux window's current size for `vh-<id>`, or null. */
8144
+ readTmuxWindowSize(id) {
8145
+ if (!isTmuxAvailable()) return null;
8146
+ try {
8147
+ const r = spawnSync(
8148
+ "tmux",
8149
+ tmuxArgs(["display-message", "-p", "-t", `=vh-${id}:`, "#{window_width} #{window_height}"]),
8150
+ { encoding: "utf8", timeout: TMUX_PROBE_TIMEOUT_MS, env: ptyEnv() }
8151
+ );
8152
+ return r.status === 0 ? parseTmuxWindowSize(r.stdout) : null;
8153
+ } catch {
8154
+ return null;
8155
+ }
8156
+ }
8110
8157
  /** Update the emitter when the socket reconnects. */
8111
8158
  setEmit(emit) {
8112
8159
  this.emit = emit;
@@ -8123,6 +8170,23 @@ class WebTerminalManager {
8123
8170
  const id = opts.terminalId && /^[a-zA-Z0-9_-]{1,64}$/.test(opts.terminalId) ? opts.terminalId : randomBytes(5).toString("hex");
8124
8171
  const lines = opts.streamMode === "lines";
8125
8172
  const existing = this.terminals.get(id);
8173
+ if (!opts.viewOnly) this.noteShareAttach(id, opts.shareGrantId, false);
8174
+ if (opts.viewOnly) {
8175
+ const geometry = viewOnlyGeometry(existing ? { cols: existing.cols, rows: existing.rows } : void 0, existing ? null : this.readTmuxWindowSize(id), { cols, rows });
8176
+ const result = await this.open({
8177
+ ...opts,
8178
+ viewOnly: false,
8179
+ attachOnly: true,
8180
+ shareGrantId: void 0,
8181
+ startupCommand: void 0,
8182
+ attachTmux: void 0,
8183
+ projectId: void 0,
8184
+ cols: geometry.cols,
8185
+ rows: geometry.rows
8186
+ });
8187
+ this.noteShareAttach(result.terminalId, opts.shareGrantId, true);
8188
+ return { ...result, viewOnly: true, paneCols: result.paneCols ?? geometry.cols, paneRows: result.paneRows ?? geometry.rows };
8189
+ }
8126
8190
  if (existing) {
8127
8191
  const echo2 = opts.attachTmux && !(opts.attachOnly || opts.resub) && existing.attachedTmux?.name === opts.attachTmux.name ? { attachedTmux: existing.attachedTmux } : {};
8128
8192
  if (!opts.resub || existing.subscribers === 0) existing.subscribers += 1;
@@ -10699,6 +10763,14 @@ class ApiMachineClient {
10699
10763
  setHarnessInstallHandler(handler) {
10700
10764
  this.rpcHandlerManager.registerHandler("harness-install", (params) => handler(params));
10701
10765
  }
10766
+ /** B-877 「退出团队模式」 for a team lead session on this machine (Web session ⋯ / team menu). */
10767
+ setTeamExitHandler(handler) {
10768
+ this.rpcHandlerManager.registerHandler("team-exit-session", async (params) => {
10769
+ const sessionId = params?.sessionId;
10770
+ if (typeof sessionId !== "string" || !/^[a-zA-Z0-9_-]{1,128}$/.test(sessionId)) throw new Error("Session ID is required");
10771
+ return handler(sessionId);
10772
+ });
10773
+ }
10702
10774
  setCliUpdateRetryHandler(handler) {
10703
10775
  this.rpcHandlerManager.registerHandler("cli-update-retry", (params) => handler(params && typeof params === "object" ? params.version : void 0));
10704
10776
  }
@@ -10971,7 +11043,7 @@ class ApiMachineClient {
10971
11043
  this.syncResumeSessionRpcRegistration();
10972
11044
  this.syncRestartSessionRpcRegistration();
10973
11045
  this.rpcHandlerManager.registerHandler("open-terminal", async (params) => {
10974
- const { terminalId, cols, rows, cwd, fromSeq, encStream, startupCommand, resub, attachOnly, streamMode, attachTmux, projectId } = params || {};
11046
+ const { terminalId, cols, rows, cwd, fromSeq, encStream, startupCommand, resub, attachOnly, streamMode, attachTmux, projectId, viewOnly, shareGrantId } = params || {};
10975
11047
  const attach = attachTmux && typeof attachTmux === "object" && typeof attachTmux.id === "string" && typeof attachTmux.name === "string" ? { id: attachTmux.id, name: attachTmux.name } : void 0;
10976
11048
  const result = await this.webTerminal.open({
10977
11049
  terminalId,
@@ -10985,7 +11057,10 @@ class ApiMachineClient {
10985
11057
  streamMode: streamMode === "lines" ? "lines" : void 0,
10986
11058
  ...attach ? { attachTmux: attach } : {},
10987
11059
  // B-868: create-only; validated inside open().
10988
- ...typeof projectId === "string" ? { projectId } : {}
11060
+ ...typeof projectId === "string" ? { projectId } : {},
11061
+ // B-878: share viewer — attach without resizing the pane.
11062
+ ...viewOnly === true ? { viewOnly: true } : {},
11063
+ ...typeof shareGrantId === "string" && shareGrantId.length <= 128 ? { shareGrantId } : {}
10989
11064
  });
10990
11065
  if (encStream) {
10991
11066
  this.encTerminals.add(result.terminalId);
@@ -11613,6 +11688,11 @@ class ApiMachineClient {
11613
11688
  historySearch: { rpcAvailable: true, detectedAt: now },
11614
11689
  // B-868 capability flag: `set-terminal-project` (same restamp discipline).
11615
11690
  terminalProjects: { rpcAvailable: true, detectedAt: now },
11691
+ // B-877b capability flag: `team-exit-session` (same restamp discipline); the web
11692
+ // asks an older CLI to update at once instead of waiting out the server's 15 s RPC grace.
11693
+ teamExit: { rpcAvailable: true, detectedAt: now },
11694
+ // B-878 capability flag: `open-terminal.viewOnly` (same restamp discipline).
11695
+ terminalViewOnly: { rpcAvailable: true, detectedAt: now },
11616
11696
  // B-084: closed records survive daemon restarts (persisted
11617
11697
  // in closed-terminals.json), so the connect snapshot ships
11618
11698
  // them too — not just the incremental pushes.
@@ -11817,6 +11897,7 @@ class ApiMachineClient {
11817
11897
  }
11818
11898
  bindMachineCommandHandlers(socket) {
11819
11899
  socket.on("terminal-input", (data) => {
11900
+ if (this.webTerminal.dropViewOnlyShareEvent("input", data?.terminalId, data?.shareGrantId)) return;
11820
11901
  let payload = data.data;
11821
11902
  if (data.enc) {
11822
11903
  const dec = decrypt(this.machine.encryptionKey, this.machine.encryptionVariant, decodeBase64(data.data));
@@ -11825,7 +11906,10 @@ class ApiMachineClient {
11825
11906
  }
11826
11907
  this.webTerminal.write(data.terminalId, payload);
11827
11908
  });
11828
- socket.on("terminal-resize", (data) => this.webTerminal.resize(data.terminalId, data.cols, data.rows));
11909
+ socket.on("terminal-resize", (data) => {
11910
+ if (this.webTerminal.dropViewOnlyShareEvent("resize", data?.terminalId, data?.shareGrantId)) return;
11911
+ this.webTerminal.resize(data.terminalId, data.cols, data.rows);
11912
+ });
11829
11913
  socket.on("terminal-close", (data) => this.webTerminal.unsubscribe(data.terminalId));
11830
11914
  socket.on("session-archive", (data) => {
11831
11915
  if (typeof data?.sessionId !== "string") return;
@@ -2,46 +2,46 @@
2
2
 
3
3
  var socket_ioClient = require('socket.io-client');
4
4
  var webPanels = require('./webPanels-FCgFKvVe.cjs');
5
- var logger = require('./logger-Dhc0l3xH.cjs');
6
- var reconnectGate = require('./reconnectGate-B_aJrehH.cjs');
7
- var mirrorProtocol = require('./mirrorProtocol-DGMmhArw.cjs');
8
- var configuration = require('./configuration-DZUnfWp2.cjs');
5
+ var logger = require('./logger-C8anCmdW.cjs');
6
+ var reconnectGate = require('./reconnectGate-S9yNiuY7.cjs');
7
+ var mirrorProtocol = require('./mirrorProtocol-cTQcrW55.cjs');
8
+ var configuration = require('./configuration-CDqmWkHO.cjs');
9
9
  var cliUpdate = require('./cliUpdate-DsKXPFYp.cjs');
10
- var registerCommonHandlers = require('./registerCommonHandlers-em2elV3l.cjs');
10
+ var registerCommonHandlers = require('./registerCommonHandlers-51llVpLx.cjs');
11
11
  var promises = require('node:fs/promises');
12
12
  var path = require('node:path');
13
13
  var os = require('node:os');
14
14
  var fsMkdir = require('./fsMkdir-0K3yENml.cjs');
15
15
  var node_child_process = require('node:child_process');
16
- var persistence = require('./persistence-05BAS4Ou.cjs');
16
+ var persistence = require('./persistence-Ch78xygf.cjs');
17
17
  var fileStore = require('./fileStore-7qhnbs6N.cjs');
18
- var index = require('./index-44o_qMvE.cjs');
19
- var accountService = require('./accountService-Cns8UYGI.cjs');
18
+ var index = require('./index-BYL_X3gP.cjs');
19
+ var accountService = require('./accountService-SOeB_21A.cjs');
20
20
  var authRelay = require('./authRelay-Dy1qU9td.cjs');
21
21
  var limits = require('./limits-C-a7gr04.cjs');
22
- var time = require('./time-CbOTVtAt.cjs');
22
+ var time = require('./time-UUMqbIq8.cjs');
23
23
  var pty = require('node-pty');
24
24
  var terminals = require('./terminals-dK3Lrjfp.cjs');
25
25
  var tmuxSocket = require('./tmuxSocket-Dg11Olx0.cjs');
26
- var index$1 = require('./index-DDOCSeEj.cjs');
26
+ var index$1 = require('./index-Bm_9wBaO.cjs');
27
27
  var node_crypto = require('node:crypto');
28
28
  var node_fs = require('node:fs');
29
29
  var axios = require('axios');
30
30
  var projectPath = require('./projectPath-C3ioB4Bu.cjs');
31
31
  var ids = require('./ids-B6ZC0HGt.cjs');
32
32
  var detectCLI = require('./detectCLI-BuYR_Qxe.cjs');
33
- var localHappyAgentAuth = require('./localHappyAgentAuth-WLqXQbc6.cjs');
33
+ var localHappyAgentAuth = require('./localHappyAgentAuth-D3GKuEC2.cjs');
34
34
  var path$1 = require('./path-B7zW-WwE.cjs');
35
35
  var oneShotPrompts = require('./oneShotPrompts-CL0dip9C.cjs');
36
- var claudeSessionFork = require('./claudeSessionFork-BrstQPE4.cjs');
37
- var codexAppServerClient = require('./codexAppServerClient-BwBPZonh.cjs');
36
+ var claudeSessionFork = require('./claudeSessionFork-lcajftLB.cjs');
37
+ var codexAppServerClient = require('./codexAppServerClient-CyLtj1kP.cjs');
38
38
  var codexThreadFork = require('./codexThreadFork-C6ZmcT2z.cjs');
39
- var rateLimitWindows = require('./rateLimitWindows-CpSOlXBt.cjs');
39
+ var rateLimitWindows = require('./rateLimitWindows-C78D8Uf-.cjs');
40
40
  require('chalk');
41
41
  require('node:util');
42
42
  require('os');
43
43
  require('child_process');
44
- require('./package-CAmlKYcH.cjs');
44
+ require('./package-DkpXQvp1.cjs');
45
45
  require('util');
46
46
  require('fs/promises');
47
47
  require('crypto');
@@ -49,9 +49,9 @@ require('path');
49
49
  require('cross-spawn');
50
50
  require('zod');
51
51
  require('@paralleldrive/cuid2');
52
- require('./claudeAccountEnv-Btp39mfa.cjs');
53
- require('./store-Cpb1LMNW.cjs');
54
- require('./codexAccount-D-OBY29W.cjs');
52
+ require('./claudeAccountEnv-BTZjHTpF.cjs');
53
+ require('./store-DGMILdMn.cjs');
54
+ require('./codexAccount-BjaHvmKH.cjs');
55
55
  require('node:readline');
56
56
  require('tweetnacl');
57
57
  require('./terminalTitleSuggest-DhvRFX3H.cjs');
@@ -7050,6 +7050,18 @@ function tmuxNewSessionArgs(session, cols, rows, cwd, envFlags, shell) {
7050
7050
  }
7051
7051
  return args;
7052
7052
  }
7053
+ function viewOnlyGeometry(live, tmuxWindow, requested) {
7054
+ if (live) return { cols: live.cols, rows: live.rows };
7055
+ if (tmuxWindow) return tmuxWindow;
7056
+ return requested;
7057
+ }
7058
+ function parseTmuxWindowSize(out) {
7059
+ const m = /^(\d+)\s+(\d+)\s*$/.exec((out ?? "").trim());
7060
+ if (!m) return null;
7061
+ const cols = Number(m[1]);
7062
+ const rows = Number(m[2]);
7063
+ return cols >= 2 && rows >= 2 && cols <= 1e4 && rows <= 1e4 ? { cols, rows } : null;
7064
+ }
7053
7065
  function shouldUseDirectPtyFallback(attachOnly, createdNew, sessionAlive) {
7054
7066
  return !attachOnly && !createdNew && !sessionAlive;
7055
7067
  }
@@ -8128,6 +8140,41 @@ class WebTerminalManager {
8128
8140
  resetSubscribers() {
8129
8141
  for (const s of this.terminals.values()) s.subscribers = 0;
8130
8142
  }
8143
+ /** B-878: share grants that attached a terminal view-only, by terminal id. */
8144
+ viewOnlyShares = /* @__PURE__ */ new Map();
8145
+ noteShareAttach(terminalId, grantId, viewOnly) {
8146
+ if (typeof grantId !== "string" || !grantId) return;
8147
+ const set = this.viewOnlyShares.get(terminalId) ?? /* @__PURE__ */ new Set();
8148
+ if (viewOnly) set.add(grantId);
8149
+ else set.delete(grantId);
8150
+ if (set.size > 0) this.viewOnlyShares.set(terminalId, set);
8151
+ else this.viewOnlyShares.delete(terminalId);
8152
+ }
8153
+ /**
8154
+ * B-878 second layer: input / resize tagged with a grant that attached this
8155
+ * terminal view-only is dropped (the broker should never forward it). Logs
8156
+ * the fact only — never the bytes.
8157
+ */
8158
+ dropViewOnlyShareEvent(kind, terminalId, grantId) {
8159
+ if (typeof terminalId !== "string" || typeof grantId !== "string") return false;
8160
+ if (!this.viewOnlyShares.get(terminalId)?.has(grantId)) return false;
8161
+ logger.logger.debug(`[WEB TERMINAL] dropped ${kind} from a view-only share on ${terminalId}`);
8162
+ return true;
8163
+ }
8164
+ /** B-878: the tmux window's current size for `vh-<id>`, or null. */
8165
+ readTmuxWindowSize(id) {
8166
+ if (!isTmuxAvailable()) return null;
8167
+ try {
8168
+ const r = node_child_process.spawnSync(
8169
+ "tmux",
8170
+ tmuxSocket.tmuxArgs(["display-message", "-p", "-t", `=vh-${id}:`, "#{window_width} #{window_height}"]),
8171
+ { encoding: "utf8", timeout: TMUX_PROBE_TIMEOUT_MS, env: ptyEnv() }
8172
+ );
8173
+ return r.status === 0 ? parseTmuxWindowSize(r.stdout) : null;
8174
+ } catch {
8175
+ return null;
8176
+ }
8177
+ }
8131
8178
  /** Update the emitter when the socket reconnects. */
8132
8179
  setEmit(emit) {
8133
8180
  this.emit = emit;
@@ -8144,6 +8191,23 @@ class WebTerminalManager {
8144
8191
  const id = opts.terminalId && /^[a-zA-Z0-9_-]{1,64}$/.test(opts.terminalId) ? opts.terminalId : node_crypto.randomBytes(5).toString("hex");
8145
8192
  const lines = opts.streamMode === "lines";
8146
8193
  const existing = this.terminals.get(id);
8194
+ if (!opts.viewOnly) this.noteShareAttach(id, opts.shareGrantId, false);
8195
+ if (opts.viewOnly) {
8196
+ const geometry = viewOnlyGeometry(existing ? { cols: existing.cols, rows: existing.rows } : void 0, existing ? null : this.readTmuxWindowSize(id), { cols, rows });
8197
+ const result = await this.open({
8198
+ ...opts,
8199
+ viewOnly: false,
8200
+ attachOnly: true,
8201
+ shareGrantId: void 0,
8202
+ startupCommand: void 0,
8203
+ attachTmux: void 0,
8204
+ projectId: void 0,
8205
+ cols: geometry.cols,
8206
+ rows: geometry.rows
8207
+ });
8208
+ this.noteShareAttach(result.terminalId, opts.shareGrantId, true);
8209
+ return { ...result, viewOnly: true, paneCols: result.paneCols ?? geometry.cols, paneRows: result.paneRows ?? geometry.rows };
8210
+ }
8147
8211
  if (existing) {
8148
8212
  const echo2 = opts.attachTmux && !(opts.attachOnly || opts.resub) && existing.attachedTmux?.name === opts.attachTmux.name ? { attachedTmux: existing.attachedTmux } : {};
8149
8213
  if (!opts.resub || existing.subscribers === 0) existing.subscribers += 1;
@@ -10720,6 +10784,14 @@ class ApiMachineClient {
10720
10784
  setHarnessInstallHandler(handler) {
10721
10785
  this.rpcHandlerManager.registerHandler("harness-install", (params) => handler(params));
10722
10786
  }
10787
+ /** B-877 「退出团队模式」 for a team lead session on this machine (Web session ⋯ / team menu). */
10788
+ setTeamExitHandler(handler) {
10789
+ this.rpcHandlerManager.registerHandler("team-exit-session", async (params) => {
10790
+ const sessionId = params?.sessionId;
10791
+ if (typeof sessionId !== "string" || !/^[a-zA-Z0-9_-]{1,128}$/.test(sessionId)) throw new Error("Session ID is required");
10792
+ return handler(sessionId);
10793
+ });
10794
+ }
10723
10795
  setCliUpdateRetryHandler(handler) {
10724
10796
  this.rpcHandlerManager.registerHandler("cli-update-retry", (params) => handler(params && typeof params === "object" ? params.version : void 0));
10725
10797
  }
@@ -10992,7 +11064,7 @@ class ApiMachineClient {
10992
11064
  this.syncResumeSessionRpcRegistration();
10993
11065
  this.syncRestartSessionRpcRegistration();
10994
11066
  this.rpcHandlerManager.registerHandler("open-terminal", async (params) => {
10995
- const { terminalId, cols, rows, cwd, fromSeq, encStream, startupCommand, resub, attachOnly, streamMode, attachTmux, projectId } = params || {};
11067
+ const { terminalId, cols, rows, cwd, fromSeq, encStream, startupCommand, resub, attachOnly, streamMode, attachTmux, projectId, viewOnly, shareGrantId } = params || {};
10996
11068
  const attach = attachTmux && typeof attachTmux === "object" && typeof attachTmux.id === "string" && typeof attachTmux.name === "string" ? { id: attachTmux.id, name: attachTmux.name } : void 0;
10997
11069
  const result = await this.webTerminal.open({
10998
11070
  terminalId,
@@ -11006,7 +11078,10 @@ class ApiMachineClient {
11006
11078
  streamMode: streamMode === "lines" ? "lines" : void 0,
11007
11079
  ...attach ? { attachTmux: attach } : {},
11008
11080
  // B-868: create-only; validated inside open().
11009
- ...typeof projectId === "string" ? { projectId } : {}
11081
+ ...typeof projectId === "string" ? { projectId } : {},
11082
+ // B-878: share viewer — attach without resizing the pane.
11083
+ ...viewOnly === true ? { viewOnly: true } : {},
11084
+ ...typeof shareGrantId === "string" && shareGrantId.length <= 128 ? { shareGrantId } : {}
11010
11085
  });
11011
11086
  if (encStream) {
11012
11087
  this.encTerminals.add(result.terminalId);
@@ -11634,6 +11709,11 @@ class ApiMachineClient {
11634
11709
  historySearch: { rpcAvailable: true, detectedAt: now },
11635
11710
  // B-868 capability flag: `set-terminal-project` (same restamp discipline).
11636
11711
  terminalProjects: { rpcAvailable: true, detectedAt: now },
11712
+ // B-877b capability flag: `team-exit-session` (same restamp discipline); the web
11713
+ // asks an older CLI to update at once instead of waiting out the server's 15 s RPC grace.
11714
+ teamExit: { rpcAvailable: true, detectedAt: now },
11715
+ // B-878 capability flag: `open-terminal.viewOnly` (same restamp discipline).
11716
+ terminalViewOnly: { rpcAvailable: true, detectedAt: now },
11637
11717
  // B-084: closed records survive daemon restarts (persisted
11638
11718
  // in closed-terminals.json), so the connect snapshot ships
11639
11719
  // them too — not just the incremental pushes.
@@ -11838,6 +11918,7 @@ class ApiMachineClient {
11838
11918
  }
11839
11919
  bindMachineCommandHandlers(socket) {
11840
11920
  socket.on("terminal-input", (data) => {
11921
+ if (this.webTerminal.dropViewOnlyShareEvent("input", data?.terminalId, data?.shareGrantId)) return;
11841
11922
  let payload = data.data;
11842
11923
  if (data.enc) {
11843
11924
  const dec = authRelay.decrypt(this.machine.encryptionKey, this.machine.encryptionVariant, authRelay.decodeBase64(data.data));
@@ -11846,7 +11927,10 @@ class ApiMachineClient {
11846
11927
  }
11847
11928
  this.webTerminal.write(data.terminalId, payload);
11848
11929
  });
11849
- socket.on("terminal-resize", (data) => this.webTerminal.resize(data.terminalId, data.cols, data.rows));
11930
+ socket.on("terminal-resize", (data) => {
11931
+ if (this.webTerminal.dropViewOnlyShareEvent("resize", data?.terminalId, data?.shareGrantId)) return;
11932
+ this.webTerminal.resize(data.terminalId, data.cols, data.rows);
11933
+ });
11850
11934
  socket.on("terminal-close", (data) => this.webTerminal.unsubscribe(data.terminalId));
11851
11935
  socket.on("session-archive", (data) => {
11852
11936
  if (typeof data?.sessionId !== "string") return;
@@ -1,8 +1,8 @@
1
1
  import { randomUUID } from 'node:crypto';
2
2
  import { writeFile, rename, unlink } from 'node:fs/promises';
3
3
  import { join, basename } from 'node:path';
4
- import { M as MAX_CHAT_ATTACHMENT_SOURCE_BYTES } from './pushNotifications-B7Ga8Zyf.mjs';
5
- import { e as ensurePrivateDirectory, h as hardenPrivateFile } from './configuration-CQaLZMa-.mjs';
4
+ import { M as MAX_CHAT_ATTACHMENT_SOURCE_BYTES } from './pushNotifications-Db1NGJiA.mjs';
5
+ import { e as ensurePrivateDirectory, h as hardenPrivateFile } from './configuration-D_YrWa_i.mjs';
6
6
 
7
7
  const CLAUDE_ATTACHMENT_KINDS = [
8
8
  "image/jpeg",
@@ -3,8 +3,8 @@
3
3
  var node_crypto = require('node:crypto');
4
4
  var promises = require('node:fs/promises');
5
5
  var path = require('node:path');
6
- var pushNotifications = require('./pushNotifications-DaVlLe7N.cjs');
7
- var configuration = require('./configuration-DZUnfWp2.cjs');
6
+ var pushNotifications = require('./pushNotifications-D2ejrxlN.cjs');
7
+ var configuration = require('./configuration-CDqmWkHO.cjs');
8
8
 
9
9
  const CLAUDE_ATTACHMENT_KINDS = [
10
10
  "image/jpeg",
@@ -1,14 +1,14 @@
1
1
  'use strict';
2
2
 
3
3
  var authRelay = require('./authRelay-Dy1qU9td.cjs');
4
- var configuration = require('./configuration-DZUnfWp2.cjs');
4
+ var configuration = require('./configuration-CDqmWkHO.cjs');
5
5
  var node_crypto = require('node:crypto');
6
6
  var tweetnacl = require('tweetnacl');
7
7
  var axios = require('axios');
8
- var time = require('./time-CbOTVtAt.cjs');
9
- var persistence = require('./persistence-05BAS4Ou.cjs');
10
- var browser = require('./browser-DgufCq1K.cjs');
11
- var logger = require('./logger-Dhc0l3xH.cjs');
8
+ var time = require('./time-UUMqbIq8.cjs');
9
+ var persistence = require('./persistence-Ch78xygf.cjs');
10
+ var browser = require('./browser-DK2GfyEr.cjs');
11
+ var logger = require('./logger-C8anCmdW.cjs');
12
12
 
13
13
  function generateWebAuthUrl(publicKey) {
14
14
  const publicKeyBase64 = authRelay.encodeBase64(publicKey, "base64url");
@@ -1,11 +1,11 @@
1
1
  import chalk from 'chalk';
2
- import { g as readCredentials, r as readSettings, h as clearCredentials, i as clearMachineId } from './persistence-EuUaQKL7.mjs';
3
- import { a as authAndSetupMachineIfNeeded } from './auth-CgdE-j7z.mjs';
4
- import { c as configuration } from './configuration-CQaLZMa-.mjs';
2
+ import { g as readCredentials, r as readSettings, h as clearCredentials, i as clearMachineId } from './persistence-3iZXGbfb.mjs';
3
+ import { a as authAndSetupMachineIfNeeded } from './auth-DRJ_WPn3.mjs';
4
+ import { c as configuration } from './configuration-D_YrWa_i.mjs';
5
5
  import { existsSync, rmSync } from 'node:fs';
6
6
  import { createInterface } from 'node:readline';
7
- import { a as checkIfDaemonRunningAndCleanupStaleState, s as stopDaemon } from './controlClient-Cqhd8ynk.mjs';
8
- import { l as logger } from './logger-BEVIGYKL.mjs';
7
+ import { a as checkIfDaemonRunningAndCleanupStaleState, s as stopDaemon } from './controlClient-Daki7wgo.mjs';
8
+ import { l as logger } from './logger-BcdURxNR.mjs';
9
9
  import os from 'node:os';
10
10
  import { c as credentialRelayProblem } from './authRelay-DhQhkBvX.mjs';
11
11
  import 'node:fs/promises';
@@ -13,11 +13,11 @@ import 'zod';
13
13
  import 'node:crypto';
14
14
  import 'tweetnacl';
15
15
  import 'axios';
16
- import './time-BQWf06hA.mjs';
17
- import './browser-Dx3UOVPP.mjs';
16
+ import './time-BWVJTcWI.mjs';
17
+ import './browser-D2enJJfv.mjs';
18
18
  import 'open';
19
19
  import 'node:path';
20
- import './package-aOUtHYRZ.mjs';
20
+ import './package-Dx3hbh9J.mjs';
21
21
  import 'node:util';
22
22
 
23
23
  function localMachineIdentityStatus(machineId) {
@@ -1,12 +1,12 @@
1
1
  import { e as encodeBase64, c as credentialRelayProblem, f as encodeBase64Url, d as decodeBase64 } from './authRelay-DhQhkBvX.mjs';
2
- import { c as configuration } from './configuration-CQaLZMa-.mjs';
2
+ import { c as configuration } from './configuration-D_YrWa_i.mjs';
3
3
  import { randomUUID, randomBytes } from 'node:crypto';
4
4
  import tweetnacl from 'tweetnacl';
5
5
  import axios from 'axios';
6
- import { d as delay } from './time-BQWf06hA.mjs';
7
- import { g as readCredentials, m as readSettingsOutcome, u as updateSettings, w as writeCredentialsLegacy, n as writeCredentialsDataKey } from './persistence-EuUaQKL7.mjs';
8
- import { o as openBrowser } from './browser-Dx3UOVPP.mjs';
9
- import { l as logger } from './logger-BEVIGYKL.mjs';
6
+ import { d as delay } from './time-BWVJTcWI.mjs';
7
+ import { g as readCredentials, m as readSettingsOutcome, u as updateSettings, w as writeCredentialsLegacy, n as writeCredentialsDataKey } from './persistence-3iZXGbfb.mjs';
8
+ import { o as openBrowser } from './browser-D2enJJfv.mjs';
9
+ import { l as logger } from './logger-BcdURxNR.mjs';
10
10
 
11
11
  function generateWebAuthUrl(publicKey) {
12
12
  const publicKeyBase64 = encodeBase64(publicKey, "base64url");
@@ -1,13 +1,13 @@
1
1
  'use strict';
2
2
 
3
3
  var chalk = require('chalk');
4
- var persistence = require('./persistence-05BAS4Ou.cjs');
5
- var auth = require('./auth-DpIHm7Lb.cjs');
6
- var configuration = require('./configuration-DZUnfWp2.cjs');
4
+ var persistence = require('./persistence-Ch78xygf.cjs');
5
+ var auth = require('./auth-CAkpHr8F.cjs');
6
+ var configuration = require('./configuration-CDqmWkHO.cjs');
7
7
  var node_fs = require('node:fs');
8
8
  var node_readline = require('node:readline');
9
- var controlClient = require('./controlClient-Bfwe0Xpt.cjs');
10
- var logger = require('./logger-Dhc0l3xH.cjs');
9
+ var controlClient = require('./controlClient-BS86Ksm8.cjs');
10
+ var logger = require('./logger-C8anCmdW.cjs');
11
11
  var os = require('node:os');
12
12
  var authRelay = require('./authRelay-Dy1qU9td.cjs');
13
13
  require('node:fs/promises');
@@ -15,11 +15,11 @@ require('zod');
15
15
  require('node:crypto');
16
16
  require('tweetnacl');
17
17
  require('axios');
18
- require('./time-CbOTVtAt.cjs');
19
- require('./browser-DgufCq1K.cjs');
18
+ require('./time-UUMqbIq8.cjs');
19
+ require('./browser-DK2GfyEr.cjs');
20
20
  require('open');
21
21
  require('node:path');
22
- require('./package-CAmlKYcH.cjs');
22
+ require('./package-DkpXQvp1.cjs');
23
23
  require('node:util');
24
24
 
25
25
  function localMachineIdentityStatus(machineId) {