termdock 1.4.358 → 1.4.360
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/dist/client/assets/{AndroidMirrorView-COoPljXi.js → AndroidMirrorView-DvaQ4bWE.js} +3 -3
- package/dist/client/assets/AndroidMirrorView-DvaQ4bWE.js.br +0 -0
- package/dist/client/assets/AndroidMirrorView-DvaQ4bWE.js.gz +0 -0
- package/dist/client/assets/App-Bb2gVHKa.js +178 -0
- package/dist/client/assets/App-Bb2gVHKa.js.br +0 -0
- package/dist/client/assets/App-Bb2gVHKa.js.gz +0 -0
- package/dist/client/assets/{ArchitecturePanel-B51eVL3I.js → ArchitecturePanel-DFFG7FcG.js} +4 -4
- package/dist/client/assets/ArchitecturePanel-DFFG7FcG.js.br +0 -0
- package/dist/client/assets/ArchitecturePanel-DFFG7FcG.js.gz +0 -0
- package/dist/client/assets/{ChangeWalkthroughPanel-ZGMybE0m.js → ChangeWalkthroughPanel-BC7zpkq3.js} +2 -2
- package/dist/client/assets/ChangeWalkthroughPanel-BC7zpkq3.js.br +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-BC7zpkq3.js.gz +0 -0
- package/dist/client/assets/{ChatRichContent-KkN7aIGv.js → ChatRichContent-C9mQPbwk.js} +3 -3
- package/dist/client/assets/ChatRichContent-C9mQPbwk.js.br +0 -0
- package/dist/client/assets/ChatRichContent-C9mQPbwk.js.gz +0 -0
- package/dist/client/assets/CollaborationMainWorkspace-v_Kf8bk2.js +1 -0
- package/dist/client/assets/CollaborationMainWorkspace-v_Kf8bk2.js.br +0 -0
- package/dist/client/assets/CollaborationMainWorkspace-v_Kf8bk2.js.gz +0 -0
- package/dist/client/assets/CollaborationTaskContent-Cm0uanGi.js +1 -0
- package/dist/client/assets/{ComputerControlView-CnaeZBuh.js → ComputerControlView-BQnieqiC.js} +3 -3
- package/dist/client/assets/ComputerControlView-BQnieqiC.js.br +0 -0
- package/dist/client/assets/ComputerControlView-BQnieqiC.js.gz +0 -0
- package/dist/client/assets/{DagPlayground-E7wKGgTF.js → DagPlayground-DditHOVX.js} +1 -1
- package/dist/client/assets/DagPlayground-DditHOVX.js.br +0 -0
- package/dist/client/assets/DagPlayground-DditHOVX.js.gz +0 -0
- package/dist/client/assets/{DiffLab-BMXY4mRl.js → DiffLab-p4rsngvx.js} +1 -1
- package/dist/client/assets/DiffLab-p4rsngvx.js.br +0 -0
- package/dist/client/assets/DiffLab-p4rsngvx.js.gz +0 -0
- package/dist/client/assets/{DiffReview-DHi_V-SX.js → DiffReview-9a_DXlXn.js} +1 -1
- package/dist/client/assets/DiffReview-9a_DXlXn.js.br +0 -0
- package/dist/client/assets/DiffReview-9a_DXlXn.js.gz +0 -0
- package/dist/client/assets/{DiffReviewLab-nhoosNZM.js → DiffReviewLab-BpI3iTts.js} +1 -1
- package/dist/client/assets/DiffReviewLab-BpI3iTts.js.br +0 -0
- package/dist/client/assets/DiffReviewLab-BpI3iTts.js.gz +0 -0
- package/dist/client/assets/{DiffViewer-CyDc8WOB.js → DiffViewer-25DyaFuh.js} +1 -1
- package/dist/client/assets/DiffViewer-25DyaFuh.js.br +0 -0
- package/dist/client/assets/DiffViewer-25DyaFuh.js.gz +0 -0
- package/dist/client/assets/{GitLoadingSkeleton-RRbTeMuA.js → GitLoadingSkeleton-D5nkNhPE.js} +1 -1
- package/dist/client/assets/GitLoadingSkeleton-D5nkNhPE.js.br +0 -0
- package/dist/client/assets/GitLoadingSkeleton-D5nkNhPE.js.gz +0 -0
- package/dist/client/assets/{Markdown-Ip0FYCJ1.js → Markdown-BQK61rwW.js} +2 -2
- package/dist/client/assets/Markdown-BQK61rwW.js.br +0 -0
- package/dist/client/assets/Markdown-BQK61rwW.js.gz +0 -0
- package/dist/client/assets/{ModelPreview-DuwBl4st.js → ModelPreview-DSMm4U4j.js} +1 -1
- package/dist/client/assets/ModelPreview-DSMm4U4j.js.br +0 -0
- package/dist/client/assets/ModelPreview-DSMm4U4j.js.gz +0 -0
- package/dist/client/assets/{RecordingSaveDialog-Czkjuaeu.js → RecordingSaveDialog-SqE6T39W.js} +1 -1
- package/dist/client/assets/RecordingSaveDialog-SqE6T39W.js.br +0 -0
- package/dist/client/assets/RecordingSaveDialog-SqE6T39W.js.gz +0 -0
- package/dist/client/assets/{RightSidebar-BvYh2_n2.js → RightSidebar-Cyd0Hm6s.js} +3 -3
- package/dist/client/assets/RightSidebar-Cyd0Hm6s.js.br +0 -0
- package/dist/client/assets/RightSidebar-Cyd0Hm6s.js.gz +0 -0
- package/dist/client/assets/SessionChatView-BNFqLvSD.js +25 -0
- package/dist/client/assets/SessionChatView-BNFqLvSD.js.br +0 -0
- package/dist/client/assets/SessionChatView-BNFqLvSD.js.gz +0 -0
- package/dist/client/assets/{SessionResourceSidebar-D-VXNdmE.js → SessionResourceSidebar-yPQNWbtX.js} +2 -2
- package/dist/client/assets/SessionResourceSidebar-yPQNWbtX.js.br +0 -0
- package/dist/client/assets/SessionResourceSidebar-yPQNWbtX.js.gz +0 -0
- package/dist/client/assets/{TodoWorkspace-CCL-wZTu.js → TodoWorkspace-B_GBeg3U.js} +1 -1
- package/dist/client/assets/TodoWorkspace-B_GBeg3U.js.br +0 -0
- package/dist/client/assets/TodoWorkspace-B_GBeg3U.js.gz +0 -0
- package/dist/client/assets/{abnfDiagram-VCTEODGH-CdEUK_s_.js → abnfDiagram-VCTEODGH-CPmxTXWR.js} +1 -1
- package/dist/client/assets/abnfDiagram-VCTEODGH-CPmxTXWR.js.br +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-CPmxTXWR.js.gz +0 -0
- package/dist/client/assets/app-CG7UnlvD.js +37 -0
- package/dist/client/assets/app-CG7UnlvD.js.br +0 -0
- package/dist/client/assets/app-CG7UnlvD.js.gz +0 -0
- package/dist/client/assets/{arc-Dmbeqzc-.js → arc-B4o5ErLe.js} +1 -1
- package/dist/client/assets/arc-B4o5ErLe.js.br +0 -0
- package/dist/client/assets/arc-B4o5ErLe.js.gz +0 -0
- package/dist/client/assets/{architectureDiagram-5GKGNRK7-CZcdXQrP.js → architectureDiagram-5GKGNRK7-CxB-DJ3M.js} +1 -1
- package/dist/client/assets/architectureDiagram-5GKGNRK7-CxB-DJ3M.js.br +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-CxB-DJ3M.js.gz +0 -0
- package/dist/client/assets/{arrow-down-Ty3zwcgl.js → arrow-down-C3OQpvij.js} +1 -1
- package/dist/client/assets/{blockDiagram-I7D4REHJ-D9jFhXcb.js → blockDiagram-I7D4REHJ-DMH3Ew64.js} +1 -1
- package/dist/client/assets/blockDiagram-I7D4REHJ-DMH3Ew64.js.br +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-DMH3Ew64.js.gz +0 -0
- package/dist/client/assets/{c4Diagram-7LVT6UL2-c9o0rNTP.js → c4Diagram-7LVT6UL2-BeAPmp6T.js} +1 -1
- package/dist/client/assets/c4Diagram-7LVT6UL2-BeAPmp6T.js.br +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-BeAPmp6T.js.gz +0 -0
- package/dist/client/assets/channel-D0j6Em2u.js +1 -0
- package/dist/client/assets/{chevron-left-CVjGQZf0.js → chevron-left-BS8PE--U.js} +1 -1
- package/dist/client/assets/{chunk-2Q5K7J3B-Bl_5wWZ4.js → chunk-2Q5K7J3B-N1tJpI75.js} +1 -1
- package/dist/client/assets/{chunk-5VM5RSS4-D9XQn27m.js → chunk-5VM5RSS4-Bk2ct6QD.js} +1 -1
- package/dist/client/assets/{chunk-F27PBJKO-DWyskKWD.js → chunk-F27PBJKO-CxZzshwv.js} +1 -1
- package/dist/client/assets/chunk-F27PBJKO-CxZzshwv.js.br +0 -0
- package/dist/client/assets/chunk-F27PBJKO-CxZzshwv.js.gz +0 -0
- package/dist/client/assets/{chunk-IMKFNOWR-DrWbExPc.js → chunk-IMKFNOWR-B1kZ4qQ8.js} +1 -1
- package/dist/client/assets/chunk-IMKFNOWR-B1kZ4qQ8.js.br +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-B1kZ4qQ8.js.gz +0 -0
- package/dist/client/assets/{chunk-JWPE2WC7-B7O1zrh6.js → chunk-JWPE2WC7-BrLueD3X.js} +1 -1
- package/dist/client/assets/{chunk-POPQ4Y6H-D7TlizKK.js → chunk-POPQ4Y6H-CLdvlIcP.js} +1 -1
- package/dist/client/assets/{chunk-SVP7TREG-DNK10F6v.js → chunk-SVP7TREG-DnY33T6h.js} +1 -1
- package/dist/client/assets/chunk-SVP7TREG-DnY33T6h.js.br +0 -0
- package/dist/client/assets/chunk-SVP7TREG-DnY33T6h.js.gz +0 -0
- package/dist/client/assets/{chunk-TICWLB2K-zVD9YIYY.js → chunk-TICWLB2K-CF5UiDQa.js} +1 -1
- package/dist/client/assets/chunk-TICWLB2K-CF5UiDQa.js.br +0 -0
- package/dist/client/assets/chunk-TICWLB2K-CF5UiDQa.js.gz +0 -0
- package/dist/client/assets/{chunk-XXDRQBXY-bRScHSGz.js → chunk-XXDRQBXY-IxRQZCF6.js} +1 -1
- package/dist/client/assets/{circle-BIJQEbCa.js → circle-BbMJmnZN.js} +1 -1
- package/dist/client/assets/classDiagram-ZZMXUADV-DqwCeJFc.js +1 -0
- package/dist/client/assets/classDiagram-v2-VYDZK3BY-DqwCeJFc.js +1 -0
- package/dist/client/assets/{clipboard-DV8t7tww.js → clipboard-Bc3Y4SV-.js} +1 -1
- package/dist/client/assets/clipboardText-CQBpBKPz.js +1 -0
- package/dist/client/assets/clipboardText-CQBpBKPz.js.br +0 -0
- package/dist/client/assets/clipboardText-CQBpBKPz.js.gz +0 -0
- package/dist/client/assets/clipboardText-CvzDT_9N.css +1 -0
- package/dist/client/assets/clipboardText-CvzDT_9N.css.br +0 -0
- package/dist/client/assets/clipboardText-CvzDT_9N.css.gz +0 -0
- package/dist/client/assets/{cose-bilkent-JH36ORCC-Bf6IObhf.js → cose-bilkent-JH36ORCC-BzcBs1L3.js} +1 -1
- package/dist/client/assets/cose-bilkent-JH36ORCC-BzcBs1L3.js.br +0 -0
- package/dist/client/assets/cose-bilkent-JH36ORCC-BzcBs1L3.js.gz +0 -0
- package/dist/client/assets/{cynefin-OW5HDTMX-DAtjde93.js → cynefin-OW5HDTMX-B28ddXz6.js} +1 -1
- package/dist/client/assets/cynefin-OW5HDTMX-B28ddXz6.js.br +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-B28ddXz6.js.gz +0 -0
- package/dist/client/assets/{cynefinDiagram-5FMLGOSQ-Bwoin99V.js → cynefinDiagram-5FMLGOSQ-CvnkcRMN.js} +1 -1
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-CvnkcRMN.js.br +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-CvnkcRMN.js.gz +0 -0
- package/dist/client/assets/{dagre-GXQ25YYZ-dxPzSob9.js → dagre-GXQ25YYZ-CbpdGfwk.js} +1 -1
- package/dist/client/assets/dagre-GXQ25YYZ-CbpdGfwk.js.br +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-CbpdGfwk.js.gz +0 -0
- package/dist/client/assets/{diagram-S7CK7UJ4-BXdiLivz.js → diagram-S7CK7UJ4-CkzVORHp.js} +1 -1
- package/dist/client/assets/diagram-S7CK7UJ4-CkzVORHp.js.br +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-CkzVORHp.js.gz +0 -0
- package/dist/client/assets/{diagram-UQ7AKVKN-DXveP3fg.js → diagram-UQ7AKVKN-CVYt9t-d.js} +1 -1
- package/dist/client/assets/diagram-UQ7AKVKN-CVYt9t-d.js.br +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-CVYt9t-d.js.gz +0 -0
- package/dist/client/assets/{diagram-VSXAHHWV-BAZtoQue.js → diagram-VSXAHHWV-CGajU0EV.js} +1 -1
- package/dist/client/assets/diagram-VSXAHHWV-CGajU0EV.js.br +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-CGajU0EV.js.gz +0 -0
- package/dist/client/assets/{diagram-VX7I27RA-Bhc7cKpk.js → diagram-VX7I27RA-vYtp1P52.js} +1 -1
- package/dist/client/assets/diagram-VX7I27RA-vYtp1P52.js.br +0 -0
- package/dist/client/assets/diagram-VX7I27RA-vYtp1P52.js.gz +0 -0
- package/dist/client/assets/{diagram-Z3DM3KII-DWIa_F-y.js → diagram-Z3DM3KII-DrlbY-rQ.js} +1 -1
- package/dist/client/assets/diagram-Z3DM3KII-DrlbY-rQ.js.br +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-DrlbY-rQ.js.gz +0 -0
- package/dist/client/assets/{ebnfDiagram-PWID7BFC-B3LDILSm.js → ebnfDiagram-PWID7BFC-Li843jVA.js} +1 -1
- package/dist/client/assets/ebnfDiagram-PWID7BFC-Li843jVA.js.br +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-Li843jVA.js.gz +0 -0
- package/dist/client/assets/{erDiagram-RLTQ6QDP-Cfu95bMX.js → erDiagram-RLTQ6QDP-Bk6D65-Y.js} +1 -1
- package/dist/client/assets/erDiagram-RLTQ6QDP-Bk6D65-Y.js.br +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-Bk6D65-Y.js.gz +0 -0
- package/dist/client/assets/{external-link-DodqgrCc.js → external-link-CUbXNBYc.js} +1 -1
- package/dist/client/assets/{flowDiagram-HODETNUW-DVtO6aQE.js → flowDiagram-HODETNUW-BBEGJbRE.js} +1 -1
- package/dist/client/assets/flowDiagram-HODETNUW-BBEGJbRE.js.br +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-BBEGJbRE.js.gz +0 -0
- package/dist/client/assets/{ganttDiagram-EL5Y4UJY-Bh1TvYzb.js → ganttDiagram-EL5Y4UJY-DcqIS8PT.js} +1 -1
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-DcqIS8PT.js.br +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-DcqIS8PT.js.gz +0 -0
- package/dist/client/assets/{git-compare-KkbucDhN.js → git-compare-TvhljhDy.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-WWUBYQGX-BKbRxPsF.js → gitGraphDiagram-WWUBYQGX-BO_waWtj.js} +1 -1
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-BO_waWtj.js.br +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-BO_waWtj.js.gz +0 -0
- package/dist/client/assets/{index-DEAMSl55.css → index-Db6cTvcd.css} +1 -1
- package/dist/client/assets/index-Db6cTvcd.css.br +0 -0
- package/dist/client/assets/index-Db6cTvcd.css.gz +0 -0
- package/dist/client/assets/{infoDiagram-27XIBGKW-CLhO8B16.js → infoDiagram-27XIBGKW-eURiwH5i.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-5VMMS53U-BwchGTP9.js → ishikawaDiagram-5VMMS53U-jYYxASiy.js} +1 -1
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-jYYxASiy.js.br +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-jYYxASiy.js.gz +0 -0
- package/dist/client/assets/{journeyDiagram-3NMN7TZE-eWBpuyMm.js → journeyDiagram-3NMN7TZE-DnW1TBIv.js} +1 -1
- package/dist/client/assets/journeyDiagram-3NMN7TZE-DnW1TBIv.js.br +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-DnW1TBIv.js.gz +0 -0
- package/dist/client/assets/{kanban-definition-UXKFOSKX-Sik-RHYc.js → kanban-definition-UXKFOSKX-CcPfae--.js} +1 -1
- package/dist/client/assets/kanban-definition-UXKFOSKX-CcPfae--.js.br +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-CcPfae--.js.gz +0 -0
- package/dist/client/assets/{layout-BJX2CDWF.js → layout-HBanbinE.js} +1 -1
- package/dist/client/assets/layout-HBanbinE.js.br +0 -0
- package/dist/client/assets/layout-HBanbinE.js.gz +0 -0
- package/dist/client/assets/{linear-0FKHr918.js → linear-OVIirOu4.js} +1 -1
- package/dist/client/assets/linear-OVIirOu4.js.br +0 -0
- package/dist/client/assets/linear-OVIirOu4.js.gz +0 -0
- package/dist/client/assets/{link-DWUQqMDL.js → link-DP9WqPQf.js} +1 -1
- package/dist/client/assets/link-DP9WqPQf.js.br +0 -0
- package/dist/client/assets/link-DP9WqPQf.js.gz +0 -0
- package/dist/client/assets/{list-tree-DxdLnXUB.js → list-tree-TZoK4D1s.js} +1 -1
- package/dist/client/assets/{maximize-2-Clx4ktqB.js → maximize-2-Duk9ucVy.js} +1 -1
- package/dist/client/assets/{mermaid.core-DWoaNsig.js → mermaid.core-Dkp6JxgQ.js} +5 -5
- package/dist/client/assets/mermaid.core-Dkp6JxgQ.js.br +0 -0
- package/dist/client/assets/{mermaid.core-DWoaNsig.js.gz → mermaid.core-Dkp6JxgQ.js.gz} +0 -0
- package/dist/client/assets/{mindmap-definition-YA3MSWOX-kFqW8-1C.js → mindmap-definition-YA3MSWOX-LqBs5pfH.js} +1 -1
- package/dist/client/assets/mindmap-definition-YA3MSWOX-LqBs5pfH.js.br +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-LqBs5pfH.js.gz +0 -0
- package/dist/client/assets/{passwordBootstrap-ZDVK8UPE.js → passwordBootstrap-D8EJVph5.js} +1 -1
- package/dist/client/assets/passwordBootstrap-D8EJVph5.js.br +0 -0
- package/dist/client/assets/passwordBootstrap-D8EJVph5.js.gz +0 -0
- package/dist/client/assets/{pegDiagram-XKGWAZYB-CndGmUtZ.js → pegDiagram-XKGWAZYB-BZWd3pI7.js} +1 -1
- package/dist/client/assets/pegDiagram-XKGWAZYB-BZWd3pI7.js.br +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-BZWd3pI7.js.gz +0 -0
- package/dist/client/assets/{pieDiagram-E7YTZNPT-Q550203T.js → pieDiagram-E7YTZNPT-DmhK_nc-.js} +1 -1
- package/dist/client/assets/pieDiagram-E7YTZNPT-DmhK_nc-.js.br +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-DmhK_nc-.js.gz +0 -0
- package/dist/client/assets/{quadrantDiagram-AXDQQJYC-BrjlUGzZ.js → quadrantDiagram-AXDQQJYC-Dt5EPEjj.js} +1 -1
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-Dt5EPEjj.js.br +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-Dt5EPEjj.js.gz +0 -0
- package/dist/client/assets/{quote-B9G-yF_k.js → quote-BWHaYR1j.js} +1 -1
- package/dist/client/assets/{railroadDiagram-O6MQD6OU-CSqOaX_w.js → railroadDiagram-O6MQD6OU-RSvmvEvu.js} +1 -1
- package/dist/client/assets/railroadDiagram-O6MQD6OU-RSvmvEvu.js.br +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-RSvmvEvu.js.gz +0 -0
- package/dist/client/assets/{rdpSession-DdqSmi-Z.js → rdpSession-lNNwVCpP.js} +1 -1
- package/dist/client/assets/rdpSession-lNNwVCpP.js.br +0 -0
- package/dist/client/assets/rdpSession-lNNwVCpP.js.gz +0 -0
- package/dist/client/assets/{referenceSelection-0uCpJjt2.js → referenceSelection-CYduiLc1.js} +1 -1
- package/dist/client/assets/referenceSelection-CYduiLc1.js.br +0 -0
- package/dist/client/assets/referenceSelection-CYduiLc1.js.gz +0 -0
- package/dist/client/assets/{requirementDiagram-BXWQKSXE-NGPth3Pf.js → requirementDiagram-BXWQKSXE-CXFONPV2.js} +1 -1
- package/dist/client/assets/requirementDiagram-BXWQKSXE-CXFONPV2.js.br +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-CXFONPV2.js.gz +0 -0
- package/dist/client/assets/{sankeyDiagram-P5KCCOFB-CbxpJ6iI.js → sankeyDiagram-P5KCCOFB-Dl-Bi6cO.js} +1 -1
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-Dl-Bi6cO.js.br +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-Dl-Bi6cO.js.gz +0 -0
- package/dist/client/assets/{search-DAQ_AOVP.js → search-g7nZaX-p.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-D3gJOK25.js → sequenceDiagram-WJ2MYXX4-ri1bCZN1.js} +1 -1
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-ri1bCZN1.js.br +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-ri1bCZN1.js.gz +0 -0
- package/dist/client/assets/{sizeCapture-INFHLROL-D4D1KI0n.js → sizeCapture-INFHLROL-BgXXpEV-.js} +1 -1
- package/dist/client/assets/sizeCapture-INFHLROL-BgXXpEV-.js.br +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-BgXXpEV-.js.gz +0 -0
- package/dist/client/assets/{stateDiagram-D77RDMKH-BjtgjBg5.js → stateDiagram-D77RDMKH-MOS7hXrp.js} +1 -1
- package/dist/client/assets/stateDiagram-D77RDMKH-MOS7hXrp.js.br +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-MOS7hXrp.js.gz +0 -0
- package/dist/client/assets/stateDiagram-v2-MP3YSRHH-qosY6j11.js +1 -0
- package/dist/client/assets/{sun-DvwMJkda.js → sun-Docz24Gq.js} +1 -1
- package/dist/client/assets/{swimlanes-42K2YHIH-C17jwdFo.js → swimlanes-42K2YHIH-_nzqhPpE.js} +1 -1
- package/dist/client/assets/swimlanes-42K2YHIH-_nzqhPpE.js.br +0 -0
- package/dist/client/assets/swimlanes-42K2YHIH-_nzqhPpE.js.gz +0 -0
- package/dist/client/assets/swimlanesDiagram-VR7AAH4N-L8D1VDHW.js +8 -0
- package/dist/client/assets/{swiper-BaumVgFd.js → swiper-Bge5b7oc.js} +1 -1
- package/dist/client/assets/swiper-Bge5b7oc.js.br +0 -0
- package/dist/client/assets/swiper-Bge5b7oc.js.gz +0 -0
- package/dist/client/assets/{timeline-definition-24CTP7MA-CtdHmPoC.js → timeline-definition-24CTP7MA-EoOfhpT4.js} +1 -1
- package/dist/client/assets/timeline-definition-24CTP7MA-EoOfhpT4.js.br +0 -0
- package/dist/client/assets/timeline-definition-24CTP7MA-EoOfhpT4.js.gz +0 -0
- package/dist/client/assets/{triangle-alert-D-tt7pA2.js → triangle-alert-DUjdvUeM.js} +1 -1
- package/dist/client/assets/{unplug-BQxOculv.js → unplug-wUkIQYu0.js} +1 -1
- package/dist/client/assets/{use-gesture-react.esm-CM42s15B.js → use-gesture-react.esm-uKjWuDRY.js} +1 -1
- package/dist/client/assets/use-gesture-react.esm-uKjWuDRY.js.br +0 -0
- package/dist/client/assets/use-gesture-react.esm-uKjWuDRY.js.gz +0 -0
- package/dist/client/assets/{vennDiagram-4TSXK5OY-DhwCFaVe.js → vennDiagram-4TSXK5OY-Ch6yr7S0.js} +1 -1
- package/dist/client/assets/vennDiagram-4TSXK5OY-Ch6yr7S0.js.br +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-Ch6yr7S0.js.gz +0 -0
- package/dist/client/assets/{videoCompression-BFhMaMl7.js → videoCompression-cikNovzj.js} +1 -1
- package/dist/client/assets/videoCompression-cikNovzj.js.br +0 -0
- package/dist/client/assets/videoCompression-cikNovzj.js.gz +0 -0
- package/dist/client/assets/{wardleyDiagram-VM6X3IG4-BP4Z-QQ4.js → wardleyDiagram-VM6X3IG4-D2PomnGY.js} +1 -1
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-D2PomnGY.js.br +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-D2PomnGY.js.gz +0 -0
- package/dist/client/assets/{xychartDiagram-S5SC5T6Z-CEPWf1tk.js → xychartDiagram-S5SC5T6Z-Wj3WqOzn.js} +1 -1
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-Wj3WqOzn.js.br +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-Wj3WqOzn.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/collaborationPrompt.js +2 -0
- package/dist/server/utils/sessionDisplayName.js +7 -0
- package/package.json +2 -2
- package/runtime-manifest.json +3 -3
- package/dist/client/assets/AndroidMirrorView-COoPljXi.js.br +0 -0
- package/dist/client/assets/AndroidMirrorView-COoPljXi.js.gz +0 -0
- package/dist/client/assets/App-7BA7Jt-V.js +0 -178
- package/dist/client/assets/App-7BA7Jt-V.js.br +0 -0
- package/dist/client/assets/App-7BA7Jt-V.js.gz +0 -0
- package/dist/client/assets/ArchitecturePanel-B51eVL3I.js.br +0 -0
- package/dist/client/assets/ArchitecturePanel-B51eVL3I.js.gz +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-ZGMybE0m.js.br +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-ZGMybE0m.js.gz +0 -0
- package/dist/client/assets/ChatRichContent-KkN7aIGv.js.br +0 -0
- package/dist/client/assets/ChatRichContent-KkN7aIGv.js.gz +0 -0
- package/dist/client/assets/CollaborationMainWorkspace-BVeBgGMT.js +0 -1
- package/dist/client/assets/CollaborationMainWorkspace-BVeBgGMT.js.br +0 -0
- package/dist/client/assets/CollaborationMainWorkspace-BVeBgGMT.js.gz +0 -0
- package/dist/client/assets/CollaborationTaskContent-C3Od6xQy.js +0 -1
- package/dist/client/assets/ComputerControlView-CnaeZBuh.js.br +0 -0
- package/dist/client/assets/ComputerControlView-CnaeZBuh.js.gz +0 -0
- package/dist/client/assets/DagPlayground-E7wKGgTF.js.br +0 -0
- package/dist/client/assets/DagPlayground-E7wKGgTF.js.gz +0 -0
- package/dist/client/assets/DiffLab-BMXY4mRl.js.br +0 -0
- package/dist/client/assets/DiffLab-BMXY4mRl.js.gz +0 -0
- package/dist/client/assets/DiffReview-DHi_V-SX.js.br +0 -0
- package/dist/client/assets/DiffReview-DHi_V-SX.js.gz +0 -0
- package/dist/client/assets/DiffReviewLab-nhoosNZM.js.br +0 -0
- package/dist/client/assets/DiffReviewLab-nhoosNZM.js.gz +0 -0
- package/dist/client/assets/DiffViewer-CyDc8WOB.js.br +0 -0
- package/dist/client/assets/DiffViewer-CyDc8WOB.js.gz +0 -0
- package/dist/client/assets/GitLoadingSkeleton-RRbTeMuA.js.br +0 -0
- package/dist/client/assets/GitLoadingSkeleton-RRbTeMuA.js.gz +0 -0
- package/dist/client/assets/Markdown-Ip0FYCJ1.js.br +0 -0
- package/dist/client/assets/Markdown-Ip0FYCJ1.js.gz +0 -0
- package/dist/client/assets/ModelPreview-DuwBl4st.js.br +0 -0
- package/dist/client/assets/ModelPreview-DuwBl4st.js.gz +0 -0
- package/dist/client/assets/RecordingSaveDialog-Czkjuaeu.js.br +0 -0
- package/dist/client/assets/RecordingSaveDialog-Czkjuaeu.js.gz +0 -0
- package/dist/client/assets/RightSidebar-BvYh2_n2.js.br +0 -0
- package/dist/client/assets/RightSidebar-BvYh2_n2.js.gz +0 -0
- package/dist/client/assets/SessionChatView-hFOVLdHC.js +0 -13
- package/dist/client/assets/SessionChatView-hFOVLdHC.js.br +0 -0
- package/dist/client/assets/SessionChatView-hFOVLdHC.js.gz +0 -0
- package/dist/client/assets/SessionResourceSidebar-D-VXNdmE.js.br +0 -0
- package/dist/client/assets/SessionResourceSidebar-D-VXNdmE.js.gz +0 -0
- package/dist/client/assets/TodoWorkspace-CCL-wZTu.js.br +0 -0
- package/dist/client/assets/TodoWorkspace-CCL-wZTu.js.gz +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-CdEUK_s_.js.br +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-CdEUK_s_.js.gz +0 -0
- package/dist/client/assets/app-DZ6mCJiW.js +0 -37
- package/dist/client/assets/app-DZ6mCJiW.js.br +0 -0
- package/dist/client/assets/app-DZ6mCJiW.js.gz +0 -0
- package/dist/client/assets/arc-Dmbeqzc-.js.br +0 -0
- package/dist/client/assets/arc-Dmbeqzc-.js.gz +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-CZcdXQrP.js.br +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-CZcdXQrP.js.gz +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-D9jFhXcb.js.br +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-D9jFhXcb.js.gz +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-c9o0rNTP.js.br +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-c9o0rNTP.js.gz +0 -0
- package/dist/client/assets/channel-BzD84hIE.js +0 -1
- package/dist/client/assets/chunk-F27PBJKO-DWyskKWD.js.br +0 -0
- package/dist/client/assets/chunk-F27PBJKO-DWyskKWD.js.gz +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-DrWbExPc.js.br +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-DrWbExPc.js.gz +0 -0
- package/dist/client/assets/chunk-SVP7TREG-DNK10F6v.js.br +0 -0
- package/dist/client/assets/chunk-SVP7TREG-DNK10F6v.js.gz +0 -0
- package/dist/client/assets/chunk-TICWLB2K-zVD9YIYY.js.br +0 -0
- package/dist/client/assets/chunk-TICWLB2K-zVD9YIYY.js.gz +0 -0
- package/dist/client/assets/classDiagram-ZZMXUADV-DNwfONVW.js +0 -1
- package/dist/client/assets/classDiagram-v2-VYDZK3BY-DNwfONVW.js +0 -1
- package/dist/client/assets/clipboardText-C4QKbGHg.css +0 -1
- package/dist/client/assets/clipboardText-C4QKbGHg.css.br +0 -0
- package/dist/client/assets/clipboardText-C4QKbGHg.css.gz +0 -0
- package/dist/client/assets/clipboardText-DoB9NjH8.js +0 -1
- package/dist/client/assets/clipboardText-DoB9NjH8.js.br +0 -0
- package/dist/client/assets/clipboardText-DoB9NjH8.js.gz +0 -0
- package/dist/client/assets/cose-bilkent-JH36ORCC-Bf6IObhf.js.br +0 -0
- package/dist/client/assets/cose-bilkent-JH36ORCC-Bf6IObhf.js.gz +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-DAtjde93.js.br +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-DAtjde93.js.gz +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-Bwoin99V.js.br +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-Bwoin99V.js.gz +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-dxPzSob9.js.br +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-dxPzSob9.js.gz +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-BXdiLivz.js.br +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-BXdiLivz.js.gz +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-DXveP3fg.js.br +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-DXveP3fg.js.gz +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-BAZtoQue.js.br +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-BAZtoQue.js.gz +0 -0
- package/dist/client/assets/diagram-VX7I27RA-Bhc7cKpk.js.br +0 -0
- package/dist/client/assets/diagram-VX7I27RA-Bhc7cKpk.js.gz +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-DWIa_F-y.js.br +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-DWIa_F-y.js.gz +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-B3LDILSm.js.br +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-B3LDILSm.js.gz +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-Cfu95bMX.js.br +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-Cfu95bMX.js.gz +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-DVtO6aQE.js.br +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-DVtO6aQE.js.gz +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-Bh1TvYzb.js.br +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-Bh1TvYzb.js.gz +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-BKbRxPsF.js.br +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-BKbRxPsF.js.gz +0 -0
- package/dist/client/assets/index-DEAMSl55.css.br +0 -0
- package/dist/client/assets/index-DEAMSl55.css.gz +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-BwchGTP9.js.br +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-BwchGTP9.js.gz +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-eWBpuyMm.js.br +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-eWBpuyMm.js.gz +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-Sik-RHYc.js.br +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-Sik-RHYc.js.gz +0 -0
- package/dist/client/assets/layout-BJX2CDWF.js.br +0 -0
- package/dist/client/assets/layout-BJX2CDWF.js.gz +0 -0
- package/dist/client/assets/linear-0FKHr918.js.br +0 -0
- package/dist/client/assets/linear-0FKHr918.js.gz +0 -0
- package/dist/client/assets/link-DWUQqMDL.js.br +0 -0
- package/dist/client/assets/link-DWUQqMDL.js.gz +0 -0
- package/dist/client/assets/mermaid.core-DWoaNsig.js.br +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-kFqW8-1C.js.br +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-kFqW8-1C.js.gz +0 -0
- package/dist/client/assets/passwordBootstrap-ZDVK8UPE.js.br +0 -0
- package/dist/client/assets/passwordBootstrap-ZDVK8UPE.js.gz +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-CndGmUtZ.js.br +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-CndGmUtZ.js.gz +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-Q550203T.js.br +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-Q550203T.js.gz +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-BrjlUGzZ.js.br +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-BrjlUGzZ.js.gz +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-CSqOaX_w.js.br +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-CSqOaX_w.js.gz +0 -0
- package/dist/client/assets/rdpSession-DdqSmi-Z.js.br +0 -0
- package/dist/client/assets/rdpSession-DdqSmi-Z.js.gz +0 -0
- package/dist/client/assets/referenceSelection-0uCpJjt2.js.br +0 -0
- package/dist/client/assets/referenceSelection-0uCpJjt2.js.gz +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-NGPth3Pf.js.br +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-NGPth3Pf.js.gz +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-CbxpJ6iI.js.br +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-CbxpJ6iI.js.gz +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-D3gJOK25.js.br +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-D3gJOK25.js.gz +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-D4D1KI0n.js.br +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-D4D1KI0n.js.gz +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-BjtgjBg5.js.br +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-BjtgjBg5.js.gz +0 -0
- package/dist/client/assets/stateDiagram-v2-MP3YSRHH-BkFsvhZ0.js +0 -1
- package/dist/client/assets/swimlanes-42K2YHIH-C17jwdFo.js.br +0 -0
- package/dist/client/assets/swimlanes-42K2YHIH-C17jwdFo.js.gz +0 -0
- package/dist/client/assets/swimlanesDiagram-VR7AAH4N-Bcw2hbFj.js +0 -8
- package/dist/client/assets/swiper-BaumVgFd.js.br +0 -0
- package/dist/client/assets/swiper-BaumVgFd.js.gz +0 -0
- package/dist/client/assets/timeline-definition-24CTP7MA-CtdHmPoC.js.br +0 -0
- package/dist/client/assets/timeline-definition-24CTP7MA-CtdHmPoC.js.gz +0 -0
- package/dist/client/assets/use-gesture-react.esm-CM42s15B.js.br +0 -0
- package/dist/client/assets/use-gesture-react.esm-CM42s15B.js.gz +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-DhwCFaVe.js.br +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-DhwCFaVe.js.gz +0 -0
- package/dist/client/assets/videoCompression-BFhMaMl7.js.br +0 -0
- package/dist/client/assets/videoCompression-BFhMaMl7.js.gz +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-BP4Z-QQ4.js.br +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-BP4Z-QQ4.js.gz +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-CEPWf1tk.js.br +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-CEPWf1tk.js.gz +0 -0
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/ChatRichContent-C9mQPbwk.js","assets/app-CG7UnlvD.js","assets/react-XDCjal2T.js","assets/dnd-BCFAPC0L.js","assets/terminal-DaiFCKy_.js","assets/index-Db6cTvcd.css","assets/circle-BbMJmnZN.js","assets/search-g7nZaX-p.js","assets/external-link-CUbXNBYc.js","assets/clipboardText-CQBpBKPz.js","assets/clipboardText-CvzDT_9N.css","assets/Markdown-BQK61rwW.js","assets/swiper-Bge5b7oc.js","assets/swiper-C2J0D0kV.css","assets/use-gesture-react.esm-uKjWuDRY.js","assets/referenceSelection-CYduiLc1.js","assets/list-tree-TZoK4D1s.js","assets/Markdown-DKQhs57e.css","assets/quote-BWHaYR1j.js","assets/arrow-down-C3OQpvij.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{a$ as Gt,ce as Jt,a4 as At,eR as kn,aI as Nn,a9 as En,cr as t,a5 as Cn,r as Sn,a8 as Te,C as Rt,m as Dt,f as Tn,et as $n,es as Ln,be as An,dH as It,b2 as U,bn as Ue,eG as Rn,ec as Dn,cy as In,dE as Xt,eQ as Mn,eF as On,eu as Mt,bj as Ke,eL as zn,S as Ot,G as Pn,R as Bn,w as zt,Z as Pt,cX as Fn,ak as Hn,eP as _n,bX as qn}from"./app-CG7UnlvD.js";import{f as Wn,d as Kn,j as Vn,e as Un,i as Gn,r as Ve,c as Bt,s as Jn,w as Xn,C as Yn,P as Ft,a as Zn,g as Qn}from"./clipboardText-CQBpBKPz.js";import{b as o}from"./dnd-BCFAPC0L.js";import{M as er}from"./Markdown-BQK61rwW.js";import{Q as pt}from"./quote-BWHaYR1j.js";import{A as tr}from"./arrow-down-C3OQpvij.js";import{A as nr}from"./use-gesture-react.esm-uKjWuDRY.js";const rr=[["circle",{cx:"12",cy:"12",r:"4",key:"4exip2"}],["path",{d:"M16 8v5a3 3 0 0 0 6 0v-1a10 10 0 1 0-4 8",key:"7n84p3"}]],Ht=Gt("at-sign",rr);const sr=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",ry:"2",key:"1m3agn"}],["circle",{cx:"9",cy:"9",r:"2",key:"af1f0g"}],["path",{d:"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21",key:"1xmnt7"}]],ar=Gt("image",sr);function or(n,r,a){o.useEffect(()=>{const s=n.current;if(!a||!s)return;let i;const f=()=>{const b=r.current;i=b&&document.activeElement===b?{input:b,at:performance.now()}:void 0},m=b=>{b.pointerType==="touch"&&b.isPrimary&&f()},l=b=>{b.touches.length===1?f():i=void 0},v=b=>{const S=r.current;if(!S||document.activeElement!==S||b.button!==0||!b.cancelable)return;const T=b.sourceCapabilities;if(!(T?T.firesTouchEvents:i?.input===S&&performance.now()-i.at<1200)||!(b.target instanceof Element))return;const u=b.target.closest('input, textarea, select, button, a, label, summary, [contenteditable]:not([contenteditable="false"]), [role="button"]');u&&u!==s||b.preventDefault()};return s.addEventListener("pointerdown",m,{capture:!0,passive:!0}),s.addEventListener("touchstart",l,{capture:!0,passive:!0}),s.addEventListener("mousedown",v,{capture:!0,passive:!1}),()=>{s.removeEventListener("pointerdown",m,!0),s.removeEventListener("touchstart",l,!0),s.removeEventListener("mousedown",v,!0)}},[n,r,a])}function ir(n,r){o.useEffect(()=>{const a=n.current;if(!r||!Jt()||!a)return;let s,i=0,f=0,m=!1;const l=()=>{s!==void 0&&clearTimeout(s),s=void 0},v=p=>{if(!p)return null;const h=p.getBoundingClientRect();return{top:Math.round(h.top),bottom:Math.round(h.bottom),height:Math.round(h.height)}},b=p=>{if(!m||i>=3||document.visibilityState!=="visible")return;i++;const h=kn(),k=h.visualViewport,j=getComputedStyle(document.documentElement),C=_=>Number.parseFloat(j.getPropertyValue(_))||0,A=document.getElementById("root");Nn("info","INPUT_VIEWPORT_GEOMETRY",{revision:"native-focus-layout-2",source:p,sequence:f,sample:i,focused:document.activeElement===a,frame:h!==window,window:{height:h.innerHeight,scrollY:h.scrollY},viewport:k?{height:k.height,offsetTop:k.offsetTop,pageTop:k.pageTop,scale:k.scale}:null,baseHeight:C("--app-base-vh"),keyboardHeight:C("--kb-height"),nativePan:C("--app-native-pan"),safeTop:C("--safe-top-inset"),safeBottom:C("--safe-bottom-inset"),root:v(A),ownerRoot:v(h.document.getElementById("root")),rootPaddingBottom:A&&Number.parseFloat(getComputedStyle(A).paddingBottom)||0,panel:v(a.closest("[data-session-chat]")),composer:v(a.closest(".session-chat-composer")),input:v(a),opacity:getComputedStyle(a).opacity})},S=()=>{!m||i>=3||(l(),s=setTimeout(()=>{s=void 0,b("layout.settled")},250))},T=()=>{l(),i=0,f++,m=!0,b("focus"),S()},y=()=>{l(),b("blur"),m=!1},u=()=>{l(),b("native.input")};return a.addEventListener("focus",T),a.addEventListener("blur",y),a.addEventListener("input",u),document.addEventListener(At,S),document.activeElement===a&&T(),()=>{l(),a.removeEventListener("focus",T),a.removeEventListener("blur",y),a.removeEventListener("input",u),document.removeEventListener(At,S)}},[n,r])}function cr(n){const r=[];for(const a of n){const s=r[r.length-1];a.role==="assistant"&&s?.role==="assistant"?s.messages.push(a):r.push({id:a.id,role:a.role,messages:[a]})}return r}function lr(n){const r=n.slice().reverse().find(a=>a.role==="user");return!r||["failed","expired"].includes(r.status)?!1:!n.some(a=>a.role==="assistant"&&a.replyTo===r.id&&!["ack","progress"].includes(a.responseKind||""))}function ur(n){return{pending:"已发送",delivered:"已发送",stored:"已发送",failed:"发送失败",expired:"发送失败"}[n]||"待确认"}function dr(n,r){const a=new Map(n.map(i=>[i.id,i]));let s=!1;for(const i of r){const f=a.get(i.id);(!f||JSON.stringify(f)!==JSON.stringify(i))&&(a.set(i.id,i),s=!0)}return s?[...a.values()].sort((i,f)=>(i.sequence??i.createdAt)-(f.sequence??f.createdAt)):n}let Yt;const fr=()=>Yt?.ChatRichContent;let _t;function qt(){return _t??=En(()=>import("./ChatRichContent-C9mQPbwk.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19])).then(n=>(Yt=n,n)).catch(n=>{throw _t=void 0,n})}function mr(n,r,a){const[s,i]=o.useState(!1),f=o.useRef(a);f.current=a;const m=o.useRef();return o.useLayoutEffect(()=>{const l=n.current;if(!r||!l||!Jt())return;let v,b,S;const T=()=>{v!==void 0&&cancelAnimationFrame(v),b!==void 0&&clearTimeout(b),v=void 0,b=void 0,S?.(),S=void 0,i(!1)},y=()=>{S&&(v!==void 0&&cancelAnimationFrame(v),v=requestAnimationFrame(()=>{v=requestAnimationFrame(T)}))};m.current=y;const u=()=>{if(!S){const C=l.style.opacity,A=l.style.transition;S=()=>{l.style.opacity=C,l.style.transition=A}}l.style.transition="none",l.style.opacity="0",i(!0),b!==void 0&&clearTimeout(b),b=setTimeout(T,1200),f.current.isOpen&&f.current.isSettled&&y()},p=l.focus,h=Object.getOwnPropertyDescriptor(l,"focus");l.focus=C=>{u(),p.call(l,{...C,preventScroll:!0})};const k=()=>{(document.activeElement!==l||!f.current.isOpen)&&u()},j=()=>{f.current.isOpen||T()};return l.addEventListener("pointerdown",k,!0),l.addEventListener("focus",u,!0),l.addEventListener("blur",T),l.addEventListener("keydown",j),()=>{l.removeEventListener("pointerdown",k,!0),l.removeEventListener("focus",u,!0),l.removeEventListener("blur",T),l.removeEventListener("keydown",j),h?Object.defineProperty(l,"focus",h):Reflect.deleteProperty(l,"focus"),m.current=void 0,T()}},[n,r]),o.useLayoutEffect(()=>{a.isOpen&&a.isSettled&&m.current?.()},[a.isOpen,a.isSettled]),r&&s}function Wt(n,r){return r?`> ${r.author.replace(/[\r\n]/g," ")} · ${r.time}
|
|
3
|
+
${r.text.replace(/\r\n?/g,`
|
|
4
|
+
`).split(`
|
|
5
|
+
`).map(a=>`> ${a}`).join(`
|
|
6
|
+
`)}
|
|
7
|
+
|
|
8
|
+
${n.trim()}`:n.trim()}function dt(n){const r=n.split(`
|
|
9
|
+
`),a=r[0].match(/^> (.+) · (\d{2}:\d{2})$/);if(!a)return{text:n,reference:null};let s=1;for(;s<r.length&&r[s].startsWith(">");)s++;return s<2||r[s]!==""?{text:n,reference:null}:{text:r.slice(s+1).join(`
|
|
10
|
+
`),reference:{author:a[1],time:a[2],text:r.slice(1,s).map(i=>i.replace(/^> ?/,"")).join(`
|
|
11
|
+
`)}}}function Kt({id:n,root:r,heights:a,estimate:s,eager:i,preserve:f,nearby:m,children:l}){const[v,b]=o.useState(()=>!r||typeof IntersectionObserver>"u"||i),S=o.useRef(null),T=o.useRef(a?.get(n)??s);return o.useEffect(()=>{const y=r?.current,u=S.current;if(!y||!u||typeof IntersectionObserver>"u")return;const p=new IntersectionObserver(h=>{if(!y.clientHeight)return;const k=h.find(j=>j.target===u);if(k){if(k.isIntersecting?m?.add(n):m?.delete(n),k.isIntersecting)b(!0);else if(!f&&!u.contains(document.activeElement)){const j=window.getSelection();(!j?.toString()||!u.contains(j.anchorNode)&&!u.contains(j.focusNode))&&b(!1)}}},{root:y,rootMargin:`${y.clientHeight}px 0px`});return p.observe(u),()=>p.disconnect()},[r,f,m,n]),o.useLayoutEffect(()=>{const y=S.current;if(!v||!y)return;const u=()=>{const h=y.getBoundingClientRect().height;if(h<=0)return;const k=T.current,j=r?.current;j?.clientHeight&&y.getBoundingClientRect().top+k<=j.getBoundingClientRect().top+1&&(j.scrollTop+=h-k),T.current=h,a?.set(n,h)};if(u(),typeof ResizeObserver>"u")return;const p=new ResizeObserver(u);return p.observe(y),()=>p.disconnect()},[v,l,n,r,a]),t.jsx("div",{ref:S,"data-chat-viewport-row":n,style:v?void 0:{height:T.current},children:v?l:t.jsxs("div",{"aria-hidden":"true",className:"space-y-3 py-3",children:[t.jsx("div",{className:"chat-loading-skeleton h-3 w-3/4 rounded bg-surface-2"}),t.jsx("div",{className:"chat-loading-skeleton h-3 w-1/2 rounded bg-surface-2"})]})})}const hr=new RegExp("(?<!\\\\)(?:(?:\\\\r\\\\n|\\\\n){2,}|(?:\\\\r\\\\n|\\\\n)(?=[ \\t]*(?:[-+*][ \\t]|\\d+[.)][ \\t]|>[ \\t]|#{1,6}[ \\t])))","g"),Vt=new RegExp(`(\`+|~{3,})|(?:^|(?<=\\n)|(?<=\\\\n))(?: {4}|\\t)[^\\n]*|<pre\\b[^>]*>[\\s\\S]*?<\\/pre\\s*>|<code\\b[^>]*>[\\s\\S]*?<\\/code\\s*>|<[^>\\n]+>|\\]\\([^\\n]*?\\)|(?:https?:\\/\\/|www\\.)[^\\s<>]+|(?:[A-Za-z]:\\\\|\\\\\\\\)[^\\s<>"']+|"(?:\\\\.|[^"\\\\\\n])*"|'(?:\\\\.|[^'\\\\\\n])*'|\\/(?:\\\\.|[^/\\\\\\n])+\\/[dgimsuvy]*|\\$\\$[\\s\\S]*?\\$\\$|\\$[^$\\n]+\\$`,"gi");function Ut(n){return n.replace(hr,r=>r.replace(/\\r\\n|\\n/g,`
|
|
12
|
+
`))}function pr(n){if(!n.includes("\\n"))return n;const r=new RegExp(Vt.source,Vt.flags),a=[];let s=0;for(let i=r.exec(n);i;i=r.exec(n)){a.push(Ut(n.slice(s,i.index)));let f=r.lastIndex;if(i[1]){const m=i[1];let l=n.indexOf(m,f);for(;l!==-1&&(n[l-1]===m[0]||n[l+m.length]===m[0]);)l=n.indexOf(m,l+m.length);f=l===-1?n.length:l+m.length}a.push(n.slice(i.index,f)),s=f,r.lastIndex=f}return a.push(Ut(n.slice(s))),a.join("")}const gr=o.memo(function({content:r}){return t.jsx(er,{content:pr(r)})}),ft="```termdock-context\n",ae=n=>`@「${n.name} · ${n.groupName}」`,se=n=>n.reference?`【${n.reference}】`:"";function Zt(n,r){return r.filter(a=>n.includes(ae(a)))}function lt(n,r,a){const s=Zt(n,a),i=n.trim();return i+(r.length||s.length?`${i?`
|
|
13
|
+
|
|
14
|
+
`:""}${ft}${JSON.stringify({attachments:r,mentions:s})}
|
|
15
|
+
\`\`\``:"")}function he(n){const r={text:n,attachments:[],mentions:[]},a=n.lastIndexOf(ft);if(a<0||a>0&&!n.slice(0,a).endsWith(`
|
|
16
|
+
|
|
17
|
+
`)||!n.endsWith("\n```"))return r;try{const s=JSON.parse(n.slice(a+ft.length,-4));return!Array.isArray(s.attachments)||!Array.isArray(s.mentions)||!s.attachments.every(i=>i&&typeof i.path=="string"&&typeof i.name=="string"&&(i.type===void 0||typeof i.type=="string")&&(i.size===void 0||typeof i.size=="number")&&(i.reference===void 0||typeof i.reference=="string"))||!s.mentions.every(i=>i&&["sessionId","groupId","groupName","name"].every(f=>typeof i[f]=="string")&&(i.subtitle===void 0||typeof i.subtitle=="string"))?r:{text:n.slice(0,a?a-2:0),attachments:s.attachments,mentions:s.mentions}}catch{return r}}function $e(n){return n.type?.startsWith("image/")||/\.(png|jpe?g|gif|webp|heic|avif|svg)$/i.test(n.name)?"图片":n.type?.startsWith("video/")||/\.(mp4|mov|webm|m4v|mkv)$/i.test(n.name)?"视频":"文件"}function xr(n){const r=he(n);return[r.text,...r.attachments.map(a=>`${a.reference||$e(a)}:${a.name}`)].filter(Boolean).join(`
|
|
18
|
+
`)}function br({files:n,onRemove:r,onReference:a}){return n.length?t.jsx("ul",{"aria-label":"消息附件",className:"mb-2 grid max-h-[min(9rem,calc(var(--app-visible-vh,100dvh)*0.2))] grid-cols-1 gap-1.5 overflow-y-auto sm:grid-cols-2",children:n.map((s,i)=>{const f=$e(s),m=f==="图片"?ar:f==="视频"?Cn:Sn,l=s.size===void 0?"":s.size<1024*1024?`${Math.max(1,Math.round(s.size/1024))} KB`:`${(s.size/(1024*1024)).toFixed(1)} MB`;return t.jsxs("li",{className:"flex min-w-0 items-center gap-2.5 rounded-xl border border-border/60 bg-surface-2 px-3 py-1.5",children:[t.jsx(m,{size:19,"aria-hidden":"true",className:"shrink-0 text-primary"}),t.jsxs("div",{className:"min-w-0 flex-1",children:[t.jsx("p",{className:"truncate text-sm",title:s.name,children:s.name}),t.jsxs("p",{className:"text-[11px] text-muted-foreground",children:[s.reference||f,l&&` · ${l}`]})]}),a&&s.reference&&t.jsx("button",{type:"button","aria-label":`插入引用 ${s.reference}`,title:"在光标处插入引用",className:"min-h-11 shrink-0 rounded-lg px-2 text-xs text-primary hover:bg-surface-elevated",onPointerDown:v=>v.preventDefault(),onClick:()=>a(s),children:"引用"}),r&&t.jsx("button",{type:"button","aria-label":`移除附件 ${s.name}`,className:"inline-flex h-11 w-11 shrink-0 items-center justify-center rounded-lg text-muted-foreground hover:bg-surface-elevated focus-visible:ring-2 focus-visible:ring-ring",onPointerDown:v=>v.preventDefault(),onClick:()=>r(i),children:t.jsx(Te,{size:14})})]},`${i}:${s.path}`)})}):null}function yr({text:n,files:r,mentions:a}){const s=[...r.map(se),...a.map(ae)].filter(Boolean).sort((m,l)=>l.length-m.length);if(!s.length)return t.jsx(t.Fragment,{children:n});const i=[];let f=n;for(;f;){let m=f.length,l="";for(const v of s){const b=f.indexOf(v);b>=0&&b<m&&(m=b,l=v)}if(!l){i.push({text:f,token:!1});break}m&&i.push({text:f.slice(0,m),token:!1}),i.push({text:l,token:!0}),f=f.slice(m+l.length)}return t.jsx(t.Fragment,{children:i.map((m,l)=>m.token?t.jsx("span",{className:"rounded bg-primary/10 text-primary",children:m.text},l):t.jsx("span",{children:m.text},l))})}const gt=n=>new Date(n).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",hourCycle:"h23"}),vr=new Set(["amp","claude","codex","copilot","cursor","droid","gemini","goose","grok","kimi","opencode"]);function Qt({name:n,slug:r}){const a=r&&vr.has(r)?`url(/icons/agents/${r}.svg) center / contain no-repeat`:void 0;return t.jsxs("span",{className:"inline-flex items-center gap-2 font-medium text-foreground/75",children:[a?t.jsx("span",{"aria-hidden":"true",className:"h-4 w-4 shrink-0 bg-current",style:{mask:a,WebkitMask:a}}):t.jsx(Tn,{size:15,"aria-hidden":"true"}),t.jsx("span",{children:n})]})}function en({reference:n,onRemove:r}){return t.jsxs("blockquote",{className:"mb-2 min-w-0 rounded-lg border-l-2 border-primary/50 bg-surface px-3 py-2 text-left",children:[t.jsxs("div",{className:"flex items-center gap-2 text-[11px] leading-5 text-muted-foreground",children:[t.jsx(pt,{size:12}),t.jsxs("span",{className:"min-w-0 flex-1 truncate",children:[n.author," · ",n.time]}),r&&t.jsx("button",{type:"button","aria-label":"移除消息引用",title:"移除引用",className:"inline-flex h-7 w-7 shrink-0 items-center justify-center rounded-md hover:bg-surface-2",onPointerDown:a=>a.preventDefault(),onClick:r,children:t.jsx(Te,{size:13})})]}),t.jsx("p",{className:"line-clamp-3 whitespace-pre-wrap break-words text-[13px] leading-6 text-foreground/75",title:n.text,children:n.text})]})}function wr({content:n}){const r=dt(n),a=he(r.text);return t.jsxs(t.Fragment,{children:[r.reference&&t.jsx(en,{reference:r.reference}),t.jsx(br,{files:a.attachments}),a.text&&t.jsx("p",{className:"whitespace-pre-wrap break-words text-[15px] leading-7 sm:text-base",children:t.jsx(yr,{text:a.text,files:a.attachments,mentions:a.mentions})})]})}function tn({content:n,createdAt:r,status:a,messageId:s,actionsOpen:i,children:f}){return t.jsxs("article",{"data-chat-turn":"user","data-chat-message":s,"data-actions-open":i||void 0,className:"ml-auto flex w-fit max-w-[88%] flex-col items-end sm:max-w-[85%]",children:[t.jsx("div",{"data-chat-user-bubble":!0,className:"w-fit max-w-full rounded-2xl bg-surface-2 px-4 py-3",children:t.jsx(wr,{content:n})}),t.jsxs("div",{"data-chat-message-actions":!0,className:"chat-user-meta mt-1 flex min-h-8 flex-wrap items-center justify-end gap-2 text-[10px] text-muted-foreground",children:[t.jsx("span",{children:a}),t.jsx("time",{dateTime:new Date(r).toISOString(),title:new Date(r).toLocaleString(),className:"opacity-60",children:gt(r)}),f]})]})}const ut="chat-message-action inline-flex h-8 min-w-8 items-center justify-center gap-1 rounded-lg text-muted-foreground/60 transition hover:bg-surface-2 hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring",jr=o.memo(function({messages:r,agentName:a,agentSlug:s,canWrite:i,copied:f,onCopy:m,onReference:l,sessionId:v,uiWritable:b,onAction:S,pendingMessage:T,scrollRoot:y,rowHeights:u,nearbyIds:p,initialVisibleIds:h}){const k=o.useMemo(()=>new Set([...h??[],...r.slice(-6).map(N=>N.id)]),[r,h]),j=N=>Math.min(1200,Math.max(80,Math.ceil(N.content.length/65)*28+40)),C=fr(),A=o.useRef(new Map),_=o.useMemo(()=>cr(r).map(N=>{if(N.role==="user")return N;const L=N.messages.map(D=>A.current.get(D.id)).find(Boolean)||N.id;for(const D of N.messages)A.current.set(D.id,L);return{...N,id:L}}),[r]),[z,w]=o.useState(null),K=o.useRef(null),P=o.useRef("");return o.useEffect(()=>{const N=D=>{D.target instanceof Node&&!K.current?.contains(D.target)&&w(null)},L=D=>{D.key==="Escape"&&w(null)};return document.addEventListener("pointerdown",N),document.addEventListener("keydown",L),()=>{document.removeEventListener("pointerdown",N),document.removeEventListener("keydown",L)}},[]),t.jsxs("div",{ref:K,className:"space-y-6 sm:space-y-7",onPointerDownCapture:N=>{P.current=N.pointerType},onClick:N=>{if(!N.detail||P.current!=="touch"&&!window.matchMedia?.("(hover: none)").matches)return;const L=N.target instanceof Element?N.target:null;if(!L||L.closest('button, a, input, textarea, select, label, summary, [role="button"], [contenteditable="true"]')||window.getSelection()?.toString().trim())return;const D=L.closest("[data-chat-message]")?.dataset.chatMessage;w(Y=>D&&Y!==D?D:null)},children:[_.map(N=>{const L=N.messages[N.messages.length-1],D=N.role==="user",Y=N.messages.map(R=>R.content).join(`
|
|
19
|
+
|
|
20
|
+
`),ie=R=>i&&t.jsx("button",{type:"button","aria-label":"引用消息",title:"引用这条消息",className:`${ut} shrink-0`,onPointerDown:G=>G.preventDefault(),onClick:()=>{w(null),l(R)},children:t.jsx(pt,{size:13})});return D?t.jsx(Kt,{id:N.id,root:y,heights:u,nearby:p,estimate:j(L),eager:k.has(L.id),children:t.jsx(tn,{messageId:N.id,actionsOpen:z===N.id,content:Y,createdAt:L.createdAt,status:ur(L.status),children:t.jsxs("span",{className:"chat-message-tools",children:[ie(L),t.jsxs("button",{type:"button",className:ut,"aria-label":"复制消息",title:"复制",onClick:()=>m(Y,N.id),children:[f===N.id?t.jsx(Rt,{size:13}):t.jsx(Dt,{size:13}),f===N.id&&t.jsx("span",{className:"text-[10px]",children:"已复制"})]})]})})},N.id):t.jsxs("article",{"data-chat-turn":"assistant",className:"w-full",children:[t.jsx("div",{className:"mb-2 flex min-h-8 items-center text-[11px] leading-4",children:t.jsx(Qt,{name:a,slug:s})}),t.jsx("div",{className:"chat-replies min-w-0",children:N.messages.map((R,G)=>t.jsx(Kt,{id:R.id,root:y,heights:u,nearby:p,estimate:j(R),eager:k.has(R.id),preserve:!!R.ui,children:t.jsxs("div",{"data-chat-message":R.id,"data-actions-open":z===R.id||void 0,className:"chat-reply min-w-0",children:[t.jsx("div",{className:"session-chat-markdown min-w-0 break-words",children:R.ui&&C?t.jsx(C,{message:R,sessionId:v,canWrite:b,onAction:S},R.id):t.jsx(gr,{content:R.content})}),t.jsxs("div",{"data-chat-message-actions":!0,className:"chat-reply-meta flex items-center justify-between gap-2",children:[t.jsxs("span",{className:"chat-message-tools",children:[ie(R),t.jsxs("button",{type:"button",className:ut,"aria-label":"复制回复",title:"复制",onClick:()=>m(R.content,R.id),children:[f===R.id?t.jsx(Rt,{size:13}):t.jsx(Dt,{size:13}),f===R.id&&t.jsx("span",{className:"text-[10px]",children:"已复制"})]})]}),G<N.messages.length-1&&t.jsx("span",{"aria-hidden":"true",className:"chat-reply-divider min-w-0 flex-1"}),t.jsx("time",{className:"shrink-0 text-[11px] tabular-nums text-muted-foreground/60",dateTime:new Date(R.createdAt).toISOString(),title:new Date(R.createdAt).toLocaleString(),children:gt(R.createdAt)})]})]})},R.id))})]},N.id)}),T]})});function kr(n){const r=o.useRef(n);r.current=n;const[a,s]=o.useState(null),i=o.useRef(null),f=o.useRef(!0),m=o.useCallback(()=>{i.current?.controller.abort();const y=r.current,u=It(),p=U(),h=Ue(),k=document.activeElement,j=new AbortController,C=y.input.current,A={controller:j,at:r.current.selection?.()??{value:C?.textContent??"",start:(C?.textContent??"").length,end:(C?.textContent??"").length},current:()=>f.current&&!j.signal.aborted&&i.current===A&&r.current.active&&r.current.canWrite&&r.current.sessionId===y.sessionId&&It()===u&&U()===p&&!p?.closed&&Ue()===h,focus:()=>document.activeElement===k||document.activeElement===y.input.current||document.activeElement===document.body};return i.current=A,A},[]);o.useEffect(()=>{const y=()=>{i.current&&!i.current.current()&&(i.current.controller.abort(),i.current=null,s(null))};y();const u=()=>{i.current?.controller.abort(),i.current=null,s(null)};return window.addEventListener("termdock:secure-state",y),window.addEventListener("auth:unauthorized",u),document.addEventListener("focusin",y),()=>{window.removeEventListener("termdock:secure-state",y),window.removeEventListener("auth:unauthorized",u),document.removeEventListener("focusin",y)}},[n.active,n.canWrite,n.sessionId]),o.useEffect(()=>(f.current=!0,()=>{f.current=!1,i.current?.controller.abort()}),[]);const l=o.useCallback(async(y,u,p=[])=>{if(y.current()){s({stage:"uploading",percent:u.length?0:void 0,files:u,paths:p}),r.current.error("");try{if(u.length&&!r.current.directory&&!r.current.sessionAttachments)throw new Error("附件上传暂不可用,请重试");const h=C=>{y.current()&&s({stage:"uploading",percent:Math.round(C),files:u,paths:p})},k=u.length?r.current.sessionAttachments?await $n(r.current.sessionId,u,y.controller.signal,h,y.current):await Ln(r.current.directory,u,y.controller.signal,h,y.current):{files:[]};if(!y.current())return;if(k.files.length!==u.length||k.files.some(C=>!C.path))throw new Error("部分文件未上传成功,请重试");const j=[...p,...k.files.map(C=>C.path)];if(!j.length)throw new Error("没有可添加的文件");r.current.attach?r.current.attach([...p.map(C=>({path:C,name:C.split("/").pop()||C})),...k.files.map((C,A)=>({path:C.path,name:u[A].name,type:u[A].type,size:u[A].size}))],y.focus(),y.at):r.current.insert(`${j.map(An).join(" ")} `,y.focus()),s(null),i.current=null}catch(h){if(!y.current())return;s({stage:"failed",files:u,paths:p}),r.current.error(h instanceof Error?h.message:"文件上传失败,请重试")}}},[]),v=o.useCallback(y=>{!r.current.active||!r.current.canWrite||!y.length||l(m(),y)},[m,l]),b=o.useCallback(async y=>{if(!r.current.active||!r.current.canWrite)return;const u=m();s({stage:"reading"}),r.current.error("");const p=h=>{u.current()&&(r.current.insert(h,u.focus()),s(null),i.current=null)};try{const h=await Wn(y,u.current);if(h.kind==="text"){p(h.text);return}if(h.kind==="files"){const k=h.files.length===1&&h.files[0].type.startsWith("image/")?[Kn(h.files[0])]:h.files;return await l(u,k,h.paths)}throw new Error("剪贴板没有可读取的内容,请使用系统粘贴或选择文件")}catch(h){u.current()&&(s(null),r.current.error(h instanceof Error?h.message:"粘贴失败,请重试"))}},[m,l]);return{transfer:a,addFiles:v,paste:b,cancel:()=>{i.current?.controller.abort(),i.current=null,s(y=>y?{...y,stage:"cancelled"}:null)},retry:()=>{(a?.files?.length||a?.paths?.length)&&l(m(),a.files||[],a.paths)},dismiss:()=>s(null),busy:a?.stage==="reading"||a?.stage==="uploading"}}function Nr(n,r,a){const s=[...r.filter(m=>m.reference).map(m=>({token:se(m),file:m})),...a.map(m=>({token:ae(m),member:m}))].filter(m=>m.token).sort((m,l)=>l.token.length-m.token.length),i=[];let f=n;for(;f;){let m=f.length,l;for(const v of s){const b=f.indexOf(v.token);b>=0&&b<m&&(m=b,l=v)}if(!l){i.push({text:f});break}m&&i.push({text:f.slice(0,m)}),i.push({text:l.token,token:l.token,..."file"in l?{file:l.file}:{member:l.member}}),f=f.slice(m+l.token.length)}return i}function mt(n){return n instanceof HTMLElement&&(n.tagName==="DIV"||n.tagName==="P")}function Le(n){let r="",a=!1;for(const s of[...n.childNodes]){const i=mt(s);(i&&a||i&&r)&&(r+=`
|
|
21
|
+
`),i&&s instanceof HTMLElement&&s.childNodes.length===1&&s.firstChild instanceof HTMLElement&&s.firstChild.tagName==="BR"||(r+=Er(s)),a=i}return r}function Er(n){if(n.nodeType===Node.TEXT_NODE)return n.textContent||"";if(!(n instanceof HTMLElement))return Le(n);const r=n.dataset.chatInlineToken;return r||(n.tagName==="BR"?n.dataset.chatPlaceholder==="true"?"":`
|
|
22
|
+
`:Le(n))}function oe(n){const r=Le(n),a=getSelection();if(!a?.rangeCount||!n.contains(a.anchorNode))return{text:r,value:r,start:r.length,end:r.length};const s=(m,l)=>{const v=document.createRange();v.selectNodeContents(n);try{v.setEnd(m,l)}catch{return r.length}return Math.min(r.length,Le(v.cloneContents()).length)},i=s(a.anchorNode,a.anchorOffset),f=s(a.focusNode,a.focusOffset);return{text:r,value:r,start:Math.min(i,f),end:Math.max(i,f)}}function ht(n,r){const a=getSelection();if(!a)return;const s=document.createRange();let i=Math.max(0,r),f=!1;const m=l=>{let v=!1;for(const b of[...l.childNodes]){if(f)return;if(mt(b)&&v){if(i<=1){s.setStartBefore(b),f=!0;return}i--}if(b instanceof HTMLElement&&b.dataset.chatInlineToken){const S=b.dataset.chatInlineToken.length;if(i<=0){s.setStartBefore(b),f=!0;return}if(i<S){s.setStartAfter(b),f=!0;return}i-=S,v=!0}else if(b.nodeType===Node.TEXT_NODE){const S=b.textContent?.length??0;if(i<=S){s.setStart(b,i),f=!0;return}i-=S,v||=S>0}else if(b instanceof HTMLElement&&b.tagName==="BR"){if(i===0){s.setStartBefore(b),f=!0;return}i--,v=!0}else m(b),v||=mt(b)}};m(n),f?s.collapse(!0):(s.selectNodeContents(n),s.collapse(!1)),a.removeAllRanges(),a.addRange(s)}function Cr({input:n,value:r,files:a,mentions:s,placeholder:i,readOnly:f=!1,masked:m=!1,label:l,onInput:v,onKeyDown:b,onPaste:S,onFocus:T,onTokenRemove:y}){const u=o.useRef(null);return o.useLayoutEffect(()=>{const p=n.current;if(!p)return;const h=Nr(r,a,s),k=h.filter(j=>j.file||j.member).every(j=>[...p.querySelectorAll("[data-chat-inline-token]")].some(C=>C.dataset.chatInlineToken===j.token));if(!(oe(p).text===r&&k)){p.replaceChildren();for(const j of h)if(j.file||j.member){const C=j.token,A=j.file?$e(j.file):void 0,_=j.file?`${j.file.reference} · ${j.file.name}`:`@${j.member.name}`,z=document.createElement("span");z.contentEditable="false",z.dataset.chatInlineToken=C,z.dataset.chatInlineKind=j.file?"attachment":"mention",z.setAttribute("role","group"),z.setAttribute("aria-label",j.file?`附件 ${_}`:`提及 ${_}`),z.className="mx-0.5 inline-flex max-w-full translate-y-[-1px] items-center gap-1 rounded-lg border border-border/60 bg-surface-2 px-2 py-0.5 align-baseline text-sm text-primary";const w=document.createElementNS("http://www.w3.org/2000/svg","svg");w.setAttribute("aria-hidden","true"),w.setAttribute("width","13"),w.setAttribute("height","13"),w.setAttribute("class","shrink-0"),w.innerHTML=A==="图片"?'<rect width="18" height="18" x="3" y="3" rx="2"/><circle cx="9" cy="9" r="2"/><path d="m21 15-3.1-3.1a2 2 0 0 0-2.8 0L6 21"/>':A==="视频"?'<path d="m22 8-6 4 6 4V8Z"/><rect width="14" height="12" x="2" y="6" rx="2"/>':'<path d="M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z"/><path d="M14 2v6h6M8 13h8M8 17h8"/>',w.setAttribute("fill","none"),w.setAttribute("stroke","currentColor"),w.setAttribute("stroke-width","2"),w.setAttribute("stroke-linecap","round"),w.setAttribute("stroke-linejoin","round"),z.append(w);const K=document.createElement("span");if(K.className="max-w-[12rem] truncate",K.textContent=_,z.append(K),!f){const P=document.createElement("button");P.type="button",P.setAttribute("aria-label",`移除${j.file?"附件":"提及"} ${j.file?.name||j.member.name}`),P.className="inline-flex h-6 w-6 shrink-0 items-center justify-center rounded hover:bg-surface-elevated",P.onpointerdown=N=>N.preventDefault(),P.onclick=()=>y(C),P.innerHTML='<svg aria-hidden="true" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><path d="m18 6-12 12M6 6l12 12"/></svg>',z.append(P)}p.append(z)}else{const C=j.text.split(`
|
|
23
|
+
`);C.forEach((A,_)=>{A&&p.append(document.createTextNode(A)),_<C.length-1&&p.append(document.createElement("br"))})}u.current!==null&&document.activeElement===p&&(ht(p,u.current),u.current=null)}},[n,r,a,s,f,y]),t.jsx("div",{ref:n,role:"textbox","aria-multiline":"true","aria-label":l,"aria-readonly":f||void 0,"aria-hidden":m||void 0,tabIndex:f?0:void 0,contentEditable:!f,suppressContentEditableWarning:!0,spellCheck:"true","data-placeholder":i,className:"session-chat-input session-chat-rich-editor col-start-1 row-start-1 block w-full min-w-0 self-stretch overflow-y-auto break-words bg-transparent px-1 py-2 text-base leading-7 outline-none",onFocus:T,onInput:p=>{const h=oe(p.currentTarget);u.current=h.end,v(h.text,h.start,h.end)},onKeyDown:b,onPaste:S,onClick:p=>{const h=p.target instanceof Element?p.target.closest("[data-chat-inline-token]"):null;if(!h)return;const k=document.createRange();k.selectNodeContents(p.currentTarget),k.setEndBefore(h);const j=Le(k.cloneContents()).length;ht(p.currentTarget,j+(h.dataset.chatInlineToken?.length??0))},onBeforeInput:p=>{const h=p.nativeEvent.inputType;if(h!=="insertParagraph"&&h!=="insertLineBreak")return;p.preventDefault();const k=oe(p.currentTarget),j=`${r.slice(0,k.start)}
|
|
24
|
+
${r.slice(k.end)}`;v(j,k.start+1,k.start+1)}})}function Sr(n,r,a){const s=Rn(),[i,f]=o.useState([]),[m,l]=o.useState("idle"),[v,b]=o.useState(0);return o.useEffect(()=>{if(!r||!a)return;let T=!0;l("loading");const y=p=>{T&&(f(p.groups),l("ready"))},u=Dn(y);return In().then(y).catch(()=>{T&&l("error")}),()=>{T=!1,u()}},[n,r,a,v]),{members:o.useMemo(()=>{const T=[];for(const y of i)if(!(y.archivedAt||!y.sessionIds.includes(n)))for(const u of y.sessionIds){const p=s.find(h=>h.sessionId===u);u!==n&&p?.agent&&T.push({sessionId:u,groupId:y.id,groupName:y.name,name:p.displayName,...p.displaySubtitle?{subtitle:p.displaySubtitle}:{}})}return T},[s,i,n]),status:m,retry:()=>b(T=>T+1)}}const Se="inline-flex min-h-11 items-center justify-center gap-2 rounded-xl px-3 text-sm transition hover:bg-surface-2 disabled:opacity-40 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring";function Tr({sessionId:n,name:r="当前会话",canWrite:a=!0,active:s=!0,terminalLink:i=!1,onKeyboardChange:f,onReadyChange:m,onTerminal:l}){const v=Mn(),b=Qn(v),S=Vn({enabled:s&&v}),T=o.useRef(f);T.current=f,o.useEffect(()=>{T.current?.(s&&S.isOpen)},[s,S.isOpen]);const y=On(),u=a&&y.has("session.input");o.useEffect(()=>(m?.(!0),()=>m?.(!1)),[m]);const p=`termdock:chat:${Xt()?.targetPeerId||location.origin}:${n}`,[h]=o.useState(()=>Un(p)),[k,j]=o.useState(h?.hasOlder??!1),[C,A]=o.useState(!1),[_,z]=o.useState(h?.replyPending),[w,K]=o.useState(()=>{try{return sessionStorage.getItem(`${p}:draft`)||""}catch{return""}}),[P,N]=o.useState(()=>{try{return he(sessionStorage.getItem(`${p}:extras`)||"")}catch{return he("")}}),L=P.attachments,D=Zt(w,P.mentions),[Y,ie]=o.useState(w.length),[R,G]=o.useState(null),[nn,xt]=o.useState(0),bt=o.useId(),Ae=u&&y.has("collaboration.mention"),le=Ae?w.slice(0,Y).match(/(?:^|\s)@([^\s@「」]*)$/u):null,pe=le?`${Y}:${le[1]}`:null,Ge=s&&!!le&&R!==pe,ue=Sr(n,s&&Ae,Ge),Z=ue.members.filter(e=>`${e.name} ${e.subtitle||""} ${e.groupName}`.toLocaleLowerCase().includes((le?.[1]||"").toLocaleLowerCase())),Re=Math.min(nn,Math.max(0,Z.length-1));o.useEffect(()=>{xt(0)},[pe]),o.useEffect(()=>{try{sessionStorage.setItem(`${p}:extras`,lt(P.mentions.map(ae).join(" "),L,P.mentions))}catch{}},[p,P,L]);const[ce,De]=o.useState(()=>{try{const e=JSON.parse(sessionStorage.getItem(`${p}:reference`)||"null");return e&&typeof e.author=="string"&&typeof e.time=="string"&&typeof e.text=="string"?e:null}catch{return null}}),[Ie,ge]=o.useState(null),[Q,rn]=o.useState(h?.agentName??"助手"),[Me,sn]=o.useState(h?.agentSlug),[an,Je]=o.useState(!1),[I,Oe]=o.useState(()=>{try{return JSON.parse(sessionStorage.getItem(`${p}:pending`)||"null")}catch{return null}}),[q,yt]=o.useState(h?.messages??[]),[on,Xe]=o.useState(!h),[ee,cn]=o.useState(h?.agentAvailable),[Ye,te]=o.useState(""),[ln,de]=o.useState(!1),[un,vt]=o.useState(!!h);Mt(s&&ln?{tone:"recovering",message:"正在恢复对话同步…"}:null),Mt(s&&Ye?{message:Ye}:null);const[ze,wt]=o.useState(!1),[dn,Ze]=o.useState(!1),[fn,mn]=o.useState(""),J=o.useRef(null),M=o.useRef(null),xe=o.useRef(null),be=o.useRef(!1);or(J,M,s&&v);const hn=o.useRef(null),Qe=mr(M,s&&v&&!_n(),S);ir(M,s&&v),o.useLayoutEffect(()=>{const e=M.current,c=xe.current;!e||c===null||(xe.current=null,be.current&&(be.current=!1,Ke(e)),ht(e,c))},[w,L,D]);const X=o.useRef(h?.nearBottom??!0),et=o.useRef(!1),ye=o.useRef(0),tt=o.useRef(0),nt=o.useRef(null),Pe=o.useRef(null),jt=o.useRef(null),ve=o.useRef(0);Gn(Pe,s&&v);const rt=o.useRef(I);rt.current=I;const st=o.useRef(),we=o.useRef(q);we.current=q;const H=o.useRef({hasOlder:h?.hasOlder??!1,hasNewer:h?.hasNewer??!1}),Be=o.useRef(!1),fe=o.useRef(),Fe=o.useRef(0),at=o.useRef(0),kt=o.useRef(null),[He]=o.useState(()=>new Set(h?.visibleMessageIds)),[Nt]=o.useState(()=>new Map(h?.rowHeights)),je=o.useRef(h?.scrollTop??0),ke=o.useRef(),V=o.useRef({active:s,canWrite:u,sessionId:n});V.current={active:s,canWrite:u,sessionId:n};const ot=zn(),ne=(e,c,d=!1)=>{xe.current=c,be.current=d,K(e)},pn=(e,c,d=c)=>{K(e),ie(d),G(null),N(g=>({...g,attachments:g.attachments.filter(x=>!x.reference||e.includes(se(x))),mentions:g.mentions.filter(x=>e.includes(ae(x)))}))},re=(e,c=!0,d)=>{const g=M.current,x=V.current,$=U(),B=Ue(),E=d??(g?oe(g):{value:w,start:w.length,end:w.length});K(W=>{const Ce=W.startsWith(E.value.slice(0,E.start)),me=W===E.value||Ce?Math.min(E.start,W.length):W.length,ct=W===E.value?Math.min(E.end,W.length):me,F=W.slice(0,me)+e+W.slice(ct);return xe.current=me+e.length,be.current=c,requestAnimationFrame(()=>{g?.isConnected&&V.current.active&&V.current.canWrite&&V.current.sessionId===x.sessionId&&U()===$&&Ue()===B&&document.activeElement!==g&&(xe.current=null,be.current=!1)}),F})},Et=e=>{const c=w.indexOf(e),d=w.split(e).join("");ne(d,c<0?w.length:c,!0),N(g=>({...g,attachments:g.attachments.filter(x=>se(x)!==e),mentions:g.mentions.filter(x=>ae(x)!==e)}))};o.useEffect(()=>{if(!L.length)return;let e=Math.max(0,...L.map(g=>Number(g.reference?.match(/\d+$/)?.[0])||0));const c=L.map(g=>g.reference?g:{...g,reference:`${$e(g)}${++e}`}),d=c.filter(g=>!w.includes(se(g))).map(se).join(" ");c.some((g,x)=>g.reference!==L[x]?.reference)&&N(g=>({...g,attachments:c})),d&&K(g=>g?`${g} ${d}`:d)},[p]);const gn=(e,c,d)=>{let g=Math.max(0,...L.map($=>Number($.reference?.match(/\d+$/)?.[0])||0));const x=e.map($=>({...$,reference:`${$e($)}${++g}`}));N($=>({...$,attachments:[...$.attachments,...x]})),re(`${x.map(se).join(" ")} `,c,d)},Ct=e=>{if(!le||!s||!Ae)return;const c=Y-le[1].length-1,d=`${ae(e)} `,g=w.slice(0,c)+d+w.slice(Y);ne(g,c+d.length,!0),ie(c+d.length),G(pe),N(x=>({...x,mentions:[...x.mentions.filter($=>$.sessionId!==e.sessionId||$.groupId!==e.groupId),e]}))},O=kr({sessionId:n,active:s,canWrite:u,input:M,selection:()=>M.current?oe(M.current):{value:w,start:w.length,end:w.length},insert:re,attach:gn,error:te,sessionAttachments:!!ot,directory:ot?ot.directories?.find(e=>e.access==="write")?.path:"/tmp"}),St=o.useCallback((e,c)=>{if(!s||!u)return;const d=c||xr(dt(e.content).text);if(new TextEncoder().encode(d).byteLength>8e3){te("这条消息较长,请选中需要引用的内容。");return}ge(null),De({author:e.role==="user"?"用户":Q,time:gt(e.createdAt),text:d}),te(""),window.getSelection()?.removeAllRanges(),Ke(M.current)},[s,u,Q]);o.useEffect(()=>{if(!s||!u){ge(null);return}const e=()=>{const c=window.getSelection(),d=c?.toString().trim(),g=E=>E instanceof Element?E:E?.parentElement,x=g(c?.anchorNode)?.closest("[data-chat-message]"),$=g(c?.focusNode)?.closest("[data-chat-message]"),B=d&&x===$&&x&&Pe.current?.contains(x)?{id:x.dataset.chatMessage,text:d}:null;ge(E=>E?.id===B?.id&&E?.text===B?.text?E:B)};return document.addEventListener("selectionchange",e),()=>document.removeEventListener("selectionchange",e)},[s,u]),o.useEffect(()=>{try{ce?sessionStorage.setItem(`${p}:reference`,JSON.stringify(ce)):sessionStorage.removeItem(`${p}:reference`)}catch{}},[p,ce]);const xn=`/api/terminal/${encodeURIComponent(n)}/chat`,_e=o.useCallback((e,c=!1)=>{const d=dr(c?[]:we.current,e);we.current=d,yt(d)},[]),qe=o.useCallback(async(e,c=!1)=>{e=AbortSignal.any([...e?[e]:[],AbortSignal.timeout(15e3)]);const d=++tt.current,g=U(),x=we.current,$=c?void 0:x[x.length-1]?.id,B=rt.current?{requestId:rt.current.requestId}:{};let E;try{E=await Ve(n,e,c?void 0:st.current,{...$?{after:$}:{},...B})}catch(F){if(!$||F.status!==404)throw F;E=await Ve(n,e,void 0,B),c=!0}if(e.aborted||d!==tt.current||U()!==g)return;if(E.unchanged&&E.revision&&E.revision===st.current){Xe(!1),de(!1),vt(!0);return}E.page?.hasNewer&&X.current&&!H.current.hasNewer&&(E=await Ve(n,e,void 0,B),c=!0);const W=E.messages;if(!Array.isArray(W)||E.updates!==void 0&&!Array.isArray(E.updates))throw new Error("暂时无法读取对话,请重试");const Ce=[...E.updates??[],...W];if(Ce.some(F=>F.ui)&&await qt(),e.aborted||d!==tt.current||U()!==g)return;cn(E.agentAvailable===!0),rn(typeof E.agent?.displayName=="string"&&E.agent.displayName.trim()?E.agent.displayName:"助手"),sn(typeof E.agent?.slug=="string"?E.agent.slug:void 0),st.current=typeof E.revision=="string"?E.revision:void 0;const me=c||x.length===0;me&&(He.clear(),at.current++,fe.current?.abort(),H.current.hasOlder=E.page?.hasOlder===!0,j(H.current.hasOlder)),z(E.replyPending),H.current.hasNewer=E.page?.hasNewer===!0;const ct=new Set(x.map(F=>F.id));(H.current.hasNewer||x.length&&!X.current&&W.some(F=>!ct.has(F.id)))&&Ze(!0),_e(Ce,me),Oe(F=>F&&(E.confirmedRequestId===F.requestId||Ce.some(jn=>jn.requestId===F.requestId))?null:F),Xe(!1),de(!1),vt(!0)},[n,_e,He]),We=o.useCallback(async()=>{const e=we.current[0]?.id;if(!V.current.active||!H.current.hasOlder||!e||Be.current||Date.now()<Fe.current)return;const c=new AbortController,d=U(),g=at.current;fe.current=c,Be.current=!0,A(!0);try{const x=await Ve(n,c.signal,void 0,{before:e});if(!Array.isArray(x.messages))throw new Error("对话分页无效");if(x.messages.some(B=>B.ui)&&await qt(),c.signal.aborted||U()!==d||g!==at.current||!V.current.active)return;const $=J.current;$&&(ke.current={top:$.scrollTop,height:$.scrollHeight}),H.current.hasOlder=x.page?.hasOlder===!0,j(H.current.hasOlder),_e(x.messages),Fe.current=0}catch(x){c.signal.aborted||(x.status===404?(H.current.hasOlder=!1,j(!1)):(Fe.current=Date.now()+5e3,de(!0)))}finally{fe.current===c&&(Be.current=!1,fe.current=void 0,V.current.active&&A(!1))}},[n,_e]);o.useEffect(()=>{const e=kt.current,c=J.current;if(!s||!k||!e||!c)return;const d=()=>{Fe.current=0,c.scrollTop<c.clientHeight&&We()};window.addEventListener("online",d);const g=typeof IntersectionObserver>"u"?void 0:new IntersectionObserver(x=>{x.some($=>$.isIntersecting)&&We()},{root:c,rootMargin:`${c.clientHeight}px 0px`});return g?.observe(e),()=>{g?.disconnect(),window.removeEventListener("online",d)}},[s,k,q.length,We]),o.useEffect(()=>(s||A(!1),()=>{fe.current?.abort(),fe.current=void 0,Be.current=!1}),[s]),o.useEffect(()=>{if(!s)return;const e=new AbortController;let c=!1,d=0,g;const x=async()=>{if(!(c||document.visibilityState==="hidden")){clearTimeout(g),c=!0;try{await qe(e.signal),d=0}catch{e.signal.aborted||(d++,de(!0),Xe(!1))}finally{c=!1,e.signal.aborted||(g=setTimeout(()=>{x()},Math.min(3e4,2500*2**d)))}}};return x(),window.addEventListener("online",x),window.addEventListener(Ot,x),document.addEventListener("visibilitychange",x),()=>{e.abort(),clearTimeout(g),window.removeEventListener("online",x),window.removeEventListener(Ot,x),document.removeEventListener("visibilitychange",x)}},[s,qe]),o.useEffect(()=>()=>{ye.current++},[]),o.useEffect(()=>{try{sessionStorage.setItem(`${p}:draft`,w)}catch{}},[p,w]),o.useEffect(()=>{try{I?sessionStorage.setItem(`${p}:pending`,JSON.stringify(I)):sessionStorage.removeItem(`${p}:pending`)}catch{}},[p,I]);const Ne=o.useCallback(()=>{const e=J.current;e&&e.clientHeight&&(e.scrollTop=e.scrollHeight,je.current=e.scrollTop,X.current=!0,H.current.hasNewer||Ze(!1))},[]),it=o.useRef(!1);it.current=q.length>0||!!I,o.useEffect(()=>{if(!nt.current||typeof ResizeObserver>"u")return;const e=new ResizeObserver(()=>{V.current.active&&it.current&&X.current&&Ne()});return e.observe(nt.current),J.current&&e.observe(J.current),()=>e.disconnect()},[Ne]),o.useLayoutEffect(()=>{const e=J.current;!s||!e||(ke.current?(e.scrollTop=ke.current.top+e.scrollHeight-ke.current.height,je.current=e.scrollTop,ke.current=void 0):X.current&&it.current?Ne():e.scrollTop=je.current)},[q,I,s,k,Ne]);const Tt=o.useRef({messages:q,agentName:Q,agentSlug:Me,agentAvailable:ee,replyPending:_,hasOlder:k,hasNewer:H.current.hasNewer});Tt.current={messages:q,agentName:Q,agentSlug:Me,agentAvailable:ee,replyPending:_,hasOlder:k,hasNewer:H.current.hasNewer},o.useEffect(()=>{const e=U(),c=Bt();return()=>{const d=Tt.current;d.agentAvailable!==void 0&&U()===e&&c===Bt()&&Jn(p,{...d,agentAvailable:d.agentAvailable,scrollTop:je.current,nearBottom:X.current,rowHeights:[...Nt],visibleMessageIds:[...He]})}},[p]);const Ee=async(e,c)=>{if(et.current||O.busy||!V.current.active||!V.current.canWrite||ee!==!0)return!1;const d=e||{content:c??Wt(lt(w,L,D),ce),requestId:crypto.randomUUID(),createdAt:Date.now()};if(!d.content||new TextEncoder().encode(d.content).byteLength>32e3)return!1;et.current=!0,wt(!0),te(""),z(void 0),Oe(d),X.current=!0,!e&&c===void 0&&(ne("",0),De(null),N(he("")),G(null));const g=ye.current;try{const x=await fetch(xn,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({content:d.content,requestId:d.requestId}),signal:AbortSignal.timeout(2e4)}),$=await x.json();if(!x.ok)throw new Error("发送失败,请重试。");if(g!==ye.current)return!1;Oe(null),yt(B=>B.some(E=>E.id===$.id)?B:[...B,{...d,id:$.id,role:"user",status:$.status}]);try{await qe()}catch{de(!0)}return!0}catch(x){return g===ye.current&&te(x instanceof Error&&x.name==="TimeoutError"?"发送状态待确认,请重试。":"发送失败,请重试。"),!1}finally{et.current=!1,g===ye.current&&wt(!1)}};o.useEffect(()=>{const e=c=>{const d=c.detail;s&&u&&d.sessionId===n&&re(d.text)};return window.addEventListener("termdock:chat-insert",e),()=>window.removeEventListener("termdock:chat-insert",e)},[n,s,u,re]),o.useEffect(()=>{if(!s)return;const e=c=>{const d=c.detail;if(!d?.text||d.sessionId!==n)return;c.stopImmediatePropagation();const g=u&&(!d.ownedPaste||!!Hn(d,n));g&&re(d.text,d.focus!==!1),d.nonce&&window.dispatchEvent(new CustomEvent("termdock-insert-reference-ack",{detail:{nonce:d.nonce,ok:g}}))};return window.addEventListener("termdock-insert-reference",e,!0),()=>window.removeEventListener("termdock-insert-reference",e,!0)},[n,s,u,re]);const $t=o.useRef(Ee);$t.current=Ee;const bn=o.useCallback(e=>$t.current(void 0,e),[]),yn=o.useCallback((e,c)=>{Xn(e,()=>Pe.current?.isConnected===!0).then(d=>{d?mn(c):te("复制失败,请选择正文复制")})},[]),vn=async()=>{if(H.current.hasNewer){X.current=!0;try{await qe(void 0,!0)}catch{de(!0)}}Ne()},wn=ee===!0&&!I&&(_??lr(q)),Lt=new TextEncoder().encode(Wt(lt(w,L,D),ce)).byteLength>32e3;return t.jsxs("section",{ref:Pe,style:b.rootStyle,"data-session-chat":!0,onDragEnter:e=>{e.dataTransfer.types.includes("Files")&&(e.preventDefault(),ve.current++,u&&Je(!0))},onDragOver:e=>{e.dataTransfer.types.includes("Files")&&(e.preventDefault(),e.dataTransfer.dropEffect=u?"copy":"none")},onDragLeave:e=>{e.dataTransfer.types.includes("Files")&&(ve.current=Math.max(0,ve.current-1),ve.current||Je(!1))},onDrop:e=>{let c;try{c=Fn(e.dataTransfer)}catch(g){e.preventDefault(),te(g instanceof Error?g.message:"文件引用无效");return}if(c&&u){e.preventDefault(),e.stopPropagation(),re(c);return}const d=Array.from(e.dataTransfer.files);if(d.length)e.preventDefault(),e.stopPropagation(),Je(!1),ve.current=0,O.addFiles(d);else if(u&&e.target.closest("[data-chat-composer]")){const g=e.dataTransfer.getData("text/plain");g&&(e.preventDefault(),re(g))}},onKeyDown:e=>e.stopPropagation(),className:"session-chat relative flex h-full min-h-0 flex-col overflow-hidden bg-[var(--chrome-bg)] text-foreground","aria-label":`${r}对话`,children:[t.jsx("div",{ref:J,style:b.contentStyle,className:"session-chat-scroll min-h-0 flex-1 overflow-y-auto overscroll-contain px-4 [overflow-anchor:none] sm:px-8",onScroll:()=>{const e=J.current;!s||!e.clientHeight||(je.current=e.scrollTop,X.current=e.scrollHeight-e.scrollTop-e.clientHeight<96,X.current&&!H.current.hasNewer&&Ze(!1),e.scrollTop<e.clientHeight&&We())},children:t.jsxs("div",{ref:nt,className:"mx-auto flex min-h-full w-full max-w-screen-2xl flex-col py-5 sm:py-8",children:[k&&t.jsx("div",{ref:kt,"data-chat-older-edge":!0,"aria-hidden":"true",className:"h-12 shrink-0",children:C&&t.jsxs("div",{className:"space-y-2 py-2",children:[t.jsx("div",{className:"chat-loading-skeleton h-3 w-3/4 rounded bg-surface-2"}),t.jsx("div",{className:"chat-loading-skeleton h-3 w-1/2 rounded bg-surface-2"})]})}),(on||!un)&&!q.length&&!I?t.jsx(Yn,{}):!q.length&&!I?t.jsxs("div",{className:"session-chat-welcome shrink-0 py-6",children:[t.jsx(Pn,{size:27,strokeWidth:1.5,className:"mb-4 text-primary"}),t.jsx("h2",{className:"text-xl font-semibold tracking-tight sm:text-2xl",children:"想一起完成什么?"}),t.jsx("p",{className:"mt-2 max-w-md text-[15px] leading-7 text-muted-foreground",children:"直接描述你的目标,或从一个问题开始。"}),t.jsx("div",{className:"mt-5 flex flex-wrap gap-2",children:["帮我梳理一下当前工作","请解释一下刚才的结果","我们继续下一步"].map(e=>t.jsx("button",{type:"button",className:`${Se} border border-border/60 text-left text-xs text-muted-foreground`,disabled:!u,onClick:()=>{ne(e,e.length,!0)},children:e},e))})]}):t.jsx(jr,{pendingMessage:I&&t.jsx(tn,{content:I.content,createdAt:I.createdAt,status:ze?"发送中…":"待重试",children:!ze&&t.jsxs(t.Fragment,{children:[t.jsx("button",{type:"button",className:"min-h-9 rounded-lg px-2 hover:bg-surface-2",onClick:()=>{const e=dt(I.content),c=he(e.text);ne(c.text,c.text.length,!0),N(c),De(e.reference),Oe(null),te(""),Ke(M.current)},children:"修改草稿"}),t.jsxs("button",{type:"button",className:"inline-flex min-h-9 items-center gap-1 rounded-lg px-2 text-primary hover:bg-surface-2",disabled:!u||ee!==!0,onClick:()=>{Ee(I)},children:[t.jsx(Bn,{size:12}),"重试发送"]})]})}),sessionId:n,uiWritable:s&&u&&!I&&!ze&&ee===!0,onAction:bn,messages:q,scrollRoot:J,rowHeights:Nt,nearbyIds:He,initialVisibleIds:h?.visibleMessageIds,agentName:Q,agentSlug:Me,canWrite:u,copied:fn,onReference:St,onCopy:yn}),wn&&!Ye&&t.jsxs("div",{"data-chat-reply-status":!0,role:"status","aria-label":`${Q}工作中`,"aria-live":"polite",className:"mt-6 inline-flex w-fit max-w-full items-center gap-3 self-start rounded-lg border border-border/50 bg-[color-mix(in_srgb,var(--surface)_35%,var(--chrome-bg))] px-3 py-2 text-xs text-muted-foreground",children:[t.jsx(Qt,{name:Q,slug:Me}),t.jsxs("span",{className:"inline-flex shrink-0 items-center gap-1.5",children:[t.jsx(zt,{size:14,className:"animate-spin text-primary motion-reduce:animate-none"}),t.jsx("span",{children:"工作中…"})]})]})]})}),an&&t.jsxs("div",{className:"pointer-events-none absolute inset-3 z-20 flex items-center justify-center rounded-2xl border-2 border-dashed border-primary bg-surface/95 text-sm text-primary",children:[t.jsx(Ft,{size:18,className:"mr-2"}),"松开以添加文件"]}),t.jsxs("div",{ref:hn,className:"session-chat-composer relative z-20 shrink-0 px-3 pb-3 pt-1 sm:px-8 sm:pb-4",children:[dn&&t.jsx("div",{className:"flex justify-center pb-2",children:t.jsxs("button",{type:"button",className:`${Se} rounded-full border border-border bg-surface text-xs shadow-lg`,onClick:()=>{vn()},children:[t.jsx(tr,{size:14}),"查看新消息"]})}),t.jsxs("div",{className:"relative mx-auto max-w-screen-2xl",children:[ee===!1&&t.jsxs("div",{role:"status",className:"mb-2 flex flex-wrap items-center gap-2 text-xs text-muted-foreground",children:[t.jsx("span",{children:"当前对话暂不可用。"}),t.jsxs("button",{type:"button",className:Se,onClick:l,children:[t.jsx(Pt,{size:14}),"打开终端"]})]}),Ie&&t.jsx("div",{className:"pointer-events-none absolute inset-x-0 bottom-full z-20 mb-2 flex justify-center",children:t.jsxs("div",{className:"pointer-events-auto flex max-w-full items-center overflow-hidden rounded-xl border border-border bg-surface-2 shadow-lg transition-colors hover:bg-surface-elevated focus-within:bg-surface-elevated",children:[t.jsxs("button",{type:"button","aria-label":"引用选中内容",className:"inline-flex min-h-11 min-w-0 flex-1 items-center gap-2 rounded-l-xl px-3 py-1 text-left text-xs focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring",onPointerDown:e=>e.preventDefault(),onClick:()=>{const e=q.find(c=>c.id===Ie.id);e&&St(e,Ie.text)},children:[t.jsx(pt,{size:13,className:"shrink-0 text-primary"}),t.jsx("span",{className:"shrink-0 text-primary",children:"引用选中内容"}),t.jsx("span",{className:"hidden min-w-0 max-w-sm truncate text-muted-foreground sm:block",children:Ie.text})]}),t.jsx("button",{type:"button","aria-label":"取消选中引用",className:"inline-flex h-11 w-11 shrink-0 items-center justify-center rounded-r-xl text-muted-foreground transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring",onClick:()=>{ge(null),window.getSelection()?.removeAllRanges()},children:t.jsx(Te,{size:13})})]})}),O.transfer&&t.jsxs("div",{role:"status",className:"mb-2 flex min-h-9 items-center gap-2 px-1 text-xs text-muted-foreground",children:[O.busy&&t.jsx(zt,{size:13,className:"animate-spin text-primary"}),t.jsx("span",{className:"min-w-0 flex-1",children:O.transfer.stage==="reading"?"正在读取剪贴板…":O.transfer.stage==="uploading"?`正在上传文件${O.transfer.percent===void 0?"…":` · ${O.transfer.percent}%`}`:O.transfer.stage==="cancelled"?"已取消上传":"上传未完成,文件尚未添加"}),O.busy?t.jsx("button",{type:"button",className:"min-h-9 px-2",onClick:O.cancel,children:"取消"}):t.jsxs(t.Fragment,{children:[t.jsx("button",{type:"button",className:"min-h-9 px-2 text-primary",onClick:O.retry,children:"重试上传"}),t.jsx("button",{type:"button","aria-label":"关闭上传提示",className:"min-h-9 px-2",onClick:O.dismiss,children:t.jsx(Te,{size:13})})]})]}),Ge&&t.jsxs("div",{id:bt,role:"listbox","aria-label":"选择协作成员","data-chat-no-swipe":!0,className:"absolute inset-x-0 bottom-full z-30 mb-2 flex max-h-[min(20rem,calc(var(--app-visible-vh,100dvh)*0.45))] flex-col overflow-hidden rounded-2xl border border-border bg-surface shadow-xl",children:[t.jsxs("div",{className:"flex items-center justify-between gap-2 shrink-0 border-b border-border/50 px-3 py-2 text-xs text-muted-foreground",children:[t.jsx("span",{children:"@ 协作成员"}),t.jsx("button",{type:"button","aria-label":"关闭成员选择",className:"inline-flex h-9 w-9 items-center justify-center rounded-lg hover:bg-surface-2",onPointerDown:e=>e.preventDefault(),onClick:()=>G(pe),children:t.jsx(Te,{size:14})})]}),t.jsx("div",{className:"min-h-0 flex-1 overflow-y-auto p-1.5",children:ue.status==="loading"?t.jsx("p",{role:"status",className:"px-3 py-4 text-sm text-muted-foreground",children:"正在加载成员…"}):ue.status==="error"?t.jsxs("div",{className:"flex items-center justify-between px-3 py-2 text-sm text-muted-foreground",children:["暂时无法读取成员",t.jsx("button",{type:"button",className:Se,onClick:ue.retry,children:"重试"})]}):Z.length?Z.map((e,c)=>t.jsxs("button",{id:`${bt}-${c}`,role:"option","aria-selected":c===Re,type:"button",className:`flex min-h-11 w-full items-center gap-3 rounded-lg px-3 py-2 text-left text-sm hover:bg-surface-2 ${c===Re?"bg-surface-2":""}`,onPointerDown:d=>d.preventDefault(),onClick:()=>Ct(e),children:[t.jsx(Ht,{size:15,className:"shrink-0 text-primary"}),t.jsxs("span",{className:"min-w-0 flex-1",children:[t.jsx("span",{className:"block truncate",children:e.name}),e.subtitle&&t.jsx("span",{className:"block truncate text-xs text-muted-foreground",children:e.subtitle})]}),t.jsx("span",{className:"max-w-[40%] truncate text-xs text-muted-foreground",children:e.groupName})]},`${e.groupId}:${e.sessionId}`)):t.jsx("p",{className:"px-3 py-4 text-sm text-muted-foreground",children:ue.members.length?"没有匹配的成员":"当前协作组暂无其他 Agent 成员"})}),t.jsx("p",{className:"shrink-0 border-t border-border/50 px-3 py-2 text-[11px] text-muted-foreground",children:"让当前 Agent 按你的要求联系该成员"})]}),t.jsxs("form",{"data-chat-composer":!0,className:"rounded-2xl border border-border bg-surface p-2.5 transition-colors focus-within:border-primary/60",onSubmit:e=>{e.preventDefault(),I||Ee()},children:[ce&&t.jsx(en,{reference:ce,onRemove:()=>De(null)}),t.jsx("input",{ref:jt,type:"file",multiple:!0,tabIndex:-1,className:"hidden","aria-label":"选择附件",onChange:e=>{O.addFiles(Array.from(e.currentTarget.files||[])),e.currentTarget.value=""}}),t.jsxs("div",{className:"relative min-w-0 w-full",children:[t.jsx("div",{"aria-hidden":"true",className:`session-chat-input-sizer pointer-events-none col-start-1 row-start-1 overflow-hidden whitespace-pre-wrap break-words px-1 py-2 text-base leading-7 ${Qe?"":"invisible"} ${w?"":"text-muted-foreground/60"}`,children:(w||(Qe?u?"输入消息…":"此会话仅允许查看":""))+" "}),t.jsx(Cr,{input:M,value:w,files:L,mentions:D,masked:Qe,readOnly:!u,label:`给${Q}的消息`,placeholder:u?"输入消息…":"此会话仅允许查看",onInput:pn,onFocus:()=>ge(null),onTokenRemove:Et,onPaste:e=>{const{files:c,text:d}=Zn(e.clipboardData),g=qn();if(c.length||g?.readClipboardFiles||!d&&(g||typeof navigator.clipboard?.read=="function")){e.preventDefault(),O.paste({files:c,text:d});return}if(d){e.preventDefault();const x=M.current?oe(M.current):{start:w.length,end:w.length},$=w.slice(0,x.start)+d+w.slice(x.end);ne($,x.start+d.length,!0)}},onKeyDown:e=>{e.stopPropagation();const c=M.current?oe(M.current):{start:w.length,end:w.length};if(ie(c.end),Ge&&!e.nativeEvent.isComposing&&e.nativeEvent.keyCode!==229){if(e.key==="Escape"){e.preventDefault(),G(pe);return}if(["ArrowDown","ArrowUp"].includes(e.key)&&Z.length){e.preventDefault(),xt((Re+(e.key==="ArrowDown"?1:-1)+Z.length)%Z.length);return}if((e.key==="Enter"&&!e.shiftKey||e.key==="Tab")&&Z.length&&ue.status==="ready"){e.preventDefault(),Ct(Z[Re]);return}if(e.key==="Enter"&&!e.shiftKey){e.preventDefault();return}}if((e.key==="Backspace"||e.key==="Delete")&&c.start===c.end){const g=[...L.map(se),...D.map(ae)].filter(Boolean).find(x=>e.key==="Backspace"?c.start>w.indexOf(x)&&c.start<=w.indexOf(x)+x.length:c.start>=w.indexOf(x)&&c.start<w.indexOf(x)+x.length);if(g){e.preventDefault(),Et(g);return}}if(e.key==="Enter"&&!v&&!e.shiftKey&&!e.altKey&&!e.nativeEvent.isComposing&&e.nativeEvent.keyCode!==229){e.preventDefault(),I||Ee();return}if(e.key==="Enter"&&v){e.preventDefault();const d=`${w.slice(0,c.start)}
|
|
25
|
+
${w.slice(c.end)}`;ne(d,c.start+1,!1)}}})]}),t.jsxs("div",{"data-chat-composer-toolbar":!0,className:"mt-1 flex items-center gap-1",children:[t.jsx("button",{type:"button","aria-label":"添加文件",title:"添加文件,也可拖入或粘贴",className:"inline-flex h-11 w-11 shrink-0 items-center justify-center rounded-lg text-muted-foreground transition hover:bg-surface-2 disabled:opacity-30",disabled:!u||O.busy,onPointerDown:e=>e.preventDefault(),onClick:()=>jt.current?.click(),children:t.jsx(Ft,{size:18})}),Ae&&t.jsx("button",{type:"button","aria-label":"提及协作成员",title:"提及协作成员",className:"inline-flex h-11 w-11 shrink-0 items-center justify-center rounded-lg text-muted-foreground hover:bg-surface-2",onPointerDown:e=>e.preventDefault(),onClick:()=>{const e=M.current,c=e?oe(e):{start:w.length,end:w.length},d=c.start,g=c.end,x=d&&!/\s$/.test(w.slice(0,d))?" @":"@";ne(w.slice(0,d)+x+w.slice(g),d+x.length,!0),ie(d+x.length),G(null),Ke(M.current)},children:t.jsx(Ht,{size:18})}),t.jsx("span",{className:"session-chat-keyboard-hint hidden min-w-0 flex-1 px-2 text-[11px] text-muted-foreground/60 sm:block",children:"Enter 发送 · Shift + Enter 换行"}),t.jsx("span",{className:"flex-1 sm:hidden","aria-hidden":"true"}),t.jsx("button",{type:"submit","aria-label":"发送消息",onPointerDown:e=>{document.activeElement===M.current&&e.preventDefault()},className:"inline-flex h-11 w-11 shrink-0 items-center justify-center rounded-xl bg-primary text-primary-foreground transition hover:opacity-90 disabled:opacity-30",disabled:ze||O.busy||!!I||!w.trim()&&!L.length||Lt||!u||ee!==!0,children:t.jsx(nr,{size:19})})]})]}),Lt?t.jsx("p",{className:"mt-2 px-1 text-xs text-destructive",children:"消息过长,请缩短后发送。"}):u?null:t.jsx("p",{className:"mt-2 px-1 text-[11px] text-muted-foreground",children:"仅查看"}),i&&t.jsx("div",{className:"mt-1 flex justify-end",children:t.jsxs("button",{type:"button",className:`${Se} min-h-9 px-2 text-xs text-muted-foreground`,onClick:l,children:[t.jsx(Pt,{size:13}),"查看终端"]})})]})]})]})}function $r(n){return t.jsx(Tr,{...n},`${Xt()?.targetPeerId||location.origin}:${n.sessionId}`)}const zr=Object.freeze(Object.defineProperty({__proto__:null,SessionChatView:$r},Symbol.toStringTag,{value:"Module"}));export{gr as C,zr as S};
|
|
Binary file
|
|
Binary file
|
package/dist/client/assets/{SessionResourceSidebar-D-VXNdmE.js → SessionResourceSidebar-yPQNWbtX.js}
RENAMED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/AndroidMirrorView-
|
|
2
|
-
import{
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/AndroidMirrorView-DvaQ4bWE.js","assets/app-CG7UnlvD.js","assets/react-XDCjal2T.js","assets/dnd-BCFAPC0L.js","assets/terminal-DaiFCKy_.js","assets/index-Db6cTvcd.css","assets/v4-EwEgHOG0.js","assets/RecordingSaveDialog-SqE6T39W.js","assets/use-gesture-react.esm-uKjWuDRY.js","assets/gestureArbiter-DszagC-d.js","assets/unplug-wUkIQYu0.js","assets/circle-BbMJmnZN.js","assets/ComputerControlView-BQnieqiC.js","assets/chevron-left-BS8PE--U.js","assets/clipboard-Bc3Y4SV-.js","assets/maximize-2-Duk9ucVy.js","assets/RightSidebar-Cyd0Hm6s.js","assets/swiper-Bge5b7oc.js","assets/swiper-C2J0D0kV.css","assets/Markdown-BQK61rwW.js","assets/referenceSelection-CYduiLc1.js","assets/list-tree-TZoK4D1s.js","assets/Markdown-DKQhs57e.css","assets/GitLoadingSkeleton-D5nkNhPE.js","assets/DiffReview-9a_DXlXn.js","assets/DiffViewer-25DyaFuh.js","assets/git-compare-TvhljhDy.js","assets/DiffViewer-T3uj2-aP.css","assets/triangle-alert-DUjdvUeM.js","assets/ChangeWalkthroughPanel-BC7zpkq3.js","assets/search-g7nZaX-p.js","assets/arrow-down-C3OQpvij.js","assets/RightSidebar-DW-JEgm2.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{e1 as L,cr as e,W as A,X as $,H as O,t as D,a8 as M,aQ as V,as as _,a9 as k,eM as F,c as I,J as U,cW as J,es as W,s as B,et as K,ax as X}from"./app-CG7UnlvD.js";import{b as s}from"./dnd-BCFAPC0L.js";import{S as H,R as Q,U as q}from"./RecordingSaveDialog-SqE6T39W.js";import"./react-XDCjal2T.js";import"./terminal-DaiFCKy_.js";import"./use-gesture-react.esm-uKjWuDRY.js";import"./gestureArbiter-DszagC-d.js";const G=s.lazy(()=>k(()=>import("./AndroidMirrorView-DvaQ4bWE.js").then(n=>n.c),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11])).then(n=>({default:n.AndroidMirrorView}))),Y=s.lazy(()=>k(()=>import("./ComputerControlView-BQnieqiC.js").then(n=>n.a),__vite__mapDeps([12,1,2,3,4,5,13,10,14,15]))),Z=s.lazy(()=>k(()=>import("./RightSidebar-Cyd0Hm6s.js").then(n=>n.R),__vite__mapDeps([16,1,2,3,4,5,17,18,19,8,20,21,22,23,7,9,24,25,26,27,28,29,13,15,0,6,10,11,30,31,32])).then(n=>({default:n.FilePreview}))),v="inline-flex min-h-11 items-center justify-center gap-2 rounded-lg px-3 text-xs hover:bg-surface-2 disabled:opacity-40";function ee({sessionId:n,canWrite:f,onInsert:m}){const[l,b]=s.useState(),a=s.useRef(!0),d=s.useRef({sessionId:n,canWrite:f,onInsert:m});d.current={sessionId:n,canWrite:f,onInsert:m},s.useEffect(()=>(a.current=!0,()=>{a.current=!1}),[]);const x=async(u,r)=>{const o=X(r),g=n,c=()=>a.current&&o()&&d.current.sessionId===g&&d.current.canWrite;if(!g||!c())throw new Error("此会话当前无法添加附件");const h=(await K(g,[u],void 0,void 0,c)).files[0]?.path;if(!h||!c()||await d.current.onInsert(_(h,null),r)===!1)throw new Error("截图尚未添加,请重试")};return e.jsxs(e.Fragment,{children:[e.jsx(G,{sessionId:n,onInsertFile:f&&n?x:void 0,onInsertPrompt:f?async(u,r)=>{if(await m(u,r)===!1)throw new Error("当前无法添加")}:void 0,onRecordingComplete:f&&n?u=>{a.current&&b(u)}:void 0}),l&&e.jsx(Q,{file:l,initialPath:"/",onInsert:async(u,r)=>d.current.canWrite&&a.current?d.current.onInsert(_(u,null),r):!1,onDone:()=>b(void 0)},l.id)]})}function te({directories:n,onInsert:f,onDirty:m}){const[l,b]=s.useState(n[0]?.path||""),[a,d]=s.useState(null),[x,u]=s.useState(null),[r,o]=s.useState(),[g,c]=s.useState(""),[p,h]=s.useState(!1),[R,N]=s.useState(0),[E,i]=s.useState(!1),y=s.useRef(null),w=s.useRef(!0);s.useEffect(()=>()=>{w.current=!1},[]),s.useEffect(()=>{n.some(t=>t.path===l)||(b(n[0]?.path||""),d(null),o(void 0))},[n,l]),s.useEffect(()=>{F.getState().setRootPath(l)},[l]);const P=n.some(t=>t.access==="write"&&(a?a===t.path||a.startsWith(t.path.replace(/\/+$/,"")+"/"):l===t.path)),T=async()=>{if(r){h(!0),c("");try{const t=await fetch(`/api/terminal/fs/write?${new URLSearchParams({path:r.path})}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({content:r.content,original:r.original})}),j=await t.json();if(!t.ok)throw new Error(j.error);w.current&&(o(void 0),N(S=>S+1))}catch(t){w.current&&c(t instanceof Error?t.message:"保存失败,编辑内容已保留")}finally{w.current&&h(!1)}}};s.useEffect(()=>{const t=!!r&&r.content!==r.original;m(t);const j=S=>{t&&(S.preventDefault(),S.returnValue="")};return window.addEventListener("beforeunload",j),()=>{window.removeEventListener("beforeunload",j),m(!1)}},[r,m]);const z=()=>{r&&r.content!==r.original?i(!0):o(void 0)};return e.jsxs("div",{className:"flex min-h-0 flex-1 flex-col",children:[e.jsx("div",{className:"flex shrink-0 items-center gap-1 border-b border-border/30 p-2",children:a?e.jsxs(e.Fragment,{children:[e.jsxs("button",{type:"button",className:v,disabled:!!r||p,onClick:()=>{d(null),c("")},children:[e.jsx(I,{size:14}),"文件列表"]}),e.jsx("span",{className:"min-w-0 flex-1 truncate text-xs",title:a,children:a.split("/").pop()}),P&&!r&&e.jsxs("button",{type:"button",className:v,disabled:p,onClick:()=>{h(!0),c(""),J(a).then(t=>{if(t.binary||t.truncated||t.size>1024*1024)throw new Error("仅支持编辑 1 MB 以内的完整文本");w.current&&o({path:a,content:t.content,original:t.content})}).catch(t=>c(t.message)).finally(()=>h(!1))},children:[e.jsx(U,{size:14}),"编辑"]})]}):e.jsxs(e.Fragment,{children:[e.jsx("select",{"aria-label":"共享目录",className:"min-h-11 min-w-0 flex-1 rounded-lg bg-surface px-2 text-xs",value:l,onChange:t=>{b(t.target.value),c("")},children:n.map((t,j)=>e.jsxs("option",{value:t.path,children:[t.path," · ",t.access==="write"?"可修改":"只读"]},j))}),P&&e.jsxs("button",{type:"button",className:v,disabled:p,onClick:()=>y.current?.click(),children:[e.jsx(q,{size:14}),"上传"]}),e.jsx("input",{ref:y,type:"file",multiple:!0,hidden:!0,onChange:t=>{const j=Array.from(t.target.files||[]);if(t.target.value="",!j.length)return;const S=l;h(!0),c(""),W(S,j).then(()=>{F.getState().invalidateDirectoryCache(S),N(C=>C+1)}).catch(C=>c(C.message)).finally(()=>h(!1))}})]})}),g&&e.jsx("p",{role:"alert",className:"p-3 text-xs leading-5 text-destructive",children:g}),r?e.jsxs("div",{className:"flex min-h-0 flex-1 flex-col",children:[e.jsx("textarea",{"aria-label":"编辑文件内容",spellCheck:!1,className:"min-h-0 flex-1 resize-none bg-background p-3 font-mono text-sm leading-6 outline-none",value:r.content,disabled:p,onChange:t=>o({...r,content:t.target.value})}),e.jsx("div",{className:"shrink-0 border-t border-border p-2",children:E?e.jsxs("div",{className:"space-y-2",children:[e.jsx("p",{className:"text-xs",children:"有未保存的修改,确定放弃?"}),e.jsx("button",{type:"button",className:v,onClick:()=>i(!1),children:"继续编辑"}),e.jsx("button",{type:"button",className:`${v} text-destructive`,onClick:()=>{o(void 0),i(!1)},children:"放弃修改"})]}):e.jsxs("div",{className:"flex justify-end gap-2",children:[e.jsx("button",{type:"button",className:v,disabled:p,onClick:z,children:"取消编辑"}),e.jsx("button",{type:"button",className:`${v} bg-primary text-primary-foreground`,disabled:p,onClick:()=>{T()},children:p?"正在保存…":"保存修改"})]})})]}):a?e.jsx("div",{className:"min-h-0 flex-1 overflow-auto",children:e.jsx(s.Suspense,{fallback:e.jsx("p",{className:"p-4 text-sm text-muted-foreground",children:"正在读取预览…"}),children:e.jsx(Z,{filePath:a,onInsertReference:t=>f(t),onInsertText:f,onReferenceCopied:()=>{},isMobile:!0,markdownOutlineOpen:!1,markdownImageLightboxOpen:!1,lineRange:x,onLineRangeChange:u,insertedReferenceKey:null,copiedReferenceKey:null},`${a}:${R}`)})}):e.jsx("div",{className:"min-h-0 flex-1 overflow-auto",children:e.jsx(B,{rootPath:l,selectedFilePath:a,onFileSelect:d,onPathReference:f},`${l}:${R}`)})]})}function ce({resources:n,sessionId:f,canWrite:m=!1,pinned:l,open:b,onClose:a,onInsert:d}){const x=L(n),[u,r]=s.useState(x[0]),o=x.includes(u)?u:x[0],g=s.useRef(!1),c=s.useRef(i=>{g.current=i}).current,p=async i=>{i!==u&&(g.current&&!await V({title:"放弃文件修改?",message:"当前文件有未保存的修改。",confirmLabel:"放弃修改",cancelLabel:"继续编辑"})||r(i))},[h,R]=s.useState(0),N=n.computers?.[h]??n.computers?.[0],E=o==="computer"?{...n,computers:N?[N]:[]}:n;return x.length?e.jsx(A.Provider,{value:E,children:e.jsx(H,{side:"right",isOpen:b,pinned:l,drawerWidthPx:Math.min(window.innerWidth-16,480),onClose:a,children:e.jsxs("div",{className:"flex min-h-0 flex-1 flex-col",children:[e.jsxs("header",{className:"flex shrink-0 items-center gap-1 border-b border-border/40 px-2 py-1",children:[e.jsx("div",{role:x.length>1?"tablist":void 0,"aria-label":"侧栏功能",className:"flex min-w-0 flex-1 gap-1",children:x.map(i=>{const[y,w]=i==="android"?["手机",$]:i==="computer"?["电脑",O]:["文件",D];return x.length===1?e.jsxs("span",{className:"inline-flex min-h-9 items-center gap-2 px-2 text-xs",children:[e.jsx(w,{size:14}),y]},i):e.jsxs("button",{type:"button",role:"tab","aria-selected":o===i,onClick:()=>{p(i)},className:`${v} flex-1 ${o===i?"bg-surface-elevated":"text-muted-foreground"}`,children:[e.jsx(w,{size:14}),y]},i)})}),e.jsx("button",{type:"button",className:v,"aria-label":"关闭共享侧栏",onClick:a,children:e.jsx(M,{size:17})})]}),e.jsxs(s.Suspense,{fallback:e.jsx("p",{role:"status",className:"p-4 text-sm text-muted-foreground",children:"正在打开共享内容…"}),children:[o==="android"&&b&&e.jsx(ee,{sessionId:f,canWrite:m,onInsert:d},f),o==="computer"&&e.jsxs(e.Fragment,{children:[(n.computers?.length??0)>1&&e.jsx("select",{"aria-label":"共享电脑",className:"min-h-11 bg-surface px-3 text-xs",value:h,onChange:i=>R(Number(i.target.value)),children:n.computers?.map((i,y)=>e.jsxs("option",{value:y,children:[i.host,":",i.port]},y))}),e.jsx(Y,{active:b},JSON.stringify(N))]}),o==="files"&&e.jsx(te,{directories:n.directories,onInsert:d,onDirty:c})]})]})})}):null}export{ce as SessionResourceSidebar};
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a$ as jt,aW as vt,eA as We,cq as e,a8 as Ye,u as Ge,$ as Qe,p as wt,e as Nt,C as yt,eF as kt,dD as R,bo as Ct,bR as St,bN as Ue,T as Ke,S as Ce,c as Se,O as He,Y as Xe,k as It,bQ as $t,J as At,a2 as Et}from"./app-DZ6mCJiW.js";import{b as j,r as Dt}from"./dnd-BCFAPC0L.js";import{g as me,A as Ze,l as Je,r as Tt,j as zt,e as qt,P as Pt,k as Be,u as Ie,i as Rt,d as Lt,s as Ot,b as Ft,h as _t}from"./App-7BA7Jt-V.js";import{D as et}from"./RecordingSaveDialog-Czkjuaeu.js";import{d as Ut}from"./GitLoadingSkeleton-RRbTeMuA.js";import{S as tt}from"./AndroidMirrorView-COoPljXi.js";import{S as Kt}from"./search-DAQ_AOVP.js";import{C as Ht}from"./circle-BIJQEbCa.js";import"./react-XDCjal2T.js";import"./terminal-DaiFCKy_.js";import"./link-DWUQqMDL.js";import"./clipboardText-DoB9NjH8.js";import"./swiper-BaumVgFd.js";import"./clipboard-DV8t7tww.js";import"./v4-EwEgHOG0.js";import"./triangle-alert-D-tt7pA2.js";import"./external-link-DodqgrCc.js";import"./maximize-2-Clx4ktqB.js";import"./git-compare-KkbucDhN.js";import"./use-gesture-react.esm-CM42s15B.js";import"./arrow-down-Ty3zwcgl.js";import"./sun-DvwMJkda.js";import"./unplug-BQxOculv.js";import"./gestureArbiter-DszagC-d.js";const Jt=[["polyline",{points:"22 12 16 12 14 15 10 15 8 12 2 12",key:"o97t9d"}],["path",{d:"M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z",key:"oot6mr"}]],Bt=jt("inbox",Jt),V={tab:"todos",filter:"open",source:"",query:"",selectedId:null,mobileDetail:!1,selecting:!1,checked:[],toolsOpen:!1,modal:null,drafts:{},requests:{}},A=vt((s,a)=>({views:{},snapshots:{},options:{},cache:(n,c)=>s(l=>({snapshots:{...l.snapshots,[n]:c}})),cacheOptions:(n,c)=>s(l=>({options:{...l.options,[n]:c}})),patch:(n,c)=>s(l=>({views:{...l.views,[n]:{...l.views[n]??V,...c}}})),draft:(n,c,l)=>{const r=a().views[n]??V;a().patch(n,{drafts:{...r.drafts,[c]:l}})},clearDraft:(n,c)=>{const l={...(a().views[n]??V).drafts};delete l[c],a().patch(n,{drafts:l})},requestKey:(n,c)=>{const l=JSON.stringify(c),r=a().views[n]??V;if(r.requests[l])return r.requests[l];const d=crypto.randomUUID();return a().patch(n,{requests:{...r.requests,[l]:d}}),d},finishRequest:(n,c)=>{const l={...(a().views[n]??V).requests};delete l[JSON.stringify(c)],a().patch(n,{requests:l})}}));function Ee(s,a,n){return[A(l=>l.views[s]?.drafts[a])??n,l=>A.getState().draft(s,a,l)]}function de(s,a){return s.runs.filter(n=>n.todoId===a||n.handoff?.todoIds.includes(a)).at(-1)}function Mt(s,a,n){return n==="review"?a.status==="open"&&de(s,a.id)?.status==="complete":a.status===(n==="completed"?"completed":n==="ignored"?"ignored":"open")}const st=s=>`termdock:todo-preferences:v1:${s}`,ue=s=>s.replace(/\/+$/,"").split("/").pop()||s;function xe(s){return[...new Set(s.filter(a=>typeof a=="string"&&!!a.trim()).map(a=>a.trim().replace(/\/+$/,"")||"/"))]}function De(s){try{const a=JSON.parse(localStorage.getItem(st(s))||"{}"),n=a?.choice;return{choice:n&&["agentSlug","command","cwd"].every(c=>typeof n[c]=="string")?n:void 0,directories:xe(Array.isArray(a?.directories)?a.directories:[]).slice(0,8)}}catch{return{directories:[]}}}function Me(s,a){try{const n=De(s);localStorage.setItem(st(s),JSON.stringify({choice:{agentSlug:a.agentSlug,command:a.command,cwd:a.cwd},directories:xe([a.cwd,...n.directories]).slice(0,8)}))}catch{}}function Vt(s,a,n,c){return xe([s,...De(c).directories,n?.defaults.cwd,...n?.runs.slice().reverse().map(l=>l.config.cwd)??[],...a,...n?.collectors.map(l=>l.config.cwd)??[]]).slice(0,8)}const Te="inline-flex min-h-11 items-center justify-center gap-2 rounded-lg px-3 text-sm font-medium transition disabled:cursor-not-allowed disabled:opacity-40",H=`${Te} bg-primary text-primary-foreground hover:opacity-90`,F=`${Te} bg-surface-2 text-foreground hover:bg-surface-elevated`,k=`${Te} text-muted-foreground hover:bg-surface-2 hover:text-foreground`,L="w-full min-h-11 min-w-0 rounded-lg border border-border/40 bg-surface-2 px-3 py-2.5 text-base text-foreground outline-none focus:border-primary sm:text-sm",O="block space-y-2 text-sm text-muted-foreground";function Wt({title:s,busy:a,error:n,onClose:c,children:l,compact:r=!1}){const d=j.useRef(null),i=j.useId();return We(d,!0,()=>{a||c()}),Dt.createPortal(e.jsxs(e.Fragment,{children:[e.jsx("button",{className:"fixed inset-0 z-drawer-backdrop bg-[var(--app-backdrop)] backdrop-blur-sm","aria-label":"关闭待办面板",disabled:a,onClick:c}),e.jsxs("section",{ref:d,role:"dialog","aria-modal":"true","aria-labelledby":i,"aria-busy":a,tabIndex:-1,className:r?"fixed bottom-[max(0.75rem,env(safe-area-inset-bottom,0px))] left-3 right-3 z-drawer-panel flex max-h-[calc(100svh-2rem)] min-w-0 flex-col overflow-hidden rounded-2xl border border-border/30 bg-surface text-foreground shadow-xl sm:bottom-auto sm:left-1/2 sm:right-auto sm:top-1/2 sm:w-[28rem] sm:max-w-[90vw] sm:-translate-x-1/2 sm:-translate-y-1/2":"fixed inset-y-0 right-0 z-drawer-panel flex w-full min-w-0 flex-col border-l border-border/30 bg-surface pt-[env(safe-area-inset-top,0px)] text-foreground shadow-xl sm:w-[32rem] sm:max-w-[90vw]",children:[e.jsxs("header",{className:"flex min-h-16 shrink-0 items-center gap-3 border-b border-border/20 px-5",children:[e.jsx("h2",{id:i,className:"flex-1 text-base font-semibold",children:s}),e.jsx("button",{type:"button",className:k,"aria-label":"关闭",disabled:a,onClick:c,children:e.jsx(Ye,{size:18})})]}),n&&e.jsx("p",{role:"alert",className:"shrink-0 border-b border-[color-mix(in_srgb,var(--destructive)_20%,transparent)] bg-[color-mix(in_srgb,var(--destructive)_10%,transparent)] px-5 py-3 text-sm leading-6 text-destructive",children:n}),e.jsx("div",{className:"flex min-h-0 flex-1 flex-col",children:l})]})]}),document.body)}function ze({children:s}){return e.jsx("div",{className:"min-h-0 flex-1 space-y-5 overflow-y-auto overscroll-contain px-5 py-5",children:s})}function at({children:s}){return e.jsx("footer",{className:"flex shrink-0 flex-wrap items-center justify-end gap-2 border-t border-border/20 px-5 py-4 pb-[max(1rem,env(safe-area-inset-bottom,0px))]",children:s})}function Yt({workspace:s,todo:a,busy:n,onSave:c,onCancel:l}){const[r,d]=Ee(s,`todo:${a?.id??"new"}`,{title:a?.title??"",description:a?.description??""}),i=p=>{!n&&r.title.trim()&&c({...r,title:r.title.trim()},p)};return e.jsxs("form",{className:"flex min-h-0 flex-1 flex-col",onSubmit:p=>{p.preventDefault(),i(!a)},children:[e.jsxs(ze,{children:[e.jsxs("label",{className:O,children:["要做什么",e.jsx("input",{autoFocus:!0,required:!0,maxLength:200,className:L,value:r.title,onChange:p=>d({...r,title:p.target.value}),placeholder:"一句话描述这件事"})]}),e.jsxs("label",{className:O,children:["背景和处理要求",e.jsx("textarea",{className:`${L} min-h-44 resize-y`,maxLength:4e4,value:r.description,onChange:p=>d({...r,description:p.target.value}),placeholder:"为什么要做、参考资料、希望得到什么结果…"})]}),!a&&e.jsx("p",{className:"text-xs leading-6 text-muted-foreground",children:"可以先存进清单,也可以选一个会话交出去。"})]}),e.jsxs(at,{children:[e.jsx("button",{type:"button",className:k,disabled:n,onClick:l,children:"取消"}),!a&&e.jsx("button",{type:"button",className:F,disabled:n||!r.title.trim(),onClick:()=>i(!1),children:"仅保存"}),e.jsx("button",{className:H,disabled:n||!r.title.trim(),children:n?"正在保存…":a?"保存修改":"保存并交给会话"})]})]})}function nt(s,a,n,c){const l=a.find(r=>r.slug===(s.agentSlug||n))??(s.agentSlug?void 0:a[0]);return{...s,agentSlug:s.agentSlug||l?.slug||"",command:s.command||(l?me(l.slug,l.command):""),cwd:s.cwd||c||""}}function Gt({config:s,agents:a,loading:n,service:c,directories:l,currentCwd:r,onChange:d,collect:i=!1}){const[p,m]=j.useState(!1),N=j.useId(),f=j.useId();return e.jsxs(e.Fragment,{children:[e.jsxs("p",{className:"text-xs text-muted-foreground",children:["运行于 ",c]}),e.jsxs("div",{className:O,children:[e.jsx("label",{htmlFor:N,children:"Agent"}),e.jsxs("select",{id:N,className:L,required:!0,disabled:n,value:s.agentSlug,onChange:x=>{const y=a.find(E=>E.slug===x.target.value);d({...s,agentSlug:x.target.value,command:y?me(y.slug,y.command):""})},children:[e.jsx("option",{value:"",disabled:a.length>0,children:n?"正在加载 Agent…":"选择 Agent"}),a.map(x=>e.jsx("option",{value:x.slug,children:x.displayName},x.slug)),s.agentSlug&&!a.some(x=>x.slug===s.agentSlug)&&e.jsxs("option",{value:s.agentSlug,children:[s.agentSlug,"(当前不可用)"]})]})]}),a.find(x=>x.slug===s.agentSlug)&&e.jsx(Ze,{agent:a.find(x=>x.slug===s.agentSlug),value:s.command,onChange:x=>d({...s,command:x})},s.agentSlug),!n&&a.length===0&&e.jsx("p",{className:"text-sm text-destructive",children:"未找到可启动的 Agent,请检查该服务的 Agent 配置。"}),e.jsxs("div",{className:O,children:[e.jsx("label",{htmlFor:f,children:"工作目录"}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx("input",{id:f,className:L,value:s.cwd,autoCapitalize:"none",autoCorrect:"off",spellCheck:!1,onChange:x=>d({...s,cwd:x.target.value}),placeholder:"选择这件事所在的项目或目录"}),e.jsx("button",{type:"button",className:F,"aria-label":"选择工作目录",onClick:()=>m(!0),children:e.jsx(Ge,{size:17})})]}),!!l.length&&e.jsx("div",{className:"flex gap-1.5 overflow-x-auto pb-1","aria-label":"快捷选择工作目录",children:l.map(x=>{const y=ue(x),g=l.some(h=>h!==x&&ue(h)===y)?x.split("/").filter(Boolean).slice(-2).join("/"):y;return e.jsx("button",{type:"button","aria-label":`使用目录 ${x}`,"aria-pressed":s.cwd===x,title:x,className:`min-h-10 max-w-48 shrink-0 truncate rounded-lg border px-2.5 text-xs ${s.cwd===x?"border-[rgb(var(--primary-rgb)/0.3)] bg-[rgb(var(--primary-rgb)/0.1)] text-primary":"border-transparent bg-surface-2 text-muted-foreground hover:text-foreground"}`,onClick:()=>d({...s,cwd:x}),children:x===r?`当前 · ${g}`:g},x)})})]}),e.jsxs("label",{className:O,children:[i?"收集要求":"处理要求",e.jsx("textarea",{required:i,className:`${L} min-h-32 resize-y`,maxLength:2e4,value:s.prompt,onChange:x=>d({...s,prompt:x.target.value}),placeholder:i?"从哪里收集、筛选哪些事项、需要哪些背景与来源…":"补充 Agent 应该遵守的要求,可留空"})]}),e.jsx(et,{open:p,initialPath:s.cwd||"/",title:"选择工作目录",labels:{hint:"选择 Agent 运行的目录",cancel:"取消",confirm:"使用此目录",close:"关闭",parent:"上级目录"},onCancel:()=>m(!1),onConfirm:x=>{d({...s,cwd:x}),m(!1)}})]})}const Qt=[{name:"项目巡检",prompt:"检查工作目录中的项目,找出值得处理的问题。每条待办写清问题、依据和建议,避免重复。只收集待办,不修改项目。"},{name:"技术动态",prompt:"收集我关注方向的技术动态,筛选值得进一步调研或尝试的事项。每条待办附来源和后续建议,避免重复。"}];function Xt({workspace:s,collector:a,config:n,agents:c,loading:l,service:r,directories:d,currentCwd:i,busy:p,onSave:m,onCancel:N}){const[f,x]=Ee(s,`collector:${a?.id??"new"}`,{name:a?.name??"",config:a?.config??{...n,prompt:""},enabled:a?.enabled??!0,schedule:a?.schedule?.kind??"manual",minutes:a?.schedule?.kind==="interval"?a.schedule.everyMinutes:60,daily:a?.schedule?.kind==="daily"?a.schedule.time:"09:00"}),y=f.config.agentSlug?f.config:{...nt(f.config,c,n.agentSlug,n.cwd),prompt:f.config.prompt},E=f.name.trim()&&y.prompt.trim()&&!l&&c.some(h=>h.slug===y.agentSlug),g=h=>{p||!E||m({id:a?.id,revision:a?.revision,name:f.name.trim(),config:y,enabled:f.enabled,schedule:f.schedule==="manual"?null:f.schedule==="interval"?{kind:"interval",everyMinutes:f.minutes}:{kind:"daily",time:f.daily,weekdays:a?.schedule?.kind==="daily"?a.schedule.weekdays:[0,1,2,3,4,5,6]}},h)};return e.jsxs("form",{className:"flex min-h-0 flex-1 flex-col",onSubmit:h=>{h.preventDefault(),g(!0)},children:[e.jsx(ze,{children:e.jsxs("fieldset",{disabled:p,className:"min-w-0 space-y-5",children:[!a&&e.jsx("div",{className:"flex flex-wrap gap-2",children:Qt.map(h=>e.jsx("button",{type:"button",className:F,onClick:()=>x({...f,name:h.name,config:{...f.config,prompt:h.prompt}}),children:h.name},h.name))}),e.jsxs("label",{className:O,children:["收集方向",e.jsx("input",{required:!0,className:L,maxLength:200,value:f.name,onChange:h=>x({...f,name:h.target.value}),placeholder:"例如:项目巡检、技术动态"})]}),e.jsx(Gt,{collect:!0,config:y,agents:c,loading:l,service:r,directories:d,currentCwd:i,onChange:h=>x({...f,config:h})}),e.jsxs("details",{className:"rounded-lg border border-border/20 px-3 text-sm text-muted-foreground",children:[e.jsxs("summary",{className:"cursor-pointer py-3",children:["定时与启用 · ",f.schedule==="manual"?"手动运行":f.schedule==="interval"?`每 ${f.minutes} 分钟`:`每天 ${f.daily}`]}),e.jsxs("div",{className:"space-y-4 pb-3",children:[e.jsxs("label",{className:O,children:["运行频率",e.jsxs("select",{className:L,value:f.schedule,onChange:h=>x({...f,schedule:h.target.value}),children:[e.jsx("option",{value:"manual",children:"手动运行"}),e.jsx("option",{value:"interval",children:"按间隔运行"}),e.jsx("option",{value:"daily",children:"每天定时"})]})]}),f.schedule==="interval"&&e.jsxs("label",{className:O,children:["间隔(分钟)",e.jsx("input",{className:L,required:!0,type:"number",min:1,max:43200,step:1,value:f.minutes,onChange:h=>x({...f,minutes:Number(h.target.value)})})]}),f.schedule==="daily"&&e.jsxs("label",{className:O,children:["时间(服务所在时区)",e.jsx("input",{className:L,required:!0,type:"time",value:f.daily,onChange:h=>x({...f,daily:h.target.value})})]}),e.jsxs("label",{className:"flex items-center gap-3 text-sm",children:[e.jsx("input",{type:"checkbox",checked:f.enabled,onChange:h=>x({...f,enabled:h.target.checked})}),"启用此方向,参与全部收集和定时运行"]})]})]})]})}),e.jsxs(at,{children:[e.jsx("button",{type:"button",className:k,disabled:p,onClick:N,children:"取消"}),e.jsx("button",{type:"button",className:F,disabled:p||!E,onClick:()=>g(!1),children:"仅保存"}),e.jsxs("button",{className:H,disabled:p||!E,children:[e.jsx(Ut,{size:16}),p?"正在保存…":"保存并收集"]})]})]})}function Zt(){const[s,a]=j.useState(!1),n='td todo add --title "检查项目依赖" --description "核实升级影响" --source "项目巡检" --external-id "deps-review"';return e.jsxs(ze,{children:[e.jsx("p",{className:"text-sm leading-7 text-muted-foreground",children:"外部程序或 Agent 可以在服务所在机器,通过 CLI 写入待办。相同来源与外部标识会去重。"}),e.jsx("pre",{className:"overflow-x-auto rounded-lg bg-surface-2 p-4 text-xs leading-6",children:e.jsx("code",{children:n})}),e.jsx("button",{className:F,onClick:()=>{navigator.clipboard.writeText(n).then(()=>a(!0)).catch(()=>a(!1))},children:s?"已复制":"复制命令"}),e.jsxs("p",{className:"text-xs leading-6 text-muted-foreground",children:["完整用法:",e.jsx("code",{children:"td todo --help"}),"。API:",e.jsx("code",{className:"break-all",children:"POST /api/terminal/operations/todos"}),",沿用当前服务的鉴权和加密连接。"]})]})}const es=s=>{const a=new Date(s),n=new Date,c=a.toDateString()===n.toDateString();return new Intl.DateTimeFormat("zh-CN",{...c?{}:{month:"short",day:"numeric",...a.getFullYear()===n.getFullYear()?{}:{year:"numeric"}},hour:"2-digit",minute:"2-digit",hour12:!1}).format(a)},lt={launching:"正在准备终端",delivered:"任务已发送到终端",complete:"已收到结果,待你确认",blocked:"Agent 需要你协助",failed:"启动或处理失败"};function ts({run:s,onOpen:a,busy:n}){return e.jsxs("article",{className:"rounded-xl border border-border/30 bg-surface p-4",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx("span",{className:`min-w-0 flex-1 text-sm font-medium ${s.status==="complete"?"text-primary":s.status==="failed"||s.status==="blocked"?"text-destructive":""}`,children:s.status==="complete"?"已收到结果报告":lt[s.status]}),s.sessionId&&e.jsxs("button",{type:"button",className:F,disabled:n,onClick:a,children:[e.jsx(Qe,{size:15}),"打开终端"]})]}),e.jsxs("p",{className:"mt-1 text-xs leading-6 text-muted-foreground",children:[s.config.agentSlug," · ",es(s.createdAt)]}),s.status==="delivered"&&!s.result&&e.jsx("p",{className:"mt-2 text-xs leading-6 text-muted-foreground",children:"打开终端查看输出,或处理 Agent 的登录与授权。明确结果报告会显示在这里。"}),s.error&&e.jsx("p",{className:"mt-3 whitespace-pre-wrap break-words text-sm leading-7 text-destructive",children:s.error}),s.result&&e.jsx("div",{className:"termdock-native-select mt-3 whitespace-pre-wrap break-words border-t border-border/20 pt-3 text-sm leading-7",children:s.result})]})}function Ae({label:s="更多操作",items:a,disabled:n}){const[c,l]=j.useState(!1),r=j.useRef(null),d=j.useRef(null),i=j.useId();return We(d,c,()=>l(!1)),j.useEffect(()=>{if(!c)return;const p=m=>{m.target instanceof Node&&!r.current?.contains(m.target)&&l(!1)};return document.addEventListener("pointerdown",p,!0),()=>document.removeEventListener("pointerdown",p,!0)},[c]),e.jsxs("div",{ref:r,className:"relative z-20 shrink-0",children:[e.jsx("button",{type:"button","aria-label":s,title:s,"aria-haspopup":"menu","aria-expanded":c,"aria-controls":c?i:void 0,disabled:n,className:"inline-flex min-h-11 w-11 items-center justify-center rounded-lg text-muted-foreground transition hover:bg-surface-2 hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:opacity-40",onClick:()=>l(p=>!p),children:e.jsx(wt,{size:20})}),c&&e.jsx("div",{ref:d,id:i,role:"menu","aria-label":s,tabIndex:-1,className:"absolute right-0 top-full z-30 mt-1 w-56 max-w-[calc(100vw-2rem)] rounded-xl border border-border/50 bg-surface p-1.5 shadow-xl",onKeyDown:p=>{if(!["ArrowDown","ArrowUp","Home","End"].includes(p.key))return;p.preventDefault();const m=Array.from(d.current?.querySelectorAll('[role="menuitem"]:not(:disabled)')??[]),N=m.indexOf(document.activeElement);m[p.key==="Home"?0:p.key==="End"?m.length-1:(N+(p.key==="ArrowDown"?1:-1)+m.length)%m.length]?.focus()},children:a.map(p=>e.jsx("button",{type:"button",role:"menuitem",disabled:p.disabled,className:`flex min-h-11 w-full items-center rounded-lg px-3 text-left text-sm outline-none transition hover:bg-surface-2 focus:bg-surface-2 disabled:opacity-40 ${p.danger?"text-destructive":"text-foreground"}`,onClick:()=>{l(!1),p.action()},children:p.label},p.label))})]})}function ss({todo:s,runs:a,busy:n,wide:c,menu:l,onLaunch:r,onOpen:d,onStatus:i,sessionName:p}){const m=a.at(-1),N=!!m?.sessionId&&m.status!=="failed";return e.jsxs("section",{"aria-label":"待办详情",className:"flex min-h-0 min-w-0 flex-1 flex-col",children:[e.jsxs("div",{className:"min-h-0 flex-1 overflow-y-auto overscroll-contain px-5 pb-8 pt-6 sm:px-8",children:[e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsx("h2",{className:"min-w-0 flex-1 break-words text-xl font-semibold leading-8",children:s.title}),c&&e.jsx(Ae,{label:"待办操作",items:l,disabled:n})]}),e.jsxs("p",{className:"mt-2 text-xs leading-6 text-muted-foreground",children:[s.source,m?.status==="launching"?" · 正在发送":N?` · 已交给 ${p||"会话"}`:""]}),s.description&&e.jsx("p",{className:"termdock-native-select mt-5 whitespace-pre-wrap break-words text-[15px] leading-8",children:s.description}),m?.handoff?.note&&e.jsxs("div",{className:"mt-6 text-sm leading-7",children:[e.jsx("p",{className:"text-xs text-muted-foreground",children:"发送时的补充"}),e.jsx("p",{className:"mt-1 whitespace-pre-wrap break-words",children:m.handoff.note})]}),m?.error&&e.jsx("p",{role:"alert",className:"mt-5 break-words text-sm leading-7 text-destructive",children:m.error}),s.sourceUrl&&e.jsxs("a",{className:"mt-4 inline-flex min-h-11 items-center gap-1 text-sm text-primary",href:s.sourceUrl,target:"_blank",rel:"noreferrer",children:["查看来源",e.jsx(Nt,{size:14})]}),a.some(f=>f.result)&&e.jsxs("details",{className:"mt-8 border-t border-border/30 pt-3 text-sm text-muted-foreground",children:[e.jsx("summary",{className:"min-h-11 cursor-pointer py-2.5",children:"此前的处理记录"}),a.filter(f=>f.result).slice().reverse().map(f=>e.jsx("p",{className:"mt-3 whitespace-pre-wrap break-words leading-7",children:f.result},f.id))]})]}),e.jsx("footer",{className:"flex shrink-0 flex-wrap items-center gap-2 border-t border-border/30 bg-[var(--chrome-bg)] px-5 py-3 pb-[max(0.75rem,env(safe-area-inset-bottom,0px))] sm:px-8",children:s.status==="open"?e.jsxs(e.Fragment,{children:[e.jsxs("button",{type:"button",className:`${H} flex-1 sm:flex-none`,disabled:n||m?.status==="launching",onClick:()=>N?d(m):r(),children:[N?e.jsx(Qe,{size:16}):e.jsx(tt,{size:16}),N?"去会话":m?.status==="launching"?"正在发送…":"交给会话"]}),N&&e.jsx("button",{type:"button",className:k,disabled:n,onClick:r,children:"再次交给"}),e.jsxs("button",{type:"button",className:k,disabled:n,onClick:()=>i("completed"),children:[e.jsx(yt,{size:16}),"完成"]})]}):e.jsx("button",{type:"button",className:H,disabled:n,onClick:()=>i("open"),children:"重新打开"})})]})}const ce="min-h-11 w-full min-w-0 rounded-lg border border-border/40 bg-surface-2 px-3 py-2.5 text-base text-foreground outline-none focus:border-primary sm:text-sm",rt=s=>`termdock:todo-recipient:v1:${s}`;function as(s,a){try{localStorage.setItem(rt(s),a)}catch{}}function ns(s){try{return localStorage.getItem(rt(s))}catch{return null}}function ls({workspace:s,ids:a,config:n,agents:c,sessions:l,currentSessionId:r,directories:d,busy:i,loading:p,title:m,onSend:N,onCancel:f}){const x=l.filter(u=>u.agent?.slug).sort((u,q)=>+(q.sessionId===r)-+(u.sessionId===r)||q.lastActivity-u.lastActivity),y=ns(s),E=x.find(u=>u.sessionId===r)?.sessionId??x.find(u=>u.sessionId===y)?.sessionId??x[0]?.sessionId??"__new__",[g,h]=Ee(s,`handoff:${JSON.stringify(a.slice().sort())}`,{target:E,note:"",config:{...n,prompt:""}}),[J,D]=j.useState(!1),C=g.target==="__new__",_=c.find(u=>u.slug===g.config.agentSlug),B=!p&&(C?!!_:x.some(u=>u.sessionId===g.target));return e.jsxs("form",{className:"flex min-h-0 flex-1 flex-col",onSubmit:u=>{u.preventDefault(),!i&&B&&N({note:g.note,...C?{config:g.config}:{sessionId:g.target}})},children:[e.jsxs("div",{className:"min-h-0 flex-1 space-y-5 overflow-y-auto overscroll-contain px-5 py-5",children:[e.jsx("p",{className:"truncate text-sm text-muted-foreground",title:m,children:a.length>1?`${a.length} 条待办,一起发送`:m}),e.jsxs("fieldset",{disabled:i,className:"min-w-0 space-y-5",children:[e.jsxs("label",{className:"block space-y-2 text-sm text-muted-foreground",children:["交给谁",e.jsxs("select",{className:ce,disabled:p,value:g.target,onChange:u=>h({...g,target:u.target.value}),children:[x.map(u=>e.jsxs("option",{value:u.sessionId,children:[u.sessionId===r?"当前 · ":u.sessionId===y?"上次 · ":"",u.displayName," · ",u.agent?.displayName||u.agent?.slug]},u.sessionId)),!C&&!x.some(u=>u.sessionId===g.target)&&e.jsx("option",{value:g.target,disabled:!0,children:"原会话已不可用,请重新选择"}),e.jsx("option",{value:"__new__",children:"+ 新建会话"})]})]}),C&&e.jsxs("details",{className:"rounded-lg border border-border/20 px-3 text-sm text-muted-foreground",children:[e.jsxs("summary",{className:"min-h-11 cursor-pointer py-3",children:[_?.displayName||"选择 Agent"," · ",ue(g.config.cwd)||"服务默认目录"," · 更改"]}),e.jsxs("div",{className:"space-y-4 pb-3",children:[e.jsxs("label",{className:"block space-y-2",children:["Agent",e.jsxs("select",{className:ce,value:g.config.agentSlug,onChange:u=>{const q=c.find(fe=>fe.slug===u.target.value);h({...g,config:{...g.config,agentSlug:u.target.value,command:q?me(q.slug,q.command):""}})},children:[e.jsx("option",{value:"",disabled:!0,children:"选择 Agent"}),c.map(u=>e.jsx("option",{value:u.slug,children:u.displayName},u.slug))]})]}),_&&e.jsx(Ze,{agent:_,value:g.config.command,onChange:u=>h({...g,config:{...g.config,command:u}})},_.slug),e.jsxs("label",{className:"block space-y-2",children:["工作目录",e.jsxs("div",{className:"flex gap-2",children:[e.jsx("input",{className:ce,value:g.config.cwd,placeholder:"服务默认目录",onChange:u=>h({...g,config:{...g.config,cwd:u.target.value}})}),e.jsx("button",{type:"button",className:F,"aria-label":"选择工作目录",onClick:()=>D(!0),children:e.jsx(Ge,{size:16})})]})]}),!!d.length&&e.jsx("div",{className:"flex gap-2 overflow-x-auto",children:d.map(u=>e.jsx("button",{type:"button",className:"min-h-10 shrink-0 rounded-md bg-surface-2 px-2 text-xs",title:u,onClick:()=>h({...g,config:{...g.config,cwd:u}}),children:ue(u)},u))})]})]}),e.jsxs("label",{className:"block space-y-2 text-sm text-muted-foreground",children:["补充一句话",e.jsx("span",{className:"ml-2 text-xs",children:"选填"}),e.jsx("textarea",{className:`${ce} min-h-28 resize-y`,maxLength:4e3,value:g.note,onChange:u=>h({...g,note:u.target.value}),placeholder:"例如:先分析不要改代码,和之前那个问题一起处理…"})]})]})]}),e.jsxs("footer",{className:"flex shrink-0 items-center justify-end gap-2 border-t border-border/20 px-5 py-4 pb-[max(1rem,env(safe-area-inset-bottom,0px))]",children:[e.jsx("button",{type:"button",className:k,disabled:i,onClick:f,children:"取消"}),e.jsxs("button",{className:H,disabled:i||!B,children:[e.jsx(tt,{size:16}),i?"正在发送…":"发送并进入会话"]})]}),e.jsx(et,{open:J,title:"选择工作目录",initialPath:g.config.cwd||"/",onCancel:()=>D(!1),onConfirm:u=>{h({...g,config:{...g.config,cwd:u}}),D(!1)}})]})}const Ve={agentSlug:"",command:"",cwd:"",prompt:""};function Ds({onOpenSidebar:s,leftSidebarVisible:a,activeSessionId:n}){const c=kt(),[l]=j.useState(()=>R()?.targetPeerId??location.origin),r=A(t=>t.views[l]??V),d=t=>A.getState().patch(l,t),[i,p]=j.useState(()=>A.getState().snapshots[l]??null),[m,N]=j.useState(()=>A.getState().options[l]??{agents:[],preferred:null,cwd:"",directories:[]}),[f,x]=j.useState(!A.getState().options[l]),[y,E]=j.useState(""),[g,h]=j.useState(""),[J,D]=j.useState(""),[C,_]=j.useState(!1),[B,u]=j.useState(null),q=j.useRef(null),[fe,it]=j.useState(0),M=fe>=900,K=j.useRef(!0),pe=j.useRef(!1),he=j.useRef(!1),ge=j.useRef(0),qe=j.useRef(R()?.targetPeerId),T=()=>K.current&&qe.current===R()?.targetPeerId,X=j.useCallback(async(t=!1)=>{if(he.current&&!t)return;he.current=!0;const o=++ge.current,v=R()?.targetPeerId;try{const b=await Je();K.current&&o===ge.current&&v===R()?.targetPeerId&&(p(b),A.getState().cache(l,b),E(""))}catch(b){K.current&&v===R()?.targetPeerId&&E(b instanceof Error?b.message:"待办加载失败")}finally{o===ge.current&&(he.current=!1)}},[l]),W=j.useCallback(async()=>{const t=R()?.targetPeerId;x(!0);const[o,v]=await Promise.allSettled([Ct(),St()]);if(!K.current||R()?.targetPeerId!==t)return;const b=A.getState().options[l],w=Ue().slice().sort(($,bt)=>bt.lastActivity-$.lastActivity),U={agents:o.status==="fulfilled"?o.value:b?.agents??[],preferred:v.status==="fulfilled"?v.value.newSessionAgentSlug:b?.preferred??Tt()?.slug??null,cwd:w.find($=>$.sessionId===n)?.cwd??b?.cwd??w[0]?.cwd??"",directories:xe(w.map($=>$.cwd).concat(b?.directories??[]))};N(U),A.getState().cacheOptions(l,U),x(!1),o.status==="rejected"&&h("会话选项加载失败,打开交接面板可重试。")},[l,n]);j.useEffect(()=>{K.current=!0;const t=q.current,o=()=>it(t?.clientWidth??0);o();const v=new ResizeObserver(o);t&&v.observe(t),W();const b=()=>{qe.current!==R()?.targetPeerId&&Be.getState().terminal()};window.addEventListener(Ke,b),window.addEventListener(Ce,W);const w=zt(()=>{navigator.onLine!==!1&&X()},1200,[Ce]);return()=>{K.current=!1,v.disconnect(),w(),window.removeEventListener(Ke,b),window.removeEventListener(Ce,W)}},[X,W]),j.useEffect(()=>{if(!J)return;const t=window.setTimeout(()=>{D(""),u(null)},5e3);return()=>window.clearTimeout(t)},[J]);const be=t=>A.getState().requestKey(l,t),Z=t=>A.getState().finishRequest(l,t),je=t=>A.getState().clearDraft(l,t),S=r.modal,z=t=>{h(""),d({modal:t})},P=async t=>{if(!pe.current){pe.current=!0,_(!0),h(""),D(""),u(null);try{await t(),T()&&(await X(!0),window.dispatchEvent(new Event("termdock:todos-changed")))}catch(o){T()&&h(o instanceof Error?o.message:"操作失败,请重试")}finally{pe.current=!1,K.current&&_(!1)}}},ot=t=>d({selectedId:t.id,mobileDetail:!0}),ee=t=>{P(async()=>{if(T()){if(!Ue().some(o=>o.sessionId===t.sessionId)){if(t.kind==="execute"&&t.todoId){Y(t.handoff?.todoIds??[t.todoId]),D("原会话已关闭,请重新选择会话。");return}throw new Error("收集会话已关闭,可以重新发起收集。")}d({modal:null}),window.dispatchEvent(new CustomEvent("switch-terminal-session",{detail:t.sessionId}))}})},ct=(t,o)=>{const v=i?.todos.find(w=>w.id===t)?.collectorId,b=i?.collectors.find(w=>w.id===v);return b?{...o,cwd:b.config.cwd}:o},Y=t=>{W(),z({kind:"handoff",ids:t})},dt=async(t,o)=>{const v=["handoff",t,o];let b=(await _t({todoIds:t,...o,idempotencyKey:be(v)})).run;for(let w=0;b.status==="launching"&&w<180;w++){if(!T())return;await new Promise($=>window.setTimeout($,500));const U=await Je();if(!T())return;b=U.runs.find($=>$.id===b.id)??b}if(T()){if(b.status==="failed")throw Z(v),new Error(b.error||"发送失败,请检查会话后重试");if(b.status==="launching"||!b.sessionId)throw new Error("仍在确认发送,请稍后重试;同一次请求不会重复发送。");Z(v),je(`handoff:${JSON.stringify(t.slice().sort())}`),as(l,b.sessionId),o.config&&Me(l,o.config),d({modal:null,selecting:!1,checked:[]}),window.dispatchEvent(new CustomEvent("switch-terminal-session",{detail:b.sessionId}))}},te=async t=>{const o=await Promise.allSettled(t.map(w=>Ft(w.id,be(["collect",w.id,w.config]))));if(!T())return;let v=0;const b=[];if(o.forEach((w,U)=>{const $=t[U];w.status==="fulfilled"?(v++,Z(["collect",$.id,$.config])):b.push(`${$.name}:${w.reason instanceof Error?w.reason.message:String(w.reason)}`)}),d({modal:null}),v&&D(`已发起 ${v} 个收集任务`),b.length)throw new Error(b.join(";"))},se=(t,o)=>{P(async()=>{const v=await Ie(t,{status:o});T()&&(o!=="open"&&(u({todo:v.todo,previous:t.status}),r.selectedId===t.id&&d({selectedId:null,mobileDetail:!1})),D(o==="completed"?"已完成":o==="ignored"?"已忽略":"已重新打开"))})},I=i?.todos.find(t=>t.id===r.selectedId),G=I&&i?de(i,I.id):void 0,Pe=t=>c.find(o=>o.sessionId===t.sessionId)?.displayName??$t({name:t.handoff?.sessionName||"",agent:{displayName:t.config.agentSlug||"会话"}}).displayName,ae=i?.todos.filter(t=>Mt(i,t,r.filter)&&(!r.source||t.source===r.source)&&`${t.title} ${t.description} ${t.source}`.toLowerCase().includes(r.query.toLowerCase()))??[],ne=t=>{const o=i&&de(i,t.id);return t.status==="open"&&o?.status!=="launching"},ve=ae.filter(t=>r.checked.includes(t.id)&&ne(t)),le=i?.collectors.filter(t=>t.enabled)??[],we=De(l),re=i?.collectors.slice().sort((t,o)=>o.updatedAt-t.updatedAt).find(t=>m.agents.some(o=>o.slug===t.config.agentSlug))?.config,ie=we.choice&&m.agents.some(t=>t.slug===we.choice?.agentSlug)?we.choice:re?{agentSlug:re.agentSlug,command:re.command,cwd:re.cwd}:void 0,oe=m.agents.find(t=>t.slug===ie?.agentSlug),Ne=ie&&oe&&qt(oe.slug)?{...ie,command:me(oe.slug,oe.command)}:ie,ut=nt(i?.defaults.agentSlug?i.defaults:{...Ve,...Ne},m.agents,m.preferred,m.cwd),Re=Ne?{...Ve,...Ne}:ut,Le=Vt(m.cwd,m.directories??[],i,l),mt=R()?.serviceName||"当前服务",ye=S?.kind==="collector"?i?.collectors.find(t=>t.id===S.id):void 0,Q=S?.kind==="edit"?S.todo:void 0,xt=S?.kind==="edit"?Q?"编辑待办":"新增待办":S?.kind==="handoff"?"交给会话":S?.kind==="collector"?ye?"编辑收集方向":"添加收集方向":"外部接入",ke=r.tab==="todos"&&!M&&r.mobileDetail&&!!I,ft=r.toolsOpen||r.filter!=="open"||!!r.query||!!r.source,pt=r.tab==="todos"&&!ke,Oe=()=>d({tab:"todos",mobileDetail:!1,selecting:!1,checked:[]}),Fe=I?[{label:"编辑待办",action:()=>z({kind:"edit",todo:I})},...G?.sessionId?[{label:"打开终端",action:()=>ee(G)}]:[],...I.status==="open"?[{label:"交给其他会话",action:()=>Y([I.id]),disabled:G?.status==="launching"},{label:"标记完成",action:()=>se(I,"completed")},{label:"忽略这条待办",action:()=>se(I,"ignored"),danger:!0}]:[]]:[],ht=[{label:"搜索和筛选",action:()=>{d({toolsOpen:!0}),window.setTimeout(()=>{T()&&q.current?.querySelector('[aria-label="搜索待办"]')?.focus()},0)}},{label:"多选待办",action:()=>d({selecting:!0,mobileDetail:!1,checked:[]}),disabled:!ae.some(ne)},{label:"已完成",action:()=>d({filter:"completed",mobileDetail:!1,checked:[]})},{label:"已忽略",action:()=>d({filter:"ignored",mobileDetail:!1,checked:[]})},{label:"收集方向",action:()=>d({tab:"collectors",mobileDetail:!1})},{label:"外部接入",action:()=>z({kind:"integration"})}],gt=()=>{i&&(le.length?P(()=>te(le)):i.collectors.length?d({tab:"collectors",mobileDetail:!1}):z({kind:"collector"}))},_e=i?.collectors.filter(t=>{const o=i.runs.filter(v=>v.collectorId===t.id).at(-1);return o&&(o.status==="launching"||o.status==="delivered")}).length??0;return e.jsxs("section",{ref:q,"aria-label":"待办工作区",className:"absolute inset-0 flex min-h-0 min-w-0 flex-col bg-[var(--chrome-bg)] text-foreground",children:[e.jsx("header",{"data-termdock-window-header":"true",className:"relative z-20 flex min-h-16 shrink-0 items-center gap-1 border-b border-border/30 px-3 sm:gap-2 sm:px-5",children:ke?e.jsxs(e.Fragment,{children:[e.jsxs("button",{type:"button",className:k,"aria-label":"返回清单",onClick:Oe,children:[e.jsx(Se,{size:18}),e.jsx("span",{children:"待办"})]}),e.jsx("h1",{className:"sr-only",children:"待办详情"}),e.jsx("div",{className:"flex-1"}),e.jsx(Ae,{label:"待办操作",items:Fe,disabled:C})]}):r.tab==="collectors"?e.jsxs(e.Fragment,{children:[e.jsx("button",{type:"button",className:k,"aria-label":"返回清单",onClick:Oe,children:e.jsx(Se,{size:18})}),e.jsx("h1",{className:"min-w-0 flex-1 text-base font-semibold",children:"收集方向"}),e.jsxs("button",{type:"button",className:k,"aria-label":"添加方向",title:"添加方向",disabled:!i,onClick:()=>z({kind:"collector"}),children:[e.jsx(He,{size:20}),e.jsx("span",{className:"hidden sm:inline",children:"添加方向"})]})]}):r.selecting?e.jsxs(e.Fragment,{children:[e.jsx("button",{type:"button",className:k,onClick:()=>d({selecting:!1,checked:[]}),children:"取消"}),e.jsxs("h1",{className:"min-w-0 flex-1 text-sm",children:["已选 ",ve.length," 项"]}),e.jsx("button",{type:"button",className:H,disabled:C||!ve.length,onClick:()=>Y(ve.map(t=>t.id)),children:"交给会话"})]}):e.jsxs(e.Fragment,{children:[!a&&e.jsx("button",{type:"button",className:`${k} hidden sm:inline-flex`,"aria-label":"打开会话侧栏",onClick:s,children:e.jsx(Pt,{size:18})}),e.jsx("button",{type:"button",className:`${k} px-2`,"aria-label":"返回终端",title:"返回终端",onClick:()=>Be.getState().terminal(),children:e.jsx(Se,{size:18})}),e.jsxs("h1",{className:"min-w-0 flex-1 text-base font-semibold",children:["待办",i&&e.jsx("span",{className:"ml-2 text-xs font-normal tabular-nums text-muted-foreground",children:i.todos.filter(t=>t.status==="open").length})]}),e.jsxs("button",{type:"button",className:`${k} px-2 text-primary`,"aria-label":"收集待办",disabled:!i||C,onClick:gt,children:[e.jsx(Xe,{size:16}),e.jsx("span",{children:"收集"})]}),e.jsx("button",{type:"button",className:`${k} px-2`,"aria-label":"新增待办",title:"新增待办",disabled:!i,onClick:()=>z({kind:"edit"}),children:e.jsx(He,{size:21})}),e.jsx(Ae,{label:"待办菜单",items:ht,disabled:!i||C})]})}),(y||g&&!S)&&e.jsxs("div",{role:"alert",className:"flex shrink-0 items-start gap-3 border-b border-border/30 px-5 py-3 text-sm text-destructive",children:[e.jsx("span",{className:"min-w-0 flex-1 break-words",children:g||y}),y&&e.jsx("button",{type:"button",className:"shrink-0 underline",onClick:()=>{X(!0)},children:"重试"}),e.jsx("button",{type:"button","aria-label":"关闭提示",onClick:()=>{h(""),E("")},children:"×"})]}),J&&e.jsxs("div",{role:"status",className:"fixed bottom-[max(1.5rem,env(safe-area-inset-bottom,0px))] left-1/2 z-toast flex max-w-[calc(100vw-2rem)] -translate-x-1/2 items-center gap-4 rounded-xl border border-border bg-surface-elevated px-4 py-3 text-sm shadow-lg",children:[e.jsx("span",{className:"min-w-0 break-words",children:J}),B&&e.jsx("button",{type:"button",className:"min-h-9 shrink-0 text-primary",onClick:()=>{P(async()=>{await Ie(B.todo,{status:B.previous}),T()&&D("已撤销")})},children:"撤销"})]}),i?r.tab==="collectors"?e.jsxs("div",{className:"min-h-0 flex-1 overflow-y-auto overscroll-contain px-4 py-5 sm:px-6",children:[e.jsxs("div",{className:"mb-5 flex flex-wrap items-center justify-between gap-3",children:[e.jsx("p",{className:"text-sm leading-6 text-muted-foreground",children:"配置一次,之后从清单一键收集。"}),le.length>1&&e.jsx("button",{type:"button",className:F,disabled:C,onClick:()=>{P(()=>te(le))},children:"全部收集"})]}),i.collectors.length?e.jsx("div",{className:`grid items-start gap-4 ${M?"grid-cols-2":""}`,children:i.collectors.map(t=>e.jsx(rs,{collector:t,runs:i.runs.filter(o=>o.collectorId===t.id),busy:C,onRun:()=>{P(()=>te([t]))},onEdit:()=>z({kind:"collector",id:t.id}),onOpen:ee,onRemove:()=>{P(async()=>{await Rt(t)})}},t.id))}):e.jsx($e,{title:"让 Agent 帮你发现下一件事",text:"添加一个收集方向,写下关注的内容和筛选要求。"})]}):e.jsxs("div",{className:"flex min-h-0 flex-1",children:[e.jsxs("div",{className:`${M?"flex w-[42%] shrink-0 border-r border-border/30":pt?"flex flex-1":"hidden"} min-h-0 min-w-0 flex-col`,children:[ft&&e.jsxs("div",{"aria-label":"搜索和筛选",className:"shrink-0 space-y-2 border-b border-border/30 px-4 py-3",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs("div",{className:"relative min-w-0 flex-1",children:[e.jsx(Kt,{size:15,className:"pointer-events-none absolute left-3 top-3.5 text-muted-foreground"}),e.jsx("input",{autoFocus:r.toolsOpen,"aria-label":"搜索待办",className:"min-h-11 w-full min-w-0 rounded-lg bg-surface-2 py-2 pl-9 pr-3 text-base outline-none focus:ring-1 focus:ring-primary sm:text-sm",placeholder:"搜索待办",value:r.query,onChange:t=>d({query:t.target.value})})]}),e.jsx("button",{type:"button",className:k,"aria-label":"清除筛选",onClick:()=>d({query:"",source:"",filter:"open",toolsOpen:!1,checked:[]}),children:e.jsx(Ye,{size:17})})]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsxs("select",{"aria-label":"待办状态",className:"min-h-11 min-w-0 flex-1 rounded-lg bg-surface-2 px-3 text-base sm:text-sm",value:r.filter,onChange:t=>d({filter:t.target.value,checked:[]}),children:[e.jsx("option",{value:"open",children:"未完成"}),e.jsx("option",{value:"completed",children:"已完成"}),e.jsx("option",{value:"ignored",children:"已忽略"})]}),e.jsxs("select",{"aria-label":"按来源筛选",className:"min-h-11 min-w-0 flex-1 rounded-lg bg-surface-2 px-3 text-base sm:text-sm",value:r.source,onChange:t=>d({source:t.target.value,checked:[]}),children:[e.jsx("option",{value:"",children:"全部来源"}),[...new Set(i.todos.map(t=>t.source))].map(t=>e.jsx("option",{children:t},t))]})]})]}),!!_e&&e.jsxs("button",{type:"button",className:"flex min-h-11 shrink-0 items-center justify-between gap-3 px-5 text-left text-xs text-muted-foreground hover:bg-surface",onClick:()=>d({tab:"collectors"}),children:[e.jsxs("span",{children:["已发起 ",_e," 个收集任务"]}),e.jsx("span",{className:"text-primary",children:"查看"})]}),e.jsx("div",{className:"min-h-0 flex-1 overflow-y-auto overscroll-contain px-3 pb-6 pt-2 sm:px-4",children:ae.length?ae.map(t=>{const o=de(i,t.id),v=!!o?.sessionId&&o.status!=="failed",b=v?"去会话":o?.status==="launching"?"发送中…":"交给会话",w=[o?.status==="failed"?"发送未完成":o?.status==="launching"?"正在发送":o?.sessionId?`已交给 ${Pe(o)}`:"",t.source==="手动添加"?"":t.source].filter(Boolean).join(" · ");return e.jsxs("article",{className:`flex items-start gap-1 border-b border-border/30 px-1 py-4 ${r.selectedId===t.id&&M?"bg-surface":"hover:bg-surface"}`,children:[r.selecting?e.jsx("label",{className:"flex min-h-11 w-10 shrink-0 items-center justify-center",children:e.jsx("input",{type:"checkbox","aria-label":`选择 ${t.title}`,checked:ne(t)&&r.checked.includes(t.id),disabled:!ne(t),onChange:U=>d({checked:U.target.checked?[...r.checked,t.id]:r.checked.filter($=>$!==t.id)}),className:"h-4 w-4 accent-[var(--primary)]"})}):e.jsx("button",{type:"button",className:"flex min-h-11 w-10 shrink-0 items-center justify-center text-muted-foreground hover:text-primary",disabled:C||t.status==="ignored","aria-label":`${t.status==="completed"?"重新打开":"完成"} ${t.title}`,onClick:()=>se(t,t.status==="completed"?"open":"completed"),children:t.status==="completed"?e.jsx(It,{size:19,className:"text-primary"}):e.jsx(Ht,{size:19})}),e.jsxs("button",{type:"button",className:"min-w-0 flex-1 py-2 text-left",onClick:()=>ot(t),children:[e.jsx("span",{className:`block break-words text-[15px] font-medium leading-6 ${t.status==="completed"?"text-muted-foreground line-through":""}`,children:t.title}),e.jsx("span",{className:"mt-1.5 block truncate text-xs leading-5 text-muted-foreground",children:t.status==="completed"?"已完成":t.status==="ignored"?"已忽略":w})]}),t.status==="open"&&!r.selecting&&e.jsx("button",{type:"button",className:"mt-1 inline-flex min-h-11 shrink-0 items-center gap-1 rounded-lg px-2 text-xs font-medium text-primary hover:bg-surface-2 disabled:opacity-40",disabled:C||o?.status==="launching"&&!o.sessionId,"aria-label":`${v?"去会话":"交给会话"} ${t.title}`,onClick:()=>v?ee(o):Y([t.id]),children:e.jsx("span",{children:b})})]},t.id)}):e.jsx($e,{title:r.query||r.source?"没有匹配的待办":r.filter==="completed"?"还没有已完成的待办":r.filter==="review"?"暂时没有待确认的结果":r.filter==="ignored"?"没有已忽略的待办":i.todos.length?"清单已清空":"还没有待办",text:r.query||r.source?"换个关键词,或清除筛选。":r.filter==="open"?"点 + 记下一件事,或让 Agent 帮你收集。":"清除筛选可回到当前待办。"})})]}),(M||ke)&&e.jsx("div",{className:"flex min-h-0 min-w-0 flex-1 flex-col",children:I?e.jsx(ss,{todo:I,sessionName:G?Pe(G):void 0,runs:i.runs.filter(t=>t.todoId===I.id||t.handoff?.todoIds.includes(I.id)),busy:C,wide:M,menu:Fe,onLaunch:()=>Y([I.id]),onOpen:ee,onStatus:t=>se(I,t)},I.id):e.jsx($e,{title:"从清单开始",text:"选择一条待办,查看内容或处理结果。"})})]}):e.jsx("div",{className:"flex flex-1 items-center justify-center text-sm text-muted-foreground",children:y?"加载失败,请重试":"正在加载待办…"}),S&&e.jsxs(Wt,{compact:S.kind==="handoff",title:xt,busy:C,error:g,onClose:()=>z(null),children:[S.kind==="edit"&&e.jsx(Yt,{workspace:l,todo:Q,busy:C,onCancel:()=>z(null),onSave:(t,o)=>{P(async()=>{const v=Q?await Ie(Q,t):await Lt({...t,idempotencyKey:be(["create",t])});T()&&(Z(["create",t]),je(`todo:${Q?.id??"new"}`),d({tab:"todos",filter:"open",source:"",query:"",selectedId:v.todo.id,mobileDetail:!1,modal:o?{kind:"handoff",ids:[v.todo.id]}:null}),o||D("待办已保存。"))})}}),S.kind==="handoff"&&(f?e.jsx("div",{className:"p-5 text-sm text-muted-foreground",children:"正在读取会话…"}):e.jsx(ls,{workspace:l,ids:S.ids,config:ct(S.ids[0],Re),agents:m.agents,sessions:c,currentSessionId:n,directories:Le,busy:C,loading:f,title:i?.todos.find(t=>t.id===S.ids[0])?.title??"",onCancel:()=>z(null),onSend:t=>{P(()=>dt(S.ids,t))}})),S.kind==="collector"&&e.jsx(Xt,{workspace:l,collector:ye,config:Re,agents:m.agents,loading:f,service:mt,directories:Le,currentCwd:m.cwd,busy:C,onCancel:()=>z(null),onSave:(t,o)=>{P(async()=>{const v=await Ot(t);T()&&(Me(l,t.config),je(`collector:${ye?.id??"new"}`),d({tab:o&&r.tab!=="collectors"?"todos":"collectors",modal:null}),o?await te([v.collector]):D("收集方向已保存,可以随时开始。"))})}}),S.kind==="integration"&&e.jsx(Zt,{})]})]})}function $e({title:s,text:a}){return e.jsxs("div",{className:"mx-auto flex max-w-sm flex-col items-center px-6 py-12 text-center",children:[e.jsx(Bt,{size:30,strokeWidth:1.2,className:"mb-4 text-muted-foreground/50"}),e.jsx("h2",{className:"text-base font-medium",children:s}),e.jsx("p",{className:"mt-2 text-sm leading-7 text-muted-foreground",children:a})]})}function rs({collector:s,runs:a,busy:n,onRun:c,onEdit:l,onRemove:r,onOpen:d}){const[i,p]=j.useState(!1),m=a.at(-1);return e.jsxs("article",{className:"rounded-xl border border-border/30 bg-surface p-4 sm:p-5",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("h2",{className:"min-w-0 flex-1 break-words text-base font-semibold",children:s.name}),e.jsx("button",{type:"button",className:k,"aria-label":`编辑 ${s.name}`,disabled:n,onClick:l,children:e.jsx(At,{size:16})}),e.jsx("button",{type:"button",className:k,"aria-label":`移除 ${s.name}`,disabled:n,onClick:()=>p(!0),children:e.jsx(Et,{size:16})})]}),e.jsxs("p",{className:"mt-1 text-xs leading-6 text-muted-foreground",children:[s.config.agentSlug," · ",s.enabled?s.schedule?s.schedule.kind==="interval"?`每 ${s.schedule.everyMinutes} 分钟`:`每天 ${s.schedule.time}`:"手动运行":"已停用"]}),e.jsx("p",{className:"my-3 line-clamp-3 whitespace-pre-wrap text-sm leading-7 text-muted-foreground",children:s.config.prompt}),i?e.jsxs("div",{className:"rounded-lg bg-surface-2 p-3",children:[e.jsx("p",{className:"text-sm leading-6",children:"移除此方向?已有待办、终端和结果会保留。"}),e.jsxs("div",{className:"mt-2 flex justify-end gap-2",children:[e.jsx("button",{type:"button",className:k,onClick:()=>p(!1),children:"取消"}),e.jsx("button",{type:"button",className:`${F} text-destructive`,disabled:n,onClick:r,children:"确认移除"})]})]}):e.jsx("div",{className:"flex flex-wrap gap-2",children:e.jsxs("button",{type:"button",className:H,disabled:n||m?.status==="launching",onClick:c,children:[e.jsx(Xe,{size:16}),m?"再次收集":"开始收集"]})}),m&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"mt-4 flex items-center gap-2 text-xs leading-6 text-muted-foreground",children:[e.jsx("span",{className:"flex-1",children:m.status==="complete"?"已收到收集结果":lt[m.status]}),m.sessionId&&m.status!=="complete"&&e.jsx("button",{type:"button",className:k,disabled:n,onClick:()=>d(m),children:"打开终端"})]}),e.jsxs("details",{className:"mt-2 text-sm text-muted-foreground",children:[e.jsxs("summary",{className:"min-h-11 cursor-pointer py-2.5",children:["收集记录 · ",a.length," 次"]}),e.jsx("div",{className:"space-y-3 pt-2",children:a.slice().reverse().map(N=>e.jsx(ts,{run:N,onOpen:()=>d(N),busy:n},N.id))})]})]})]})}export{Ds as default};
|
|
1
|
+
import{a$ as jt,aW as vt,eB as We,cr as e,a8 as Ye,u as Ge,$ as Qe,p as wt,e as Nt,C as yt,eG as kt,dE as L,bp as Ct,bS as St,bN as Ue,T as Ke,S as Ce,c as Se,O as Be,Y as Xe,k as It,bQ as $t,J as Et,a2 as At}from"./app-CG7UnlvD.js";import{b as j,r as Dt}from"./dnd-BCFAPC0L.js";import{g as me,A as Ze,l as He,r as Tt,j as zt,e as qt,P as Pt,k as Je,u as Ie,i as Lt,d as Rt,s as Ot,b as _t,h as Ft}from"./App-Bb2gVHKa.js";import{D as et}from"./RecordingSaveDialog-SqE6T39W.js";import{d as Ut}from"./GitLoadingSkeleton-D5nkNhPE.js";import{S as tt}from"./AndroidMirrorView-DvaQ4bWE.js";import{S as Kt}from"./search-g7nZaX-p.js";import{C as Bt}from"./circle-BbMJmnZN.js";import"./react-XDCjal2T.js";import"./terminal-DaiFCKy_.js";import"./link-DP9WqPQf.js";import"./clipboardText-CQBpBKPz.js";import"./swiper-Bge5b7oc.js";import"./clipboard-Bc3Y4SV-.js";import"./v4-EwEgHOG0.js";import"./triangle-alert-DUjdvUeM.js";import"./external-link-CUbXNBYc.js";import"./maximize-2-Duk9ucVy.js";import"./git-compare-TvhljhDy.js";import"./use-gesture-react.esm-uKjWuDRY.js";import"./arrow-down-C3OQpvij.js";import"./sun-Docz24Gq.js";import"./unplug-wUkIQYu0.js";import"./gestureArbiter-DszagC-d.js";const Ht=[["polyline",{points:"22 12 16 12 14 15 10 15 8 12 2 12",key:"o97t9d"}],["path",{d:"M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z",key:"oot6mr"}]],Jt=jt("inbox",Ht),V={tab:"todos",filter:"open",source:"",query:"",selectedId:null,mobileDetail:!1,selecting:!1,checked:[],toolsOpen:!1,modal:null,drafts:{},requests:{}},E=vt((s,a)=>({views:{},snapshots:{},options:{},cache:(n,c)=>s(l=>({snapshots:{...l.snapshots,[n]:c}})),cacheOptions:(n,c)=>s(l=>({options:{...l.options,[n]:c}})),patch:(n,c)=>s(l=>({views:{...l.views,[n]:{...l.views[n]??V,...c}}})),draft:(n,c,l)=>{const r=a().views[n]??V;a().patch(n,{drafts:{...r.drafts,[c]:l}})},clearDraft:(n,c)=>{const l={...(a().views[n]??V).drafts};delete l[c],a().patch(n,{drafts:l})},requestKey:(n,c)=>{const l=JSON.stringify(c),r=a().views[n]??V;if(r.requests[l])return r.requests[l];const d=crypto.randomUUID();return a().patch(n,{requests:{...r.requests,[l]:d}}),d},finishRequest:(n,c)=>{const l={...(a().views[n]??V).requests};delete l[JSON.stringify(c)],a().patch(n,{requests:l})}}));function Ae(s,a,n){return[E(l=>l.views[s]?.drafts[a])??n,l=>E.getState().draft(s,a,l)]}function de(s,a){return s.runs.filter(n=>n.todoId===a||n.handoff?.todoIds.includes(a)).at(-1)}function Mt(s,a,n){return n==="review"?a.status==="open"&&de(s,a.id)?.status==="complete":a.status===(n==="completed"?"completed":n==="ignored"?"ignored":"open")}const st=s=>`termdock:todo-preferences:v1:${s}`,ue=s=>s.replace(/\/+$/,"").split("/").pop()||s;function xe(s){return[...new Set(s.filter(a=>typeof a=="string"&&!!a.trim()).map(a=>a.trim().replace(/\/+$/,"")||"/"))]}function De(s){try{const a=JSON.parse(localStorage.getItem(st(s))||"{}"),n=a?.choice;return{choice:n&&["agentSlug","command","cwd"].every(c=>typeof n[c]=="string")?n:void 0,directories:xe(Array.isArray(a?.directories)?a.directories:[]).slice(0,8)}}catch{return{directories:[]}}}function Me(s,a){try{const n=De(s);localStorage.setItem(st(s),JSON.stringify({choice:{agentSlug:a.agentSlug,command:a.command,cwd:a.cwd},directories:xe([a.cwd,...n.directories]).slice(0,8)}))}catch{}}function Vt(s,a,n,c){return xe([s,...De(c).directories,n?.defaults.cwd,...n?.runs.slice().reverse().map(l=>l.config.cwd)??[],...a,...n?.collectors.map(l=>l.config.cwd)??[]]).slice(0,8)}const Te="inline-flex min-h-11 items-center justify-center gap-2 rounded-lg px-3 text-sm font-medium transition disabled:cursor-not-allowed disabled:opacity-40",B=`${Te} bg-primary text-primary-foreground hover:opacity-90`,_=`${Te} bg-surface-2 text-foreground hover:bg-surface-elevated`,k=`${Te} text-muted-foreground hover:bg-surface-2 hover:text-foreground`,R="w-full min-h-11 min-w-0 rounded-lg border border-border/40 bg-surface-2 px-3 py-2.5 text-base text-foreground outline-none focus:border-primary sm:text-sm",O="block space-y-2 text-sm text-muted-foreground";function Wt({title:s,busy:a,error:n,onClose:c,children:l,compact:r=!1}){const d=j.useRef(null),i=j.useId();return We(d,!0,()=>{a||c()}),Dt.createPortal(e.jsxs(e.Fragment,{children:[e.jsx("button",{className:"fixed inset-0 z-drawer-backdrop bg-[var(--app-backdrop)] backdrop-blur-sm","aria-label":"关闭待办面板",disabled:a,onClick:c}),e.jsxs("section",{ref:d,role:"dialog","aria-modal":"true","aria-labelledby":i,"aria-busy":a,tabIndex:-1,className:r?"fixed bottom-[max(0.75rem,env(safe-area-inset-bottom,0px))] left-3 right-3 z-drawer-panel flex max-h-[calc(100svh-2rem)] min-w-0 flex-col overflow-hidden rounded-2xl border border-border/30 bg-surface text-foreground shadow-xl sm:bottom-auto sm:left-1/2 sm:right-auto sm:top-1/2 sm:w-[28rem] sm:max-w-[90vw] sm:-translate-x-1/2 sm:-translate-y-1/2":"fixed inset-y-0 right-0 z-drawer-panel flex w-full min-w-0 flex-col border-l border-border/30 bg-surface pt-[env(safe-area-inset-top,0px)] text-foreground shadow-xl sm:w-[32rem] sm:max-w-[90vw]",children:[e.jsxs("header",{className:"flex min-h-16 shrink-0 items-center gap-3 border-b border-border/20 px-5",children:[e.jsx("h2",{id:i,className:"flex-1 text-base font-semibold",children:s}),e.jsx("button",{type:"button",className:k,"aria-label":"关闭",disabled:a,onClick:c,children:e.jsx(Ye,{size:18})})]}),n&&e.jsx("p",{role:"alert",className:"shrink-0 border-b border-[color-mix(in_srgb,var(--destructive)_20%,transparent)] bg-[color-mix(in_srgb,var(--destructive)_10%,transparent)] px-5 py-3 text-sm leading-6 text-destructive",children:n}),e.jsx("div",{className:"flex min-h-0 flex-1 flex-col",children:l})]})]}),document.body)}function ze({children:s}){return e.jsx("div",{className:"min-h-0 flex-1 space-y-5 overflow-y-auto overscroll-contain px-5 py-5",children:s})}function at({children:s}){return e.jsx("footer",{className:"flex shrink-0 flex-wrap items-center justify-end gap-2 border-t border-border/20 px-5 py-4 pb-[max(1rem,env(safe-area-inset-bottom,0px))]",children:s})}function Yt({workspace:s,todo:a,busy:n,onSave:c,onCancel:l}){const[r,d]=Ae(s,`todo:${a?.id??"new"}`,{title:a?.title??"",description:a?.description??""}),i=p=>{!n&&r.title.trim()&&c({...r,title:r.title.trim()},p)};return e.jsxs("form",{className:"flex min-h-0 flex-1 flex-col",onSubmit:p=>{p.preventDefault(),i(!a)},children:[e.jsxs(ze,{children:[e.jsxs("label",{className:O,children:["要做什么",e.jsx("input",{autoFocus:!0,required:!0,maxLength:200,className:R,value:r.title,onChange:p=>d({...r,title:p.target.value}),placeholder:"一句话描述这件事"})]}),e.jsxs("label",{className:O,children:["背景和处理要求",e.jsx("textarea",{className:`${R} min-h-44 resize-y`,maxLength:4e4,value:r.description,onChange:p=>d({...r,description:p.target.value}),placeholder:"为什么要做、参考资料、希望得到什么结果…"})]}),!a&&e.jsx("p",{className:"text-xs leading-6 text-muted-foreground",children:"可以先存进清单,也可以选一个会话交出去。"})]}),e.jsxs(at,{children:[e.jsx("button",{type:"button",className:k,disabled:n,onClick:l,children:"取消"}),!a&&e.jsx("button",{type:"button",className:_,disabled:n||!r.title.trim(),onClick:()=>i(!1),children:"仅保存"}),e.jsx("button",{className:B,disabled:n||!r.title.trim(),children:n?"正在保存…":a?"保存修改":"保存并交给会话"})]})]})}function nt(s,a,n,c){const l=a.find(r=>r.slug===(s.agentSlug||n))??(s.agentSlug?void 0:a[0]);return{...s,agentSlug:s.agentSlug||l?.slug||"",command:s.command||(l?me(l.slug,l.command):""),cwd:s.cwd||c||""}}function Gt({config:s,agents:a,loading:n,service:c,directories:l,currentCwd:r,onChange:d,collect:i=!1}){const[p,m]=j.useState(!1),N=j.useId(),f=j.useId();return e.jsxs(e.Fragment,{children:[e.jsxs("p",{className:"text-xs text-muted-foreground",children:["运行于 ",c]}),e.jsxs("div",{className:O,children:[e.jsx("label",{htmlFor:N,children:"Agent"}),e.jsxs("select",{id:N,className:R,required:!0,disabled:n,value:s.agentSlug,onChange:x=>{const y=a.find(A=>A.slug===x.target.value);d({...s,agentSlug:x.target.value,command:y?me(y.slug,y.command):""})},children:[e.jsx("option",{value:"",disabled:a.length>0,children:n?"正在加载 Agent…":"选择 Agent"}),a.map(x=>e.jsx("option",{value:x.slug,children:x.displayName},x.slug)),s.agentSlug&&!a.some(x=>x.slug===s.agentSlug)&&e.jsxs("option",{value:s.agentSlug,children:[s.agentSlug,"(当前不可用)"]})]})]}),a.find(x=>x.slug===s.agentSlug)&&e.jsx(Ze,{agent:a.find(x=>x.slug===s.agentSlug),value:s.command,onChange:x=>d({...s,command:x})},s.agentSlug),!n&&a.length===0&&e.jsx("p",{className:"text-sm text-destructive",children:"未找到可启动的 Agent,请检查该服务的 Agent 配置。"}),e.jsxs("div",{className:O,children:[e.jsx("label",{htmlFor:f,children:"工作目录"}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx("input",{id:f,className:R,value:s.cwd,autoCapitalize:"none",autoCorrect:"off",spellCheck:!1,onChange:x=>d({...s,cwd:x.target.value}),placeholder:"选择这件事所在的项目或目录"}),e.jsx("button",{type:"button",className:_,"aria-label":"选择工作目录",onClick:()=>m(!0),children:e.jsx(Ge,{size:17})})]}),!!l.length&&e.jsx("div",{className:"flex gap-1.5 overflow-x-auto pb-1","aria-label":"快捷选择工作目录",children:l.map(x=>{const y=ue(x),g=l.some(h=>h!==x&&ue(h)===y)?x.split("/").filter(Boolean).slice(-2).join("/"):y;return e.jsx("button",{type:"button","aria-label":`使用目录 ${x}`,"aria-pressed":s.cwd===x,title:x,className:`min-h-10 max-w-48 shrink-0 truncate rounded-lg border px-2.5 text-xs ${s.cwd===x?"border-[rgb(var(--primary-rgb)/0.3)] bg-[rgb(var(--primary-rgb)/0.1)] text-primary":"border-transparent bg-surface-2 text-muted-foreground hover:text-foreground"}`,onClick:()=>d({...s,cwd:x}),children:x===r?`当前 · ${g}`:g},x)})})]}),e.jsxs("label",{className:O,children:[i?"收集要求":"处理要求",e.jsx("textarea",{required:i,className:`${R} min-h-32 resize-y`,maxLength:2e4,value:s.prompt,onChange:x=>d({...s,prompt:x.target.value}),placeholder:i?"从哪里收集、筛选哪些事项、需要哪些背景与来源…":"补充 Agent 应该遵守的要求,可留空"})]}),e.jsx(et,{open:p,initialPath:s.cwd||"/",title:"选择工作目录",labels:{hint:"选择 Agent 运行的目录",cancel:"取消",confirm:"使用此目录",close:"关闭",parent:"上级目录"},onCancel:()=>m(!1),onConfirm:x=>{d({...s,cwd:x}),m(!1)}})]})}const Qt=[{name:"项目巡检",prompt:"检查工作目录中的项目,找出值得处理的问题。每条待办写清问题、依据和建议,避免重复。只收集待办,不修改项目。"},{name:"技术动态",prompt:"收集我关注方向的技术动态,筛选值得进一步调研或尝试的事项。每条待办附来源和后续建议,避免重复。"}];function Xt({workspace:s,collector:a,config:n,agents:c,loading:l,service:r,directories:d,currentCwd:i,busy:p,onSave:m,onCancel:N}){const[f,x]=Ae(s,`collector:${a?.id??"new"}`,{name:a?.name??"",config:a?.config??{...n,prompt:""},enabled:a?.enabled??!0,schedule:a?.schedule?.kind??"manual",minutes:a?.schedule?.kind==="interval"?a.schedule.everyMinutes:60,daily:a?.schedule?.kind==="daily"?a.schedule.time:"09:00"}),y=f.config.agentSlug?f.config:{...nt(f.config,c,n.agentSlug,n.cwd),prompt:f.config.prompt},A=f.name.trim()&&y.prompt.trim()&&!l&&c.some(h=>h.slug===y.agentSlug),g=h=>{p||!A||m({id:a?.id,revision:a?.revision,name:f.name.trim(),config:y,enabled:f.enabled,schedule:f.schedule==="manual"?null:f.schedule==="interval"?{kind:"interval",everyMinutes:f.minutes}:{kind:"daily",time:f.daily,weekdays:a?.schedule?.kind==="daily"?a.schedule.weekdays:[0,1,2,3,4,5,6]}},h)};return e.jsxs("form",{className:"flex min-h-0 flex-1 flex-col",onSubmit:h=>{h.preventDefault(),g(!0)},children:[e.jsx(ze,{children:e.jsxs("fieldset",{disabled:p,className:"min-w-0 space-y-5",children:[!a&&e.jsx("div",{className:"flex flex-wrap gap-2",children:Qt.map(h=>e.jsx("button",{type:"button",className:_,onClick:()=>x({...f,name:h.name,config:{...f.config,prompt:h.prompt}}),children:h.name},h.name))}),e.jsxs("label",{className:O,children:["收集方向",e.jsx("input",{required:!0,className:R,maxLength:200,value:f.name,onChange:h=>x({...f,name:h.target.value}),placeholder:"例如:项目巡检、技术动态"})]}),e.jsx(Gt,{collect:!0,config:y,agents:c,loading:l,service:r,directories:d,currentCwd:i,onChange:h=>x({...f,config:h})}),e.jsxs("details",{className:"rounded-lg border border-border/20 px-3 text-sm text-muted-foreground",children:[e.jsxs("summary",{className:"cursor-pointer py-3",children:["定时与启用 · ",f.schedule==="manual"?"手动运行":f.schedule==="interval"?`每 ${f.minutes} 分钟`:`每天 ${f.daily}`]}),e.jsxs("div",{className:"space-y-4 pb-3",children:[e.jsxs("label",{className:O,children:["运行频率",e.jsxs("select",{className:R,value:f.schedule,onChange:h=>x({...f,schedule:h.target.value}),children:[e.jsx("option",{value:"manual",children:"手动运行"}),e.jsx("option",{value:"interval",children:"按间隔运行"}),e.jsx("option",{value:"daily",children:"每天定时"})]})]}),f.schedule==="interval"&&e.jsxs("label",{className:O,children:["间隔(分钟)",e.jsx("input",{className:R,required:!0,type:"number",min:1,max:43200,step:1,value:f.minutes,onChange:h=>x({...f,minutes:Number(h.target.value)})})]}),f.schedule==="daily"&&e.jsxs("label",{className:O,children:["时间(服务所在时区)",e.jsx("input",{className:R,required:!0,type:"time",value:f.daily,onChange:h=>x({...f,daily:h.target.value})})]}),e.jsxs("label",{className:"flex items-center gap-3 text-sm",children:[e.jsx("input",{type:"checkbox",checked:f.enabled,onChange:h=>x({...f,enabled:h.target.checked})}),"启用此方向,参与全部收集和定时运行"]})]})]})]})}),e.jsxs(at,{children:[e.jsx("button",{type:"button",className:k,disabled:p,onClick:N,children:"取消"}),e.jsx("button",{type:"button",className:_,disabled:p||!A,onClick:()=>g(!1),children:"仅保存"}),e.jsxs("button",{className:B,disabled:p||!A,children:[e.jsx(Ut,{size:16}),p?"正在保存…":"保存并收集"]})]})]})}function Zt(){const[s,a]=j.useState(!1),n='td todo add --title "检查项目依赖" --description "核实升级影响" --source "项目巡检" --external-id "deps-review"';return e.jsxs(ze,{children:[e.jsx("p",{className:"text-sm leading-7 text-muted-foreground",children:"外部程序或 Agent 可以在服务所在机器,通过 CLI 写入待办。相同来源与外部标识会去重。"}),e.jsx("pre",{className:"overflow-x-auto rounded-lg bg-surface-2 p-4 text-xs leading-6",children:e.jsx("code",{children:n})}),e.jsx("button",{className:_,onClick:()=>{navigator.clipboard.writeText(n).then(()=>a(!0)).catch(()=>a(!1))},children:s?"已复制":"复制命令"}),e.jsxs("p",{className:"text-xs leading-6 text-muted-foreground",children:["完整用法:",e.jsx("code",{children:"td todo --help"}),"。API:",e.jsx("code",{className:"break-all",children:"POST /api/terminal/operations/todos"}),",沿用当前服务的鉴权和加密连接。"]})]})}const es=s=>{const a=new Date(s),n=new Date,c=a.toDateString()===n.toDateString();return new Intl.DateTimeFormat("zh-CN",{...c?{}:{month:"short",day:"numeric",...a.getFullYear()===n.getFullYear()?{}:{year:"numeric"}},hour:"2-digit",minute:"2-digit",hour12:!1}).format(a)},lt={launching:"正在准备终端",delivered:"任务已发送到终端",complete:"已收到结果,待你确认",blocked:"Agent 需要你协助",failed:"启动或处理失败"};function ts({run:s,onOpen:a,busy:n}){return e.jsxs("article",{className:"rounded-xl border border-border/30 bg-surface p-4",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx("span",{className:`min-w-0 flex-1 text-sm font-medium ${s.status==="complete"?"text-primary":s.status==="failed"||s.status==="blocked"?"text-destructive":""}`,children:s.status==="complete"?"已收到结果报告":lt[s.status]}),s.sessionId&&e.jsxs("button",{type:"button",className:_,disabled:n,onClick:a,children:[e.jsx(Qe,{size:15}),"打开终端"]})]}),e.jsxs("p",{className:"mt-1 text-xs leading-6 text-muted-foreground",children:[s.config.agentSlug," · ",es(s.createdAt)]}),s.status==="delivered"&&!s.result&&e.jsx("p",{className:"mt-2 text-xs leading-6 text-muted-foreground",children:"打开终端查看输出,或处理 Agent 的登录与授权。明确结果报告会显示在这里。"}),s.error&&e.jsx("p",{className:"mt-3 whitespace-pre-wrap break-words text-sm leading-7 text-destructive",children:s.error}),s.result&&e.jsx("div",{className:"termdock-native-select mt-3 whitespace-pre-wrap break-words border-t border-border/20 pt-3 text-sm leading-7",children:s.result})]})}function Ee({label:s="更多操作",items:a,disabled:n}){const[c,l]=j.useState(!1),r=j.useRef(null),d=j.useRef(null),i=j.useId();return We(d,c,()=>l(!1)),j.useEffect(()=>{if(!c)return;const p=m=>{m.target instanceof Node&&!r.current?.contains(m.target)&&l(!1)};return document.addEventListener("pointerdown",p,!0),()=>document.removeEventListener("pointerdown",p,!0)},[c]),e.jsxs("div",{ref:r,className:"relative z-20 shrink-0",children:[e.jsx("button",{type:"button","aria-label":s,title:s,"aria-haspopup":"menu","aria-expanded":c,"aria-controls":c?i:void 0,disabled:n,className:"inline-flex min-h-11 w-11 items-center justify-center rounded-lg text-muted-foreground transition hover:bg-surface-2 hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:opacity-40",onClick:()=>l(p=>!p),children:e.jsx(wt,{size:20})}),c&&e.jsx("div",{ref:d,id:i,role:"menu","aria-label":s,tabIndex:-1,className:"absolute right-0 top-full z-30 mt-1 w-56 max-w-[calc(100vw-2rem)] rounded-xl border border-border/50 bg-surface p-1.5 shadow-xl",onKeyDown:p=>{if(!["ArrowDown","ArrowUp","Home","End"].includes(p.key))return;p.preventDefault();const m=Array.from(d.current?.querySelectorAll('[role="menuitem"]:not(:disabled)')??[]),N=m.indexOf(document.activeElement);m[p.key==="Home"?0:p.key==="End"?m.length-1:(N+(p.key==="ArrowDown"?1:-1)+m.length)%m.length]?.focus()},children:a.map(p=>e.jsx("button",{type:"button",role:"menuitem",disabled:p.disabled,className:`flex min-h-11 w-full items-center rounded-lg px-3 text-left text-sm outline-none transition hover:bg-surface-2 focus:bg-surface-2 disabled:opacity-40 ${p.danger?"text-destructive":"text-foreground"}`,onClick:()=>{l(!1),p.action()},children:p.label},p.label))})]})}function ss({todo:s,runs:a,busy:n,wide:c,menu:l,onLaunch:r,onOpen:d,onStatus:i,sessionName:p}){const m=a.at(-1),N=!!m?.sessionId&&m.status!=="failed";return e.jsxs("section",{"aria-label":"待办详情",className:"flex min-h-0 min-w-0 flex-1 flex-col",children:[e.jsxs("div",{className:"min-h-0 flex-1 overflow-y-auto overscroll-contain px-5 pb-8 pt-6 sm:px-8",children:[e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsx("h2",{className:"min-w-0 flex-1 break-words text-xl font-semibold leading-8",children:s.title}),c&&e.jsx(Ee,{label:"待办操作",items:l,disabled:n})]}),e.jsxs("p",{className:"mt-2 text-xs leading-6 text-muted-foreground",children:[s.source,m?.status==="launching"?" · 正在发送":N?` · 已交给 ${p||"会话"}`:""]}),s.description&&e.jsx("p",{className:"termdock-native-select mt-5 whitespace-pre-wrap break-words text-[15px] leading-8",children:s.description}),m?.handoff?.note&&e.jsxs("div",{className:"mt-6 text-sm leading-7",children:[e.jsx("p",{className:"text-xs text-muted-foreground",children:"发送时的补充"}),e.jsx("p",{className:"mt-1 whitespace-pre-wrap break-words",children:m.handoff.note})]}),m?.error&&e.jsx("p",{role:"alert",className:"mt-5 break-words text-sm leading-7 text-destructive",children:m.error}),s.sourceUrl&&e.jsxs("a",{className:"mt-4 inline-flex min-h-11 items-center gap-1 text-sm text-primary",href:s.sourceUrl,target:"_blank",rel:"noreferrer",children:["查看来源",e.jsx(Nt,{size:14})]}),a.some(f=>f.result)&&e.jsxs("details",{className:"mt-8 border-t border-border/30 pt-3 text-sm text-muted-foreground",children:[e.jsx("summary",{className:"min-h-11 cursor-pointer py-2.5",children:"此前的处理记录"}),a.filter(f=>f.result).slice().reverse().map(f=>e.jsx("p",{className:"mt-3 whitespace-pre-wrap break-words leading-7",children:f.result},f.id))]})]}),e.jsx("footer",{className:"flex shrink-0 flex-wrap items-center gap-2 border-t border-border/30 bg-[var(--chrome-bg)] px-5 py-3 pb-[max(0.75rem,env(safe-area-inset-bottom,0px))] sm:px-8",children:s.status==="open"?e.jsxs(e.Fragment,{children:[e.jsxs("button",{type:"button",className:`${B} flex-1 sm:flex-none`,disabled:n||m?.status==="launching",onClick:()=>N?d(m):r(),children:[N?e.jsx(Qe,{size:16}):e.jsx(tt,{size:16}),N?"去会话":m?.status==="launching"?"正在发送…":"交给会话"]}),N&&e.jsx("button",{type:"button",className:k,disabled:n,onClick:r,children:"再次交给"}),e.jsxs("button",{type:"button",className:k,disabled:n,onClick:()=>i("completed"),children:[e.jsx(yt,{size:16}),"完成"]})]}):e.jsx("button",{type:"button",className:B,disabled:n,onClick:()=>i("open"),children:"重新打开"})})]})}const ce="min-h-11 w-full min-w-0 rounded-lg border border-border/40 bg-surface-2 px-3 py-2.5 text-base text-foreground outline-none focus:border-primary sm:text-sm",rt=s=>`termdock:todo-recipient:v1:${s}`;function as(s,a){try{localStorage.setItem(rt(s),a)}catch{}}function ns(s){try{return localStorage.getItem(rt(s))}catch{return null}}function ls({workspace:s,ids:a,config:n,agents:c,sessions:l,currentSessionId:r,directories:d,busy:i,loading:p,title:m,onSend:N,onCancel:f}){const x=l.filter(u=>u.agent?.slug).sort((u,q)=>+(q.sessionId===r)-+(u.sessionId===r)||q.lastActivity-u.lastActivity),y=ns(s),A=x.find(u=>u.sessionId===r)?.sessionId??x.find(u=>u.sessionId===y)?.sessionId??x[0]?.sessionId??"__new__",[g,h]=Ae(s,`handoff:${JSON.stringify(a.slice().sort())}`,{target:A,note:"",config:{...n,prompt:""}}),[H,D]=j.useState(!1),C=g.target==="__new__",F=c.find(u=>u.slug===g.config.agentSlug),J=!p&&(C?!!F:x.some(u=>u.sessionId===g.target));return e.jsxs("form",{className:"flex min-h-0 flex-1 flex-col",onSubmit:u=>{u.preventDefault(),!i&&J&&N({note:g.note,...C?{config:g.config}:{sessionId:g.target}})},children:[e.jsxs("div",{className:"min-h-0 flex-1 space-y-5 overflow-y-auto overscroll-contain px-5 py-5",children:[e.jsx("p",{className:"truncate text-sm text-muted-foreground",title:m,children:a.length>1?`${a.length} 条待办,一起发送`:m}),e.jsxs("fieldset",{disabled:i,className:"min-w-0 space-y-5",children:[e.jsxs("label",{className:"block space-y-2 text-sm text-muted-foreground",children:["交给谁",e.jsxs("select",{className:ce,disabled:p,value:g.target,onChange:u=>h({...g,target:u.target.value}),children:[x.map(u=>e.jsxs("option",{value:u.sessionId,children:[u.sessionId===r?"当前 · ":u.sessionId===y?"上次 · ":"",u.displayName," · ",u.agent?.displayName||u.agent?.slug]},u.sessionId)),!C&&!x.some(u=>u.sessionId===g.target)&&e.jsx("option",{value:g.target,disabled:!0,children:"原会话已不可用,请重新选择"}),e.jsx("option",{value:"__new__",children:"+ 新建会话"})]})]}),C&&e.jsxs("details",{className:"rounded-lg border border-border/20 px-3 text-sm text-muted-foreground",children:[e.jsxs("summary",{className:"min-h-11 cursor-pointer py-3",children:[F?.displayName||"选择 Agent"," · ",ue(g.config.cwd)||"服务默认目录"," · 更改"]}),e.jsxs("div",{className:"space-y-4 pb-3",children:[e.jsxs("label",{className:"block space-y-2",children:["Agent",e.jsxs("select",{className:ce,value:g.config.agentSlug,onChange:u=>{const q=c.find(fe=>fe.slug===u.target.value);h({...g,config:{...g.config,agentSlug:u.target.value,command:q?me(q.slug,q.command):""}})},children:[e.jsx("option",{value:"",disabled:!0,children:"选择 Agent"}),c.map(u=>e.jsx("option",{value:u.slug,children:u.displayName},u.slug))]})]}),F&&e.jsx(Ze,{agent:F,value:g.config.command,onChange:u=>h({...g,config:{...g.config,command:u}})},F.slug),e.jsxs("label",{className:"block space-y-2",children:["工作目录",e.jsxs("div",{className:"flex gap-2",children:[e.jsx("input",{className:ce,value:g.config.cwd,placeholder:"服务默认目录",onChange:u=>h({...g,config:{...g.config,cwd:u.target.value}})}),e.jsx("button",{type:"button",className:_,"aria-label":"选择工作目录",onClick:()=>D(!0),children:e.jsx(Ge,{size:16})})]})]}),!!d.length&&e.jsx("div",{className:"flex gap-2 overflow-x-auto",children:d.map(u=>e.jsx("button",{type:"button",className:"min-h-10 shrink-0 rounded-md bg-surface-2 px-2 text-xs",title:u,onClick:()=>h({...g,config:{...g.config,cwd:u}}),children:ue(u)},u))})]})]}),e.jsxs("label",{className:"block space-y-2 text-sm text-muted-foreground",children:["补充一句话",e.jsx("span",{className:"ml-2 text-xs",children:"选填"}),e.jsx("textarea",{className:`${ce} min-h-28 resize-y`,maxLength:4e3,value:g.note,onChange:u=>h({...g,note:u.target.value}),placeholder:"例如:先分析不要改代码,和之前那个问题一起处理…"})]})]})]}),e.jsxs("footer",{className:"flex shrink-0 items-center justify-end gap-2 border-t border-border/20 px-5 py-4 pb-[max(1rem,env(safe-area-inset-bottom,0px))]",children:[e.jsx("button",{type:"button",className:k,disabled:i,onClick:f,children:"取消"}),e.jsxs("button",{className:B,disabled:i||!J,children:[e.jsx(tt,{size:16}),i?"正在发送…":"发送并进入会话"]})]}),e.jsx(et,{open:H,title:"选择工作目录",initialPath:g.config.cwd||"/",onCancel:()=>D(!1),onConfirm:u=>{h({...g,config:{...g.config,cwd:u}}),D(!1)}})]})}const Ve={agentSlug:"",command:"",cwd:"",prompt:""};function Ds({onOpenSidebar:s,leftSidebarVisible:a,activeSessionId:n}){const c=kt(),[l]=j.useState(()=>L()?.targetPeerId??location.origin),r=E(t=>t.views[l]??V),d=t=>E.getState().patch(l,t),[i,p]=j.useState(()=>E.getState().snapshots[l]??null),[m,N]=j.useState(()=>E.getState().options[l]??{agents:[],preferred:null,cwd:"",directories:[]}),[f,x]=j.useState(!E.getState().options[l]),[y,A]=j.useState(""),[g,h]=j.useState(""),[H,D]=j.useState(""),[C,F]=j.useState(!1),[J,u]=j.useState(null),q=j.useRef(null),[fe,it]=j.useState(0),M=fe>=900,K=j.useRef(!0),pe=j.useRef(!1),he=j.useRef(!1),ge=j.useRef(0),qe=j.useRef(L()?.targetPeerId),T=()=>K.current&&qe.current===L()?.targetPeerId,X=j.useCallback(async(t=!1)=>{if(he.current&&!t)return;he.current=!0;const o=++ge.current,v=L()?.targetPeerId;try{const b=await He();K.current&&o===ge.current&&v===L()?.targetPeerId&&(p(b),E.getState().cache(l,b),A(""))}catch(b){K.current&&v===L()?.targetPeerId&&A(b instanceof Error?b.message:"待办加载失败")}finally{o===ge.current&&(he.current=!1)}},[l]),W=j.useCallback(async()=>{const t=L()?.targetPeerId;x(!0);const[o,v]=await Promise.allSettled([Ct(),St()]);if(!K.current||L()?.targetPeerId!==t)return;const b=E.getState().options[l],w=Ue().slice().sort(($,bt)=>bt.lastActivity-$.lastActivity),U={agents:o.status==="fulfilled"?o.value:b?.agents??[],preferred:v.status==="fulfilled"?v.value.newSessionAgentSlug:b?.preferred??Tt()?.slug??null,cwd:w.find($=>$.sessionId===n)?.cwd??b?.cwd??w[0]?.cwd??"",directories:xe(w.map($=>$.cwd).concat(b?.directories??[]))};N(U),E.getState().cacheOptions(l,U),x(!1),o.status==="rejected"&&h("会话选项加载失败,打开交接面板可重试。")},[l,n]);j.useEffect(()=>{K.current=!0;const t=q.current,o=()=>it(t?.clientWidth??0);o();const v=new ResizeObserver(o);t&&v.observe(t),W();const b=()=>{qe.current!==L()?.targetPeerId&&Je.getState().terminal()};window.addEventListener(Ke,b),window.addEventListener(Ce,W);const w=zt(()=>{navigator.onLine!==!1&&X()},1200,[Ce]);return()=>{K.current=!1,v.disconnect(),w(),window.removeEventListener(Ke,b),window.removeEventListener(Ce,W)}},[X,W]),j.useEffect(()=>{if(!H)return;const t=window.setTimeout(()=>{D(""),u(null)},5e3);return()=>window.clearTimeout(t)},[H]);const be=t=>E.getState().requestKey(l,t),Z=t=>E.getState().finishRequest(l,t),je=t=>E.getState().clearDraft(l,t),S=r.modal,z=t=>{h(""),d({modal:t})},P=async t=>{if(!pe.current){pe.current=!0,F(!0),h(""),D(""),u(null);try{await t(),T()&&(await X(!0),window.dispatchEvent(new Event("termdock:todos-changed")))}catch(o){T()&&h(o instanceof Error?o.message:"操作失败,请重试")}finally{pe.current=!1,K.current&&F(!1)}}},ot=t=>d({selectedId:t.id,mobileDetail:!0}),ee=t=>{P(async()=>{if(T()){if(!Ue().some(o=>o.sessionId===t.sessionId)){if(t.kind==="execute"&&t.todoId){Y(t.handoff?.todoIds??[t.todoId]),D("原会话已关闭,请重新选择会话。");return}throw new Error("收集会话已关闭,可以重新发起收集。")}d({modal:null}),window.dispatchEvent(new CustomEvent("switch-terminal-session",{detail:t.sessionId}))}})},ct=(t,o)=>{const v=i?.todos.find(w=>w.id===t)?.collectorId,b=i?.collectors.find(w=>w.id===v);return b?{...o,cwd:b.config.cwd}:o},Y=t=>{W(),z({kind:"handoff",ids:t})},dt=async(t,o)=>{const v=["handoff",t,o];let b=(await Ft({todoIds:t,...o,idempotencyKey:be(v)})).run;for(let w=0;b.status==="launching"&&w<180;w++){if(!T())return;await new Promise($=>window.setTimeout($,500));const U=await He();if(!T())return;b=U.runs.find($=>$.id===b.id)??b}if(T()){if(b.status==="failed")throw Z(v),new Error(b.error||"发送失败,请检查会话后重试");if(b.status==="launching"||!b.sessionId)throw new Error("仍在确认发送,请稍后重试;同一次请求不会重复发送。");Z(v),je(`handoff:${JSON.stringify(t.slice().sort())}`),as(l,b.sessionId),o.config&&Me(l,o.config),d({modal:null,selecting:!1,checked:[]}),window.dispatchEvent(new CustomEvent("switch-terminal-session",{detail:b.sessionId}))}},te=async t=>{const o=await Promise.allSettled(t.map(w=>_t(w.id,be(["collect",w.id,w.config]))));if(!T())return;let v=0;const b=[];if(o.forEach((w,U)=>{const $=t[U];w.status==="fulfilled"?(v++,Z(["collect",$.id,$.config])):b.push(`${$.name}:${w.reason instanceof Error?w.reason.message:String(w.reason)}`)}),d({modal:null}),v&&D(`已发起 ${v} 个收集任务`),b.length)throw new Error(b.join(";"))},se=(t,o)=>{P(async()=>{const v=await Ie(t,{status:o});T()&&(o!=="open"&&(u({todo:v.todo,previous:t.status}),r.selectedId===t.id&&d({selectedId:null,mobileDetail:!1})),D(o==="completed"?"已完成":o==="ignored"?"已忽略":"已重新打开"))})},I=i?.todos.find(t=>t.id===r.selectedId),G=I&&i?de(i,I.id):void 0,Pe=t=>c.find(o=>o.sessionId===t.sessionId)?.displayName??$t({name:t.handoff?.sessionName||"",agent:{displayName:t.config.agentSlug||"会话"}}).displayName,ae=i?.todos.filter(t=>Mt(i,t,r.filter)&&(!r.source||t.source===r.source)&&`${t.title} ${t.description} ${t.source}`.toLowerCase().includes(r.query.toLowerCase()))??[],ne=t=>{const o=i&&de(i,t.id);return t.status==="open"&&o?.status!=="launching"},ve=ae.filter(t=>r.checked.includes(t.id)&&ne(t)),le=i?.collectors.filter(t=>t.enabled)??[],we=De(l),re=i?.collectors.slice().sort((t,o)=>o.updatedAt-t.updatedAt).find(t=>m.agents.some(o=>o.slug===t.config.agentSlug))?.config,ie=we.choice&&m.agents.some(t=>t.slug===we.choice?.agentSlug)?we.choice:re?{agentSlug:re.agentSlug,command:re.command,cwd:re.cwd}:void 0,oe=m.agents.find(t=>t.slug===ie?.agentSlug),Ne=ie&&oe&&qt(oe.slug)?{...ie,command:me(oe.slug,oe.command)}:ie,ut=nt(i?.defaults.agentSlug?i.defaults:{...Ve,...Ne},m.agents,m.preferred,m.cwd),Le=Ne?{...Ve,...Ne}:ut,Re=Vt(m.cwd,m.directories??[],i,l),mt=L()?.serviceName||"当前服务",ye=S?.kind==="collector"?i?.collectors.find(t=>t.id===S.id):void 0,Q=S?.kind==="edit"?S.todo:void 0,xt=S?.kind==="edit"?Q?"编辑待办":"新增待办":S?.kind==="handoff"?"交给会话":S?.kind==="collector"?ye?"编辑收集方向":"添加收集方向":"外部接入",ke=r.tab==="todos"&&!M&&r.mobileDetail&&!!I,ft=r.toolsOpen||r.filter!=="open"||!!r.query||!!r.source,pt=r.tab==="todos"&&!ke,Oe=()=>d({tab:"todos",mobileDetail:!1,selecting:!1,checked:[]}),_e=I?[{label:"编辑待办",action:()=>z({kind:"edit",todo:I})},...G?.sessionId?[{label:"打开终端",action:()=>ee(G)}]:[],...I.status==="open"?[{label:"交给其他会话",action:()=>Y([I.id]),disabled:G?.status==="launching"},{label:"标记完成",action:()=>se(I,"completed")},{label:"忽略这条待办",action:()=>se(I,"ignored"),danger:!0}]:[]]:[],ht=[{label:"搜索和筛选",action:()=>{d({toolsOpen:!0}),window.setTimeout(()=>{T()&&q.current?.querySelector('[aria-label="搜索待办"]')?.focus()},0)}},{label:"多选待办",action:()=>d({selecting:!0,mobileDetail:!1,checked:[]}),disabled:!ae.some(ne)},{label:"已完成",action:()=>d({filter:"completed",mobileDetail:!1,checked:[]})},{label:"已忽略",action:()=>d({filter:"ignored",mobileDetail:!1,checked:[]})},{label:"收集方向",action:()=>d({tab:"collectors",mobileDetail:!1})},{label:"外部接入",action:()=>z({kind:"integration"})}],gt=()=>{i&&(le.length?P(()=>te(le)):i.collectors.length?d({tab:"collectors",mobileDetail:!1}):z({kind:"collector"}))},Fe=i?.collectors.filter(t=>{const o=i.runs.filter(v=>v.collectorId===t.id).at(-1);return o&&(o.status==="launching"||o.status==="delivered")}).length??0;return e.jsxs("section",{ref:q,"aria-label":"待办工作区",className:"absolute inset-0 flex min-h-0 min-w-0 flex-col bg-[var(--chrome-bg)] text-foreground",children:[e.jsx("header",{"data-termdock-window-header":"true",className:"relative z-20 flex min-h-16 shrink-0 items-center gap-1 border-b border-border/30 px-3 sm:gap-2 sm:px-5",children:ke?e.jsxs(e.Fragment,{children:[e.jsxs("button",{type:"button",className:k,"aria-label":"返回清单",onClick:Oe,children:[e.jsx(Se,{size:18}),e.jsx("span",{children:"待办"})]}),e.jsx("h1",{className:"sr-only",children:"待办详情"}),e.jsx("div",{className:"flex-1"}),e.jsx(Ee,{label:"待办操作",items:_e,disabled:C})]}):r.tab==="collectors"?e.jsxs(e.Fragment,{children:[e.jsx("button",{type:"button",className:k,"aria-label":"返回清单",onClick:Oe,children:e.jsx(Se,{size:18})}),e.jsx("h1",{className:"min-w-0 flex-1 text-base font-semibold",children:"收集方向"}),e.jsxs("button",{type:"button",className:k,"aria-label":"添加方向",title:"添加方向",disabled:!i,onClick:()=>z({kind:"collector"}),children:[e.jsx(Be,{size:20}),e.jsx("span",{className:"hidden sm:inline",children:"添加方向"})]})]}):r.selecting?e.jsxs(e.Fragment,{children:[e.jsx("button",{type:"button",className:k,onClick:()=>d({selecting:!1,checked:[]}),children:"取消"}),e.jsxs("h1",{className:"min-w-0 flex-1 text-sm",children:["已选 ",ve.length," 项"]}),e.jsx("button",{type:"button",className:B,disabled:C||!ve.length,onClick:()=>Y(ve.map(t=>t.id)),children:"交给会话"})]}):e.jsxs(e.Fragment,{children:[!a&&e.jsx("button",{type:"button",className:`${k} hidden sm:inline-flex`,"aria-label":"打开会话侧栏",onClick:s,children:e.jsx(Pt,{size:18})}),e.jsx("button",{type:"button",className:`${k} px-2`,"aria-label":"返回终端",title:"返回终端",onClick:()=>Je.getState().terminal(),children:e.jsx(Se,{size:18})}),e.jsxs("h1",{className:"min-w-0 flex-1 text-base font-semibold",children:["待办",i&&e.jsx("span",{className:"ml-2 text-xs font-normal tabular-nums text-muted-foreground",children:i.todos.filter(t=>t.status==="open").length})]}),e.jsxs("button",{type:"button",className:`${k} px-2 text-primary`,"aria-label":"收集待办",disabled:!i||C,onClick:gt,children:[e.jsx(Xe,{size:16}),e.jsx("span",{children:"收集"})]}),e.jsx("button",{type:"button",className:`${k} px-2`,"aria-label":"新增待办",title:"新增待办",disabled:!i,onClick:()=>z({kind:"edit"}),children:e.jsx(Be,{size:21})}),e.jsx(Ee,{label:"待办菜单",items:ht,disabled:!i||C})]})}),(y||g&&!S)&&e.jsxs("div",{role:"alert",className:"flex shrink-0 items-start gap-3 border-b border-border/30 px-5 py-3 text-sm text-destructive",children:[e.jsx("span",{className:"min-w-0 flex-1 break-words",children:g||y}),y&&e.jsx("button",{type:"button",className:"shrink-0 underline",onClick:()=>{X(!0)},children:"重试"}),e.jsx("button",{type:"button","aria-label":"关闭提示",onClick:()=>{h(""),A("")},children:"×"})]}),H&&e.jsxs("div",{role:"status",className:"fixed bottom-[max(1.5rem,env(safe-area-inset-bottom,0px))] left-1/2 z-toast flex max-w-[calc(100vw-2rem)] -translate-x-1/2 items-center gap-4 rounded-xl border border-border bg-surface-elevated px-4 py-3 text-sm shadow-lg",children:[e.jsx("span",{className:"min-w-0 break-words",children:H}),J&&e.jsx("button",{type:"button",className:"min-h-9 shrink-0 text-primary",onClick:()=>{P(async()=>{await Ie(J.todo,{status:J.previous}),T()&&D("已撤销")})},children:"撤销"})]}),i?r.tab==="collectors"?e.jsxs("div",{className:"min-h-0 flex-1 overflow-y-auto overscroll-contain px-4 py-5 sm:px-6",children:[e.jsxs("div",{className:"mb-5 flex flex-wrap items-center justify-between gap-3",children:[e.jsx("p",{className:"text-sm leading-6 text-muted-foreground",children:"配置一次,之后从清单一键收集。"}),le.length>1&&e.jsx("button",{type:"button",className:_,disabled:C,onClick:()=>{P(()=>te(le))},children:"全部收集"})]}),i.collectors.length?e.jsx("div",{className:`grid items-start gap-4 ${M?"grid-cols-2":""}`,children:i.collectors.map(t=>e.jsx(rs,{collector:t,runs:i.runs.filter(o=>o.collectorId===t.id),busy:C,onRun:()=>{P(()=>te([t]))},onEdit:()=>z({kind:"collector",id:t.id}),onOpen:ee,onRemove:()=>{P(async()=>{await Lt(t)})}},t.id))}):e.jsx($e,{title:"让 Agent 帮你发现下一件事",text:"添加一个收集方向,写下关注的内容和筛选要求。"})]}):e.jsxs("div",{className:"flex min-h-0 flex-1",children:[e.jsxs("div",{className:`${M?"flex w-[42%] shrink-0 border-r border-border/30":pt?"flex flex-1":"hidden"} min-h-0 min-w-0 flex-col`,children:[ft&&e.jsxs("div",{"aria-label":"搜索和筛选",className:"shrink-0 space-y-2 border-b border-border/30 px-4 py-3",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs("div",{className:"relative min-w-0 flex-1",children:[e.jsx(Kt,{size:15,className:"pointer-events-none absolute left-3 top-3.5 text-muted-foreground"}),e.jsx("input",{autoFocus:r.toolsOpen,"aria-label":"搜索待办",className:"min-h-11 w-full min-w-0 rounded-lg bg-surface-2 py-2 pl-9 pr-3 text-base outline-none focus:ring-1 focus:ring-primary sm:text-sm",placeholder:"搜索待办",value:r.query,onChange:t=>d({query:t.target.value})})]}),e.jsx("button",{type:"button",className:k,"aria-label":"清除筛选",onClick:()=>d({query:"",source:"",filter:"open",toolsOpen:!1,checked:[]}),children:e.jsx(Ye,{size:17})})]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsxs("select",{"aria-label":"待办状态",className:"min-h-11 min-w-0 flex-1 rounded-lg bg-surface-2 px-3 text-base sm:text-sm",value:r.filter,onChange:t=>d({filter:t.target.value,checked:[]}),children:[e.jsx("option",{value:"open",children:"未完成"}),e.jsx("option",{value:"completed",children:"已完成"}),e.jsx("option",{value:"ignored",children:"已忽略"})]}),e.jsxs("select",{"aria-label":"按来源筛选",className:"min-h-11 min-w-0 flex-1 rounded-lg bg-surface-2 px-3 text-base sm:text-sm",value:r.source,onChange:t=>d({source:t.target.value,checked:[]}),children:[e.jsx("option",{value:"",children:"全部来源"}),[...new Set(i.todos.map(t=>t.source))].map(t=>e.jsx("option",{children:t},t))]})]})]}),!!Fe&&e.jsxs("button",{type:"button",className:"flex min-h-11 shrink-0 items-center justify-between gap-3 px-5 text-left text-xs text-muted-foreground hover:bg-surface",onClick:()=>d({tab:"collectors"}),children:[e.jsxs("span",{children:["已发起 ",Fe," 个收集任务"]}),e.jsx("span",{className:"text-primary",children:"查看"})]}),e.jsx("div",{className:"min-h-0 flex-1 overflow-y-auto overscroll-contain px-3 pb-6 pt-2 sm:px-4",children:ae.length?ae.map(t=>{const o=de(i,t.id),v=!!o?.sessionId&&o.status!=="failed",b=v?"去会话":o?.status==="launching"?"发送中…":"交给会话",w=[o?.status==="failed"?"发送未完成":o?.status==="launching"?"正在发送":o?.sessionId?`已交给 ${Pe(o)}`:"",t.source==="手动添加"?"":t.source].filter(Boolean).join(" · ");return e.jsxs("article",{className:`flex items-start gap-1 border-b border-border/30 px-1 py-4 ${r.selectedId===t.id&&M?"bg-surface":"hover:bg-surface"}`,children:[r.selecting?e.jsx("label",{className:"flex min-h-11 w-10 shrink-0 items-center justify-center",children:e.jsx("input",{type:"checkbox","aria-label":`选择 ${t.title}`,checked:ne(t)&&r.checked.includes(t.id),disabled:!ne(t),onChange:U=>d({checked:U.target.checked?[...r.checked,t.id]:r.checked.filter($=>$!==t.id)}),className:"h-4 w-4 accent-[var(--primary)]"})}):e.jsx("button",{type:"button",className:"flex min-h-11 w-10 shrink-0 items-center justify-center text-muted-foreground hover:text-primary",disabled:C||t.status==="ignored","aria-label":`${t.status==="completed"?"重新打开":"完成"} ${t.title}`,onClick:()=>se(t,t.status==="completed"?"open":"completed"),children:t.status==="completed"?e.jsx(It,{size:19,className:"text-primary"}):e.jsx(Bt,{size:19})}),e.jsxs("button",{type:"button",className:"min-w-0 flex-1 py-2 text-left",onClick:()=>ot(t),children:[e.jsx("span",{className:`block break-words text-[15px] font-medium leading-6 ${t.status==="completed"?"text-muted-foreground line-through":""}`,children:t.title}),e.jsx("span",{className:"mt-1.5 block truncate text-xs leading-5 text-muted-foreground",children:t.status==="completed"?"已完成":t.status==="ignored"?"已忽略":w})]}),t.status==="open"&&!r.selecting&&e.jsx("button",{type:"button",className:"mt-1 inline-flex min-h-11 shrink-0 items-center gap-1 rounded-lg px-2 text-xs font-medium text-primary hover:bg-surface-2 disabled:opacity-40",disabled:C||o?.status==="launching"&&!o.sessionId,"aria-label":`${v?"去会话":"交给会话"} ${t.title}`,onClick:()=>v?ee(o):Y([t.id]),children:e.jsx("span",{children:b})})]},t.id)}):e.jsx($e,{title:r.query||r.source?"没有匹配的待办":r.filter==="completed"?"还没有已完成的待办":r.filter==="review"?"暂时没有待确认的结果":r.filter==="ignored"?"没有已忽略的待办":i.todos.length?"清单已清空":"还没有待办",text:r.query||r.source?"换个关键词,或清除筛选。":r.filter==="open"?"点 + 记下一件事,或让 Agent 帮你收集。":"清除筛选可回到当前待办。"})})]}),(M||ke)&&e.jsx("div",{className:"flex min-h-0 min-w-0 flex-1 flex-col",children:I?e.jsx(ss,{todo:I,sessionName:G?Pe(G):void 0,runs:i.runs.filter(t=>t.todoId===I.id||t.handoff?.todoIds.includes(I.id)),busy:C,wide:M,menu:_e,onLaunch:()=>Y([I.id]),onOpen:ee,onStatus:t=>se(I,t)},I.id):e.jsx($e,{title:"从清单开始",text:"选择一条待办,查看内容或处理结果。"})})]}):e.jsx("div",{className:"flex flex-1 items-center justify-center text-sm text-muted-foreground",children:y?"加载失败,请重试":"正在加载待办…"}),S&&e.jsxs(Wt,{compact:S.kind==="handoff",title:xt,busy:C,error:g,onClose:()=>z(null),children:[S.kind==="edit"&&e.jsx(Yt,{workspace:l,todo:Q,busy:C,onCancel:()=>z(null),onSave:(t,o)=>{P(async()=>{const v=Q?await Ie(Q,t):await Rt({...t,idempotencyKey:be(["create",t])});T()&&(Z(["create",t]),je(`todo:${Q?.id??"new"}`),d({tab:"todos",filter:"open",source:"",query:"",selectedId:v.todo.id,mobileDetail:!1,modal:o?{kind:"handoff",ids:[v.todo.id]}:null}),o||D("待办已保存。"))})}}),S.kind==="handoff"&&(f?e.jsx("div",{className:"p-5 text-sm text-muted-foreground",children:"正在读取会话…"}):e.jsx(ls,{workspace:l,ids:S.ids,config:ct(S.ids[0],Le),agents:m.agents,sessions:c,currentSessionId:n,directories:Re,busy:C,loading:f,title:i?.todos.find(t=>t.id===S.ids[0])?.title??"",onCancel:()=>z(null),onSend:t=>{P(()=>dt(S.ids,t))}})),S.kind==="collector"&&e.jsx(Xt,{workspace:l,collector:ye,config:Le,agents:m.agents,loading:f,service:mt,directories:Re,currentCwd:m.cwd,busy:C,onCancel:()=>z(null),onSave:(t,o)=>{P(async()=>{const v=await Ot(t);T()&&(Me(l,t.config),je(`collector:${ye?.id??"new"}`),d({tab:o&&r.tab!=="collectors"?"todos":"collectors",modal:null}),o?await te([v.collector]):D("收集方向已保存,可以随时开始。"))})}}),S.kind==="integration"&&e.jsx(Zt,{})]})]})}function $e({title:s,text:a}){return e.jsxs("div",{className:"mx-auto flex max-w-sm flex-col items-center px-6 py-12 text-center",children:[e.jsx(Jt,{size:30,strokeWidth:1.2,className:"mb-4 text-muted-foreground/50"}),e.jsx("h2",{className:"text-base font-medium",children:s}),e.jsx("p",{className:"mt-2 text-sm leading-7 text-muted-foreground",children:a})]})}function rs({collector:s,runs:a,busy:n,onRun:c,onEdit:l,onRemove:r,onOpen:d}){const[i,p]=j.useState(!1),m=a.at(-1);return e.jsxs("article",{className:"rounded-xl border border-border/30 bg-surface p-4 sm:p-5",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("h2",{className:"min-w-0 flex-1 break-words text-base font-semibold",children:s.name}),e.jsx("button",{type:"button",className:k,"aria-label":`编辑 ${s.name}`,disabled:n,onClick:l,children:e.jsx(Et,{size:16})}),e.jsx("button",{type:"button",className:k,"aria-label":`移除 ${s.name}`,disabled:n,onClick:()=>p(!0),children:e.jsx(At,{size:16})})]}),e.jsxs("p",{className:"mt-1 text-xs leading-6 text-muted-foreground",children:[s.config.agentSlug," · ",s.enabled?s.schedule?s.schedule.kind==="interval"?`每 ${s.schedule.everyMinutes} 分钟`:`每天 ${s.schedule.time}`:"手动运行":"已停用"]}),e.jsx("p",{className:"my-3 line-clamp-3 whitespace-pre-wrap text-sm leading-7 text-muted-foreground",children:s.config.prompt}),i?e.jsxs("div",{className:"rounded-lg bg-surface-2 p-3",children:[e.jsx("p",{className:"text-sm leading-6",children:"移除此方向?已有待办、终端和结果会保留。"}),e.jsxs("div",{className:"mt-2 flex justify-end gap-2",children:[e.jsx("button",{type:"button",className:k,onClick:()=>p(!1),children:"取消"}),e.jsx("button",{type:"button",className:`${_} text-destructive`,disabled:n,onClick:r,children:"确认移除"})]})]}):e.jsx("div",{className:"flex flex-wrap gap-2",children:e.jsxs("button",{type:"button",className:B,disabled:n||m?.status==="launching",onClick:c,children:[e.jsx(Xe,{size:16}),m?"再次收集":"开始收集"]})}),m&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"mt-4 flex items-center gap-2 text-xs leading-6 text-muted-foreground",children:[e.jsx("span",{className:"flex-1",children:m.status==="complete"?"已收到收集结果":lt[m.status]}),m.sessionId&&m.status!=="complete"&&e.jsx("button",{type:"button",className:k,disabled:n,onClick:()=>d(m),children:"打开终端"})]}),e.jsxs("details",{className:"mt-2 text-sm text-muted-foreground",children:[e.jsxs("summary",{className:"min-h-11 cursor-pointer py-2.5",children:["收集记录 · ",a.length," 次"]}),e.jsx("div",{className:"space-y-3 pt-2",children:a.slice().reverse().map(N=>e.jsx(ts,{run:N,onOpen:()=>d(N),busy:n},N.id))})]})]})]})}export{Ds as default};
|
|
Binary file
|
|
Binary file
|
package/dist/client/assets/{abnfDiagram-VCTEODGH-CdEUK_s_.js → abnfDiagram-VCTEODGH-CPmxTXWR.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{g as p,r as u,d as a}from"./chunk-SVP7TREG-
|
|
1
|
+
import{g as p,r as u,d as a}from"./chunk-SVP7TREG-DnY33T6h.js";import{p as f}from"./chunk-JWPE2WC7-BrLueD3X.js";import{d as n,bg as o}from"./mermaid.core-Dkp6JxgQ.js";import{M as c,c as d}from"./cynefin-OW5HDTMX-B28ddXz6.js";import"./app-CG7UnlvD.js";import"./react-XDCjal2T.js";import"./dnd-BCFAPC0L.js";import"./terminal-DaiFCKy_.js";import"./purify.es-4eNOHKSq.js";var g=d().RailroadAbnf.parser.LangiumParser,i=n(e=>{const r=e.alternatives.map(v);return r.length===1?r[0]:{type:"choice",alternatives:r}},"transformAlternation"),v=n(e=>{const r=e.elements.map(y);return r.length===1?r[0]:{type:"sequence",elements:r}},"transformConcatenation"),b=n(e=>{if(e.includes("*")){const[t,s]=e.split("*"),m=t?parseInt(t,10):0,l=s?parseInt(s,10):1/0;return{min:m,max:l}}const r=parseInt(e,10);return{min:r,max:r}},"parseRepeat"),y=n(e=>{const r=A(e.primary);if(!e.repeat)return r;const{min:t,max:s}=b(e.repeat);return t===0&&s===1?{type:"optional",element:r}:{type:"repetition",element:r,min:t,max:s}},"transformElement"),A=n(e=>{switch(e.$type){case"AbnfStringLiteral":return{type:"terminal",value:e.value};case"AbnfNumVal":return{type:"terminal",value:e.value};case"AbnfRuleName":return{type:"nonterminal",name:e.name};case"AbnfGroup":return i(e.element);case"AbnfOptionalGroup":return{type:"optional",element:i(e.element)};default:throw new Error(`Unsupported ABNF primary node: ${e.$type}`)}},"transformPrimary"),P=n(e=>({name:e.name,definition:i(e.definition)}),"transformRule"),h=n(e=>{f(e,a),e.title&&a.setTitle(e.title),e.rules.map(r=>a.addRule(P(r)))},"populateDb"),R={parse:n(e=>{a.clear(),o.debug("[ABNF Parser] Starting Langium parse");const r=g.parse(e);if(r.lexerErrors.length>0||r.parserErrors.length>0)throw new c(r);const t=r.value;o.debug("[ABNF Parser] Parsed rules:",t.rules.length),h(t),o.debug("[ABNF Parser] Parse complete")},"parse"),parser:{yy:a}},D={parser:R,db:a,renderer:u,styles:p};export{D as diagram};
|
|
Binary file
|
|
Binary file
|