@band-app/server 0.31.1 → 0.33.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/dist/client/assets/{TerminalPanel-DdoEObnF.js → TerminalPanel-CyltRZLD.js} +1 -1
  2. package/dist/client/assets/_basePickBy-Dl99bUuK.js +1 -0
  3. package/dist/client/assets/{_baseUniq-BZZjCl_a.js → _baseUniq-xYPKjKRI.js} +1 -1
  4. package/dist/client/assets/addon-unicode11-LsnDChsR.js +1 -0
  5. package/dist/client/assets/{arc-CHfgBvn_.js → arc-L0FqLNvl.js} +1 -1
  6. package/dist/client/assets/{architectureDiagram-VXUJARFQ-DQA19xNg.js → architectureDiagram-VXUJARFQ-sxFQR6t8.js} +1 -1
  7. package/dist/client/assets/{blockDiagram-VD42YOAC-F8PTxmQ_.js → blockDiagram-VD42YOAC-CKyryScy.js} +4 -4
  8. package/dist/client/assets/{c4Diagram-YG6GDRKO-BJUm36SI.js → c4Diagram-YG6GDRKO-CKkLibM6.js} +1 -1
  9. package/dist/client/assets/channel-CnUqAM2K.js +1 -0
  10. package/dist/client/assets/{chunk-4BX2VUAB-C1wjI1w7.js → chunk-4BX2VUAB-B2Q5eiyh.js} +1 -1
  11. package/dist/client/assets/{chunk-55IACEB6-CGfcCH6v.js → chunk-55IACEB6-Bx7ppH1E.js} +1 -1
  12. package/dist/client/assets/{chunk-B4BG7PRW-DmVN_q5R.js → chunk-B4BG7PRW-z63abbDt.js} +3 -3
  13. package/dist/client/assets/{chunk-DI55MBZ5-Cp0-lUyt.js → chunk-DI55MBZ5-CVuxJX-G.js} +3 -3
  14. package/dist/client/assets/{chunk-FMBD7UC4-BE3Cu6Ut.js → chunk-FMBD7UC4-C4mR-Kqh.js} +1 -1
  15. package/dist/client/assets/{chunk-QN33PNHL-CPVRy0ja.js → chunk-QN33PNHL-DC9EuvVO.js} +1 -1
  16. package/dist/client/assets/{chunk-QZHKN3VN-C7Y7bhq5.js → chunk-QZHKN3VN-BVfYPmR6.js} +1 -1
  17. package/dist/client/assets/{chunk-TZMSLE5B-Bi_vlgox.js → chunk-TZMSLE5B-BERfyjOQ.js} +1 -1
  18. package/dist/client/assets/classDiagram-2ON5EDUG-Bl2ARqSW.js +1 -0
  19. package/dist/client/assets/classDiagram-v2-WZHVMYZB-Bl2ARqSW.js +1 -0
  20. package/dist/client/assets/clone-DoC0Yowh.js +1 -0
  21. package/dist/client/assets/{cose-bilkent-S5V4N54A-CoCMLv_6.js → cose-bilkent-S5V4N54A-CKYh86Nn.js} +1 -1
  22. package/dist/client/assets/{dagre-6UL2VRFP-EnAkiIUe.js → dagre-6UL2VRFP-CHXYsbsT.js} +2 -2
  23. package/dist/client/assets/{diagram-PSM6KHXK-C2Y89USX.js → diagram-PSM6KHXK-BgTabbUt.js} +1 -1
  24. package/dist/client/assets/{diagram-QEK2KX5R-B-lmAMSj.js → diagram-QEK2KX5R-DGko5nSx.js} +2 -2
  25. package/dist/client/assets/diagram-S2PKOQOG-CE06Gb7p.js +24 -0
  26. package/dist/client/assets/{erDiagram-Q2GNP2WA-PNRr4PfI.js → erDiagram-Q2GNP2WA-DRAdXF3c.js} +3 -3
  27. package/dist/client/assets/{flowDiagram-NV44I4VS-DMJLrOve.js → flowDiagram-NV44I4VS-DMdYos4M.js} +3 -3
  28. package/dist/client/assets/{ganttDiagram-JELNMOA3-B8xTGdhz.js → ganttDiagram-JELNMOA3-B1hq9zyH.js} +5 -5
  29. package/dist/client/assets/gitGraphDiagram-V2S2FVAM-BX_eqyqV.js +65 -0
  30. package/dist/client/assets/{graph-DtlkBWdT.js → graph-B1pXNJmu.js} +1 -1
  31. package/dist/client/assets/highlighted-body-B3W2YXNL-xpTIV5H4.js +1 -0
  32. package/dist/client/assets/index-61SgNErm.js +3 -0
  33. package/dist/client/assets/index-67ml7mn1.js +1 -0
  34. package/dist/client/assets/index-BAlyKPeT.js +1 -0
  35. package/dist/client/assets/index-BD37kyMP.js +1 -0
  36. package/dist/client/assets/index-BHygUCeT.js +1 -0
  37. package/dist/client/assets/{index-DwIIxwyA.js → index-BYm6dlG5.js} +2 -2
  38. package/dist/client/assets/index-CWczZ7eS.js +1 -0
  39. package/dist/client/assets/{index-DzmcYgsK.js → index-CoSFZPv4.js} +1 -1
  40. package/dist/client/assets/index-DNX82GPp.js +1 -0
  41. package/dist/client/assets/index-DUaIvPpT.js +7 -0
  42. package/dist/client/assets/index-Dm9xRcT9.js +1 -0
  43. package/dist/client/assets/index-Do4DO4E-.js +1 -0
  44. package/dist/client/assets/index-Mpl66MhJ.js +1 -0
  45. package/dist/client/assets/{infoDiagram-HS3SLOUP-DekD9pOv.js → infoDiagram-HS3SLOUP-DHAIDbZu.js} +1 -1
  46. package/dist/client/assets/{journeyDiagram-XKPGCS4Q-Fzs0FbeM.js → journeyDiagram-XKPGCS4Q-BJHZIWhu.js} +1 -1
  47. package/dist/client/assets/{kanban-definition-3W4ZIXB7-6B7ehAZt.js → kanban-definition-3W4ZIXB7-_qzn6_ii.js} +6 -6
  48. package/dist/client/assets/{layout-CcUD7gHw.js → layout-CksxJldr.js} +1 -1
  49. package/dist/client/assets/main-D4u0xEOA.css +1 -0
  50. package/dist/client/assets/main-FnYu011V.js +1002 -0
  51. package/dist/client/assets/{mindmap-definition-VGOIOE7T-CfY1kt2W.js → mindmap-definition-VGOIOE7T-Deop3o-V.js} +4 -4
  52. package/dist/client/assets/{pieDiagram-ADFJNKIX-C-ZZw4jN.js → pieDiagram-ADFJNKIX-d4k56ZYA.js} +2 -2
  53. package/dist/client/assets/{quadrantDiagram-AYHSOK5B-Cn4pxyBH.js → quadrantDiagram-AYHSOK5B-CBA2J09q.js} +1 -1
  54. package/dist/client/assets/{requirementDiagram-UZGBJVZJ-B0UYN1Sq.js → requirementDiagram-UZGBJVZJ-C6Nnujg6.js} +1 -1
  55. package/dist/client/assets/{sankeyDiagram-TZEHDZUN-DegmNHvK.js → sankeyDiagram-TZEHDZUN-CPfLLuk9.js} +6 -6
  56. package/dist/client/assets/{sequenceDiagram-WL72ISMW-B8BlHF2c.js → sequenceDiagram-WL72ISMW-C_OY-5TF.js} +6 -6
  57. package/dist/client/assets/{stateDiagram-FKZM4ZOC-3FR63a_N.js → stateDiagram-FKZM4ZOC-CeuP4CjM.js} +1 -1
  58. package/dist/client/assets/stateDiagram-v2-4FDKWEC3-B9BH2TF6.js +1 -0
  59. package/dist/client/assets/{timeline-definition-IT6M3QCI-F2yYpGjm.js → timeline-definition-IT6M3QCI-CL_Rmapn.js} +4 -4
  60. package/dist/client/assets/{treemap-GDKQZRPO-Br0ExAYs.js → treemap-GDKQZRPO-2uvsx2LQ.js} +1 -1
  61. package/dist/client/assets/workspace._workspaceId-D3mRY9_6.js +1 -0
  62. package/dist/client/assets/{workspace._workspaceId-DxBPbkq5.js → workspace._workspaceId-DF3JNMRG.js} +1 -1
  63. package/dist/client/assets/{xychartDiagram-PRI3JC2R-CnbekSuG.js → xychartDiagram-PRI3JC2R-5Pzm62mv.js} +1 -1
  64. package/dist/migrations/20260926162113_browser_profiles/migration.sql +12 -0
  65. package/dist/migrations/20260926162113_browser_profiles/snapshot.json +1520 -0
  66. package/dist/migrations/20260927123820_agent_sessions/migration.sql +16 -0
  67. package/dist/migrations/20260927123820_agent_sessions/snapshot.json +1675 -0
  68. package/dist/openapi.json +2748 -1140
  69. package/dist/server/assets/{TerminalPanel-CThgG3BY.js → TerminalPanel-DMTU2FMX.js} +1 -1
  70. package/dist/server/assets/{_basePickBy-DMEcDwoD.js → _basePickBy-CMTHAoTW.js} +2 -2
  71. package/dist/server/assets/{_baseUniq-C6YEem8Y.js → _baseUniq-DkG_FLLk.js} +1 -1
  72. package/dist/server/assets/_tanstack-start-manifest_v-cBOqdEgL.js +4 -0
  73. package/dist/server/assets/addon-unicode11-BhCmKRb7.js +181 -0
  74. package/dist/server/assets/{arc-CcEw1rIf.js → arc-CSj375cS.js} +1 -1
  75. package/dist/server/assets/{architecture-7HQA4BMR-BXvzNToj.js → architecture-7HQA4BMR-MwhJw22a.js} +6 -6
  76. package/dist/server/assets/{architectureDiagram-VXUJARFQ-BliQCKdG.js → architectureDiagram-VXUJARFQ-DyVVxp88.js} +6 -6
  77. package/dist/server/assets/{blockDiagram-VD42YOAC-CjmYP_Tq.js → blockDiagram-VD42YOAC-aGbi3Kv_.js} +6 -6
  78. package/dist/server/assets/{c4Diagram-YG6GDRKO-BfRolLuL.js → c4Diagram-YG6GDRKO-DhyUvqPs.js} +2 -2
  79. package/dist/server/assets/{channel-CmYmU2fF.js → channel-CJthnbp1.js} +1 -1
  80. package/dist/server/assets/{chunk-4BX2VUAB-DnWdxOy5.js → chunk-4BX2VUAB-Ch7bkquC.js} +1 -1
  81. package/dist/server/assets/{chunk-55IACEB6-BTmbTQIk.js → chunk-55IACEB6-CLKopZj8.js} +1 -1
  82. package/dist/server/assets/{chunk-B4BG7PRW-Dd8U8eRH.js → chunk-B4BG7PRW-BVv_KeWC.js} +4 -4
  83. package/dist/server/assets/{chunk-DI55MBZ5-DOSx8ES_.js → chunk-DI55MBZ5-C0_HSk1s.js} +3 -3
  84. package/dist/server/assets/{chunk-FMBD7UC4-DoS4CUAI.js → chunk-FMBD7UC4-3fy4TSVt.js} +1 -1
  85. package/dist/server/assets/{chunk-QN33PNHL-81e5hpqA.js → chunk-QN33PNHL-QdSQZPQz.js} +1 -1
  86. package/dist/server/assets/{chunk-QZHKN3VN-Cruwx7ml.js → chunk-QZHKN3VN-Dak-YXr5.js} +1 -1
  87. package/dist/server/assets/{chunk-TZMSLE5B-CVdCnVV1.js → chunk-TZMSLE5B-ThSW8afd.js} +1 -1
  88. package/dist/server/assets/{classDiagram-v2-WZHVMYZB-CI4dbXAN.js → classDiagram-2ON5EDUG-Cmkciu-2.js} +5 -5
  89. package/dist/server/assets/{classDiagram-2ON5EDUG-CI4dbXAN.js → classDiagram-v2-WZHVMYZB-Cmkciu-2.js} +5 -5
  90. package/dist/server/assets/{clone-DCf3XlPY.js → clone-ciZ96ZK2.js} +1 -1
  91. package/dist/server/assets/{cose-bilkent-S5V4N54A-MuUXxVtC.js → cose-bilkent-S5V4N54A-CP20--8W.js} +1 -1
  92. package/dist/server/assets/{dagre-6UL2VRFP-C7ckn20c.js → dagre-6UL2VRFP-D9LrmNJH.js} +6 -6
  93. package/dist/server/assets/{diagram-PSM6KHXK-CMxqFNNc.js → diagram-PSM6KHXK-l3xztHYH.js} +7 -7
  94. package/dist/server/assets/{diagram-QEK2KX5R-DGn7Wc3l.js → diagram-QEK2KX5R-i9twZ5aj.js} +6 -6
  95. package/dist/server/assets/{diagram-S2PKOQOG-DCkkbBLl.js → diagram-S2PKOQOG-DIHmhvbo.js} +6 -6
  96. package/dist/server/assets/{erDiagram-Q2GNP2WA-CKPFaAp2.js → erDiagram-Q2GNP2WA-fMWrL8ta.js} +4 -4
  97. package/dist/server/assets/{flowDiagram-NV44I4VS-DFf8L08F.js → flowDiagram-NV44I4VS-BqKFb2gL.js} +5 -5
  98. package/dist/server/assets/{ganttDiagram-JELNMOA3-1-t_r6jX.js → ganttDiagram-JELNMOA3-XwScweUm.js} +1 -1
  99. package/dist/server/assets/{gitGraph-G5XIXVHT-CXVQFRFs.js → gitGraph-G5XIXVHT-DDO_mRkl.js} +6 -6
  100. package/dist/server/assets/{gitGraphDiagram-V2S2FVAM-DVqN7ZP0.js → gitGraphDiagram-V2S2FVAM-B2e2LaZt.js} +7 -7
  101. package/dist/server/assets/{graph-Dot7YH89.js → graph-DqF0fiyC.js} +2 -2
  102. package/dist/server/assets/{highlighted-body-B3W2YXNL-8cjZuRJ2.js → highlighted-body-B3W2YXNL-B9lH9lqG.js} +1 -1
  103. package/dist/server/assets/{index-C1hQNNzU.js → index-BFzH6uNZ.js} +1 -2
  104. package/dist/server/assets/{index-Bi1NreVG.js → index-BRPRiIzs.js} +1 -5
  105. package/dist/server/assets/{index-D6Vm7E_i.js → index-BZSpvQ87.js} +1 -2
  106. package/dist/server/assets/{index-BcZgkaNS.js → index-BuxMoI9R.js} +1 -2
  107. package/dist/server/assets/{index-GgrvHhHi.js → index-C0T5sHCj.js} +1 -3
  108. package/dist/server/assets/{index-nzUHfYBx.js → index-C35Eg9Oe.js} +1 -2
  109. package/dist/server/assets/{index-CxlXrP3m.js → index-C4LlK8zq.js} +1 -1
  110. package/dist/server/assets/{index-B2x1DfYc.js → index-Cz3ed2GU.js} +1 -2
  111. package/dist/server/assets/{index-BDgBWXBD.js → index-Oepbj3Cu.js} +1 -2
  112. package/dist/server/assets/{index-Ba8AA28e.js → index-QY-ciJ02.js} +1 -2
  113. package/dist/server/assets/{index-D3AFKy3U.js → index-dOV5Jyvk.js} +1 -3
  114. package/dist/server/assets/{index-p6O_x_qN.js → index-iLqcyvvo.js} +1 -2
  115. package/dist/server/assets/{index-AmUVRRsa.js → index-ihiIN7Vo.js} +1 -2
  116. package/dist/server/assets/{info-VBDWY6EO-BXRDzzOP.js → info-VBDWY6EO-BSfwYSKN.js} +6 -6
  117. package/dist/server/assets/{infoDiagram-HS3SLOUP-D2jQYgOa.js → infoDiagram-HS3SLOUP-BcPNSucE.js} +5 -5
  118. package/dist/server/assets/{journeyDiagram-XKPGCS4Q-bf_S8co7.js → journeyDiagram-XKPGCS4Q-B_JljIi2.js} +4 -4
  119. package/dist/server/assets/{kanban-definition-3W4ZIXB7-eje5lYLG.js → kanban-definition-3W4ZIXB7-B5aPUZvg.js} +2 -2
  120. package/dist/server/assets/{layout-D3AhBFqI.js → layout-Cv2BYqNX.js} +4 -4
  121. package/dist/server/assets/{mermaid-3ZIDBTTL-C-00O3F0.js → mermaid-3ZIDBTTL-D_akVRms.js} +1 -1
  122. package/dist/server/assets/{mermaid-parser.core-CyX4B1l5.js → mermaid-parser.core-uDeqwrPN.js} +11 -11
  123. package/dist/server/assets/{mindmap-definition-VGOIOE7T-D51F_plo.js → mindmap-definition-VGOIOE7T-C9LF9XTT.js} +3 -3
  124. package/dist/server/assets/{packet-DYOGHKS2-CCJkkNTh.js → packet-DYOGHKS2-lRBX1T35.js} +6 -6
  125. package/dist/server/assets/{pie-VRWISCQL-7Tei6lnA.js → pie-VRWISCQL-BCZ9vmsj.js} +6 -6
  126. package/dist/server/assets/{pieDiagram-ADFJNKIX-BclaT-41.js → pieDiagram-ADFJNKIX-HYsm0km8.js} +7 -7
  127. package/dist/server/assets/{quadrantDiagram-AYHSOK5B-CnerVMbZ.js → quadrantDiagram-AYHSOK5B-Fdzz2j2T.js} +1 -1
  128. package/dist/server/assets/{radar-ZZBFDIW7-QLmbgAT7.js → radar-ZZBFDIW7-iZ-6xOx9.js} +6 -6
  129. package/dist/server/assets/{requirementDiagram-UZGBJVZJ-a2FIYlfE.js → requirementDiagram-UZGBJVZJ-CeHGAs1A.js} +3 -3
  130. package/dist/server/assets/{router-DDnNUwTm.js → router-A58OKuIG.js} +52793 -29611
  131. package/dist/server/assets/{sankeyDiagram-TZEHDZUN-B3I-S6CG.js → sankeyDiagram-TZEHDZUN-DXgjoM9B.js} +1 -1
  132. package/dist/server/assets/{sequenceDiagram-WL72ISMW-kgJrgJ9r.js → sequenceDiagram-WL72ISMW-BK24aHRm.js} +3 -3
  133. package/dist/server/assets/{stateDiagram-FKZM4ZOC-C6UTf0ag.js → stateDiagram-FKZM4ZOC-uW8qduwY.js} +8 -8
  134. package/dist/server/assets/{stateDiagram-v2-4FDKWEC3-Dj0SlbA4.js → stateDiagram-v2-4FDKWEC3-O0D8F8J2.js} +4 -4
  135. package/dist/server/assets/{timeline-definition-IT6M3QCI-DGPtqtJD.js → timeline-definition-IT6M3QCI-BaSl1O8h.js} +2 -2
  136. package/dist/server/assets/{treemap-GDKQZRPO-B-wn0rT7.js → treemap-GDKQZRPO-DqxwR6w-.js} +6 -6
  137. package/dist/server/assets/{workspace._workspaceId-CG5NG8aZ.js → workspace._workspaceId-B09dwAP5.js} +1 -1
  138. package/dist/server/assets/workspace._workspaceId-CZZSeH-P.js +316 -0
  139. package/dist/server/assets/{xychartDiagram-PRI3JC2R-BTb4nc1D.js → xychartDiagram-PRI3JC2R-Du3l-FcL.js} +1 -1
  140. package/dist/server/server.js +2 -2
  141. package/dist/start-server.mjs +80228 -58130
  142. package/dist/terminal-daemon.mjs +747 -113
  143. package/package.json +6 -4
  144. package/dist/client/assets/_basePickBy-B3BFyLWC.js +0 -1
  145. package/dist/client/assets/channel-RulspXoY.js +0 -1
  146. package/dist/client/assets/classDiagram-2ON5EDUG-Db0XAgV5.js +0 -1
  147. package/dist/client/assets/classDiagram-v2-WZHVMYZB-Db0XAgV5.js +0 -1
  148. package/dist/client/assets/clone-OMk_JTVX.js +0 -1
  149. package/dist/client/assets/diagram-S2PKOQOG-D3nbDuM4.js +0 -24
  150. package/dist/client/assets/gitGraphDiagram-V2S2FVAM-1W-3cgTi.js +0 -65
  151. package/dist/client/assets/highlighted-body-B3W2YXNL-By10eQ93.js +0 -1
  152. package/dist/client/assets/index-3OKF_8Is.js +0 -1
  153. package/dist/client/assets/index-Bgy7cu0a.js +0 -1
  154. package/dist/client/assets/index-BzNAZ5FA.js +0 -1
  155. package/dist/client/assets/index-Bzw80mva.js +0 -1
  156. package/dist/client/assets/index-C0hp-RSv.js +0 -7
  157. package/dist/client/assets/index-CEIbmBrz.js +0 -1
  158. package/dist/client/assets/index-D0-MMrtE.js +0 -13
  159. package/dist/client/assets/index-D1tzUCeW.js +0 -1
  160. package/dist/client/assets/index-DS648c4_.js +0 -1
  161. package/dist/client/assets/index-DV4-ZPTy.js +0 -1
  162. package/dist/client/assets/index-DkJyKKg0.js +0 -1
  163. package/dist/client/assets/index-Do8FqasK.js +0 -1
  164. package/dist/client/assets/index-DtgD3j-s.js +0 -6
  165. package/dist/client/assets/index-UlnCpzJG.js +0 -1
  166. package/dist/client/assets/index-bqUQQY5s.js +0 -3
  167. package/dist/client/assets/index-os2U5ZBq.js +0 -1
  168. package/dist/client/assets/main-B-TE9tSM.js +0 -979
  169. package/dist/client/assets/main-mRE1Fhv7.css +0 -1
  170. package/dist/client/assets/stateDiagram-v2-4FDKWEC3-BrxlUWYt.js +0 -1
  171. package/dist/client/assets/workspace._workspaceId-C0VOYb-1.js +0 -1
  172. package/dist/server/assets/_tanstack-start-manifest_v-D-Rf7MMa.js +0 -4
  173. package/dist/server/assets/index-Bt0zkb77.js +0 -1052
  174. package/dist/server/assets/index-CImaqmmh.js +0 -1764
  175. package/dist/server/assets/index-CXGBWoOB.js +0 -2499
  176. package/dist/server/assets/index-CyFAdMlV.js +0 -1030
  177. package/dist/server/assets/index-DoE2xDo2.js +0 -653
  178. package/dist/server/assets/workspace._workspaceId-Dd-upXb6.js +0 -309
