termdock 1.4.179 → 1.4.180

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 (329) hide show
  1. package/.desktop-dist/main.js +1 -1
  2. package/dist/client/assets/{App-DXq9kwY5.js → App-DBds0RoW.js} +35 -35
  3. package/dist/client/assets/App-DBds0RoW.js.br +0 -0
  4. package/dist/client/assets/App-DBds0RoW.js.gz +0 -0
  5. package/dist/client/assets/{ChangeWalkthroughPanel-DWUBYx6Q.js → ChangeWalkthroughPanel-DonkfMV2.js} +2 -2
  6. package/dist/client/assets/ChangeWalkthroughPanel-DonkfMV2.js.br +0 -0
  7. package/dist/client/assets/ChangeWalkthroughPanel-DonkfMV2.js.gz +0 -0
  8. package/dist/client/assets/{DagPlayground-DyczrcHM.js → DagPlayground-CYL8vhaU.js} +1 -1
  9. package/dist/client/assets/DagPlayground-CYL8vhaU.js.br +0 -0
  10. package/dist/client/assets/DagPlayground-CYL8vhaU.js.gz +0 -0
  11. package/dist/client/assets/{DiffLab-D5wb-H7y.js → DiffLab-COUjebir.js} +1 -1
  12. package/dist/client/assets/DiffLab-COUjebir.js.br +0 -0
  13. package/dist/client/assets/DiffLab-COUjebir.js.gz +0 -0
  14. package/dist/client/assets/{DiffReview-CVIz-B5T.js → DiffReview-DqiRXomQ.js} +1 -1
  15. package/dist/client/assets/DiffReview-DqiRXomQ.js.br +0 -0
  16. package/dist/client/assets/DiffReview-DqiRXomQ.js.gz +0 -0
  17. package/dist/client/assets/{DiffReviewLab-99hTNRaj.js → DiffReviewLab-Aqib8Qr6.js} +1 -1
  18. package/dist/client/assets/DiffReviewLab-Aqib8Qr6.js.br +0 -0
  19. package/dist/client/assets/DiffReviewLab-Aqib8Qr6.js.gz +0 -0
  20. package/dist/client/assets/{DiffViewer-BPor2_7o.js → DiffViewer-KR2GhX72.js} +1 -1
  21. package/dist/client/assets/DiffViewer-KR2GhX72.js.br +0 -0
  22. package/dist/client/assets/DiffViewer-KR2GhX72.js.gz +0 -0
  23. package/dist/client/assets/{ModelPreview-DpImj4vY.js → ModelPreview-Bo6giTPm.js} +1 -1
  24. package/dist/client/assets/ModelPreview-Bo6giTPm.js.br +0 -0
  25. package/dist/client/assets/ModelPreview-Bo6giTPm.js.gz +0 -0
  26. package/dist/client/assets/RightSidebar-rROjRuPY.js +1678 -0
  27. package/dist/client/assets/RightSidebar-rROjRuPY.js.br +0 -0
  28. package/dist/client/assets/RightSidebar-rROjRuPY.js.gz +0 -0
  29. package/dist/client/assets/{abnfDiagram-VCTEODGH-CNWmFVMh.js → abnfDiagram-VCTEODGH-m85vHRkF.js} +1 -1
  30. package/dist/client/assets/abnfDiagram-VCTEODGH-m85vHRkF.js.br +0 -0
  31. package/dist/client/assets/abnfDiagram-VCTEODGH-m85vHRkF.js.gz +0 -0
  32. package/dist/client/assets/app-Djvvt1Mi.js +34 -0
  33. package/dist/client/assets/app-Djvvt1Mi.js.br +0 -0
  34. package/dist/client/assets/app-Djvvt1Mi.js.gz +0 -0
  35. package/dist/client/assets/{arc-Z8mcHjh7.js → arc-DmZ3EVhj.js} +1 -1
  36. package/dist/client/assets/arc-DmZ3EVhj.js.br +0 -0
  37. package/dist/client/assets/arc-DmZ3EVhj.js.gz +0 -0
  38. package/dist/client/assets/{architectureDiagram-5GKGNRK7-DuxbAeFP.js → architectureDiagram-5GKGNRK7-C8yGaNGM.js} +1 -1
  39. package/dist/client/assets/architectureDiagram-5GKGNRK7-C8yGaNGM.js.br +0 -0
  40. package/dist/client/assets/architectureDiagram-5GKGNRK7-C8yGaNGM.js.gz +0 -0
  41. package/dist/client/assets/{blockDiagram-I7D4REHJ-SxAFw0An.js → blockDiagram-I7D4REHJ-CZhh__cR.js} +1 -1
  42. package/dist/client/assets/blockDiagram-I7D4REHJ-CZhh__cR.js.br +0 -0
  43. package/dist/client/assets/blockDiagram-I7D4REHJ-CZhh__cR.js.gz +0 -0
  44. package/dist/client/assets/{c4Diagram-7LVT6UL2-CcRdiWo7.js → c4Diagram-7LVT6UL2-py7O2OOO.js} +1 -1
  45. package/dist/client/assets/c4Diagram-7LVT6UL2-py7O2OOO.js.br +0 -0
  46. package/dist/client/assets/c4Diagram-7LVT6UL2-py7O2OOO.js.gz +0 -0
  47. package/dist/client/assets/channel-BnKOV34C.js +1 -0
  48. package/dist/client/assets/{chunk-2Q5K7J3B-DJ_qzvZZ.js → chunk-2Q5K7J3B-SXGoQcYW.js} +1 -1
  49. package/dist/client/assets/{chunk-5VM5RSS4-l3H0C2ci.js → chunk-5VM5RSS4-1ZVyPSGv.js} +1 -1
  50. package/dist/client/assets/{chunk-F27PBJKO-B7xASv8n.js → chunk-F27PBJKO-DkIqnjYj.js} +1 -1
  51. package/dist/client/assets/chunk-F27PBJKO-DkIqnjYj.js.br +0 -0
  52. package/dist/client/assets/chunk-F27PBJKO-DkIqnjYj.js.gz +0 -0
  53. package/dist/client/assets/{chunk-IMKFNOWR-Wg5gR7sZ.js → chunk-IMKFNOWR-CLS_EByq.js} +1 -1
  54. package/dist/client/assets/chunk-IMKFNOWR-CLS_EByq.js.br +0 -0
  55. package/dist/client/assets/chunk-IMKFNOWR-CLS_EByq.js.gz +0 -0
  56. package/dist/client/assets/{chunk-JWPE2WC7-BlXUS79m.js → chunk-JWPE2WC7-8LtK4UYW.js} +1 -1
  57. package/dist/client/assets/{chunk-POPQ4Y6H-CU38G8hb.js → chunk-POPQ4Y6H-D1PhOQEv.js} +1 -1
  58. package/dist/client/assets/{chunk-SVP7TREG-D-yZlXqX.js → chunk-SVP7TREG-cVWIfR_4.js} +1 -1
  59. package/dist/client/assets/chunk-SVP7TREG-cVWIfR_4.js.br +0 -0
  60. package/dist/client/assets/chunk-SVP7TREG-cVWIfR_4.js.gz +0 -0
  61. package/dist/client/assets/{chunk-TICWLB2K-DrOYmcBB.js → chunk-TICWLB2K-BiO8AIZ7.js} +1 -1
  62. package/dist/client/assets/chunk-TICWLB2K-BiO8AIZ7.js.br +0 -0
  63. package/dist/client/assets/chunk-TICWLB2K-BiO8AIZ7.js.gz +0 -0
  64. package/dist/client/assets/{chunk-XXDRQBXY-BbsHtVFa.js → chunk-XXDRQBXY-CwP0rAj8.js} +1 -1
  65. package/dist/client/assets/classDiagram-ZZMXUADV-CZ5ElqWa.js +1 -0
  66. package/dist/client/assets/classDiagram-v2-VYDZK3BY-CZ5ElqWa.js +1 -0
  67. package/dist/client/assets/{cose-bilkent-JH36ORCC-_wKUNL8T.js → cose-bilkent-JH36ORCC-Dv9GK27H.js} +1 -1
  68. package/dist/client/assets/cose-bilkent-JH36ORCC-Dv9GK27H.js.br +0 -0
  69. package/dist/client/assets/cose-bilkent-JH36ORCC-Dv9GK27H.js.gz +0 -0
  70. package/dist/client/assets/{cynefin-OW5HDTMX-CPr--Wnc.js → cynefin-OW5HDTMX-DDI6luT6.js} +1 -1
  71. package/dist/client/assets/cynefin-OW5HDTMX-DDI6luT6.js.br +0 -0
  72. package/dist/client/assets/cynefin-OW5HDTMX-DDI6luT6.js.gz +0 -0
  73. package/dist/client/assets/{cynefinDiagram-5FMLGOSQ-5ygpPOWT.js → cynefinDiagram-5FMLGOSQ-DQpaBQcE.js} +1 -1
  74. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-DQpaBQcE.js.br +0 -0
  75. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-DQpaBQcE.js.gz +0 -0
  76. package/dist/client/assets/{dagre-GXQ25YYZ-Cvx65nHO.js → dagre-GXQ25YYZ-CZ-1rzmK.js} +1 -1
  77. package/dist/client/assets/dagre-GXQ25YYZ-CZ-1rzmK.js.br +0 -0
  78. package/dist/client/assets/dagre-GXQ25YYZ-CZ-1rzmK.js.gz +0 -0
  79. package/dist/client/assets/{diagram-S7CK7UJ4-Dw5cp_BA.js → diagram-S7CK7UJ4-DeYvGv1c.js} +1 -1
  80. package/dist/client/assets/diagram-S7CK7UJ4-DeYvGv1c.js.br +0 -0
  81. package/dist/client/assets/diagram-S7CK7UJ4-DeYvGv1c.js.gz +0 -0
  82. package/dist/client/assets/{diagram-UQ7AKVKN-D8BZ5Tp3.js → diagram-UQ7AKVKN-BaYQC1t6.js} +1 -1
  83. package/dist/client/assets/diagram-UQ7AKVKN-BaYQC1t6.js.br +0 -0
  84. package/dist/client/assets/diagram-UQ7AKVKN-BaYQC1t6.js.gz +0 -0
  85. package/dist/client/assets/{diagram-VSXAHHWV-BxJD7ZWH.js → diagram-VSXAHHWV-B517BnK0.js} +1 -1
  86. package/dist/client/assets/diagram-VSXAHHWV-B517BnK0.js.br +0 -0
  87. package/dist/client/assets/diagram-VSXAHHWV-B517BnK0.js.gz +0 -0
  88. package/dist/client/assets/{diagram-VX7I27RA-CvzlU0bI.js → diagram-VX7I27RA-DyjVlDcv.js} +1 -1
  89. package/dist/client/assets/diagram-VX7I27RA-DyjVlDcv.js.br +0 -0
  90. package/dist/client/assets/diagram-VX7I27RA-DyjVlDcv.js.gz +0 -0
  91. package/dist/client/assets/{diagram-Z3DM3KII-Be4HdFlL.js → diagram-Z3DM3KII-Cy9JXHOz.js} +1 -1
  92. package/dist/client/assets/diagram-Z3DM3KII-Cy9JXHOz.js.br +0 -0
  93. package/dist/client/assets/diagram-Z3DM3KII-Cy9JXHOz.js.gz +0 -0
  94. package/dist/client/assets/{ebnfDiagram-PWID7BFC-C_wrrPjF.js → ebnfDiagram-PWID7BFC-xvEH045b.js} +1 -1
  95. package/dist/client/assets/ebnfDiagram-PWID7BFC-xvEH045b.js.br +0 -0
  96. package/dist/client/assets/ebnfDiagram-PWID7BFC-xvEH045b.js.gz +0 -0
  97. package/dist/client/assets/{erDiagram-RLTQ6QDP-IHyLgV6M.js → erDiagram-RLTQ6QDP-BTJDgwKq.js} +1 -1
  98. package/dist/client/assets/erDiagram-RLTQ6QDP-BTJDgwKq.js.br +0 -0
  99. package/dist/client/assets/erDiagram-RLTQ6QDP-BTJDgwKq.js.gz +0 -0
  100. package/dist/client/assets/{flowDiagram-HODETNUW-CpfW88Uc.js → flowDiagram-HODETNUW-6pq1SF-S.js} +1 -1
  101. package/dist/client/assets/flowDiagram-HODETNUW-6pq1SF-S.js.br +0 -0
  102. package/dist/client/assets/flowDiagram-HODETNUW-6pq1SF-S.js.gz +0 -0
  103. package/dist/client/assets/{ganttDiagram-EL5Y4UJY-CsbQ6KLb.js → ganttDiagram-EL5Y4UJY-DS_l5v9m.js} +1 -1
  104. package/dist/client/assets/ganttDiagram-EL5Y4UJY-DS_l5v9m.js.br +0 -0
  105. package/dist/client/assets/ganttDiagram-EL5Y4UJY-DS_l5v9m.js.gz +0 -0
  106. package/dist/client/assets/{gestureArbiter-CJQ8K48V.js → gestureArbiter-FtwbRpdp.js} +1 -1
  107. package/dist/client/assets/{gestureArbiter-CJQ8K48V.js.br → gestureArbiter-FtwbRpdp.js.br} +0 -0
  108. package/dist/client/assets/gestureArbiter-FtwbRpdp.js.gz +0 -0
  109. package/dist/client/assets/{gitGraphDiagram-WWUBYQGX-DJZqSGtH.js → gitGraphDiagram-WWUBYQGX-DEGFo3aa.js} +1 -1
  110. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-DEGFo3aa.js.br +0 -0
  111. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-DEGFo3aa.js.gz +0 -0
  112. package/dist/client/assets/{infoDiagram-27XIBGKW-D6sSgR2Y.js → infoDiagram-27XIBGKW-CFVSyJdD.js} +1 -1
  113. package/dist/client/assets/{ishikawaDiagram-5VMMS53U-BJJSUXep.js → ishikawaDiagram-5VMMS53U-_YX0U_wu.js} +1 -1
  114. package/dist/client/assets/ishikawaDiagram-5VMMS53U-_YX0U_wu.js.br +0 -0
  115. package/dist/client/assets/ishikawaDiagram-5VMMS53U-_YX0U_wu.js.gz +0 -0
  116. package/dist/client/assets/{journeyDiagram-3NMN7TZE-ou1XS2DP.js → journeyDiagram-3NMN7TZE-DCujswss.js} +1 -1
  117. package/dist/client/assets/journeyDiagram-3NMN7TZE-DCujswss.js.br +0 -0
  118. package/dist/client/assets/journeyDiagram-3NMN7TZE-DCujswss.js.gz +0 -0
  119. package/dist/client/assets/{kanban-definition-UXKFOSKX-BFQGYQzd.js → kanban-definition-UXKFOSKX-DC6lqIBi.js} +1 -1
  120. package/dist/client/assets/kanban-definition-UXKFOSKX-DC6lqIBi.js.br +0 -0
  121. package/dist/client/assets/kanban-definition-UXKFOSKX-DC6lqIBi.js.gz +0 -0
  122. package/dist/client/assets/{layout-zUU3xcam.js → layout-D_hlL0MC.js} +1 -1
  123. package/dist/client/assets/layout-D_hlL0MC.js.br +0 -0
  124. package/dist/client/assets/layout-D_hlL0MC.js.gz +0 -0
  125. package/dist/client/assets/{linear-CYwYQI2I.js → linear-BxpjJ2yt.js} +1 -1
  126. package/dist/client/assets/linear-BxpjJ2yt.js.br +0 -0
  127. package/dist/client/assets/linear-BxpjJ2yt.js.gz +0 -0
  128. package/dist/client/assets/{mermaid.core-91Llsw5j.js → mermaid.core-BRLYB1Uj.js} +5 -5
  129. package/dist/client/assets/mermaid.core-BRLYB1Uj.js.br +0 -0
  130. package/dist/client/assets/mermaid.core-BRLYB1Uj.js.gz +0 -0
  131. package/dist/client/assets/{mindmap-definition-YA3MSWOX-RWG074lb.js → mindmap-definition-YA3MSWOX-BF2f-Z54.js} +1 -1
  132. package/dist/client/assets/mindmap-definition-YA3MSWOX-BF2f-Z54.js.br +0 -0
  133. package/dist/client/assets/mindmap-definition-YA3MSWOX-BF2f-Z54.js.gz +0 -0
  134. package/dist/client/assets/{passwordBootstrap-DRknuNUN.js → passwordBootstrap-hj2Lcgoj.js} +1 -1
  135. package/dist/client/assets/passwordBootstrap-hj2Lcgoj.js.br +0 -0
  136. package/dist/client/assets/passwordBootstrap-hj2Lcgoj.js.gz +0 -0
  137. package/dist/client/assets/{pegDiagram-XKGWAZYB-Dyh2rzGS.js → pegDiagram-XKGWAZYB-FxHPBhCy.js} +1 -1
  138. package/dist/client/assets/pegDiagram-XKGWAZYB-FxHPBhCy.js.br +0 -0
  139. package/dist/client/assets/pegDiagram-XKGWAZYB-FxHPBhCy.js.gz +0 -0
  140. package/dist/client/assets/{pieDiagram-E7YTZNPT-CL3UcUfh.js → pieDiagram-E7YTZNPT-DqAcArGH.js} +1 -1
  141. package/dist/client/assets/pieDiagram-E7YTZNPT-DqAcArGH.js.br +0 -0
  142. package/dist/client/assets/pieDiagram-E7YTZNPT-DqAcArGH.js.gz +0 -0
  143. package/dist/client/assets/{quadrantDiagram-AXDQQJYC-DOkejMel.js → quadrantDiagram-AXDQQJYC-31lk30-Y.js} +1 -1
  144. package/dist/client/assets/quadrantDiagram-AXDQQJYC-31lk30-Y.js.br +0 -0
  145. package/dist/client/assets/quadrantDiagram-AXDQQJYC-31lk30-Y.js.gz +0 -0
  146. package/dist/client/assets/{railroadDiagram-O6MQD6OU-BC780Uh3.js → railroadDiagram-O6MQD6OU-C-Jt17Wl.js} +1 -1
  147. package/dist/client/assets/railroadDiagram-O6MQD6OU-C-Jt17Wl.js.br +0 -0
  148. package/dist/client/assets/railroadDiagram-O6MQD6OU-C-Jt17Wl.js.gz +0 -0
  149. package/dist/client/assets/{referenceLongPress-Dlc0425_.js → referenceLongPress-BPFSnCDQ.js} +1 -1
  150. package/dist/client/assets/referenceLongPress-BPFSnCDQ.js.br +0 -0
  151. package/dist/client/assets/referenceLongPress-BPFSnCDQ.js.gz +0 -0
  152. package/dist/client/assets/{requirementDiagram-BXWQKSXE-CwCGr0qR.js → requirementDiagram-BXWQKSXE-DdrbsuCJ.js} +1 -1
  153. package/dist/client/assets/requirementDiagram-BXWQKSXE-DdrbsuCJ.js.br +0 -0
  154. package/dist/client/assets/requirementDiagram-BXWQKSXE-DdrbsuCJ.js.gz +0 -0
  155. package/dist/client/assets/{sankeyDiagram-P5KCCOFB-CYDYBwJQ.js → sankeyDiagram-P5KCCOFB-CZjs9KFo.js} +1 -1
  156. package/dist/client/assets/sankeyDiagram-P5KCCOFB-CZjs9KFo.js.br +0 -0
  157. package/dist/client/assets/sankeyDiagram-P5KCCOFB-CZjs9KFo.js.gz +0 -0
  158. package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-DhHsZi3K.js → sequenceDiagram-WJ2MYXX4-CkD1f6v4.js} +1 -1
  159. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-CkD1f6v4.js.br +0 -0
  160. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-CkD1f6v4.js.gz +0 -0
  161. package/dist/client/assets/{sizeCapture-INFHLROL-4oUXWvYA.js → sizeCapture-INFHLROL-BMuKV0gL.js} +1 -1
  162. package/dist/client/assets/sizeCapture-INFHLROL-BMuKV0gL.js.br +0 -0
  163. package/dist/client/assets/sizeCapture-INFHLROL-BMuKV0gL.js.gz +0 -0
  164. package/dist/client/assets/{sparkles-gqiuBkfP.js → sparkles-DuRvUCWG.js} +1 -1
  165. package/dist/client/assets/{stateDiagram-D77RDMKH-7hUELZGo.js → stateDiagram-D77RDMKH-B1lLo2WA.js} +1 -1
  166. package/dist/client/assets/stateDiagram-D77RDMKH-B1lLo2WA.js.br +0 -0
  167. package/dist/client/assets/stateDiagram-D77RDMKH-B1lLo2WA.js.gz +0 -0
  168. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-F5MbngH8.js +1 -0
  169. package/dist/client/assets/{swimlanes-42K2YHIH-E1qoordP.js → swimlanes-42K2YHIH-CfC5CNjA.js} +1 -1
  170. package/dist/client/assets/swimlanes-42K2YHIH-CfC5CNjA.js.br +0 -0
  171. package/dist/client/assets/{swimlanes-42K2YHIH-E1qoordP.js.gz → swimlanes-42K2YHIH-CfC5CNjA.js.gz} +0 -0
  172. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-BqbZwNvL.js +8 -0
  173. package/dist/client/assets/{timeline-definition-24CTP7MA-CTYyCnUW.js → timeline-definition-24CTP7MA-0mM-Skdo.js} +1 -1
  174. package/dist/client/assets/timeline-definition-24CTP7MA-0mM-Skdo.js.br +0 -0
  175. package/dist/client/assets/timeline-definition-24CTP7MA-0mM-Skdo.js.gz +0 -0
  176. package/dist/client/assets/{triangle-alert-DrBuMUPw.js → triangle-alert-wyGdnPOg.js} +1 -1
  177. package/dist/client/assets/{vennDiagram-4TSXK5OY-DVWbhWsS.js → vennDiagram-4TSXK5OY-BYsJo_hU.js} +1 -1
  178. package/dist/client/assets/{vennDiagram-4TSXK5OY-DVWbhWsS.js.br → vennDiagram-4TSXK5OY-BYsJo_hU.js.br} +0 -0
  179. package/dist/client/assets/vennDiagram-4TSXK5OY-BYsJo_hU.js.gz +0 -0
  180. package/dist/client/assets/{wardleyDiagram-VM6X3IG4-BFAwOxhc.js → wardleyDiagram-VM6X3IG4-ree3u-pI.js} +1 -1
  181. package/dist/client/assets/wardleyDiagram-VM6X3IG4-ree3u-pI.js.br +0 -0
  182. package/dist/client/assets/wardleyDiagram-VM6X3IG4-ree3u-pI.js.gz +0 -0
  183. package/dist/client/assets/{xychartDiagram-S5SC5T6Z-DYXOiBiX.js → xychartDiagram-S5SC5T6Z-DDono4Wc.js} +1 -1
  184. package/dist/client/assets/xychartDiagram-S5SC5T6Z-DDono4Wc.js.br +0 -0
  185. package/dist/client/assets/xychartDiagram-S5SC5T6Z-DDono4Wc.js.gz +0 -0
  186. package/dist/client/index.html +1 -1
  187. package/dist/client/index.html.br +0 -0
  188. package/dist/client/index.html.gz +0 -0
  189. package/dist/client/sw-downloads.js +40 -0
  190. package/dist/client/sw-downloads.js.br +0 -0
  191. package/dist/client/sw-downloads.js.gz +0 -0
  192. package/dist/client/sw-encrypted-background.js +25 -0
  193. package/dist/client/sw-encrypted-background.js.br +0 -0
  194. package/dist/client/sw-encrypted-background.js.gz +0 -0
  195. package/dist/client/sw-notifications.js +14 -6
  196. package/dist/client/sw-notifications.js.br +0 -0
  197. package/dist/client/sw-notifications.js.gz +0 -0
  198. package/dist/client/sw.js +1 -1
  199. package/dist/client/sw.js.br +0 -0
  200. package/dist/client/sw.js.gz +0 -0
  201. package/dist/server/agent/sessionBindingRecovery.js +21 -0
  202. package/dist/server/cli.js +9 -5
  203. package/dist/server/entry.js +2 -0
  204. package/dist/server/federation/requestContext.js +7 -1
  205. package/dist/server/federation/runtime.js +5 -3
  206. package/dist/server/notifications/pushService.js +3 -0
  207. package/dist/server/routes/notifications.js +4 -0
  208. package/dist/server/routes/terminal.js +2 -20
  209. package/dist/server/utils/publicSecurity.js +1 -1
  210. package/package.json +2 -1
  211. package/runtime-manifest.json +3 -3
  212. package/dist/client/assets/App-DXq9kwY5.js.br +0 -0
  213. package/dist/client/assets/App-DXq9kwY5.js.gz +0 -0
  214. package/dist/client/assets/ChangeWalkthroughPanel-DWUBYx6Q.js.br +0 -0
  215. package/dist/client/assets/ChangeWalkthroughPanel-DWUBYx6Q.js.gz +0 -0
  216. package/dist/client/assets/DagPlayground-DyczrcHM.js.br +0 -0
  217. package/dist/client/assets/DagPlayground-DyczrcHM.js.gz +0 -0
  218. package/dist/client/assets/DiffLab-D5wb-H7y.js.br +0 -0
  219. package/dist/client/assets/DiffLab-D5wb-H7y.js.gz +0 -0
  220. package/dist/client/assets/DiffReview-CVIz-B5T.js.br +0 -0
  221. package/dist/client/assets/DiffReview-CVIz-B5T.js.gz +0 -0
  222. package/dist/client/assets/DiffReviewLab-99hTNRaj.js.br +0 -0
  223. package/dist/client/assets/DiffReviewLab-99hTNRaj.js.gz +0 -0
  224. package/dist/client/assets/DiffViewer-BPor2_7o.js.br +0 -0
  225. package/dist/client/assets/DiffViewer-BPor2_7o.js.gz +0 -0
  226. package/dist/client/assets/ModelPreview-DpImj4vY.js.br +0 -0
  227. package/dist/client/assets/ModelPreview-DpImj4vY.js.gz +0 -0
  228. package/dist/client/assets/RightSidebar-BW8SSsoA.js +0 -79
  229. package/dist/client/assets/RightSidebar-BW8SSsoA.js.br +0 -0
  230. package/dist/client/assets/RightSidebar-BW8SSsoA.js.gz +0 -0
  231. package/dist/client/assets/abnfDiagram-VCTEODGH-CNWmFVMh.js.br +0 -0
  232. package/dist/client/assets/abnfDiagram-VCTEODGH-CNWmFVMh.js.gz +0 -0
  233. package/dist/client/assets/app-Pl7tV8Be.js +0 -34
  234. package/dist/client/assets/app-Pl7tV8Be.js.br +0 -0
  235. package/dist/client/assets/app-Pl7tV8Be.js.gz +0 -0
  236. package/dist/client/assets/arc-Z8mcHjh7.js.br +0 -0
  237. package/dist/client/assets/arc-Z8mcHjh7.js.gz +0 -0
  238. package/dist/client/assets/architectureDiagram-5GKGNRK7-DuxbAeFP.js.br +0 -0
  239. package/dist/client/assets/architectureDiagram-5GKGNRK7-DuxbAeFP.js.gz +0 -0
  240. package/dist/client/assets/blockDiagram-I7D4REHJ-SxAFw0An.js.br +0 -0
  241. package/dist/client/assets/blockDiagram-I7D4REHJ-SxAFw0An.js.gz +0 -0
  242. package/dist/client/assets/c4Diagram-7LVT6UL2-CcRdiWo7.js.br +0 -0
  243. package/dist/client/assets/c4Diagram-7LVT6UL2-CcRdiWo7.js.gz +0 -0
  244. package/dist/client/assets/channel-nXn0ntBk.js +0 -1
  245. package/dist/client/assets/chunk-F27PBJKO-B7xASv8n.js.br +0 -0
  246. package/dist/client/assets/chunk-F27PBJKO-B7xASv8n.js.gz +0 -0
  247. package/dist/client/assets/chunk-IMKFNOWR-Wg5gR7sZ.js.br +0 -0
  248. package/dist/client/assets/chunk-IMKFNOWR-Wg5gR7sZ.js.gz +0 -0
  249. package/dist/client/assets/chunk-SVP7TREG-D-yZlXqX.js.br +0 -0
  250. package/dist/client/assets/chunk-SVP7TREG-D-yZlXqX.js.gz +0 -0
  251. package/dist/client/assets/chunk-TICWLB2K-DrOYmcBB.js.br +0 -0
  252. package/dist/client/assets/chunk-TICWLB2K-DrOYmcBB.js.gz +0 -0
  253. package/dist/client/assets/classDiagram-ZZMXUADV-DxqN38m7.js +0 -1
  254. package/dist/client/assets/classDiagram-v2-VYDZK3BY-DxqN38m7.js +0 -1
  255. package/dist/client/assets/cose-bilkent-JH36ORCC-_wKUNL8T.js.br +0 -0
  256. package/dist/client/assets/cose-bilkent-JH36ORCC-_wKUNL8T.js.gz +0 -0
  257. package/dist/client/assets/cynefin-OW5HDTMX-CPr--Wnc.js.br +0 -0
  258. package/dist/client/assets/cynefin-OW5HDTMX-CPr--Wnc.js.gz +0 -0
  259. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-5ygpPOWT.js.br +0 -0
  260. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-5ygpPOWT.js.gz +0 -0
  261. package/dist/client/assets/dagre-GXQ25YYZ-Cvx65nHO.js.br +0 -0
  262. package/dist/client/assets/dagre-GXQ25YYZ-Cvx65nHO.js.gz +0 -0
  263. package/dist/client/assets/diagram-S7CK7UJ4-Dw5cp_BA.js.br +0 -0
  264. package/dist/client/assets/diagram-S7CK7UJ4-Dw5cp_BA.js.gz +0 -0
  265. package/dist/client/assets/diagram-UQ7AKVKN-D8BZ5Tp3.js.br +0 -0
  266. package/dist/client/assets/diagram-UQ7AKVKN-D8BZ5Tp3.js.gz +0 -0
  267. package/dist/client/assets/diagram-VSXAHHWV-BxJD7ZWH.js.br +0 -0
  268. package/dist/client/assets/diagram-VSXAHHWV-BxJD7ZWH.js.gz +0 -0
  269. package/dist/client/assets/diagram-VX7I27RA-CvzlU0bI.js.br +0 -0
  270. package/dist/client/assets/diagram-VX7I27RA-CvzlU0bI.js.gz +0 -0
  271. package/dist/client/assets/diagram-Z3DM3KII-Be4HdFlL.js.br +0 -0
  272. package/dist/client/assets/diagram-Z3DM3KII-Be4HdFlL.js.gz +0 -0
  273. package/dist/client/assets/ebnfDiagram-PWID7BFC-C_wrrPjF.js.br +0 -0
  274. package/dist/client/assets/ebnfDiagram-PWID7BFC-C_wrrPjF.js.gz +0 -0
  275. package/dist/client/assets/erDiagram-RLTQ6QDP-IHyLgV6M.js.br +0 -0
  276. package/dist/client/assets/erDiagram-RLTQ6QDP-IHyLgV6M.js.gz +0 -0
  277. package/dist/client/assets/flowDiagram-HODETNUW-CpfW88Uc.js.br +0 -0
  278. package/dist/client/assets/flowDiagram-HODETNUW-CpfW88Uc.js.gz +0 -0
  279. package/dist/client/assets/ganttDiagram-EL5Y4UJY-CsbQ6KLb.js.br +0 -0
  280. package/dist/client/assets/ganttDiagram-EL5Y4UJY-CsbQ6KLb.js.gz +0 -0
  281. package/dist/client/assets/gestureArbiter-CJQ8K48V.js.gz +0 -0
  282. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-DJZqSGtH.js.br +0 -0
  283. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-DJZqSGtH.js.gz +0 -0
  284. package/dist/client/assets/ishikawaDiagram-5VMMS53U-BJJSUXep.js.br +0 -0
  285. package/dist/client/assets/ishikawaDiagram-5VMMS53U-BJJSUXep.js.gz +0 -0
  286. package/dist/client/assets/journeyDiagram-3NMN7TZE-ou1XS2DP.js.br +0 -0
  287. package/dist/client/assets/journeyDiagram-3NMN7TZE-ou1XS2DP.js.gz +0 -0
  288. package/dist/client/assets/kanban-definition-UXKFOSKX-BFQGYQzd.js.br +0 -0
  289. package/dist/client/assets/kanban-definition-UXKFOSKX-BFQGYQzd.js.gz +0 -0
  290. package/dist/client/assets/layout-zUU3xcam.js.br +0 -0
  291. package/dist/client/assets/layout-zUU3xcam.js.gz +0 -0
  292. package/dist/client/assets/linear-CYwYQI2I.js.br +0 -0
  293. package/dist/client/assets/linear-CYwYQI2I.js.gz +0 -0
  294. package/dist/client/assets/mermaid.core-91Llsw5j.js.br +0 -0
  295. package/dist/client/assets/mermaid.core-91Llsw5j.js.gz +0 -0
  296. package/dist/client/assets/mindmap-definition-YA3MSWOX-RWG074lb.js.br +0 -0
  297. package/dist/client/assets/mindmap-definition-YA3MSWOX-RWG074lb.js.gz +0 -0
  298. package/dist/client/assets/passwordBootstrap-DRknuNUN.js.br +0 -0
  299. package/dist/client/assets/passwordBootstrap-DRknuNUN.js.gz +0 -0
  300. package/dist/client/assets/pegDiagram-XKGWAZYB-Dyh2rzGS.js.br +0 -0
  301. package/dist/client/assets/pegDiagram-XKGWAZYB-Dyh2rzGS.js.gz +0 -0
  302. package/dist/client/assets/pieDiagram-E7YTZNPT-CL3UcUfh.js.br +0 -0
  303. package/dist/client/assets/pieDiagram-E7YTZNPT-CL3UcUfh.js.gz +0 -0
  304. package/dist/client/assets/quadrantDiagram-AXDQQJYC-DOkejMel.js.br +0 -0
  305. package/dist/client/assets/quadrantDiagram-AXDQQJYC-DOkejMel.js.gz +0 -0
  306. package/dist/client/assets/railroadDiagram-O6MQD6OU-BC780Uh3.js.br +0 -0
  307. package/dist/client/assets/railroadDiagram-O6MQD6OU-BC780Uh3.js.gz +0 -0
  308. package/dist/client/assets/referenceLongPress-Dlc0425_.js.br +0 -0
  309. package/dist/client/assets/referenceLongPress-Dlc0425_.js.gz +0 -0
  310. package/dist/client/assets/requirementDiagram-BXWQKSXE-CwCGr0qR.js.br +0 -0
  311. package/dist/client/assets/requirementDiagram-BXWQKSXE-CwCGr0qR.js.gz +0 -0
  312. package/dist/client/assets/sankeyDiagram-P5KCCOFB-CYDYBwJQ.js.br +0 -0
  313. package/dist/client/assets/sankeyDiagram-P5KCCOFB-CYDYBwJQ.js.gz +0 -0
  314. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-DhHsZi3K.js.br +0 -0
  315. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-DhHsZi3K.js.gz +0 -0
  316. package/dist/client/assets/sizeCapture-INFHLROL-4oUXWvYA.js.br +0 -0
  317. package/dist/client/assets/sizeCapture-INFHLROL-4oUXWvYA.js.gz +0 -0
  318. package/dist/client/assets/stateDiagram-D77RDMKH-7hUELZGo.js.br +0 -0
  319. package/dist/client/assets/stateDiagram-D77RDMKH-7hUELZGo.js.gz +0 -0
  320. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-MO84Jqt6.js +0 -1
  321. package/dist/client/assets/swimlanes-42K2YHIH-E1qoordP.js.br +0 -0
  322. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-DnSXMnZQ.js +0 -8
  323. package/dist/client/assets/timeline-definition-24CTP7MA-CTYyCnUW.js.br +0 -0
  324. package/dist/client/assets/timeline-definition-24CTP7MA-CTYyCnUW.js.gz +0 -0
  325. package/dist/client/assets/vennDiagram-4TSXK5OY-DVWbhWsS.js.gz +0 -0
  326. package/dist/client/assets/wardleyDiagram-VM6X3IG4-BFAwOxhc.js.br +0 -0
  327. package/dist/client/assets/wardleyDiagram-VM6X3IG4-BFAwOxhc.js.gz +0 -0
  328. package/dist/client/assets/xychartDiagram-S5SC5T6Z-DYXOiBiX.js.br +0 -0
  329. package/dist/client/assets/xychartDiagram-S5SC5T6Z-DYXOiBiX.js.gz +0 -0
