very-happy-cli 0.2.196 → 0.2.198

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 (213) hide show
  1. package/dist/{AcpBackend-RqGkFeeY.mjs → AcpBackend-Bm3EodAb.mjs} +3 -3
  2. package/dist/{AcpBackend-tL_g_UJ5.cjs → AcpBackend-DOuWeCAx.cjs} +3 -3
  3. package/dist/{AcpSessionManager-C-R6yHXc.mjs → AcpSessionManager-BiwuXpbx.mjs} +2 -2
  4. package/dist/{AcpSessionManager-CFB24qBh.cjs → AcpSessionManager-DvsZWTXp.cjs} +2 -2
  5. package/dist/{BasePermissionHandler-CgHLVNKT.mjs → BasePermissionHandler-1QcavYFn.mjs} +1 -1
  6. package/dist/{BasePermissionHandler-C0JS37Jt.cjs → BasePermissionHandler-25RmI4dK.cjs} +1 -1
  7. package/dist/{account-DOil1Hn8.cjs → account-ChUtFYld.cjs} +11 -11
  8. package/dist/{account-EzL-zwwE.mjs → account-DA4mbX3-.mjs} +11 -11
  9. package/dist/{accountService-DL6xhVUa.cjs → accountService-BWUjgHl0.cjs} +4 -4
  10. package/dist/{accountService-DQ21IlBs.mjs → accountService-D7NZrnQd.mjs} +4 -4
  11. package/dist/{acpSessionResume-B01oHWDS.cjs → acpSessionResume-CeQu84Ol.cjs} +1 -1
  12. package/dist/{acpSessionResume-DEOIZUuj.mjs → acpSessionResume-D6YgeofW.mjs} +1 -1
  13. package/dist/{agentHome-DucTue1n.mjs → agentHome-DM6mC64c.mjs} +4 -4
  14. package/dist/{agentHome-BulDO_1K.cjs → agentHome-DevJCRG9.cjs} +4 -4
  15. package/dist/{api-CiNezCys.mjs → api-oceym3w6.mjs} +14 -12
  16. package/dist/{api-fuwEEEkT.cjs → api-te19Pzi3.cjs} +30 -28
  17. package/dist/{apiMachine-CxmiSa2-.cjs → apiMachine-BjhCXg6C.cjs} +117 -44
  18. package/dist/{apiMachine-DCmKjms1.mjs → apiMachine-DCHsqtFQ.mjs} +105 -32
  19. package/dist/{attachmentContent-Cehh7ClR.cjs → attachmentContent-BfCEgPTP.cjs} +2 -2
  20. package/dist/{attachmentContent-CiY3MvdO.mjs → attachmentContent-Dl29U1v1.mjs} +2 -2
  21. package/dist/{auth-DVsH_a8J.mjs → auth-BIkCWkRV.mjs} +5 -5
  22. package/dist/{auth-DHqHrs5d.mjs → auth-BJ8Tej9L.mjs} +8 -8
  23. package/dist/{auth-DHlbjtf7.cjs → auth-SH0o7ue7.cjs} +5 -5
  24. package/dist/{auth-tlMcvk2Y.cjs → auth-SshU0tNW.cjs} +8 -8
  25. package/dist/{auto-Cnn8luKk.mjs → auto-Bdr4sSJk.mjs} +17 -17
  26. package/dist/{auto-DNAa8xDZ.cjs → auto-t1B1Yzb3.cjs} +17 -17
  27. package/dist/{bootstrap-C2XSEyOe.mjs → bootstrap-D8DYLUId.mjs} +2 -2
  28. package/dist/{bootstrap-PeTZ2sAn.cjs → bootstrap-GZDknvPy.cjs} +2 -2
  29. package/dist/{browser-CWWyaf8_.mjs → browser-C-H3QYV2.mjs} +1 -1
  30. package/dist/{browser-Bm24RiFU.cjs → browser-DwCi-9Ya.cjs} +1 -1
  31. package/dist/{claudeAccountEnv-_O3x5AJ1.cjs → claudeAccountEnv-DSaFKajJ.cjs} +1 -1
  32. package/dist/{claudeAccountEnv-CPO6CGNd.mjs → claudeAccountEnv-DmVbGhZb.mjs} +1 -1
  33. package/dist/{claudeLocal-CRG-Q7kS.mjs → claudeLocal-BiM2x9DJ.mjs} +5 -5
  34. package/dist/{claudeLocal-BDWy2pFt.cjs → claudeLocal-Ck1jTve1.cjs} +5 -5
  35. package/dist/{claudeLocalLauncher-B5cOrszW.mjs → claudeLocalLauncher-DzvM0jBo.mjs} +10 -10
  36. package/dist/{claudeLocalLauncher-DmSLoHlw.cjs → claudeLocalLauncher-Jsupvl4V.cjs} +10 -10
  37. package/dist/{claudeSessionFork-OffWLYgd.cjs → claudeSessionFork-CDTbQmYi.cjs} +1 -1
  38. package/dist/{claudeSessionFork-BqV6E0ep.mjs → claudeSessionFork-D-BhXkRa.mjs} +1 -1
  39. package/dist/{client-CfTeXnYS.mjs → client-BRuFIwki.mjs} +2 -2
  40. package/dist/{client-Cg_cuQb1.mjs → client-CISkP897.mjs} +2 -2
  41. package/dist/{client-Ckic3nxZ.cjs → client-D-HEr922.cjs} +2 -2
  42. package/dist/{client-B3lOol4f.mjs → client-E4kW5qjR.mjs} +4 -4
  43. package/dist/{client-B9fcSMXP.cjs → client-oqSAKwmy.cjs} +2 -2
  44. package/dist/{client-YFvImdwH.cjs → client-v6rdLsBH.cjs} +4 -4
  45. package/dist/codex/happyMcpStdioBridge.cjs +16 -16
  46. package/dist/codex/happyMcpStdioBridge.mjs +16 -16
  47. package/dist/{codexAccount-CYhQir50.cjs → codexAccount-CQ4W1Ax8.cjs} +1 -1
  48. package/dist/{codexAccount-iZwmpYti.mjs → codexAccount-CnbDfCOM.mjs} +1 -1
  49. package/dist/{codexAppServerClient-C-UwVMUN.cjs → codexAppServerClient--K-ILfqM.cjs} +3 -3
  50. package/dist/{codexAppServerClient-aV5m-FpZ.mjs → codexAppServerClient-BLasFGTm.mjs} +3 -3
  51. package/dist/{codexCommand-5nWT7F8A.cjs → codexCommand-M1uNblJx.cjs} +48 -48
  52. package/dist/{codexCommand-CI2NTyIF.mjs → codexCommand-Wv1WVNtM.mjs} +48 -48
  53. package/dist/{codexTermination-D18IHgLP.cjs → codexTermination-BumRIUqm.cjs} +1 -1
  54. package/dist/{codexTermination-CLjDP6Ja.mjs → codexTermination-DigTBSJE.mjs} +1 -1
  55. package/dist/{config-BfwjfFSC.mjs → config-Br2fCFwB.mjs} +3 -3
  56. package/dist/{config-B7YtrHi0.cjs → config-Czs0Tucv.cjs} +3 -3
  57. package/dist/{configuration-CWRKSOyj.cjs → configuration-DfRs3WLd.cjs} +1 -1
  58. package/dist/{configuration-C8r6uD9k.mjs → configuration-JBFF7432.mjs} +1 -1
  59. package/dist/{connect-K5HBcM56.mjs → connect-CbCqv-MV.mjs} +13 -13
  60. package/dist/{connect-DALX1hGB.cjs → connect-Cr--b0yl.cjs} +13 -13
  61. package/dist/{context-BqhlGL3u.cjs → context-C5WWlHOl.cjs} +1 -1
  62. package/dist/{context-CtMY-M8T.mjs → context-DLIjT5qU.mjs} +1 -1
  63. package/dist/{controlClient-DyNgxNl7.cjs → controlClient-B61crTpk.cjs} +3 -3
  64. package/dist/{controlClient-DYQ1g2ar.mjs → controlClient-D5BYm3PU.mjs} +3 -3
  65. package/dist/{createSessionMetadata-C4WN8pVK.cjs → createSessionMetadata-BwYysMTH.cjs} +2 -2
  66. package/dist/{createSessionMetadata-CZuEDo2v.mjs → createSessionMetadata-OMKj3e48.mjs} +2 -2
  67. package/dist/{daemonAccounts-CxMJw7x2.cjs → daemonAccounts-CqAnPXDJ.cjs} +2 -2
  68. package/dist/{daemonAccounts-CnAEaJE_.mjs → daemonAccounts-asWvoPKG.mjs} +3 -3
  69. package/dist/{defaultPermissionMode-CpEJ0wlb.mjs → defaultPermissionMode-4KYZA4WF.mjs} +1 -1
  70. package/dist/{defaultPermissionMode-BCWCMONI.cjs → defaultPermissionMode-BItpIZML.cjs} +1 -1
  71. package/dist/{deterministicJson-r4zhG546.cjs → deterministicJson-DIzyb1dQ.cjs} +13 -13
  72. package/dist/{deterministicJson-Dg_0QJAR.mjs → deterministicJson-DnTSkEgb.mjs} +13 -13
  73. package/dist/{doctor-0gLGzwz6.cjs → doctor-Dn1G6QhF.cjs} +7 -7
  74. package/dist/{doctor-COeFzPpz.mjs → doctor-jrvm-tl3.mjs} +7 -7
  75. package/dist/{downloadTarget-CbuUiS5p.mjs → downloadTarget-BtsN_-LN.mjs} +7 -7
  76. package/dist/{downloadTarget-8ovVpDv1.cjs → downloadTarget-DGnCGrDZ.cjs} +7 -7
  77. package/dist/{ensureDaemonRunning-CwlujXmV.mjs → ensureDaemonRunning-DCmXUwNi.mjs} +5 -5
  78. package/dist/{ensureDaemonRunning-Bq-n6xTt.cjs → ensureDaemonRunning-DsvcjXb4.cjs} +5 -5
  79. package/dist/{handleResumeCommand-B5GgmPm_.mjs → handleResumeCommand-CFupxyHT.mjs} +5 -5
  80. package/dist/{handleResumeCommand-muSrYA5y.cjs → handleResumeCommand-hzho-lp7.cjs} +5 -5
  81. package/dist/{index-BUOd8bNd.cjs → index-5TDKOvkU.cjs} +4 -4
  82. package/dist/{index-DKCmDned.mjs → index-BMFLwBCd.mjs} +4 -4
  83. package/dist/{index-D9Hidq-g.cjs → index-BknTkVnR.cjs} +256 -89
  84. package/dist/{index-BRH0XYSO.mjs → index-CHk8F9OY.mjs} +45 -45
  85. package/dist/{index-Dt_YE-zw.cjs → index-CRI-_-YH.cjs} +44 -44
  86. package/dist/{index-D0V-seiN.mjs → index-CZpFhEmE.mjs} +3 -3
  87. package/dist/{index-BZCIkrFj.mjs → index-CofTgtQ3.mjs} +4 -4
  88. package/dist/{index-C27JFCbe.mjs → index-CxiisoO1.mjs} +256 -89
  89. package/dist/{index-CQZg9jKx.cjs → index-DCfEzudP.cjs} +4 -4
  90. package/dist/{index-CnY74Dae.cjs → index-EGwuuFdL.cjs} +3 -3
  91. package/dist/index.cjs +2 -2
  92. package/dist/index.mjs +2 -2
  93. package/dist/{install-BlW2kkPl.cjs → install-CB5eTmzm.cjs} +3 -3
  94. package/dist/{install-CooQf1oU.mjs → install-CeDqNGxI.mjs} +3 -3
  95. package/dist/lib.cjs +12 -12
  96. package/dist/lib.d.cts +9 -0
  97. package/dist/lib.d.mts +9 -0
  98. package/dist/lib.mjs +12 -12
  99. package/dist/{localHappyAgentAuth-oxhpgJOb.cjs → localHappyAgentAuth-B6xdH-Fr.cjs} +1 -1
  100. package/dist/{localHappyAgentAuth-BAK_nqMG.mjs → localHappyAgentAuth-BiIyMoiG.mjs} +1 -1
  101. package/dist/{logger-D1hb3CG8.mjs → logger-BHfBDOsy.mjs} +2 -2
  102. package/dist/{logger-HQ9yDb8R.cjs → logger-BrAF4iuT.cjs} +2 -2
  103. package/dist/{machineMetadata-Dzwn-HjN.cjs → machineMetadata-D5PO2ylb.cjs} +3 -3
  104. package/dist/{machineMetadata-Dxng45Uh.mjs → machineMetadata-Ekniv5o4.mjs} +3 -3
  105. package/dist/{main-D7qre-pa.cjs → main-C8lsRSYS.cjs} +47 -47
  106. package/dist/{main-BP0iY2vQ.mjs → main-HXdcnexS.mjs} +47 -47
  107. package/dist/{mcp-BmDGyj7k.mjs → mcp-C2YD6mq4.mjs} +20 -20
  108. package/dist/{mcp-D3yzLkh8.cjs → mcp-D9sglL02.cjs} +20 -20
  109. package/dist/{mirrorProtocol-C9Zc6GFT.mjs → mirrorProtocol-BLhArCS9.mjs} +12 -5
  110. package/dist/{mirrorProtocol-Cv2otcvM.cjs → mirrorProtocol-CNF1eHsm.cjs} +12 -4
  111. package/dist/{package-CpmoMPuj.mjs → package-BGZo2vAj.mjs} +7 -7
  112. package/dist/{package-Dn7zZkY1.cjs → package-CStJrLG3.cjs} +7 -7
  113. package/dist/{panels-D59PlNoD.cjs → panels-D4_yGw4n.cjs} +5 -5
  114. package/dist/{panels-CQobcX5w.mjs → panels-GVnnEsow.mjs} +5 -5
  115. package/dist/{peerTools-CNzlwuL7.mjs → peerTools-BO-H0wNj.mjs} +5 -5
  116. package/dist/{peerTools-D417O7d-.cjs → peerTools-Drow2-P4.cjs} +5 -5
  117. package/dist/{persistence-BiyvEYaR.cjs → persistence-DGfEdbA5.cjs} +2 -2
  118. package/dist/{persistence-CagHeZ-f.mjs → persistence-DvD-irLh.mjs} +2 -2
  119. package/dist/{piRunnerArgs-kTaNYd23.cjs → piRunnerArgs-C1dLsoXF.cjs} +1 -1
  120. package/dist/{piRunnerArgs-DKU5LoWu.mjs → piRunnerArgs-DwcAwwzm.mjs} +1 -1
  121. package/dist/{piRuntime-BV4fQyZD.mjs → piRuntime-_yRSPgnR.mjs} +1 -1
  122. package/dist/{piRuntime-BI4KNAUY.cjs → piRuntime-d2h0Cska.cjs} +1 -1
  123. package/dist/{piTerminal-WPUtDJAV.cjs → piTerminal-CVB4fa5R.cjs} +22 -22
  124. package/dist/{piTerminal-oObkl3WJ.mjs → piTerminal-WN0AMv9u.mjs} +22 -22
  125. package/dist/{pushNotifications-DRDWUnP-.cjs → pushNotifications-3YsyCEfY.cjs} +16 -3
  126. package/dist/{pushNotifications-4sNESDMv.mjs → pushNotifications-D2UZnoTB.mjs} +16 -3
  127. package/dist/{query-qIbeJ2-r.cjs → query-Ba7UXc_y.cjs} +1 -1
  128. package/dist/{query-6OWHW1U1.mjs → query-_sw0hG6A.mjs} +1 -1
  129. package/dist/{rateLimitWindows-U4fc1-_6.cjs → rateLimitWindows-DiiGHS9r.cjs} +1 -1
  130. package/dist/{rateLimitWindows-4uhuwKnU.mjs → rateLimitWindows-DzXv6p_W.mjs} +1 -1
  131. package/dist/{lidState-VZ1j_QYw.cjs → reconnectGate-BpePVLPu.cjs} +27 -2
  132. package/dist/{lidState-BflRFw38.mjs → reconnectGate-CxLgZCBh.mjs} +27 -3
  133. package/dist/{registerCommonHandlers-CEV9KUsq.cjs → registerCommonHandlers-6iKpECuR.cjs} +2 -2
  134. package/dist/{registerCommonHandlers-PTJ8TBj9.mjs → registerCommonHandlers-ChdVwZW6.mjs} +2 -2
  135. package/dist/{registerKillSessionHandler-C6F1sjoo.cjs → registerKillSessionHandler-BDTgrstx.cjs} +6 -6
  136. package/dist/{registerKillSessionHandler-D4SSwQj8.mjs → registerKillSessionHandler-D6wYbAIt.mjs} +6 -6
  137. package/dist/{registerSideQuestionHandler-4mRv0Msq.mjs → registerSideQuestionHandler-C3K_qKwA.mjs} +4 -4
  138. package/dist/{registerSideQuestionHandler-ByUnjI3V.cjs → registerSideQuestionHandler-U4LGga_Z.cjs} +4 -4
  139. package/dist/{remoteSessionClient-CfYDFlKm.mjs → remoteSessionClient-CFNM8UEh.mjs} +5 -5
  140. package/dist/{remoteSessionClient-CUk6haD7.cjs → remoteSessionClient-DSC5Cj21.cjs} +5 -5
  141. package/dist/{reportProgressTool-BCn5oG52.mjs → reportProgressTool-CFmDK8ag.mjs} +3 -3
  142. package/dist/{reportProgressTool-C1JOvo6T.cjs → reportProgressTool-Cr25LWeW.cjs} +3 -3
  143. package/dist/{run-D2SlfZPP.cjs → run-Be0yicft.cjs} +41 -41
  144. package/dist/{run-DC8BIklA.mjs → run-D0D73Dam.mjs} +41 -41
  145. package/dist/{runClaude-D6fqN9PD.mjs → runClaude-1NP467UM.mjs} +25 -25
  146. package/dist/{runClaude-BE-5GgIZ.cjs → runClaude-BOxvKK4H.cjs} +25 -25
  147. package/dist/{runClaudeDeps-BmdwskeI.mjs → runClaudeDeps-BPzLoWyT.mjs} +48 -48
  148. package/dist/{runClaudeDeps-W0nv2vHL.cjs → runClaudeDeps-CkRlQx2Y.cjs} +42 -42
  149. package/dist/{runGemini-Da_d-2kV.cjs → runGemini-BowXJRXb.cjs} +35 -35
  150. package/dist/{runGemini-C3Ipeu1i.mjs → runGemini-j2n5ZlOL.mjs} +35 -35
  151. package/dist/{runOpenClaw-BoI6nbKB.mjs → runOpenClaw-6zrT8dPO.mjs} +18 -18
  152. package/dist/{runOpenClaw-af5qDNU0.cjs → runOpenClaw-DLsnZnFM.cjs} +18 -18
  153. package/dist/{sandbox-CjoyUSGa.mjs → sandbox-BFbT6HDl.mjs} +4 -4
  154. package/dist/{sandbox-UGF68GrE.cjs → sandbox-DLijcRKk.cjs} +4 -4
  155. package/dist/selfCheck-DCIqaiMu.mjs +88 -0
  156. package/dist/{selfCheck-Cr8eAw4m.cjs → selfCheck-U-A1DCi9.cjs} +39 -39
  157. package/dist/{send-CVSht9s_.cjs → send-CGxo_QUR.cjs} +8 -8
  158. package/dist/{send-gqX0-i4p.mjs → send-CQGKb3Kb.mjs} +8 -8
  159. package/dist/{server-BPgVv-BG.cjs → server-CWbcDBjV.cjs} +6 -6
  160. package/dist/{server-DxlNqWJo.mjs → server-DR5bQzTq.mjs} +4 -4
  161. package/dist/{sessionLock-D2usWXAg.cjs → sessionLock-CJiayMcZ.cjs} +3 -3
  162. package/dist/{sessionLock-BfvR9BGB.mjs → sessionLock-DqFKSW8u.mjs} +3 -3
  163. package/dist/{sessionOps-JRyQhF5s.cjs → sessionOps-Cw_JivR2.cjs} +4 -4
  164. package/dist/{sessionOps-OmRqUFm4.mjs → sessionOps-D-SDNs-D.mjs} +4 -4
  165. package/dist/{sessionProvider-DTEdidBc.mjs → sessionProvider-Cb-LtbFQ.mjs} +10 -10
  166. package/dist/{sessionProvider-BpscgwwC.cjs → sessionProvider-JEAWxBF6.cjs} +10 -10
  167. package/dist/{sessionScanner-BlAOpqMh.mjs → sessionScanner-C2M697xz.mjs} +3 -3
  168. package/dist/{sessionScanner-C_qVc1ok.cjs → sessionScanner-zJrc_Oe0.cjs} +3 -3
  169. package/dist/{sessions-CnjHHllR.mjs → sessions-CIxnjpCM.mjs} +10 -10
  170. package/dist/{sessions-7iyjxti9.cjs → sessions-D2yLkE5R.cjs} +10 -10
  171. package/dist/{setupOfflineReconnection-IKEI7fLJ.mjs → setupOfflineReconnection-DzV1wB4y.mjs} +2 -2
  172. package/dist/{setupOfflineReconnection-BCbJa5mT.cjs → setupOfflineReconnection-Uu3tqISz.cjs} +2 -2
  173. package/dist/{spawn-CbfcClhj.mjs → spawn-CeeM-Piz.mjs} +14 -14
  174. package/dist/{spawn-CxEl0Dyz.cjs → spawn-DD1Sv8Ri.cjs} +14 -14
  175. package/dist/{spawnAgents-Cm23BW-D.cjs → spawnAgents-CrHgpAzU.cjs} +1 -1
  176. package/dist/{spawnAgents-N3jxdNJC.mjs → spawnAgents-DEBfpoPZ.mjs} +1 -1
  177. package/dist/{spawnHappyCLI-C8gMHJu5.mjs → spawnHappyCLI-CUfe8n_m.mjs} +1 -1
  178. package/dist/{spawnHappyCLI-CHSlXWUe.cjs → spawnHappyCLI-CYzlz9Sl.cjs} +1 -1
  179. package/dist/{startFileWatcher-BGpYPz6L.cjs → startFileWatcher-C0u3J6Bj.cjs} +1 -1
  180. package/dist/{startFileWatcher-6hslFu_B.mjs → startFileWatcher-JdO3v65I.mjs} +1 -1
  181. package/dist/{startupSessionCreate-B7jrCZUD.mjs → startupSessionCreate-CfBajt2k.mjs} +3 -3
  182. package/dist/{startupSessionCreate-CltDtCEF.cjs → startupSessionCreate-s1ekIs2Z.cjs} +3 -3
  183. package/dist/{store-BlPvTr_Q.mjs → store-DEhdblkI.mjs} +1 -1
  184. package/dist/{store-aa3CVNwS.cjs → store-QBBJB5Ox.cjs} +1 -1
  185. package/dist/{streamRelay-C2Lb2z39.cjs → streamRelay-BVrCYh2G.cjs} +1 -1
  186. package/dist/{streamRelay-DFZyAPD_.mjs → streamRelay-DymKR1Rk.mjs} +1 -1
  187. package/dist/{sync-DtzoF9sw.mjs → sync-BLGrIKN9.mjs} +1 -1
  188. package/dist/{sync-DfI78smj.cjs → sync-BO4DRSub.cjs} +1 -1
  189. package/dist/{systemPrompt-HZNR9rjt.cjs → systemPrompt-DTUJZOn6.cjs} +2 -2
  190. package/dist/{systemPrompt-B1Xd99hK.mjs → systemPrompt-YylizkJs.mjs} +2 -2
  191. package/dist/{teams-fFX-L_ms.cjs → teams-DnLPBPKx.cjs} +7 -7
  192. package/dist/{teams-Vk75H6BZ.mjs → teams-zkGFcwsG.mjs} +7 -7
  193. package/dist/{template-CJ8uLlD8.mjs → template-BGlDAjbM.mjs} +1 -1
  194. package/dist/{template-B1AORlgU.cjs → template-uSKZ53Sv.cjs} +1 -1
  195. package/dist/{terminals-Dlg0x3nY.mjs → terminals-Dc38XmZv.mjs} +9 -5
  196. package/dist/{terminals-B_bfC9c2.cjs → terminals-dK3Lrjfp.cjs} +9 -5
  197. package/dist/{time-BqPZjTpo.cjs → time-Cv4hbCLT.cjs} +1 -1
  198. package/dist/{time-CgAwVt5R.mjs → time-DZE0879N.mjs} +1 -1
  199. package/dist/{titleGenerator-D2UB7Uyr.mjs → titleGenerator-B2BbmJuc.mjs} +2 -2
  200. package/dist/{titleGenerator-ijVOuv3J.cjs → titleGenerator-D2ehxbvK.cjs} +3 -3
  201. package/dist/tmuxSocket-BmZyixRM.mjs +29 -0
  202. package/dist/{tmuxSocket-D-Xt6Vn-.cjs → tmuxSocket-Dg11Olx0.cjs} +12 -0
  203. package/dist/{todo-vCzaIwNp.cjs → todo-9kn_9N-H.cjs} +6 -6
  204. package/dist/{todo-CCuqtD0O.mjs → todo-DUpW9d8p.mjs} +6 -6
  205. package/dist/{tools-DthGQoo3.mjs → tools-gIDXwAzk.mjs} +1 -1
  206. package/dist/{tools-CL8h3fqh.cjs → tools-rMr-wPIc.cjs} +1 -1
  207. package/dist/{uninstall-DCJh4UoO.mjs → uninstall-CBlRzvNa.mjs} +3 -3
  208. package/dist/{uninstall-CIvThBvI.cjs → uninstall-CHx5TOHi.cjs} +3 -3
  209. package/dist/{wrapperAccount-RPtq8BwD.mjs → wrapperAccount-Ce78kKMo.mjs} +2 -2
  210. package/dist/{wrapperAccount-BubTurHU.cjs → wrapperAccount-EkmR4V-v.cjs} +2 -2
  211. package/package.json +7 -7
  212. package/dist/selfCheck-CNrOZgBv.mjs +0 -88
  213. package/dist/tmuxSocket-B8Yx20sT.mjs +0 -19
