termdock 1.4.284 → 1.4.285

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 (336) hide show
  1. package/dist/client/assets/App--hZmWk-u.js +157 -0
  2. package/dist/client/assets/App--hZmWk-u.js.br +0 -0
  3. package/dist/client/assets/App--hZmWk-u.js.gz +0 -0
  4. package/dist/client/assets/{ChangeWalkthroughPanel-Bvg7jZNw.js → ChangeWalkthroughPanel-BQ1hdwzt.js} +1 -1
  5. package/dist/client/assets/ChangeWalkthroughPanel-BQ1hdwzt.js.br +0 -0
  6. package/dist/client/assets/ChangeWalkthroughPanel-BQ1hdwzt.js.gz +0 -0
  7. package/dist/client/assets/{DagPlayground-DSM5oYq3.js → DagPlayground-BERXHwib.js} +1 -1
  8. package/dist/client/assets/DagPlayground-BERXHwib.js.br +0 -0
  9. package/dist/client/assets/DagPlayground-BERXHwib.js.gz +0 -0
  10. package/dist/client/assets/{DiffLab-CgI11xY5.js → DiffLab-DF14_TAz.js} +1 -1
  11. package/dist/client/assets/DiffLab-DF14_TAz.js.br +0 -0
  12. package/dist/client/assets/DiffLab-DF14_TAz.js.gz +0 -0
  13. package/dist/client/assets/{DiffReview-DOmoMEgC.js → DiffReview-BQcIn0zl.js} +1 -1
  14. package/dist/client/assets/DiffReview-BQcIn0zl.js.br +0 -0
  15. package/dist/client/assets/DiffReview-BQcIn0zl.js.gz +0 -0
  16. package/dist/client/assets/{DiffReviewLab-CEdM0rim.js → DiffReviewLab-CgChwzQr.js} +1 -1
  17. package/dist/client/assets/DiffReviewLab-CgChwzQr.js.br +0 -0
  18. package/dist/client/assets/DiffReviewLab-CgChwzQr.js.gz +0 -0
  19. package/dist/client/assets/DiffViewer-hDpe-wvG.js +37 -0
  20. package/dist/client/assets/DiffViewer-hDpe-wvG.js.br +0 -0
  21. package/dist/client/assets/DiffViewer-hDpe-wvG.js.gz +0 -0
  22. package/dist/client/assets/{ModelPreview-DNiQACGL.js → ModelPreview-vg3vRIhx.js} +1 -1
  23. package/dist/client/assets/ModelPreview-vg3vRIhx.js.br +0 -0
  24. package/dist/client/assets/ModelPreview-vg3vRIhx.js.gz +0 -0
  25. package/dist/client/assets/RightSidebar-5H4vhn3k.js +1678 -0
  26. package/dist/client/assets/RightSidebar-5H4vhn3k.js.br +0 -0
  27. package/dist/client/assets/RightSidebar-5H4vhn3k.js.gz +0 -0
  28. package/dist/client/assets/{abnfDiagram-VCTEODGH-ByazGh0D.js → abnfDiagram-VCTEODGH-DI7938HB.js} +1 -1
  29. package/dist/client/assets/abnfDiagram-VCTEODGH-DI7938HB.js.br +0 -0
  30. package/dist/client/assets/abnfDiagram-VCTEODGH-DI7938HB.js.gz +0 -0
  31. package/dist/client/assets/app-BeVXUQb-.js +35 -0
  32. package/dist/client/assets/app-BeVXUQb-.js.br +0 -0
  33. package/dist/client/assets/app-BeVXUQb-.js.gz +0 -0
  34. package/dist/client/assets/{arc-DMO5fEDY.js → arc-D4qDm5Yn.js} +1 -1
  35. package/dist/client/assets/arc-D4qDm5Yn.js.br +0 -0
  36. package/dist/client/assets/arc-D4qDm5Yn.js.gz +0 -0
  37. package/dist/client/assets/{architectureDiagram-5GKGNRK7-c6WktFDt.js → architectureDiagram-5GKGNRK7-C4IZCNC9.js} +1 -1
  38. package/dist/client/assets/architectureDiagram-5GKGNRK7-C4IZCNC9.js.br +0 -0
  39. package/dist/client/assets/architectureDiagram-5GKGNRK7-C4IZCNC9.js.gz +0 -0
  40. package/dist/client/assets/{blockDiagram-I7D4REHJ-CN0lQ7zu.js → blockDiagram-I7D4REHJ-DHVOr_jQ.js} +1 -1
  41. package/dist/client/assets/blockDiagram-I7D4REHJ-DHVOr_jQ.js.br +0 -0
  42. package/dist/client/assets/{blockDiagram-I7D4REHJ-CN0lQ7zu.js.gz → blockDiagram-I7D4REHJ-DHVOr_jQ.js.gz} +0 -0
  43. package/dist/client/assets/{c4Diagram-7LVT6UL2-CALO2K48.js → c4Diagram-7LVT6UL2-kQqkOkIe.js} +1 -1
  44. package/dist/client/assets/c4Diagram-7LVT6UL2-kQqkOkIe.js.br +0 -0
  45. package/dist/client/assets/c4Diagram-7LVT6UL2-kQqkOkIe.js.gz +0 -0
  46. package/dist/client/assets/channel-DNlwrmA4.js +1 -0
  47. package/dist/client/assets/{chunk-2Q5K7J3B-CcQPyBbp.js → chunk-2Q5K7J3B-D2kOR60I.js} +1 -1
  48. package/dist/client/assets/{chunk-5VM5RSS4-CEp2aHuN.js → chunk-5VM5RSS4-CxaDg0nL.js} +1 -1
  49. package/dist/client/assets/{chunk-F27PBJKO-gRP8AiSl.js → chunk-F27PBJKO-Bxf7XPNj.js} +1 -1
  50. package/dist/client/assets/chunk-F27PBJKO-Bxf7XPNj.js.br +0 -0
  51. package/dist/client/assets/chunk-F27PBJKO-Bxf7XPNj.js.gz +0 -0
  52. package/dist/client/assets/{chunk-IMKFNOWR-BZewY7aF.js → chunk-IMKFNOWR-BTifpaB5.js} +1 -1
  53. package/dist/client/assets/chunk-IMKFNOWR-BTifpaB5.js.br +0 -0
  54. package/dist/client/assets/chunk-IMKFNOWR-BTifpaB5.js.gz +0 -0
  55. package/dist/client/assets/{chunk-JWPE2WC7-C4S_lg0B.js → chunk-JWPE2WC7-Deieql_u.js} +1 -1
  56. package/dist/client/assets/{chunk-POPQ4Y6H-BgYxXL0V.js → chunk-POPQ4Y6H-CqZwUpjK.js} +1 -1
  57. package/dist/client/assets/{chunk-SVP7TREG-rjbdtq2C.js → chunk-SVP7TREG-Bm1spPMb.js} +1 -1
  58. package/dist/client/assets/chunk-SVP7TREG-Bm1spPMb.js.br +0 -0
  59. package/dist/client/assets/chunk-SVP7TREG-Bm1spPMb.js.gz +0 -0
  60. package/dist/client/assets/{chunk-TICWLB2K-CxU1tNuL.js → chunk-TICWLB2K-BGLj-zGP.js} +1 -1
  61. package/dist/client/assets/chunk-TICWLB2K-BGLj-zGP.js.br +0 -0
  62. package/dist/client/assets/chunk-TICWLB2K-BGLj-zGP.js.gz +0 -0
  63. package/dist/client/assets/{chunk-XXDRQBXY-CSSO11_4.js → chunk-XXDRQBXY-CR77bUfc.js} +1 -1
  64. package/dist/client/assets/classDiagram-ZZMXUADV-CUt4JCwJ.js +1 -0
  65. package/dist/client/assets/classDiagram-v2-VYDZK3BY-CUt4JCwJ.js +1 -0
  66. package/dist/client/assets/{cose-bilkent-JH36ORCC-BiO-E-0q.js → cose-bilkent-JH36ORCC-GTawhnoV.js} +1 -1
  67. package/dist/client/assets/cose-bilkent-JH36ORCC-GTawhnoV.js.br +0 -0
  68. package/dist/client/assets/cose-bilkent-JH36ORCC-GTawhnoV.js.gz +0 -0
  69. package/dist/client/assets/{cynefin-OW5HDTMX-DUC3zzns.js → cynefin-OW5HDTMX-DHdRkQdW.js} +1 -1
  70. package/dist/client/assets/cynefin-OW5HDTMX-DHdRkQdW.js.br +0 -0
  71. package/dist/client/assets/cynefin-OW5HDTMX-DHdRkQdW.js.gz +0 -0
  72. package/dist/client/assets/{cynefinDiagram-5FMLGOSQ-CR1RnhbU.js → cynefinDiagram-5FMLGOSQ-Cj2ytLun.js} +1 -1
  73. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-Cj2ytLun.js.br +0 -0
  74. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-Cj2ytLun.js.gz +0 -0
  75. package/dist/client/assets/{dagre-GXQ25YYZ-d1joyB5v.js → dagre-GXQ25YYZ-BdFZmtIj.js} +1 -1
  76. package/dist/client/assets/dagre-GXQ25YYZ-BdFZmtIj.js.br +0 -0
  77. package/dist/client/assets/dagre-GXQ25YYZ-BdFZmtIj.js.gz +0 -0
  78. package/dist/client/assets/{diagram-S7CK7UJ4-izL3GdCu.js → diagram-S7CK7UJ4-D5WQNuKI.js} +1 -1
  79. package/dist/client/assets/diagram-S7CK7UJ4-D5WQNuKI.js.br +0 -0
  80. package/dist/client/assets/diagram-S7CK7UJ4-D5WQNuKI.js.gz +0 -0
  81. package/dist/client/assets/{diagram-UQ7AKVKN-CjoFV2sD.js → diagram-UQ7AKVKN-ChwjfMce.js} +1 -1
  82. package/dist/client/assets/diagram-UQ7AKVKN-ChwjfMce.js.br +0 -0
  83. package/dist/client/assets/diagram-UQ7AKVKN-ChwjfMce.js.gz +0 -0
  84. package/dist/client/assets/{diagram-VSXAHHWV-BgHmsnTZ.js → diagram-VSXAHHWV-DT4FET5f.js} +1 -1
  85. package/dist/client/assets/diagram-VSXAHHWV-DT4FET5f.js.br +0 -0
  86. package/dist/client/assets/diagram-VSXAHHWV-DT4FET5f.js.gz +0 -0
  87. package/dist/client/assets/{diagram-VX7I27RA-DMzRLNbg.js → diagram-VX7I27RA-BLJsAGx6.js} +1 -1
  88. package/dist/client/assets/diagram-VX7I27RA-BLJsAGx6.js.br +0 -0
  89. package/dist/client/assets/diagram-VX7I27RA-BLJsAGx6.js.gz +0 -0
  90. package/dist/client/assets/{diagram-Z3DM3KII-kgWacykR.js → diagram-Z3DM3KII-C1ofLllK.js} +1 -1
  91. package/dist/client/assets/diagram-Z3DM3KII-C1ofLllK.js.br +0 -0
  92. package/dist/client/assets/diagram-Z3DM3KII-C1ofLllK.js.gz +0 -0
  93. package/dist/client/assets/{ebnfDiagram-PWID7BFC-XzSXtFGS.js → ebnfDiagram-PWID7BFC-apxDEeqe.js} +1 -1
  94. package/dist/client/assets/ebnfDiagram-PWID7BFC-apxDEeqe.js.br +0 -0
  95. package/dist/client/assets/ebnfDiagram-PWID7BFC-apxDEeqe.js.gz +0 -0
  96. package/dist/client/assets/{erDiagram-RLTQ6QDP-Bu67_rUZ.js → erDiagram-RLTQ6QDP-Dq9hBYpH.js} +1 -1
  97. package/dist/client/assets/erDiagram-RLTQ6QDP-Dq9hBYpH.js.br +0 -0
  98. package/dist/client/assets/erDiagram-RLTQ6QDP-Dq9hBYpH.js.gz +0 -0
  99. package/dist/client/assets/{flowDiagram-HODETNUW-BsK_b_G_.js → flowDiagram-HODETNUW-Juk-Qv9f.js} +1 -1
  100. package/dist/client/assets/flowDiagram-HODETNUW-Juk-Qv9f.js.br +0 -0
  101. package/dist/client/assets/flowDiagram-HODETNUW-Juk-Qv9f.js.gz +0 -0
  102. package/dist/client/assets/{ganttDiagram-EL5Y4UJY-gCSBItav.js → ganttDiagram-EL5Y4UJY-mmwd0mxs.js} +1 -1
  103. package/dist/client/assets/ganttDiagram-EL5Y4UJY-mmwd0mxs.js.br +0 -0
  104. package/dist/client/assets/ganttDiagram-EL5Y4UJY-mmwd0mxs.js.gz +0 -0
  105. package/dist/client/assets/{gestureArbiter-BOikQWZ8.js → gestureArbiter-CM_xJnCS.js} +1 -1
  106. package/dist/client/assets/gestureArbiter-CM_xJnCS.js.br +0 -0
  107. package/dist/client/assets/gestureArbiter-CM_xJnCS.js.gz +0 -0
  108. package/dist/client/assets/{gitGraphDiagram-WWUBYQGX-DL0NSPPn.js → gitGraphDiagram-WWUBYQGX--UL7HV4P.js} +1 -1
  109. package/dist/client/assets/gitGraphDiagram-WWUBYQGX--UL7HV4P.js.br +0 -0
  110. package/dist/client/assets/gitGraphDiagram-WWUBYQGX--UL7HV4P.js.gz +0 -0
  111. package/dist/client/assets/index-pZsldTFS.css +1 -0
  112. package/dist/client/assets/index-pZsldTFS.css.br +0 -0
  113. package/dist/client/assets/index-pZsldTFS.css.gz +0 -0
  114. package/dist/client/assets/{infoDiagram-27XIBGKW-Cwevdubr.js → infoDiagram-27XIBGKW-CcsxyqYJ.js} +1 -1
  115. package/dist/client/assets/{ishikawaDiagram-5VMMS53U-pz1lzDd4.js → ishikawaDiagram-5VMMS53U-CNVFPx1_.js} +1 -1
  116. package/dist/client/assets/ishikawaDiagram-5VMMS53U-CNVFPx1_.js.br +0 -0
  117. package/dist/client/assets/ishikawaDiagram-5VMMS53U-CNVFPx1_.js.gz +0 -0
  118. package/dist/client/assets/{journeyDiagram-3NMN7TZE-BrUnjTGd.js → journeyDiagram-3NMN7TZE-BtIuJLUp.js} +1 -1
  119. package/dist/client/assets/journeyDiagram-3NMN7TZE-BtIuJLUp.js.br +0 -0
  120. package/dist/client/assets/journeyDiagram-3NMN7TZE-BtIuJLUp.js.gz +0 -0
  121. package/dist/client/assets/{kanban-definition-UXKFOSKX-BKf4UYyB.js → kanban-definition-UXKFOSKX-gOFjuFZV.js} +1 -1
  122. package/dist/client/assets/kanban-definition-UXKFOSKX-gOFjuFZV.js.br +0 -0
  123. package/dist/client/assets/kanban-definition-UXKFOSKX-gOFjuFZV.js.gz +0 -0
  124. package/dist/client/assets/{layout-Dd_yzBVh.js → layout-KEP24zEE.js} +1 -1
  125. package/dist/client/assets/layout-KEP24zEE.js.br +0 -0
  126. package/dist/client/assets/layout-KEP24zEE.js.gz +0 -0
  127. package/dist/client/assets/{linear-iY7daKXS.js → linear-BwUXWDLn.js} +1 -1
  128. package/dist/client/assets/linear-BwUXWDLn.js.br +0 -0
  129. package/dist/client/assets/linear-BwUXWDLn.js.gz +0 -0
  130. package/dist/client/assets/{mermaid.core-CYNb258G.js → mermaid.core-DkzJYwWa.js} +5 -5
  131. package/dist/client/assets/mermaid.core-DkzJYwWa.js.br +0 -0
  132. package/dist/client/assets/mermaid.core-DkzJYwWa.js.gz +0 -0
  133. package/dist/client/assets/{mindmap-definition-YA3MSWOX-ctnc7JBK.js → mindmap-definition-YA3MSWOX-BE1H8WPd.js} +1 -1
  134. package/dist/client/assets/mindmap-definition-YA3MSWOX-BE1H8WPd.js.br +0 -0
  135. package/dist/client/assets/mindmap-definition-YA3MSWOX-BE1H8WPd.js.gz +0 -0
  136. package/dist/client/assets/{passwordBootstrap-Bth6QB9C.js → passwordBootstrap-Dhzj9-U2.js} +1 -1
  137. package/dist/client/assets/passwordBootstrap-Dhzj9-U2.js.br +0 -0
  138. package/dist/client/assets/passwordBootstrap-Dhzj9-U2.js.gz +0 -0
  139. package/dist/client/assets/{pegDiagram-XKGWAZYB-DVKAZXxP.js → pegDiagram-XKGWAZYB-CorBwvfP.js} +1 -1
  140. package/dist/client/assets/pegDiagram-XKGWAZYB-CorBwvfP.js.br +0 -0
  141. package/dist/client/assets/pegDiagram-XKGWAZYB-CorBwvfP.js.gz +0 -0
  142. package/dist/client/assets/{pieDiagram-E7YTZNPT-C0u6lfoS.js → pieDiagram-E7YTZNPT-A017Uk-W.js} +1 -1
  143. package/dist/client/assets/pieDiagram-E7YTZNPT-A017Uk-W.js.br +0 -0
  144. package/dist/client/assets/pieDiagram-E7YTZNPT-A017Uk-W.js.gz +0 -0
  145. package/dist/client/assets/{quadrantDiagram-AXDQQJYC-DXFDUoYJ.js → quadrantDiagram-AXDQQJYC-CNNywvhG.js} +1 -1
  146. package/dist/client/assets/quadrantDiagram-AXDQQJYC-CNNywvhG.js.br +0 -0
  147. package/dist/client/assets/quadrantDiagram-AXDQQJYC-CNNywvhG.js.gz +0 -0
  148. package/dist/client/assets/{railroadDiagram-O6MQD6OU-Cz-wrQ4E.js → railroadDiagram-O6MQD6OU-DIxiWn5A.js} +1 -1
  149. package/dist/client/assets/railroadDiagram-O6MQD6OU-DIxiWn5A.js.br +0 -0
  150. package/dist/client/assets/railroadDiagram-O6MQD6OU-DIxiWn5A.js.gz +0 -0
  151. package/dist/client/assets/{referenceLongPress-BMcpaynk.js → referenceLongPress-Bp8q50sv.js} +1 -1
  152. package/dist/client/assets/referenceLongPress-Bp8q50sv.js.br +0 -0
  153. package/dist/client/assets/referenceLongPress-Bp8q50sv.js.gz +0 -0
  154. package/dist/client/assets/{requirementDiagram-BXWQKSXE-DdFhwbqd.js → requirementDiagram-BXWQKSXE-Ob4lS23U.js} +1 -1
  155. package/dist/client/assets/requirementDiagram-BXWQKSXE-Ob4lS23U.js.br +0 -0
  156. package/dist/client/assets/requirementDiagram-BXWQKSXE-Ob4lS23U.js.gz +0 -0
  157. package/dist/client/assets/{sankeyDiagram-P5KCCOFB-DIEO7iin.js → sankeyDiagram-P5KCCOFB-Cc5e7umb.js} +1 -1
  158. package/dist/client/assets/sankeyDiagram-P5KCCOFB-Cc5e7umb.js.br +0 -0
  159. package/dist/client/assets/sankeyDiagram-P5KCCOFB-Cc5e7umb.js.gz +0 -0
  160. package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-0Jq8ZpjE.js → sequenceDiagram-WJ2MYXX4-CLTRKFht.js} +1 -1
  161. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-CLTRKFht.js.br +0 -0
  162. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-CLTRKFht.js.gz +0 -0
  163. package/dist/client/assets/{sizeCapture-INFHLROL-CzkB3_L-.js → sizeCapture-INFHLROL-h6hFhQw6.js} +1 -1
  164. package/dist/client/assets/sizeCapture-INFHLROL-h6hFhQw6.js.br +0 -0
  165. package/dist/client/assets/sizeCapture-INFHLROL-h6hFhQw6.js.gz +0 -0
  166. package/dist/client/assets/{sparkles-OssC7CZI.js → sparkles-9OJtJfyK.js} +1 -1
  167. package/dist/client/assets/{stateDiagram-D77RDMKH-B1UZvmmJ.js → stateDiagram-D77RDMKH-DSaJxX_r.js} +1 -1
  168. package/dist/client/assets/stateDiagram-D77RDMKH-DSaJxX_r.js.br +0 -0
  169. package/dist/client/assets/stateDiagram-D77RDMKH-DSaJxX_r.js.gz +0 -0
  170. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-CQ9iS9Nl.js +1 -0
  171. package/dist/client/assets/{swimlanes-42K2YHIH-CwBFrD7Q.js → swimlanes-42K2YHIH-CP7ABWyE.js} +1 -1
  172. package/dist/client/assets/swimlanes-42K2YHIH-CP7ABWyE.js.br +0 -0
  173. package/dist/client/assets/swimlanes-42K2YHIH-CP7ABWyE.js.gz +0 -0
  174. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-BbfCRvRt.js +8 -0
  175. package/dist/client/assets/{timeline-definition-24CTP7MA-Cgrwm9y7.js → timeline-definition-24CTP7MA-CdwVIVF6.js} +1 -1
  176. package/dist/client/assets/timeline-definition-24CTP7MA-CdwVIVF6.js.br +0 -0
  177. package/dist/client/assets/timeline-definition-24CTP7MA-CdwVIVF6.js.gz +0 -0
  178. package/dist/client/assets/{triangle-alert-gfowObfL.js → triangle-alert-BvT4KSYf.js} +1 -1
  179. package/dist/client/assets/{vennDiagram-4TSXK5OY-JVQ9D_hy.js → vennDiagram-4TSXK5OY-BXGgQFVY.js} +1 -1
  180. package/dist/client/assets/{vennDiagram-4TSXK5OY-JVQ9D_hy.js.br → vennDiagram-4TSXK5OY-BXGgQFVY.js.br} +0 -0
  181. package/dist/client/assets/vennDiagram-4TSXK5OY-BXGgQFVY.js.gz +0 -0
  182. package/dist/client/assets/{videoCompression-D1SrM0Eo.js → videoCompression-BFXJyhpz.js} +1 -1
  183. package/dist/client/assets/videoCompression-BFXJyhpz.js.br +0 -0
  184. package/dist/client/assets/videoCompression-BFXJyhpz.js.gz +0 -0
  185. package/dist/client/assets/{wardleyDiagram-VM6X3IG4-BsmpGt9d.js → wardleyDiagram-VM6X3IG4-CtLophqU.js} +1 -1
  186. package/dist/client/assets/wardleyDiagram-VM6X3IG4-CtLophqU.js.br +0 -0
  187. package/dist/client/assets/wardleyDiagram-VM6X3IG4-CtLophqU.js.gz +0 -0
  188. package/dist/client/assets/{xychartDiagram-S5SC5T6Z-C33-nORD.js → xychartDiagram-S5SC5T6Z-YZ9bnI1e.js} +1 -1
  189. package/dist/client/assets/xychartDiagram-S5SC5T6Z-YZ9bnI1e.js.br +0 -0
  190. package/dist/client/assets/xychartDiagram-S5SC5T6Z-YZ9bnI1e.js.gz +0 -0
  191. package/dist/client/index.html +2 -2
  192. package/dist/client/index.html.br +0 -0
  193. package/dist/client/index.html.gz +0 -0
  194. package/dist/client/sw.js +1 -1
  195. package/dist/client/sw.js.br +0 -0
  196. package/dist/client/sw.js.gz +0 -0
  197. package/dist/server/agent/collaborationCli.js +11 -3
  198. package/dist/server/agent/collaborationGroupRoutes.js +18 -0
  199. package/dist/server/agent/collaborationPeerTransport.js +19 -1
  200. package/dist/server/agent/collaborationRoutes.js +12 -0
  201. package/dist/server/agent/collaborationService.js +83 -8
  202. package/dist/server/agent/nativeSessionSearch.js +84 -0
  203. package/dist/server/agent/sessionSearchStore.js +2 -1
  204. package/dist/server/federation/trustedCa.js +9 -2
  205. package/dist/server/routes/filesystem.js +43 -1
  206. package/dist/server/routes/terminal.js +118 -10
  207. package/dist/server/utils/settings.js +14 -0
  208. package/dist/server/workers/nativeSessionSearchWorker.js +416 -0
  209. package/package.json +1 -1
  210. package/runtime-manifest.json +3 -3
  211. package/dist/client/assets/App-BgEYOR8Z.js +0 -157
  212. package/dist/client/assets/App-BgEYOR8Z.js.br +0 -0
  213. package/dist/client/assets/App-BgEYOR8Z.js.gz +0 -0
  214. package/dist/client/assets/ChangeWalkthroughPanel-Bvg7jZNw.js.br +0 -0
  215. package/dist/client/assets/ChangeWalkthroughPanel-Bvg7jZNw.js.gz +0 -0
  216. package/dist/client/assets/DagPlayground-DSM5oYq3.js.br +0 -0
  217. package/dist/client/assets/DagPlayground-DSM5oYq3.js.gz +0 -0
  218. package/dist/client/assets/DiffLab-CgI11xY5.js.br +0 -0
  219. package/dist/client/assets/DiffLab-CgI11xY5.js.gz +0 -0
  220. package/dist/client/assets/DiffReview-DOmoMEgC.js.br +0 -0
  221. package/dist/client/assets/DiffReview-DOmoMEgC.js.gz +0 -0
  222. package/dist/client/assets/DiffReviewLab-CEdM0rim.js.br +0 -0
  223. package/dist/client/assets/DiffReviewLab-CEdM0rim.js.gz +0 -0
  224. package/dist/client/assets/DiffViewer-CI3JmNyq.js +0 -37
  225. package/dist/client/assets/DiffViewer-CI3JmNyq.js.br +0 -0
  226. package/dist/client/assets/DiffViewer-CI3JmNyq.js.gz +0 -0
  227. package/dist/client/assets/ModelPreview-DNiQACGL.js.br +0 -0
  228. package/dist/client/assets/ModelPreview-DNiQACGL.js.gz +0 -0
  229. package/dist/client/assets/RightSidebar-CpPgHZEU.js +0 -1678
  230. package/dist/client/assets/RightSidebar-CpPgHZEU.js.br +0 -0
  231. package/dist/client/assets/RightSidebar-CpPgHZEU.js.gz +0 -0
  232. package/dist/client/assets/abnfDiagram-VCTEODGH-ByazGh0D.js.br +0 -0
  233. package/dist/client/assets/abnfDiagram-VCTEODGH-ByazGh0D.js.gz +0 -0
  234. package/dist/client/assets/app-UpvbJ3fT.js +0 -35
  235. package/dist/client/assets/app-UpvbJ3fT.js.br +0 -0
  236. package/dist/client/assets/app-UpvbJ3fT.js.gz +0 -0
  237. package/dist/client/assets/arc-DMO5fEDY.js.br +0 -0
  238. package/dist/client/assets/arc-DMO5fEDY.js.gz +0 -0
  239. package/dist/client/assets/architectureDiagram-5GKGNRK7-c6WktFDt.js.br +0 -0
  240. package/dist/client/assets/architectureDiagram-5GKGNRK7-c6WktFDt.js.gz +0 -0
  241. package/dist/client/assets/blockDiagram-I7D4REHJ-CN0lQ7zu.js.br +0 -0
  242. package/dist/client/assets/c4Diagram-7LVT6UL2-CALO2K48.js.br +0 -0
  243. package/dist/client/assets/c4Diagram-7LVT6UL2-CALO2K48.js.gz +0 -0
  244. package/dist/client/assets/channel-DcmoMLL-.js +0 -1
  245. package/dist/client/assets/chunk-F27PBJKO-gRP8AiSl.js.br +0 -0
  246. package/dist/client/assets/chunk-F27PBJKO-gRP8AiSl.js.gz +0 -0
  247. package/dist/client/assets/chunk-IMKFNOWR-BZewY7aF.js.br +0 -0
  248. package/dist/client/assets/chunk-IMKFNOWR-BZewY7aF.js.gz +0 -0
  249. package/dist/client/assets/chunk-SVP7TREG-rjbdtq2C.js.br +0 -0
  250. package/dist/client/assets/chunk-SVP7TREG-rjbdtq2C.js.gz +0 -0
  251. package/dist/client/assets/chunk-TICWLB2K-CxU1tNuL.js.br +0 -0
  252. package/dist/client/assets/chunk-TICWLB2K-CxU1tNuL.js.gz +0 -0
  253. package/dist/client/assets/classDiagram-ZZMXUADV-VSirHVcP.js +0 -1
  254. package/dist/client/assets/classDiagram-v2-VYDZK3BY-VSirHVcP.js +0 -1
  255. package/dist/client/assets/cose-bilkent-JH36ORCC-BiO-E-0q.js.br +0 -0
  256. package/dist/client/assets/cose-bilkent-JH36ORCC-BiO-E-0q.js.gz +0 -0
  257. package/dist/client/assets/cynefin-OW5HDTMX-DUC3zzns.js.br +0 -0
  258. package/dist/client/assets/cynefin-OW5HDTMX-DUC3zzns.js.gz +0 -0
  259. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-CR1RnhbU.js.br +0 -0
  260. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-CR1RnhbU.js.gz +0 -0
  261. package/dist/client/assets/dagre-GXQ25YYZ-d1joyB5v.js.br +0 -0
  262. package/dist/client/assets/dagre-GXQ25YYZ-d1joyB5v.js.gz +0 -0
  263. package/dist/client/assets/diagram-S7CK7UJ4-izL3GdCu.js.br +0 -0
  264. package/dist/client/assets/diagram-S7CK7UJ4-izL3GdCu.js.gz +0 -0
  265. package/dist/client/assets/diagram-UQ7AKVKN-CjoFV2sD.js.br +0 -0
  266. package/dist/client/assets/diagram-UQ7AKVKN-CjoFV2sD.js.gz +0 -0
  267. package/dist/client/assets/diagram-VSXAHHWV-BgHmsnTZ.js.br +0 -0
  268. package/dist/client/assets/diagram-VSXAHHWV-BgHmsnTZ.js.gz +0 -0
  269. package/dist/client/assets/diagram-VX7I27RA-DMzRLNbg.js.br +0 -0
  270. package/dist/client/assets/diagram-VX7I27RA-DMzRLNbg.js.gz +0 -0
  271. package/dist/client/assets/diagram-Z3DM3KII-kgWacykR.js.br +0 -0
  272. package/dist/client/assets/diagram-Z3DM3KII-kgWacykR.js.gz +0 -0
  273. package/dist/client/assets/ebnfDiagram-PWID7BFC-XzSXtFGS.js.br +0 -0
  274. package/dist/client/assets/ebnfDiagram-PWID7BFC-XzSXtFGS.js.gz +0 -0
  275. package/dist/client/assets/erDiagram-RLTQ6QDP-Bu67_rUZ.js.br +0 -0
  276. package/dist/client/assets/erDiagram-RLTQ6QDP-Bu67_rUZ.js.gz +0 -0
  277. package/dist/client/assets/flowDiagram-HODETNUW-BsK_b_G_.js.br +0 -0
  278. package/dist/client/assets/flowDiagram-HODETNUW-BsK_b_G_.js.gz +0 -0
  279. package/dist/client/assets/ganttDiagram-EL5Y4UJY-gCSBItav.js.br +0 -0
  280. package/dist/client/assets/ganttDiagram-EL5Y4UJY-gCSBItav.js.gz +0 -0
  281. package/dist/client/assets/gestureArbiter-BOikQWZ8.js.br +0 -0
  282. package/dist/client/assets/gestureArbiter-BOikQWZ8.js.gz +0 -0
  283. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-DL0NSPPn.js.br +0 -0
  284. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-DL0NSPPn.js.gz +0 -0
  285. package/dist/client/assets/index-Bv-r5mB7.css +0 -1
  286. package/dist/client/assets/index-Bv-r5mB7.css.br +0 -0
  287. package/dist/client/assets/index-Bv-r5mB7.css.gz +0 -0
  288. package/dist/client/assets/ishikawaDiagram-5VMMS53U-pz1lzDd4.js.br +0 -0
  289. package/dist/client/assets/ishikawaDiagram-5VMMS53U-pz1lzDd4.js.gz +0 -0
  290. package/dist/client/assets/journeyDiagram-3NMN7TZE-BrUnjTGd.js.br +0 -0
  291. package/dist/client/assets/journeyDiagram-3NMN7TZE-BrUnjTGd.js.gz +0 -0
  292. package/dist/client/assets/kanban-definition-UXKFOSKX-BKf4UYyB.js.br +0 -0
  293. package/dist/client/assets/kanban-definition-UXKFOSKX-BKf4UYyB.js.gz +0 -0
  294. package/dist/client/assets/layout-Dd_yzBVh.js.br +0 -0
  295. package/dist/client/assets/layout-Dd_yzBVh.js.gz +0 -0
  296. package/dist/client/assets/linear-iY7daKXS.js.br +0 -0
  297. package/dist/client/assets/linear-iY7daKXS.js.gz +0 -0
  298. package/dist/client/assets/mermaid.core-CYNb258G.js.br +0 -0
  299. package/dist/client/assets/mermaid.core-CYNb258G.js.gz +0 -0
  300. package/dist/client/assets/mindmap-definition-YA3MSWOX-ctnc7JBK.js.br +0 -0
  301. package/dist/client/assets/mindmap-definition-YA3MSWOX-ctnc7JBK.js.gz +0 -0
  302. package/dist/client/assets/passwordBootstrap-Bth6QB9C.js.br +0 -0
  303. package/dist/client/assets/passwordBootstrap-Bth6QB9C.js.gz +0 -0
  304. package/dist/client/assets/pegDiagram-XKGWAZYB-DVKAZXxP.js.br +0 -0
  305. package/dist/client/assets/pegDiagram-XKGWAZYB-DVKAZXxP.js.gz +0 -0
  306. package/dist/client/assets/pieDiagram-E7YTZNPT-C0u6lfoS.js.br +0 -0
  307. package/dist/client/assets/pieDiagram-E7YTZNPT-C0u6lfoS.js.gz +0 -0
  308. package/dist/client/assets/quadrantDiagram-AXDQQJYC-DXFDUoYJ.js.br +0 -0
  309. package/dist/client/assets/quadrantDiagram-AXDQQJYC-DXFDUoYJ.js.gz +0 -0
  310. package/dist/client/assets/railroadDiagram-O6MQD6OU-Cz-wrQ4E.js.br +0 -0
  311. package/dist/client/assets/railroadDiagram-O6MQD6OU-Cz-wrQ4E.js.gz +0 -0
  312. package/dist/client/assets/referenceLongPress-BMcpaynk.js.br +0 -0
  313. package/dist/client/assets/referenceLongPress-BMcpaynk.js.gz +0 -0
  314. package/dist/client/assets/requirementDiagram-BXWQKSXE-DdFhwbqd.js.br +0 -0
  315. package/dist/client/assets/requirementDiagram-BXWQKSXE-DdFhwbqd.js.gz +0 -0
  316. package/dist/client/assets/sankeyDiagram-P5KCCOFB-DIEO7iin.js.br +0 -0
  317. package/dist/client/assets/sankeyDiagram-P5KCCOFB-DIEO7iin.js.gz +0 -0
  318. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-0Jq8ZpjE.js.br +0 -0
  319. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-0Jq8ZpjE.js.gz +0 -0
  320. package/dist/client/assets/sizeCapture-INFHLROL-CzkB3_L-.js.br +0 -0
  321. package/dist/client/assets/sizeCapture-INFHLROL-CzkB3_L-.js.gz +0 -0
  322. package/dist/client/assets/stateDiagram-D77RDMKH-B1UZvmmJ.js.br +0 -0
  323. package/dist/client/assets/stateDiagram-D77RDMKH-B1UZvmmJ.js.gz +0 -0
  324. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-Cmg877fp.js +0 -1
  325. package/dist/client/assets/swimlanes-42K2YHIH-CwBFrD7Q.js.br +0 -0
  326. package/dist/client/assets/swimlanes-42K2YHIH-CwBFrD7Q.js.gz +0 -0
  327. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-CjR47hdK.js +0 -8
  328. package/dist/client/assets/timeline-definition-24CTP7MA-Cgrwm9y7.js.br +0 -0
  329. package/dist/client/assets/timeline-definition-24CTP7MA-Cgrwm9y7.js.gz +0 -0
  330. package/dist/client/assets/vennDiagram-4TSXK5OY-JVQ9D_hy.js.gz +0 -0
  331. package/dist/client/assets/videoCompression-D1SrM0Eo.js.br +0 -0
  332. package/dist/client/assets/videoCompression-D1SrM0Eo.js.gz +0 -0
  333. package/dist/client/assets/wardleyDiagram-VM6X3IG4-BsmpGt9d.js.br +0 -0
  334. package/dist/client/assets/wardleyDiagram-VM6X3IG4-BsmpGt9d.js.gz +0 -0
  335. package/dist/client/assets/xychartDiagram-S5SC5T6Z-C33-nORD.js.br +0 -0
  336. package/dist/client/assets/xychartDiagram-S5SC5T6Z-C33-nORD.js.gz +0 -0
