termdock 1.4.284 → 1.4.286
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.
- package/.desktop-dist/main.js +10 -553
- package/README.md +2 -4
- package/dist/client/assets/App-qs0jye8B.js +158 -0
- package/dist/client/assets/App-qs0jye8B.js.br +0 -0
- package/dist/client/assets/App-qs0jye8B.js.gz +0 -0
- package/dist/client/assets/{ChangeWalkthroughPanel-Bvg7jZNw.js → ChangeWalkthroughPanel-X-M6nxKJ.js} +1 -1
- package/dist/client/assets/ChangeWalkthroughPanel-X-M6nxKJ.js.br +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-X-M6nxKJ.js.gz +0 -0
- package/dist/client/assets/{DagPlayground-DSM5oYq3.js → DagPlayground-DgiUaUkH.js} +1 -1
- package/dist/client/assets/DagPlayground-DgiUaUkH.js.br +0 -0
- package/dist/client/assets/DagPlayground-DgiUaUkH.js.gz +0 -0
- package/dist/client/assets/{DiffLab-CgI11xY5.js → DiffLab-u8njwj0d.js} +1 -1
- package/dist/client/assets/DiffLab-u8njwj0d.js.br +0 -0
- package/dist/client/assets/DiffLab-u8njwj0d.js.gz +0 -0
- package/dist/client/assets/{DiffReview-DOmoMEgC.js → DiffReview-DoQY-klj.js} +1 -1
- package/dist/client/assets/DiffReview-DoQY-klj.js.br +0 -0
- package/dist/client/assets/DiffReview-DoQY-klj.js.gz +0 -0
- package/dist/client/assets/{DiffReviewLab-CEdM0rim.js → DiffReviewLab-DlKbMbfq.js} +1 -1
- package/dist/client/assets/DiffReviewLab-DlKbMbfq.js.br +0 -0
- package/dist/client/assets/DiffReviewLab-DlKbMbfq.js.gz +0 -0
- package/dist/client/assets/DiffViewer-nlvDqGPJ.js +37 -0
- package/dist/client/assets/DiffViewer-nlvDqGPJ.js.br +0 -0
- package/dist/client/assets/DiffViewer-nlvDqGPJ.js.gz +0 -0
- package/dist/client/assets/{ModelPreview-DNiQACGL.js → ModelPreview-C3beTH3N.js} +1 -1
- package/dist/client/assets/ModelPreview-C3beTH3N.js.br +0 -0
- package/dist/client/assets/ModelPreview-C3beTH3N.js.gz +0 -0
- package/dist/client/assets/RightSidebar-BtktcUdh.js +1678 -0
- package/dist/client/assets/RightSidebar-BtktcUdh.js.br +0 -0
- package/dist/client/assets/RightSidebar-BtktcUdh.js.gz +0 -0
- package/dist/client/assets/{abnfDiagram-VCTEODGH-ByazGh0D.js → abnfDiagram-VCTEODGH-7J_hDjG2.js} +1 -1
- package/dist/client/assets/abnfDiagram-VCTEODGH-7J_hDjG2.js.br +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-7J_hDjG2.js.gz +0 -0
- package/dist/client/assets/app-CHKqaWIE.js +35 -0
- package/dist/client/assets/app-CHKqaWIE.js.br +0 -0
- package/dist/client/assets/app-CHKqaWIE.js.gz +0 -0
- package/dist/client/assets/{arc-DMO5fEDY.js → arc-Bg_CuCZm.js} +1 -1
- package/dist/client/assets/arc-Bg_CuCZm.js.br +0 -0
- package/dist/client/assets/arc-Bg_CuCZm.js.gz +0 -0
- package/dist/client/assets/{architectureDiagram-5GKGNRK7-c6WktFDt.js → architectureDiagram-5GKGNRK7-CsSHwySz.js} +1 -1
- package/dist/client/assets/architectureDiagram-5GKGNRK7-CsSHwySz.js.br +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-CsSHwySz.js.gz +0 -0
- package/dist/client/assets/{blockDiagram-I7D4REHJ-CN0lQ7zu.js → blockDiagram-I7D4REHJ-DePM_hkV.js} +1 -1
- package/dist/client/assets/blockDiagram-I7D4REHJ-DePM_hkV.js.br +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-DePM_hkV.js.gz +0 -0
- package/dist/client/assets/{c4Diagram-7LVT6UL2-CALO2K48.js → c4Diagram-7LVT6UL2-BQ8B9h53.js} +1 -1
- package/dist/client/assets/c4Diagram-7LVT6UL2-BQ8B9h53.js.br +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-BQ8B9h53.js.gz +0 -0
- package/dist/client/assets/channel-8p7Zocq1.js +1 -0
- package/dist/client/assets/{chunk-2Q5K7J3B-CcQPyBbp.js → chunk-2Q5K7J3B-Bo9Nc-d4.js} +1 -1
- package/dist/client/assets/{chunk-5VM5RSS4-CEp2aHuN.js → chunk-5VM5RSS4-D_qQp7an.js} +1 -1
- package/dist/client/assets/{chunk-F27PBJKO-gRP8AiSl.js → chunk-F27PBJKO-CJvGLWuF.js} +1 -1
- package/dist/client/assets/chunk-F27PBJKO-CJvGLWuF.js.br +0 -0
- package/dist/client/assets/chunk-F27PBJKO-CJvGLWuF.js.gz +0 -0
- package/dist/client/assets/{chunk-IMKFNOWR-BZewY7aF.js → chunk-IMKFNOWR-e4fa23mF.js} +1 -1
- package/dist/client/assets/chunk-IMKFNOWR-e4fa23mF.js.br +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-e4fa23mF.js.gz +0 -0
- package/dist/client/assets/{chunk-JWPE2WC7-C4S_lg0B.js → chunk-JWPE2WC7-D9qVRvQs.js} +1 -1
- package/dist/client/assets/{chunk-POPQ4Y6H-BgYxXL0V.js → chunk-POPQ4Y6H-7eOizLll.js} +1 -1
- package/dist/client/assets/{chunk-SVP7TREG-rjbdtq2C.js → chunk-SVP7TREG-Co1wDBYI.js} +1 -1
- package/dist/client/assets/chunk-SVP7TREG-Co1wDBYI.js.br +0 -0
- package/dist/client/assets/chunk-SVP7TREG-Co1wDBYI.js.gz +0 -0
- package/dist/client/assets/{chunk-TICWLB2K-CxU1tNuL.js → chunk-TICWLB2K-yKjTtLNf.js} +1 -1
- package/dist/client/assets/chunk-TICWLB2K-yKjTtLNf.js.br +0 -0
- package/dist/client/assets/chunk-TICWLB2K-yKjTtLNf.js.gz +0 -0
- package/dist/client/assets/{chunk-XXDRQBXY-CSSO11_4.js → chunk-XXDRQBXY-DDFq5Eoi.js} +1 -1
- package/dist/client/assets/classDiagram-ZZMXUADV-DM8VyUpP.js +1 -0
- package/dist/client/assets/classDiagram-v2-VYDZK3BY-DM8VyUpP.js +1 -0
- package/dist/client/assets/{cose-bilkent-JH36ORCC-BiO-E-0q.js → cose-bilkent-JH36ORCC-Ng2b-szu.js} +1 -1
- package/dist/client/assets/cose-bilkent-JH36ORCC-Ng2b-szu.js.br +0 -0
- package/dist/client/assets/cose-bilkent-JH36ORCC-Ng2b-szu.js.gz +0 -0
- package/dist/client/assets/{cynefin-OW5HDTMX-DUC3zzns.js → cynefin-OW5HDTMX-BUzoxsoE.js} +1 -1
- package/dist/client/assets/cynefin-OW5HDTMX-BUzoxsoE.js.br +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-BUzoxsoE.js.gz +0 -0
- package/dist/client/assets/{cynefinDiagram-5FMLGOSQ-CR1RnhbU.js → cynefinDiagram-5FMLGOSQ-9sKimYPk.js} +1 -1
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-9sKimYPk.js.br +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-9sKimYPk.js.gz +0 -0
- package/dist/client/assets/{dagre-GXQ25YYZ-d1joyB5v.js → dagre-GXQ25YYZ-C6GZ4pYU.js} +1 -1
- package/dist/client/assets/dagre-GXQ25YYZ-C6GZ4pYU.js.br +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-C6GZ4pYU.js.gz +0 -0
- package/dist/client/assets/{diagram-S7CK7UJ4-izL3GdCu.js → diagram-S7CK7UJ4-DHewWm_2.js} +1 -1
- package/dist/client/assets/diagram-S7CK7UJ4-DHewWm_2.js.br +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-DHewWm_2.js.gz +0 -0
- package/dist/client/assets/{diagram-UQ7AKVKN-CjoFV2sD.js → diagram-UQ7AKVKN-BU-Qm_iS.js} +1 -1
- package/dist/client/assets/diagram-UQ7AKVKN-BU-Qm_iS.js.br +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-BU-Qm_iS.js.gz +0 -0
- package/dist/client/assets/{diagram-VSXAHHWV-BgHmsnTZ.js → diagram-VSXAHHWV-DEvxj92u.js} +1 -1
- package/dist/client/assets/diagram-VSXAHHWV-DEvxj92u.js.br +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-DEvxj92u.js.gz +0 -0
- package/dist/client/assets/{diagram-VX7I27RA-DMzRLNbg.js → diagram-VX7I27RA-DwwnVInb.js} +1 -1
- package/dist/client/assets/diagram-VX7I27RA-DwwnVInb.js.br +0 -0
- package/dist/client/assets/diagram-VX7I27RA-DwwnVInb.js.gz +0 -0
- package/dist/client/assets/{diagram-Z3DM3KII-kgWacykR.js → diagram-Z3DM3KII-DDhqqeca.js} +1 -1
- package/dist/client/assets/diagram-Z3DM3KII-DDhqqeca.js.br +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-DDhqqeca.js.gz +0 -0
- package/dist/client/assets/{ebnfDiagram-PWID7BFC-XzSXtFGS.js → ebnfDiagram-PWID7BFC-CQz2BRgT.js} +1 -1
- package/dist/client/assets/ebnfDiagram-PWID7BFC-CQz2BRgT.js.br +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-CQz2BRgT.js.gz +0 -0
- package/dist/client/assets/{erDiagram-RLTQ6QDP-Bu67_rUZ.js → erDiagram-RLTQ6QDP-D2eLjKEA.js} +1 -1
- package/dist/client/assets/erDiagram-RLTQ6QDP-D2eLjKEA.js.br +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-D2eLjKEA.js.gz +0 -0
- package/dist/client/assets/{flowDiagram-HODETNUW-BsK_b_G_.js → flowDiagram-HODETNUW-B7oJq5P3.js} +1 -1
- package/dist/client/assets/flowDiagram-HODETNUW-B7oJq5P3.js.br +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-B7oJq5P3.js.gz +0 -0
- package/dist/client/assets/{ganttDiagram-EL5Y4UJY-gCSBItav.js → ganttDiagram-EL5Y4UJY-BUA_LsMw.js} +1 -1
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-BUA_LsMw.js.br +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-BUA_LsMw.js.gz +0 -0
- package/dist/client/assets/{gestureArbiter-BOikQWZ8.js → gestureArbiter-8VtxF9dg.js} +1 -1
- package/dist/client/assets/gestureArbiter-8VtxF9dg.js.br +0 -0
- package/dist/client/assets/gestureArbiter-8VtxF9dg.js.gz +0 -0
- package/dist/client/assets/{gitGraphDiagram-WWUBYQGX-DL0NSPPn.js → gitGraphDiagram-WWUBYQGX-BlbsPdki.js} +1 -1
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-BlbsPdki.js.br +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-BlbsPdki.js.gz +0 -0
- package/dist/client/assets/{index-Bv-r5mB7.css → index-DUCUcxTy.css} +1 -1
- package/dist/client/assets/index-DUCUcxTy.css.br +0 -0
- package/dist/client/assets/index-DUCUcxTy.css.gz +0 -0
- package/dist/client/assets/{infoDiagram-27XIBGKW-Cwevdubr.js → infoDiagram-27XIBGKW-DdYvRIDS.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-5VMMS53U-pz1lzDd4.js → ishikawaDiagram-5VMMS53U-CZbBbDjz.js} +1 -1
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-CZbBbDjz.js.br +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-CZbBbDjz.js.gz +0 -0
- package/dist/client/assets/{journeyDiagram-3NMN7TZE-BrUnjTGd.js → journeyDiagram-3NMN7TZE-DtxlqtaG.js} +1 -1
- package/dist/client/assets/journeyDiagram-3NMN7TZE-DtxlqtaG.js.br +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-DtxlqtaG.js.gz +0 -0
- package/dist/client/assets/{kanban-definition-UXKFOSKX-BKf4UYyB.js → kanban-definition-UXKFOSKX-UMDV9UCG.js} +1 -1
- package/dist/client/assets/kanban-definition-UXKFOSKX-UMDV9UCG.js.br +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-UMDV9UCG.js.gz +0 -0
- package/dist/client/assets/{layout-Dd_yzBVh.js → layout-CAAXci79.js} +1 -1
- package/dist/client/assets/layout-CAAXci79.js.br +0 -0
- package/dist/client/assets/layout-CAAXci79.js.gz +0 -0
- package/dist/client/assets/{linear-iY7daKXS.js → linear-BGBP_FE_.js} +1 -1
- package/dist/client/assets/linear-BGBP_FE_.js.br +0 -0
- package/dist/client/assets/linear-BGBP_FE_.js.gz +0 -0
- package/dist/client/assets/{mermaid.core-CYNb258G.js → mermaid.core-BH_WDKpZ.js} +5 -5
- package/dist/client/assets/mermaid.core-BH_WDKpZ.js.br +0 -0
- package/dist/client/assets/mermaid.core-BH_WDKpZ.js.gz +0 -0
- package/dist/client/assets/{mindmap-definition-YA3MSWOX-ctnc7JBK.js → mindmap-definition-YA3MSWOX-7yyx6kg5.js} +1 -1
- package/dist/client/assets/mindmap-definition-YA3MSWOX-7yyx6kg5.js.br +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-7yyx6kg5.js.gz +0 -0
- package/dist/client/assets/{passwordBootstrap-Bth6QB9C.js → passwordBootstrap-Dt3dN800.js} +1 -1
- package/dist/client/assets/passwordBootstrap-Dt3dN800.js.br +0 -0
- package/dist/client/assets/passwordBootstrap-Dt3dN800.js.gz +0 -0
- package/dist/client/assets/{pegDiagram-XKGWAZYB-DVKAZXxP.js → pegDiagram-XKGWAZYB-D254I9Yl.js} +1 -1
- package/dist/client/assets/pegDiagram-XKGWAZYB-D254I9Yl.js.br +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-D254I9Yl.js.gz +0 -0
- package/dist/client/assets/{pieDiagram-E7YTZNPT-C0u6lfoS.js → pieDiagram-E7YTZNPT-DTy-4KXi.js} +1 -1
- package/dist/client/assets/pieDiagram-E7YTZNPT-DTy-4KXi.js.br +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-DTy-4KXi.js.gz +0 -0
- package/dist/client/assets/{quadrantDiagram-AXDQQJYC-DXFDUoYJ.js → quadrantDiagram-AXDQQJYC-BMsaHxl0.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-AXDQQJYC-DXFDUoYJ.js.br → quadrantDiagram-AXDQQJYC-BMsaHxl0.js.br} +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-BMsaHxl0.js.gz +0 -0
- package/dist/client/assets/{railroadDiagram-O6MQD6OU-Cz-wrQ4E.js → railroadDiagram-O6MQD6OU-D4c39AAQ.js} +1 -1
- package/dist/client/assets/railroadDiagram-O6MQD6OU-D4c39AAQ.js.br +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-D4c39AAQ.js.gz +0 -0
- package/dist/client/assets/{referenceLongPress-BMcpaynk.js → referenceLongPress-TTIbwCKV.js} +1 -1
- package/dist/client/assets/referenceLongPress-TTIbwCKV.js.br +0 -0
- package/dist/client/assets/referenceLongPress-TTIbwCKV.js.gz +0 -0
- package/dist/client/assets/{requirementDiagram-BXWQKSXE-DdFhwbqd.js → requirementDiagram-BXWQKSXE-CwJjBKnR.js} +1 -1
- package/dist/client/assets/requirementDiagram-BXWQKSXE-CwJjBKnR.js.br +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-CwJjBKnR.js.gz +0 -0
- package/dist/client/assets/{sankeyDiagram-P5KCCOFB-DIEO7iin.js → sankeyDiagram-P5KCCOFB-DVlRBDMK.js} +1 -1
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-DVlRBDMK.js.br +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-DVlRBDMK.js.gz +0 -0
- package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-0Jq8ZpjE.js → sequenceDiagram-WJ2MYXX4-BsWqKeoD.js} +1 -1
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-BsWqKeoD.js.br +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-BsWqKeoD.js.gz +0 -0
- package/dist/client/assets/{sizeCapture-INFHLROL-CzkB3_L-.js → sizeCapture-INFHLROL-1FEOsRFT.js} +1 -1
- package/dist/client/assets/sizeCapture-INFHLROL-1FEOsRFT.js.br +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-1FEOsRFT.js.gz +0 -0
- package/dist/client/assets/{sparkles-OssC7CZI.js → sparkles-hN4VSTDx.js} +1 -1
- package/dist/client/assets/{stateDiagram-D77RDMKH-B1UZvmmJ.js → stateDiagram-D77RDMKH-DWNE48Sc.js} +1 -1
- package/dist/client/assets/stateDiagram-D77RDMKH-DWNE48Sc.js.br +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-DWNE48Sc.js.gz +0 -0
- package/dist/client/assets/stateDiagram-v2-MP3YSRHH-BMprFuVB.js +1 -0
- package/dist/client/assets/{swimlanes-42K2YHIH-CwBFrD7Q.js → swimlanes-42K2YHIH-ghhxa8QM.js} +1 -1
- package/dist/client/assets/swimlanes-42K2YHIH-ghhxa8QM.js.br +0 -0
- package/dist/client/assets/swimlanes-42K2YHIH-ghhxa8QM.js.gz +0 -0
- package/dist/client/assets/swimlanesDiagram-VR7AAH4N-Dg4tYXGL.js +8 -0
- package/dist/client/assets/{timeline-definition-24CTP7MA-Cgrwm9y7.js → timeline-definition-24CTP7MA-B0eZfCze.js} +1 -1
- package/dist/client/assets/timeline-definition-24CTP7MA-B0eZfCze.js.br +0 -0
- package/dist/client/assets/timeline-definition-24CTP7MA-B0eZfCze.js.gz +0 -0
- package/dist/client/assets/{triangle-alert-gfowObfL.js → triangle-alert-zb36qQ-j.js} +1 -1
- package/dist/client/assets/{vennDiagram-4TSXK5OY-JVQ9D_hy.js → vennDiagram-4TSXK5OY-DCdV0A4l.js} +1 -1
- package/dist/client/assets/vennDiagram-4TSXK5OY-DCdV0A4l.js.br +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-DCdV0A4l.js.gz +0 -0
- package/dist/client/assets/{videoCompression-D1SrM0Eo.js → videoCompression-BzT-9eWg.js} +1 -1
- package/dist/client/assets/videoCompression-BzT-9eWg.js.br +0 -0
- package/dist/client/assets/videoCompression-BzT-9eWg.js.gz +0 -0
- package/dist/client/assets/{wardleyDiagram-VM6X3IG4-BsmpGt9d.js → wardleyDiagram-VM6X3IG4-BQvk-8b6.js} +1 -1
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-BQvk-8b6.js.br +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-BQvk-8b6.js.gz +0 -0
- package/dist/client/assets/{xychartDiagram-S5SC5T6Z-C33-nORD.js → xychartDiagram-S5SC5T6Z-D1VdK6g5.js} +1 -1
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-D1VdK6g5.js.br +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-D1VdK6g5.js.gz +0 -0
- package/dist/client/index.html +2 -2
- package/dist/client/index.html.br +0 -0
- package/dist/client/index.html.gz +0 -0
- package/dist/client/sw.js +1 -1
- package/dist/client/sw.js.br +0 -0
- package/dist/client/sw.js.gz +0 -0
- package/dist/server/agent/collaborationCli.js +11 -3
- package/dist/server/agent/collaborationGroupRoutes.js +18 -0
- package/dist/server/agent/collaborationPeerTransport.js +19 -1
- package/dist/server/agent/collaborationRoutes.js +12 -0
- package/dist/server/agent/collaborationService.js +83 -8
- package/dist/server/agent/nativeSessionSearch.js +84 -0
- package/dist/server/agent/sessionSearchStore.js +2 -1
- package/dist/server/entry.js +2 -6
- package/dist/server/federation/trustedCa.js +9 -2
- package/dist/server/routes/filesystem.js +43 -1
- package/dist/server/routes/terminal.js +122 -32
- package/dist/server/utils/enableSupervision.js +2 -3
- package/dist/server/utils/runtimeClient.js +0 -32
- package/dist/server/utils/settings.js +14 -0
- package/dist/server/workers/nativeSessionSearchWorker.js +416 -0
- package/package.json +3 -3
- package/runtime-manifest.json +3 -3
- package/scripts/classify-release.mjs +0 -1
- package/dist/client/assets/App-BgEYOR8Z.js +0 -157
- package/dist/client/assets/App-BgEYOR8Z.js.br +0 -0
- package/dist/client/assets/App-BgEYOR8Z.js.gz +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-Bvg7jZNw.js.br +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-Bvg7jZNw.js.gz +0 -0
- package/dist/client/assets/DagPlayground-DSM5oYq3.js.br +0 -0
- package/dist/client/assets/DagPlayground-DSM5oYq3.js.gz +0 -0
- package/dist/client/assets/DiffLab-CgI11xY5.js.br +0 -0
- package/dist/client/assets/DiffLab-CgI11xY5.js.gz +0 -0
- package/dist/client/assets/DiffReview-DOmoMEgC.js.br +0 -0
- package/dist/client/assets/DiffReview-DOmoMEgC.js.gz +0 -0
- package/dist/client/assets/DiffReviewLab-CEdM0rim.js.br +0 -0
- package/dist/client/assets/DiffReviewLab-CEdM0rim.js.gz +0 -0
- package/dist/client/assets/DiffViewer-CI3JmNyq.js +0 -37
- package/dist/client/assets/DiffViewer-CI3JmNyq.js.br +0 -0
- package/dist/client/assets/DiffViewer-CI3JmNyq.js.gz +0 -0
- package/dist/client/assets/ModelPreview-DNiQACGL.js.br +0 -0
- package/dist/client/assets/ModelPreview-DNiQACGL.js.gz +0 -0
- package/dist/client/assets/RightSidebar-CpPgHZEU.js +0 -1678
- package/dist/client/assets/RightSidebar-CpPgHZEU.js.br +0 -0
- package/dist/client/assets/RightSidebar-CpPgHZEU.js.gz +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-ByazGh0D.js.br +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-ByazGh0D.js.gz +0 -0
- package/dist/client/assets/app-UpvbJ3fT.js +0 -35
- package/dist/client/assets/app-UpvbJ3fT.js.br +0 -0
- package/dist/client/assets/app-UpvbJ3fT.js.gz +0 -0
- package/dist/client/assets/arc-DMO5fEDY.js.br +0 -0
- package/dist/client/assets/arc-DMO5fEDY.js.gz +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-c6WktFDt.js.br +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-c6WktFDt.js.gz +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-CN0lQ7zu.js.br +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-CN0lQ7zu.js.gz +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-CALO2K48.js.br +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-CALO2K48.js.gz +0 -0
- package/dist/client/assets/channel-DcmoMLL-.js +0 -1
- package/dist/client/assets/chunk-F27PBJKO-gRP8AiSl.js.br +0 -0
- package/dist/client/assets/chunk-F27PBJKO-gRP8AiSl.js.gz +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-BZewY7aF.js.br +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-BZewY7aF.js.gz +0 -0
- package/dist/client/assets/chunk-SVP7TREG-rjbdtq2C.js.br +0 -0
- package/dist/client/assets/chunk-SVP7TREG-rjbdtq2C.js.gz +0 -0
- package/dist/client/assets/chunk-TICWLB2K-CxU1tNuL.js.br +0 -0
- package/dist/client/assets/chunk-TICWLB2K-CxU1tNuL.js.gz +0 -0
- package/dist/client/assets/classDiagram-ZZMXUADV-VSirHVcP.js +0 -1
- package/dist/client/assets/classDiagram-v2-VYDZK3BY-VSirHVcP.js +0 -1
- package/dist/client/assets/cose-bilkent-JH36ORCC-BiO-E-0q.js.br +0 -0
- package/dist/client/assets/cose-bilkent-JH36ORCC-BiO-E-0q.js.gz +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-DUC3zzns.js.br +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-DUC3zzns.js.gz +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-CR1RnhbU.js.br +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-CR1RnhbU.js.gz +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-d1joyB5v.js.br +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-d1joyB5v.js.gz +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-izL3GdCu.js.br +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-izL3GdCu.js.gz +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-CjoFV2sD.js.br +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-CjoFV2sD.js.gz +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-BgHmsnTZ.js.br +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-BgHmsnTZ.js.gz +0 -0
- package/dist/client/assets/diagram-VX7I27RA-DMzRLNbg.js.br +0 -0
- package/dist/client/assets/diagram-VX7I27RA-DMzRLNbg.js.gz +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-kgWacykR.js.br +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-kgWacykR.js.gz +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-XzSXtFGS.js.br +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-XzSXtFGS.js.gz +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-Bu67_rUZ.js.br +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-Bu67_rUZ.js.gz +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-BsK_b_G_.js.br +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-BsK_b_G_.js.gz +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-gCSBItav.js.br +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-gCSBItav.js.gz +0 -0
- package/dist/client/assets/gestureArbiter-BOikQWZ8.js.br +0 -0
- package/dist/client/assets/gestureArbiter-BOikQWZ8.js.gz +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-DL0NSPPn.js.br +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-DL0NSPPn.js.gz +0 -0
- package/dist/client/assets/index-Bv-r5mB7.css.br +0 -0
- package/dist/client/assets/index-Bv-r5mB7.css.gz +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-pz1lzDd4.js.br +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-pz1lzDd4.js.gz +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-BrUnjTGd.js.br +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-BrUnjTGd.js.gz +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-BKf4UYyB.js.br +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-BKf4UYyB.js.gz +0 -0
- package/dist/client/assets/layout-Dd_yzBVh.js.br +0 -0
- package/dist/client/assets/layout-Dd_yzBVh.js.gz +0 -0
- package/dist/client/assets/linear-iY7daKXS.js.br +0 -0
- package/dist/client/assets/linear-iY7daKXS.js.gz +0 -0
- package/dist/client/assets/mermaid.core-CYNb258G.js.br +0 -0
- package/dist/client/assets/mermaid.core-CYNb258G.js.gz +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-ctnc7JBK.js.br +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-ctnc7JBK.js.gz +0 -0
- package/dist/client/assets/passwordBootstrap-Bth6QB9C.js.br +0 -0
- package/dist/client/assets/passwordBootstrap-Bth6QB9C.js.gz +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-DVKAZXxP.js.br +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-DVKAZXxP.js.gz +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-C0u6lfoS.js.br +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-C0u6lfoS.js.gz +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-DXFDUoYJ.js.gz +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-Cz-wrQ4E.js.br +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-Cz-wrQ4E.js.gz +0 -0
- package/dist/client/assets/referenceLongPress-BMcpaynk.js.br +0 -0
- package/dist/client/assets/referenceLongPress-BMcpaynk.js.gz +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-DdFhwbqd.js.br +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-DdFhwbqd.js.gz +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-DIEO7iin.js.br +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-DIEO7iin.js.gz +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-0Jq8ZpjE.js.br +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-0Jq8ZpjE.js.gz +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-CzkB3_L-.js.br +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-CzkB3_L-.js.gz +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-B1UZvmmJ.js.br +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-B1UZvmmJ.js.gz +0 -0
- package/dist/client/assets/stateDiagram-v2-MP3YSRHH-Cmg877fp.js +0 -1
- package/dist/client/assets/swimlanes-42K2YHIH-CwBFrD7Q.js.br +0 -0
- package/dist/client/assets/swimlanes-42K2YHIH-CwBFrD7Q.js.gz +0 -0
- package/dist/client/assets/swimlanesDiagram-VR7AAH4N-CjR47hdK.js +0 -8
- package/dist/client/assets/timeline-definition-24CTP7MA-Cgrwm9y7.js.br +0 -0
- package/dist/client/assets/timeline-definition-24CTP7MA-Cgrwm9y7.js.gz +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-JVQ9D_hy.js.br +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-JVQ9D_hy.js.gz +0 -0
- package/dist/client/assets/videoCompression-D1SrM0Eo.js.br +0 -0
- package/dist/client/assets/videoCompression-D1SrM0Eo.js.gz +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-BsmpGt9d.js.br +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-BsmpGt9d.js.gz +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-C33-nORD.js.br +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-C33-nORD.js.gz +0 -0
- package/dist/server/utils/desktopRuntimeOwner.js +0 -105
- package/scripts/prepare-desktop-runtime.mjs +0 -228
|
@@ -5,14 +5,13 @@ import { getSupervisorStatus } from './supervisorClient.js';
|
|
|
5
5
|
import { SERVER_LOG_PATH } from './termdockState.js';
|
|
6
6
|
let config = null;
|
|
7
7
|
let pending = false;
|
|
8
|
-
// Only the production CLI registers a launch recipe.
|
|
9
|
-
//
|
|
8
|
+
// Only the production CLI registers a launch recipe. Development runtimes
|
|
9
|
+
// must remain owned by their original launcher.
|
|
10
10
|
export function configureSupervisionEnable(value) {
|
|
11
11
|
config = value;
|
|
12
12
|
}
|
|
13
13
|
export function canEnableSupervision() {
|
|
14
14
|
return config !== null && !(process.env.TERMDOCK_SUPERVISED === '1' && process.connected)
|
|
15
|
-
&& !process.env.TERMDOCK_DESKTOP && !process.env.TERMDOCK_DESKTOP_OWNER_SOCKET
|
|
16
15
|
&& !process.env.INVOCATION_ID && !process.env.NOTIFY_SOCKET && !process.env.PM2_HOME
|
|
17
16
|
&& !getSupervisorStatus()?.alive;
|
|
18
17
|
}
|
|
@@ -119,35 +119,3 @@ export function indexRetainedClientModules(homeDir = os.homedir()) {
|
|
|
119
119
|
catch { /* No retained snapshots on first install. */ }
|
|
120
120
|
return modules;
|
|
121
121
|
}
|
|
122
|
-
export function resolveRuntimeClientDist(defaultClientDist, homeDir = os.homedir()) {
|
|
123
|
-
try {
|
|
124
|
-
const defaultPackageRoot = path.resolve(defaultClientDist, '..', '..');
|
|
125
|
-
const runningManifest = readManifest(path.join(defaultPackageRoot, 'runtime-manifest.json'));
|
|
126
|
-
if (runningManifest?.schemaVersion !== 1
|
|
127
|
-
|| typeof runningManifest.serverBundleHash !== 'string'
|
|
128
|
-
|| typeof runningManifest.clientBundleHash !== 'string') {
|
|
129
|
-
return defaultClientDist;
|
|
130
|
-
}
|
|
131
|
-
const runtimeRoot = path.join(homeDir, '.termdock', 'desktop-runtime');
|
|
132
|
-
const versionsRoot = fs.realpathSync(path.join(runtimeRoot, 'versions'));
|
|
133
|
-
const selectedVersionRoot = fs.realpathSync(path.join(runtimeRoot, 'client-current'));
|
|
134
|
-
const relative = path.relative(versionsRoot, selectedVersionRoot);
|
|
135
|
-
if (!relative || relative.startsWith('..') || path.isAbsolute(relative))
|
|
136
|
-
return defaultClientDist;
|
|
137
|
-
const selectedPackageRoot = path.join(selectedVersionRoot, 'package');
|
|
138
|
-
const selectedManifest = readManifest(path.join(selectedPackageRoot, 'runtime-manifest.json'));
|
|
139
|
-
if (selectedManifest?.schemaVersion !== 1
|
|
140
|
-
|| selectedManifest.serverBundleHash !== runningManifest.serverBundleHash
|
|
141
|
-
|| selectedManifest.clientBundleHash !== runningManifest.clientBundleHash
|
|
142
|
-
|| selectedManifest.clientEntrypoint !== 'dist/client/index.html') {
|
|
143
|
-
return defaultClientDist;
|
|
144
|
-
}
|
|
145
|
-
const selectedClientDist = path.join(selectedPackageRoot, 'dist', 'client');
|
|
146
|
-
if (!fs.existsSync(path.join(selectedClientDist, 'index.html')))
|
|
147
|
-
return defaultClientDist;
|
|
148
|
-
return selectedClientDist;
|
|
149
|
-
}
|
|
150
|
-
catch {
|
|
151
|
-
return defaultClientDist;
|
|
152
|
-
}
|
|
153
|
-
}
|
|
@@ -235,6 +235,7 @@ function normalizeSettings(value) {
|
|
|
235
235
|
collaborationFloatingGroupId: typeof raw.collaborationFloatingGroupId === 'string' && raw.collaborationFloatingGroupId.trim() ? raw.collaborationFloatingGroupId.trim() : null,
|
|
236
236
|
serviceSwitcherExpanded: raw.serviceSwitcherExpanded === true,
|
|
237
237
|
fileSortModes: normalizeFileSortModes(raw.fileSortModes),
|
|
238
|
+
hideGitIgnoredRoots: normalizeNestedGitScanRoots(raw.hideGitIgnoredRoots),
|
|
238
239
|
nestedGitScanRoots: normalizeNestedGitScanRoots(raw.nestedGitScanRoots),
|
|
239
240
|
pinnedExplorerRoots: normalizePinnedExplorerRoots(raw.pinnedExplorerRoots),
|
|
240
241
|
activeGitRepos: normalizeActiveGitRepos(raw.activeGitRepos),
|
|
@@ -580,6 +581,19 @@ export function setFileSortModeSetting(filePath, mode) {
|
|
|
580
581
|
settings.fileSortModes = normalizeFileSortModes(next);
|
|
581
582
|
});
|
|
582
583
|
}
|
|
584
|
+
export function getHideGitIgnoredRootsSetting() {
|
|
585
|
+
return { ...loadSettings().hideGitIgnoredRoots };
|
|
586
|
+
}
|
|
587
|
+
export function setHideGitIgnoredRootSetting(rootPath, enabled) {
|
|
588
|
+
return updateSettings((settings) => {
|
|
589
|
+
const next = { ...settings.hideGitIgnoredRoots };
|
|
590
|
+
if (enabled)
|
|
591
|
+
next[rootPath] = true;
|
|
592
|
+
else
|
|
593
|
+
delete next[rootPath];
|
|
594
|
+
settings.hideGitIgnoredRoots = normalizeNestedGitScanRoots(next);
|
|
595
|
+
});
|
|
596
|
+
}
|
|
583
597
|
export function getNestedGitScanRootsSetting() {
|
|
584
598
|
return { ...loadSettings().nestedGitScanRoots };
|
|
585
599
|
}
|
|
@@ -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.
|
|
3
|
+
"version": "1.4.286",
|
|
4
4
|
"description": "A complete web-based terminal application with modern UI",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": ".desktop-dist/main.js",
|
|
@@ -24,9 +24,9 @@
|
|
|
24
24
|
"dev:client": "vite",
|
|
25
25
|
"dev:server": "cross-env PORT=9835 tsx watch src/server/entry.ts",
|
|
26
26
|
"build": "npm run clean && npm run build:client && npm run build:server && npm run build:runtime-manifest",
|
|
27
|
-
"build:desktop": "node scripts/prepare-desktop-tokens.mjs && tsc -p tsconfig.desktop.json && esbuild desktop/preload.cts --bundle --platform=node --format=cjs --external:electron --outfile=.desktop-dist/preload.cjs && esbuild desktop/renderer/services.tsx --bundle --platform=browser --format=iife --minify --outfile=desktop/renderer/services.js",
|
|
27
|
+
"build:desktop": "rimraf .desktop-dist && node scripts/prepare-desktop-tokens.mjs && tsc -p tsconfig.desktop.json && esbuild desktop/preload.cts --bundle --platform=node --format=cjs --external:electron --outfile=.desktop-dist/preload.cjs && esbuild desktop/renderer/services.tsx --bundle --platform=browser --format=iife --minify --outfile=desktop/renderer/services.js",
|
|
28
28
|
"desktop:dev": "npm run build && npm run build:desktop && electron-forge start",
|
|
29
|
-
"desktop:prepare": "npm run build && npm run build:desktop
|
|
29
|
+
"desktop:prepare": "npm run build && npm run build:desktop",
|
|
30
30
|
"desktop:make": "node scripts/ensure-macos-appdmg.mjs && npm run desktop:prepare && electron-forge make",
|
|
31
31
|
"build:client": "vite build && node scripts/precompress-client.mjs",
|
|
32
32
|
"build:server": "tsc -p tsconfig.server.json && node -e \"require('fs').chmodSync('dist/server/cli.js', 0o755)\"",
|
package/runtime-manifest.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
3
|
"packageName": "termdock",
|
|
4
|
-
"version": "1.4.
|
|
4
|
+
"version": "1.4.286",
|
|
5
5
|
"runtimeProtocolVersion": 1,
|
|
6
6
|
"minimumDesktopVersion": "1.4.46",
|
|
7
7
|
"nodeMajor": 22,
|
|
8
8
|
"dependencyHash": "sha256-+FK03eSUIISxxpGNQTlYLuAcpuytFuT+tiLAMYVhwl4=",
|
|
9
|
-
"serverBundleHash": "sha256-
|
|
10
|
-
"clientBundleHash": "sha256
|
|
9
|
+
"serverBundleHash": "sha256-33BE/DfALuHz0I4M1KpzP2FGyHvT0+q/HUoo53/4vr4=",
|
|
10
|
+
"clientBundleHash": "sha256-+fhjhiC4857WrUnBMe8tfO8cTLNKPLvdU8oNwYLAIEM=",
|
|
11
11
|
"entrypoint": "dist/server/cli.js",
|
|
12
12
|
"clientEntrypoint": "dist/client/index.html"
|
|
13
13
|
}
|