@@ -1283,7 +1283,7 @@ var require_sonic_boom = __commonJS({
1283
1283
  if (!(this instanceof SonicBoom)) {
1284
1284
  return new SonicBoom(opts);
1285
1285
  }
1286
- let { fd, dest, minLength, maxLength, maxWrite, periodicFlush, sync, append = true, mkdir, retryEAGAIN, fsync, contentMode, mode } = opts || {};
1286
+ let { fd, dest, minLength, maxLength, maxWrite, periodicFlush, sync, append = true, mkdir: mkdir2, retryEAGAIN, fsync, contentMode, mode } = opts || {};
1287
1287
  fd = fd || dest;
1288
1288
  this._len = 0;
1289
1289
  this.fd = -1;
@@ -1308,7 +1308,7 @@ var require_sonic_boom = __commonJS({
1308
1308
  this.append = append || false;
1309
1309
  this.mode = mode;
1310
1310
  this.retryEAGAIN = retryEAGAIN || (() => true);
1311
- this.mkdir = mkdir || false;
1311
+ this.mkdir = mkdir2 || false;
1312
1312
  let fsWriteSync;
1313
1313
  let fsWrite;
1314
1314
  if (contentMode === kContentModeBuffer) {
@@ -2024,7 +2024,7 @@ var require_thread_stream = __commonJS({
2024
2024
  var { version } = require_package();
2025
2025
  var { EventEmitter } = __require("events");
2026
2026
  var { Worker } = __require("worker_threads");
2027
- var { join: join4 } = __require("path");
2027
+ var { join: join7 } = __require("path");
2028
2028
  var { pathToFileURL } = __require("url");
2029
2029
  var { wait } = require_wait();
2030
2030
  var {
@@ -2060,7 +2060,7 @@ var require_thread_stream = __commonJS({
2060
2060
  function createWorker(stream, opts) {
2061
2061
  const { filename, workerData } = opts;
2062
2062
  const bundlerOverrides = "__bundlerPathsOverrides" in globalThis ? globalThis.__bundlerPathsOverrides : {};
2063
- const toExecute = bundlerOverrides["thread-stream-worker"] || join4(__dirname, "lib", "worker.js");
2063
+ const toExecute = bundlerOverrides["thread-stream-worker"] || join7(__dirname, "lib", "worker.js");
2064
2064
  const worker = new Worker(toExecute, {
2065
2065
  ...opts.workerOpts,
2066
2066
  trackUnmanagedFds: false,
@@ -2446,7 +2446,7 @@ var require_transport = __commonJS({
2446
2446
  "use strict";
2447
2447
  var { createRequire } = __require("module");
2448
2448
  var getCallers = require_caller();
2449
- var { join: join4, isAbsolute, sep: sep2 } = __require("node:path");
2449
+ var { join: join7, isAbsolute, sep: sep2 } = __require("node:path");
2450
2450
  var sleep = require_atomic_sleep();
2451
2451
  var onExit = require_on_exit_leak_free();
2452
2452
  var ThreadStream = require_thread_stream();
@@ -2509,7 +2509,7 @@ var require_transport = __commonJS({
2509
2509
  throw new Error("only one of target or targets can be specified");
2510
2510
  }
2511
2511
  if (targets) {
2512
- target = bundlerOverrides["pino-worker"] || join4(__dirname, "worker.js");
2512
+ target = bundlerOverrides["pino-worker"] || join7(__dirname, "worker.js");
2513
2513
  options.targets = targets.filter((dest) => dest.target).map((dest) => {
2514
2514
  return {
2515
2515
  ...dest,
@@ -2527,7 +2527,7 @@ var require_transport = __commonJS({
2527
2527
  });
2528
2528
  });
2529
2529
  } else if (pipeline) {
2530
- target = bundlerOverrides["pino-worker"] || join4(__dirname, "worker.js");
2530
+ target = bundlerOverrides["pino-worker"] || join7(__dirname, "worker.js");
2531
2531
  options.pipelines = [pipeline.map((dest) => {
2532
2532
  return {
2533
2533
  ...dest,
@@ -2549,7 +2549,7 @@ var require_transport = __commonJS({
2549
2549
  return origin;
2550
2550
  }
2551
2551
  if (origin === "pino/file") {
2552
- return join4(__dirname, "..", "file.js");
2552
+ return join7(__dirname, "..", "file.js");
2553
2553
  }
2554
2554
  let fixTarget2;
2555
2555
  for (const filePath of callers) {
@@ -2877,11 +2877,11 @@ var require_tools = __commonJS({
2877
2877
  }
2878
2878
  }
2879
2879
  }
2880
- function buildFormatters(level, bindings, log4) {
2880
+ function buildFormatters(level, bindings, log5) {
2881
2881
  return {
2882
2882
  level,
2883
2883
  bindings,
2884
- log: log4
2884
+ log: log5
2885
2885
  };
2886
2886
  }
2887
2887
  function normalizeDestFileDescriptor(destination) {
@@ -3264,11 +3264,11 @@ var require_proto = __commonJS({
3264
3264
  }
3265
3265
  } else instance[serializersSym] = serializers;
3266
3266
  if (options.hasOwnProperty("formatters")) {
3267
- const { level, bindings: chindings, log: log4 } = options.formatters;
3267
+ const { level, bindings: chindings, log: log5 } = options.formatters;
3268
3268
  instance[formattersSym] = buildFormatters(
3269
3269
  level || formatters.level,
3270
3270
  chindings || resetChildingsFormatter,
3271
- log4 || formatters.log
3271
+ log5 || formatters.log
3272
3272
  );
3273
3273
  } else {
3274
3274
  instance[formattersSym] = buildFormatters(
@@ -3538,7 +3538,7 @@ var require_safe_stable_stringify = __commonJS({
3538
3538
  return circularValue;
3539
3539
  }
3540
3540
  let res = "";
3541
- let join4 = ",";
3541
+ let join7 = ",";
3542
3542
  const originalIndentation = indentation;
3543
3543
  if (Array.isArray(value)) {
3544
3544
  if (value.length === 0) {
@@ -3552,7 +3552,7 @@ var require_safe_stable_stringify = __commonJS({
3552
3552
  indentation += spacer;
3553
3553
  res += `
3554
3554
  ${indentation}`;
3555
- join4 = `,
3555
+ join7 = `,
3556
3556
  ${indentation}`;
3557
3557
  }
3558
3558
  const maximumValuesToStringify = Math.min(value.length, maximumBreadth);
@@ -3560,13 +3560,13 @@ ${indentation}`;
3560
3560
  for (; i < maximumValuesToStringify - 1; i++) {
3561
3561
  const tmp2 = stringifyFnReplacer(String(i), value, stack, replacer, spacer, indentation);
3562
3562
  res += tmp2 !== void 0 ? tmp2 : "null";
3563
- res += join4;
3563
+ res += join7;
3564
3564
  }
3565
3565
  const tmp = stringifyFnReplacer(String(i), value, stack, replacer, spacer, indentation);
3566
3566
  res += tmp !== void 0 ? tmp : "null";
3567
3567
  if (value.length - 1 > maximumBreadth) {
3568
3568
  const removedKeys = value.length - maximumBreadth - 1;
3569
- res += `${join4}"... ${getItemCount(removedKeys)} not stringified"`;
3569
+ res += `${join7}"... ${getItemCount(removedKeys)} not stringified"`;
3570
3570
  }
3571
3571
  if (spacer !== "") {
3572
3572
  res += `
@@ -3587,7 +3587,7 @@ ${originalIndentation}`;
3587
3587
  let separator = "";
3588
3588
  if (spacer !== "") {
3589
3589
  indentation += spacer;
3590
- join4 = `,
3590
+ join7 = `,
3591
3591
  ${indentation}`;
3592
3592
  whitespace = " ";
3593
3593
  }
@@ -3601,13 +3601,13 @@ ${indentation}`;
3601
3601
  const tmp = stringifyFnReplacer(key2, value, stack, replacer, spacer, indentation);
3602
3602
  if (tmp !== void 0) {
3603
3603
  res += `${separator}${strEscape(key2)}:${whitespace}${tmp}`;
3604
- separator = join4;
3604
+ separator = join7;
3605
3605
  }
3606
3606
  }
3607
3607
  if (keyLength > maximumBreadth) {
3608
3608
  const removedKeys = keyLength - maximumBreadth;
3609
3609
  res += `${separator}"...":${whitespace}"${getItemCount(removedKeys)} not stringified"`;
3610
- separator = join4;
3610
+ separator = join7;
3611
3611
  }
3612
3612
  if (spacer !== "" && separator.length > 1) {
3613
3613
  res = `
@@ -3648,7 +3648,7 @@ ${originalIndentation}`;
3648
3648
  }
3649
3649
  const originalIndentation = indentation;
3650
3650
  let res = "";
3651
- let join4 = ",";
3651
+ let join7 = ",";
3652
3652
  if (Array.isArray(value)) {
3653
3653
  if (value.length === 0) {
3654
3654
  return "[]";
@@ -3661,7 +3661,7 @@ ${originalIndentation}`;
3661
3661
  indentation += spacer;
3662
3662
  res += `
3663
3663
  ${indentation}`;
3664
- join4 = `,
3664
+ join7 = `,
3665
3665
  ${indentation}`;
3666
3666
  }
3667
3667
  const maximumValuesToStringify = Math.min(value.length, maximumBreadth);
@@ -3669,13 +3669,13 @@ ${indentation}`;
3669
3669
  for (; i < maximumValuesToStringify - 1; i++) {
3670
3670
  const tmp2 = stringifyArrayReplacer(String(i), value[i], stack, replacer, spacer, indentation);
3671
3671
  res += tmp2 !== void 0 ? tmp2 : "null";
3672
- res += join4;
3672
+ res += join7;
3673
3673
  }
3674
3674
  const tmp = stringifyArrayReplacer(String(i), value[i], stack, replacer, spacer, indentation);
3675
3675
  res += tmp !== void 0 ? tmp : "null";
3676
3676
  if (value.length - 1 > maximumBreadth) {
3677
3677
  const removedKeys = value.length - maximumBreadth - 1;
3678
- res += `${join4}"... ${getItemCount(removedKeys)} not stringified"`;
3678
+ res += `${join7}"... ${getItemCount(removedKeys)} not stringified"`;
3679
3679
  }
3680
3680
  if (spacer !== "") {
3681
3681
  res += `
@@ -3688,7 +3688,7 @@ ${originalIndentation}`;
3688
3688
  let whitespace = "";
3689
3689
  if (spacer !== "") {
3690
3690
  indentation += spacer;
3691
- join4 = `,
3691
+ join7 = `,
3692
3692
  ${indentation}`;
3693
3693
  whitespace = " ";
3694
3694
  }
@@ -3697,7 +3697,7 @@ ${indentation}`;
3697
3697
  const tmp = stringifyArrayReplacer(key2, value[key2], stack, replacer, spacer, indentation);
3698
3698
  if (tmp !== void 0) {
3699
3699
  res += `${separator}${strEscape(key2)}:${whitespace}${tmp}`;
3700
- separator = join4;
3700
+ separator = join7;
3701
3701
  }
3702
3702
  }
3703
3703
  if (spacer !== "" && separator.length > 1) {
@@ -3755,20 +3755,20 @@ ${originalIndentation}`;
3755
3755
  indentation += spacer;
3756
3756
  let res2 = `
3757
3757
  ${indentation}`;
3758
- const join5 = `,
3758
+ const join8 = `,
3759
3759
  ${indentation}`;
3760
3760
  const maximumValuesToStringify = Math.min(value.length, maximumBreadth);
3761
3761
  let i = 0;
3762
3762
  for (; i < maximumValuesToStringify - 1; i++) {
3763
3763
  const tmp2 = stringifyIndent(String(i), value[i], stack, spacer, indentation);
3764
3764
  res2 += tmp2 !== void 0 ? tmp2 : "null";
3765
- res2 += join5;
3765
+ res2 += join8;
3766
3766
  }
3767
3767
  const tmp = stringifyIndent(String(i), value[i], stack, spacer, indentation);
3768
3768
  res2 += tmp !== void 0 ? tmp : "null";
3769
3769
  if (value.length - 1 > maximumBreadth) {
3770
3770
  const removedKeys = value.length - maximumBreadth - 1;
3771
- res2 += `${join5}"... ${getItemCount(removedKeys)} not stringified"`;
3771
+ res2 += `${join8}"... ${getItemCount(removedKeys)} not stringified"`;
3772
3772
  }
3773
3773
  res2 += `
3774
3774
  ${originalIndentation}`;
@@ -3784,16 +3784,16 @@ ${originalIndentation}`;
3784
3784
  return '"[Object]"';
3785
3785
  }
3786
3786
  indentation += spacer;
3787
- const join4 = `,
3787
+ const join7 = `,
3788
3788
  ${indentation}`;
3789
3789
  let res = "";
3790
3790
  let separator = "";
3791
3791
  let maximumPropertiesToStringify = Math.min(keyLength, maximumBreadth);
3792
3792
  if (isTypedArrayWithEntries(value)) {
3793
- res += stringifyTypedArray(value, join4, maximumBreadth);
3793
+ res += stringifyTypedArray(value, join7, maximumBreadth);
3794
3794
  keys = keys.slice(value.length);
3795
3795
  maximumPropertiesToStringify -= value.length;
3796
- separator = join4;
3796
+ separator = join7;
3797
3797
  }
3798
3798
  if (deterministic) {
3799
3799
  keys = sort(keys, comparator);
@@ -3804,13 +3804,13 @@ ${indentation}`;
3804
3804
  const tmp = stringifyIndent(key2, value[key2], stack, spacer, indentation);
3805
3805
  if (tmp !== void 0) {
3806
3806
  res += `${separator}${strEscape(key2)}: ${tmp}`;
3807
- separator = join4;
3807
+ separator = join7;
3808
3808
  }
3809
3809
  }
3810
3810
  if (keyLength > maximumBreadth) {
3811
3811
  const removedKeys = keyLength - maximumBreadth;
3812
3812
  res += `${separator}"...": "${getItemCount(removedKeys)} not stringified"`;
3813
- separator = join4;
3813
+ separator = join7;
3814
3814
  }
3815
3815
  if (separator !== "") {
3816
3816
  res = `
@@ -8596,6 +8596,250 @@ var require_addon_serialize = __commonJS({
8596
8596
  }
8597
8597
  });
8598
8598
 
8599
+ // ../../node_modules/.pnpm/@xterm+addon-unicode11@0.10.0-beta.291_@xterm+xterm@6.1.0-beta.291/node_modules/@xterm/addon-unicode11/lib/addon-unicode11.js
8600
+ var require_addon_unicode11 = __commonJS({
8601
+ "../../node_modules/.pnpm/@xterm+addon-unicode11@0.10.0-beta.291_@xterm+xterm@6.1.0-beta.291/node_modules/@xterm/addon-unicode11/lib/addon-unicode11.js"(exports, module) {
8602
+ !(function(e, s) {
8603
+ "object" == typeof exports && "object" == typeof module ? module.exports = s() : "function" == typeof define && define.amd ? define([], s) : "object" == typeof exports ? exports.Unicode11Addon = s() : e.Unicode11Addon = s();
8604
+ })(globalThis, () => (() => {
8605
+ "use strict";
8606
+ var e = { 414(e2, s2, t2) {
8607
+ Object.defineProperty(s2, "__esModule", { value: true }), s2.EventUtils = s2.Emitter = void 0;
8608
+ const i2 = t2(426);
8609
+ var r;
8610
+ s2.Emitter = class {
8611
+ constructor() {
8612
+ this._listeners = [], this._disposed = false;
8613
+ }
8614
+ get event() {
8615
+ return this._event || (this._event = (e3, s3, t3) => {
8616
+ if (this._disposed) return (0, i2.toDisposable)(() => {
8617
+ });
8618
+ const r2 = { fn: e3, thisArgs: s3 };
8619
+ this._listeners.push(r2);
8620
+ const o = (0, i2.toDisposable)(() => {
8621
+ const e4 = this._listeners.indexOf(r2);
8622
+ -1 !== e4 && this._listeners.splice(e4, 1);
8623
+ });
8624
+ return t3 && (Array.isArray(t3) ? t3.push(o) : t3.add(o)), o;
8625
+ }), this._event;
8626
+ }
8627
+ fire(e3) {
8628
+ if (!this._disposed) switch (this._listeners.length) {
8629
+ case 0:
8630
+ return;
8631
+ case 1: {
8632
+ const { fn: s3, thisArgs: t3 } = this._listeners[0];
8633
+ return void s3.call(t3, e3);
8634
+ }
8635
+ default: {
8636
+ const s3 = this._listeners.slice();
8637
+ for (const { fn: t3, thisArgs: i3 } of s3) t3.call(i3, e3);
8638
+ }
8639
+ }
8640
+ }
8641
+ dispose() {
8642
+ this._disposed || (this._disposed = true, this._listeners.length = 0);
8643
+ }
8644
+ }, (function(e3) {
8645
+ e3.forward = function(e4, s3) {
8646
+ return e4((e5) => s3.fire(e5));
8647
+ }, e3.map = function(e4, s3) {
8648
+ return (t3, i3, r2) => e4((e5) => t3.call(i3, s3(e5)), void 0, r2);
8649
+ }, e3.any = function(...e4) {
8650
+ return (s3, t3, r2) => {
8651
+ const o = new i2.DisposableStore();
8652
+ for (const i3 of e4) o.add(i3((e5) => s3.call(t3, e5)));
8653
+ return r2 && (Array.isArray(r2) ? r2.push(o) : r2.add(o)), o;
8654
+ };
8655
+ }, e3.runAndSubscribe = function(e4, s3, t3) {
8656
+ return s3(t3), e4((e5) => s3(e5));
8657
+ };
8658
+ })(r || (s2.EventUtils = r = {}));
8659
+ }, 426(e2, s2) {
8660
+ function t2(e3) {
8661
+ return { dispose: e3 };
8662
+ }
8663
+ function i2(e3) {
8664
+ if (!e3) return e3;
8665
+ if (Array.isArray(e3)) {
8666
+ for (const s3 of e3) s3.dispose();
8667
+ return [];
8668
+ }
8669
+ return e3.dispose(), e3;
8670
+ }
8671
+ Object.defineProperty(s2, "__esModule", { value: true }), s2.MutableDisposable = s2.Disposable = s2.DisposableStore = void 0, s2.toDisposable = t2, s2.dispose = i2, s2.combinedDisposable = function(...e3) {
8672
+ return t2(() => i2(e3));
8673
+ };
8674
+ class r {
8675
+ constructor() {
8676
+ this._disposables = /* @__PURE__ */ new Set(), this._isDisposed = false;
8677
+ }
8678
+ get isDisposed() {
8679
+ return this._isDisposed;
8680
+ }
8681
+ add(e3) {
8682
+ return this._isDisposed ? e3.dispose() : this._disposables.add(e3), e3;
8683
+ }
8684
+ dispose() {
8685
+ if (!this._isDisposed) {
8686
+ this._isDisposed = true;
8687
+ for (const e3 of this._disposables) e3.dispose();
8688
+ this._disposables.clear();
8689
+ }
8690
+ }
8691
+ clear() {
8692
+ for (const e3 of this._disposables) e3.dispose();
8693
+ this._disposables.clear();
8694
+ }
8695
+ }
8696
+ s2.DisposableStore = r;
8697
+ class o {
8698
+ constructor() {
8699
+ this._store = new r();
8700
+ }
8701
+ dispose() {
8702
+ this._store.dispose();
8703
+ }
8704
+ _register(e3) {
8705
+ return this._store.add(e3);
8706
+ }
8707
+ }
8708
+ s2.Disposable = o, o.None = Object.freeze({ dispose() {
8709
+ } }), s2.MutableDisposable = class {
8710
+ constructor() {
8711
+ this._isDisposed = false;
8712
+ }
8713
+ get value() {
8714
+ return this._isDisposed ? void 0 : this._value;
8715
+ }
8716
+ set value(e3) {
8717
+ this._isDisposed || e3 === this._value || (this._value?.dispose(), this._value = e3);
8718
+ }
8719
+ clear() {
8720
+ this.value = void 0;
8721
+ }
8722
+ dispose() {
8723
+ this._isDisposed = true, this._value?.dispose(), this._value = void 0;
8724
+ }
8725
+ };
8726
+ }, 765(e2, s2, t2) {
8727
+ Object.defineProperty(s2, "__esModule", { value: true }), s2.UnicodeService = void 0;
8728
+ const i2 = t2(414);
8729
+ class r {
8730
+ constructor() {
8731
+ this._providers = /* @__PURE__ */ Object.create(null), this._active = "", this._onChange = new i2.Emitter(), this.onChange = this._onChange.event;
8732
+ }
8733
+ static extractShouldJoin(e3) {
8734
+ return !!(1 & e3);
8735
+ }
8736
+ static extractWidth(e3) {
8737
+ return e3 >> 1 & 3;
8738
+ }
8739
+ static extractCharKind(e3) {
8740
+ return e3 >> 3;
8741
+ }
8742
+ static createPropertyValue(e3, s3, t3 = false) {
8743
+ return (16777215 & e3) << 3 | (3 & s3) << 1 | (t3 ? 1 : 0);
8744
+ }
8745
+ dispose() {
8746
+ this._onChange.dispose();
8747
+ }
8748
+ get versions() {
8749
+ return Object.keys(this._providers);
8750
+ }
8751
+ get activeVersion() {
8752
+ return this._active;
8753
+ }
8754
+ set activeVersion(e3) {
8755
+ if (!this._providers[e3]) throw new Error(`unknown Unicode version "${e3}"`);
8756
+ this._active = e3, this._activeProvider = this._providers[e3], this._onChange.fire(e3);
8757
+ }
8758
+ register(e3) {
8759
+ this._providers[e3.version] = e3, this._active || (this.activeVersion = e3.version);
8760
+ }
8761
+ wcwidth(e3) {
8762
+ return this._activeProvider.wcwidth(e3);
8763
+ }
8764
+ getStringCellWidth(e3) {
8765
+ let s3 = 0, t3 = 0;
8766
+ const i3 = e3.length;
8767
+ for (let o = 0; o < i3; ++o) {
8768
+ let n = e3.charCodeAt(o);
8769
+ if (55296 <= n && n <= 56319) {
8770
+ if (++o >= i3) return s3 + this.wcwidth(n);
8771
+ const t4 = e3.charCodeAt(o);
8772
+ 56320 <= t4 && t4 <= 57343 ? n = 1024 * (n - 55296) + t4 - 56320 + 65536 : s3 += this.wcwidth(t4);
8773
+ }
8774
+ const d = this.charProperties(n, t3);
8775
+ let c = r.extractWidth(d);
8776
+ r.extractShouldJoin(d) && (c -= r.extractWidth(t3)), s3 += c, t3 = d;
8777
+ }
8778
+ return s3;
8779
+ }
8780
+ charProperties(e3, s3) {
8781
+ return this._activeProvider.charProperties(e3, s3);
8782
+ }
8783
+ }
8784
+ s2.UnicodeService = r;
8785
+ }, 384(e2, s2, t2) {
8786
+ Object.defineProperty(s2, "__esModule", { value: true }), s2.UnicodeV11 = void 0;
8787
+ const i2 = t2(765), r = [[768, 879], [1155, 1161], [1425, 1469], [1471, 1471], [1473, 1474], [1476, 1477], [1479, 1479], [1536, 1541], [1552, 1562], [1564, 1564], [1611, 1631], [1648, 1648], [1750, 1757], [1759, 1764], [1767, 1768], [1770, 1773], [1807, 1807], [1809, 1809], [1840, 1866], [1958, 1968], [2027, 2035], [2045, 2045], [2070, 2073], [2075, 2083], [2085, 2087], [2089, 2093], [2137, 2139], [2259, 2306], [2362, 2362], [2364, 2364], [2369, 2376], [2381, 2381], [2385, 2391], [2402, 2403], [2433, 2433], [2492, 2492], [2497, 2500], [2509, 2509], [2530, 2531], [2558, 2558], [2561, 2562], [2620, 2620], [2625, 2626], [2631, 2632], [2635, 2637], [2641, 2641], [2672, 2673], [2677, 2677], [2689, 2690], [2748, 2748], [2753, 2757], [2759, 2760], [2765, 2765], [2786, 2787], [2810, 2815], [2817, 2817], [2876, 2876], [2879, 2879], [2881, 2884], [2893, 2893], [2902, 2902], [2914, 2915], [2946, 2946], [3008, 3008], [3021, 3021], [3072, 3072], [3076, 3076], [3134, 3136], [3142, 3144], [3146, 3149], [3157, 3158], [3170, 3171], [3201, 3201], [3260, 3260], [3263, 3263], [3270, 3270], [3276, 3277], [3298, 3299], [3328, 3329], [3387, 3388], [3393, 3396], [3405, 3405], [3426, 3427], [3530, 3530], [3538, 3540], [3542, 3542], [3633, 3633], [3636, 3642], [3655, 3662], [3761, 3761], [3764, 3772], [3784, 3789], [3864, 3865], [3893, 3893], [3895, 3895], [3897, 3897], [3953, 3966], [3968, 3972], [3974, 3975], [3981, 3991], [3993, 4028], [4038, 4038], [4141, 4144], [4146, 4151], [4153, 4154], [4157, 4158], [4184, 4185], [4190, 4192], [4209, 4212], [4226, 4226], [4229, 4230], [4237, 4237], [4253, 4253], [4448, 4607], [4957, 4959], [5906, 5908], [5938, 5940], [5970, 5971], [6002, 6003], [6068, 6069], [6071, 6077], [6086, 6086], [6089, 6099], [6109, 6109], [6155, 6158], [6277, 6278], [6313, 6313], [6432, 6434], [6439, 6440], [6450, 6450], [6457, 6459], [6679, 6680], [6683, 6683], [6742, 6742], [6744, 6750], [6752, 6752], [6754, 6754], [6757, 6764], [6771, 6780], [6783, 6783], [6832, 6846], [6912, 6915], [6964, 6964], [6966, 6970], [6972, 6972], [6978, 6978], [7019, 7027], [7040, 7041], [7074, 7077], [7080, 7081], [7083, 7085], [7142, 7142], [7144, 7145], [7149, 7149], [7151, 7153], [7212, 7219], [7222, 7223], [7376, 7378], [7380, 7392], [7394, 7400], [7405, 7405], [7412, 7412], [7416, 7417], [7616, 7673], [7675, 7679], [8203, 8207], [8234, 8238], [8288, 8292], [8294, 8303], [8400, 8432], [11503, 11505], [11647, 11647], [11744, 11775], [12330, 12333], [12441, 12442], [42607, 42610], [42612, 42621], [42654, 42655], [42736, 42737], [43010, 43010], [43014, 43014], [43019, 43019], [43045, 43046], [43204, 43205], [43232, 43249], [43263, 43263], [43302, 43309], [43335, 43345], [43392, 43394], [43443, 43443], [43446, 43449], [43452, 43453], [43493, 43493], [43561, 43566], [43569, 43570], [43573, 43574], [43587, 43587], [43596, 43596], [43644, 43644], [43696, 43696], [43698, 43700], [43703, 43704], [43710, 43711], [43713, 43713], [43756, 43757], [43766, 43766], [44005, 44005], [44008, 44008], [44013, 44013], [64286, 64286], [65024, 65039], [65056, 65071], [65279, 65279], [65529, 65531]], o = [[66045, 66045], [66272, 66272], [66422, 66426], [68097, 68099], [68101, 68102], [68108, 68111], [68152, 68154], [68159, 68159], [68325, 68326], [68900, 68903], [69446, 69456], [69633, 69633], [69688, 69702], [69759, 69761], [69811, 69814], [69817, 69818], [69821, 69821], [69837, 69837], [69888, 69890], [69927, 69931], [69933, 69940], [70003, 70003], [70016, 70017], [70070, 70078], [70089, 70092], [70191, 70193], [70196, 70196], [70198, 70199], [70206, 70206], [70367, 70367], [70371, 70378], [70400, 70401], [70459, 70460], [70464, 70464], [70502, 70508], [70512, 70516], [70712, 70719], [70722, 70724], [70726, 70726], [70750, 70750], [70835, 70840], [70842, 70842], [70847, 70848], [70850, 70851], [71090, 71093], [71100, 71101], [71103, 71104], [71132, 71133], [71219, 71226], [71229, 71229], [71231, 71232], [71339, 71339], [71341, 71341], [71344, 71349], [71351, 71351], [71453, 71455], [71458, 71461], [71463, 71467], [71727, 71735], [71737, 71738], [72148, 72151], [72154, 72155], [72160, 72160], [72193, 72202], [72243, 72248], [72251, 72254], [72263, 72263], [72273, 72278], [72281, 72283], [72330, 72342], [72344, 72345], [72752, 72758], [72760, 72765], [72767, 72767], [72850, 72871], [72874, 72880], [72882, 72883], [72885, 72886], [73009, 73014], [73018, 73018], [73020, 73021], [73023, 73029], [73031, 73031], [73104, 73105], [73109, 73109], [73111, 73111], [73459, 73460], [78896, 78904], [92912, 92916], [92976, 92982], [94031, 94031], [94095, 94098], [113821, 113822], [113824, 113827], [119143, 119145], [119155, 119170], [119173, 119179], [119210, 119213], [119362, 119364], [121344, 121398], [121403, 121452], [121461, 121461], [121476, 121476], [121499, 121503], [121505, 121519], [122880, 122886], [122888, 122904], [122907, 122913], [122915, 122916], [122918, 122922], [123184, 123190], [123628, 123631], [125136, 125142], [125252, 125258], [917505, 917505], [917536, 917631], [917760, 917999]], n = [[4352, 4447], [8986, 8987], [9001, 9002], [9193, 9196], [9200, 9200], [9203, 9203], [9725, 9726], [9748, 9749], [9800, 9811], [9855, 9855], [9875, 9875], [9889, 9889], [9898, 9899], [9917, 9918], [9924, 9925], [9934, 9934], [9940, 9940], [9962, 9962], [9970, 9971], [9973, 9973], [9978, 9978], [9981, 9981], [9989, 9989], [9994, 9995], [10024, 10024], [10060, 10060], [10062, 10062], [10067, 10069], [10071, 10071], [10133, 10135], [10160, 10160], [10175, 10175], [11035, 11036], [11088, 11088], [11093, 11093], [11904, 11929], [11931, 12019], [12032, 12245], [12272, 12283], [12288, 12329], [12334, 12350], [12353, 12438], [12443, 12543], [12549, 12591], [12593, 12686], [12688, 12730], [12736, 12771], [12784, 12830], [12832, 12871], [12880, 19903], [19968, 42124], [42128, 42182], [43360, 43388], [44032, 55203], [63744, 64255], [65040, 65049], [65072, 65106], [65108, 65126], [65128, 65131], [65281, 65376], [65504, 65510]], d = [[94176, 94179], [94208, 100343], [100352, 101106], [110592, 110878], [110928, 110930], [110948, 110951], [110960, 111355], [126980, 126980], [127183, 127183], [127374, 127374], [127377, 127386], [127488, 127490], [127504, 127547], [127552, 127560], [127568, 127569], [127584, 127589], [127744, 127776], [127789, 127797], [127799, 127868], [127870, 127891], [127904, 127946], [127951, 127955], [127968, 127984], [127988, 127988], [127992, 128062], [128064, 128064], [128066, 128252], [128255, 128317], [128331, 128334], [128336, 128359], [128378, 128378], [128405, 128406], [128420, 128420], [128507, 128591], [128640, 128709], [128716, 128716], [128720, 128722], [128725, 128725], [128747, 128748], [128756, 128762], [128992, 129003], [129293, 129393], [129395, 129398], [129402, 129442], [129445, 129450], [129454, 129482], [129485, 129535], [129648, 129651], [129656, 129658], [129664, 129666], [129680, 129685], [131072, 196605], [196608, 262141]];
8788
+ let c;
8789
+ function a(e3, s3) {
8790
+ let t3, i3 = 0, r2 = s3.length - 1;
8791
+ if (e3 < s3[0][0] || e3 > s3[r2][1]) return false;
8792
+ for (; r2 >= i3; ) if (t3 = i3 + r2 >> 1, e3 > s3[t3][1]) i3 = t3 + 1;
8793
+ else {
8794
+ if (!(e3 < s3[t3][0])) return true;
8795
+ r2 = t3 - 1;
8796
+ }
8797
+ return false;
8798
+ }
8799
+ s2.UnicodeV11 = class {
8800
+ constructor() {
8801
+ if (this.version = "11", !c) {
8802
+ c = new Uint8Array(65536), c.fill(1), c[0] = 0, c.fill(0, 1, 32), c.fill(0, 127, 160);
8803
+ for (let e3 = 0; e3 < r.length; ++e3) c.fill(0, r[e3][0], r[e3][1] + 1);
8804
+ for (let e3 = 0; e3 < n.length; ++e3) c.fill(2, n[e3][0], n[e3][1] + 1);
8805
+ }
8806
+ }
8807
+ wcwidth(e3) {
8808
+ return e3 < 32 ? 0 : e3 < 127 ? 1 : e3 < 65536 ? c[e3] : a(e3, o) ? 0 : a(e3, d) ? 2 : 1;
8809
+ }
8810
+ charProperties(e3, s3) {
8811
+ let t3 = this.wcwidth(e3), r2 = 0 === t3 && 0 !== s3;
8812
+ if (r2) {
8813
+ const e4 = i2.UnicodeService.extractWidth(s3);
8814
+ 0 === e4 ? r2 = false : e4 > t3 && (t3 = e4);
8815
+ }
8816
+ return i2.UnicodeService.createPropertyValue(0, t3, r2);
8817
+ }
8818
+ };
8819
+ } }, s = {};
8820
+ function t(i2) {
8821
+ var r = s[i2];
8822
+ if (void 0 !== r) return r.exports;
8823
+ var o = s[i2] = { exports: {} };
8824
+ return e[i2](o, o.exports, t), o.exports;
8825
+ }
8826
+ var i = {};
8827
+ return (() => {
8828
+ var e2 = i;
8829
+ Object.defineProperty(e2, "__esModule", { value: true }), e2.Unicode11Addon = void 0;
8830
+ const s2 = t(384);
8831
+ e2.Unicode11Addon = class {
8832
+ activate(e3) {
8833
+ e3.unicode.register(new s2.UnicodeV11());
8834
+ }
8835
+ dispose() {
8836
+ }
8837
+ };
8838
+ })(), i;
8839
+ })());
8840
+ }
8841
+ });
8842
+
8599
8843
  // terminal-daemon.ts
8600
8844
  import { fileURLToPath } from "node:url";
8601
8845
  import { parseArgs } from "node:util";
@@ -8611,15 +8855,22 @@ function createLogger(name) {
8611
8855
 
8612
8856
  // src/server/infra/terminals/daemon/daemon-server.ts
8613
8857
  import { randomBytes as randomBytes2, timingSafeEqual } from "node:crypto";
8614
- import { chmodSync as chmodSync2, lstatSync as lstatSync2, readFileSync, renameSync as renameSync2, unlinkSync as unlinkSync3, writeFileSync as writeFileSync2 } from "node:fs";
8858
+ import { chmodSync as chmodSync2, lstatSync as lstatSync2, readFileSync as readFileSync2, renameSync as renameSync2, unlinkSync as unlinkSync3, writeFileSync as writeFileSync2 } from "node:fs";
8615
8859
  import { createServer } from "node:net";
8616
- import { dirname as dirname3 } from "node:path";
8860
+ import { dirname as dirname3, join as join6 } from "node:path";
8861
+
8862
+ // src/server/infra/terminals/node-pty-loader.ts
8863
+ var cachedImport;
8864
+ function preloadNodePty() {
8865
+ cachedImport ??= import("node-pty");
8866
+ return cachedImport;
8867
+ }
8617
8868
 
8618
8869
  // src/server/infra/terminals/terminal-pool.ts
8619
8870
  import { randomUUID } from "node:crypto";
8620
8871
  import { existsSync as existsSync2, unlinkSync, writeFileSync } from "node:fs";
8621
8872
  import { tmpdir } from "node:os";
8622
- import { join, sep } from "node:path";
8873
+ import { join as join3, sep } from "node:path";
8623
8874
 
8624
8875
  // src/server/infra/process/path.ts
8625
8876
  import { execFile } from "node:child_process";
@@ -8681,13 +8932,212 @@ async function shellPath() {
8681
8932
  return fallback;
8682
8933
  }
8683
8934
 
8935
+ // src/server/infra/terminals/claude-resume.ts
8936
+ import { readdirSync, statSync } from "node:fs";
8937
+ import { homedir } from "node:os";
8938
+ import { join } from "node:path";
8939
+ var CLAUDE_COMMAND_PATTERN = /^claude(\s|$)/;
8940
+ var CLAUDE_RESUME_FLAG_PATTERN = /(^|\s)(--resume|-r)(\s|$)/;
8941
+ var SESSION_ID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
8942
+ function isResumableClaudeCommand(command) {
8943
+ if (!command) return false;
8944
+ const trimmed = command.trim();
8945
+ return CLAUDE_COMMAND_PATTERN.test(trimmed) && !CLAUDE_RESUME_FLAG_PATTERN.test(trimmed);
8946
+ }
8947
+ function claudeProjectDir(cwd) {
8948
+ return join(homedir(), ".claude", "projects", cwd.replaceAll("/", "-"));
8949
+ }
8950
+ function findLatestClaudeSessionId(cwd) {
8951
+ const dir = claudeProjectDir(cwd);
8952
+ let names;
8953
+ try {
8954
+ names = readdirSync(dir).filter((name) => name.endsWith(".jsonl"));
8955
+ } catch {
8956
+ return null;
8957
+ }
8958
+ let newest = null;
8959
+ for (const name of names) {
8960
+ let mtimeMs;
8961
+ try {
8962
+ mtimeMs = statSync(join(dir, name)).mtimeMs;
8963
+ } catch {
8964
+ continue;
8965
+ }
8966
+ if (!newest || mtimeMs > newest.mtimeMs) {
8967
+ newest = { id: name.slice(0, -".jsonl".length), mtimeMs };
8968
+ }
8969
+ }
8970
+ if (!newest || !SESSION_ID_PATTERN.test(newest.id)) return null;
8971
+ return newest.id;
8972
+ }
8973
+ function buildClaudeResumeCommand(originalCommand, sessionId) {
8974
+ return `${originalCommand.trim()} --resume ${sessionId}`;
8975
+ }
8976
+
8977
+ // src/server/infra/terminals/pty-error-hints.ts
8978
+ var MODULE_LOAD_PATTERN = /Cannot find module|MODULE_NOT_FOUND|pty\.node/i;
8979
+ var RESOURCE_EXHAUSTION_PATTERN = /\b(EMFILE|ENFILE|ENOMEM|EAGAIN)\b/;
8980
+ function hintForPtySpawnError(err) {
8981
+ const message = err instanceof Error ? err.message : String(err);
8982
+ if (MODULE_LOAD_PATTERN.test(message)) {
8983
+ return "The terminal service could not load its native module. Restart the terminal service from Settings.";
8984
+ }
8985
+ if (RESOURCE_EXHAUSTION_PATTERN.test(message)) {
8986
+ return "Your system cannot start another terminal process. Close unused terminals and try again.";
8987
+ }
8988
+ return "Failed to start the terminal shell.";
8989
+ }
8990
+
8991
+ // src/server/infra/terminals/terminal-history.ts
8992
+ import { readdirSync as readdirSync2, readFileSync, rmSync } from "node:fs";
8993
+ import { mkdir, rename, writeFile } from "node:fs/promises";
8994
+ import { join as join2 } from "node:path";
8995
+ var log = createLogger("terminal-history");
8996
+ var CHECKPOINT_MAX_BYTES = 5 * 1024 * 1024;
8997
+ var TerminalHistoryManager = class {
8998
+ constructor(historyDir) {
8999
+ this.historyDir = historyDir;
9000
+ }
9001
+ sessionDir(terminalId) {
9002
+ return join2(this.historyDir, encodeURIComponent(terminalId));
9003
+ }
9004
+ readMeta(terminalId) {
9005
+ return readJson(join2(this.sessionDir(terminalId), "meta.json"));
9006
+ }
9007
+ readCheckpoint(terminalId) {
9008
+ return readJson(
9009
+ join2(this.sessionDir(terminalId), "checkpoint.json")
9010
+ );
9011
+ }
9012
+ /**
9013
+ * Async: called from the PTY output hot path (`TerminalPool.onData`), so
9014
+ * this must never block the daemon's single event loop the way the
9015
+ * synchronous `fs` calls it replaced (`writeFileSync`/`renameSync`) would —
9016
+ * a slow or networked filesystem could otherwise delay every other
9017
+ * terminal's output delivery, the exact regression issue #676 fixed for a
9018
+ * different code path.
9019
+ */
9020
+ async writeMeta(terminalId, meta) {
9021
+ await writeJson(this.sessionDir(terminalId), "meta.json", meta);
9022
+ }
9023
+ async writeCheckpoint(terminalId, checkpoint) {
9024
+ const serialized = JSON.stringify(checkpoint);
9025
+ const bytes = Buffer.byteLength(serialized);
9026
+ if (bytes > CHECKPOINT_MAX_BYTES) {
9027
+ log.warn({ terminalId, bytes }, "terminal history checkpoint too large; skipping this write");
9028
+ return;
9029
+ }
9030
+ await writeJson(this.sessionDir(terminalId), "checkpoint.json", checkpoint, serialized);
9031
+ }
9032
+ /** Drop a terminal's saved history: its tab or workspace was actually closed or deleted. */
9033
+ removeSession(terminalId) {
9034
+ try {
9035
+ rmSync(this.sessionDir(terminalId), { recursive: true, force: true });
9036
+ } catch (err) {
9037
+ log.warn({ err, terminalId }, "failed to remove terminal history directory");
9038
+ }
9039
+ }
9040
+ /**
9041
+ * Drop every saved session whose last known `workspaceId` is `workspaceId`
9042
+ * — used when a workspace is deleted. Scans the whole history directory
9043
+ * rather than the pool's live reverse index, which by then may already be
9044
+ * missing terminals that exited (and were never explicitly killed) before
9045
+ * the workspace was removed.
9046
+ */
9047
+ removeSessionsForWorkspace(workspaceId) {
9048
+ let names;
9049
+ try {
9050
+ names = readdirSync2(this.historyDir);
9051
+ } catch {
9052
+ return;
9053
+ }
9054
+ for (const name of names) {
9055
+ const dir = join2(this.historyDir, name);
9056
+ const meta = readJson(join2(dir, "meta.json"));
9057
+ if (meta?.workspaceId !== workspaceId) continue;
9058
+ try {
9059
+ rmSync(dir, { recursive: true, force: true });
9060
+ } catch (err) {
9061
+ log.warn({ err, dir }, "failed to remove terminal history directory");
9062
+ }
9063
+ }
9064
+ }
9065
+ };
9066
+ function readJson(path) {
9067
+ try {
9068
+ return JSON.parse(readFileSync(path, "utf8"));
9069
+ } catch {
9070
+ return null;
9071
+ }
9072
+ }
9073
+ async function writeJson(dir, name, value, serialized) {
9074
+ try {
9075
+ await mkdir(dir, { recursive: true, mode: 448 });
9076
+ const path = join2(dir, name);
9077
+ const tmp = `${path}.${process.pid}.${Date.now()}.tmp`;
9078
+ await writeFile(tmp, serialized ?? JSON.stringify(value), { mode: 384 });
9079
+ await rename(tmp, path);
9080
+ } catch (err) {
9081
+ log.warn({ err, dir, name }, "failed to write terminal history file");
9082
+ }
9083
+ }
9084
+
8684
9085
  // src/server/infra/terminals/terminal-pool.ts
8685
- var log = createLogger("terminal-pool");
9086
+ var log2 = createLogger("terminal-pool");
8686
9087
  var MAX_SCROLLBACK_SIZE = 1e5;
8687
9088
  var HEADLESS_SCROLLBACK_LINES = 1e4;
8688
9089
  var MAX_COLS = 1e3;
8689
9090
  var MAX_ROWS = 1e3;
9091
+ var HISTORY_CHECKPOINT_INTERVAL_MS = 1e4;
9092
+ var OutputTail = class {
9093
+ constructor(max) {
9094
+ this.max = max;
9095
+ }
9096
+ chunks = [];
9097
+ /** Index of the oldest chunk still held; earlier slots are dropped. */
9098
+ head = 0;
9099
+ /** Total characters in `chunks[head..]`. */
9100
+ size = 0;
9101
+ get length() {
9102
+ return Math.min(this.size, this.max);
9103
+ }
9104
+ append(data) {
9105
+ if (data.length === 0) return;
9106
+ this.chunks.push(data);
9107
+ this.size += data.length;
9108
+ while (this.size - this.chunks[this.head].length >= this.max) {
9109
+ this.size -= this.chunks[this.head].length;
9110
+ this.head += 1;
9111
+ }
9112
+ if (this.head > 64 && this.head * 2 > this.chunks.length) {
9113
+ this.chunks = this.chunks.slice(this.head);
9114
+ this.head = 0;
9115
+ }
9116
+ }
9117
+ toString() {
9118
+ const joined = this.chunks.slice(this.head).join("");
9119
+ this.chunks = [joined];
9120
+ this.head = 0;
9121
+ return joined.length > this.max ? joined.slice(-this.max) : joined;
9122
+ }
9123
+ };
8690
9124
  var TerminalPool = class {
9125
+ historyStore;
9126
+ /**
9127
+ * terminalIds whose next `onExit` should prune (not checkpoint) their
9128
+ * history: set by an explicit `kill` / `killWorkspace`, i.e. the tab or
9129
+ * workspace is actually being closed or deleted. `killAll` (daemon
9130
+ * shutdown/restart) deliberately never adds to this set, so those sessions
9131
+ * stay cold-restorable.
9132
+ */
9133
+ pruneHistoryOnExit = /* @__PURE__ */ new Set();
9134
+ /**
9135
+ * In-flight history checkpoint writes (see {@link checkpointHistoryNow}).
9136
+ * `hasPendingHistoryWrites` lets the daemon's shutdown wait for these
9137
+ * before exiting, since they are async and no longer complete before
9138
+ * `onExit` returns.
9139
+ */
9140
+ pendingHistoryWrites = /* @__PURE__ */ new Set();
8691
9141
  /** terminalId -> session */
8692
9142
  terminals = /* @__PURE__ */ new Map();
8693
9143
  /** workspaceId -> Set<terminalId> (reverse index for workspace-level cleanup) */
@@ -8712,6 +9162,9 @@ var TerminalPool = class {
8712
9162
  /** terminalIds with a shrink-and-restore nudge in flight (see
8713
9163
  * {@link nudgeResize} for why concurrent nudges must not compound). */
8714
9164
  nudging = /* @__PURE__ */ new Set();
9165
+ constructor(options) {
9166
+ this.historyStore = options?.historyDir ? new TerminalHistoryManager(options.historyDir) : null;
9167
+ }
8715
9168
  /**
8716
9169
  * Spawn (or return the already-spawning/spawned) PTY for a terminalId.
8717
9170
  *
@@ -8738,6 +9191,8 @@ var TerminalPool = class {
8738
9191
  async spawnNew(workspaceId, terminalId, workspaceRoot, options, extras) {
8739
9192
  const shell = defaultShell();
8740
9193
  const resolvedPath = await shellPath();
9194
+ const historyMeta = this.historyStore?.readMeta(terminalId) ?? null;
9195
+ const checkpoint = historyMeta?.workspaceId === workspaceId ? this.historyStore?.readCheckpoint(terminalId) ?? null : null;
8741
9196
  const env = {};
8742
9197
  for (const [key, value] of Object.entries(extras?.baseEnv ?? process.env)) {
8743
9198
  if (value != null) {
@@ -8758,18 +9213,14 @@ var TerminalPool = class {
8758
9213
  env.BAND_DISPATCH = "terminal";
8759
9214
  let cwd = workspaceRoot;
8760
9215
  if (options?.cwd) {
8761
- const resolved = join(workspaceRoot, options.cwd);
8762
- if (resolved !== workspaceRoot && !resolved.startsWith(workspaceRoot + sep)) {
8763
- log.warn(
8764
- "Ignoring cwd %s \u2014 resolves outside workspace root %s",
8765
- options.cwd,
8766
- workspaceRoot
8767
- );
8768
- } else if (existsSync2(resolved)) {
8769
- cwd = resolved;
8770
- } else {
8771
- log.warn("Ignoring cwd %s \u2014 directory does not exist", options.cwd);
8772
- }
9216
+ cwd = resolveSafeCwd(join3(workspaceRoot, options.cwd), workspaceRoot, "cwd", options.cwd) ?? cwd;
9217
+ } else if (checkpoint?.cwd) {
9218
+ cwd = resolveSafeCwd(
9219
+ checkpoint.cwd,
9220
+ workspaceRoot,
9221
+ "saved terminal history cwd",
9222
+ checkpoint.cwd
9223
+ ) ?? cwd;
8773
9224
  }
8774
9225
  if (!existsSync2(cwd)) {
8775
9226
  throw new Error(`Workspace directory does not exist: ${cwd}`);
@@ -8777,16 +9228,16 @@ var TerminalPool = class {
8777
9228
  if (!existsSync2(shell)) {
8778
9229
  throw new Error(`Shell not found: ${shell}`);
8779
9230
  }
8780
- log.debug(
9231
+ log2.debug(
8781
9232
  "Spawning shell %s in %s for terminal %s (PATH=%s)",
8782
9233
  shell,
8783
9234
  cwd,
8784
9235
  terminalId,
8785
9236
  resolvedPath.slice(0, 200)
8786
9237
  );
8787
- const nodePty = await import("node-pty");
8788
9238
  let ptyProcess;
8789
9239
  try {
9240
+ const nodePty = await preloadNodePty();
8790
9241
  ptyProcess = nodePty.spawn(shell, [], {
8791
9242
  name: "xterm-256color",
8792
9243
  cols: 80,
@@ -8796,8 +9247,8 @@ var TerminalPool = class {
8796
9247
  });
8797
9248
  } catch (err) {
8798
9249
  const msg = err instanceof Error ? err.message : String(err);
8799
- log.error("pty.spawn failed: %s (shell=%s, cwd=%s)", msg, shell, cwd);
8800
- throw err;
9250
+ log2.error("pty.spawn failed: %s (shell=%s, cwd=%s)", msg, shell, cwd);
9251
+ throw new Error(hintForPtySpawnError(err));
8801
9252
  }
8802
9253
  let headless;
8803
9254
  let serializeAddon;
@@ -8806,6 +9257,8 @@ var TerminalPool = class {
8806
9257
  const { Terminal } = "Terminal" in headlessNs ? headlessNs : headlessNs.default;
8807
9258
  const serializeNs = await Promise.resolve().then(() => __toESM(require_addon_serialize(), 1));
8808
9259
  const { SerializeAddon } = "SerializeAddon" in serializeNs ? serializeNs : serializeNs.default;
9260
+ const unicode11Ns = await Promise.resolve().then(() => __toESM(require_addon_unicode11(), 1));
9261
+ const { Unicode11Addon } = "Unicode11Addon" in unicode11Ns ? unicode11Ns : unicode11Ns.default;
8809
9262
  headless = new Terminal({
8810
9263
  cols: 80,
8811
9264
  rows: 24,
@@ -8814,24 +9267,43 @@ var TerminalPool = class {
8814
9267
  });
8815
9268
  serializeAddon = new SerializeAddon();
8816
9269
  headless.loadAddon(serializeAddon);
9270
+ headless.loadAddon(
9271
+ new Unicode11Addon()
9272
+ );
9273
+ headless.unicode.activeVersion = "11";
8817
9274
  } catch (err) {
8818
9275
  ptyProcess.kill();
8819
9276
  const msg = err instanceof Error ? err.message : String(err);
8820
- log.error("headless mirror setup failed for terminal %s: %s", terminalId, msg);
9277
+ log2.error("headless mirror setup failed for terminal %s: %s", terminalId, msg);
8821
9278
  throw err;
8822
9279
  }
8823
9280
  const session = {
8824
9281
  pty: ptyProcess,
8825
- scrollback: "",
9282
+ scrollback: new OutputTail(MAX_SCROLLBACK_SIZE),
8826
9283
  headless,
8827
9284
  serializeAddon,
8828
9285
  workspaceId,
8829
9286
  seq: 0,
8830
- cleanupOnExit: extras?.cleanupOnExit ?? false
9287
+ holds: 0,
9288
+ cleanupOnExit: extras?.cleanupOnExit ?? false,
9289
+ history: this.historyStore ? {
9290
+ cwd,
9291
+ startedAt: historyMeta?.startedAt ?? (/* @__PURE__ */ new Date()).toISOString(),
9292
+ sessionCommand: options?.command ?? historyMeta?.sessionCommand,
9293
+ lastCheckpointAt: 0
9294
+ } : void 0
8831
9295
  };
8832
9296
  this.terminals.set(terminalId, session);
8833
- if (options?.command) {
8834
- this.autoRunCommand(session, options.command);
9297
+ if (checkpoint) {
9298
+ const restored = `${checkpoint.scrollback}\r
9299
+ \x1B[90m--- session restored ---\x1B[0m\r
9300
+ `;
9301
+ session.scrollback.append(restored);
9302
+ session.headless.write(restored);
9303
+ }
9304
+ const commandToRun = options?.command ?? this.claudeResumeCommand(checkpoint, historyMeta, cwd);
9305
+ if (commandToRun) {
9306
+ this.autoRunCommand(session, commandToRun);
8835
9307
  }
8836
9308
  let ids = this.workspaceTerminals.get(workspaceId);
8837
9309
  if (!ids) {
@@ -8840,10 +9312,7 @@ var TerminalPool = class {
8840
9312
  }
8841
9313
  ids.add(terminalId);
8842
9314
  ptyProcess.onData((data) => {
8843
- session.scrollback += data;
8844
- if (session.scrollback.length > MAX_SCROLLBACK_SIZE) {
8845
- session.scrollback = session.scrollback.slice(-MAX_SCROLLBACK_SIZE);
8846
- }
9315
+ session.scrollback.append(data);
8847
9316
  session.headless.write(data);
8848
9317
  session.seq += 1;
8849
9318
  const seq = session.seq;
@@ -8856,9 +9325,10 @@ var TerminalPool = class {
8856
9325
  }
8857
9326
  }
8858
9327
  }
9328
+ this.maybeCheckpointHistory(terminalId, session);
8859
9329
  });
8860
9330
  ptyProcess.onExit(({ exitCode: exitCode2 }) => {
8861
- log.debug("Terminal exited: %s (workspace %s)", terminalId, workspaceId);
9331
+ log2.debug("Terminal exited: %s (workspace %s)", terminalId, workspaceId);
8862
9332
  const explicitlyKilled = !this.terminals.has(terminalId);
8863
9333
  this.terminals.delete(terminalId);
8864
9334
  this.outputListeners.delete(terminalId);
@@ -8875,6 +9345,13 @@ var TerminalPool = class {
8875
9345
  } catch {
8876
9346
  }
8877
9347
  }
9348
+ if (this.historyStore) {
9349
+ if (this.pruneHistoryOnExit.delete(terminalId)) {
9350
+ this.historyStore.removeSession(terminalId);
9351
+ } else if (session.history) {
9352
+ this.checkpointHistoryNow(terminalId, session);
9353
+ }
9354
+ }
8878
9355
  session.headless.dispose();
8879
9356
  const event = {
8880
9357
  terminalId,
@@ -8887,12 +9364,86 @@ var TerminalPool = class {
8887
9364
  try {
8888
9365
  listener(event);
8889
9366
  } catch (err) {
8890
- log.warn("exit listener threw for terminal %s: %s", terminalId, err);
9367
+ log2.warn("exit listener threw for terminal %s: %s", terminalId, err);
8891
9368
  }
8892
9369
  }
8893
9370
  });
8894
9371
  return session;
8895
9372
  }
9373
+ /**
9374
+ * A resumable Claude Code command for a cold-restored terminal, or
9375
+ * `undefined` if this isn't one: the checkpoint's saved command must look
9376
+ * like a plain `claude` invocation (see `claude-resume.ts`) and there must
9377
+ * be a Claude Code session transcript for `cwd`. Scoped to Claude Code
9378
+ * only — its on-disk session layout is documented and stable; other
9379
+ * agents' formats weren't verified for this feature.
9380
+ *
9381
+ * Takes the already boundary-checked `cwd` the new shell is actually
9382
+ * spawning in, not the checkpoint's raw saved cwd: if that saved cwd fell
9383
+ * outside the workspace root and `cwd` fell back to `workspaceRoot`, the
9384
+ * resume lookup must follow, not probe a directory the spawn itself
9385
+ * decided not to trust.
9386
+ */
9387
+ claudeResumeCommand(checkpoint, meta, cwd) {
9388
+ const command = meta?.sessionCommand;
9389
+ if (!checkpoint || !command || !isResumableClaudeCommand(command)) return void 0;
9390
+ const sessionId = findLatestClaudeSessionId(cwd);
9391
+ return sessionId ? buildClaudeResumeCommand(command, sessionId) : void 0;
9392
+ }
9393
+ /**
9394
+ * Checkpoint at most every `HISTORY_CHECKPOINT_INTERVAL_MS`, driven by
9395
+ * output arriving. Deferred off the PTY-output hot path via `setImmediate`:
9396
+ * `serialize()` is synchronous CPU work proportional to the scrollback
9397
+ * size, and running it inline in `onData` would delay delivering this (and
9398
+ * every other terminal's already-pending) output on the daemon's single
9399
+ * event loop — the class of regression issue #676 fixed for a different
9400
+ * code path.
9401
+ */
9402
+ maybeCheckpointHistory(terminalId, session) {
9403
+ if (!this.historyStore || !session.history) return;
9404
+ const now = Date.now();
9405
+ if (now - session.history.lastCheckpointAt < HISTORY_CHECKPOINT_INTERVAL_MS) return;
9406
+ session.history.lastCheckpointAt = now;
9407
+ setImmediate(() => {
9408
+ if (this.terminals.get(terminalId) === session) {
9409
+ this.checkpointHistoryNow(terminalId, session);
9410
+ }
9411
+ });
9412
+ }
9413
+ /**
9414
+ * Serializes the current screen synchronously — the only part of a
9415
+ * checkpoint that must be, since it must run before `headless.dispose()` on
9416
+ * exit — then hands the actual write off to `TerminalHistoryManager`'s async,
9417
+ * non-blocking I/O. The write is tracked in {@link pendingHistoryWrites} so
9418
+ * a daemon shutdown can wait for it rather than exiting mid-write and
9419
+ * losing a session's last checkpoint; `TerminalHistoryManager` logs its own
9420
+ * failures and never rejects, so there is nothing for this method's caller
9421
+ * to await or catch.
9422
+ */
9423
+ checkpointHistoryNow(terminalId, session) {
9424
+ if (!this.historyStore || !session.history) return;
9425
+ const { cols, rows } = session.headless;
9426
+ const { cwd, startedAt, sessionCommand } = session.history;
9427
+ const pending = Promise.all([
9428
+ this.historyStore.writeCheckpoint(terminalId, {
9429
+ scrollback: session.serializeAddon.serialize(),
9430
+ cwd,
9431
+ cols,
9432
+ rows
9433
+ }),
9434
+ this.historyStore.writeMeta(terminalId, {
9435
+ workspaceId: session.workspaceId,
9436
+ cwd,
9437
+ cols,
9438
+ rows,
9439
+ startedAt,
9440
+ checkpointedAt: (/* @__PURE__ */ new Date()).toISOString(),
9441
+ sessionCommand
9442
+ })
9443
+ ]);
9444
+ this.pendingHistoryWrites.add(pending);
9445
+ void pending.finally(() => this.pendingHistoryWrites.delete(pending));
9446
+ }
8896
9447
  /**
8897
9448
  * Auto-run the workspace's initial command inside a freshly spawned PTY,
8898
9449
  * robustly.
@@ -8924,12 +9475,12 @@ var TerminalPool = class {
8924
9475
  const pty = session.pty;
8925
9476
  let cmdFile;
8926
9477
  try {
8927
- cmdFile = join(tmpdir(), `band-autorun-${randomUUID()}.sh`);
9478
+ cmdFile = join3(tmpdir(), `band-autorun-${randomUUID()}.sh`);
8928
9479
  writeFileSync(cmdFile, `${command}
8929
9480
  `, { encoding: "utf-8", mode: 384, flag: "wx" });
8930
9481
  session.autoRunFile = cmdFile;
8931
9482
  } catch (err) {
8932
- log.warn(
9483
+ log2.warn(
8933
9484
  "autoRunCommand: temp-file staging failed (%s); writing command directly",
8934
9485
  err instanceof Error ? err.message : String(err)
8935
9486
  );
@@ -8947,7 +9498,7 @@ var TerminalPool = class {
8947
9498
  try {
8948
9499
  pty.write(sourceLine);
8949
9500
  } catch (err) {
8950
- log.warn("autoRunCommand: failed to inject command line (%s)", err);
9501
+ log2.warn("autoRunCommand: failed to inject command line (%s)", err);
8951
9502
  }
8952
9503
  };
8953
9504
  let dataDisposed = false;
@@ -9085,8 +9636,9 @@ var TerminalPool = class {
9085
9636
  getScrollback(terminalId, lines) {
9086
9637
  const session = this.terminals.get(terminalId);
9087
9638
  if (!session) return null;
9088
- if (lines == null) return session.scrollback;
9089
- const allLines = session.scrollback.split("\n");
9639
+ const scrollback = session.scrollback.toString();
9640
+ if (lines == null) return scrollback;
9641
+ const allLines = scrollback.split("\n");
9090
9642
  return allLines.slice(-lines).join("\n");
9091
9643
  }
9092
9644
  /**
@@ -9129,7 +9681,7 @@ var TerminalPool = class {
9129
9681
  const session = this.terminals.get(terminalId);
9130
9682
  if (!session) return null;
9131
9683
  if (session.scrollback.length === 0) return { data: "", seq: session.seq };
9132
- session.pty.pause();
9684
+ this.holdOutput(terminalId);
9133
9685
  let deathWatch;
9134
9686
  let drainCap;
9135
9687
  try {
@@ -9147,9 +9699,27 @@ var TerminalPool = class {
9147
9699
  } finally {
9148
9700
  if (deathWatch) clearInterval(deathWatch);
9149
9701
  if (drainCap) clearTimeout(drainCap);
9150
- if (this.terminals.get(terminalId) === session) session.pty.resume();
9702
+ if (this.terminals.get(terminalId) === session) this.releaseOutput(terminalId);
9151
9703
  }
9152
9704
  }
9705
+ /**
9706
+ * Stop reading the terminal's PTY until a matching {@link releaseOutput}.
9707
+ * The shell blocks once the kernel's PTY buffer fills, so a flood stops at
9708
+ * its source instead of piling up in memory. Holds nest.
9709
+ */
9710
+ holdOutput(terminalId) {
9711
+ const session = this.terminals.get(terminalId);
9712
+ if (!session) return;
9713
+ session.holds += 1;
9714
+ if (session.holds === 1) session.pty.pause();
9715
+ }
9716
+ /** Undo one {@link holdOutput}; the PTY resumes when the last is released. */
9717
+ releaseOutput(terminalId) {
9718
+ const session = this.terminals.get(terminalId);
9719
+ if (!session || session.holds === 0) return;
9720
+ session.holds -= 1;
9721
+ if (session.holds === 0) session.pty.resume();
9722
+ }
9153
9723
  /**
9154
9724
  * Writes data to a terminal's PTY stdin.
9155
9725
  * Returns false if the terminal is not found.
@@ -9181,7 +9751,7 @@ var TerminalPool = class {
9181
9751
  try {
9182
9752
  snapshot = await this.serialize(terminalId);
9183
9753
  } catch (err) {
9184
- log.error("Failed to serialize terminal %s for replay: %s", terminalId, err);
9754
+ log2.error("Failed to serialize terminal %s for replay: %s", terminalId, err);
9185
9755
  snapshot = { data: "", seq: 0 };
9186
9756
  }
9187
9757
  if (!snapshot) {
@@ -9224,6 +9794,7 @@ var TerminalPool = class {
9224
9794
  kill(terminalId) {
9225
9795
  const session = this.terminals.get(terminalId);
9226
9796
  if (session) {
9797
+ this.pruneHistoryOnExit.add(terminalId);
9227
9798
  session.pty.kill();
9228
9799
  this.terminals.delete(terminalId);
9229
9800
  const set = this.workspaceTerminals.get(session.workspaceId);
@@ -9233,6 +9804,8 @@ var TerminalPool = class {
9233
9804
  this.workspaceTerminals.delete(session.workspaceId);
9234
9805
  }
9235
9806
  }
9807
+ } else {
9808
+ this.historyStore?.removeSession(terminalId);
9236
9809
  }
9237
9810
  }
9238
9811
  /**
@@ -9240,15 +9813,18 @@ var TerminalPool = class {
9240
9813
  */
9241
9814
  killWorkspace(workspaceId) {
9242
9815
  const ids = this.workspaceTerminals.get(workspaceId);
9243
- if (!ids) return;
9244
- for (const terminalId of ids) {
9245
- const session = this.terminals.get(terminalId);
9246
- if (session) {
9247
- session.pty.kill();
9248
- this.terminals.delete(terminalId);
9816
+ if (ids) {
9817
+ for (const terminalId of ids) {
9818
+ const session = this.terminals.get(terminalId);
9819
+ if (session) {
9820
+ this.pruneHistoryOnExit.add(terminalId);
9821
+ session.pty.kill();
9822
+ this.terminals.delete(terminalId);
9823
+ }
9249
9824
  }
9825
+ this.workspaceTerminals.delete(workspaceId);
9250
9826
  }
9251
- this.workspaceTerminals.delete(workspaceId);
9827
+ this.historyStore?.removeSessionsForWorkspace(workspaceId);
9252
9828
  }
9253
9829
  /**
9254
9830
  * Kill every tracked PTY (server shutdown path).
@@ -9261,7 +9837,27 @@ var TerminalPool = class {
9261
9837
  this.workspaceTerminals.clear();
9262
9838
  this.outputListeners.clear();
9263
9839
  }
9840
+ /**
9841
+ * True while a history checkpoint write is still in flight. The daemon's
9842
+ * shutdown polls this alongside its shells' liveness so it never exits
9843
+ * mid-write and loses the last checkpoint a dying session's `onExit`
9844
+ * kicked off (see {@link checkpointHistoryNow}).
9845
+ */
9846
+ hasPendingHistoryWrites() {
9847
+ return this.pendingHistoryWrites.size > 0;
9848
+ }
9264
9849
  };
9850
+ function resolveSafeCwd(candidate, workspaceRoot, label, original) {
9851
+ if (candidate !== workspaceRoot && !candidate.startsWith(workspaceRoot + sep)) {
9852
+ log2.warn("Ignoring %s %s \u2014 resolves outside workspace root %s", label, original, workspaceRoot);
9853
+ return null;
9854
+ }
9855
+ if (!existsSync2(candidate)) {
9856
+ log2.warn("Ignoring %s %s \u2014 directory does not exist", label, original);
9857
+ return null;
9858
+ }
9859
+ return candidate;
9860
+ }
9265
9861
 
9266
9862
  // src/server/infra/terminals/daemon/endpoint.ts
9267
9863
  import { randomBytes } from "node:crypto";
@@ -9271,11 +9867,11 @@ import {
9271
9867
  lstatSync,
9272
9868
  mkdirSync,
9273
9869
  renameSync,
9274
- statSync,
9870
+ statSync as statSync2,
9275
9871
  unlinkSync as unlinkSync2
9276
9872
  } from "node:fs";
9277
9873
  import { connect } from "node:net";
9278
- import { dirname, join as join2 } from "node:path";
9874
+ import { dirname, join as join4 } from "node:path";
9279
9875
  var PROBE_TIMEOUT_MS = 500;
9280
9876
  var PUBLISH_ATTEMPTS = 3;
9281
9877
  function isProvenDead(outcome) {
@@ -9310,10 +9906,10 @@ function probeEndpoint(socketPath) {
9310
9906
  });
9311
9907
  }
9312
9908
  function privateBindPath(socketPath) {
9313
- return join2(dirname(socketPath), `.p${randomBytes(5).toString("hex")}`);
9909
+ return join4(dirname(socketPath), `.p${randomBytes(5).toString("hex")}`);
9314
9910
  }
9315
9911
  async function publishEndpoint(boundPath, canonicalPath, supersede2) {
9316
- const identity = entryIdentity(boundPath, statSync);
9912
+ const identity = entryIdentity(boundPath, statSync2);
9317
9913
  if (!identity) throw new Error(`Cannot stat the bound daemon socket at ${boundPath}`);
9318
9914
  for (let attempt = 0; attempt < PUBLISH_ATTEMPTS; attempt++) {
9319
9915
  try {
@@ -9370,7 +9966,7 @@ function sameEntry(a, b) {
9370
9966
  function confirmPublished(canonicalPath, identity, superseded) {
9371
9967
  let published;
9372
9968
  try {
9373
- const stats = statSync(canonicalPath, { bigint: true });
9969
+ const stats = statSync2(canonicalPath, { bigint: true });
9374
9970
  published = { dev: stats.dev, ino: stats.ino };
9375
9971
  } catch (err) {
9376
9972
  return errorCode(err) === "ENOENT" ? { status: "lost" } : { status: "inconclusive" };
@@ -9379,7 +9975,7 @@ function confirmPublished(canonicalPath, identity, superseded) {
9379
9975
  }
9380
9976
  function endpointOwnership(canonicalPath, owned) {
9381
9977
  try {
9382
- const stats = statSync(canonicalPath, { bigint: true });
9978
+ const stats = statSync2(canonicalPath, { bigint: true });
9383
9979
  return stats.dev === owned.dev && stats.ino === owned.ino ? "owned" : "lost";
9384
9980
  } catch (err) {
9385
9981
  return errorCode(err) === "ENOENT" ? "lost" : "indeterminate";
@@ -9407,36 +10003,37 @@ function errorCode(err) {
9407
10003
 
9408
10004
  // src/server/infra/terminals/daemon/protocol.ts
9409
10005
  import { createHash } from "node:crypto";
9410
- import { basename, dirname as dirname2, join as join3 } from "node:path";
10006
+ import { basename, dirname as dirname2, join as join5 } from "node:path";
9411
10007
  var PROTOCOL_VERSION = 1;
9412
10008
  var EXIT_ENDPOINT_OCCUPIED = 20;
9413
10009
  var EXIT_ENDPOINT_UNAVAILABLE = 21;
10010
+ var EXIT_NODE_PTY_UNAVAILABLE = 22;
9414
10011
  var ENDPOINT_LOST_ERROR = "Terminal daemon no longer owns its endpoint";
9415
10012
  var MAX_SOCKET_PATH_BYTES = 103;
9416
10013
  function daemonPaths(runDir2, version = PROTOCOL_VERSION) {
9417
- const inRunDir = join3(runDir2, `terminal-daemon-v${version}.sock`);
9418
- const socket = Buffer.byteLength(inRunDir) <= MAX_SOCKET_PATH_BYTES ? inRunDir : join3(
10014
+ const inRunDir = join5(runDir2, `terminal-daemon-v${version}.sock`);
10015
+ const socket = Buffer.byteLength(inRunDir) <= MAX_SOCKET_PATH_BYTES ? inRunDir : join5(
9419
10016
  shortSocketDir(),
9420
10017
  `td-${createHash("sha256").update(runDir2).digest("hex").slice(0, 16)}-v${version}.sock`
9421
10018
  );
9422
10019
  return {
9423
10020
  runDir: runDir2,
9424
10021
  socket,
9425
- token: join3(runDir2, `terminal-daemon-v${version}.token`),
9426
- pid: join3(runDir2, `terminal-daemon-v${version}.pid`),
9427
- log: join3(runDir2, "terminal-daemon.log")
10022
+ token: join5(runDir2, `terminal-daemon-v${version}.token`),
10023
+ pid: join5(runDir2, `terminal-daemon-v${version}.pid`),
10024
+ log: join5(runDir2, "terminal-daemon.log")
9428
10025
  };
9429
10026
  }
9430
10027
  function retiredDaemonPaths(paths, tag) {
9431
10028
  return {
9432
10029
  ...paths,
9433
- socket: join3(dirname2(paths.socket), `.r${tag}`),
10030
+ socket: join5(dirname2(paths.socket), `.r${tag}`),
9434
10031
  token: paths.token.replace(/\.token$/, `.retired-${tag}.token`),
9435
10032
  pid: paths.pid.replace(/\.pid$/, `.retired-${tag}.pid`)
9436
10033
  };
9437
10034
  }
9438
10035
  function shortSocketDir() {
9439
- return join3("/tmp", `band-${process.getuid?.() ?? "user"}`);
10036
+ return join5("/tmp", `band-${process.getuid?.() ?? "user"}`);
9440
10037
  }
9441
10038
  function writeFrame(socket, message) {
9442
10039
  socket.write(`${JSON.stringify(message)}
@@ -9483,18 +10080,26 @@ function readFrames(socket, onFrame, maxLineBytes = 64 * 1024 * 1024) {
9483
10080
  }
9484
10081
 
9485
10082
  // src/server/infra/terminals/daemon/daemon-server.ts
9486
- var log2 = createLogger("terminal-daemon");
10083
+ var log3 = createLogger("terminal-daemon");
9487
10084
  var HELLO_TIMEOUT_MS = 5e3;
9488
10085
  var WATCHDOG_INTERVAL_MS = 2e3;
9489
10086
  var SHUTDOWN_GRACE_MS = 2e3;
9490
10087
  var INITIAL_ADOPTION_MS = 2 * 6e4;
9491
10088
  var MAX_STREAM_BACKLOG_BYTES = 64 * 1024 * 1024;
10089
+ var STREAM_HOLD_BYTES = 128 * 1024;
10090
+ var SMALL_SESSION_CHARS = 4 * 1024;
9492
10091
  async function runDaemon(options) {
9493
10092
  const { paths, buildId, supersede: supersede2 } = options;
10093
+ try {
10094
+ await preloadNodePty();
10095
+ } catch (err) {
10096
+ log3.error({ err }, "terminal daemon could not load its native module (node-pty); exiting");
10097
+ return EXIT_NODE_PTY_UNAVAILABLE;
10098
+ }
9494
10099
  ensurePrivateDir(paths.runDir);
9495
10100
  ensurePrivateDir(dirname3(paths.socket));
9496
10101
  const token = randomBytes2(32).toString("hex");
9497
- const pool = new TerminalPool();
10102
+ const pool = new TerminalPool({ historyDir: join6(dirname3(paths.runDir), "terminal-history") });
9498
10103
  const clients = /* @__PURE__ */ new Map();
9499
10104
  let shuttingDown = false;
9500
10105
  let openConnections = 0;
@@ -9526,13 +10131,13 @@ async function runDaemon(options) {
9526
10131
  retired = null;
9527
10132
  }
9528
10133
  if (outcome.status !== "published") {
9529
- log2.warn({ outcome: outcome.status }, "terminal daemon could not publish its endpoint");
10134
+ log3.warn({ outcome: outcome.status }, "terminal daemon could not publish its endpoint");
9530
10135
  await closeServer(server);
9531
10136
  return outcome.status === "occupied" ? EXIT_ENDPOINT_OCCUPIED : EXIT_ENDPOINT_UNAVAILABLE;
9532
10137
  }
9533
10138
  const identity = outcome.identity;
9534
10139
  if (retired) {
9535
- log2.info({ retired: retired.socket }, "terminal daemon superseded a daemon of another build");
10140
+ log3.info({ retired: retired.socket }, "terminal daemon superseded a daemon of another build");
9536
10141
  }
9537
10142
  let probingRetired = false;
9538
10143
  writePrivateFile(paths.token, token);
@@ -9545,10 +10150,11 @@ async function runDaemon(options) {
9545
10150
  entry: options.entry
9546
10151
  };
9547
10152
  writePrivateFile(paths.pid, JSON.stringify(pidRecord));
9548
- log2.info({ pid: process.pid, socket: paths.socket, buildId }, "terminal daemon ready");
10153
+ log3.info({ pid: process.pid, socket: paths.socket, buildId }, "terminal daemon ready");
9549
10154
  pool.onExit((event) => {
9550
10155
  for (const client of clients.values()) {
9551
10156
  client.attached.delete(event.terminalId);
10157
+ client.held.delete(event.terminalId);
9552
10158
  send(client, "stream", { t: "exit", ...event });
9553
10159
  }
9554
10160
  reevaluateIdle();
@@ -9560,7 +10166,7 @@ async function runDaemon(options) {
9560
10166
  }
9561
10167
  if (!endpointLost && endpointOwnership(paths.socket, identity) === "lost") {
9562
10168
  endpointLost = true;
9563
- log2.warn({ sessions: pool.size }, "terminal daemon lost its endpoint; draining");
10169
+ log3.warn({ sessions: pool.size }, "terminal daemon lost its endpoint; draining");
9564
10170
  reevaluateIdle();
9565
10171
  }
9566
10172
  if (retired && !probingRetired) {
@@ -9571,7 +10177,7 @@ async function runDaemon(options) {
9571
10177
  if (!isProvenDead(probe) || retired !== target) return;
9572
10178
  removeRetiredFiles(target);
9573
10179
  retired = null;
9574
- log2.info({ retired: target.socket }, "superseded terminal daemon exited");
10180
+ log3.info({ retired: target.socket }, "superseded terminal daemon exited");
9575
10181
  reevaluateIdle();
9576
10182
  });
9577
10183
  }
@@ -9604,9 +10210,9 @@ async function runDaemon(options) {
9604
10210
  if (shuttingDown) return;
9605
10211
  shuttingDown = true;
9606
10212
  if (retired) {
9607
- log2.warn({ retired: retired.socket }, "exiting while a superseded daemon is still running");
10213
+ log3.warn({ retired: retired.socket }, "exiting while a superseded daemon is still running");
9608
10214
  }
9609
- log2.info({ reason, sessions: pool.size }, "terminal daemon shutting down");
10215
+ log3.info({ reason, sessions: pool.size }, "terminal daemon shutting down");
9610
10216
  clearInterval(watchdog);
9611
10217
  if (adoptionTimer) clearTimeout(adoptionTimer);
9612
10218
  const shells = pool.listAll().map((entry) => entry.pid);
@@ -9617,7 +10223,7 @@ async function runDaemon(options) {
9617
10223
  }
9618
10224
  const deadline = Date.now() + SHUTDOWN_GRACE_MS;
9619
10225
  const waitForShells = setInterval(() => {
9620
- if (Date.now() < deadline && shells.some(isAlive)) return;
10226
+ if (Date.now() < deadline && (shells.some(isAlive) || pool.hasPendingHistoryWrites())) return;
9621
10227
  clearInterval(waitForShells);
9622
10228
  process.exit(0);
9623
10229
  }, 50);
@@ -9655,7 +10261,7 @@ async function runDaemon(options) {
9655
10261
  return;
9656
10262
  }
9657
10263
  if (hello.buildId !== buildId) {
9658
- log2.info({ daemon: buildId, server: hello.buildId }, "server build differs from daemon");
10264
+ log3.info({ daemon: buildId, server: hello.buildId }, "server build differs from daemon");
9659
10265
  }
9660
10266
  role = hello.role;
9661
10267
  client = registerClient(hello.clientId, role, socket);
@@ -9681,7 +10287,14 @@ async function runDaemon(options) {
9681
10287
  function registerClient(clientId, role, socket) {
9682
10288
  let client = clients.get(clientId);
9683
10289
  if (!client) {
9684
- client = { id: clientId, control: null, stream: null, attached: /* @__PURE__ */ new Map() };
10290
+ client = {
10291
+ id: clientId,
10292
+ control: null,
10293
+ stream: null,
10294
+ attached: /* @__PURE__ */ new Map(),
10295
+ held: /* @__PURE__ */ new Set(),
10296
+ sentSinceEmpty: /* @__PURE__ */ new Map()
10297
+ };
9685
10298
  clients.set(clientId, client);
9686
10299
  }
9687
10300
  if (client[role]) return null;
@@ -9698,6 +10311,7 @@ async function runDaemon(options) {
9698
10311
  clients.delete(client.id);
9699
10312
  for (const unsubscribe of client.attached.values()) unsubscribe();
9700
10313
  client.attached.clear();
10314
+ releaseHolds(client);
9701
10315
  client.control?.destroy();
9702
10316
  client.stream?.destroy();
9703
10317
  if (clients.size === 0) retirementRequested = true;
@@ -9707,12 +10321,31 @@ async function runDaemon(options) {
9707
10321
  const socket = client[role];
9708
10322
  if (!socket || socket.destroyed) return;
9709
10323
  if (socket.writableLength > MAX_STREAM_BACKLOG_BYTES) {
9710
- log2.warn({ clientId: client.id }, "server stopped reading; dropping its connection");
10324
+ log3.warn({ clientId: client.id }, "server stopped reading; dropping its connection");
9711
10325
  dropClient(client);
9712
10326
  return;
9713
10327
  }
9714
10328
  writeFrame(socket, message);
9715
10329
  }
10330
+ function sendOutput(client, terminalId, seq, d) {
10331
+ const socket = client.stream;
10332
+ if (socket && socket.writableLength === 0) client.sentSinceEmpty.clear();
10333
+ send(client, "stream", { t: "data", id: terminalId, seq, d });
10334
+ if (!socket || socket.destroyed || clients.get(client.id) !== client) return;
10335
+ const sent = (client.sentSinceEmpty.get(terminalId) ?? 0) + d.length;
10336
+ client.sentSinceEmpty.set(terminalId, sent);
10337
+ if (socket.writableLength < STREAM_HOLD_BYTES || sent <= SMALL_SESSION_CHARS || client.held.has(terminalId)) {
10338
+ return;
10339
+ }
10340
+ client.held.add(terminalId);
10341
+ pool.holdOutput(terminalId);
10342
+ if (client.held.size === 1) socket.once("drain", () => releaseHolds(client));
10343
+ }
10344
+ function releaseHolds(client) {
10345
+ for (const terminalId of client.held) pool.releaseOutput(terminalId);
10346
+ client.held.clear();
10347
+ client.sentSinceEmpty.clear();
10348
+ }
9716
10349
  function handleControl(client, frame) {
9717
10350
  const message = frame;
9718
10351
  if (!hasValidIds(frame)) {
@@ -9750,6 +10383,7 @@ async function runDaemon(options) {
9750
10383
  const unsubscribe = client.attached.get(message.terminalId);
9751
10384
  client.attached.delete(message.terminalId);
9752
10385
  unsubscribe?.();
10386
+ if (client.held.delete(message.terminalId)) pool.releaseOutput(message.terminalId);
9753
10387
  return;
9754
10388
  }
9755
10389
  case "shutdown":
@@ -9807,7 +10441,7 @@ async function runDaemon(options) {
9807
10441
  const attached = await pool.attach(
9808
10442
  terminalId,
9809
10443
  dims,
9810
- (d, seq) => send(client, "stream", { t: "data", id: terminalId, seq, d })
10444
+ (d, seq) => sendOutput(client, terminalId, seq, d)
9811
10445
  );
9812
10446
  if (!attached) return null;
9813
10447
  if (client.attached.has(terminalId) || clients.get(client.id) !== client) {
@@ -9855,7 +10489,7 @@ function writePrivateFile(path, content) {
9855
10489
  function copyPrivateFile(from, to) {
9856
10490
  let content;
9857
10491
  try {
9858
- content = readFileSync(from, "utf8");
10492
+ content = readFileSync2(from, "utf8");
9859
10493
  } catch {
9860
10494
  return;
9861
10495
  }
@@ -9890,12 +10524,12 @@ function closeServer(server) {
9890
10524
  }
9891
10525
 
9892
10526
  // terminal-daemon.ts
9893
- var log3 = createLogger("terminal-daemon");
10527
+ var log4 = createLogger("terminal-daemon");
9894
10528
  process.on("uncaughtException", (err) => {
9895
- log3.error({ err }, "uncaught exception in terminal daemon");
10529
+ log4.error({ err }, "uncaught exception in terminal daemon");
9896
10530
  });
9897
10531
  process.on("unhandledRejection", (err) => {
9898
- log3.error({ err }, "unhandled rejection in terminal daemon");
10532
+ log4.error({ err }, "unhandled rejection in terminal daemon");
9899
10533
  });
9900
10534
  var { values } = parseArgs({
9901
10535
  options: {
@@ -9906,12 +10540,12 @@ var { values } = parseArgs({
9906
10540
  });
9907
10541
  var runDir = values["run-dir"];
9908
10542
  if (!runDir) {
9909
- log3.error("terminal daemon needs --run-dir");
10543
+ log4.error("terminal daemon needs --run-dir");
9910
10544
  process.exit(2);
9911
10545
  }
9912
10546
  var supersede = values.supersede?.match(/^(\d+):(\d+)$/);
9913
10547
  if (values.supersede !== void 0 && !supersede) {
9914
- log3.error({ supersede: values.supersede }, "terminal daemon got a malformed --supersede");
10548
+ log4.error({ supersede: values.supersede }, "terminal daemon got a malformed --supersede");
9915
10549
  process.exit(2);
9916
10550
  }
9917
10551
  var exitCode = await runDaemon({