@@ -0,0 +1,416 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { createHash } from 'node:crypto';
4
+ import { createInterface } from 'node:readline';
5
+ import { once } from 'node:events';
6
+ import { parentPort, threadId, workerData } from 'node:worker_threads';
7
+ const { directory, codexHome, claudeHome } = workerData;
8
+ const entries = new Map();
9
+ const failures = new Set();
10
+ let warning = null;
11
+ let building = false;
12
+ let refreshedAt = 0;
13
+ let refreshPromise = null;
14
+ const manifest = path.join(directory, 'manifest.json');
15
+ const temporarySuffix = `.tmp-${process.pid}-${threadId}`;
16
+ const uuid = /([a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12})\.jsonl$/i;
17
+ const asJson = (value) => value && typeof value === 'object' ? value : {};
18
+ const text = (value) => typeof value === 'string' ? value : '';
19
+ const indexed = (entry) => entry.size === entry.indexedSize && entry.mtime === entry.indexedMtime;
20
+ const textPath = (entry) => path.join(directory, `${entry.key}.txt`);
21
+ const status = () => ({ total: entries.size, indexed: [...entries.values()].filter(indexed).length, building, failed: failures.size, warning });
22
+ const publicRecord = (entry) => ({ key: entry.key, agentSlug: entry.agentSlug, agentNativeSessionId: entry.agentNativeSessionId, title: entry.title, cwd: entry.cwd, updatedAt: entry.updatedAt });
23
+ async function save() {
24
+ const temporary = `${manifest}${temporarySuffix}`;
25
+ await fs.promises.writeFile(temporary, JSON.stringify({ version: 2, entries: [...entries.values()] }), { mode: 0o600 });
26
+ await fs.promises.rename(temporary, manifest);
27
+ }
28
+ async function* lines(file) {
29
+ const stream = fs.createReadStream(file, { encoding: 'utf8' });
30
+ const reader = createInterface({ input: stream, crlfDelay: Infinity });
31
+ try {
32
+ for await (const line of reader)
33
+ yield line;
34
+ }
35
+ finally {
36
+ reader.close();
37
+ stream.destroy();
38
+ }
39
+ }
40
+ async function discover(root, recursive, depth = 0) {
41
+ let children;
42
+ try {
43
+ children = await fs.promises.readdir(root, { withFileTypes: true });
44
+ }
45
+ catch (error) {
46
+ if (error.code !== 'ENOENT')
47
+ warning = '部分历史目录无法读取,请检查当前服务账户的文件权限';
48
+ return [];
49
+ }
50
+ const found = [];
51
+ for (const child of children) {
52
+ const file = path.join(root, child.name);
53
+ if (child.isDirectory() && child.name !== 'subagents' && (recursive || depth === 0))
54
+ found.push(...await discover(file, recursive, depth + 1));
55
+ else if (child.isFile() && uuid.test(child.name))
56
+ found.push(file);
57
+ }
58
+ return found;
59
+ }
60
+ async function codexNames() {
61
+ const names = new Map();
62
+ try {
63
+ for await (const line of lines(path.join(codexHome, 'session_index.jsonl'))) {
64
+ try {
65
+ const record = JSON.parse(line);
66
+ const id = text(record.id);
67
+ const name = text(record.thread_name).trim();
68
+ if (id && name)
69
+ names.set(id, name);
70
+ }
71
+ catch { /* Ignore a trailing partial record while Codex writes. */ }
72
+ }
73
+ }
74
+ catch (error) {
75
+ if (error.code !== 'ENOENT')
76
+ warning = 'Codex 会话名称索引无法读取,暂用对话内容作为名称';
77
+ }
78
+ return names;
79
+ }
80
+ function content(value) {
81
+ if (typeof value === 'string')
82
+ return value;
83
+ if (!Array.isArray(value))
84
+ return '';
85
+ return value.map(block => {
86
+ const item = asJson(block);
87
+ if (['text', 'input_text', 'output_text'].includes(text(item.type)))
88
+ return text(item.text);
89
+ return item.type === 'tool_result' ? content(item.content) : '';
90
+ }).filter(Boolean).join('\n');
91
+ }
92
+ function parse(entry, line) {
93
+ // Codex world_state and tool snapshots dominate transcript size. These
94
+ // records contain no user/assistant dialogue; avoid parsing their payloads.
95
+ if (entry.agentSlug === 'codex') {
96
+ const type = /^\{[^\n]{0,200}?"type"\s*:\s*"([^"]+)"/.exec(line)?.[1];
97
+ if (type && !['session_meta', 'response_item', 'event_msg'].includes(type))
98
+ return '';
99
+ }
100
+ let record;
101
+ try {
102
+ record = JSON.parse(line);
103
+ }
104
+ catch {
105
+ return '';
106
+ }
107
+ let value = '';
108
+ let user = false;
109
+ if (entry.agentSlug === 'codex') {
110
+ const payload = asJson(record.payload);
111
+ if (record.type === 'session_meta') {
112
+ const id = text(payload.id) || text(payload.session_id);
113
+ if (id && id !== entry.agentNativeSessionId)
114
+ return '';
115
+ entry.cwd = text(payload.cwd) || entry.cwd;
116
+ }
117
+ else if (record.type === 'response_item' && payload.type === 'message' && ['user', 'assistant'].includes(text(payload.role))) {
118
+ value = content(payload.content);
119
+ user = payload.role === 'user';
120
+ }
121
+ else if (record.type === 'response_item' && ['function_call_output', 'custom_tool_call_output'].includes(text(payload.type))) {
122
+ value = content(payload.output);
123
+ }
124
+ else if (record.type === 'event_msg' && ['user_message', 'agent_message'].includes(text(payload.type))) {
125
+ value = text(payload.message);
126
+ user = payload.type === 'user_message';
127
+ }
128
+ }
129
+ else {
130
+ if (record.isSidechain)
131
+ return '';
132
+ const id = text(record.sessionId);
133
+ if (id && id !== entry.agentNativeSessionId)
134
+ return '';
135
+ entry.cwd = text(record.cwd) || entry.cwd;
136
+ const name = text(record.customTitle) || text(record.aiTitle);
137
+ if (name) {
138
+ entry.title = name;
139
+ entry.named = true;
140
+ }
141
+ if (['user', 'assistant'].includes(text(record.type)) && !record.isMeta) {
142
+ const message = asJson(record.message);
143
+ value = content(message.content);
144
+ user = record.type === 'user' && (typeof message.content === 'string' || Array.isArray(message.content) && message.content.some(block => asJson(block).type === 'text'));
145
+ }
146
+ }
147
+ value = value.replace(/\u001b\[[0-?]*[ -/]*[@-~]/g, '').replace(/[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f]/g, '').replace(/\s+/g, ' ').trim();
148
+ if (user && !entry.named && value && !/^(?:# AGENTS\.md|<environment_context>|<INSTRUCTIONS>|<system-reminder>|\[Request interrupted)/.test(value)) {
149
+ entry.title = value.slice(0, 100);
150
+ entry.named = true;
151
+ }
152
+ return value;
153
+ }
154
+ async function readHead(entry) {
155
+ const handle = await fs.promises.open(entry.file, 'r');
156
+ try {
157
+ const buffer = Buffer.alloc(256 * 1024);
158
+ const { bytesRead } = await handle.read(buffer, 0, buffer.length, 0);
159
+ const head = buffer.subarray(0, bytesRead).toString('utf8');
160
+ const complete = bytesRead < buffer.length ? head : head.slice(0, head.lastIndexOf('\n'));
161
+ for (const line of complete.split('\n'))
162
+ if (line)
163
+ parse(entry, line);
164
+ }
165
+ finally {
166
+ await handle.close();
167
+ }
168
+ }
169
+ async function refresh() {
170
+ if (building || Date.now() - refreshedAt < 30_000)
171
+ return;
172
+ if (refreshPromise)
173
+ return refreshPromise;
174
+ refreshPromise = (async () => {
175
+ warning = null;
176
+ const names = await codexNames();
177
+ const sources = [
178
+ { slug: 'codex', files: await discover(path.join(codexHome, 'sessions'), true) },
179
+ { slug: 'codex', files: await discover(path.join(codexHome, 'archived_sessions'), true) },
180
+ { slug: 'claude', files: await discover(path.join(claudeHome, 'projects'), false) },
181
+ ];
182
+ const seen = new Set();
183
+ for (const source of sources)
184
+ for (const file of source.files) {
185
+ const id = uuid.exec(path.basename(file))[1];
186
+ const key = createHash('sha256').update(file).digest('hex');
187
+ seen.add(key);
188
+ try {
189
+ const stat = await fs.promises.stat(file);
190
+ const previous = entries.get(key);
191
+ const entry = { ...previous, key, file, agentSlug: source.slug, agentNativeSessionId: id,
192
+ title: previous?.title || `${source.slug === 'codex' ? 'Codex' : 'Claude'} · ${id.slice(0, 8)}`,
193
+ cwd: previous?.cwd || '', updatedAt: stat.mtimeMs, mtime: stat.mtimeMs, size: stat.size };
194
+ const name = source.slug === 'codex' ? names.get(id) : null;
195
+ if (name) {
196
+ entry.title = name;
197
+ entry.named = true;
198
+ }
199
+ if (!previous || !entry.cwd)
200
+ await readHead(entry);
201
+ // A cache is disposable: missing text must be rebuilt, not counted ready.
202
+ if (indexed(entry) && !fs.existsSync(textPath(entry))) {
203
+ entry.indexedMtime = undefined;
204
+ entry.indexedSize = undefined;
205
+ }
206
+ entries.set(key, entry);
207
+ }
208
+ catch {
209
+ warning = '部分历史文件暂时无法读取,其余会话仍可搜索';
210
+ }
211
+ }
212
+ for (const [key, entry] of entries)
213
+ if (!seen.has(key)) {
214
+ entries.delete(key);
215
+ failures.delete(key);
216
+ await fs.promises.rm(textPath(entry), { force: true });
217
+ }
218
+ refreshedAt = Date.now();
219
+ failures.clear();
220
+ void build().catch(() => { warning = '历史索引写入失败,请检查当前服务账户的磁盘空间与文件权限'; });
221
+ })();
222
+ try {
223
+ await refreshPromise;
224
+ }
225
+ finally {
226
+ refreshPromise = null;
227
+ }
228
+ }
229
+ async function indexEntry(entry) {
230
+ const temporary = `${textPath(entry)}${temporarySuffix}`;
231
+ // Native transcripts are append-only. Reuse extracted dialogue and read only
232
+ // newly appended source bytes; atomic replacement keeps searches consistent.
233
+ const append = entry.indexedOffset !== undefined && entry.indexedSize !== undefined && entry.size > entry.indexedSize && fs.existsSync(textPath(entry));
234
+ if (append)
235
+ await fs.promises.copyFile(textPath(entry), temporary);
236
+ const start = append ? entry.indexedOffset : 0;
237
+ const output = fs.createWriteStream(temporary, { mode: 0o600, flags: append ? 'a' : 'w' });
238
+ let outputError = null;
239
+ output.on('error', error => { outputError = error; });
240
+ const recent = new Set();
241
+ let offset = start;
242
+ let fragments = [];
243
+ let fragmentBytes = 0;
244
+ const stream = fs.createReadStream(entry.file, { encoding: 'utf8', start, ...(entry.size > start ? { end: entry.size - 1 } : {}) });
245
+ try {
246
+ for await (const chunk of stream) {
247
+ if (outputError)
248
+ throw outputError;
249
+ const valueChunk = chunk;
250
+ let cursor = 0;
251
+ let newline;
252
+ // Scan each incoming chunk once. Re-scanning a growing multi-megabyte
253
+ // world_state line on every chunk makes first-time indexing quadratic.
254
+ while ((newline = valueChunk.indexOf('\n', cursor)) >= 0) {
255
+ const piece = valueChunk.slice(cursor, newline);
256
+ const line = fragments.length ? fragments.join('') + piece : piece;
257
+ offset += fragmentBytes + Buffer.byteLength(piece) + 1;
258
+ fragments = [];
259
+ fragmentBytes = 0;
260
+ cursor = newline + 1;
261
+ const value = parse(entry, line);
262
+ if (!value)
263
+ continue;
264
+ const hash = createHash('sha256').update(value).digest('hex');
265
+ if (recent.has(hash))
266
+ continue;
267
+ recent.add(hash);
268
+ if (recent.size > 64)
269
+ recent.delete(recent.values().next().value);
270
+ if (!output.write(`${value}\n`))
271
+ await once(output, 'drain');
272
+ }
273
+ if (cursor < valueChunk.length) {
274
+ const remainder = valueChunk.slice(cursor);
275
+ fragments.push(remainder);
276
+ fragmentBytes += Buffer.byteLength(remainder);
277
+ }
278
+ }
279
+ output.end();
280
+ await once(output, 'finish');
281
+ if (outputError)
282
+ throw outputError;
283
+ await fs.promises.rename(temporary, textPath(entry));
284
+ // A file appended during indexing will be picked up on the next refresh.
285
+ entry.indexedSize = entry.size;
286
+ entry.indexedMtime = entry.mtime;
287
+ entry.indexedOffset = offset;
288
+ }
289
+ catch (error) {
290
+ output.destroy();
291
+ await fs.promises.rm(temporary, { force: true }).catch(() => { });
292
+ throw error;
293
+ }
294
+ finally {
295
+ stream.destroy();
296
+ }
297
+ }
298
+ async function build() {
299
+ if (building)
300
+ return;
301
+ building = true;
302
+ try {
303
+ const pending = [...entries.values()].filter(entry => !indexed(entry)).sort((a, b) => b.updatedAt - a.updatedAt);
304
+ let count = 0;
305
+ for (const entry of pending) {
306
+ try {
307
+ await indexEntry(entry);
308
+ }
309
+ catch {
310
+ failures.add(entry.key);
311
+ }
312
+ if (++count % 10 === 0)
313
+ await save();
314
+ }
315
+ await save();
316
+ }
317
+ finally {
318
+ building = false;
319
+ }
320
+ }
321
+ async function initialize() {
322
+ await fs.promises.mkdir(directory, { recursive: true, mode: 0o700 });
323
+ try {
324
+ const cached = JSON.parse(await fs.promises.readFile(manifest, 'utf8'));
325
+ if (cached.version === 2 && Array.isArray(cached.entries))
326
+ for (const entry of cached.entries) {
327
+ if (/^[a-f0-9]{64}$/.test(entry.key))
328
+ entries.set(entry.key, entry);
329
+ }
330
+ }
331
+ catch { /* First use or an interrupted cache write: derive from originals. */ }
332
+ await refresh();
333
+ }
334
+ const ready = initialize();
335
+ async function search(query, limit, titles, signal) {
336
+ await ready;
337
+ await refresh();
338
+ const startedBuilding = building;
339
+ const needle = query.trim().toLocaleLowerCase();
340
+ const results = [];
341
+ const matchedSessions = new Set();
342
+ const names = new Map(titles.map(entry => [`${entry.agentSlug}:${entry.agentNativeSessionId}`, entry.title]));
343
+ const ordered = [...entries.values()].sort((a, b) => b.updatedAt - a.updatedAt);
344
+ let total = 0;
345
+ for (const entry of ordered) {
346
+ if (signal.aborted)
347
+ throw new Error('搜索已取消');
348
+ const identity = `${entry.agentSlug}:${entry.agentNativeSessionId}`;
349
+ if (matchedSessions.has(identity))
350
+ continue;
351
+ const title = names.get(identity) || entry.title;
352
+ let matchCount = 0;
353
+ let snippet = '';
354
+ const consider = (value) => {
355
+ const lower = value.toLocaleLowerCase();
356
+ let cursor = 0;
357
+ let first = -1;
358
+ while ((cursor = lower.indexOf(needle, cursor)) >= 0) {
359
+ if (first < 0)
360
+ first = cursor;
361
+ matchCount = Math.min(999, matchCount + 1);
362
+ cursor += needle.length;
363
+ }
364
+ if (first >= 0 && !snippet)
365
+ snippet = value.slice(Math.max(0, first - 90), first + needle.length + 170);
366
+ };
367
+ if (needle) {
368
+ consider(`${title}${title !== entry.title ? `\n${entry.title}` : ''}\n${entry.cwd}\n${entry.agentSlug}\n${entry.agentNativeSessionId}`);
369
+ const metadataSnippet = snippet;
370
+ snippet = '';
371
+ try {
372
+ if (entry.indexedSize !== undefined)
373
+ for await (const line of lines(textPath(entry))) {
374
+ if (signal.aborted)
375
+ throw new Error('搜索已取消');
376
+ consider(line);
377
+ }
378
+ }
379
+ catch (error) {
380
+ if (signal.aborted)
381
+ throw error;
382
+ if (error.code !== 'ENOENT')
383
+ warning = '部分历史索引无法读取,请检查文件权限';
384
+ }
385
+ snippet ||= metadataSnippet;
386
+ if (!matchCount)
387
+ continue;
388
+ }
389
+ total += 1;
390
+ matchedSessions.add(identity);
391
+ if (results.length < limit)
392
+ results.push({ ...publicRecord(entry), title, snippet: snippet.replace(/\s+/g, ' ').trim(), matchCount });
393
+ }
394
+ // A scan begun during indexing may have read an older snapshot. Keep one
395
+ // more automatic refresh even if the background build finished meanwhile.
396
+ return { results, matchedSessions: [...matchedSessions], total, index: { ...status(), building: building || startedBuilding } };
397
+ }
398
+ const requests = new Map();
399
+ parentPort.on('message', (input) => {
400
+ if (input.type === 'cancel') {
401
+ requests.get(input.id)?.abort();
402
+ return;
403
+ }
404
+ const controller = new AbortController();
405
+ requests.set(input.id, controller);
406
+ void (async () => {
407
+ await ready;
408
+ if (input.type === 'search')
409
+ return search(input.query || '', Math.max(1, Math.min(input.limit || 50, 5100)), input.titles || [], controller.signal);
410
+ const entry = entries.get(input.key || '');
411
+ if (!entry)
412
+ return null;
413
+ await fs.promises.access(entry.file, fs.constants.R_OK);
414
+ return publicRecord(entry);
415
+ })().then(value => parentPort.postMessage({ id: input.id, value }), error => parentPort.postMessage({ id: input.id, error: error instanceof Error ? error.message : '历史会话搜索失败' })).finally(() => requests.delete(input.id));
416
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "termdock",
3
- "version": "1.4.284",
3
+ "version": "1.4.285",
4
4
  "description": "A complete web-based terminal application with modern UI",
5
5
  "type": "module",
6
6
  "main": ".desktop-dist/main.js",
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
3
  "packageName": "termdock",
4
- "version": "1.4.284",
4
+ "version": "1.4.285",
5
5
  "runtimeProtocolVersion": 1,
6
6
  "minimumDesktopVersion": "1.4.46",
7
7
  "nodeMajor": 22,
8
8
  "dependencyHash": "sha256-+FK03eSUIISxxpGNQTlYLuAcpuytFuT+tiLAMYVhwl4=",
9
- "serverBundleHash": "sha256-0r6Gzanqmtt0Nigx9rbfdtSHHIB9Ly14aXcLHkZaCQg=",
10
- "clientBundleHash": "sha256-jeTDwvOS9vYtS9ulgVFya/PJF0XmEVpqpU+a11iLdPI=",
9
+ "serverBundleHash": "sha256-GdCMjFdGKsIRDBHw/W6bjwcnuZT2+dOYRyhPqAcey2o=",
10
+ "clientBundleHash": "sha256-VOfui9zVEUum3dHhRYSV+VmpaO0dvcI0kVa2xJwQC0E=",
11
11
  "entrypoint": "dist/server/cli.js",
12
12
  "clientEntrypoint": "dist/client/index.html"
13
13
  }