claude-mux 0.30.13 → 0.30.14

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 (361) hide show
  1. package/CLAUDE.md +14 -3
  2. package/dist/fleet-places.d.ts +7 -1
  3. package/dist/fleet-places.d.ts.map +1 -1
  4. package/dist/fleet-places.js +14 -1
  5. package/dist/fleet-places.js.map +1 -1
  6. package/dist/server/dictation-marks.d.ts.map +1 -1
  7. package/dist/server/dictation-marks.js +23 -1
  8. package/dist/server/dictation-marks.js.map +1 -1
  9. package/dist/transcript/parser.d.ts +7 -0
  10. package/dist/transcript/parser.d.ts.map +1 -1
  11. package/dist/transcript/parser.js +19 -3
  12. package/dist/transcript/parser.js.map +1 -1
  13. package/dist/transcript/past-sessions.d.ts.map +1 -1
  14. package/dist/transcript/past-sessions.js +4 -1
  15. package/dist/transcript/past-sessions.js.map +1 -1
  16. package/dist/utils/version.d.ts +1 -1
  17. package/dist/utils/version.js +1 -1
  18. package/dist/web/client/_app/immutable/chunks/{sULMfRFG.js → B4FaHfAQ.js} +2 -2
  19. package/dist/web/client/_app/immutable/chunks/{sULMfRFG.js.map → B4FaHfAQ.js.map} +1 -1
  20. package/dist/web/client/_app/immutable/chunks/{W5_HMZ5E.js → B5Hkb2u5.js} +2 -2
  21. package/dist/web/client/_app/immutable/chunks/{W5_HMZ5E.js.map → B5Hkb2u5.js.map} +1 -1
  22. package/{web/.svelte-kit/output/client/_app/immutable/chunks/BQzv8cqz.js → dist/web/client/_app/immutable/chunks/BOpEbBRb.js} +2 -2
  23. package/{web/.svelte-kit/output/client/_app/immutable/chunks/BQzv8cqz.js.map → dist/web/client/_app/immutable/chunks/BOpEbBRb.js.map} +1 -1
  24. package/dist/web/client/_app/immutable/chunks/{Q5yhzux8.js → BeYjnogg.js} +2 -2
  25. package/{web/.svelte-kit/output/client/_app/immutable/chunks/Q5yhzux8.js.map → dist/web/client/_app/immutable/chunks/BeYjnogg.js.map} +1 -1
  26. package/dist/web/client/_app/immutable/chunks/{VceCNUd7.js → C00rm3mY.js} +2 -2
  27. package/{web/.svelte-kit/output/client/_app/immutable/chunks/VceCNUd7.js.map → dist/web/client/_app/immutable/chunks/C00rm3mY.js.map} +1 -1
  28. package/dist/web/client/_app/immutable/chunks/{CtjkAirr.js → CKg7gbPm.js} +9 -9
  29. package/dist/web/client/_app/immutable/chunks/CKg7gbPm.js.map +1 -0
  30. package/dist/web/client/_app/immutable/chunks/CPEphjdk.js +4 -0
  31. package/dist/web/client/_app/immutable/chunks/CPEphjdk.js.map +1 -0
  32. package/dist/web/client/_app/immutable/chunks/{BQQ3-rqs.js → CPlFo88J.js} +2 -2
  33. package/dist/web/client/_app/immutable/chunks/{BQQ3-rqs.js.map → CPlFo88J.js.map} +1 -1
  34. package/dist/web/client/_app/immutable/chunks/{BvX4FYxp.js → CtnjySwS.js} +2 -2
  35. package/dist/web/client/_app/immutable/chunks/{BvX4FYxp.js.map → CtnjySwS.js.map} +1 -1
  36. package/dist/web/client/_app/immutable/chunks/{XgSsj0QY.js → D3EW0jRH.js} +2 -2
  37. package/{web/.svelte-kit/output/client/_app/immutable/chunks/XgSsj0QY.js.map → dist/web/client/_app/immutable/chunks/D3EW0jRH.js.map} +1 -1
  38. package/dist/web/client/_app/immutable/chunks/{CtlIfY1C.js → D3umr-Qr.js} +2 -2
  39. package/{web/.svelte-kit/output/client/_app/immutable/chunks/CtlIfY1C.js.map → dist/web/client/_app/immutable/chunks/D3umr-Qr.js.map} +1 -1
  40. package/dist/web/client/_app/immutable/chunks/{CM0CI9GL.js → D8-_Y-M6.js} +3 -3
  41. package/dist/web/client/_app/immutable/chunks/{CM0CI9GL.js.map → D8-_Y-M6.js.map} +1 -1
  42. package/dist/web/client/_app/immutable/chunks/{cvsGFvDx.js → DDvK7Qo9.js} +2 -2
  43. package/{web/.svelte-kit/output/client/_app/immutable/chunks/cvsGFvDx.js.map → dist/web/client/_app/immutable/chunks/DDvK7Qo9.js.map} +1 -1
  44. package/dist/web/client/_app/immutable/chunks/{CiU8KBun.js → _VFi-7U7.js} +2 -2
  45. package/dist/web/client/_app/immutable/chunks/{CiU8KBun.js.map → _VFi-7U7.js.map} +1 -1
  46. package/dist/web/client/_app/immutable/chunks/{DlENCZqZ.js → mQ6hkLuy.js} +2 -2
  47. package/dist/web/client/_app/immutable/chunks/{DlENCZqZ.js.map → mQ6hkLuy.js.map} +1 -1
  48. package/dist/web/client/_app/immutable/entry/{app.BwTbN8wB.js → app.CTFza_OS.js} +3 -3
  49. package/{web/.svelte-kit/output/client/_app/immutable/entry/app.BwTbN8wB.js.map → dist/web/client/_app/immutable/entry/app.CTFza_OS.js.map} +1 -1
  50. package/dist/web/client/_app/immutable/entry/start.B-zlkyrt.js +2 -0
  51. package/dist/web/client/_app/immutable/entry/start.B-zlkyrt.js.map +1 -0
  52. package/{web/.svelte-kit/output/client/_app/immutable/nodes/0.BnHV-ElR.js → dist/web/client/_app/immutable/nodes/0.Cztuq8Ih.js} +2 -2
  53. package/dist/web/client/_app/immutable/nodes/{0.BnHV-ElR.js.map → 0.Cztuq8Ih.js.map} +1 -1
  54. package/dist/web/client/_app/immutable/nodes/{1.Dc3ryOCf.js → 1.BOOL0V7K.js} +2 -2
  55. package/dist/web/client/_app/immutable/nodes/{1.Dc3ryOCf.js.map → 1.BOOL0V7K.js.map} +1 -1
  56. package/dist/web/client/_app/immutable/nodes/{2.DUrpAceY.js → 2.CArUpZNe.js} +2 -2
  57. package/dist/web/client/_app/immutable/nodes/{2.DUrpAceY.js.map → 2.CArUpZNe.js.map} +1 -1
  58. package/dist/web/client/_app/immutable/nodes/{3.BaCofjAn.js → 3.DSvIWalA.js} +2 -2
  59. package/dist/web/client/_app/immutable/nodes/{3.BaCofjAn.js.map → 3.DSvIWalA.js.map} +1 -1
  60. package/dist/web/client/_app/immutable/nodes/{4.v1wYkrvS.js → 4.H6RMG_cy.js} +2 -2
  61. package/dist/web/client/_app/immutable/nodes/{4.v1wYkrvS.js.map → 4.H6RMG_cy.js.map} +1 -1
  62. package/dist/web/client/_app/immutable/nodes/{5.Bn4A77jK.js → 5.BHSt0Suo.js} +2 -2
  63. package/dist/web/client/_app/immutable/nodes/{5.Bn4A77jK.js.map → 5.BHSt0Suo.js.map} +1 -1
  64. package/dist/web/client/_app/immutable/nodes/{6.C2hEoITj.js → 6.CzLoA0w7.js} +2 -2
  65. package/dist/web/client/_app/immutable/nodes/{6.C2hEoITj.js.map → 6.CzLoA0w7.js.map} +1 -1
  66. package/dist/web/client/_app/immutable/nodes/{7.BcHOjWdp.js → 7.fqq2vVa9.js} +2 -2
  67. package/dist/web/client/_app/immutable/nodes/{7.BcHOjWdp.js.map → 7.fqq2vVa9.js.map} +1 -1
  68. package/dist/web/client/_app/immutable/nodes/{8.D7NtqIYy.js → 8.DNFFjTla.js} +2 -2
  69. package/dist/web/client/_app/immutable/nodes/{8.D7NtqIYy.js.map → 8.DNFFjTla.js.map} +1 -1
  70. package/dist/web/client/_app/immutable/nodes/{9.D-211z9-.js → 9.0kMPrp2-.js} +2 -2
  71. package/dist/web/client/_app/immutable/nodes/{9.D-211z9-.js.map → 9.0kMPrp2-.js.map} +1 -1
  72. package/dist/web/client/_app/version.json +1 -1
  73. package/dist/web/server/chunks/{0-CvglVGCY.js → 0-B_KxXX-N.js} +14 -14
  74. package/dist/web/server/chunks/{0-CvglVGCY.js.map → 0-B_KxXX-N.js.map} +1 -1
  75. package/dist/web/server/chunks/{1-D-gJDFrG.js → 1-BmEKuUDK.js} +4 -4
  76. package/dist/web/server/chunks/{1-D-gJDFrG.js.map → 1-BmEKuUDK.js.map} +1 -1
  77. package/dist/web/server/chunks/{2-BCmEU5Qq.js → 2-BJ3dzws2.js} +13 -13
  78. package/dist/web/server/chunks/{2-BCmEU5Qq.js.map → 2-BJ3dzws2.js.map} +1 -1
  79. package/dist/web/server/chunks/{3-CHn5Kw-T.js → 3-CLYKGzT3.js} +10 -10
  80. package/dist/web/server/chunks/{3-CHn5Kw-T.js.map → 3-CLYKGzT3.js.map} +1 -1
  81. package/dist/web/server/chunks/{4-Cxg7VcZ7.js → 4-CsoWHVgX.js} +12 -12
  82. package/dist/web/server/chunks/{4-Cxg7VcZ7.js.map → 4-CsoWHVgX.js.map} +1 -1
  83. package/dist/web/server/chunks/{5-DSgvnHF_.js → 5-oPM6ncgT.js} +9 -9
  84. package/dist/web/server/chunks/{5-DSgvnHF_.js.map → 5-oPM6ncgT.js.map} +1 -1
  85. package/dist/web/server/chunks/{6-B0rymWRR.js → 6-gvgju2ZN.js} +5 -5
  86. package/dist/web/server/chunks/{6-B0rymWRR.js.map → 6-gvgju2ZN.js.map} +1 -1
  87. package/dist/web/server/chunks/{7-CNomBJux.js → 7-D8hylKrz.js} +10 -10
  88. package/dist/web/server/chunks/{7-CNomBJux.js.map → 7-D8hylKrz.js.map} +1 -1
  89. package/dist/web/server/chunks/{8-TYbX-1bO.js → 8-Br4hTtby.js} +12 -12
  90. package/dist/web/server/chunks/{8-TYbX-1bO.js.map → 8-Br4hTtby.js.map} +1 -1
  91. package/dist/web/server/chunks/{9-XGQQvTLc.js → 9-9uvmfsEs.js} +9 -9
  92. package/dist/web/server/chunks/{9-XGQQvTLc.js.map → 9-9uvmfsEs.js.map} +1 -1
  93. package/dist/web/server/chunks/{_layout.svelte-yrPX5VFm.js → _layout.svelte-DamAAFpK.js} +58 -37
  94. package/dist/web/server/chunks/_layout.svelte-DamAAFpK.js.map +1 -0
  95. package/dist/web/server/chunks/{_page.svelte-C_kFA0Lq.js → _page.svelte-DFE4jmT9.js} +4 -4
  96. package/dist/web/server/chunks/{_page.svelte-C_kFA0Lq.js.map → _page.svelte-DFE4jmT9.js.map} +1 -1
  97. package/dist/web/server/chunks/{_page.svelte-DvxpwsgS.js → _page.svelte-DHPGbCS1.js} +6 -6
  98. package/dist/web/server/chunks/{_page.svelte-DvxpwsgS.js.map → _page.svelte-DHPGbCS1.js.map} +1 -1
  99. package/dist/web/server/chunks/{_server.ts-Dz01Gvhk.js → _server.ts-0RT4n9LX.js} +2 -2
  100. package/dist/web/server/chunks/{_server.ts-Dz01Gvhk.js.map → _server.ts-0RT4n9LX.js.map} +1 -1
  101. package/dist/web/server/chunks/{_server.ts-D2Tvcncu.js → _server.ts-3kbpguQ1.js} +3 -3
  102. package/dist/web/server/chunks/{_server.ts-D2Tvcncu.js.map → _server.ts-3kbpguQ1.js.map} +1 -1
  103. package/dist/web/server/chunks/{_server.ts-TN_Ka6cR.js → _server.ts-4m17ESHV.js} +2 -2
  104. package/dist/web/server/chunks/{_server.ts-TN_Ka6cR.js.map → _server.ts-4m17ESHV.js.map} +1 -1
  105. package/dist/web/server/chunks/{_server.ts-Bj1Eewby.js → _server.ts-8Bs2jUgD.js} +2 -2
  106. package/dist/web/server/chunks/{_server.ts-Bj1Eewby.js.map → _server.ts-8Bs2jUgD.js.map} +1 -1
  107. package/dist/web/server/chunks/{_server.ts-BWVtnpJh.js → _server.ts-95cbXKdT.js} +3 -3
  108. package/dist/web/server/chunks/{_server.ts-BWVtnpJh.js.map → _server.ts-95cbXKdT.js.map} +1 -1
  109. package/dist/web/server/chunks/{_server.ts-CyOA1rOq.js → _server.ts-B56-XF-Z.js} +3 -3
  110. package/dist/web/server/chunks/{_server.ts-CyOA1rOq.js.map → _server.ts-B56-XF-Z.js.map} +1 -1
  111. package/dist/web/server/chunks/{_server.ts-1ZhqL5o8.js → _server.ts-BAC_No-1.js} +2 -2
  112. package/dist/web/server/chunks/{_server.ts-1ZhqL5o8.js.map → _server.ts-BAC_No-1.js.map} +1 -1
  113. package/dist/web/server/chunks/{_server.ts-ji7L8HUR.js → _server.ts-BCpfYsYw.js} +3 -3
  114. package/dist/web/server/chunks/{_server.ts-ji7L8HUR.js.map → _server.ts-BCpfYsYw.js.map} +1 -1
  115. package/dist/web/server/chunks/{_server.ts-9iRpDv9e.js → _server.ts-BGToJuLp.js} +2 -2
  116. package/dist/web/server/chunks/{_server.ts-9iRpDv9e.js.map → _server.ts-BGToJuLp.js.map} +1 -1
  117. package/dist/web/server/chunks/{_server.ts-DQJ-tygD.js → _server.ts-BW87LYkE.js} +2 -2
  118. package/dist/web/server/chunks/{_server.ts-DQJ-tygD.js.map → _server.ts-BW87LYkE.js.map} +1 -1
  119. package/dist/web/server/chunks/{_server.ts-VgbTPrqV.js → _server.ts-BXjUy61V.js} +2 -2
  120. package/dist/web/server/chunks/{_server.ts-VgbTPrqV.js.map → _server.ts-BXjUy61V.js.map} +1 -1
  121. package/dist/web/server/chunks/{_server.ts-FoPsfjo3.js → _server.ts-BYyaN7ik.js} +2 -2
  122. package/dist/web/server/chunks/{_server.ts-FoPsfjo3.js.map → _server.ts-BYyaN7ik.js.map} +1 -1
  123. package/dist/web/server/chunks/{_server.ts-CNBy2p2U.js → _server.ts-Bjzi1JAu.js} +2 -2
  124. package/dist/web/server/chunks/{_server.ts-CNBy2p2U.js.map → _server.ts-Bjzi1JAu.js.map} +1 -1
  125. package/dist/web/server/chunks/{_server.ts-CSK1ReRS.js → _server.ts-CBU5vhD8.js} +2 -2
  126. package/dist/web/server/chunks/{_server.ts-CSK1ReRS.js.map → _server.ts-CBU5vhD8.js.map} +1 -1
  127. package/dist/web/server/chunks/{_server.ts-Cv8SUkC5.js → _server.ts-CG-7TORV.js} +3 -3
  128. package/dist/web/server/chunks/{_server.ts-Cv8SUkC5.js.map → _server.ts-CG-7TORV.js.map} +1 -1
  129. package/dist/web/server/chunks/{_server.ts-DPctaiWC.js → _server.ts-COCrEIiW.js} +2 -2
  130. package/dist/web/server/chunks/{_server.ts-DPctaiWC.js.map → _server.ts-COCrEIiW.js.map} +1 -1
  131. package/dist/web/server/chunks/{_server.ts-C7uhdF7Y.js → _server.ts-CPCsEz_B.js} +4 -4
  132. package/dist/web/server/chunks/{_server.ts-C7uhdF7Y.js.map → _server.ts-CPCsEz_B.js.map} +1 -1
  133. package/dist/web/server/chunks/{_server.ts-DsyqZudf.js → _server.ts-CPGa_LDW.js} +2 -2
  134. package/dist/web/server/chunks/{_server.ts-DsyqZudf.js.map → _server.ts-CPGa_LDW.js.map} +1 -1
  135. package/dist/web/server/chunks/{_server.ts-B9RfKfyc.js → _server.ts-CT1m86tm.js} +2 -2
  136. package/dist/web/server/chunks/{_server.ts-B9RfKfyc.js.map → _server.ts-CT1m86tm.js.map} +1 -1
  137. package/dist/web/server/chunks/{_server.ts-CwFbAWCg.js → _server.ts-CXzAFIps.js} +2 -2
  138. package/dist/web/server/chunks/{_server.ts-CwFbAWCg.js.map → _server.ts-CXzAFIps.js.map} +1 -1
  139. package/dist/web/server/chunks/{_server.ts-DHuyjZQx.js → _server.ts-C_H2gKKu.js} +2 -2
  140. package/dist/web/server/chunks/{_server.ts-DHuyjZQx.js.map → _server.ts-C_H2gKKu.js.map} +1 -1
  141. package/dist/web/server/chunks/{_server.ts-DVgdt6Zu.js → _server.ts-CjH9MxGk.js} +3 -3
  142. package/dist/web/server/chunks/{_server.ts-DVgdt6Zu.js.map → _server.ts-CjH9MxGk.js.map} +1 -1
  143. package/dist/web/server/chunks/{_server.ts-DrFiP32b.js → _server.ts-CrQk3PtI.js} +3 -3
  144. package/dist/web/server/chunks/{_server.ts-DrFiP32b.js.map → _server.ts-CrQk3PtI.js.map} +1 -1
  145. package/dist/web/server/chunks/{_server.ts-CA8nszPb.js → _server.ts-Cy5Matw4.js} +3 -3
  146. package/dist/web/server/chunks/{_server.ts-CA8nszPb.js.map → _server.ts-Cy5Matw4.js.map} +1 -1
  147. package/dist/web/server/chunks/{_server.ts-CovkmnvY.js → _server.ts-D9PPu5p4.js} +3 -3
  148. package/dist/web/server/chunks/{_server.ts-CovkmnvY.js.map → _server.ts-D9PPu5p4.js.map} +1 -1
  149. package/dist/web/server/chunks/{_server.ts-vhti5VvF.js → _server.ts-DGvNQ4Mq.js} +3 -3
  150. package/dist/web/server/chunks/{_server.ts-vhti5VvF.js.map → _server.ts-DGvNQ4Mq.js.map} +1 -1
  151. package/dist/web/server/chunks/{_server.ts-iK8ih9Bi.js → _server.ts-DJOSnwXV.js} +2 -2
  152. package/dist/web/server/chunks/{_server.ts-iK8ih9Bi.js.map → _server.ts-DJOSnwXV.js.map} +1 -1
  153. package/dist/web/server/chunks/{_server.ts-DK-6ddNq.js → _server.ts-DPoluZc6.js} +3 -3
  154. package/dist/web/server/chunks/{_server.ts-DK-6ddNq.js.map → _server.ts-DPoluZc6.js.map} +1 -1
  155. package/dist/web/server/chunks/{_server.ts-BozsVs8t.js → _server.ts-DS6kibxL.js} +2 -2
  156. package/dist/web/server/chunks/{_server.ts-BozsVs8t.js.map → _server.ts-DS6kibxL.js.map} +1 -1
  157. package/dist/web/server/chunks/{_server.ts-DozhhYwq.js → _server.ts-DUl0ucUP.js} +3 -3
  158. package/dist/web/server/chunks/{_server.ts-DozhhYwq.js.map → _server.ts-DUl0ucUP.js.map} +1 -1
  159. package/dist/web/server/chunks/{_server.ts-78nODRDJ.js → _server.ts-DWj22oj9.js} +2 -2
  160. package/dist/web/server/chunks/{_server.ts-78nODRDJ.js.map → _server.ts-DWj22oj9.js.map} +1 -1
  161. package/dist/web/server/chunks/{_server.ts-CA1j9wWk.js → _server.ts-DZrVaelC.js} +2 -2
  162. package/dist/web/server/chunks/{_server.ts-CA1j9wWk.js.map → _server.ts-DZrVaelC.js.map} +1 -1
  163. package/dist/web/server/chunks/{_server.ts-CzcknkWq.js → _server.ts-DrG3j6Ao.js} +2 -2
  164. package/dist/web/server/chunks/{_server.ts-CzcknkWq.js.map → _server.ts-DrG3j6Ao.js.map} +1 -1
  165. package/dist/web/server/chunks/{_server.ts-AAllMdwT.js → _server.ts-Dwy38J9J.js} +2 -2
  166. package/dist/web/server/chunks/{_server.ts-AAllMdwT.js.map → _server.ts-Dwy38J9J.js.map} +1 -1
  167. package/dist/web/server/chunks/{_server.ts-CgChlIKq.js → _server.ts-DxGjRezI.js} +2 -2
  168. package/dist/web/server/chunks/{_server.ts-CgChlIKq.js.map → _server.ts-DxGjRezI.js.map} +1 -1
  169. package/dist/web/server/chunks/{_server.ts-KbQyErIR.js → _server.ts-XMUjHO61.js} +2 -2
  170. package/dist/web/server/chunks/{_server.ts-KbQyErIR.js.map → _server.ts-XMUjHO61.js.map} +1 -1
  171. package/dist/web/server/chunks/{_server.ts-DGTSZoLn.js → _server.ts-dvT2bXEB.js} +2 -2
  172. package/dist/web/server/chunks/{_server.ts-DGTSZoLn.js.map → _server.ts-dvT2bXEB.js.map} +1 -1
  173. package/dist/web/server/chunks/{_server.ts-BxscGs8D.js → _server.ts-m835uDm6.js} +2 -2
  174. package/dist/web/server/chunks/{_server.ts-BxscGs8D.js.map → _server.ts-m835uDm6.js.map} +1 -1
  175. package/dist/web/server/chunks/{checkbox-DiJTAtHi.js → checkbox-BYzlWW56.js} +2 -2
  176. package/dist/web/server/chunks/{checkbox-DiJTAtHi.js.map → checkbox-BYzlWW56.js.map} +1 -1
  177. package/dist/web/server/chunks/{create-id-DpoSQWrl.js → create-id-s6T_m-1j.js} +3 -3
  178. package/dist/web/server/chunks/{create-id-DpoSQWrl.js.map → create-id-s6T_m-1j.js.map} +1 -1
  179. package/dist/web/server/chunks/{discover-DjR28OqK.js → discover-DykzHz0t.js} +2 -2
  180. package/dist/web/server/chunks/{discover-DjR28OqK.js.map → discover-DykzHz0t.js.map} +1 -1
  181. package/dist/web/server/chunks/{drafts.svelte-DsFAtH-s.js → drafts.svelte-c94J-DBB.js} +3 -3
  182. package/dist/web/server/chunks/{drafts.svelte-DsFAtH-s.js.map → drafts.svelte-c94J-DBB.js.map} +1 -1
  183. package/dist/web/server/chunks/{end-session-BbBa9yD0.js → end-session-Czy_WW42.js} +2 -2
  184. package/dist/web/server/chunks/{end-session-BbBa9yD0.js.map → end-session-Czy_WW42.js.map} +1 -1
  185. package/dist/web/server/chunks/{files-4i3igWea.js → files-DNH191y7.js} +2 -2
  186. package/dist/web/server/chunks/{files-4i3igWea.js.map → files-DNH191y7.js.map} +1 -1
  187. package/dist/web/server/chunks/{fleet-DZJSFWuH.js → fleet-CWHlZjSd.js} +4 -4
  188. package/dist/web/server/chunks/{fleet-DZJSFWuH.js.map → fleet-CWHlZjSd.js.map} +1 -1
  189. package/dist/web/server/chunks/{git-D9dLEKUF.js → git-CHO9UIOQ.js} +13 -5
  190. package/dist/web/server/chunks/git-CHO9UIOQ.js.map +1 -0
  191. package/dist/web/server/chunks/{git-history-De9t0yF-.js → git-history-CxyH4jQb.js} +2 -2
  192. package/dist/web/server/chunks/{git-history-De9t0yF-.js.map → git-history-CxyH4jQb.js.map} +1 -1
  193. package/dist/web/server/chunks/{hooks.server-C3Uglne7.js → hooks.server-DgHxEf6H.js} +6 -6
  194. package/dist/web/server/chunks/{hooks.server-C3Uglne7.js.map → hooks.server-DgHxEf6H.js.map} +1 -1
  195. package/dist/web/server/chunks/{message-queue-sFcJCRjz.js → message-queue-DhLshpoF.js} +13 -2
  196. package/dist/web/server/chunks/message-queue-DhLshpoF.js.map +1 -0
  197. package/dist/web/server/chunks/{project-CbPa8Mu7.js → project-CBPdIh2n.js} +2 -2
  198. package/dist/web/server/chunks/{project-CbPa8Mu7.js.map → project-CBPdIh2n.js.map} +1 -1
  199. package/dist/web/server/chunks/{project-icons-CSb1bfT9.js → project-icons-bWhaFSVy.js} +4 -4
  200. package/dist/web/server/chunks/{project-icons-CSb1bfT9.js.map → project-icons-bWhaFSVy.js.map} +1 -1
  201. package/dist/web/server/chunks/{push-BJ7P9DGd.js → push-LMlCp4Lc.js} +5 -5
  202. package/dist/web/server/chunks/{push-BJ7P9DGd.js.map → push-LMlCp4Lc.js.map} +1 -1
  203. package/dist/web/server/chunks/{remote-control-C1d9R3w4.js → remote-control-BvYkVDhx.js} +2 -2
  204. package/dist/web/server/chunks/{remote-control-C1d9R3w4.js.map → remote-control-BvYkVDhx.js.map} +1 -1
  205. package/dist/web/server/chunks/{start-session-CKbupnLS.js → start-session-HljgutDe.js} +3 -3
  206. package/dist/web/server/chunks/{start-session-CKbupnLS.js.map → start-session-HljgutDe.js.map} +1 -1
  207. package/dist/web/server/chunks/{version-BqEJmw2g.js → version-ox9yLZ0P.js} +2 -2
  208. package/dist/web/server/chunks/version-ox9yLZ0P.js.map +1 -0
  209. package/dist/web/server/chunks/{web-preview-Bi5fjydK.js → web-preview-H5eiWlBD.js} +2 -2
  210. package/dist/web/server/chunks/{web-preview-Bi5fjydK.js.map → web-preview-H5eiWlBD.js.map} +1 -1
  211. package/dist/web/server/chunks/{ws-handlers-zemeJ8Si.js → ws-handlers-k_sOue-0.js} +6 -5
  212. package/dist/web/server/chunks/ws-handlers-k_sOue-0.js.map +1 -0
  213. package/dist/web/server/chunks/{ws-managers-C5VXKb_r.js → ws-managers-D2qC6Gla.js} +2 -2
  214. package/dist/web/server/chunks/{ws-managers-C5VXKb_r.js.map → ws-managers-D2qC6Gla.js.map} +1 -1
  215. package/dist/web/server/chunks/{ws-messages-jOSwT1Yq.js → ws-messages-B81v2RXg.js} +7 -2
  216. package/dist/web/server/chunks/ws-messages-B81v2RXg.js.map +1 -0
  217. package/dist/web/server/index.js +2 -2
  218. package/dist/web/server/index.js.map +1 -1
  219. package/dist/web/server/manifest.js +53 -53
  220. package/dist/web/server/manifest.js.map +1 -1
  221. package/package.json +1 -1
  222. package/src/fleet-places.ts +17 -1
  223. package/src/server/dictation-marks.ts +24 -1
  224. package/src/transcript/parser.ts +20 -3
  225. package/src/transcript/past-sessions.ts +3 -1
  226. package/src/utils/version.ts +1 -1
  227. package/tests/fleet-places.test.ts +20 -0
  228. package/tests/server/dictation-marks.test.ts +16 -0
  229. package/tests/transcript/parser.test.ts +34 -0
  230. package/tests/transcript/past-sessions.test.ts +5 -0
  231. package/web/.svelte-kit/adapter-bun/chunks/git.js +13 -4
  232. package/web/.svelte-kit/adapter-bun/chunks/git.js.map +1 -1
  233. package/web/.svelte-kit/adapter-bun/chunks/internal2.js +1 -1
  234. package/web/.svelte-kit/adapter-bun/chunks/internal2.js.map +1 -1
  235. package/web/.svelte-kit/adapter-bun/chunks/message-queue.js +14 -1
  236. package/web/.svelte-kit/adapter-bun/chunks/message-queue.js.map +1 -1
  237. package/web/.svelte-kit/adapter-bun/chunks/version.js +1 -1
  238. package/web/.svelte-kit/adapter-bun/chunks/version.js.map +1 -1
  239. package/web/.svelte-kit/adapter-bun/chunks/ws-handlers.js +2 -1
  240. package/web/.svelte-kit/adapter-bun/chunks/ws-handlers.js.map +1 -1
  241. package/web/.svelte-kit/adapter-bun/chunks/ws-messages.js +6 -1
  242. package/web/.svelte-kit/adapter-bun/chunks/ws-messages.js.map +1 -1
  243. package/web/.svelte-kit/adapter-bun/entries/pages/_layout.svelte.js +72 -45
  244. package/web/.svelte-kit/adapter-bun/entries/pages/_layout.svelte.js.map +1 -1
  245. package/web/.svelte-kit/adapter-bun/manifest-full.js +1 -1
  246. package/web/.svelte-kit/adapter-bun/manifest.js +1 -1
  247. package/web/.svelte-kit/adapter-bun/nodes/0.js +1 -1
  248. package/web/.svelte-kit/adapter-bun/nodes/1.js +1 -1
  249. package/web/.svelte-kit/adapter-bun/nodes/2.js +1 -1
  250. package/web/.svelte-kit/adapter-bun/nodes/3.js +1 -1
  251. package/web/.svelte-kit/adapter-bun/nodes/4.js +1 -1
  252. package/web/.svelte-kit/adapter-bun/nodes/5.js +1 -1
  253. package/web/.svelte-kit/adapter-bun/nodes/6.js +1 -1
  254. package/web/.svelte-kit/adapter-bun/nodes/7.js +1 -1
  255. package/web/.svelte-kit/adapter-bun/nodes/8.js +1 -1
  256. package/web/.svelte-kit/adapter-bun/nodes/9.js +1 -1
  257. package/web/.svelte-kit/generated/server/internal.js +1 -1
  258. package/web/.svelte-kit/output/client/.vite/manifest.json +237 -237
  259. package/web/.svelte-kit/output/client/_app/immutable/chunks/{sULMfRFG.js → B4FaHfAQ.js} +2 -2
  260. package/web/.svelte-kit/output/client/_app/immutable/chunks/{sULMfRFG.js.map → B4FaHfAQ.js.map} +1 -1
  261. package/web/.svelte-kit/output/client/_app/immutable/chunks/{W5_HMZ5E.js → B5Hkb2u5.js} +2 -2
  262. package/web/.svelte-kit/output/client/_app/immutable/chunks/{W5_HMZ5E.js.map → B5Hkb2u5.js.map} +1 -1
  263. package/{dist/web/client/_app/immutable/chunks/BQzv8cqz.js → web/.svelte-kit/output/client/_app/immutable/chunks/BOpEbBRb.js} +2 -2
  264. package/{dist/web/client/_app/immutable/chunks/BQzv8cqz.js.map → web/.svelte-kit/output/client/_app/immutable/chunks/BOpEbBRb.js.map} +1 -1
  265. package/web/.svelte-kit/output/client/_app/immutable/chunks/{Q5yhzux8.js → BeYjnogg.js} +2 -2
  266. package/{dist/web/client/_app/immutable/chunks/Q5yhzux8.js.map → web/.svelte-kit/output/client/_app/immutable/chunks/BeYjnogg.js.map} +1 -1
  267. package/web/.svelte-kit/output/client/_app/immutable/chunks/{VceCNUd7.js → C00rm3mY.js} +2 -2
  268. package/{dist/web/client/_app/immutable/chunks/VceCNUd7.js.map → web/.svelte-kit/output/client/_app/immutable/chunks/C00rm3mY.js.map} +1 -1
  269. package/web/.svelte-kit/output/client/_app/immutable/chunks/{CtjkAirr.js → CKg7gbPm.js} +9 -9
  270. package/web/.svelte-kit/output/client/_app/immutable/chunks/CKg7gbPm.js.map +1 -0
  271. package/web/.svelte-kit/output/client/_app/immutable/chunks/CPEphjdk.js +4 -0
  272. package/web/.svelte-kit/output/client/_app/immutable/chunks/CPEphjdk.js.map +1 -0
  273. package/web/.svelte-kit/output/client/_app/immutable/chunks/{BQQ3-rqs.js → CPlFo88J.js} +2 -2
  274. package/web/.svelte-kit/output/client/_app/immutable/chunks/{BQQ3-rqs.js.map → CPlFo88J.js.map} +1 -1
  275. package/web/.svelte-kit/output/client/_app/immutable/chunks/{BvX4FYxp.js → CtnjySwS.js} +2 -2
  276. package/web/.svelte-kit/output/client/_app/immutable/chunks/{BvX4FYxp.js.map → CtnjySwS.js.map} +1 -1
  277. package/web/.svelte-kit/output/client/_app/immutable/chunks/{XgSsj0QY.js → D3EW0jRH.js} +2 -2
  278. package/{dist/web/client/_app/immutable/chunks/XgSsj0QY.js.map → web/.svelte-kit/output/client/_app/immutable/chunks/D3EW0jRH.js.map} +1 -1
  279. package/web/.svelte-kit/output/client/_app/immutable/chunks/{CtlIfY1C.js → D3umr-Qr.js} +2 -2
  280. package/{dist/web/client/_app/immutable/chunks/CtlIfY1C.js.map → web/.svelte-kit/output/client/_app/immutable/chunks/D3umr-Qr.js.map} +1 -1
  281. package/web/.svelte-kit/output/client/_app/immutable/chunks/{CM0CI9GL.js → D8-_Y-M6.js} +3 -3
  282. package/web/.svelte-kit/output/client/_app/immutable/chunks/{CM0CI9GL.js.map → D8-_Y-M6.js.map} +1 -1
  283. package/web/.svelte-kit/output/client/_app/immutable/chunks/{cvsGFvDx.js → DDvK7Qo9.js} +2 -2
  284. package/{dist/web/client/_app/immutable/chunks/cvsGFvDx.js.map → web/.svelte-kit/output/client/_app/immutable/chunks/DDvK7Qo9.js.map} +1 -1
  285. package/web/.svelte-kit/output/client/_app/immutable/chunks/{CiU8KBun.js → _VFi-7U7.js} +2 -2
  286. package/web/.svelte-kit/output/client/_app/immutable/chunks/{CiU8KBun.js.map → _VFi-7U7.js.map} +1 -1
  287. package/web/.svelte-kit/output/client/_app/immutable/chunks/{DlENCZqZ.js → mQ6hkLuy.js} +2 -2
  288. package/web/.svelte-kit/output/client/_app/immutable/chunks/{DlENCZqZ.js.map → mQ6hkLuy.js.map} +1 -1
  289. package/web/.svelte-kit/output/client/_app/immutable/entry/{app.BwTbN8wB.js → app.CTFza_OS.js} +3 -3
  290. package/{dist/web/client/_app/immutable/entry/app.BwTbN8wB.js.map → web/.svelte-kit/output/client/_app/immutable/entry/app.CTFza_OS.js.map} +1 -1
  291. package/web/.svelte-kit/output/client/_app/immutable/entry/start.B-zlkyrt.js +2 -0
  292. package/web/.svelte-kit/output/client/_app/immutable/entry/start.B-zlkyrt.js.map +1 -0
  293. package/{dist/web/client/_app/immutable/nodes/0.BnHV-ElR.js → web/.svelte-kit/output/client/_app/immutable/nodes/0.Cztuq8Ih.js} +2 -2
  294. package/web/.svelte-kit/output/client/_app/immutable/nodes/{0.BnHV-ElR.js.map → 0.Cztuq8Ih.js.map} +1 -1
  295. package/web/.svelte-kit/output/client/_app/immutable/nodes/{1.Dc3ryOCf.js → 1.BOOL0V7K.js} +2 -2
  296. package/web/.svelte-kit/output/client/_app/immutable/nodes/{1.Dc3ryOCf.js.map → 1.BOOL0V7K.js.map} +1 -1
  297. package/web/.svelte-kit/output/client/_app/immutable/nodes/{2.DUrpAceY.js → 2.CArUpZNe.js} +2 -2
  298. package/web/.svelte-kit/output/client/_app/immutable/nodes/{2.DUrpAceY.js.map → 2.CArUpZNe.js.map} +1 -1
  299. package/web/.svelte-kit/output/client/_app/immutable/nodes/{3.BaCofjAn.js → 3.DSvIWalA.js} +2 -2
  300. package/web/.svelte-kit/output/client/_app/immutable/nodes/{3.BaCofjAn.js.map → 3.DSvIWalA.js.map} +1 -1
  301. package/web/.svelte-kit/output/client/_app/immutable/nodes/4.H6RMG_cy.js +2 -0
  302. package/web/.svelte-kit/output/client/_app/immutable/nodes/{4.v1wYkrvS.js.map → 4.H6RMG_cy.js.map} +1 -1
  303. package/web/.svelte-kit/output/client/_app/immutable/nodes/5.BHSt0Suo.js +2 -0
  304. package/web/.svelte-kit/output/client/_app/immutable/nodes/{5.Bn4A77jK.js.map → 5.BHSt0Suo.js.map} +1 -1
  305. package/web/.svelte-kit/output/client/_app/immutable/nodes/{6.C2hEoITj.js → 6.CzLoA0w7.js} +2 -2
  306. package/web/.svelte-kit/output/client/_app/immutable/nodes/{6.C2hEoITj.js.map → 6.CzLoA0w7.js.map} +1 -1
  307. package/web/.svelte-kit/output/client/_app/immutable/nodes/{7.BcHOjWdp.js → 7.fqq2vVa9.js} +2 -2
  308. package/web/.svelte-kit/output/client/_app/immutable/nodes/{7.BcHOjWdp.js.map → 7.fqq2vVa9.js.map} +1 -1
  309. package/web/.svelte-kit/output/client/_app/immutable/nodes/8.DNFFjTla.js +2 -0
  310. package/web/.svelte-kit/output/client/_app/immutable/nodes/{8.D7NtqIYy.js.map → 8.DNFFjTla.js.map} +1 -1
  311. package/web/.svelte-kit/output/client/_app/immutable/nodes/9.0kMPrp2-.js +2 -0
  312. package/web/.svelte-kit/output/client/_app/immutable/nodes/{9.D-211z9-.js.map → 9.0kMPrp2-.js.map} +1 -1
  313. package/web/.svelte-kit/output/client/_app/version.json +1 -1
  314. package/web/.svelte-kit/output/server/chunks/git.js +13 -4
  315. package/web/.svelte-kit/output/server/chunks/git.js.map +1 -1
  316. package/web/.svelte-kit/output/server/chunks/internal2.js +1 -1
  317. package/web/.svelte-kit/output/server/chunks/internal2.js.map +1 -1
  318. package/web/.svelte-kit/output/server/chunks/message-queue.js +14 -1
  319. package/web/.svelte-kit/output/server/chunks/message-queue.js.map +1 -1
  320. package/web/.svelte-kit/output/server/chunks/version.js +1 -1
  321. package/web/.svelte-kit/output/server/chunks/version.js.map +1 -1
  322. package/web/.svelte-kit/output/server/chunks/ws-handlers.js +2 -1
  323. package/web/.svelte-kit/output/server/chunks/ws-handlers.js.map +1 -1
  324. package/web/.svelte-kit/output/server/chunks/ws-messages.js +6 -1
  325. package/web/.svelte-kit/output/server/chunks/ws-messages.js.map +1 -1
  326. package/web/.svelte-kit/output/server/entries/pages/_layout.svelte.js +72 -45
  327. package/web/.svelte-kit/output/server/entries/pages/_layout.svelte.js.map +1 -1
  328. package/web/.svelte-kit/output/server/manifest-full.js +1 -1
  329. package/web/.svelte-kit/output/server/manifest.js +1 -1
  330. package/web/.svelte-kit/output/server/nodes/0.js +1 -1
  331. package/web/.svelte-kit/output/server/nodes/1.js +1 -1
  332. package/web/.svelte-kit/output/server/nodes/2.js +1 -1
  333. package/web/.svelte-kit/output/server/nodes/3.js +1 -1
  334. package/web/.svelte-kit/output/server/nodes/4.js +1 -1
  335. package/web/.svelte-kit/output/server/nodes/5.js +1 -1
  336. package/web/.svelte-kit/output/server/nodes/6.js +1 -1
  337. package/web/.svelte-kit/output/server/nodes/7.js +1 -1
  338. package/web/.svelte-kit/output/server/nodes/8.js +1 -1
  339. package/web/.svelte-kit/output/server/nodes/9.js +1 -1
  340. package/web/src/lib/components/AllSessionsPanel.svelte +9 -1
  341. package/web/src/lib/components/FolderPicker.svelte +49 -21
  342. package/dist/web/client/_app/immutable/chunks/CtjkAirr.js.map +0 -1
  343. package/dist/web/client/_app/immutable/chunks/Dck--FBb.js +0 -4
  344. package/dist/web/client/_app/immutable/chunks/Dck--FBb.js.map +0 -1
  345. package/dist/web/client/_app/immutable/entry/start.B2ZPizAt.js +0 -2
  346. package/dist/web/client/_app/immutable/entry/start.B2ZPizAt.js.map +0 -1
  347. package/dist/web/server/chunks/_layout.svelte-yrPX5VFm.js.map +0 -1
  348. package/dist/web/server/chunks/git-D9dLEKUF.js.map +0 -1
  349. package/dist/web/server/chunks/message-queue-sFcJCRjz.js.map +0 -1
  350. package/dist/web/server/chunks/version-BqEJmw2g.js.map +0 -1
  351. package/dist/web/server/chunks/ws-handlers-zemeJ8Si.js.map +0 -1
  352. package/dist/web/server/chunks/ws-messages-jOSwT1Yq.js.map +0 -1
  353. package/web/.svelte-kit/output/client/_app/immutable/chunks/CtjkAirr.js.map +0 -1
  354. package/web/.svelte-kit/output/client/_app/immutable/chunks/Dck--FBb.js +0 -4
  355. package/web/.svelte-kit/output/client/_app/immutable/chunks/Dck--FBb.js.map +0 -1
  356. package/web/.svelte-kit/output/client/_app/immutable/entry/start.B2ZPizAt.js +0 -2
  357. package/web/.svelte-kit/output/client/_app/immutable/entry/start.B2ZPizAt.js.map +0 -1
  358. package/web/.svelte-kit/output/client/_app/immutable/nodes/4.v1wYkrvS.js +0 -2
  359. package/web/.svelte-kit/output/client/_app/immutable/nodes/5.Bn4A77jK.js +0 -2
  360. package/web/.svelte-kit/output/client/_app/immutable/nodes/8.D7NtqIYy.js +0 -2
  361. package/web/.svelte-kit/output/client/_app/immutable/nodes/9.D-211z9-.js +0 -2
