@forsion/unit 2.12.2
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/LICENSE +223 -0
- package/README.md +101 -0
- package/backendWorker.mjs +273 -0
- package/main.mjs +3434 -0
- package/package.json +26 -0
- package/release.json +11 -0
- package/web/assets/ArtificialView-B4ESD4iK.js +1 -0
- package/web/assets/AutomationBuilder-sxWdUa0L.js +1 -0
- package/web/assets/CalendarConfigView-cCfo_EvZ.js +1 -0
- package/web/assets/CalendarView-wgLapctk.js +1 -0
- package/web/assets/CapabilityMenu-BQBsM638.js +1 -0
- package/web/assets/CapabilityMenu-CTIzmTJB.css +1 -0
- package/web/assets/ChatView-BIUk0OJd.css +1 -0
- package/web/assets/ChatView-C-jCJnyS.js +47 -0
- package/web/assets/CheckboxInput-BsaoUHZ0.js +1 -0
- package/web/assets/Chrome-CwFiDmre.js +1 -0
- package/web/assets/CodeView-j065KtVh.js +15 -0
- package/web/assets/DancingScript-Bold-latin-CWNX0RqN.woff2 +0 -0
- package/web/assets/DashboardGridView-Ck3LKkOb.css +1 -0
- package/web/assets/DashboardGridView-DXqe0vPd.js +17 -0
- package/web/assets/EventCard-BmDQkEj9.js +1 -0
- package/web/assets/ExcalidrawCanvas-4uYrLYin.css +1 -0
- package/web/assets/ExcalidrawCanvas-C3egkikA.js +1 -0
- package/web/assets/FloatingToc-CENybkAA.js +1 -0
- package/web/assets/HomepageView-BNabJQfP.css +1 -0
- package/web/assets/HomepageView-CRdhjLXu.js +1 -0
- package/web/assets/ImageStudioPanels-Dke7xf8E.js +3 -0
- package/web/assets/ImageStudioView-g38V8gaj.js +1 -0
- package/web/assets/InlineFiles-C_hjvn3u.js +1 -0
- package/web/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- package/web/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- package/web/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- package/web/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- package/web/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- package/web/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- package/web/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- package/web/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- package/web/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- package/web/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- package/web/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- package/web/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- package/web/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- package/web/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- package/web/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- package/web/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- package/web/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- package/web/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- package/web/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- package/web/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- package/web/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- package/web/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- package/web/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- package/web/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- package/web/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- package/web/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- package/web/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- package/web/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- package/web/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- package/web/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- package/web/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- package/web/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- package/web/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- package/web/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- package/web/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- package/web/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- package/web/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- package/web/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- package/web/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- package/web/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- package/web/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- package/web/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- package/web/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- package/web/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- package/web/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- package/web/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- package/web/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- package/web/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- package/web/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- package/web/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- package/web/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- package/web/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- package/web/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- package/web/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- package/web/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- package/web/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- package/web/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- package/web/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- package/web/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- package/web/assets/MarkdownBlock-DIjYEhTK.js +56 -0
- package/web/assets/ModelPill-BPlgovPo.js +1 -0
- package/web/assets/ModelPill-CzdNh7Mt.css +1 -0
- package/web/assets/MuseLibraryView-CenyTTim.js +2 -0
- package/web/assets/MuseView-d-iBk3sc.js +6 -0
- package/web/assets/PageHistoryPanel-CR-k1AM7.js +2 -0
- package/web/assets/PageHistoryPanel-DFjh0pWs.css +1 -0
- package/web/assets/PdfAnnotator-CGzC_o1Q.css +1 -0
- package/web/assets/PdfAnnotator-D79ip27w.js +560 -0
- package/web/assets/ProductView-u2aezVsl.js +1 -0
- package/web/assets/RightPanel-C3OJTIqT.js +4 -0
- package/web/assets/RunLocationPicker-BNcZ7KKF.css +1 -0
- package/web/assets/RunLocationPicker-CTYXUH2z.js +34 -0
- package/web/assets/SidebarRow-BuSkKH5q.js +9 -0
- package/web/assets/SidebarRow-CsWEqPKX.css +1 -0
- package/web/assets/SketchCard-D87GADyG.js +437 -0
- package/web/assets/StudioGuestSurface-BijU_EEb.js +1 -0
- package/web/assets/TodoListView-DPPVpPUn.js +1 -0
- package/web/assets/Tooltip-DY4ISA-e.js +1 -0
- package/web/assets/UnifiedPage-CKNtVD_n.js +57 -0
- package/web/assets/UnifiedPage-DX_sTpyZ.css +1 -0
- package/web/assets/amadeus-manual.en-DWaN2fPs.js +3515 -0
- package/web/assets/amadeus-manual.zh--7D5TS8X.js +3515 -0
- package/web/assets/apl-B4CMkyY2.js +1 -0
- package/web/assets/appStore-Dg9WALEA.js +3080 -0
- package/web/assets/appStore-Di8LXuJ9.css +1 -0
- package/web/assets/approvalText-Cy2UAUAQ.js +2 -0
- package/web/assets/arrow-up-right-CpQs92mu.js +1 -0
- package/web/assets/artificial-BzLFkChP.css +1 -0
- package/web/assets/asciiarmor-Df11BRmG.js +1 -0
- package/web/assets/asn1-EdZsLKOL.js +1 -0
- package/web/assets/asterisk-B-8jnY81.js +1 -0
- package/web/assets/astryxBridge-BZhaZPs4.js +70 -0
- package/web/assets/astryxBridge-CF_hpqC2.css +1 -0
- package/web/assets/automationListSource-DP5xZBxo.js +1 -0
- package/web/assets/brainfuck-C4LP7Hcl.js +1 -0
- package/web/assets/calendarNavStore-C7fGRpoH.js +1 -0
- package/web/assets/canvasPrefs-BeG4oEgP.js +1 -0
- package/web/assets/chatBoxSurface-zvcyfrxE.js +1 -0
- package/web/assets/circle-question-mark-WL3vbp-Z.js +1 -0
- package/web/assets/circle-x-D7s-M5sB.js +1 -0
- package/web/assets/client-BSKpsyAw.js +9 -0
- package/web/assets/clike-B9uivgTg.js +1 -0
- package/web/assets/clojure-BMjYHr_A.js +1 -0
- package/web/assets/cmake-BQqOBYOt.js +1 -0
- package/web/assets/cobol-CWcv1MsR.js +1 -0
- package/web/assets/code-xml-BALV9u_c.js +1 -0
- package/web/assets/codeStudioStore-C2mWfm32.js +22 -0
- package/web/assets/coffeescript-S37ZYGWr.js +1 -0
- package/web/assets/commonlisp-DBKNyK5s.js +1 -0
- package/web/assets/create-4xUyKtAF.js +14 -0
- package/web/assets/create-BgE3edmZ.css +1 -0
- package/web/assets/crystal-SjHAIU92.js +1 -0
- package/web/assets/css-BnMrqG3P.js +1 -0
- package/web/assets/cursor-editorTextHighlight-kG3uUOwL.svg +8 -0
- package/web/assets/cypher-C_CwsFkJ.js +1 -0
- package/web/assets/d-pRatUO7H.js +1 -0
- package/web/assets/dashboardSurface-CFTH5z4c.js +1 -0
- package/web/assets/deskCapture-Df701U8L.js +1 -0
- package/web/assets/diff-DbItnlRl.js +1 -0
- package/web/assets/diff2html-BV-zCH4d.js +111 -0
- package/web/assets/dockerfile-BKs6k2Af.js +1 -0
- package/web/assets/docx-preview-DW4IyU_Q.js +22 -0
- package/web/assets/dtd-DF_7sFjM.js +1 -0
- package/web/assets/dylan-DwRh75JA.js +1 -0
- package/web/assets/ebnf-CDyGwa7X.js +1 -0
- package/web/assets/ecl-Cabwm37j.js +1 -0
- package/web/assets/eiffel-CnydiIhH.js +1 -0
- package/web/assets/ellipsis-r1EcXsFq.js +1 -0
- package/web/assets/elm-vLlmbW-K.js +1 -0
- package/web/assets/emoji-DGaxpCIu.js +1 -0
- package/web/assets/erlang-BNw1qcRV.js +1 -0
- package/web/assets/factor-kuTfRLto.js +1 -0
- package/web/assets/fcl-Kvtd6kyn.js +1 -0
- package/web/assets/floatingTocSurface-C6RJ6i41.js +1 -0
- package/web/assets/foldActions-B7KByFdN.js +1 -0
- package/web/assets/folder-DlxnPmWY.js +1 -0
- package/web/assets/folder-plus-D1TDb7k9.js +1 -0
- package/web/assets/forsion-logo-dark-DnB9JTdv.svg +5 -0
- package/web/assets/forsion-logo-light-DhkEeB4V.svg +11 -0
- package/web/assets/forth-Ffai-XNe.js +1 -0
- package/web/assets/fortran-DYz_wnZ1.js +1 -0
- package/web/assets/frame-_xBVYe3P.js +1 -0
- package/web/assets/gas-Bneqetm1.js +1 -0
- package/web/assets/gestures-CkW1Kfs9.js +1 -0
- package/web/assets/gherkin-heZmZLOM.js +1 -0
- package/web/assets/groovy-D9Dt4D0W.js +1 -0
- package/web/assets/hack2gate-dark-Dx2RtDRI.jpg +0 -0
- package/web/assets/hack2gate-light-DRKq9tyS.jpg +0 -0
- package/web/assets/hand-Crrw-nSn.js +1 -0
- package/web/assets/hard-drive-BbyVSbfP.js +1 -0
- package/web/assets/haskell-Cw1EW3IL.js +1 -0
- package/web/assets/haxe-H-WmDvRZ.js +1 -0
- package/web/assets/http-DBlCnlav.js +1 -0
- package/web/assets/i18n-D-eU58uw.css +1 -0
- package/web/assets/i18n.generated-Bbsz16cl.js +15 -0
- package/web/assets/idl-BEugSyMb.js +1 -0
- package/web/assets/imageStudio-BqbNOvpu.css +1 -0
- package/web/assets/imageStudio-C_Rs630L.js +2 -0
- package/web/assets/index--drOLtq7.js +1 -0
- package/web/assets/index-BCZZVJ_w.js +1 -0
- package/web/assets/index-BCubCwdT.js +1 -0
- package/web/assets/index-BRW82CsP.js +6 -0
- package/web/assets/index-BYsdKR_1.js +1 -0
- package/web/assets/index-Brik2pf9.js +1 -0
- package/web/assets/index-C6GJulug.js +13 -0
- package/web/assets/index-C7U6T-k8.js +1 -0
- package/web/assets/index-CF4RV4mh.js +298 -0
- package/web/assets/index-CflzrdSt.js +1 -0
- package/web/assets/index-Cmr7gVZQ.js +1 -0
- package/web/assets/index-CqyM6tQ0.js +1 -0
- package/web/assets/index-CzM-C2Sd.js +1 -0
- package/web/assets/index-Czu_bbDM.js +1 -0
- package/web/assets/index-D1f_JwPH.js +1 -0
- package/web/assets/index-DKhyDkGB.js +7 -0
- package/web/assets/index-DUWR2nZi.js +1 -0
- package/web/assets/index-DZfZTksa.js +1 -0
- package/web/assets/index-Dg9oixs4.js +1 -0
- package/web/assets/index-DjzSBM0U.js +2 -0
- package/web/assets/index-KL5Rj9kP.js +1 -0
- package/web/assets/index-OHi69jDq.js +3 -0
- package/web/assets/index-SZ5waGAq.js +1 -0
- package/web/assets/index-gPSbFSUn.js +1 -0
- package/web/assets/index-tAXBa_fN.js +1 -0
- package/web/assets/invitePage-lLQ-e0pj.js +19 -0
- package/web/assets/ipc-DQOD2UKk.js +1 -0
- package/web/assets/javascript-iXu5QeM3.js +1 -0
- package/web/assets/jszip.min-DZxV9uZ_.js +2 -0
- package/web/assets/julia-DuME0IfC.js +1 -0
- package/web/assets/layout-grid-B_pjJwz4.js +1 -0
- package/web/assets/linkFollow-C0_3k_PC.js +8 -0
- package/web/assets/list-tree-DkAJYEXd.js +1 -0
- package/web/assets/listFold-BsOVn9UZ.js +1 -0
- package/web/assets/livescript-BwQOo05w.js +1 -0
- package/web/assets/lock-BnGHxjeE.js +1 -0
- package/web/assets/log-out-DBuMeqik.js +1 -0
- package/web/assets/lua-VAEuO923.js +1 -0
- package/web/assets/main-Dki8NlsT.js +21 -0
- package/web/assets/main-NgUPPqDn.css +1 -0
- package/web/assets/markdownEditorSurface-B4PeUzed.js +3 -0
- package/web/assets/markdownEditorSurface-Bql20IAf.css +1 -0
- package/web/assets/mathematica-DTrFuWx2.js +1 -0
- package/web/assets/mbox-CNhZ1qSd.js +1 -0
- package/web/assets/mdMarkStore-CsKl7C8O.js +2 -0
- package/web/assets/mdMarks-Bq7Hl-4C.js +1 -0
- package/web/assets/message-square-plus-BiAZAvcw.js +1 -0
- package/web/assets/messages-BH5MfQdZ.js +1 -0
- package/web/assets/minus-Cyv1YzOU.js +1 -0
- package/web/assets/mirc-CjQqDB4T.js +1 -0
- package/web/assets/mllike-CXdrOF99.js +1 -0
- package/web/assets/mobileEntry-Bd_nKr0D.js +13 -0
- package/web/assets/mobileEntry-DS1vohuL.css +1 -0
- package/web/assets/modelica-Dc1JOy9r.js +1 -0
- package/web/assets/mscgen-BA5vi2Kp.js +1 -0
- package/web/assets/mumps-BT43cFF4.js +1 -0
- package/web/assets/nativeDownload-D-f1_L2S.js +1 -0
- package/web/assets/nginx-DdIZxoE0.js +1 -0
- package/web/assets/nsis-LdVXkNf5.js +1 -0
- package/web/assets/ntriples-BfvgReVJ.js +1 -0
- package/web/assets/octave-Ck1zUtKM.js +1 -0
- package/web/assets/oz-BzwKVEFT.js +1 -0
- package/web/assets/pageChrome-C9_azUYW.js +1 -0
- package/web/assets/pageChrome-xLNdFaSg.css +1 -0
- package/web/assets/pageTree-CZH2J6cc.js +7 -0
- package/web/assets/panel-left-rOc8As0s.js +1 -0
- package/web/assets/pascal--L3eBynH.js +1 -0
- package/web/assets/pdf-C2_sJa3b.js +57 -0
- package/web/assets/pdf.worker.min-CGb3BKV9.js +1 -0
- package/web/assets/pdf.worker.min-Dr1KORA9.mjs +31 -0
- package/web/assets/pen-line-m6_HvWZ9.js +1 -0
- package/web/assets/pen-tool-lkmBqliH.js +1 -0
- package/web/assets/pencil-Cvk91P_Z.js +1 -0
- package/web/assets/perl-CdXCOZ3F.js +1 -0
- package/web/assets/pig-CevX1Tat.js +1 -0
- package/web/assets/pluginExt-Byb64tQO.js +1 -0
- package/web/assets/powershell-CFHJl5sT.js +1 -0
- package/web/assets/properties-C78fOPTZ.js +1 -0
- package/web/assets/protobuf-ChK-085T.js +1 -0
- package/web/assets/pug-DeIclll2.js +1 -0
- package/web/assets/puppet-DMA9R1ak.js +1 -0
- package/web/assets/python-BuPzkPfP.js +1 -0
- package/web/assets/q-pXgVlZs6.js +1 -0
- package/web/assets/r-B6wPVr8A.js +1 -0
- package/web/assets/redo-2-DSi54z4e.js +1 -0
- package/web/assets/rotate-ccw-CUlnplr0.js +1 -0
- package/web/assets/rpm-CTu-6PCP.js +1 -0
- package/web/assets/ruby-B2Rjki9n.js +1 -0
- package/web/assets/sas-B4kiWyti.js +1 -0
- package/web/assets/scheme-C41bIUwD.js +1 -0
- package/web/assets/sharePage-MM6UpPJ9.js +2 -0
- package/web/assets/shareViewer-CDZ8lTdy.js +345 -0
- package/web/assets/shareViewer-DLVrwanO.css +1 -0
- package/web/assets/shell-CjFT_Tl9.js +1 -0
- package/web/assets/sieve-C3Gn_uJK.js +1 -0
- package/web/assets/simple-mode-GW_nhZxv.js +1 -0
- package/web/assets/smalltalk-CnHTOXQT.js +1 -0
- package/web/assets/solr-DehyRSwq.js +1 -0
- package/web/assets/sparql-DkYu6x3z.js +1 -0
- package/web/assets/spreadsheet-BCZA_wO0.js +1 -0
- package/web/assets/sql-D0XecflT.js +1 -0
- package/web/assets/star-CwDiGyUW.js +1 -0
- package/web/assets/stex-C3f8Ysf7.js +1 -0
- package/web/assets/sticky-note-BIuPUSOU.js +1 -0
- package/web/assets/stylus-B533Al4x.js +1 -0
- package/web/assets/swift-BzpIVaGY.js +1 -0
- package/web/assets/tableSurface-CDNa0QFp.css +1 -0
- package/web/assets/tableSurface-Y_JBQsuz.js +1 -0
- package/web/assets/tcl-DVfN8rqt.js +1 -0
- package/web/assets/terminal-DIXogYJY.js +1 -0
- package/web/assets/terminalView-B3aZSsrQ.js +12 -0
- package/web/assets/terminalView-DFuMZ0ql.css +1 -0
- package/web/assets/textile-CnDTJFAw.js +1 -0
- package/web/assets/theme-DfEi_DND.css +1 -0
- package/web/assets/theme-OMpAfNto.css +1 -0
- package/web/assets/tiddlywiki-DO-Gjzrf.js +1 -0
- package/web/assets/tiki-DGYXhP31.js +1 -0
- package/web/assets/toml-Bm5Em-hy.js +1 -0
- package/web/assets/troff-wAsdV37c.js +1 -0
- package/web/assets/ttcn-CfJYG6tj.js +1 -0
- package/web/assets/ttcn-cfg-B9xdYoR4.js +1 -0
- package/web/assets/turtle-B1tBg_DP.js +1 -0
- package/web/assets/type-Cqoabh7H.js +1 -0
- package/web/assets/undo-2-tUKCv5Gs.js +1 -0
- package/web/assets/unitAccount-D8lVwaaT.js +1 -0
- package/web/assets/unitBridge-D547ublk.js +1 -0
- package/web/assets/unitCloudTransport-BVF6lVp4.js +1 -0
- package/web/assets/unitOwnerAccess-BfnEjsZb.js +1 -0
- package/web/assets/unitShim-DxetRgmP.js +5 -0
- package/web/assets/upload-BbeAsMuD.js +1 -0
- package/web/assets/userSpaces-DyyAn7vj.js +1 -0
- package/web/assets/vb-CmGdzxic.js +1 -0
- package/web/assets/vbscript-BuJXcnF6.js +1 -0
- package/web/assets/velocity-D8B20fx6.js +1 -0
- package/web/assets/verilog-C6RDOZhf.js +1 -0
- package/web/assets/vhdl-lSbBsy5d.js +1 -0
- package/web/assets/viewportLock-C4SX-9PO.js +103 -0
- package/web/assets/viewportLock-DYSe7Jsn.css +1 -0
- package/web/assets/waves-horizontal-B8ZpHQ5H.js +1 -0
- package/web/assets/webidl-ZXfAyPTL.js +1 -0
- package/web/assets/workflow-DuoVRSSX.js +1 -0
- package/web/assets/xlsx-CNerDvZX.js +105 -0
- package/web/assets/xquery-DzFWVndE.js +1 -0
- package/web/assets/yacas-BJ4BC0dw.js +1 -0
- package/web/assets/z80-Hz9HOZM7.js +1 -0
- package/web/assets/zoom-in-hr5bRpDL.js +1 -0
- package/web/excalidraw/excalidraw.css +1 -0
- package/web/excalidraw/excalidraw.js +579 -0
- package/web/excalidraw/fonts/Assistant/Assistant-Bold.woff2 +0 -0
- package/web/excalidraw/fonts/Assistant/Assistant-Medium.woff2 +0 -0
- package/web/excalidraw/fonts/Assistant/Assistant-Regular.woff2 +0 -0
- package/web/excalidraw/fonts/Assistant/Assistant-SemiBold.woff2 +0 -0
- package/web/excalidraw/fonts/Cascadia/CascadiaCode-Regular.woff2 +0 -0
- package/web/excalidraw/fonts/ComicShanns/ComicShanns-Regular-279a7b317d12eb88de06167bd672b4b4.woff2 +0 -0
- package/web/excalidraw/fonts/ComicShanns/ComicShanns-Regular-6e066e8de2ac57ea9283adb9c24d7f0c.woff2 +0 -0
- package/web/excalidraw/fonts/ComicShanns/ComicShanns-Regular-dc6a8806fa96795d7b3be5026f989a17.woff2 +0 -0
- package/web/excalidraw/fonts/ComicShanns/ComicShanns-Regular-fcb0fc02dcbee4c9846b3e2508668039.woff2 +0 -0
- package/web/excalidraw/fonts/Excalifont/Excalifont-Regular-349fac6ca4700ffec595a7150a0d1e1d.woff2 +0 -0
- package/web/excalidraw/fonts/Excalifont/Excalifont-Regular-3f2c5db56cc93c5a6873b1361d730c16.woff2 +0 -0
- package/web/excalidraw/fonts/Excalifont/Excalifont-Regular-41b173a47b57366892116a575a43e2b6.woff2 +0 -0
- package/web/excalidraw/fonts/Excalifont/Excalifont-Regular-623ccf21b21ef6b3a0d87738f77eb071.woff2 +0 -0
- package/web/excalidraw/fonts/Excalifont/Excalifont-Regular-a88b72a24fb54c9f94e3b5fdaa7481c9.woff2 +0 -0
- package/web/excalidraw/fonts/Excalifont/Excalifont-Regular-b9dcf9d2e50a1eaf42fc664b50a3fd0d.woff2 +0 -0
- package/web/excalidraw/fonts/Excalifont/Excalifont-Regular-be310b9bcd4f1a43f571c46df7809174.woff2 +0 -0
- package/web/excalidraw/fonts/Liberation/LiberationSans-Regular.woff2 +0 -0
- package/web/excalidraw/fonts/Lilita/Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYE98RXi4EwSsbg.woff2 +0 -0
- package/web/excalidraw/fonts/Lilita/Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYEF8RXi4EwQ.woff2 +0 -0
- package/web/excalidraw/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTA3j6zbXWjgevT5.woff2 +0 -0
- package/web/excalidraw/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTQ3j6zbXWjgeg.woff2 +0 -0
- package/web/excalidraw/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTk3j6zbXWjgevT5.woff2 +0 -0
- package/web/excalidraw/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTo3j6zbXWjgevT5.woff2 +0 -0
- package/web/excalidraw/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTs3j6zbXWjgevT5.woff2 +0 -0
- package/web/excalidraw/fonts/Virgil/Virgil-Regular.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-019d66dcad46dc156b162d267f981c20.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-04b718e5623574919c8b0dea5f301444.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-069e77aac84590e2e991d0a0176d34f2.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-06c77b8c66e51ed6c63ccb502dd8b8af.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-08e0dc436ad0ad61ba5558db0674d762.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-093b9ef39a46ceae95a1df18a0a3a326.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-095c169f3314805276f603a362766abd.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-09850c4077f3fffe707905872e0e2460.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-0986d134c05864f5025962eef9f994a0.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-0b5d723fdc4e249c140f0909e87d03b4.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-0f626226ba1272e832aea87bafd9720e.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-0f7fb1e0d5015bb1371343153ecf7ce3.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-0fa55a080fcd0f9dc2e0b0058b793df8.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-0facdf1ea213ba40261022f5d5ed4493.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-10a7ae9a371830a80c3d844acf1c02d7.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-112c051027b2d766c19a519f6ee1f4f7.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-11c345711937f0ba4b8f7b6b919c8440.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-12b52b58eb3df36804b9a654ec9ee194.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-13ae07ed2e272d26d59bc0691cd7117a.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-13d2887ec8ee73c43acdabc52a05af7b.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-145aa02cdd91946e67dc934e1acffe75.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-15dc6d811c9cd078f9086a740d5a1038.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-173945821411c09f70c95f98d590e697.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-1b611157cd46bb184d4fa4dae2d6a2b8.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-1e6fd68f1f3902ce48ce8c69df385622.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-1ee544f0f1dac422545c505baa788992.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-1fdc0c67ed57263a80fd108c1f6ccf24.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-203b0e569e3b14aac86a003dc3fa523e.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-20cc1bbf50e7efb442756cb605672c1f.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-20e7bf72fa05de9adf7dbcc7bf51dde6.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-21430ee05a1248901da8d0de08744d47.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-23686f7f29da6e8008c36dd3a80c83d6.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-23ad2d71b280f00b1363b95b7bea94eb.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-23f228f3999c01983860012330e4be08.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-24476a126f129212beb33f66853ea151.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-24a21c1e4449222e8d1898d69ff3a404.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-25b7f38e18f035f96cb5e547bd2bd08c.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-29cec36cd205b211da97acabaa62f055.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-2a26d20a23b00898ce82f09d2ee47c3f.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-2adbc89c11e65905393d3dfc468b9d5b.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-2b7441d46298788ac94e610ffcc709b6.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-2b77e8ebfb2367ab2662396a60e7d320.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-2cf96d082d35ea3d8106851223ad0d16.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-2d43040e86ff03ba677f6f9c04cd0805.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-2e33e8dc771ef5e1d9127d60a6b73679.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-33432927cd87d40cfe393c7482bf221f.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-353f33792a8f60dc69323ddf635a269e.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-36925dfe329a45086cbb7fc5c20d45ac.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-3717077e38f98d89eae729b6c14e56dc.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-3756e81d3e149cf6099163ee79944fec.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-395c35dd584b56b0789f58a0559beaf1.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-3c9de2ae0ea4bc91a510942dfa4be8d2.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-3cc70dbb64df5b21f1326cc24dee2195.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-3e1f8f654357353bf0e04ba5c34b5f7f.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-3e63ed8162808a9e425ed80a8bc79114.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-3eaa538115d76932653c21d8dc28f207.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-4095eb84ef3874e2600247bee0b04026.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-41521fade99856108931b4768b1b2648.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-450da755d5bcb70906e1295e559b9602.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-452225341522a7942f0f6aab1a5c91a3.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-4535823663ad81405188a528d8f2b1a2.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-4806e761d750087c2d734fc64596eaff.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-4a0fdb40036e87b40aa08dd30584cb85.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-4a38cc3e9cf104e69ba246d37f8cf135.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-4aca6a43e59aceee2166b0c7e4e85ef1.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-4bfaa8ffa64c5ee560aa2daba7c9cbd3.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-4dc6d5f188d5c96d44815cd1e81aa885.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-4ddc14ed3eb0c3e46364317dfc0144a3.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-4ee10ae43505e2e0bc62656ced49c0fa.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-4f50e5136e136527280bc902c5817561.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-51502f1206be09c565f1547c406e9558.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-51a0e808bbc8361236ac521a119758a3.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-52a84a22fd1369bffeaf21da2d6158dc.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-5330a2119a716e4e7224ed108b085dac.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-543fa46ace099a7099dad69123399400.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-544fc28abe2c5c30e62383fd4dac255f.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-54acdfc2166ad7fcbd074f75fd4a56ba.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-5572b3513ba8df57a3d5d7303ee6b11b.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-56467a5c8840c4d23a60b2f935114848.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-56a32a7689abd0326e57c10c6c069bb4.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-57862b464a55b18c7bf234ce22907d73.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-583d166e56ba0de4b77eabb47ef67839.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-5882ffa04f32584d26109137e2da4352.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-58fd02350d0bc52cf1ca3bb32ce9766e.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-5935a5775af3d5c6307ac667bd9ae74e.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-59e9ff77b0efaf684bc09274fb6908c9.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-5a1ce3117cfe90c48e8fb4a9a00f694d.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-5a45d991244d4c7140217e1e5f5ca4f4.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-5a7fac4b8b23a6e4e5ba0c9bf1756c91.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-5b0ed6971aaab9c8ad563230bd5471a7.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-5d2898fbc097a7e24c6f38d80587621e.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-603aefd23e350ba7eb124273e3c9bcf1.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-60a3089806700d379f11827ee9843b6b.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-60a41c7e1c68f22424e6d22df544bc82.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-642b26e2e5f5fb780b51b593dbc8c851.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-66493ba5a8367f2928812f446f47b56a.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-670ba603758d94268e8606f240a42e12.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-671a2c20b1eb9e4ef8a192833940e319.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-684d65f1793cac449dde5d59cb3c47fb.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-69c09cc5fa3e55c74fc4821f76909cc3.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-6ae5b42180ad70b971c91e7eefb8eba2.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-6e092f71c1e634059ada0e52abadce67.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-6f3256af8454371776bc46670d33cc65.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-6fe5c5973cc06f74b2387a631ea36b88.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-70c2eb8d64e71a42a834eb857ea9df51.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-70e811fd7994e61f408c923de6ddd078.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-7197d6fda6cba7c3874c53d6381ca239.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-72252d73220fa3cd856677888cee1635.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-72536a3d71b694a0d53dd90ddceae41e.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-726303e0774b4e678bff8c2deb6ca603.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-733171b4ffcd17ea1fe1c0ba627173bf.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-739bc1a567439c7cffcd1614644593d2.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-73e309718fd16cea44b4d54a33581811.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-7494dc504ae00ee9cd0505f990f88c5d.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-74e2263a91439c25b91d5132ce9f4d62.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-761d05e3cd968cf574166867998ef06a.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-7718fe60986d8b42b1be9c5ace5ccf25.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-774d4f764a1299da5d28ec2f2ffe0d69.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-79d494361ae093b69e74ee9dbe65bfd4.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-79f007c1c6d07557120982951ea67998.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-7a07ddc0f0c0f5f4a9bad6ee3dda66b5.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-7ab2bed91166a9dca83a5ebfbe2a7f38.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-7ccce86603f80a099ddb0cb21d4ae3e3.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-7e4bde7e9c7f84cd34d8a845e384c746.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-7e929f262f30c8ee78bf398150b1a7cd.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-7eb9fffd1aa890d07d0f88cc82e6cfe4.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-7f855356ab893b0d2b9c1c83b8116f0e.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-829615148e6357d826b9242eb7fbbd1e.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-866fa7613df6b3fd272bcfd4530c0bb9.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-87599f94b6cc129d505b375798d0d751.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-8c2f33cee3993174f7e87c28e4bf42ee.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-8d3bcabb847b56243b16afe62adaaf21.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-8de5b863cb50dfefdd07cb11c774d579.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-8e9f97f01034820170065b2921b4fb5e.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-8f476c4c99813d57cbe6eca4727388ad.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-903bb6865f3452e2fda42e3a25547bc5.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-91ddb2969bf2d31ba02ad82998d1314c.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-938d90c10ff8c20386af7f242c05d6b0.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-93fc8f28a33234bcadf1527cafabd502.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-95429962233afd82db1c27df1500a28c.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-9544732d2e62d1a429674f8ee41b5d3a.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-9592bfc861f07bcb8d75c196b370e548.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-95bfd249da4902577b4b7d76ebdd0b44.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-968cffdc8ee679da094e77ebf50f58ef.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-97f7f48ce90c9429bf32ae51469db74d.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-982b630266d87db93d2539affb1275c6.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-98f2ad84457de7f3740d9920b8fa8667.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-99a16ef6a64934d5781933dbd9c46b2e.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-9cfb2a77a4e45025105ad29a1748b90d.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-9d81066dd2b337c938df6e90380a00dc.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-9eb5a99df4e76ac3363453ac9ca288b1.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-a004ddfcb26e67bd6e678c8ed19e25ce.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-a0ca5df4258213d7fc9fce80f65ce760.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-a1f916d6039285c4ffb900cd654e418f.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-a203b91dad570bf05a58c3c3ddb529bf.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-a365e82ed54697a52f27adcea1315fe8.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-a4c34be6d42152e64b0df90bc4607f64.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-a7accba310e821da5505f71c03b76bdb.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-aa0d470430e6391eca720c7cfa44446f.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-aa5c9ca6cf4fba00433b7aa3fa10671a.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-ac9ceb44437becc3e9c4dbfebab7fc2d.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-b1220a3c61f85cc0408deedb4c5f57a2.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-b358f7a51ece39a3247942b1feabdb29.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-b57aaedfd8ebdf3931f25119dc6a5eb2.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-b5c1596551c256e0e9cf02028595b092.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-b6d128682ee29e471486354d486a1b90.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-b6fd38ca30869792244804b04bc058da.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-b7d203b051eff504ff59ddca7576b6a9.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-b96d9226ce77ec94ceca043d712182e6.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-ba3de316d63c7e339987b16f41a0b879.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-bafff7a14c27403dcc6cf1432e8ea836.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-bd77e3c7f9e0b072d96af37f73d1aa32.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-be549ab72f0719d606a5c01e2c0219b6.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-c16ed9740b85badf16e86ea782a3062f.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-c1f94158256bb1f3bf665b053d895af9.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-c40533fdf4cc57177b12803598af7e59.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-c4a687ac4f0c2766eefc9f77ed99cddf.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-c69f61a4ab18d0488c8d1fc12e7028e8.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-c8b71798409ccc126ee264a00aadcf21.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-c99eda15fc26a2941579560f76c3a5cf.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-cb17fc3db95f6d139afc9d31a8e93293.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-cbaaefaaf326668277aa24dfa93c4d28.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-cd145ce4a0ea18469358df53c207bc1b.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-cdbce89e82cc1ab53a2decbf5819278f.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-ce4884f96f11589608b76b726a755803.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-cf2cc71752631e579e35b0e423bf2638.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-cf6ff4e0f491ca0cf3038187a997b9b4.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-cfb211578629b7e8153b37240de6a9d5.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-d0cf73942fea1c74edbdf0b3011f4656.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-d2666cbed13462c5dc36fa2f15c202ca.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-d3716376641d615e2995605b29bca7b6.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-dac48066b5883d8b4551fc584f0c2a3e.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-dbea1af6dcd9860be40c3d18254338f5.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-e11567fd2accf9957cd0d3c2be937d87.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-e2ead7ea7da0437f085f42ffc05f8d13.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-e3fcf5180fd466c8915c4e8069491054.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-e480d9c614742d05f0e78f274f1e69e6.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-e4bca6cfa53e499cae0a6be4894a90e9.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-e51ef413167c6e14e0c0fdcc585f2fc9.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-e5f453bb04da18eed01675eeebd88bf8.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-e656f091b9dc4709722c9f4b84d3c797.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-ec181b795ac1fb5a50d700b6e996d745.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-ee8bae97908d5147b423f77ad0d3c1bb.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-f0f13b5c60e0af5553bd359f5513be1b.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-f2b54d4e7be0eaefe1c2c56836fa5368.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-f56414bf9bced67990def8660e306759.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-f5d079153c99a25b9be5b8583c4cc8a7.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-f6032fc06eb20480f096199713f70885.woff2 +0 -0
- package/web/excalidraw/fonts/Xiaolai/Xiaolai-Regular-f8ee5d36068a42b51d0e4a1116cfcec1.woff2 +0 -0
- package/web/fonts/LICENSE-_fontsource-variable_inter.txt +93 -0
- package/web/fonts/LICENSE-_fontsource-variable_jetbrains-mono.txt +93 -0
- package/web/fonts/LICENSE-_fontsource_lxgw-wenkai.txt +94 -0
- package/web/fonts/LICENSE-_fontsource_noto-sans-sc.txt +93 -0
- package/web/fonts/files/inter-cyrillic-ext-wght-normal.woff2 +0 -0
- package/web/fonts/files/inter-cyrillic-wght-normal.woff2 +0 -0
- package/web/fonts/files/inter-greek-ext-wght-normal.woff2 +0 -0
- package/web/fonts/files/inter-greek-wght-normal.woff2 +0 -0
- package/web/fonts/files/inter-latin-ext-wght-normal.woff2 +0 -0
- package/web/fonts/files/inter-latin-wght-normal.woff2 +0 -0
- package/web/fonts/files/inter-vietnamese-wght-normal.woff2 +0 -0
- package/web/fonts/files/jetbrains-mono-cyrillic-ext-wght-normal.woff2 +0 -0
- package/web/fonts/files/jetbrains-mono-cyrillic-wght-normal.woff2 +0 -0
- package/web/fonts/files/jetbrains-mono-greek-wght-normal.woff2 +0 -0
- package/web/fonts/files/jetbrains-mono-latin-ext-wght-normal.woff2 +0 -0
- package/web/fonts/files/jetbrains-mono-latin-wght-normal.woff2 +0 -0
- package/web/fonts/files/jetbrains-mono-vietnamese-wght-normal.woff2 +0 -0
- package/web/fonts/files/lxgw-wenkai-latin-500-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-100-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-100-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-101-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-101-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-102-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-102-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-103-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-103-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-104-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-104-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-105-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-105-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-106-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-106-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-107-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-107-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-108-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-108-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-109-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-109-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-110-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-110-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-111-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-111-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-112-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-112-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-113-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-113-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-114-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-114-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-115-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-115-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-116-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-116-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-117-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-117-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-118-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-118-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-119-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-119-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-21-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-21-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-22-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-22-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-23-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-23-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-24-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-24-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-25-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-25-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-26-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-26-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-27-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-27-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-28-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-28-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-29-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-29-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-30-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-30-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-31-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-31-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-32-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-32-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-33-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-33-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-34-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-34-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-35-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-35-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-36-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-36-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-37-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-37-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-38-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-38-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-39-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-39-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-4-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-4-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-40-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-40-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-41-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-41-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-42-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-42-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-43-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-43-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-44-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-44-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-45-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-45-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-46-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-46-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-47-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-47-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-48-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-48-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-49-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-49-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-5-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-5-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-50-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-50-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-51-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-51-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-52-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-52-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-53-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-53-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-54-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-54-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-55-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-55-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-56-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-56-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-57-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-57-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-58-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-58-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-59-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-59-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-6-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-6-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-60-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-60-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-61-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-61-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-62-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-62-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-63-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-63-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-64-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-64-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-65-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-65-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-66-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-66-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-67-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-67-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-68-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-68-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-69-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-69-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-70-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-70-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-71-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-71-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-72-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-72-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-73-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-73-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-74-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-74-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-75-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-75-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-76-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-76-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-77-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-77-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-78-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-78-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-79-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-79-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-80-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-80-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-81-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-81-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-82-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-82-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-83-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-83-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-84-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-84-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-85-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-85-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-86-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-86-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-87-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-87-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-88-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-88-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-89-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-89-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-90-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-90-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-91-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-91-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-97-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-97-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-98-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-98-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-99-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-99-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-cyrillic-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-cyrillic-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-latin-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-latin-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-latin-ext-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-latin-ext-700-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-vietnamese-400-normal.woff2 +0 -0
- package/web/fonts/files/noto-sans-sc-vietnamese-700-normal.woff2 +0 -0
- package/web/fonts/fonts.css +2163 -0
- package/web/index.html +266 -0
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./CodeView-j065KtVh.js","./index-CF4RV4mh.js","./appStore-Dg9WALEA.js","./nativeDownload-D-f1_L2S.js","./ipc-DQOD2UKk.js","./client-BSKpsyAw.js","./appStore-Di8LXuJ9.css","./create-4xUyKtAF.js","./create-BgE3edmZ.css","./docx-preview-DW4IyU_Q.js","./jszip.min-DZxV9uZ_.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{R as Ka,j as e,d as c,t as Se,r as se,u as V,_ as ht,x as Ga,E as ps,F as Ya,G as Ja,H as Qa,I as ms,J as Xa}from"./index-CF4RV4mh.js";import{Y as $e,Z as Za,_ as eo,$ as to,a0 as fs,a1 as no,a2 as so,a3 as ao,a4 as oo,N as io,a5 as ro,b as lo,V as co,W as uo,X as ho,C as po}from"./RunLocationPicker-CTYXUH2z.js";import{z as ae,a2 as Qt,i as Le,bg as gs,u as P,cd as ce,bK as vs,cj as mo,h5 as fo,jC as go,jD as Rn,jE as vo,jF as xo,jG as wo,cU as yo,da as at,iH as jo,i7 as ko,jH as Et,jI as xs,jJ as bt,jK as Tt,jL as Mt,aP as Pe,aJ as qe,jM as ws,jN as bo,cn as Rt,aF as nt,hF as ys,f4 as js,au as Ye,hA as So,hB as No,aO as Oe,fA as zo,U as Co,aQ as pt,gc as Eo,k as Ne,jO as To,gb as Mo,ga as Ro,gK as Ao,jP as Po,h0 as Io,hb as ks,jc as Do,jQ as Fo,bw as _o,hI as $o,cJ as bs,N as pn,jR as Lo,ag as ot,cp as ve,gU as mn,jS as At,eN as Ss,aG as Ns,aI as zs,S as Ke,by as qo,jT as Oo,jU as Bo,jV as Ho,am as Xt,jW as Wo,jX as An,c0 as St,cG as fn,hp as Pn,Z as Vo,jY as Uo,jZ as Ko,j_ as Go,ck as Yo,eU as Jo,j$ as Qo,b3 as Xo,dT as Zo,k0 as Cs,dR as ei,k1 as ti,Y as st,af as ni,A as si,G as ai,k2 as oi,k3 as Pt,k4 as ii,k5 as Es,k6 as ri,k7 as li,k8 as ci,k9 as di,gR as Ot,ka as In,at as yt,kb as Ts,kc as Dn,kd as ui,aB as gn,fw as vn,h as hi,ke as pi,ey as mi,kf as Fn,kg as Ms,h3 as fi,kh as Rs,eM as As,g as gi,ki as vi,kj as xi,ao as wi,ar as yi,kk as Re,fH as Ps,kl as ji,km as Zt,b8 as Is,B as Ds,kn as ki,ko as bi,cc as Si,kp as Ni,kq as zi,kr as Ci,bp as Ei,hf as en,he as Ti,hh as Bt,cH as Mi,ks as Ri,hg as Ai,kt as Pi,ku as Ii,dU as Di,kv as tn,kw as Fs,kx as _s,ky as $s,kz as Fi,kA as _i,dG as _n,dZ as $i,kB as Li,kC as qi,kD as Oi,an as Bi,jp as Hi,jn as Wi,gG as Vi,jo as Ui,jq as Ki,h8 as Gi,h7 as Yi,h4 as Ji,kE as Qi,kF as Xi,kG as Zi,bL as er,aL as tr,e as nr,bR as sr,gN as $n,kH as ar,kI as or,a7 as ir,kJ as Ln,kK as rr,kL as lr,kM as cr}from"./appStore-Dg9WALEA.js";import{D as xn}from"./create-4xUyKtAF.js";import{p as dr}from"./pdf.worker.min-CGb3BKV9.js";import{m as ur,d as hr,f as Ls,n as It,r as wn,t as qs,e as Os,C as pr,A as mr}from"./SidebarRow-BuSkKH5q.js";import{C as Nt}from"./code-xml-BALV9u_c.js";import{Z as Bs,a as Hs}from"./zoom-in-hr5bRpDL.js";import{I as fr,t as gr}from"./InlineFiles-C_hjvn3u.js";import{c as Ws,n as fe}from"./nativeDownload-D-f1_L2S.js";import{B as vr,F as Dt}from"./folder-DlxnPmWY.js";import{U as Vs}from"./undo-2-tUKCv5Gs.js";import{s as xr,S as qn,F as wr}from"./SketchCard-D87GADyG.js";import{T as yr}from"./terminal-DIXogYJY.js";import{C as Ft}from"./circle-x-D7s-M5sB.js";import{C as yn}from"./circle-question-mark-WL3vbp-Z.js";import{P as ft}from"./pencil-Cvk91P_Z.js";import{n as vt,u as nn,b as jr}from"./codeStudioStore-C2mWfm32.js";import{M as Us}from"./message-square-plus-BiAZAvcw.js";import{R as _t}from"./rotate-ccw-CUlnplr0.js";import{F as kr}from"./FloatingToc-CENybkAA.js";import{P as br}from"./MarkdownBlock-DIjYEhTK.js";import{C as Ks,h as ut}from"./RightPanel-C3OJTIqT.js";import"./pageChrome-C9_azUYW.js";import{F as Ht}from"./folder-plus-D1TDb7k9.js";import{b as Wt}from"./mdMarkStore-CsKl7C8O.js";import{c as Sr}from"./client-BSKpsyAw.js";import{A as Nr}from"./arrow-up-right-CpQs92mu.js";import{e as zr}from"./ipc-DQOD2UKk.js";const Cr=[["path",{d:"M8 3 4 7l4 4",key:"9rb6wj"}],["path",{d:"M4 7h16",key:"6tx8e3"}],["path",{d:"m16 21 4-4-4-4",key:"siv7j2"}],["path",{d:"M20 17H4",key:"h6l3hr"}]],Er=ae("arrow-left-right",Cr);const Tr=[["path",{d:"m2 2 20 20",key:"1ooewy"}],["path",{d:"M8.35 2.69A10 10 0 0 1 21.3 15.65",key:"1pfsoa"}],["path",{d:"M19.08 19.08A10 10 0 1 1 4.92 4.92",key:"1ablyi"}]],Mr=ae("circle-off",Tr);const Rr=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["line",{x1:"10",x2:"10",y1:"15",y2:"9",key:"c1nkhi"}],["line",{x1:"14",x2:"14",y1:"15",y2:"9",key:"h65svq"}]],sn=ae("circle-pause",Rr);const Ar=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["rect",{x:"9",y:"9",width:"6",height:"6",rx:"1",key:"1ssd4o"}]],Pr=ae("circle-stop",Ar);const Ir=[["path",{d:"M4 12.15V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.706.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2h-3.35",key:"1wthlu"}],["path",{d:"M14 2v5a1 1 0 0 0 1 1h5",key:"wfsgrz"}],["path",{d:"m5 16-3 3 3 3",key:"331omg"}],["path",{d:"m9 22 3-3-3-3",key:"lsp7cz"}]],Dr=ae("file-code-corner",Ir);const Fr=[["path",{d:"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z",key:"1oefj6"}],["path",{d:"M12 9v4",key:"juzpu7"}],["path",{d:"M12 17h.01",key:"p32p05"}]],Ie=ae("file-exclamation-point",Fr);const _r=[["path",{d:"M11.35 22H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.706.706l3.588 3.588A2.4 2.4 0 0 1 20 8v5.35",key:"17jvcc"}],["path",{d:"M14 2v5a1 1 0 0 0 1 1h5",key:"wfsgrz"}],["path",{d:"M14 19h6",key:"bvotb8"}],["path",{d:"M17 16v6",key:"18yu1i"}]],Vt=ae("file-plus-corner",_r);const $r=[["path",{d:"M2 9V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H20a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2v-1",key:"fm4g5t"}],["path",{d:"M2 13h10",key:"pgb2dq"}],["path",{d:"m9 16 3-3-3-3",key:"6m91ic"}]],On=ae("folder-input",$r);const Lr=[["path",{d:"M10.7 20H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H20a2 2 0 0 1 2 2v4.1",key:"1bw5m7"}],["path",{d:"m21 21-1.9-1.9",key:"1g2n9r"}],["circle",{cx:"17",cy:"17",r:"3",key:"18b49y"}]],an=ae("folder-search",Lr);const qr=[["path",{d:"M15 6a9 9 0 0 0-9 9V3",key:"1cii5b"}],["circle",{cx:"18",cy:"6",r:"3",key:"1h7g24"}],["circle",{cx:"6",cy:"18",r:"3",key:"fqmcym"}]],Or=ae("git-branch",qr);const Br=[["path",{d:"M10.3 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2v10l-3.1-3.1a2 2 0 0 0-2.814.014L6 21",key:"9csbqa"}],["path",{d:"m14 19.5 3-3 3 3",key:"9vmjn0"}],["path",{d:"M17 22v-5.5",key:"1aa6fl"}],["circle",{cx:"9",cy:"9",r:"2",key:"af1f0g"}]],Hr=ae("image-up",Br);const Wr=[["path",{d:"M8 3H5a2 2 0 0 0-2 2v3",key:"1dcmit"}],["path",{d:"M21 8V5a2 2 0 0 0-2-2h-3",key:"1e4gt3"}],["path",{d:"M3 16v3a2 2 0 0 0 2 2h3",key:"wsl5sc"}],["path",{d:"M16 21h3a2 2 0 0 0 2-2v-3",key:"18trek"}]],Gs=ae("maximize",Wr);const Vr=[["path",{d:"M2.992 16.342a2 2 0 0 1 .094 1.167l-1.065 3.29a1 1 0 0 0 1.236 1.168l3.413-.998a2 2 0 0 1 1.099.092 10 10 0 1 0-4.777-4.719",key:"1sd12s"}],["path",{d:"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3",key:"1u773s"}],["path",{d:"M12 17h.01",key:"p32p05"}]],Ur=ae("message-circle-question-mark",Vr);const Kr=[["path",{d:"m14 10 7-7",key:"oa77jy"}],["path",{d:"M20 10h-6V4",key:"mjg0md"}],["path",{d:"m3 21 7-7",key:"tjx5ai"}],["path",{d:"M4 14h6v6",key:"rmj7iw"}]],Ys=ae("minimize-2",Kr);const Gr=[["path",{d:"M18.36 6.64A9 9 0 0 1 20.77 15",key:"dxknvb"}],["path",{d:"M6.16 6.16a9 9 0 1 0 12.68 12.68",key:"1x7qb5"}],["path",{d:"M12 2v4",key:"3427ic"}],["path",{d:"m2 2 20 20",key:"1ooewy"}]],Yr=ae("power-off",Gr);const Jr=[["path",{d:"M16 3a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2 1 1 0 0 1 1 1v1a2 2 0 0 1-2 2 1 1 0 0 0-1 1v2a1 1 0 0 0 1 1 6 6 0 0 0 6-6V5a2 2 0 0 0-2-2z",key:"rib7q0"}],["path",{d:"M5 3a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2 1 1 0 0 1 1 1v1a2 2 0 0 1-2 2 1 1 0 0 0-1 1v2a1 1 0 0 0 1 1 6 6 0 0 0 6-6V5a2 2 0 0 0-2-2z",key:"1ymkrd"}]],Qr=ae("quote",Jr);const Xr=[["path",{d:"M15 12h-5",key:"r7krc0"}],["path",{d:"M15 8h-5",key:"1khuty"}],["path",{d:"M19 17V5a2 2 0 0 0-2-2H4",key:"zz82l3"}],["path",{d:"M8 21h12a2 2 0 0 0 2-2v-1a1 1 0 0 0-1-1H11a1 1 0 0 0-1 1v1a2 2 0 1 1-4 0V5a2 2 0 1 0-4 0v2a1 1 0 0 0 1 1h3",key:"1ph1d7"}]],Zr=ae("scroll-text",Xr);const el=[["path",{d:"M21 10.656V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h12.344",key:"2acyp4"}],["path",{d:"m9 11 3 3L22 4",key:"1pflzl"}]],tl=ae("square-check-big",el);const nl=[["path",{d:"M3 5h18",key:"1u36vt"}],["path",{d:"M3 12h18",key:"1i2n21"}],["path",{d:"M3 19h18",key:"awlh7x"}]],Js=ae("text-align-justify",nl);const sl=[["path",{d:"m16 16-3 3 3 3",key:"117b85"}],["path",{d:"M3 12h14.5a1 1 0 0 1 0 7H13",key:"18xa6z"}],["path",{d:"M3 19h6",key:"1ygdsz"}],["path",{d:"M3 5h18",key:"1u36vt"}]],Qs=ae("text-wrap",sl);const al=[["line",{x1:"10",x2:"14",y1:"2",y2:"2",key:"14vaq8"}],["line",{x1:"12",x2:"15",y1:"14",y2:"11",key:"17fdiu"}],["circle",{cx:"12",cy:"14",r:"8",key:"1e1u0o"}]],ol=ae("timer",al);const il=[["path",{d:"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3",key:"wmoenq"}],["path",{d:"M12 9v4",key:"juzpu7"}],["path",{d:"M12 17h.01",key:"p32p05"}]],Xs=ae("triangle-alert",il);const rl=[["path",{d:"M11 4.702a.705.705 0 0 0-1.203-.498L6.413 7.587A1.4 1.4 0 0 1 5.416 8H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2.416a1.4 1.4 0 0 1 .997.413l3.383 3.384A.705.705 0 0 0 11 19.298z",key:"uqj9uw"}],["path",{d:"M16 9a5 5 0 0 1 0 6",key:"1q6k2b"}],["path",{d:"M19.364 18.364a9 9 0 0 0 0-12.728",key:"ijwkga"}]],ll=ae("volume-2",rl);const cl=[["path",{d:"M12 20h.01",key:"zekei9"}],["path",{d:"M8.5 16.429a5 5 0 0 1 7 0",key:"1bycff"}],["path",{d:"M5 12.859a10 10 0 0 1 5.17-2.69",key:"1dl1wf"}],["path",{d:"M19 12.859a10 10 0 0 0-2.007-1.523",key:"4k23kn"}],["path",{d:"M2 8.82a15 15 0 0 1 4.177-2.643",key:"1grhjp"}],["path",{d:"M22 8.82a15 15 0 0 0-11.288-3.764",key:"z3jwby"}],["path",{d:"m2 2 20 20",key:"1ooewy"}]],on=ae("wifi-off",cl);class dl extends Ka.Component{state={error:null};static getDerivedStateFromError(n){return{error:n}}componentDidCatch(n,s){console.error("[tangu] render crash:",n,s?.componentStack)}render(){const{error:n}=this.state;if(!n)return this.props.children;const s=(document.documentElement.lang||"").startsWith("zh"),a=`${n.message}
|
|
3
|
+
|
|
4
|
+
${n.stack||""}`.trim();return e.jsxs("div",{"data-error-boundary":!0,style:{padding:24,maxWidth:720,margin:"0 auto",overflow:"auto",height:"100%",boxSizing:"border-box"},children:[e.jsx("h3",{style:{margin:"8px 0"},children:s?"界面渲染出错":"Something broke while rendering"}),e.jsx("p",{style:{opacity:.8,fontSize:"var(--ui-font-body, 13px)",margin:"4px 0 12px"},children:s?"这一部分崩溃了。可重试、或切换/新建会话避开它;请把下面的错误发给开发者。":"This view crashed. Retry, or switch/start a new chat to avoid it; send the error below to the developer."}),e.jsx("pre",{style:{whiteSpace:"pre-wrap",fontSize:12,background:"var(--danger-light)",color:"var(--danger)",padding:12,borderRadius:8,maxHeight:280,overflow:"auto"},children:a}),e.jsxs("div",{style:{display:"flex",gap:8,marginTop:12},children:[e.jsx("button",{style:{padding:"6px 12px"},onClick:()=>this.setState({error:null}),children:s?"重试":"Retry"}),e.jsx("button",{style:{padding:"6px 12px"},onClick:()=>{try{navigator.clipboard.writeText(a)}catch{}},children:s?"复制错误":"Copy error"}),e.jsx("button",{style:{padding:"6px 12px"},onClick:()=>location.reload(),children:s?"重新加载":"Reload"})]})]})}}function ul(t,n){Qt("agents"),Le.getState().openView("agent-profile",{reuseKey:"primary",agentSlug:t,creating:!1,...n?{section:n,sectionAt:Date.now()}:{}},"main")}const jn="forsion_chat_wait_details",rn="forsion:chat-wait-details";function hl(){try{return localStorage.getItem(jn)==="1"}catch{return!1}}function cu(t){try{localStorage.setItem(jn,t?"1":"0")}catch{}try{window.dispatchEvent(new Event(rn))}catch{}}function pl(t){if(typeof window>"u")return()=>{};const n=s=>{s.key===jn&&t()};return window.addEventListener(rn,t),window.addEventListener("storage",n),()=>{window.removeEventListener(rn,t),window.removeEventListener("storage",n)}}function ml(){return c.useSyncExternalStore(pl,hl,()=>!1)}const kn="forsion_chat_avatars";function fl(){try{return localStorage.getItem(kn)!=="0"}catch{return!0}}function ln(){fl()?delete document.documentElement.dataset.chatAvatars:document.documentElement.dataset.chatAvatars="off"}function du(t){try{localStorage.setItem(kn,t?"1":"0")}catch{}ln()}typeof document<"u"&&(ln(),window.addEventListener("storage",t=>{t.key===kn&&ln()}));se({"btw.title":{zh:"顺便问",en:"By the way"},"btw.windowTitle":{zh:"顺便问 · {title}",en:"By the way · {title}"},"btw.context":{zh:"当前对话",en:"Conversation"},"btw.hint":{zh:"带着本会话上下文提问,不会加入对话,也不打断正在跑的任务",en:"Uses this conversation as context. Not added to it, and never interrupts a running task."},"btw.empty":{zh:"问点与当前对话有关的事:概念、代码、刚才那步为什么这么做……",en:"Ask about anything in this conversation: a concept, some code, why a step was taken…"},"btw.placeholder":{zh:"顺便问点什么…",en:"Ask a side question…"},"btw.defaultQuestion":{zh:"解释一下这段",en:"Explain this"},"btw.send":{zh:"发送",en:"Send"},"btw.stop":{zh:"停止",en:"Stop"},"btw.clear":{zh:"清空旁聊",en:"Clear side chat"},"btw.copy":{zh:"复制",en:"Copy"},"btw.copied":{zh:"已复制",en:"Copied"},"btw.quoteToChat":{zh:"引用到对话",en:"Quote in chat"},"btw.quoted":{zh:"已引用到输入框",en:"Quoted in the chat box"},"btw.removeQuote":{zh:"移除引用",en:"Remove quote"},"btw.thinking":{zh:"思考中…",en:"Thinking…"},"btw.stopped":{zh:"已停止",en:"Stopped"},"btw.noTools":{zh:"旁聊不能用工具,上面提到的操作都没有执行。",en:"Side chats have no tools. Nothing mentioned above was run."},"btw.errCut":{zh:"连接中断,回答不完整",en:"The connection dropped before the answer finished"},"btw.errUnsupported":{zh:"当前引擎还不支持旁聊,请更新 Forsion",en:"This engine does not support side questions yet. Update Forsion."},"btw.close":{zh:"关闭",en:"Close"},"btw.selectionAction":{zh:"顺便问",en:"Ask aside"},"btw.cmd":{zh:"顺便问(旁聊)",en:"Ask a side question"}});const He=new Map,Bn=new Set;let gl=0;function uu(t){return Bn.has(t.nonce)?!1:(Bn.add(t.nonce),!0)}function hu(t,n){return!!t&&(!t.scope||t.scope===n)}function pu(t){const n=o=>typeof t?.[o]=="string"&&t[o]?t[o]:void 0,s=n("sessionId"),a=n("nonce");return s&&a?{sessionId:s,nonce:a,scope:n("scope"),title:n("title"),quote:n("quote"),question:n("question"),modelId:n("modelId")}:null}const vl=Ws((t,n)=>({threads:{},webOpen:null,ask:async(s,a,o,i)=>{if(!a.trim()||He.has(s))return;const r=n().threads[s]||[],d=`btw-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,7)}`,p=g=>t(w=>({threads:{...w.threads,[s]:(w.threads[s]||[]).map(x=>x.id===d?{...x,...g(x)}:x)}}));t(g=>({threads:{...g.threads,[s]:[...r,{id:d,question:a,quote:o,answer:"",status:"streaming"}]}}));const f=new AbortController;He.set(s,f);const m=r.filter(g=>g.status==="done"&&g.answer).slice(-20).map(g=>({question:g.question,quote:g.quote,answer:g.answer}));try{await xl(s,{question:a,quote:o,thread:m,model_id:i||void 0},g=>{g.type==="delta"?p(w=>({answer:w.answer+String(g.text??"")})):g.type==="done"?p(w=>({answer:String(g.content||w.answer),status:"done",toolCallText:!!g.toolCallText})):g.type==="error"&&p(()=>({status:"error",error:Hn(String(g.error||""))}))},f.signal),p(g=>g.status==="streaming"?{status:"error",error:Se("btw.errCut")}:{})}catch(g){p(w=>w.status!=="streaming"?{}:f.signal.aborted?{status:"stopped"}:{status:"error",error:Hn(String(g?.message||g))})}finally{He.get(s)===f&&He.delete(s)}},stop:s=>He.get(s)?.abort(),clear:s=>{He.get(s)?.abort(),He.delete(s),t(a=>({threads:{...a.threads,[s]:[]}}))},closeWeb:()=>t({webOpen:null})})),Hn=t=>/token_quota_exceeded/i.test(t)?Se("chat.err.quota"):t;async function xl(t,n,s,a){const o=ce(t);let i;try{i=await vs(o,`/agent/sessions/${encodeURIComponent(t)}/aside`,{method:"POST",signal:a,body:JSON.stringify({...n,app_id:fo,client:mo()})})}catch(f){if(o.via==="unit"&&!a.aborted){const m=go(f);throw new Error(Rn(o,m,f?.code)||String(f?.message||f))}throw f}if(!i.ok||!i.body){const f=await i.text().catch(()=>"");let m="",g,w=null;try{w=JSON.parse(f),m=String(w?.detail||"");const x=w?.code;g=typeof x=="string"?x:void 0}catch{}if(o.via==="unit"){const x=vo(i.status,{code:g});xo(o.key,x,wo(w));const N=Rn(o,x,g,w);if(N&&x!=="fatal")throw new Error(N)}throw new Error(m||(i.status===404?Se("btw.errUnsupported"):`HTTP ${i.status}`))}const r=i.body.getReader(),d=new TextDecoder;let p="";for(;;){const{done:f,value:m}=await r.read();if(f)break;p+=d.decode(m,{stream:!0});const g=p.split(`
|
|
5
|
+
`);p=g.pop()||"";for(const w of g)if(w.startsWith("data:"))try{s(JSON.parse(w.slice(5)))}catch{}}}function Wn(t){const n=gs()==="main"?P.getState().activeId:null,s={...t,title:t.title||void 0,scope:n,nonce:`${Date.now().toString(36)}-${++gl}`},a=window.tangu;if(a?.openFloatingPanel){a.openFloatingPanel({id:`btw:${t.sessionId}`,title:Se("btw.windowTitle",{title:t.title||Se("btw.title")}),builtin:"btw",params:{...s},...n?{sessionId:n}:{}});return}vl.setState({webOpen:s})}function mu(t){const n=t.trim().slice(0,2e4);if(!n)return;if(gs()!=="main"&&window.tangu?.requestMainAction){window.tangu.requestMainAction("chat-quote",n);return}const s=Le.getState(),a=s.rightVisible&&s.rightTabs.some(o=>o.type==="chat-panel"&&o.active);P.getState().setPendingChatQuote(a?"chat-panel":"chat",n),a||s.openView("chat",{followActive:!0,reuseKey:"primary"},"main")}const Zs="forsion.noteRemind.fired",wl=168*36e5,yl=24*36e5;function jl(){try{const t=JSON.parse(localStorage.getItem(Zs)||"{}"),n=Date.now();return Object.fromEntries(Object.entries(t).filter(([,s])=>n-s<wl))}catch{return{}}}const ea=(t,n)=>`${t}|${n.path}|${n.remind}|${n.text}`;function kl(t,n,s,a){return t.filter(o=>{if(!o.remind)return!1;const i=ko(o.remind.split("/")[0]).getTime();return i<=n&&n-i<yl&&!s[ea(a,o)]})}function bl(t,n){const s=n?t.filter(o=>o.action==="harness_candidates"&&!n.has(o.id)):[],a=new Set(n??[]);for(const o of t)a.add(o.id);return{fresh:s,seen:a}}const Ce=(t,n)=>P.getState().tr(t,n);let Vn=!1;function fu(){if(Vn)return;Vn=!0;const t={};window.amadeusSync?.onStatus?.(r=>{const d=r,p=d.binding?`entry:${d.binding}`:`mirror:${d.side??"own"}`,f=t[p];t[p]=d.state,!(!d.enabled||f===d.state)&&(d.state==="error"||d.state==="auth-required"?fe({event:"sync.error",level:"error",text:Ce("ntf.syncError",{e:d.error?yo(d.error):d.state}),dedupeKey:`sync.error:${p}`}):f==="syncing"&&d.state==="idle"&&fe({event:"sync.doneOnline",level:"success",text:Ce("ntf.syncDone"),dedupeKey:"sync.done"}))});let n=!1;window.remoteSync?.onStatus?.(r=>{if(n&&!r.running&&r.lastReport){const d=r.lastReport;if(!d.ok||d.errors?.length)fe({event:"sync.error",level:"error",text:Ce("ntf.remoteSyncFail",{e:d.errors?.[0]||""}),dedupeKey:"remotesync.error"});else{d.conflicts>0&&fe({event:"sync.error",level:"warning",text:Ce("ntf.remoteSyncConflicts",{n:d.conflicts}),dedupeKey:"remotesync.conflict"}),d.pendingDeletions>0&&fe({event:"sync.error",level:"warning",text:Ce("ntf.remoteSyncPendingDel",{n:d.pendingDeletions}),dedupeKey:"remotesync.pendingDel",action:{label:Ce("ntf.actionReview"),run:()=>P.getState().openSettings("sync")}});const p=d.pushed+d.pulled+d.deletedLocal+d.deletedRemote;p>0&&fe({event:"sync.done",level:"success",text:Ce("ntf.remoteSyncDone",{n:p}),dedupeKey:"remotesync.done"})}}n=r.running});let s=P.getState().runningBySession;P.subscribe(r=>{if(r.runningBySession===s)return;const d=s;s=r.runningBySession;for(const p of Object.keys(d)){if(r.runningBySession[p]||p===r.activeId)continue;const m=[...r.messagesBySession[p]||[]].reverse().find(x=>x.role==="assistant");if(m?.status!=="done"&&m?.status!=="error")continue;const g=m.status==="error",w=r.sessions.find(x=>x.id===p)||r.archivedSessions.find(x=>x.id===p);fe({event:"agent.done",level:g?"error":"success",text:Ce(g?"ntf.agentFail":"ntf.agentDone",{name:w?.title||"Agent"})})}});let a=jl();const o=()=>{const r=Date.now(),d=at.getState().vaultRoot??"";for(const p of kl(Wt.getState().marks,r,a,d)){a={...a,[ea(d,p)]:r};try{localStorage.setItem(Zs,JSON.stringify(a))}catch{}fe({event:"note.reminder",level:"info",sticky:!0,title:Ce("ntf.noteReminder",{src:p.title}),text:p.text,action:{label:Ce("ntf.view"),run:()=>{jo(p.path,p.heading)}}})}},i=async()=>{await Wt.getState().load(),o()};Wt.subscribe(o),i(),setInterval(()=>{i()},6e4)}const Sl=zo(()=>ht(()=>import("./CodeView-j065KtVh.js").then(t=>t.K),__vite__mapDeps([0,1,2,3,4,5,6,7,8]),import.meta.url)),ta=({path:t,text:n,title:s,nonce:a})=>{const o=!!(t?window.tangu?.codePreviewServePath:window.tangu?.codePreviewServeHtml),[i,r]=c.useState(null),[d,p]=c.useState(!1);if(c.useEffect(()=>{if(!o)return;let f=!1;return p(!1),r(null),(t?window.tangu.codePreviewServePath(t):window.tangu.codePreviewServeHtml(n)).then(g=>{f||r(g.url)}).catch(()=>{f||p(!0)}),()=>{f=!0}},[t,o,t?"":n]),o&&!d){if(!i)return e.jsx("div",{className:"wsfile-frame"});const f=a?`${i}?n=${a}`:i;return e.jsx(So,{className:"wsfile-frame",src:f,partition:No,allowpopups:"true",style:{display:"flex",background:"#fff"}},`${i}#${a}`)}return e.jsx("iframe",{className:"wsfile-frame",srcDoc:n,sandbox:"allow-scripts allow-popups allow-forms allow-modals",title:s},a)},na=new Set(["html","code","markdown","csv","json","text","diff"]),sa=new Set(["image","video","audio"]),et=500,Nl={type:"spring",stiffness:300,damping:26,mass:.9},cn=t=>Math.min(8,Math.max(.1,t)),Ge=()=>e.jsx("div",{className:"wsfile-center",children:e.jsx(Oe,{size:20,className:"spin"})});function zl(t){return t.replace(/</g,"<").replace(/>/g,">").replace(/"/g,'"').replace(/'|'/g,"'").replace(/&/g,"&")}const ge=t=>e.jsx("div",{className:"wsfile-cmwrap",children:e.jsx(c.Suspense,{fallback:e.jsx(Ge,{}),children:e.jsx(Sl,{...t})})}),$t=({t,download:n})=>e.jsxs("div",{className:"wsfile-center wsfile-fallback",children:[e.jsx(Ie,{size:26}),e.jsx("div",{children:t("preview.loadFailed")}),n&&e.jsxs("button",{className:"btn ghost sm",onClick:n,children:[e.jsx(Pe,{size:13})," ",t("preview.download")]})]}),aa=({src:t,alt:n,view:s,setView:a})=>{const o=c.useRef(null);return e.jsx("div",{className:"wsfile-imgwrap",onWheel:i=>{const r=i.currentTarget.getBoundingClientRect(),d=i.clientX-r.left-r.width/2,p=i.clientY-r.top-r.height/2,f=i.deltaY<0?1.12:1/1.12;a(m=>{const g=cn(m.s*f),w=g/m.s;return{s:g,x:d-(d-m.x)*w,y:p-(p-m.y)*w}})},onPointerDown:i=>{o.current={x:i.clientX,y:i.clientY,sx:s.x,sy:s.y},i.currentTarget.setPointerCapture(i.pointerId)},onPointerMove:i=>{const r=o.current;r&&a(d=>({...d,x:r.sx+(i.clientX-r.x),y:r.sy+(i.clientY-r.y)}))},onPointerUp:()=>{o.current=null},onDoubleClick:()=>a({s:1,x:0,y:0}),children:e.jsx("img",{src:t,alt:n,draggable:!1,style:{transform:`translate(${s.x}px, ${s.y}px) scale(${s.s})`}})})},oa=({bytes:t,download:n})=>{const{t:s}=V(),a=c.useRef(null),[o,i]=c.useState(!1),[r,d]=c.useState(!0);return c.useEffect(()=>{let p=!1;return i(!1),d(!0),(async()=>{try{const f=await ht(()=>import("./docx-preview-DW4IyU_Q.js"),__vite__mapDeps([9,10,1]),import.meta.url);if(p||!a.current)return;a.current.innerHTML="",await f.renderAsync(t,a.current,void 0,{className:"docx",inWrapper:!0,breakPages:!0,ignoreLastRenderedPageBreak:!0}),p||d(!1)}catch{p||(i(!0),d(!1))}})(),()=>{p=!0}},[t]),o?e.jsx($t,{t:s,download:n}):e.jsxs("div",{className:"wsfile-doc wsfile-docx",children:[e.jsx("div",{ref:a}),r&&e.jsx(Ge,{})]})},Cl=100,ia=({bytes:t,download:n})=>{const{t:s}=V(),a=c.useRef(null),[o,i]=c.useState(!1),[r,d]=c.useState(!0),[p,f]=c.useState(null);return c.useEffect(()=>{let m=!1,g=null;return i(!1),d(!0),f(null),(async()=>{try{const w=await ht(()=>import("./pdf-C2_sJa3b.js"),[],import.meta.url);if(w.GlobalWorkerOptions.workerSrc=dr,g=await w.getDocument({data:t.slice()}).promise,m||!a.current)return;a.current.innerHTML="";const x=Math.min(window.devicePixelRatio||1,2),N=Math.min(g.numPages,Cl);for(let b=1;b<=N&&!m;b++){const j=await g.getPage(b),T=j.getViewport({scale:1.3*x}),u=document.createElement("canvas");u.className="wsfile-pdf-page",u.width=T.width,u.height=T.height,u.style.width=`${T.width/x}px`,a.current?.appendChild(u),await j.render({canvasContext:u.getContext("2d"),viewport:T}).promise}m||(d(!1),g.numPages>N&&f({shown:N,total:g.numPages}))}catch{m||(i(!0),d(!1))}})(),()=>{if(m=!0,g)try{g.destroy()}catch{}}},[t]),o?e.jsx($t,{t:s,download:n}):e.jsxs("div",{className:"wsfile-doc wsfile-pdf",children:[e.jsx("div",{ref:a}),r&&e.jsx(Ge,{}),p&&e.jsx("div",{className:"panel-note",children:s("preview.pdfPages",{n:String(p.shown),total:String(p.total)})})]})};async function ra(t,n){if(n==="xlsx"){const p=await ht(()=>import("./xlsx-CNerDvZX.js"),[],import.meta.url),f=p.read?p:p.default,m=f.read(t,{type:"array"});return{kind:"xlsx",sheets:m.SheetNames.map(g=>({name:g,html:f.utils.sheet_to_html(m.Sheets[g])}))}}const s=await ht(()=>import("./jszip.min-DZxV9uZ_.js").then(p=>p.j),__vite__mapDeps([10,1]),import.meta.url),o=await(s.loadAsync?s:s.default??s).loadAsync(t),i=p=>parseInt(p.match(/(\d+)\.xml$/)?.[1]||"0",10),r=Object.keys(o.files).filter(p=>/^ppt\/slides\/slide\d+\.xml$/.test(p)).sort((p,f)=>i(p)-i(f)),d=[];for(const p of r){const f=await o.files[p].async("text");d.push([...f.matchAll(/<a:t>([^<]*)<\/a:t>/g)].map(m=>zl(m[1])).join(`
|
|
6
|
+
`))}return{kind:"pptx",slides:d}}const El=({target:t,onClose:n})=>{const{t:s}=V(),[a,o]=c.useState(!0),[i,r]=c.useState(null),[d,p]=c.useState(null),[f,m]=c.useState(null),[g,w]=c.useState(null),[x,N]=c.useState(!1),[b,j]=c.useState("preview"),[T,u]=c.useState(0),[$,k]=c.useState(!1),[C,y]=c.useState(!0),[h,S]=c.useState({s:1,x:0,y:0}),H=Et(d?.mimeType||"",t.name),G=xs(t.name),O=d?bt(d.mimeType,t.name):"binary";c.useEffect(()=>{let D=!1,B=null;return o(!0),r(null),p(null),m(null),w(null),j("preview"),S({s:1,x:0,y:0}),(async()=>{try{const X=await t.load();if(D)return;if(!X){r("not-found"),o(!1);return}if("tooLarge"in X){m(X.size),o(!1);return}if(sa.has(bt(X.mimeType,t.name))){const Z=Tt(t.name)||X.mimeType||"application/octet-stream";B=URL.createObjectURL(new Blob([X.bytes],{type:Z})),w(B)}p(X),o(!1)}catch(X){D||(r(X?.message||"error"),o(!1))}})(),()=>{D=!0,B&&URL.revokeObjectURL(B)}},[t]),c.useEffect(()=>{const D=B=>{B.key==="Escape"&&(x?N(!1):n())};return window.addEventListener("keydown",D),()=>window.removeEventListener("keydown",D)},[x,n]);const K=c.useMemo(()=>d&&na.has(O)?new TextDecoder("utf-8",{fatal:!1}).decode(d.bytes):"",[d,O]),[I,L]=c.useState(null),[z,F]=c.useState(!1),[W,te]=c.useState(0);c.useEffect(()=>{if(!d||O!=="xlsx"&&O!=="pptx"){L(null),F(!1);return}let D=!1;return L(null),F(!1),te(0),ra(d.bytes,O).then(B=>{D||L(B)}).catch(()=>{D||F(!0)}),()=>{D=!0}},[d,O]);const oe=()=>{if(z)return e.jsx($t,{t:s,download:t.download});if(!I)return e.jsx(Ge,{});if(I.kind==="xlsx"){const D=I.sheets[W]??I.sheets[0];return e.jsxs("div",{className:"wsfile-sheetwrap",children:[I.sheets.length>1&&e.jsx("div",{className:"wsfile-seg wsfile-sheet-tabs",children:I.sheets.map((B,X)=>e.jsx("button",{className:X===W?"active":"",onClick:()=>te(X),children:B.name},X))}),e.jsx("div",{className:"wsfile-doc wsfile-sheet",dangerouslySetInnerHTML:{__html:D?.html??""}})]})}return e.jsx("div",{className:"wsfile-doc wsfile-pptx",children:I.slides.map((D,B)=>{const X=D.split(`
|
|
7
|
+
`);return e.jsxs("div",{className:"wsfile-slide",children:[e.jsx("div",{className:"wsfile-slide-no",children:s("preview.slide",{n:String(B+1)})}),X[0]&&e.jsx("div",{className:"wsfile-slide-title",children:X[0]}),e.jsx("pre",{children:X.slice(1).join(`
|
|
8
|
+
`)||(X[0]?"":"—")})]},B)})})};let Q;if(a)Q=e.jsx(Ge,{});else if(f!==null)Q=e.jsxs("div",{className:"wsfile-center wsfile-fallback",children:[e.jsx(Ie,{size:26}),e.jsx("div",{children:s("preview.tooLarge",{size:Mt(f)})}),t.download&&e.jsxs("button",{className:"btn ghost sm",onClick:t.download,children:[e.jsx(Pe,{size:13})," ",s("preview.download")]})]});else if(i||!d)Q=e.jsxs("div",{className:"wsfile-center wsfile-fallback",children:[e.jsx(Ie,{size:26}),e.jsx("div",{children:s(i==="not-found"?"preview.notFound":"preview.loadFailed")}),t.download&&e.jsxs("button",{className:"btn ghost sm",onClick:t.download,children:[e.jsx(Pe,{size:13})," ",s("preview.download")]})]});else if(O==="image")Q=g?e.jsx(aa,{src:g,alt:t.name,view:h,setView:S}):null;else if(O==="pdf")Q=e.jsx(ia,{bytes:d.bytes,download:t.download});else if(O==="video")Q=e.jsx("div",{className:"wsfile-media",children:g&&e.jsx("video",{src:g,controls:!0})});else if(O==="audio")Q=e.jsx("div",{className:"wsfile-media wsfile-audio",children:g&&e.jsx("audio",{src:g,controls:!0})});else if(O==="markdown")Q=b==="preview"?e.jsx("div",{className:"wsfile-doc msg-content",children:e.jsx(qe,{content:K})}):ge({value:K,fileName:t.name,wrap:$});else if(O==="json"){let D=K;try{D=JSON.stringify(JSON.parse(K),null,2)}catch{}Q=ge({value:D,fileName:"x.json",language:"json",wrap:$})}else if(O==="code")Q=ge({value:K,fileName:t.name,wrap:$});else if(O==="text")Q=ge({value:K,fileName:t.name,wrap:$});else if(O==="diff")Q=e.jsx(xn,{text:K,side:C});else if(O==="csv"){const D=ws(K,G==="tsv"?" ":","),B=D.slice(0,et),X=B[0]??[];Q=e.jsxs("div",{className:"wsfile-doc",children:[e.jsxs("table",{className:"wsfile-table",children:[e.jsx("thead",{children:e.jsx("tr",{children:X.map((Z,re)=>e.jsx("th",{children:Z},re))})}),e.jsx("tbody",{children:B.slice(1).map((Z,re)=>e.jsx("tr",{children:X.map((xe,q)=>e.jsx("td",{children:Z[q]??""},q))},re))})]}),D.length>et&&e.jsx("div",{className:"panel-note",children:s("preview.csvTruncated",{shown:String(et),total:String(D.length)})})]})}else O==="html"?Q=b==="preview"?e.jsx(ta,{path:t.path,text:K,title:t.name,nonce:T}):ge({value:K,language:"html",wrap:$}):O==="docx"?Q=e.jsx(oa,{bytes:d.bytes,download:t.download}):O==="xlsx"||O==="pptx"?Q=oe():Q=e.jsxs("div",{className:"wsfile-center wsfile-fallback",children:[e.jsx(Ie,{size:26}),e.jsx("div",{children:s("preview.notAvailable")}),t.download&&e.jsxs("button",{className:"btn ghost sm",onClick:t.download,children:[e.jsx(Pe,{size:13})," ",s("preview.download")]})]});const A=!a&&!i&&f===null&&!!d,Y=O==="markdown"||O==="html",J=O==="code"||O==="json"||O==="text"||Y&&b==="source";return e.jsx(ur.div,{className:"wsfile-overlay",initial:{opacity:0,y:24,scale:.92},animate:{opacity:1,y:0,scale:1},exit:{opacity:0,y:16,scale:.94},transition:Nl,style:{transformOrigin:"bottom center"},children:e.jsxs("div",{className:`wsfile-panel${x?" expanded":""}${O==="html"&&b==="preview"&&A?" fill":""}`,children:[e.jsxs("div",{className:"wsfile-head",children:[e.jsx(H,{size:14,className:"wsfile-head-icon"}),e.jsxs("div",{className:"wsfile-title",title:t.name,children:[e.jsx("span",{className:"wsfile-name",children:bo(t.name)}),G&&e.jsx("span",{className:"wsfile-ext",children:G})]}),A&&Y&&e.jsxs("div",{className:"wsfile-seg",children:[e.jsx("button",{className:b==="preview"?"active":"",title:s("preview.htmlPreview"),onClick:()=>j("preview"),children:e.jsx(Rt,{size:13})}),e.jsx("button",{className:b==="source"?"active":"",title:s("preview.htmlCode"),onClick:()=>j("source"),children:e.jsx(Nt,{size:13})}),O==="html"&&b==="preview"&&e.jsx("button",{title:s("preview.reload"),onClick:()=>u(D=>D+1),children:e.jsx(nt,{size:12})})]}),A&&O==="diff"&&e.jsxs("div",{className:"wsfile-seg",children:[e.jsx("button",{className:C?"active":"",title:s("preview.diffSideBySide"),onClick:()=>y(!0),children:e.jsx(ys,{size:13})}),e.jsx("button",{className:C?"":"active",title:s("preview.diffLineByLine"),onClick:()=>y(!1),children:e.jsx(Js,{size:13})})]}),A&&J&&e.jsx("button",{className:`icon-btn${$?" active":""}`,title:s("preview.wrap"),onClick:()=>k(D=>!D),children:e.jsx(Qs,{size:14})}),A&&O==="image"&&e.jsxs(e.Fragment,{children:[e.jsx("button",{className:"icon-btn",title:s("preview.zoomOut"),onClick:()=>S(D=>({...D,s:cn(D.s*.8)})),children:e.jsx(Bs,{size:14})}),e.jsx("button",{className:"icon-btn",title:s("preview.zoomIn"),onClick:()=>S(D=>({...D,s:cn(D.s*1.25)})),children:e.jsx(Hs,{size:14})}),e.jsx("button",{className:"icon-btn",title:s("preview.fit"),onClick:()=>S({s:1,x:0,y:0}),children:e.jsx(Gs,{size:14})})]}),t.download&&e.jsx("button",{className:"icon-btn",title:s("preview.download"),onClick:t.download,children:e.jsx(Pe,{size:14})}),e.jsx("button",{className:"icon-btn",title:s(x?"preview.collapse":"preview.expand"),onClick:()=>N(D=>!D),children:x?e.jsx(Ys,{size:14}):e.jsx(js,{size:14})}),e.jsx("button",{className:"icon-btn",title:s("preview.close"),onClick:n,children:e.jsx(Ye,{size:15})})]}),e.jsx("div",{className:"wsfile-body",children:Q})]})})};se({"team.editor.titleNew":{zh:"新建团队",en:"New team"},"team.editor.titleEdit":{zh:"编辑团队",en:"Edit team"},"team.editor.name":{zh:"团队名称(可空)",en:"Team name (optional)"},"team.editor.namePlaceholder":{zh:"留空 = 按成员名自动命名",en:"Leave empty to name it after the members"},"team.editor.avatar":{zh:"团队头像",en:"Team avatar"},"team.editor.avatarImage":{zh:"上传图片",en:"Upload image"},"team.editor.avatarRemove":{zh:"移除图片",en:"Remove image"},"team.editor.avatarEmoji":{zh:"Emoji 标识",en:"Emoji emblem"},"team.editor.avatarHint":{zh:"支持 PNG、JPEG、GIF、WebP(不超过 1 MB);也可使用 Emoji,留空显示成员组合头像。",en:"PNG, JPEG, GIF or WebP up to 1 MB. You can also use an emoji, or leave it empty for the member avatar stack."},"team.editor.avatarTooLarge":{zh:"头像不能超过 1 MB",en:"The avatar must be no larger than 1 MB"},"team.editor.avatarReadFailed":{zh:"读取团队头像失败",en:"Could not read the team avatar"},"team.editor.members":{zh:"成员(勾选顺序 = 发言顺序)",en:"Members (pick order = speaking order)"},"team.editor.rolePlaceholder":{zh:"角色 / 分工(可选)",en:"Role (optional)"},"team.editor.doc":{zh:"TEAM.md(团队约定,模型读取,建议英文)",en:"TEAM.md (team charter read by the models; English recommended)"},"team.editor.docPlaceholder":{zh:`# Team
|
|
9
|
+
## Mission
|
|
10
|
+
## Roles
|
|
11
|
+
## Workflow
|
|
12
|
+
## Protocol`,en:`# Team
|
|
13
|
+
## Mission
|
|
14
|
+
## Roles
|
|
15
|
+
## Workflow
|
|
16
|
+
## Protocol`},"team.editor.needTwo":{zh:"至少选择 2 名在册成员",en:"Pick at least 2 members that still exist"},"team.editor.missing":{zh:"已不存在",en:"missing"},"team.editor.save":{zh:"保存",en:"Save"},"team.editor.create":{zh:"创建团队",en:"Create team"},"team.editor.cancel":{zh:"取消",en:"Cancel"},"team.editor.saved":{zh:"团队已保存",en:"Team saved"},"team.editor.failed":{zh:"保存失败:{e}",en:"Save failed: {e}"}});const Tl=({agents:t,team:n,initialMembers:s,onSaved:a,onClose:o})=>{const{t:i}=V(),r=c.useMemo(()=>t.filter(z=>z.createdBy!=="system"),[t]),d=c.useMemo(()=>new Set(r.map(z=>z.slug)),[r]),[p,f]=c.useState(n?.name||""),[m,g]=c.useState(n?.avatar||""),[w,x]=c.useState(null),[N,b]=c.useState(!1),[j,T]=c.useState(()=>n?n.members.map(z=>({...z})):(s||[]).filter(z=>r.some(F=>F.slug===z)).map(z=>({slug:z,role:""}))),[u,$]=c.useState(n?.doc||""),[k,C]=c.useState(!1),y=j.filter(z=>d.has(z.slug)).length,h=j.map(z=>r.find(F=>F.slug===z.slug)?.name||z.slug).join(" & "),S=n?n.name:h||i("team.editor.namePlaceholder"),H=y>=2&&!k,G=z=>T(F=>F.some(W=>W.slug===z)?F.filter(W=>W.slug!==z):[...F,{slug:z,role:""}]),O=(z,F)=>T(W=>W.map(te=>te.slug===z?{...te,role:F}:te)),K=Ga(m),I=z=>{const F=z.target.files?.[0];if(z.target.value="",!!F){if(F.size>1048576){P.getState().toast(i("team.editor.avatarTooLarge"),!0);return}x(F),g(""),b(!1)}},L=async()=>{if(!H)return;C(!0);const z=P.getState();try{const F={name:p.trim(),avatar:N?"":m.trim(),members:j,doc:u};let W=n?await Eo(Ne(),n.slug,F):await To(Ne(),F);if(N&&n&&(await Mo(Ne(),W.slug),W={...W,avatar:""}),w){const te=await new Promise((Q,A)=>{const Y=new FileReader;Y.onload=()=>Q(String(Y.result)),Y.onerror=()=>A(new Error(i("team.editor.avatarReadFailed"))),Y.readAsDataURL(w)}),oe=await Ro(Ne(),W.slug,te,w.type);W={...W,avatar:oe.avatar}}await z.refreshTeams(),z.toast(i("team.editor.saved")),a(W)}catch(F){z.toast(i("team.editor.failed",{e:F?.message||String(F)}),!0)}finally{C(!1)}};return e.jsx("div",{onClick:o,style:{position:"fixed",inset:0,background:"var(--overlay-scrim)",display:"flex",alignItems:"center",justifyContent:"center",zIndex:1e3},children:e.jsxs("div",{className:"team-editor",onClick:z=>z.stopPropagation(),style:{width:520,maxWidth:"92vw",maxHeight:"86vh",overflow:"auto",borderRadius:"var(--radius-md, 12px)",background:"var(--bg)",color:"var(--text)",border:"1px solid var(--border)",boxShadow:"var(--card-shadow)",padding:18},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8,marginBottom:6},children:[e.jsx(Co,{size:18}),e.jsx("strong",{style:{fontSize:"var(--ui-font-heading, 14px)",flex:1},children:i(n?"team.editor.titleEdit":"team.editor.titleNew")}),e.jsx("button",{className:"icon-btn",onClick:o,title:i("team.editor.cancel"),children:e.jsx(Ye,{size:16})})]}),e.jsxs("div",{className:"field",children:[e.jsx("label",{children:i("team.editor.name")}),e.jsx("input",{type:"text",value:p,placeholder:S,onChange:z=>f(z.target.value),autoFocus:!0})]}),e.jsxs("div",{className:"field",children:[e.jsx("label",{children:i("team.editor.avatar")}),e.jsxs("div",{className:"agent-avatar-actions",children:[e.jsxs("label",{className:"btn sm",children:[e.jsx(Hr,{size:13}),i("team.editor.avatarImage"),e.jsx("input",{type:"file",accept:"image/png,image/jpeg,image/gif,image/webp",disabled:k,onChange:I})]}),(K||w)&&e.jsxs("button",{type:"button",className:"btn ghost sm",disabled:k,onClick:()=>{x(null),g(""),b(!!n&&K)},children:[e.jsx(pt,{size:13}),i("team.editor.avatarRemove")]}),w&&e.jsx("small",{children:w.name})]}),e.jsx("input",{type:"text","aria-label":i("team.editor.avatarEmoji"),value:K?"":m,disabled:K||!!w,maxLength:16,placeholder:"🧭",onChange:z=>{g(z.target.value),b(!1)}}),e.jsx("small",{children:i("team.editor.avatarHint")})]}),e.jsxs("div",{className:"field",children:[e.jsx("label",{children:i("team.editor.members")}),e.jsx("div",{style:{display:"flex",flexDirection:"column",gap:4,maxHeight:220,overflow:"auto"},children:[...r,...j.filter(z=>!d.has(z.slug)).map(z=>({slug:z.slug,name:`${z.slug} (${i("team.editor.missing")})`}))].map(z=>{const F=j.findIndex(te=>te.slug===z.slug),W=F>=0;return e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8},children:[e.jsxs("label",{style:{display:"flex",alignItems:"center",gap:6,minWidth:160,cursor:"pointer"},children:[e.jsx("input",{type:"checkbox",checked:W,onChange:()=>G(z.slug)}),W&&e.jsx("span",{style:{fontSize:"var(--ui-font-caption, 11px)",color:"var(--text-muted)",minWidth:14},children:F+1}),e.jsx("span",{style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:z.name})]}),W&&e.jsx("input",{type:"text",value:j[F].role,placeholder:i("team.editor.rolePlaceholder"),style:{flex:1},onChange:te=>O(z.slug,te.target.value)})]},z.slug)})}),y<2&&e.jsx("div",{style:{fontSize:"var(--ui-font-caption, 11px)",color:"var(--danger)",marginTop:4},children:i("team.editor.needTwo")})]}),e.jsxs("div",{className:"field",children:[e.jsx("label",{children:i("team.editor.doc")}),e.jsx("textarea",{rows:7,value:u,placeholder:i("team.editor.docPlaceholder"),onChange:z=>$(z.target.value)})]}),e.jsxs("div",{style:{display:"flex",gap:8,justifyContent:"flex-end"},children:[e.jsx("button",{className:"btn sm",onClick:o,children:i("team.editor.cancel")}),e.jsx("button",{className:"btn primary sm",onClick:()=>{L()},disabled:!H,children:i(n?"team.editor.save":"team.editor.create")})]})]})})};function Ml(t){const n=s=>String(s).padStart(2,"0");return`${t.getFullYear()}-${n(t.getMonth()+1)}-${n(t.getDate())}T${n(t.getHours())}:${n(t.getMinutes())}`}const Rl=4e3,Al="Track this task; report to the user only when something changed, and remove this entry when it is done. ";async function Un(t,n){const s=P.getState();try{return await ks(Ne(),t,n,"pending"),!0}catch(a){return s.toast(a?.code==="todo_not_pending"?s.tr("chat.task.doneTodo"):s.tr("chat.task.todoSyncFail",{e:a?.message||String(a)}),!0),!1}}async function Pl(t){const n=P.getState();await ks(Ne(),t,"pending","injected").catch(s=>{n.toast(n.tr("chat.task.todoSyncFail",{e:s?.message||String(s)}),!0)})}async function Il(t,n,s){const a=P.getState(),o=r=>{Do(Ne(),r).catch(()=>{})},i=`task-card "${t.title.slice(0,80)}"`;if(n==="here"||n==="new"){if(t.todo&&!await Un(t.todo,"injected"))return!1;let r=!1;try{n==="new"&&Ao(),r=!!await P.getState().send(t.prompt,[],void 0,void 0,void 0,n==="here"?s:null)}finally{!r&&t.todo&&await Pl(t.todo)}return r&&o(`${i} accepted: ${n==="here"?"run here":"run in a new session"}`),r}if(n==="muse"&&t.todo)try{return await Po(Ne(),t.todo),a.toast(a.tr("chat.task.handedDo")),!0}catch(r){return a.toast(r?.code==="muse_disabled"?a.tr("chat.task.museOff"):r?.code==="todo_not_pending"?a.tr("chat.task.doneTodo"):a.tr("chat.task.trackFail",{e:r?.message||String(r)}),!0),!1}if(n==="muse"){const r=Al+t.prompt;if(r.length>Rl)return a.toast(a.tr("chat.task.tooLong"),!0),!1;try{return await Io(Ne(),"muse",{name:t.title.slice(0,120),date:Ml(new Date(Date.now()+36e5)),repeat:"1d",auto:!0,prompt:r,description:`${t.tldr?`${t.tldr} · `:""}source session ${s||"-"}`.slice(0,500),todo:!0}),a.toast(a.tr("chat.task.tracked")),o(`${i} handed to Muse for tracking`),!0}catch(d){return a.toast(a.tr("chat.task.trackFail",{e:d?.message||String(d)}),!0),!1}}return t.todo?Un(t.todo,"dismissed"):(o(`${i} ignored`),!0)}function Dl(t){if(!t.trim())return;P.getState().setPendingChatQuote("chat-panel",t);const n=Le.getState();n.rightVisible&&n.rightTabs.some(a=>a.type==="chat-panel"&&a.active)||n.showSideView("right","chat-panel")}se({"chat.action.insertNote":{zh:"插入笔记",en:"Insert into note"},"chat.insertNote.none":{zh:"没有可写入的笔记:开着的笔记是只读或已锁定",en:"No writable note: the open notes are read-only or locked"},"chat.insertNote.done":{zh:"已插入「{name}」",en:"Inserted into “{name}”"},"chat.insertNote.failed":{zh:"没能插入:笔记是只读、已锁定或处在源码模式",en:"Couldn’t insert: the note is read-only, locked, or in source mode"},"chat.insertNote.undo":{zh:"撤销",en:"Undo"},"chat.insertNote.undoStale":{zh:"笔记之后又有改动,请在笔记里撤销",en:"The note has changed since — undo it in the note"}});const Fl=/^> — \[\[([^\]|#\n]+)(?:#([^\]|\n]+))?\]\]\s*$/;function _l(t){const n=t.split(`
|
|
17
|
+
`);for(let s=n.length-1;s>=0;s--){const a=Fl.exec(n[s]);if(!a)continue;const o=[];for(let d=s-1;d>=0&&n[d].startsWith(">");d--)o.unshift(n[d].replace(/^> ?/,""));const i=a[2]?.trim(),r=o.join(`
|
|
18
|
+
`).trim();return{path:a[1].trim(),anchor:{...i?{heading:i}:{},...r?{text:r}:{}}}}return null}function $l(t,n){const s=t.findIndex(a=>a.id===n);for(let a=(s<0?t.length:s)-1;a>=0;a--){const o=t[a];if(o.role!=="user")continue;const i=_l(o.content);if(i)return i}return null}function Ll(t){return Fo(t).trim()}function ql(t){return(t.split("/").pop()||t).replace(/\.md$/i,"")}function Ol(t,n){const s=Ll(t);if(!s)return!1;if(!ps())return fe({text:Se("chat.insertNote.none"),level:"info",inAppOnly:!0}),!1;const a=Ya(s,n);return a?(fe({text:Se("chat.insertNote.done",{name:ql(a.path)}),level:"success",receipt:!0,durationMs:8e3,action:{label:Se("chat.insertNote.undo"),run:()=>{a.undo()||fe({text:Se("chat.insertNote.undoStale"),level:"info",inAppOnly:!0})}}}),!0):(fe({text:Se("chat.insertNote.failed"),level:"warning",inAppOnly:!0}),!1)}const Bl=()=>Qa()?ps()?"ready":"disabled":"hidden";function Hl(){return c.useSyncExternalStore(Ja,Bl)}const dn=Ws(()=>({subject:null}));function la(){const t=Le.getState(),n=t.api?.panels||[],a=(t.api?_o(t.api):n.find(o=>o.id===t.focusedChatLeafId&&o.params?.__loc==="main"))?.params;return a?.followActive===!1&&typeof a.sessionId=="string"?a.sessionId:P.getState().activeId}const Kn=()=>{const t=dn.getState().subject;t&&t.from!==la()&&dn.setState({subject:null})};let Gn=!1;function Wl(t){Gn||(Gn=!0,P.subscribe(Kn),Le.subscribe(Kn)),dn.setState({subject:{...t,from:la()}}),ca(5)}function ca(t){const n=Le.getState();if(!n.rightVisible&&!!n.api?.panels.some(a=>a.params?.__loc==="right")&&t>0){setTimeout(()=>ca(t-1),120);return}n.rightVisible||n.toggleSidebar("right"),Le.getState().openView("tangu-details",{},"right")}const zt="forsion:human-changed",gu=t=>t.kind==="agent"?`agent:${t.slug}`:`project:${t.sessionId}`,Vl=t=>t.kind==="agent"?`/agent/agents/${encodeURIComponent(t.slug)}/human`:"/agent/project-context/human";async function bn(t,n,s,a="",o){const i=n.kind==="project"?{sessionId:n.sessionId}:{},r=s==="GET"&&n.kind==="project"?`?sessionId=${encodeURIComponent(n.sessionId)}`:"",d=await vs(t,`${Vl(n)}${a}${r}`,{method:s,...s==="GET"?{}:{body:JSON.stringify({...o,...i})}}),p=await d.json();if(!d.ok)throw Object.assign(new Error(p.detail||`HTTP ${d.status}`),{status:d.status,code:p.error});return s!=="GET"&&window.dispatchEvent(new CustomEvent(zt)),p}const Ul=(t,n)=>bn(t,n,"GET"),vu=(t,n,s,a,o)=>bn(t,n,"PUT","",{content:s,expectedVersion:a,summary:o}),Kl=(t,n,s)=>bn(t,n,"POST","/undo",{changeId:s.id,expectedVersion:s.afterVersion});function Gl(t=[]){const n=new Map;for(const s of t)if(!(s.name!=="manage_human"||!s.done||s.isError||!s.result))try{const a=JSON.parse(s.result),o=a.change;if(a.kind!=="human_update"||!o||typeof o.id!="string"||!/^[a-f0-9-]{36}$/.test(o.id)||typeof o.summary!="string"||typeof o.evidence!="string"||typeof o.at!="string"||o.actor!=="agent"||!/^[a-f0-9]{64}$/.test(o.beforeVersion)||!/^[a-f0-9]{64}$/.test(o.afterVersion)||!(o.scope?.kind==="agent"&&typeof o.scope.slug=="string"&&/^[a-z0-9][a-z0-9-]*$/.test(o.scope.slug)||o.scope?.kind==="project"&&typeof o.scope.cwd=="string"&&o.scope.cwd.length>0))continue;n.set(o.id,o)}catch{}return[...n.values()]}se({"agentProfile.human":{zh:"协作",en:"Collaboration"},"projectProfile.tab.human":{zh:"协作",en:"Collaboration"},"human.title":{zh:"协作说明",en:"Collaboration handbook"},"human.agentScope":{zh:"与 {name} 的长期协作",en:"Long-term collaboration with {name}"},"human.projectScope":{zh:"在这个项目中如何配合",en:"How we work together on this project"},"human.empty":{zh:"还没有协作说明。你可以自己写下,也可以在对话中让 Agent 根据实际合作逐步整理。",en:"No collaboration handbook yet. Write one yourself, or let your agent build it from your work together."},"human.edit":{zh:"编辑",en:"Edit"},"human.editLabel":{zh:"编辑协作说明",en:"Edit collaboration handbook"},"human.save":{zh:"保存",en:"Save"},"human.cancel":{zh:"放弃修改",en:"Discard changes"},"human.saved":{zh:"已保存,后续对话会读取这份说明。",en:"Saved. Subsequent turns will read this handbook."},"human.userEdit":{zh:"你修改了协作说明",en:"You edited the collaboration handbook"},"human.more":{zh:"更多操作",en:"More actions"},"human.source":{zh:"查看原文",en:"View source"},"human.preview":{zh:"阅读视图",en:"Reading view"},"human.history":{zh:"修改历史",en:"Change history"},"human.noHistory":{zh:"此设备还没有修改记录。",en:"No changes recorded on this device yet."},"human.path":{zh:"文件位置",en:"File location"},"human.updatedAt":{zh:"更新于 {time}",en:"Updated {time}"},"human.updated":{zh:"协作说明已更新",en:"Collaboration handbook updated"},"human.applied":{zh:"已生效",en:"Applied"},"human.view":{zh:"查看说明",en:"View handbook"},"human.revise":{zh:"修改",en:"Revise"},"human.undo":{zh:"撤销本次更新",en:"Undo this update"},"human.undone":{zh:"本次更新已撤销",en:"This update was undone"},"human.evidence":{zh:"更新依据",en:"Reason for this update"},"human.project":{zh:"项目协作",en:"Project collaboration"},"human.agent":{zh:"长期协作",en:"Long-term collaboration"},"human.inherited":{zh:"同时适用:与 {name} 的长期协作",en:"Also applies: collaboration with {name}"},"human.loading":{zh:"正在读取协作说明…",en:"Loading the collaboration handbook…"},"human.retry":{zh:"重试",en:"Retry"},"human.conflict":{zh:"说明已在别处修改。你的草稿仍保留,请查看最新内容后再合并修改。",en:"The handbook changed elsewhere. Your draft is preserved; review the latest version before merging your changes."},"human.undoConflict":{zh:"已有后续修改。请打开说明调整,避免覆盖新的内容。",en:"Newer changes exist. Open the handbook to revise it without overwriting them."},"human.latest":{zh:"查看最新内容",en:"Review latest version"},"human.merge":{zh:"已合并,使用最新版本保存",en:"Merged; save against the latest version"},"human.localOnly":{zh:"协作说明需要连接本地引擎。",en:"Connect to a local engine to use collaboration handbooks."},"human.remoteDenied":{zh:"请在宿主设备上查看和修改协作说明。",en:"View and edit collaboration handbooks on the host device."},"human.template":{zh:`# 我们怎么配合
|
|
19
|
+
|
|
20
|
+
## 我会怎么配合你
|
|
21
|
+
|
|
22
|
+
## 需要你参与的部分
|
|
23
|
+
|
|
24
|
+
## 可能帮助我们提高效率的事情
|
|
25
|
+
`,en:`# How we work together
|
|
26
|
+
|
|
27
|
+
## How I will help
|
|
28
|
+
|
|
29
|
+
## Where I need your input
|
|
30
|
+
|
|
31
|
+
## What could help us work better
|
|
32
|
+
`},"human.changed":{zh:"有新的协作说明,打开后可查看。",en:"The collaboration handbook has changed. Open it to see the latest version."}});function Yl({changes:t,cfg:n,sessionId:s}){const{t:a}=V(),o=t.map(r=>r.id).join(","),i=ce(s);return c.useEffect(()=>{o&&window.dispatchEvent(new CustomEvent(zt))},[o]),t.length?e.jsxs("section",{className:"human-update-card","data-human-updates":!0,children:[e.jsxs("div",{className:"human-update-head",children:[e.jsx(vr,{size:15}),e.jsx("strong",{children:a("human.updated")})]}),t.map(r=>e.jsx(Jl,{change:r,engine:i,cfg:n,sessionId:s},JSON.stringify([i.key,i.base,n.token,r.id])))]}):null}function Jl({change:t,engine:n,cfg:s,sessionId:a}){const{t:o}=V(),i=t.scope,r=P(k=>i.kind==="agent"?k.agentDefs.find(C=>C.slug===i.slug)?.name||i.slug:i.cwd.split(/[\\/]/).filter(Boolean).at(-1)),d=P(k=>[...k.sessions,...k.archivedSessions].find(C=>C.id===a)?.project_path),[p,f]=c.useState(null),[m,g]=c.useState(""),[w,x]=c.useState(!1),N=t.scope.kind==="agent"?t.scope:{kind:"project",sessionId:a},b=k=>k.scope.kind===i.kind&&(k.scope.kind==="agent"&&i.kind==="agent"?k.scope.slug===i.slug:k.scope.kind==="project"&&i.kind==="project"&&k.scope.cwd===i.cwd);c.useEffect(()=>{let k=!0;const C=()=>{Ul(n,N).then(y=>{k&&b(y)&&f(y)}).catch(()=>{})};return C(),window.addEventListener(zt,C),()=>{k=!1,window.removeEventListener(zt,C)}},[n.key,n.base,s.token,t.id,a]);const j=!!p?.history.some(k=>k.undoOf===t.id),T=!!p?.history.some(k=>k.id===t.id&&k.canUndo),u=(k=!1)=>Wl({...t.scope.kind==="agent"?{kind:"agent",slug:t.scope.slug}:{kind:"project",path:d||t.scope.cwd},human:{at:Date.now(),edit:k,changeId:t.id}}),$=async()=>{if(!w){x(!0),g("");try{const k=await Kl(n,N,t);f(k.document)}catch(k){g(k?.status===409?o("human.undoConflict"):String(k?.message||k))}finally{x(!1)}}};return e.jsxs("article",{"data-human-update":t.id,children:[e.jsxs("div",{className:"human-scope",children:[r," · ",o(t.scope.kind==="agent"?"human.agent":"human.project")," · ",e.jsx("span",{className:"human-applied",children:o(j?"human.undone":"human.applied")})]}),e.jsx("p",{children:t.summary}),t.evidence&&e.jsxs("details",{children:[e.jsx("summary",{children:o("human.evidence")}),e.jsx("p",{children:t.evidence})]}),e.jsxs("div",{className:"human-actions",children:[e.jsx("button",{type:"button",className:"profile-text-action",onClick:()=>u(),children:o("human.view")}),e.jsx("button",{type:"button",className:"profile-text-action",onClick:()=>u(!0),children:o("human.revise")}),!j&&e.jsxs("button",{type:"button",className:"profile-text-action",disabled:w||!T,title:!T&&p?o("human.undoConflict"):void 0,onClick:()=>{$()},children:[e.jsx(Vs,{size:12}),o("human.undo")]})]}),m&&e.jsx("p",{className:"agent-profile-error",role:"alert",children:m})]})}const Ql=({text:t,stored:n,anchorPrefix:s})=>{const{t:a}=V(),o=c.useRef(null),i=c.useRef(null),[r,d]=c.useState(!1),[p,f]=c.useState(!1),[m,g]=c.useState(0),[w,x]=c.useState(0),[N,b]=c.useState(!1),[j,T]=c.useState(null);c.useEffect(()=>()=>{o.current?.pause(),i.current&&URL.revokeObjectURL(i.current)},[]);const u=async()=>{if(o.current)return o.current;d(!0),T(null);try{const y=await Lo(Ne(),n,t);i.current=y;const h=new Audio(y);return h.onloadedmetadata=()=>g(h.duration||0),h.ontimeupdate=()=>x(h.currentTime||0),h.onended=()=>{f(!1),x(0)},h.onpause=()=>f(!1),h.onplay=()=>f(!0),o.current=h,h}catch(y){return T(y?.message==="EMPTY"||y?.message==="NO_MODEL"?a("tts.noText"):a("tts.failed",{e:y?.message||y})),null}finally{d(!1)}},$=async()=>{const y=await u();y&&(y.paused?y.play():y.pause())},k=m?Math.max(1,Math.round(m)):0,C=m?Math.min(100,w/m*100):0;return e.jsxs("div",{className:"t2-voice",children:[e.jsxs("div",{className:"t2-voice-bar",children:[e.jsx("button",{className:"t2-voice-play",onClick:$,title:a(p?"voice.pause":"voice.play"),children:r?e.jsx(Oe,{size:15,className:"spin"}):p?e.jsx($o,{size:15}):e.jsx(bs,{size:15})}),e.jsx("div",{className:"t2-voice-track",children:e.jsx("span",{style:{width:`${C}%`}})}),e.jsx("span",{className:"t2-voice-dur",children:k?`${k}″`:a("voice.label")}),e.jsx("button",{className:"t2-voice-txt",onClick:()=>b(y=>!y),title:a("voice.toText"),children:e.jsx(pn,{size:13})})]}),j&&e.jsx("div",{className:"t2-dim",style:{marginTop:4},children:j}),N&&e.jsx("div",{className:"t2-content",style:{marginTop:6},children:e.jsx(qe,{content:t,anchorPrefix:s})})]})},Xl=({content:t})=>{const{t:n}=V(),[s,a]=c.useState(!1);return t?e.jsxs("div",{className:"thinking-block",children:[e.jsxs("button",{className:"thinking-toggle",onClick:()=>a(!s),children:[s?e.jsx(ot,{size:13}):e.jsx(ve,{size:13}),e.jsx(Zr,{size:12}),n("chat.systemPrompt"),e.jsx("span",{style:{opacity:.7},children:n("thinking.charCount",{count:t.length})})]}),e.jsx($e,{open:s,children:e.jsx("pre",{className:"thinking-content",style:{whiteSpace:"pre-wrap",wordBreak:"break-word",maxHeight:360,overflow:"auto",fontFamily:"var(--font-mono, ui-monospace, monospace)",fontSize:"var(--ui-font-meta, 12px)",margin:0},children:t})})]}):null},he=23,Zl={up:{x:0,y:-1},right:{x:1,y:0},down:{x:0,y:1},left:{x:-1,y:0}},ec={up:"down",right:"left",down:"up",left:"right"},Yn=(t,n)=>t.x===n.x&&t.y===n.y;function da(t,n){const s=[];for(let a=0;a<he;a++)for(let o=0;o<he;o++)t.some(i=>i.x===o&&i.y===a)||s.push({x:o,y:a});return s[Math.min(s.length-1,Math.floor(n()*s.length))]||{x:0,y:0}}function Ut(t=Math.random){const n=Math.floor(he/2),s=Math.floor(he/2)+2,a=Array.from({length:5},(o,i)=>({x:s-i,y:n}));return{body:a,direction:"right",queuedDirection:"right",food:da(a,t),score:0,alive:!0}}function tc(t,n){return!t.alive||t.queuedDirection!==t.direction||ec[t.direction]===n?t:{...t,queuedDirection:n}}function nc(t,n=Math.random){if(!t.alive)return t;const s=t.queuedDirection,a=Zl[s],o=t.body[0],r={x:(o.x+a.x+he)%he,y:o.y+a.y},d=Yn(r,t.food),p=d?t.body:t.body.slice(0,-1),f=r.y<0||r.y>=he,m=p.some(w=>Yn(w,r));if(f||m)return{...t,direction:s,queuedDirection:s,alive:!1};const g=[r,...t.body];return d||g.pop(),{body:g,direction:s,queuedDirection:s,food:d?da(g,n):t.food,score:t.score+(d?1:0),alive:!0}}se({"imageGeneration.loading":{zh:"正在生成图片…",en:"Generating image…"},"imageGeneration.play":{zh:"点击点阵开启贪吃蛇彩蛋",en:"Click the dot grid to play Snake"},"imageGeneration.controls":{zh:"贪吃蛇:方向键、WASD 或滑动控制,再次点击退出",en:"Snake: use arrow keys, WASD, or swipe to steer; click again to exit"},"imageGeneration.snake":{zh:"贪吃蛇 · {score}",en:"Snake · {score}"},"imageGeneration.retry":{zh:"撞到了,马上再来一局…",en:"Game over — restarting…"}});const jt=276,ua=12,Ve=(jt-ua*2)/(he-1);function Ze(t,n,s){return getComputedStyle(t).getPropertyValue(n).trim()||s}function ha(t){const n=Math.min(window.devicePixelRatio||1,2),s=Math.round(jt*n);(t.width!==s||t.height!==s)&&(t.width=s,t.height=s);const a=t.getContext("2d");return a?(a.setTransform(n,0,0,n,0,0),a.clearRect(0,0,jt,jt),a):null}function Te(t){return ua+t*Ve}function sc(t,n){const s=ha(t);if(!s)return;const a=Ze(t,"--accent-ink","#4d7ff0"),o=Ze(t,"--text-faint","#777"),i=n*42e-5,r=.5+Math.cos(i*1.13)*.2,d=.5+Math.sin(i*.91)*.2;for(let p=0;p<he;p++)for(let f=0;f<he;f++){const m=f/(he-1),g=p/(he-1),w=m-r,x=g-d,N=Math.exp(-(w*w/.055+x*x/.08)),b=.5+Math.sin(m*5.7+i*2.2)*.17,j=Math.exp(-Math.pow(g-b,2)/.024)*(.35+.3*Math.sin(i+m*3.4)),T=Math.max(0,Math.min(1,N*.92+j*.42));s.beginPath(),s.arc(Te(f),Te(p),1+T*2.05,0,Math.PI*2),s.fillStyle=T>.16?a:o,s.globalAlpha=.16+T*.78,s.fill()}s.globalAlpha=1}function Kt(t,n){const s=ha(t);if(!s)return;const a=Ze(t,"--accent-ink","#4d7ff0"),o=Ze(t,"--text-faint","#777"),i=Ze(t,"--bg","#fff"),r=Ze(t,"--danger","#b85848");for(let b=0;b<he;b++)for(let j=0;j<he;j++)s.beginPath(),s.arc(Te(j),Te(b),1,0,Math.PI*2),s.fillStyle=o,s.globalAlpha=.2,s.fill();s.globalAlpha=1,s.beginPath(),s.arc(Te(n.food.x),Te(n.food.y),Ve*.42,0,Math.PI*2),s.fillStyle=r,s.fill(),n.body.forEach((b,j)=>{s.beginPath(),s.arc(Te(b.x),Te(b.y),Ve*(j===0?.47:.4),0,Math.PI*2),s.fillStyle=n.alive?a:r,s.globalAlpha=j===0?1:Math.max(.48,.94-j*.035),s.fill()}),s.globalAlpha=1;const d=n.body[0];if(!d)return;const p={up:[0,-1],right:[1,0],down:[0,1],left:[-1,0]},[f,m]=p[n.direction],g=-m*Ve*.14,w=f*Ve*.14,x=f*Ve*.15,N=m*Ve*.15;for(const b of[-1,1])s.beginPath(),s.arc(Te(d.x)+x+g*b,Te(d.y)+N+w*b,.85,0,Math.PI*2),s.fillStyle=i,s.fill()}const ac=t=>({ArrowUp:"up",w:"up",W:"up",ArrowRight:"right",d:"right",D:"right",ArrowDown:"down",s:"down",S:"down",ArrowLeft:"left",a:"left",A:"left"})[t]||null;function oc(){const{t}=V(),n=c.useRef(null),s=c.useRef(Ut()),a=c.useRef(!1),o=c.useRef(null),i=c.useRef(!1),[r,d]=c.useState(!1),[p,f]=c.useState(0),[m,g]=c.useState(!1);c.useEffect(()=>{if(r)return;const k=n.current;if(!k)return;const C=window.matchMedia("(prefers-reduced-motion: reduce)");let y=0,h=-1/0;const S=O=>{O-h>=32&&(sc(k,C.matches?0:O),h=O),C.matches||(y=requestAnimationFrame(S))};S(0);const H=()=>{cancelAnimationFrame(y),h=-1/0,S(performance.now())};C.addEventListener?.("change",H);const G=new MutationObserver(H);return G.observe(document.documentElement,{attributes:!0,attributeFilter:["class","data-mode","data-skin","data-bg","data-theme"]}),()=>{cancelAnimationFrame(y),C.removeEventListener?.("change",H),G.disconnect()}},[r]),c.useEffect(()=>{if(!r)return;const k=n.current;if(!k)return;Kt(k,s.current);let C=0;const y=window.setInterval(()=>{if(a.current)return;const h=nc(s.current);s.current=h,f(h.score),Kt(k,h),h.alive||(a.current=!0,g(!0),C=window.setTimeout(()=>{const S=Ut();s.current=S,a.current=!1,g(!1),f(0),Kt(k,S)},900))},118);return()=>{window.clearInterval(y),window.clearTimeout(C)}},[r]);const w=c.useCallback(()=>{if(r)return;const k=Ut();s.current=k,a.current=!1,f(0),g(!1),d(!0)},[r]),x=c.useCallback(()=>{if(!r){w();return}a.current=!1,g(!1),d(!1)},[r,w]),N=c.useCallback(k=>{s.current=tc(s.current,k)},[]),b=k=>{const C=ac(k.key);C&&(k.preventDefault(),r||w(),N(C))},j=k=>{i.current=!1,o.current={x:k.clientX,y:k.clientY},k.currentTarget.setPointerCapture?.(k.pointerId)},T=k=>{const C=o.current;if(o.current=null,!C||!r)return;const y=k.clientX-C.x,h=k.clientY-C.y;Math.max(Math.abs(y),Math.abs(h))<18||(i.current=!0,N(Math.abs(y)>Math.abs(h)?y>0?"right":"left":h>0?"down":"up"))},u=()=>{if(i.current){i.current=!1;return}x()},$=m?t("imageGeneration.retry"):r?t("imageGeneration.snake",{score:p}):t("imageGeneration.loading");return e.jsxs("div",{className:`image-generation-loader${r?" playing":""}`,"data-image-generation":r?"snake":"ambient",children:[e.jsx("div",{className:"image-generation-status",role:"status","aria-live":"polite",children:$}),e.jsx("button",{type:"button",className:"image-generation-stage","aria-label":t(r?"imageGeneration.controls":"imageGeneration.play"),title:t(r?"imageGeneration.controls":"imageGeneration.play"),onClick:u,onKeyDown:b,onPointerDown:j,onPointerUp:T,children:e.jsx("canvas",{ref:n,className:"image-generation-canvas","aria-hidden":"true"})})]})}se({"tool.parked.waiting":{zh:"已挂起,等你在输入框上方批准。Agent 先做别的,拍板后结果会补在这里。",en:"Parked until you approve it above the input box. The agent carries on meanwhile; the result lands here once you decide."},"tool.parked.past":{zh:"当时挂起等你批准,结局见后面的审批结果。",en:"This call was parked for your approval; see the approval result further down."},"tool.waitingYou":{zh:"等你回复",en:"Waiting for your reply"},"tool.verb.readComputerHistory":{zh:"读取电脑历史",en:"Read computer history"},"tool.computerHistory.notSaved":{zh:"电脑历史摘录已交给模型,不会保存在对话记录里。",en:"The computer history excerpt was passed to the model and isn’t saved in the conversation."}});const pa="read_computer_history";function ic(t,n){return t.name===pa&&!t.isError?n("tool.computerHistory.notSaved"):t.result||n("tool.empty")}const rc=new Set(["ask_user","exit_plan_mode"]);function dt(t){if(!t)return 0;const n=t.split(`
|
|
33
|
+
`).length;return t.endsWith(`
|
|
34
|
+
`)?n-1:n}function lc(t){let n=0,s=0;for(const a of t.split(`
|
|
35
|
+
`))/^\+(?!\+\+)/.test(a)?n++:/^-(?!--)/.test(a)&&s++;return{adds:n,dels:s}}const We=t=>t.split(/[/\\]/).filter(Boolean).pop()||t;function ma(t){let n={};try{n=t.arguments?JSON.parse(t.arguments):{}}catch{}const s=typeof n.path=="string"?n.path:"";switch(t.name){case"write_file":return{kind:"write",verbKey:"tool.verb.wrote",target:We(s),adds:dt(String(n.content??"")),dels:0,isFile:!0};case"edit_file":return{kind:"edit",verbKey:"tool.verb.edited",target:We(s),adds:dt(String(n.new_string??"")),dels:dt(String(n.old_string??"")),isFile:!0};case"multi_edit":{let a=0,o=0;if(Array.isArray(n.edits))for(const i of n.edits)a+=dt(String(i?.new_string??"")),o+=dt(String(i?.old_string??""));return{kind:"edit",verbKey:"tool.verb.edited",target:We(s),adds:a,dels:o,isFile:!0}}case"apply_patch":{const a=String(n.patch??n.input??n.diff??t.arguments??""),{adds:o,dels:i}=lc(a),r=a.match(/(?:\*\*\* (?:Update|Add|Delete) File: |\+\+\+ |--- )([^\n]+)/);return{kind:"edit",verbKey:"tool.verb.edited",target:r?We(r[1].trim()):"patch",adds:o,dels:i,isFile:!0}}case"run_bash":case"run_background":return{kind:"run",verbKey:"tool.verb.ran",target:String(n.command??n.cmd??"").split(`
|
|
36
|
+
`)[0],isFile:!1};case"run_python":return{kind:"run",verbKey:"tool.verb.ran",target:"python: "+String(n.code??"").split(`
|
|
37
|
+
`)[0],isFile:!1};case"read_file":case"read_document":case"read_log":case"view_image":case"display_file":return{kind:"read",verbKey:"tool.verb.read",target:We(s||String(n.name??n.file??"")),isFile:!0};case"sketch":return{kind:"other",verbKey:"tool.verb.sketched",target:String(n.title??"")||"sketch",isFile:!1};case"desk_present":return{kind:"read",verbKey:"tool.verb.presented",target:(Array.isArray(n.views)?n.views:[]).map(i=>We(String(i?.path||""))).filter(Boolean).join(", ")||"Agent Desk",isFile:!0};case"list_dir":case"list_files":return{kind:"read",verbKey:"tool.verb.listed",target:We(s||"."),isFile:!0};case"search_files":case"glob_files":return{kind:"search",verbKey:"tool.verb.searched",target:String(n.query??n.pattern??n.glob??""),isFile:!1};case"web_search":return{kind:"search",verbKey:"tool.verb.searched",target:String(n.query??""),isFile:!1};case"web_fetch":return{kind:"browse",verbKey:"tool.verb.browsed",target:String(n.url??""),isFile:!1};case pa:return{kind:"read",verbKey:"tool.verb.readComputerHistory",target:String(n.query??n.app??""),isFile:!1};default:return t.name.startsWith("browser_")?{kind:"browse",verbKey:"tool.verb.browsed",target:String(n.url??n.text??t.name.replace("browser_","")),isFile:!1}:{kind:"other",verbKey:"",target:typeof n.command=="string"?n.command:typeof n.path=="string"?n.path:typeof n.query=="string"?n.query:(t.arguments||"").slice(0,80),isFile:!1}}}const Jn=t=>{try{return JSON.stringify(JSON.parse(t),null,2)}catch{return t}},cc=({d:t})=>t.adds||t.dels?e.jsxs("span",{className:"tool-row-stat",children:[t.adds?e.jsxs("span",{className:"add",children:["+",t.adds]}):null,t.dels?e.jsxs("span",{className:"del",children:["-",t.dels]}):null]}):null,dc=({ev:t,desc:n,running:s,waiting:a,asking:o})=>{const{t:i}=V(),[r,d]=c.useState(!1),p=c.useMemo(()=>r?Za(t.name,t.arguments):null,[r,t.name,t.arguments]),f=n.verbKey?i(n.verbKey):t.name,m=s&&!t.done&&!o;return e.jsxs("div",{className:"tool-row",children:[e.jsxs("button",{className:"tool-row-head","aria-busy":m,onClick:()=>d(g=>!g),children:[r?e.jsx(ot,{size:12}):e.jsx(ve,{size:12}),e.jsx("span",{className:"tool-row-copy",children:e.jsxs("span",{className:`tool-row-copy-text${m?" chat-run-shimmer-text":""}`,children:[e.jsx("span",{className:"tool-row-verb",children:f}),e.jsx("span",{className:`tool-row-target${n.isFile?" file":""}`,children:n.target})]})}),e.jsx(cc,{d:n}),e.jsx("span",{className:"tool-row-status",children:o?e.jsx(sn,{size:11,style:{color:"var(--accent-ink)"},"data-waiting-you":"1","aria-label":i("tool.waitingYou"),children:e.jsx("title",{children:i("tool.waitingYou")})}):t.parked?e.jsx(sn,{size:11,style:{color:a?"var(--accent-ink)":"var(--text-faint)"}}):t.done&&t.isError?e.jsx(Ft,{size:11,style:{color:"var(--danger)"}}):null})]}),e.jsx($e,{open:r,children:e.jsxs("div",{className:"tool-card-body",children:[p?e.jsxs(e.Fragment,{children:[e.jsx(xn,{text:p,side:!1}),t.arguments&&e.jsxs("details",{className:"tool-raw-args",children:[e.jsx("summary",{children:i("tool.argsLabel")}),Jn(t.arguments)]})]}):t.arguments?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"label",children:i("tool.argsLabel")}),Jn(t.arguments)]}):null,t.parked?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"label",children:i("tool.resultLabel")}),i(a?"tool.parked.waiting":"tool.parked.past")]}):t.result!==void 0&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"label",children:i("tool.resultLabel")}),ic(t,i)]})]})})]})},Qn=({events:t,running:n,approvals:s,awaitingAnswer:a})=>{const{t:o}=V(),[i,r]=c.useState(!1);if(!t.length)return null;const d=n?t.filter(S=>(S.name==="generate_image"||S.name==="edit_image")&&!S.done):[],p=d.length?t.filter(S=>!d.includes(S)):t,f=p.map(ma),m={write:0,edit:0,run:0,read:0,search:0,browse:0,other:0};f.forEach(S=>{m[S.kind]++});const g={write:"tool.sum.wrote",edit:"tool.sum.edited",run:"tool.sum.ran",read:"tool.sum.read",search:"tool.sum.searched",browse:"tool.sum.browsed",other:"tool.sum.other"},x=["write","edit","run","read","search","browse","other"].filter(S=>m[S]>0).map(S=>o(g[S],{n:m[S]})).join(" · "),N=S=>!!a&&!!n&&!S.done&&rc.has(S.name),b=p.every(S=>S.done),j=p.some(S=>S.isError),T=new Set((s||[]).filter(S=>S.status==="pending"&&S.toolCallId).map(S=>S.toolCallId)),u=p.some(S=>S.parked),$=n?p.findIndex(S=>!S.done):-1,k=$>=0&&N(p[$]),C=!!n&&p.length>0&&!b&&!k,y=$>=0?f[$]:null,h=y?y.verbKey?o(y.verbKey):p[$].name:"";return e.jsxs(e.Fragment,{children:[!!p.length&&e.jsxs("div",{className:"tool-group",children:[e.jsxs("button",{className:"tool-group-head","aria-busy":C,onClick:()=>r(S=>!S),children:[i?e.jsx(ot,{size:13}):e.jsx(ve,{size:13}),e.jsx(yr,{size:12,className:"tool-group-ic"}),!i&&k?e.jsx("span",{className:"tool-group-cur","data-waiting-you":"1",children:e.jsx("span",{className:"tool-group-cur-copy",children:o("tool.waitingYou")})}):!i&&y?e.jsx("span",{className:"tool-group-cur",children:e.jsxs("span",{className:"tool-group-cur-copy chat-run-shimmer-text",children:[h," ",e.jsx("span",{className:y.isFile?"file":void 0,children:y.target}),"…"]})}):e.jsx("span",{className:`tool-group-sum${C?" chat-run-shimmer-text":""}`,children:x}),e.jsx("span",{className:"tool-group-status",children:u?e.jsx(sn,{size:13,style:{color:p.some(S=>S.parked&&T.has(S.id))?"var(--accent-ink)":"var(--text-faint)"}}):b?j?e.jsx(Ft,{size:13,style:{color:"var(--danger)"}}):e.jsx(mn,{size:13,style:{color:"var(--green)"}}):null})]}),e.jsx($e,{open:i,children:e.jsx("div",{className:"tool-group-list",children:p.map((S,H)=>e.jsx(dc,{ev:S,desc:f[H],running:!!n,waiting:T.has(S.id),asking:N(S)},S.id))})})]}),!!d.length&&e.jsx("div",{className:"image-generation-jobs","aria-busy":"true",children:d.map(S=>e.jsx(oc,{},S.id))})]})};function uc(t){const[n,s]=c.useState({id:"",at:0,count:1/0}),a=t.revealAt||0,o=!!a&&Date.now()-a<2e3&&!window.matchMedia("(prefers-reduced-motion: reduce)").matches,i=n.id===t.id&&n.at===a?n.count:o?0:1/0;if(c.useLayoutEffect(()=>{if(!o||!t.content)return;const d=Array.from(t.content),p=Math.min(900,Math.max(180,d.length*3)),f=performance.now();let m=0;const g=()=>{const w=Math.min(1,(performance.now()-f)/p);s({id:t.id,at:a,count:w===1?1/0:Math.ceil(d.length*w)}),w<1&&(m=requestAnimationFrame(g))};return m=requestAnimationFrame(g),()=>cancelAnimationFrame(m)},[t.id,a,t.content]),!Number.isFinite(i))return t;const r=Array.from(t.content).slice(0,i).join("");return{...t,content:r,segments:r?[{t:"text",text:r}]:[],teamDone:!1}}se({"plan.approveGo":{zh:"批准并开始执行",en:"Approve & start"},"plan.approveEditedGo":{zh:"按我改的批准并执行",en:"Approve my edits & start"},"plan.approveManual":{zh:"批准,手动开始",en:"Approve, start manually"},"plan.edit":{zh:"编辑计划",en:"Edit plan"},"plan.sendBack":{zh:"打回",en:"Request changes"},"plan.reject":{zh:"拒绝",en:"Reject"},"plan.feedbackPlaceholder":{zh:"要改哪里?(反馈会发给 Agent 重做计划)",en:"What should change? (sent to the agent to revise the plan)"},"plan.sendFeedback":{zh:"发送反馈",en:"Send feedback"},"plan.doneApproved":{zh:"已批准",en:"Approved"},"plan.doneRevised":{zh:"已批准(按你修订的版本)",en:"Approved (your revised version)"},"plan.doneRejected":{zh:"已打回:{answer}",en:"Sent back: {answer}"},"plan.pointer":{zh:"等你拍板 · 在输入框上方",en:"Waiting for your decision · above the input box"},"plan.decisionTitle":{zh:"计划等你拍板(正文见对话里的计划卡)",en:"The plan needs your decision (full text in the plan card above)"}});const fa=({req:t,onAnswer:n})=>{const{t:s}=V(),[a,o]=c.useState(""),i=t.status==="pending";return e.jsxs("div",{className:`inquiry-card${i?"":" resolved"}`,children:[e.jsxs("div",{className:"inquiry-q",children:[e.jsx(yn,{size:14}),t.question]}),i?e.jsxs(e.Fragment,{children:[t.options.length>0&&e.jsx("div",{className:"inquiry-opts",children:t.options.map((r,d)=>e.jsxs("button",{className:"btn ghost sm",style:{justifyContent:"flex-start"},onClick:()=>n(r),children:[d+1,". ",r]},d))}),e.jsxs("div",{className:"inquiry-input",children:[e.jsx("input",{type:"text",className:"inline-input",value:a,placeholder:t.options.length?s("inquiry.placeholderOrFree"):s("inquiry.placeholderAnswer"),onChange:r=>o(r.target.value),onKeyDown:r=>{r.key==="Enter"&&a.trim()&&!r.nativeEvent.isComposing&&(r.preventDefault(),n(a.trim()))}}),e.jsxs("button",{className:"btn primary sm",disabled:!a.trim(),onClick:()=>a.trim()&&n(a.trim()),children:[e.jsx(Ns,{size:12})," ",s("inquiry.answer")]})]})]}):e.jsx("div",{className:"inquiry-resolved",children:t.status==="answered"?s("inquiry.answered",{answer:t.answer??""}):s("inquiry.expired")})]})},ga="批准,自动开始执行",va="批准,退出计划模式(手动开始)",hc="拒绝,保持计划模式",un=`
|
|
38
|
+
<<<REVISED_PLAN>>>
|
|
39
|
+
`,pc=/^(批准|同意|approve|approved|ok|yes|y)[!!。.]?$/i;function mc(t){const n=t.trim();return n===ga||n===va||pc.test(n)}function fc(t){const n=t.indexOf(un);return n<0?{head:t.trim()}:{head:t.slice(0,n).trim(),revised:t.slice(n+un.length).trim()}}const gc=({plan:t,req:n})=>{const{t:s}=V(),a=n?.status==="answered"?fc(n.answer||""):null,o=a?.revised||t;return e.jsxs("div",{className:"plan-card",children:[e.jsxs("div",{className:"tg-card-title",children:["📋 ",s("inquiry.planProposal"),a&&e.jsx("span",{className:"plan-verdict",children:mc(a.head)?a.revised?s("plan.doneRevised"):s("plan.doneApproved"):s("plan.doneRejected",{answer:a.head.slice(0,60)})}),n?.status==="expired"&&e.jsx("span",{className:"plan-verdict",children:s("inquiry.expired")})]}),e.jsx("div",{className:"plan-body",children:e.jsx(qe,{content:o})}),n?.status==="pending"&&e.jsxs("div",{className:"t2-dim t2-apv-pointer","data-plan-pointer":n.inquiryId,children:[e.jsx(At,{size:12})," ",s("plan.pointer")]})]})},vc=({plan:t,req:n,busy:s,onAnswer:a})=>{const{t:o}=V(),[i,r]=c.useState(t),[d,p]=c.useState(!1),[f,m]=c.useState(""),[g,w]=c.useState(!1),x=n.status==="pending"&&!s,N=j=>{x&&a(j)},b=j=>{if(!x)return;const T=j?ga:va,u=d&&i.trim()&&i!==t?i.trim():"";N(u?`${T}${un}${u}`:T)};return e.jsxs("div",{className:"plan-decision","data-plan-decision":n.inquiryId,children:[e.jsxs("div",{className:"plan-decision-title",children:[e.jsx(At,{size:15})," ",o("plan.decisionTitle")]}),d&&e.jsx("textarea",{className:"approval-edit plan-edit",value:i,onChange:j=>r(j.target.value),spellCheck:!1,autoFocus:!0}),e.jsxs("div",{className:"approval-actions",children:[e.jsxs("button",{className:"btn primary sm",disabled:!x,onClick:()=>b(!0),children:[e.jsx(zs,{size:13})," ",o(d&&i!==t?"plan.approveEditedGo":"plan.approveGo")]}),e.jsx("button",{className:"btn ghost sm",disabled:!x,onClick:()=>b(!1),children:o("plan.approveManual")}),e.jsxs("button",{className:"btn ghost sm",disabled:!x,onClick:()=>{p(j=>!j),r(t)},children:[e.jsx(ft,{size:13})," ",o(d?"common.cancel":"plan.edit")]}),e.jsxs("button",{className:"btn ghost sm",disabled:!x,onClick:()=>w(j=>!j),children:[e.jsx(Vs,{size:13})," ",o("plan.sendBack")]}),e.jsx("button",{className:"btn danger sm",disabled:!x,onClick:()=>N(hc),children:o("plan.reject")})]}),g&&e.jsxs("div",{className:"inquiry-input",children:[e.jsx("input",{type:"text",className:"inline-input",value:f,placeholder:o("plan.feedbackPlaceholder"),onChange:j=>m(j.target.value),onKeyDown:j=>{j.key==="Enter"&&f.trim()&&x&&!j.nativeEvent.isComposing&&(j.preventDefault(),N(f.trim()))}}),e.jsxs("button",{className:"btn primary sm",disabled:!f.trim()||!x,onClick:()=>f.trim()&&N(f.trim()),children:[e.jsx(Ns,{size:12})," ",o("plan.sendFeedback")]})]})]})},xc=({todos:t})=>{const{t:n}=V(),s=t.filter(a=>a.status==="completed").length;return e.jsxs("div",{className:"todo-card",children:[e.jsxs("div",{className:"tg-card-title",children:["✓ ",n("inquiry.todoList")," ",e.jsxs("span",{className:"tg-count",children:["(",s,"/",t.length,")"]})]}),e.jsx("div",{className:"todo-rows",children:t.map((a,o)=>e.jsxs("div",{className:`todo-row ${a.status}`,children:[e.jsx("span",{className:`todo-mark ${a.status}`,children:a.status==="completed"?e.jsx(tl,{size:14}):a.status==="in_progress"?e.jsx(Oe,{size:14,className:"spin"}):e.jsx(Ss,{size:14})}),e.jsx("span",{className:"todo-text",children:a.content})]},o))})]})};function wc(t,n,s){const a=x=>x.replace(/\\/g,"/"),o=a(t||"").replace(/\/+$/,""),i=a((n||"").trim());if(!o||!i)return null;const r=/^[a-zA-Z]:/.exec(o)?.[0]??"",p=/^([a-zA-Z]:)?\//.test(i)?i:`${o}/${i}`,f=/^[a-zA-Z]:/.exec(p)?.[0]??"",m=[];for(const x of p.slice(f.length).split("/"))if(!(!x||x===".")){if(x===".."){if(!m.length)return null;m.pop();continue}m.push(x)}const g=`${f}/${m.join("/")}`,w=x=>r?x.toLowerCase():x;return w(g)===w(o)?s?g:null:w(g).startsWith(`${w(o)}/`)?g:null}se({"creation.card.createTitle":{zh:"做成作品:{name}",en:"Make it a creation: {name}"},"creation.card.createBody":{zh:"在「造物」里给它建一个文件夹,把这条对话的工作目录切过去,接着在里面做。之后它会出现在造物里,有稳定的预览、桌面快捷方式和版本历史。",en:"Creates a folder for it in Creations, moves this conversation into that folder and keeps building there. It then shows up in Creations with a stable preview, a desktop shortcut and version history."},"creation.card.addTitle":{zh:"加入造物:{name}",en:"Add to Creations: {name}"},"creation.card.addBody":{zh:"把「{path}」原地加入造物,不复制也不移动。这条对话之后在它里面继续,它会出现在造物里,有稳定的预览和桌面快捷方式。",en:"Adds “{path}” to Creations where it is, without copying or moving it. This conversation continues in it, and it shows up in Creations with a stable preview and a desktop shortcut."},"creation.card.create":{zh:"做成作品",en:"Make it a creation"},"creation.card.add":{zh:"加入造物",en:"Add to Creations"},"creation.card.done":{zh:"已在造物里:{name}",en:"In Creations: {name}"},"creation.card.doneNewChat":{zh:"已在造物里建好「{name}」。这条对话没有挪过去,已切到在它里面新建对话。",en:"Created “{name}” in Creations. This conversation was not moved there, so a new conversation in it is ready."},"creation.card.openStudio":{zh:"在编码工作室中打开",en:"Open in Coding Studio"},"creation.card.openCreations":{zh:"在造物中查看",en:"View in Creations"},"creation.continuePrompt":{zh:"作品文件夹「{name}」已经建好,这条对话的工作目录已经切过去了。请在这里接着做。",en:"The creation folder “{name}” is ready and this conversation now works in it. Please continue building here."},"creation.err.running":{zh:"这条对话还在运行,等这一轮结束再点。",en:"This conversation is still running. Try again when this turn has finished."},"creation.err.outside":{zh:"卡片里的文件夹不在这条对话的工作目录里,不能从这里加入。",en:"The folder in this card is outside this conversation’s working folder, so it cannot be added from here."},"creation.err.invalid_source":{zh:"找不到要加入的文件夹。",en:"The folder to add was not found."},"creation.err.forbidden_source":{zh:"这个文件夹不能加入造物(比如家目录、造物自己的文件夹这类位置)。",en:"This folder cannot be added to Creations (for example your home folder or the Creations folder itself)."},"creation.err.nested":{zh:"这个文件夹在另一个造物里面,或者里面已经有造物了,不能再单独加入。",en:"This folder is inside another creation, or already contains one, so it cannot be added on its own."}});async function yc(t,n,s){const a=await window.tangu.productsRegister(t,n,s);if(!a.ok)throw new Error(Se(`creation.err.${a.code}`));return{dir:a.dir,name:a.name}}function jc({cards:t,sessionId:n}){return!t.length||!window.tangu?.productsCreate||!window.tangu?.productsRegister?null:e.jsx("div",{className:"t2-tasks",children:t.map((s,a)=>e.jsx(kc,{card:s,sessionId:n},`${a}:${s.name}:${s.path||""}`))})}function kc({card:t,sessionId:n}){const{t:s}=V(),a=P(C=>n?C.sessions.find(y=>y.id===n):void 0),o=P(C=>n?C.configBySession[n]?.cwd:void 0),i=P(C=>C.defaultWsDir),r=o||a?.project_path||"",[d,p]=c.useState(!1);c.useEffect(()=>{let C=!0;return p(!1),r&&window.tangu?.productsIsCreation?.(r).then(y=>{C&&p(!!y)}).catch(()=>{}),()=>{C=!1}},[r]);const[f,m]=c.useState(!1),[g,w]=c.useState(""),[x,N]=c.useState(null),b=!!t.path,j=!!r&&vt(r)!==vt(i||""),T=b?wc(r,t.path,j):null,u=x??(d?{dir:r,name:a?.project_name||t.name,moved:!0}:null),$=async()=>{const C=window.tangu;if(!C?.productsCreate||!C.productsRegister||f)return;if(m(!0),w(""),n&&(P.getState().runningBySession[n]||!Oo(n))){w(s("creation.err.running")),m(!1);return}let y=!1,h="";try{let S,H;if(b){if(!T)throw new Error(s("creation.err.outside"));({dir:S,name:H}=await yc(T,r,!j))}else{const K=await C.productsCreate(t.name);S=K.dir,H=K.name}const G=P.getState();y=!!r&&vt(S)===vt(r)||(n?await G.moveSessionToProject(n,S,H)==="moved":!1),y||(G.setNewChatWs({key:S,name:H,kind:"local",path:S}),G.setActiveId(null)),N({dir:S,name:H,moved:y}),h=H}catch(S){w(String(S?.message||S))}finally{n&&Bo(n),m(!1)}y&&!b&&n&&P.getState().send(s("creation.continuePrompt",{name:h}),[],void 0,void 0,void 0,n)},k=()=>{u&&(Qt("coding"),requestAnimationFrame(()=>{nn.getState().openProject(u.dir,u.name)}))};return e.jsxs("div",{className:`t2-taskcard t2-creationcard${u?" done":""}${f?" busy":""}`,"data-creation-card":b?"add":"create",children:[e.jsxs("div",{className:"t2-taskcard-head",children:[b?e.jsx(On,{size:13}):e.jsx(Ke,{size:13})," ",e.jsx("b",{children:s(b?"creation.card.addTitle":"creation.card.createTitle",{name:t.name})})]}),e.jsx("div",{className:"t2-taskcard-tldr",children:s(b?"creation.card.addBody":"creation.card.createBody",{path:t.path||""})}),u?e.jsxs("div",{className:"t2-taskcard-done","data-creation-done":!0,children:[s(u.moved?"creation.card.done":"creation.card.doneNewChat",{name:u.name}),e.jsxs("div",{className:"t2-taskcard-actions",children:[e.jsxs("button",{onClick:k,children:[e.jsx(Nt,{size:12})," ",s("creation.card.openStudio")]}),e.jsxs("button",{onClick:()=>Qt("artificial"),children:[e.jsx(qo,{size:12})," ",s("creation.card.openCreations")]})]})]}):b&&!T?e.jsx("div",{className:"t2-taskcard-done",role:"alert",children:s("creation.err.outside")}):e.jsx("div",{className:"t2-taskcard-actions",children:e.jsxs("button",{className:"primary",disabled:f,onClick:()=>{$()},"data-creation-accept":!0,children:[f?e.jsx(Oe,{size:12,className:"spin"}):b?e.jsx(On,{size:12}):e.jsx(Ke,{size:12})," ",s(b?"creation.card.add":"creation.card.create")]})}),g&&e.jsx("div",{className:"t2-taskcard-done",role:"alert","data-creation-error":!0,children:g})]})}const Gt=new Map,Yt=new Set;function bc(t){let n=5381;for(let s=0;s<t.length;s++)n=(n<<5)+n+t.charCodeAt(s)|0;return(n>>>0).toString(36)}function Sc(t,n,s){return`${t}:${n}:${bc(`${s.title}|${s.prompt}`)}`}function Nc({tasks:t,ownerId:n,onTask:s,noHere:a=!1,todoStatus:o,onTodoRetry:i}){const{t:r}=V(),[d,p]=c.useState({}),[f,m]=c.useState(null),[g,w]=c.useState({});return t.length?e.jsx("div",{className:"t2-tasks",children:t.map((x,N)=>{const b=Sc(n,N,x),j=d[b]??Gt.get(b),T=!j&&x.todo&&o?o[x.todo]??"checking":"pending",u=T!=="pending",$=f===b,k=!!g[b],C=!!window.tangu?.backendStatus,y=async I=>{if($||j||u||Yt.has(b)||Gt.has(b))return;Yt.add(b),m(b);let L=!1;try{L=await s?.(x,I)!==!1}catch{L=!1}Yt.delete(b),m(z=>z===b?null:z),L&&(Gt.set(b,I),p(z=>({...z,[b]:I})))},h=(I,L,z,F=!1)=>e.jsxs("button",{className:F?"primary":"",disabled:$,onClick:()=>{y(I)},children:[L," ",z]},I),S=!!(x.track||x.todo)&&C,H=a?null:h("here",e.jsx(bs,{size:12}),r("chat.task.here"),!S),G=h("new",e.jsx(Us,{size:12}),r("chat.task.new"),a&&!S),O=C?h("muse",e.jsx(Ke,{size:12}),r(x.todo?"chat.task.museDo":"chat.task.muse"),S):null,K=j==="here"?"chat.task.doneHere":j==="new"?"chat.task.doneNew":j==="muse"?x.todo?"chat.task.doneMuseDo":"chat.task.doneMuse":"chat.task.doneIgnore";return e.jsxs("div",{className:`t2-taskcard${j||u?" done":""}${$?" busy":""}`,children:[e.jsxs("div",{className:"t2-taskcard-head",children:[e.jsx(At,{size:13})," ",e.jsx("b",{children:x.title}),x.track&&e.jsx("span",{className:"t2-taskcard-tag",children:r("chat.task.trackTag")})]}),x.tldr&&e.jsx("div",{className:"t2-taskcard-tldr",children:x.tldr}),e.jsxs("button",{className:"t2-taskcard-toggle",onClick:()=>w(I=>({...I,[b]:!k})),"aria-expanded":k,children:[k?e.jsx(ot,{size:12}):e.jsx(ve,{size:12})," ",r(k?"chat.task.hidePrompt":"chat.task.showPrompt")]}),k&&e.jsx("pre",{className:"t2-taskcard-prompt",children:x.prompt}),j?e.jsx("div",{className:"t2-taskcard-done",children:r(K)}):u?e.jsxs("div",{className:"t2-taskcard-done",children:[r(T==="checking"?"chat.task.todoChecking":T==="error"?"chat.task.todoCheckFail":T==="missing"?"chat.task.todoMissing":"chat.task.doneTodo"),T==="error"&&i&&e.jsxs(e.Fragment,{children:[" ",e.jsx("button",{className:"t2-taskcard-toggle",onClick:i,children:r("inbox.approval.retry")})]})]}):e.jsxs("div",{className:"t2-taskcard-actions",children:[S?[O,H,G]:[H,G,O],h("ignore",e.jsx(Ye,{size:12}),r("chat.task.ignore"))]})]},b)})}):null}function xa(t){if(!t.planProposal)return;const n=(t.inquiries||[]).filter(s=>s.kind==="plan");return n.find(s=>s.status==="pending")||n[n.length-1]}function zc(t){const n=[];for(const s of t||[]){const a=s.work&&s.agentName?{agentName:s.agentName}:{};for(const i of s.approvals||[])i.status==="pending"&&n.push({kind:"approval",id:i.approvalId,messageId:s.id,req:i,...a});const o=xa(s);for(const i of s.inquiries||[])i.status==="pending"&&(i===o&&s.planProposal?n.push({kind:"plan",id:i.inquiryId,messageId:s.id,req:i,plan:s.planProposal,...a}):n.push({kind:"inquiry",id:i.inquiryId,messageId:s.id,req:i,...a}))}return n}const wa="<approval_update>";function Cc(t){return[...t.matchAll(/^\[(approved|rejected|failed)\] (\S+) \(call ([^)]*)\) — (.*)$/gm)].map(n=>({status:n[1],name:n[2],callId:n[3],preview:n[4]}))}function Ec(t,n){if(!n)return;let s;for(const a of t||[])for(const o of a.approvals||[])o.toolCallId===n&&(s=o);return s}se({"chat.team.working":{zh:"工作中 · {activity}",en:"Working · {activity}"},"chat.team.workingIdle":{zh:"工作中",en:"Working"},"chat.team.waiting":{zh:"等待你的审批",en:"Waiting for your approval"},"chat.team.waitingAnswer":{zh:"等你回答 · 在输入框上方",en:"Waiting for your answer · above the input box"},"chat.team.done":{zh:"已完成",en:"Done"},"chat.approval.pointer":{zh:"{name} 等你批准 · 在输入框上方",en:"{name} is waiting for your approval · above the input box"},"chat.approval.pointerN":{zh:"{n} 项操作等你批准 · 在输入框上方",en:"{n} actions are waiting for your approval · above the input box"},"chat.inquiry.pointer":{zh:"有问题等你回答 · 在输入框上方",en:"A question is waiting for your answer · above the input box"},"chat.inquiry.pointerN":{zh:"{n} 个问题等你回答 · 在输入框上方",en:"{n} questions are waiting for your answer · above the input box"},"chat.approval.update.approved":{zh:"已批准并执行 {name}",en:"Approved and ran {name}"},"chat.approval.update.failed":{zh:"已批准,{name} 执行出错",en:"Approved; {name} ran with an error"},"chat.approval.update.rejected":{zh:"已拒绝 {name}(没有执行)",en:"Rejected {name} (not run)"},"chat.approval.update.byApproved":{zh:"{where}批准",en:"Approved {where}"},"chat.approval.update.byRejected":{zh:"{where}拒绝",en:"Rejected {where}"}});const Tc={approved:"chat.approval.update.approved",failed:"chat.approval.update.failed",rejected:"chat.approval.update.rejected"};function Mc(t,n){const s=new Map((n||[]).map(r=>[r.callId,r])),a=[];let o=[];const i=()=>{o.length&&a.push({t:"tools",events:o}),o=[]};for(const r of t){o.push(r);const d=s.get(r.id);d&&(i(),a.push({t:"sketch",item:d}))}return i(),a}function Xn(t){const n=(t||"").trim();return n?Array.from(n)[0].toUpperCase():"?"}const ya=/provided authentication token is expired|try signing in again/i,Rc=[[ya,"chat.err.subExpired"],[/token_quota_exceeded/i,"chat.err.quota"],[/engine_unavailable_remote/i,"chat.err.engineRemote"],[/run_cost_exceeded/i,"chat.err.runCost"],[/input_too_large/i,"chat.err.inputTooLarge"],[/group_needs_2_agents/i,"chat.err.groupAgents"],[/^orphaned$|stale: process restarted/i,"chat.err.orphaned"],[/fetch failed|ECONNREFUSED|ENOTFOUND|EAI_AGAIN/i,"chat.err.network"],[/terminated|ECONNRESET|socket hang up|premature close/i,"chat.err.dropped"],[/ETIMEDOUT|timed? ?out/i,"chat.err.timeout"],[/(^|\D)(401|403)(\D|$)|unauthorized|invalid[ _-]?api[ _-]?key/i,"chat.err.auth"],[/(^|\D)429(\D|$)|rate[ _-]?limit|insufficient[ _-]?quota/i,"chat.err.rate"],[/(^|\D)5\d\d(\D|$)|bad gateway|overloaded/i,"chat.err.server"]];function ja(t,n){if(!t)return n("chat.error");const s=Rc.find(([a])=>a.test(t));return s?`${n(s[1])}(${t})`:t}se({"chat.err.subExpired":{zh:"直连账号的登录已过期,需要重新登录",en:"Your direct-connection sign-in has expired — please sign in again"},"chat.err.relogin":{zh:"重新登录 {provider}",en:"Sign in to {provider} again"},"rewind.title":{zh:"回退到这条消息",en:"Rewind to this message"},"rewind.counting":{zh:"正在统计改动…",en:"Counting changes…"},"rewind.codeOnly":{zh:"仅回退代码({n} 个文件)",en:"Code only ({n} file(s))"},"rewind.convOnly":{zh:"仅回退对话(原文回输入框)",en:"Conversation only (prompt back in the box)"},"rewind.both":{zh:"代码 + 对话都回退",en:"Both code and conversation"},"rewind.scopeNote":{zh:"只覆盖 Agent 经内置写文件工具(write/edit/multi_edit/apply_patch)改过的文件;终端命令与插件/MCP 工具改的不在内。",en:"Covers only files changed through the built-in file-writing tools (write/edit/multi_edit/apply_patch); changes made by shell commands or plugin/MCP tools are not included."},"rewind.skippedNote":{zh:"另有 {n} 个文件当时太大未存快照,恢复不了。",en:"{n} file(s) were too large to snapshot and cannot be restored."},"rewind.keepNote":{zh:"Agent 新建、之后又被改动过的文件会原样保留,不会被删。",en:"Files the agent created that changed afterwards are kept as-is, never deleted."}});function Ac(t,n){if(!t||!ya.test(t))return null;const s=(n||"").split("/")[0];return s&&s in Cs?s:null}function ka({error:t,modelId:n}){const{t:s}=V(),a=Ac(t,n);return!a||!window.tangu?.providerLogin?null:e.jsxs("button",{className:"t2-relogin",onClick:()=>P.getState().openSettings("model/m-providers"),children:[e.jsx(Zo,{size:12})," ",s("chat.err.relogin",{provider:Cs[a]})]})}function Pc({reasoning:t}){const{t:n}=V(),[s,a]=c.useState(!1);return e.jsxs("div",{className:"t2-think",children:[e.jsxs("button",{className:"t2-think-head",onClick:()=>a(o=>!o),children:[s?e.jsx(ot,{size:13}):e.jsx(ve,{size:13})," ✦ ",n("thinking.process")," ",e.jsxs("span",{className:"t2-dim",children:["· ",n("thinking.charCount",{count:t.length})]})]}),e.jsx($e,{open:s,children:e.jsx("div",{className:"t2-think-body",children:t})})]})}const Ic=({at:t,ctx:n,onPick:s})=>{const{t:a}=V(),[o,i]=c.useState(null),[r,d]=c.useState(!1),p=c.useRef(null),f=Jo(!0,{boundary:".t2-chat-view"});c.useEffect(()=>{if(!n?.sessionId||!t){i({files:0,skipped:0});return}let g=!0;return Qo(ce(n.sessionId),n.sessionId).then(w=>{if(!g)return;const x=new Set,N=new Set;for(const b of w)b.at<t||(b.files.forEach(j=>x.add(j)),b.skipped.forEach(j=>N.add(j)));N.forEach(b=>x.delete(b)),i({files:x.size,skipped:N.size})}).catch(()=>{g&&i({files:0,skipped:0})}),()=>{g=!1}},[t,n?.sessionId,n?.cfg]),c.useLayoutEffect(()=>{const g=p.current;if(!g)return;const w=document.querySelector(".composer-anchor")?.getBoundingClientRect().top??window.innerHeight;g.getBoundingClientRect().bottom>w-4&&d(!0)},[o]);const m=o?.files??0;return e.jsxs("div",{ref:g=>{p.current=g,f.ref.current=g},className:`composer-menu rewind-menu left${r?" up":""}`,style:f.style,children:[e.jsx("div",{className:"menu-section",children:a("rewind.title")}),e.jsxs("button",{className:"menu-item",disabled:!m,onClick:()=>s("code"),children:[e.jsx(Dr,{size:14}),e.jsx("span",{className:"grow",children:o?a("rewind.codeOnly",{n:m}):a("rewind.counting")})]}),e.jsxs("button",{className:"menu-item",onClick:()=>s("conversation"),children:[e.jsx(Xo,{size:14}),e.jsx("span",{className:"grow",children:a("rewind.convOnly")})]}),e.jsxs("button",{className:"menu-item",disabled:!m,onClick:()=>s("both"),children:[e.jsx(fn,{size:14}),e.jsx("span",{className:"grow",children:a("rewind.both")})]}),e.jsxs("div",{className:"menu-section rewind-note",children:[a("rewind.scopeNote")," ",a("rewind.keepNote"),!!o?.skipped&&e.jsxs(e.Fragment,{children:[" ",a("rewind.skippedNote",{n:o.skipped})]})]})]})};function Dc({sessionId:t,callId:n,status:s}){const{t:a}=V(),o=P(d=>t?Ec(d.messagesBySession[t],n):void 0),i=Uo(t);if(!o?.answeredBy)return null;const r=Ko(o.answeredBy,{remotePage:so(t),answeredHere:no(o.approvalId),hostName:i},a);return r?e.jsx("div",{className:"t2-apv-update-by","data-answered-by":!0,children:a(s==="rejected"?"chat.approval.update.byRejected":"chat.approval.update.byApproved",{where:r})}):null}function Zn({onInsert:t}){const{t:n}=V(),s=Hl();if(s==="hidden")return null;const a=s==="ready";return e.jsx("button",{className:"t2-iconbtn","data-act":"insert-note","aria-disabled":a?void 0:!0,title:n(a?"chat.action.insertNote":"chat.insertNote.none"),"aria-label":n("chat.action.insertNote"),onClick:t,children:e.jsx(wr,{size:14})})}function Fc({msg:t,avatarUrl:n,agentNameFallback:s,userName:a,userAvatar:o,handlers:i,fileCtx:r,rootRef:d,speakState:p,voice:f,modelId:m,showWaitDetails:g=!1,footer:w}){const x=r?.sessionId,N=c.useMemo(()=>x?{cwd:P.getState().configBySession[x]?.cwd||P.getState().sessions.find(A=>A.id===x)?.project_path||void 0,onRun:A=>{P.getState().send(Ho(A),[],void 0,void 0,void 0,x)}}:void 0,[x]),b=r?.execMode,j=c.useMemo(()=>x&&Xt!=="mobile"&&window.tangu?.readHostFile?{execMode:b}:void 0,[x,b]),{t:T}=V();t=uc(t);const[u,$]=c.useState(!1),[k,C]=c.useState(!1);if(c.useEffect(()=>{if(!k)return;const A=J=>{J.target?.closest?.("[data-cmenu]")||C(!1)},Y=J=>{J.key==="Escape"&&C(!1)};return document.addEventListener("mousedown",A),document.addEventListener("keydown",Y),()=>{document.removeEventListener("mousedown",A),document.removeEventListener("keydown",Y)}},[k]),t.role==="system"){if(t.groupVote){const A=t.groupVote;return e.jsxs("div",{ref:d,className:"t2-sys",children:[e.jsx("span",{className:"t2-dim",children:T("group.vote.round",{round:A.round})})," ",e.jsx("b",{children:T("group.vote.tally",{end:A.endCount,total:A.total})})]})}return t.content?e.jsx("div",{ref:d,className:"t2-sys",children:t.content}):null}if(t.role==="user"){if(t.content.startsWith("<turn_interrupted>"))return e.jsxs("div",{ref:d,className:"t2-sys t2-interrupted",children:["⏹ ",T("msg.interrupted")]});if(t.content.startsWith(wa)){const D=Cc(t.content);return e.jsx("div",{ref:d,className:"t2-sys t2-apv-update","data-approval-update":D.length,children:D.map(B=>e.jsxs(c.Fragment,{children:[e.jsxs("div",{className:"t2-apv-update-row","data-status":B.status,children:[B.status==="approved"?e.jsx(mn,{size:12}):e.jsx(Ft,{size:12}),e.jsx("span",{className:"t2-apv-update-what",children:T(Tc[B.status],{name:B.name})}),e.jsx("span",{className:"t2-apv-update-preview",title:B.preview,children:B.preview})]}),e.jsx(Dc,{sessionId:x,callId:B.callId,status:B.status})]},B.callId))})}const A=a||T("chat.you"),Y=eo(t.content),J=Y?Y.body.trim()||Y.refs.map(D=>D.name).join(" "):t.content;return e.jsxs("div",{ref:d,className:"t2-userwrap",id:`tocmsg-${t.id}`,"data-toc-msg-role":"user","data-toc-title":J,children:[e.jsxs("div",{className:"t2-user-col",children:[e.jsx("div",{className:"t2-username",children:A}),e.jsxs("div",{className:"t2-user",children:[!!t.attachments?.length&&e.jsx("div",{className:"msg-attach-grid",children:t.attachments.map((D,B)=>D.mimeType?.startsWith("image/")&&D.data?e.jsx("img",{className:"msg-attach-img",src:`data:${D.mimeType};base64,${D.data}`,alt:D.name,title:D.name},`${D.name}-${B}`):e.jsxs("span",{className:"msg-attach-file",title:D.name,children:["📎 ",D.name]},`${D.name}-${B}`))}),Y&&e.jsx("div",{className:"t2-user-refs",children:Y.refs.map((D,B)=>e.jsx(to,{chip:D,children:D.wiki?e.jsx(Wo,{inner:D.wiki}):void 0},`${D.token}-${B}`))}),Y?Y.body&&e.jsx(An,{text:Y.body}):e.jsx(An,{text:t.content})]}),e.jsxs("div",{className:"t2-actions",children:[e.jsx(es,{at:t.timestamp}),e.jsx("button",{className:"t2-iconbtn",title:T("chat.action.copy"),onClick:()=>i?.onCopy?.(t.content),children:e.jsx(St,{size:14})}),e.jsx("button",{className:"t2-iconbtn",title:T("chat.action.edit"),onClick:()=>i?.onEdit?.(),children:e.jsx(ft,{size:14})}),i?.onRewind&&e.jsxs("span",{style:{position:"relative",display:"inline-flex"},"data-cmenu":!0,children:[e.jsx("button",{className:"t2-iconbtn",title:T("rewind.title"),onClick:()=>C(D=>!D),children:e.jsx(fn,{size:14})}),k&&e.jsx(Ic,{at:t.timestamp,ctx:r,onPick:D=>{C(!1),i.onRewind?.(D)}})]})]})]}),e.jsx("div",{className:"t2-avatar t2-user-avatar",style:o?void 0:{background:"color-mix(in srgb, var(--text-muted) 22%, transparent)"},children:o?e.jsx("img",{src:o,alt:""}):Xn(A)})]})}const y=t.status==="streaming",h=window.tangu?.productsRegister?["suggest","task","creation"]:["suggest","task"],{text:S,items:H,tasks:G,creations:O}=Pn(t.content,{streaming:y,kinds:h}),K=i?.onInsertNote?A=>e.jsx(Zn,{onInsert:()=>i.onInsertNote?.(xr(A.html))}):void 0,I=xa(t),L=(t.approvals||[]).filter(A=>A.status==="pending"),z=(t.inquiries||[]).filter(A=>A!==I&&A.status==="pending"),F=z.length>0||I?.status==="pending",W=!!f?.on&&(t.status==="done"||t.status==="stopped"),te=new Set((t.sketches||[]).map(A=>A.callId)),oe=new Set;if(!W){for(const A of t.segments||[])if(A.t==="tools")for(const Y of A.ids)te.has(Y)&&oe.add(Y)}const Q=(t.sketches||[]).filter(A=>!oe.has(A.callId));return e.jsxs("div",{ref:d,className:"t2-asst",id:`tocmsg-${t.id}`,children:[e.jsx("div",{className:"t2-avatar",style:!n&&t.agentColor?{background:t.agentColor,color:"#fff"}:void 0,children:n?e.jsx("img",{src:n,alt:""}):Xn(t.agentName||s||"Tangu")}),e.jsxs("div",{className:"t2-asst-col",children:[e.jsxs("div",{className:"t2-name",style:t.agentColor?{color:t.agentColor}:void 0,children:[t.agentName||s||"Tangu",t.status==="streaming"&&e.jsx("span",{className:"t2-dot"})]}),t.systemPrompt&&e.jsx(Xl,{content:t.systemPrompt}),t.reasoning&&e.jsx(Pc,{reasoning:t.reasoning}),(()=>{if(t.segments?.length&&!W){let A;const Y=t.segments.reduce((J,D,B)=>D.t==="text"?B:J,-1);return t.segments.map((J,D)=>{if(J.t==="text"){const Z=Pn(J.text,{streaming:y||D!==Y,state:A,kinds:h});A=Z.state;const re=Z.text;return re?e.jsx("div",{className:"t2-content",children:e.jsx(qe,{content:re,anchorPrefix:`toc-${t.id}`,run:N,embeds:j})},D):null}const B=J.ids.map(Z=>t.toolEvents?.find(re=>re.id===Z)).filter(Boolean),X=Mc(B,t.sketches);return X.length?e.jsx(c.Fragment,{children:X.map((Z,re)=>Z.t==="tools"?e.jsx(Qn,{events:Z.events,running:t.status==="streaming",approvals:t.approvals,awaitingAnswer:F},`tools-${Z.events.map(xe=>xe.id).join("-")}-${re}`):e.jsx(qn,{items:[Z.item],actions:K,stateScope:x?`${x}:${t.id}`:void 0},`sketch-${Z.item.callId}`))},D):null})}return e.jsxs(e.Fragment,{children:[!!t.toolEvents?.length&&e.jsx(Qn,{events:t.toolEvents,running:t.status==="streaming",approvals:t.approvals,awaitingAnswer:F}),S&&(W?e.jsx(Ql,{text:S,stored:f.stored,anchorPrefix:`toc-${t.id}`}):e.jsx("div",{className:"t2-content",children:e.jsx(qe,{content:S,anchorPrefix:`toc-${t.id}`,run:N,embeds:j})}))]})})(),!!H.length&&t.status==="done"&&e.jsx("div",{className:"t2-suggest",children:H.map((A,Y)=>e.jsxs("button",{className:"t2-suggest-chip",disabled:u,onClick:()=>{$(!0),i?.onSuggest?.(A)},children:[e.jsx(Vo,{size:13})," ",A]},Y))}),!!G.length&&t.status==="done"&&e.jsx(Nc,{tasks:G,ownerId:t.id,onTask:i?.onTask}),!!O.length&&t.status==="done"&&e.jsx(jc,{cards:O,sessionId:x}),r&&e.jsx(Yl,{changes:Gl(t.toolEvents),cfg:r.cfg,sessionId:r.sessionId}),t.planProposal&&e.jsx(gc,{plan:t.planProposal,req:I},I?.inquiryId||"plan"),!!t.todos?.length&&e.jsx(xc,{todos:t.todos}),g&&t.status==="streaming"&&t.live&&e.jsx($c,{live:t.live}),t.status==="streaming"&&t.work&&e.jsx("div",{className:"t2-dim chat-thinking-live",role:"status","aria-live":"polite","data-team-work":t.work.waiting?"waiting":"working",children:e.jsx("span",{className:t.work.waiting?void 0:"chat-run-shimmer-text",children:t.work.waiting?T(!L.length&&F?"chat.team.waitingAnswer":"chat.team.waiting"):t.work.activity?T("chat.team.working",{activity:t.work.activity}):T("chat.team.workingIdle")})}),!S&&t.status==="streaming"&&!t.work&&!t.toolEvents?.length&&!t.reasoning&&(!t.live||!g)&&e.jsx("div",{className:"t2-dim chat-thinking-live chat-run-shimmer-text",role:"status","aria-live":"polite",children:T("chat.thinking")}),t.teamDone&&t.status!=="streaming"&&e.jsxs("div",{className:"t2-dim t2-team-done","data-team-done":"1",children:["✓ ",T("chat.team.done")]}),!!t.displayFiles?.length&&r&&e.jsx(fr,{files:t.displayFiles,cfg:r.cfg,sessionId:r.sessionId,execMode:r.execMode,onOpenPreview:r.onOpenPreview}),!!Q.length&&e.jsx(qn,{items:Q,actions:K,stateScope:x?`${x}:${t.id}`:void 0}),!t.work&&L.length>0&&e.jsxs("div",{className:"t2-dim t2-apv-pointer","data-approval-pointer":L.length,children:[e.jsx(fs,{size:12}),L.length===1?T("chat.approval.pointer",{name:L[0].name}):T("chat.approval.pointerN",{n:L.length})]}),!t.work&&z.length>0&&e.jsxs("div",{className:"t2-dim t2-apv-pointer","data-inquiry-pointer":z.length,children:[e.jsx(yn,{size:12}),z.length===1?T("chat.inquiry.pointer"):T("chat.inquiry.pointerN",{n:z.length})]}),t.inquiries?.filter(A=>A!==I&&A.status!=="pending").map(A=>e.jsx(fa,{req:A,onAnswer:()=>{}},A.inquiryId)),t.status==="error"&&e.jsxs("div",{className:"t2-tool err",children:[e.jsxs("span",{className:"t2-status-err",children:["✕ ",ja(t.error,T)]}),e.jsx(ka,{error:t.error,modelId:m})]}),t.status==="stopped"&&e.jsxs("div",{className:"t2-dim",children:["⏹ ",T("chat.aborted")]}),w,(t.status==="done"||t.status==="stopped")&&e.jsxs("div",{className:"t2-actions",children:[e.jsx("button",{className:"t2-iconbtn",title:T("chat.action.copy"),onClick:()=>i?.onCopy?.(S),children:e.jsx(St,{size:14})}),i?.onSpeak&&!!S&&e.jsx("button",{className:"t2-iconbtn",title:T(p?"chat.action.stopSpeak":"chat.action.speak"),onClick:()=>i.onSpeak?.(S),children:p==="loading"?e.jsx(Oe,{size:14,className:"spin"}):p==="playing"?e.jsx(Ss,{size:14}):e.jsx(ll,{size:14})}),i?.onInsertNote&&!!S&&e.jsx(Zn,{onInsert:()=>i.onInsertNote?.(S)}),e.jsx("button",{className:"t2-iconbtn",title:T("chat.action.regenerate"),onClick:()=>i?.onRegenerate?.(),children:e.jsx(_t,{size:14})}),e.jsx("button",{className:"t2-iconbtn",title:T("chat.action.branch"),onClick:()=>i?.onBranch?.(),children:e.jsx(Or,{size:14})}),e.jsx(es,{at:t.timestamp})]})]})]})}function es({at:t}){return t>0?e.jsx("span",{className:"t2-msgtime",title:Yo(t,{year:"always"}),children:Go(t)}):null}function _c(t){const[n,s]=c.useState(Date.now());return c.useEffect(()=>{s(Date.now());const a=setInterval(()=>s(Date.now()),1e3);return()=>clearInterval(a)},[t]),Math.max(0,Math.floor((n-t)/1e3))}function $c({live:t}){const{t:n}=V(),s=_c(t.since),a=Math.max(1,Math.round((t.bytes||0)/1024)),o=t.phase==="sending"&&t.bytes?n("chat.wait.sending",{kb:a}):n("chat.wait.firstToken");return e.jsxs("div",{className:"t2-dim chat-thinking-live",role:"status","aria-live":"polite",children:[e.jsx("span",{className:"chat-run-shimmer-text",children:o}),s>=2&&e.jsxs("span",{className:"chat-wait-elapsed",children:[" · ",n("chat.wait.elapsed",{s})]})]})}se({"approval.tray.title":{zh:"等你批准 · {n}",en:"Waiting for your approval · {n}"},"approval.tray.titleAny":{zh:"等你处理 · {n}",en:"Waiting for you · {n}"},"approval.tray.label":{zh:"等你处理的事项",en:"Items waiting for you"},"approval.tray.planRow":{zh:"计划等你拍板",en:"Plan waiting for your decision"}});const Lc=350;function qc({items:t,onDecide:n,onAnswer:s,sessionId:a}){const{t:o}=V(),[i,r]=c.useState(null),[d,p]=c.useState(!1),f=t.find(u=>u.id===i)??t[0],m=f?.id;c.useEffect(()=>{m&&m!==i&&r(m)},[m,i]);const[g,w]=c.useState(void 0);c.useEffect(()=>{const u=setTimeout(()=>w(m),Lc);return()=>clearTimeout(u)},[m]);const x=c.useRef(new Set),[,N]=c.useState(0);c.useEffect(()=>{for(const u of x.current)t.some($=>$.id===u)||x.current.delete(u)},[t]);const b=(u,$)=>{if(g!==u||x.current.has(u))return;x.current.add(u),N(C=>C+1);const k=()=>{x.current.delete(u),N(C=>C+1)};Promise.resolve().then($).then(C=>{C===!1&&k()},k)};if(!f)return null;const j=x.current.has(f.id),T=t.every(u=>u.kind==="approval")?"approval.tray.title":"approval.tray.titleAny";return e.jsxs("div",{className:"t2c-apv",role:"region","aria-label":o("approval.tray.label"),"data-approval-tray":t.length,children:[e.jsxs("button",{type:"button",className:"t2c-apv-head","aria-expanded":!d,onClick:()=>p(u=>!u),children:[e.jsx(fs,{size:13,className:"t2c-apv-ic"}),e.jsx("span",{className:"t2c-apv-title",children:o(T,{n:t.length})}),e.jsx(ot,{size:13,className:`t2c-apv-chev${d?" is-collapsed":""}`})]}),!d&&t.length>1&&e.jsx("div",{className:"t2c-apv-rest",children:t.filter(u=>u!==f).map(u=>e.jsxs("button",{type:"button",className:"t2c-apv-row","data-tray-kind":u.kind,"data-tray-msg":u.messageId,title:ts(u,o),onClick:()=>r(u.id),children:[u.agentName&&e.jsx("span",{className:"t2c-apv-row-from",children:u.agentName}),u.kind==="approval"?e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"t2c-apv-row-name",children:u.req.name}),e.jsx("span",{className:"t2c-apv-row-preview",children:u.req.preview})]}):e.jsxs(e.Fragment,{children:[u.kind==="plan"?e.jsx(At,{size:12,className:"t2c-apv-row-ic"}):e.jsx(yn,{size:12,className:"t2c-apv-row-ic"}),e.jsx("span",{className:"t2c-apv-row-text",children:ts(u,o)})]})]},u.id))}),!d&&e.jsxs("div",{className:`t2c-apv-body${g===m?"":" is-arming"}${j?" is-sent":""}`,"data-tray-kind":f.kind,"data-tray-msg":f.messageId,children:[f.agentName&&e.jsx("div",{className:"t2c-apv-from",children:f.agentName}),f.kind==="approval"?e.jsx(ao,{req:f.req,sessionId:a,onDecide:(u,$)=>b(f.id,()=>n(f.messageId,f.id,u,$))},f.id):f.kind==="plan"?e.jsx(vc,{plan:f.plan,req:f.req,busy:j,onAnswer:u=>b(f.id,()=>s(f.messageId,f.id,u))},f.id):e.jsx(fa,{req:f.req,onAnswer:u=>b(f.id,()=>s(f.messageId,f.id,u))},f.id)]})]})}function ts(t,n){return t.kind==="approval"?t.req.preview:t.kind==="plan"?n("approval.tray.planRow"):t.req.question}se({"chat.runStats.tokens":{zh:"{n} tokens",en:"{n} tokens"},"chat.runStats.thinking":{zh:"思考中 {t}",en:"Thinking {t}"},"chat.runStats.thought":{zh:"思考 {t}",en:"Thought for {t}"}});const ns=t=>{const n=Math.max(0,Math.floor(t/1e3));return n<60?`${n}s`:n<3600?`${Math.floor(n/60)}m ${n%60}s`:`${Math.floor(n/3600)}h ${String(Math.floor(n/60)%60).padStart(2,"0")}m`};function ss({stats:t}){const{t:n}=V(),s=t.finishedAt==null,[a,o]=c.useState(Date.now);c.useEffect(()=>{if(!s)return;o(Date.now());const p=setInterval(()=>o(Date.now()),1e3);return()=>clearInterval(p)},[s]);const i=t.finishedAt??a,r=t.thinkMs+(t.thinkSince!=null?Math.max(0,i-t.thinkSince):0),d=[ns(i-t.startedAt)];return t.tokens>0&&d.push(n("chat.runStats.tokens",{n:oo(t.tokens)})),t.thinkTracked&&r>=1e3&&d.push(n(t.thinkSince!=null?"chat.runStats.thinking":"chat.runStats.thought",{t:ns(r)})),e.jsx("div",{className:"t2-dim t2-runstats","data-run-stats":s?"live":"done",children:d.join(" · ")})}function Oc({title:t,subtitle:n,compact:s=!1}){const{t:a}=V(),o=c.useRef(null);return c.useLayoutEffect(()=>{const i=o.current,r=i?.parentElement;if(!i||!r?.classList.contains("t2-chat-col"))return;const d=r.querySelector(":scope > .composer-anchor");if(!d)return;const p=()=>{i.style.bottom="auto";const m=Math.max(0,r.clientHeight-d.offsetHeight-40),g=m<100?["minimal"]:m<200?["compact","minimal"]:["full","compact","minimal"];let w=0;for(const x of g)if(i.dataset.density=x,w=i.offsetHeight,w<=m)break;i.style.visibility=w>m?"hidden":"",i.style.top=`${Math.max(16,Math.min((r.clientHeight-w)/2,16+m-w))}px`};p();const f=new ResizeObserver(p);return f.observe(r),f.observe(d),f.observe(i),()=>f.disconnect()},[]),e.jsx("div",{className:"t2-empty",ref:o,children:s?t:e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"t2-empty-mark",children:e.jsx(ei,{size:64})}),e.jsx("div",{className:"t2-empty-title",children:t||a("chat.emptyTitle")}),e.jsx("div",{className:"t2-empty-sub",children:n||a("chat.emptyHint")})]})})}se({"ftoc.label":{zh:"目录",en:"Table of contents"}});const Bc=t=>{if(t.dataset.tocMsgRole==="user"){const s=(t.dataset.tocTitle||t.textContent||"").trim();return s?{text:s,level:0,primary:!0}:null}const n=(t.textContent||"").trim();return!n||!t.dataset.tocLevel?null:{text:n,level:Number(t.dataset.tocLevel)||1}};function Hc({scrollContainerRef:t,scanTrigger:n}){const{t:s}=V();return e.jsx(kr,{scrollContainer:t,selector:"[data-toc-msg-role='user'], [data-toc-level]",itemFromElement:Bc,label:s("ftoc.label"),scanTrigger:n})}const Wc={read_file:"file",read_document:"file",read_log:"file",view_image:"file",list_dir:"dir",list_files:"dir",search_files:"search",glob_files:"search",web_search:"search",web_fetch:"web"},Vc=new Set(["write_file","edit_file","multi_edit"]),Uc=/^\*\*\* (?:Add|Update) File: (.+)$/gm,Kc=/^([/~]|[A-Za-z]:[\\/])/,ba=t=>t.split(/[/\\]/).filter(Boolean).pop()||t,Gc=t=>{try{return new URL(t).hostname.replace(/^www\./,"")}catch{return t}},hn=(t,n)=>!n||Kc.test(t)?t:n.replace(/[/\\]+$/,"")+"/"+t,Sa=t=>!!t.done&&!t.isError;function Na(t){try{return t.arguments?JSON.parse(t.arguments):{}}catch{return null}}function Yc(t,n){if(!Sa(t))return null;const s=Wc[t.name]||(t.name.startsWith("browser_")?"web":null);if(!s)return null;const a=Na(t);if(!a)return null;const o=s==="web"?a.url:s==="search"?a.query??a.pattern??a.glob:a.path;let i=typeof o=="string"?o.trim():"";return i?((s==="file"||s==="dir")&&(i=hn(i,n)),{kind:s,id:i,label:s==="web"?Gc(i):s==="search"?i:ba(i),hits:1}):null}function Jc(t,n){if(!Sa(t))return[];const s=Na(t);if(!s)return[];if(Vc.has(t.name)){const o=typeof s.path=="string"?s.path.trim():"";return o?[hn(o,n)]:[]}return t.name!=="apply_patch"?[]:[...(typeof s.patch=="string"?s.patch:typeof s.input=="string"?s.input:"").matchAll(Uc)].map(o=>hn(o[1].trim(),n)).filter(Boolean)}function Qc(t,n,s){const a=[],o=new Map,i=new Map;let r=[],d=null,p=null,f=null,m=!1;for(const g of t){g.role==="user"&&(p=g.timestamp,d=null);for(const w of g.approvals||[])w.status==="pending"&&a.push({kind:"approval",text:w.name});for(const w of g.inquiries||[])w.status==="pending"&&a.push({kind:"inquiry",text:w.question});g.todos&&(r=g.todos);for(const w of g.displayFiles||[]){const x=w.path||w.name;i.delete(x),i.set(x,w)}for(const w of g.toolEvents||[]){w.done||(d=w);for(const j of Jc(w,s)){const T=i.get(j);i.delete(j),i.set(j,T||{name:ba(j),path:j})}const x=Yc(w,s);if(!x)continue;const N=`${x.kind}:${x.id}`,b=o.get(N);b&&(b.hits++,o.delete(N)),o.set(N,b||x)}g.role==="assistant"&&(f=g.status==="error"?g.error||"":null,m=g.status==="stopped")}return{state:a.length?"attention":n?"running":f!==null?"error":m?"stopped":t.length?"done":"idle",attention:a,todos:r,action:n?d:null,sources:[...o.values()].reverse(),outputs:[...i.values()].reverse(),startedAt:p,error:f}}const as=t=>t.state!=="idle";se({"tsum.title":{zh:"任务概览",en:"Task overview"},"tsum.state.running":{zh:"正在运行",en:"Running"},"tsum.state.attention":{zh:"等待你处理",en:"Waiting for you"},"tsum.state.error":{zh:"已失败",en:"Failed"},"tsum.state.stopped":{zh:"已停止",en:"Stopped"},"tsum.state.done":{zh:"已完成",en:"Done"},"tsum.elapsed":{zh:"已运行 {t}",en:"Running {t}"},"tsum.attention.approval":{zh:"需要批准:{name}",en:"Approval needed: {name}"},"tsum.attention.inquiry":{zh:"需要你回答",en:"Needs your answer"},"tsum.plan":{zh:"计划",en:"Plan"},"tsum.scope":{zh:"工作范围",en:"Scope"},"tsum.scope.default":{zh:"默认目录",en:"Default folder"},"tsum.scope.add":{zh:"添加工作文件夹",en:"Add working folder"},"tsum.scope.remove":{zh:"移出工作范围",en:"Remove from scope"},"tsum.scope.hint":{zh:"加进来的文件夹 Agent 可直接读写、不再逐次弹审批;相对路径仍只相对默认目录解析。",en:"Added folders are readable/writable without per-call approval; relative paths still resolve against the default folder."},"tsum.sources":{zh:"来源",en:"Sources"},"tsum.outputs":{zh:"产物",en:"Outputs"},"tsum.openFile":{zh:"打开",en:"Open"},"tsum.openWeb":{zh:"在浏览器中打开",en:"Open in browser"},"tsum.editing":{zh:"正在编辑",en:"Editing"},"tsum.editingTip":{zh:"在 Agent Desk 中查看",en:"Show in Agent Desk"},"tsum.viewAll":{zh:"显示全部 {n} 项",en:"View all {n}"}});const Xc={file:pn,dir:st,web:ai,search:si},os=3;function xt({title:t,count:n,action:s,items:a,children:o}){const{t:i}=V(),[r,d]=c.useState(!0),[p,f]=c.useState(!1);return e.jsxs("details",{className:"t2-tsum-sec",open:r,onToggle:m=>{const g=m.currentTarget.open;d(g),g||f(!1)},children:[e.jsxs("summary",{className:"t2-tsum-sectitle",children:[e.jsx("span",{children:t}),n!==void 0&&e.jsx("span",{className:"t2-tsum-count",children:n}),s&&e.jsx("button",{type:"button",className:"t2-tsum-secact",title:s.label,"aria-label":s.label,onClick:m=>{m.preventDefault(),m.stopPropagation(),s.run()},children:s.icon}),e.jsx(ve,{size:12,className:"t2-tsum-chev"})]}),a?e.jsxs("div",{className:"t2-tsum-scroll",children:[p?a:a.slice(0,os),!p&&a.length>os&&e.jsx("button",{type:"button",className:"t2-tsum-more",onClick:()=>f(!0),children:i("tsum.viewAll",{n:a.length})})]}):o]})}const Zc=t=>{const n=Math.floor(t/1e3);return`${Math.floor(n/60)}:${String(n%60).padStart(2,"0")}`},wt=t=>t.split(/[/\\]/).filter(Boolean).pop()||t;function ed({messages:t,running:n,cwd:s,hostCwd:a,onJumpToAttention:o,onShowEditing:i,onOpenFile:r,extraRoots:d=[],lockedRoots:p=[],onAddRoot:f,onRemoveRoot:m,modelId:g,teamStatus:w}){const{t:x}=V(),N=c.useMemo(()=>Qc(t,n,a),[t,n,a]),b=c.useMemo(()=>n&&i?ti(t,s):null,[t,n,s,i]),[j,T]=c.useState(()=>Date.now());c.useEffect(()=>{if(!n)return;T(Date.now());const y=window.setInterval(()=>T(Date.now()),1e3);return()=>window.clearInterval(y)},[n]);const u=n&&N.startedAt?j-N.startedAt:0,$=N.todos.filter(y=>y.status==="completed").length,k=N.action?ma(N.action):null,C=N.state==="attention"?Xs:N.state==="error"?Ft:N.state==="stopped"?Pr:N.state==="running"?null:mn;return e.jsx("aside",{className:`t2-tsum${as(N)||w?" show":""}`,"aria-hidden":!as(N)&&!w,"aria-busy":N.state==="running","aria-label":x("tsum.title"),children:e.jsxs("div",{className:"t2-tsum-in",children:[!((N.state==="idle"||N.state==="done")&&!t.some(y=>y.role==="assistant"))&&e.jsxs("div",{className:`t2-tsum-state ${N.state}`,role:"status","aria-live":"polite",children:[C&&e.jsx(C,{size:14}),e.jsx("span",{className:`t2-tsum-state-tx${N.state==="running"?" chat-run-shimmer-text":""}`,children:x(`tsum.state.${N.state==="idle"?"done":N.state}`)}),N.todos.length>0&&e.jsxs("span",{className:"t2-tsum-count",children:[$,"/",N.todos.length]})]}),w,u>=3e4&&e.jsx("div",{className:"t2-tsum-sub",children:x("tsum.elapsed",{t:Zc(u)})}),k&&e.jsxs("div",{className:"t2-tsum-sub",title:k.target,children:[k.verbKey?x(k.verbKey):N.action.name," ",k.target]}),b&&i&&e.jsxs("button",{className:"t2-tsum-edit",title:`${x("tsum.editingTip")}:${b.path}`,onClick:()=>i(b.path),children:[e.jsx(ft,{size:11}),e.jsxs("span",{className:"t2-tsum-edit-tx",children:[x("tsum.editing")," ",b.name]})]}),N.state==="error"&&N.error&&e.jsx("div",{className:"t2-tsum-sub err",title:N.error,children:ja(N.error,x)}),N.state==="error"&&e.jsx(ka,{error:N.error??void 0,modelId:g}),N.attention.length>0&&e.jsxs("button",{className:"t2-tsum-attn",onClick:o,children:[N.attention[0].kind==="approval"?x("tsum.attention.approval",{name:N.attention[0].text}):x("tsum.attention.inquiry"),N.attention.length>1&&e.jsxs("span",{className:"t2-tsum-count",children:["+",N.attention.length-1]})]}),N.todos.length>0&&e.jsx(xt,{title:x("tsum.plan"),items:N.todos.map((y,h)=>e.jsxs("div",{className:`t2-tsum-todo ${y.status}`,children:[e.jsx("span",{className:"t2-tsum-todo-mark",children:y.status==="completed"?"✓":y.status==="in_progress"?"●":"○"}),e.jsx("span",{className:"t2-tsum-todo-tx",children:y.content})]},h))}),s&&e.jsx(xt,{title:x("tsum.scope"),action:f?{icon:e.jsx(ni,{size:13}),label:`${x("tsum.scope.add")} — ${x("tsum.scope.hint")}`,run:f}:void 0,items:[e.jsxs("div",{className:"t2-tsum-row",title:`${x("tsum.scope.default")}:${s}`,children:[e.jsx(st,{size:14}),e.jsx("span",{className:"t2-tsum-row-tx",children:wt(s)}),e.jsx("span",{className:"t2-tsum-hits",children:x("tsum.scope.default")})]},"__cwd"),...d.map(y=>e.jsxs("div",{className:"t2-tsum-row t2-tsum-root",title:y,children:[e.jsx(st,{size:14}),e.jsx("span",{className:"t2-tsum-row-tx",children:wt(y)}),m&&!p.includes(y)&&e.jsx("button",{type:"button",className:"t2-tsum-x",title:x("tsum.scope.remove"),"aria-label":`${x("tsum.scope.remove")}:${wt(y)}`,onClick:()=>m(y),children:e.jsx(Ye,{size:12})})]},y))]}),N.sources.length>0&&e.jsx(xt,{title:x("tsum.sources"),count:N.sources.length,items:N.sources.map(y=>{const h=Xc[y.kind],S=`${y.kind}:${y.id}`,H=e.jsxs(e.Fragment,{children:[e.jsx(h,{size:14}),e.jsx("span",{className:"t2-tsum-row-tx",children:y.label}),y.hits>1&&e.jsxs("span",{className:"t2-tsum-hits",children:["×",y.hits]})]});return y.kind==="web"?e.jsx(oi,{className:"t2-tsum-row act",href:y.id,quote:"",title:`${x("tsum.openWeb")}:${y.id}`,children:H},S):y.kind!=="file"||!r?e.jsx("div",{className:"t2-tsum-row",title:y.id,children:H},S):e.jsx("button",{type:"button",className:"t2-tsum-row act",title:y.id,"aria-label":`${x("tsum.openFile")}:${y.label}`,onClick:()=>r({name:y.label,path:y.id}),children:H},S)})}),N.outputs.length>0&&e.jsx(xt,{title:x("tsum.outputs"),count:N.outputs.length,items:N.outputs.map(y=>{const h=wt(y.name||y.path||""),S=e.jsxs(e.Fragment,{children:[e.jsx(pn,{size:14}),e.jsx("span",{className:"t2-tsum-row-tx",children:h})]});return r?e.jsx("button",{type:"button",className:"t2-tsum-row act",title:y.path||y.name,"aria-label":`${x("tsum.openFile")}:${h}`,onClick:()=>r(y),children:S},y.path||y.name):e.jsx("div",{className:"t2-tsum-row",title:y.path||y.name,children:S},y.path||y.name)})})]})})}se({"panel.files.showAllWs":{zh:"显示全部项目",en:"Show all projects"},"panel.files.sessionFiles":{zh:"本会话的文件",en:"Session files"},"panel.files.sessionEmpty":{zh:"还没有附件或产物",en:"No attachments or outputs yet"}});const za=t=>[...t].sort((n,s)=>n.isDir===s.isDir?n.name.localeCompare(s.name):n.isDir?-1:1),Ue=t=>t.slice(0,Math.max(t.lastIndexOf("/"),t.lastIndexOf("\\"))),td=t=>!!t&&t.length<256&&!/[\\/]/.test(t)&&!t.includes("\0")&&t!=="."&&t!=="..",Me=()=>!!window.tangu?.mkdirHost,is=()=>!!window.tangu?.revealHostPath,mt=new EventTarget,Ee=t=>{mt.dispatchEvent(new CustomEvent("fs-bump",{detail:t}))};function Ct({initial:t,depth:n,onCommit:s,onCancel:a}){const[o,i]=c.useState(t),r=c.useRef(!1),d=()=>{r.current||(r.current=!0,s(o.trim()))};return e.jsx("input",{className:"t2sf-input",style:{marginLeft:It(n+1)},value:o,autoFocus:!0,spellCheck:!1,onFocus:p=>p.currentTarget.select(),onChange:p=>i(p.target.value),onKeyDown:p=>{p.key==="Enter"?d():p.key==="Escape"&&(r.current=!0,a())},onBlur:d})}function Ca({entry:t,depth:n,ctx:s}){const a=Et(Tt(t.path)||"",t.path);return s.renaming===t.path?e.jsx(Ct,{initial:t.name,depth:n,onCommit:o=>s.commitRename(t,o),onCancel:s.cancelEdit}):e.jsxs("div",{className:`t2sf-row t2sf-file${s.isSel(t.path)?" sel":""}`,"data-sel-id":t.path,style:{paddingLeft:wn(n+1)},...qs(()=>Os(t.path,t.name)),draggable:Me(),onDragStart:o=>s.rowDragStart(o,t),onDragEnd:s.dragEnd,onDragOver:o=>s.dragOverDir(o,Ue(t.path)),onDragLeave:()=>s.dragLeaveDir(Ue(t.path)),onDrop:o=>s.dropOnDir(o,Ue(t.path)),onClick:o=>s.rowClick(o,t),onDoubleClick:()=>s.openFile(t),onContextMenu:o=>s.onMenu(o,t),children:[e.jsx("span",{className:"t2s-lead",children:e.jsx(a,{className:"t2s-lead-icon t2sf-fic"})}),e.jsx("span",{className:"t2sf-name",children:t.name}),t.size>0&&e.jsx("span",{className:"t2sf-size",children:Mt(t.size)})]})}function Ea({entry:t,depth:n,ctx:s,forceOpen:a}){const o=!!a&&(a===t.path||a.startsWith(t.path+"/")||a.startsWith(t.path+"\\")),[i,r]=c.useState(o),[d,p]=c.useState(null);c.useEffect(()=>{o&&r(!0)},[o,a]),c.useEffect(()=>{const m=g=>{const w=g.detail;(w==="*"||w===t.path)&&p(null)};return mt.addEventListener("fs-bump",m),()=>mt.removeEventListener("fs-bump",m)},[t.path]);const f=s.creating?.dir===t.path;return c.useEffect(()=>{f&&r(!0)},[f]),c.useEffect(()=>{if(!i||d)return;let m=!0;return window.tangu?.listDir?.(t.path).then(g=>{m&&p(za(g))}).catch(()=>{m&&p([])}),()=>{m=!1}},[i,d,t.path]),e.jsxs(e.Fragment,{children:[s.renaming===t.path?e.jsx(Ct,{initial:t.name,depth:n,onCommit:m=>s.commitRename(t,m),onCancel:s.cancelEdit}):e.jsxs("div",{className:`t2sf-row${s.isSel(t.path)?" sel":""}${s.dropDir===t.path?" drop":""}`,"data-sel-id":t.path,style:{paddingLeft:wn(n+1)},...qs(()=>Os(t.path,t.name)),draggable:Me(),onDragStart:m=>s.rowDragStart(m,t),onDragEnd:s.dragEnd,onDragOver:m=>s.dragOverDir(m,t.path),onDragLeave:()=>s.dragLeaveDir(t.path),onDrop:m=>s.dropOnDir(m,t.path),onClick:m=>{s.rowClick(m,t).open!=="none"&&m.detail===1&&r(w=>!w)},onContextMenu:m=>s.onMenu(m,t),children:[e.jsxs("span",{className:"t2s-lead",children:[i?e.jsx(st,{className:"t2s-lead-icon t2sf-fic"}):e.jsx(Dt,{className:"t2s-lead-icon t2sf-fic"}),e.jsx("span",{className:`t2s-chev t2s-lead-chev${i?" open":""}`,children:e.jsx(ve,{size:12})})]}),e.jsx("span",{className:"t2sf-name",children:t.name})]}),e.jsxs($e,{open:i,children:[f&&s.creating&&e.jsx(Ct,{initial:"",depth:n+1,onCommit:m=>s.commitCreate(t.path,s.creating.kind,m),onCancel:s.cancelEdit}),d===null?e.jsx("div",{className:"t2sf-loading",style:{paddingLeft:It(n+2)},children:"…"}):e.jsx(e.Fragment,{children:d.map(m=>m.isDir?e.jsx(Ea,{entry:m,depth:n+1,ctx:s,forceOpen:o?a:null},m.path):e.jsx(Ca,{entry:m,depth:n+1,ctx:s},m.path))})]})]})}function rs({label:t,title:n,scope:s,kind:a,open:o,onToggle:i,onOpenPreview:r,sel:d,rowDownload:p=!1,emptyText:f}){const{t:m}=V(),g=P(I=>I.cfg),{sessionId:w,project:x}=s,N=P(I=>x?Object.keys(I.runningBySession).length>0:!!I.runningBySession[w]),[b,j]=c.useState(null),[T,u]=c.useState(null),$=ii(Es(w)).workspaceDelete,k=`${w}
|
|
40
|
+
${x??""}`,C=c.useRef(k);C.current=k,c.useEffect(()=>{j(null)},[k]);const y=c.useCallback(()=>{const I=k;ri(ce(w),w,x).then(L=>{C.current===I&&j([...L].sort((z,F)=>z.path.localeCompare(F.path)))}).catch(()=>{C.current===I&&j([])})},[g,w,x,k]);c.useEffect(()=>{o&&b===null&&y()},[o,b,y]);const h=c.useRef(N);c.useEffect(()=>{h.current&&!N&&o&&y(),h.current=N},[N,o,y]);const S=I=>{li(ce(w),w,I.path,x).catch(L=>P.getState().toast(L?.message||String(L),!0))},H=(I,L)=>{r({name:I.path,load:async()=>{const z=await ci(ce(w),w,I.path,x);return{mimeType:z.mimeType,bytes:di(z.content),size:z.size}},download:()=>S(I)},L?{newTab:!0}:void 0)},G=async I=>{if(window.confirm(m("panel.confirm.delete",{name:I.path})))try{await Dn(ce(w),w,I.path,x),y()}catch(L){P.getState().toast(L?.message||String(L),!0)}},O=async I=>{if(!(!I.length||!window.confirm(m("panel.confirm.deleteN",{n:String(I.length)})))){try{for(const L of I)await Dn(ce(w),w,L.path,x)}catch(L){P.getState().toast(L?.message||String(L),!0)}d.clear(),y()}},K=(I,L)=>{I.preventDefault(),I.stopPropagation();const z=d.batch(L.path);if(z.length===1&&d.only(L.path),z.length>1){if(!$)return;const W=(b??[]).filter(oe=>z.includes(oe.path)),te=[{label:m("panel.action.deleteN",{n:String(W.length)}),icon:e.jsx(pt,{size:13}),danger:!0,run:()=>{O(W)}}];u({...ut(I,te.length),items:te});return}const F=[{label:m("panel.action.preview"),icon:e.jsx(Rt,{size:13}),run:()=>H(L)},{label:m("panel.action.download"),icon:e.jsx(Pe,{size:13}),run:()=>S(L)},...$?[{label:m("panel.action.delete"),icon:e.jsx(pt,{size:13}),danger:!0,run:()=>{G(L)}}]:[]];u({...ut(I,F.length),items:F})};return e.jsxs("div",{"data-ws-scope":a,children:[e.jsxs("div",{className:"t2s-group",style:{paddingLeft:Ls(0)},children:[e.jsxs("button",{className:"t2s-group-toggle t2s-folder-row",onClick:i,title:n,children:[e.jsxs("span",{className:"t2s-lead",children:[o?e.jsx(st,{className:"t2s-lead-icon"}):e.jsx(Dt,{className:"t2s-lead-icon"}),e.jsx("span",{className:`t2s-chev t2s-lead-chev${o?" open":""}`,children:e.jsx(ve,{size:12})})]}),e.jsx("span",{className:"t2s-group-label",children:t})]}),e.jsx("button",{className:"t2s-group-add",title:m("panel.files.refresh"),onClick:y,children:e.jsx(nt,{size:13})})]}),e.jsx($e,{open:o,children:e.jsx("div",{className:"t2sf-tree",children:b==null?e.jsx("div",{className:"t2sf-loading",style:{paddingLeft:It(1)},children:"…"}):b.length===0?e.jsx("div",{className:"t2sf-empty",children:f||m("panel.files.empty")}):b.map(I=>{const L=Et(Tt(I.path)||"",I.path);return e.jsxs("div",{className:`t2sf-row t2sf-file${d.has(I.path)?" sel":""}`,"data-sel-id":I.path,"data-ws-file":I.path,style:{paddingLeft:wn(1)},onClick:z=>{const F=d.click(I.path,z);F.open!=="none"&&H(I,F.open==="new")},onDoubleClick:()=>H(I),onContextMenu:z=>K(z,I),children:[e.jsx("span",{className:"t2s-lead",children:e.jsx(L,{className:"t2s-lead-icon t2sf-fic"})}),e.jsx("span",{className:"t2sf-name",children:I.path.replace(/^\//,"")}),I.size>0&&e.jsx("span",{className:"t2sf-size",children:Mt(I.size)}),p&&e.jsx("button",{className:"t2sf-row-act","data-download":!0,"aria-label":m("panel.action.download"),title:m("panel.action.download"),onClick:z=>{z.stopPropagation(),S(I)},onDoubleClick:z=>z.stopPropagation(),children:e.jsx(Pe,{size:14})})]},I.path)})})}),T&&e.jsx(Ks,{menu:T,onClose:()=>u(null)})]})}function xu({workspaces:t,onOpenPreview:n,activeWorkspaceKey:s,onEnterWorkspace:a,expandToPath:o,pinnedWorkspaceKey:i}){const{t:r}=V(),d=P(v=>Object.keys(v.runningBySession).length>0),p=P(v=>v.openWorkspaceKeys),f=P(v=>v.toggleOpenWorkspace),m=t.filter(v=>v.kind==="local"&&!!v.path),g=t.filter(v=>v.kind==="cloud"&&!!v.project),w=P(v=>v.activeId),x=Pt(w).kind==="unit"?w:null,[N,b]=c.useState(!0),[j,T]=c.useState({}),u=c.useRef(null),$=hr(u),[k,C]=c.useState(null),[y,h]=c.useState(null),[S,H]=c.useState(null),[G,O]=c.useState(null),[K,I]=c.useState(!1),L=c.useRef(null),z=(v,M)=>P.getState().toast(v,M),F=(v,M)=>{v.isDir||n(Ts(v.path,v.name),M?{newTab:!0}:void 0)},W=(v,M)=>{const E=$.click(M.path,v);return E.open!=="none"&&!M.isDir&&F(M,E.open==="new"),E},te=c.useCallback((v,M)=>{T(E=>({...E,[v]:E[v]??null})),window.tangu?.listDir?.(M).then(E=>T(_=>({..._,[v]:za(E)}))).catch(()=>T(E=>({...E,[v]:[]})))},[]),oe=m.map(v=>`${v.key}
|
|
41
|
+
${v.path}`).join("\0");c.useEffect(()=>{const v=oe?oe.split("\0").map(E=>E.split(`
|
|
42
|
+
`)):[],M=E=>{const _=E.detail;for(const[ie,we]of v)we&&(_==="*"||_===we)&&te(ie,we)};return mt.addEventListener("fs-bump",M),()=>mt.removeEventListener("fs-bump",M)},[oe,te]);const Q=c.useRef(d);c.useEffect(()=>{Q.current&&!d&&Ee("*"),Q.current=d},[d]);const A=async(v,M)=>{if(C(null),!(!M||M===v.name||!window.tangu?.renameHostPath)){try{await window.tangu.renameHostPath(v.path,M)}catch(E){z(r("panel.toast.renameFail",{err:E?.message||E}),!0)}Ee(Ue(v.path))}},Y=async(v,M,E)=>{if(h(null),!!E){if(!td(E)){z(r("panel.toast.invalidName",{name:E}),!0);return}try{M==="folder"?await window.tangu?.mkdirHost?.(v,E):await window.tangu?.writeHostFile?.(`${v}/${E}`,"",void 0,!0)}catch(_){z(r("panel.toast.mkdirFail",{err:_?.message||_}),!0)}Ee(v)}},J=async v=>{if(!(!v.length||!window.tangu?.trashHostPath||!window.confirm(v.length===1?r("panel.confirm.trash",{name:v[0].split(/[/\\]/).pop()||""}):r("panel.confirm.trashN",{n:String(v.length)})))){try{for(const E of v)await window.tangu.trashHostPath(E)}catch(E){z(r("panel.toast.deleteFail",{err:E?.message||E}),!0)}$.clear();for(const E of v)Ee(Ue(E))}},D=async(v,M)=>{if(!window.tangu?.moveHostPath)return;const E=M.filter(_=>_!==v&&!v.startsWith(_+"/")&&!v.startsWith(_+"\\"));try{for(const _ of E)await window.tangu.moveHostPath(_,v),Ee(Ue(_))}catch(_){z(r("panel.toast.moveFail",{err:_?.message||_}),!0)}E.length&&Ee(v)},B=async(v,M)=>{if(!(!window.tangu?.copyHostFiles||!v.length)){try{const E=await window.tangu.copyHostFiles(v,M);z(r("panel.toast.copied",{n:String(E.copied)}))}catch(E){z(r("panel.toast.copyFail",{err:E?.message||E}),!0)}Ee(M)}},X=async(v,M)=>{const E=window.tangu?.copyNoteBundles;if(!E)return B(v,M);const _=new Set(v),ie=ne=>ne.replace(/\.md$/i,".fd"),we=v.filter(ne=>/\.md$/i.test(ne)).map(ne=>({md:ne,fd:_.has(ie(ne))?ie(ne):void 0})),je=new Set(we.flatMap(ne=>ne.fd?[ne.md,ne.fd]:[ne.md])),gt=v.filter(ne=>!je.has(ne)&&!we.some(Je=>Je.fd&&ne.startsWith(`${Je.fd}/`)));try{let ne=0;we.length&&(ne+=(await E(we,M)).copied),gt.length&&window.tangu?.copyHostFiles&&(ne+=(await window.tangu.copyHostFiles(gt,M)).copied),z(r("panel.toast.copied",{n:String(ne)}))}catch(ne){z(r("panel.toast.copyFail",{err:ne?.message||ne}),!0)}Ee(M)},Z=async(v,M)=>{window.tangu?.getPathForFile&&await B(Array.from(v).map(E=>{try{return window.tangu.getPathForFile(E)}catch{return""}}).filter(Boolean),M)},re=(v,M)=>{v.preventDefault(),v.stopPropagation();const E=$.batch(M.path);if(E.length===1&&$.only(M.path),E.length>1){const ie=[{label:r("panel.action.copyPath"),icon:e.jsx(St,{size:13}),run:()=>{navigator.clipboard.writeText(E.join(`
|
|
43
|
+
`))}}];Me()&&ie.push({label:r("panel.action.deleteN",{n:String(E.length)}),icon:e.jsx(pt,{size:13}),danger:!0,run:()=>{J(E)}}),H({...ut(v,ie.length),items:ie});return}const _=[];M.isDir?Me()&&(_.push({label:r("panel.action.newFile"),icon:e.jsx(Vt,{size:13}),run:()=>h({dir:M.path,kind:"file"})}),_.push({label:r("panel.action.newFolder"),icon:e.jsx(Ht,{size:13}),run:()=>h({dir:M.path,kind:"folder"})})):(_.push({label:r("panel.action.open"),icon:e.jsx(Rt,{size:13}),run:()=>F(M)}),window.tangu?.openHostPath&&_.push({label:r("preview.openWithDefault"),icon:e.jsx(yt,{size:13}),run:()=>{window.tangu?.openHostPath?.(M.path).then(ie=>{ie&&!ie.ok&&z(ie.error||"open failed",!0)})}})),Me()&&_.push({label:r("panel.action.rename"),icon:e.jsx(ft,{size:13}),run:()=>C(M.path)}),_.push({label:r("panel.action.copyPath"),icon:e.jsx(St,{size:13}),run:()=>{navigator.clipboard.writeText(M.path)}}),is()&&_.push({label:r("panel.action.revealInFileManager"),icon:e.jsx(an,{size:13}),run:()=>{window.tangu?.revealHostPath?.(M.path)}}),Me()&&_.push({label:r("panel.action.moveToTrash"),icon:e.jsx(pt,{size:13}),danger:!0,run:()=>{J([M.path])}}),H({...ut(v,_.length),items:_})},xe=(v,M)=>{if(!M.path)return;v.preventDefault(),v.stopPropagation();const E=M.path,_=[];Me()&&(_.push({label:r("panel.action.newFile"),icon:e.jsx(Vt,{size:13}),run:()=>{a?.(M.key),h({dir:E,kind:"file"})}}),_.push({label:r("panel.action.newFolder"),icon:e.jsx(Ht,{size:13}),run:()=>{a?.(M.key),h({dir:E,kind:"folder"})}})),is()&&_.push({label:r("panel.action.revealInFileManager"),icon:e.jsx(an,{size:13}),run:()=>{window.tangu?.revealHostPath?.(E)}}),_.push({label:r("panel.files.refresh"),icon:e.jsx(nt,{size:13}),run:()=>Ee(E)}),H({...ut(v,_.length),items:_})},q=(v,M)=>{if(v.altKey&&window.tangu?.startHostDrag){v.preventDefault(),window.tangu.startHostDrag(M.path);return}const E=$.batch(M.path);L.current=E,v.dataTransfer.setData(Ot,JSON.stringify(E)),v.dataTransfer.effectAllowed="copyMove"},De=()=>{L.current=null,O(null)},pe=(v,M)=>{const E=Me()&&v.dataTransfer.types.includes("Files");!(L.current||v.dataTransfer.types.includes(Ot))&&!E||L.current?.includes(M)||!E&&L.current?.every(ie=>Ue(ie)===M)||(v.preventDefault(),v.stopPropagation(),v.dataTransfer.dropEffect=E||v.dataTransfer.types.includes(In)?"copy":"move",O(M))},ze=v=>{O(M=>M===v?null:M)},Ae=(v,M)=>{v.preventDefault(),v.stopPropagation();const E=v.dataTransfer.files;let _=L.current;if(!_)try{_=JSON.parse(v.dataTransfer.getData(Ot)||"null")}catch{_=null}const ie=v.dataTransfer.types.includes(In);O(null),L.current=null,E?.length?Z(E,M):_?.length&&(ie?X(_,M):D(M,_))},me={isSel:$.has,rowClick:W,openFile:F,onMenu:re,renaming:k,commitRename:A,creating:y,commitCreate:Y,cancelEdit:()=>{C(null),h(null)},dropDir:G,rowDragStart:q,dragEnd:De,dragOverDir:pe,dragLeaveDir:ze,dropOnDir:Ae},Fe=v=>{const M=!p.includes(v.key);f(v.key,M),M&&a?.(v.key)};c.useEffect(()=>{s&&(f(s,!0),s!==i&&I(!0))},[s,i,f]),c.useEffect(()=>{for(const v of p){const M=m.find(E=>E.key===v);M?.path&&j[v]===void 0&&te(v,M.path)}},[p,m,j,te]);const de=x?e.jsx(rs,{label:r("panel.files.sessionFiles"),scope:{sessionId:x},kind:"session",open:N,onToggle:()=>b(v=>!v),onOpenPreview:n,sel:$,rowDownload:!0,emptyText:r("panel.files.sessionEmpty")},`session:${x}`):null;if(!m.length&&!g.length)return de?e.jsx("aside",{className:"t2s-side",children:e.jsx("div",{ref:u,className:"t2s-scroll",children:de})}):e.jsx("div",{className:"t2s-hint",style:{padding:"18px 12px"},children:r("panel.files.noLocalWs")});const _e=v=>{if(v.kind==="cloud")return e.jsx(rs,{label:v.name,title:v.project,scope:{sessionId:"__project__",project:v.project},kind:"project",open:p.includes(v.key),onToggle:()=>Fe(v),onOpenPreview:n,sel:$},v.key);const M=p.includes(v.key),E=j[v.key];return e.jsxs("div",{children:[e.jsxs("div",{className:`t2s-group${G===v.path?" drop":""}`,style:{paddingLeft:Ls(0)},onContextMenu:_=>xe(_,v),onDragOver:_=>{v.path&&M&&pe(_,v.path)},onDragLeave:()=>{v.path&&ze(v.path)},onDrop:_=>{v.path&&Ae(_,v.path)},children:[e.jsxs("button",{className:"t2s-group-toggle t2s-folder-row",onClick:()=>Fe(v),title:v.path||void 0,children:[e.jsxs("span",{className:"t2s-lead",children:[M?e.jsx(st,{className:"t2s-lead-icon"}):e.jsx(Dt,{className:"t2s-lead-icon"}),e.jsx("span",{className:`t2s-chev t2s-lead-chev${M?" open":""}`,children:e.jsx(ve,{size:12})})]}),e.jsx("span",{className:"t2s-group-label",children:v.name})]}),M&&Me()&&e.jsx("button",{className:"t2s-group-add",title:r("panel.action.newFile"),onClick:()=>{v.path&&h({dir:v.path,kind:"file"})},children:e.jsx(Vt,{size:13})}),M&&Me()&&e.jsx("button",{className:"t2s-group-add",title:r("panel.action.newFolder"),onClick:()=>{v.path&&h({dir:v.path,kind:"folder"})},children:e.jsx(Ht,{size:13})}),e.jsx("button",{className:"t2s-group-add",title:r("panel.files.refresh"),onClick:()=>{v.path&&te(v.key,v.path)},children:e.jsx(nt,{size:13})})]}),e.jsx($e,{open:M,children:e.jsxs("div",{className:"t2sf-tree",children:[y&&v.path&&y.dir===v.path&&e.jsx(Ct,{initial:"",depth:1,onCommit:_=>Y(v.path,y.kind,_),onCancel:()=>h(null)}),E==null?e.jsx("div",{className:"t2sf-loading",style:{paddingLeft:It(1)},children:"…"}):E.length===0?e.jsx("div",{className:"t2sf-empty",children:r("panel.files.empty")}):E.map(_=>_.isDir?e.jsx(Ea,{entry:_,depth:1,ctx:me,forceOpen:M?o:null},_.path):e.jsx(Ca,{entry:_,depth:1,ctx:me},_.path))]})})]},v.key)},ee=[...g,...m],le=[i,s,ee[0]?.key].find(v=>v&&ee.some(M=>M.key===v))??null,Be=ee.filter(v=>v.key!==le);return e.jsxs("aside",{className:"t2s-side",children:[e.jsxs("div",{ref:u,className:"t2s-scroll",onClick:v=>{v.target===v.currentTarget&&$.clear()},children:[de,ee.filter(v=>v.key===le).map(_e),Be.length>0&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"t2sf-showall",onClick:()=>I(v=>!v),children:[e.jsx("span",{className:`t2s-chev${K?" open":""}`,children:e.jsx(ve,{size:12})}),r("panel.files.showAllWs"),e.jsx("span",{className:"t2sf-showall-n",children:Be.length})]}),e.jsx($e,{open:K,children:Be.map(_e)})]})]}),S&&e.jsx(Ks,{menu:S,onClose:()=>H(null)})]})}async function nd(t,n){const s=P.getState().toast,a=t.replace(/(\.[^./\\]+)?$/,`.本地未保存-${Date.now()}$1`);try{await window.tangu?.writeHostFile?.(a,n,void 0,!0),Ee(a.slice(0,Math.max(a.lastIndexOf("/"),a.lastIndexOf("\\")))),s(P.getState().tr("preview.mdSalvaged",{file:a.split(/[/\\]/).pop()||a}),!0)}catch{s(P.getState().tr("preview.mdSaveFail",{err:t}),!0)}}const ls=({src:t,kind:n,seek:s})=>{const a=c.useRef(null);c.useEffect(()=>{const i=a.current;if(!i||!s)return;const r=()=>{try{i.currentTime=s.t}catch{}};if(i.readyState>=1){r();return}return i.addEventListener("loadedmetadata",r,{once:!0}),()=>i.removeEventListener("loadedmetadata",r)},[t,s?.t,s?.nonce]),c.useEffect(()=>{const i=a.current,r=s?.to;if(!i||!r)return;const d=()=>{i.currentTime>=r&&i.pause()};return i.addEventListener("timeupdate",d),()=>i.removeEventListener("timeupdate",d)},[s?.to]);const o={ref:i=>{a.current=i},src:t,controls:!0,preload:"metadata"};return n==="video"?e.jsx("video",{...o}):e.jsx("audio",{...o})},sd=({path:t,text:n,mtimeMs:s,view:a,onReload:o,focusLine:i})=>{const{t:r}=V(),d=hi(k=>k.mode),p=c.useMemo(()=>pi(n).fm,[n]),f=c.useRef(n.slice(p.length)),m=c.useRef(s),g=c.useRef(!1),w=c.useRef(null),[x,N]=c.useState(!1),[b,j]=c.useState(null),T=async k=>{if(!g.current||!window.tangu?.writeHostFile)return{};const C=f.current,y=window.tangu.writeHostFile(t,p+C,k?void 0:m.current);Fn.set(t,y.catch(()=>{}));try{const h=await y;return h.conflict?(N(!0),{conflict:!0}):(m.current=h.mtimeMs,g.current=f.current!==C,N(!1),j(null),{})}catch(h){return j(h?.message||String(h)),{failed:!0}}finally{Fn.delete(t)}},u=c.useRef(T);u.current=T;const $=k=>{f.current=k,g.current=!0,w.current&&clearTimeout(w.current),w.current=setTimeout(()=>{u.current()},800)};return c.useEffect(()=>()=>{w.current&&clearTimeout(w.current);const k=p+f.current,C=g.current;u.current().then(y=>{C&&(y.conflict||y.failed)&&nd(t,k)})},[]),e.jsxs("div",{className:"wsmd-edit",children:[x&&e.jsxs("div",{className:"wsmd-banner",children:[e.jsx(pr,{size:13}),e.jsx("span",{children:r("preview.mdConflict")}),e.jsx("button",{className:"btn ghost sm",onClick:o,children:r("preview.mdReload")}),e.jsx("button",{className:"btn ghost sm",onClick:()=>{T(!0)},children:r("preview.mdOverwrite")})]}),b&&e.jsxs("div",{className:"wsmd-banner danger",children:[e.jsx(Ie,{size:13}),e.jsx("span",{children:r("preview.mdSaveFail",{err:b})})]}),a==="source"?ge({value:p+f.current,fileName:t,wrap:!1,focusLine:i}):e.jsx("div",{className:"am-app tangu-lovable wsmd-scope","data-mode":d,children:e.jsx(br,{initial:f.current,onChange:$})})]})};function ad({leaf:t}){const{t:n}=V(),s=typeof t.params.path=="string"?t.params.path:null,a=typeof t.params.tkey=="string"?t.params.tkey:null,o=typeof t.params.name=="string"&&t.params.name?t.params.name:s?s.split(/[/\\]/).pop()||s:"",i=typeof t.params.line=="number"&&t.params.line>=1?Math.trunc(t.params.line):null,r=typeof t.params.endLine=="number"&&t.params.endLine>=1?Math.trunc(t.params.endLine):void 0,[d,p]=c.useState(i?{line:i,end:r,nonce:0}:null),f=typeof t.params.t=="number"&&t.params.t>=0?t.params.t:null,m=typeof t.params.tTo=="number"&&t.params.tTo>(f??0)?t.params.tTo:void 0,[g,w]=c.useState(f!=null?{t:f,to:m,nonce:0}:null),x=c.useMemo(()=>s?Ts(s,o):a?ui(a)??null:null,[s,a,o]);c.useEffect(()=>{o&&t.setTitle(o)},[o]);const[N,b]=c.useState(!0),[j,T]=c.useState(null),[u,$]=c.useState(null),[k,C]=c.useState(null),[y,h]=c.useState(null),[S,H]=c.useState(i?"source":"preview"),[G,O]=c.useState(i?"source":"edit");c.useEffect(()=>{if(!s)return;const v=M=>{const E=M.detail;if(!(!E||E.path!==s)){if(E.clear){p(null),w(null),t.setParams({line:void 0,endLine:void 0,t:void 0,tTo:void 0});return}if(typeof E.t=="number"&&E.t>=0){w(_=>({t:E.t,to:typeof E.tTo=="number"&&E.tTo>E.t?E.tTo:void 0,nonce:(_?.nonce??0)+1}));return}typeof E.line!="number"||E.line<1||(p(_=>({line:Math.trunc(E.line),end:typeof E.endLine=="number"&&E.endLine>=1?Math.trunc(E.endLine):void 0,nonce:(_?.nonce??0)+1})),O("source"),H("source"))}};return window.addEventListener("amadeus:wsfile-goto",v),()=>window.removeEventListener("amadeus:wsfile-goto",v)},[s]);const[K,I]=c.useState(0),[L,z]=c.useState(!1),[F,W]=c.useState(!0),[te,oe]=c.useState({s:1,x:0,y:0}),Q=xs(o),A=u?bt(u.mimeType,o):"binary",Y=Et(u?.mimeType||"",o);c.useEffect(()=>{if(!x){b(!1);return}let v=!1,M=null;return b(!0),T(null),$(null),C(null),h(null),oe({s:1,x:0,y:0}),(async()=>{try{const E=await x.load();if(v)return;if(!E){T("not-found"),b(!1);return}if("tooLarge"in E){C(E.size),b(!1);return}if(sa.has(bt(E.mimeType,o))){const _=Tt(o)||E.mimeType||"application/octet-stream";M=URL.createObjectURL(new Blob([E.bytes],{type:_})),h(M)}$(E),b(!1)}catch(E){v||(T(E?.message||"error"),b(!1))}})(),()=>{v=!0,M&&URL.revokeObjectURL(M)}},[x,K]);const J=c.useMemo(()=>u&&na.has(A)?new TextDecoder("utf-8",{fatal:!1}).decode(u.bytes):"",[u,A]),[D,B]=c.useState(null),[X,Z]=c.useState(!1),[re,xe]=c.useState(0);c.useEffect(()=>{if(!u||A!=="xlsx"&&A!=="pptx"){B(null),Z(!1);return}let v=!1;return B(null),Z(!1),xe(0),ra(u.bytes,A).then(M=>{v||B(M)}).catch(()=>{v||Z(!0)}),()=>{v=!0}},[u,A]);const q=()=>{s&&window.tangu?.openHostPath?.(s).then(v=>{v&&!v.ok&&P.getState().toast(v.error||"open failed",!0)})},De=()=>{s&&window.tangu?.revealHostPath?.(s)},pe=s&&window.tangu?.openHostPath?e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"btn ghost sm",onClick:q,children:[e.jsx(yt,{size:13})," ",n("preview.openWithDefault")]}),e.jsxs("button",{className:"btn ghost sm",onClick:De,children:[e.jsx(an,{size:13})," ",n("panel.action.revealInFileManager")]})]}):x?.download?e.jsxs("button",{className:"btn ghost sm",onClick:x.download,children:[e.jsx(Pe,{size:13})," ",n("preview.download")]}):null,ze=gn(v=>v.fileTypes),Ae=!!s&&(/\.(excalidraw|mindmap)\.md$/i.test(s)||!!vn(ze,s)),me=A==="markdown"&&!!s&&!!window.tangu?.writeHostFile&&!Ae,Fe=at(v=>v.vaultRoot),de=c.useMemo(()=>{if(!s||!Fe)return null;const v=_=>_.replace(/\\/g,"/").replace(/\/+$/,""),M=v(Fe),E=v(s);return E.startsWith(M+"/")?E.slice(M.length+1):null},[s,Fe]),_e=de&&/\.md$/i.test(de)?()=>{mi(de)}:void 0;let ee;if(!x)ee=e.jsxs("div",{className:"wsfile-center wsfile-fallback",children:[e.jsx(Ie,{size:26}),e.jsx("div",{children:n("preview.expired")})]});else if(N)ee=e.jsx(Ge,{});else if(k!==null)ee=e.jsxs("div",{className:"wsfile-center wsfile-fallback",children:[e.jsx(Ie,{size:26}),e.jsx("div",{children:n("preview.tooLarge",{size:Mt(k)})}),e.jsx("div",{className:"wsfile-ask-actions",children:pe})]});else if(j||!u)ee=e.jsxs("div",{className:"wsfile-center wsfile-fallback",children:[e.jsx(Ie,{size:26}),e.jsx("div",{children:n(j==="not-found"?"preview.notFound":"preview.loadFailed")}),pe&&e.jsx("div",{className:"wsfile-ask-actions",children:pe})]});else if(A==="image")ee=y?e.jsx(aa,{src:y,alt:o,view:te,setView:oe}):null;else if(A==="pdf")ee=e.jsx(ia,{bytes:u.bytes,download:x.download});else if(A==="video")ee=e.jsx("div",{className:"wsfile-media",children:y&&e.jsx(ls,{src:y,kind:"video",seek:g})});else if(A==="audio")ee=e.jsx("div",{className:"wsfile-media wsfile-audio",children:y&&e.jsx(ls,{src:y,kind:"audio",seek:g})});else if(A==="markdown")me?ee=e.jsx(sd,{path:s,text:J,mtimeMs:u.mtimeMs,view:G,onReload:()=>I(v=>v+1),focusLine:d},`${s}:${u.mtimeMs??0}:${K}`):Ae||S==="source"?ee=ge({value:J,fileName:o,wrap:L,focusLine:d}):ee=e.jsx("div",{className:"wsfile-doc msg-content",children:e.jsx(qe,{content:J})});else if(A==="json"){let v=J;if(!d)try{v=JSON.stringify(JSON.parse(J),null,2)}catch{}ee=ge({value:v,fileName:"x.json",language:"json",wrap:L,focusLine:d})}else if(A==="code")ee=ge({value:J,fileName:o,wrap:L,focusLine:d});else if(A==="text")ee=ge({value:J,fileName:o,wrap:L,focusLine:d});else if(A==="diff")ee=d?ge({value:J,fileName:o,wrap:L,focusLine:d}):e.jsx(xn,{text:J,side:F});else if(A==="csv"&&d)ee=ge({value:J,fileName:o,wrap:L,focusLine:d});else if(A==="csv"){const v=ws(J,Q==="tsv"?" ":","),M=v.slice(0,et),E=M[0]??[];ee=e.jsxs("div",{className:"wsfile-doc",children:[e.jsxs("table",{className:"wsfile-table",children:[e.jsx("thead",{children:e.jsx("tr",{children:E.map((_,ie)=>e.jsx("th",{children:_},ie))})}),e.jsx("tbody",{children:M.slice(1).map((_,ie)=>e.jsx("tr",{children:E.map((we,je)=>e.jsx("td",{children:_[je]??""},je))},ie))})]}),v.length>et&&e.jsx("div",{className:"panel-note",children:n("preview.csvTruncated",{shown:String(et),total:String(v.length)})})]})}else A==="html"?ee=S==="preview"?e.jsx(ta,{path:s??x.path,text:J,title:o,nonce:K}):ge({value:J,language:"html",wrap:L,focusLine:d}):A==="docx"?ee=e.jsx(oa,{bytes:u.bytes,download:x.download}):A==="xlsx"||A==="pptx"?ee=X?e.jsx($t,{t:n,download:x.download}):D?D.kind==="xlsx"?e.jsxs("div",{className:"wsfile-sheetwrap",children:[D.sheets.length>1&&e.jsx("div",{className:"wsfile-seg wsfile-sheet-tabs",children:D.sheets.map((v,M)=>e.jsx("button",{className:M===re?"active":"",onClick:()=>xe(M),children:v.name},M))}),e.jsx("div",{className:"wsfile-doc wsfile-sheet",dangerouslySetInnerHTML:{__html:D.sheets[re]?.html??D.sheets[0]?.html??""}})]}):e.jsx("div",{className:"wsfile-doc wsfile-pptx",children:D.slides.map((v,M)=>{const E=v.split(`
|
|
44
|
+
`);return e.jsxs("div",{className:"wsfile-slide",children:[e.jsx("div",{className:"wsfile-slide-no",children:n("preview.slide",{n:String(M+1)})}),E[0]&&e.jsx("div",{className:"wsfile-slide-title",children:E[0]}),e.jsx("pre",{children:E.slice(1).join(`
|
|
45
|
+
`)||(E[0]?"":"—")})]},M)})}):e.jsx(Ge,{}):ee=e.jsxs("div",{className:"wsfile-center wsfile-fallback",children:[e.jsx(Ie,{size:26}),e.jsx("div",{children:n(s?"preview.unsupportedAsk":"preview.notAvailable")}),e.jsx("div",{className:"wsfile-ask-actions",children:pe})]});const le=!N&&!j&&k===null&&!!u,Be=le&&(A==="code"||A==="json"||A==="text"||A==="html"&&S==="source"||A==="markdown"&&!me&&(S==="source"||Ae));return e.jsxs("div",{className:"wsfile-tab",children:[e.jsxs("div",{className:"wsfile-head",children:[e.jsx(Y,{size:14,className:"wsfile-head-icon"}),e.jsxs("div",{className:"wsfile-title",title:s??o,children:[e.jsx("span",{className:"wsfile-name",children:s??o}),Q&&e.jsx("span",{className:"wsfile-ext",children:Q})]}),le&&me&&e.jsxs("div",{className:"wsfile-seg",children:[e.jsx("button",{className:G==="edit"?"active":"",title:n("preview.mdEdit"),onClick:()=>O("edit"),children:e.jsx(ft,{size:13})}),e.jsx("button",{className:G==="source"?"active":"",title:n("preview.htmlCode"),onClick:()=>O("source"),children:e.jsx(Nt,{size:13})})]}),le&&!me&&!Ae&&(A==="markdown"||A==="html")&&e.jsxs("div",{className:"wsfile-seg",children:[e.jsx("button",{className:S==="preview"?"active":"",title:n("preview.htmlPreview"),onClick:()=>H("preview"),children:e.jsx(Rt,{size:13})}),e.jsx("button",{className:S==="source"?"active":"",title:n("preview.htmlCode"),onClick:()=>H("source"),children:e.jsx(Nt,{size:13})}),A==="html"&&S==="preview"&&e.jsx("button",{title:n("preview.reload"),onClick:()=>I(v=>v+1),children:e.jsx(nt,{size:12})}),A==="html"&&S==="preview"&&!!(s??x?.path)&&!!window.tangu?.codePreviewServePath&&!!window.tangu?.openExternal&&e.jsx("button",{title:n("preview.openInBrowser"),onClick:()=>{window.tangu.codePreviewServePath(s??x.path).then(v=>window.tangu.openExternal(v.url)).catch(()=>{})},children:e.jsx(yt,{size:12})})]}),le&&A==="diff"&&e.jsxs("div",{className:"wsfile-seg",children:[e.jsx("button",{className:F?"active":"",title:n("preview.diffSideBySide"),onClick:()=>W(!0),children:e.jsx(ys,{size:13})}),e.jsx("button",{className:F?"":"active",title:n("preview.diffLineByLine"),onClick:()=>W(!1),children:e.jsx(Js,{size:13})})]}),Be&&e.jsx("button",{className:`icon-btn${L?" active":""}`,title:n("preview.wrap"),onClick:()=>z(v=>!v),children:e.jsx(Qs,{size:14})}),le&&A==="image"&&e.jsxs(e.Fragment,{children:[e.jsx("button",{className:"icon-btn",title:n("preview.zoomOut"),onClick:()=>oe(v=>({...v,s:Math.min(8,Math.max(.1,v.s*.8))})),children:e.jsx(Bs,{size:14})}),e.jsx("button",{className:"icon-btn",title:n("preview.zoomIn"),onClick:()=>oe(v=>({...v,s:Math.min(8,Math.max(.1,v.s*1.25))})),children:e.jsx(Hs,{size:14})}),e.jsx("button",{className:"icon-btn",title:n("preview.fit"),onClick:()=>oe({s:1,x:0,y:0}),children:e.jsx(Gs,{size:14})})]}),_e&&e.jsx("button",{className:"icon-btn",title:n("preview.openInAmadeus"),onClick:_e,children:e.jsx(io,{size:14})}),s&&e.jsx("button",{className:"icon-btn",title:n("preview.openWithDefault"),onClick:q,children:e.jsx(yt,{size:14})}),x?.download&&e.jsx("button",{className:"icon-btn",title:n(s?"panel.action.revealInFileManager":"preview.download"),onClick:x.download,children:e.jsx(Pe,{size:14})}),e.jsx("button",{className:"icon-btn",title:n("preview.reload"),onClick:()=>I(v=>v+1),children:e.jsx(nt,{size:14})})]}),e.jsx("div",{className:"wsfile-body",children:ee})]})}const cs=t=>Ms()?.agentStatus?.(t)??fi(t);function Ta({entry:t,surface:n,sessionId:s}){const a=c.useRef(null),o=c.useRef(s);o.current=s;const i=c.useRef(new Set),r=p=>{for(const f of[...i.current])try{f(p)}catch(m){console.error("[desk-companion] onStatus callback failed",t.key,m)}};c.useEffect(()=>{const p=a.current;if(!p)return;const f=i.current,m={surface:n,sessionId:()=>o.current,status:()=>cs(o.current),onStatus:w=>(f.add(w),()=>{f.delete(w)})};let g;try{g=t.mount(p,m)}catch(w){console.error("[desk-companion] mount failed",t.key,w)}return()=>{try{typeof g=="function"&&g()}catch(w){console.error("[desk-companion] dispose failed",t.key,w)}f.clear(),p.replaceChildren()}},[t.key,t.mount,n]);const d=c.useRef(s);return c.useEffect(()=>{const p=Ms()?.subscribeAgentStatus?.(r,s);return d.current!==s&&(d.current=s,r(cs(s))),()=>{try{p?.()}catch(f){console.error("[desk-companion] unsubscribe failed",f)}}},[s]),e.jsx("div",{ref:a,className:"agent-desk-companion-slot","data-companion":t.key,"data-surface":n,style:{position:"relative",flex:"1 1 0",minHeight:0,minWidth:0,overflow:"hidden"}})}se({"desk.writing":{zh:"正在编辑 {name}",en:"Editing {name}"},"desk.drafting":{zh:"正在起草…",en:"Drafting…"},"desk.expand":{zh:"展开",en:"Expand"},"desk.collapse":{zh:"收起为卡片",en:"Collapse to card"},"desk.empty":{zh:"Agent 会在这里展示成果",en:"Agent will present work here"},"desk.clear":{zh:"清空 Desk",en:"Clear Desk"}});const Ma=t=>P.getState().patchDesk(t,{items:[],mode:void 0,note:void 0}),Ra=(t,n,s)=>({id:t,type:n,loc:"main",params:s,setTitle:()=>{},setParams:()=>{},close:()=>{}});function kt({item:t}){const n=c.useMemo(()=>Ra(`desk:${t.key}`,"wsfile",{path:t.path,name:t.name}),[t.key,t.path,t.name]);return e.jsx(ad,{leaf:n,params:n.params})}function tt({type:t,params:n,k:s}){const[,a]=c.useReducer(r=>r+1,0);c.useEffect(()=>wi(a),[]);const o=t==="chat"?void 0:yi(t),i=c.useMemo(()=>Ra(s,t,n),[s,t]);return o?e.jsx("div",{className:"desk-note-wrap",children:o.factory({leaf:i,params:i.params})}):e.jsxs("div",{className:"agent-desk-card-empty",children:[e.jsx(Ke,{size:18}),e.jsx("span",{children:t})]})}function Aa(t,n){if(!n||!t)return null;const s=i=>i.replace(/\\/g,"/").replace(/\/+$/,""),a=s(n),o=s(t);return o.startsWith(a+"/")?o.slice(a.length+1):null}const Pa=(t,n)=>ms(t)||vn(n,t)?null:/\.md$/i.test(t)?"note":null;function od(t){const[n,s]=c.useState(!1);return c.useEffect(()=>{let a=!0;const o=()=>at.getState(),i=d=>d.replace(/\\/g,"/"),r=()=>o().files.some(d=>i(d)===t)||o().pages.some(d=>i(d)===t);return(async()=>{if(o().activePage!==t){if(!r()){if(await o().refreshStructure(),!a)return;if(!r()){s(!0);return}}s(!1),o().loadPage(t)}})(),()=>{a=!1}},[t]),n}function id({item:t,rel:n}){return od(n)?e.jsx(kt,{item:t}):e.jsx(tt,{type:"amadeus-editor",params:{notePath:n},k:`desk-note:${n}`})}function Ia({item:t,allowNative:n}){const s=at(r=>r.vaultRoot),a=gn(r=>r.fileTypes),o=Aa(t.path,s);return o?Pa(o,a)?n?e.jsx(id,{item:t,rel:o}):e.jsx(kt,{item:t}):ms(o)?e.jsx(tt,{type:"amadeus-drawing",params:{drawingPath:o},k:`desk-draw:${o}`}):vn(a,o)?e.jsx(tt,{type:"amadeus-plugin-file",params:{filePath:o},k:`desk-ft:${o}`}):/\.db$/i.test(o)?e.jsx(tt,{type:"amadeus-db",params:{dbPath:o},k:`desk-db:${o}`}):e.jsx(kt,{item:t}):e.jsx(kt,{item:t})}function Da(t){c.useEffect(()=>{gi()},[]);const n=at(a=>a.vaultRoot),s=gn(a=>a.fileTypes);return t.find(a=>{if(a.live||a.view)return!1;const o=Aa(a.path,n);return!!o&&Pa(o,s)!==null})?.key}function Fa({sessionId:t,item:n}){const{t:s}=V(),a=n.live,o=P(d=>d.messagesBySession[t]?.find(f=>f.id===a.msgId)?.toolEvents?.find(f=>f.id===a.toolId)?.arguments||""),i=c.useMemo(()=>xi(o,a.tool),[o,a.tool]),r=c.useRef(null);return c.useEffect(()=>{const d=r.current;d&&(d.scrollTop=d.scrollHeight)},[i]),e.jsxs("div",{className:"agent-desk-livepane",children:[e.jsxs("div",{className:"agent-desk-livehead",children:[e.jsx(Oe,{size:12,className:"spin"}),e.jsx("span",{className:"agent-desk-livehead-tx",title:n.path||void 0,children:n.path?s("desk.writing",{name:n.name}):s("desk.drafting")})]}),e.jsx("pre",{ref:r,className:"agent-desk-livebody",children:i})]})}function _a(t,n){return c.useCallback(s=>{const a=n.current?.parentElement;if(!a)return;s.preventDefault();const o=s.currentTarget;o.setPointerCapture(s.pointerId),n.current?.classList.add("no-anim");const i=a.getBoundingClientRect(),r=p=>{const f=Math.min(.72,Math.max(.25,(i.right-p.clientX)/i.width));P.getState().patchDesk(t,{fraction:f,userResized:!0})},d=()=>{n.current?.classList.remove("no-anim"),o.removeEventListener("pointermove",r),o.removeEventListener("pointerup",d),o.removeEventListener("pointercancel",d),o.removeEventListener("lostpointercapture",d)};o.addEventListener("pointermove",r),o.addEventListener("pointerup",d),o.addEventListener("pointercancel",d),o.addEventListener("lostpointercapture",d)},[t,n])}function rd({sessionId:t}){const{t:n}=V(),s=P(w=>w.deskBySession[t]),a=Da(s?.items?.slice(0,2)??[]),o=c.useRef(null),i=_a(t,o),r=Rs(),d=r?.mode==="always";if(!s?.items.length&&!d)return null;const p=s?.mode==="open",f=s?.fraction??(s?.size==="wide"?.62:.46),m=s?.items.slice(0,2)??[],g=r?.mode==="idle"&&m.length>0;return e.jsx("div",{ref:o,"data-desk-session":t,className:`agent-desk${p?" open":""}`,style:{"--desk-w":`${(f*100).toFixed(2)}%`},children:p&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"agent-desk-grip",onPointerDown:i}),e.jsxs("div",{className:"agent-desk-inner",children:[e.jsxs("div",{className:"agent-desk-head",children:[e.jsx(Ke,{size:13,className:"agent-desk-spark"}),e.jsx("span",{className:"agent-desk-title",children:n("desk.title")}),!d&&s?.note?e.jsx("span",{className:"agent-desk-note",title:s.note,children:s.note}):e.jsx("span",{className:"agent-desk-note"}),g&&e.jsx("button",{className:"icon-btn",title:n("desk.clear"),onClick:()=>Ma(t),children:e.jsx(As,{size:14})}),e.jsx("button",{className:"icon-btn",title:n("desk.collapse"),onClick:()=>P.getState().patchDesk(t,{mode:void 0}),children:e.jsx(Ys,{size:14})})]}),e.jsx("div",{className:"agent-desk-body",children:d&&r?e.jsx("div",{className:"agent-desk-pane agent-desk-companion",children:e.jsx(Ta,{entry:r,surface:"desk-panel",sessionId:t},r.key)}):m.map(w=>e.jsx("div",{className:"agent-desk-pane",children:w.live?e.jsx(Fa,{sessionId:t,item:w}):w.view?e.jsx(tt,{type:w.view.type,params:w.view.params??{},k:`desk-view:${w.key}`}):e.jsx(Ia,{item:w,allowNative:w.key===a})},w.key))})]})]})})}const ld=(t,n)=>t==="open"&&n;function cd(t){const n=t.companion==="always",s=ld(t.mode,n?!t.draft:t.itemCount>0);return{gone:s,showCompanion:n||t.companion==="idle"&&t.itemCount===0,expandable:!s&&!t.draft&&(n||t.itemCount>0),clearable:t.companion==="idle"&&t.itemCount>0}}function dd({sessionId:t}){const{t:n}=V(),s=P(g=>g.deskBySession[t]),a=Rs(),o=s?.items?.slice(0,2)??[],i=Da(o),r=t===vi,d=cd({mode:s?.mode,itemCount:o.length,companion:a?.mode??null,draft:r}),p=d.gone,f=d.expandable?()=>P.getState().patchDesk(t,{mode:"open"}):void 0,m=d.showCompanion?a:null;return e.jsxs("div",{"data-desk-session":t,className:`agent-desk-card${f?" act":""}${p?" gone":""}`,onClick:f,title:f?n("desk.expand"):void 0,children:[e.jsxs("div",{className:"agent-desk-card-head",children:[e.jsx(Ke,{size:12,className:"agent-desk-spark"}),e.jsx("span",{className:"agent-desk-card-title",children:m?n("desk.title"):o[0]?.name||n("desk.title")}),d.clearable&&e.jsx("button",{className:"icon-btn",title:n("desk.clear"),onClick:g=>{g.stopPropagation(),Ma(t)},children:e.jsx(As,{size:13})}),f&&e.jsx("button",{className:"icon-btn",title:n("desk.expand"),onClick:g=>{g.stopPropagation(),f()},children:e.jsx(js,{size:13})})]}),e.jsx("div",{className:`agent-desk-card-body${m?" companion":""}`,children:p?null:m?e.jsx("div",{className:"agent-desk-pane agent-desk-companion",children:e.jsx(Ta,{entry:m,surface:"desk-card",sessionId:r?null:t},m.key)}):o.length?o.map(g=>e.jsx("div",{className:"agent-desk-pane",children:g.live?e.jsx(Fa,{sessionId:t,item:g}):g.view?e.jsx(tt,{type:g.view.type,params:g.view.params??{},k:`desk-view:${g.key}`}):e.jsx(Ia,{item:g,allowNative:g.key===i})},g.key)):e.jsxs("div",{className:"agent-desk-card-empty",children:[e.jsx(Ke,{size:18}),e.jsx("span",{children:n("desk.empty")})]})})]})}se({"historian.status.ready":{zh:"待命",en:"Ready"},"historian.status.working":{zh:"整理会话中",en:"Reviewing conversation"},"historian.status.empty":{zh:"本会话还没有 Historian 工作记录",en:"No Historian activity in this conversation yet"},"historian.status.unavailable":{zh:"状态暂不可用",en:"Status unavailable"},"historian.status.viewTranscript":{zh:"查看完整记录",en:"View full transcript"}});const ud=3e3;function hd(t){try{const n=JSON.parse(t.replace(/^```(?:json)?\s*|\s*```$/g,""));return[n.summary,n.title,n.log,...Array.isArray(n.memory_candidates)?n.memory_candidates.map(s=>typeof s=="string"?s:s.text||s.content||""):[]].filter(s=>typeof s=="string"&&s.trim()).join(`
|
|
46
|
+
|
|
47
|
+
`)}catch{return t}}function pd(t,n){const s=P.getState(),a=s.configBySession[t]?.agentSlug||s.defaultAgentSlug,o=s.sessions.find(i=>i.id===t)?.title||a;fe({event:"harness.candidates",level:"info",sticky:!0,dedupeKey:`harness.candidates:${n}`,text:s.tr("ntf.harnessCandidates",{name:o}),action:{label:s.tr("ntf.actionRefine"),run:()=>{const i=P.getState(),r=i.configBySession[t];!(r?.execMode==="host"&&!r?.planMode)||i.runningBySession[t]?ul(a,"evolution"):i.send("/refine",[],void 0,void 0,void 0,t)}}})}function md({sessionId:t}){const{t:n}=V(),s=P(j=>j.cfg),a=P(j=>j.connState==="ok"),[o,i]=c.useState(!1),[r,d]=c.useState(null),[p,f]=c.useState(!1),m=c.useRef(null),g=c.useRef(null),[w,x]=c.useState(null);c.useEffect(()=>{i(!1),d(null),f(!1),x(null),m.current=null,g.current=null},[t]),c.useEffect(()=>{if(!o||!a||w)return;let j=!1,T;const u=()=>{Ps(ce(t),t,"historian").then($=>$.find(k=>k.kind==="historian")?.sessionId??null,()=>null).then($=>{j||($?x($):T=setTimeout(u,ud))})};return u(),()=>{j=!0,clearTimeout(T)}},[s,t,o,a,w]),c.useEffect(()=>{if(!a)return;let j=!1,T;const u=async()=>{try{const $=await ji(ce(t),t,o);if(!j){d($),f(!1);const{fresh:k,seen:C}=bl($.activity||[],m.current);m.current=C;for(const h of k)pd(t,h.id);const y=$.activity?.find(h=>h.action==="icon_updated");y&&y.id!==g.current&&(g.current=y.id,Zt(ce(t),t).then(h=>{j||h.id!==t||P.setState(S=>({sessions:S.sessions.map(H=>H.id===t?{...H,emoji:h.emoji}:H),archivedSessions:S.archivedSessions.map(H=>H.id===t?{...H,emoji:h.emoji}:H)}))}).catch(()=>{j||(g.current=null)}))}}catch{j||f(!0)}j||(T=setTimeout(u,2500))};return u(),()=>{j=!0,clearTimeout(T)}},[s,t,o,a]);const N=r?.running?"working":"idle",b=(r?.records||[]).map(j=>({...j,content:hd(j.content)})).filter(j=>j.content);return e.jsxs("div",{className:"t2o-team-status","data-historian-status":p?"unavailable":N,children:[e.jsxs("button",{type:"button",className:"t2o-desk-row","aria-expanded":o,onClick:()=>i(!o),children:[e.jsx(fn,{size:18,className:r?.running?"historian-working":void 0}),e.jsx("span",{className:"t2o-desk-name",children:"Historian"}),e.jsx("span",{className:"t2o-desk-dot","data-status":N}),e.jsx("span",{className:"t2o-desk-activity",children:n(p?"historian.status.unavailable":r?.running?"historian.status.working":"historian.status.ready")}),e.jsx(ve,{size:12,style:{transform:o?"rotate(90deg)":void 0}})]}),o&&e.jsxs("div",{className:"t2o-desk-work","data-historian-work":!0,children:[b.map(j=>e.jsx(qe,{content:j.content},j.id)),(r?.activity||[]).map(j=>e.jsx("div",{className:"t2o-historian-event",children:j.detail},j.id)),!b.length&&!r?.activity.length&&e.jsx("div",{className:"panel-note",children:n("historian.status.empty")}),w&&e.jsx("button",{type:"button",className:"t2-tsum-more","data-historian-transcript":!0,onClick:()=>Re.getState().open(t,{id:w,title:"Historian",sessionId:w}),children:n("historian.status.viewTranscript")})]})]})}se({"teamdesk.title":{zh:"团队工作台",en:"Team Desk"},"teamdesk.summary":{zh:"{n} 人 · {k} 工作中",en:"{n} members · {k} working"},"teamdesk.status.idle":{zh:"空闲",en:"Idle"},"teamdesk.status.working":{zh:"工作中",en:"Working"},"teamdesk.status.waiting":{zh:"等待审批",en:"Waiting for approval"},"teamdesk.status.done":{zh:"已完成",en:"Done"},"teamdesk.status.failed":{zh:"失败",en:"Failed"},"teamdesk.thinking":{zh:"思考中",en:"Thinking"},"teamdesk.noWork":{zh:"还没有工作记录",en:"No work yet"},"teamdesk.task":{zh:"任务:{task}",en:"Task: {task}"},"teamdesk.live":{zh:"直播中",en:"Live"},"teamdesk.connecting":{zh:"连接中",en:"Connecting"},"teamdesk.expand":{zh:"展开团队工作台",en:"Expand Team Desk"},"teamdesk.collapse":{zh:"收起",en:"Collapse"}});function fd(t){const n=P(Is(s=>({cfg:s.configBySession[t],work:s.teamWorkBySession[t],agentDefs:s.agentDefs,running:s.runningBySession[t],childRuns:s.runningBySession})));return c.useMemo(()=>(Array.isArray(n.cfg?.groupAgents)?n.cfg.groupAgents.map(String):[]).map(a=>{const o=n.work?.[a],i=n.agentDefs.find(p=>p.slug===a)?.name||o?.name||a,d=o?.sessionId&&n.childRuns[o.sessionId]?o?.status==="waiting"?"waiting":"working":o?!n.running&&(o.status==="working"||o.status==="waiting")?"idle":o.status:"idle";return{...o||{since:0},slug:a,name:i,status:d}}),[n.cfg,n.work,n.agentDefs,n.running,n.childRuns])}function gd({slug:t,name:n,status:s}){const a=P(i=>i.agentAvatars[t]),o=`t2o-bar-avatar${s==="working"?" is-working":s==="waiting"?" is-waiting":""}`;return a?e.jsx("img",{src:a,width:18,height:18,alt:"",className:o}):e.jsx("span",{className:`${o} t2o-bar-avatar-text`,children:[...n][0]||"?"})}function vd(t,n){return t.status==="working"?t.activity||(t.task?t.task:n("teamdesk.thinking")):t.status==="waiting"?n("teamdesk.status.waiting"):t.status==="failed"?n("teamdesk.status.failed"):t.status==="done"?t.task||n("teamdesk.status.done"):n("teamdesk.status.idle")}function xd({sessionId:t}){const{t:n}=V(),s=fd(t),a=P(i=>i.hydrateTeamWork),o=Re(i=>i.selected[t]?.id);return c.useEffect(()=>{a(t)},[t,a]),e.jsx("div",{className:"t2o-team-status","data-team-desk":"status",children:s.map(i=>e.jsx("div",{children:e.jsxs("button",{type:"button",className:"t2o-desk-row","data-slug":i.slug,"data-status":i.status,"aria-pressed":o===i.slug,onClick:()=>Re.getState().open(t,{id:i.slug,title:i.name,slug:i.slug,sessionId:i.sessionId,runId:i.runId,task:i.task}),children:[e.jsx(gd,{slug:i.slug,name:i.name,status:i.status}),e.jsx("span",{className:"t2o-desk-name",children:i.name}),e.jsx("span",{className:"t2o-desk-dot","data-status":i.status,title:n(`teamdesk.status.${i.status}`)}),e.jsx("span",{className:"t2o-desk-activity",children:vd(i,n)}),e.jsx(ve,{size:12})]})},i.slug))})}function wd(t,n,s){const a=t.filter(i=>s&&i.kind==="historian"),o=t.filter(i=>i.kind!=="teamwork"&&!a.includes(i)).map(i=>({id:i.sessionId,title:i.title||i.kind,sessionId:i.sessionId,runId:i.runId||void 0,streaming:i.runStatus==="running"||i.runStatus==="queued"}));for(const i of n||[])a.some(r=>r.sessionId===i.sessionId||!!r.runId&&r.runId===i.runId)||s&&i.bgKind==="historian"||o.some(r=>r.sessionId===i.sessionId||r.runId&&r.runId===i.runId)||o.push({id:i.id,title:i.title,sessionId:i.sessionId,runId:i.runId,streaming:i.streaming});return o}se({"childchat.title":{zh:"子会话",en:"Child conversation"},"childchat.hint":{zh:"消息仅发送给这个子会话,保留与主会话的关联。",en:"Messages stay in this child conversation, linked to the main conversation."},"childchat.notStarted":{zh:"正在打开成员子会话…",en:"Opening the member’s conversation…"},"childchat.legacy":{zh:"这条旧子任务没有保存独立会话。新任务会保留完整记录。",en:"This older task has no saved child conversation. New tasks retain their full history."},"childchat.retry":{zh:"重新载入",en:"Reload"}});function yd({sessionId:t}){const{t:n}=V(),s=P(p=>p.cfg),a=P(p=>p.subChatsBySession[t]),o=P(p=>!!p.specialEnabled.historian),[i,r]=c.useState([]);c.useEffect(()=>{let p=!1;r([]);const f=()=>{Ps(ce(t),t).then(g=>{const w=Ci(g,t);p||r(w)}).catch(()=>{})};f();const m=setInterval(f,Es(t).kind==="unit"?12e3:4e3);return()=>{p=!0,clearInterval(m)}},[s,t]);const d=wd(i,a,o);return d.length?e.jsx("div",{className:"t2o-team-status","data-subchat-status":!0,children:d.map(p=>e.jsxs("button",{type:"button",className:"t2o-desk-row",onClick:()=>Re.getState().open(t,p),children:[e.jsx(Ds,{size:16}),e.jsx("span",{className:"t2o-desk-name",children:p.title}),e.jsx("span",{className:"t2o-desk-activity",children:n(p.streaming?"teamdesk.status.working":"teamdesk.status.done")}),e.jsx(ve,{size:12})]},p.id))}):null}function jd({parentId:t}){const n=Re(k=>k.selected[t]),s=P(k=>n?.slug?k.teamWorkBySession[t]?.[n.slug]:void 0),a=s?.sessionId||n?.sessionId,o=s?.runId||n?.runId,i=P(k=>(k.subChatsBySession[t]||[]).some(C=>C.sessionId===a&&C.streaming)&&!!k.runningBySession[t]),r=P(k=>k.cfg),d=P(k=>k.deskBySession[t]?.fraction??.52),p=c.useRef(null),f=_a(t,p),{t:m}=V(),[g,w]=c.useState(""),[x,N]=c.useState(""),[b,j]=c.useState(0),[T,u]=c.useState(!1);c.useEffect(()=>{if(!n?.slug||a)return;let k=!1;return N(""),ki(ce(t),t,n.slug).then(C=>{if(bi(C.id,t)==="conflict")throw new Error(m("app.cannotCreateSession"));k||(Re.getState().open(t,{...n,sessionId:C.id}),P.getState().hydrateTeamWork(t))}).catch(C=>{k||N(String(C.message||C))}),()=>{k=!0}},[r,t,n?.slug,a,b]),c.useEffect(()=>{if(w(""),N(""),u(!1),!a)return;let k=!1;return Zt(ce(a),a).then(async C=>{k||(u(!!C.delegate_running),Re.getState().remember(C),P.setState(y=>({configBySession:{...y.configBySession,[a]:{...C.agent_config,...y.configBySession[a]}}})),await P.getState().loadSessionHistory(a),k||w(a))}).catch(C=>{k||N(String(C.message||C))}),()=>{k=!0}},[r,a,b]),c.useEffect(()=>{if(!a||!T)return;let k=!1;const C=setInterval(()=>{Zt(ce(a),a).then(y=>{!k&&!y.delegate_running&&Si(ce(a),a).then(h=>{k||(P.setState(S=>{const H=h.map(O=>Ni(O,void 0,K=>S.agentDefs.find(I=>I.slug===K)?.name)),G=new Set(H.map(O=>O.id));return{messagesBySession:{...S.messagesBySession,[a]:[...H,...(S.messagesBySession[a]||[]).filter(O=>!G.has(O.id))].sort((O,K)=>O.timestamp-K.timestamp)}}}),u(!1))}).catch(()=>{})}).catch(()=>{})},1500);return()=>{k=!0,clearInterval(C)}},[r,a,T]),c.useEffect(()=>{if(!a||!o||g!==a)return;let k=!1;return zi(ce(a),a).then(C=>{if(k)return;const y=C.find(S=>S.id===o&&(S.status==="running"||S.status==="queued"));if(!y?.assistant_message_id)return;const h=y.assistant_message_id;P.setState(S=>{const H=S.messagesBySession[a]||[];return H.some(G=>G.id===h)?{}:{messagesBySession:{...S.messagesBySession,[a]:[...H,{id:h,role:"assistant",content:"",status:"streaming",timestamp:Date.now()}]}}}),P.getState().subscribeRun(a,o,h)}).catch(()=>{}),()=>{k=!0}},[r,a,o,g]);const $=c.useMemo(()=>({id:`child-chat:${t}:${a}`,type:"child-chat",loc:"right",params:{},setTitle:()=>{},setParams:()=>{},close:()=>Re.getState().close(t)}),[t,a]);return n?e.jsxs("div",{ref:p,className:"agent-desk open child-chat-panel","data-team-desk":"panel",style:{"--desk-w":`${d*100}%`},children:[e.jsx("div",{className:"agent-desk-grip",onPointerDown:f}),e.jsxs("div",{className:"agent-desk-inner",children:[e.jsxs("div",{className:"agent-desk-head",children:[e.jsx(Ds,{size:15}),e.jsx("strong",{className:"agent-desk-title",children:n.title}),e.jsx("span",{className:"agent-desk-note",children:m("childchat.title")}),e.jsx("button",{className:"icon-btn","aria-label":m("teamdesk.collapse"),onClick:$.close,children:e.jsx(Ye,{size:16})})]}),e.jsx("div",{className:"child-chat-hint",children:m("childchat.hint")}),x?e.jsxs("div",{className:"child-chat-placeholder",role:"alert",children:[x,e.jsx("button",{onClick:()=>j(k=>k+1),children:m("childchat.retry")})]}):a?g!==a?e.jsx("div",{className:"child-chat-placeholder",children:e.jsx(Oe,{className:"spin",size:18})}):e.jsx(qa,{leaf:$,params:{followActive:!1,sessionId:a,childSurface:!0,readOnly:i||T,teamSessionId:n.slug?t:void 0}},a):e.jsx("div",{className:"child-chat-placeholder",children:m(n.slug?"childchat.notStarted":"childchat.legacy")})]})]}):null}se({"team.summary":{zh:"Historian · 团队总结",en:"Historian · Team summary"}});function kd({message:t}){const{t:n}=V();return e.jsxs("details",{className:"t2-team-summary","data-team-summary":!0,children:[e.jsx("summary",{children:n("team.summary")}),e.jsx(qe,{content:t.content})]})}se({"studio.openTool":{zh:"编码工作室 · 打开项目工具",en:"Coding Studio · Open project tool"},"studio.projectTools":{zh:"项目工具",en:"Project tools"},"studio.panelPosition":{zh:"面板位置",en:"Panel position"},"studio.move.left":{zh:"移至左侧面板",en:"Move to left panel"},"studio.move.right":{zh:"移至右侧面板",en:"Move to right panel"},"studio.move.bottom":{zh:"移至底部面板",en:"Move to bottom panel"},"studio.inspectShort":{zh:"点选修改",en:"Select to edit"},"studio.filesShort":{zh:"文件",en:"Files"},"studio.chatTitle":{zh:"一起把想法做出来",en:"Build your idea together"},"studio.chatHint":{zh:"描述目标,或在预览中点选要修改的地方。",en:"Describe your goal, or select something in the preview to change."},"studio.chooseProject":{zh:"先在工作台创建或打开一个项目。",en:"Create or open a project in the studio first."},"studio.split":{zh:"并排",en:"Split"},"studio.desktop":{zh:"自适应",en:"Responsive"},"studio.tablet":{zh:"平板 · 768",en:"Tablet · 768"},"studio.phone":{zh:"手机 · 390",en:"Phone · 390"},"studio.inspect":{zh:"选择页面元素",en:"Select an element"},"studio.inspectHint":{zh:"点击预览中的元素,再描述你想怎样修改。Esc 取消。",en:"Click an element in the preview, then describe your change. Esc cancels."},"studio.selection":{zh:"定向修改",en:"Focused edit"},"studio.changePlaceholder":{zh:"例如:放大标题,保留现有配色",en:"For example: enlarge the heading and keep the colors"},"studio.addToChat":{zh:"加入对话",en:"Add to chat"},"studio.close":{zh:"关闭",en:"Close"},"studio.loading":{zh:"正在加载预览…",en:"Loading preview…"},"studio.previewFailed":{zh:"预览未能加载",en:"Preview could not load"},"studio.previewReady":{zh:"预览已加载",en:"Preview loaded"},"studio.previewIdle":{zh:"等待首个可运行页面",en:"Waiting for a runnable page"},"studio.sandbox.statusIdle":{zh:"插件项目 · 在 Sandbox 里加载试用",en:"Plugin project · load it from the Sandbox to try it"},"studio.building":{zh:"正在构建",en:"Building"},"studio.waiting":{zh:"等待你的回复",en:"Waiting for your input"},"studio.stopped":{zh:"停止生成",en:"Stop generation"},"studio.filesChanged":{zh:"{count} 个文件有改动",en:"{count} files changed"},"studio.autoRefresh":{zh:"实时刷新",en:"Live updates"},"studio.pendingChanges":{zh:"有新改动,点击刷新",en:"Changes ready. Reload to view."},"studio.files":{zh:"项目文件",en:"Project files"},"studio.terminal":{zh:"打开项目终端",en:"Open project terminal"},"studio.reveal":{zh:"在文件管理器中显示",en:"Show project folder"},"studio.project":{zh:"项目简报",en:"Project brief"},"studio.history":{zh:"版本",en:"Versions"},"studio.issues":{zh:"问题",en:"Issues"},"studio.checks":{zh:"验收",en:"Checks"},"studio.setup":{zh:"预览设置",en:"Preview settings"},"studio.sandbox":{zh:"Sandbox",en:"Sandbox"},"studio.pluginPreview":{zh:"插件没有页面预览",en:"A plugin has no page preview"},"studio.pluginPreviewHint":{zh:"插件不是网页,它加载进 Forsion 本身运行。打开 Sandbox,把这个项目加载进来试用。",en:"A plugin is not a web page: it is loaded into Forsion itself. Open the Sandbox to load this project and try it."},"studio.openSandbox":{zh:"打开 Sandbox",en:"Open Sandbox"},"studio.sandbox.notPlugin":{zh:"这个项目不是 Forsion 插件。项目根有 manifest.json(含 id、apiVersion 与 main)时,才能从这里加载。",en:"This project is not a Forsion plugin. It can be loaded here once the project root has a manifest.json with id, apiVersion and main."},"studio.sandbox.unavailable":{zh:"当前版本的应用还不支持从项目文件夹加载插件。",en:"This app version cannot load a plugin from a project folder yet."},"studio.sandbox.stateUnloaded":{zh:"未加载",en:"Not loaded"},"studio.sandbox.stateActive":{zh:"已加载,正在运行",en:"Loaded and running"},"studio.sandbox.stateBlocked":{zh:"不能从这里加载",en:"Cannot be loaded from here"},"studio.sandbox.stateFailed":{zh:"启动失败",en:"Failed to start"},"studio.sandbox.unloadedHint":{zh:"这个插件还没有加载进 Forsion。",en:"This plugin is not loaded into Forsion yet."},"studio.sandbox.activeHint":{zh:"项目开在编码工作室期间,保存即重载;关掉这个项目就不再重载。",en:"While this project is open in Coding Studio, saving reloads the plugin. Closing the project stops that."},"studio.sandbox.failedHint":{zh:"插件的 setup(ctx) 抛了错,这一次没能起来。改完保存会自动重试。",en:"The plugin threw from setup(ctx) and did not start. Saving a fix reloads it automatically."},"studio.sandbox.blockedFileext":{zh:"这个插件声明了自定义文件类型。宿主的防线只覆盖已安装目录,所以这类插件必须先安装再测。",en:"This plugin declares custom file types. The host safeguards only cover installed plugins, so install it to test custom file types."},"studio.sandbox.blockedApi":{zh:"宿主拒绝加载:manifest.json 的 apiVersion 不是这个版本的 Forsion 支持的值(目前为 1)。",en:"The host refused to load it: the apiVersion in manifest.json is not supported by this version of Forsion (currently 1)."},"studio.sandbox.blockedMinApp":{zh:"宿主拒绝加载:manifest.json 的 minAppVersion 高于当前 Forsion 的版本。",en:"The host refused to load it: the minAppVersion in manifest.json is newer than this version of Forsion."},"studio.sandbox.blockedOther":{zh:"宿主拒绝加载:{reason}",en:"The host refused to load it: {reason}"},"studio.sandbox.trust":{zh:"这不是隔离沙箱:开发副本就跑在这个真应用、你的真智库上,与已安装插件同权。试验期间别写、挪、删你的数据;定时器与监听必须在 disposer 里清掉——每次保存都会重跑一遍 setup,漏清一次就叠一层。",en:"This is not an isolated sandbox: the dev copy runs in this real app, on your real notes, with the same privileges as an installed plugin. Do not write, move or delete your data while experimenting, and release every timer and listener in the disposer, because each save runs setup again and anything left behind stacks up."},"studio.sandbox.staleGrant":{zh:"之前的加载授权已失效(项目文件夹被重建或移动过,或是旧版本 Forsion 记下的授权)。确认这是你的项目后,再点一次「加载」。",en:"The earlier permission to load this project no longer applies (the folder was recreated or moved, or the permission was saved by an older Forsion version). If this is your project, choose Load again."},"studio.sandbox.shadow":{zh:"这个插件已安装的副本在开发副本加载期间被顶替;期间它的「卸载」不可用。",en:"The installed copy of this plugin is replaced while the dev copy is loaded, and Uninstall is unavailable meanwhile."},"studio.sandbox.load":{zh:"在 Forsion 中加载",en:"Load into Forsion"},"studio.sandbox.loading":{zh:"正在加载…",en:"Loading…"},"studio.sandbox.unload":{zh:"卸载开发副本",en:"Unload"},"studio.sandbox.unloading":{zh:"正在卸载…",en:"Unloading…"},"studio.sandbox.reload":{zh:"立即重载",en:"Reload now"},"studio.sandbox.reloading":{zh:"正在重载…",en:"Reloading…"},"studio.sandbox.retry":{zh:"重试重载",en:"Retry reload"},"studio.sandbox.halfDone":{zh:"这个项目已标记为开发插件源,但这次重载没成功。重试重载即可。",en:"This project is marked as a dev plugin source, but the reload did not finish. Try the reload again."},"studio.sandbox.setupError":{zh:"setup(ctx) 抛出的错误",en:"Error thrown by setup(ctx)"},"studio.sandbox.mountErrors":{zh:"视图加载错误",en:"View mount errors"},"studio.sandbox.console":{zh:"这个插件的控制台输出",en:"Console output from this plugin"},"studio.sandbox.noEvidence":{zh:"还没有任何输出。在应用里操作这个插件,报错和 console 输出会出现在这里。",en:"Nothing captured yet. Use the plugin in the app and its errors and console output appear here."},"studio.sandbox.clear":{zh:"清空输出",en:"Clear output"},"studio.sandbox.note":{zh:"发生了什么?(可选)",en:"What happened? (optional)"},"studio.sandbox.send":{zh:"带上证据发回对话",en:"Send evidence to chat"},"studio.noIssues":{zh:"暂未捕获运行错误。仍需实际操作,确认流程和视觉效果。",en:"No runtime errors captured. Try the flows and check the visual result."},"studio.issueDescription":{zh:"发生了什么?你期待怎样的结果?",en:"What happened, and what did you expect?"},"studio.diagnose":{zh:"带上证据修复",en:"Fix with evidence"},"studio.clearIssues":{zh:"清空记录",en:"Clear captured issues"},"studio.errorCount":{zh:"{count} 条运行问题",en:"{count} runtime issues"},"studio.noBrief":{zh:"为已有项目补一份简报,后续修改都能沿用。",en:"Add a brief to keep future changes aligned with this project."},"studio.idea":{zh:"项目目标",en:"Project goal"},"studio.audience":{zh:"给谁使用",en:"Audience"},"studio.constraints":{zh:"必须保留的要求",en:"Requirements to preserve"},"studio.briefSaved":{zh:"简报已保存到项目文件。",en:"Brief saved to the project file."},"studio.saveBrief":{zh:"保存简报",en:"Save brief"},"studio.plan":{zh:"先做计划",en:"Plan first"},"studio.build":{zh:"开始构建",en:"Start building"},"studio.promptReady":{zh:"已加入左侧草稿,可继续编辑后发送。",en:"Added to the chat draft. Edit it before sending."},"studio.firstPage":{zh:"把想法变成第一个可运行版本",en:"Turn your idea into a working first version"},"studio.firstPageHint":{zh:"从项目简报开始,或在左侧描述需求。代码写好后,预览会自动出现在这里。",en:"Start with your brief, or describe what you need in chat. Your app will appear here as files are created."},"studio.staticPreview":{zh:"即时预览",en:"Instant preview"},"studio.devServer":{zh:"本地开发服务",en:"Local dev server"},"studio.devHint":{zh:"已有 Vite、Next.js 等项目:先在项目终端启动,再填入本机地址。发布功能适用于即时预览的静态项目。",en:"For Vite, Next.js or an existing app, start its server in the project terminal and enter the local URL. Publishing supports static projects using instant preview."},"studio.devUrl":{zh:"本机预览地址",en:"Local preview URL"},"studio.invalidUrl":{zh:"请输入 localhost、127.0.0.1 或 [::1] 的 HTTP(S) 地址。",en:"Use an HTTP(S) URL on localhost, 127.0.0.1 or [::1]."},"studio.apply":{zh:"应用",en:"Apply"},"studio.useStatic":{zh:"使用即时预览",en:"Use instant preview"},"studio.entry":{zh:"入口页面",en:"Entry page"},"studio.loadError":{zh:"无法读取项目:{error}",en:"Could not read project: {error}"},"studio.retry":{zh:"重新加载",en:"Try again"},"studio.versionName":{zh:"例如:首页布局定稿",en:"For example: approved home layout"},"studio.saveVersion":{zh:"保存版本",en:"Save version"},"studio.noVersions":{zh:"还没有版本。满意当前效果时,保存一个版本再继续尝试。",en:"No versions yet. Save a version you like before trying something new."},"studio.restore":{zh:"恢复源码",en:"Restore source"},"studio.confirmRestore":{zh:"确认恢复此版本?当前源码会先自动备份。",en:"Restore this version? Current source will be backed up first."},"studio.cancel":{zh:"取消",en:"Cancel"},"studio.versionSaved":{zh:"源码版本已保存。",en:"Source version saved."},"studio.restored":{zh:"已恢复 {restored} 个文件,移除 {deleted} 个新增文件;当前版本已备份。",en:"Restored {restored} files and removed {deleted} added files. Previous source was backed up."},"studio.restoreConflicts":{zh:"{count} 个文件在恢复期间被修改,已保留,请检查。",en:"{count} files changed during restore and were preserved. Please review them."},"studio.saveFirst":{zh:"请先处理未保存的修改,并等待生成结束。",en:"Resolve unsaved edits and wait for generation to finish first."},"studio.manualChecks":{zh:"亲自验证后再勾选。预览能打开不等于功能已通过;项目有新改动时勾选会重置。",en:"Check these only after testing. A loaded preview is not a verified app. New project changes reset these checks."},"studio.checkMain":{zh:"主要流程可完整操作",en:"The main user flow works end to end"},"studio.checkPhone":{zh:"手机宽度下可读、可点",en:"Readable and usable at phone width"},"studio.checkFailure":{zh:"空数据、加载和失败都有提示",en:"Empty, loading and failure states are clear"},"studio.checkData":{zh:"刷新后的数据行为符合预期",en:"Data behaves as expected after reload"},"studio.checkAccess":{zh:"键盘操作与颜色对比可用",en:"Keyboard access and text contrast are usable"},"studio.askVerify":{zh:"让 AI 帮我检查",en:"Ask AI to check"},"studio.publishStaticOnly":{zh:"当前使用开发服务,请先构建可发布的静态页面。",en:"This project uses a dev server. Build a static page before publishing."},"studio.publishImported":{zh:"发布前请将项目复制到 Forsion 的 Project 文件夹。",en:"Copy this project into the Forsion Project folder before publishing."},"studio.streaming":{zh:"正在写入 · {file}",en:"Writing · {file}"},"studio.watchError":{zh:"文件监听不可用,可手动刷新。{error}",en:"File watching is unavailable. Reload manually. {error}"},"studio.history.showInstall":{zh:"查看安装方式",en:"Show how to install"},"studio.history.gitWhy":{zh:"编码工作室用 Git 记录项目版本:装好之后,每轮 AI 改动都会自动存一版,你也可以随时保存命名版本。编码工作室的其他功能都不需要它。",en:"Coding Studio uses git to keep project versions: once it is installed, every agent run is saved automatically and you can save named versions yourself. Nothing else in Coding Studio needs it."},"studio.history.firstVersionNote":{zh:"保存第一个版本会在项目文件夹里创建 Git 仓库(.git)。",en:"Saving the first version creates a git repository (.git) in the project folder."},"studio.history.enableNote":{zh:"这个文件夹还没有版本历史。保存第一个版本会在里面创建 Git 仓库(.git),之后每轮 AI 改动都会自动存一版。",en:"This folder has no version history yet. Saving the first version creates a git repository (.git) in it; after that, every AI turn is saved as a version automatically."},"studio.history.readonlyForeign":{zh:"这个项目用的是它自己的 Git 仓库;Forsion 只展示历史,不做任何改动。",en:"This project uses its own git repository; Forsion shows its history but does not change it."},"studio.history.readonlyNested":{zh:"这个项目位于另一个 Git 仓库内部。",en:"This project lives inside another git repository."},"studio.history.readonlyOutside":{zh:"只有加入造物的项目,版本才由 Forsion 管理。",en:"Version history is only managed for projects in Creations."},"studio.history.readonlyBridge":{zh:"当前版本的应用只能查看版本历史;保存与恢复需要更新到新版本。",en:"This app version can only show version history; saving and restoring need a newer version."},"studio.history.untitled":{zh:"未命名版本",en:"Untitled version"},"studio.history.backupName":{zh:"恢复前的备份",en:"Backup before restore"},"studio.history.restorePrefix":{zh:"恢复到:",en:"Restore:"},"studio.history.noChanges":{zh:"与上一个版本相比没有改动。",en:"No changes since the last version."},"studio.history.files":{zh:"{count} 个文件",en:"{count} files"},"studio.history.auto":{zh:"自动",en:"Auto"},"studio.history.autoFallback":{zh:"AI 改动",en:"Agent changes"},"studio.history.autoFooter":{zh:"这个项目在编码工作室里打开时,每轮 AI 改动结束后都会自动存一个版本。",en:"Automatic versions are created after each agent run while this project is open in Coding Studio."},"studio.history.confirmRestore":{zh:"恢复到这个版本?当前状态会先存成一个备份版本,所以这次恢复本身也能撤销。",en:"Restore this version? The current state is saved as a backup version first, so restoring is itself undoable."},"studio.history.restored":{zh:"已恢复到该版本;恢复前的状态已存为备份版本。",en:"Restored. The previous state was saved as a backup version."},"studio.history.restoredClean":{zh:"已恢复到该版本。",en:"Restored to this version."},"studio.history.empty":{zh:"这个仓库还没有提交。",en:"This repository has no commits yet."},"studio.history.legacy":{zh:"更早的快照(只读)",en:"Earlier snapshots (read-only)"},"studio.history.legacyHint":{zh:"这些是启用 Git 之前保存的快照,可以恢复,但不再新增。",en:"These snapshots were saved before git was used here. They can be restored, but no new ones are created."}});function bd(t){return t.filter(n=>(n.modelType||"llm")==="llm")}se({"reset.ceremony.eyebrow":{zh:"FORSION · 额度重置卡",en:"FORSION · Quota reset card"},"reset.ceremony.title":{zh:"额度已焕新",en:"Quota restored"},"reset.ceremony.both":{zh:"今日与本周额度已恢复",en:"Today's and this week's quota has been restored"},"reset.ceremony.dailyLabel":{zh:"今日",en:"Today"},"reset.ceremony.weeklyLabel":{zh:"本周",en:"This week"},"reset.ceremony.remaining":{zh:"额度重置卡剩余 {n} 张",en:"{n} quota reset cards remaining"},"reset.ceremony.continue":{zh:"继续使用",en:"Continue"},"reset.ceremony.close":{zh:"关闭",en:"Close"}});const ds=(t,n)=>Ti(t[`${n}Limit`],t[`${n}Remaining`],t[`${n}Percent`]);function $a({result:t,onClose:n,returnFocusSelector:s}){const{t:a}=V(),o=c.useRef(null),i=c.useRef(null),r=c.useRef(n);r.current=n;const d=c.useMemo(()=>["daily","weekly"].map(p=>({period:p,before:ds(t.before,p),after:ds(t.after,p)})).filter(p=>p.after!==null),[t]);return c.useEffect(()=>{const p=document.activeElement instanceof HTMLElement?document.activeElement:null;o.current?.focus();const f=m=>{if(m.key==="Escape"){m.preventDefault(),r.current();return}if(m.key!=="Tab")return;const g=o.current,w=i.current;if(!(!g||!w)){if(getComputedStyle(w).visibility==="hidden"){m.preventDefault(),g.focus();return}m.shiftKey&&document.activeElement===g?(m.preventDefault(),w.focus()):!m.shiftKey&&document.activeElement===w&&(m.preventDefault(),g.focus())}};return window.addEventListener("keydown",f),()=>{window.removeEventListener("keydown",f),p?.isConnected?p.focus():document.querySelector(s)?.focus()}},[s]),Ei.createPortal(e.jsx("div",{className:"reset-ceremony-backdrop",children:e.jsxs("section",{className:"reset-ceremony",role:"dialog","aria-modal":"true","aria-labelledby":"reset-ceremony-title","aria-describedby":"reset-ceremony-description",children:[e.jsx("button",{ref:o,className:"reset-ceremony-close","aria-label":a("reset.ceremony.close"),onClick:n,children:e.jsx(Ye,{size:16,"aria-hidden":"true"})}),e.jsxs("div",{className:"reset-ceremony-scene","aria-hidden":"true",children:[e.jsx("span",{className:"reset-ceremony-halo"}),e.jsxs("div",{className:"reset-ceremony-card",children:[e.jsxs("div",{className:"reset-ceremony-card-top",children:[e.jsx("span",{children:"FORSION"}),e.jsx(_t,{size:19,strokeWidth:1.5})]}),e.jsx("span",{className:"reset-ceremony-card-mark",children:"F"}),e.jsx("span",{className:"reset-ceremony-card-bottom",children:"QUOTA RESET"}),e.jsx("span",{className:"reset-ceremony-card-sheen"})]}),e.jsx("span",{className:"reset-ceremony-seal",children:e.jsx(zs,{size:21,strokeWidth:2.2})})]}),e.jsx("div",{className:"reset-ceremony-eyebrow",children:a("reset.ceremony.eyebrow")}),e.jsx("h2",{id:"reset-ceremony-title",children:a("reset.ceremony.title")}),e.jsx("p",{id:"reset-ceremony-description",children:a("reset.ceremony.both")}),d.length>0&&e.jsx("div",{className:"reset-ceremony-quotas",children:d.map(({period:p,before:f,after:m})=>e.jsxs("div",{className:"reset-ceremony-quota",children:[e.jsxs("div",{className:"reset-ceremony-quota-copy",children:[e.jsx("span",{children:a(`reset.ceremony.${p}Label`)}),e.jsxs("span",{className:"reset-ceremony-values",children:[e.jsx("span",{children:f==null?"—":en(f,"—")}),e.jsx("span",{"aria-hidden":"true",children:"→"}),e.jsx("strong",{children:en(m,"—")})]})]}),e.jsx("div",{className:"reset-ceremony-track","aria-hidden":"true",children:e.jsx("span",{style:{"--reset-before":`${f??0}%`,"--reset-after":`${m}%`}})})]},p))}),e.jsxs("div",{className:"reset-ceremony-footer",children:[t.remainingCards!=null&&e.jsx("span",{children:a("reset.ceremony.remaining",{n:String(t.remainingCards)})}),e.jsx("button",{ref:i,className:"reset-ceremony-continue",onClick:n,children:a("reset.ceremony.continue")})]})]})}),document.body)}function wu(t,n=".ribbon-account, .account-card"){const s=document.createElement("div");document.body.appendChild(s);const a=Sr.createRoot(s);let o=!1;const i=()=>{o||(o=!0,queueMicrotask(()=>{a.unmount(),s.remove()}))};a.render(e.jsx(Xa,{children:e.jsx($a,{result:t,onClose:i,returnFocusSelector:n})}))}const Jt=10;se({"quota.banner.period.daily":{zh:"今日 AI 额度",en:"Today's AI quota"},"quota.banner.period.weekly":{zh:"本周 AI 额度",en:"This week's AI quota"},"quota.banner.low":{zh:"{period}剩余 {percent}",en:"{period} has {percent} remaining"},"quota.banner.near":{zh:"{period}即将用尽,仅剩 {percent}",en:"{period} is almost used up, with {percent} remaining"},"quota.banner.critical":{zh:"{period}严重不足,仅剩 {percent}",en:"{period} is critically low, with {percent} remaining"},"quota.banner.exhausted":{zh:"{period}已用尽",en:"{period} is exhausted"},"quota.banner.upgrade":{zh:"升级会员",en:"Upgrade membership"},"quota.banner.useReset":{zh:"使用额度重置卡({n})",en:"Use a quota reset card ({n})"},"quota.banner.noReset":{zh:"暂无额度重置卡",en:"No quota reset card"},"quota.banner.confirmReset":{zh:"再次点击确认",en:"Click again to confirm"},"quota.banner.resetFail":{zh:"重置额度失败",en:"Failed to reset quota"},"quota.banner.close":{zh:"关闭额度提示",en:"Dismiss quota notice"},"quota.banner.bg.period.daily":{zh:"今日后台额度",en:"Today's background quota"},"quota.banner.bg.period.weekly":{zh:"本周后台额度",en:"This week's background quota"},"quota.banner.bg.exhausted":{zh:"{period}已用尽,Muse 与自动化已暂停",en:"{period} is exhausted; Muse and automations are paused"},"quota.banner.bg.autoMain":{zh:"{period}已用尽,正在用 AI 额度继续",en:"{period} is exhausted; continuing on your AI quota"},"quota.banner.bg.convert":{zh:"从 AI 额度转入 {percent}%",en:"Move {percent}% from AI quota"},"quota.banner.bg.convertDone":{zh:"已从 AI 额度转入 {percent}%,本周期有效",en:"Moved {percent}% from your AI quota for this period"},"quota.banner.bg.convertFail":{zh:"转入失败",en:"Failed to move quota"},"quota.banner.bg.noMain":{zh:"AI 额度已用完,没有可转入的额度",en:"Your AI quota is used up; there is nothing to move"},"quota.banner.bg.settings":{zh:"后台额度设置",en:"Background quota settings"}});function Sd({loggedIn:t,onToast:n}){const{t:s}=V(),[a,o]=c.useState(null),[i,r]=c.useState(null),[d,p]=c.useState(!1),[f,m]=c.useState(!1),[g,w]=c.useState(null),[x,N]=c.useState(!1),[b,j]=c.useState(!1),T=c.useRef(0),u=c.useRef(0),$=c.useCallback(()=>{if(!t||!window.tangu?.accountQuota){o(null);return}const z=++T.current;window.tangu.accountQuota().then(F=>{if(z!==T.current)return;const W=F?.status===200&&F.json?F.json:null;o(W),W&&Bt(W)}).catch(()=>{z===T.current&&o(null)})},[t]);c.useEffect(()=>{if(!t){++T.current,++u.current,o(null),m(!1),p(!1),j(!1),N(!1),w(null);return}$();const z=()=>$();return window.addEventListener("focus",z),()=>{++T.current,++u.current,window.removeEventListener("focus",z)}},[t,$]),c.useEffect(()=>Mi(z=>{t&&o(z)}),[t]);const k=c.useMemo(()=>Ri(Ii(a),Ai()?Pi(a):null),[a]),C=k?.advisory??null,y=k?.bucket==="background",h=k?`${k.bucket}:${k.advisory.period}:${k.advisory.threshold}`:null;c.useEffect(()=>{p(!1),N(!1),h||r(null)},[h]);const S=g&&e.jsx($a,{result:g,onClose:()=>w(null),returnFocusSelector:".t2c-ta"});if(!t||!a||!C||i===h)return S;const H=s(y?`quota.banner.bg.period.${C.period}`:`quota.banner.period.${C.period}`),G=en(C.remainingPercent,""),O=C.exhausted?y?a.background?.autoMain?"quota.banner.bg.autoMain":"quota.banner.bg.exhausted":"quota.banner.exhausted":C.threshold===5?"quota.banner.critical":C.threshold===10?"quota.banner.near":"quota.banner.low",K=Math.max(0,Number(a.resetCards)||0),I=async()=>{if(!K||f||!window.tangu?.accountUseResetCard)return;if(!d){p(!0);return}m(!0);const z=++u.current;try{const F=await window.tangu.accountUseResetCard("both");if(z!==u.current)return;if(F?.status===200&&F.json?.success){const W={...F.json.quota||{},resetCards:F.json.resetCards};o(W),Bt(W),w({scope:"both",before:a,after:W,remainingCards:F.json.resetCards})}else n?.(String(F?.json?.detail||s("quota.banner.resetFail")),!0)}catch(F){z===u.current&&n?.(String(F?.message||F||s("quota.banner.resetFail")),!0)}finally{z===u.current&&(m(!1),p(!1))}},L=async()=>{if(b||!window.tangu?.accountBgConvert)return;if(!x){N(!0);return}j(!0);const z=++u.current;try{const F=await window.tangu.accountBgConvert(Jt);if(z!==u.current)return;if(F?.status===200&&F.json?.success){const W={...F.json.quota||{},resetCards:a.resetCards};o(W),Bt(W),n?.(s("quota.banner.bg.convertDone",{percent:String(Jt)}))}else n?.(F?.json?.error==="insufficient_main_quota"?s("quota.banner.bg.noMain"):String(F?.json?.detail||s("quota.banner.bg.convertFail")),!0)}catch(F){z===u.current&&n?.(String(F?.message||F||s("quota.banner.bg.convertFail")),!0)}finally{z===u.current&&(j(!1),N(!1))}};return e.jsxs(e.Fragment,{children:[S,e.jsxs("div",{className:"t2-quota-advisory","data-level":C.critical?"critical":C.threshold===10?"near":"low","data-bucket":y?"background":"main",role:"status","aria-live":"polite",children:[e.jsxs("span",{className:"t2-quota-advisory-copy",children:[e.jsx(Xs,{size:14,"aria-hidden":"true"}),e.jsx("span",{children:s(O,{period:H,percent:G})})]}),y?e.jsxs("span",{className:"t2-quota-advisory-actions",children:[!!window.tangu?.accountBgConvert&&e.jsxs("button",{className:"t2-quota-action convert",disabled:b,onClick:()=>{L()},children:[e.jsx(Er,{size:12,className:b?"spin":void 0,"aria-hidden":"true"}),x?s("quota.banner.confirmReset"):s("quota.banner.bg.convert",{percent:String(Jt)})]}),e.jsxs("button",{className:"t2-quota-action settings",onClick:()=>P.getState().openSettings("forsion/fx:forsion-extend:quota"),children:[e.jsx(Di,{size:12,"aria-hidden":"true"})," ",s("quota.banner.bg.settings")]})]}):e.jsxs("span",{className:"t2-quota-advisory-actions",children:[!!window.tangu?.openPayCenter&&e.jsxs("button",{className:"t2-quota-action upgrade",onClick:()=>{window.tangu?.openPayCenter?.()},children:[s("quota.banner.upgrade")," ",e.jsx(Nr,{size:12,"aria-hidden":"true"})]}),!!window.tangu?.accountUseResetCard&&e.jsxs("button",{className:"t2-quota-action reset",disabled:!K||f,title:K?void 0:s("quota.banner.noReset"),onClick:()=>{I()},children:[e.jsx(_t,{size:12,className:f?"spin":void 0,"aria-hidden":"true"}),d?s("quota.banner.confirmReset"):K?s("quota.banner.useReset",{n:String(K)}):s("quota.banner.noReset")]})]}),e.jsx("button",{className:"t2-quota-dismiss",title:s("quota.banner.close"),"aria-label":s("quota.banner.close"),onClick:()=>r(h),children:e.jsx(Ye,{size:13,"aria-hidden":"true"})})]})]})}se({"engine.target.retry":{zh:"重试",en:"Retry"}});const Nd={offline:on,"engine-unavailable":Yr,"engine-auth":$i,"caller-unavailable":_n,refused:_n,"rate-limited":ol,gone:Mr,connecting:Oe,failed:on},us={offline:"engine.target.offline","engine-unavailable":"engine.target.engineUnavailable","engine-auth":"engine.target.engineAuth","caller-unavailable":"engine.target.callerUnavailable",refused:"engine.target.refused","rate-limited":"engine.target.rateLimited",gone:"engine.target.gone"},zd=new Set(["offline","engine-unavailable","rate-limited","failed","caller-unavailable","engine-auth","refused"]);function La(t){const n=Pt(t),s=P(a=>a.connState);return _s(a=>n.kind==="unit"?a.byKey[$s(n)]:void 0),Fi({connState:s},t)}function Cd(t){const{t:n}=V(),s=Pt(t),a=La(t);if(tn(o=>o.name),!(s.kind!=="unit"||a))return n("engine.target.composerWaiting",{name:Fs(s)||n("engine.target.defaultName")})}function Ed({fallback:t,sessionId:n}){const{t:s}=V(),a=Pt(n),o=tn(j=>j.ref);tn(j=>j.name);const i=_i(a,o),r=Fs(a),d=a.kind==="unit"?$s(a):null,p=_s(j=>d?j.byKey[d]:void 0),f=P(j=>j.connState),m=P(j=>j.connMessage);if(!d)return e.jsx(e.Fragment,{children:t});const g=r||s("engine.target.defaultName");let w=null,x="";if(p&&us[p.state]){w=p.state;const j="code"in p?p.code:void 0,T="refusal"in p?p.refusal:void 0;x=zr(j,T)||s(us[p.state],{name:g})}else i&&f==="idle"?(w="connecting",x=s("engine.target.connecting",{name:g})):i&&f==="err"&&(w="failed",x=m||s("engine.target.offline",{name:g}));if(!w)return e.jsx(e.Fragment,{children:t});const N=Nd[w]??on,b=()=>{if(i){Li().catch(()=>{});return}const j=qi(a);j&&Oi(j).catch(()=>{})};return e.jsxs("div",{className:"t2-quota-advisory t2-target-health","data-target-health":w,role:"status","aria-live":"polite",children:[e.jsxs("span",{className:"t2-quota-advisory-copy",children:[e.jsx(N,{size:14,"aria-hidden":"true",className:w==="connecting"?"spin":void 0}),e.jsx("span",{children:x})]}),zd.has(w)&&e.jsx("span",{className:"t2-quota-advisory-actions",children:e.jsxs("button",{className:"t2-quota-action reset",onClick:b,children:[e.jsx(_t,{size:12,"aria-hidden":"true"})," ",s("engine.target.retry")]})})]})}const Td=[],Md={},Rd={ctx:0,base:0,live:0},Ad=[],Pd=[],hs=t=>!!t.teamSummary||!!t.work&&!t.content&&!t.error&&!t.approvals?.length&&!t.inquiries?.length;function qa({leaf:t,params:n}){const{t:s}=V(),a=ml(),o=Re(l=>l.selected),[i,r]=c.useState(!1),d=c.useRef(null),p=c.useRef(null),f=c.useRef(null),m=c.useRef(!0),g=c.useRef(0),w=P(l=>l.activeId),x=n.followActive!==!1,N=Bi(l=>l.activeSpaceId==="coding"),b=x&&(!!n.studio||N),j=nn(l=>l.activeProject),T=typeof n.sessionId=="string"?n.sessionId:null,u=x?w:T,$=Cd(u),k=La(u),C=ro(),y=P(l=>!!(u&&l.historyLoading[u])),h=P(Is(l=>({activeSession:l.sessions.find(R=>R.id===u)||l.archivedSessions.find(R=>R.id===u)||null,activeMessages:u&&l.messagesBySession[u]||Td,running:!!(u&&l.runningBySession[u]),runStats:u&&l.runStatsBySession[u]||null,historianEnabled:l.specialEnabled.historian,execConfig:u&&l.configBySession[u]||Md,activeUsage:u&&l.usageBySession[u]||Rd,activeCtxInfo:u&&l.ctxInfoBySession[u]||null,isGroupVoting:!!(u&&l.groupVoting[u]),llmRetry:u&&l.llmRetryBySession[u]||null,compacting:u?l.compactingBySession[u]:void 0,cfg:l.cfg,authInfo:l.authInfo,desktopConfig:l.desktopConfig,modelsResp:l.modelsResp,newChatWs:l.newChatWs,newChatCfg:l.newChatCfg,newChatModel:l.newChatModel,sessionMode:l.sessionMode,setSessionMode:l.setSessionMode,pendingDraft:l.pendingDraft,setPendingDraft:l.setPendingDraft,pendingChatQuote:l.pendingChatQuote,clearPendingChatQuote:l.clearPendingChatQuote,draftRefs:l.draftRefs,appendRefs:l.appendRefs,clearDraftRefs:l.clearDraftRefs,steerPending:u&&l.steerPendingBySession[u]||Ad,steerSent:u&&l.steerSentBySession[u]||Pd,steerRestore:u&&l.steerRestoreBySession[u]||null,jumpTarget:l.jumpTarget,clearJumpTarget:l.clearJumpTarget,withdrawSteer:l.withdrawSteer,steerNow:l.steerNow,clearSteerRestore:l.clearSteerRestore,engines:l.engines,engineCaps:l.engineCaps,agentDefs:l.agentDefs,agentAvatars:l.agentAvatars,defaultAgentSlug:l.defaultAgentSlug,skillsList:l.skillsList,connState:l.connState,connMessage:l.connMessage,filePreview:l.filePreview,openFeedback:l.openFeedback,toast:l.toast,editUserMessage:l.editUserMessage,regenerate:l.regenerate,branchFromMessage:l.branchFromMessage,rewindTo:l.rewindTo,decideApproval:l.decideApproval,answerInquiry:l.answerInquiry,setFilePreview:l.setFilePreview,setSessionEngine:l.setSessionEngine,setNewChatCfg:l.setNewChatCfg,selectSessionAgent:l.selectSessionAgent,selectNewChatAgent:l.selectNewChatAgent,workspaces:l.workspaces,setNewChatWs:l.setNewChatWs,addLocalWorkspace:l.addLocalWorkspace,addCloudProject:l.addCloudProject,setSessionModel:l.setSessionModel,setNewChatModel:l.setNewChatModel,setSessionEngineModel:l.setSessionEngineModel,setSessionThinking:l.setSessionThinking,setDefaultModel:l.setDefaultModel,setModelContextWindow:l.setModelContextWindow,setSessionMaxIterations:l.setSessionMaxIterations,setSessionPlanMode:l.setSessionPlanMode,voiceOnByAgent:l.voiceOnByAgent,setVoiceMode:l.setVoiceMode,setSessionGroup:l.setSessionGroup,newSession:l.newSession,openSettings:l.openSettings,setExecConfig:l.setExecConfig,send:l.send,stop:l.stop,compact:l.compact}))),[S,H]=c.useState(null),[G,O]=c.useState(""),[K,I]=c.useState(!1),[L,z]=c.useState(null),[F,W]=c.useState(""),[te,oe]=c.useState(!1),Q=Re(l=>u?l.sessions[u]:void 0),A=h.activeSession||Q,Y=(h.modelsResp?.models||[]).find(l=>l.id===(A?.model_id||h.cfg.modelId||h.modelsResp?.defaultModelId||""))||null,J=h.activeCtxInfo&&(!h.activeCtxInfo.modelId||!Y||h.activeCtxInfo.modelId===Y.id)?h.activeCtxInfo:null,D=h.activeUsage,B=h.activeMessages,X=c.useMemo(()=>zc(B),[B]),Z=h.running,re=h.execConfig,xe=at(l=>l.vaultRoot);c.useEffect(()=>{const l=h.pendingChatQuote;!l||l.targetType!==t.type||(W(l.text),h.clearPendingChatQuote(l.seq))},[t.type,h.pendingChatQuote,h.clearPendingChatQuote]);const q=Hi(u?re.execMode?re:{execMode:A?.project_path?"host":"sandbox",approvalMode:"auto-edit",cwd:A?.project_path||void 0,...re}:(()=>{const l=Wi(h.sessionMode,h.newChatWs,Vi()),R=l==="chat"||h.newChatWs?.kind==="cloud"||h.newChatWs?.kind==="rootless";return Ui(Ki({execMode:R?"sandbox":"host",...Gi(h.desktopConfig,!R,l),cwd:R?void 0:h.newChatWs?.path||void 0,...h.newChatCfg},l))})(),xe),De=typeof n.teamSessionId=="string"&&n.teamSessionId===q.teamMember?.teamSessionId?n.teamSessionId:void 0,pe=P(l=>De?l.configBySession[De]:void 0),ze=Yi({...h,activeId:u}),Ae=h.modelsResp?.models?bd(h.modelsResp.models):null,me=u?re.engineId:h.newChatCfg.engineId,Fe=c.useMemo(()=>B.find(l=>l.status==="streaming")?.id??null,[B]),de=h.runStats,_e=c.useMemo(()=>{if(!de)return null;for(let l=B.length-1;l>=0;l--){const R=B[l];if(R.role==="assistant"&&!hs(R))return Ji(de,R.timestamp)?R.id:null}return null},[B,de]),ee=c.useMemo(()=>{const l=B.filter(U=>U.role==="user"&&!U.content.startsWith("<turn_interrupted>")&&!U.content.startsWith(wa)).map(U=>U.content),R=new Set(l);return[...l,...h.steerSent.filter(U=>!R.has(U))]},[B,h.steerSent]),le=q.agentSlug||h.defaultAgentSlug,Be=le?h.agentAvatars[le]:void 0,v=me?h.engines.find(l=>l.id===me)?.name:le?h.agentDefs.find(l=>l.slug===le)?.name:void 0,M=h.authInfo?.nickname||h.authInfo?.username||void 0,E=h.authInfo?.avatar||void 0,_=le?!!h.voiceOnByAgent[le]:!1;c.useEffect(()=>{P.getState().ensureEngineCaps(me||void 0)},[me]),c.useEffect(()=>{le&&P.getState().refreshVoiceMode(le)},[le]);const ie=c.useCallback(l=>{d.current=l,Le.getState().registerChatSurface(t.id,l)},[t.id]),we=c.useRef(null);c.useEffect(()=>{const l=we.current;if(!l||typeof ResizeObserver>"u")return;const R=l.parentElement,U=()=>R?.style.setProperty("--t2-composer-h",`${l.offsetHeight}px`);U();const ue=new ResizeObserver(U);return ue.observe(l),()=>ue.disconnect()},[]),c.useEffect(()=>{u&&P.getState().loadSessionHistory(u)},[u]),c.useEffect(()=>{t.setTitle(A?.title?lo(A.title,s):u?"Tangu Agent":s("sidebar.newChat"))},[u,A?.title,t,s]),c.useEffect(()=>{const l=h.jumpTarget;if(!l||l.sessionId!==u||y)return;const R=document.getElementById(`tocmsg-${l.messageId}`);if(!R){B.length&&(h.toast(s("search.jumpOutOfWindow"),!0),h.clearJumpTarget());return}const U=d.current;if(U){const ke=R.getBoundingClientRect().top-U.getBoundingClientRect().top+U.scrollTop;U.scrollTo({top:Math.max(0,ke-24),behavior:"smooth"}),m.current=!1}R.classList.add("t2-jump-flash");const ue=window.setTimeout(()=>R.classList.remove("t2-jump-flash"),1600);return h.clearJumpTarget(),()=>window.clearTimeout(ue)},[h.jumpTarget?.seq,u,y,B.length]);const je=c.useCallback((l=!1)=>{const R=d.current;R&&(R.scrollTo({top:R.scrollHeight,behavior:l?"smooth":"auto"}),m.current=!0,I(!1))},[]);c.useLayoutEffect(()=>{m.current=!h.jumpTarget,g.current=0},[u]),c.useEffect(()=>{const l=d.current,R=l?.querySelector(".t2-stream-inner");if(!l||!R)return;let U=0,ue=l.scrollTop,ke=!1;const be=()=>{const ye=l.scrollHeight-l.scrollTop-l.clientHeight<40;ye?m.current=!0:ke&&l.scrollTop<ue&&(m.current=!1),ue=l.scrollTop,I(!ye&&!m.current)},Xe=()=>{m.current=!1,I(!0)},it=ye=>{ye.deltaY<0&&Xe()};let rt=0;const lt=ye=>{rt=ye.touches[0]?.clientY||0},ct=ye=>{(ye.touches[0]?.clientY||0)>rt&&Xe()},Cn=()=>{ke=!0},En=()=>{ke=!1},Tn=ye=>{["ArrowUp","PageUp","Home"].includes(ye.key)&&!(ye.target instanceof HTMLTextAreaElement||ye.target instanceof HTMLInputElement)&&Xe()},Mn=()=>{m.current&&(l.scrollTop=l.scrollHeight,ue=l.scrollTop,I(!1))},qt=new ResizeObserver(()=>{cancelAnimationFrame(U),U=requestAnimationFrame(Mn)});return qt.observe(R),qt.observe(l),Mn(),l.addEventListener("scroll",be,{passive:!0}),l.addEventListener("wheel",it,{passive:!0}),l.addEventListener("touchstart",lt,{passive:!0}),l.addEventListener("touchmove",ct,{passive:!0}),l.addEventListener("pointerdown",Cn),l.addEventListener("keydown",Tn),window.addEventListener("pointerup",En),()=>{qt.disconnect(),cancelAnimationFrame(U),l.removeEventListener("scroll",be),l.removeEventListener("wheel",it),l.removeEventListener("touchstart",lt),l.removeEventListener("touchmove",ct),l.removeEventListener("pointerdown",Cn),l.removeEventListener("keydown",Tn),window.removeEventListener("pointerup",En)}},[u]);const gt=h.compacting!==void 0;c.useLayoutEffect(()=>{m.current&&!h.jumpTarget&&je()},[B,y,je,gt]),c.useEffect(()=>{let l=0;for(const R of B)l+=R.planProposal&&R.inquiries?.filter(U=>U.status==="pending"&&U.kind==="plan").length||0;l>g.current&&je(!0),g.current=l},[B,je]),c.useEffect(()=>{const l=d.current,R=p.current;if(!l||!R)return;const U=()=>{const be=window.getSelection();if(!be||be.isCollapsed||!be.rangeCount){z(null);return}const Xe=be.toString().trim(),it=be.getRangeAt(0);if(!Xe||!l.contains(it.commonAncestorContainer)){z(null);return}const rt=it.getBoundingClientRect(),lt=R.getBoundingClientRect(),ct=ir(R);z({x:(rt.right-lt.left)/ct,y:(rt.bottom-lt.top)/ct+6,text:Xe})},ue=()=>{window.getSelection()?.isCollapsed&&z(null)},ke=()=>z(null);return l.addEventListener("mouseup",U),document.addEventListener("selectionchange",ue),l.addEventListener("scroll",ke,{passive:!0}),()=>{l.removeEventListener("mouseup",U),document.removeEventListener("selectionchange",ue),l.removeEventListener("scroll",ke)}},[u,B.length]);const ne=l=>{try{navigator.clipboard.writeText(l)}catch{}},[Je,Oa]=c.useState(Qi());c.useEffect(()=>Xi(Oa),[]);const Sn=!!h.desktopConfig?.ttsModelId?.trim(),Ba=(l,R)=>{if(Je?.msgId===l){lr();return}cr(Ne(),h.desktopConfig,l,R).catch(U=>{h.toast(U?.message==="EMPTY"?s("tts.noText"):s("tts.failed",{e:U?.message||U}),!0)})},Ha=(l,R)=>{H(l),O(R)},Nn=()=>{S&&G.trim()&&h.editUserMessage(S,G.trim(),u),H(null)},Qe=B.length>0,Lt=!!u&&Qe&&!n.childSurface&&!b&&Xt!=="mobile"&&!!h.desktopConfig?.agentDeskEnabled,zn=Zi(Lt),Wa=!n.childSurface&&!b&&Xt!=="mobile"&&!!q.groupChat&&(q.groupAgents?.length||0)>=2,Va=l=>{Ln(l.dataTransfer)&&(l.preventDefault(),l.dataTransfer.dropEffect="copy",te||oe(!0))},Ua=l=>{if(oe(!1),!Ln(l.dataTransfer))return;l.preventDefault(),l.stopPropagation();const R=rr(l.dataTransfer);R.length&&h.appendRefs(R)};return e.jsxs("div",{className:`t2-chat-view${te?" refdrop":""}`,"data-chat-surface":t.type,"data-session-id":u||void 0,style:{flex:1,minHeight:0,display:"flex",flexDirection:"row",minWidth:0},onDragOver:Va,onDragLeave:l=>{l.currentTarget.contains(l.relatedTarget)||oe(!1)},onDrop:Ua,children:[i&&q.soloAgentSlug&&u&&e.jsx(Tl,{agents:h.agentDefs.filter(l=>l.createdBy!=="system"&&!!l.libraryDir),team:null,initialMembers:[q.soloAgentSlug],onClose:()=>r(!1),onSaved:l=>{r(!1);const R=u;P.getState().ensureTeamSession(l.slug).then(U=>{U&&(P.getState().setSeedOnce(U.id,R),er(U.id,{newTab:!0}))})}}),e.jsxs("div",{className:"t2-chat-col",children:[e.jsx(dl,{children:e.jsxs("div",{className:"t2-chat-body",ref:p,children:[Qe&&e.jsx(Hc,{scrollContainerRef:d,scanTrigger:B.length}),e.jsx("div",{className:"t2-stream",ref:ie,children:e.jsxs("div",{className:"t2-stream-inner",children:[Qe?B.map(l=>hs(l)?null:l.role==="user"&&l.id===S?e.jsx("div",{className:"t2-userwrap",children:e.jsxs("div",{className:"t2-edit",children:[e.jsx("textarea",{className:"t2-edit-ta",value:G,autoFocus:!0,onChange:R=>O(R.target.value),onKeyDown:R=>{R.key==="Enter"&&(R.metaKey||R.ctrlKey)&&Nn(),R.key==="Escape"&&H(null)}}),e.jsxs("div",{className:"t2-btnrow",children:[e.jsx("button",{className:"t2-btn primary",onClick:Nn,children:s("chat.edit.saveResend")}),e.jsx("button",{className:"t2-btn ghost",onClick:()=>H(null),children:s("common.cancel")})]})]})},l.id):e.jsx(Fc,{msg:l,showWaitDetails:a,rootRef:l.id===Fe?f:void 0,footer:l.id===_e&&de?e.jsx(ss,{stats:de}):void 0,avatarUrl:l.role!=="assistant"?void 0:(()=>{const R=l.agentId||(l.agentName?h.agentDefs.find(U=>U.name===l.agentName)?.slug:void 0);if(R)return h.agentAvatars[R];if(!l.agentName)return me?void 0:Be})(),agentNameFallback:v,userName:M,userAvatar:E,fileCtx:{cfg:h.cfg,sessionId:u||"",execMode:q.execMode,onOpenPreview:h.setFilePreview},modelId:ze,speakState:Je?.msgId===l.id?Je.phase:void 0,voice:Sn?{on:_,cfg:h.cfg,stored:h.desktopConfig}:void 0,handlers:{onCopy:ne,onRegenerate:n.readOnly?void 0:()=>h.regenerate(l.id,u),onBranch:n.childSurface?void 0:()=>{h.branchFromMessage(l.id,u)},onEdit:n.readOnly?void 0:()=>Ha(l.id,l.content),onRewind:n.readOnly?void 0:R=>{h.rewindTo(l.id,R,u)},onSuggest:n.readOnly?void 0:R=>{h.send(R,[],void 0,void 0,void 0,u)},onTask:(R,U)=>Il(R,U,u),onInsertNote:nr()?R=>{Ol(R,$l(B,l.id))}:void 0,...Sn?{onSpeak:R=>Ba(l.id,R)}:{}}},l.id)):y?e.jsx(tr,{variant:"chat"}):null,Z&&de&&!_e&&de.finishedAt==null&&e.jsx("div",{className:"t2-runstats-solo",children:e.jsx(ss,{stats:de})}),B.filter(l=>l.teamSummary).slice(-1).map(l=>e.jsx(kd,{message:l},l.id)),Z&&u&&h.isGroupVoting&&e.jsxs("div",{className:"t2-sys",children:[e.jsx("span",{className:"t2-dot"})," ",s("group.voting.inProgress")]}),Z&&u&&h.llmRetry&&e.jsxs("div",{className:"t2-sys t2-retry",title:h.llmRetry.error,children:["⟳ ",s("chat.llmRetrying",{s:(h.llmRetry.waitMs/1e3).toFixed(1),n:h.llmRetry.attempt,max:h.llmRetry.max||"?"}),h.llmRetry.error?e.jsx("span",{className:"t2-retry-err",children:h.llmRetry.error}):null]}),h.compacting!==void 0&&e.jsxs("div",{className:"t2-compact",role:"status","aria-live":"polite",children:[e.jsxs("div",{className:"t2-compact-head",children:[e.jsx("span",{children:s("input.compacting")}),e.jsxs("span",{className:"t2-compact-pct",children:[h.compacting,"%"]})]}),e.jsx("div",{className:"t2-compact-track",children:e.jsx("div",{className:"t2-compact-fill",style:{width:`${h.compacting}%`}})})]})]})}),K&&e.jsx("button",{className:"jump-bottom t2-jump",title:s("chat.jumpToBottom"),onClick:()=>je(!0),children:e.jsx(sr,{size:16})}),L&&e.jsxs("div",{className:"quote-float t2-quote-menu",role:"toolbar","aria-label":s("chat.selection.actions"),onMouseDown:l=>l.preventDefault(),style:{left:L.x,top:L.y,"--quote-x":`${L.x}px`},children:[e.jsxs("button",{className:"t2-quote-action","data-testid":"selection-quote",onClick:()=>{W(L.text),z(null),window.getSelection()?.removeAllRanges()},children:[e.jsx(Qr,{size:13})," ",s("chat.action.quote")]}),t.type!=="chat-panel"&&e.jsxs("button",{className:"t2-quote-action","data-testid":"selection-ask-in-panel",onClick:()=>{Dl(L.text),z(null),window.getSelection()?.removeAllRanges()},children:[e.jsx(Us,{size:13})," ",s("chat.action.askInPanel")]}),u&&e.jsxs("button",{className:"t2-quote-action","data-testid":"selection-btw",onClick:()=>{Wn({sessionId:u,title:A?.title,quote:L.text,modelId:ze||void 0}),z(null),window.getSelection()?.removeAllRanges()},children:[e.jsx(Ur,{size:13})," ",s("btw.selectionAction")]})]})]})},u||"none"),!Qe&&!y&&e.jsx(Oc,{compact:!!n.miniSurface,title:n.miniSurface?s("mini.chatHint"):b?s("studio.chatTitle"):void 0,subtitle:b?s(j?"studio.chatHint":"studio.chooseProject"):void 0}),e.jsxs("div",{className:"composer-anchor",ref:we,children:[!n.miniSurface&&!n.childSurface&&!Qe&&q.preset!=="chat"&&!q.soloAgentSlug&&!q.soloEngineId&&!q.teamSlug&&e.jsx("div",{className:"newchat-pickers",children:e.jsx(co,{sessionId:u,cfg:q})}),!u&&(!b||j)&&(q.preset!=="chat"||C&&!b)&&e.jsx("div",{className:"newchat-projectbar",children:e.jsxs("div",{className:"newchat-projectbar-inner",children:[C&&!b&&e.jsx(uo,{}),q.preset!=="chat"&&(b&&j?e.jsxs("div",{className:"project-pill",title:j,"data-studio-project":j,children:[e.jsx(Dt,{size:13}),e.jsx("span",{className:"project-pill-name",children:jr(j)})]}):e.jsx(ho,{workspaces:h.workspaces(),value:h.newChatWs?.key??null,onChange:l=>h.setNewChatWs(l),onAddProject:window.tangu?.pickDirectory?()=>{h.addLocalWorkspace()}:void 0,onAddCloudProject:l=>{h.addCloudProject(l)}}))]})}),e.jsx(mr,{children:h.filePreview&&e.jsx(El,{target:h.filePreview,onClose:()=>h.setFilePreview(null)},h.filePreview.name)}),e.jsx(po,{sessionId:u,approvalTray:X.length?e.jsx(qc,{sessionId:u??void 0,items:X,onDecide:(l,R,U,ue)=>h.decideApproval(l,R,U,ue,u),onAnswer:(l,R,U)=>h.answerInquiry(l,R,U,u)},u??""):void 0,advisory:n.childSurface?void 0:e.jsx(Ed,{sessionId:u,fallback:e.jsx(Sd,{loggedIn:!!h.authInfo?.loggedIn&&h.authInfo.tokenValid!==!1,onToast:h.toast})}),liveOwner:x&&t.loc==="main",liveSessionKey:u,disabled:!!n.readOnly||!k||b&&!j,disabledPlaceholder:b&&!j?s("studio.chooseProject"):$,running:Z,execConfig:pe?{...q,approvalMode:pe.approvalMode||q.approvalMode}:q,teamApproval:!!pe,models:Ae,modelsResponse:h.modelsResp,modelId:ze,onModelChange:l=>h.setSessionModel(l,u,!n.childSurface),engines:h.engines,engineId:q.engineId,engineModels:q.engineId?h.engineCaps[q.engineId]?.models??[]:void 0,engineModelId:q.engineModelId,onEngineModelChange:u?l=>h.setSessionEngineModel(l,u):l=>h.setNewChatCfg(R=>({...R,engineModelId:l||void 0})),engineCommands:q.engineId?h.engineCaps[q.engineId]?.commands??[]:void 0,thinkingLevel:q.thinkingLevel,ultra:q.ultra,onThinkingChange:(l,R)=>h.setSessionThinking(l,u,!n.childSurface,R),defaultModelIds:{backgroundModelId:h.desktopConfig?.backgroundModelId||"",imageModelId:h.cfg.imageModelId||"",visionModelId:h.cfg.visionModelId||""},onDefaultModelChange:h.setDefaultModel,onContextWindowChange:(l,R)=>{h.setModelContextWindow(l,R)},maxIterations:q.maxIterations,onMaxIterationsChange:u?l=>h.setSessionMaxIterations(l,u):l=>h.setNewChatCfg(R=>({...R,maxIterations:l})),verifyCommand:q.verifyCommand,onVerifyCommandChange:u?l=>h.setExecConfig({verifyCommand:l||void 0},u):l=>h.setNewChatCfg(R=>({...R,verifyCommand:l||void 0})),planMode:q.planMode,onPlanModeChange:u?l=>h.setSessionPlanMode(l,u):l=>h.setNewChatCfg(R=>({...R,planMode:l})),preset:q.preset,onPresetChange:u?void 0:l=>h.setSessionMode(l),voiceMode:_,onVoiceModeChange:le?l=>{h.setVoiceMode(le,l)}:void 0,groupChat:q.groupChat,groupAgents:q.groupAgents,groupTempAgents:q.groupTempAgents,onGroupChange:n.childSurface||q.soloAgentSlug||q.soloEngineId?void 0:u?l=>h.setSessionGroup(l,u):l=>h.setNewChatCfg(R=>({...R,...l})),onAddAgent:q.soloAgentSlug?()=>r(!0):void 0,onNormalWork:pe?void 0:()=>{const l={planMode:!1,groupChat:!1,approvalMode:"auto-edit"};q.teamSlug&&!q.agentSlug&&(l.agentSlug=q.groupAgents?.[0]||h.defaultAgentSlug),u?h.setExecConfig(l,u):(h.setSessionMode("work"),h.setNewChatCfg(R=>({...R,...l})))},skills:h.skillsList,agents:h.agentDefs,onAgentSwitch:!n.childSurface&&u&&Qe&&!q.groupChat&&!q.soloAgentSlug&&!q.soloEngineId&&!q.teamSlug&&!q.engineId?l=>h.selectSessionAgent(l,u):void 0,currentAgentSlug:q.agentSlug||h.defaultAgentSlug,mentionProjects:q.soloAgentSlug?h.workspaces().filter(l=>l.kind==="local"&&!!l.path).map(l=>({name:l.name,path:l.path})):void 0,onNewSession:n.childSurface?void 0:()=>{q.soloAgentSlug?Z||$n("agent",q.soloAgentSlug):q.soloEngineId?Z||$n("engine",q.soloEngineId):h.newSession()},onBranch:!n.childSurface&&u?()=>{h.branchFromMessage(void 0,u)}:void 0,onOpenSettings:()=>h.openSettings("skills"),onExecConfigChange:De&&pe?l=>{l.approvalMode&&h.setExecConfig({approvalMode:l.approvalMode},De)}:l=>h.setExecConfig(l,u),onSend:async(l,R,U,ue,ke)=>{if(b){const be=nn.getState().prepareRun();return be?P.getState().send(l,R,U,ue,ke,be.sessionId):!1}return h.send(l,R,U,ue,ke,u)},onStop:()=>h.stop(u),quotedText:F,onClearQuote:()=>W(""),onBtw:u?(l,R)=>Wn({sessionId:u,title:A?.title,question:l,quote:R,modelId:ze||void 0}):void 0,contextWindow:J?.ctxWindow||Y?.contextWindow||0,ctxInfo:J,ctxTokens:D.ctx,sessionTokens:D.base+D.live,runCost:D.runCost,costLimit:D.costLimit,onCompact:l=>{h.compact(u,l)},seedText:h.steerRestore??(n.childSurface?null:h.pendingDraft),appendRefs:n.childSurface?null:h.draftRefs,onAppendRefsConsumed:h.clearDraftRefs,autoRefFromMain:!n.childSurface&&(t.loc!=="main"||n.autoRefFromMain===!0),onSeedConsumed:()=>{h.steerRestore&&u?h.clearSteerRestore(u):n.childSurface||h.setPendingDraft(null)},sentHistory:ee,pendingSteer:h.steerPending,onCancelSteer:u?l=>{h.withdrawSteer(u,l)}:void 0,onWithdrawSteer:u?l=>h.withdrawSteer(u,l):void 0,onSteerNow:u?()=>{h.steerNow(u)}:void 0})]}),!n.childSurface&&e.jsxs("div",{className:"t2-rail",children:[e.jsx(ed,{teamStatus:u?e.jsxs(e.Fragment,{children:[Wa&&e.jsx(xd,{sessionId:u}),e.jsx(yd,{sessionId:u}),h.historianEnabled&&e.jsx(md,{sessionId:u},u)]}):void 0,messages:B,running:Z,cwd:q.cwd,modelId:ze,hostCwd:q.execMode==="host"?q.cwd:void 0,extraRoots:q.extraRoots,lockedRoots:q.execMode==="host"&&xe?[xe]:[],onAddRoot:q.execMode==="host"&&u?()=>{window.tangu?.pickDirectory?.().then(l=>{if(!l)return;const R=P.getState().configBySession[u]?.extraRoots||[];l===q.cwd||R.includes(l)||P.getState().setExecConfig({extraRoots:[...R,l]},u)})}:void 0,onRemoveRoot:q.execMode==="host"&&u?l=>{if(l===xe)return;const R=P.getState().configBySession[u]?.extraRoots||[];P.getState().setExecConfig({extraRoots:R.filter(U=>U!==l)},u)}:void 0,onJumpToAttention:()=>je(!0),onShowEditing:zn&&u?l=>P.getState().deskShowFile(u,l):void 0,onOpenFile:l=>{const R=l.path?ar(l.path,q.cwd):null;if(zn&&u&&R&&h.desktopConfig?.summaryOpenIn==="desk"){P.getState().deskShowFile(u,R);return}or(gr(l,h.cfg,u||"",q.execMode))}}),Lt&&u?e.jsx(dd,{sessionId:u}):null]})]}),Lt&&u&&!o[u]?e.jsx(rd,{sessionId:u}):null,!n.childSurface&&u?e.jsx(jd,{parentId:u},u):null]})}const yu=Object.freeze(Object.defineProperty({__proto__:null,ChatView:qa},Symbol.toStringTag,{value:"Module"}));export{qc as A,Nc as B,qa as C,Il as D,dl as E,On as F,Or as G,zt as H,Hr as I,Ie as J,Qs as K,Wn as L,yu as M,Qr as Q,tl as S,Xs as T,ll as V,ad as W,Oc as a,hu as b,Fc as c,pu as d,ml as e,fl as f,cu as g,uu as h,fu as i,gu as j,Ul as k,Dr as l,vu as m,Kl as n,ul as o,zc as p,mu as q,yc as r,du as s,dn as t,vl as u,Wl as v,Tl as w,xu as x,Dl as y,wu as z};
|