@@ -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-D1hb3CG8.mjs';
4
- import { R as RpcHandlerManager, i as isRateQuotaCode, p as pauseForRateQuota, s as socketConnectGuard, c as connectGuarded, a as answerSocketRequest, e as shouldReconnect, d as describeSocketAckDrop } from './lidState-BflRFw38.mjs';
5
- import { i as isClaudeSessionId, s as stableVersion, a as sanitizeTagList, p as pickMirrorForTerminal, l as liveSnapshotChanged, b as sanitizeLiveSnapshot, c as serializeLiveSnapshot, r as registerWorktreeHandlers, d as configureWorktreeService, e as summarizeSpawnSessionForLog, f as parseMirrorSendParams } from './mirrorProtocol-C9Zc6GFT.mjs';
6
- import { c as configuration } from './configuration-C8r6uD9k.mjs';
3
+ import { l as logger } from './logger-BHfBDOsy.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-CxLgZCBh.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-BLhArCS9.mjs';
6
+ import { c as configuration } from './configuration-JBFF7432.mjs';
7
7
  import { w as withCurrentCliUpdateState } from './cliUpdate-Y34VGe9Y.mjs';
8
- import { r as registerCommonHandlers } from './registerCommonHandlers-PTJ8TBj9.mjs';
8
+ import { r as registerCommonHandlers } from './registerCommonHandlers-ChdVwZW6.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-CagHeZ-f.mjs';
14
+ import { r as readSettings, c as readPersistedSessions, p as readTrackedClaudeSessionIds, q as readTrackedCodexThreadIds } from './persistence-DvD-irLh.mjs';
15
15
  import { M as ModelConfigError } from './fileStore-5qpetZS0.mjs';