@@ -1,6 +1,6 @@
1
1
  import { t as CLAUDE_DIR } from "./paths-oZtLkDBD.js";
2
2
  import { m as sendKeyAsync } from "./pane-gFaC5AAF.js";
3
- import { r as enqueue } from "./message-queue-sFcJCRjz.js";
3
+ import { r as enqueue } from "./message-queue-DhLshpoF.js";
4
4
  import { readFileSync, statSync } from "fs";
5
5
  import { join } from "path";
6
6
  // .svelte-kit/adapter-bun/chunks/answer-keys.js
@@ -153,4 +153,4 @@ async function answerRemoteControlDialog(target, content, rcUrl) {
153
153
  }
154
154
  export { currentRemoteControlUrl as n, setRemoteControl as r, answerRemoteControlDialog as t };
155
155
 
156
- //# sourceMappingURL=remote-control-C1d9R3w4.js.map
156
+ //# sourceMappingURL=remote-control-BvYkVDhx.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"remote-control-C1d9R3w4.js","names":[],"sources":["../../../../web/.svelte-kit/adapter-bun/chunks/answer-keys.js","../../../../web/.svelte-kit/adapter-bun/chunks/remote-control.js"],"sourcesContent":["function keysForAnswer(picks, options) {\n const sorted = [...new Set(picks)].filter((i) => Number.isInteger(i) && i >= 0).sort((a, b) => a - b);\n if (sorted.length === 0) return null;\n if (!options.multiSelect) {\n if (sorted.length > 1) return null;\n return keysForOptionPick(0, sorted[0], sorted[0] + 1);\n }\n const keys = [];\n let cursor = 0;\n for (const pick of sorted) {\n for (let step = 0; step < pick - cursor; step++) keys.push(\"Down\");\n keys.push(\"Space\");\n cursor = pick;\n }\n keys.push(\"Enter\");\n return keys.join(\" \");\n}\nfunction keysForOptionPick(from, to, count) {\n const move = keysForOptionMove(from, to, count);\n if (move === null) return null;\n return move ? `${move} Enter` : \"Enter\";\n}\nfunction keysForOptionMove(from, to, count) {\n if (!Number.isInteger(to) || to < 0 || to >= count) return null;\n const start = from < 0 || from >= count ? 0 : from;\n const steps = to - start;\n return Array(Math.abs(steps)).fill(steps > 0 ? \"Down\" : \"Up\").join(\" \");\n}\nexport {\n keysForAnswer as a,\n keysForOptionMove as b,\n keysForOptionPick as k\n};\n//# sourceMappingURL=answer-keys.js.map\n","import { statSync, readFileSync } from \"fs\";\nimport { join } from \"path\";\nimport { a as CLAUDE_DIR } from \"./paths.js\";\nimport { e as enqueue } from \"./message-queue.js\";\nimport { j as sendKeyAsync } from \"./pane.js\";\nimport { k as keysForOptionPick } from \"./answer-keys.js\";\nconst SESSION_URL = \"https://claude.ai/code/\";\nfunction claudeSessionsDir() {\n return process.env.CLAUDE_SESSIONS_DIR ?? join(CLAUDE_DIR, \"sessions\");\n}\nconst bridgeMemo = /* @__PURE__ */ new Map();\nfunction readBridgeUrl(pid) {\n if (!Number.isInteger(pid) || pid <= 0) return void 0;\n const path = join(claudeSessionsDir(), `${pid}.json`);\n let stat;\n try {\n stat = statSync(path);\n } catch {\n bridgeMemo.delete(path);\n return void 0;\n }\n const memo = bridgeMemo.get(path);\n if (memo && memo.mtimeMs === stat.mtimeMs && memo.size === stat.size) return memo.url;\n const url = parseBridgeUrl(path);\n bridgeMemo.set(path, { mtimeMs: stat.mtimeMs, size: stat.size, url });\n return url;\n}\nfunction parseBridgeUrl(path) {\n let record;\n try {\n record = JSON.parse(readFileSync(path, \"utf-8\"));\n } catch {\n return void 0;\n }\n if (!record || typeof record !== \"object\" || !(\"bridgeSessionId\" in record)) return void 0;\n const id = record.bridgeSessionId;\n if (id === null) return null;\n return typeof id === \"string\" && /^[\\w-]+$/.test(id) ? SESSION_URL + id : void 0;\n}\nconst URL_PATTERN = /https:\\/\\/claude\\.ai\\/code\\/session_[\\w-]+/g;\nconst ENDED_PATTERN = /⎿\\s+Remote Control disconnected/g;\nfunction readPaneRemoteControl(content) {\n if (!content) return void 0;\n let url = null;\n for (const m of content.matchAll(URL_PATTERN)) url = { at: m.index, text: m[0] };\n let endedAt = -1;\n for (const m of content.matchAll(ENDED_PATTERN)) endedAt = m.index;\n if (url && url.at > endedAt) return url.text;\n return endedAt >= 0 ? null : void 0;\n}\nfunction currentRemoteControlUrl(session, paneContent) {\n const fromRecord = readBridgeUrl(session.pid);\n if (fromRecord !== void 0) return fromRecord;\n const fromPane = readPaneRemoteControl(paneContent);\n return fromPane === void 0 ? session.rc_url ?? null : fromPane;\n}\nconst asks = globalThis.__claudeMuxRcAsks ??= /* @__PURE__ */ new Map();\nconst ASK_TTL_MS = 10 * 6e4;\nconst SETTLE_MS = 3e3;\nfunction liveAsk(target) {\n const ask = asks.get(target);\n if (ask && Date.now() - ask.at > ASK_TTL_MS) {\n asks.delete(target);\n return void 0;\n }\n return ask;\n}\nfunction setRemoteControl(session, on) {\n if (!session.tmux_target) return { ok: false, status: 409, error: \"Session has no tmux pane\" };\n if (on && session.rc_url) return { ok: true, already: true, url: session.rc_url };\n if (!on && !session.rc_url) return { ok: true, already: true };\n if (liveAsk(session.tmux_target)) return { ok: true, already: true };\n asks.set(session.tmux_target, { way: on ? \"on\" : \"off\", at: Date.now() });\n enqueue(session.tmux_target, \"/rc\", \"control\");\n return { ok: true };\n}\nconst DIALOG_HINT = /Enter to select · Esc to continue/;\nfunction disconnectKeys(content) {\n const lines = content.split(\"\\n\");\n let hint = lines.length - 1;\n while (hint >= 0 && !DIALOG_HINT.test(lines[hint])) hint--;\n if (hint < 0) return null;\n let disconnect = -1;\n let cursor = -1;\n for (let i = hint - 1; i >= 0 && i >= hint - 8; i--) {\n if (disconnect < 0 && /Disconnect this session/.test(lines[i])) disconnect = i;\n if (cursor < 0 && /^\\s*❯\\s/.test(lines[i])) cursor = i;\n }\n if (disconnect < 0 || cursor < 0) return null;\n return keysForOptionPick(cursor, disconnect, hint)?.split(\" \") ?? null;\n}\nasync function press(target, keys) {\n for (const key of keys) if (!await sendKeyAsync(target, key)) return false;\n return true;\n}\nasync function answerRemoteControlDialog(target, content, rcUrl) {\n const ask = liveAsk(target);\n if (!ask) return false;\n const drawn = DIALOG_HINT.test(content) && /Disconnect this session/.test(content);\n if (ask.way === \"off\") {\n const keys = drawn ? disconnectKeys(content) : null;\n if (!keys) {\n if (rcUrl === null) asks.delete(target);\n return false;\n }\n if (await press(target, keys)) asks.delete(target);\n return true;\n }\n if (drawn && /❯\\s*Continue/.test(content)) {\n if (await press(target, [\"Enter\"])) asks.delete(target);\n return true;\n }\n if (rcUrl !== null) {\n ask.settledAt ??= Date.now();\n if (Date.now() - ask.settledAt > SETTLE_MS) asks.delete(target);\n }\n return false;\n}\nexport {\n answerRemoteControlDialog as a,\n currentRemoteControlUrl as c,\n setRemoteControl as s\n};\n//# sourceMappingURL=remote-control.js.map\n"],"mappings":"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"}
1
+ {"version":3,"file":"remote-control-BvYkVDhx.js","names":[],"sources":["../../../../web/.svelte-kit/adapter-bun/chunks/answer-keys.js","../../../../web/.svelte-kit/adapter-bun/chunks/remote-control.js"],"sourcesContent":["function keysForAnswer(picks, options) {\n const sorted = [...new Set(picks)].filter((i) => Number.isInteger(i) && i >= 0).sort((a, b) => a - b);\n if (sorted.length === 0) return null;\n if (!options.multiSelect) {\n if (sorted.length > 1) return null;\n return keysForOptionPick(0, sorted[0], sorted[0] + 1);\n }\n const keys = [];\n let cursor = 0;\n for (const pick of sorted) {\n for (let step = 0; step < pick - cursor; step++) keys.push(\"Down\");\n keys.push(\"Space\");\n cursor = pick;\n }\n keys.push(\"Enter\");\n return keys.join(\" \");\n}\nfunction keysForOptionPick(from, to, count) {\n const move = keysForOptionMove(from, to, count);\n if (move === null) return null;\n return move ? `${move} Enter` : \"Enter\";\n}\nfunction keysForOptionMove(from, to, count) {\n if (!Number.isInteger(to) || to < 0 || to >= count) return null;\n const start = from < 0 || from >= count ? 0 : from;\n const steps = to - start;\n return Array(Math.abs(steps)).fill(steps > 0 ? \"Down\" : \"Up\").join(\" \");\n}\nexport {\n keysForAnswer as a,\n keysForOptionMove as b,\n keysForOptionPick as k\n};\n//# sourceMappingURL=answer-keys.js.map\n","import { statSync, readFileSync } from \"fs\";\nimport { join } from \"path\";\nimport { a as CLAUDE_DIR } from \"./paths.js\";\nimport { e as enqueue } from \"./message-queue.js\";\nimport { j as sendKeyAsync } from \"./pane.js\";\nimport { k as keysForOptionPick } from \"./answer-keys.js\";\nconst SESSION_URL = \"https://claude.ai/code/\";\nfunction claudeSessionsDir() {\n return process.env.CLAUDE_SESSIONS_DIR ?? join(CLAUDE_DIR, \"sessions\");\n}\nconst bridgeMemo = /* @__PURE__ */ new Map();\nfunction readBridgeUrl(pid) {\n if (!Number.isInteger(pid) || pid <= 0) return void 0;\n const path = join(claudeSessionsDir(), `${pid}.json`);\n let stat;\n try {\n stat = statSync(path);\n } catch {\n bridgeMemo.delete(path);\n return void 0;\n }\n const memo = bridgeMemo.get(path);\n if (memo && memo.mtimeMs === stat.mtimeMs && memo.size === stat.size) return memo.url;\n const url = parseBridgeUrl(path);\n bridgeMemo.set(path, { mtimeMs: stat.mtimeMs, size: stat.size, url });\n return url;\n}\nfunction parseBridgeUrl(path) {\n let record;\n try {\n record = JSON.parse(readFileSync(path, \"utf-8\"));\n } catch {\n return void 0;\n }\n if (!record || typeof record !== \"object\" || !(\"bridgeSessionId\" in record)) return void 0;\n const id = record.bridgeSessionId;\n if (id === null) return null;\n return typeof id === \"string\" && /^[\\w-]+$/.test(id) ? SESSION_URL + id : void 0;\n}\nconst URL_PATTERN = /https:\\/\\/claude\\.ai\\/code\\/session_[\\w-]+/g;\nconst ENDED_PATTERN = /⎿\\s+Remote Control disconnected/g;\nfunction readPaneRemoteControl(content) {\n if (!content) return void 0;\n let url = null;\n for (const m of content.matchAll(URL_PATTERN)) url = { at: m.index, text: m[0] };\n let endedAt = -1;\n for (const m of content.matchAll(ENDED_PATTERN)) endedAt = m.index;\n if (url && url.at > endedAt) return url.text;\n return endedAt >= 0 ? null : void 0;\n}\nfunction currentRemoteControlUrl(session, paneContent) {\n const fromRecord = readBridgeUrl(session.pid);\n if (fromRecord !== void 0) return fromRecord;\n const fromPane = readPaneRemoteControl(paneContent);\n return fromPane === void 0 ? session.rc_url ?? null : fromPane;\n}\nconst asks = globalThis.__claudeMuxRcAsks ??= /* @__PURE__ */ new Map();\nconst ASK_TTL_MS = 10 * 6e4;\nconst SETTLE_MS = 3e3;\nfunction liveAsk(target) {\n const ask = asks.get(target);\n if (ask && Date.now() - ask.at > ASK_TTL_MS) {\n asks.delete(target);\n return void 0;\n }\n return ask;\n}\nfunction setRemoteControl(session, on) {\n if (!session.tmux_target) return { ok: false, status: 409, error: \"Session has no tmux pane\" };\n if (on && session.rc_url) return { ok: true, already: true, url: session.rc_url };\n if (!on && !session.rc_url) return { ok: true, already: true };\n if (liveAsk(session.tmux_target)) return { ok: true, already: true };\n asks.set(session.tmux_target, { way: on ? \"on\" : \"off\", at: Date.now() });\n enqueue(session.tmux_target, \"/rc\", \"control\");\n return { ok: true };\n}\nconst DIALOG_HINT = /Enter to select · Esc to continue/;\nfunction disconnectKeys(content) {\n const lines = content.split(\"\\n\");\n let hint = lines.length - 1;\n while (hint >= 0 && !DIALOG_HINT.test(lines[hint])) hint--;\n if (hint < 0) return null;\n let disconnect = -1;\n let cursor = -1;\n for (let i = hint - 1; i >= 0 && i >= hint - 8; i--) {\n if (disconnect < 0 && /Disconnect this session/.test(lines[i])) disconnect = i;\n if (cursor < 0 && /^\\s*❯\\s/.test(lines[i])) cursor = i;\n }\n if (disconnect < 0 || cursor < 0) return null;\n return keysForOptionPick(cursor, disconnect, hint)?.split(\" \") ?? null;\n}\nasync function press(target, keys) {\n for (const key of keys) if (!await sendKeyAsync(target, key)) return false;\n return true;\n}\nasync function answerRemoteControlDialog(target, content, rcUrl) {\n const ask = liveAsk(target);\n if (!ask) return false;\n const drawn = DIALOG_HINT.test(content) && /Disconnect this session/.test(content);\n if (ask.way === \"off\") {\n const keys = drawn ? disconnectKeys(content) : null;\n if (!keys) {\n if (rcUrl === null) asks.delete(target);\n return false;\n }\n if (await press(target, keys)) asks.delete(target);\n return true;\n }\n if (drawn && /❯\\s*Continue/.test(content)) {\n if (await press(target, [\"Enter\"])) asks.delete(target);\n return true;\n }\n if (rcUrl !== null) {\n ask.settledAt ??= Date.now();\n if (Date.now() - ask.settledAt > SETTLE_MS) asks.delete(target);\n }\n return false;\n}\nexport {\n answerRemoteControlDialog as a,\n currentRemoteControlUrl as c,\n setRemoteControl as s\n};\n//# sourceMappingURL=remote-control.js.map\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { d as upsertSession } from "./sessions-json-Diquh3w5.js";
2
2
  import { t as AGENTS } from "./agents-CPF5TOV7.js";
3
- import { g as sizeArgsForNewSession } from "./ws-handlers-zemeJ8Si.js";
4
- import { t as broadcastSessions } from "./ws-managers-C5VXKb_r.js";
3
+ import { g as sizeArgsForNewSession } from "./ws-handlers-k_sOue-0.js";
4
+ import { t as broadcastSessions } from "./ws-managers-D2qC6Gla.js";
5
5
  import { homedir } from "os";
6
6
  import { existsSync, readFileSync, writeFileSync } from "fs";
7
7
  import { execFileSync, spawnSync } from "child_process";
@@ -109,4 +109,4 @@ function startSession({ cwd, agent, args = [], id }) {
109
109
  }
110
110
  export { startSession as t };
111
111
 
112
- //# sourceMappingURL=start-session-CKbupnLS.js.map
112
+ //# sourceMappingURL=start-session-HljgutDe.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"start-session-CKbupnLS.js","names":[],"sources":["../../../../web/.svelte-kit/adapter-bun/chunks/start-session.js"],"sourcesContent":["import { existsSync, readFileSync, writeFileSync } from \"fs\";\nimport { spawnSync, execFileSync } from \"child_process\";\nimport { homedir } from \"os\";\nimport { basename, join } from \"path\";\nimport { u as upsertSession } from \"./sessions-json.js\";\nimport { a as AGENTS } from \"./agents.js\";\nimport { e as sizeArgsForNewSession } from \"./ws-handlers.js\";\nimport { c as broadcastSessions } from \"./ws-managers.js\";\nfunction tmuxServerRunning(env = process.env) {\n return spawnSync(\"tmux\", [\"list-sessions\"], { stdio: \"ignore\", env }).status === 0;\n}\nfunction tmuxNewSession(args, env = process.env) {\n if (!tmuxServerRunning(env) && process.platform === \"linux\") {\n const scoped = spawnSync(\n \"systemd-run\",\n [\"--user\", \"--scope\", \"--quiet\", \"--collect\", `--unit=claude-mux-tmux-${Date.now()}`, \"--\", \"tmux\", \"new-session\", ...args],\n { stdio: \"ignore\", env }\n );\n if (scoped.status === 0) return;\n if (tmuxServerRunning(env)) {\n execFileSync(\"tmux\", [\"new-session\", ...args], { stdio: \"ignore\", env });\n return;\n }\n }\n execFileSync(\"tmux\", [\"new-session\", ...args], { stdio: \"ignore\", env });\n}\nfunction projectSlug(cwd, fallback) {\n return basename(cwd).replace(/[^A-Za-z0-9_-]/g, \"_\") || fallback;\n}\nfunction ensureWorkspaceTrusted(cwd) {\n const claudeJsonPath = join(homedir(), \".claude.json\");\n try {\n const data = existsSync(claudeJsonPath) ? JSON.parse(readFileSync(claudeJsonPath, \"utf-8\")) : {};\n if (!data.projects) data.projects = {};\n if (!data.projects[cwd]) data.projects[cwd] = {};\n if (!data.projects[cwd].hasTrustDialogAccepted) {\n data.projects[cwd].hasTrustDialogAccepted = true;\n writeFileSync(claudeJsonPath, JSON.stringify(data, null, 2));\n }\n } catch (err) {\n console.error(\"[new-session] Failed to pre-trust workspace:\", err);\n }\n}\nfunction startSession({ cwd, agent, args = [], id }) {\n ensureWorkspaceTrusted(cwd);\n const sessionName = `${projectSlug(cwd, agent)}-${agent}-${Date.now()}`;\n const { TMUX: _tmux, TMUX_PANE: _pane, ...tmuxEnv } = process.env;\n tmuxNewSession([\n \"-d\",\n \"-s\",\n sessionName,\n \"-c\",\n cwd,\n // Detached, the window would be 80x24; the dashboard reads dialogs\n // off the screen and wants them unwrapped (see tmux/geometry).\n ...sizeArgsForNewSession(),\n \"--\",\n \"env\",\n \"-u\",\n \"CLAUDECODE\",\n ...AGENTS[agent].argv,\n ...args\n ], tmuxEnv);\n const baseIndex = execFileSync(\"tmux\", [\"show-option\", \"-gv\", \"base-index\"], {\n encoding: \"utf-8\",\n env: tmuxEnv\n }).trim() || \"0\";\n const paneBaseIndex = execFileSync(\"tmux\", [\"show-option\", \"-gv\", \"pane-base-index\"], {\n encoding: \"utf-8\",\n env: tmuxEnv\n }).trim() || \"0\";\n const tmuxTarget = `${sessionName}:${baseIndex}.${paneBaseIndex}`;\n const record = upsertSession({\n id: id ?? crypto.randomUUID(),\n pid: 0,\n cwd,\n tmux_target: tmuxTarget,\n state: \"idle\",\n agent\n });\n broadcastSessions();\n return { sessionName, tmuxTarget, record };\n}\nexport {\n startSession as s\n};\n//# sourceMappingURL=start-session.js.map\n"],"mappings":";;;;;;;;;AAQA,SAAS,kBAAkB,MAAM,QAAQ,KAAK;CAC5C,OAAO,UAAU,QAAQ,CAAC,eAAe,GAAG;EAAE,OAAO;EAAU;CAAI,CAAC,CAAC,CAAC,WAAW;AACnF;AACA,SAAS,eAAe,MAAM,MAAM,QAAQ,KAAK;CAC/C,IAAI,CAAC,kBAAkB,GAAG,KAAK,QAAQ,aAAa,SAAS;EAM3D,IALe,UACb,eACA;GAAC;GAAU;GAAW;GAAW;GAAa,0BAA0B,KAAK,IAAI;GAAK;GAAM;GAAQ;GAAe,GAAG;EAAI,GAC1H;GAAE,OAAO;GAAU;EAAI,CAEhB,CAAC,CAAC,WAAW,GAAG;EACzB,IAAI,kBAAkB,GAAG,GAAG;GAC1B,aAAa,QAAQ,CAAC,eAAe,GAAG,IAAI,GAAG;IAAE,OAAO;IAAU;GAAI,CAAC;GACvE;EACF;CACF;CACA,aAAa,QAAQ,CAAC,eAAe,GAAG,IAAI,GAAG;EAAE,OAAO;EAAU;CAAI,CAAC;AACzE;AACA,SAAS,YAAY,KAAK,UAAU;CAClC,OAAO,SAAS,GAAG,CAAC,CAAC,QAAQ,mBAAmB,GAAG,KAAK;AAC1D;AACA,SAAS,uBAAuB,KAAK;CACnC,MAAM,iBAAiB,KAAK,QAAQ,GAAG,cAAc;CACrD,IAAI;EACF,MAAM,OAAO,WAAW,cAAc,IAAI,KAAK,MAAM,aAAa,gBAAgB,OAAO,CAAC,IAAI,CAAC;EAC/F,IAAI,CAAC,KAAK,UAAU,KAAK,WAAW,CAAC;EACrC,IAAI,CAAC,KAAK,SAAS,MAAM,KAAK,SAAS,OAAO,CAAC;EAC/C,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,wBAAwB;GAC9C,KAAK,SAAS,IAAI,CAAC,yBAAyB;GAC5C,cAAc,gBAAgB,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;EAC7D;CACF,SAAS,KAAK;EACZ,QAAQ,MAAM,gDAAgD,GAAG;CACnE;AACF;AACA,SAAS,aAAa,EAAE,KAAK,OAAO,OAAO,CAAC,GAAG,MAAM;CACnD,uBAAuB,GAAG;CAC1B,MAAM,cAAc,GAAG,YAAY,KAAK,KAAK,EAAE,GAAG,MAAM,GAAG,KAAK,IAAI;CACpE,MAAM,EAAE,MAAM,OAAO,WAAW,OAAO,GAAG,YAAY,QAAQ;CAC9D,eAAe;EACb;EACA;EACA;EACA;EACA;EAGA,GAAG,sBAAsB;EACzB;EACA;EACA;EACA;EACA,GAAG,OAAO,MAAM,CAAC;EACjB,GAAG;CACL,GAAG,OAAO;CASV,MAAM,aAAa,GAAG,YAAY,GARhB,aAAa,QAAQ;EAAC;EAAe;EAAO;CAAY,GAAG;EAC3E,UAAU;EACV,KAAK;CACP,CAAC,CAAC,CAAC,KAAK,KAAK,IAKkC,GAJzB,aAAa,QAAQ;EAAC;EAAe;EAAO;CAAiB,GAAG;EACpF,UAAU;EACV,KAAK;CACP,CAAC,CAAC,CAAC,KAAK,KAAK;CAEb,MAAM,SAAS,cAAc;EAC3B,IAAI,MAAM,OAAO,WAAW;EAC5B,KAAK;EACL;EACA,aAAa;EACb,OAAO;EACP;CACF,CAAC;CACD,kBAAkB;CAClB,OAAO;EAAE;EAAa;EAAY;CAAO;AAC3C"}
1
+ {"version":3,"file":"start-session-HljgutDe.js","names":[],"sources":["../../../../web/.svelte-kit/adapter-bun/chunks/start-session.js"],"sourcesContent":["import { existsSync, readFileSync, writeFileSync } from \"fs\";\nimport { spawnSync, execFileSync } from \"child_process\";\nimport { homedir } from \"os\";\nimport { basename, join } from \"path\";\nimport { u as upsertSession } from \"./sessions-json.js\";\nimport { a as AGENTS } from \"./agents.js\";\nimport { e as sizeArgsForNewSession } from \"./ws-handlers.js\";\nimport { c as broadcastSessions } from \"./ws-managers.js\";\nfunction tmuxServerRunning(env = process.env) {\n return spawnSync(\"tmux\", [\"list-sessions\"], { stdio: \"ignore\", env }).status === 0;\n}\nfunction tmuxNewSession(args, env = process.env) {\n if (!tmuxServerRunning(env) && process.platform === \"linux\") {\n const scoped = spawnSync(\n \"systemd-run\",\n [\"--user\", \"--scope\", \"--quiet\", \"--collect\", `--unit=claude-mux-tmux-${Date.now()}`, \"--\", \"tmux\", \"new-session\", ...args],\n { stdio: \"ignore\", env }\n );\n if (scoped.status === 0) return;\n if (tmuxServerRunning(env)) {\n execFileSync(\"tmux\", [\"new-session\", ...args], { stdio: \"ignore\", env });\n return;\n }\n }\n execFileSync(\"tmux\", [\"new-session\", ...args], { stdio: \"ignore\", env });\n}\nfunction projectSlug(cwd, fallback) {\n return basename(cwd).replace(/[^A-Za-z0-9_-]/g, \"_\") || fallback;\n}\nfunction ensureWorkspaceTrusted(cwd) {\n const claudeJsonPath = join(homedir(), \".claude.json\");\n try {\n const data = existsSync(claudeJsonPath) ? JSON.parse(readFileSync(claudeJsonPath, \"utf-8\")) : {};\n if (!data.projects) data.projects = {};\n if (!data.projects[cwd]) data.projects[cwd] = {};\n if (!data.projects[cwd].hasTrustDialogAccepted) {\n data.projects[cwd].hasTrustDialogAccepted = true;\n writeFileSync(claudeJsonPath, JSON.stringify(data, null, 2));\n }\n } catch (err) {\n console.error(\"[new-session] Failed to pre-trust workspace:\", err);\n }\n}\nfunction startSession({ cwd, agent, args = [], id }) {\n ensureWorkspaceTrusted(cwd);\n const sessionName = `${projectSlug(cwd, agent)}-${agent}-${Date.now()}`;\n const { TMUX: _tmux, TMUX_PANE: _pane, ...tmuxEnv } = process.env;\n tmuxNewSession([\n \"-d\",\n \"-s\",\n sessionName,\n \"-c\",\n cwd,\n // Detached, the window would be 80x24; the dashboard reads dialogs\n // off the screen and wants them unwrapped (see tmux/geometry).\n ...sizeArgsForNewSession(),\n \"--\",\n \"env\",\n \"-u\",\n \"CLAUDECODE\",\n ...AGENTS[agent].argv,\n ...args\n ], tmuxEnv);\n const baseIndex = execFileSync(\"tmux\", [\"show-option\", \"-gv\", \"base-index\"], {\n encoding: \"utf-8\",\n env: tmuxEnv\n }).trim() || \"0\";\n const paneBaseIndex = execFileSync(\"tmux\", [\"show-option\", \"-gv\", \"pane-base-index\"], {\n encoding: \"utf-8\",\n env: tmuxEnv\n }).trim() || \"0\";\n const tmuxTarget = `${sessionName}:${baseIndex}.${paneBaseIndex}`;\n const record = upsertSession({\n id: id ?? crypto.randomUUID(),\n pid: 0,\n cwd,\n tmux_target: tmuxTarget,\n state: \"idle\",\n agent\n });\n broadcastSessions();\n return { sessionName, tmuxTarget, record };\n}\nexport {\n startSession as s\n};\n//# sourceMappingURL=start-session.js.map\n"],"mappings":";;;;;;;;;AAQA,SAAS,kBAAkB,MAAM,QAAQ,KAAK;CAC5C,OAAO,UAAU,QAAQ,CAAC,eAAe,GAAG;EAAE,OAAO;EAAU;CAAI,CAAC,CAAC,CAAC,WAAW;AACnF;AACA,SAAS,eAAe,MAAM,MAAM,QAAQ,KAAK;CAC/C,IAAI,CAAC,kBAAkB,GAAG,KAAK,QAAQ,aAAa,SAAS;EAM3D,IALe,UACb,eACA;GAAC;GAAU;GAAW;GAAW;GAAa,0BAA0B,KAAK,IAAI;GAAK;GAAM;GAAQ;GAAe,GAAG;EAAI,GAC1H;GAAE,OAAO;GAAU;EAAI,CAEhB,CAAC,CAAC,WAAW,GAAG;EACzB,IAAI,kBAAkB,GAAG,GAAG;GAC1B,aAAa,QAAQ,CAAC,eAAe,GAAG,IAAI,GAAG;IAAE,OAAO;IAAU;GAAI,CAAC;GACvE;EACF;CACF;CACA,aAAa,QAAQ,CAAC,eAAe,GAAG,IAAI,GAAG;EAAE,OAAO;EAAU;CAAI,CAAC;AACzE;AACA,SAAS,YAAY,KAAK,UAAU;CAClC,OAAO,SAAS,GAAG,CAAC,CAAC,QAAQ,mBAAmB,GAAG,KAAK;AAC1D;AACA,SAAS,uBAAuB,KAAK;CACnC,MAAM,iBAAiB,KAAK,QAAQ,GAAG,cAAc;CACrD,IAAI;EACF,MAAM,OAAO,WAAW,cAAc,IAAI,KAAK,MAAM,aAAa,gBAAgB,OAAO,CAAC,IAAI,CAAC;EAC/F,IAAI,CAAC,KAAK,UAAU,KAAK,WAAW,CAAC;EACrC,IAAI,CAAC,KAAK,SAAS,MAAM,KAAK,SAAS,OAAO,CAAC;EAC/C,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,wBAAwB;GAC9C,KAAK,SAAS,IAAI,CAAC,yBAAyB;GAC5C,cAAc,gBAAgB,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;EAC7D;CACF,SAAS,KAAK;EACZ,QAAQ,MAAM,gDAAgD,GAAG;CACnE;AACF;AACA,SAAS,aAAa,EAAE,KAAK,OAAO,OAAO,CAAC,GAAG,MAAM;CACnD,uBAAuB,GAAG;CAC1B,MAAM,cAAc,GAAG,YAAY,KAAK,KAAK,EAAE,GAAG,MAAM,GAAG,KAAK,IAAI;CACpE,MAAM,EAAE,MAAM,OAAO,WAAW,OAAO,GAAG,YAAY,QAAQ;CAC9D,eAAe;EACb;EACA;EACA;EACA;EACA;EAGA,GAAG,sBAAsB;EACzB;EACA;EACA;EACA;EACA,GAAG,OAAO,MAAM,CAAC;EACjB,GAAG;CACL,GAAG,OAAO;CASV,MAAM,aAAa,GAAG,YAAY,GARhB,aAAa,QAAQ;EAAC;EAAe;EAAO;CAAY,GAAG;EAC3E,UAAU;EACV,KAAK;CACP,CAAC,CAAC,CAAC,KAAK,KAAK,IAKkC,GAJzB,aAAa,QAAQ;EAAC;EAAe;EAAO;CAAiB,GAAG;EACpF,UAAU;EACV,KAAK;CACP,CAAC,CAAC,CAAC,KAAK,KAAK;CAEb,MAAM,SAAS,cAAc;EAC3B,IAAI,MAAM,OAAO,WAAW;EAC5B,KAAK;EACL;EACA,aAAa;EACb,OAAO;EACP;CACF,CAAC;CACD,kBAAkB;CAClB,OAAO;EAAE;EAAa;EAAY;CAAO;AAC3C"}
@@ -1,5 +1,5 @@
1
1
  // .svelte-kit/adapter-bun/chunks/version.js
2
- const VERSION = "0.30.13";
2
+ const VERSION = "0.30.14";
3
3
  export { VERSION as t };
4
4
 
5
- //# sourceMappingURL=version-BqEJmw2g.js.map
5
+ //# sourceMappingURL=version-ox9yLZ0P.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version-ox9yLZ0P.js","names":[],"sources":["../../../../web/.svelte-kit/adapter-bun/chunks/version.js"],"sourcesContent":["const VERSION = \"0.30.14\";\nexport {\n VERSION as V\n};\n//# sourceMappingURL=version.js.map\n"],"mappings":";AAAA,MAAM,UAAU"}
@@ -1,4 +1,4 @@
1
- import { r as isInside } from "./files-4i3igWea.js";
1
+ import { r as isInside } from "./files-DNH191y7.js";
2
2
  import { readlink } from "fs/promises";
3
3
  import { execFile } from "child_process";
4
4
  import { promisify } from "util";
@@ -200,4 +200,4 @@ async function checkFraming(url, origin) {
200
200
  }
201
201
  export { detectDevServers as n, tailscaleServes as r, checkFraming as t };
202
202
 
203
- //# sourceMappingURL=web-preview-Bi5fjydK.js.map
203
+ //# sourceMappingURL=web-preview-H5eiWlBD.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"web-preview-Bi5fjydK.js","names":[],"sources":["../../../../web/.svelte-kit/adapter-bun/chunks/web-preview.js"],"sourcesContent":["import { execFile } from \"child_process\";\nimport { readlink } from \"fs/promises\";\nimport { promisify } from \"util\";\nimport { i as isInside } from \"./files.js\";\nfunction isLoopback(host) {\n const h = host.replace(/^\\[|\\]$/g, \"\").toLowerCase();\n return h === \"localhost\" || h.endsWith(\".localhost\") || h === \"::1\" || /^(::ffff:)?127\\./.test(h);\n}\nconst execFileAsync = promisify(execFile);\nconst PROBE_TIMEOUT_MS = 1e3;\nconst NOT_HTML_RETRY_MS = 6e4;\nconst FRAME_CHECK_TIMEOUT_MS = 4e3;\nconst TAILNET_CACHE_MS = 1e4;\nconst USERS_RE = /users:\\(\\(\"((?:[^\"\\\\]|\\\\.)*)\",pid=(\\d+)/;\nfunction parseListeners(out) {\n const listeners = [];\n for (const line of out.split(\"\\n\")) {\n const cols = line.trim().split(/\\s+/);\n if (cols[0] !== \"LISTEN\" || cols.length < 6) continue;\n const users = USERS_RE.exec(line);\n if (!users) continue;\n const local = cols[3];\n const colon = local.lastIndexOf(\":\");\n const port = Number(local.slice(colon + 1));\n if (colon < 0 || !Number.isInteger(port)) continue;\n const address = local.slice(0, colon).replace(/^\\[|\\]$/g, \"\").replace(/%.*$/, \"\");\n listeners.push({ address, port, pid: Number(users[2]), process: users[1] });\n }\n return listeners;\n}\nfunction isWildcard(address) {\n return address === \"*\" || address === \"0.0.0.0\" || address === \"::\";\n}\nfunction localUrl(port, addresses) {\n if (addresses.some((a) => isWildcard(a) || isLoopback(a))) return `http://localhost:${port}/`;\n return hostUrl(addresses[0], port);\n}\nfunction hostUrl(address, port) {\n return `http://${address.includes(\":\") ? `[${address}]` : address}:${port}/`;\n}\nfunction probeUrl(port, addresses) {\n if (addresses.some((a) => a === \"*\" || a === \"0.0.0.0\" || /^(::ffff:)?127\\./.test(a))) {\n return hostUrl(\"127.0.0.1\", port);\n }\n if (addresses.some((a) => a === \"::\" || a === \"::1\")) return hostUrl(\"::1\", port);\n return hostUrl(addresses[0], port);\n}\nasync function fetchHeaders(url, timeoutMs) {\n const res = await fetch(url, { signal: AbortSignal.timeout(timeoutMs), redirect: \"follow\" });\n void res.body?.cancel();\n return res;\n}\nconst probed = /* @__PURE__ */ new Map();\nasync function servesHtml(url) {\n try {\n const res = await fetchHeaders(url, PROBE_TIMEOUT_MS);\n return (res.headers.get(\"content-type\") ?? \"\").includes(\"text/html\");\n } catch {\n return false;\n }\n}\nasync function detectDevServers(root) {\n if (process.platform !== \"linux\") return [];\n let out;\n try {\n ({ stdout: out } = await execFileAsync(\"ss\", [\"-ltnpH\"], { timeout: 2e3 }));\n } catch {\n return [];\n }\n const byPort = /* @__PURE__ */ new Map();\n const live = /* @__PURE__ */ new Set();\n for (const l of parseListeners(out)) {\n byPort.set(l.port, [...byPort.get(l.port) ?? [], l]);\n live.add(`${l.pid}:${l.port}`);\n }\n for (const key of probed.keys()) if (!live.has(key)) probed.delete(key);\n const cwds = /* @__PURE__ */ new Map();\n const cwdOf = (pid) => {\n if (!cwds.has(pid)) cwds.set(pid, readlink(`/proc/${pid}/cwd`).catch(() => null));\n return cwds.get(pid);\n };\n const found = await Promise.all(\n [...byPort].map(async ([port, socks]) => {\n const cwd = await cwdOf(socks[0].pid);\n if (!cwd || !isInside(root, cwd)) return null;\n const addresses = socks.map((s) => s.address);\n const key = `${socks[0].pid}:${port}`;\n let seen = probed.get(key);\n if (!seen || !seen.html && Date.now() - seen.at > NOT_HTML_RETRY_MS) {\n seen = { html: await servesHtml(probeUrl(port, addresses)), at: Date.now() };\n probed.set(key, seen);\n }\n if (!seen.html) return null;\n const url = localUrl(port, addresses);\n return {\n port,\n url,\n pid: socks[0].pid,\n process: socks[0].process,\n loopbackOnly: addresses.every(isLoopback)\n };\n })\n );\n return found.filter((s) => s !== null).sort((a, b) => a.port - b.port);\n}\nfunction parseServeStatus(status) {\n const serves = {};\n for (const [hostPort, web] of Object.entries(status.Web ?? {})) {\n const proxy = web.Handlers?.[\"/\"]?.Proxy;\n if (!proxy) continue;\n let target;\n try {\n target = new URL(proxy);\n } catch {\n continue;\n }\n if (target.protocol !== \"http:\" || !isLoopback(target.hostname)) continue;\n const local = Number(target.port || 80);\n let served;\n try {\n served = new URL(`https://${hostPort}`);\n } catch {\n continue;\n }\n if (!serves[local] || String(local) === (served.port || \"443\")) serves[local] = served.origin;\n }\n return serves;\n}\nlet servesCache = null;\nfunction tailscaleServes() {\n const now = Date.now();\n if (!servesCache || now - servesCache.at > TAILNET_CACHE_MS) {\n const serves = execFileAsync(\"tailscale\", [\"serve\", \"status\", \"--json\"], { timeout: 3e3 }).then(({ stdout }) => parseServeStatus(JSON.parse(stdout))).catch(() => ({}));\n servesCache = { at: now, serves };\n }\n return servesCache.serves;\n}\nconst DEFAULT_PORTS = { \"http:\": \"80\", \"https:\": \"443\" };\nfunction sourceAllows(source, ours, theirs) {\n const s = source.toLowerCase();\n if (s === \"*\") return true;\n if (s === \"'self'\") return ours.origin === theirs.origin;\n const schemeOk = (scheme2) => ours.protocol === scheme2 || scheme2 === \"http:\" && ours.protocol === \"https:\";\n if (/^[a-z][a-z0-9+.-]*:$/.test(s)) return schemeOk(s);\n const m = /^(?:([a-z][a-z0-9+.-]*):\\/\\/)?(\\*|(?:\\*\\.)?[^:/]+)(?::(\\*|\\d+))?(?:\\/.*)?$/.exec(s);\n if (!m) return false;\n const [, scheme, host, port] = m;\n if (scheme && !schemeOk(`${scheme}:`)) return false;\n const hostname = ours.hostname.toLowerCase();\n if (host !== \"*\" && !(host.startsWith(\"*.\") ? hostname.endsWith(host.slice(1)) : host === hostname)) return false;\n if (port === \"*\") return true;\n const ourPort = ours.port || DEFAULT_PORTS[ours.protocol];\n return (port ?? DEFAULT_PORTS[scheme ? `${scheme}:` : ours.protocol]) === ourPort;\n}\nfunction framingVerdict(headers, theirs, ours) {\n const policies = (headers.get(\"content-security-policy\") ?? \"\").split(\",\");\n const ancestors = policies.map((p) => p.split(\";\").map((d) => d.trim().split(/\\s+/))).map((dirs) => dirs.find((d) => d[0]?.toLowerCase() === \"frame-ancestors\")).filter((d) => d !== void 0);\n if (ancestors.length > 0) {\n for (const [, ...sources] of ancestors) {\n if (!sources.some((src) => sourceAllows(src, ours, theirs))) {\n return { embeddable: false, reason: `Its Content-Security-Policy says frame-ancestors ${sources.join(\" \") || \"'none'\"}.` };\n }\n }\n return { embeddable: true };\n }\n const xfo = headers.get(\"x-frame-options\")?.trim().toLowerCase();\n if (xfo) {\n for (const value of xfo.split(\",\").map((v) => v.trim())) {\n if (value === \"deny\") return { embeddable: false, reason: \"It sends X-Frame-Options: DENY.\" };\n if (value === \"sameorigin\" && ours.origin !== theirs.origin) {\n return { embeddable: false, reason: \"It sends X-Frame-Options: SAMEORIGIN.\" };\n }\n }\n }\n return { embeddable: true };\n}\nasync function checkFraming(url, origin) {\n let res;\n try {\n res = await fetchHeaders(url, FRAME_CHECK_TIMEOUT_MS);\n } catch {\n return { embeddable: null, reason: \"Could not reach the page to check it.\" };\n }\n return framingVerdict(res.headers, new URL(res.url || url), new URL(origin));\n}\nexport {\n checkFraming as c,\n detectDevServers as d,\n tailscaleServes as t\n};\n//# sourceMappingURL=web-preview.js.map\n"],"mappings":";;;;;AAIA,SAAS,WAAW,MAAM;CACxB,MAAM,IAAI,KAAK,QAAQ,YAAY,EAAE,CAAC,CAAC,YAAY;CACnD,OAAO,MAAM,eAAe,EAAE,SAAS,YAAY,KAAK,MAAM,SAAS,mBAAmB,KAAK,CAAC;AAClG;AACA,MAAM,gBAAgB,UAAU,QAAQ;AACxC,MAAM,mBAAmB;AACzB,MAAM,oBAAoB;AAC1B,MAAM,yBAAyB;AAC/B,MAAM,mBAAmB;AACzB,MAAM,WAAW;AACjB,SAAS,eAAe,KAAK;CAC3B,MAAM,YAAY,CAAC;CACnB,KAAK,MAAM,QAAQ,IAAI,MAAM,IAAI,GAAG;EAClC,MAAM,OAAO,KAAK,KAAK,CAAC,CAAC,MAAM,KAAK;EACpC,IAAI,KAAK,OAAO,YAAY,KAAK,SAAS,GAAG;EAC7C,MAAM,QAAQ,SAAS,KAAK,IAAI;EAChC,IAAI,CAAC,OAAO;EACZ,MAAM,QAAQ,KAAK;EACnB,MAAM,QAAQ,MAAM,YAAY,GAAG;EACnC,MAAM,OAAO,OAAO,MAAM,MAAM,QAAQ,CAAC,CAAC;EAC1C,IAAI,QAAQ,KAAK,CAAC,OAAO,UAAU,IAAI,GAAG;EAC1C,MAAM,UAAU,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,QAAQ,YAAY,EAAE,CAAC,CAAC,QAAQ,QAAQ,EAAE;EAChF,UAAU,KAAK;GAAE;GAAS;GAAM,KAAK,OAAO,MAAM,EAAE;GAAG,SAAS,MAAM;EAAG,CAAC;CAC5E;CACA,OAAO;AACT;AACA,SAAS,WAAW,SAAS;CAC3B,OAAO,YAAY,OAAO,YAAY,aAAa,YAAY;AACjE;AACA,SAAS,SAAS,MAAM,WAAW;CACjC,IAAI,UAAU,MAAM,MAAM,WAAW,CAAC,KAAK,WAAW,CAAC,CAAC,GAAG,OAAO,oBAAoB,KAAK;CAC3F,OAAO,QAAQ,UAAU,IAAI,IAAI;AACnC;AACA,SAAS,QAAQ,SAAS,MAAM;CAC9B,OAAO,UAAU,QAAQ,SAAS,GAAG,IAAI,IAAI,QAAQ,KAAK,QAAQ,GAAG,KAAK;AAC5E;AACA,SAAS,SAAS,MAAM,WAAW;CACjC,IAAI,UAAU,MAAM,MAAM,MAAM,OAAO,MAAM,aAAa,mBAAmB,KAAK,CAAC,CAAC,GAClF,OAAO,QAAQ,aAAa,IAAI;CAElC,IAAI,UAAU,MAAM,MAAM,MAAM,QAAQ,MAAM,KAAK,GAAG,OAAO,QAAQ,OAAO,IAAI;CAChF,OAAO,QAAQ,UAAU,IAAI,IAAI;AACnC;AACA,eAAe,aAAa,KAAK,WAAW;CAC1C,MAAM,MAAM,MAAM,MAAM,KAAK;EAAE,QAAQ,YAAY,QAAQ,SAAS;EAAG,UAAU;CAAS,CAAC;CAC3F,IAAS,MAAM,OAAO;CACtB,OAAO;AACT;AACA,MAAM,yBAAyB,IAAI,IAAI;AACvC,eAAe,WAAW,KAAK;CAC7B,IAAI;EAEF,SAAQ,MADU,aAAa,KAAK,gBAAgB,EAAA,CACxC,QAAQ,IAAI,cAAc,KAAK,GAAA,CAAI,SAAS,WAAW;CACrE,QAAQ;EACN,OAAO;CACT;AACF;AACA,eAAe,iBAAiB,MAAM;CACpC,IAAI,QAAQ,aAAa,SAAS,OAAO,CAAC;CAC1C,IAAI;CACJ,IAAI;EACF,CAAC,CAAE,QAAQ,OAAQ,MAAM,cAAc,MAAM,CAAC,QAAQ,GAAG,EAAE,SAAS,IAAI,CAAC;CAC3E,QAAQ;EACN,OAAO,CAAC;CACV;CACA,MAAM,yBAAyB,IAAI,IAAI;CACvC,MAAM,uBAAuB,IAAI,IAAI;CACrC,KAAK,MAAM,KAAK,eAAe,GAAG,GAAG;EACnC,OAAO,IAAI,EAAE,MAAM,CAAC,GAAG,OAAO,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC;EACnD,KAAK,IAAI,GAAG,EAAE,IAAI,GAAG,EAAE,MAAM;CAC/B;CACA,KAAK,MAAM,OAAO,OAAO,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,GAAG,GAAG,OAAO,OAAO,GAAG;CACtE,MAAM,uBAAuB,IAAI,IAAI;CACrC,MAAM,SAAS,QAAQ;EACrB,IAAI,CAAC,KAAK,IAAI,GAAG,GAAG,KAAK,IAAI,KAAK,SAAS,SAAS,IAAI,KAAK,CAAC,CAAC,YAAY,IAAI,CAAC;EAChF,OAAO,KAAK,IAAI,GAAG;CACrB;CAuBA,QAAO,MAtBa,QAAQ,IAC1B,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,OAAO,CAAC,MAAM,WAAW;EACvC,MAAM,MAAM,MAAM,MAAM,MAAM,EAAE,CAAC,GAAG;EACpC,IAAI,CAAC,OAAO,CAAC,SAAS,MAAM,GAAG,GAAG,OAAO;EACzC,MAAM,YAAY,MAAM,KAAK,MAAM,EAAE,OAAO;EAC5C,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,IAAI,GAAG;EAC/B,IAAI,OAAO,OAAO,IAAI,GAAG;EACzB,IAAI,CAAC,QAAQ,CAAC,KAAK,QAAQ,KAAK,IAAI,IAAI,KAAK,KAAK,mBAAmB;GACnE,OAAO;IAAE,MAAM,MAAM,WAAW,SAAS,MAAM,SAAS,CAAC;IAAG,IAAI,KAAK,IAAI;GAAE;GAC3E,OAAO,IAAI,KAAK,IAAI;EACtB;EACA,IAAI,CAAC,KAAK,MAAM,OAAO;EAEvB,OAAO;GACL;GACA,KAHU,SAAS,MAAM,SAGvB;GACF,KAAK,MAAM,EAAE,CAAC;GACd,SAAS,MAAM,EAAE,CAAC;GAClB,cAAc,UAAU,MAAM,UAAU;EAC1C;CACF,CAAC,CACH,EAAA,CACa,QAAQ,MAAM,MAAM,IAAI,CAAC,CAAC,MAAM,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI;AACvE;AACA,SAAS,iBAAiB,QAAQ;CAChC,MAAM,SAAS,CAAC;CAChB,KAAK,MAAM,CAAC,UAAU,QAAQ,OAAO,QAAQ,OAAO,OAAO,CAAC,CAAC,GAAG;EAC9D,MAAM,QAAQ,IAAI,WAAW,IAAI,EAAE;EACnC,IAAI,CAAC,OAAO;EACZ,IAAI;EACJ,IAAI;GACF,SAAS,IAAI,IAAI,KAAK;EACxB,QAAQ;GACN;EACF;EACA,IAAI,OAAO,aAAa,WAAW,CAAC,WAAW,OAAO,QAAQ,GAAG;EACjE,MAAM,QAAQ,OAAO,OAAO,QAAQ,EAAE;EACtC,IAAI;EACJ,IAAI;GACF,SAAS,IAAI,IAAI,WAAW,UAAU;EACxC,QAAQ;GACN;EACF;EACA,IAAI,CAAC,OAAO,UAAU,OAAO,KAAK,OAAO,OAAO,QAAQ,QAAQ,OAAO,SAAS,OAAO;CACzF;CACA,OAAO;AACT;AACA,IAAI,cAAc;AAClB,SAAS,kBAAkB;CACzB,MAAM,MAAM,KAAK,IAAI;CACrB,IAAI,CAAC,eAAe,MAAM,YAAY,KAAK,kBAEzC,cAAc;EAAE,IAAI;EAAK,QADV,cAAc,aAAa;GAAC;GAAS;GAAU;EAAQ,GAAG,EAAE,SAAS,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,aAAa,iBAAiB,KAAK,MAAM,MAAM,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,EACtI;CAAE;CAElC,OAAO,YAAY;AACrB;AACA,MAAM,gBAAgB;CAAE,SAAS;CAAM,UAAU;AAAM;AACvD,SAAS,aAAa,QAAQ,MAAM,QAAQ;CAC1C,MAAM,IAAI,OAAO,YAAY;CAC7B,IAAI,MAAM,KAAK,OAAO;CACtB,IAAI,MAAM,UAAU,OAAO,KAAK,WAAW,OAAO;CAClD,MAAM,YAAY,YAAY,KAAK,aAAa,WAAW,YAAY,WAAW,KAAK,aAAa;CACpG,IAAI,uBAAuB,KAAK,CAAC,GAAG,OAAO,SAAS,CAAC;CACrD,MAAM,IAAI,6EAA6E,KAAK,CAAC;CAC7F,IAAI,CAAC,GAAG,OAAO;CACf,MAAM,GAAG,QAAQ,MAAM,QAAQ;CAC/B,IAAI,UAAU,CAAC,SAAS,GAAG,OAAO,EAAE,GAAG,OAAO;CAC9C,MAAM,WAAW,KAAK,SAAS,YAAY;CAC3C,IAAI,SAAS,OAAO,EAAE,KAAK,WAAW,IAAI,IAAI,SAAS,SAAS,KAAK,MAAM,CAAC,CAAC,IAAI,SAAS,WAAW,OAAO;CAC5G,IAAI,SAAS,KAAK,OAAO;CACzB,MAAM,UAAU,KAAK,QAAQ,cAAc,KAAK;CAChD,QAAQ,QAAQ,cAAc,SAAS,GAAG,OAAO,KAAK,KAAK,eAAe;AAC5E;AACA,SAAS,eAAe,SAAS,QAAQ,MAAM;CAE7C,MAAM,aADY,QAAQ,IAAI,yBAAyB,KAAK,GAAA,CAAI,MAAM,GAC7C,CAAC,CAAC,KAAK,MAAM,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,MAAM,EAAE,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS,KAAK,MAAM,MAAM,EAAE,EAAE,EAAE,YAAY,MAAM,iBAAiB,CAAC,CAAC,CAAC,QAAQ,MAAM,MAAM,KAAK,CAAC;CAC3L,IAAI,UAAU,SAAS,GAAG;EACxB,KAAK,MAAM,GAAG,GAAG,YAAY,WAC3B,IAAI,CAAC,QAAQ,MAAM,QAAQ,aAAa,KAAK,MAAM,MAAM,CAAC,GACxD,OAAO;GAAE,YAAY;GAAO,QAAQ,oDAAoD,QAAQ,KAAK,GAAG,KAAK,SAAS;EAAG;EAG7H,OAAO,EAAE,YAAY,KAAK;CAC5B;CACA,MAAM,MAAM,QAAQ,IAAI,iBAAiB,CAAC,EAAE,KAAK,CAAC,CAAC,YAAY;CAC/D,IAAI,KACF,KAAK,MAAM,SAAS,IAAI,MAAM,GAAG,CAAC,CAAC,KAAK,MAAM,EAAE,KAAK,CAAC,GAAG;EACvD,IAAI,UAAU,QAAQ,OAAO;GAAE,YAAY;GAAO,QAAQ;EAAkC;EAC5F,IAAI,UAAU,gBAAgB,KAAK,WAAW,OAAO,QACnD,OAAO;GAAE,YAAY;GAAO,QAAQ;EAAwC;CAEhF;CAEF,OAAO,EAAE,YAAY,KAAK;AAC5B;AACA,eAAe,aAAa,KAAK,QAAQ;CACvC,IAAI;CACJ,IAAI;EACF,MAAM,MAAM,aAAa,KAAK,sBAAsB;CACtD,QAAQ;EACN,OAAO;GAAE,YAAY;GAAM,QAAQ;EAAwC;CAC7E;CACA,OAAO,eAAe,IAAI,SAAS,IAAI,IAAI,IAAI,OAAO,GAAG,GAAG,IAAI,IAAI,MAAM,CAAC;AAC7E"}
1
+ {"version":3,"file":"web-preview-H5eiWlBD.js","names":[],"sources":["../../../../web/.svelte-kit/adapter-bun/chunks/web-preview.js"],"sourcesContent":["import { execFile } from \"child_process\";\nimport { readlink } from \"fs/promises\";\nimport { promisify } from \"util\";\nimport { i as isInside } from \"./files.js\";\nfunction isLoopback(host) {\n const h = host.replace(/^\\[|\\]$/g, \"\").toLowerCase();\n return h === \"localhost\" || h.endsWith(\".localhost\") || h === \"::1\" || /^(::ffff:)?127\\./.test(h);\n}\nconst execFileAsync = promisify(execFile);\nconst PROBE_TIMEOUT_MS = 1e3;\nconst NOT_HTML_RETRY_MS = 6e4;\nconst FRAME_CHECK_TIMEOUT_MS = 4e3;\nconst TAILNET_CACHE_MS = 1e4;\nconst USERS_RE = /users:\\(\\(\"((?:[^\"\\\\]|\\\\.)*)\",pid=(\\d+)/;\nfunction parseListeners(out) {\n const listeners = [];\n for (const line of out.split(\"\\n\")) {\n const cols = line.trim().split(/\\s+/);\n if (cols[0] !== \"LISTEN\" || cols.length < 6) continue;\n const users = USERS_RE.exec(line);\n if (!users) continue;\n const local = cols[3];\n const colon = local.lastIndexOf(\":\");\n const port = Number(local.slice(colon + 1));\n if (colon < 0 || !Number.isInteger(port)) continue;\n const address = local.slice(0, colon).replace(/^\\[|\\]$/g, \"\").replace(/%.*$/, \"\");\n listeners.push({ address, port, pid: Number(users[2]), process: users[1] });\n }\n return listeners;\n}\nfunction isWildcard(address) {\n return address === \"*\" || address === \"0.0.0.0\" || address === \"::\";\n}\nfunction localUrl(port, addresses) {\n if (addresses.some((a) => isWildcard(a) || isLoopback(a))) return `http://localhost:${port}/`;\n return hostUrl(addresses[0], port);\n}\nfunction hostUrl(address, port) {\n return `http://${address.includes(\":\") ? `[${address}]` : address}:${port}/`;\n}\nfunction probeUrl(port, addresses) {\n if (addresses.some((a) => a === \"*\" || a === \"0.0.0.0\" || /^(::ffff:)?127\\./.test(a))) {\n return hostUrl(\"127.0.0.1\", port);\n }\n if (addresses.some((a) => a === \"::\" || a === \"::1\")) return hostUrl(\"::1\", port);\n return hostUrl(addresses[0], port);\n}\nasync function fetchHeaders(url, timeoutMs) {\n const res = await fetch(url, { signal: AbortSignal.timeout(timeoutMs), redirect: \"follow\" });\n void res.body?.cancel();\n return res;\n}\nconst probed = /* @__PURE__ */ new Map();\nasync function servesHtml(url) {\n try {\n const res = await fetchHeaders(url, PROBE_TIMEOUT_MS);\n return (res.headers.get(\"content-type\") ?? \"\").includes(\"text/html\");\n } catch {\n return false;\n }\n}\nasync function detectDevServers(root) {\n if (process.platform !== \"linux\") return [];\n let out;\n try {\n ({ stdout: out } = await execFileAsync(\"ss\", [\"-ltnpH\"], { timeout: 2e3 }));\n } catch {\n return [];\n }\n const byPort = /* @__PURE__ */ new Map();\n const live = /* @__PURE__ */ new Set();\n for (const l of parseListeners(out)) {\n byPort.set(l.port, [...byPort.get(l.port) ?? [], l]);\n live.add(`${l.pid}:${l.port}`);\n }\n for (const key of probed.keys()) if (!live.has(key)) probed.delete(key);\n const cwds = /* @__PURE__ */ new Map();\n const cwdOf = (pid) => {\n if (!cwds.has(pid)) cwds.set(pid, readlink(`/proc/${pid}/cwd`).catch(() => null));\n return cwds.get(pid);\n };\n const found = await Promise.all(\n [...byPort].map(async ([port, socks]) => {\n const cwd = await cwdOf(socks[0].pid);\n if (!cwd || !isInside(root, cwd)) return null;\n const addresses = socks.map((s) => s.address);\n const key = `${socks[0].pid}:${port}`;\n let seen = probed.get(key);\n if (!seen || !seen.html && Date.now() - seen.at > NOT_HTML_RETRY_MS) {\n seen = { html: await servesHtml(probeUrl(port, addresses)), at: Date.now() };\n probed.set(key, seen);\n }\n if (!seen.html) return null;\n const url = localUrl(port, addresses);\n return {\n port,\n url,\n pid: socks[0].pid,\n process: socks[0].process,\n loopbackOnly: addresses.every(isLoopback)\n };\n })\n );\n return found.filter((s) => s !== null).sort((a, b) => a.port - b.port);\n}\nfunction parseServeStatus(status) {\n const serves = {};\n for (const [hostPort, web] of Object.entries(status.Web ?? {})) {\n const proxy = web.Handlers?.[\"/\"]?.Proxy;\n if (!proxy) continue;\n let target;\n try {\n target = new URL(proxy);\n } catch {\n continue;\n }\n if (target.protocol !== \"http:\" || !isLoopback(target.hostname)) continue;\n const local = Number(target.port || 80);\n let served;\n try {\n served = new URL(`https://${hostPort}`);\n } catch {\n continue;\n }\n if (!serves[local] || String(local) === (served.port || \"443\")) serves[local] = served.origin;\n }\n return serves;\n}\nlet servesCache = null;\nfunction tailscaleServes() {\n const now = Date.now();\n if (!servesCache || now - servesCache.at > TAILNET_CACHE_MS) {\n const serves = execFileAsync(\"tailscale\", [\"serve\", \"status\", \"--json\"], { timeout: 3e3 }).then(({ stdout }) => parseServeStatus(JSON.parse(stdout))).catch(() => ({}));\n servesCache = { at: now, serves };\n }\n return servesCache.serves;\n}\nconst DEFAULT_PORTS = { \"http:\": \"80\", \"https:\": \"443\" };\nfunction sourceAllows(source, ours, theirs) {\n const s = source.toLowerCase();\n if (s === \"*\") return true;\n if (s === \"'self'\") return ours.origin === theirs.origin;\n const schemeOk = (scheme2) => ours.protocol === scheme2 || scheme2 === \"http:\" && ours.protocol === \"https:\";\n if (/^[a-z][a-z0-9+.-]*:$/.test(s)) return schemeOk(s);\n const m = /^(?:([a-z][a-z0-9+.-]*):\\/\\/)?(\\*|(?:\\*\\.)?[^:/]+)(?::(\\*|\\d+))?(?:\\/.*)?$/.exec(s);\n if (!m) return false;\n const [, scheme, host, port] = m;\n if (scheme && !schemeOk(`${scheme}:`)) return false;\n const hostname = ours.hostname.toLowerCase();\n if (host !== \"*\" && !(host.startsWith(\"*.\") ? hostname.endsWith(host.slice(1)) : host === hostname)) return false;\n if (port === \"*\") return true;\n const ourPort = ours.port || DEFAULT_PORTS[ours.protocol];\n return (port ?? DEFAULT_PORTS[scheme ? `${scheme}:` : ours.protocol]) === ourPort;\n}\nfunction framingVerdict(headers, theirs, ours) {\n const policies = (headers.get(\"content-security-policy\") ?? \"\").split(\",\");\n const ancestors = policies.map((p) => p.split(\";\").map((d) => d.trim().split(/\\s+/))).map((dirs) => dirs.find((d) => d[0]?.toLowerCase() === \"frame-ancestors\")).filter((d) => d !== void 0);\n if (ancestors.length > 0) {\n for (const [, ...sources] of ancestors) {\n if (!sources.some((src) => sourceAllows(src, ours, theirs))) {\n return { embeddable: false, reason: `Its Content-Security-Policy says frame-ancestors ${sources.join(\" \") || \"'none'\"}.` };\n }\n }\n return { embeddable: true };\n }\n const xfo = headers.get(\"x-frame-options\")?.trim().toLowerCase();\n if (xfo) {\n for (const value of xfo.split(\",\").map((v) => v.trim())) {\n if (value === \"deny\") return { embeddable: false, reason: \"It sends X-Frame-Options: DENY.\" };\n if (value === \"sameorigin\" && ours.origin !== theirs.origin) {\n return { embeddable: false, reason: \"It sends X-Frame-Options: SAMEORIGIN.\" };\n }\n }\n }\n return { embeddable: true };\n}\nasync function checkFraming(url, origin) {\n let res;\n try {\n res = await fetchHeaders(url, FRAME_CHECK_TIMEOUT_MS);\n } catch {\n return { embeddable: null, reason: \"Could not reach the page to check it.\" };\n }\n return framingVerdict(res.headers, new URL(res.url || url), new URL(origin));\n}\nexport {\n checkFraming as c,\n detectDevServers as d,\n tailscaleServes as t\n};\n//# sourceMappingURL=web-preview.js.map\n"],"mappings":"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"}
@@ -4,14 +4,14 @@ import { a as resolveTranscriptPath, i as projectsRoot, n as findTranscriptById,
4
4
  import { t as writeFileAtomic } from "./atomic-write-CPI0lZzV.js";
5
5
  import { c as normaliseRemote } from "./fleet-projects-WVLUrgJA.js";
6
6
  import { r as peekTranscriptTitle, t as peekContextPercent } from "./context-peek-T3fXhKlK.js";
7
- import { c as parseSlashCommand, d as peekGitSummary, h as sessionWatcher, m as sessionChanges, t as TranscriptBuilder } from "./git-D9dLEKUF.js";
7
+ import { _ as unwrapPasted, c as parseSlashCommand, d as peekGitSummary, h as sessionWatcher, m as sessionChanges, t as TranscriptBuilder } from "./git-CHO9UIOQ.js";
8
8
  import { a as listAllPanes, d as readQueuedMessages, f as readUpdateNotice, h as stripAnsi, i as isPaneShowingIdlePrompt, l as readPromptBox, n as detectRecentInterruption, o as readActivity, s as readActivityLine, t as capturePaneContentAsync, u as readPromptOptions } from "./pane-gFaC5AAF.js";
9
- import { a as getQueue, i as getDeliveries, o as isDictated } from "./message-queue-sFcJCRjz.js";
10
- import { n as currentRemoteControlUrl, r as setRemoteControl, t as answerRemoteControlDialog } from "./remote-control-C1d9R3w4.js";
9
+ import { a as getQueue, i as getDeliveries, o as isDictated } from "./message-queue-DhLshpoF.js";
10
+ import { n as currentRemoteControlUrl, r as setRemoteControl, t as answerRemoteControlDialog } from "./remote-control-BvYkVDhx.js";
11
11
  import { r as readRewindScreen } from "./rewind-DkHbYTKf.js";
12
12
  import { n as upgradeStatus } from "./restart-claude-CbtZ_W3E.js";
13
13
  import { i as watchSessionRepos, n as issueFor, t as inboxTickets } from "./github-DYS06StA.js";
14
- import { n as projectReports } from "./project-icons-CSb1bfT9.js";
14
+ import { n as projectReports } from "./project-icons-bWhaFSVy.js";
15
15
  import { homedir } from "os";
16
16
  import { existsSync, mkdirSync, readFileSync, renameSync, statSync, writeFileSync } from "fs";
17
17
  import { statfs } from "fs/promises";
@@ -795,6 +795,7 @@ function promptText(entry) {
795
795
  if (!block || message.content.some((b) => b?.type === "tool_result")) return null;
796
796
  text = block.text;
797
797
  }
798
+ if (text) text = unwrapPasted(text);
798
799
  if (!text?.trim()) return null;
799
800
  const command = parseSlashCommand(text);
800
801
  if (command) return clip(command.args ? `${command.name} ${command.args}` : command.name);
@@ -2489,4 +2490,4 @@ function parseWsPath(pathname, search = "") {
2489
2490
  }
2490
2491
  export { updateSettings as _, getSavedProjects as a, markUnread as c, readPastSession as d, recordVisit as f, sizeArgsForNewSession as g, saveProject as h, getEnrichedSessionsAsync as i, parseWsPath as l, resizePane as m, TerminalWsManager as n, getSettings as o, removeProject as p, TranscriptWsManager as r, handleWsMessage as s, SessionsWsManager as t, pluginReader as u };
2491
2492
 
2492
- //# sourceMappingURL=ws-handlers-zemeJ8Si.js.map
2493
+ //# sourceMappingURL=ws-handlers-k_sOue-0.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws-handlers-k_sOue-0.js","names":["readFile","open","basename","readdir","stat"],"sources":["../../../../web/.svelte-kit/adapter-bun/chunks/ws-handlers.js"],"sourcesContent":["import { existsSync, readFileSync, mkdirSync, writeFileSync, renameSync, statSync } from \"fs\";\nimport { b as getSessionsDir, c as cleanupStaleSessions, g as getSession, r as readLinks, d as updateSession, a as getAllSessions, s as sanitizeDisplayName } from \"./sessions-json.js\";\nimport { dirname, join } from \"path\";\nimport { homedir } from \"os\";\nimport { w as writeFileAtomic } from \"./atomic-write.js\";\nimport { u as unwrapPasted, p as parseSlashCommand, s as sessionWatcher, T as TranscriptBuilder, a as peekGitSummary, b as sessionChanges } from \"./git.js\";\nimport { i as isDictated, g as getDeliveries, a as getQueue } from \"./message-queue.js\";\nimport { statfs } from \"fs/promises\";\nimport { p as projectsRoot, J as JsonlTailer, r as resolveTranscriptPath, f as findTranscriptById, l as listSubagents } from \"./tailer.js\";\nimport { c as currentRemoteControlUrl, a as answerRemoteControlDialog, s as setRemoteControl } from \"./remote-control.js\";\nimport { l as listAllPanes, a as readPromptBox, b as readActivity, d as readUpdateNotice, r as readPromptOptions, e as readQueuedMessages, c as capturePaneContentAsync, s as stripAnsi, f as detectRecentInterruption, i as isPaneShowingIdlePrompt, g as readActivityLine } from \"./pane.js\";\nimport { execFile, execFileSync } from \"child_process\";\nimport { promisify } from \"util\";\nimport { r as readRewindScreen } from \"./rewind.js\";\nimport { u as upgradeStatus } from \"./restart-claude.js\";\nimport { p as peekContextPercent, a as peekTranscriptTitle } from \"./context-peek.js\";\nimport { a as inboxTickets, w as watchSessionRepos, i as issueFor } from \"./github.js\";\nimport { a as projectReports } from \"./project-icons.js\";\nimport { execFile as execFile$1 } from \"node:child_process\";\nimport { readFile as readFile$1, readdir, stat, open } from \"node:fs/promises\";\nimport { homedir as homedir$1 } from \"node:os\";\nimport { join as join$1, delimiter, basename } from \"node:path\";\nimport { n as normaliseRemote } from \"./fleet-projects.js\";\nimport { i as isRepoSlug } from \"./github-ref.js\";\nfunction resolveProjectsPath() {\n return join(dirname(getSessionsDir()), \"projects.json\");\n}\nfunction readFile() {\n const path = resolveProjectsPath();\n if (!existsSync(path)) return { v: 1, projects: [] };\n try {\n const parsed = JSON.parse(readFileSync(path, \"utf-8\"));\n const projects = Array.isArray(parsed.projects) ? parsed.projects.filter((p) => typeof p === \"string\" && p.length > 0) : [];\n return { v: 1, projects: [...new Set(projects)] };\n } catch {\n return { v: 1, projects: [] };\n }\n}\nfunction writeFile(file) {\n const path = resolveProjectsPath();\n mkdirSync(dirname(path), { recursive: true });\n const tmp = `${path}.${process.pid}.tmp`;\n writeFileSync(tmp, JSON.stringify(file, null, 2));\n renameSync(tmp, path);\n}\nfunction getSavedProjects() {\n return readFile().projects;\n}\nfunction isForbiddenRoot(cwd, home = homedir()) {\n const path = cwd.replace(/\\/+$/, \"\") || \"/\";\n if (path === \"/\" || path === home) return true;\n if ([\"/tmp\", \"/home\", \"/Users\", \"/root\", \"/mnt\", \"/media\", \"/opt\", \"/var\", \"/srv\"].includes(path)) return true;\n if (/^\\/(?:mnt|media|Volumes)\\/[^/]+$/.test(path)) return true;\n return false;\n}\nfunction isUnder(child, parent) {\n return child.startsWith(parent.endsWith(\"/\") ? parent : `${parent}/`);\n}\nfunction saveProjects(cwds) {\n const file = readFile();\n let changed = false;\n for (const raw of cwds) {\n const cwd = raw?.replace(/\\/+$/, \"\");\n if (!cwd || isForbiddenRoot(cwd)) continue;\n if (file.projects.some((p) => p === cwd || isUnder(cwd, p))) continue;\n const kept = file.projects.filter((p) => !isUnder(p, cwd));\n if (kept.length !== file.projects.length) changed = true;\n file.projects = [...kept, cwd];\n changed = true;\n }\n if (changed) writeFile(file);\n return changed;\n}\nfunction saveProject(cwd) {\n return saveProjects([cwd]);\n}\nfunction removeProject(cwd) {\n const file = readFile();\n const next = file.projects.filter((p) => p !== cwd);\n if (next.length === file.projects.length) return false;\n writeFile({ ...file, projects: next });\n return true;\n}\nconst DEFAULT_SETTINGS = {\n autoRemoteControl: false\n};\nfunction resolveSettingsPath() {\n return join(dirname(getSessionsDir()), \"settings.json\");\n}\nfunction getSettings() {\n const path = resolveSettingsPath();\n if (!existsSync(path)) return { ...DEFAULT_SETTINGS };\n try {\n const parsed = JSON.parse(readFileSync(path, \"utf-8\"));\n return {\n autoRemoteControl: typeof parsed.autoRemoteControl === \"boolean\" ? parsed.autoRemoteControl : DEFAULT_SETTINGS.autoRemoteControl\n };\n } catch {\n return { ...DEFAULT_SETTINGS };\n }\n}\nfunction updateSettings(patch) {\n const next = { ...getSettings() };\n if (typeof patch.autoRemoteControl === \"boolean\") next.autoRemoteControl = patch.autoRemoteControl;\n const path = resolveSettingsPath();\n mkdirSync(dirname(path), { recursive: true });\n const tmp = `${path}.${process.pid}.tmp`;\n writeFileSync(tmp, JSON.stringify(next, null, 2));\n renameSync(tmp, path);\n return next;\n}\nfunction isClaudeMuxSessionName(name) {\n return /-(?:claude|gemini|copilot)-\\d{10,}$/.test(name);\n}\nconst KEEP_MS = 30 * 24 * 60 * 60 * 1e3;\nlet cache = null;\nfunction resolveVisitsPath() {\n return join(dirname(getSessionsDir()), \"visits.json\");\n}\nfunction getVisits() {\n const path = resolveVisitsPath();\n try {\n const { mtimeMs } = statSync(path);\n if (cache?.mtimeMs === mtimeMs) return cache.visits;\n const parsed = JSON.parse(readFileSync(path, \"utf-8\"));\n const visits = {};\n if (parsed && typeof parsed === \"object\") {\n for (const [id, at] of Object.entries(parsed)) {\n if (typeof at === \"number\" && Number.isFinite(at)) visits[id] = at;\n }\n }\n cache = { mtimeMs, visits };\n return visits;\n } catch {\n return cache?.visits ?? {};\n }\n}\nfunction recordVisit(id, at = Date.now()) {\n const now = Date.now();\n const next = {};\n for (const [other, when] of Object.entries(getVisits())) {\n if (now - when < KEEP_MS || existsSync(join(getSessionsDir(), `${other}.json`))) next[other] = when;\n }\n next[id] = at;\n const path = resolveVisitsPath();\n writeFileAtomic(path, JSON.stringify(next, null, 2));\n cache = { mtimeMs: statSync(path).mtimeMs, visits: next };\n}\nfunction markUnread(id, turnCompletedAt) {\n if (!turnCompletedAt) return false;\n recordVisit(id, turnCompletedAt - 1);\n return true;\n}\nconst SUBAGENT_ACTIVITY_LIMIT = 120;\nconst SUBAGENT_ACTIVITY_LEAN = 8;\nconst SUBAGENT_LIVE_WINDOW_MS = 45e3;\nfunction subagentPayload(agentId, state, finished, full = true) {\n const limit = full ? SUBAGENT_ACTIVITY_LIMIT : SUBAGENT_ACTIVITY_LEAN;\n const activity = [];\n let report = null;\n let prompt = null;\n for (const entry of state.builder.entries) {\n if (entry.kind === \"user\" && prompt === null) prompt = entry.text;\n if (entry.kind === \"tool\") {\n activity.push({\n id: entry.id,\n name: entry.name,\n summary: entry.summary,\n ok: entry.result ? entry.result.ok : null\n });\n } else if (entry.kind === \"text\") {\n report = entry.text;\n }\n }\n const mtime = state.tailer.mtimeMs();\n const running = !finished && mtime !== null && Date.now() - mtime < SUBAGENT_LIVE_WINDOW_MS;\n const trimmed = Math.max(0, activity.length - limit);\n return {\n agentId,\n toolUseId: state.meta.toolUseId ?? null,\n agentType: state.meta.agentType ?? null,\n description: state.meta.description ?? null,\n model: state.meta.model ?? null,\n // Keep the newest calls — the tail is what \"what is it doing\" needs.\n activity: activity.slice(-limit),\n trimmed,\n report: full ? report : null,\n prompt: full ? prompt : null,\n running,\n full\n };\n}\nfunction usedPercent({ blocks, bfree, bavail }) {\n const used = blocks - bfree;\n const usable = used + bavail;\n return usable > 0 ? Math.ceil(used / usable * 100) : 0;\n}\nasync function homeDiskPercent(path = homedir()) {\n try {\n return usedPercent(await statfs(path));\n } catch {\n return null;\n }\n}\nconst execFileAsync = promisify(execFile);\nconst STANDARD_PANE_WIDTH = 200;\nconst STANDARD_PANE_HEIGHT = 50;\nconst MIN_USEFUL_PANE_WIDTH = 160;\nfunction sizeArgsForNewSession() {\n return [\"-x\", String(STANDARD_PANE_WIDTH), \"-y\", String(STANDARD_PANE_HEIGHT)];\n}\nfunction wantsWidening(pane) {\n return pane.attached === 0 && pane.width < MIN_USEFUL_PANE_WIDTH;\n}\nasync function widenDetachedWindow(target) {\n try {\n await execFileAsync(\n \"tmux\",\n [\"resize-window\", \"-t\", target, \"-x\", String(STANDARD_PANE_WIDTH), \"-y\", String(STANDARD_PANE_HEIGHT)],\n { timeout: 1e3 }\n );\n await execFileAsync(\"tmux\", [\"set-option\", \"-w\", \"-t\", target, \"window-size\", \"latest\"], {\n timeout: 1e3\n });\n return true;\n } catch {\n return false;\n }\n}\nconst CODE_FIELD = /Paste code here if prompted >\\s?(.*)$/;\nconst LINK_INTRO = /Browser didn't open\\?/;\nconst LINK_START = /^\\s*(https:\\/\\/\\S+)$/;\nconst LINK_REST = /^[A-Za-z0-9%&=_.~+/:?#-]+$/;\nconst CODE_ERROR = /(Invalid code\\. Please make sure the full code was copied\\.?|OAuth error: .+)$/;\nconst SIGNED_IN = /Login successful\\. Press .*continue/i;\nconst RETRY = /Press Enter to retry/i;\nconst EXPIRED = /Please run \\/login|run \\/login to restore|Not logged in · Please run \\/login/i;\nconst BULLET = /^\\s*●\\s/;\nconst LOGIN_REACH = 40;\nfunction readLoginScreen(content) {\n if (!content) return null;\n const lines = content.split(\"\\n\");\n let last = lines.length - 1;\n while (last >= 0 && !lines[last].trim()) last--;\n if (last < 0) return null;\n const from = Math.max(0, last - LOGIN_REACH);\n for (let i = last; i >= from; i--) {\n if (SIGNED_IN.test(lines[i])) return { step: \"done\" };\n if (RETRY.test(lines[i])) {\n const above = lines.slice(Math.max(from, i - 3), i).map((l) => l.trim().match(CODE_ERROR)?.[1]).filter(Boolean);\n return { step: \"failed\", error: above.at(-1) ?? \"The sign-in failed.\" };\n }\n const field = lines[i].match(CODE_FIELD);\n if (!field) continue;\n let error = null;\n for (let j = i + 1; j <= last; j++) {\n const m = lines[j].trim().match(CODE_ERROR);\n if (m) error = m[1];\n }\n return { step: \"code\", url: readLink(lines, from, i), typed: field[1].trim(), error };\n }\n for (let i = last; i >= from; i--) {\n if (!BULLET.test(lines[i])) continue;\n return EXPIRED.test(lines[i]) ? { step: \"expired\" } : null;\n }\n return null;\n}\nfunction readLink(lines, from, field) {\n let start = -1;\n for (let i = field - 1; i >= from; i--) {\n if (LINK_START.test(lines[i])) start = i;\n if (LINK_INTRO.test(lines[i])) break;\n }\n if (start === -1) return null;\n let url = lines[start].trim();\n for (let i = start + 1; i < field; i++) {\n const piece = lines[i].replace(/\\s+$/, \"\");\n if (!LINK_REST.test(piece)) break;\n url += piece;\n }\n return url;\n}\nfunction resizeTmuxWindow(target, cols, rows) {\n try {\n const safeCols = Math.max(20, Math.min(500, Math.floor(cols)));\n const safeRows = Math.max(5, Math.min(200, Math.floor(rows)));\n const windowTarget = target.replace(/\\.\\d+$/, \"\");\n execFileSync(\n \"tmux\",\n [\"resize-window\", \"-t\", windowTarget, \"-x\", String(safeCols), \"-y\", String(safeRows)],\n {\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n timeout: 2e3\n }\n );\n } catch {\n }\n}\nconst HISTORY_TAIL = 64;\nconst SEP = \"@@CLAUDE_MUX_SEP@@\";\nfunction run(args) {\n return execFileSync(\"tmux\", args, {\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n timeout: 2e3,\n maxBuffer: 16 * 1024 * 1024\n });\n}\nfunction splitLines(s) {\n if (s === \"\") return [];\n const lines = s.split(\"\\n\");\n if (lines[lines.length - 1] === \"\") lines.pop();\n return lines;\n}\nfunction snapshotPane(target) {\n let out;\n try {\n out = run([\n \"display-message\",\n \"-p\",\n \"-t\",\n target,\n \"#{history_size} #{alternate_on} #{pane_width} #{pane_height}\",\n \";\",\n \"capture-pane\",\n \"-p\",\n \"-e\",\n \"-t\",\n target,\n \"-S\",\n `-${HISTORY_TAIL}`,\n \"-E\",\n \"-1\",\n \";\",\n \"display-message\",\n \"-p\",\n SEP,\n \";\",\n \"capture-pane\",\n \"-p\",\n \"-e\",\n \"-t\",\n target\n ]);\n } catch {\n return null;\n }\n const nl = out.indexOf(\"\\n\");\n if (nl === -1) return null;\n const header = out.slice(0, nl).trim().split(/\\s+/);\n if (header.length < 4) return null;\n const historySize = Number(header[0]) || 0;\n const alt = header[1] === \"1\";\n const cols = Number(header[2]) || 0;\n const rows = Number(header[3]) || 0;\n const body = out.slice(nl + 1);\n const sepIdx = body.indexOf(SEP + \"\\n\");\n if (sepIdx === -1) return null;\n const tailRaw = body.slice(0, sepIdx);\n const screenRaw = body.slice(sepIdx + SEP.length + 1);\n let tail = splitLines(tailRaw);\n if (historySize === 0) tail = [];\n else if (tail.length > historySize) tail = tail.slice(tail.length - historySize);\n return { historySize, alt, cols, rows, tail, screen: splitLines(screenRaw) };\n}\nfunction fetchHistoryRange(target, start, end, knownHistorySize) {\n if (end <= start) return { start, lines: [], historySize: knownHistorySize };\n let known = knownHistorySize;\n let last = null;\n for (let attempt = 0; attempt < 4; attempt++) {\n const relStart = start - known;\n const relEnd = end - 1 - known;\n if (relEnd >= 0) {\n return { start, lines: [], historySize: known };\n }\n let out;\n try {\n out = run([\n \"display-message\",\n \"-p\",\n \"-t\",\n target,\n \"#{history_size}\",\n \";\",\n \"capture-pane\",\n \"-p\",\n \"-e\",\n \"-t\",\n target,\n \"-S\",\n String(relStart),\n \"-E\",\n String(relEnd)\n ]);\n } catch {\n return null;\n }\n const nl = out.indexOf(\"\\n\");\n if (nl === -1) return null;\n const historySize = Number(out.slice(0, nl).trim()) || 0;\n const lines = splitLines(out.slice(nl + 1));\n const drift = historySize - known;\n if (drift === 0) return { start, lines, historySize };\n last = { start: Math.max(0, start + drift), lines, historySize };\n known = historySize;\n }\n return last;\n}\nconst REFRESH_MS = 5 * 6e4;\nconst LATEST_MS = 10 * 6e4;\nconst READ_TIMEOUT_MS = 3e4;\nconst STEP_TIMEOUT_MS = 9e4;\nconst FETCH_TIMEOUT_MS = 10 * 6e4;\nconst OUTPUT_TAIL = 8e3;\nconst RUN_PATH = [process.env.PATH ?? \"\", join$1(homedir$1(), \".local\", \"bin\"), join$1(homedir$1(), \".claude\", \"local\")].filter(Boolean).join(delimiter);\nconst defaultRun = (cmd, args, timeoutMs) => new Promise((done) => {\n execFile$1(\n cmd,\n args,\n {\n timeout: timeoutMs,\n maxBuffer: 16 * 1024 * 1024,\n // git asking for a password or a host key would wait out the timeout.\n env: { ...process.env, PATH: RUN_PATH, GIT_TERMINAL_PROMPT: \"0\", GIT_SSH_COMMAND: \"ssh -o BatchMode=yes\" }\n },\n (err, stdout, stderr) => {\n const code = err ? typeof err.code === \"number\" ? err.code : -1 : 0;\n const timedOut = !!err && err.killed === true && !!err.signal && err.code !== \"ERR_CHILD_PROCESS_STDIO_MAXBUFFER\";\n done({ code, stdout: String(stdout), stderr: String(stderr || (err && code === -1 && !timedOut ? err.message : \"\")), timedOut });\n }\n );\n});\nconst defaultReadText = (path) => readFile$1(path, \"utf8\").catch(() => null);\nfunction parseJson(text) {\n try {\n const data = JSON.parse(text);\n return Array.isArray(data) ? data.filter((x) => x && typeof x === \"object\") : [];\n } catch {\n return [];\n }\n}\nconst SHA = /^[0-9a-f]{40}$/;\nasync function localCommit(location, run2, readText) {\n const head = await run2(\"git\", [\"-C\", location, \"rev-parse\", \"HEAD\"], READ_TIMEOUT_MS);\n const sha = head.stdout.trim();\n if (head.code === 0 && SHA.test(sha)) return sha;\n const gcs = (await readText(join$1(location, \".gcs-sha\")))?.trim() ?? \"\";\n return SHA.test(gcs) ? gcs : null;\n}\nasync function askGithub(repo, run2) {\n const res = await run2(\"gh\", [\"api\", `repos/${repo}`, \"--jq\", \".full_name\"], READ_TIMEOUT_MS);\n const name = res.stdout.trim();\n if (res.code !== 0 || !isRepoSlug(name)) return null;\n const head = await run2(\"gh\", [\"api\", `repos/${name}/commits/HEAD`, \"--jq\", \".sha\"], READ_TIMEOUT_MS);\n const sha = head.stdout.trim();\n return head.code === 0 && SHA.test(sha) ? { repo: name, latest: sha } : null;\n}\nasync function lsRemote(url, run2) {\n const res = await run2(\"git\", [\"ls-remote\", url, \"HEAD\"], READ_TIMEOUT_MS);\n const sha = res.stdout.split(/\\s/)[0];\n return res.code === 0 && SHA.test(sha) ? sha : null;\n}\nclass PluginReader {\n report = null;\n reading = null;\n job = null;\n /** When the last read started, so a CLI that fails is not run again on every broadcast. */\n attemptedAt = -Infinity;\n sources = /* @__PURE__ */ new Map();\n run;\n now;\n readText;\n constructor(deps = {}) {\n this.run = deps.run ?? defaultRun;\n this.now = deps.now ?? Date.now;\n this.readText = deps.readText ?? defaultReadText;\n }\n /** What is known now, starting a read in the background when the last one is stale. */\n current() {\n if (this.now() - this.attemptedAt > REFRESH_MS && !this.reading) void this.read().catch((err) => console.warn(\"[plugins] read failed:\", err));\n return this.report;\n }\n /** Read the report now; a read already under way is joined. When the CLI cannot be run, the last report (null before any). */\n read() {\n if (!this.reading) this.attemptedAt = this.now();\n this.reading ??= this.readNow().finally(() => {\n this.reading = null;\n });\n return this.reading;\n }\n /** Read again after whatever read is under way, so the report reflects everything done before the call. */\n async refresh() {\n await this.reading;\n return this.read();\n }\n /**\n * Start \"Bring in line\" unless a run is under way, which is joined instead:\n * two runs at once would both rewrite Claude Code's plugin files. Answers\n * the job as it stands; `onDone` is called once it has ended and the report\n * has been read again.\n */\n startAlign(plan, onDone = () => {\n }) {\n if (this.job?.state === \"running\") return { started: false, job: snapshot(this.job) };\n const runs = alignRuns(plan);\n const job = { state: \"running\", startedAt: this.now(), finishedAt: null, steps: runs.map((r) => r.step) };\n this.job = job;\n void this.runJob(job, runs, onDone);\n return { started: true, job: snapshot(job) };\n }\n /** The last \"Bring in line\" run, null before any. */\n alignJob() {\n return this.job && snapshot(this.job);\n }\n /** Each step runs whatever the one before did; the report is read again at the end so the fleet sees the result. */\n async runJob(job, runs, onDone) {\n try {\n for (const { step, args, limit } of runs) {\n step.state = \"running\";\n step.startedAt = this.now();\n const res = await this.run(\"claude\", args, limit).catch(\n (err) => ({ code: -1, stdout: \"\", stderr: String(err) })\n );\n step.finishedAt = this.now();\n const output = `${res.stdout}${res.stderr}`.trim().slice(-OUTPUT_TAIL);\n if (res.timedOut) {\n step.state = \"timeout\";\n step.output = `${output}\n(stopped after ${Math.round(limit / 6e4)} min without finishing)`.trimStart();\n } else {\n step.state = res.code === 0 ? \"ok\" : \"failed\";\n step.output = output;\n }\n }\n await this.refresh().catch((err) => console.warn(\"[plugins] read failed:\", err));\n } finally {\n job.state = \"done\";\n job.finishedAt = this.now();\n onDone();\n }\n }\n async readNow() {\n const [mps, pls] = await Promise.all([\n this.run(\"claude\", [\"plugin\", \"marketplace\", \"list\", \"--json\"], READ_TIMEOUT_MS),\n this.run(\"claude\", [\"plugin\", \"list\", \"--json\"], READ_TIMEOUT_MS)\n ]);\n if (mps.code !== 0 || pls.code !== 0) {\n console.warn(\"[plugins] could not read:\", (mps.stderr || pls.stderr).trim().split(\"\\n\")[0]);\n return this.report;\n }\n const marketplaces = await Promise.all(parseJson(mps.stdout).map((m) => this.marketplace(m)));\n const plugins = parseJson(pls.stdout).filter((p) => typeof p.id === \"string\" && (p.scope === void 0 || p.scope === \"user\")).map((p) => ({\n id: p.id,\n version: typeof p.version === \"string\" ? p.version : null,\n enabled: p.enabled !== false\n })).sort((a, b) => a.id.localeCompare(b.id));\n const report = {\n marketplaces: marketplaces.filter((m) => m !== null),\n plugins,\n readAt: this.now()\n };\n this.report = report;\n return report;\n }\n async marketplace(m) {\n if (typeof m.name !== \"string\") return null;\n const location = typeof m.installLocation === \"string\" ? m.installLocation : null;\n const github = m.source === \"github\" && typeof m.repo === \"string\" ? m.repo : typeof m.url === \"string\" ? /^github\\.com\\/([^/]+\\/[^/]+)$/.exec(normaliseRemote(m.url) ?? \"\")?.[1] : void 0;\n const written = github ?? (typeof m.url === \"string\" ? m.url : null);\n const [commit, source] = await Promise.all([\n location ? localCommit(location, this.run, this.readText) : null,\n this.source(github, written)\n ]);\n return { name: m.name, repo: source?.repo ?? written, commit, latest: source?.latest ?? null };\n }\n async source(github, written) {\n if (!written) return null;\n const cached = this.sources.get(written);\n if (cached && this.now() - cached.at < LATEST_MS) return cached.source;\n let source = null;\n if (github) {\n source = await askGithub(github, this.run) ?? { repo: github, latest: await lsRemote(`https://github.com/${github}.git`, this.run) };\n } else {\n source = { repo: written, latest: await lsRemote(written, this.run) };\n }\n if (source) this.sources.set(written, { at: this.now(), source });\n return source;\n }\n}\nfunction alignRuns(plan) {\n const run2 = (kind, label, args, limit) => ({\n step: { kind, label, command: `claude ${args.join(\" \")}`, state: \"pending\", startedAt: null, finishedAt: null, output: \"\" },\n args,\n limit\n });\n return [\n ...plan.update.map((name) => run2(\"update\", `Updating ${name}`, [\"plugin\", \"marketplace\", \"update\", name], FETCH_TIMEOUT_MS)),\n ...plan.install.map(\n (s) => \"marketplace\" in s ? run2(\"install\", `Installing ${s.name}`, [\"plugin\", \"install\", `${s.name}@${s.marketplace}`], STEP_TIMEOUT_MS) : (\n // Adds the marketplace, which clones it.\n run2(\"install\", `Installing ${s.name}`, [\"plugin\", \"install\", s.name, \"--marketplace\", s.repo], FETCH_TIMEOUT_MS)\n )\n ),\n ...plan.enable.map((id) => run2(\"enable\", `Enabling ${id}`, [\"plugin\", \"enable\", id, \"--scope\", \"user\"], STEP_TIMEOUT_MS))\n ];\n}\nfunction snapshot(job) {\n return { ...job, steps: job.steps.map((s) => ({ ...s })) };\n}\nfunction pluginReader() {\n const g = globalThis;\n return g.__claudeMuxPlugins ??= new PluginReader();\n}\nconst END_BYTES = 64 * 1024;\nconst MAX_LABEL = 160;\nconst SESSION_FILE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\\.jsonl$/i;\nfunction parseLines(text, cutStart, cutEnd) {\n const lines = text.split(\"\\n\");\n if (cutStart) lines.shift();\n if (cutEnd) lines.pop();\n const out = [];\n for (const line of lines) {\n if (!line.trim()) continue;\n try {\n const parsed = JSON.parse(line);\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) out.push(parsed);\n } catch {\n }\n }\n return out;\n}\nfunction str(value) {\n return typeof value === \"string\" && value.trim() ? value : null;\n}\nfunction clip(text) {\n const flat = text.replace(/\\s+/g, \" \").trim();\n return flat.length > MAX_LABEL ? `${flat.slice(0, MAX_LABEL - 1)}…` : flat;\n}\nfunction promptText(entry) {\n if (entry.type !== \"user\" || entry.isMeta === true || entry.isSidechain === true) return null;\n const message = entry.message;\n let text = null;\n if (typeof message?.content === \"string\") text = message.content;\n else if (Array.isArray(message?.content)) {\n const block = message.content.find(\n (b) => !!b && typeof b === \"object\" && b.type === \"text\" && typeof b.text === \"string\"\n );\n if (!block || message.content.some((b) => b?.type === \"tool_result\")) return null;\n text = block.text;\n }\n if (text) text = unwrapPasted(text);\n if (!text?.trim()) return null;\n const command = parseSlashCommand(text);\n if (command) return clip(command.args ? `${command.name} ${command.args}` : command.name);\n if (/^\\s*<(local-command|command-message|system-reminder|bash-|user-memory)/.test(text) || text.startsWith(\"Caveat:\")) {\n return null;\n }\n return clip(text);\n}\nfunction timestampOf(entry) {\n const ts = typeof entry.timestamp === \"string\" ? Date.parse(entry.timestamp) : NaN;\n return Number.isFinite(ts) ? ts : null;\n}\nasync function readPastSession(path) {\n let handle;\n try {\n handle = await open(path, \"r\");\n } catch {\n return null;\n }\n let head;\n let tail;\n let size;\n let mtimeMs;\n try {\n const info = await handle.stat();\n size = info.size;\n mtimeMs = info.mtimeMs;\n const headBuf = Buffer.alloc(Math.min(size, END_BYTES));\n await handle.read(headBuf, 0, headBuf.length, 0);\n head = headBuf.toString(\"utf8\");\n if (size > END_BYTES) {\n const tailLength = Math.min(size - END_BYTES, END_BYTES);\n const tailBuf = Buffer.alloc(tailLength);\n await handle.read(tailBuf, 0, tailLength, size - tailLength);\n tail = tailBuf.toString(\"utf8\");\n } else {\n tail = \"\";\n }\n } catch {\n return null;\n } finally {\n await handle.close();\n }\n const headEntries = parseLines(head, false, size > END_BYTES);\n const tailEntries = tail ? parseLines(tail, size > 2 * END_BYTES || !head.endsWith(\"\\n\"), false) : [];\n const all = [...headEntries, ...tailEntries];\n let cwd = null;\n let branch = null;\n let prompt = null;\n let customTitle = null;\n let aiTitle = null;\n let lastPrompt = null;\n let last = null;\n for (const entry of all) {\n if (entry.isSidechain === true) continue;\n const entrypoint = str(entry.entrypoint);\n if (entrypoint?.startsWith(\"sdk\")) return null;\n cwd = str(entry.cwd) ?? cwd;\n branch = str(entry.gitBranch) ?? branch;\n prompt ??= promptText(entry);\n if (entry.type === \"custom-title\") customTitle = str(entry.customTitle) ?? customTitle;\n if (entry.type === \"ai-title\") aiTitle = str(entry.aiTitle) ?? aiTitle;\n if (entry.type === \"last-prompt\") lastPrompt = str(entry.lastPrompt) ?? lastPrompt;\n last = timestampOf(entry) ?? last;\n }\n prompt ??= lastPrompt ? clip(lastPrompt) : null;\n customTitle = await readTitleFile(path) ?? customTitle;\n const title = customTitle ?? aiTitle;\n if (!prompt && !title) return null;\n return {\n id: basename(path, \".jsonl\"),\n cwd,\n branch,\n title: title ? clip(title) : null,\n prompt,\n lastActivity: last ?? mtimeMs\n };\n}\nasync function readTitleFile(transcriptPath) {\n try {\n const raw = JSON.parse(await readFile$1(join$1(transcriptPath.replace(/\\.jsonl$/, \"\"), \"custom-title.json\"), \"utf8\"));\n return str(raw?.customTitle);\n } catch {\n return null;\n }\n}\nasync function listTranscripts(root = projectsRoot()) {\n let dirs;\n try {\n dirs = await readdir(root);\n } catch {\n return [];\n }\n const out = [];\n for (const dir of dirs) {\n let names;\n try {\n names = await readdir(join$1(root, dir));\n } catch {\n continue;\n }\n for (const name of names) {\n if (!SESSION_FILE.test(name)) continue;\n const path = join$1(root, dir, name);\n try {\n const info = await stat(path);\n if (info.isFile()) out.push({ path, mtimeMs: info.mtimeMs, size: info.size });\n } catch {\n }\n }\n }\n return out;\n}\nclass PastSessionIndex {\n constructor(root = projectsRoot) {\n this.root = root;\n }\n root;\n cache = /* @__PURE__ */ new Map();\n /** Every past session, newest first. A session id found twice (a transcript moved by /cd) keeps the newer. */\n async list() {\n const files = await listTranscripts(this.root());\n const seen = /* @__PURE__ */ new Set();\n for (const file of files) {\n seen.add(file.path);\n const known = this.cache.get(file.path);\n if (known && known.mtimeMs === file.mtimeMs && known.size === file.size) continue;\n this.cache.set(file.path, { mtimeMs: file.mtimeMs, size: file.size, session: await readPastSession(file.path) });\n }\n for (const path of this.cache.keys()) if (!seen.has(path)) this.cache.delete(path);\n const byId = /* @__PURE__ */ new Map();\n for (const { session } of this.cache.values()) {\n if (!session) continue;\n const other = byId.get(session.id);\n if (!other || other.lastActivity < session.lastActivity) byId.set(session.id, session);\n }\n return [...byId.values()].sort((a, b) => b.lastActivity - a.lastActivity);\n }\n}\nfunction withoutLive(past, live) {\n return past.filter((p) => !live.has(p.id));\n}\nconst DEFAULT_CONFIG = {\n maxSessionsClients: 50,\n maxTerminalClientsPerTarget: 10,\n maxTerminalClientsTotal: 100,\n maxQueuedMessages: 100,\n debug: false\n};\nfunction log(entry, config) {\n if (entry.level === \"debug\" && !config.debug) return;\n const prefix = `[ws:${entry.component}]`;\n const msg = entry.data ? `${prefix} ${entry.message} ${JSON.stringify(entry.data)}` : `${prefix} ${entry.message}`;\n switch (entry.level) {\n case \"debug\":\n console.debug(msg);\n break;\n case \"info\":\n console.info(msg);\n break;\n case \"warn\":\n console.warn(msg);\n break;\n case \"error\":\n console.error(msg);\n break;\n }\n}\nconst DEFAULT_HISTORY_DEPTH = 200;\nconst MAX_HISTORY_REQUEST = 1e3;\nfunction deduplicateByTmuxTarget(sessions) {\n const byTarget = /* @__PURE__ */ new Map();\n const noTarget = [];\n for (const session of sessions) {\n if (!session.tmux_target) {\n noTarget.push(session);\n continue;\n }\n const existing = byTarget.get(session.tmux_target);\n if (!existing || session.last_update > existing.last_update) {\n byTarget.set(session.tmux_target, session);\n }\n }\n return [...byTarget.values(), ...noTarget];\n}\nconst idleLookTicks = /* @__PURE__ */ new Map();\nconst PAUSE_TRUST_MS = 10 * 60 * 1e3;\nfunction pausedOnBackground(session) {\n return (session.background_tasks ?? 0) > 0 && Date.now() - session.last_update < PAUSE_TRUST_MS;\n}\nasync function captureAndSyncSessions() {\n const sessions = getAllSessions();\n const captures = /* @__PURE__ */ new Map();\n const rawCaptures = /* @__PURE__ */ new Map();\n const apply = (session, patch) => {\n updateSession(session.id, patch);\n Object.assign(session, patch);\n };\n await Promise.all(\n sessions.map(async (session) => {\n if (!session.tmux_target) return;\n const raw = await capturePaneContentAsync(session.tmux_target, true);\n if (!raw) return;\n const content = stripAnsi(raw);\n captures.set(session.tmux_target, content);\n rawCaptures.set(session.tmux_target, raw);\n if (session.state !== \"idle\" && detectRecentInterruption(content)) {\n apply(session, { state: \"idle\", current_action: null, prompt_text: null });\n } else if (session.state === \"busy\" && !pausedOnBackground(session) && isPaneShowingIdlePrompt(content)) {\n const ticks = (idleLookTicks.get(session.id) ?? 0) + 1;\n if (ticks >= 2) {\n idleLookTicks.delete(session.id);\n apply(session, { state: \"idle\", current_action: null, prompt_text: null });\n } else {\n idleLookTicks.set(session.id, ticks);\n }\n } else {\n idleLookTicks.delete(session.id);\n }\n if (session.state === \"idle\") {\n const activity = readActivityLine(content);\n if (activity) apply(session, { state: \"busy\", current_action: activity });\n }\n })\n );\n if (idleLookTicks.size > 0) {\n const live = new Set(sessions.map((s) => s.id));\n for (const id of idleLookTicks.keys()) {\n if (!live.has(id)) idleLookTicks.delete(id);\n }\n }\n return { captures, rawCaptures, sessions };\n}\nconst turnStarts = /* @__PURE__ */ new Map();\nfunction liveActivity(sessionId, activity) {\n if (!activity) {\n turnStarts.delete(sessionId);\n return null;\n }\n const { elapsed_s, ...rest } = activity;\n if (elapsed_s === null) return { ...rest, started_at: turnStarts.get(sessionId) ?? null };\n const start = Date.now() - elapsed_s * 1e3;\n const known = turnStarts.get(sessionId);\n if (known !== void 0 && Math.abs(start - known) <= 2e3) return { ...rest, started_at: known };\n turnStarts.set(sessionId, start);\n return { ...rest, started_at: start };\n}\nconst wideningNow = /* @__PURE__ */ new Set();\nconst rcSeen = /* @__PURE__ */ new Set();\nlet rcPrimed = false;\nconst transcriptTitleSeen = /* @__PURE__ */ new Map();\nfunction syncTranscriptTitle(s) {\n if ((s.agent ?? \"claude\") !== \"claude\") return;\n const title = peekTranscriptTitle(s);\n if (title === void 0 || transcriptTitleSeen.get(s.id) === title) return;\n transcriptTitleSeen.set(s.id, title);\n const name = sanitizeDisplayName(title);\n if (name === (s.display_name ?? null)) return;\n updateSession(s.id, { display_name: name });\n s.display_name = name;\n}\nfunction liveChanges(s) {\n const git = peekGitSummary(s.cwd);\n if (git) return { ...git, source: \"git\" };\n if (git === void 0) return null;\n const summary = sessionChanges(s)?.summary();\n return summary ? { ...summary, source: \"session\" } : null;\n}\nasync function getEnrichedSessionsAsync() {\n return (await readSessionsAndPanes()).sessions;\n}\nfunction plainPanes(panes, sessions) {\n const claude = new Set(sessions.map((s) => s.tmux_target));\n const out = [];\n for (const [target, pane] of panes) {\n if (claude.has(target)) continue;\n out.push({ target, session: target.split(\":\")[0], command: pane.command, cwd: pane.cwd, title: pane.title });\n }\n return out;\n}\nasync function readSessionsAndPanes() {\n const [{ captures, rawCaptures, sessions }, allPanes] = await Promise.all([\n captureAndSyncSessions(),\n listAllPanes()\n ]);\n const links = readLinks();\n for (const s of sessions) {\n const pane = s.tmux_target ? allPanes.get(s.tmux_target) : void 0;\n if (pane && wantsWidening(pane) && !wideningNow.has(s.tmux_target)) {\n const target = s.tmux_target;\n wideningNow.add(target);\n void widenDetachedWindow(target).finally(() => wideningNow.delete(target));\n }\n }\n const auto = getSettings().autoRemoteControl;\n for (const s of sessions) {\n if (rcSeen.has(s.id)) continue;\n rcSeen.add(s.id);\n if (!rcPrimed || !auto) continue;\n if (s.rc_url || !s.tmux_target || (s.agent ?? \"claude\") !== \"claude\") continue;\n if (!isClaudeMuxSessionName(s.tmux_target.split(\":\")[0])) continue;\n setRemoteControl(s, true);\n }\n rcPrimed = true;\n for (const s of sessions) syncTranscriptTitle(s);\n watchSessionRepos(sessions);\n for (const s of sessions) {\n if (!s.tmux_target) continue;\n const content = captures.get(s.tmux_target);\n if (!content) continue;\n const rcUrl = currentRemoteControlUrl(s, content);\n if (rcUrl !== (s.rc_url ?? null)) {\n updateSession(s.id, { rc_url: rcUrl });\n s.rc_url = rcUrl;\n }\n void answerRemoteControlDialog(s.tmux_target, content, rcUrl);\n }\n const visits = getVisits();\n const enrichedSessions = sessions.map((s) => {\n const paneTitle = s.tmux_target ? allPanes.get(s.tmux_target)?.title ?? null : null;\n const raw = s.tmux_target ? rawCaptures.get(s.tmux_target) : void 0;\n const stripped = s.tmux_target ? captures.get(s.tmux_target) : void 0;\n const box = raw ? readPromptBox(raw) : null;\n const enriched = {\n ...s,\n pane_title: paneTitle,\n pane_alive: s.tmux_target ? allPanes.has(s.tmux_target) : true,\n draft_input: box?.text ?? null,\n draft_kind: box?.kind ?? null,\n // Messages the user typed into the pane while it was busy, waiting\n // their turn in Claude Code's own queue.\n pane_queue: raw ? readQueuedMessages(raw) : [],\n // The dialog's own numbered rows, so the composer can offer them as\n // answers instead of making you drive arrows at a screen you can't see.\n // When the hooks report a dialog, any run at the foot is one. When\n // they don't — a local command's dialog such as `/model` leaves the\n // session idle, and the permission notification can trail the dialog\n // by a tick — only a dialog that names its own keys is believed.\n pane_choice: stripped ? readPromptOptions(stripped, {\n declaredOnly: s.state !== \"waiting\" && s.state !== \"permission\"\n }) : null,\n // Claude Code says so only in its footer, which the transcript never sees.\n pane_update: stripped ? readUpdateNotice(stripped) : null,\n pane_login: stripped ? readLoginScreen(stripped) : null,\n pane_rewind: stripped ? readRewindScreen(stripped) : null,\n upgrade: upgradeStatus(s.id),\n // The spinner says more than the hooks do: what runs, for how long,\n // how many tokens. Busy only, so a frame left over never outlives the turn.\n pane_activity: liveActivity(s.id, stripped && s.state === \"busy\" ? readActivity(stripped) : null),\n // One stat per session per tick; the file is only read when it grew.\n context_pct: peekContextPercent(s),\n issue: issueFor(s.git_root, s.maestro_issue),\n // Whole, so the composer can draw and edit it without polling the queue route.\n queue: s.tmux_target ? getQueue(s.tmux_target).map(({ attempts: _attempts, ...info }) => info) : [],\n delivered: s.tmux_target ? getDeliveries(s.tmux_target) : [],\n last_visited_at: visits[s.id] ?? null,\n changes: liveChanges(s)\n };\n if (s.tmux_target && links[s.tmux_target]) {\n const mainTarget = links[s.tmux_target];\n const mainSession = sessions.find((m) => m.tmux_target === mainTarget);\n if (mainSession) {\n enriched.linked_to = mainSession.id;\n }\n }\n return enriched;\n });\n return { sessions: deduplicateByTmuxTarget(enrichedSessions), panes: plainPanes(allPanes, sessions) };\n}\nfunction resizePane(target, cols, rows) {\n resizeTmuxWindow(target, cols, rows);\n}\nlet cachedSystemStats = {\n cpu: 0,\n ram: 0,\n swap: 0,\n ramTotal: 0,\n swapTotal: 0,\n disk: null\n};\nlet prevCpuIdle = 0;\nlet prevCpuTotal = 0;\nlet systemStatsTimer = null;\nlet systemStatsRefCount = 0;\nfunction refreshSystemStats() {\n void homeDiskPercent().then((disk) => {\n cachedSystemStats.disk = disk;\n });\n try {\n const stat2 = readFileSync(\"/proc/stat\", \"utf-8\");\n const meminfo = readFileSync(\"/proc/meminfo\", \"utf-8\");\n const cpuLine = stat2.split(\"\\n\")[0];\n const cpuParts = cpuLine.split(/\\s+/).slice(1).map(Number);\n const idle = cpuParts[3] + (cpuParts[4] || 0);\n const total = cpuParts.reduce((a, b) => a + b, 0);\n const diffIdle = idle - prevCpuIdle;\n const diffTotal = total - prevCpuTotal;\n const cpuPercent = diffTotal > 0 ? Math.round((1 - diffIdle / diffTotal) * 100) : 0;\n prevCpuIdle = idle;\n prevCpuTotal = total;\n const mem = {};\n for (const line of meminfo.split(\"\\n\")) {\n const match = line.match(/^(\\w+):\\s+(\\d+)/);\n if (match) mem[match[1]] = parseInt(match[2], 10);\n }\n const memTotal = mem[\"MemTotal\"] || 1;\n const memAvailable = mem[\"MemAvailable\"] || 0;\n const swapTotal = mem[\"SwapTotal\"] || 0;\n const swapFree = mem[\"SwapFree\"] || 0;\n cachedSystemStats = {\n cpu: cpuPercent,\n ram: Math.round((memTotal - memAvailable) / memTotal * 100),\n swap: swapTotal > 0 ? Math.round((swapTotal - swapFree) / swapTotal * 100) : 0,\n ramTotal: Math.round(memTotal / 1024),\n swapTotal: Math.round(swapTotal / 1024),\n disk: cachedSystemStats.disk\n };\n } catch {\n }\n}\nfunction startSystemStats() {\n systemStatsRefCount++;\n if (systemStatsRefCount === 1) {\n refreshSystemStats();\n systemStatsTimer = setInterval(refreshSystemStats, 1e4);\n }\n}\nfunction stopSystemStats() {\n systemStatsRefCount--;\n if (systemStatsRefCount <= 0) {\n systemStatsRefCount = 0;\n if (systemStatsTimer) {\n clearInterval(systemStatsTimer);\n systemStatsTimer = null;\n }\n }\n}\nconst FLEET_COALESCE_MS = 200;\nconst PAST_REFRESH_MS = 3e4;\nclass SessionsWsManager {\n clients = /* @__PURE__ */ new Set();\n /** The clients that asked for the fleet too (`?fleet=1`): pages, not peers. */\n fleetClients = /* @__PURE__ */ new Set();\n /** Other machines' fleet states (`isPeerLink()`): the only clients sent the whole preference set. */\n peerClients = /* @__PURE__ */ new Set();\n fleetSource = null;\n stopFleet = null;\n prefsSource = null;\n stopPrefs = null;\n unsubscribe = null;\n interruptCheckTimer = null;\n cleanupTimer = null;\n systemStatsTimer = null;\n lastHash = \"\";\n lastStatsHash = \"\";\n config;\n droppedClients = 0;\n refreshing = false;\n refreshQueued = false;\n /** This machine's transcripts, listed in the background (`src/transcript/past-sessions.ts`). */\n pastIndex = new PastSessionIndex();\n /** Every transcript on disk, live ones included; null until first listed. */\n pastAll = null;\n /** The sessions the last broadcast listed, which are not past. */\n liveIds = null;\n lastPastHash = \"\";\n /** What the last past check saw, so a tick that changed neither skips the filter and the hash. */\n lastPastInput = null;\n pastTimer = null;\n stopFleetPast = null;\n constructor(config) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n /** Get current stats */\n getStats() {\n return {\n clients: this.clients.size,\n droppedClients: this.droppedClients\n };\n }\n /**\n * Add a client. Returns false if max clients reached.\n */\n addClient(client, options = {}) {\n if (this.clients.size >= this.config.maxSessionsClients) {\n log(\n {\n level: \"warn\",\n component: \"sessions\",\n message: \"Max clients reached, rejecting connection\",\n data: { current: this.clients.size, max: this.config.maxSessionsClients }\n },\n this.config\n );\n return false;\n }\n this.clients.add(client);\n if (options.fleet) this.fleetClients.add(client);\n if (options.peer) this.peerClients.add(client);\n log(\n {\n level: \"debug\",\n component: \"sessions\",\n message: \"Client connected\",\n data: { total: this.clients.size }\n },\n this.config\n );\n if (this.clients.size === 1 && !this.unsubscribe) {\n console.log(\"[ws:sessions] First client, subscribing to watcher\");\n this.unsubscribe = sessionWatcher.subscribe(() => this.refreshAndBroadcast());\n this.interruptCheckTimer = setInterval(() => {\n this.refreshAndBroadcast();\n }, 500);\n try {\n cleanupStaleSessions();\n } catch {\n }\n this.cleanupTimer = setInterval(() => {\n try {\n cleanupStaleSessions();\n } catch {\n }\n }, 1e4);\n startSystemStats();\n this.systemStatsTimer = setInterval(() => {\n this.broadcastSystemStats();\n }, 1e4);\n void this.refreshPast();\n this.pastTimer = setInterval(() => void this.refreshPast(), PAST_REFRESH_MS);\n } else {\n console.log(\"[ws:sessions] addClient: clients=\", this.clients.size, \"hasUnsubscribe=\", !!this.unsubscribe);\n }\n this.createSessionsMessageAsync(\"connected\").then((msg) => {\n if (client.isOpen()) {\n this.sendToClient(client, msg);\n this.sendToClient(client, this.createSystemStatsMessage());\n if (options.fleet && this.fleetSource) {\n this.sendToClient(client, this.createFleetMessage(this.fleetSource));\n this.sendToClient(client, this.createFleetPastMessage(this.fleetSource));\n }\n if (this.prefsSource) this.sendToClient(client, this.createPrefsMessage(this.prefsSource, !!options.peer));\n if (this.pastAll && this.liveIds) this.sendToClient(client, this.createPastMessage(this.pastAll, this.liveIds));\n }\n });\n return true;\n }\n /** Start sending the fleet to the pages that ask for it, from `source` from now on. */\n setFleetSource(source) {\n this.stopFleet?.();\n this.stopFleetPast?.();\n this.fleetSource = source;\n this.stopFleet = source.subscribe(() => this.scheduleFleet());\n this.stopFleetPast = source.subscribePast(() => {\n if (this.fleetClients.size > 0) this.broadcastTo(this.fleetClients, this.createFleetPastMessage(source));\n });\n }\n createFleetPastMessage(source) {\n return { type: \"fleet-past\", machines: source.past(), timestamp: Date.now() };\n }\n /**\n * This machine's past sessions: the transcripts on disk that no session in\n * the broadcast holds. Sent to every client, so a peer keeps them in its\n * fleet state and a page lists them, on connect and whenever they change.\n */\n createPastMessage(all, live) {\n return { type: \"past\", sessions: withoutLive(all, live), timestamp: Date.now() };\n }\n pastListing = false;\n async refreshPast() {\n if (this.pastListing) return;\n this.pastListing = true;\n try {\n this.pastAll = await this.pastIndex.list();\n } catch (err) {\n console.error(\"[ws:sessions] listing past sessions failed:\", err);\n return;\n } finally {\n this.pastListing = false;\n }\n this.broadcastPastIfChanged();\n }\n broadcastPastIfChanged() {\n if (!this.pastAll || !this.liveIds || this.clients.size === 0) return;\n const live = [...this.liveIds].sort().join(\"\\n\");\n if (this.lastPastInput?.all === this.pastAll && this.lastPastInput.live === live) return;\n this.lastPastInput = { all: this.pastAll, live };\n const message = this.createPastMessage(this.pastAll, this.liveIds);\n const hash = JSON.stringify(message.sessions);\n if (hash === this.lastPastHash) return;\n this.lastPastHash = hash;\n this.broadcastTo(this.clients, message);\n }\n /** Send the fleet preferences to every client, from `source` from now on, and again on each change. */\n setPrefsSource(source) {\n this.stopPrefs?.();\n this.prefsSource = source;\n this.stopPrefs = source.subscribe(() => this.broadcastPrefs());\n }\n /** The set as a peer, or anyone else, is sent it. */\n createPrefsMessage(source, peer) {\n return { type: \"prefs\", prefs: peer ? source.all() : source.forPages(), timestamp: Date.now() };\n }\n broadcastPrefs() {\n if (!this.prefsSource || this.clients.size === 0) return;\n const others = new Set([...this.clients].filter((c) => !this.peerClients.has(c)));\n this.broadcastTo(this.peerClients, this.createPrefsMessage(this.prefsSource, true));\n this.broadcastTo(others, this.createPrefsMessage(this.prefsSource, false));\n }\n fleetTimer = null;\n /** Peers change together (each polls every 500ms), so their changes go out as one message. */\n scheduleFleet() {\n if (this.fleetTimer) return;\n this.fleetTimer = setTimeout(() => {\n this.fleetTimer = null;\n this.broadcastFleet();\n }, FLEET_COALESCE_MS);\n }\n createFleetMessage(source) {\n return { type: \"fleet\", self: source.selfId, machines: source.snapshot(), timestamp: Date.now() };\n }\n broadcastFleet() {\n if (!this.fleetSource || this.fleetClients.size === 0) return;\n this.broadcastTo(this.fleetClients, this.createFleetMessage(this.fleetSource));\n }\n /** Send `message` to each of `clients`, dropping any that cannot take it; returns those dropped. */\n broadcastTo(clients, message) {\n const data = JSON.stringify(message);\n const drops = [...clients].filter((client) => !this.sendToClient(client, message, data));\n for (const client of drops) this.dropClient(client);\n return drops;\n }\n /**\n * A client whose send failed: out of both sets, counted, and closed, so a\n * page reconnects and a peer's fleet state sees it go rather than keep a\n * socket that answers pings and is sent nothing.\n */\n dropClient(client) {\n this.clients.delete(client);\n this.fleetClients.delete(client);\n this.peerClients.delete(client);\n this.droppedClients++;\n try {\n client.close();\n } catch {\n }\n }\n removeClient(client) {\n this.fleetClients.delete(client);\n this.peerClients.delete(client);\n const had = this.clients.delete(client);\n if (had) {\n log(\n {\n level: \"debug\",\n component: \"sessions\",\n message: \"Client disconnected\",\n data: { total: this.clients.size }\n },\n this.config\n );\n }\n if (this.clients.size === 0 && this.unsubscribe) {\n this.unsubscribe();\n this.unsubscribe = null;\n this.lastHash = \"\";\n if (this.interruptCheckTimer) {\n clearInterval(this.interruptCheckTimer);\n this.interruptCheckTimer = null;\n }\n if (this.cleanupTimer) {\n clearInterval(this.cleanupTimer);\n this.cleanupTimer = null;\n }\n if (this.systemStatsTimer) {\n clearInterval(this.systemStatsTimer);\n this.systemStatsTimer = null;\n }\n stopSystemStats();\n if (this.pastTimer) {\n clearInterval(this.pastTimer);\n this.pastTimer = null;\n }\n this.lastPastHash = \"\";\n this.lastPastInput = null;\n }\n }\n async createSessionsMessageAsync(type) {\n const { sessions, panes } = await readSessionsAndPanes();\n this.liveIds = new Set(sessions.filter((s) => s.pane_alive !== false).map((s) => s.id));\n saveProjects(sessions.map((s) => s.cwd).filter((cwd) => !!cwd));\n const projects = getSavedProjects();\n return {\n type,\n sessions,\n count: sessions.length,\n // Its panes that run no Claude session, for the drawer to place under their projects.\n panes,\n projects,\n // What the fleet matches one project across machines by, and its icon.\n projectReports: projectReports(projects),\n // Its Claude Code marketplaces and plugins, for the fleet to keep in step.\n plugins: pluginReader().current(),\n settings: getSettings(),\n inbox: inboxTickets(\n new Set(\n sessions.filter((s) => s.pane_alive && s.maestro_issue && s.git_root).map((s) => `${s.git_root}#${s.maestro_issue}`)\n )\n ),\n timestamp: Date.now()\n };\n }\n createSystemStatsMessage() {\n return { type: \"systemStats\", ...cachedSystemStats, timestamp: Date.now() };\n }\n /**\n * Public trigger for an immediate fresh broadcast. Used by API mutation\n * endpoints (rename/kill/restart) so the UI updates instantly instead of\n * waiting up to 500ms for the file watcher poll to detect mtime change.\n */\n broadcastNow() {\n this.refreshAndBroadcast();\n }\n refreshAndBroadcast() {\n if (this.refreshing) {\n this.refreshQueued = true;\n return;\n }\n this.refreshing = true;\n this.createSessionsMessageAsync(\"sessions\").then((message) => {\n const panes = message.panes.map(({ title: _title, ...pane }) => pane);\n const hash = JSON.stringify([message.sessions, panes, message.inbox, message.projectReports, message.plugins?.readAt]);\n if (hash === this.lastHash) {\n return;\n }\n this.broadcastPastIfChanged();\n this.lastHash = hash;\n const dropped = this.broadcastTo(this.clients, message).length;\n if (dropped > 0) {\n log(\n {\n level: \"warn\",\n component: \"sessions\",\n message: \"Dropped slow client\",\n data: { dropped, total: this.clients.size }\n },\n this.config\n );\n }\n }).catch((err) => {\n log(\n {\n level: \"error\",\n component: \"sessions\",\n message: \"Refresh failed\",\n data: { error: String(err) }\n },\n this.config\n );\n }).finally(() => {\n this.refreshing = false;\n if (this.refreshQueued) {\n this.refreshQueued = false;\n this.refreshAndBroadcast();\n }\n });\n }\n broadcastSystemStats() {\n const message = this.createSystemStatsMessage();\n const hash = JSON.stringify(message);\n if (hash === this.lastStatsHash) return;\n this.lastStatsHash = hash;\n this.broadcastTo(this.clients, message);\n }\n sendToClient(client, message, data) {\n return sendJson(client, message, this.config, {\n component: \"sessions\",\n maxBuffered: 64 * 1024,\n data\n }) === \"sent\";\n }\n}\nfunction sendJson(client, message, config, opts) {\n try {\n if (!client.isOpen()) return \"closed\";\n if (client.getBufferedAmount) {\n const buffered = client.getBufferedAmount();\n if (buffered > opts.maxBuffered) {\n log(\n {\n level: \"warn\",\n component: opts.component,\n message: \"Client backpressure detected\",\n data: { buffered }\n },\n config\n );\n return \"backpressure\";\n }\n }\n client.send(opts.data ?? JSON.stringify(message));\n return \"sent\";\n } catch (err) {\n log(\n {\n level: \"error\",\n component: opts.component,\n message: \"Failed to send to client\",\n data: { error: String(err) }\n },\n config\n );\n return \"closed\";\n }\n}\nclass TerminalWsManager {\n clients = /* @__PURE__ */ new Map();\n pollTimers = /* @__PURE__ */ new Map();\n states = /* @__PURE__ */ new Map();\n config;\n totalClients = 0;\n droppedClients = 0;\n constructor(config) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n /** Get current stats */\n getStats() {\n return {\n totalClients: this.totalClients,\n targets: this.clients.size,\n droppedClients: this.droppedClients\n };\n }\n /**\n * Add a client for a target. Returns false if max clients reached.\n */\n addClient(client, target) {\n if (this.totalClients >= this.config.maxTerminalClientsTotal) {\n log(\n {\n level: \"warn\",\n component: \"terminal\",\n message: \"Max total clients reached\",\n data: { current: this.totalClients, max: this.config.maxTerminalClientsTotal }\n },\n this.config\n );\n return false;\n }\n const targetClients = this.clients.get(target);\n if (targetClients && targetClients.size >= this.config.maxTerminalClientsPerTarget) {\n log(\n {\n level: \"warn\",\n component: \"terminal\",\n message: \"Max clients per target reached\",\n data: { target, current: targetClients.size, max: this.config.maxTerminalClientsPerTarget }\n },\n this.config\n );\n return false;\n }\n if (!this.clients.has(target)) {\n this.clients.set(target, /* @__PURE__ */ new Set());\n }\n this.clients.get(target).add(client);\n this.totalClients++;\n log(\n {\n level: \"debug\",\n component: \"terminal\",\n message: \"Client connected\",\n data: { target, targetClients: this.clients.get(target).size, total: this.totalClients }\n },\n this.config\n );\n if (this.clients.get(target).size === 1) {\n this.startPolling(target);\n }\n const snap = snapshotPane(target);\n const now = Date.now();\n if (snap) {\n this.states.set(target, {\n historySize: snap.historySize,\n alt: snap.alt,\n cols: snap.cols,\n rows: snap.rows,\n screenKey: snap.screen.join(\"\\n\")\n });\n this.sendToClient(client, {\n type: \"screen\",\n lines: snap.screen,\n historySize: snap.historySize,\n alt: snap.alt,\n cols: snap.cols,\n rows: snap.rows,\n timestamp: now\n });\n if (!snap.alt && snap.historySize > 0) {\n this.sendHistoryTail(client, target, snap.historySize, DEFAULT_HISTORY_DEPTH);\n }\n } else {\n this.sendToClient(client, {\n type: \"screen\",\n lines: [],\n historySize: 0,\n alt: false,\n cols: 0,\n rows: 0,\n timestamp: now\n });\n }\n return true;\n }\n /**\n * Serve a client's request for `count` history lines before absolute index `before`.\n * Replies only to the requesting client (each viewer scrolls independently).\n */\n requestHistory(client, target, before, count) {\n const state = this.states.get(target);\n if (!state || state.alt) return;\n const n = Math.max(1, Math.min(MAX_HISTORY_REQUEST, Math.floor(count)));\n const end = Math.max(0, Math.min(Math.floor(before), state.historySize));\n if (end === 0) return;\n this.sendHistoryTail(client, target, end, n);\n }\n sendHistoryTail(client, target, end, count) {\n const state = this.states.get(target);\n const known = state?.historySize ?? end;\n const start = Math.max(0, end - count);\n const res = fetchHistoryRange(target, start, end, known);\n if (!res) return;\n this.sendToClient(client, {\n type: \"history\",\n start: res.start,\n lines: res.lines,\n historySize: res.historySize,\n timestamp: Date.now()\n });\n }\n removeClient(client, target) {\n if (target) {\n const targetClients = this.clients.get(target);\n if (targetClients && targetClients.delete(client)) {\n this.totalClients--;\n log(\n {\n level: \"debug\",\n component: \"terminal\",\n message: \"Client disconnected\",\n data: { target, targetClients: targetClients.size, total: this.totalClients }\n },\n this.config\n );\n if (targetClients.size === 0) {\n this.stopPolling(target);\n this.clients.delete(target);\n this.states.delete(target);\n }\n }\n return;\n }\n for (const [t, clients] of this.clients) {\n if (clients.delete(client)) {\n this.totalClients--;\n if (clients.size === 0) {\n this.stopPolling(t);\n this.clients.delete(t);\n this.states.delete(t);\n }\n break;\n }\n }\n }\n startPolling(target) {\n if (this.pollTimers.has(target)) return;\n const timer = setInterval(() => this.pollAndBroadcast(target), 200);\n this.pollTimers.set(target, timer);\n }\n stopPolling(target) {\n const timer = this.pollTimers.get(target);\n if (timer) {\n clearInterval(timer);\n this.pollTimers.delete(target);\n }\n }\n pollAndBroadcast(target) {\n const snap = snapshotPane(target);\n if (!snap) return;\n const prev = this.states.get(target);\n const now = Date.now();\n const messages = [];\n const screenKey = snap.screen.join(\"\\n\");\n if (!prev) {\n this.states.set(target, { historySize: snap.historySize, alt: snap.alt, cols: snap.cols, rows: snap.rows, screenKey });\n messages.push({ type: \"reset\", historySize: snap.historySize, alt: snap.alt, cols: snap.cols, rows: snap.rows, timestamp: now });\n messages.push({ type: \"screen\", lines: snap.screen, historySize: snap.historySize, alt: snap.alt, cols: snap.cols, rows: snap.rows, timestamp: now });\n } else {\n const reflowed = snap.alt !== prev.alt || snap.cols !== prev.cols || snap.rows !== prev.rows || snap.historySize < prev.historySize;\n if (reflowed) {\n messages.push({ type: \"reset\", historySize: snap.historySize, alt: snap.alt, cols: snap.cols, rows: snap.rows, timestamp: now });\n } else if (!snap.alt && snap.historySize > prev.historySize) {\n const n = snap.historySize - prev.historySize;\n let lines = null;\n let start = prev.historySize;\n if (n <= snap.tail.length) {\n lines = snap.tail.slice(snap.tail.length - n);\n } else {\n const res = fetchHistoryRange(target, prev.historySize, snap.historySize, snap.historySize);\n if (res) {\n lines = res.lines;\n start = res.start;\n }\n }\n if (lines) {\n messages.push({ type: \"history\", start, lines, historySize: snap.historySize, timestamp: now });\n } else {\n messages.push({ type: \"reset\", historySize: snap.historySize, alt: snap.alt, cols: snap.cols, rows: snap.rows, timestamp: now });\n }\n }\n if (screenKey !== prev.screenKey || reflowed) {\n messages.push({ type: \"screen\", lines: snap.screen, historySize: snap.historySize, alt: snap.alt, cols: snap.cols, rows: snap.rows, timestamp: now });\n }\n this.states.set(target, { historySize: snap.historySize, alt: snap.alt, cols: snap.cols, rows: snap.rows, screenKey });\n }\n if (messages.length === 0) return;\n const clients = this.clients.get(target);\n if (!clients) return;\n for (const message of messages) {\n const data = JSON.stringify(message);\n const drops = [];\n for (const client of [...clients]) {\n if (!this.sendToClient(client, message, data)) drops.push(client);\n }\n for (const client of drops) {\n clients.delete(client);\n this.totalClients--;\n this.droppedClients++;\n log(\n {\n level: \"warn\",\n component: \"terminal\",\n message: \"Dropped slow client\",\n data: { target, total: this.totalClients }\n },\n this.config\n );\n }\n if (clients.size === 0) {\n this.stopPolling(target);\n this.clients.delete(target);\n this.states.delete(target);\n return;\n }\n }\n }\n sendToClient(client, message, data) {\n return sendJson(client, message, this.config, {\n component: \"terminal\",\n maxBuffered: 64 * 1024,\n data\n }) === \"sent\";\n }\n}\nconst TRANSCRIPT_POLL_MS = 500;\nconst SUBAGENT_DISCOVER_TICKS = 4;\nconst RESOLVE_TICKS = 4;\nconst RESOLVE_TICKS_MAX = 60;\nconst SNAPSHOT_ENTRIES = 120;\nconst SESSION_KEEP_MS = 10 * 60 * 1e3;\nconst SWEEP_MS = 60 * 1e3;\nconst ATTACH_SLICE_BYTES = 4 * 1024 * 1024;\nconst MAX_HISTORY_ENTRIES = 500;\nfunction tailOf(builder) {\n const all = builder.entries;\n const firstIndex = Math.max(0, all.length - SNAPSHOT_ENTRIES);\n return {\n entries: firstIndex > 0 ? all.slice(firstIndex) : all,\n firstIndex,\n context: builder.context,\n model: builder.model\n };\n}\nfunction entriesDelta(builder, ids, timestamp) {\n const entries = [];\n const indices = [];\n for (const id of new Set(ids)) {\n const index = builder.indexOf(id);\n if (index === void 0) continue;\n entries.push(builder.entries[index]);\n indices.push(index);\n }\n return { type: \"entries\", entries, indices, timestamp };\n}\nclass TranscriptWsManager {\n clients = /* @__PURE__ */ new Map();\n sessions = /* @__PURE__ */ new Map();\n /** Clients reading one subagent rather than the whole session. */\n follows = /* @__PURE__ */ new Map();\n config;\n unwatch = null;\n constructor(config) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n /**\n * Attach a reader to a session's transcript, or with `agentId` to one of\n * its subagents: the same messages, carrying that agent's entries.\n */\n addClient(client, sessionId, agentId) {\n const current = [...this.clients.get(sessionId) ?? []].filter(\n (c) => this.follows.has(c) === Boolean(agentId)\n ).length;\n if (current >= this.config.maxTerminalClientsPerTarget) {\n log(\n {\n level: \"warn\",\n component: \"transcript\",\n message: \"Max clients per session reached\",\n data: { sessionId, agentId, current }\n },\n this.config\n );\n return false;\n }\n if (!this.clients.has(sessionId)) this.clients.set(sessionId, /* @__PURE__ */ new Set());\n this.clients.get(sessionId).add(client);\n if (agentId) this.follows.set(client, { agentId, found: false });\n let state = this.sessions.get(sessionId);\n if (!state) {\n state = this.startSession(sessionId);\n this.sessions.set(sessionId, state);\n } else if (state.idleSince !== null) {\n this.wake(sessionId, state);\n }\n const send = () => {\n if (!agentId) state.sentContext = JSON.stringify(state.builder.context);\n this.sendToClient(client, this.snapshot(state, client));\n };\n if (state.attaching) void state.attaching.then(send);\n else send();\n return true;\n }\n /** A parked session has a reader again: catch up on what was written meanwhile. */\n wake(sessionId, state) {\n state.idleSince = null;\n state.timer = setInterval(() => this.poll(sessionId), TRANSCRIPT_POLL_MS);\n if (!state.tailer || state.attaching) return;\n const result = state.tailer.read();\n if (result.status === \"reset\") {\n this.consume(state, result);\n this.consume(state, state.tailer.read());\n } else {\n this.consume(state, result);\n }\n this.syncSubagents(state);\n this.forgetSubagentChanges(state);\n }\n removeClient(client, sessionId) {\n this.follows.delete(client);\n const drop = (id, clients) => {\n if (!clients.delete(client)) return false;\n if (clients.size === 0) this.park(id);\n return true;\n };\n if (sessionId) {\n const clients = this.clients.get(sessionId);\n if (clients) drop(sessionId, clients);\n return;\n }\n for (const [id, clients] of this.clients) {\n if (drop(id, clients)) break;\n }\n }\n /** A main-transcript builder that stamps voice-injected prompts (see dictation-marks). */\n mainBuilder(sessionId) {\n return new TranscriptBuilder(false, (text, ts) => isDictated(sessionId, text, ts));\n }\n startSession(sessionId) {\n const state = {\n sessionId,\n tailer: null,\n builder: this.mainBuilder(sessionId),\n available: false,\n resolveIn: RESOLVE_TICKS,\n resolveBackoff: RESOLVE_TICKS,\n subagents: /* @__PURE__ */ new Map(),\n discoverIn: 0,\n expanded: /* @__PURE__ */ new Set(),\n attaching: null,\n idleSince: null,\n sentContext: \"\",\n sentModel: null,\n stale: /* @__PURE__ */ new Set(),\n timer: setInterval(() => this.poll(sessionId), TRANSCRIPT_POLL_MS)\n };\n const path = this.locate(sessionId);\n if (path) this.attach(state, path);\n this.ensureSweeper();\n return state;\n }\n /**\n * Hooks wrote these sessions' JSON. Claude Code creates the transcript the\n * moment a prompt is submitted, and the UserPromptSubmit hook lands in the\n * same second, so a session still without a transcript whose recorded\n * path now exists attaches on its next poll rather than when the backoff,\n * by then up to 30s long, runs out. Checking that one path costs a stat;\n * a busy session writes its JSON on every tool call, and a full locate\n * on each of those would scan every project directory.\n */\n sessionsChanged(changed) {\n for (const id of changed) {\n const state = this.sessions.get(id);\n if (!state || state.tailer) continue;\n const recorded = getSession(id)?.transcript_path;\n if (recorded && existsSync(recorded)) state.resolveIn = 1;\n }\n }\n /**\n * Point the state at a transcript file and read what is already in it, so\n * the next snapshot carries history rather than starting from empty. A\n * long transcript is read in slices with a yield between each, and its\n * subagents one per yield, so a 46 MB session does not hold the server\n * for the second it takes; `state.attaching` is what to wait on.\n */\n attach(state, path) {\n const tailer = new JsonlTailer(path);\n state.tailer = tailer;\n const yieldNow = () => new Promise((resolve) => setImmediate(resolve));\n state.attaching = (async () => {\n for (; ; ) {\n const result = tailer.read(ATTACH_SLICE_BYTES);\n this.consume(state, result);\n if (result.status !== \"lines\" || !result.more) break;\n await yieldNow();\n }\n this.discoverSubagents(state);\n for (const [agentId, sub] of state.subagents) {\n this.tailSubagent(state, agentId, sub);\n await yieldNow();\n }\n this.forgetSubagentChanges(state);\n })().finally(() => {\n if (state.tailer === tailer) state.attaching = null;\n });\n return state.attaching;\n }\n /**\n * Where this session's JSONL lives, or null if it is not on disk yet. A\n * past session has no session JSON, and is found by its id alone.\n */\n locate(sessionId) {\n const session = getSession(sessionId);\n return session ? resolveTranscriptPath(session, sessionId) : findTranscriptById(sessionId);\n }\n /**\n * Pick up newly spawned subagents and tail the known ones. Returns the\n * payloads that changed since the last call.\n */\n syncSubagents(state) {\n if (!state.tailer) return [];\n if (state.discoverIn <= 0) {\n state.discoverIn = SUBAGENT_DISCOVER_TICKS;\n this.discoverSubagents(state);\n } else {\n state.discoverIn--;\n }\n const changed = [];\n for (const [agentId, sub] of state.subagents) {\n const payload = this.tailSubagent(state, agentId, sub);\n if (payload) changed.push(payload);\n }\n return changed;\n }\n /** Register subagent files that appeared beside the transcript. */\n discoverSubagents(state) {\n if (!state.tailer) return;\n for (const file of listSubagents(state.tailer.path, new Set(state.subagents.keys()))) {\n state.subagents.set(file.agentId, {\n tailer: new JsonlTailer(file.path),\n builder: new TranscriptBuilder(true),\n meta: file.meta,\n payload: null,\n lastSent: \"\",\n changed: /* @__PURE__ */ new Set(),\n reset: false\n });\n }\n }\n /**\n * Read one subagent's new lines and rebuild its payload — lean unless a\n * reader has opened its card. Returns the payload when it changed.\n */\n tailSubagent(state, agentId, sub) {\n const result = sub.tailer.read();\n if (result.status === \"reset\") {\n sub.builder = new TranscriptBuilder(true);\n sub.changed.clear();\n sub.reset = true;\n } else if (result.status === \"lines\") {\n for (const line of result.lines) {\n for (const id of sub.builder.feed(line)) sub.changed.add(id);\n }\n }\n const payload = subagentPayload(\n agentId,\n sub,\n state.builder.finishedAgents.has(agentId),\n state.expanded.has(agentId)\n );\n sub.payload = payload;\n const encoded = JSON.stringify(payload);\n if (encoded === sub.lastSent) return null;\n sub.lastSent = encoded;\n return payload;\n }\n /**\n * A reader opened an agent's card: send everything it ran and reported,\n * and keep sending it in full while the session lives.\n */\n requestSubagent(client, sessionId, agentId) {\n const state = this.sessions.get(sessionId);\n const sub = state?.subagents.get(agentId);\n if (!state || !sub) return;\n state.expanded.add(agentId);\n const payload = subagentPayload(agentId, sub, state.builder.finishedAgents.has(agentId), true);\n sub.payload = payload;\n sub.lastSent = JSON.stringify(payload);\n this.sendToClient(client, { type: \"subagents\", subagents: [payload], timestamp: Date.now() });\n }\n /**\n * Send one client the slice of `count` entries that ends just before\n * `before` — the index of the oldest entry it already holds.\n */\n requestHistory(client, sessionId, before, count) {\n const state = this.sessions.get(sessionId);\n if (!state) return;\n const follow = this.follows.get(client);\n const builder = follow ? state.subagents.get(follow.agentId)?.builder : state.builder;\n if (!builder) return;\n const end = Math.max(0, Math.min(Math.floor(before), builder.entries.length));\n if (end === 0) return;\n const n = Math.max(1, Math.min(MAX_HISTORY_ENTRIES, Math.floor(count)));\n const start = Math.max(0, end - n);\n this.sendToClient(client, {\n type: \"history\",\n entries: builder.entries.slice(start, end),\n firstIndex: start,\n timestamp: Date.now()\n });\n }\n /**\n * The last reader left. The parsed transcript stays, its poll stops, and\n * the sweeper drops it once nobody has come back for SESSION_KEEP_MS.\n */\n park(sessionId) {\n const state = this.sessions.get(sessionId);\n this.clients.delete(sessionId);\n if (!state) return;\n clearInterval(state.timer);\n state.idleSince = Date.now();\n state.stale.clear();\n }\n stopSession(sessionId) {\n const state = this.sessions.get(sessionId);\n if (state) clearInterval(state.timer);\n this.sessions.delete(sessionId);\n this.clients.delete(sessionId);\n }\n sweeper = null;\n ensureSweeper() {\n if (this.sweeper) return;\n this.unwatch = sessionWatcher.subscribe((changed) => this.sessionsChanged(changed));\n this.sweeper = setInterval(() => {\n const now = Date.now();\n for (const [id, state] of this.sessions) {\n if (state.idleSince !== null && now - state.idleSince > SESSION_KEEP_MS) {\n this.stopSession(id);\n }\n }\n if (this.sessions.size === 0 && this.sweeper) {\n clearInterval(this.sweeper);\n this.sweeper = null;\n this.unwatch?.();\n this.unwatch = null;\n }\n }, SWEEP_MS);\n }\n /** Apply a tail result to the builder; returns changed entry ids. */\n consume(state, result) {\n switch (result.status) {\n case \"lines\": {\n state.available = true;\n const changed = [];\n for (const line of result.lines) changed.push(...state.builder.feed(line));\n return changed;\n }\n case \"reset\":\n state.builder = this.mainBuilder(state.sessionId);\n return [];\n default:\n return [];\n }\n }\n poll(sessionId) {\n const state = this.sessions.get(sessionId);\n const clients = this.clients.get(sessionId);\n if (!state || !clients || clients.size === 0) return;\n if (state.attaching) return;\n if (!state.tailer) {\n if (--state.resolveIn > 0) return;\n const path = this.locate(sessionId);\n if (!path) {\n state.resolveBackoff = Math.min(state.resolveBackoff * 2, RESOLVE_TICKS_MAX);\n state.resolveIn = state.resolveBackoff;\n return;\n }\n void this.attach(state, path).then(() => {\n if (this.sessions.get(sessionId) === state) this.resend(sessionId, state);\n });\n return;\n }\n this.recoverStale(sessionId, state);\n const result = state.tailer.read();\n if (result.status === \"reset\") {\n this.consume(state, result);\n this.consume(state, state.tailer.read());\n this.resend(sessionId, state);\n return;\n }\n const changedIds = this.consume(state, result);\n if (changedIds.length > 0) {\n this.broadcast(sessionId, entriesDelta(state.builder, changedIds, Date.now()));\n }\n const subagents = this.syncSubagents(state);\n if (subagents.length > 0) {\n this.broadcast(sessionId, { type: \"subagents\", subagents, timestamp: Date.now() });\n }\n this.feedFollowers(sessionId, state, subagents);\n const context = state.builder.context;\n const encoded = JSON.stringify(context);\n if (context && encoded !== state.sentContext) {\n state.sentContext = encoded;\n this.broadcast(sessionId, { type: \"context\", context, timestamp: Date.now() });\n }\n const model = state.builder.model;\n if (model && model !== state.sentModel) {\n state.sentModel = model;\n this.broadcast(sessionId, { type: \"model\", model, timestamp: Date.now() });\n }\n }\n /** Re-broadcast the whole transcript, e.g. after a file reset or a re-attach. */\n resend(sessionId, state) {\n state.sentContext = JSON.stringify(state.builder.context);\n this.broadcast(sessionId, this.snapshot(state));\n for (const client of this.followersOf(sessionId)) {\n this.sendToClient(client, this.snapshot(state, client));\n }\n }\n /** The clients of a session that follow one of its agents. */\n followersOf(sessionId) {\n if (this.follows.size === 0) return [];\n return [...this.clients.get(sessionId) ?? []].filter((c) => this.follows.has(c));\n }\n /**\n * Send each agent's followers what changed in it this poll: its new and\n * updated entries, its payload (which carries running and the tool\n * count), and its context. A follower whose agent had not been written\n * when it attached is sent a snapshot the poll it turns up.\n */\n feedFollowers(sessionId, state, payloads) {\n const clients = this.clients.get(sessionId);\n for (const client of this.followersOf(sessionId)) {\n const follow = this.follows.get(client);\n const sub = state.subagents.get(follow.agentId);\n if (!sub || state.stale.has(client)) continue;\n const messages = [];\n const now = Date.now();\n if (!follow.found || sub.reset) {\n messages.push(this.snapshot(state, client));\n } else {\n if (sub.changed.size > 0) {\n messages.push(entriesDelta(sub.builder, sub.changed, now));\n const context = sub.builder.context;\n if (context) messages.push({ type: \"context\", context, timestamp: now });\n }\n if (payloads.some((p) => p.agentId === follow.agentId)) {\n const finished = state.builder.finishedAgents.has(follow.agentId);\n const payload = subagentPayload(follow.agentId, sub, finished, true);\n messages.push({ type: \"subagents\", subagents: [payload], timestamp: now });\n }\n }\n for (const message of messages) {\n const result = this.sendToClient(client, message);\n if (result === \"sent\") continue;\n if (result === \"backpressure\") {\n state.stale.add(client);\n } else {\n clients?.delete(client);\n this.follows.delete(client);\n }\n break;\n }\n }\n this.forgetSubagentChanges(state);\n if (clients?.size === 0) this.park(sessionId);\n }\n /** Every follower has been sent what the agents' builders hold so far. */\n forgetSubagentChanges(state) {\n for (const sub of state.subagents.values()) {\n sub.changed.clear();\n sub.reset = false;\n }\n }\n /**\n * Catch up the clients that missed a delta while their socket was backed\n * up. A snapshot costs the whole transcript tail, so it goes only to the\n * client that missed something, and only once its buffer has drained.\n */\n recoverStale(sessionId, state) {\n if (state.stale.size === 0) return;\n const clients = this.clients.get(sessionId);\n const message = this.snapshot(state);\n const data = JSON.stringify(message);\n for (const client of [...state.stale]) {\n if (!clients?.has(client)) {\n state.stale.delete(client);\n continue;\n }\n const result = this.follows.has(client) ? this.sendToClient(client, this.snapshot(state, client)) : this.sendToClient(client, message, data);\n if (result === \"backpressure\") continue;\n state.stale.delete(client);\n if (result === \"closed\") clients.delete(client);\n }\n }\n /**\n * Everything a freshly attached client needs. Context rides along here so\n * the client starts with a gauge instead of waiting for the next response;\n * callers mark it sent with `sentContext`.\n */\n snapshot(state, client) {\n const follow = client && this.follows.get(client);\n if (follow) return this.agentSnapshot(state, follow);\n return {\n type: \"snapshot\",\n ...tailOf(state.builder),\n subagents: [...state.subagents].map(\n ([id, sub]) => sub.payload ?? subagentPayload(id, sub, state.builder.finishedAgents.has(id), state.expanded.has(id))\n ),\n available: state.available,\n timestamp: Date.now()\n };\n }\n /**\n * One agent's transcript, shaped like a session's: its entries' tail, its\n * own payload in full as the only subagent, and its context. An agent\n * whose file is not on disk (yet, or at all) is `available: false`.\n */\n agentSnapshot(state, follow) {\n const sub = state.subagents.get(follow.agentId);\n follow.found = sub !== void 0;\n if (!sub) {\n return {\n type: \"snapshot\",\n entries: [],\n firstIndex: 0,\n subagents: [],\n context: null,\n model: null,\n available: false,\n timestamp: Date.now()\n };\n }\n const payload = subagentPayload(\n follow.agentId,\n sub,\n state.builder.finishedAgents.has(follow.agentId),\n true\n );\n return {\n type: \"snapshot\",\n ...tailOf(sub.builder),\n subagents: [payload],\n available: true,\n timestamp: Date.now()\n };\n }\n /** Send to the session's readers of the whole transcript; agent followers are fed apart. */\n broadcast(sessionId, message) {\n const clients = this.clients.get(sessionId);\n if (!clients) return;\n const state = this.sessions.get(sessionId);\n const data = JSON.stringify(message);\n for (const client of [...clients]) {\n if (this.follows.has(client)) continue;\n const result = this.sendToClient(client, message, data);\n if (result === \"backpressure\") state?.stale.add(client);\n else if (result === \"closed\") clients.delete(client);\n }\n if (clients.size === 0) this.park(sessionId);\n }\n sendToClient(client, message, data) {\n return sendJson(client, message, this.config, {\n component: \"transcript\",\n // A snapshot of a long session is megabytes; the ceiling is here to\n // catch a socket that has stopped draining, not to size a message.\n maxBuffered: 8 * 1024 * 1024,\n data\n });\n }\n}\nfunction handleWsMessage(msgStr, handlers) {\n if (msgStr === \"ping\") return \"pong\";\n if (!handlers) return null;\n if (handlers.input) {\n handlers.input(msgStr);\n return null;\n }\n try {\n const msg = JSON.parse(msgStr);\n switch (msg.type) {\n case \"subagent_request\":\n if (handlers.subagentRequest && typeof msg.agentId === \"string\") {\n handlers.subagentRequest(msg.agentId);\n }\n break;\n case \"resize\":\n if (handlers.resize && typeof msg.cols === \"number\" && typeof msg.rows === \"number\") {\n handlers.resize(msg.cols, msg.rows);\n }\n break;\n case \"history_request\":\n if (handlers.historyRequest && typeof msg.before === \"number\" && typeof msg.count === \"number\") {\n handlers.historyRequest(msg.before, msg.count);\n }\n break;\n }\n } catch {\n }\n return null;\n}\nfunction parseWsPath(pathname, search = \"\") {\n if (pathname === \"/api/sessions/stream\") {\n return new URLSearchParams(search).has(\"fleet\") ? { type: \"sessions\", fleet: true } : { type: \"sessions\" };\n }\n const browserMatch = pathname.match(/^\\/api\\/browser\\/([^/]+)\\/stream$/);\n if (browserMatch) {\n return { type: \"browser\", target: decodeURIComponent(browserMatch[1]) };\n }\n const agentMatch = pathname.match(/^\\/api\\/sessions\\/([^/]+)\\/agents\\/([^/]+)\\/transcript\\/stream$/);\n if (agentMatch) {\n return {\n type: \"transcript\",\n target: decodeURIComponent(agentMatch[1]),\n agent: decodeURIComponent(agentMatch[2])\n };\n }\n const transcriptMatch = pathname.match(/^\\/api\\/sessions\\/([^/]+)\\/transcript\\/stream$/);\n if (transcriptMatch) {\n return { type: \"transcript\", target: decodeURIComponent(transcriptMatch[1]) };\n }\n const termMatch = pathname.match(/^\\/api\\/sessions\\/([^/]+)\\/stream$/);\n if (termMatch) {\n return { type: \"terminal\", target: decodeURIComponent(termMatch[1]) };\n }\n return null;\n}\nexport {\n SessionsWsManager as S,\n TerminalWsManager as T,\n readPastSession as a,\n getSavedProjects as b,\n pluginReader as c,\n removeProject as d,\n sizeArgsForNewSession as e,\n TranscriptWsManager as f,\n getEnrichedSessionsAsync as g,\n handleWsMessage as h,\n recordVisit as i,\n getSettings as j,\n markUnread as m,\n parseWsPath as p,\n resizePane as r,\n saveProject as s,\n updateSettings as u\n};\n//# sourceMappingURL=ws-handlers.js.map\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { t as BrowserWsManager } from "./browser-view-DTJiPKN_.js";
2
- import { n as TerminalWsManager, r as TranscriptWsManager, t as SessionsWsManager } from "./ws-handlers-zemeJ8Si.js";
2
+ import { n as TerminalWsManager, r as TranscriptWsManager, t as SessionsWsManager } from "./ws-handlers-k_sOue-0.js";
3
3
  // .svelte-kit/adapter-bun/chunks/ws-managers.js
4
4
  const g = globalThis;
5
5
  const sessionsWsManager = g.__claudeMuxSessionsWsManager ?? (g.__claudeMuxSessionsWsManager = new SessionsWsManager({ debug: true }));
@@ -11,4 +11,4 @@ function broadcastSessions() {
11
11
  }
12
12
  export { transcriptWsManager as a, terminalWsManager as i, browserWsManager as n, sessionsWsManager as r, broadcastSessions as t };
13
13
 
14
- //# sourceMappingURL=ws-managers-C5VXKb_r.js.map
14
+ //# sourceMappingURL=ws-managers-D2qC6Gla.js.map