@@ -17,6 +17,7 @@ self.addEventListener('push', (event) => {
17
17
  data: {
18
18
  url: payload.url || '/',
19
19
  sessionId: payload.sessionId,
20
+ targetPeerId: payload.targetPeerId,
20
21
  },
21
22
  };
22
23
  event.waitUntil((async () => {
@@ -59,8 +60,15 @@ self.addEventListener('push', (event) => {
59
60
 
60
61
  self.addEventListener('pushsubscriptionchange', (event) => {
61
62
  event.waitUntil((async () => {
62
- // A worker has no paired device channel. Foreground reconciliation owns
63
- // subscription updates; never retry them through cookie-authenticated HTTP.
63
+ try {
64
+ let subscription = event.newSubscription || await self.registration.pushManager.getSubscription();
65
+ if (!subscription && event.oldSubscription?.options) {
66
+ subscription = await self.registration.pushManager.subscribe(event.oldSubscription.options);
67
+ }
68
+ if (subscription) await self.termdockBackground?.renewSubscriptions(subscription.toJSON());
69
+ } catch (error) {
70
+ console.warn('Background encrypted subscription sync failed', error);
71
+ }
64
72
  const windows = await self.clients.matchAll({ type: 'window', includeUncontrolled: true });
65
73
  for (const client of windows) {
66
74
  client.postMessage({ type: 'termdock:push-subscription-changed' });
@@ -69,9 +77,8 @@ self.addEventListener('pushsubscriptionchange', (event) => {
69
77
  });
70
78
 
71
79
  async function reportNotificationClick(stage, traceId, data = {}) {
72
- // Worker diagnostics stay local; background fetch cannot use the document's
73
- // encrypted transport and must not send notification metadata in plaintext.
74
- console.debug(`PWA_NOTIFICATION_CLICK ${stage}`, { traceId, ...data });
80
+ try { await self.termdockBackground?.reportClick(stage, traceId, data); }
81
+ catch { console.debug(`PWA_NOTIFICATION_CLICK ${stage}`, { traceId, ...data }); }
75
82
  }
76
83
 
77
84
  const NOTIFICATION_TARGET_CACHE = 'termdock-notification-target-v1';
@@ -136,6 +143,7 @@ self.addEventListener('notificationclick', (event) => {
136
143
 
137
144
  event.waitUntil((async () => {
138
145
  await reportNotificationClick('sw-click-start', traceId, {
146
+ targetPeerId: data.targetPeerId,
139
147
  sessionId: data.sessionId || null,
140
148
  url: data.url || null,
141
149
  tag: event.notification.tag || null,
@@ -214,5 +222,5 @@ self.addEventListener('notificationclick', (event) => {
214
222
  resultUrl: openedClient?.url || null,
215
223
  });
216
224
  }
217
- })());
225
+ })().finally(() => self.termdockBackground?.flushLogs().catch(() => {})));
218
226
  });
Binary file
Binary file
package/dist/client/sw.js CHANGED
@@ -1 +1 @@
1
- if(!self.define){let e,s={};const i=(i,n)=>(i=new URL(i+".js",n).href,s[i]||new Promise(s=>{if("document"in self){const e=document.createElement("script");e.src=i,e.onload=s,document.head.appendChild(e)}else e=i,importScripts(i),s()}).then(()=>{let e=s[i];if(!e)throw new Error(`Module ${i} didn’t register its module`);return e}));self.define=(n,a)=>{const c=e||("document"in self?document.currentScript.src:"")||location.href;if(s[c])return;let o={};const r=e=>i(e,c),t={module:{uri:c},exports:o,require:r};s[c]=Promise.all(n.map(e=>t[e]||r(e))).then(e=>(a(...e),o))}}define(["./workbox-9845bf53"],function(e){"use strict";importScripts("sw-notifications.js","sw-secure-api.js"),self.addEventListener("message",e=>{e.data&&"SKIP_WAITING"===e.data.type&&self.skipWaiting()}),e.clientsClaim(),e.precacheAndRoute([{url:"index.html",revision:"236ef70647590ca5541a3a6dddc6c735"},{url:"assets/app-Pl7tV8Be.js",revision:null},{url:"assets/react-XDCjal2T.js",revision:null},{url:"assets/dnd-BCFAPC0L.js",revision:null},{url:"assets/terminal-C7X98Amf.js",revision:null},{url:"assets/index-PWu1VEN_.css",revision:null},{url:"icons/agents/opencode.svg",revision:"851c2931d95821ba2b39b68587b48976"},{url:"icons/agents/kimi.svg",revision:"5366c710f4f763022fe159a69cf17409"},{url:"icons/agents/grok.svg",revision:"cd745b0b964545bc7a6b4f36021c3298"},{url:"icons/agents/goose.svg",revision:"c79b927278983c19098d77b4b0c11ab3"},{url:"icons/agents/gemini.svg",revision:"7a64f6d6f80a908255e9c0256903882e"},{url:"icons/agents/droid.svg",revision:"f28723b8c5c115e0908ba3c72613e256"},{url:"icons/agents/cursor.svg",revision:"a1528f3d3cda497f75a5db28defb19de"},{url:"icons/agents/copilot.svg",revision:"dd52e96c1eac0b6ec4bedcd0ddd3b52d"},{url:"icons/agents/codex.svg",revision:"608e55babb0b217e1f2da287342b46d3"},{url:"icons/agents/claude.svg",revision:"08af0225b7acdd8e8f573f3247e5e1c3"},{url:"icons/agents/amp.svg",revision:"af12f8b33faa81e4d46ea7b93c7e43f3"},{url:"apple-touch-icon-180x180.png",revision:"628c2e2f28a9b545aa57be1352025643"},{url:"favicon.ico",revision:"2994debfa6f59a0898e24eb0c54d64b5"},{url:"maskable-icon-512x512.png",revision:"4d489331fd81f0713c400b26426442b9"},{url:"pwa-192x192.png",revision:"4d6f899888cfb8ccd7a1fd3c9e583ad2"},{url:"pwa-512x512.png",revision:"0885dd7ec8932e7f878b013d51a380a4"},{url:"robots.txt",revision:"d9339907142917dee4aac78494ac9cfe"},{url:"sw-notifications.js",revision:"427b9b5a44e9743752cd822596d28373"},{url:"sw-secure-api.js",revision:"739c54d3fc8f4cbb87bab12b6b8a8160"},{url:"manifest.webmanifest",revision:"83f9a43b74c236012adafb077fb6d774"}],{}),e.cleanupOutdatedCaches(),e.registerRoute(new e.NavigationRoute(e.createHandlerBoundToURL("index.html"),{denylist:[/^\/api\//,/^\/health$/]})),e.registerRoute(/\/assets\/.*\.(?:js|css)$/,new e.CacheFirst({cacheName:"termdock-lazy-assets-v1",plugins:[new e.CacheableResponsePlugin({statuses:[0,200]}),new e.ExpirationPlugin({maxEntries:96,maxAgeSeconds:2592e3})]}),"GET"),e.registerRoute(/\/fonts\/terminal\/[^/]+-[a-f0-9]{12}\.woff2$/,new e.CacheFirst({cacheName:"termdock-fonts-v2",plugins:[new e.CacheableResponsePlugin({statuses:[0,200]}),new e.ExpirationPlugin({maxEntries:384,maxAgeSeconds:2592e3})]}),"GET"),e.registerRoute(/\/fonts\/.*\.(?:woff2|ttf)$/,new e.StaleWhileRevalidate({cacheName:"termdock-fonts-v1",plugins:[new e.ExpirationPlugin({maxEntries:24,maxAgeSeconds:2592e3})]}),"GET")});
1
+ if(!self.define){let e,s={};const n=(n,i)=>(n=new URL(n+".js",i).href,s[n]||new Promise(s=>{if("document"in self){const e=document.createElement("script");e.src=n,e.onload=s,document.head.appendChild(e)}else e=n,importScripts(n),s()}).then(()=>{let e=s[n];if(!e)throw new Error(`Module ${n} didn’t register its module`);return e}));self.define=(i,a)=>{const o=e||("document"in self?document.currentScript.src:"")||location.href;if(s[o])return;let c={};const r=e=>n(e,o),t={module:{uri:o},exports:c,require:r};s[o]=Promise.all(i.map(e=>t[e]||r(e))).then(e=>(a(...e),c))}}define(["./workbox-9845bf53"],function(e){"use strict";importScripts("sw-encrypted-background.js","sw-notifications.js","sw-secure-api.js","sw-downloads.js"),self.addEventListener("message",e=>{e.data&&"SKIP_WAITING"===e.data.type&&self.skipWaiting()}),e.clientsClaim(),e.precacheAndRoute([{url:"index.html",revision:"1d87402f5f09e34eb3f563b011b5205f"},{url:"assets/app-Djvvt1Mi.js",revision:null},{url:"assets/react-XDCjal2T.js",revision:null},{url:"assets/dnd-BCFAPC0L.js",revision:null},{url:"assets/terminal-C7X98Amf.js",revision:null},{url:"assets/index-PWu1VEN_.css",revision:null},{url:"icons/agents/opencode.svg",revision:"851c2931d95821ba2b39b68587b48976"},{url:"icons/agents/kimi.svg",revision:"5366c710f4f763022fe159a69cf17409"},{url:"icons/agents/grok.svg",revision:"cd745b0b964545bc7a6b4f36021c3298"},{url:"icons/agents/goose.svg",revision:"c79b927278983c19098d77b4b0c11ab3"},{url:"icons/agents/gemini.svg",revision:"7a64f6d6f80a908255e9c0256903882e"},{url:"icons/agents/droid.svg",revision:"f28723b8c5c115e0908ba3c72613e256"},{url:"icons/agents/cursor.svg",revision:"a1528f3d3cda497f75a5db28defb19de"},{url:"icons/agents/copilot.svg",revision:"dd52e96c1eac0b6ec4bedcd0ddd3b52d"},{url:"icons/agents/codex.svg",revision:"608e55babb0b217e1f2da287342b46d3"},{url:"icons/agents/claude.svg",revision:"08af0225b7acdd8e8f573f3247e5e1c3"},{url:"icons/agents/amp.svg",revision:"af12f8b33faa81e4d46ea7b93c7e43f3"},{url:"apple-touch-icon-180x180.png",revision:"628c2e2f28a9b545aa57be1352025643"},{url:"favicon.ico",revision:"2994debfa6f59a0898e24eb0c54d64b5"},{url:"maskable-icon-512x512.png",revision:"4d489331fd81f0713c400b26426442b9"},{url:"pwa-192x192.png",revision:"4d6f899888cfb8ccd7a1fd3c9e583ad2"},{url:"pwa-512x512.png",revision:"0885dd7ec8932e7f878b013d51a380a4"},{url:"robots.txt",revision:"d9339907142917dee4aac78494ac9cfe"},{url:"sw-downloads.js",revision:"29b4d23945d109a334e1c3902a8cf02a"},{url:"sw-notifications.js",revision:"a5a2b585a4336d66519195e5e63aee2d"},{url:"sw-secure-api.js",revision:"739c54d3fc8f4cbb87bab12b6b8a8160"},{url:"manifest.webmanifest",revision:"83f9a43b74c236012adafb077fb6d774"}],{}),e.cleanupOutdatedCaches(),e.registerRoute(new e.NavigationRoute(e.createHandlerBoundToURL("index.html"),{denylist:[/^\/api\//,/^\/__termdock-download\//,/^\/health$/]})),e.registerRoute(/\/assets\/.*\.(?:js|css)$/,new e.CacheFirst({cacheName:"termdock-lazy-assets-v1",plugins:[new e.CacheableResponsePlugin({statuses:[0,200]}),new e.ExpirationPlugin({maxEntries:96,maxAgeSeconds:2592e3})]}),"GET"),e.registerRoute(/\/fonts\/terminal\/[^/]+-[a-f0-9]{12}\.woff2$/,new e.CacheFirst({cacheName:"termdock-fonts-v2",plugins:[new e.CacheableResponsePlugin({statuses:[0,200]}),new e.ExpirationPlugin({maxEntries:384,maxAgeSeconds:2592e3})]}),"GET"),e.registerRoute(/\/fonts\/.*\.(?:woff2|ttf)$/,new e.StaleWhileRevalidate({cacheName:"termdock-fonts-v1",plugins:[new e.ExpirationPlugin({maxEntries:24,maxAgeSeconds:2592e3})]}),"GET")});
Binary file
Binary file
@@ -1,3 +1,24 @@
1
+ export function resolveCollaborationSessionId(input, records, routing) {
2
+ const sessionId = typeof input.sessionId === 'string' ? input.sessionId.trim() : '';
3
+ if (sessionId && records.some((record) => record.sessionId === sessionId))
4
+ return sessionId;
5
+ const backendSessionId = typeof input.backendSessionId === 'string' ? input.backendSessionId.trim() : '';
6
+ if (backendSessionId) {
7
+ const owner = routing.ownerOfBackend(backendSessionId);
8
+ if (owner && records.some((record) => record.sessionId === owner))
9
+ return owner;
10
+ const resolved = records.find((record) => record.backendSessionId === backendSessionId)?.sessionId;
11
+ if (resolved)
12
+ return resolved;
13
+ }
14
+ const tmuxSessionName = typeof input.tmuxSessionName === 'string' ? input.tmuxSessionName.trim() : '';
15
+ if (!tmuxSessionName)
16
+ return null;
17
+ const bound = records.find((record) => routing.get(record.sessionId)?.tmuxSessionName === tmuxSessionName);
18
+ if (bound)
19
+ return bound.sessionId;
20
+ return records.find((record) => record.tmuxSessionName === tmuxSessionName)?.sessionId ?? null;
21
+ }
1
22
  export function resolveCollaborationBackend(record, records, backends, routing) {
2
23
  routing.assertReadable();
3
24
  const binding = routing.get(record.sessionId);
@@ -1255,9 +1255,12 @@ async function runCollab(command) {
1255
1255
  }
1256
1256
  const backendSessionId = process.env.TERMDOCK_BACKEND_SESSION_ID?.trim() || null;
1257
1257
  let tmuxSessionName = null;
1258
- if (!backendSessionId && process.env.TMUX) {
1258
+ if (process.env.TMUX) {
1259
1259
  try {
1260
- const { stdout } = await execFileAsync(process.env.TMUX_BIN || 'tmux', ['display-message', '-p', '#S'], {
1260
+ const paneId = process.env.TMUX_PANE?.trim();
1261
+ const { stdout } = await execFileAsync(process.env.TMUX_BIN || 'tmux', [
1262
+ 'display-message', '-p', ...(/^%\d+$/.test(paneId ?? '') ? ['-t', paneId] : []), '#S',
1263
+ ], {
1261
1264
  timeout: 2_000,
1262
1265
  maxBuffer: 16 * 1024,
1263
1266
  });
@@ -1266,15 +1269,16 @@ async function runCollab(command) {
1266
1269
  tmuxSessionName = detected;
1267
1270
  }
1268
1271
  catch {
1269
- // The explicit backend id remains the primary path; tmux is a fallback
1270
- // for managed panes whose inner shell predates the attach wrapper env.
1272
+ // Keep a working backend context if tmux inspection fails. A surviving
1273
+ // pane may retain an obsolete backend id after TD reattaches it, so
1274
+ // send both identities whenever tmux inspection succeeds.
1271
1275
  }
1272
1276
  }
1273
1277
  if (!backendSessionId && !tmuxSessionName) {
1274
1278
  console.error(JSON.stringify({ ok: false, code: 'SESSION_NOT_FOUND', error: 'td collab must run inside a Termdock-managed Session.' }));
1275
1279
  process.exit(1);
1276
1280
  }
1277
- const context = backendSessionId ? { backendSessionId } : { tmuxSessionName };
1281
+ const context = { backendSessionId, tmuxSessionName };
1278
1282
  const baseUrl = runningState.localUrl
1279
1283
  ?? `${runningState.scheme ?? 'http'}://${runningState.host === '0.0.0.0' ? 'localhost' : runningState.host}:${runningState.port}`;
1280
1284
  process.exitCode = await executeCollaborationCommand(command, Object.fromEntries(Object.entries(context).filter((entry) => typeof entry[1] === 'string')), { request: (method, endpoint, body, timeout) => method === 'GET'
@@ -1,3 +1,4 @@
1
+ import { setPushTargetPeerId } from './notifications/pushService.js';
1
2
  import { desktopDirectTargets } from './federation/desktopTargets.js';
2
3
  import { createOpenAccessRouter } from './federation/openAccess.js';
3
4
  import { createPasswordLoginRouter } from './federation/passwordLoginRoutes.js';
@@ -474,6 +475,7 @@ export function startServer(options = {}) {
474
475
  });
475
476
  void federation.then(runtime => {
476
477
  federationServiceId = runtime.serviceId;
478
+ setPushTargetPeerId(runtime.serviceId);
477
479
  refreshDirectTargets();
478
480
  app.locals.passwordRuntime = runtime;
479
481
  entrySubjectAllowed = subjectId => runtime.store.authorize({ subjectId, serviceId: runtime.serviceId, action: 'authorization.manage' }).allowed;
@@ -1,4 +1,10 @@
1
1
  // Object identity is deliberately used instead of a remotely forgeable header.
2
2
  const verified = new WeakSet();
3
- export function markEncryptedRequest(request) { verified.add(request); }
3
+ const subjects = new WeakMap();
4
+ export function markEncryptedRequest(request, subjectId) {
5
+ verified.add(request);
6
+ if (subjectId)
7
+ subjects.set(request, subjectId);
8
+ }
4
9
  export function isEncryptedRequest(request) { return verified.has(request); }
10
+ export function encryptedRequestSubject(request) { return subjects.get(request); }
@@ -95,7 +95,9 @@ export async function createFederationRuntime(app, directory, handlers, options
95
95
  return;
96
96
  }
97
97
  delete request.headers['x-termdock-inner'];
98
- markEncryptedRequest(request);
98
+ const subject = request.headers['x-termdock-device'];
99
+ delete request.headers['x-termdock-device'];
100
+ markEncryptedRequest(request, typeof subject === 'string' ? subject : undefined);
99
101
  app(request, response);
100
102
  });
101
103
  await new Promise((resolve, reject) => { internal.once('error', reject); internal.listen(0, '127.0.0.1', resolve); });
@@ -152,7 +154,7 @@ export async function createFederationRuntime(app, directory, handlers, options
152
154
  };
153
155
  try {
154
156
  httpAllowed(operation.head);
155
- const headers = new Headers({ 'x-termdock-inner': internalToken });
157
+ const headers = new Headers({ 'x-termdock-inner': internalToken, 'x-termdock-device': subjectId });
156
158
  const supplied = operation.head.headers;
157
159
  if (supplied && typeof supplied === 'object')
158
160
  for (const [name, value] of Object.entries(supplied)) {
@@ -482,7 +484,7 @@ export async function createFederationRuntime(app, directory, handlers, options
482
484
  send({ type: 'ws-ready', id: packet.id });
483
485
  if (match)
484
486
  handlers.terminal(logical, match[1], randomUUID(), {
485
- sinceSeq: Math.max(0, Number(url.searchParams.get('since')) || 0), streamEpoch: url.searchParams.get('epoch') ?? undefined,
487
+ pushClientId: `device:${subjectId}`, sinceSeq: Math.max(0, Number(url.searchParams.get('since')) || 0), streamEpoch: url.searchParams.get('epoch') ?? undefined,
486
488
  flowControl: url.searchParams.get('flow') === '2', outputActive: url.searchParams.get('active') !== '0',
487
489
  independentTmux: full(subjectId) && url.searchParams.get('transport') === 'tmux-client',
488
490
  }, allowed(subjectId, 'session.resize', match[1]) ? readTerminalHandshakeDimensions(url.searchParams) : undefined);
@@ -1,3 +1,5 @@
1
+ let pushTargetPeerId;
2
+ export function setPushTargetPeerId(value) { pushTargetPeerId = value; }
1
3
  import fs from 'node:fs';
2
4
  import os from 'node:os';
3
5
  import path from 'node:path';
@@ -124,6 +126,7 @@ async function sendPayload(options) {
124
126
  };
125
127
  await webpush.sendNotification(subscription, JSON.stringify({
126
128
  ...options.build(entry.locale),
129
+ targetPeerId: pushTargetPeerId,
127
130
  alertStyle: entry.alertStyle,
128
131
  locale: entry.locale,
129
132
  }), {
@@ -1,7 +1,11 @@
1
1
  import { Router } from 'express';
2
+ import { encryptedRequestSubject } from '../federation/requestContext.js';
2
3
  import { getPushSubscription, getVapidPublicKey, removePushSubscription, updatePushPreferences, upsertPushSubscription, } from '../notifications/pushService.js';
3
4
  const router = Router();
4
5
  function clientIdFromRequest(req) {
6
+ const subject = encryptedRequestSubject(req);
7
+ if (subject)
8
+ return `device:${subject}`;
5
9
  return typeof req.cookies?.['termdock-client'] === 'string' ? req.cookies['termdock-client'] : '';
6
10
  }
7
11
  function validAlertStyle(value) {
@@ -39,7 +39,7 @@ import { CollaborationStore } from '../agent/collaborationStore.js';
39
39
  import { formatCollaborationDelivery } from '../agent/collaborationPrompt.js';
40
40
  import { resolveCollaborationSpawnMode } from '../agent/collaborationSpawn.js';
41
41
  import { SessionSearchStore } from '../agent/sessionSearchStore.js';
42
- import { resolveCollaborationBackend } from '../agent/sessionBindingRecovery.js';
42
+ import { resolveCollaborationBackend, resolveCollaborationSessionId } from '../agent/sessionBindingRecovery.js';
43
43
  import { CollaborationRoutingStore, selectCollaborationPane } from '../agent/collaborationRouting.js';
44
44
  import { CollaborationDeliveryWorker } from '../agent/collaborationDeliveryWorker.js';
45
45
  import { writeCollaborationTmuxPane } from '../agent/collaborationTmuxDelivery.js';
@@ -1410,25 +1410,7 @@ async function runAgentAutomation(automation, req) {
1410
1410
  }
1411
1411
  }
1412
1412
  function resolveFrontendSessionId(input) {
1413
- const sessionId = typeof input.sessionId === 'string' ? input.sessionId.trim() : '';
1414
- if (sessionId && globalSessionState.sessions.some((record) => record.sessionId === sessionId))
1415
- return sessionId;
1416
- const backendSessionId = typeof input.backendSessionId === 'string' ? input.backendSessionId.trim() : '';
1417
- if (backendSessionId) {
1418
- const owner = collaborationRouting.ownerOfBackend(backendSessionId);
1419
- if (owner && globalSessionState.sessions.some((record) => record.sessionId === owner))
1420
- return owner;
1421
- const resolved = globalSessionState.sessions.find((record) => record.backendSessionId === backendSessionId)?.sessionId;
1422
- if (resolved)
1423
- return resolved;
1424
- }
1425
- const tmuxSessionName = typeof input.tmuxSessionName === 'string' ? input.tmuxSessionName.trim() : '';
1426
- if (!tmuxSessionName)
1427
- return null;
1428
- const bound = globalSessionState.sessions.find((record) => collaborationRouting.get(record.sessionId)?.tmuxSessionName === tmuxSessionName);
1429
- if (bound)
1430
- return bound.sessionId;
1431
- return globalSessionState.sessions.find((record) => record.tmuxSessionName === tmuxSessionName)?.sessionId ?? null;
1413
+ return resolveCollaborationSessionId(input, globalSessionState.sessions, collaborationRouting);
1432
1414
  }
1433
1415
  function collaborationRemoteSessions() {
1434
1416
  return Array.from(new Map(collaborationStore.list().flatMap((group) => group.remoteSessions ?? [])
@@ -34,7 +34,7 @@ export const securityHeaders = (req, res, next) => {
34
34
  const shellSource = /^[a-z0-9.\-:\[\]]+$/i.test(host) ? `http://${host}/preview-shell.html https://${host}/preview-shell.html` : "'none'";
35
35
  const shell = req.path === '/preview-shell.html';
36
36
  res.setHeader('Content-Security-Policy', shell
37
- ? "sandbox allow-scripts; default-src 'none'; script-src 'unsafe-inline' blob: https: http:; style-src 'unsafe-inline' blob: https:; img-src blob: data: https:; font-src blob: data: https:; media-src blob: data: https:; connect-src https:; frame-src 'none'; frame-ancestors 'self'; object-src 'none'; base-uri https://termdock-preview.invalid; form-action 'none'"
37
+ ? "sandbox allow-scripts; default-src 'none'; script-src 'unsafe-inline' 'wasm-unsafe-eval' blob: https: http:; style-src 'unsafe-inline' blob: https:; img-src blob: data: https:; font-src blob: data: https:; media-src blob: data: https:; connect-src blob: https: wss:; worker-src blob:; frame-src 'none'; frame-ancestors 'self'; object-src 'none'; base-uri https://termdock-preview.invalid; form-action 'none'"
38
38
  : preview
39
39
  ? "sandbox allow-scripts; frame-ancestors 'self'; object-src 'none'; base-uri 'self'"
40
40
  : `script-src 'self' 'wasm-unsafe-eval'; script-src-attr 'none'; worker-src 'self' blob:; frame-src ${shellSource}; frame-ancestors 'self'; object-src 'none'; base-uri 'self'`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "termdock",
3
- "version": "1.4.179",
3
+ "version": "1.4.180",
4
4
  "description": "A complete web-based terminal application with modern UI",
5
5
  "type": "module",
6
6
  "main": ".desktop-dist/main.js",
@@ -119,6 +119,7 @@
119
119
  "concurrently": "^8.2.0",
120
120
  "cross-env": "^10.1.0",
121
121
  "electron": "^43.2.0",
122
+ "es-module-shims": "^2.8.4",
122
123
  "esbuild": "^0.27.7",
123
124
  "eslint": "^9.39.2",
124
125
  "jsdom": "^24.0.0",
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
3
  "packageName": "termdock",
4
- "version": "1.4.179",
4
+ "version": "1.4.180",
5
5
  "runtimeProtocolVersion": 1,
6
6
  "minimumDesktopVersion": "1.4.46",
7
7
  "nodeMajor": 22,
8
8
  "dependencyHash": "sha256-kSujny2SLOFnZ1ffxm1FYtli7g1vEN8d3vj1oQeLLdc=",
9
- "serverBundleHash": "sha256-AQUq3XFy+cNp7XbeVQmCnE6m5odhlqCbuU3LbvxFjt0=",
10
- "clientBundleHash": "sha256-jofF5lZQ8B7W5pmfclW2tlMMp+FlTHRi8am3AscU2CE=",
9
+ "serverBundleHash": "sha256-OJ83J67z97pdLmRW6AEkj8r5LkhdkmNIeAxu2L4niig=",
10
+ "clientBundleHash": "sha256-uS0kVZf+KwoYUsvNs5oQQ2EOdE7L45iUtfuHunLnQ2Q=",
11
11
  "entrypoint": "dist/server/cli.js",
12
12
  "clientEntrypoint": "dist/client/index.html"
13
13
  }