16
- import { a8 as AGENT_PROFILE_RPC, a9 as RelayCandidatesResponseSchema, a4 as RelayAssignmentResponseSchema, a3 as ReleaseDrainNoticeSchema } from './index-C27JFCbe.mjs';
17
- import { a as AccountError } from './accountService-DQ21IlBs.mjs';
16
+ import { a8 as AGENT_PROFILE_RPC, a9 as RelayCandidatesResponseSchema, a4 as RelayAssignmentResponseSchema, a3 as ReleaseDrainNoticeSchema } from './index-CxiisoO1.mjs';
17
+ import { a as AccountError } from './accountService-D7NZrnQd.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-CgAwVt5R.mjs';
20
+ import { b as backoff, d as delay } from './time-DZE0879N.mjs';
21
21
  import * as pty from 'node-pty';
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-Dlg0x3nY.mjs';
23
- import { t as tmuxArgs, V as VH_TMUX_SOCKET_ENV, a as scrubTmuxClientEnv } from './tmuxSocket-B8Yx20sT.mjs';
24
- import { locateClaudeConversation, refreshAgentHomes } from './index-BZCIkrFj.mjs';
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
+ 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-CofTgtQ3.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-BAK_nqMG.mjs';
31
+ import { d as detectResumeSupport } from './localHappyAgentAuth-BiIyMoiG.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-BqV6E0ep.mjs';
35
- import { C as CodexAppServerClient } from './codexAppServerClient-aV5m-FpZ.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-D-BhXkRa.mjs';
35
+ import { C as CodexAppServerClient } from './codexAppServerClient-BLasFGTm.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-4uhuwKnU.mjs';
37
+ import { p as planRateLimitWrite, m as mergeRateLimitReports } from './rateLimitWindows-DzXv6p_W.mjs';
38
38
  import 'chalk';
