@kingsoftcloud/ksadk-web 0.2.19 → 0.3.1
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/CHANGELOG.md +72 -0
- package/dist-ksadk/assets/{ArtifactsPanel-D-SSn2ee.js → ArtifactsPanel-CakCqxEN.js} +1 -1
- package/dist-ksadk/assets/CodeBlock-CynLknyO.js +9 -0
- package/dist-ksadk/assets/MathMessageMarkdown-3sQdOysS.js +8 -0
- package/dist-ksadk/assets/MermaidBlock-NERD_ef7.js +303 -0
- package/dist-ksadk/assets/NativeTerminalPanel-CiHWf82q.js +1 -0
- package/dist-ksadk/assets/{arc-BA13sHc9.js → arc-DrgjcKhl.js} +1 -1
- package/dist-ksadk/assets/architecture-7EHR7CIX-CpZLRCcY.js +1 -0
- package/dist-ksadk/assets/{architectureDiagram-3BPJPVTR-DzJzgVoL.js → architectureDiagram-3BPJPVTR-BXoVRbQ6.js} +1 -1
- package/dist-ksadk/assets/{blockDiagram-GPEHLZMM-UTdVcZhn.js → blockDiagram-GPEHLZMM-BnaB3Ywv.js} +1 -1
- package/dist-ksadk/assets/{c4Diagram-AAUBKEIU-Dix0GD4m.js → c4Diagram-AAUBKEIU-Dw4weZcp.js} +1 -1
- package/dist-ksadk/assets/channel-Dt3rQTFI.js +1 -0
- package/dist-ksadk/assets/{chunk-2J33WTMH-C2JxuZ42.js → chunk-2J33WTMH-ChjpLK7j.js} +1 -1
- package/dist-ksadk/assets/{chunk-4BX2VUAB-Be57QPgD.js → chunk-4BX2VUAB-B9drTgOW.js} +1 -1
- package/dist-ksadk/assets/{chunk-55IACEB6-WjSuy4nv.js → chunk-55IACEB6-CK4ROATy.js} +1 -1
- package/dist-ksadk/assets/{chunk-727SXJPM-BOovP-b5.js → chunk-727SXJPM-B9KtTTgw.js} +1 -1
- package/dist-ksadk/assets/{chunk-AQP2D5EJ-DOmZNmWj.js → chunk-AQP2D5EJ-1O1mki3m.js} +1 -1
- package/dist-ksadk/assets/{chunk-FMBD7UC4-DzwlodkU.js → chunk-FMBD7UC4-B_fH2YuH.js} +1 -1
- package/dist-ksadk/assets/{chunk-ND2GUHAM-DMqAikEU.js → chunk-ND2GUHAM-D6rFLaVV.js} +1 -1
- package/dist-ksadk/assets/chunk-QZHKN3VN-iXEZtKQc.js +1 -0
- package/dist-ksadk/assets/classDiagram-4FO5ZUOK-DIveV17Q.js +1 -0
- package/dist-ksadk/assets/classDiagram-v2-Q7XG4LA2-DIveV17Q.js +1 -0
- package/dist-ksadk/assets/{cose-bilkent-S5V4N54A-Zhy2GBnP.js → cose-bilkent-S5V4N54A-ChNs_Mdk.js} +1 -1
- package/dist-ksadk/assets/{dagre-BM42HDAG-CbKrtIUz.js → dagre-BM42HDAG-D0QXg_MQ.js} +1 -1
- package/dist-ksadk/assets/{diagram-2AECGRRQ-BRApgQRK.js → diagram-2AECGRRQ-DBDDKwBQ.js} +1 -1
- package/dist-ksadk/assets/{diagram-5GNKFQAL-D0xbnDiK.js → diagram-5GNKFQAL-BkwDOxmO.js} +1 -1
- package/dist-ksadk/assets/{diagram-KO2AKTUF-CVugVI9L.js → diagram-KO2AKTUF-Bv8waYvY.js} +1 -1
- package/dist-ksadk/assets/{diagram-LMA3HP47-DozUGgee.js → diagram-LMA3HP47-e1VECDdu.js} +1 -1
- package/dist-ksadk/assets/{diagram-OG6HWLK6-ZOYsKlru.js → diagram-OG6HWLK6-Ds9adfRl.js} +1 -1
- package/dist-ksadk/assets/{dist-DpKtt4Bo.js → dist-4N2NMVYg.js} +1 -1
- package/dist-ksadk/assets/{dist-CkEKJFtk.js → dist-B-jNR6Vn.js} +1 -1
- package/dist-ksadk/assets/{dist-D57wnGWd.js → dist-B5J2uhNk.js} +1 -1
- package/dist-ksadk/assets/{dist-8_SfK1IP.js → dist-B5oS1zcj.js} +1 -1
- package/dist-ksadk/assets/{dist-DMezvBGJ.js → dist-BB3-OwTQ.js} +1 -1
- package/dist-ksadk/assets/{dist-2hInLS_J.js → dist-BIlKoW0k.js} +1 -1
- package/dist-ksadk/assets/{dist-BrCcQ47T.js → dist-BjOdlDjj.js} +1 -1
- package/dist-ksadk/assets/{dist-BmlMPsCc.js → dist-C1sz5Eo3.js} +1 -1
- package/dist-ksadk/assets/{dist-B0NP_Z0z.js → dist-CWV4lDr1.js} +1 -1
- package/dist-ksadk/assets/{dist-D-xOD048.js → dist-CmZHzlwZ.js} +1 -1
- package/dist-ksadk/assets/{dist-DL_NKc_z.js → dist-D6MpCZtz.js} +1 -1
- package/dist-ksadk/assets/{dist-DyOkZmze.js → dist-DJN_6Y39.js} +1 -1
- package/dist-ksadk/assets/{dist-DmFaq_Iy.js → dist-DQU9EWw-.js} +1 -1
- package/dist-ksadk/assets/{dist-gX6GOLKq.js → dist-DWKByxWV.js} +1 -1
- package/dist-ksadk/assets/{dist-DyWsb78Q.js → dist-Dli7qW-B.js} +1 -1
- package/dist-ksadk/assets/{dist-BIJVDMuB.js → dist-DsHPdk3W.js} +1 -1
- package/dist-ksadk/assets/{dist-Dp0k7bWI.js → dist-X4TnqwOK.js} +1 -1
- package/dist-ksadk/assets/{dist-8EEyGgDx.js → dist-_pHPTyZ-.js} +1 -1
- package/dist-ksadk/assets/{dist-CPBtqRTW.js → dist-fhOuWds5.js} +1 -1
- package/dist-ksadk/assets/{dist-D-JMdWPQ.js → dist-gLnrGsoU.js} +1 -1
- package/dist-ksadk/assets/{dist-BssVmjIo.js → dist-j6Dxmf_j.js} +1 -1
- package/dist-ksadk/assets/{dist-C3HIIaN5.js → dist-o2OVmKvt.js} +1 -1
- package/dist-ksadk/assets/{erDiagram-TEJ5UH35-Bk-9bgE5.js → erDiagram-TEJ5UH35-BPItFKH6.js} +1 -1
- package/dist-ksadk/assets/eventmodeling-FCH6USID-DYFSxbqr.js +1 -0
- package/dist-ksadk/assets/{flowDiagram-I6XJVG4X-Dn9kZVuZ.js → flowDiagram-I6XJVG4X-BbYB9w5Y.js} +1 -1
- package/dist-ksadk/assets/{ganttDiagram-6RSMTGT7-BGxXlJqm.js → ganttDiagram-6RSMTGT7-TQXa0KXv.js} +1 -1
- package/dist-ksadk/assets/gitGraph-WXDBUCRP-DyNYp6BN.js +1 -0
- package/dist-ksadk/assets/{gitGraphDiagram-PVQCEYII-C7Q0X-wi.js → gitGraphDiagram-PVQCEYII-bKblCnpa.js} +1 -1
- package/dist-ksadk/assets/index-R52pJJvg.js +177 -0
- package/dist-ksadk/assets/index-jJr3_955.css +2 -0
- package/dist-ksadk/assets/info-J43DQDTF-WUx7qTde.js +1 -0
- package/dist-ksadk/assets/{infoDiagram-5YYISTIA-BO_CSqq5.js → infoDiagram-5YYISTIA-BGVT7J_i.js} +1 -1
- package/dist-ksadk/assets/{ishikawaDiagram-YF4QCWOH-eYLPLd46.js → ishikawaDiagram-YF4QCWOH-K0OOfVna.js} +1 -1
- package/dist-ksadk/assets/{journeyDiagram-JHISSGLW-De9geSb0.js → journeyDiagram-JHISSGLW-8LeOJaZp.js} +1 -1
- package/dist-ksadk/assets/{kanban-definition-UN3LZRKU-Cs80kQto.js → kanban-definition-UN3LZRKU-C6uCgZrW.js} +1 -1
- package/dist-ksadk/assets/{katex-DSrCFD8n.js → katex-CYWseY5E.js} +1 -1
- package/dist-ksadk/assets/{linear-CN9sbKTF.js → linear-hdBcYzM8.js} +1 -1
- package/dist-ksadk/assets/{mermaid-parser.core-DlgSBU8l.js → mermaid-parser.core-BWrDjSZM.js} +2 -2
- package/dist-ksadk/assets/{mindmap-definition-RKZ34NQL-9afz7Oug.js → mindmap-definition-RKZ34NQL-Bjy_2v4_.js} +1 -1
- package/dist-ksadk/assets/packet-YPE3B663-BN13y_xl.js +1 -0
- package/dist-ksadk/assets/pie-LRSECV5Y-ftSLXhhc.js +1 -0
- package/dist-ksadk/assets/{pieDiagram-4H26LBE5-DPv_VstN.js → pieDiagram-4H26LBE5-GmmqNiVH.js} +1 -1
- package/dist-ksadk/assets/{quadrantDiagram-W4KKPZXB-o77wZ1XK.js → quadrantDiagram-W4KKPZXB-BmkRbwCg.js} +1 -1
- package/dist-ksadk/assets/radar-GUYGQ44K-jaICkIeO.js +1 -0
- package/dist-ksadk/assets/{requirementDiagram-4Y6WPE33-BYVw81VC.js → requirementDiagram-4Y6WPE33-DSWFqL7c.js} +1 -1
- package/dist-ksadk/assets/{sankeyDiagram-5OEKKPKP-B7nZFMKT.js → sankeyDiagram-5OEKKPKP-l6iXmU65.js} +1 -1
- package/dist-ksadk/assets/{sequenceDiagram-3UESZ5HK-BGRRrFw5.js → sequenceDiagram-3UESZ5HK-Cq6UBeQB.js} +1 -1
- package/dist-ksadk/assets/{stateDiagram-AJRCARHV-BUfHCoPs.js → stateDiagram-AJRCARHV-qzTQpg3Y.js} +1 -1
- package/dist-ksadk/assets/stateDiagram-v2-BHNVJYJU-BYCoYGAN.js +1 -0
- package/dist-ksadk/assets/{timeline-definition-PNZ67QCA-FbCTGrf9.js → timeline-definition-PNZ67QCA-DEz24vV0.js} +1 -1
- package/dist-ksadk/assets/treeView-BLDUP644-Cpib_vlz.js +1 -0
- package/dist-ksadk/assets/treemap-LRROVOQU-DQxfmVHK.js +1 -0
- package/dist-ksadk/assets/{vennDiagram-CIIHVFJN-DWgwtPsJ.js → vennDiagram-CIIHVFJN-CMCixki2.js} +1 -1
- package/dist-ksadk/assets/wardley-L42UT6IY-BQYHnnkU.js +1 -0
- package/dist-ksadk/assets/{wardleyDiagram-YWT4CUSO-2x8G-tTM.js → wardleyDiagram-YWT4CUSO-CVzB8F9K.js} +1 -1
- package/dist-ksadk/assets/{xychartDiagram-2RQKCTM6-Drma3AYl.js → xychartDiagram-2RQKCTM6-BFBqBLc1.js} +1 -1
- package/dist-ksadk/index.html +2 -2
- package/dist-lib/App.d.ts.map +1 -1
- package/dist-lib/{ArtifactsPanel-DCn5q1OB.js → ArtifactsPanel-DjKIRTwo.js} +4 -4
- package/dist-lib/CodeBlock-C1D0R8wN.js +110 -0
- package/dist-lib/{MathMessageMarkdown-DQPFplDT.js → MathMessageMarkdown-D6LuI2LH.js} +15 -10
- package/dist-lib/{NativeTerminalPanel-CjyPyYC4.js → NativeTerminalPanel-BLhX4eDs.js} +14 -6
- package/dist-lib/WorkspacePanelContainer-B7YlLAUJ.js +3954 -0
- package/dist-lib/api/errors.d.ts +2 -0
- package/dist-lib/api/errors.d.ts.map +1 -0
- package/dist-lib/api/messages.d.ts +22 -0
- package/dist-lib/api/messages.d.ts.map +1 -1
- package/dist-lib/capabilities-CxHZ869f.js +133 -0
- package/dist-lib/capabilities.js +1 -1
- package/dist-lib/components/MessageMarkdown.d.ts.map +1 -1
- package/dist-lib/components/chat/A2UIActivityMessage.d.ts +7 -0
- package/dist-lib/components/chat/A2UIActivityMessage.d.ts.map +1 -0
- package/dist-lib/components/chat/ChatComposer.d.ts +4 -1
- package/dist-lib/components/chat/ChatComposer.d.ts.map +1 -1
- package/dist-lib/components/chat/ChatHeader.d.ts.map +1 -1
- package/dist-lib/components/chat/ChatMessageList.d.ts +8 -1
- package/dist-lib/components/chat/ChatMessageList.d.ts.map +1 -1
- package/dist-lib/components/chat/ChatSidebar.d.ts.map +1 -1
- package/dist-lib/components/chat/ConnectedComposer.d.ts +4 -1
- package/dist-lib/components/chat/ConnectedComposer.d.ts.map +1 -1
- package/dist-lib/components/chat/ConnectedMessageList.d.ts +8 -2
- package/dist-lib/components/chat/ConnectedMessageList.d.ts.map +1 -1
- package/dist-lib/components/chat/ContextUsageIndicator.d.ts +13 -0
- package/dist-lib/components/chat/ContextUsageIndicator.d.ts.map +1 -0
- package/dist-lib/components/chat/MenuChip.d.ts +19 -0
- package/dist-lib/components/chat/MenuChip.d.ts.map +1 -0
- package/dist-lib/components/chat/PermissionMenu.d.ts +7 -0
- package/dist-lib/components/chat/PermissionMenu.d.ts.map +1 -0
- package/dist-lib/components/chat/ProcessingBlocksView.d.ts +24 -0
- package/dist-lib/components/chat/ProcessingBlocksView.d.ts.map +1 -0
- package/dist-lib/components/chat/StatusBanner.d.ts +13 -0
- package/dist-lib/components/chat/StatusBanner.d.ts.map +1 -0
- package/dist-lib/components/chat/types.d.ts +36 -1
- package/dist-lib/components/chat/types.d.ts.map +1 -1
- package/dist-lib/components/markdown/CodeBlock.d.ts.map +1 -1
- package/dist-lib/components/markdown/MathMessageMarkdown.d.ts.map +1 -1
- package/dist-lib/components/native/NativeTerminalPanel.d.ts.map +1 -1
- package/dist-lib/components.js +4 -4
- package/dist-lib/core/api/facade.d.ts +3 -1
- package/dist-lib/core/api/facade.d.ts.map +1 -1
- package/dist-lib/core/api/types.d.ts +2 -1
- package/dist-lib/core/api/types.d.ts.map +1 -1
- package/dist-lib/core/run/a2ui.d.ts +13 -0
- package/dist-lib/core/run/a2ui.d.ts.map +1 -0
- package/dist-lib/core/run/agui.d.ts +35 -0
- package/dist-lib/core/run/agui.d.ts.map +1 -0
- package/dist-lib/core/run/blocks.d.ts +65 -0
- package/dist-lib/core/run/blocks.d.ts.map +1 -0
- package/dist-lib/core/run/dispatcher.d.ts.map +1 -1
- package/dist-lib/core/run/engine.d.ts +10 -0
- package/dist-lib/core/run/engine.d.ts.map +1 -1
- package/dist-lib/core/run/types.d.ts +60 -0
- package/dist-lib/core/run/types.d.ts.map +1 -1
- package/dist-lib/core/stream/index.d.ts +2 -0
- package/dist-lib/core/stream/index.d.ts.map +1 -1
- package/dist-lib/core/stream/responses-protocol.d.ts +7 -0
- package/dist-lib/core/stream/responses-protocol.d.ts.map +1 -1
- package/dist-lib/core/stream/runtime-items.d.ts +174 -0
- package/dist-lib/core/stream/runtime-items.d.ts.map +1 -0
- package/dist-lib/core/stream/types.d.ts +29 -0
- package/dist-lib/core/stream/types.d.ts.map +1 -1
- package/dist-lib/hooks/useFeedback.d.ts.map +1 -1
- package/dist-lib/hooks/useRunAgent.d.ts +8 -0
- package/dist-lib/hooks/useRunAgent.d.ts.map +1 -1
- package/dist-lib/hooks/useSessionLifecycle.d.ts +1 -1
- package/dist-lib/hooks/useSessionLifecycle.d.ts.map +1 -1
- package/dist-lib/runtime.js +2216 -1336
- package/dist-lib/stores/permission.d.ts +11 -0
- package/dist-lib/stores/permission.d.ts.map +1 -0
- package/dist-lib/stores/session.d.ts +10 -13
- package/dist-lib/stores/session.d.ts.map +1 -1
- package/dist-lib/stores/streaming.d.ts +25 -0
- package/dist-lib/stores/streaming.d.ts.map +1 -1
- package/dist-lib/styles.css +2 -1
- package/dist-lib/types/api.d.ts +12 -0
- package/dist-lib/types/api.d.ts.map +1 -1
- package/dist-lib/types/capabilities.d.ts +9 -1
- package/dist-lib/types/capabilities.d.ts.map +1 -1
- package/dist-lib/types/session-events.d.ts +11 -0
- package/dist-lib/types/session-events.d.ts.map +1 -1
- package/dist-lib/utils/capabilities.d.ts +1 -0
- package/dist-lib/utils/capabilities.d.ts.map +1 -1
- package/dist-lib/utils/feedback.d.ts +0 -1
- package/dist-lib/utils/feedback.d.ts.map +1 -1
- package/dist-lib/utils/markdown.d.ts +1 -0
- package/dist-lib/utils/markdown.d.ts.map +1 -1
- package/dist-lib/utils/messages.d.ts.map +1 -1
- package/dist-lib/utils/parse-unified-diff.d.ts +15 -0
- package/dist-lib/utils/parse-unified-diff.d.ts.map +1 -0
- package/dist-lib/utils/recovered-run.d.ts +4 -0
- package/dist-lib/utils/recovered-run.d.ts.map +1 -0
- package/dist-lib/utils/responses-stream.d.ts +2 -1
- package/dist-lib/utils/responses-stream.d.ts.map +1 -1
- package/dist-lib/utils/session-events.d.ts +9 -0
- package/dist-lib/utils/session-events.d.ts.map +1 -1
- package/dist-lib/utils/session-message-history.d.ts +7 -0
- package/dist-lib/utils/session-message-history.d.ts.map +1 -0
- package/dist-lib/utils/workspace.d.ts +1 -1
- package/package.json +12 -3
- package/dist-ksadk/assets/CodeBlock-P16VOLYi.js +0 -9
- package/dist-ksadk/assets/MathMessageMarkdown-CdGiQWHR.js +0 -8
- package/dist-ksadk/assets/MermaidBlock-IOcal8cm.js +0 -303
- package/dist-ksadk/assets/NativeTerminalPanel-DGSDWsei.js +0 -1
- package/dist-ksadk/assets/architecture-7EHR7CIX-BvUlsA6l.js +0 -1
- package/dist-ksadk/assets/channel-CTuydARX.js +0 -1
- package/dist-ksadk/assets/chunk-QZHKN3VN-BnCydivS.js +0 -1
- package/dist-ksadk/assets/classDiagram-4FO5ZUOK-BNHg45Be.js +0 -1
- package/dist-ksadk/assets/classDiagram-v2-Q7XG4LA2-BNHg45Be.js +0 -1
- package/dist-ksadk/assets/eventmodeling-FCH6USID-DsAgWnlf.js +0 -1
- package/dist-ksadk/assets/gitGraph-WXDBUCRP-BIao9Yjg.js +0 -1
- package/dist-ksadk/assets/index-C00Lwg3L.js +0 -165
- package/dist-ksadk/assets/index-DAURbCsP.css +0 -1
- package/dist-ksadk/assets/info-J43DQDTF-CyipqGxU.js +0 -1
- package/dist-ksadk/assets/packet-YPE3B663-CGkyRxlg.js +0 -1
- package/dist-ksadk/assets/pie-LRSECV5Y-M0uWAf4n.js +0 -1
- package/dist-ksadk/assets/radar-GUYGQ44K-Bdbm24-x.js +0 -1
- package/dist-ksadk/assets/stateDiagram-v2-BHNVJYJU-8xBN_gLM.js +0 -1
- package/dist-ksadk/assets/treeView-BLDUP644-npMo0ak1.js +0 -1
- package/dist-ksadk/assets/treemap-LRROVOQU-CHdzrrdo.js +0 -1
- package/dist-ksadk/assets/wardley-L42UT6IY-BEQz7wyy.js +0 -1
- package/dist-lib/CodeBlock-BGJr6bCf.js +0 -94
- package/dist-lib/WorkspacePanelContainer-fvYVV4lp.js +0 -2912
- package/dist-lib/capabilities-CiyyeRQ9.js +0 -78
- package/dist-lib/utils/session-event-history.d.ts +0 -28
- package/dist-lib/utils/session-event-history.d.ts.map +0 -1
|
@@ -1,2912 +0,0 @@
|
|
|
1
|
-
import { ArrowUp as e, Bot as t, Check as n, ChevronDown as r, Code as i, Copy as a, Download as o, ExternalLink as s, Eye as c, FileCode2 as l, FileText as u, FolderOpen as d, Image as f, Loader2 as p, LoaderCircle as m, Maximize2 as h, MessageSquareText as g, Minimize2 as _, MoreHorizontal as v, Package as y, PanelLeft as b, PanelLeftClose as ee, Paperclip as x, Pin as te, PinOff as S, Plus as ne, RefreshCcw as C, RefreshCw as re, Save as ie, Search as w, Send as ae, ShieldCheck as T, StopCircle as E, TerminalSquare as D, ThumbsDown as oe, ThumbsUp as O, Trash2 as se, Upload as ce, X as le, XCircle as k } from "lucide-react";
|
|
2
|
-
import { clsx as ue } from "clsx";
|
|
3
|
-
import { twMerge as A } from "tailwind-merge";
|
|
4
|
-
import { Fragment as j, jsx as M, jsxs as N } from "react/jsx-runtime";
|
|
5
|
-
import * as P from "react";
|
|
6
|
-
import F, { Suspense as I, lazy as de, useCallback as L, useEffect as R, useId as z, useLayoutEffect as fe, useMemo as pe, useRef as B, useState as V } from "react";
|
|
7
|
-
import * as H from "@radix-ui/react-dialog";
|
|
8
|
-
import { cva as U } from "class-variance-authority";
|
|
9
|
-
import W from "react-markdown";
|
|
10
|
-
import me from "remark-gfm";
|
|
11
|
-
import { create as he } from "zustand";
|
|
12
|
-
import { EditorView as ge, crosshairCursor as _e, drawSelection as ve, dropCursor as ye, highlightActiveLine as G, highlightActiveLineGutter as K, keymap as be, lineNumbers as xe, rectangularSelection as Se } from "@codemirror/view";
|
|
13
|
-
import { Compartment as Ce, EditorState as q } from "@codemirror/state";
|
|
14
|
-
import { defaultKeymap as we, history as Te, historyKeymap as Ee, indentWithTab as De } from "@codemirror/commands";
|
|
15
|
-
import { LanguageDescription as Oe, bracketMatching as ke, defaultHighlightStyle as Ae, foldGutter as je, foldKeymap as Me, indentOnInput as Ne, syntaxHighlighting as Pe } from "@codemirror/language";
|
|
16
|
-
import { oneDark as Fe } from "@codemirror/theme-one-dark";
|
|
17
|
-
import { highlightSelectionMatches as Ie, searchKeymap as Le } from "@codemirror/search";
|
|
18
|
-
import { autocompletion as Re, closeBrackets as ze, closeBracketsKeymap as Be, completionKeymap as Ve } from "@codemirror/autocomplete";
|
|
19
|
-
import { languages as He } from "@codemirror/language-data";
|
|
20
|
-
//#region src/lib/utils.ts
|
|
21
|
-
function J(...e) {
|
|
22
|
-
return A(ue(e));
|
|
23
|
-
}
|
|
24
|
-
//#endregion
|
|
25
|
-
//#region src/components/chat/ChatComposer.tsx
|
|
26
|
-
function Ue({ attachments: e, composerContextIndicator: t, composerMaxHeight: n, fileInputRef: r, input: i, isMobile: a, isStreaming: o, queuedDrafts: s, onAppendAttachments: c, onInputChange: l, onPaste: u, onRemoveAttachment: d, onStopGeneration: f, onCancelRemote: p, onSubmit: m, textareaRef: h }) {
|
|
27
|
-
let g = a ? "发送消息..." : "发送消息... (Shift + Enter 换行)", _ = p ? "保留恢复点并结束本次执行" : "停止生成";
|
|
28
|
-
return /* @__PURE__ */ M("div", {
|
|
29
|
-
className: "relative z-10 flex-shrink-0 bg-white/95 px-3 py-3 backdrop-blur dark:bg-slate-900/95 sm:px-4 sm:py-3",
|
|
30
|
-
children: /* @__PURE__ */ N("div", {
|
|
31
|
-
className: "mx-auto w-full max-w-[64rem]",
|
|
32
|
-
children: [s.length > 0 ? /* @__PURE__ */ N("div", {
|
|
33
|
-
className: "mb-2 rounded-2xl border border-amber-200/80 bg-amber-50/80 px-3 py-2 text-xs text-amber-900 shadow-sm dark:border-amber-900/60 dark:bg-amber-950/30 dark:text-amber-100",
|
|
34
|
-
children: [/* @__PURE__ */ N("div", {
|
|
35
|
-
className: "mb-1.5 flex items-center justify-between gap-2",
|
|
36
|
-
children: [/* @__PURE__ */ N("span", {
|
|
37
|
-
className: "font-semibold",
|
|
38
|
-
children: ["发送队列 · ", s.length]
|
|
39
|
-
}), /* @__PURE__ */ M("span", {
|
|
40
|
-
className: "text-amber-700/75 dark:text-amber-200/75",
|
|
41
|
-
children: "当前回复完成后依次发送"
|
|
42
|
-
})]
|
|
43
|
-
}), /* @__PURE__ */ N("div", {
|
|
44
|
-
className: "flex flex-col gap-1",
|
|
45
|
-
children: [s.slice(0, 3).map((e, t) => {
|
|
46
|
-
let n = e.text.trim() || (e.attachments.length > 0 ? "仅附件消息" : "空消息");
|
|
47
|
-
return /* @__PURE__ */ N("div", {
|
|
48
|
-
className: "flex items-center gap-2 rounded-xl bg-white/70 px-2 py-1.5 dark:bg-slate-950/35",
|
|
49
|
-
children: [
|
|
50
|
-
/* @__PURE__ */ M("span", {
|
|
51
|
-
className: "flex h-5 w-5 flex-shrink-0 items-center justify-center rounded-full bg-amber-100 font-mono text-[10px] text-amber-700 dark:bg-amber-900/50 dark:text-amber-100",
|
|
52
|
-
children: t + 1
|
|
53
|
-
}),
|
|
54
|
-
/* @__PURE__ */ M("span", {
|
|
55
|
-
className: "min-w-0 flex-1 truncate text-slate-700 dark:text-slate-200",
|
|
56
|
-
children: n
|
|
57
|
-
}),
|
|
58
|
-
e.attachments.length > 0 ? /* @__PURE__ */ N("span", {
|
|
59
|
-
className: "flex-shrink-0 rounded-full bg-amber-100 px-2 py-0.5 text-[10px] text-amber-700 dark:bg-amber-900/50 dark:text-amber-100",
|
|
60
|
-
children: [e.attachments.length, " 附件"]
|
|
61
|
-
}) : null
|
|
62
|
-
]
|
|
63
|
-
}, `${t}-${n}-${e.attachments.length}`);
|
|
64
|
-
}), s.length > 3 ? /* @__PURE__ */ N("div", {
|
|
65
|
-
className: "px-2 pt-0.5 text-[11px] text-amber-700/80 dark:text-amber-200/80",
|
|
66
|
-
children: [
|
|
67
|
-
"还有 ",
|
|
68
|
-
s.length - 3,
|
|
69
|
-
" 条等待发送"
|
|
70
|
-
]
|
|
71
|
-
}) : null]
|
|
72
|
-
})]
|
|
73
|
-
}) : null, /* @__PURE__ */ N("div", {
|
|
74
|
-
className: "flex items-center gap-3",
|
|
75
|
-
children: [/* @__PURE__ */ N("form", {
|
|
76
|
-
onSubmit: (t) => {
|
|
77
|
-
if (t.preventDefault(), o) {
|
|
78
|
-
p ? p() : f();
|
|
79
|
-
return;
|
|
80
|
-
}
|
|
81
|
-
let n = i.trim();
|
|
82
|
-
!n && e.length === 0 || m(n, e);
|
|
83
|
-
},
|
|
84
|
-
onDragOver: (e) => {
|
|
85
|
-
e.preventDefault(), e.stopPropagation();
|
|
86
|
-
},
|
|
87
|
-
onDrop: (e) => {
|
|
88
|
-
e.preventDefault(), e.stopPropagation(), e.dataTransfer.files && e.dataTransfer.files.length > 0 && c(Array.from(e.dataTransfer.files));
|
|
89
|
-
},
|
|
90
|
-
className: "relative flex min-w-0 flex-1 flex-col rounded-[1.25rem] border border-slate-200 bg-white p-1.5 shadow-[0_8px_22px_rgba(15,23,42,0.07)] transition-all focus-within:border-slate-300 focus-within:ring-1 focus-within:ring-slate-300 dark:border-slate-700 dark:bg-slate-900 dark:focus-within:border-slate-600 dark:focus-within:ring-slate-600",
|
|
91
|
-
children: [e.length > 0 ? /* @__PURE__ */ M("div", {
|
|
92
|
-
className: "mb-1.5 flex flex-wrap gap-2 px-1.5 pt-1.5",
|
|
93
|
-
children: e.map((e, t) => /* @__PURE__ */ N("div", {
|
|
94
|
-
className: J("flex items-center gap-2 rounded-xl border border-slate-200 bg-slate-100 px-3 py-1.5 text-xs text-slate-600 dark:border-slate-700 dark:bg-slate-800 dark:text-slate-300", a ? "max-w-full" : ""),
|
|
95
|
-
children: [/* @__PURE__ */ M("span", {
|
|
96
|
-
className: "max-w-[10rem] truncate font-medium sm:max-w-[12rem]",
|
|
97
|
-
children: e.name
|
|
98
|
-
}), /* @__PURE__ */ M("button", {
|
|
99
|
-
type: "button",
|
|
100
|
-
onClick: () => d(t),
|
|
101
|
-
className: "text-slate-400 transition hover:text-red-500",
|
|
102
|
-
"aria-label": `移除附件 ${e.name}`,
|
|
103
|
-
children: "×"
|
|
104
|
-
})]
|
|
105
|
-
}, `${e.name}-${e.size}-${t}`))
|
|
106
|
-
}) : null, /* @__PURE__ */ N("div", {
|
|
107
|
-
className: "flex w-full items-end gap-2",
|
|
108
|
-
children: [
|
|
109
|
-
/* @__PURE__ */ N("label", {
|
|
110
|
-
className: "relative flex h-9 w-9 flex-shrink-0 items-center justify-center overflow-hidden rounded-xl text-slate-400 transition hover:bg-slate-100 hover:text-slate-600 dark:hover:bg-slate-800 dark:hover:text-slate-200",
|
|
111
|
-
title: "上传附件",
|
|
112
|
-
children: [/* @__PURE__ */ M("input", {
|
|
113
|
-
ref: r,
|
|
114
|
-
type: "file",
|
|
115
|
-
multiple: !0,
|
|
116
|
-
className: "hidden",
|
|
117
|
-
onChange: (e) => {
|
|
118
|
-
e.target.files && e.target.files.length > 0 && (c(Array.from(e.target.files)), e.target.value = "");
|
|
119
|
-
}
|
|
120
|
-
}), /* @__PURE__ */ M(x, { className: "h-5 w-5" })]
|
|
121
|
-
}),
|
|
122
|
-
/* @__PURE__ */ M("textarea", {
|
|
123
|
-
ref: h,
|
|
124
|
-
rows: 1,
|
|
125
|
-
value: i,
|
|
126
|
-
onChange: l,
|
|
127
|
-
onKeyDown: (e) => {
|
|
128
|
-
e.key === "Enter" && !e.shiftKey && (e.preventDefault(), e.currentTarget.form?.requestSubmit());
|
|
129
|
-
},
|
|
130
|
-
onPaste: u,
|
|
131
|
-
placeholder: g,
|
|
132
|
-
className: J("custom-scrollbar min-h-[38px] w-full resize-none border-0 bg-transparent px-2 py-1.5 text-[15px] leading-6 outline-none placeholder:text-slate-400 dark:text-slate-100 dark:placeholder:text-slate-500", a ? "text-[16px]" : "text-[15px]"),
|
|
133
|
-
style: {
|
|
134
|
-
maxHeight: `${n}px`,
|
|
135
|
-
overflowY: "auto"
|
|
136
|
-
}
|
|
137
|
-
}),
|
|
138
|
-
/* @__PURE__ */ M("button", {
|
|
139
|
-
type: "submit",
|
|
140
|
-
disabled: !o && !i.trim() && e.length === 0,
|
|
141
|
-
className: J("flex h-9 w-9 flex-shrink-0 items-center justify-center rounded-xl transition-all", o || i.trim() || e.length > 0 ? "bg-slate-900 text-white hover:bg-slate-800 dark:bg-slate-100 dark:text-slate-900 dark:hover:bg-white" : "bg-slate-100 text-slate-400 dark:bg-slate-800 dark:text-slate-600"),
|
|
142
|
-
title: o ? _ : "发送消息",
|
|
143
|
-
children: o ? /* @__PURE__ */ M(E, { className: "h-4 w-4" }) : /* @__PURE__ */ M(ae, { className: "ml-0.5 h-4 w-4" })
|
|
144
|
-
})
|
|
145
|
-
]
|
|
146
|
-
})]
|
|
147
|
-
}), t ? /* @__PURE__ */ N("div", {
|
|
148
|
-
className: J("hidden flex-shrink-0 items-center gap-1.5 rounded-full px-2.5 py-1 text-right text-[11px] leading-5 transition-colors sm:inline-flex", t.phase === "compressing" ? "bg-amber-50 text-amber-600 dark:bg-amber-950/30 dark:text-amber-300" : t.phase === "warning" ? "bg-rose-50 text-rose-600 dark:bg-rose-950/30 dark:text-rose-300" : "bg-slate-50 text-slate-400 dark:bg-slate-800/50 dark:text-slate-500"),
|
|
149
|
-
children: [/* @__PURE__ */ M(T, { className: "h-3 w-3" }), t.label]
|
|
150
|
-
}) : null]
|
|
151
|
-
})]
|
|
152
|
-
})
|
|
153
|
-
});
|
|
154
|
-
}
|
|
155
|
-
//#endregion
|
|
156
|
-
//#region src/components/ui/sheet.tsx
|
|
157
|
-
var We = H.Root, Ge = H.Portal, Ke = P.forwardRef(({ className: e, ...t }, n) => /* @__PURE__ */ M(H.Overlay, {
|
|
158
|
-
className: J("fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0", e),
|
|
159
|
-
...t,
|
|
160
|
-
ref: n
|
|
161
|
-
}));
|
|
162
|
-
Ke.displayName = H.Overlay.displayName;
|
|
163
|
-
var qe = U("fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:duration-500", {
|
|
164
|
-
variants: { side: {
|
|
165
|
-
top: "inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top",
|
|
166
|
-
bottom: "inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom",
|
|
167
|
-
left: "inset-y-0 left-0 h-full border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left",
|
|
168
|
-
right: "inset-y-0 right-0 h-full border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right"
|
|
169
|
-
} },
|
|
170
|
-
defaultVariants: { side: "right" }
|
|
171
|
-
}), Je = P.forwardRef(({ side: e = "right", className: t, children: n, showOverlay: r = !0, showCloseButton: i = !0, ...a }, o) => /* @__PURE__ */ N(Ge, { children: [r ? /* @__PURE__ */ M(Ke, {}) : null, /* @__PURE__ */ N(H.Content, {
|
|
172
|
-
ref: o,
|
|
173
|
-
className: J(qe({ side: e }), t),
|
|
174
|
-
...a,
|
|
175
|
-
children: [n, i ? /* @__PURE__ */ N(H.Close, {
|
|
176
|
-
className: "absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-secondary",
|
|
177
|
-
children: [/* @__PURE__ */ M(le, { className: "h-4 w-4" }), /* @__PURE__ */ M("span", {
|
|
178
|
-
className: "sr-only",
|
|
179
|
-
children: "Close"
|
|
180
|
-
})]
|
|
181
|
-
}) : null]
|
|
182
|
-
})] }));
|
|
183
|
-
Je.displayName = H.Content.displayName;
|
|
184
|
-
var Ye = ({ className: e, ...t }) => /* @__PURE__ */ M("div", {
|
|
185
|
-
className: J("flex flex-col space-y-2 text-center sm:text-left", e),
|
|
186
|
-
...t
|
|
187
|
-
});
|
|
188
|
-
Ye.displayName = "SheetHeader";
|
|
189
|
-
var Xe = ({ className: e, ...t }) => /* @__PURE__ */ M("div", {
|
|
190
|
-
className: J("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2", e),
|
|
191
|
-
...t
|
|
192
|
-
});
|
|
193
|
-
Xe.displayName = "SheetFooter";
|
|
194
|
-
var Ze = P.forwardRef(({ className: e, ...t }, n) => /* @__PURE__ */ M(H.Title, {
|
|
195
|
-
ref: n,
|
|
196
|
-
className: J("text-lg font-semibold text-foreground", e),
|
|
197
|
-
...t
|
|
198
|
-
}));
|
|
199
|
-
Ze.displayName = H.Title.displayName;
|
|
200
|
-
var Qe = P.forwardRef(({ className: e, ...t }, n) => /* @__PURE__ */ M(H.Description, {
|
|
201
|
-
ref: n,
|
|
202
|
-
className: J("text-sm text-muted-foreground", e),
|
|
203
|
-
...t
|
|
204
|
-
}));
|
|
205
|
-
Qe.displayName = H.Description.displayName;
|
|
206
|
-
//#endregion
|
|
207
|
-
//#region src/components/chat/ChatHeader.tsx
|
|
208
|
-
var $e = de(() => import("./NativeTerminalPanel-CjyPyYC4.js").then((e) => e.n).then((e) => ({ default: e.NativeTerminalPanel })));
|
|
209
|
-
function et({ availableModels: e, selectedModel: t, onSelectModel: n, selectedModelLabel: r, modelCatalogLoaded: i, modelSource: a, thinkingEnabled: o, thinkingMode: s, onSelectThinkingMode: c, compact: l = !1 }) {
|
|
210
|
-
let u = J("rounded-full border border-slate-200 bg-white px-3 py-2 text-sm text-slate-700 outline-none transition-colors focus:ring-1 focus:ring-blue-500 dark:border-slate-700 dark:bg-slate-900 dark:text-slate-300", l ? "w-full" : "max-w-[13rem]"), d = e.length > 1 ? /* @__PURE__ */ M("select", {
|
|
211
|
-
value: t,
|
|
212
|
-
onChange: (e) => n(e.target.value),
|
|
213
|
-
className: u,
|
|
214
|
-
children: e.map((e) => /* @__PURE__ */ M("option", {
|
|
215
|
-
value: e.id,
|
|
216
|
-
children: e.display_name || e.id
|
|
217
|
-
}, e.id))
|
|
218
|
-
}) : r ? /* @__PURE__ */ M("span", {
|
|
219
|
-
className: J(u, "inline-flex max-w-full items-center", l ? "justify-start" : ""),
|
|
220
|
-
title: a || r,
|
|
221
|
-
children: /* @__PURE__ */ M("span", {
|
|
222
|
-
className: "truncate",
|
|
223
|
-
children: r
|
|
224
|
-
})
|
|
225
|
-
}) : /* @__PURE__ */ M("span", {
|
|
226
|
-
className: "text-sm text-slate-400",
|
|
227
|
-
children: i ? "未配置模型" : "Loading models..."
|
|
228
|
-
}), f = o ? /* @__PURE__ */ N("select", {
|
|
229
|
-
value: s,
|
|
230
|
-
onChange: (e) => c(e.target.value),
|
|
231
|
-
className: J(u, l ? "" : "max-w-[9rem]"),
|
|
232
|
-
title: "控制模型 thinking/reasoning 参数",
|
|
233
|
-
children: [
|
|
234
|
-
/* @__PURE__ */ M("option", {
|
|
235
|
-
value: "auto",
|
|
236
|
-
children: "思考自动"
|
|
237
|
-
}),
|
|
238
|
-
/* @__PURE__ */ M("option", {
|
|
239
|
-
value: "enabled",
|
|
240
|
-
children: "开启思考"
|
|
241
|
-
}),
|
|
242
|
-
/* @__PURE__ */ M("option", {
|
|
243
|
-
value: "disabled",
|
|
244
|
-
children: "关闭思考"
|
|
245
|
-
})
|
|
246
|
-
]
|
|
247
|
-
}) : null;
|
|
248
|
-
return /* @__PURE__ */ N("div", {
|
|
249
|
-
className: J("flex min-w-0 gap-2", l ? "w-full flex-col" : "items-center"),
|
|
250
|
-
children: [d, f]
|
|
251
|
-
});
|
|
252
|
-
}
|
|
253
|
-
function tt({ agentName: e, currentSessionId: t, isMobile: n, sidebarOpen: r, mobileSidebarOpen: i, onToggleSidebar: a, availableModels: o, selectedModel: c, onSelectModel: l, selectedModelLabel: u, modelCatalogLoaded: f, modelSource: p, thinkingEnabled: m, thinkingMode: h, onSelectThinkingMode: g, mobileActionsOpen: _, onMobileActionsOpenChange: y, workspaceEnabled: x, onOpenWorkspace: te, nativeManagementLink: S, nativeTerminal: ne, nativeLauncherMode: C = !1 }) {
|
|
254
|
-
let [re, ie] = V(!1), w = !!ne?.Enabled, ae = M(n ? i ? ee : b : r ? ee : b, { className: "h-5 w-5" });
|
|
255
|
-
return /* @__PURE__ */ N(j, { children: [
|
|
256
|
-
/* @__PURE__ */ N("header", {
|
|
257
|
-
className: J("flex flex-shrink-0 items-center justify-between border-b border-slate-200/30 bg-white/95 px-3 py-2 backdrop-blur dark:border-slate-800 dark:bg-slate-900/95 sm:px-4", n ? "pt-[calc(var(--safe-area-top)+0.5rem)]" : "h-14"),
|
|
258
|
-
children: [/* @__PURE__ */ N("div", {
|
|
259
|
-
className: "flex min-w-0 items-center gap-2",
|
|
260
|
-
children: [C ? null : /* @__PURE__ */ M("button", {
|
|
261
|
-
type: "button",
|
|
262
|
-
onClick: a,
|
|
263
|
-
className: "rounded-lg p-2 text-slate-500 transition-colors hover:bg-slate-100 dark:hover:bg-slate-800",
|
|
264
|
-
"aria-label": n ? "打开历史记录" : "切换侧边栏",
|
|
265
|
-
children: ae
|
|
266
|
-
}), /* @__PURE__ */ N("div", {
|
|
267
|
-
className: "min-w-0",
|
|
268
|
-
children: [/* @__PURE__ */ M("div", {
|
|
269
|
-
className: "truncate text-sm font-semibold text-slate-900 dark:text-slate-100 sm:text-base",
|
|
270
|
-
children: e
|
|
271
|
-
}), /* @__PURE__ */ M("div", {
|
|
272
|
-
className: "text-[11px] text-slate-400 dark:text-slate-500",
|
|
273
|
-
children: C ? "原生运行时入口" : "智能体"
|
|
274
|
-
})]
|
|
275
|
-
})]
|
|
276
|
-
}), n ? /* @__PURE__ */ M("button", {
|
|
277
|
-
type: "button",
|
|
278
|
-
onClick: () => y(!0),
|
|
279
|
-
className: "rounded-lg p-2 text-slate-500 transition-colors hover:bg-slate-100 dark:hover:bg-slate-800",
|
|
280
|
-
"aria-label": "打开会话操作",
|
|
281
|
-
children: /* @__PURE__ */ M(v, { className: "h-5 w-5" })
|
|
282
|
-
}) : /* @__PURE__ */ N("div", {
|
|
283
|
-
className: "flex min-w-0 items-center gap-2",
|
|
284
|
-
children: [
|
|
285
|
-
S ? /* @__PURE__ */ N("a", {
|
|
286
|
-
href: S.href,
|
|
287
|
-
target: "_blank",
|
|
288
|
-
rel: "noreferrer",
|
|
289
|
-
title: S.title,
|
|
290
|
-
className: "inline-flex flex-shrink-0 items-center gap-1.5 whitespace-nowrap rounded-xl border border-slate-200 bg-slate-50 px-3 py-2 text-sm font-medium leading-none text-slate-700 transition hover:bg-slate-100 dark:border-slate-700 dark:bg-slate-800 dark:text-slate-300 dark:hover:bg-slate-700",
|
|
291
|
-
children: [/* @__PURE__ */ M(s, { className: "h-4 w-4" }), /* @__PURE__ */ M("span", { children: S.label })]
|
|
292
|
-
}) : null,
|
|
293
|
-
x ? /* @__PURE__ */ N("button", {
|
|
294
|
-
type: "button",
|
|
295
|
-
onClick: te,
|
|
296
|
-
className: "inline-flex flex-shrink-0 items-center gap-1.5 whitespace-nowrap rounded-xl border border-slate-200 bg-slate-50 px-3 py-2 text-sm font-medium leading-none text-slate-700 transition hover:bg-slate-100 dark:border-slate-700 dark:bg-slate-800 dark:text-slate-300 dark:hover:bg-slate-700",
|
|
297
|
-
children: [/* @__PURE__ */ M(d, { className: "h-4 w-4" }), /* @__PURE__ */ M("span", { children: "Workspace" })]
|
|
298
|
-
}) : null,
|
|
299
|
-
w ? /* @__PURE__ */ N("button", {
|
|
300
|
-
type: "button",
|
|
301
|
-
onClick: () => ie(!0),
|
|
302
|
-
className: "inline-flex flex-shrink-0 items-center gap-1.5 whitespace-nowrap rounded-xl border border-emerald-200 bg-emerald-50 px-3 py-2 text-sm font-medium leading-none text-emerald-800 transition hover:bg-emerald-100 dark:border-emerald-900/70 dark:bg-emerald-950/40 dark:text-emerald-200",
|
|
303
|
-
children: [/* @__PURE__ */ M(D, { className: "h-4 w-4" }), /* @__PURE__ */ M("span", { children: "TUI" })]
|
|
304
|
-
}) : null,
|
|
305
|
-
C ? null : /* @__PURE__ */ M(et, {
|
|
306
|
-
availableModels: o,
|
|
307
|
-
selectedModel: c,
|
|
308
|
-
onSelectModel: l,
|
|
309
|
-
selectedModelLabel: u,
|
|
310
|
-
modelCatalogLoaded: f,
|
|
311
|
-
modelSource: p,
|
|
312
|
-
thinkingEnabled: m,
|
|
313
|
-
thinkingMode: h,
|
|
314
|
-
onSelectThinkingMode: g
|
|
315
|
-
}),
|
|
316
|
-
!C && t ? /* @__PURE__ */ N("span", {
|
|
317
|
-
className: "rounded bg-slate-50 px-2 py-1 text-xs font-mono text-slate-400 dark:bg-slate-800",
|
|
318
|
-
children: ["ID: ", t.slice(0, 8)]
|
|
319
|
-
}) : null
|
|
320
|
-
]
|
|
321
|
-
})]
|
|
322
|
-
}),
|
|
323
|
-
n ? /* @__PURE__ */ M(We, {
|
|
324
|
-
open: _,
|
|
325
|
-
onOpenChange: y,
|
|
326
|
-
children: /* @__PURE__ */ N(Je, {
|
|
327
|
-
side: "bottom",
|
|
328
|
-
className: "rounded-t-[1.75rem] border-slate-200 bg-white px-4 pb-[calc(var(--safe-area-bottom)+1rem)] pt-6 dark:border-slate-800 dark:bg-slate-900",
|
|
329
|
-
children: [/* @__PURE__ */ N(Ye, {
|
|
330
|
-
className: "text-left",
|
|
331
|
-
children: [/* @__PURE__ */ M(Ze, { children: "会话设置" }), /* @__PURE__ */ M(Qe, {
|
|
332
|
-
className: "sr-only",
|
|
333
|
-
children: "调整当前会话的模型和 Workspace 操作。"
|
|
334
|
-
})]
|
|
335
|
-
}), /* @__PURE__ */ N("div", {
|
|
336
|
-
className: "mt-6 flex flex-col gap-4",
|
|
337
|
-
children: [
|
|
338
|
-
x ? /* @__PURE__ */ N("button", {
|
|
339
|
-
type: "button",
|
|
340
|
-
onClick: () => {
|
|
341
|
-
y(!1), te();
|
|
342
|
-
},
|
|
343
|
-
className: "inline-flex items-center gap-2 rounded-xl border border-slate-200 bg-slate-50 px-3 py-3 text-sm font-medium text-slate-700 transition hover:bg-slate-100 dark:border-slate-700 dark:bg-slate-800 dark:text-slate-300 dark:hover:bg-slate-700",
|
|
344
|
-
children: [/* @__PURE__ */ M(d, { className: "h-4 w-4" }), "工作区文件"]
|
|
345
|
-
}) : null,
|
|
346
|
-
w ? /* @__PURE__ */ N("button", {
|
|
347
|
-
type: "button",
|
|
348
|
-
onClick: () => {
|
|
349
|
-
y(!1), ie(!0);
|
|
350
|
-
},
|
|
351
|
-
className: "inline-flex items-center gap-2 rounded-xl border border-emerald-200 bg-emerald-50 px-3 py-3 text-sm font-medium text-emerald-800 transition hover:bg-emerald-100 dark:border-emerald-900/70 dark:bg-emerald-950/40 dark:text-emerald-200",
|
|
352
|
-
children: [/* @__PURE__ */ M(D, { className: "h-4 w-4" }), "原生 TUI"]
|
|
353
|
-
}) : null,
|
|
354
|
-
S ? /* @__PURE__ */ N("a", {
|
|
355
|
-
href: S.href,
|
|
356
|
-
target: "_blank",
|
|
357
|
-
rel: "noreferrer",
|
|
358
|
-
title: S.title,
|
|
359
|
-
onClick: () => y(!1),
|
|
360
|
-
className: "inline-flex items-center gap-2 rounded-xl border border-slate-200 bg-slate-50 px-3 py-3 text-sm font-medium text-slate-700 transition hover:bg-slate-100 dark:border-slate-700 dark:bg-slate-800 dark:text-slate-300 dark:hover:bg-slate-700",
|
|
361
|
-
children: [/* @__PURE__ */ M(s, { className: "h-4 w-4" }), S.label]
|
|
362
|
-
}) : null,
|
|
363
|
-
C ? /* @__PURE__ */ M("div", {
|
|
364
|
-
className: "rounded-2xl border border-slate-200 bg-slate-50 px-3 py-3 text-sm leading-6 text-slate-600 dark:border-slate-700 dark:bg-slate-800 dark:text-slate-300",
|
|
365
|
-
children: "当前运行时对话在原生管理台中进行;这里保留管理入口和 Workspace 文件操作。"
|
|
366
|
-
}) : /* @__PURE__ */ N(j, { children: [/* @__PURE__ */ N("div", {
|
|
367
|
-
className: "space-y-2",
|
|
368
|
-
children: [/* @__PURE__ */ M("div", {
|
|
369
|
-
className: "text-xs font-medium uppercase tracking-[0.12em] text-slate-400 dark:text-slate-500",
|
|
370
|
-
children: "模型"
|
|
371
|
-
}), /* @__PURE__ */ M(et, {
|
|
372
|
-
availableModels: o,
|
|
373
|
-
selectedModel: c,
|
|
374
|
-
onSelectModel: l,
|
|
375
|
-
selectedModelLabel: u,
|
|
376
|
-
modelCatalogLoaded: f,
|
|
377
|
-
modelSource: p,
|
|
378
|
-
thinkingEnabled: m,
|
|
379
|
-
thinkingMode: h,
|
|
380
|
-
onSelectThinkingMode: g,
|
|
381
|
-
compact: !0
|
|
382
|
-
})]
|
|
383
|
-
}), /* @__PURE__ */ N("div", {
|
|
384
|
-
className: "space-y-2",
|
|
385
|
-
children: [/* @__PURE__ */ M("div", {
|
|
386
|
-
className: "text-xs font-medium uppercase tracking-[0.12em] text-slate-400 dark:text-slate-500",
|
|
387
|
-
children: "当前会话"
|
|
388
|
-
}), /* @__PURE__ */ M("div", {
|
|
389
|
-
className: "rounded-2xl border border-slate-200 bg-slate-50 px-3 py-3 text-sm text-slate-600 dark:border-slate-700 dark:bg-slate-800 dark:text-slate-300",
|
|
390
|
-
children: t ? /* @__PURE__ */ M("span", {
|
|
391
|
-
className: "break-all font-mono",
|
|
392
|
-
children: t
|
|
393
|
-
}) : "新对话尚未创建会话 ID"
|
|
394
|
-
})]
|
|
395
|
-
})] })
|
|
396
|
-
]
|
|
397
|
-
})]
|
|
398
|
-
})
|
|
399
|
-
}) : null,
|
|
400
|
-
ne && re ? /* @__PURE__ */ M(I, {
|
|
401
|
-
fallback: null,
|
|
402
|
-
children: /* @__PURE__ */ M($e, {
|
|
403
|
-
capability: ne,
|
|
404
|
-
open: re,
|
|
405
|
-
sessionId: t,
|
|
406
|
-
onClose: () => ie(!1)
|
|
407
|
-
})
|
|
408
|
-
}) : null
|
|
409
|
-
] });
|
|
410
|
-
}
|
|
411
|
-
//#endregion
|
|
412
|
-
//#region src/utils/markdown.js
|
|
413
|
-
function nt(e) {
|
|
414
|
-
return e.replace(/<think>([\s\S]*?)(?:<\/think>|$)/gi, (e, t) => `\n> 💭 **思考过程**\n>\n${String(t || "").trim().split("\n").filter(Boolean).map((e) => `> ${e}`).join("\n")}\n\n`);
|
|
415
|
-
}
|
|
416
|
-
function rt(e) {
|
|
417
|
-
return /^\s*\|(?:\s*[:\-]+\s*\|){2,}\s*$/.test(e);
|
|
418
|
-
}
|
|
419
|
-
function Y(e) {
|
|
420
|
-
let t = e.trim();
|
|
421
|
-
return t.startsWith("|") ? t.split("|").length >= 4 : !1;
|
|
422
|
-
}
|
|
423
|
-
function it(e) {
|
|
424
|
-
return rt(e) || /\|\|/.test(e) || /\|(?:\s*[:\-]+\s*\|){2,}/.test(e) && /\|(?:[^|\n]*\|){2,}/.test(e);
|
|
425
|
-
}
|
|
426
|
-
function at(e) {
|
|
427
|
-
return it(e) ? e.replace(/\|\s*\|/g, "|\n|").split("\n").map((e) => e.trimEnd()).filter((e) => e.trim().length > 0) : [e];
|
|
428
|
-
}
|
|
429
|
-
function ot(e) {
|
|
430
|
-
return Y(e) ? e.replace(/\|\s*(?:\*{1,2}|_{1,2})\s*$/u, "|") : e;
|
|
431
|
-
}
|
|
432
|
-
function st(e) {
|
|
433
|
-
let t = e.trim();
|
|
434
|
-
return Y(t) ? t.split("|").slice(1, -1).length : 0;
|
|
435
|
-
}
|
|
436
|
-
function ct(e) {
|
|
437
|
-
let t = e.match(/^(\s*)/)?.[1] || "", n = st(e);
|
|
438
|
-
return n < 2 ? "" : `${t}| ${Array.from({ length: n }, () => "---").join(" | ")} |`;
|
|
439
|
-
}
|
|
440
|
-
function lt(e) {
|
|
441
|
-
let t = [];
|
|
442
|
-
for (let n of e.split("\n")) {
|
|
443
|
-
if (/^\s*\|\s*$/.test(n)) continue;
|
|
444
|
-
let e = n.match(/^(\s*)\|\s*([^|]+)$/);
|
|
445
|
-
if (e) {
|
|
446
|
-
t.push(`${e[1]}${e[2].trim()}`);
|
|
447
|
-
continue;
|
|
448
|
-
}
|
|
449
|
-
t.push(...at(n).map(ot));
|
|
450
|
-
}
|
|
451
|
-
let n = [];
|
|
452
|
-
for (let e = 0; e < t.length; e += 1) {
|
|
453
|
-
let r = t[e];
|
|
454
|
-
r.trim().length === 0 && Y(n[n.length - 1] || "") && rt(t[e + 1] || "") || n.push(r);
|
|
455
|
-
}
|
|
456
|
-
let r = [];
|
|
457
|
-
for (let e = 0; e < n.length; e += 1) {
|
|
458
|
-
let t = n[e], i = n[e + 1] || "";
|
|
459
|
-
if (r.push(t), Y(t) && Y(i) && !rt(i) && st(t) === st(i)) {
|
|
460
|
-
let i = Y(n[e - 1] || ""), a = t.match(/^(\s*)/)?.[1] || "";
|
|
461
|
-
if (!i && a.length === 0) {
|
|
462
|
-
let e = ct(t);
|
|
463
|
-
e && r.push(e);
|
|
464
|
-
}
|
|
465
|
-
}
|
|
466
|
-
}
|
|
467
|
-
let i = [];
|
|
468
|
-
for (let e = 0; e < r.length; e += 1) {
|
|
469
|
-
let t = r[e], n = r[e + 1] || "", a = i[i.length - 1] || "", o = Y(t) && (a.trim().length === 0 || !Y(a)), s = Y(t) && (n.trim().length === 0 || !Y(n)), c = t.match(/^(\s*)/)?.[1] || "";
|
|
470
|
-
o && c.length === 0 && a.trim().length > 0 && i.push(""), i.push(t), s && c.length === 0 && n.trim().length > 0 && i.push("");
|
|
471
|
-
}
|
|
472
|
-
return i.join("\n");
|
|
473
|
-
}
|
|
474
|
-
function ut(e) {
|
|
475
|
-
let t = e.replace(/^[\u200B-\u200D\uFEFF]+/u, ""), n = t.match(/^([ \t\u00A0\u1680\u2000-\u200A\u202F\u205F\u3000]*)([##]{1,6})([ \t\u00A0\u1680\u2000-\u200A\u202F\u205F\u3000]*)(\S.*)?$/u);
|
|
476
|
-
if (!n) return t;
|
|
477
|
-
let [, r, i, , a = ""] = n, o = r.replace(/[^\t ]/gu, " "), s = i.replace(/#/gu, "#");
|
|
478
|
-
return a ? `${o}${s} ${a}` : `${o}${s}`;
|
|
479
|
-
}
|
|
480
|
-
function dt(e) {
|
|
481
|
-
let t = e;
|
|
482
|
-
return t = t.split("\n").map((e) => ut(e)).join("\n"), t = t.replace(/^[ \t]+(#{1,6}\s*)/gm, "$1"), t = t.replace(/([^\n#])\s*(#{1,6}\s*\S)/g, "$1\n\n$2"), t = t.replace(/^(#{1,6}\s*[^\n]+)\n(?!\n)/gm, "$1\n\n"), t = t.replace(/^(#{1,6}[^\n|]+?)\s*(\|)/gm, "$1\n$2"), t = t.replace(/([。;;::])\s*(\d+\.\s*)/g, "$1\n$2"), t = t.replace(/([^\n\s])(\d+\.\s+)/g, "$1\n$2"), t = t.replace(/([。;;::\.])\s*-(?!-)\s*/g, "$1\n- "), t = t.replace(/([^\n\s-])-\s+/g, "$1\n- "), t = t.replace(/^-(?!-)(\S)/gm, "- $1"), t = lt(t), t = t.replace(/\n{3,}/g, "\n\n"), t.trim();
|
|
483
|
-
}
|
|
484
|
-
function ft(e) {
|
|
485
|
-
return e.map((t, n) => {
|
|
486
|
-
if (n % 2 == 1) return t;
|
|
487
|
-
let r = dt(t), i = n > 0, a = n < e.length - 1;
|
|
488
|
-
return r ? (i && !r.startsWith("\n") && (r = `\n${r}`), a && !r.endsWith("\n") && (r = `${r}\n`), r) : i && a ? "\n\n" : i || a ? "\n" : r;
|
|
489
|
-
});
|
|
490
|
-
}
|
|
491
|
-
function pt(e) {
|
|
492
|
-
if (!e) return e;
|
|
493
|
-
let t = String(e).replace(/\r\n/g, "\n").replace(/\r/g, "\n").trim();
|
|
494
|
-
return t = nt(t), (t.match(/```/g) || []).length % 2 == 1 && (t = `${t}\n\`\`\``), ft(t.split("```")).join("```").trim();
|
|
495
|
-
}
|
|
496
|
-
//#endregion
|
|
497
|
-
//#region src/components/MessageMarkdown.tsx
|
|
498
|
-
var mt = F.lazy(() => import("./CodeBlock-BGJr6bCf.js").then((e) => ({ default: e.CodeBlock }))), ht = F.lazy(() => import("./MermaidBlock-BFNE1NN8.js").then((e) => ({ default: e.MermaidBlock }))), gt = F.lazy(() => import("./MathMessageMarkdown-DQPFplDT.js").then((e) => ({ default: e.MathMessageMarkdown })));
|
|
499
|
-
function _t(e) {
|
|
500
|
-
return /\$[^$]+\$|\$\$[^$]+\$\$/.test(e);
|
|
501
|
-
}
|
|
502
|
-
var vt = {
|
|
503
|
-
code({ className: e, children: t, ...n }) {
|
|
504
|
-
let r = /language-(\w+)/.exec(e || ""), i = String(t ?? "");
|
|
505
|
-
if (!r && !i.includes("\n")) return /* @__PURE__ */ M("code", {
|
|
506
|
-
className: "bg-slate-100 dark:bg-slate-800 px-1.5 py-0.5 rounded-md text-[13.5px] font-mono text-slate-800 dark:text-slate-200 before:content-none after:content-none border border-slate-200 dark:border-slate-700",
|
|
507
|
-
...n,
|
|
508
|
-
children: t
|
|
509
|
-
});
|
|
510
|
-
let a = r ? r[1] : "";
|
|
511
|
-
return a === "mermaid" ? /* @__PURE__ */ M(I, {
|
|
512
|
-
fallback: /* @__PURE__ */ M("div", { className: "h-32 animate-pulse bg-slate-100 dark:bg-slate-800 rounded" }),
|
|
513
|
-
children: /* @__PURE__ */ M(ht, { chart: i })
|
|
514
|
-
}) : /* @__PURE__ */ M(I, {
|
|
515
|
-
fallback: /* @__PURE__ */ M("pre", {
|
|
516
|
-
className: "p-4 text-sm",
|
|
517
|
-
children: i
|
|
518
|
-
}),
|
|
519
|
-
children: /* @__PURE__ */ M(mt, {
|
|
520
|
-
language: a,
|
|
521
|
-
value: i
|
|
522
|
-
})
|
|
523
|
-
});
|
|
524
|
-
},
|
|
525
|
-
table({ children: e, ...t }) {
|
|
526
|
-
return /* @__PURE__ */ M("div", {
|
|
527
|
-
className: "overflow-x-auto my-4 border border-slate-200 dark:border-slate-700 rounded-lg",
|
|
528
|
-
children: /* @__PURE__ */ M("table", {
|
|
529
|
-
className: "w-full text-sm text-left my-0",
|
|
530
|
-
...t,
|
|
531
|
-
children: e
|
|
532
|
-
})
|
|
533
|
-
});
|
|
534
|
-
},
|
|
535
|
-
th({ children: e, ...t }) {
|
|
536
|
-
return /* @__PURE__ */ M("th", {
|
|
537
|
-
className: "bg-slate-50 dark:bg-slate-800/50 px-4 py-2 font-semibold border-b border-slate-200 dark:border-slate-700",
|
|
538
|
-
...t,
|
|
539
|
-
children: e
|
|
540
|
-
});
|
|
541
|
-
},
|
|
542
|
-
td({ children: e, ...t }) {
|
|
543
|
-
return /* @__PURE__ */ M("td", {
|
|
544
|
-
className: "px-4 py-2 border-b border-slate-100 dark:border-slate-800 last:border-0",
|
|
545
|
-
...t,
|
|
546
|
-
children: e
|
|
547
|
-
});
|
|
548
|
-
},
|
|
549
|
-
a({ children: e, href: t, ...n }) {
|
|
550
|
-
return /* @__PURE__ */ M("a", {
|
|
551
|
-
href: t,
|
|
552
|
-
className: "text-blue-600 dark:text-blue-400 hover:underline",
|
|
553
|
-
target: "_blank",
|
|
554
|
-
rel: "noopener noreferrer",
|
|
555
|
-
...n,
|
|
556
|
-
children: e
|
|
557
|
-
});
|
|
558
|
-
}
|
|
559
|
-
}, yt = F.memo(({ content: e }) => {
|
|
560
|
-
let t = pt(e);
|
|
561
|
-
return /* @__PURE__ */ M("div", {
|
|
562
|
-
className: "prose prose-slate dark:prose-invert max-w-none break-words text-[15px] leading-7 prose-headings:mb-3 prose-headings:mt-6 prose-headings:font-semibold prose-headings:text-slate-900 dark:prose-headings:text-slate-50 prose-h1:text-[1.95rem] prose-h1:leading-tight prose-h1:tracking-[-0.02em] prose-h2:text-[1.55rem] prose-h2:leading-tight prose-h2:tracking-[-0.015em] prose-h3:text-[1.2rem] prose-h3:leading-snug prose-p:my-3 prose-p:leading-7 prose-strong:text-slate-900 dark:prose-strong:text-slate-100 prose-ol:my-3 prose-ul:my-3 prose-li:my-1.5 prose-li:leading-7 prose-hr:my-5 prose-hr:border-slate-200 dark:prose-hr:border-slate-700 prose-pre:m-0 prose-pre:bg-transparent prose-pre:p-0 [&>*:first-child]:mt-0 [&>*:last-child]:mb-0",
|
|
563
|
-
children: /* @__PURE__ */ M(W, {
|
|
564
|
-
remarkPlugins: [me],
|
|
565
|
-
components: vt,
|
|
566
|
-
children: t
|
|
567
|
-
})
|
|
568
|
-
});
|
|
569
|
-
}), X = F.memo(({ content: e }) => _t(e) ? /* @__PURE__ */ M(I, {
|
|
570
|
-
fallback: /* @__PURE__ */ M(yt, { content: e }),
|
|
571
|
-
children: /* @__PURE__ */ M(gt, { content: e })
|
|
572
|
-
}) : /* @__PURE__ */ M(yt, { content: e }));
|
|
573
|
-
//#endregion
|
|
574
|
-
//#region src/utils/feedback.js
|
|
575
|
-
function Z(e) {
|
|
576
|
-
return String(e || "").trim();
|
|
577
|
-
}
|
|
578
|
-
function bt(e) {
|
|
579
|
-
let t = Z(e).toLowerCase();
|
|
580
|
-
return t === "up" || t === "down" ? t : "";
|
|
581
|
-
}
|
|
582
|
-
function xt(e) {
|
|
583
|
-
if (!e || typeof e != "object") return null;
|
|
584
|
-
let t = bt(e.Rating || e.rating);
|
|
585
|
-
return t ? {
|
|
586
|
-
agentId: Z(e.AgentId || e.agentId),
|
|
587
|
-
sessionId: Z(e.SessionId || e.sessionId),
|
|
588
|
-
responseId: Z(e.ResponseId || e.responseId),
|
|
589
|
-
eventId: Z(e.EventId || e.eventId),
|
|
590
|
-
rating: t,
|
|
591
|
-
comment: String(e.Comment ?? e.comment ?? ""),
|
|
592
|
-
traceId: Z(e.TraceId || e.traceId),
|
|
593
|
-
rootSpanId: Z(e.RootSpanId || e.rootSpanId),
|
|
594
|
-
updatedAt: Z(e.UpdatedAt || e.updatedAt)
|
|
595
|
-
} : null;
|
|
596
|
-
}
|
|
597
|
-
function St(e, t, n) {
|
|
598
|
-
return !!(e?.role === "model" && Z(e.responseId) && Z(e.eventId) && !(t && n));
|
|
599
|
-
}
|
|
600
|
-
function Ct({ agentId: e, sessionId: t, message: n }) {
|
|
601
|
-
let r = Z(n?.responseId);
|
|
602
|
-
if (!r) throw Error("Message missing response id");
|
|
603
|
-
return {
|
|
604
|
-
AgentId: Z(e),
|
|
605
|
-
SessionId: Z(t),
|
|
606
|
-
ResponseId: r
|
|
607
|
-
};
|
|
608
|
-
}
|
|
609
|
-
function wt({ agentId: e, sessionId: t, message: n, rating: r, comment: i = "" }) {
|
|
610
|
-
let a = bt(r);
|
|
611
|
-
if (!a) throw Error("Feedback rating must be up or down");
|
|
612
|
-
let o = {
|
|
613
|
-
...Ct({
|
|
614
|
-
agentId: e,
|
|
615
|
-
sessionId: t,
|
|
616
|
-
message: n
|
|
617
|
-
}),
|
|
618
|
-
EventId: Z(n?.eventId),
|
|
619
|
-
Rating: a,
|
|
620
|
-
Comment: String(i || ""),
|
|
621
|
-
TraceId: Z(n?.traceId),
|
|
622
|
-
RootSpanId: Z(n?.rootSpanId)
|
|
623
|
-
};
|
|
624
|
-
if (!o.EventId) throw Error("Message missing event id");
|
|
625
|
-
return o;
|
|
626
|
-
}
|
|
627
|
-
function Tt(e, { messageId: t, rating: n, comment: r = "" }) {
|
|
628
|
-
let i = e.find((e) => e.id === t), a = i?.feedback ? { ...i.feedback } : null, o = bt(n);
|
|
629
|
-
return {
|
|
630
|
-
nextMessages: e.map((e) => e.id === t ? {
|
|
631
|
-
...e,
|
|
632
|
-
feedback: {
|
|
633
|
-
...e.feedback || {},
|
|
634
|
-
responseId: Z(e.responseId),
|
|
635
|
-
eventId: Z(e.eventId),
|
|
636
|
-
rating: o,
|
|
637
|
-
comment: String(r || ""),
|
|
638
|
-
pending: !0,
|
|
639
|
-
error: ""
|
|
640
|
-
}
|
|
641
|
-
} : e),
|
|
642
|
-
previousFeedback: a
|
|
643
|
-
};
|
|
644
|
-
}
|
|
645
|
-
function Et(e, { messageId: t, feedback: n }) {
|
|
646
|
-
let r = xt(n) || n;
|
|
647
|
-
return e.map((e) => e.id === t ? {
|
|
648
|
-
...e,
|
|
649
|
-
feedback: r ? {
|
|
650
|
-
...r,
|
|
651
|
-
pending: !1,
|
|
652
|
-
error: ""
|
|
653
|
-
} : void 0
|
|
654
|
-
} : e);
|
|
655
|
-
}
|
|
656
|
-
function Dt(e, { messageId: t, previousFeedback: n }) {
|
|
657
|
-
return e.map((e) => {
|
|
658
|
-
if (e.id !== t) return e;
|
|
659
|
-
if (!n) {
|
|
660
|
-
let { feedback: t, ...n } = e;
|
|
661
|
-
return n;
|
|
662
|
-
}
|
|
663
|
-
return {
|
|
664
|
-
...e,
|
|
665
|
-
feedback: n
|
|
666
|
-
};
|
|
667
|
-
});
|
|
668
|
-
}
|
|
669
|
-
function Ot(e, { messageId: t }) {
|
|
670
|
-
return e.map((e) => {
|
|
671
|
-
if (e.id !== t) return e;
|
|
672
|
-
let { feedback: n, ...r } = e;
|
|
673
|
-
return r;
|
|
674
|
-
});
|
|
675
|
-
}
|
|
676
|
-
//#endregion
|
|
677
|
-
//#region src/utils/tool-display.js
|
|
678
|
-
function kt(e) {
|
|
679
|
-
return String(e || "").replace(/\\u([0-9a-fA-F]{4})/g, (e, t) => String.fromCharCode(Number.parseInt(t, 16)));
|
|
680
|
-
}
|
|
681
|
-
function At(e) {
|
|
682
|
-
let t = String(e || "").trim();
|
|
683
|
-
for (let e = 0; e < 3; e += 1) {
|
|
684
|
-
if (!t) return t;
|
|
685
|
-
let e = t[0], n = t[t.length - 1];
|
|
686
|
-
if (!(e === "{" && n === "}" || e === "[" && n === "]" || e === "\"" && n === "\"")) return t.replace(/\\n/g, "\n").replace(/\\"/g, "\"");
|
|
687
|
-
try {
|
|
688
|
-
let e = JSON.parse(t);
|
|
689
|
-
if (typeof e != "string") return jt(e);
|
|
690
|
-
t = e.trim();
|
|
691
|
-
} catch {
|
|
692
|
-
return kt(t).replace(/\\n/g, "\n").replace(/\\"/g, "\"");
|
|
693
|
-
}
|
|
694
|
-
}
|
|
695
|
-
return t;
|
|
696
|
-
}
|
|
697
|
-
function jt(e) {
|
|
698
|
-
return typeof e == "string" ? At(e) : Array.isArray(e) ? e.map((e) => jt(e)) : !e || typeof e != "object" ? e : Object.fromEntries(Object.entries(e).map(([e, t]) => [e, jt(t)]));
|
|
699
|
-
}
|
|
700
|
-
function Mt(e) {
|
|
701
|
-
return typeof e == "string" ? At(e) : jt(e);
|
|
702
|
-
}
|
|
703
|
-
function Nt(e) {
|
|
704
|
-
return e === !1 ? !0 : typeof e == "string" ? e.trim().toLowerCase() === "false" : !1;
|
|
705
|
-
}
|
|
706
|
-
function Pt(e) {
|
|
707
|
-
return e === !0 ? !0 : typeof e == "string" ? e.trim().toLowerCase() === "true" : !1;
|
|
708
|
-
}
|
|
709
|
-
function Ft(e) {
|
|
710
|
-
return e == null || e === !1 ? !1 : typeof e == "string" ? e.trim().length > 0 : typeof e == "object" ? Object.keys(e).length > 0 : !0;
|
|
711
|
-
}
|
|
712
|
-
function It(e) {
|
|
713
|
-
return String(e?.status || "").trim().toLowerCase() === "accepted_not_extracted";
|
|
714
|
-
}
|
|
715
|
-
function Lt(e, t = 0) {
|
|
716
|
-
if (!e || t > 4) return !1;
|
|
717
|
-
if (typeof e == "string") {
|
|
718
|
-
let n = At(e);
|
|
719
|
-
return n !== e && Lt(n, t + 1);
|
|
720
|
-
}
|
|
721
|
-
if (Array.isArray(e)) return e.some((e) => Lt(e, t + 1));
|
|
722
|
-
if (typeof e != "object" || It(e)) return !1;
|
|
723
|
-
if (Nt(e.ok) || Nt(e.success)) return !0;
|
|
724
|
-
let n = Pt(e.ok) || Pt(e.success), r = String(e.status || "").trim().toLowerCase();
|
|
725
|
-
return !n && [
|
|
726
|
-
"error",
|
|
727
|
-
"failed",
|
|
728
|
-
"failure"
|
|
729
|
-
].includes(r) || !n && (Ft(e.error_type) || Ft(e.error_message) || Ft(e.error)) ? !0 : Object.values(e).some((e) => Lt(e, t + 1));
|
|
730
|
-
}
|
|
731
|
-
function Rt(e) {
|
|
732
|
-
return e == null || e === "" ? !1 : Lt(Mt(e));
|
|
733
|
-
}
|
|
734
|
-
function zt(e) {
|
|
735
|
-
if (e == null || e === "") return "";
|
|
736
|
-
let t = Mt(e);
|
|
737
|
-
return typeof t == "string" ? t : JSON.stringify(t, null, 2);
|
|
738
|
-
}
|
|
739
|
-
//#endregion
|
|
740
|
-
//#region src/utils/clipboard.js
|
|
741
|
-
async function Bt(e, t = globalThis) {
|
|
742
|
-
let n = String(e ?? ""), r = t?.navigator;
|
|
743
|
-
if (r?.clipboard?.writeText) try {
|
|
744
|
-
return await r.clipboard.writeText(n), !0;
|
|
745
|
-
} catch {}
|
|
746
|
-
let i = t?.document, a = i?.body;
|
|
747
|
-
if (!i?.createElement || !a?.appendChild || !a?.removeChild) return !1;
|
|
748
|
-
let o = i.createElement("textarea");
|
|
749
|
-
o.value = n, o.setAttribute?.("readonly", ""), o.style && (o.style.position = "fixed", o.style.top = "0", o.style.left = "-9999px", o.style.opacity = "0", o.style.pointerEvents = "none");
|
|
750
|
-
let s = i.activeElement;
|
|
751
|
-
a.appendChild(o), o.focus?.(), o.select?.(), o.setSelectionRange?.(0, n.length);
|
|
752
|
-
try {
|
|
753
|
-
return typeof i.execCommand == "function" ? !!i.execCommand("copy") : !1;
|
|
754
|
-
} finally {
|
|
755
|
-
a.removeChild(o), s?.focus?.();
|
|
756
|
-
}
|
|
757
|
-
}
|
|
758
|
-
//#endregion
|
|
759
|
-
//#region src/utils/session-helpers.ts
|
|
760
|
-
function Vt(e) {
|
|
761
|
-
return String(e.Title || "").trim() || String(e.FirstPrompt || "").trim() || String(e.LastPrompt || "").trim() || String(e.Summary || "").trim() || "新对话";
|
|
762
|
-
}
|
|
763
|
-
function Ht(e) {
|
|
764
|
-
if (!e) return "";
|
|
765
|
-
if (typeof e == "string") {
|
|
766
|
-
let t = Date.parse(e);
|
|
767
|
-
return Number.isNaN(t) ? "" : new Date(t).toLocaleString("zh-CN", {
|
|
768
|
-
month: "short",
|
|
769
|
-
day: "numeric",
|
|
770
|
-
hour: "2-digit",
|
|
771
|
-
minute: "2-digit"
|
|
772
|
-
});
|
|
773
|
-
}
|
|
774
|
-
return new Date(e > 1e11 ? e : e * 1e3).toLocaleString("zh-CN", {
|
|
775
|
-
month: "short",
|
|
776
|
-
day: "numeric",
|
|
777
|
-
hour: "2-digit",
|
|
778
|
-
minute: "2-digit"
|
|
779
|
-
});
|
|
780
|
-
}
|
|
781
|
-
//#endregion
|
|
782
|
-
//#region src/utils/message-virtualization.js
|
|
783
|
-
function Ut(e, t, n) {
|
|
784
|
-
return Math.max(t, Math.min(n, e));
|
|
785
|
-
}
|
|
786
|
-
function Wt({ items: e = [], scrollTop: t = 0, viewportHeight: n = 0, overscan: r = 4, defaultItemHeight: i = 120, measuredHeights: a = /* @__PURE__ */ new Map(), getItemKey: o = (e, t) => e?.id || String(t) } = {}) {
|
|
787
|
-
let s = Math.max(0, Number(n) || 0), c = Math.max(0, Number(t) || 0), l = Math.max(0, Number(r) || 0), u = Math.max(1, Number(i) || 120);
|
|
788
|
-
if (!e.length) return {
|
|
789
|
-
startIndex: 0,
|
|
790
|
-
endIndex: 0,
|
|
791
|
-
offsetTop: 0,
|
|
792
|
-
totalHeight: 0,
|
|
793
|
-
visibleItems: []
|
|
794
|
-
};
|
|
795
|
-
let d = e.map((e, t) => {
|
|
796
|
-
let n = o(e, t), r = Number(a.get(n));
|
|
797
|
-
return Number.isFinite(r) && r > 0 ? r : u;
|
|
798
|
-
}), f = Array(e.length), p = 0;
|
|
799
|
-
for (let t = 0; t < e.length; t += 1) f[t] = p, p += d[t];
|
|
800
|
-
let m = p, h = c + s, g = 0;
|
|
801
|
-
for (; g < e.length && f[g] + d[g] <= c;) g += 1;
|
|
802
|
-
let _ = g;
|
|
803
|
-
for (; _ < e.length && f[_] < h;) _ += 1;
|
|
804
|
-
return g = Ut(g - l, 0, e.length), _ = Ut(Math.max(g + 1, _ + l), 0, e.length), {
|
|
805
|
-
startIndex: g,
|
|
806
|
-
endIndex: _,
|
|
807
|
-
offsetTop: f[g] || 0,
|
|
808
|
-
totalHeight: m,
|
|
809
|
-
visibleItems: e.slice(g, _).map((e, t) => {
|
|
810
|
-
let n = g + t;
|
|
811
|
-
return {
|
|
812
|
-
index: n,
|
|
813
|
-
item: e,
|
|
814
|
-
top: f[n] || 0,
|
|
815
|
-
height: d[n] || u
|
|
816
|
-
};
|
|
817
|
-
})
|
|
818
|
-
};
|
|
819
|
-
}
|
|
820
|
-
//#endregion
|
|
821
|
-
//#region src/components/chat/ChatMessageList.tsx
|
|
822
|
-
var Gt = 140, Kt = 4;
|
|
823
|
-
function qt(e) {
|
|
824
|
-
let t = Math.max(0, Math.floor(e / 1e3)), n = Math.floor(t / 60), r = t % 60;
|
|
825
|
-
return n <= 0 ? `${r}s` : `${n}m ${String(r).padStart(2, "0")}s`;
|
|
826
|
-
}
|
|
827
|
-
function Jt(e) {
|
|
828
|
-
return e < 1e3 ? "刚刚" : e < 6e4 ? `${Math.floor(e / 1e3)} 秒前` : `${Math.floor(e / 6e4)} 分钟前`;
|
|
829
|
-
}
|
|
830
|
-
function Yt(e) {
|
|
831
|
-
return !Number.isFinite(e) || !e || e <= 0 ? "" : e >= 1e6 ? `${(e / 1e6).toFixed(e >= 1e7 ? 0 : 1)}M` : e >= 1e3 ? `${(e / 1e3).toFixed(e >= 1e5 ? 0 : 1)}K` : String(Math.round(e));
|
|
832
|
-
}
|
|
833
|
-
function Xt({ contextIndicator: e }) {
|
|
834
|
-
let t = e?.usedTokens, n = e?.contextWindowTokens, r = Yt(t), i = Yt(n), [a, o] = V(0);
|
|
835
|
-
if (R(() => {
|
|
836
|
-
r && o((e) => e + 1);
|
|
837
|
-
}, [r]), !r) return null;
|
|
838
|
-
let s = [r, i].filter(Boolean).join("/");
|
|
839
|
-
return /* @__PURE__ */ N("span", {
|
|
840
|
-
className: "token-count-pulse hidden text-slate-400 dark:text-slate-500 sm:inline",
|
|
841
|
-
title: e?.label || `估算 token ${s}`,
|
|
842
|
-
children: ["估算 token ", s]
|
|
843
|
-
}, a);
|
|
844
|
-
}
|
|
845
|
-
function Zt({ activity: e, contextIndicator: t, onStopGeneration: r, onCancelRemote: i }) {
|
|
846
|
-
let [a, o] = V(() => Date.now());
|
|
847
|
-
R(() => {
|
|
848
|
-
let e = window.setInterval(() => o(Date.now()), 1e3);
|
|
849
|
-
return () => window.clearInterval(e);
|
|
850
|
-
}, []);
|
|
851
|
-
let s = e.status === "connecting" || e.status === "running" || e.status === "waiting", c = a - e.lastEventAt < 2e4;
|
|
852
|
-
return /* @__PURE__ */ N("div", {
|
|
853
|
-
className: "inline-flex max-w-full items-center gap-2 rounded-full border border-slate-200/70 bg-white/90 px-2.5 py-1 text-[11px] leading-4 text-slate-500 shadow-sm shadow-slate-900/5 backdrop-blur dark:border-slate-700/60 dark:bg-slate-900/90 dark:text-slate-400",
|
|
854
|
-
children: [
|
|
855
|
-
e.status === "failed" ? /* @__PURE__ */ M(E, { className: "h-3 w-3 text-rose-500" }) : e.status === "completed" ? /* @__PURE__ */ M(n, { className: "h-3 w-3 text-emerald-500" }) : e.status === "stopped" ? /* @__PURE__ */ M(T, { className: "h-3 w-3 text-amber-500" }) : /* @__PURE__ */ M(C, { className: "h-3 w-3 animate-spin text-slate-400" }),
|
|
856
|
-
/* @__PURE__ */ M("span", {
|
|
857
|
-
className: "max-w-[16rem] truncate text-slate-600 dark:text-slate-300",
|
|
858
|
-
title: e.detail || e.phase,
|
|
859
|
-
children: e.phase
|
|
860
|
-
}),
|
|
861
|
-
/* @__PURE__ */ N("span", { children: [
|
|
862
|
-
e.source === "restore" ? "恢复" : "运行",
|
|
863
|
-
" ",
|
|
864
|
-
qt(a - e.startedAt)
|
|
865
|
-
] }),
|
|
866
|
-
s ? /* @__PURE__ */ M("span", {
|
|
867
|
-
className: J("inline-block h-1.5 w-1.5 flex-shrink-0 rounded-full", c ? "bg-emerald-400" : "bg-slate-300 dark:bg-slate-600"),
|
|
868
|
-
title: c ? "连接存活" : "连接超时"
|
|
869
|
-
}) : null,
|
|
870
|
-
/* @__PURE__ */ N("span", {
|
|
871
|
-
className: "text-slate-400 dark:text-slate-500",
|
|
872
|
-
children: [e.eventCount, " ev"]
|
|
873
|
-
}),
|
|
874
|
-
/* @__PURE__ */ M("span", {
|
|
875
|
-
className: "hidden text-slate-400 dark:text-slate-500 sm:inline",
|
|
876
|
-
children: Jt(a - e.lastEventAt)
|
|
877
|
-
}),
|
|
878
|
-
/* @__PURE__ */ M(Xt, { contextIndicator: t }),
|
|
879
|
-
s && (r || i) ? /* @__PURE__ */ N("div", {
|
|
880
|
-
className: "flex flex-shrink-0 gap-1",
|
|
881
|
-
children: [r ? /* @__PURE__ */ N("button", {
|
|
882
|
-
type: "button",
|
|
883
|
-
onClick: r,
|
|
884
|
-
className: "flex items-center gap-1 rounded-full px-1.5 py-0.5 text-[11px] text-slate-400 transition hover:bg-slate-100 hover:text-slate-700 dark:text-slate-500 dark:hover:bg-slate-800 dark:hover:text-slate-200",
|
|
885
|
-
children: [/* @__PURE__ */ M(E, { className: "h-3 w-3" }), "停止"]
|
|
886
|
-
}) : null, i ? /* @__PURE__ */ N("button", {
|
|
887
|
-
type: "button",
|
|
888
|
-
"aria-label": "取消运行并保留恢复点",
|
|
889
|
-
title: "取消运行并保留最近 checkpoint",
|
|
890
|
-
onClick: i,
|
|
891
|
-
className: "flex items-center gap-1 rounded-full px-1.5 py-0.5 text-[11px] text-slate-400 transition hover:bg-rose-50 hover:text-rose-600 dark:text-slate-500 dark:hover:bg-rose-950/30 dark:hover:text-rose-300",
|
|
892
|
-
children: [/* @__PURE__ */ M(k, { className: "h-3 w-3" }), "取消"]
|
|
893
|
-
}) : null]
|
|
894
|
-
}) : null
|
|
895
|
-
]
|
|
896
|
-
});
|
|
897
|
-
}
|
|
898
|
-
function Qt({ agentName: e }) {
|
|
899
|
-
return /* @__PURE__ */ N("div", {
|
|
900
|
-
className: "flex flex-col items-center justify-center min-h-[50vh] px-4",
|
|
901
|
-
children: [
|
|
902
|
-
/* @__PURE__ */ M("div", {
|
|
903
|
-
className: "mb-6 h-16 w-16 rounded-2xl bg-gradient-to-br from-blue-500 to-indigo-600\n flex items-center justify-center shadow-lg shadow-blue-500/20",
|
|
904
|
-
children: /* @__PURE__ */ M(t, { className: "h-8 w-8 text-white" })
|
|
905
|
-
}),
|
|
906
|
-
/* @__PURE__ */ M("h2", {
|
|
907
|
-
className: "text-xl font-semibold text-slate-900 dark:text-slate-50",
|
|
908
|
-
children: "有什么我可以帮您的吗?"
|
|
909
|
-
}),
|
|
910
|
-
/* @__PURE__ */ N("p", {
|
|
911
|
-
className: "mt-2 text-sm text-slate-500",
|
|
912
|
-
children: [
|
|
913
|
-
"我是 ",
|
|
914
|
-
e,
|
|
915
|
-
",由 Ksyun AgentEngine 驱动"
|
|
916
|
-
]
|
|
917
|
-
})
|
|
918
|
-
]
|
|
919
|
-
});
|
|
920
|
-
}
|
|
921
|
-
function $t(e) {
|
|
922
|
-
let t = String(e || "").trim();
|
|
923
|
-
return t ? {
|
|
924
|
-
stream: "流式执行中",
|
|
925
|
-
running: "运行中",
|
|
926
|
-
interrupted: "已中断",
|
|
927
|
-
cancelled: "已取消",
|
|
928
|
-
completed: "已完成",
|
|
929
|
-
before_tool: "工具执行前",
|
|
930
|
-
after_tool: "工具执行后"
|
|
931
|
-
}[t] || t : "保存运行状态";
|
|
932
|
-
}
|
|
933
|
-
function en(e) {
|
|
934
|
-
return {
|
|
935
|
-
completed: "已完成",
|
|
936
|
-
checkpointed: "已保存",
|
|
937
|
-
running: "执行中",
|
|
938
|
-
ready_to_resume: "可恢复",
|
|
939
|
-
cancelled: "已取消",
|
|
940
|
-
canceled: "已取消",
|
|
941
|
-
failed: "失败",
|
|
942
|
-
pending: "等待中"
|
|
943
|
-
}[String(e || "").trim().toLowerCase()] || "";
|
|
944
|
-
}
|
|
945
|
-
function tn(e, t) {
|
|
946
|
-
return t.stage ? t.stage : t.phase && ![
|
|
947
|
-
"stream",
|
|
948
|
-
"running",
|
|
949
|
-
"interrupted",
|
|
950
|
-
"cancelled",
|
|
951
|
-
"completed",
|
|
952
|
-
"before_tool",
|
|
953
|
-
"after_tool"
|
|
954
|
-
].includes(t.phase) ? t.phase : e === 0 ? "最新状态快照" : `状态快照 #${e + 1}`;
|
|
955
|
-
}
|
|
956
|
-
function nn(e, t) {
|
|
957
|
-
return `第 ${Math.max(1, t - e)}/${Math.max(1, t)} 阶段`;
|
|
958
|
-
}
|
|
959
|
-
function rn(e, t = 8, n = 4) {
|
|
960
|
-
let r = String(e || "").trim();
|
|
961
|
-
return r ? r.length <= t + n + 1 ? r : `${r.slice(0, t)}...${r.slice(-n)}` : "";
|
|
962
|
-
}
|
|
963
|
-
function an({ checkpoints: e, isStreaming: t, onResumeCheckpoint: r }) {
|
|
964
|
-
if (!e.length || !r) return null;
|
|
965
|
-
let i = e.filter((e) => {
|
|
966
|
-
let t = String(e.status || "").trim().toLowerCase();
|
|
967
|
-
return t === "completed" || t === "checkpointed" || t === "ready_to_resume";
|
|
968
|
-
}).length;
|
|
969
|
-
return /* @__PURE__ */ N("div", {
|
|
970
|
-
className: "mb-4 rounded-lg border border-slate-200 bg-white px-3 py-3 text-xs text-slate-600 shadow-sm shadow-slate-900/[0.04] dark:border-slate-700 dark:bg-slate-900/70 dark:text-slate-300",
|
|
971
|
-
children: [/* @__PURE__ */ N("div", {
|
|
972
|
-
className: "mb-2 flex flex-wrap items-center justify-between gap-2",
|
|
973
|
-
children: [/* @__PURE__ */ N("div", {
|
|
974
|
-
className: "min-w-0",
|
|
975
|
-
children: [/* @__PURE__ */ M("div", {
|
|
976
|
-
className: "font-medium text-slate-800 dark:text-slate-100",
|
|
977
|
-
children: "会话恢复区"
|
|
978
|
-
}), /* @__PURE__ */ M("div", {
|
|
979
|
-
className: "mt-0.5 text-[11px] text-slate-400",
|
|
980
|
-
children: "选择 LangGraph 状态快照,从对应图状态继续"
|
|
981
|
-
})]
|
|
982
|
-
}), /* @__PURE__ */ N("div", {
|
|
983
|
-
className: "flex flex-shrink-0 items-center gap-1.5",
|
|
984
|
-
children: [i > 0 ? /* @__PURE__ */ N("span", {
|
|
985
|
-
className: "rounded-full bg-emerald-50 px-2 py-1 text-[11px] font-medium text-emerald-700 ring-1 ring-emerald-100 dark:bg-emerald-950/25 dark:text-emerald-300 dark:ring-emerald-900/50",
|
|
986
|
-
children: [
|
|
987
|
-
"已捕获 ",
|
|
988
|
-
i,
|
|
989
|
-
" 个快照"
|
|
990
|
-
]
|
|
991
|
-
}) : null, /* @__PURE__ */ N("span", {
|
|
992
|
-
className: "rounded-full bg-white px-2 py-1 text-[11px] font-medium text-slate-500 ring-1 ring-slate-200 dark:bg-slate-950/40 dark:text-slate-300 dark:ring-slate-700",
|
|
993
|
-
children: [
|
|
994
|
-
"共 ",
|
|
995
|
-
e.length,
|
|
996
|
-
" 个"
|
|
997
|
-
]
|
|
998
|
-
})]
|
|
999
|
-
})]
|
|
1000
|
-
}), /* @__PURE__ */ M("div", {
|
|
1001
|
-
className: "custom-scrollbar flex max-h-[24rem] flex-col gap-1.5 overflow-y-auto pr-1",
|
|
1002
|
-
children: e.map((i, a) => {
|
|
1003
|
-
let o = t || !i.sessionId, s = nn(a, e.length), c = tn(a, i), l = $t(i.phase), u = en(i.status) || (a === 0 ? "推荐" : ""), d = rn(i.checkpointId), f = rn(i.runId, 10, 4);
|
|
1004
|
-
return /* @__PURE__ */ N("div", {
|
|
1005
|
-
className: "grid min-h-[4.35rem] grid-cols-[1.75rem_minmax(0,1fr)_auto] items-center gap-2 rounded-md border border-slate-200/70 bg-slate-50/70 px-2.5 py-2 transition hover:border-blue-200 hover:bg-blue-50/40 dark:border-slate-700/70 dark:bg-slate-950/30 dark:hover:border-blue-800 dark:hover:bg-blue-950/20",
|
|
1006
|
-
title: [
|
|
1007
|
-
i.timestamp ? `时间:${Ht(i.timestamp)}` : "",
|
|
1008
|
-
d ? `checkpoint:${i.checkpointId}` : "",
|
|
1009
|
-
f ? `run:${i.runId}` : ""
|
|
1010
|
-
].filter(Boolean).join("\n") || void 0,
|
|
1011
|
-
children: [
|
|
1012
|
-
/* @__PURE__ */ M("div", {
|
|
1013
|
-
className: "flex h-7 w-7 items-center justify-center rounded-full bg-white text-emerald-600 ring-1 ring-slate-200 dark:bg-slate-900 dark:text-emerald-300 dark:ring-slate-700",
|
|
1014
|
-
children: /* @__PURE__ */ M(n, { className: "h-3.5 w-3.5" })
|
|
1015
|
-
}),
|
|
1016
|
-
/* @__PURE__ */ N("div", {
|
|
1017
|
-
className: "min-w-0",
|
|
1018
|
-
children: [
|
|
1019
|
-
/* @__PURE__ */ N("div", {
|
|
1020
|
-
className: "flex min-w-0 items-center gap-2",
|
|
1021
|
-
children: [
|
|
1022
|
-
/* @__PURE__ */ M("span", {
|
|
1023
|
-
className: "flex-shrink-0 rounded-full bg-blue-50 px-2 py-0.5 text-[11px] font-medium text-blue-600 dark:bg-blue-950/40 dark:text-blue-300",
|
|
1024
|
-
children: s
|
|
1025
|
-
}),
|
|
1026
|
-
a === 0 ? /* @__PURE__ */ M("span", {
|
|
1027
|
-
className: "flex-shrink-0 rounded-full bg-white px-2 py-0.5 text-[11px] font-medium text-blue-600 ring-1 ring-blue-100 dark:bg-slate-950/40 dark:text-blue-300 dark:ring-blue-900/50",
|
|
1028
|
-
children: "最新"
|
|
1029
|
-
}) : null,
|
|
1030
|
-
u ? /* @__PURE__ */ M("span", {
|
|
1031
|
-
className: "flex-shrink-0 rounded-full bg-emerald-50 px-2 py-0.5 text-[11px] font-medium text-emerald-600 dark:bg-emerald-950/30 dark:text-emerald-300",
|
|
1032
|
-
children: u
|
|
1033
|
-
}) : null,
|
|
1034
|
-
/* @__PURE__ */ M("span", {
|
|
1035
|
-
className: "truncate font-medium text-slate-800 dark:text-slate-100",
|
|
1036
|
-
children: c
|
|
1037
|
-
})
|
|
1038
|
-
]
|
|
1039
|
-
}),
|
|
1040
|
-
i.summary ? /* @__PURE__ */ M("div", {
|
|
1041
|
-
className: "mt-1 truncate text-[12px] leading-5 text-slate-600 dark:text-slate-300",
|
|
1042
|
-
children: i.summary
|
|
1043
|
-
}) : /* @__PURE__ */ M("div", {
|
|
1044
|
-
className: "mt-1 text-[12px] leading-5 text-slate-500 dark:text-slate-400",
|
|
1045
|
-
children: l
|
|
1046
|
-
}),
|
|
1047
|
-
/* @__PURE__ */ N("div", {
|
|
1048
|
-
className: "mt-1 flex min-w-0 items-center gap-1.5 text-[11px] leading-4 text-slate-400",
|
|
1049
|
-
children: [i.nextAction ? /* @__PURE__ */ N("span", {
|
|
1050
|
-
className: "truncate text-blue-600 dark:text-blue-300",
|
|
1051
|
-
children: ["恢复后阶段:", i.nextAction]
|
|
1052
|
-
}) : /* @__PURE__ */ M("span", {
|
|
1053
|
-
className: "truncate",
|
|
1054
|
-
children: l
|
|
1055
|
-
}), i.timestamp ? /* @__PURE__ */ M("span", {
|
|
1056
|
-
className: "hidden flex-shrink-0 sm:inline",
|
|
1057
|
-
children: Ht(i.timestamp)
|
|
1058
|
-
}) : null]
|
|
1059
|
-
})
|
|
1060
|
-
]
|
|
1061
|
-
}),
|
|
1062
|
-
/* @__PURE__ */ N("button", {
|
|
1063
|
-
type: "button",
|
|
1064
|
-
"aria-label": `恢复到${s}`,
|
|
1065
|
-
disabled: o,
|
|
1066
|
-
title: o ? "当前会话正在运行,暂不能恢复" : "从该 LangGraph checkpoint 恢复",
|
|
1067
|
-
onClick: () => {
|
|
1068
|
-
i.sessionId && r({
|
|
1069
|
-
sessionId: i.sessionId,
|
|
1070
|
-
runId: i.runId,
|
|
1071
|
-
checkpointId: i.checkpointId
|
|
1072
|
-
});
|
|
1073
|
-
},
|
|
1074
|
-
className: "inline-flex h-8 flex-shrink-0 items-center gap-1 rounded-md border border-slate-200 bg-white px-2.5 text-[11px] font-medium text-slate-600 transition hover:border-blue-300 hover:text-blue-600 disabled:cursor-not-allowed disabled:opacity-50 dark:border-slate-700 dark:bg-slate-900 dark:text-slate-300 dark:hover:border-blue-500 dark:hover:text-blue-300",
|
|
1075
|
-
children: [/* @__PURE__ */ M(C, { className: "h-3 w-3" }), "恢复"]
|
|
1076
|
-
})
|
|
1077
|
-
]
|
|
1078
|
-
}, i.checkpointId);
|
|
1079
|
-
})
|
|
1080
|
-
})]
|
|
1081
|
-
});
|
|
1082
|
-
}
|
|
1083
|
-
function on({ attachments: e, isMobile: t, onOpenAttachmentPreview: n }) {
|
|
1084
|
-
return /* @__PURE__ */ M("div", {
|
|
1085
|
-
className: "mb-3 flex flex-wrap gap-3",
|
|
1086
|
-
children: e.map((e, r) => e.type.startsWith("image/") ? e.url ? /* @__PURE__ */ M("button", {
|
|
1087
|
-
type: "button",
|
|
1088
|
-
onClick: () => n(e),
|
|
1089
|
-
className: J("group relative overflow-hidden rounded-xl border border-slate-200 shadow-sm dark:border-slate-700", t ? "w-full max-w-full" : "max-w-[200px]"),
|
|
1090
|
-
children: /* @__PURE__ */ M("img", {
|
|
1091
|
-
src: e.url,
|
|
1092
|
-
alt: e.name,
|
|
1093
|
-
className: J("object-cover transition group-hover:scale-[1.02]", t ? "max-h-[16rem] w-full max-w-full" : "max-h-[200px] max-w-[200px]")
|
|
1094
|
-
})
|
|
1095
|
-
}, `${e.name}-${r}`) : /* @__PURE__ */ M("div", {
|
|
1096
|
-
className: J("flex items-center justify-center rounded-xl border border-dashed border-slate-300 bg-slate-50 px-4 text-sm text-slate-500 dark:border-slate-700 dark:bg-slate-900/40 dark:text-slate-400", t ? "h-28 w-full" : "h-[120px] w-[200px]"),
|
|
1097
|
-
children: e.name
|
|
1098
|
-
}, `${e.name}-${r}`) : /* @__PURE__ */ N("div", {
|
|
1099
|
-
className: J("flex items-center gap-2 rounded-xl border border-slate-200 bg-slate-100 px-3 py-2 shadow-sm dark:border-slate-700 dark:bg-slate-800", t ? "w-full max-w-full" : "w-max max-w-full"),
|
|
1100
|
-
children: [/* @__PURE__ */ M(x, { className: "h-4 w-4 flex-shrink-0 text-blue-500" }), e.url ? /* @__PURE__ */ M("a", {
|
|
1101
|
-
href: e.url,
|
|
1102
|
-
target: "_blank",
|
|
1103
|
-
rel: "noreferrer",
|
|
1104
|
-
className: "truncate text-sm text-slate-700 hover:underline dark:text-slate-300",
|
|
1105
|
-
title: e.name,
|
|
1106
|
-
children: e.name
|
|
1107
|
-
}) : /* @__PURE__ */ M("span", {
|
|
1108
|
-
className: "truncate text-sm text-slate-700 dark:text-slate-300",
|
|
1109
|
-
title: e.name,
|
|
1110
|
-
children: e.name
|
|
1111
|
-
})]
|
|
1112
|
-
}, `${e.name}-${r}`))
|
|
1113
|
-
});
|
|
1114
|
-
}
|
|
1115
|
-
function sn({ message: e }) {
|
|
1116
|
-
return /* @__PURE__ */ M("div", {
|
|
1117
|
-
className: "w-full px-0 py-2 sm:px-4",
|
|
1118
|
-
children: /* @__PURE__ */ N("div", {
|
|
1119
|
-
className: "mx-auto max-w-3xl rounded-2xl border border-amber-200/80 bg-amber-50/80 px-4 py-3 text-sm text-amber-900 shadow-sm dark:border-amber-900/60 dark:bg-amber-950/30 dark:text-amber-100",
|
|
1120
|
-
children: [
|
|
1121
|
-
/* @__PURE__ */ N("div", {
|
|
1122
|
-
className: "flex items-center gap-2 font-medium",
|
|
1123
|
-
children: [e.status === "running" ? /* @__PURE__ */ M(C, { className: "h-4 w-4 animate-spin text-amber-600 dark:text-amber-300" }) : e.status === "failed" ? /* @__PURE__ */ M(E, { className: "h-4 w-4 text-rose-600 dark:text-rose-400" }) : /* @__PURE__ */ M(n, { className: "h-4 w-4 text-emerald-600 dark:text-emerald-400" }), /* @__PURE__ */ M("span", { children: e.content })]
|
|
1124
|
-
}),
|
|
1125
|
-
e.compactedUntilSeqId ? /* @__PURE__ */ N("div", {
|
|
1126
|
-
className: "mt-1 text-xs text-amber-700/80 dark:text-amber-200/80",
|
|
1127
|
-
children: ["已折叠到会话事件 #", e.compactedUntilSeqId]
|
|
1128
|
-
}) : null,
|
|
1129
|
-
e.summary ? /* @__PURE__ */ N("details", {
|
|
1130
|
-
className: "mt-3 rounded-xl border border-amber-200/80 bg-white/70 px-3 py-2 dark:border-amber-900/60 dark:bg-slate-950/40",
|
|
1131
|
-
children: [/* @__PURE__ */ M("summary", {
|
|
1132
|
-
className: "cursor-pointer select-none text-xs font-medium text-amber-800 dark:text-amber-200",
|
|
1133
|
-
children: "查看压缩摘要"
|
|
1134
|
-
}), /* @__PURE__ */ M("div", {
|
|
1135
|
-
className: "mt-2 text-[13px] leading-relaxed text-slate-700 dark:text-slate-200",
|
|
1136
|
-
children: /* @__PURE__ */ M(X, { content: e.summary })
|
|
1137
|
-
})]
|
|
1138
|
-
}) : null
|
|
1139
|
-
]
|
|
1140
|
-
})
|
|
1141
|
-
});
|
|
1142
|
-
}
|
|
1143
|
-
function cn({ label: e, tone: t, value: r }) {
|
|
1144
|
-
let [i, o] = V("idle"), s = zt(r);
|
|
1145
|
-
R(() => {
|
|
1146
|
-
if (i === "idle") return;
|
|
1147
|
-
let e = window.setTimeout(() => o("idle"), 1600);
|
|
1148
|
-
return () => window.clearTimeout(e);
|
|
1149
|
-
}, [i]);
|
|
1150
|
-
let c = async () => {
|
|
1151
|
-
o(await Bt(s) ? "copied" : "failed");
|
|
1152
|
-
};
|
|
1153
|
-
return /* @__PURE__ */ N("div", { children: [/* @__PURE__ */ N("div", {
|
|
1154
|
-
className: "mb-1 flex items-center justify-between gap-2",
|
|
1155
|
-
children: [/* @__PURE__ */ M("div", {
|
|
1156
|
-
className: J("text-xs font-semibold uppercase", t === "input" ? "text-blue-500" : t === "error" ? "text-rose-500" : "text-emerald-500"),
|
|
1157
|
-
children: e
|
|
1158
|
-
}), /* @__PURE__ */ N("button", {
|
|
1159
|
-
type: "button",
|
|
1160
|
-
onClick: () => {
|
|
1161
|
-
c();
|
|
1162
|
-
},
|
|
1163
|
-
className: "inline-flex items-center gap-1 rounded-lg px-2 py-1 text-[11px] font-medium text-slate-500 transition hover:bg-white hover:text-slate-900 dark:text-slate-400 dark:hover:bg-slate-900 dark:hover:text-slate-100",
|
|
1164
|
-
children: [i === "copied" ? /* @__PURE__ */ M(n, { className: "h-3.5 w-3.5 text-emerald-500" }) : /* @__PURE__ */ M(a, { className: "h-3.5 w-3.5" }), i === "copied" ? "已复制" : i === "failed" ? "复制失败" : "复制"]
|
|
1165
|
-
})]
|
|
1166
|
-
}), /* @__PURE__ */ M("div", {
|
|
1167
|
-
className: "custom-scrollbar max-h-[220px] overflow-y-auto whitespace-pre-wrap break-words rounded-xl border border-slate-200/30 bg-white/70 p-3 text-slate-600 shadow-sm dark:border-slate-800 dark:bg-slate-950/40 dark:text-slate-300 sm:max-h-[300px]",
|
|
1168
|
-
children: s
|
|
1169
|
-
})] });
|
|
1170
|
-
}
|
|
1171
|
-
function ln({ isLastMessage: e, isStreaming: t, message: n, onDeleteFeedback: r, onSubmitFeedback: i }) {
|
|
1172
|
-
let [a, o] = V(!1), [s, c] = V(n.feedback?.comment || ""), l = St(n, t, e), u = !!n.feedback?.pending, d = n.feedback?.rating;
|
|
1173
|
-
return l ? /* @__PURE__ */ N("div", {
|
|
1174
|
-
className: "mt-3 flex flex-col gap-2",
|
|
1175
|
-
children: [
|
|
1176
|
-
/* @__PURE__ */ N("div", {
|
|
1177
|
-
className: "flex flex-wrap items-center gap-2 text-xs text-slate-500 dark:text-slate-400",
|
|
1178
|
-
children: [
|
|
1179
|
-
/* @__PURE__ */ M("span", {
|
|
1180
|
-
className: "font-medium",
|
|
1181
|
-
children: "本次回复有帮助吗?"
|
|
1182
|
-
}),
|
|
1183
|
-
/* @__PURE__ */ N("button", {
|
|
1184
|
-
type: "button",
|
|
1185
|
-
disabled: u,
|
|
1186
|
-
onClick: () => i({
|
|
1187
|
-
message: n,
|
|
1188
|
-
rating: "up",
|
|
1189
|
-
comment: ""
|
|
1190
|
-
}),
|
|
1191
|
-
className: J("inline-flex items-center gap-1 rounded-full border px-2.5 py-1 font-medium transition disabled:cursor-not-allowed disabled:opacity-60", d === "up" ? "border-emerald-200 bg-emerald-50 text-emerald-700 dark:border-emerald-900/70 dark:bg-emerald-950/30 dark:text-emerald-200" : "border-slate-200 bg-white text-slate-600 hover:border-emerald-200 hover:text-emerald-700 dark:border-slate-800 dark:bg-slate-950/40 dark:text-slate-300 dark:hover:border-emerald-900/70 dark:hover:text-emerald-200"),
|
|
1192
|
-
children: [/* @__PURE__ */ M(O, { className: "h-3.5 w-3.5" }), "有帮助"]
|
|
1193
|
-
}),
|
|
1194
|
-
/* @__PURE__ */ N("button", {
|
|
1195
|
-
type: "button",
|
|
1196
|
-
disabled: u,
|
|
1197
|
-
onClick: () => {
|
|
1198
|
-
c(n.feedback?.comment || ""), o((e) => !e);
|
|
1199
|
-
},
|
|
1200
|
-
className: J("inline-flex items-center gap-1 rounded-full border px-2.5 py-1 font-medium transition disabled:cursor-not-allowed disabled:opacity-60", d === "down" ? "border-rose-200 bg-rose-50 text-rose-700 dark:border-rose-900/70 dark:bg-rose-950/30 dark:text-rose-200" : "border-slate-200 bg-white text-slate-600 hover:border-rose-200 hover:text-rose-700 dark:border-slate-800 dark:bg-slate-950/40 dark:text-slate-300 dark:hover:border-rose-900/70 dark:hover:text-rose-200"),
|
|
1201
|
-
children: [/* @__PURE__ */ M(oe, { className: "h-3.5 w-3.5" }), "需改进"]
|
|
1202
|
-
}),
|
|
1203
|
-
n.feedback ? /* @__PURE__ */ N("button", {
|
|
1204
|
-
type: "button",
|
|
1205
|
-
disabled: u,
|
|
1206
|
-
onClick: () => r(n),
|
|
1207
|
-
className: "inline-flex items-center gap-1 rounded-full border border-transparent px-2 py-1 font-medium text-slate-400 transition hover:border-slate-200 hover:text-slate-700 disabled:cursor-not-allowed disabled:opacity-60 dark:hover:border-slate-800 dark:hover:text-slate-200",
|
|
1208
|
-
children: [/* @__PURE__ */ M(se, { className: "h-3.5 w-3.5" }), "删除反馈"]
|
|
1209
|
-
}) : null,
|
|
1210
|
-
u ? /* @__PURE__ */ M("span", {
|
|
1211
|
-
className: "text-slate-400",
|
|
1212
|
-
children: "提交中…"
|
|
1213
|
-
}) : null
|
|
1214
|
-
]
|
|
1215
|
-
}),
|
|
1216
|
-
a ? /* @__PURE__ */ N("div", {
|
|
1217
|
-
className: "max-w-xl rounded-2xl border border-rose-100 bg-rose-50/60 p-3 shadow-sm dark:border-rose-900/60 dark:bg-rose-950/20",
|
|
1218
|
-
children: [/* @__PURE__ */ M("textarea", {
|
|
1219
|
-
value: s,
|
|
1220
|
-
onChange: (e) => c(e.target.value),
|
|
1221
|
-
placeholder: "可以补充哪里不准确、缺失或不符合预期。",
|
|
1222
|
-
className: "min-h-[84px] w-full resize-y rounded-xl border border-rose-100 bg-white px-3 py-2 text-sm text-slate-700 outline-none transition placeholder:text-slate-400 focus:border-rose-300 focus:ring-2 focus:ring-rose-100 dark:border-rose-900/70 dark:bg-slate-950 dark:text-slate-100 dark:focus:border-rose-700 dark:focus:ring-rose-950"
|
|
1223
|
-
}), /* @__PURE__ */ N("div", {
|
|
1224
|
-
className: "mt-2 flex flex-wrap justify-end gap-2",
|
|
1225
|
-
children: [/* @__PURE__ */ M("button", {
|
|
1226
|
-
type: "button",
|
|
1227
|
-
onClick: () => o(!1),
|
|
1228
|
-
className: "rounded-xl px-3 py-1.5 text-xs font-semibold text-slate-500 transition hover:bg-white hover:text-slate-800 dark:text-slate-400 dark:hover:bg-slate-950 dark:hover:text-slate-100",
|
|
1229
|
-
children: "取消"
|
|
1230
|
-
}), /* @__PURE__ */ M("button", {
|
|
1231
|
-
type: "button",
|
|
1232
|
-
disabled: u,
|
|
1233
|
-
onClick: () => {
|
|
1234
|
-
i({
|
|
1235
|
-
message: n,
|
|
1236
|
-
rating: "down",
|
|
1237
|
-
comment: s
|
|
1238
|
-
}), o(!1);
|
|
1239
|
-
},
|
|
1240
|
-
className: "rounded-xl bg-rose-600 px-3 py-1.5 text-xs font-semibold text-white shadow-sm transition hover:bg-rose-500 disabled:cursor-not-allowed disabled:opacity-60",
|
|
1241
|
-
children: "提交点踩"
|
|
1242
|
-
})]
|
|
1243
|
-
})]
|
|
1244
|
-
}) : d === "down" && n.feedback?.comment ? /* @__PURE__ */ N("div", {
|
|
1245
|
-
className: "max-w-xl rounded-xl border border-rose-100 bg-rose-50/50 px-3 py-2 text-xs text-rose-700 dark:border-rose-900/60 dark:bg-rose-950/20 dark:text-rose-200",
|
|
1246
|
-
children: ["反馈:", n.feedback.comment]
|
|
1247
|
-
}) : null,
|
|
1248
|
-
n.feedback?.error ? /* @__PURE__ */ M("div", {
|
|
1249
|
-
className: "text-xs text-rose-600 dark:text-rose-300",
|
|
1250
|
-
children: n.feedback.error
|
|
1251
|
-
}) : null
|
|
1252
|
-
]
|
|
1253
|
-
}) : null;
|
|
1254
|
-
}
|
|
1255
|
-
function un({ agentName: e, isMobile: i, isStreaming: a, isLastMessage: o, message: s, onDeleteFeedback: c, onOpenAttachmentPreview: l, onRespondToApproval: u, onSubmitFeedback: d }) {
|
|
1256
|
-
return s.role === "user" ? /* @__PURE__ */ M("div", {
|
|
1257
|
-
className: "mb-3 flex justify-end",
|
|
1258
|
-
children: /* @__PURE__ */ N("div", {
|
|
1259
|
-
className: "max-w-[80%] rounded-2xl rounded-br-sm bg-blue-600 px-3.5 py-2.5 text-[14px] leading-relaxed text-white dark:bg-blue-500",
|
|
1260
|
-
children: [s.attachments?.length ? /* @__PURE__ */ M(on, {
|
|
1261
|
-
attachments: s.attachments,
|
|
1262
|
-
isMobile: i,
|
|
1263
|
-
onOpenAttachmentPreview: l
|
|
1264
|
-
}) : null, s.content]
|
|
1265
|
-
})
|
|
1266
|
-
}) : /* @__PURE__ */ N("div", {
|
|
1267
|
-
className: "mb-3 max-w-none",
|
|
1268
|
-
children: [
|
|
1269
|
-
/* @__PURE__ */ N("div", {
|
|
1270
|
-
className: "mb-1.5 flex items-center gap-2 text-xs text-slate-400",
|
|
1271
|
-
children: [/* @__PURE__ */ M(t, { className: "w-3.5 h-3.5" }), /* @__PURE__ */ M("span", { children: e })]
|
|
1272
|
-
}),
|
|
1273
|
-
s.attachments?.length ? /* @__PURE__ */ M(on, {
|
|
1274
|
-
attachments: s.attachments,
|
|
1275
|
-
isMobile: i,
|
|
1276
|
-
onOpenAttachmentPreview: l
|
|
1277
|
-
}) : null,
|
|
1278
|
-
s.reasoning ? /* @__PURE__ */ N("details", {
|
|
1279
|
-
className: "group/details mb-3 overflow-hidden rounded-lg border border-emerald-200/70 bg-emerald-50/40 text-sm text-slate-600 transition-colors open:bg-white dark:border-emerald-900/50 dark:bg-emerald-950/10 dark:text-slate-300 dark:open:bg-slate-950/30",
|
|
1280
|
-
children: [/* @__PURE__ */ N("summary", {
|
|
1281
|
-
className: "flex cursor-pointer list-none items-center justify-between gap-3 border-l-2 border-emerald-400 px-3 py-2 font-medium outline-none marker:hidden dark:border-emerald-500",
|
|
1282
|
-
children: [/* @__PURE__ */ N("div", {
|
|
1283
|
-
className: "flex min-w-0 items-center gap-2",
|
|
1284
|
-
children: [
|
|
1285
|
-
a && o && !s.content ? /* @__PURE__ */ M(C, { className: "h-4 w-4 animate-spin text-emerald-500" }) : /* @__PURE__ */ M(n, { className: "h-4 w-4 text-emerald-500" }),
|
|
1286
|
-
/* @__PURE__ */ M("span", {
|
|
1287
|
-
className: "truncate",
|
|
1288
|
-
children: "思考过程"
|
|
1289
|
-
}),
|
|
1290
|
-
/* @__PURE__ */ M("span", {
|
|
1291
|
-
className: "rounded-full bg-emerald-100 px-2 py-0.5 text-[11px] font-medium text-emerald-700 dark:bg-emerald-950 dark:text-emerald-300",
|
|
1292
|
-
children: a && o && !s.content ? "生成中" : "已完成"
|
|
1293
|
-
})
|
|
1294
|
-
]
|
|
1295
|
-
}), /* @__PURE__ */ M(r, { className: "h-4 w-4 flex-shrink-0 text-slate-400 transition-transform group-open/details:rotate-180" })]
|
|
1296
|
-
}), /* @__PURE__ */ M("div", {
|
|
1297
|
-
className: "border-t border-emerald-100/80 bg-white/70 dark:border-emerald-950 dark:bg-slate-950/20",
|
|
1298
|
-
children: /* @__PURE__ */ M("div", {
|
|
1299
|
-
className: "custom-scrollbar max-h-[min(46vh,28rem)] overflow-y-auto px-4 py-3 text-[14px] leading-7 text-slate-600 dark:text-slate-300 [&_p]:my-2 [&_pre]:my-2",
|
|
1300
|
-
children: /* @__PURE__ */ M(X, { content: s.reasoning })
|
|
1301
|
-
})
|
|
1302
|
-
})]
|
|
1303
|
-
}) : null,
|
|
1304
|
-
s.tools ? Object.values(s.tools).map((e, t) => /* @__PURE__ */ N("details", {
|
|
1305
|
-
open: e.status === "paused" ? !0 : void 0,
|
|
1306
|
-
className: J("group/details mb-3 rounded-xl border px-3 py-2.5 text-sm transition-all", e.status === "paused" ? "border-amber-200 bg-amber-50/50 text-amber-800 dark:border-amber-900/60 dark:bg-amber-950/20 dark:text-amber-200" : e.status === "error" ? "border-rose-200 bg-rose-50/40 text-rose-700 dark:border-rose-900/60 dark:bg-rose-950/20 dark:text-rose-200" : "border-blue-200 bg-blue-50/30 text-blue-600 dark:border-blue-900/50 dark:bg-blue-950/20 dark:text-blue-400"),
|
|
1307
|
-
children: [/* @__PURE__ */ M("summary", {
|
|
1308
|
-
className: "flex cursor-pointer list-none items-center justify-between gap-2 font-medium",
|
|
1309
|
-
children: /* @__PURE__ */ N("div", {
|
|
1310
|
-
className: "flex items-center gap-2",
|
|
1311
|
-
children: [e.status === "running" ? /* @__PURE__ */ M(C, { className: "h-4 w-4 animate-spin text-blue-500" }) : e.status === "paused" ? /* @__PURE__ */ M(T, { className: "h-4 w-4 text-amber-500" }) : e.status === "error" ? /* @__PURE__ */ M(k, { className: "h-4 w-4 text-rose-500" }) : /* @__PURE__ */ M(n, { className: "h-4 w-4 text-emerald-500" }), /* @__PURE__ */ N("span", { children: [e.status === "paused" ? "等待审批:" : e.status === "error" ? "工具调用失败:" : "工具调用:", e.name] })]
|
|
1312
|
-
})
|
|
1313
|
-
}), /* @__PURE__ */ N("div", {
|
|
1314
|
-
className: J("mx-1 mt-3 flex flex-col gap-3 border-l-2 py-1 pl-4 font-mono text-[13px] leading-relaxed opacity-90", e.status === "paused" ? "border-amber-200 dark:border-amber-800" : e.status === "error" ? "border-rose-200 dark:border-rose-800" : "border-blue-200 dark:border-blue-800"),
|
|
1315
|
-
children: [
|
|
1316
|
-
e.status === "paused" && e.approvalRequestId ? /* @__PURE__ */ N("div", {
|
|
1317
|
-
className: "rounded-2xl border border-amber-200 bg-white/75 p-3 font-sans text-sm text-amber-900 shadow-sm dark:border-amber-900/70 dark:bg-slate-950/40 dark:text-amber-100",
|
|
1318
|
-
children: [
|
|
1319
|
-
/* @__PURE__ */ M("div", {
|
|
1320
|
-
className: "font-medium",
|
|
1321
|
-
children: "该工具调用需要人工确认后继续。"
|
|
1322
|
-
}),
|
|
1323
|
-
e.serverLabel ? /* @__PURE__ */ N("div", {
|
|
1324
|
-
className: "mt-1 text-xs text-amber-700/80 dark:text-amber-200/80",
|
|
1325
|
-
children: ["MCP Server: ", e.serverLabel]
|
|
1326
|
-
}) : null,
|
|
1327
|
-
/* @__PURE__ */ N("div", {
|
|
1328
|
-
className: "mt-3 flex flex-wrap gap-2",
|
|
1329
|
-
children: [/* @__PURE__ */ N("button", {
|
|
1330
|
-
type: "button",
|
|
1331
|
-
disabled: e.approvalStatus === "approved" || e.approvalStatus === "rejected",
|
|
1332
|
-
onClick: () => u({
|
|
1333
|
-
approvalRequestId: e.approvalRequestId || "",
|
|
1334
|
-
approve: !0,
|
|
1335
|
-
previousResponseId: e.previousResponseId
|
|
1336
|
-
}),
|
|
1337
|
-
className: "inline-flex items-center gap-1.5 rounded-xl bg-emerald-600 px-3 py-1.5 text-xs font-semibold text-white shadow-sm transition hover:bg-emerald-500 disabled:cursor-not-allowed disabled:opacity-55",
|
|
1338
|
-
children: [/* @__PURE__ */ M(n, { className: "h-3.5 w-3.5" }), "批准并继续"]
|
|
1339
|
-
}), /* @__PURE__ */ N("button", {
|
|
1340
|
-
type: "button",
|
|
1341
|
-
disabled: e.approvalStatus === "approved" || e.approvalStatus === "rejected",
|
|
1342
|
-
onClick: () => u({
|
|
1343
|
-
approvalRequestId: e.approvalRequestId || "",
|
|
1344
|
-
approve: !1,
|
|
1345
|
-
previousResponseId: e.previousResponseId
|
|
1346
|
-
}),
|
|
1347
|
-
className: "inline-flex items-center gap-1.5 rounded-xl border border-rose-200 bg-white px-3 py-1.5 text-xs font-semibold text-rose-600 shadow-sm transition hover:bg-rose-50 disabled:cursor-not-allowed disabled:opacity-55 dark:border-rose-900/70 dark:bg-slate-950 dark:text-rose-300 dark:hover:bg-rose-950/30",
|
|
1348
|
-
children: [/* @__PURE__ */ M(k, { className: "h-3.5 w-3.5" }), "拒绝"]
|
|
1349
|
-
})]
|
|
1350
|
-
})
|
|
1351
|
-
]
|
|
1352
|
-
}) : null,
|
|
1353
|
-
e.args ? /* @__PURE__ */ M(cn, {
|
|
1354
|
-
label: "入参 (Args)",
|
|
1355
|
-
tone: "input",
|
|
1356
|
-
value: e.args
|
|
1357
|
-
}) : null,
|
|
1358
|
-
e.output ? /* @__PURE__ */ M(cn, {
|
|
1359
|
-
label: "输出 (Output)",
|
|
1360
|
-
tone: e.status === "error" ? "error" : "output",
|
|
1361
|
-
value: e.output
|
|
1362
|
-
}) : null
|
|
1363
|
-
]
|
|
1364
|
-
})]
|
|
1365
|
-
}, `${e.name}-${t}`)) : null,
|
|
1366
|
-
/* @__PURE__ */ M("div", {
|
|
1367
|
-
className: "w-full break-words",
|
|
1368
|
-
children: s.content ? /* @__PURE__ */ M(X, { content: s.content }) : a && o && !s.reasoning && !s.tools ? /* @__PURE__ */ M("span", { className: "ml-1 mt-2 inline-block h-4 w-2 animate-pulse rounded-sm bg-emerald-500 align-middle opacity-80 shadow-sm" }) : null
|
|
1369
|
-
}),
|
|
1370
|
-
/* @__PURE__ */ M(ln, {
|
|
1371
|
-
isLastMessage: o,
|
|
1372
|
-
isStreaming: a,
|
|
1373
|
-
message: s,
|
|
1374
|
-
onDeleteFeedback: c,
|
|
1375
|
-
onSubmitFeedback: d
|
|
1376
|
-
})
|
|
1377
|
-
]
|
|
1378
|
-
});
|
|
1379
|
-
}
|
|
1380
|
-
function dn({ agentName: e, isMobile: t, isStreaming: n, activity: r, contextIndicator: i, messages: a, onDeleteFeedback: o, onOpenAttachmentPreview: s, onRespondToApproval: c, onSubmitFeedback: l, onStopGeneration: u, onCancelRemote: d, checkpoints: f = [], onResumeCheckpoint: p, scrollRef: m }) {
|
|
1381
|
-
let [h, g] = V(0), [_, v] = V(0), [y, b] = V(/* @__PURE__ */ new Map());
|
|
1382
|
-
fe(() => {
|
|
1383
|
-
let e = m.current;
|
|
1384
|
-
if (!e) return;
|
|
1385
|
-
let t = () => {
|
|
1386
|
-
g(e.scrollTop), v(e.clientHeight);
|
|
1387
|
-
};
|
|
1388
|
-
if (t(), typeof ResizeObserver > "u") return;
|
|
1389
|
-
let n = new ResizeObserver(() => t());
|
|
1390
|
-
return n.observe(e), () => n.disconnect();
|
|
1391
|
-
}, [m]);
|
|
1392
|
-
let ee = pe(() => Wt({
|
|
1393
|
-
items: a,
|
|
1394
|
-
scrollTop: h,
|
|
1395
|
-
viewportHeight: _,
|
|
1396
|
-
overscan: Kt,
|
|
1397
|
-
defaultItemHeight: Gt,
|
|
1398
|
-
measuredHeights: y,
|
|
1399
|
-
getItemKey: (e, t) => e?.id || String(t)
|
|
1400
|
-
}), [
|
|
1401
|
-
y,
|
|
1402
|
-
a,
|
|
1403
|
-
h,
|
|
1404
|
-
_
|
|
1405
|
-
]), x = ee.visibleItems, te = (e, t) => {
|
|
1406
|
-
!e || !Number.isFinite(t) || t <= 0 || b((n) => {
|
|
1407
|
-
if (n.get(e) === t) return n;
|
|
1408
|
-
let r = new Map(n);
|
|
1409
|
-
return r.set(e, t), r;
|
|
1410
|
-
});
|
|
1411
|
-
};
|
|
1412
|
-
return /* @__PURE__ */ N("div", {
|
|
1413
|
-
ref: m,
|
|
1414
|
-
onScroll: (e) => g(e.currentTarget.scrollTop),
|
|
1415
|
-
className: J("custom-scrollbar relative min-h-0 flex-1 overflow-y-auto scroll-smooth", t ? "px-3 py-3" : "px-4 py-5"),
|
|
1416
|
-
children: [/* @__PURE__ */ N("div", {
|
|
1417
|
-
className: J("mx-auto flex w-full max-w-[64rem] flex-col", r ? "pb-10 sm:pb-10" : "pb-6 sm:pb-8"),
|
|
1418
|
-
children: [/* @__PURE__ */ M(an, {
|
|
1419
|
-
checkpoints: f,
|
|
1420
|
-
isStreaming: n,
|
|
1421
|
-
onResumeCheckpoint: p
|
|
1422
|
-
}), a.length === 0 ? /* @__PURE__ */ M(Qt, { agentName: e }) : /* @__PURE__ */ M("div", {
|
|
1423
|
-
style: { height: ee.totalHeight },
|
|
1424
|
-
className: "relative",
|
|
1425
|
-
children: x.map((r) => /* @__PURE__ */ M("div", {
|
|
1426
|
-
ref: (e) => {
|
|
1427
|
-
e && te(r.item.id || String(r.index), e.offsetHeight);
|
|
1428
|
-
},
|
|
1429
|
-
style: {
|
|
1430
|
-
position: "absolute",
|
|
1431
|
-
top: r.top,
|
|
1432
|
-
left: 0,
|
|
1433
|
-
right: 0
|
|
1434
|
-
},
|
|
1435
|
-
children: r.item.role === "system" ? /* @__PURE__ */ M(sn, { message: r.item }) : /* @__PURE__ */ M(un, {
|
|
1436
|
-
agentName: e,
|
|
1437
|
-
isMobile: t,
|
|
1438
|
-
isStreaming: n,
|
|
1439
|
-
isLastMessage: r.index === a.length - 1,
|
|
1440
|
-
message: r.item,
|
|
1441
|
-
onDeleteFeedback: o,
|
|
1442
|
-
onOpenAttachmentPreview: s,
|
|
1443
|
-
onRespondToApproval: c,
|
|
1444
|
-
onSubmitFeedback: l
|
|
1445
|
-
})
|
|
1446
|
-
}, r.item.id || r.index))
|
|
1447
|
-
})]
|
|
1448
|
-
}), r ? /* @__PURE__ */ M("div", {
|
|
1449
|
-
className: "sticky bottom-1 z-20 mx-auto flex w-full max-w-[64rem] justify-end",
|
|
1450
|
-
children: /* @__PURE__ */ M(Zt, {
|
|
1451
|
-
activity: r,
|
|
1452
|
-
contextIndicator: i,
|
|
1453
|
-
onStopGeneration: u,
|
|
1454
|
-
onCancelRemote: d
|
|
1455
|
-
})
|
|
1456
|
-
}) : null]
|
|
1457
|
-
});
|
|
1458
|
-
}
|
|
1459
|
-
//#endregion
|
|
1460
|
-
//#region src/utils/session-list.js
|
|
1461
|
-
var fn = new Set([
|
|
1462
|
-
"in_progress",
|
|
1463
|
-
"running",
|
|
1464
|
-
"queued",
|
|
1465
|
-
"pending"
|
|
1466
|
-
]), pn = 300 * 1e3;
|
|
1467
|
-
function mn(e) {
|
|
1468
|
-
let t = e?.UpdatedAt ?? e?.updated_at;
|
|
1469
|
-
if (typeof t == "string") {
|
|
1470
|
-
let e = Date.parse(t);
|
|
1471
|
-
return Number.isNaN(e) ? 0 : e;
|
|
1472
|
-
}
|
|
1473
|
-
return typeof t == "number" && Number.isFinite(t) ? t > 1e11 ? t : t * 1e3 : 0;
|
|
1474
|
-
}
|
|
1475
|
-
function hn(e) {
|
|
1476
|
-
return String(e || "").trim().toLowerCase();
|
|
1477
|
-
}
|
|
1478
|
-
function gn(e) {
|
|
1479
|
-
if (!e) return "";
|
|
1480
|
-
let t = typeof e == "number" ? new Date(e > 1e11 ? e : e * 1e3) : new Date(e);
|
|
1481
|
-
return Number.isNaN(t.getTime()) ? "" : t.toLocaleString("zh-CN", {
|
|
1482
|
-
timeZone: "Asia/Shanghai",
|
|
1483
|
-
month: "short",
|
|
1484
|
-
day: "numeric",
|
|
1485
|
-
hour: "2-digit",
|
|
1486
|
-
minute: "2-digit",
|
|
1487
|
-
hour12: !1
|
|
1488
|
-
});
|
|
1489
|
-
}
|
|
1490
|
-
function _n(e) {
|
|
1491
|
-
return [
|
|
1492
|
-
e?.Title,
|
|
1493
|
-
e?.Summary,
|
|
1494
|
-
e?.FirstPrompt,
|
|
1495
|
-
e?.LastPrompt,
|
|
1496
|
-
e?.SessionId,
|
|
1497
|
-
e?.Model?.display_name,
|
|
1498
|
-
e?.Model?.id
|
|
1499
|
-
].map(hn).join(" ");
|
|
1500
|
-
}
|
|
1501
|
-
function vn(e, t = {}) {
|
|
1502
|
-
if (!fn.has(hn(e?.ActiveRunStatus))) return !1;
|
|
1503
|
-
let n = mn(e);
|
|
1504
|
-
if (!n) return !0;
|
|
1505
|
-
let r = Number.isFinite(Number(t.now)) ? Number(t.now) : Date.now(), i = Number.isFinite(Number(t.activeStaleAfterMs)) ? Number(t.activeStaleAfterMs) : pn;
|
|
1506
|
-
return r - n <= i;
|
|
1507
|
-
}
|
|
1508
|
-
function yn(e = [], t = "", n = {}) {
|
|
1509
|
-
let r = hn(t), i = new Set(Array.isArray(n.pinnedSessionIds) ? n.pinnedSessionIds : []);
|
|
1510
|
-
return (Array.isArray(e) ? e : []).filter((e) => e?.SessionId).filter((e) => !r || _n(e).includes(r)).slice().sort((e, t) => {
|
|
1511
|
-
let r = +!!i.has(e.SessionId), a = +!!i.has(t.SessionId);
|
|
1512
|
-
if (r !== a) return a - r;
|
|
1513
|
-
let o = +!!vn(e, n), s = +!!vn(t, n);
|
|
1514
|
-
return o === s ? mn(t) - mn(e) : s - o;
|
|
1515
|
-
});
|
|
1516
|
-
}
|
|
1517
|
-
function bn(e, t = {}) {
|
|
1518
|
-
let n = vn(e, t);
|
|
1519
|
-
return {
|
|
1520
|
-
running: n,
|
|
1521
|
-
label: n ? "" : gn(e?.UpdatedAt ?? e?.updated_at)
|
|
1522
|
-
};
|
|
1523
|
-
}
|
|
1524
|
-
//#endregion
|
|
1525
|
-
//#region src/components/chat/ChatSidebar.tsx
|
|
1526
|
-
function xn({ sessions: e, currentSessionId: t, onCreateNewSession: n, onSelectSession: r, onDeleteSession: i, onTogglePinSession: a, onLoadMoreSessions: o, sessionTitle: s, pinnedSessionIds: c = [], hasMoreSessions: l = !1, isLoadingSessions: u = !1, className: d }) {
|
|
1527
|
-
let [f, p] = V(""), h = pe(() => yn(e, f, { pinnedSessionIds: c }), [
|
|
1528
|
-
e,
|
|
1529
|
-
c,
|
|
1530
|
-
f
|
|
1531
|
-
]), g = pe(() => new Set(c), [c]);
|
|
1532
|
-
return /* @__PURE__ */ N("div", {
|
|
1533
|
-
className: J("flex h-full min-h-0 flex-col bg-slate-50 dark:bg-slate-950/80", d),
|
|
1534
|
-
children: [
|
|
1535
|
-
/* @__PURE__ */ N("div", {
|
|
1536
|
-
className: "flex flex-shrink-0 flex-col gap-2 border-b border-slate-200/30 px-3 py-3 dark:border-slate-800",
|
|
1537
|
-
children: [/* @__PURE__ */ N("button", {
|
|
1538
|
-
type: "button",
|
|
1539
|
-
onClick: n,
|
|
1540
|
-
className: "flex w-full items-center justify-between rounded-2xl px-3 py-2 text-sm font-medium transition-colors hover:bg-slate-200/60 dark:hover:bg-slate-800",
|
|
1541
|
-
children: [/* @__PURE__ */ N("span", {
|
|
1542
|
-
className: "flex items-center gap-2",
|
|
1543
|
-
children: [/* @__PURE__ */ M(ne, { className: "h-4 w-4" }), /* @__PURE__ */ M("span", { children: "新对话" })]
|
|
1544
|
-
}), /* @__PURE__ */ M("span", {
|
|
1545
|
-
className: "rounded border border-slate-200 bg-white px-1.5 py-0.5 text-[11px] text-slate-500 shadow-sm dark:border-slate-700 dark:bg-slate-900",
|
|
1546
|
-
children: "⌘ N"
|
|
1547
|
-
})]
|
|
1548
|
-
}), /* @__PURE__ */ N("label", {
|
|
1549
|
-
className: "flex items-center gap-2 rounded-2xl border border-slate-200 bg-white px-3 py-2 text-xs text-slate-500 shadow-sm focus-within:border-blue-300 focus-within:ring-2 focus-within:ring-blue-100 dark:border-slate-800 dark:bg-slate-900 dark:text-slate-400 dark:focus-within:border-blue-800 dark:focus-within:ring-blue-950/60",
|
|
1550
|
-
children: [/* @__PURE__ */ M(w, { className: "h-3.5 w-3.5 flex-shrink-0" }), /* @__PURE__ */ M("input", {
|
|
1551
|
-
value: f,
|
|
1552
|
-
onChange: (e) => p(e.target.value),
|
|
1553
|
-
className: "min-w-0 flex-1 bg-transparent text-sm text-slate-700 outline-none placeholder:text-slate-400 dark:text-slate-200",
|
|
1554
|
-
placeholder: "搜索会话、模型或摘要"
|
|
1555
|
-
})]
|
|
1556
|
-
})]
|
|
1557
|
-
}),
|
|
1558
|
-
/* @__PURE__ */ N("div", {
|
|
1559
|
-
className: "min-h-0 flex-1 overflow-y-auto px-2 pb-4 pt-2 custom-scrollbar",
|
|
1560
|
-
onScroll: (e) => {
|
|
1561
|
-
if (!o || u || !l || f.trim()) return;
|
|
1562
|
-
let t = e.currentTarget;
|
|
1563
|
-
t.scrollHeight - t.scrollTop - t.clientHeight < 200 && o();
|
|
1564
|
-
},
|
|
1565
|
-
children: [/* @__PURE__ */ N("div", {
|
|
1566
|
-
className: "px-2 py-2 text-xs font-semibold text-slate-400 dark:text-slate-500",
|
|
1567
|
-
children: ["历史记录", f.trim() ? ` · ${h.length}` : ""]
|
|
1568
|
-
}), /* @__PURE__ */ N("div", {
|
|
1569
|
-
className: "flex flex-col gap-1.5",
|
|
1570
|
-
children: [h.length > 0 ? h.map((e) => {
|
|
1571
|
-
let n = bn(e), o = g.has(e.SessionId);
|
|
1572
|
-
return /* @__PURE__ */ N("div", {
|
|
1573
|
-
role: "button",
|
|
1574
|
-
tabIndex: 0,
|
|
1575
|
-
onClick: () => r(e.SessionId),
|
|
1576
|
-
onKeyDown: (t) => {
|
|
1577
|
-
(t.key === "Enter" || t.key === " ") && (t.preventDefault(), r(e.SessionId));
|
|
1578
|
-
},
|
|
1579
|
-
className: J("group flex items-center justify-between gap-3 rounded-2xl px-3 py-3 text-sm transition-colors", t === e.SessionId ? "bg-slate-200/90 font-medium text-slate-950 dark:bg-slate-800 dark:text-slate-50" : "cursor-pointer text-slate-700 hover:bg-slate-100 dark:text-slate-300 dark:hover:bg-slate-800/60"),
|
|
1580
|
-
children: [
|
|
1581
|
-
/* @__PURE__ */ M("div", {
|
|
1582
|
-
className: "min-w-0 flex-1 truncate text-[15px] leading-6",
|
|
1583
|
-
children: s(e)
|
|
1584
|
-
}),
|
|
1585
|
-
n.running ? /* @__PURE__ */ M(m, { className: "h-4 w-4 flex-shrink-0 animate-spin text-slate-400 dark:text-slate-500" }) : n.label ? /* @__PURE__ */ M("span", {
|
|
1586
|
-
className: "flex-shrink-0 text-[11px] leading-none text-slate-400 dark:text-slate-500",
|
|
1587
|
-
children: n.label
|
|
1588
|
-
}) : null,
|
|
1589
|
-
/* @__PURE__ */ M("button", {
|
|
1590
|
-
type: "button",
|
|
1591
|
-
onClick: (t) => a(e.SessionId, t),
|
|
1592
|
-
className: J("rounded-lg p-1.5 transition hover:bg-white md:opacity-0 md:group-hover:opacity-100 dark:hover:bg-slate-900", o ? "text-blue-500 opacity-100" : "text-slate-400"),
|
|
1593
|
-
title: o ? "取消置顶" : "置顶会话",
|
|
1594
|
-
"aria-label": o ? "取消置顶会话" : "置顶会话",
|
|
1595
|
-
children: M(o ? S : te, { className: "h-3.5 w-3.5" })
|
|
1596
|
-
}),
|
|
1597
|
-
/* @__PURE__ */ M("button", {
|
|
1598
|
-
type: "button",
|
|
1599
|
-
onClick: (t) => i(e.SessionId, t),
|
|
1600
|
-
className: "hidden rounded-lg p-1.5 text-slate-400 transition hover:bg-white hover:text-rose-500 md:group-hover:block dark:hover:bg-slate-900",
|
|
1601
|
-
title: "Delete chat",
|
|
1602
|
-
children: /* @__PURE__ */ M(se, { className: "h-3.5 w-3.5" })
|
|
1603
|
-
})
|
|
1604
|
-
]
|
|
1605
|
-
}, e.SessionId);
|
|
1606
|
-
}) : /* @__PURE__ */ M("div", {
|
|
1607
|
-
className: "rounded-xl border border-dashed border-slate-200 px-3 py-8 text-center text-xs text-slate-400 dark:border-slate-800 dark:text-slate-500",
|
|
1608
|
-
children: "没有匹配的会话"
|
|
1609
|
-
}), u ? /* @__PURE__ */ N("div", {
|
|
1610
|
-
className: "flex items-center justify-center gap-2 px-3 py-3 text-xs text-slate-400",
|
|
1611
|
-
children: [/* @__PURE__ */ M(m, { className: "h-3.5 w-3.5 animate-spin" }), /* @__PURE__ */ M("span", { children: "加载中" })]
|
|
1612
|
-
}) : null]
|
|
1613
|
-
})]
|
|
1614
|
-
}),
|
|
1615
|
-
/* @__PURE__ */ N("div", {
|
|
1616
|
-
className: "border-t border-slate-200/30 px-4 py-3 text-center dark:border-slate-800",
|
|
1617
|
-
children: [
|
|
1618
|
-
/* @__PURE__ */ M("div", {
|
|
1619
|
-
className: "text-[10px] font-medium tracking-[0.14em] text-slate-400 dark:text-slate-500",
|
|
1620
|
-
children: "POWERED BY"
|
|
1621
|
-
}),
|
|
1622
|
-
/* @__PURE__ */ M("div", {
|
|
1623
|
-
className: "mt-1 bg-gradient-to-r from-blue-600 to-indigo-500 bg-clip-text text-xs font-bold text-transparent dark:from-blue-400 dark:to-indigo-300",
|
|
1624
|
-
children: "Ksyun AgentEngine"
|
|
1625
|
-
}),
|
|
1626
|
-
/* @__PURE__ */ M("div", {
|
|
1627
|
-
className: "mx-auto mt-2 max-w-[13rem] text-[10px] leading-4 text-slate-400 dark:text-slate-500",
|
|
1628
|
-
children: "Agent 可能产生不准确的信息,请独立验证。"
|
|
1629
|
-
})
|
|
1630
|
-
]
|
|
1631
|
-
})
|
|
1632
|
-
]
|
|
1633
|
-
});
|
|
1634
|
-
}
|
|
1635
|
-
//#endregion
|
|
1636
|
-
//#region src/components/native/NativeRuntimeLauncher.tsx
|
|
1637
|
-
var Sn = de(() => import("./NativeTerminalPanel-CjyPyYC4.js").then((e) => e.n).then((e) => ({ default: e.NativeTerminalPanel })));
|
|
1638
|
-
function Cn({ productLabel: e = "原生运行时", nativeManagementLink: t, nativeTerminal: n, workspaceEnabled: r, onOpenWorkspace: i }) {
|
|
1639
|
-
let a = !!n?.Enabled, [o, c] = V(!1);
|
|
1640
|
-
return /* @__PURE__ */ N("section", {
|
|
1641
|
-
className: "flex min-h-0 flex-1 overflow-y-auto bg-[radial-gradient(circle_at_top_left,rgba(14,165,233,0.12),transparent_34%),linear-gradient(135deg,#f8fafc_0%,#ffffff_48%,#f1f5f9_100%)] px-4 py-8 dark:bg-[radial-gradient(circle_at_top_left,rgba(14,165,233,0.16),transparent_34%),linear-gradient(135deg,#020617_0%,#0f172a_52%,#111827_100%)] sm:px-8",
|
|
1642
|
-
children: [/* @__PURE__ */ M("div", {
|
|
1643
|
-
className: "mx-auto flex w-full max-w-5xl flex-col justify-center",
|
|
1644
|
-
children: /* @__PURE__ */ N("div", {
|
|
1645
|
-
className: "overflow-hidden rounded-[2rem] border border-slate-200/80 bg-white/90 shadow-xl shadow-slate-200/60 backdrop-blur dark:border-slate-800 dark:bg-slate-900/85 dark:shadow-black/30",
|
|
1646
|
-
children: [/* @__PURE__ */ N("div", {
|
|
1647
|
-
className: "border-b border-slate-200/80 bg-slate-50/80 px-6 py-5 dark:border-slate-800 dark:bg-slate-950/40 sm:px-8",
|
|
1648
|
-
children: [
|
|
1649
|
-
/* @__PURE__ */ N("div", {
|
|
1650
|
-
className: "inline-flex items-center gap-2 rounded-full border border-sky-200 bg-sky-50 px-3 py-1 text-xs font-medium text-sky-700 dark:border-sky-900/60 dark:bg-sky-950/50 dark:text-sky-300",
|
|
1651
|
-
children: [
|
|
1652
|
-
/* @__PURE__ */ M(T, { className: "h-3.5 w-3.5" }),
|
|
1653
|
-
e,
|
|
1654
|
-
" native runtime"
|
|
1655
|
-
]
|
|
1656
|
-
}),
|
|
1657
|
-
/* @__PURE__ */ M("h1", {
|
|
1658
|
-
className: "mt-5 text-2xl font-semibold tracking-tight text-slate-950 dark:text-slate-50 sm:text-3xl",
|
|
1659
|
-
children: "对话请使用原生管理台"
|
|
1660
|
-
}),
|
|
1661
|
-
/* @__PURE__ */ M("p", {
|
|
1662
|
-
className: "mt-3 max-w-2xl text-sm leading-6 text-slate-600 dark:text-slate-300 sm:text-base",
|
|
1663
|
-
children: "当前运行时的对话状态由原生管理台承载。AgentEngine Hosted UI 在这里保留统一入口和 Workspace 文件管理,不重复实现运行时内部已有的复杂对话状态机。"
|
|
1664
|
-
})
|
|
1665
|
-
]
|
|
1666
|
-
}), /* @__PURE__ */ N("div", {
|
|
1667
|
-
className: "grid gap-4 p-6 md:grid-cols-3 sm:p-8",
|
|
1668
|
-
children: [
|
|
1669
|
-
/* @__PURE__ */ N("div", {
|
|
1670
|
-
className: "rounded-3xl border border-slate-200 bg-white p-5 dark:border-slate-800 dark:bg-slate-900",
|
|
1671
|
-
children: [
|
|
1672
|
-
/* @__PURE__ */ M("div", {
|
|
1673
|
-
className: "flex h-11 w-11 items-center justify-center rounded-2xl bg-slate-950 text-white dark:bg-slate-100 dark:text-slate-950",
|
|
1674
|
-
children: /* @__PURE__ */ M(g, { className: "h-5 w-5" })
|
|
1675
|
-
}),
|
|
1676
|
-
/* @__PURE__ */ M("h2", {
|
|
1677
|
-
className: "mt-4 text-base font-semibold text-slate-950 dark:text-slate-50",
|
|
1678
|
-
children: "原生管理台"
|
|
1679
|
-
}),
|
|
1680
|
-
/* @__PURE__ */ M("p", {
|
|
1681
|
-
className: "mt-2 text-sm leading-6 text-slate-600 dark:text-slate-300",
|
|
1682
|
-
children: "使用原生管理台处理对话、工具卡片、思考流、审批、中断和运行时历史,避免跨状态机不一致。"
|
|
1683
|
-
}),
|
|
1684
|
-
t ? /* @__PURE__ */ N("a", {
|
|
1685
|
-
href: t.href,
|
|
1686
|
-
target: "_blank",
|
|
1687
|
-
rel: "noreferrer",
|
|
1688
|
-
title: t.title,
|
|
1689
|
-
className: "mt-5 inline-flex items-center gap-2 rounded-2xl bg-slate-950 px-4 py-2.5 text-sm font-medium text-white transition hover:bg-slate-800 dark:bg-slate-100 dark:text-slate-950 dark:hover:bg-white",
|
|
1690
|
-
children: [
|
|
1691
|
-
/* @__PURE__ */ M(s, { className: "h-4 w-4" }),
|
|
1692
|
-
"打开",
|
|
1693
|
-
t.label
|
|
1694
|
-
]
|
|
1695
|
-
}) : /* @__PURE__ */ M("div", {
|
|
1696
|
-
className: "mt-5 rounded-2xl border border-amber-200 bg-amber-50 px-4 py-3 text-sm leading-6 text-amber-800 dark:border-amber-900/60 dark:bg-amber-950/30 dark:text-amber-200",
|
|
1697
|
-
children: "当前访问模式不开放原生管理入口。需要完整对话体验时,请使用 owner/private 链接或 CLI。"
|
|
1698
|
-
})
|
|
1699
|
-
]
|
|
1700
|
-
}),
|
|
1701
|
-
/* @__PURE__ */ N("div", {
|
|
1702
|
-
className: "rounded-3xl border border-slate-200 bg-white p-5 dark:border-slate-800 dark:bg-slate-900",
|
|
1703
|
-
children: [
|
|
1704
|
-
/* @__PURE__ */ M("div", {
|
|
1705
|
-
className: "flex h-11 w-11 items-center justify-center rounded-2xl bg-sky-100 text-sky-700 dark:bg-sky-950 dark:text-sky-300",
|
|
1706
|
-
children: /* @__PURE__ */ M(d, { className: "h-5 w-5" })
|
|
1707
|
-
}),
|
|
1708
|
-
/* @__PURE__ */ M("h2", {
|
|
1709
|
-
className: "mt-4 text-base font-semibold text-slate-950 dark:text-slate-50",
|
|
1710
|
-
children: "Workspace 文件管理"
|
|
1711
|
-
}),
|
|
1712
|
-
/* @__PURE__ */ M("p", {
|
|
1713
|
-
className: "mt-2 text-sm leading-6 text-slate-600 dark:text-slate-300",
|
|
1714
|
-
children: "文件浏览、上传、预览仍由 Hosted UI 提供,和原生管理台组合使用覆盖对话与工作区。"
|
|
1715
|
-
}),
|
|
1716
|
-
r ? /* @__PURE__ */ N("button", {
|
|
1717
|
-
type: "button",
|
|
1718
|
-
onClick: i,
|
|
1719
|
-
className: "mt-5 inline-flex items-center gap-2 rounded-2xl border border-slate-200 bg-slate-50 px-4 py-2.5 text-sm font-medium text-slate-800 transition hover:bg-slate-100 dark:border-slate-700 dark:bg-slate-800 dark:text-slate-100 dark:hover:bg-slate-700",
|
|
1720
|
-
children: [/* @__PURE__ */ M(d, { className: "h-4 w-4" }), "打开 Workspace"]
|
|
1721
|
-
}) : /* @__PURE__ */ M("div", {
|
|
1722
|
-
className: "mt-5 rounded-2xl border border-slate-200 bg-slate-50 px-4 py-3 text-sm leading-6 text-slate-500 dark:border-slate-800 dark:bg-slate-950/40 dark:text-slate-400",
|
|
1723
|
-
children: "当前链接未开放 Workspace 文件管理。Owner 或 private 链接可使用该能力。"
|
|
1724
|
-
})
|
|
1725
|
-
]
|
|
1726
|
-
}),
|
|
1727
|
-
/* @__PURE__ */ N("div", {
|
|
1728
|
-
className: "rounded-3xl border border-slate-200 bg-white p-5 dark:border-slate-800 dark:bg-slate-900",
|
|
1729
|
-
children: [
|
|
1730
|
-
/* @__PURE__ */ M("div", {
|
|
1731
|
-
className: "flex h-11 w-11 items-center justify-center rounded-2xl bg-emerald-100 text-emerald-700 dark:bg-emerald-950 dark:text-emerald-300",
|
|
1732
|
-
children: /* @__PURE__ */ M(D, { className: "h-5 w-5" })
|
|
1733
|
-
}),
|
|
1734
|
-
/* @__PURE__ */ M("h2", {
|
|
1735
|
-
className: "mt-4 text-base font-semibold text-slate-950 dark:text-slate-50",
|
|
1736
|
-
children: "原生 TUI"
|
|
1737
|
-
}),
|
|
1738
|
-
/* @__PURE__ */ M("p", {
|
|
1739
|
-
className: "mt-2 text-sm leading-6 text-slate-600 dark:text-slate-300",
|
|
1740
|
-
children: "如果运行时暴露安全的 ks-terminal.v1 通道,可以在这里进入原生终端 UI;share 链接不会开放该入口。"
|
|
1741
|
-
}),
|
|
1742
|
-
a ? /* @__PURE__ */ N("button", {
|
|
1743
|
-
type: "button",
|
|
1744
|
-
onClick: () => c(!0),
|
|
1745
|
-
className: "mt-5 inline-flex items-center gap-2 rounded-2xl border border-emerald-200 bg-emerald-50 px-4 py-2.5 text-sm font-medium text-emerald-800 transition hover:bg-emerald-100 dark:border-emerald-900/70 dark:bg-emerald-950/40 dark:text-emerald-200",
|
|
1746
|
-
children: [/* @__PURE__ */ M(D, { className: "h-4 w-4" }), "打开 TUI"]
|
|
1747
|
-
}) : /* @__PURE__ */ M("div", {
|
|
1748
|
-
className: "mt-5 rounded-2xl border border-slate-200 bg-slate-50 px-4 py-3 text-sm leading-6 text-slate-500 dark:border-slate-800 dark:bg-slate-950/40 dark:text-slate-400",
|
|
1749
|
-
children: "当前运行时未声明可用的浏览器 TUI 能力。"
|
|
1750
|
-
})
|
|
1751
|
-
]
|
|
1752
|
-
})
|
|
1753
|
-
]
|
|
1754
|
-
})]
|
|
1755
|
-
})
|
|
1756
|
-
}), n && o ? /* @__PURE__ */ M(I, {
|
|
1757
|
-
fallback: null,
|
|
1758
|
-
children: /* @__PURE__ */ M(Sn, {
|
|
1759
|
-
capability: n,
|
|
1760
|
-
open: o,
|
|
1761
|
-
onClose: () => c(!1)
|
|
1762
|
-
})
|
|
1763
|
-
}) : null]
|
|
1764
|
-
});
|
|
1765
|
-
}
|
|
1766
|
-
//#endregion
|
|
1767
|
-
//#region src/stores/ui.ts
|
|
1768
|
-
function wn(e, t) {
|
|
1769
|
-
return typeof t == "function" ? t(e) : t;
|
|
1770
|
-
}
|
|
1771
|
-
var Tn = he()((e) => ({
|
|
1772
|
-
sidebarOpen: !0,
|
|
1773
|
-
mobileSidebarOpen: !1,
|
|
1774
|
-
mobileActionsOpen: !1,
|
|
1775
|
-
workspacePanelOpen: !1,
|
|
1776
|
-
workspacePanelWidth: 820,
|
|
1777
|
-
workspacePanelFullscreen: !1,
|
|
1778
|
-
input: "",
|
|
1779
|
-
attachments: [],
|
|
1780
|
-
previewAttachment: null,
|
|
1781
|
-
previewImageSize: null,
|
|
1782
|
-
queuedDrafts: [],
|
|
1783
|
-
toasts: [],
|
|
1784
|
-
toggleSidebar: () => e((e) => ({ sidebarOpen: !e.sidebarOpen })),
|
|
1785
|
-
setSidebarOpen: (t) => e({ sidebarOpen: t }),
|
|
1786
|
-
toggleMobileSidebar: () => e((e) => ({ mobileSidebarOpen: !e.mobileSidebarOpen })),
|
|
1787
|
-
setMobileSidebarOpen: (t) => e({ mobileSidebarOpen: t }),
|
|
1788
|
-
toggleMobileActions: () => e((e) => ({ mobileActionsOpen: !e.mobileActionsOpen })),
|
|
1789
|
-
setMobileActionsOpen: (t) => e({ mobileActionsOpen: t }),
|
|
1790
|
-
setWorkspacePanelOpen: (t) => e({ workspacePanelOpen: t }),
|
|
1791
|
-
setWorkspacePanelWidth: (t) => e({ workspacePanelWidth: t }),
|
|
1792
|
-
setWorkspacePanelFullscreen: (t) => e({ workspacePanelFullscreen: t }),
|
|
1793
|
-
setInput: (t) => e({ input: t }),
|
|
1794
|
-
setAttachments: (t) => e((e) => ({ attachments: wn(e.attachments, t) })),
|
|
1795
|
-
setPreviewAttachment: (t) => e({ previewAttachment: t }),
|
|
1796
|
-
setPreviewImageSize: (t) => e({ previewImageSize: t }),
|
|
1797
|
-
setQueuedDrafts: (t) => e((e) => ({ queuedDrafts: wn(e.queuedDrafts, t) })),
|
|
1798
|
-
pushToast: (t, n = "info") => e((e) => ({ toasts: [...e.toasts, {
|
|
1799
|
-
id: String(Date.now() + Math.random()),
|
|
1800
|
-
message: t,
|
|
1801
|
-
variant: n,
|
|
1802
|
-
createdAt: Date.now()
|
|
1803
|
-
}] })),
|
|
1804
|
-
dismissToast: (t) => e((e) => ({ toasts: e.toasts.filter((e) => e.id !== t) }))
|
|
1805
|
-
}));
|
|
1806
|
-
//#endregion
|
|
1807
|
-
//#region src/components/workspace/FileEditor.tsx
|
|
1808
|
-
function En(e) {
|
|
1809
|
-
let t = String(e || "").split("/").pop() || "", n = t.lastIndexOf(".");
|
|
1810
|
-
return n >= 0 ? t.slice(n) : "";
|
|
1811
|
-
}
|
|
1812
|
-
function Dn(e) {
|
|
1813
|
-
return Oe.matchFilename(He, `file${e}`);
|
|
1814
|
-
}
|
|
1815
|
-
function Q({ content: e, path: t, readOnly: n = !1, onSave: r, onDirtyChange: i, onContentChange: a, getContentRef: o }) {
|
|
1816
|
-
let s = B(null), c = B(null), l = B(new Ce()), u = B(new Ce()), d = B(new Ce()), f = B(!1), p = B(r), m = B(i), h = B(a);
|
|
1817
|
-
R(() => {
|
|
1818
|
-
p.current = r, m.current = i, h.current = a;
|
|
1819
|
-
}, [
|
|
1820
|
-
r,
|
|
1821
|
-
i,
|
|
1822
|
-
a
|
|
1823
|
-
]);
|
|
1824
|
-
let g = L((e) => {
|
|
1825
|
-
f.current !== e && (f.current = e, m.current?.(e));
|
|
1826
|
-
}, []);
|
|
1827
|
-
return R(() => {
|
|
1828
|
-
if (!s.current) return;
|
|
1829
|
-
let r = document.documentElement.classList.contains("dark"), i = be.of([{
|
|
1830
|
-
key: "Mod-s",
|
|
1831
|
-
run: (e) => {
|
|
1832
|
-
let t = e.state.doc.toString();
|
|
1833
|
-
return p.current?.(t), g(!1), !0;
|
|
1834
|
-
},
|
|
1835
|
-
preventDefault: !0
|
|
1836
|
-
}]), a = new ge({
|
|
1837
|
-
state: q.create({
|
|
1838
|
-
doc: e,
|
|
1839
|
-
extensions: [
|
|
1840
|
-
xe(),
|
|
1841
|
-
K(),
|
|
1842
|
-
Te(),
|
|
1843
|
-
je(),
|
|
1844
|
-
ve(),
|
|
1845
|
-
ye(),
|
|
1846
|
-
q.allowMultipleSelections.of(!0),
|
|
1847
|
-
Ne(),
|
|
1848
|
-
Pe(Ae, { fallback: !0 }),
|
|
1849
|
-
ke(),
|
|
1850
|
-
ze(),
|
|
1851
|
-
Re(),
|
|
1852
|
-
Se(),
|
|
1853
|
-
_e(),
|
|
1854
|
-
G(),
|
|
1855
|
-
Ie(),
|
|
1856
|
-
be.of([
|
|
1857
|
-
...Be,
|
|
1858
|
-
...we,
|
|
1859
|
-
...Le,
|
|
1860
|
-
...Ee,
|
|
1861
|
-
...Me,
|
|
1862
|
-
...Ve,
|
|
1863
|
-
De
|
|
1864
|
-
]),
|
|
1865
|
-
i,
|
|
1866
|
-
ge.updateListener.of((e) => {
|
|
1867
|
-
e.docChanged && (g(!0), h.current?.(e.state.doc.toString()));
|
|
1868
|
-
}),
|
|
1869
|
-
d.current.of(q.readOnly.of(n)),
|
|
1870
|
-
l.current.of([]),
|
|
1871
|
-
u.current.of(r ? Fe : []),
|
|
1872
|
-
ge.theme({
|
|
1873
|
-
"&": { height: "100%" },
|
|
1874
|
-
".cm-scroller": { overflow: "auto" }
|
|
1875
|
-
})
|
|
1876
|
-
]
|
|
1877
|
-
}),
|
|
1878
|
-
parent: s.current
|
|
1879
|
-
});
|
|
1880
|
-
c.current = a, o && (o.current = () => a.state.doc.toString());
|
|
1881
|
-
let f = Dn(En(t));
|
|
1882
|
-
return f && f.load().then((e) => {
|
|
1883
|
-
c.current && c.current.dispatch({ effects: l.current.reconfigure(e) });
|
|
1884
|
-
}).catch(() => {}), () => {
|
|
1885
|
-
a.destroy(), c.current = null, o && (o.current = null);
|
|
1886
|
-
};
|
|
1887
|
-
}, []), R(() => {
|
|
1888
|
-
let t = c.current;
|
|
1889
|
-
if (!t) return;
|
|
1890
|
-
let n = t.state.doc.toString();
|
|
1891
|
-
n !== e && (t.dispatch({ changes: {
|
|
1892
|
-
from: 0,
|
|
1893
|
-
to: n.length,
|
|
1894
|
-
insert: e
|
|
1895
|
-
} }), g(!1));
|
|
1896
|
-
}, [e, g]), R(() => {
|
|
1897
|
-
let e = c.current;
|
|
1898
|
-
if (!e) return;
|
|
1899
|
-
let n = Dn(En(t));
|
|
1900
|
-
n ? n.load().then((e) => {
|
|
1901
|
-
c.current && c.current.dispatch({ effects: l.current.reconfigure(e) });
|
|
1902
|
-
}).catch(() => {}) : e.dispatch({ effects: l.current.reconfigure([]) });
|
|
1903
|
-
}, [t]), R(() => {
|
|
1904
|
-
let e = c.current;
|
|
1905
|
-
e && e.dispatch({ effects: d.current.reconfigure(q.readOnly.of(n)) });
|
|
1906
|
-
}, [n]), R(() => {
|
|
1907
|
-
let e = new MutationObserver(() => {
|
|
1908
|
-
let e = c.current;
|
|
1909
|
-
if (!e) return;
|
|
1910
|
-
let t = document.documentElement.classList.contains("dark");
|
|
1911
|
-
e.dispatch({ effects: u.current.reconfigure(t ? Fe : []) });
|
|
1912
|
-
});
|
|
1913
|
-
return e.observe(document.documentElement, {
|
|
1914
|
-
attributes: !0,
|
|
1915
|
-
attributeFilter: ["class"]
|
|
1916
|
-
}), () => e.disconnect();
|
|
1917
|
-
}, []), /* @__PURE__ */ M("div", {
|
|
1918
|
-
ref: s,
|
|
1919
|
-
className: "h-full w-full overflow-hidden [&_.cm-editor]:h-full [&_.cm-scroller]:auto"
|
|
1920
|
-
});
|
|
1921
|
-
}
|
|
1922
|
-
//#endregion
|
|
1923
|
-
//#region src/components/workspace/FilePreview.tsx
|
|
1924
|
-
function On({ content: e, objectUrl: t, kind: n, filename: r, path: i }) {
|
|
1925
|
-
return n === "markdown" ? /* @__PURE__ */ M(X, { content: e || "" }) : n === "image" && t ? /* @__PURE__ */ M("div", {
|
|
1926
|
-
className: "flex items-center justify-center p-4",
|
|
1927
|
-
children: /* @__PURE__ */ M("img", {
|
|
1928
|
-
src: t,
|
|
1929
|
-
alt: r,
|
|
1930
|
-
className: "max-h-[70vh] max-w-full rounded object-contain"
|
|
1931
|
-
})
|
|
1932
|
-
}) : n === "pdf" && t ? /* @__PURE__ */ M("iframe", {
|
|
1933
|
-
src: t,
|
|
1934
|
-
title: r,
|
|
1935
|
-
className: "h-full w-full border-0"
|
|
1936
|
-
}) : (n === "text" || n === "code") && e !== null ? /* @__PURE__ */ M(Q, {
|
|
1937
|
-
content: e,
|
|
1938
|
-
path: i || r,
|
|
1939
|
-
readOnly: !0,
|
|
1940
|
-
onSave: () => {},
|
|
1941
|
-
onDirtyChange: () => {},
|
|
1942
|
-
getContentRef: { current: () => e || "" }
|
|
1943
|
-
}) : /* @__PURE__ */ M("div", {
|
|
1944
|
-
className: "flex h-full items-center justify-center px-6 text-center",
|
|
1945
|
-
children: /* @__PURE__ */ M("div", {
|
|
1946
|
-
className: "w-full max-w-md rounded-2xl border border-dashed border-slate-300 bg-slate-50 px-5 py-5 text-slate-500 dark:border-slate-700 dark:bg-slate-900 dark:text-slate-400",
|
|
1947
|
-
children: "该文件类型暂不支持在线预览,请直接下载查看。"
|
|
1948
|
-
})
|
|
1949
|
-
});
|
|
1950
|
-
}
|
|
1951
|
-
//#endregion
|
|
1952
|
-
//#region src/utils/sandbox.ts
|
|
1953
|
-
function kn(e) {
|
|
1954
|
-
return e.replace(/&/g, "&").replace(/"/g, """).replace(/</g, "<").replace(/>/g, ">");
|
|
1955
|
-
}
|
|
1956
|
-
function An(e) {
|
|
1957
|
-
let t = e.endsWith("/") ? e : `${e}/`;
|
|
1958
|
-
if (typeof window > "u") return "'self'";
|
|
1959
|
-
try {
|
|
1960
|
-
return new URL(t, window.location.origin).toString();
|
|
1961
|
-
} catch {
|
|
1962
|
-
return "'self'";
|
|
1963
|
-
}
|
|
1964
|
-
}
|
|
1965
|
-
function jn(...e) {
|
|
1966
|
-
return Array.from(new Set(e.filter((e) => !!e))).join(" ");
|
|
1967
|
-
}
|
|
1968
|
-
function Mn(e) {
|
|
1969
|
-
let t = e ? An(e) : void 0, n = jn("'unsafe-inline'", "'unsafe-eval'", "'self'", "https:", t), r = jn("'self'", "https:", t);
|
|
1970
|
-
return [
|
|
1971
|
-
"default-src 'none'",
|
|
1972
|
-
`script-src ${n}`,
|
|
1973
|
-
`style-src 'unsafe-inline' data: ${r}`,
|
|
1974
|
-
`img-src data: blob: ${r}`,
|
|
1975
|
-
`font-src data: ${r}`,
|
|
1976
|
-
`media-src data: blob: ${r}`,
|
|
1977
|
-
"worker-src blob:",
|
|
1978
|
-
"connect-src 'none'",
|
|
1979
|
-
"form-action 'none'",
|
|
1980
|
-
"base-uri 'self'"
|
|
1981
|
-
].join("; ");
|
|
1982
|
-
}
|
|
1983
|
-
function Nn(e) {
|
|
1984
|
-
try {
|
|
1985
|
-
let t = new URL(e, window.location.href);
|
|
1986
|
-
return [
|
|
1987
|
-
"http:",
|
|
1988
|
-
"https:",
|
|
1989
|
-
"mailto:"
|
|
1990
|
-
].includes(t.protocol);
|
|
1991
|
-
} catch {
|
|
1992
|
-
return !1;
|
|
1993
|
-
}
|
|
1994
|
-
}
|
|
1995
|
-
function Pn(e, t = {}) {
|
|
1996
|
-
let { channelId: n, basePath: r } = typeof t == "string" ? { channelId: t } : t, i = Mn(r), a = `<script>
|
|
1997
|
-
function ksadkScrollToHash(rawHref) {
|
|
1998
|
-
if (!rawHref || rawHref === '#') return;
|
|
1999
|
-
var rawId = rawHref.slice(1);
|
|
2000
|
-
var id = rawId;
|
|
2001
|
-
try {
|
|
2002
|
-
id = decodeURIComponent(rawId);
|
|
2003
|
-
} catch (_) {}
|
|
2004
|
-
var target = document.getElementById(id) || document.getElementsByName(id)[0];
|
|
2005
|
-
if (target) {
|
|
2006
|
-
target.scrollIntoView({ behavior: 'smooth', block: 'start' });
|
|
2007
|
-
}
|
|
2008
|
-
}
|
|
2009
|
-
document.addEventListener('click', function(event) {
|
|
2010
|
-
var target = event.target && event.target.closest ? event.target.closest('a') : null;
|
|
2011
|
-
if (!target) return;
|
|
2012
|
-
var rawHref = target.getAttribute('href') || '';
|
|
2013
|
-
if (rawHref.charAt(0) === '#') {
|
|
2014
|
-
event.preventDefault();
|
|
2015
|
-
ksadkScrollToHash(rawHref);
|
|
2016
|
-
return;
|
|
2017
|
-
}
|
|
2018
|
-
if (target.href) {
|
|
2019
|
-
event.preventDefault();
|
|
2020
|
-
window.parent.postMessage({
|
|
2021
|
-
type: 'ksadk:linkClick',
|
|
2022
|
-
channelId: ${JSON.stringify(n || "")},
|
|
2023
|
-
href: target.href,
|
|
2024
|
-
target: target.target || '_self'
|
|
2025
|
-
}, '*');
|
|
2026
|
-
}
|
|
2027
|
-
}, true);
|
|
2028
|
-
<\/script>`, o = `${`<meta http-equiv="Content-Security-Policy" content="${kn(i)}">`}${r ? `<base href="${kn(r)}">` : ""}${a}`;
|
|
2029
|
-
return /<head[^>]*>/i.test(e) ? e.replace(/<head[^>]*>/i, `$&${o}`) : `${o}${e}`;
|
|
2030
|
-
}
|
|
2031
|
-
function Fn(e, t) {
|
|
2032
|
-
let n = B(null);
|
|
2033
|
-
R(() => (n.current = (n) => {
|
|
2034
|
-
if (n.source !== e.current?.contentWindow || n.data?.type !== "ksadk:linkClick" || t && n.data?.channelId !== t) return;
|
|
2035
|
-
let r = n.data?.href;
|
|
2036
|
-
typeof r == "string" && r && Nn(r) && window.open(r, "_blank", "noopener,noreferrer");
|
|
2037
|
-
}, window.addEventListener("message", n.current), () => {
|
|
2038
|
-
n.current && window.removeEventListener("message", n.current);
|
|
2039
|
-
}), [e, t]);
|
|
2040
|
-
}
|
|
2041
|
-
var In = "/_ksadk/workspace/v1/files", Ln = new Set([
|
|
2042
|
-
".md",
|
|
2043
|
-
".markdown",
|
|
2044
|
-
".mdx"
|
|
2045
|
-
]), Rn = new Set([".pdf"]), zn = new Set([
|
|
2046
|
-
".png",
|
|
2047
|
-
".jpg",
|
|
2048
|
-
".jpeg",
|
|
2049
|
-
".gif",
|
|
2050
|
-
".webp",
|
|
2051
|
-
".svg",
|
|
2052
|
-
".bmp",
|
|
2053
|
-
".ico"
|
|
2054
|
-
]), Bn = new Set(/* @__PURE__ */ ".txt,.log,.json,.yaml,.yml,.xml,.html,.css,.js,.jsx,.ts,.tsx,.py,.sh,.sql,.csv,.tsv,.toml,.ini,.env,.lock,.conf,.c,.cc,.cpp,.go,.java,.rs".split(",")), Vn = new Set([
|
|
2055
|
-
"application/json",
|
|
2056
|
-
"application/ld+json",
|
|
2057
|
-
"application/xml",
|
|
2058
|
-
"application/javascript",
|
|
2059
|
-
"application/x-javascript",
|
|
2060
|
-
"application/typescript",
|
|
2061
|
-
"application/x-sh",
|
|
2062
|
-
"application/x-yaml",
|
|
2063
|
-
"application/yaml",
|
|
2064
|
-
"text/csv",
|
|
2065
|
-
"text/tab-separated-values"
|
|
2066
|
-
]);
|
|
2067
|
-
function $(e) {
|
|
2068
|
-
let t = String(e || "").trim().replace(/\\/g, "/");
|
|
2069
|
-
if (!t || t === "/") return ".";
|
|
2070
|
-
let n = [];
|
|
2071
|
-
for (let e of t.split("/")) {
|
|
2072
|
-
let t = e.trim();
|
|
2073
|
-
if (!(!t || t === ".")) {
|
|
2074
|
-
if (t === "..") {
|
|
2075
|
-
n.length > 0 && n.pop();
|
|
2076
|
-
continue;
|
|
2077
|
-
}
|
|
2078
|
-
n.push(t);
|
|
2079
|
-
}
|
|
2080
|
-
}
|
|
2081
|
-
return n.length > 0 ? n.join("/") : ".";
|
|
2082
|
-
}
|
|
2083
|
-
function Hn(e) {
|
|
2084
|
-
let t = $(e);
|
|
2085
|
-
return t === "." ? "" : t.split("/").filter(Boolean).map((e) => encodeURIComponent(e)).join("/");
|
|
2086
|
-
}
|
|
2087
|
-
function Un(e) {
|
|
2088
|
-
let t = Hn(e);
|
|
2089
|
-
return t ? `${In}/${t}` : In;
|
|
2090
|
-
}
|
|
2091
|
-
function Wn(e) {
|
|
2092
|
-
let t = $(e);
|
|
2093
|
-
if (t === "." || !t.includes("/")) return `${In}/`;
|
|
2094
|
-
let n = Hn(t.substring(0, t.lastIndexOf("/")));
|
|
2095
|
-
return n ? `${In}/${n}/` : `${In}/`;
|
|
2096
|
-
}
|
|
2097
|
-
function Gn(e) {
|
|
2098
|
-
return $(e) === ".";
|
|
2099
|
-
}
|
|
2100
|
-
function Kn(e) {
|
|
2101
|
-
let t = $(e);
|
|
2102
|
-
return t === "." ? "/" : `/${t}`;
|
|
2103
|
-
}
|
|
2104
|
-
function qn(e) {
|
|
2105
|
-
let t = String(e || "").split("/").pop() || "", n = t.lastIndexOf(".");
|
|
2106
|
-
return n >= 0 ? t.slice(n).toLowerCase() : "";
|
|
2107
|
-
}
|
|
2108
|
-
function Jn(e) {
|
|
2109
|
-
return String(e || "").split(";")[0].trim().toLowerCase();
|
|
2110
|
-
}
|
|
2111
|
-
var Yn = new Set([".html", ".htm"]);
|
|
2112
|
-
function Xn({ path: e, mimeType: t }) {
|
|
2113
|
-
let n = qn(e), r = Jn(t);
|
|
2114
|
-
return r === "text/html" || Yn.has(n) ? "html" : r === "text/markdown" || Ln.has(n) ? "markdown" : r === "application/pdf" || Rn.has(n) ? "pdf" : r.startsWith("image/") || zn.has(n) ? "image" : r.startsWith("text/") || Vn.has(r) || Bn.has(n) ? "text" : "unsupported";
|
|
2115
|
-
}
|
|
2116
|
-
var Zn = new Set([
|
|
2117
|
-
".txt",
|
|
2118
|
-
".log",
|
|
2119
|
-
".csv",
|
|
2120
|
-
".tsv",
|
|
2121
|
-
".env",
|
|
2122
|
-
".ini",
|
|
2123
|
-
".conf",
|
|
2124
|
-
".lock"
|
|
2125
|
-
]);
|
|
2126
|
-
function Qn({ path: e, mimeType: t }) {
|
|
2127
|
-
let n = qn(e), r = Jn(t);
|
|
2128
|
-
return Yn.has(n) || r === "text/html" ? "html" : r === "text/markdown" || Ln.has(n) ? "markdown" : r === "application/pdf" || Rn.has(n) || r.startsWith("image/") || zn.has(n) ? null : Zn.has(n) || r === "text/plain" ? "text" : r.startsWith("text/") || Vn.has(r) || Bn.has(n) ? "code" : null;
|
|
2129
|
-
}
|
|
2130
|
-
function $n({ isMobile: e }) {
|
|
2131
|
-
return e ? {
|
|
2132
|
-
renderMode: "sheet",
|
|
2133
|
-
modal: !0,
|
|
2134
|
-
showOverlay: !0,
|
|
2135
|
-
preventOutsideClose: !1,
|
|
2136
|
-
side: "bottom"
|
|
2137
|
-
} : {
|
|
2138
|
-
renderMode: "inline",
|
|
2139
|
-
modal: !1,
|
|
2140
|
-
showOverlay: !1,
|
|
2141
|
-
preventOutsideClose: !0,
|
|
2142
|
-
side: "right"
|
|
2143
|
-
};
|
|
2144
|
-
}
|
|
2145
|
-
function er() {
|
|
2146
|
-
let e = 0;
|
|
2147
|
-
return {
|
|
2148
|
-
next(t) {
|
|
2149
|
-
return e += 1, {
|
|
2150
|
-
path: t,
|
|
2151
|
-
version: e
|
|
2152
|
-
};
|
|
2153
|
-
},
|
|
2154
|
-
invalidate() {
|
|
2155
|
-
e += 1;
|
|
2156
|
-
},
|
|
2157
|
-
isCurrent(t) {
|
|
2158
|
-
return !!t && t.version === e;
|
|
2159
|
-
}
|
|
2160
|
-
};
|
|
2161
|
-
}
|
|
2162
|
-
function tr({ workspaceFiles: e, accessMode: t }) {
|
|
2163
|
-
if (!e?.Enabled) return !1;
|
|
2164
|
-
let n = String(t || "").trim().toLowerCase();
|
|
2165
|
-
return n === "owner" || n === "private";
|
|
2166
|
-
}
|
|
2167
|
-
//#endregion
|
|
2168
|
-
//#region src/components/workspace/HtmlPreview.tsx
|
|
2169
|
-
function nr({ content: e, path: t, onSave: n, onDirtyChange: r, getContentRef: a, isMobile: o }) {
|
|
2170
|
-
let l = B(null), u = z(), [d, f] = V("preview"), p = Wn(t), m = Un(t), h = L(() => Pn(e, {
|
|
2171
|
-
basePath: p,
|
|
2172
|
-
channelId: u
|
|
2173
|
-
}), [
|
|
2174
|
-
e,
|
|
2175
|
-
p,
|
|
2176
|
-
u
|
|
2177
|
-
]), [g, _] = V(h());
|
|
2178
|
-
R(() => {
|
|
2179
|
-
let e = setTimeout(() => {
|
|
2180
|
-
_(h());
|
|
2181
|
-
}, 300);
|
|
2182
|
-
return () => clearTimeout(e);
|
|
2183
|
-
}, [h]), Fn(l, u);
|
|
2184
|
-
let v = L(() => {
|
|
2185
|
-
let e = new Blob([g], { type: "text/html;charset=utf-8" }), t = URL.createObjectURL(e), n = window.open(t, "_blank", "noopener,noreferrer");
|
|
2186
|
-
window.setTimeout(() => URL.revokeObjectURL(t), 3e4), n || window.open(m, "_blank", "noopener,noreferrer");
|
|
2187
|
-
}, [m, g]);
|
|
2188
|
-
return o ? /* @__PURE__ */ N("div", {
|
|
2189
|
-
className: "flex h-full flex-col",
|
|
2190
|
-
children: [/* @__PURE__ */ N("div", {
|
|
2191
|
-
className: "flex items-center gap-1 border-b border-slate-200 px-2 py-1.5 dark:border-slate-700",
|
|
2192
|
-
children: [/* @__PURE__ */ N("button", {
|
|
2193
|
-
onClick: () => f("editor"),
|
|
2194
|
-
className: J("flex items-center gap-1.5 rounded-md px-3 py-1 text-xs font-medium transition-colors", d === "editor" ? "bg-slate-100 text-slate-900 dark:bg-slate-700 dark:text-slate-100" : "text-slate-500 hover:bg-slate-50 dark:text-slate-400 dark:hover:bg-slate-800"),
|
|
2195
|
-
children: [/* @__PURE__ */ M(i, { className: "h-3.5 w-3.5" }), "编辑"]
|
|
2196
|
-
}), /* @__PURE__ */ N("button", {
|
|
2197
|
-
onClick: () => f("preview"),
|
|
2198
|
-
className: J("flex items-center gap-1.5 rounded-md px-3 py-1 text-xs font-medium transition-colors", d === "preview" ? "bg-slate-100 text-slate-900 dark:bg-slate-700 dark:text-slate-100" : "text-slate-500 hover:bg-slate-50 dark:text-slate-400 dark:hover:bg-slate-800"),
|
|
2199
|
-
children: [/* @__PURE__ */ M(c, { className: "h-3.5 w-3.5" }), "预览"]
|
|
2200
|
-
})]
|
|
2201
|
-
}), d === "editor" ? /* @__PURE__ */ M(Q, {
|
|
2202
|
-
content: e,
|
|
2203
|
-
path: t,
|
|
2204
|
-
onSave: n,
|
|
2205
|
-
onDirtyChange: r,
|
|
2206
|
-
getContentRef: a
|
|
2207
|
-
}) : /* @__PURE__ */ M("iframe", {
|
|
2208
|
-
ref: l,
|
|
2209
|
-
srcDoc: g,
|
|
2210
|
-
sandbox: "allow-scripts allow-downloads allow-same-origin",
|
|
2211
|
-
title: "HTML 预览",
|
|
2212
|
-
className: "h-full w-full border-0 bg-white"
|
|
2213
|
-
})]
|
|
2214
|
-
}) : d === "editor" ? /* @__PURE__ */ N("div", {
|
|
2215
|
-
className: "relative flex h-full flex-col",
|
|
2216
|
-
children: [/* @__PURE__ */ M(Q, {
|
|
2217
|
-
content: e,
|
|
2218
|
-
path: t,
|
|
2219
|
-
onSave: n,
|
|
2220
|
-
onDirtyChange: r,
|
|
2221
|
-
getContentRef: a
|
|
2222
|
-
}), /* @__PURE__ */ N("button", {
|
|
2223
|
-
onClick: () => f("preview"),
|
|
2224
|
-
className: "absolute right-3 top-3 z-10 inline-flex items-center gap-1.5 rounded-lg border border-slate-200 bg-white/90 px-2.5 py-1.5 text-xs font-medium text-slate-600 shadow-sm backdrop-blur-sm transition hover:bg-slate-50 dark:border-slate-700 dark:bg-slate-800/90 dark:text-slate-300 dark:hover:bg-slate-700",
|
|
2225
|
-
children: [/* @__PURE__ */ M(c, { className: "h-3.5 w-3.5" }), "预览"]
|
|
2226
|
-
})]
|
|
2227
|
-
}) : /* @__PURE__ */ N("div", {
|
|
2228
|
-
className: "relative flex h-full flex-col",
|
|
2229
|
-
children: [/* @__PURE__ */ M("iframe", {
|
|
2230
|
-
ref: l,
|
|
2231
|
-
srcDoc: g,
|
|
2232
|
-
sandbox: "allow-scripts allow-downloads allow-same-origin",
|
|
2233
|
-
title: "HTML 预览",
|
|
2234
|
-
className: "h-full w-full border-0 bg-white"
|
|
2235
|
-
}), /* @__PURE__ */ N("div", {
|
|
2236
|
-
className: "absolute right-3 top-3 z-10 flex gap-1.5",
|
|
2237
|
-
children: [/* @__PURE__ */ N("button", {
|
|
2238
|
-
onClick: v,
|
|
2239
|
-
className: "inline-flex items-center gap-1.5 rounded-lg border border-slate-200 bg-white/90 px-2.5 py-1.5 text-xs font-medium text-slate-600 shadow-sm backdrop-blur-sm transition hover:bg-slate-50 dark:border-slate-700 dark:bg-slate-800/90 dark:text-slate-300 dark:hover:bg-slate-700",
|
|
2240
|
-
title: "在新窗口中打开当前预览",
|
|
2241
|
-
children: [/* @__PURE__ */ M(s, { className: "h-3.5 w-3.5" }), "新窗口"]
|
|
2242
|
-
}), /* @__PURE__ */ N("button", {
|
|
2243
|
-
onClick: () => f("editor"),
|
|
2244
|
-
className: "inline-flex items-center gap-1.5 rounded-lg border border-slate-200 bg-white/90 px-2.5 py-1.5 text-xs font-medium text-slate-600 shadow-sm backdrop-blur-sm transition hover:bg-slate-50 dark:border-slate-700 dark:bg-slate-800/90 dark:text-slate-300 dark:hover:bg-slate-700",
|
|
2245
|
-
children: [/* @__PURE__ */ M(i, { className: "h-3.5 w-3.5" }), "编辑"]
|
|
2246
|
-
})]
|
|
2247
|
-
})]
|
|
2248
|
-
});
|
|
2249
|
-
}
|
|
2250
|
-
//#endregion
|
|
2251
|
-
//#region src/components/workspace/MarkdownPreview.tsx
|
|
2252
|
-
function rr(e) {
|
|
2253
|
-
e.current && clearTimeout(e.current);
|
|
2254
|
-
}
|
|
2255
|
-
function ir({ content: e, path: t, onSave: n, onDirtyChange: r, getContentRef: a, isMobile: o }) {
|
|
2256
|
-
let [s, l] = V("editor"), [u, d] = V(e), f = B(null);
|
|
2257
|
-
return R(() => (rr(f), f.current = setTimeout(() => d(e), 300), () => rr(f)), [e]), o ? /* @__PURE__ */ N("div", {
|
|
2258
|
-
className: "flex h-full flex-col",
|
|
2259
|
-
children: [/* @__PURE__ */ N("div", {
|
|
2260
|
-
className: "flex items-center gap-1 border-b border-slate-200/30 px-2 py-1.5 dark:border-slate-700/30",
|
|
2261
|
-
children: [/* @__PURE__ */ N("button", {
|
|
2262
|
-
onClick: () => l("editor"),
|
|
2263
|
-
className: J("flex items-center gap-1.5 rounded-md px-3 py-1 text-xs font-medium transition-colors", s === "editor" ? "bg-slate-100 text-slate-900 dark:bg-slate-700 dark:text-slate-100" : "text-slate-500 hover:bg-slate-50 dark:text-slate-400 dark:hover:bg-slate-800"),
|
|
2264
|
-
children: [/* @__PURE__ */ M(i, { className: "h-3.5 w-3.5" }), "编辑"]
|
|
2265
|
-
}), /* @__PURE__ */ N("button", {
|
|
2266
|
-
onClick: () => l("preview"),
|
|
2267
|
-
className: J("flex items-center gap-1.5 rounded-md px-3 py-1 text-xs font-medium transition-colors", s === "preview" ? "bg-slate-100 text-slate-900 dark:bg-slate-700 dark:text-slate-100" : "text-slate-500 hover:bg-slate-50 dark:text-slate-400 dark:hover:bg-slate-800"),
|
|
2268
|
-
children: [/* @__PURE__ */ M(c, { className: "h-3.5 w-3.5" }), "预览"]
|
|
2269
|
-
})]
|
|
2270
|
-
}), s === "editor" ? /* @__PURE__ */ M(Q, {
|
|
2271
|
-
content: e,
|
|
2272
|
-
path: t,
|
|
2273
|
-
onSave: n,
|
|
2274
|
-
onDirtyChange: r,
|
|
2275
|
-
getContentRef: a
|
|
2276
|
-
}) : /* @__PURE__ */ M("div", {
|
|
2277
|
-
className: "flex-1 overflow-auto p-4",
|
|
2278
|
-
children: /* @__PURE__ */ M(X, { content: u })
|
|
2279
|
-
})]
|
|
2280
|
-
}) : s === "editor" ? /* @__PURE__ */ N("div", {
|
|
2281
|
-
className: "relative flex h-full flex-col",
|
|
2282
|
-
children: [/* @__PURE__ */ M(Q, {
|
|
2283
|
-
content: e,
|
|
2284
|
-
path: t,
|
|
2285
|
-
onSave: n,
|
|
2286
|
-
onDirtyChange: r,
|
|
2287
|
-
getContentRef: a
|
|
2288
|
-
}), /* @__PURE__ */ N("button", {
|
|
2289
|
-
onClick: () => l("preview"),
|
|
2290
|
-
className: "absolute right-3 top-3 z-10 inline-flex items-center gap-1.5 rounded-lg border border-slate-200/30 bg-white/90 px-2.5 py-1.5 text-xs font-medium text-slate-600 shadow-sm backdrop-blur-sm transition hover:bg-slate-50 dark:border-slate-700 dark:bg-slate-800/90 dark:text-slate-300 dark:hover:bg-slate-700",
|
|
2291
|
-
children: [/* @__PURE__ */ M(c, { className: "h-3.5 w-3.5" }), "预览"]
|
|
2292
|
-
})]
|
|
2293
|
-
}) : /* @__PURE__ */ N("div", {
|
|
2294
|
-
className: "relative flex h-full flex-col",
|
|
2295
|
-
children: [/* @__PURE__ */ M("div", {
|
|
2296
|
-
className: "flex-1 overflow-auto p-4",
|
|
2297
|
-
children: /* @__PURE__ */ M(X, { content: u })
|
|
2298
|
-
}), /* @__PURE__ */ N("button", {
|
|
2299
|
-
onClick: () => l("editor"),
|
|
2300
|
-
className: "absolute right-3 top-3 z-10 inline-flex items-center gap-1.5 rounded-lg border border-slate-200/30 bg-white/90 px-2.5 py-1.5 text-xs font-medium text-slate-600 shadow-sm backdrop-blur-sm transition hover:bg-slate-50 dark:border-slate-700 dark:bg-slate-800/90 dark:text-slate-300 dark:hover:bg-slate-700",
|
|
2301
|
-
children: [/* @__PURE__ */ M(i, { className: "h-3.5 w-3.5" }), "编辑"]
|
|
2302
|
-
})]
|
|
2303
|
-
});
|
|
2304
|
-
}
|
|
2305
|
-
//#endregion
|
|
2306
|
-
//#region src/components/workspace/WorkspacePanel.tsx
|
|
2307
|
-
var ar = "/agentengine/api/v1/GetWorkspaceFileContent", or = 4e3;
|
|
2308
|
-
function sr(e) {
|
|
2309
|
-
let t = $(e);
|
|
2310
|
-
if (!t || t === ".") return ".";
|
|
2311
|
-
let n = t.split("/").filter(Boolean);
|
|
2312
|
-
return n.length <= 1 ? "." : n.slice(0, -1).join("/");
|
|
2313
|
-
}
|
|
2314
|
-
function cr(e) {
|
|
2315
|
-
if (!e) return "";
|
|
2316
|
-
let t = Date.parse(e);
|
|
2317
|
-
return Number.isNaN(t) ? e : new Date(t).toLocaleString();
|
|
2318
|
-
}
|
|
2319
|
-
function lr(e) {
|
|
2320
|
-
let t = Number(e);
|
|
2321
|
-
return !Number.isFinite(t) || t <= 0 ? "0 B" : t < 1024 ? `${t} B` : t < 1024 * 1024 ? `${(t / 1024).toFixed(1)} KB` : t < 1024 * 1024 * 1024 ? `${(t / (1024 * 1024)).toFixed(1)} MB` : `${(t / (1024 * 1024 * 1024)).toFixed(1)} GB`;
|
|
2322
|
-
}
|
|
2323
|
-
var ur = [
|
|
2324
|
-
{
|
|
2325
|
-
label: "Markdown",
|
|
2326
|
-
detail: ".md .markdown .mdx"
|
|
2327
|
-
},
|
|
2328
|
-
{
|
|
2329
|
-
label: "代码/文本",
|
|
2330
|
-
detail: ".py .js .ts .tsx .json .yaml .log .txt"
|
|
2331
|
-
},
|
|
2332
|
-
{
|
|
2333
|
-
label: "图片",
|
|
2334
|
-
detail: "PNG JPG GIF WebP SVG"
|
|
2335
|
-
},
|
|
2336
|
-
{
|
|
2337
|
-
label: "PDF",
|
|
2338
|
-
detail: ".pdf"
|
|
2339
|
-
},
|
|
2340
|
-
{
|
|
2341
|
-
label: "表格文本",
|
|
2342
|
-
detail: "CSV TSV"
|
|
2343
|
-
}
|
|
2344
|
-
];
|
|
2345
|
-
function dr(e) {
|
|
2346
|
-
return Un(e);
|
|
2347
|
-
}
|
|
2348
|
-
function fr({ label: e, showSupportedTypes: t = !1 }) {
|
|
2349
|
-
return /* @__PURE__ */ M("div", {
|
|
2350
|
-
className: "flex h-full min-h-[16rem] flex-col items-center justify-center px-6 text-center",
|
|
2351
|
-
children: /* @__PURE__ */ N("div", {
|
|
2352
|
-
className: "w-full max-w-md rounded-2xl border border-dashed border-slate-300 bg-slate-50 px-5 py-5 text-slate-500 dark:border-slate-700 dark:bg-slate-900 dark:text-slate-400",
|
|
2353
|
-
children: [/* @__PURE__ */ M("div", { children: e }), t ? /* @__PURE__ */ N("div", {
|
|
2354
|
-
className: "mt-4 text-left",
|
|
2355
|
-
children: [
|
|
2356
|
-
/* @__PURE__ */ M("div", {
|
|
2357
|
-
className: "text-xs font-semibold uppercase tracking-[0.12em] text-slate-400",
|
|
2358
|
-
children: "支持在线预览"
|
|
2359
|
-
}),
|
|
2360
|
-
/* @__PURE__ */ M("div", {
|
|
2361
|
-
className: "mt-2 grid gap-2",
|
|
2362
|
-
children: ur.map((e) => /* @__PURE__ */ N("div", {
|
|
2363
|
-
className: "rounded-xl border border-slate-200 bg-white px-3 py-2 dark:border-slate-800 dark:bg-slate-950",
|
|
2364
|
-
children: [/* @__PURE__ */ M("div", {
|
|
2365
|
-
className: "text-sm font-medium text-slate-700 dark:text-slate-200",
|
|
2366
|
-
children: e.label
|
|
2367
|
-
}), /* @__PURE__ */ M("div", {
|
|
2368
|
-
className: "mt-0.5 font-mono text-[11px] text-slate-400",
|
|
2369
|
-
children: e.detail
|
|
2370
|
-
})]
|
|
2371
|
-
}, e.label))
|
|
2372
|
-
}),
|
|
2373
|
-
/* @__PURE__ */ M("div", {
|
|
2374
|
-
className: "mt-3 text-xs leading-5 text-slate-400",
|
|
2375
|
-
children: "Word、Excel、PPT 当前不支持在线预览,可下载后查看。"
|
|
2376
|
-
})
|
|
2377
|
-
]
|
|
2378
|
-
}) : null]
|
|
2379
|
-
})
|
|
2380
|
-
});
|
|
2381
|
-
}
|
|
2382
|
-
function pr({ agentId: t, capability: n, open: r, onClose: i, isFullscreen: a = !1, onToggleFullscreen: s, isMobile: c = !1, api: m }) {
|
|
2383
|
-
let g = B(null), v = B(null), [b, ee] = V(!1), [x, te] = V("."), [S, ne] = V([]), [C, w] = V(!1), [ae, T] = V(!1), [E, D] = V(!1), [oe, O] = V(""), [k, ue] = V(null), [A, j] = V(null), [P, F] = V(!1), [I, de] = V(!1), z = B(null), fe = B(null), H = B("selection"), U = B(er()), W = pe(() => S.find((e) => e.Path === k) ?? null, [S, k]), me = pe(() => W ? Qn({
|
|
2384
|
-
path: W.Path,
|
|
2385
|
-
mimeType: W.MimeType
|
|
2386
|
-
}) : null, [W]), he = L(() => P ? window.confirm("当前文件有未保存的更改,确定要离开吗?") : !0, [P]), ge = n.ContentPath || ar, _e = n.RootLabel || "Workspace", ve = _e ? `${_e.charAt(0).toUpperCase()}${_e.slice(1)}` : "Workspace", ye = Kn(x), G = L(() => {
|
|
2387
|
-
v.current &&= (URL.revokeObjectURL(v.current), null);
|
|
2388
|
-
}, []);
|
|
2389
|
-
R(() => () => G(), [G]);
|
|
2390
|
-
let K = L(async (e, n = {}) => {
|
|
2391
|
-
let r = !!n.background;
|
|
2392
|
-
r ? T(!0) : w(!0), r || O("");
|
|
2393
|
-
try {
|
|
2394
|
-
let n = await m.listWorkspaceFiles(t, e, !1), i = $(String(n?.Path || e || ".")), a = Array.isArray(n?.Entries) ? n.Entries : [];
|
|
2395
|
-
te(i), ne(a), H.current = r ? "background-refresh" : "selection", ue((e) => {
|
|
2396
|
-
if (e) {
|
|
2397
|
-
let t = a.find((t) => t.Path === e);
|
|
2398
|
-
if (t && t.Type === "file") return e;
|
|
2399
|
-
}
|
|
2400
|
-
return a.find((e) => e.Type === "file")?.Path ?? null;
|
|
2401
|
-
});
|
|
2402
|
-
} catch (e) {
|
|
2403
|
-
console.error("Failed to load workspace entries:", e), r || O(e instanceof Error ? e.message : String(e));
|
|
2404
|
-
} finally {
|
|
2405
|
-
r ? T(!1) : w(!1);
|
|
2406
|
-
}
|
|
2407
|
-
}, [t, m]);
|
|
2408
|
-
R(() => {
|
|
2409
|
-
!r || b || (ee(!0), K("."));
|
|
2410
|
-
}, [
|
|
2411
|
-
b,
|
|
2412
|
-
K,
|
|
2413
|
-
r
|
|
2414
|
-
]), R(() => {
|
|
2415
|
-
if (!r || P || !b) return;
|
|
2416
|
-
let e = window.setInterval(() => {
|
|
2417
|
-
K(x, { background: !0 });
|
|
2418
|
-
}, or);
|
|
2419
|
-
return () => window.clearInterval(e);
|
|
2420
|
-
}, [
|
|
2421
|
-
x,
|
|
2422
|
-
P,
|
|
2423
|
-
b,
|
|
2424
|
-
K,
|
|
2425
|
-
r
|
|
2426
|
-
]);
|
|
2427
|
-
let be = L(async (e) => {
|
|
2428
|
-
let n = U.current.next(e.Path), r = Xn({
|
|
2429
|
-
path: e.Path,
|
|
2430
|
-
mimeType: e.MimeType
|
|
2431
|
-
});
|
|
2432
|
-
if (fe.current = e.Path, r === "unsupported") {
|
|
2433
|
-
G(), j({
|
|
2434
|
-
path: e.Path,
|
|
2435
|
-
kind: r,
|
|
2436
|
-
status: "ready",
|
|
2437
|
-
mimeType: e.MimeType ?? void 0
|
|
2438
|
-
});
|
|
2439
|
-
return;
|
|
2440
|
-
}
|
|
2441
|
-
G(), j({
|
|
2442
|
-
path: e.Path,
|
|
2443
|
-
kind: r,
|
|
2444
|
-
status: "loading",
|
|
2445
|
-
mimeType: e.MimeType ?? void 0
|
|
2446
|
-
});
|
|
2447
|
-
try {
|
|
2448
|
-
let r = await m.getWorkspaceFileContent(t, e.Path, { asText: !1 });
|
|
2449
|
-
if (!U.current.isCurrent(n)) return;
|
|
2450
|
-
if (r instanceof Blob) {
|
|
2451
|
-
let t = e.MimeType || "", i = Xn({
|
|
2452
|
-
path: e.Path,
|
|
2453
|
-
mimeType: t
|
|
2454
|
-
});
|
|
2455
|
-
if (i === "image" || i === "pdf") {
|
|
2456
|
-
let n = URL.createObjectURL(r);
|
|
2457
|
-
v.current = n, j({
|
|
2458
|
-
path: e.Path,
|
|
2459
|
-
kind: i,
|
|
2460
|
-
status: "ready",
|
|
2461
|
-
mimeType: t,
|
|
2462
|
-
objectUrl: n
|
|
2463
|
-
});
|
|
2464
|
-
return;
|
|
2465
|
-
}
|
|
2466
|
-
let a = await r.text();
|
|
2467
|
-
if (!U.current.isCurrent(n)) return;
|
|
2468
|
-
let o = Xn({
|
|
2469
|
-
path: e.Path,
|
|
2470
|
-
mimeType: t
|
|
2471
|
-
});
|
|
2472
|
-
j({
|
|
2473
|
-
path: e.Path,
|
|
2474
|
-
kind: o,
|
|
2475
|
-
status: "ready",
|
|
2476
|
-
mimeType: t,
|
|
2477
|
-
content: a
|
|
2478
|
-
});
|
|
2479
|
-
} else {
|
|
2480
|
-
let t = e.MimeType || "", n = Xn({
|
|
2481
|
-
path: e.Path,
|
|
2482
|
-
mimeType: t
|
|
2483
|
-
});
|
|
2484
|
-
j({
|
|
2485
|
-
path: e.Path,
|
|
2486
|
-
kind: n,
|
|
2487
|
-
status: "ready",
|
|
2488
|
-
mimeType: t,
|
|
2489
|
-
content: r
|
|
2490
|
-
});
|
|
2491
|
-
}
|
|
2492
|
-
} catch (t) {
|
|
2493
|
-
if (!U.current.isCurrent(n)) return;
|
|
2494
|
-
console.error("Failed to preview workspace file:", t), j({
|
|
2495
|
-
path: e.Path,
|
|
2496
|
-
kind: r,
|
|
2497
|
-
status: "error",
|
|
2498
|
-
mimeType: e.MimeType ?? void 0,
|
|
2499
|
-
error: t instanceof Error ? t.message : String(t)
|
|
2500
|
-
});
|
|
2501
|
-
}
|
|
2502
|
-
}, [
|
|
2503
|
-
t,
|
|
2504
|
-
m,
|
|
2505
|
-
G
|
|
2506
|
-
]);
|
|
2507
|
-
R(() => {
|
|
2508
|
-
if (!W || W.Type !== "file") {
|
|
2509
|
-
G(), j(null), F(!1), fe.current = null;
|
|
2510
|
-
return;
|
|
2511
|
-
}
|
|
2512
|
-
if (H.current === "background-refresh" && fe.current === W.Path) {
|
|
2513
|
-
H.current = "selection";
|
|
2514
|
-
return;
|
|
2515
|
-
}
|
|
2516
|
-
H.current = "selection", be(W);
|
|
2517
|
-
}, [
|
|
2518
|
-
G,
|
|
2519
|
-
be,
|
|
2520
|
-
W
|
|
2521
|
-
]);
|
|
2522
|
-
let xe = async (e) => {
|
|
2523
|
-
if (!(!e || e.length === 0)) {
|
|
2524
|
-
D(!0), O("");
|
|
2525
|
-
try {
|
|
2526
|
-
for (let r of Array.from(e)) {
|
|
2527
|
-
if (r.size > n.MaxUploadBytes) throw Error(`文件 ${r.name} 超过上传上限`);
|
|
2528
|
-
let e = Gn(x) ? r.name : `${x}/${r.name}`, i = new FormData();
|
|
2529
|
-
i.append("file", r), i.append("AgentId", t), i.append("Path", e), await m.addWorkspaceFile(i);
|
|
2530
|
-
}
|
|
2531
|
-
await K(x);
|
|
2532
|
-
} catch (e) {
|
|
2533
|
-
console.error("Failed to upload workspace files:", e), O(e instanceof Error ? e.message : String(e));
|
|
2534
|
-
} finally {
|
|
2535
|
-
g.current && (g.current.value = ""), D(!1);
|
|
2536
|
-
}
|
|
2537
|
-
}
|
|
2538
|
-
}, Se = async (e) => {
|
|
2539
|
-
if (!n.SupportsDelete) return;
|
|
2540
|
-
let r = $(e.Path);
|
|
2541
|
-
if (window.confirm(`删除 ${r} ?`)) {
|
|
2542
|
-
O("");
|
|
2543
|
-
try {
|
|
2544
|
-
await m.deleteWorkspaceFile(t, r), k && $(k) === r && (ue(null), F(!1)), await K(e.Type === "directory" && ($(x) === r || $(x).startsWith(`${r}/`)) ? sr(r) : x);
|
|
2545
|
-
} catch (e) {
|
|
2546
|
-
console.error("Failed to delete workspace file:", e), O(e instanceof Error ? e.message : String(e));
|
|
2547
|
-
}
|
|
2548
|
-
}
|
|
2549
|
-
}, Ce = () => !W || W.Type !== "file" ? /* @__PURE__ */ M(fr, {
|
|
2550
|
-
label: "从左侧选择文件后在这里查看内容预览。",
|
|
2551
|
-
showSupportedTypes: !0
|
|
2552
|
-
}) : !A || A.path !== W.Path || A.status === "loading" ? /* @__PURE__ */ M("div", {
|
|
2553
|
-
className: "flex h-full min-h-[16rem] items-center justify-center",
|
|
2554
|
-
children: /* @__PURE__ */ N("div", {
|
|
2555
|
-
className: "inline-flex items-center gap-2 rounded-full border border-slate-200 bg-white px-4 py-2 text-sm text-slate-500 shadow-sm dark:border-slate-800 dark:bg-slate-900 dark:text-slate-400",
|
|
2556
|
-
children: [/* @__PURE__ */ M(p, { className: "h-4 w-4 animate-spin" }), "正在加载预览..."]
|
|
2557
|
-
})
|
|
2558
|
-
}) : A.status === "error" ? /* @__PURE__ */ M(fr, { label: A.error || "文件预览加载失败。" }) : A.kind === "markdown" ? /* @__PURE__ */ M(ir, {
|
|
2559
|
-
content: A.content || "",
|
|
2560
|
-
path: W.Path,
|
|
2561
|
-
onSave: q,
|
|
2562
|
-
onDirtyChange: F,
|
|
2563
|
-
getContentRef: z,
|
|
2564
|
-
isMobile: c
|
|
2565
|
-
}) : A.kind === "image" && A.objectUrl ? /* @__PURE__ */ M(On, {
|
|
2566
|
-
content: null,
|
|
2567
|
-
objectUrl: A.objectUrl,
|
|
2568
|
-
kind: "image",
|
|
2569
|
-
filename: W.Name,
|
|
2570
|
-
mimeType: A.mimeType || ""
|
|
2571
|
-
}) : A.kind === "pdf" && A.objectUrl ? /* @__PURE__ */ M(On, {
|
|
2572
|
-
content: null,
|
|
2573
|
-
objectUrl: A.objectUrl,
|
|
2574
|
-
kind: "pdf",
|
|
2575
|
-
filename: W.Name,
|
|
2576
|
-
mimeType: A.mimeType || ""
|
|
2577
|
-
}) : A.kind === "html" ? /* @__PURE__ */ M(nr, {
|
|
2578
|
-
content: A.content || "",
|
|
2579
|
-
path: W.Path,
|
|
2580
|
-
onSave: q,
|
|
2581
|
-
onDirtyChange: F,
|
|
2582
|
-
getContentRef: z,
|
|
2583
|
-
isMobile: c,
|
|
2584
|
-
agentId: t,
|
|
2585
|
-
contentPath: ge
|
|
2586
|
-
}) : A.kind === "text" || A.kind === "code" ? /* @__PURE__ */ M(Q, {
|
|
2587
|
-
content: A.content || "",
|
|
2588
|
-
path: W.Path,
|
|
2589
|
-
onSave: q,
|
|
2590
|
-
onDirtyChange: F,
|
|
2591
|
-
getContentRef: z
|
|
2592
|
-
}) : /* @__PURE__ */ M(On, {
|
|
2593
|
-
content: null,
|
|
2594
|
-
kind: "unsupported",
|
|
2595
|
-
filename: W.Name,
|
|
2596
|
-
mimeType: A.mimeType || ""
|
|
2597
|
-
}), q = async (e) => {
|
|
2598
|
-
if (W) {
|
|
2599
|
-
de(!0), O("");
|
|
2600
|
-
try {
|
|
2601
|
-
let n = new Blob([e], { type: W.MimeType || "text/plain" }), r = new FormData();
|
|
2602
|
-
r.append("file", n, W.Name), r.append("AgentId", t), r.append("Path", W.Path), await m.addWorkspaceFile(r), U.current.invalidate(), F(!1), j((t) => t && t.path === W.Path ? {
|
|
2603
|
-
...t,
|
|
2604
|
-
content: e
|
|
2605
|
-
} : t), fe.current = W.Path, await K(x, { background: !0 });
|
|
2606
|
-
} catch (e) {
|
|
2607
|
-
console.error("Failed to save workspace file:", e), O(e instanceof Error ? e.message : String(e));
|
|
2608
|
-
} finally {
|
|
2609
|
-
de(!1);
|
|
2610
|
-
}
|
|
2611
|
-
}
|
|
2612
|
-
}, we = W?.Type === "file" && A?.path === W.Path && A.status === "ready" && (A.kind === "text" || A.kind === "code" || A.kind === "html" || A.kind === "markdown"), Te = W?.Type === "file" && A?.path === W.Path && A.status === "ready" && A.kind === "pdf";
|
|
2613
|
-
return /* @__PURE__ */ N("div", {
|
|
2614
|
-
className: "flex h-full min-h-[22rem] w-full min-w-0 flex-col bg-white text-slate-800 dark:bg-slate-950 dark:text-slate-200",
|
|
2615
|
-
children: [/* @__PURE__ */ N("div", {
|
|
2616
|
-
className: "flex h-14 flex-shrink-0 items-center gap-3 border-b border-slate-200/30 px-4 dark:border-slate-800/40",
|
|
2617
|
-
children: [/* @__PURE__ */ N("div", {
|
|
2618
|
-
className: "flex min-w-0 flex-1 items-center gap-3",
|
|
2619
|
-
children: [
|
|
2620
|
-
/* @__PURE__ */ M("div", {
|
|
2621
|
-
className: "truncate text-sm font-semibold text-slate-900 dark:text-slate-100",
|
|
2622
|
-
children: ve
|
|
2623
|
-
}),
|
|
2624
|
-
/* @__PURE__ */ M("div", { className: "hidden h-4 w-px bg-slate-200/70 dark:bg-slate-800 sm:block" }),
|
|
2625
|
-
/* @__PURE__ */ N("div", {
|
|
2626
|
-
className: "flex min-w-0 items-center gap-2",
|
|
2627
|
-
children: [/* @__PURE__ */ M("span", {
|
|
2628
|
-
className: "flex-shrink-0 text-xs text-slate-400",
|
|
2629
|
-
children: "当前目录"
|
|
2630
|
-
}), /* @__PURE__ */ M("div", {
|
|
2631
|
-
className: "custom-scrollbar max-w-[min(42vw,34rem)] overflow-x-auto whitespace-nowrap rounded-md bg-slate-50 px-2 py-1 font-mono text-[11px] text-slate-600 dark:bg-slate-900 dark:text-slate-300",
|
|
2632
|
-
title: `${ye},来自 ListWorkspaceFiles 返回的 Data.Path 字段`,
|
|
2633
|
-
children: ye
|
|
2634
|
-
})]
|
|
2635
|
-
}),
|
|
2636
|
-
/* @__PURE__ */ M("div", {
|
|
2637
|
-
className: "hidden truncate text-[11px] text-slate-400 xl:block",
|
|
2638
|
-
children: "工作区内相对路径,不是宿主机绝对路径。"
|
|
2639
|
-
})
|
|
2640
|
-
]
|
|
2641
|
-
}), /* @__PURE__ */ N("div", {
|
|
2642
|
-
className: "flex flex-shrink-0 items-center gap-1.5",
|
|
2643
|
-
children: [
|
|
2644
|
-
/* @__PURE__ */ M("input", {
|
|
2645
|
-
ref: g,
|
|
2646
|
-
type: "file",
|
|
2647
|
-
multiple: !0,
|
|
2648
|
-
className: "hidden",
|
|
2649
|
-
onChange: (e) => void xe(e.target.files)
|
|
2650
|
-
}),
|
|
2651
|
-
/* @__PURE__ */ N("button", {
|
|
2652
|
-
type: "button",
|
|
2653
|
-
onClick: () => g.current?.click(),
|
|
2654
|
-
disabled: E,
|
|
2655
|
-
className: "inline-flex items-center gap-1.5 rounded-lg px-2.5 py-1.5 text-xs font-medium text-slate-600 transition hover:bg-slate-100 disabled:cursor-not-allowed disabled:opacity-50 dark:text-slate-300 dark:hover:bg-slate-900",
|
|
2656
|
-
title: `上传文件,上限 ${Math.floor(n.MaxUploadBytes / (1024 * 1024))}MB`,
|
|
2657
|
-
children: [/* @__PURE__ */ M(ce, { className: "h-3.5 w-3.5" }), E ? "上传中" : "上传"]
|
|
2658
|
-
}),
|
|
2659
|
-
/* @__PURE__ */ N("button", {
|
|
2660
|
-
type: "button",
|
|
2661
|
-
onClick: () => {
|
|
2662
|
-
let e = new URLSearchParams({ Path: x }).toString();
|
|
2663
|
-
window.open(`/agentengine/api/v1/ExportWorkspaceZip?${e}`, "_blank", "noopener,noreferrer");
|
|
2664
|
-
},
|
|
2665
|
-
className: "inline-flex items-center gap-1.5 rounded-lg px-2.5 py-1.5 text-xs font-medium text-slate-600 transition hover:bg-slate-100 dark:text-slate-300 dark:hover:bg-slate-900",
|
|
2666
|
-
title: "导出当前目录为 ZIP",
|
|
2667
|
-
children: [/* @__PURE__ */ M(y, { className: "h-3.5 w-3.5" }), "导出"]
|
|
2668
|
-
}),
|
|
2669
|
-
s ? /* @__PURE__ */ M("button", {
|
|
2670
|
-
type: "button",
|
|
2671
|
-
onClick: s,
|
|
2672
|
-
className: "rounded-lg p-1.5 text-slate-500 transition hover:bg-slate-100 hover:text-slate-900 dark:text-slate-400 dark:hover:bg-slate-900 dark:hover:text-slate-100",
|
|
2673
|
-
"aria-label": a ? "退出全屏" : "全屏查看 Workspace",
|
|
2674
|
-
title: a ? "退出全屏" : "全屏查看",
|
|
2675
|
-
children: M(a ? _ : h, { className: "h-4 w-4" })
|
|
2676
|
-
}) : null,
|
|
2677
|
-
i ? /* @__PURE__ */ M("button", {
|
|
2678
|
-
type: "button",
|
|
2679
|
-
onClick: () => {
|
|
2680
|
-
he() && i?.();
|
|
2681
|
-
},
|
|
2682
|
-
className: "rounded-lg p-1.5 text-slate-500 transition hover:bg-slate-100 hover:text-slate-900 dark:text-slate-400 dark:hover:bg-slate-900 dark:hover:text-slate-100",
|
|
2683
|
-
"aria-label": "关闭 Workspace",
|
|
2684
|
-
title: "关闭",
|
|
2685
|
-
children: /* @__PURE__ */ M(le, { className: "h-4 w-4" })
|
|
2686
|
-
}) : null
|
|
2687
|
-
]
|
|
2688
|
-
})]
|
|
2689
|
-
}), /* @__PURE__ */ N("div", {
|
|
2690
|
-
className: "flex min-h-0 flex-1 flex-col md:flex-row",
|
|
2691
|
-
children: [/* @__PURE__ */ N("div", {
|
|
2692
|
-
className: "flex w-full flex-col border-b border-slate-200/30 dark:border-slate-800/40 md:w-[13.5rem] md:border-b-0 md:border-r",
|
|
2693
|
-
children: [/* @__PURE__ */ N("div", {
|
|
2694
|
-
className: "flex h-14 flex-shrink-0 items-center border-b border-slate-200/30 px-3 dark:border-slate-800/40",
|
|
2695
|
-
children: [/* @__PURE__ */ N("div", {
|
|
2696
|
-
className: "flex items-center justify-between gap-2",
|
|
2697
|
-
children: [/* @__PURE__ */ N("div", {
|
|
2698
|
-
className: "min-w-0",
|
|
2699
|
-
children: [/* @__PURE__ */ M("div", {
|
|
2700
|
-
className: "text-xs font-medium text-slate-900 dark:text-slate-100",
|
|
2701
|
-
children: "文件"
|
|
2702
|
-
}), /* @__PURE__ */ N("div", {
|
|
2703
|
-
className: "flex items-center gap-1 text-[11px] text-slate-400",
|
|
2704
|
-
children: [/* @__PURE__ */ N("span", { children: [S.length, " 项"] }), ae ? /* @__PURE__ */ M(re, {
|
|
2705
|
-
className: "h-3 w-3 animate-spin",
|
|
2706
|
-
"aria-label": "正在同步 Workspace 目录"
|
|
2707
|
-
}) : null]
|
|
2708
|
-
})]
|
|
2709
|
-
}), /* @__PURE__ */ N("div", {
|
|
2710
|
-
className: "flex items-center gap-1",
|
|
2711
|
-
children: [/* @__PURE__ */ M("button", {
|
|
2712
|
-
type: "button",
|
|
2713
|
-
onClick: () => {
|
|
2714
|
-
he() && K(sr(x));
|
|
2715
|
-
},
|
|
2716
|
-
disabled: C || Gn(x),
|
|
2717
|
-
className: "rounded-md p-1.5 text-slate-500 transition hover:bg-slate-100 disabled:cursor-not-allowed disabled:opacity-40 dark:text-slate-400 dark:hover:bg-slate-900",
|
|
2718
|
-
title: "返回上级目录",
|
|
2719
|
-
children: /* @__PURE__ */ M(e, { className: "h-4 w-4" })
|
|
2720
|
-
}), /* @__PURE__ */ M("button", {
|
|
2721
|
-
type: "button",
|
|
2722
|
-
onClick: () => {
|
|
2723
|
-
he() && K(x);
|
|
2724
|
-
},
|
|
2725
|
-
disabled: C,
|
|
2726
|
-
className: "rounded-md p-1.5 text-slate-500 transition hover:bg-slate-100 disabled:cursor-not-allowed disabled:opacity-40 dark:text-slate-400 dark:hover:bg-slate-900",
|
|
2727
|
-
title: "刷新目录",
|
|
2728
|
-
children: /* @__PURE__ */ M(re, { className: `h-4 w-4 ${C ? "animate-spin" : ""}` })
|
|
2729
|
-
})]
|
|
2730
|
-
})]
|
|
2731
|
-
}), oe ? /* @__PURE__ */ M("div", {
|
|
2732
|
-
className: "mt-3 rounded-xl border border-red-200 bg-red-50 px-3 py-2 text-xs text-red-600 dark:border-red-900/60 dark:bg-red-950/40 dark:text-red-300",
|
|
2733
|
-
children: oe
|
|
2734
|
-
}) : null]
|
|
2735
|
-
}), /* @__PURE__ */ M("div", {
|
|
2736
|
-
className: "custom-scrollbar min-h-0 flex-1 overflow-y-auto px-2 py-2",
|
|
2737
|
-
children: !b && !r ? /* @__PURE__ */ M("div", {
|
|
2738
|
-
className: "px-3 py-4 text-sm text-slate-400",
|
|
2739
|
-
children: "打开面板后加载 workspace 文件。"
|
|
2740
|
-
}) : C ? /* @__PURE__ */ M("div", {
|
|
2741
|
-
className: "px-3 py-4 text-sm text-slate-400",
|
|
2742
|
-
children: "正在加载目录..."
|
|
2743
|
-
}) : S.length === 0 ? /* @__PURE__ */ M("div", {
|
|
2744
|
-
className: "px-3 py-4 text-sm text-slate-400",
|
|
2745
|
-
children: "当前目录为空。"
|
|
2746
|
-
}) : /* @__PURE__ */ M("div", {
|
|
2747
|
-
className: "space-y-0.5",
|
|
2748
|
-
children: S.map((e) => {
|
|
2749
|
-
let t = Xn({
|
|
2750
|
-
path: e.Path,
|
|
2751
|
-
mimeType: e.MimeType
|
|
2752
|
-
}), r = k === e.Path, i = e.Type === "file" ? dr(e.Path) : "";
|
|
2753
|
-
return /* @__PURE__ */ N("div", {
|
|
2754
|
-
title: e.Path,
|
|
2755
|
-
className: J("group flex items-center gap-1 rounded-lg px-1.5 py-1 transition", r ? "bg-slate-100 text-slate-950 dark:bg-slate-800 dark:text-slate-50" : "text-slate-700 hover:bg-slate-50 dark:text-slate-300 dark:hover:bg-slate-900"),
|
|
2756
|
-
children: [/* @__PURE__ */ N("button", {
|
|
2757
|
-
type: "button",
|
|
2758
|
-
onClick: () => {
|
|
2759
|
-
if (e.Type === "directory") {
|
|
2760
|
-
K(e.Path);
|
|
2761
|
-
return;
|
|
2762
|
-
}
|
|
2763
|
-
k !== e.Path && !he() || ue(e.Path);
|
|
2764
|
-
},
|
|
2765
|
-
className: "flex min-w-0 flex-1 items-center gap-2 text-left",
|
|
2766
|
-
children: [/* @__PURE__ */ M("div", {
|
|
2767
|
-
className: J("flex h-5 w-5 flex-shrink-0 items-center justify-center rounded-md", r ? "text-slate-900 dark:text-slate-50" : "text-slate-400 dark:text-slate-500"),
|
|
2768
|
-
children: e.Type === "directory" ? /* @__PURE__ */ M(d, { className: "h-3.5 w-3.5" }) : M(t === "image" ? f : t === "markdown" || t === "text" || t === "html" ? l : u, { className: "h-3.5 w-3.5" })
|
|
2769
|
-
}), /* @__PURE__ */ N("div", {
|
|
2770
|
-
className: "min-w-0 flex-1",
|
|
2771
|
-
children: [/* @__PURE__ */ M("div", {
|
|
2772
|
-
className: "truncate text-[13px] leading-5",
|
|
2773
|
-
children: e.Name
|
|
2774
|
-
}), /* @__PURE__ */ M("div", {
|
|
2775
|
-
className: J("truncate text-[11px] leading-4", r ? "text-slate-500 dark:text-slate-400" : "text-slate-400"),
|
|
2776
|
-
children: e.Type === "directory" ? "目录" : lr(e.SizeBytes)
|
|
2777
|
-
})]
|
|
2778
|
-
})]
|
|
2779
|
-
}), /* @__PURE__ */ N("div", {
|
|
2780
|
-
className: "flex flex-shrink-0 items-center gap-0.5 opacity-0 transition group-hover:opacity-100",
|
|
2781
|
-
children: [e.Type === "file" ? /* @__PURE__ */ M("a", {
|
|
2782
|
-
href: i,
|
|
2783
|
-
download: e.Name,
|
|
2784
|
-
className: J("rounded-md p-1.5 transition", r ? "hover:bg-white dark:hover:bg-slate-700" : "hover:bg-slate-100 dark:hover:bg-slate-800"),
|
|
2785
|
-
title: "下载",
|
|
2786
|
-
children: /* @__PURE__ */ M(o, { className: "h-3.5 w-3.5" })
|
|
2787
|
-
}) : null, n.SupportsDelete ? /* @__PURE__ */ M("button", {
|
|
2788
|
-
type: "button",
|
|
2789
|
-
onClick: () => void Se(e),
|
|
2790
|
-
className: J("rounded-md p-1.5 transition", r ? "hover:bg-white dark:hover:bg-slate-700" : "hover:bg-slate-100 dark:hover:bg-slate-800"),
|
|
2791
|
-
title: "删除",
|
|
2792
|
-
children: /* @__PURE__ */ M(se, { className: "h-3.5 w-3.5" })
|
|
2793
|
-
}) : null]
|
|
2794
|
-
})]
|
|
2795
|
-
}, e.Path);
|
|
2796
|
-
})
|
|
2797
|
-
})
|
|
2798
|
-
})]
|
|
2799
|
-
}), /* @__PURE__ */ N("div", {
|
|
2800
|
-
className: "flex min-h-0 min-w-0 flex-1 flex-col",
|
|
2801
|
-
children: [/* @__PURE__ */ M("div", {
|
|
2802
|
-
className: "flex h-14 flex-shrink-0 items-center border-b border-slate-200/30 px-4 dark:border-slate-800/40",
|
|
2803
|
-
children: W ? /* @__PURE__ */ N("div", {
|
|
2804
|
-
className: "flex w-full items-start justify-between gap-3",
|
|
2805
|
-
children: [/* @__PURE__ */ N("div", {
|
|
2806
|
-
className: "min-w-0",
|
|
2807
|
-
children: [
|
|
2808
|
-
/* @__PURE__ */ M("div", {
|
|
2809
|
-
className: "truncate text-sm font-semibold text-slate-900 dark:text-slate-100",
|
|
2810
|
-
children: W.Name
|
|
2811
|
-
}),
|
|
2812
|
-
/* @__PURE__ */ M("div", {
|
|
2813
|
-
className: "mt-0.5 break-all font-mono text-[11px] text-slate-400",
|
|
2814
|
-
children: W.Path
|
|
2815
|
-
}),
|
|
2816
|
-
/* @__PURE__ */ N("div", {
|
|
2817
|
-
className: "mt-1 text-[11px] text-slate-400",
|
|
2818
|
-
children: [
|
|
2819
|
-
lr(W.SizeBytes),
|
|
2820
|
-
W.MimeType ? ` · ${W.MimeType}` : "",
|
|
2821
|
-
W.ModifiedAt ? ` · ${cr(W.ModifiedAt)}` : ""
|
|
2822
|
-
]
|
|
2823
|
-
})
|
|
2824
|
-
]
|
|
2825
|
-
}), me === "text" || me === "code" || me === "html" || me === "markdown" ? /* @__PURE__ */ N("button", {
|
|
2826
|
-
type: "button",
|
|
2827
|
-
onClick: () => {
|
|
2828
|
-
let e = z.current;
|
|
2829
|
-
e && q(e());
|
|
2830
|
-
},
|
|
2831
|
-
disabled: !P || I,
|
|
2832
|
-
className: J("inline-flex items-center gap-1.5 rounded-lg px-2.5 py-1.5 text-xs font-medium transition", P && !I ? "bg-blue-600 text-white hover:bg-blue-700" : "text-slate-400 dark:text-slate-500 cursor-not-allowed"),
|
|
2833
|
-
children: [/* @__PURE__ */ M(ie, { className: "h-3.5 w-3.5" }), I ? "保存中" : P ? "保存" : "已保存"]
|
|
2834
|
-
}) : null]
|
|
2835
|
-
}) : /* @__PURE__ */ N("div", {
|
|
2836
|
-
className: "w-full",
|
|
2837
|
-
children: [/* @__PURE__ */ M("div", {
|
|
2838
|
-
className: "text-sm font-semibold text-slate-900 dark:text-slate-100",
|
|
2839
|
-
children: "文件预览"
|
|
2840
|
-
}), /* @__PURE__ */ M("div", {
|
|
2841
|
-
className: "mt-0.5 text-xs text-slate-500 dark:text-slate-400",
|
|
2842
|
-
children: "选择左侧文件后可在此查看内容。"
|
|
2843
|
-
})]
|
|
2844
|
-
})
|
|
2845
|
-
}), /* @__PURE__ */ M("div", {
|
|
2846
|
-
className: J("custom-scrollbar min-h-0 flex-1", Te || we ? "overflow-hidden p-0" : "overflow-y-auto px-4 py-4"),
|
|
2847
|
-
children: Ce()
|
|
2848
|
-
})]
|
|
2849
|
-
})]
|
|
2850
|
-
})]
|
|
2851
|
-
});
|
|
2852
|
-
}
|
|
2853
|
-
//#endregion
|
|
2854
|
-
//#region src/components/workspace/WorkspacePanelContainer.tsx
|
|
2855
|
-
function mr({ agentId: e, capability: t, workspacePanelOpen: n, workspacePanelWidth: r, workspacePanelFullscreen: i, isMobile: a, workspaceEnabled: o, workspaceFiles: s, workspacePanelPresentation: c, closeWorkspacePanel: l, handleWorkspacePanelResizeStart: u, api: d }) {
|
|
2856
|
-
let f = c.renderMode === "inline", p = c.renderMode === "sheet";
|
|
2857
|
-
return !o || !s ? null : /* @__PURE__ */ N(j, { children: [f ? /* @__PURE__ */ N(j, { children: [n && !i ? /* @__PURE__ */ M("div", {
|
|
2858
|
-
role: "separator",
|
|
2859
|
-
"aria-label": "调整 Workspace 宽度",
|
|
2860
|
-
"aria-orientation": "vertical",
|
|
2861
|
-
onPointerDown: u,
|
|
2862
|
-
className: "hidden h-full w-1 cursor-col-resize bg-transparent transition-colors hover:bg-blue-200/60 dark:hover:bg-blue-900/50 md:block"
|
|
2863
|
-
}) : null, /* @__PURE__ */ M("aside", {
|
|
2864
|
-
style: n && !i ? { width: `${r}px` } : void 0,
|
|
2865
|
-
className: J(i ? "fixed inset-0 z-40 flex h-[var(--app-height)] w-screen overflow-hidden bg-white dark:bg-slate-950" : "hidden h-full flex-shrink-0 overflow-hidden bg-white transition-[width] duration-200 ease-out dark:bg-slate-950 md:flex", n ? "border-l border-slate-200/30 dark:border-slate-800/40" : "w-0 border-l border-transparent"),
|
|
2866
|
-
children: n ? /* @__PURE__ */ M(pr, {
|
|
2867
|
-
agentId: e,
|
|
2868
|
-
capability: t,
|
|
2869
|
-
open: n,
|
|
2870
|
-
onClose: l,
|
|
2871
|
-
isFullscreen: i,
|
|
2872
|
-
onToggleFullscreen: () => Tn.getState().setWorkspacePanelFullscreen(!i),
|
|
2873
|
-
isMobile: a,
|
|
2874
|
-
api: d
|
|
2875
|
-
}) : null
|
|
2876
|
-
})] }) : null, p ? /* @__PURE__ */ M(We, {
|
|
2877
|
-
open: n,
|
|
2878
|
-
onOpenChange: (e) => {
|
|
2879
|
-
e || Tn.getState().setWorkspacePanelFullscreen(!1), Tn.getState().setWorkspacePanelOpen(e);
|
|
2880
|
-
},
|
|
2881
|
-
modal: c.modal,
|
|
2882
|
-
children: /* @__PURE__ */ N(Je, {
|
|
2883
|
-
side: c.side,
|
|
2884
|
-
showOverlay: c.showOverlay,
|
|
2885
|
-
onInteractOutside: (e) => {
|
|
2886
|
-
c.preventOutsideClose && e.preventDefault();
|
|
2887
|
-
},
|
|
2888
|
-
showCloseButton: !1,
|
|
2889
|
-
className: J("border-slate-200 bg-white p-0 dark:border-slate-800 dark:bg-slate-950", a ? "h-[70vh] rounded-t-[1.75rem]" : "h-[calc(100vh-1.5rem)] w-[min(72rem,calc(100vw-1.5rem))] max-w-[calc(100vw-1.5rem)] rounded-l-[1.5rem] border-l shadow-2xl"),
|
|
2890
|
-
children: [
|
|
2891
|
-
/* @__PURE__ */ M(Ze, {
|
|
2892
|
-
className: "sr-only",
|
|
2893
|
-
children: "Workspace 文件"
|
|
2894
|
-
}),
|
|
2895
|
-
/* @__PURE__ */ M(Qe, {
|
|
2896
|
-
className: "sr-only",
|
|
2897
|
-
children: "浏览、上传和预览 Workspace 文件。"
|
|
2898
|
-
}),
|
|
2899
|
-
/* @__PURE__ */ M(pr, {
|
|
2900
|
-
agentId: e,
|
|
2901
|
-
capability: t,
|
|
2902
|
-
open: n,
|
|
2903
|
-
onClose: l,
|
|
2904
|
-
isMobile: a,
|
|
2905
|
-
api: d
|
|
2906
|
-
})
|
|
2907
|
-
]
|
|
2908
|
-
})
|
|
2909
|
-
}) : null] });
|
|
2910
|
-
}
|
|
2911
|
-
//#endregion
|
|
2912
|
-
export { tt as C, Ze as D, Qe as E, Ue as O, pt as S, Je as T, Et as _, Fn as a, St as b, xn as c, Bt as d, Rt as f, Ot as g, wt as h, Pn as i, J as k, dn as l, Ct as m, tr as n, Tn as o, Tt as p, $n as r, Cn as s, mr as t, Vt as u, xt as v, We as w, X as x, Dt as y };
|