39
39
  import 'node:util';
40
40
  import 'os';
41
41
  import 'child_process';
42
- import './package-CpmoMPuj.mjs';
42
+ import './package-BGZo2vAj.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-CPO6CGNd.mjs';
51
- import './store-BlPvTr_Q.mjs';
52
- import './codexAccount-iZwmpYti.mjs';
50
+ import './claudeAccountEnv-DmVbGhZb.mjs';
51
+ import './store-DEhdblkI.mjs';
52
+ import './codexAccount-CnbDfCOM.mjs';
53
53
  import 'node:readline';
54
54
  import 'tweetnacl';
55
55
  import './terminalTitleSuggest-CeKsX_V6.mjs';
@@ -465,6 +465,7 @@ function planTerminalRestore(record, facts) {
465
465
  title: record.title ?? record.attachTmux,
466
466
  manual: true,
467
467
  tags: record.tags,
468
+ ...record.projectId ? { projectId: record.projectId } : {},
468
469
  command: attachStartupCommand(matches[0].id, facts.attachSocket),
469
470
  attachTmux: record.attachTmux,
470
471
  ...recordGeometry(record)
@@ -479,6 +480,7 @@ function planTerminalRestore(record, facts) {
479
480
  title: record.title,
480
481
  manual: record.manual === true,
481
482
  tags: record.tags,
483
+ ...record.projectId ? { projectId: record.projectId } : {},
482
484
  ...resumable ? { command: `claude --resume ${record.claudeSessionId}` } : {},
483
485
  ...recordGeometry(record)
484
486
  };
@@ -6031,6 +6033,7 @@ function selectAutoRestore(candidates, opts) {
6031
6033
  terminalId: c.id,
6032
6034
  ...c.tags !== void 0 ? { tags: c.tags } : {},
6033
6035
  ...c.manual ? { manual: true } : {},
6036
+ ...c.projectId ? { projectId: c.projectId } : {},
6034
6037
  ...c.cols !== void 0 && c.rows !== void 0 ? { cols: c.cols, rows: c.rows } : {},
6035
6038
  cwd: c.cwd,
6036
6039
  title: c.title,
@@ -6080,7 +6083,7 @@ function sanitizeClosedTerminals(raw, max = CLOSED_TERMINALS_MAX) {
6080
6083
  const out = [];
6081
6084
  for (const item of raw) {
6082
6085
  if (!item || typeof item !== "object") continue;
6083
- const { id, title, cwd, mirrorSessionId, claudeSessionId, reason, closedAt, tags, manual, attachTmux } = item;
6086
+ const { id, title, cwd, mirrorSessionId, claudeSessionId, reason, closedAt, tags, manual, attachTmux, projectId } = item;
6084
6087
  if (typeof id !== "string" || id.length === 0 || typeof closedAt !== "number") continue;
6085
6088
  if (seen.has(id)) continue;
6086
6089
  seen.add(id);
@@ -6095,6 +6098,7 @@ function sanitizeClosedTerminals(raw, max = CLOSED_TERMINALS_MAX) {
6095
6098
  ...tagList !== void 0 ? { tags: tagList } : {},
6096
6099
  ...manual === true ? { manual: true } : {},
6097
6100
  ...typeof attachTmux === "string" && attachTmux ? { attachTmux } : {},
6101
+ ...projectField(projectId),
6098
6102
  closedAt
6099
6103
  });
6100
6104
  }
@@ -6111,6 +6115,7 @@ function directTerminalItems(sessions, tmuxIds) {
6111
6115
  id: s.id,
6112
6116
  ...title ? { title } : {},
6113
6117
  tags: s.direct.tags ?? [],
6118
+ projectId: s.direct.projectId ?? null,
6114
6119
  ...s.direct.manual ? { manual: true } : {},
6115
6120
  cwd: s.direct.cwd,
6116
6121
  createdAt: s.direct.createdAt,
@@ -6858,7 +6863,7 @@ function startupInjectionArgs(tmuxSession, command) {
6858
6863
  ];
6859
6864
  }
6860
6865
  function seenInfoOf(t) {
6861
- return { title: t.title, cwd: t.cwd, tags: t.tags, manual: t.manual, attachTmux: t.attachTmux, ...seenGeometry(t.paneCols, t.paneRows) };
6866
+ return { title: t.title, cwd: t.cwd, tags: t.tags, manual: t.manual, attachTmux: t.attachTmux, ...t.projectId ? { projectId: t.projectId } : {}, ...seenGeometry(t.paneCols, t.paneRows) };
6862
6867
  }
6863
6868
  function seenGeometry(cols, rows) {
6864
6869
  return cols !== void 0 && rows !== void 0 ? { cols, rows } : {};
@@ -6878,7 +6883,9 @@ function terminalListSignature(items) {
6878
6883
  // list, or the web never learns the toggle became available.
6879
6884
  t.mirrorSessionId ?? "",
6880
6885
  t.attachTmux ?? "",
6881
- t.direct ? 1 : 0
6886
+ t.direct ? 1 : 0,
6887
+ // B-868: moving a terminal between projects must push at once.
6888
+ t.projectId ?? ""
6882
6889
  ]);
6883
6890
  return JSON.stringify(canon);
6884
6891
  }
@@ -7730,6 +7737,7 @@ class WebTerminalManager {
7730
7737
  tags: info.tags,
7731
7738
  manual: info.manual,
7732
7739
  ...info.attachTmux ? { attachTmux: info.attachTmux } : {},
7740
+ ...info.projectId ? { projectId: info.projectId } : {},
7733
7741
  ...seenGeometry(info.cols, info.rows),
7734
7742
  // Live binding first (authoritative while it exists), persisted
7735
7743
  // metadata as the fallback once the mirror has been torn down.
@@ -7785,6 +7793,7 @@ class WebTerminalManager {
7785
7793
  tags: info.tags,
7786
7794
  manual: info.manual,
7787
7795
  ...info.attachTmux ? { attachTmux: info.attachTmux } : {},
7796
+ ...info.projectId ? { projectId: info.projectId } : {},
7788
7797
  ...seenGeometry(info.cols, info.rows),
7789
7798
  mirrorSessionId: mirror?.sessionId,
7790
7799
  claudeSessionId: mirror?.claudeSessionId,
@@ -7798,6 +7807,7 @@ class WebTerminalManager {
7798
7807
  cwd: info.cwd,
7799
7808
  tags: info.tags,
7800
7809
  manual: info.manual,
7810
+ ...info.projectId ? { projectId: info.projectId } : {},
7801
7811
  ...seenGeometry(info.cols, info.rows),
7802
7812
  seenAt: info.seenAt,
7803
7813
  claudeSessionId: mirror?.claudeSessionId
@@ -7988,6 +7998,14 @@ class WebTerminalManager {
7988
7998
  { stdio: "ignore", timeout: TMUX_PROBE_TIMEOUT_MS, env }
7989
7999
  );
7990
8000
  }
8001
+ const projectId = validateTerminalProjectId(plan.projectId);
8002
+ if (projectId) {
8003
+ spawnSync(
8004
+ "tmux",
8005
+ tmuxArgs(["set-option", "-t", `=${name}:`, "@vh_project", projectId]),
8006
+ { stdio: "ignore", timeout: TMUX_PROBE_TIMEOUT_MS, env }
8007
+ );
8008
+ }
7991
8009
  if (plan.command) {
7992
8010
  const command = withTerminalHooks(plan.command, plan.terminalId, this.claudeVersion.current());
7993
8011
  for (const argv of startupInjectionArgs(name, command)) {
@@ -8001,7 +8019,7 @@ class WebTerminalManager {
8001
8019
  * would care about changed (see liveSnapshotChanged). */
8002
8020
  persistLiveSnapshot(live, now) {
8003
8021
  const candidate = /* @__PURE__ */ new Map();
8004
- for (const [id, info] of live) candidate.set(id, { title: info.title, cwd: info.cwd, tags: info.tags, manual: info.manual, ...info.attachTmux ? { attachTmux: info.attachTmux } : {}, ...seenGeometry(info.cols, info.rows), seenAt: now });
8022
+ for (const [id, info] of live) candidate.set(id, { title: info.title, cwd: info.cwd, tags: info.tags, manual: info.manual, ...info.attachTmux ? { attachTmux: info.attachTmux } : {}, ...info.projectId ? { projectId: info.projectId } : {}, ...seenGeometry(info.cols, info.rows), seenAt: now });
8005
8023
  if (!liveSnapshotChanged(this.lastPersistedSnapshot, candidate)) return;
8006
8024
  this.lastPersistedSnapshot = candidate;
8007
8025
  saveLiveSnapshot(candidate);
@@ -8222,7 +8240,7 @@ class WebTerminalManager {
8222
8240
  }
8223
8241
  }
8224
8242
  if (createdNew) {
8225
- attachedTmux = this.injectIntoCreated(tmuxSession, attachTarget, opts.startupCommand, env);
8243
+ attachedTmux = this.injectIntoCreated(tmuxSession, attachTarget, opts.startupCommand, env, opts.projectId);
8226
8244
  } else if (opts.attachTmux && !attachOnly) {
8227
8245
  const stored = spawnSync(
8228
8246
  "tmux",
@@ -8245,7 +8263,7 @@ class WebTerminalManager {
8245
8263
  { stdio: "ignore", timeout: TMUX_CREATE_TIMEOUT_MS, env }
8246
8264
  );
8247
8265
  createdNew = retry.status === 0;
8248
- if (createdNew) attachedTmux = this.injectIntoCreated(tmuxSession, attachTarget, opts.startupCommand, env);
8266
+ if (createdNew) attachedTmux = this.injectIntoCreated(tmuxSession, attachTarget, opts.startupCommand, env, opts.projectId);
8249
8267
  }
8250
8268
  }
8251
8269
  if (!attachOnly && !createdNew) {
@@ -8324,7 +8342,8 @@ class WebTerminalManager {
8324
8342
  }
8325
8343
  }
8326
8344
  const created = new TerminalSession(id, { kind: "pty", pty: proc }, void 0, cols, rows);
8327
- created.direct = { cwd, createdAt: Date.now() };
8345
+ const createProject = validateTerminalProjectId(opts.projectId);
8346
+ created.direct = { cwd, createdAt: Date.now(), ...createProject ? { projectId: createProject } : {} };
8328
8347
  created.onTitleChange((title) => {
8329
8348
  if (created.direct && !created.direct.manual) created.direct.title = deriveAutoTitle(title, os.hostname(), created.direct.cwd);
8330
8349
  });
@@ -8372,7 +8391,14 @@ class WebTerminalManager {
8372
8391
  * records / restore and types the attach line; otherwise the ordinary
8373
8392
  * startup command runs. Returns what to echo as `attachedTmux`.
8374
8393
  */
8375
- injectIntoCreated(tmuxSession, attachTarget, startupCommand, env) {
8394
+ injectIntoCreated(tmuxSession, attachTarget, startupCommand, env, projectId) {
8395
+ const project = validateTerminalProjectId(projectId);
8396
+ if (project) {
8397
+ try {
8398
+ spawnSync("tmux", tmuxArgs(["set-option", "-t", `=${tmuxSession}:`, "@vh_project", project]), { stdio: "ignore", timeout: TMUX_PROBE_TIMEOUT_MS, env });
8399
+ } catch {
8400
+ }
8401
+ }
8376
8402
  if (attachTarget) {
8377
8403
  for (const a of [
8378
8404
  ["set-option", "-t", `=${tmuxSession}:`, "@vh_title", attachTarget.name],
@@ -8693,6 +8719,7 @@ class WebTerminalManager {
8693
8719
  cwd: liveDirect.direct.cwd,
8694
8720
  tags: liveDirect.direct.tags ?? [],
8695
8721
  ...liveDirect.direct.manual ? { manual: true } : {},
8722
+ ...liveDirect.direct.projectId ? { projectId: liveDirect.direct.projectId } : {},
8696
8723
  reason: "closed",
8697
8724
  closedAt: Date.now()
8698
8725
  });
@@ -8736,6 +8763,7 @@ class WebTerminalManager {
8736
8763
  tags: info.tags,
8737
8764
  manual: info.manual,
8738
8765
  ...info.attachTmux ? { attachTmux: info.attachTmux } : {},
8766
+ ...info.projectId ? { projectId: info.projectId } : {},
8739
8767
  ...seenGeometry(info.cols, info.rows),
8740
8768
  mirrorSessionId: this.mirrorResolver?.(terminalId) ?? mirror?.sessionId,
8741
8769
  claudeSessionId: mirror?.claudeSessionId,
@@ -8826,6 +8854,7 @@ class WebTerminalManager {
8826
8854
  title,
8827
8855
  // Always include [] so Web can feature-detect tag support.
8828
8856
  tags: s.tags,
8857
+ projectId: s.projectId,
8829
8858
  cwd: s.cwd,
8830
8859
  createdAt: s.created,
8831
8860
  // tmux last-activity (epoch s) → ms; optional so old daemons
@@ -9066,6 +9095,34 @@ class WebTerminalManager {
9066
9095
  return false;
9067
9096
  }
9068
9097
  }
9098
+ /** B-868: put the terminal in a Very Happy project, or take it out (null).
9099
+ * Only the id is stored (`@vh_project`); the web resolves it against the
9100
+ * account's projects. Nothing is ever injected into the terminal. */
9101
+ setProject(terminalId, projectId) {
9102
+ const direct = this.terminals.get(terminalId)?.direct;
9103
+ if (!direct && !isTmuxAvailable()) return false;
9104
+ if (!/^[a-zA-Z0-9_-]{1,64}$/.test(terminalId)) return false;
9105
+ const valid = validateTerminalProjectId(projectId);
9106
+ if (valid === void 0) return false;
9107
+ if (direct) {
9108
+ if (valid) direct.projectId = valid;
9109
+ else delete direct.projectId;
9110
+ this.kickListRefresh();
9111
+ return true;
9112
+ }
9113
+ const target = `=vh-${terminalId}:`;
9114
+ try {
9115
+ const r = spawnSync("tmux", tmuxArgs(valid ? ["set-option", "-t", target, "@vh_project", valid] : ["set-option", "-u", "-t", target, "@vh_project"]), {
9116
+ stdio: "ignore",
9117
+ env: ptyEnv()
9118
+ });
9119
+ if (r.status !== 0) return false;
9120
+ this.kickListRefresh();
9121
+ return true;
9122
+ } catch {
9123
+ return false;
9124
+ }
9125
+ }
9069
9126
  }
9070
9127
 
9071
9128
  const UUID_RE$4 = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
@@ -10914,7 +10971,7 @@ class ApiMachineClient {
10914
10971
  this.syncResumeSessionRpcRegistration();
10915
10972
  this.syncRestartSessionRpcRegistration();
10916
10973
  this.rpcHandlerManager.registerHandler("open-terminal", async (params) => {
10917
- const { terminalId, cols, rows, cwd, fromSeq, encStream, startupCommand, resub, attachOnly, streamMode, attachTmux } = params || {};
10974
+ const { terminalId, cols, rows, cwd, fromSeq, encStream, startupCommand, resub, attachOnly, streamMode, attachTmux, projectId } = params || {};
10918
10975
  const attach = attachTmux && typeof attachTmux === "object" && typeof attachTmux.id === "string" && typeof attachTmux.name === "string" ? { id: attachTmux.id, name: attachTmux.name } : void 0;
10919
10976
  const result = await this.webTerminal.open({
10920
10977
  terminalId,
@@ -10926,7 +10983,9 @@ class ApiMachineClient {
10926
10983
  resub,
10927
10984
  attachOnly,
10928
10985
  streamMode: streamMode === "lines" ? "lines" : void 0,
10929
- ...attach ? { attachTmux: attach } : {}
10986
+ ...attach ? { attachTmux: attach } : {},
10987
+ // B-868: create-only; validated inside open().
10988
+ ...typeof projectId === "string" ? { projectId } : {}
10930
10989
  });
10931
10990
  if (encStream) {
10932
10991
  this.encTerminals.add(result.terminalId);
@@ -11024,6 +11083,16 @@ class ApiMachineClient {
11024
11083
  }
11025
11084
  return { type: "success" };
11026
11085
  });
11086
+ this.rpcHandlerManager.registerHandler("set-terminal-project", async (params) => {
11087
+ const { terminalId, projectId } = params || {};
11088
+ if (typeof terminalId !== "string" || !terminalId || projectId === void 0) {
11089
+ throw new Error("terminalId and projectId are required");
11090
+ }
11091
+ if (!this.webTerminal.setProject(terminalId, projectId)) {
11092
+ throw new Error("Failed to set terminal project (invalid id, tmux unavailable, or session gone)");
11093
+ }
11094
+ return { type: "success" };
11095
+ });
11027
11096
  this.rpcHandlerManager.registerHandler("stop-session", (params) => {
11028
11097
  const { sessionId } = params || {};
11029
11098
  if (!sessionId) {
@@ -11537,6 +11606,8 @@ class ApiMachineClient {
11537
11606
  codexHistory: { rpcAvailable: true, detectedAt: now },
11538
11607
  // B-549 capability flag: `history-search` (same restamp discipline).
11539
11608
  historySearch: { rpcAvailable: true, detectedAt: now },
11609
+ // B-868 capability flag: `set-terminal-project` (same restamp discipline).
11610
+ terminalProjects: { rpcAvailable: true, detectedAt: now },
11540
11611
  // B-084: closed records survive daemon restarts (persisted
11541
11612
  // in closed-terminals.json), so the connect snapshot ships
11542
11613
  // them too — not just the incremental pushes.
@@ -11846,17 +11917,19 @@ class ApiMachineClient {
11846
11917
  }
11847
11918
  startSmartReconnect() {
11848
11919
  if (this.reconnectInterval) return;
11920
+ const gate = createReconnectGate();
11849
11921
  this.reconnectInterval = setInterval(() => {
11850
11922
  if (this.socket.connected) {
11851
11923
  clearInterval(this.reconnectInterval);
11852
11924
  this.reconnectInterval = null;
11853
11925
  return;
11854
11926
  }
11855
- if (!shouldReconnect()) {
11927
+ const decision = gate.decide(shouldReconnect());
11928
+ if (decision === "wait") {
11856
11929
  logger.debug("[API MACHINE] Still not ready to reconnect");
11857
11930
  return;
11858
11931
  }
11859
- logger.debug("[API MACHINE] Attempting reconnect");
11932
+ logger.debug(decision === "force" ? "[API MACHINE] Still not ready after repeated checks \u2014 forcing a reconnect attempt" : "[API MACHINE] Attempting reconnect");
11860
11933
  connectGuarded(this.socket, "reconnect-interval", guardOptions);
11861
11934
  }, 3e3);
11862
11935
  if (shouldReconnect()) {
@@ -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-DRDWUnP-.cjs');
7
- var configuration = require('./configuration-CWRKSOyj.cjs');
6
+ var pushNotifications = require('./pushNotifications-3YsyCEfY.cjs');
7
+ var configuration = require('./configuration-DfRs3WLd.cjs');
8
8
 
9
9
  const CLAUDE_ATTACHMENT_KINDS = [
10
10
  "image/jpeg",
@@ -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-4sNESDMv.mjs';
5
- import { e as ensurePrivateDirectory, h as hardenPrivateFile } from './configuration-C8r6uD9k.mjs';
4
+ import { M as MAX_CHAT_ATTACHMENT_SOURCE_BYTES } from './pushNotifications-D2UZnoTB.mjs';
5
+ import { e as ensurePrivateDirectory, h as hardenPrivateFile } from './configuration-JBFF7432.mjs';
6
6
 
7
7
  const CLAUDE_ATTACHMENT_KINDS = [
8
8
  "image/jpeg",
@@ -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-C8r6uD9k.mjs';
2
+ import { c as configuration } from './configuration-JBFF7432.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-CgAwVt5R.mjs';
7
- import { g as readCredentials, m as readSettingsOutcome, u as updateSettings, w as writeCredentialsLegacy, n as writeCredentialsDataKey } from './persistence-CagHeZ-f.mjs';
8
- import { o as openBrowser } from './browser-CWWyaf8_.mjs';
9
- import { l as logger } from './logger-D1hb3CG8.mjs';
6
+ import { d as delay } from './time-DZE0879N.mjs';
7
+ import { g as readCredentials, m as readSettingsOutcome, u as updateSettings, w as writeCredentialsLegacy, n as writeCredentialsDataKey } from './persistence-DvD-irLh.mjs';
8
+ import { o as openBrowser } from './browser-C-H3QYV2.mjs';
9
+ import { l as logger } from './logger-BHfBDOsy.mjs';
10
10
 
11
11
  function generateWebAuthUrl(publicKey) {
12
12
  const publicKeyBase64 = 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-CagHeZ-f.mjs';
3
- import { a as authAndSetupMachineIfNeeded } from './auth-DVsH_a8J.mjs';
4
- import { c as configuration } from './configuration-C8r6uD9k.mjs';
2
+ import { g as readCredentials, r as readSettings, h as clearCredentials, i as clearMachineId } from './persistence-DvD-irLh.mjs';
3
+ import { a as authAndSetupMachineIfNeeded } from './auth-BIkCWkRV.mjs';
4
+ import { c as configuration } from './configuration-JBFF7432.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-DYQ1g2ar.mjs';
8
- import { l as logger } from './logger-D1hb3CG8.mjs';
7
+ import { a as checkIfDaemonRunningAndCleanupStaleState, s as stopDaemon } from './controlClient-D5BYm3PU.mjs';
8
+ import { l as logger } from './logger-BHfBDOsy.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-CgAwVt5R.mjs';
17
- import './browser-CWWyaf8_.mjs';
16
+ import './time-DZE0879N.mjs';
17
+ import './browser-C-H3QYV2.mjs';
18
18
  import 'open';
19
19
  import 'node:path';
20
- import './package-CpmoMPuj.mjs';
20
+ import './package-BGZo2vAj.mjs';
21
21
  import 'node:util';
22
22
 
23
23
  function localMachineIdentityStatus(machineId) {
@@ -1,14 +1,14 @@
1
1
  'use strict';
2
2
 
3
3
  var authRelay = require('./authRelay-Dy1qU9td.cjs');
4
- var configuration = require('./configuration-CWRKSOyj.cjs');
4
+ var configuration = require('./configuration-DfRs3WLd.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-BqPZjTpo.cjs');
9
- var persistence = require('./persistence-BiyvEYaR.cjs');
10
- var browser = require('./browser-Bm24RiFU.cjs');
11
- var logger = require('./logger-HQ9yDb8R.cjs');
8
+ var time = require('./time-Cv4hbCLT.cjs');
9
+ var persistence = require('./persistence-DGfEdbA5.cjs');
10
+ var browser = require('./browser-DwCi-9Ya.cjs');
11
+ var logger = require('./logger-BrAF4iuT.cjs');
12
12
 
13
13
  function generateWebAuthUrl(publicKey) {
14
14
  const publicKeyBase64 = authRelay.encodeBase64(publicKey, "base64url");
@@ -1,13 +1,13 @@
1
1
  'use strict';
2
2
 
3
3
  var chalk = require('chalk');
4
- var persistence = require('./persistence-BiyvEYaR.cjs');
5
- var auth = require('./auth-DHlbjtf7.cjs');
6
- var configuration = require('./configuration-CWRKSOyj.cjs');
4
+ var persistence = require('./persistence-DGfEdbA5.cjs');
5
+ var auth = require('./auth-SH0o7ue7.cjs');
6
+ var configuration = require('./configuration-DfRs3WLd.cjs');
7
7
  var node_fs = require('node:fs');
8
8
  var node_readline = require('node:readline');
9
- var controlClient = require('./controlClient-DyNgxNl7.cjs');
10
- var logger = require('./logger-HQ9yDb8R.cjs');
9
+ var controlClient = require('./controlClient-B61crTpk.cjs');
10
+ var logger = require('./logger-BrAF4iuT.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-BqPZjTpo.cjs');
19
- require('./browser-Bm24RiFU.cjs');
18
+ require('./time-Cv4hbCLT.cjs');
19
+ require('./browser-DwCi-9Ya.cjs');
20
20
  require('open');
21
21
  require('node:path');
22
- require('./package-Dn7zZkY1.cjs');
22
+ require('./package-CStJrLG3.cjs');
23
23
  require('node:util');
24
24
 
25
25
  function localMachineIdentityStatus(machineId) {
@@ -2,46 +2,46 @@ import chalk from 'chalk';
2
2
  import { homedir } from 'node:os';
3
3
  import { readFileSync } from 'node:fs';
4
4
  import { resolve } from 'node:path';
5
- import { c as AUTOMATION_NAME_PATTERN, i as isAutomationRunTerminal, d as AUTOMATION_PRECHECK_MAX_TIMEOUT_MS, e as AutomationPrecheckSchema } from './index-C27JFCbe.mjs';
6
- import { c as configuration } from './configuration-C8r6uD9k.mjs';
7
- import { a as authenticatedAutomationsClient, b as automationRunIdFromEnv, i as isAutomationsUnavailable, A as AUTOMATIONS_UNAVAILABLE_MESSAGE } from './client-Cg_cuQb1.mjs';
8
- import { p as parseDuration, c as clipAutomationReport, A as AUTOMATION_REPORT_TEXT_LIMITS, t as triggerFromFlags, d as describeTrigger, a as describeAction } from './template-CJ8uLlD8.mjs';
5
+ import { c as AUTOMATION_NAME_PATTERN, i as isAutomationRunTerminal, d as AUTOMATION_PRECHECK_MAX_TIMEOUT_MS, e as AutomationPrecheckSchema } from './index-CxiisoO1.mjs';
6
+ import { c as configuration } from './configuration-JBFF7432.mjs';
7
+ import { a as authenticatedAutomationsClient, b as automationRunIdFromEnv, i as isAutomationsUnavailable, A as AUTOMATIONS_UNAVAILABLE_MESSAGE } from './client-CISkP897.mjs';
8
+ import { p as parseDuration, c as clipAutomationReport, A as AUTOMATION_REPORT_TEXT_LIMITS, t as triggerFromFlags, d as describeTrigger, a as describeAction } from './template-BGlDAjbM.mjs';
9
9
  import { A as AUTOMATION_SKILL, i as installAutomationSkill } from './install-B8O1JpJH.mjs';
10
10
  import { u as updateAutomationChecked, c as createAutomationChecked } from './precheckCompat-DeEbilbr.mjs';
11
- import { s as sessionWebUrl } from './sessionOps-OmRqUFm4.mjs';
12
- import { parseEnvAssignment } from './spawn-CbfcClhj.mjs';
13
- import { S as SPAWN_AGENTS, s as sanitizeSpawnPermissionMode, A as ALLOWED_SPAWN_PERMISSION_MODES } from './spawnAgents-N3jxdNJC.mjs';
14
- import { d as delay } from './time-CgAwVt5R.mjs';
11
+ import { s as sessionWebUrl } from './sessionOps-D-SDNs-D.mjs';
12
+ import { parseEnvAssignment } from './spawn-CeeM-Piz.mjs';
13
+ import { S as SPAWN_AGENTS, s as sanitizeSpawnPermissionMode, A as ALLOWED_SPAWN_PERMISSION_MODES } from './spawnAgents-DEBfpoPZ.mjs';
14
+ import { d as delay } from './time-DZE0879N.mjs';
15
15
  import 'zod';
16
16
  import '@paralleldrive/cuid2';
17
- import './package-CpmoMPuj.mjs';
17
+ import './package-BGZo2vAj.mjs';
18
18
  import 'node:fs/promises';
19
- import './persistence-CagHeZ-f.mjs';
19
+ import './persistence-DvD-irLh.mjs';
20
20
  import './authRelay-DhQhkBvX.mjs';
21
21
  import 'node:crypto';
22
22
  import 'tweetnacl';
23
- import './logger-D1hb3CG8.mjs';
23
+ import './logger-BHfBDOsy.mjs';
24
24
  import 'node:util';
25
25
  import './resources-CLP_MpK4.mjs';
26
26
  import 'axios';
27
- import './controlClient-DYQ1g2ar.mjs';
27
+ import './controlClient-D5BYm3PU.mjs';
28
28
  import './specialCommands-MXUN0wfI.mjs';
29
29
  import 'socket.io-client';
30
30
  import './backgroundTaskActivity-8PdPxrvy.mjs';
31
- import './client-CfTeXnYS.mjs';
31
+ import './client-BRuFIwki.mjs';
32
32
  import './path-D2wdaNSk.mjs';
33
- import './claudeSessionFork-BqV6E0ep.mjs';
33
+ import './claudeSessionFork-D-BhXkRa.mjs';
34
34
  import 'node:readline';
35
- import './codexAppServerClient-aV5m-FpZ.mjs';
35
+ import './codexAppServerClient-BLasFGTm.mjs';
36
36
  import 'node:child_process';
37
37
  import 'cross-spawn';
38
38
  import './contentLogMetadata-BlWI0egu.mjs';
39
39
  import './manager-BEsI4qt3.mjs';
40
40
  import '@anthropic-ai/sandbox-runtime';
41
- import './rateLimitWindows-4uhuwKnU.mjs';
41
+ import './rateLimitWindows-DzXv6p_W.mjs';
42
42
  import './processTree-CP5IvQ2Z.mjs';
43
43
  import './codexThreadFork-CVzAqELg.mjs';
44
- import './createSessionMetadata-CZuEDo2v.mjs';
44
+ import './createSessionMetadata-OMKj3e48.mjs';
45
45
  import './projectPath-BTBIMB57.mjs';
46
46
  import 'path';
47
47
  import 'url';
@@ -4,46 +4,46 @@ var chalk = require('chalk');
4
4
  var os = require('node:os');
5
5
  var node_fs = require('node:fs');
6
6
  var path = require('node:path');
7
- var index = require('./index-D9Hidq-g.cjs');
8
- var configuration = require('./configuration-CWRKSOyj.cjs');
9
- var client = require('./client-B9fcSMXP.cjs');
10
- var template = require('./template-B1AORlgU.cjs');
7
+ var index = require('./index-BknTkVnR.cjs');
8
+ var configuration = require('./configuration-DfRs3WLd.cjs');
9
+ var client = require('./client-oqSAKwmy.cjs');
10
+ var template = require('./template-uSKZ53Sv.cjs');
11
11
  var install = require('./install-BOHlqewf.cjs');
12
12
  var precheckCompat = require('./precheckCompat-CWOi5c9L.cjs');
13
- var sessionOps = require('./sessionOps-JRyQhF5s.cjs');
14
- var spawn = require('./spawn-CxEl0Dyz.cjs');
15
- var spawnAgents = require('./spawnAgents-Cm23BW-D.cjs');
16
- var time = require('./time-BqPZjTpo.cjs');
13
+ var sessionOps = require('./sessionOps-Cw_JivR2.cjs');
14
+ var spawn = require('./spawn-DD1Sv8Ri.cjs');
15
+ var spawnAgents = require('./spawnAgents-CrHgpAzU.cjs');
16
+ var time = require('./time-Cv4hbCLT.cjs');
17
17
  require('zod');
18
18
  require('@paralleldrive/cuid2');
19
- require('./package-Dn7zZkY1.cjs');
19
+ require('./package-CStJrLG3.cjs');
20
20
  require('node:fs/promises');
21
- require('./persistence-BiyvEYaR.cjs');
21
+ require('./persistence-DGfEdbA5.cjs');
22
22
  require('./authRelay-Dy1qU9td.cjs');
23
23
  require('node:crypto');
24
24
  require('tweetnacl');
25
- require('./logger-HQ9yDb8R.cjs');
25
+ require('./logger-BrAF4iuT.cjs');
26
26
  require('node:util');
27
27
  require('./resources-BZ_Be0qM.cjs');
28
28
  require('axios');
29
- require('./controlClient-DyNgxNl7.cjs');
29
+ require('./controlClient-B61crTpk.cjs');
30
30
  require('./specialCommands-J3JFOq0J.cjs');
31
31
  require('socket.io-client');
32
32
  require('./backgroundTaskActivity-CBvUdj39.cjs');
33
- require('./client-Ckic3nxZ.cjs');
33
+ require('./client-D-HEr922.cjs');
34
34
  require('./path-B7zW-WwE.cjs');
35
- require('./claudeSessionFork-OffWLYgd.cjs');
35
+ require('./claudeSessionFork-CDTbQmYi.cjs');
36
36
  require('node:readline');
37
- require('./codexAppServerClient-C-UwVMUN.cjs');
37
+ require('./codexAppServerClient--K-ILfqM.cjs');
38
38
  require('node:child_process');
39
39
  require('cross-spawn');
40
40
  require('./contentLogMetadata-ZSFk_NjQ.cjs');
41
41
  require('./manager-HrEj442o.cjs');
42
42
  require('@anthropic-ai/sandbox-runtime');
43
- require('./rateLimitWindows-U4fc1-_6.cjs');
43
+ require('./rateLimitWindows-DiiGHS9r.cjs');
44
44
  require('./processTree-CMHWlVse.cjs');
45
45
  require('./codexThreadFork-C6ZmcT2z.cjs');
46
- require('./createSessionMetadata-C4WN8pVK.cjs');
46
+ require('./createSessionMetadata-BwYysMTH.cjs');
47
47
  require('./projectPath-C3ioB4Bu.cjs');
48
48
  require('path');
49
49
  require('url');
@@ -1,9 +1,9 @@
1
1
  import { existsSync } from 'node:fs';
2
2
  import { mkdir, writeFile } from 'node:fs/promises';
3
3
  import { join } from 'node:path';
4
- import { c as configuration } from './configuration-C8r6uD9k.mjs';
4
+ import { c as configuration } from './configuration-JBFF7432.mjs';
5
5
  import 'node:os';
6
- import './package-CpmoMPuj.mjs';
6
+ import './package-BGZo2vAj.mjs';
7
7
 
8
8
  const ASSISTANT_CLAUDE_MD = `# very-happy \u8C03\u5EA6\u4E2D\u5FC3\uFF08\u8BED\u97F3\u52A9\u624B\uFF09
9
9