@yuku123/z-team-component 0.2.93 → 0.2.95

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/dist/{ChangeLogView-BjV4gBq4.js → ChangeLogView-DY_k1B64.js} +1 -1
  2. package/dist/{ComponentDoc-C9lt-45y.js → ComponentDoc-DOki_RNN.js} +28 -28
  3. package/dist/{InvitationManagementPage-CWtBWLd9.js → InvitationManagementPage-BY_80aYm.js} +1 -1
  4. package/dist/{OnboardingPage-B2fwh4gu.js → OnboardingPage-BJbMBrxH.js} +2 -2
  5. package/dist/ScheduledTasks-XTkQqn4w.js +12127 -0
  6. package/dist/{SystemShell-CTkRb3jk.js → SystemShell--qM7HCyt.js} +4 -4
  7. package/dist/{admin-logs-Dh41ezP6.js → admin-logs-Co7fE3re.js} +1 -1
  8. package/dist/{api-ChrRZOc4.js → api-775Bo4Bj.js} +1 -1
  9. package/dist/{createWorkspaceWsHandler-DMw_Vk6i.js → createWorkspaceWsHandler-BRfhB79M.js} +2572 -2565
  10. package/dist/{index-DdvzONMo.js → index-6st3qQNt.js} +3804 -3644
  11. package/dist/{index-CSXrOBjf.js → index-90EqwtNF.js} +5 -5
  12. package/dist/{index-CdqU0NUf.js → index-BIBfRHFf.js} +6 -6
  13. package/dist/{index-BnRRZ6Iv.js → index-BN3cy1Tm.js} +1 -1
  14. package/dist/{index-BYpA6zMn.js → index-BPD6fg3O.js} +2 -2
  15. package/dist/{index-DNo7i9f6.js → index-BSKD9lop.js} +3 -3
  16. package/dist/index-B_bk9bXb.js +189 -0
  17. package/dist/{index-Dy6vNz1c.js → index-BbFdWpYR.js} +4 -4
  18. package/dist/index-BjKdHw8Y.js +2217 -0
  19. package/dist/{index-CLSOhZRs.js → index-ByP1umXq.js} +2 -2
  20. package/dist/{index-Dq4oBpcb.js → index-C6r-MO3V.js} +2 -2
  21. package/dist/{index-C-XgeN0c.js → index-C7YHxq-O.js} +2 -2
  22. package/dist/{index-B_2fxZ6u.js → index-CEcQbI8N.js} +1 -1
  23. package/dist/{index-3JPBTMXq.js → index-CJMqiJom.js} +3 -3
  24. package/dist/{index-bkqC-Ys8.js → index-CP_x_8X-.js} +1 -1
  25. package/dist/{index-CLnmI_a7.js → index-CXQuOt1Z.js} +1 -1
  26. package/dist/{index-fab1eszg.js → index-Cee4Cg7R.js} +3 -3
  27. package/dist/{index-CIGBLmd6.js → index-CiJ5zEUK.js} +2 -2
  28. package/dist/{index-CnWYolUK.js → index-DRCHSrIn.js} +1 -1
  29. package/dist/{index-DtIPLfks.js → index-Df7MVpNC.js} +3 -3
  30. package/dist/{index-7glbcqX1.js → index-DzwWNvrE.js} +3 -3
  31. package/dist/{index-vIdK5WMU.js → index-OUSBycnF.js} +1 -1
  32. package/dist/{index-D1_tbmUH.js → index-eczy0dAy.js} +2 -2
  33. package/dist/{index-CrQpBHe1.js → index-yPSZNONn.js} +2 -2
  34. package/dist/index.js +1 -1
  35. package/dist/{instance-BY043pYn.js → instance-DZ2M9ud2.js} +1 -1
  36. package/dist/{menuPermission-BeYwZcoW.js → menuPermission-PpL-QSl7.js} +3 -3
  37. package/dist/pages.js +1 -1
  38. package/dist/{send-default-agent-team-message-BN61cG7q.js → send-default-agent-team-message-CMRf10FQ.js} +1 -1
  39. package/dist/{sso-user-DmsDr1MJ.js → sso-user-DRpyYb-C.js} +1 -1
  40. package/dist/{training-CU6j5m-5.js → training-Dgpwp_Hu.js} +1 -1
  41. package/dist/{webide-BYaEjOx6.js → webide-B83YQ9p1.js} +3 -3
  42. package/dist/z-team-component.css +1 -1
  43. package/package.json +1 -1
  44. package/dist/ScheduledTasks-CuQyjAK-.js +0 -10851
  45. package/dist/index-CA0ql0r3.js +0 -3495
  46. package/dist/index-DPyEBso8.js +0 -150
@@ -1,3495 +0,0 @@
1
- import { jsx as e, jsxs as l, Fragment as ze } from "react/jsx-runtime";
2
- import { S as hn, P as mn } from "./webide-BYaEjOx6.js";
3
- import { message as Bt, Tooltip as Ut, Dropdown as Jt } from "antd";
4
- import { RightOutlined as bn, PlusOutlined as gn, LeftOutlined as On, CheckOutlined as fn, LoadingOutlined as Ht, EditOutlined as en, DeleteOutlined as $n, FolderOpenOutlined as Vt, DownOutlined as Ft, UpOutlined as jt, RedoOutlined as Pn, StopOutlined as Hn, CloseOutlined as Fn, FolderOutlined as jn, CopyOutlined as Kn, MessageOutlined as _n, MoreOutlined as Wn, DashboardOutlined as yn, MenuUnfoldOutlined as Un, MenuFoldOutlined as Vn, SettingOutlined as vn, TeamOutlined as Gn, BarChartOutlined as zn, PieChartOutlined as qn, CodeOutlined as Zn, LinkOutlined as Qn, UnorderedListOutlined as Nn, FileTextOutlined as Yt, ReadOutlined as Xn, ConsoleSqlOutlined as Yn, PlayCircleOutlined as Jn, ClockCircleOutlined as ea, AppstoreOutlined as ta } from "@ant-design/icons";
5
- import { useState as m, useRef as U, useMemo as ge, useEffect as M, useCallback as Y } from "react";
6
- import { d as Oe, _ as na, $ as kn, n as De, a0 as aa, a1 as sa, a2 as la, a3 as ia, a4 as ra, a5 as oa, t as ca, a6 as da, a7 as Lt, a8 as ua, a9 as pa } from "./ComponentDoc-C9lt-45y.js";
7
- import { l as ha, f as Cn, c as Kt, a as ma, b as ba, u as ga, r as wn, s as fa, t as _a, d as Gt, e as zt, g as ya, h as va, i as Tn, j as d, T as Na, R as qt, D as Rt, k as ka, m as Ca, F as Zt, P as wa, L as Ta, A as Ia, C as Sa, n as Aa, o as Ba, p as La, q as tn, v as nn, W as Da, w as Ra, S as Ea, x as Ma, y as xa, z as Oa, U as $a, B as Pa, E as Ha, G as Fa } from "./index-DdvzONMo.js";
8
- import { u as Et, a as _t, i as In, T as ja, b as Ka, s as an } from "./createWorkspaceWsHandler-DMw_Vk6i.js";
9
- import { h as Sn, f as Wa } from "./index-CLnmI_a7.js";
10
- import Ua from "react-markdown";
11
- import Va from "rehype-highlight";
12
- import Ga from "remark-gfm";
13
- import { W as Qt, b as Mt, T as An, c as Bn, a as Ln, P as Dn, S as za, E as qa, C as Za } from "./ScheduledTasks-CuQyjAK-.js";
14
- import { TodoTab as Rn } from "@yuku123/z-task-component";
15
- const Qa = "_container_beudb_1", Xa = "_sessionPanel_beudb_9", Ya = "_sessionHeader_beudb_19", Ja = "_sessionHeaderActions_beudb_32", es = "_sessionBtnSm_beudb_37", ts = "_sessionList_beudb_55", ns = "_sessionItem_beudb_61", as = "_sessionItemActive_beudb_79", ss = "_sessionItemTitle_beudb_84", ls = "_sessionLiveDot_beudb_93", is = "_sessionItemTime_beudb_100", rs = "_sessionDeleteBtn_beudb_106", os = "_sessionRenameBtn_beudb_127", cs = "_sessionRenameInput_beudb_148", ds = "_sessionCreateRow_beudb_160", us = "_sessionCreateInput_beudb_166", ps = "_sessionCreateConfirm_beudb_180", hs = "_sessionCreateCancel_beudb_181", ms = "_sessionSearchRow_beudb_203", bs = "_sessionSearchInput_beudb_209", gs = "_sessionSearchClear_beudb_224", fs = "_sessionEmpty_beudb_245", _s = "_sessionExpandBtn_beudb_255", ys = "_chatPanel_beudb_275", vs = "_chatHeader_beudb_284", Ns = "_agentAvatar_beudb_296", ks = "_chatHeaderMeta_beudb_309", Cs = "_chatHeaderName_beudb_317", ws = "_chatHeaderSession_beudb_324", Ts = "_chatHeaderBadge_beudb_332", Is = "_streamingIndicator_beudb_342", Ss = "_threadScroll_beudb_351", As = "_threadInner_beudb_357", Bs = "_landing_beudb_368", Ls = "_landingLogo_beudb_378", Ds = "_landingTitle_beudb_392", Rs = "_landingHint_beudb_398", Es = "_newChatLanding_beudb_404", Ms = "_landingComposer_beudb_415", xs = "_landingInput_beudb_432", Os = "_chatEmpty_beudb_448", $s = "_userRow_beudb_459", Ps = "_userBubble_beudb_464", Hs = "_assistantBlock_beudb_478", Fs = "_md_beudb_488", js = "_mdPreWrap_beudb_546", Ks = "_mdPreCopy_beudb_550", Ws = "_thinkingHint_beudb_585", Us = "_caretCursor_beudb_600", Vs = "_errorBar_beudb_617", Gs = "_errorRetryBtn_beudb_626", zs = "_stoppedBar_beudb_641", qs = "_scrollTopBtn_beudb_651", Zs = "_scrollTopBtnVisible_beudb_673", Qs = "_composerWrap_beudb_684", Xs = "_composer_beudb_684", Ys = "_composerInput_beudb_706", Js = "_sendBtn_beudb_724", el = "_stopBtn_beudb_725", tl = "_sendBtnReady_beudb_745", nl = "_composerHint_beudb_763", al = "_msgMeta_beudb_773", sl = "_copyBtn_beudb_784", ll = "_copyBtnInline_beudb_814", il = "_copyBtnDone_beudb_821", rl = "_landingChips_beudb_826", ol = "_landingChip_beudb_826", cl = "_userActions_beudb_853", dl = "_userActionBtn_beudb_866", ul = "_editingBar_beudb_889", pl = "_pendingBar_beudb_904", hl = "_editingCancel_beudb_925", ml = "_workdirBar_beudb_942", bl = "_workdirChip_beudb_951", gl = "_workdirCaret_beudb_978", fl = "_workdirPath_beudb_983", _l = "_dirMask_beudb_993", yl = "_dirModal_beudb_1003", vl = "_dirHead_beudb_1014", Nl = "_dirClose_beudb_1024", kl = "_dirBar_beudb_1041", Cl = "_dirUp_beudb_1049", wl = "_dirPathText_beudb_1068", Tl = "_dirList_beudb_1077", Il = "_dirItem_beudb_1084", Sl = "_dirEmpty_beudb_1109", Al = "_dirError_beudb_1119", Bl = "_dirFoot_beudb_1125", Ll = "_dirCancel_beudb_1133", Dl = "_dirConfirm_beudb_1134", i = {
16
- container: Qa,
17
- sessionPanel: Xa,
18
- sessionHeader: Ya,
19
- sessionHeaderActions: Ja,
20
- sessionBtnSm: es,
21
- sessionList: ts,
22
- sessionItem: ns,
23
- sessionItemActive: as,
24
- sessionItemTitle: ss,
25
- sessionLiveDot: ls,
26
- sessionItemTime: is,
27
- sessionDeleteBtn: rs,
28
- sessionRenameBtn: os,
29
- sessionRenameInput: cs,
30
- sessionCreateRow: ds,
31
- sessionCreateInput: us,
32
- sessionCreateConfirm: ps,
33
- sessionCreateCancel: hs,
34
- sessionSearchRow: ms,
35
- sessionSearchInput: bs,
36
- sessionSearchClear: gs,
37
- sessionEmpty: fs,
38
- sessionExpandBtn: _s,
39
- chatPanel: ys,
40
- chatHeader: vs,
41
- agentAvatar: Ns,
42
- chatHeaderMeta: ks,
43
- chatHeaderName: Cs,
44
- chatHeaderSession: ws,
45
- chatHeaderBadge: Ts,
46
- streamingIndicator: Is,
47
- threadScroll: Ss,
48
- threadInner: As,
49
- landing: Bs,
50
- landingLogo: Ls,
51
- landingTitle: Ds,
52
- landingHint: Rs,
53
- newChatLanding: Es,
54
- landingComposer: Ms,
55
- landingInput: xs,
56
- chatEmpty: Os,
57
- userRow: $s,
58
- userBubble: Ps,
59
- assistantBlock: Hs,
60
- md: Fs,
61
- mdPreWrap: js,
62
- mdPreCopy: Ks,
63
- thinkingHint: Ws,
64
- caretCursor: Us,
65
- errorBar: Vs,
66
- errorRetryBtn: Gs,
67
- stoppedBar: zs,
68
- scrollTopBtn: qs,
69
- scrollTopBtnVisible: Zs,
70
- composerWrap: Qs,
71
- composer: Xs,
72
- composerInput: Ys,
73
- sendBtn: Js,
74
- stopBtn: el,
75
- sendBtnReady: tl,
76
- composerHint: nl,
77
- msgMeta: al,
78
- copyBtn: sl,
79
- copyBtnInline: ll,
80
- copyBtnDone: il,
81
- landingChips: rl,
82
- landingChip: ol,
83
- userActions: cl,
84
- userActionBtn: dl,
85
- editingBar: ul,
86
- pendingBar: pl,
87
- editingCancel: hl,
88
- workdirBar: ml,
89
- workdirChip: bl,
90
- workdirCaret: gl,
91
- workdirPath: fl,
92
- dirMask: _l,
93
- dirModal: yl,
94
- dirHead: vl,
95
- dirClose: Nl,
96
- dirBar: kl,
97
- dirUp: Cl,
98
- dirPathText: wl,
99
- dirList: Tl,
100
- dirItem: Il,
101
- dirEmpty: Sl,
102
- dirError: Al,
103
- dirFoot: Bl,
104
- dirCancel: Ll,
105
- dirConfirm: Dl
106
- };
107
- function Rl(a) {
108
- if (a && a.trim().startsWith("{"))
109
- try {
110
- const c = JSON.parse(a);
111
- if (c && Array.isArray(c.z_team_blocks))
112
- return {
113
- blocks: c.z_team_blocks,
114
- totalMs: typeof c.totalMs == "number" ? c.totalMs : void 0,
115
- usage: c.usage ?? void 0,
116
- stopped: c.stopped === !0
117
- };
118
- } catch {
119
- }
120
- return null;
121
- }
122
- function sn(a) {
123
- return (a || []).map((c, b) => {
124
- const g = Rl(c.content);
125
- return {
126
- id: `local-${c.timestamp}-${c.role}-${b}`,
127
- role: c.role === "assistant" ? "assistant" : "user",
128
- blocks: g ? g.blocks : [{ type: "text", text: c.content }],
129
- totalMs: g == null ? void 0 : g.totalMs,
130
- usage: g == null ? void 0 : g.usage,
131
- stopped: (g == null ? void 0 : g.stopped) === !0
132
- };
133
- });
134
- }
135
- function ct(a) {
136
- return a.filter((c) => c.type === "text").map((c) => c.text).join("");
137
- }
138
- function El(a) {
139
- return a >= 1e4 ? `${Math.round(a / 1e3)}k` : a >= 1e3 ? `${(a / 1e3).toFixed(1)}k` : String(a);
140
- }
141
- function Ml(a) {
142
- if (a == null || a <= 0) return "";
143
- const c = Date.now() - a;
144
- if (c < 6e4) return "刚刚";
145
- if (c < 36e5) return `${Math.floor(c / 6e4)} 分钟前`;
146
- if (c < 864e5) return `${Math.floor(c / 36e5)} 小时前`;
147
- const b = new Date(Date.now() - 864e5);
148
- if (new Date(a).toDateString() === b.toDateString()) return "昨天";
149
- const g = new Date(a);
150
- return `${g.getMonth() + 1}-${String(g.getDate()).padStart(2, "0")}`;
151
- }
152
- const ln = [
153
- "#2F70F1",
154
- "#52c41a",
155
- "#fa8c16",
156
- "#eb2f96",
157
- "#722ed1",
158
- "#13c2c2",
159
- "#f522d0",
160
- "#faad14"
161
- ];
162
- function rn(a) {
163
- let c = 0;
164
- for (let b = 0; b < a.length; b++) c = c * 31 + a.charCodeAt(b) | 0;
165
- return ln[Math.abs(c) % ln.length];
166
- }
167
- function Wt(a) {
168
- return a ? a.charAt(0).toUpperCase() : "?";
169
- }
170
- function xl({ children: a }) {
171
- const c = U(null);
172
- return /* @__PURE__ */ l("div", { className: i.mdPreWrap, children: [
173
- /* @__PURE__ */ e("div", { className: i.mdPreCopy, children: /* @__PURE__ */ e(Xt, { getText: () => {
174
- var b;
175
- return ((b = c.current) == null ? void 0 : b.textContent) ?? "";
176
- } }) }),
177
- /* @__PURE__ */ e("pre", { ref: c, children: a })
178
- ] });
179
- }
180
- function Ol({ text: a }) {
181
- return /* @__PURE__ */ e("div", { className: i.md, children: /* @__PURE__ */ e(
182
- Ua,
183
- {
184
- remarkPlugins: [Ga],
185
- rehypePlugins: [Va],
186
- components: {
187
- pre: (c) => /* @__PURE__ */ e(xl, { children: c.children })
188
- },
189
- children: a
190
- }
191
- ) });
192
- }
193
- function $l({ startedAtMs: a }) {
194
- const [, c] = m(0);
195
- M(() => {
196
- const g = window.setInterval(() => c((A) => A + 1), 1e3);
197
- return () => window.clearInterval(g);
198
- }, []);
199
- const b = Math.max(1, Math.round((Date.now() - a) / 1e3));
200
- return /* @__PURE__ */ l("div", { className: i.msgMeta, children: [
201
- b,
202
- "s…"
203
- ] });
204
- }
205
- function Pl(a) {
206
- var c;
207
- if ((c = navigator.clipboard) != null && c.writeText)
208
- return navigator.clipboard.writeText(a).catch(() => {
209
- }), !0;
210
- try {
211
- const b = document.createElement("textarea");
212
- b.value = a, b.style.position = "fixed", b.style.opacity = "0", document.body.appendChild(b), b.select();
213
- const g = document.execCommand("copy");
214
- return document.body.removeChild(b), g;
215
- } catch {
216
- return !1;
217
- }
218
- }
219
- function Xt({
220
- getText: a,
221
- inline: c,
222
- label: b = "复制正文"
223
- }) {
224
- const [g, A] = m(!1);
225
- return /* @__PURE__ */ e(
226
- "button",
227
- {
228
- type: "button",
229
- className: `${i.copyBtn} ${c ? i.copyBtnInline : ""} ${g ? i.copyBtnDone : ""}`,
230
- onClick: () => {
231
- const R = a();
232
- !R || !Pl(R) || (A(!0), window.setTimeout(() => A(!1), 1600));
233
- },
234
- title: b,
235
- "aria-label": b,
236
- children: g ? /* @__PURE__ */ e(fn, {}) : /* @__PURE__ */ e(Kn, {})
237
- }
238
- );
239
- }
240
- const on = "ft_local_workdir", cn = [
241
- "查看当前目录的文件列表",
242
- "总结当前目录里各文件的内容",
243
- "帮我写一个脚本统计各文件的行数",
244
- "说明一下你能使用哪些工具"
245
- ];
246
- function En({
247
- agent: a,
248
- newSessionTrigger: c = 0,
249
- autoSendDraft: b = null,
250
- onAutoSendConsumed: g,
251
- openSessionId: A = null,
252
- onOpenSessionConsumed: R,
253
- onSessionsMutated: v
254
- }) {
255
- var N;
256
- const { chatPanelWidth: x } = Et(), V = Oe((t) => t.currentUser), K = Et(), [H, F] = m([]), [G, k] = m(""), [C, te] = m(null), [B, J] = m(""), ee = U(!1), z = ge(() => {
257
- const t = G.trim().toLowerCase();
258
- return t ? H.filter((s) => s.title.toLowerCase().includes(t)) : H;
259
- }, [H, G]), [w, $] = m(
260
- null
261
- ), [O, E] = m([]), [oe, q] = m(""), [I, se] = m(!1), _ = U(!1), ce = U(null), [de, Ae] = m(null), X = U(null), Be = U(null), ve = U(null);
262
- M(() => {
263
- ve.current = w;
264
- }, [w]);
265
- const Ne = U(/* @__PURE__ */ new Map()), ke = U(null), ue = (t) => {
266
- _.current = t, se(t);
267
- }, [st, Ce] = m(!1), [ne, $e] = m(""), [we, Le] = m(!1), [qe, Re] = m(!1), [fe, Te] = m(""), [pe, Pe] = m(
268
- () => localStorage.getItem("ft_local_session_collapsed") !== "false"
269
- ), [r, S] = m(!0), [le, He] = m(!1), [Z, Fe] = m(null), [Ee, Ze] = m(
270
- () => localStorage.getItem(on)
271
- ), [xt, je] = m(!1), [W, dt] = m(null), [ut, yt] = m(!1), [vt, pt] = m(null), Qe = ge(
272
- () => {
273
- var t;
274
- return ((t = H.find((s) => s.id === w)) == null ? void 0 : t.workdir) ?? null;
275
- },
276
- [H, w]
277
- ), nt = w ? Qe : Ee, be = Y(async (t) => {
278
- yt(!0), pt(null);
279
- try {
280
- dt(await ha(t));
281
- } catch (s) {
282
- pt(s instanceof Error ? s.message : "读取目录失败");
283
- } finally {
284
- yt(!1);
285
- }
286
- }, []), lt = () => {
287
- je(!0), be((W == null ? void 0 : W.path) ?? nt ?? void 0);
288
- }, Nt = async (t) => {
289
- if (je(!1), localStorage.setItem(on, t), Ze(t), !!w)
290
- try {
291
- const s = await ga(w, t);
292
- F((u) => u.map((T) => T.id === s.id ? s : T)), v == null || v();
293
- } catch (s) {
294
- pt(s instanceof Error ? s.message : "绑定工作目录失败");
295
- }
296
- }, he = (t) => {
297
- if (!t) return "选择工作目录";
298
- const s = t.split("/").filter(Boolean);
299
- return s.length ? s[s.length - 1] : t;
300
- }, me = U(null), j = U(null), Me = U(null), Ke = U(null), Ie = U(!0), We = U(!1), kt = U([]);
301
- M(() => {
302
- kt.current = O;
303
- }, [O]);
304
- const Ue = U(null), ie = U(null), Ve = Y(
305
- (t, s) => {
306
- const u = ie.current;
307
- if (u && u.sid === t) {
308
- u.messages = s(u.messages), ve.current === t && E(u.messages);
309
- return;
310
- }
311
- E((T) => s(T));
312
- },
313
- []
314
- ), ht = I ? ((N = ie.current) == null ? void 0 : N.sid) ?? null : null, Ct = Y(async () => {
315
- try {
316
- const t = await Cn(a == null ? void 0 : a.localAgentId);
317
- return F(t), S(!0), t;
318
- } catch {
319
- return S(!1), F([]), [];
320
- }
321
- }, [a == null ? void 0 : a.localAgentId]);
322
- M(() => {
323
- $(null), E([]), k(""), Ct().then((t) => {
324
- if (t.length > 0) {
325
- const s = [...t].sort(
326
- (u, T) => new Date(T.updatedAt).getTime() - new Date(u.updatedAt).getTime()
327
- )[0];
328
- $(s.id);
329
- }
330
- });
331
- }, [Ct]), M(() => {
332
- c > 0 && (async () => {
333
- try {
334
- const t = await Kt(
335
- "新会话",
336
- a == null ? void 0 : a.localAgentId,
337
- Ee
338
- );
339
- F((s) => [t, ...s]), v == null || v(), We.current = !0, $(t.id), E([]), k("");
340
- } catch {
341
- Re(!0), Te("");
342
- }
343
- })();
344
- }, [c]);
345
- const it = U(!1);
346
- M(() => {
347
- !b || it.current || (it.current = !0, g == null || g(), ot(b));
348
- }, []);
349
- const rt = U(null);
350
- M(() => {
351
- !A || rt.current === A || (rt.current = A, $(A), R == null || R());
352
- }, [A, R]), M(() => {
353
- const t = ke.current;
354
- if (t != null && t !== w) {
355
- Ne.current.set(t, oe);
356
- const T = Ne.current.get(w ?? "") ?? "";
357
- q(T), requestAnimationFrame(() => {
358
- const f = j.current;
359
- f && (f.style.height = "auto", f.style.height = Math.min(f.scrollHeight, 180) + "px");
360
- });
361
- }
362
- if (ke.current = w, Ue.current !== w && (Ue.current = null), !w) {
363
- E([]), Ce(!1);
364
- return;
365
- }
366
- const s = ie.current;
367
- if (s && s.sid === w) {
368
- if (Ie.current = !0, E(s.messages), s.messages.some((T) => T.streaming || T.error)) return;
369
- ie.current = null;
370
- }
371
- if (We.current) {
372
- We.current = !1, Ce(!1);
373
- return;
374
- }
375
- let u = !1;
376
- return Ce(!0), ma(w).then((T) => {
377
- if (u) return;
378
- const f = ie.current;
379
- _.current || f && f.sid === w || Ue.current === w || (Ue.current = null, E(sn(T.messages)));
380
- }).catch(() => {
381
- u || _.current || Ue.current === w || E([]);
382
- }).finally(() => {
383
- u || Ce(!1);
384
- }), () => {
385
- u = !0;
386
- };
387
- }, [w]), M(() => {
388
- Ie.current && me.current && (me.current.scrollTop = me.current.scrollHeight);
389
- }, [O]);
390
- const wt = Y(() => {
391
- const t = me.current;
392
- if (!t) return;
393
- const s = t.scrollHeight - t.scrollTop - t.clientHeight;
394
- Ie.current = s < 80, He(s > 120);
395
- }, []), Tt = Y(() => {
396
- const t = me.current;
397
- t && (t.scrollTop = t.scrollHeight), Ie.current = !0, He(!1);
398
- }, []);
399
- M(() => {
400
- localStorage.setItem(
401
- "ft_local_session_collapsed",
402
- pe ? "true" : "false"
403
- );
404
- }, [pe]);
405
- const mt = async () => {
406
- const t = fe.trim() || "新会话";
407
- try {
408
- const s = await Kt(
409
- t,
410
- a == null ? void 0 : a.localAgentId,
411
- Ee
412
- );
413
- F((u) => [s, ...u]), v == null || v(), We.current = !0, $(s.id), E([]), Re(!1), Te(""), k("");
414
- } catch {
415
- }
416
- }, bt = (t) => {
417
- te(t.id), J(t.title), ee.current = !1;
418
- }, _e = async () => {
419
- if (ee.current) return;
420
- ee.current = !0;
421
- const t = C, s = B.trim();
422
- if (te(null), !(!t || !s))
423
- try {
424
- await wn(t, s), F(
425
- (u) => u.map((T) => T.id === t ? { ...T, title: s } : T)
426
- );
427
- } catch {
428
- }
429
- }, It = async (t) => {
430
- if (await _t({ content: "确定删除此会话吗?" })) {
431
- _.current && Ke.current === t && at();
432
- try {
433
- await na(t), F((s) => s.filter((u) => u.id !== t)), w === t && ($(null), E([]));
434
- } catch {
435
- }
436
- }
437
- }, gt = Y(
438
- (t, s, u, T) => {
439
- Ve(
440
- t,
441
- (f) => f.map((D) => {
442
- if (D.id !== s) return D;
443
- const P = Date.now();
444
- let L = {};
445
- u === "thinking" && D.thinkingStartMs == null ? L = { thinkingStartMs: P } : u === "text" && D.thinkingStartMs != null && D.thinkingMs == null && (L = { thinkingMs: P - D.thinkingStartMs });
446
- const Q = [...D.blocks], re = Q[Q.length - 1];
447
- return re != null && (u === "text" && re.type === "text" || u === "thinking" && re.type === "thinking") && re ? Q[Q.length - 1] = {
448
- ...re,
449
- text: re.text + T
450
- } : Q.push({ type: u, text: T }), { ...D, ...L, blocks: Q };
451
- })
452
- );
453
- },
454
- [Ve]
455
- ), Ot = Y(
456
- (t, s, u) => {
457
- Ve(
458
- t,
459
- (T) => T.map((f) => {
460
- if (f.id !== s) return f;
461
- const D = Date.now(), P = f.thinkingStartMs != null && f.thinkingMs == null ? { thinkingMs: D - f.thinkingStartMs } : {}, L = [...f.blocks];
462
- if (u.kind === "tool_call")
463
- L.push({
464
- type: "tool_call",
465
- id: u.id,
466
- name: u.name,
467
- input: u.input,
468
- _t0: D
469
- });
470
- else if (u.kind === "tool_end")
471
- for (let Q = L.length - 1; Q >= 0; Q--) {
472
- const re = L[Q];
473
- if (re.type === "tool_call" && u.id && re.id === u.id) {
474
- L[Q] = { ...re, input: u.input };
475
- break;
476
- }
477
- }
478
- else u.kind === "tool_result" && L.push({
479
- type: "tool_result",
480
- id: u.id,
481
- content: u.content,
482
- _t1: D
483
- });
484
- return { ...f, ...P, blocks: L };
485
- })
486
- );
487
- },
488
- [Ve]
489
- ), at = Y(() => {
490
- var f;
491
- const t = Ke.current;
492
- Ke.current = null, (f = Me.current) == null || f.abort(), Me.current = null, ue(!1), t && ba(t).catch(() => {
493
- });
494
- const s = ie.current;
495
- ie.current = null;
496
- const u = (D) => D.map(
497
- (P) => P.streaming ? {
498
- ...P,
499
- streaming: !1,
500
- stopped: !0,
501
- // 停止回合也结算耗时(与 onComplete 一致),避免「已停止生成」缺耗时显示
502
- durationMs: P.startedAtMs != null ? Date.now() - P.startedAtMs : void 0
503
- } : P
504
- );
505
- s && t && s.sid === t ? ve.current === t && E(u(s.messages)) : E((D) => u(D));
506
- const T = X.current;
507
- X.current = null, Be.current = null, Ae(null), T && q((D) => D ? D + `
508
- ` + T : T);
509
- }, []);
510
- M(() => {
511
- const t = (s) => {
512
- if (s.key !== "Escape" || s.isComposing) return;
513
- const u = s.target;
514
- u && (u.tagName === "TEXTAREA" || u.tagName === "INPUT") || (I ? (s.preventDefault(), at()) : Z != null && (s.preventDefault(), Fe(null), j.current && (j.current.style.height = "auto")));
515
- };
516
- return document.addEventListener("keydown", t), () => document.removeEventListener("keydown", t);
517
- }, [I, Z, at]);
518
- const Xe = async (t, s) => {
519
- const u = s ?? w;
520
- if (!u || !t || _.current) return;
521
- ce.current = null, Ce(!1);
522
- const T = {
523
- id: `local-user-${Date.now()}`,
524
- role: "user",
525
- blocks: [{ type: "text", text: t }]
526
- }, f = `local-assistant-${Date.now()}`, D = {
527
- id: f,
528
- role: "assistant",
529
- blocks: [],
530
- streaming: !0,
531
- startedAtMs: Date.now()
532
- };
533
- Ue.current = u, E((L) => {
534
- const Q = [...L, T, D];
535
- return ie.current = { sid: u, messages: Q }, Q;
536
- }), ue(!0), Ke.current = u, Ie.current = !0;
537
- const P = new AbortController();
538
- Me.current = P, await fa(
539
- u,
540
- t,
541
- {
542
- onToken: (L) => gt(u, f, "text", L),
543
- onReasoning: (L) => gt(u, f, "thinking", L),
544
- onEvent: (L) => Ot(u, f, L),
545
- onFinal: (L) => {
546
- ce.current = L;
547
- },
548
- onError: (L) => {
549
- ce.current = null, ue(!1), Me.current = null, Ke.current = null;
550
- const Q = ie.current, re = (xe) => xe.map(
551
- (ye) => ye.id === f ? {
552
- ...ye,
553
- streaming: !1,
554
- // 出错回合也结算耗时(重发/重试前能看到该回合跑了多久)
555
- durationMs: ye.startedAtMs != null ? Date.now() - ye.startedAtMs : void 0,
556
- error: ye.blocks.length ? L.message : `[错误] ${L.message}`
557
- } : ye
558
- );
559
- Q && Q.sid === u ? (Q.messages = re(Q.messages), ve.current === u && E(Q.messages)) : E((xe) => re(xe));
560
- const Ge = X.current;
561
- X.current = null, Be.current = null, Ae(null), Ge && q((xe) => xe ? xe + `
562
- ` + Ge : Ge);
563
- },
564
- onComplete: () => {
565
- ue(!1), Me.current = null, Ke.current = null;
566
- const L = ce.current;
567
- ce.current = null;
568
- const Q = ie.current;
569
- ie.current = null;
570
- const re = (ye) => ye.map(
571
- (Je) => Je.id === f ? {
572
- ...Je,
573
- streaming: !1,
574
- durationMs: (L == null ? void 0 : L.totalMs) ?? (Je.startedAtMs != null ? Date.now() - Je.startedAtMs : void 0),
575
- totalMs: (L == null ? void 0 : L.totalMs) ?? Je.totalMs,
576
- stopped: Je.stopped || (L == null ? void 0 : L.stopped) === !0,
577
- usage: Je.usage ?? (L == null ? void 0 : L.usage)
578
- } : Je
579
- );
580
- Q && Q.sid === u ? ve.current === u && E(re(Q.messages)) : E((ye) => re(ye));
581
- const Ge = X.current, xe = Be.current;
582
- X.current = null, Be.current = null, Ae(null), Ge && (xe && ve.current === xe ? Xe(Ge, xe) : q((ye) => ye ? ye + `
583
- ` + Ge : Ge));
584
- }
585
- },
586
- {
587
- agentType: a == null ? void 0 : a.localAgentType,
588
- agentId: a == null ? void 0 : a.localAgentId,
589
- signal: P.signal
590
- }
591
- );
592
- }, Ye = async (t, s) => {
593
- if (w)
594
- try {
595
- const { session: u, previousId: T } = await _a(
596
- w,
597
- t
598
- );
599
- We.current = !0, F(
600
- (f) => f.map((D) => D.id === T ? u : D)
601
- ), $(u.id), E(sn(u.messages)), await Xe(s, u.id);
602
- } catch {
603
- await Xe(s);
604
- }
605
- }, $t = (t, s) => {
606
- I || (q(s), Fe(t), requestAnimationFrame(() => {
607
- const u = j.current;
608
- u && (u.focus(), u.style.height = "auto", u.style.height = Math.min(u.scrollHeight, 180) + "px");
609
- }));
610
- }, St = () => {
611
- Fe(null), j.current && (j.current.style.height = "auto");
612
- }, Pt = () => {
613
- const t = X.current;
614
- X.current = null, Ae(null), t && q((s) => s ? s + `
615
- ` + t : t);
616
- }, ot = async (t) => {
617
- const s = (t ?? ne).trim();
618
- if (!(!s || we || _.current)) {
619
- Le(!0);
620
- try {
621
- const u = /* @__PURE__ */ new Date(), T = (P) => String(P).padStart(2, "0"), f = `${T(u.getMonth() + 1)}${T(u.getDate())} ${T(
622
- u.getHours()
623
- )}:${T(u.getMinutes())}`, D = await Kt(
624
- f,
625
- a == null ? void 0 : a.localAgentId,
626
- Ee
627
- );
628
- F((P) => [D, ...P]), v == null || v(), We.current = !0, $(D.id), E([]), $e(""), await Xe(s, D.id);
629
- } catch {
630
- } finally {
631
- Le(!1);
632
- }
633
- }
634
- }, At = () => {
635
- const t = oe.trim();
636
- if (t) {
637
- if (I) {
638
- X.current = X.current ? X.current + `
639
- ` + t : t, Be.current = w, Ae(X.current), q(""), Ne.current.delete(w ?? ""), j.current && (j.current.style.height = "auto");
640
- return;
641
- }
642
- if (q(""), Ne.current.delete(w ?? ""), j.current && (j.current.style.height = "auto"), Z != null) {
643
- const s = Z;
644
- Fe(null), Ye(s, t);
645
- return;
646
- }
647
- Xe(t);
648
- }
649
- }, Se = (t) => {
650
- In(t, K.sendKey) && !t.nativeEvent.isComposing && (t.preventDefault(), At()), t.key === "Escape" && (I ? at() : Z != null && St());
651
- }, n = (t) => {
652
- q(t.target.value);
653
- const s = t.target;
654
- s.style.height = "auto", s.style.height = Math.min(s.scrollHeight, 180) + "px";
655
- }, o = rn("local-default");
656
- rn(
657
- (V == null ? void 0 : V.username) || (V == null ? void 0 : V.display_name) || "user"
658
- );
659
- const h = (t) => {
660
- const s = /* @__PURE__ */ new Map();
661
- for (const f of t.blocks)
662
- f.type === "tool_result" && f.id && s.set(f.id, f);
663
- const u = /* @__PURE__ */ new Set();
664
- for (const f of t.blocks)
665
- f.type === "tool_call" && f.id && s.has(f.id) && u.add(f.id);
666
- const T = [];
667
- return t.blocks.forEach((f, D) => {
668
- if (f.type === "thinking")
669
- T.push(
670
- /* @__PURE__ */ e(
671
- ja,
672
- {
673
- text: f.text,
674
- streaming: !!t.streaming,
675
- startedAtMs: t.thinkingStartMs,
676
- durationMs: t.thinkingMs ?? f.durationMs
677
- },
678
- D
679
- )
680
- );
681
- else if (f.type === "tool_call") {
682
- const P = f.id ? s.get(f.id) : void 0, L = f._t0 != null && (P == null ? void 0 : P._t1) != null ? Math.max(1, P._t1 - f._t0) : f.durationMs;
683
- T.push(
684
- /* @__PURE__ */ e(
685
- Ka,
686
- {
687
- call: f,
688
- result: P,
689
- running: !!t.streaming && P === void 0,
690
- durationMs: L,
691
- startedAtMs: f._t0
692
- },
693
- D
694
- )
695
- );
696
- } else if (f.type === "tool_result") {
697
- if (f.id && u.has(f.id)) return;
698
- T.push(
699
- /* @__PURE__ */ e("div", { className: i.toolItem, children: /* @__PURE__ */ l("div", { className: i.toolBody, children: [
700
- /* @__PURE__ */ e("div", { className: i.toolSectionLabel, children: "工具结果" }),
701
- /* @__PURE__ */ e("pre", { className: i.toolPre, children: f.content || "(空)" })
702
- ] }) }, D)
703
- );
704
- } else f.type === "text" && f.text && T.push(/* @__PURE__ */ e(Ol, { text: f.text }, D));
705
- }), T;
706
- };
707
- if (!r)
708
- return /* @__PURE__ */ e("div", { className: i.container, children: /* @__PURE__ */ e("div", { className: i.chatPanel, children: /* @__PURE__ */ e("div", { className: i.chatEmpty, children: "本地 Agent 未启动,请检查桌面端是否正常运行" }) }) });
709
- const y = H.find((t) => t.id === w);
710
- return /* @__PURE__ */ l(
711
- "div",
712
- {
713
- className: i.container,
714
- "data-chat-width": x,
715
- children: [
716
- pe ? /* @__PURE__ */ e(
717
- "button",
718
- {
719
- type: "button",
720
- className: i.sessionExpandBtn,
721
- onClick: () => Pe(!1),
722
- title: "展开会话列表",
723
- children: /* @__PURE__ */ e(bn, {})
724
- }
725
- ) : /* @__PURE__ */ l("div", { className: i.sessionPanel, children: [
726
- /* @__PURE__ */ l("div", { className: i.sessionHeader, children: [
727
- /* @__PURE__ */ e("span", { children: "会话" }),
728
- /* @__PURE__ */ l("div", { className: i.sessionHeaderActions, children: [
729
- /* @__PURE__ */ e(
730
- "button",
731
- {
732
- type: "button",
733
- className: i.sessionBtnSm,
734
- onClick: () => {
735
- Re(!0), Te("");
736
- },
737
- title: "新建会话",
738
- children: /* @__PURE__ */ e(gn, {})
739
- }
740
- ),
741
- /* @__PURE__ */ e(
742
- "button",
743
- {
744
- type: "button",
745
- className: i.sessionBtnSm,
746
- onClick: () => Pe(!0),
747
- title: "收起会话列表",
748
- children: /* @__PURE__ */ e(On, {})
749
- }
750
- )
751
- ] })
752
- ] }),
753
- /* @__PURE__ */ l("div", { className: i.sessionSearchRow, children: [
754
- /* @__PURE__ */ e(
755
- "input",
756
- {
757
- className: i.sessionSearchInput,
758
- type: "text",
759
- placeholder: "搜索会话",
760
- value: G,
761
- onChange: (t) => k(t.target.value)
762
- }
763
- ),
764
- G && /* @__PURE__ */ e(
765
- "button",
766
- {
767
- type: "button",
768
- className: i.sessionSearchClear,
769
- onClick: () => k(""),
770
- title: "清除搜索",
771
- children: "✕"
772
- }
773
- )
774
- ] }),
775
- /* @__PURE__ */ l("div", { className: i.sessionList, children: [
776
- qe && /* @__PURE__ */ l("div", { className: i.sessionCreateRow, children: [
777
- /* @__PURE__ */ e(
778
- "input",
779
- {
780
- className: i.sessionCreateInput,
781
- type: "text",
782
- placeholder: "输入会话名称",
783
- value: fe,
784
- autoFocus: !0,
785
- onChange: (t) => Te(t.target.value),
786
- onKeyDown: (t) => {
787
- t.key === "Enter" && mt(), t.key === "Escape" && (Re(!1), Te(""));
788
- }
789
- }
790
- ),
791
- /* @__PURE__ */ e(
792
- "button",
793
- {
794
- type: "button",
795
- className: i.sessionCreateConfirm,
796
- onClick: () => void mt(),
797
- title: "确认创建",
798
- children: /* @__PURE__ */ e(fn, {})
799
- }
800
- ),
801
- /* @__PURE__ */ e(
802
- "button",
803
- {
804
- type: "button",
805
- className: i.sessionCreateCancel,
806
- onClick: () => {
807
- Re(!1), Te("");
808
- },
809
- title: "取消",
810
- children: "✕"
811
- }
812
- )
813
- ] }),
814
- H.length === 0 && !qe ? /* @__PURE__ */ l("div", { className: i.sessionEmpty, children: [
815
- /* @__PURE__ */ e("span", { children: "暂无会话" }),
816
- /* @__PURE__ */ e("span", { children: "点击「+」开始聊天" })
817
- ] }) : z.length === 0 ? /* @__PURE__ */ l("div", { className: i.sessionEmpty, children: [
818
- /* @__PURE__ */ e("span", { children: "无匹配会话" }),
819
- /* @__PURE__ */ e("span", { children: "换个关键词试试" })
820
- ] }) : z.map((t) => /* @__PURE__ */ l(
821
- "div",
822
- {
823
- className: `${i.sessionItem} ${w === t.id ? i.sessionItemActive : ""}`,
824
- onClick: () => $(t.id),
825
- children: [
826
- C === t.id ? /* @__PURE__ */ e(
827
- "input",
828
- {
829
- className: i.sessionRenameInput,
830
- type: "text",
831
- value: B,
832
- autoFocus: !0,
833
- onFocus: (s) => s.currentTarget.select(),
834
- onClick: (s) => s.stopPropagation(),
835
- onChange: (s) => J(s.target.value),
836
- onKeyDown: (s) => {
837
- s.key === "Enter" && _e(), s.key === "Escape" && (ee.current = !0, te(null));
838
- },
839
- onBlur: () => void _e()
840
- }
841
- ) : /* @__PURE__ */ l(
842
- "span",
843
- {
844
- className: i.sessionItemTitle,
845
- title: t.title,
846
- onDoubleClick: () => bt(t),
847
- children: [
848
- t.id === ht && /* @__PURE__ */ e(
849
- Ht,
850
- {
851
- spin: !0,
852
- className: i.sessionLiveDot
853
- }
854
- ),
855
- t.title
856
- ]
857
- }
858
- ),
859
- C !== t.id && /* @__PURE__ */ e("span", { className: i.sessionItemTime, children: Ml(t.updatedAt) }),
860
- /* @__PURE__ */ e(
861
- "button",
862
- {
863
- type: "button",
864
- className: i.sessionRenameBtn,
865
- onClick: (s) => {
866
- s.stopPropagation(), bt(t);
867
- },
868
- title: "重命名会话",
869
- children: /* @__PURE__ */ e(en, {})
870
- }
871
- ),
872
- /* @__PURE__ */ e(
873
- "button",
874
- {
875
- type: "button",
876
- className: i.sessionDeleteBtn,
877
- onClick: (s) => {
878
- s.stopPropagation(), It(t.id);
879
- },
880
- title: "删除会话",
881
- children: /* @__PURE__ */ e($n, {})
882
- }
883
- )
884
- ]
885
- },
886
- t.id
887
- ))
888
- ] })
889
- ] }),
890
- /* @__PURE__ */ l("div", { className: i.chatPanel, children: [
891
- /* @__PURE__ */ l("div", { className: i.chatHeader, children: [
892
- /* @__PURE__ */ e(
893
- "div",
894
- {
895
- className: i.agentAvatar,
896
- style: { backgroundColor: o },
897
- children: Wt((a == null ? void 0 : a.displayName) || "本地 Agent")
898
- }
899
- ),
900
- /* @__PURE__ */ l("div", { className: i.chatHeaderMeta, children: [
901
- /* @__PURE__ */ e("span", { className: i.chatHeaderName, children: (a == null ? void 0 : a.displayName) || "本地 Agent" }),
902
- y && /* @__PURE__ */ e("span", { className: i.chatHeaderSession, children: y.title })
903
- ] }),
904
- /* @__PURE__ */ e("span", { className: i.chatHeaderBadge, children: (a == null ? void 0 : a.localAgentType) === "jar" ? "内置模型" : a == null ? void 0 : a.localAgentType }),
905
- I && /* @__PURE__ */ l("span", { className: i.streamingIndicator, children: [
906
- /* @__PURE__ */ e(Ht, {}),
907
- " 工作中…"
908
- ] })
909
- ] }),
910
- w ? /* @__PURE__ */ l(ze, { children: [
911
- /* @__PURE__ */ e(
912
- "div",
913
- {
914
- className: i.threadScroll,
915
- ref: me,
916
- onScroll: wt,
917
- children: /* @__PURE__ */ e("div", { className: i.threadInner, children: st && O.length === 0 ? /* @__PURE__ */ e("div", { className: i.chatEmpty, children: "加载中…" }) : O.length === 0 ? /* @__PURE__ */ l("div", { className: i.landing, children: [
918
- /* @__PURE__ */ e(
919
- "div",
920
- {
921
- className: i.landingLogo,
922
- style: { backgroundColor: o },
923
- children: Wt((a == null ? void 0 : a.displayName) || "本地 Agent")
924
- }
925
- ),
926
- /* @__PURE__ */ l("div", { className: i.landingTitle, children: [
927
- "与 ",
928
- (a == null ? void 0 : a.displayName) || "本地 Agent",
929
- " 协作"
930
- ] }),
931
- /* @__PURE__ */ e("div", { className: i.landingHint, children: "思考过程与工具调用实时可见 · Enter 发送 · Esc 停止" }),
932
- /* @__PURE__ */ e("div", { className: i.landingChips, children: cn.map((t) => /* @__PURE__ */ e(
933
- "button",
934
- {
935
- type: "button",
936
- className: i.landingChip,
937
- onClick: () => void Xe(t),
938
- children: t
939
- },
940
- t
941
- )) })
942
- ] }) : O.map(
943
- (t, s) => t.role === "user" ? /* @__PURE__ */ l("div", { className: i.userRow, children: [
944
- /* @__PURE__ */ e("div", { className: i.userBubble, children: ct(t.blocks) }),
945
- !I && /* @__PURE__ */ l("div", { className: i.userActions, children: [
946
- /* @__PURE__ */ e(
947
- Xt,
948
- {
949
- inline: !0,
950
- label: "复制",
951
- getText: () => ct(t.blocks)
952
- }
953
- ),
954
- /* @__PURE__ */ e(
955
- "button",
956
- {
957
- type: "button",
958
- className: i.userActionBtn,
959
- title: "编辑重发(其后内容将被截断)",
960
- "aria-label": "编辑重发",
961
- onClick: () => $t(s, ct(t.blocks)),
962
- children: /* @__PURE__ */ e(en, {})
963
- }
964
- ),
965
- /* @__PURE__ */ e(
966
- "button",
967
- {
968
- type: "button",
969
- className: i.userActionBtn,
970
- title: "重发(截断后原样重发)",
971
- "aria-label": "重发",
972
- onClick: () => void Ye(
973
- s,
974
- ct(t.blocks)
975
- ),
976
- children: /* @__PURE__ */ e(Pn, {})
977
- }
978
- )
979
- ] })
980
- ] }, t.id) : /* @__PURE__ */ l("div", { className: i.assistantBlock, children: [
981
- h(t),
982
- t.streaming && t.blocks.length === 0 && /* @__PURE__ */ e("span", { className: i.thinkingHint, children: "正在思考…" }),
983
- t.streaming && t.startedAtMs != null && /* @__PURE__ */ e($l, { startedAtMs: t.startedAtMs }),
984
- t.streaming && t.blocks.every(
985
- (u) => u.type !== "tool_call" && u.type !== "thinking"
986
- ) && /* @__PURE__ */ e("span", { className: i.caretCursor }),
987
- !t.streaming && (t.durationMs != null || t.totalMs != null) && /* @__PURE__ */ l("div", { className: i.msgMeta, children: [
988
- ((t.durationMs ?? t.totalMs) / 1e3).toFixed(1),
989
- "s",
990
- (() => {
991
- var D, P;
992
- const u = ((D = t.usage) == null ? void 0 : D.inputTokens) ?? 0, T = ((P = t.usage) == null ? void 0 : P.outputTokens) ?? 0, f = u + T;
993
- return f > 0 ? ` · ${El(f)} tokens` : "";
994
- })()
995
- ] }),
996
- !t.streaming && /* @__PURE__ */ e(
997
- Xt,
998
- {
999
- getText: () => ct(t.blocks)
1000
- }
1001
- ),
1002
- t.error && /* @__PURE__ */ l("div", { className: i.errorBar, children: [
1003
- t.error,
1004
- !I && Z == null && /* @__PURE__ */ e(
1005
- "button",
1006
- {
1007
- type: "button",
1008
- className: i.errorRetryBtn,
1009
- title: "重试:重发上一条用户消息(其后内容截断)",
1010
- onClick: () => {
1011
- let u = s - 1;
1012
- for (; u >= 0 && O[u].role !== "user"; )
1013
- u--;
1014
- u >= 0 && Ye(
1015
- u,
1016
- ct(O[u].blocks)
1017
- );
1018
- },
1019
- children: "重试"
1020
- }
1021
- )
1022
- ] }),
1023
- t.stopped && /* @__PURE__ */ e("div", { className: i.stoppedBar, children: "已停止生成" })
1024
- ] }, t.id)
1025
- ) })
1026
- }
1027
- ),
1028
- /* @__PURE__ */ e(
1029
- "button",
1030
- {
1031
- type: "button",
1032
- className: `${i.scrollTopBtn} ${le ? i.scrollTopBtnVisible : ""}`,
1033
- onClick: Tt,
1034
- title: "回到最新消息",
1035
- "aria-label": "回到最新消息",
1036
- children: /* @__PURE__ */ e(Ft, {})
1037
- }
1038
- ),
1039
- /* @__PURE__ */ l("div", { className: i.composerWrap, children: [
1040
- Z != null && /* @__PURE__ */ l("div", { className: i.editingBar, children: [
1041
- /* @__PURE__ */ e("span", { children: "正在编辑历史消息:发送后其后内容将被丢弃,并以全新上下文重发" }),
1042
- /* @__PURE__ */ e(
1043
- "button",
1044
- {
1045
- type: "button",
1046
- className: i.editingCancel,
1047
- onClick: St,
1048
- title: "取消编辑",
1049
- children: "取消"
1050
- }
1051
- )
1052
- ] }),
1053
- de != null && /* @__PURE__ */ l("div", { className: i.pendingBar, children: [
1054
- /* @__PURE__ */ l("span", { children: [
1055
- "已排队:「",
1056
- de.slice(0, 30),
1057
- de.length > 30 ? "…" : "",
1058
- "」生成结束后自动发送"
1059
- ] }),
1060
- /* @__PURE__ */ e(
1061
- "button",
1062
- {
1063
- type: "button",
1064
- className: i.editingCancel,
1065
- onClick: Pt,
1066
- title: "取消排队消息(回填输入框)",
1067
- children: "取消"
1068
- }
1069
- )
1070
- ] }),
1071
- /* @__PURE__ */ l("div", { className: i.workdirBar, children: [
1072
- /* @__PURE__ */ l(
1073
- "button",
1074
- {
1075
- type: "button",
1076
- className: i.workdirChip,
1077
- onClick: lt,
1078
- title: nt ? "当前会话绑定的工作目录(点击更换)" : "给这个会话绑定本机工作目录",
1079
- children: [
1080
- /* @__PURE__ */ e(Vt, {}),
1081
- /* @__PURE__ */ e("span", { children: he(nt) }),
1082
- /* @__PURE__ */ e(Ft, { className: i.workdirCaret })
1083
- ]
1084
- }
1085
- ),
1086
- /* @__PURE__ */ e("span", { className: i.workdirPath, title: nt ?? "", children: nt ?? "未绑定目录:任务不带目录上下文" })
1087
- ] }),
1088
- /* @__PURE__ */ l("div", { className: i.composer, children: [
1089
- /* @__PURE__ */ e(
1090
- "textarea",
1091
- {
1092
- ref: j,
1093
- className: i.composerInput,
1094
- placeholder: I ? w === ht ? "正在工作中…(Esc 停止)" : "后台回合进行中,输入将排队发送" : "向 Agent 发消息,Enter 发送,Shift+Enter 换行",
1095
- value: oe,
1096
- onChange: n,
1097
- onKeyDown: Se,
1098
- rows: 1
1099
- }
1100
- ),
1101
- I ? /* @__PURE__ */ e(
1102
- "button",
1103
- {
1104
- type: "button",
1105
- className: i.stopBtn,
1106
- onClick: at,
1107
- title: "停止生成(Esc)",
1108
- "aria-label": "停止生成",
1109
- children: /* @__PURE__ */ e(Hn, {})
1110
- }
1111
- ) : /* @__PURE__ */ e(
1112
- "button",
1113
- {
1114
- type: "button",
1115
- className: `${i.sendBtn} ${oe.trim() ? i.sendBtnReady : ""}`,
1116
- disabled: !oe.trim(),
1117
- onClick: At,
1118
- title: "发送",
1119
- "aria-label": "发送",
1120
- children: /* @__PURE__ */ e(jt, {})
1121
- }
1122
- )
1123
- ] }),
1124
- /* @__PURE__ */ e("div", { className: i.composerHint, children: I ? "Agent 正在工作中,可按 Esc 或点击停止按钮中断" : "Enter 发送 · Shift+Enter 换行 · 思考与工具调用自动展示" })
1125
- ] })
1126
- ] }) : H.length === 0 ? (
1127
- /* 无会话:居中大输入框,发送自动建会话(时间戳命名) */
1128
- /* @__PURE__ */ l("div", { className: i.newChatLanding, children: [
1129
- /* @__PURE__ */ e(
1130
- "div",
1131
- {
1132
- className: i.landingLogo,
1133
- style: { backgroundColor: o },
1134
- children: Wt((a == null ? void 0 : a.displayName) || "本地 Agent")
1135
- }
1136
- ),
1137
- /* @__PURE__ */ l("div", { className: i.landingTitle, children: [
1138
- "与 ",
1139
- (a == null ? void 0 : a.displayName) || "本地 Agent",
1140
- " 协作"
1141
- ] }),
1142
- /* @__PURE__ */ e("div", { className: i.landingHint, children: "输入即自动创建会话 · Enter 发送 · Esc 停止" }),
1143
- /* @__PURE__ */ l("div", { className: i.workdirBar, children: [
1144
- /* @__PURE__ */ l(
1145
- "button",
1146
- {
1147
- type: "button",
1148
- className: i.workdirChip,
1149
- onClick: lt,
1150
- title: "选择这次任务在本机哪个目录下执行",
1151
- children: [
1152
- /* @__PURE__ */ e(Vt, {}),
1153
- /* @__PURE__ */ e("span", { children: he(Ee) }),
1154
- /* @__PURE__ */ e(Ft, { className: i.workdirCaret })
1155
- ]
1156
- }
1157
- ),
1158
- /* @__PURE__ */ e("span", { className: i.workdirPath, title: Ee ?? "", children: Ee ?? "未绑定目录:任务不带目录上下文" })
1159
- ] }),
1160
- /* @__PURE__ */ l("div", { className: i.landingComposer, children: [
1161
- /* @__PURE__ */ e(
1162
- "textarea",
1163
- {
1164
- className: i.landingInput,
1165
- placeholder: "描述你的任务,发送后自动创建会话…",
1166
- value: ne,
1167
- autoFocus: !0,
1168
- onChange: (t) => $e(t.target.value),
1169
- onKeyDown: (t) => {
1170
- t.key === "Enter" && !t.shiftKey && !t.nativeEvent.isComposing && (t.preventDefault(), ot());
1171
- },
1172
- rows: 3
1173
- }
1174
- ),
1175
- /* @__PURE__ */ e(
1176
- "button",
1177
- {
1178
- type: "button",
1179
- className: `${i.sendBtn} ${ne.trim() && !we ? i.sendBtnReady : ""}`,
1180
- disabled: !ne.trim() || we,
1181
- onClick: () => void ot(),
1182
- title: "发送并创建会话",
1183
- "aria-label": "发送并创建会话",
1184
- children: /* @__PURE__ */ e(jt, {})
1185
- }
1186
- )
1187
- ] }),
1188
- /* @__PURE__ */ e("div", { className: i.landingChips, children: cn.map((t) => /* @__PURE__ */ e(
1189
- "button",
1190
- {
1191
- type: "button",
1192
- className: i.landingChip,
1193
- onClick: () => void ot(t),
1194
- children: t
1195
- },
1196
- t
1197
- )) })
1198
- ] })
1199
- ) : /* @__PURE__ */ e("div", { className: i.chatEmpty, children: "请在左侧选择或创建一个会话" })
1200
- ] }),
1201
- xt && /* @__PURE__ */ e(
1202
- "div",
1203
- {
1204
- className: i.dirMask,
1205
- role: "presentation",
1206
- onMouseDown: () => je(!1),
1207
- children: /* @__PURE__ */ l(
1208
- "div",
1209
- {
1210
- className: i.dirModal,
1211
- role: "dialog",
1212
- "aria-label": "选择工作目录",
1213
- onMouseDown: (t) => t.stopPropagation(),
1214
- children: [
1215
- /* @__PURE__ */ l("div", { className: i.dirHead, children: [
1216
- /* @__PURE__ */ e("span", { children: "选择工作目录" }),
1217
- /* @__PURE__ */ e(
1218
- "button",
1219
- {
1220
- type: "button",
1221
- className: i.dirClose,
1222
- onClick: () => je(!1),
1223
- "aria-label": "关闭",
1224
- children: /* @__PURE__ */ e(Fn, {})
1225
- }
1226
- )
1227
- ] }),
1228
- /* @__PURE__ */ l("div", { className: i.dirBar, children: [
1229
- /* @__PURE__ */ e(
1230
- "button",
1231
- {
1232
- type: "button",
1233
- className: i.dirUp,
1234
- disabled: !(W != null && W.parent) || ut,
1235
- onClick: () => (W == null ? void 0 : W.parent) && void be(W.parent),
1236
- title: "上一级",
1237
- "aria-label": "上一级",
1238
- children: /* @__PURE__ */ e(jt, {})
1239
- }
1240
- ),
1241
- /* @__PURE__ */ e("span", { className: i.dirPathText, title: W == null ? void 0 : W.path, children: (W == null ? void 0 : W.path) ?? "…" })
1242
- ] }),
1243
- /* @__PURE__ */ e("div", { className: i.dirList, children: ut ? /* @__PURE__ */ l("div", { className: i.dirEmpty, children: [
1244
- /* @__PURE__ */ e(Ht, {}),
1245
- " 读取中…"
1246
- ] }) : W && W.entries.length > 0 ? W.entries.map((t) => /* @__PURE__ */ l(
1247
- "button",
1248
- {
1249
- type: "button",
1250
- className: i.dirItem,
1251
- onClick: () => void be(t.path),
1252
- children: [
1253
- /* @__PURE__ */ e(jn, {}),
1254
- /* @__PURE__ */ e("span", { children: t.name })
1255
- ]
1256
- },
1257
- t.path
1258
- )) : /* @__PURE__ */ e("div", { className: i.dirEmpty, children: "没有子目录" }) }),
1259
- vt && /* @__PURE__ */ e("div", { className: i.dirError, children: vt }),
1260
- /* @__PURE__ */ l("div", { className: i.dirFoot, children: [
1261
- /* @__PURE__ */ e(
1262
- "button",
1263
- {
1264
- type: "button",
1265
- className: i.dirCancel,
1266
- onClick: () => je(!1),
1267
- children: "取消"
1268
- }
1269
- ),
1270
- /* @__PURE__ */ e(
1271
- "button",
1272
- {
1273
- type: "button",
1274
- className: i.dirConfirm,
1275
- disabled: !W || ut,
1276
- onClick: () => W && void Nt(W.path),
1277
- children: "用这个目录"
1278
- }
1279
- )
1280
- ] })
1281
- ]
1282
- }
1283
- )
1284
- }
1285
- )
1286
- ]
1287
- }
1288
- );
1289
- }
1290
- const Hl = "_sidebarInner_1vu3c_1", Fl = "_header_1vu3c_8", jl = "_headerActions_1vu3c_19", Kl = "_tabBar_1vu3c_26", Wl = "_tab_1vu3c_26", Ul = "_tabActive_1vu3c_50", Vl = "_btnSm_1vu3c_66", Gl = "_agentSection_1vu3c_84", zl = "_agentItem_1vu3c_90", ql = "_agentItemActive_1vu3c_112", Zl = "_agentAvatar_1vu3c_117", Ql = "_agentName_1vu3c_130", Xl = "_emptyState_1vu3c_156", Yl = "_createInputRow_1vu3c_168", Jl = "_createInput_1vu3c_168", ei = "_createConfirmBtn_1vu3c_188", ti = "_contextMenu_1vu3c_205", ni = "_contextMenuItem_1vu3c_216", ai = "_contextMenuItemDanger_1vu3c_231", si = "_contextMenuDivider_1vu3c_239", li = "_renameOverlay_1vu3c_246", ii = "_renameDialog_1vu3c_259", ri = "_renameTitle_1vu3c_267", oi = "_renameInput_1vu3c_274", ci = "_renameActions_1vu3c_289", di = "_renameBtn_1vu3c_295", ui = "_renameBtnPrimary_1vu3c_309", pi = "_agentDetailBtn_1vu3c_326", hi = "_agentItemShared_1vu3c_358", mi = "_agentInfo_1vu3c_362", bi = "_agentOwner_1vu3c_374", gi = "_sharedBadge_1vu3c_382", fi = "_createLocalDialog_1vu3c_430", _i = "_createLocalLabel_1vu3c_438", yi = "_agentTypeCards_1vu3c_446", vi = "_agentTypeCard_1vu3c_446", Ni = "_agentTypeIcon_1vu3c_474", ki = "_agentTypeBody_1vu3c_487", Ci = "_agentTypeTitle_1vu3c_494", wi = "_agentTypeDesc_1vu3c_500", Ti = "_agentTypeBadge_1vu3c_506", p = {
1291
- sidebarInner: Hl,
1292
- header: Fl,
1293
- headerActions: jl,
1294
- tabBar: Kl,
1295
- tab: Wl,
1296
- tabActive: Ul,
1297
- btnSm: Vl,
1298
- agentSection: Gl,
1299
- agentItem: zl,
1300
- agentItemActive: ql,
1301
- agentAvatar: Zl,
1302
- agentName: Ql,
1303
- emptyState: Xl,
1304
- createInputRow: Yl,
1305
- createInput: Jl,
1306
- createConfirmBtn: ei,
1307
- contextMenu: ti,
1308
- contextMenuItem: ni,
1309
- contextMenuItemDanger: ai,
1310
- contextMenuDivider: si,
1311
- renameOverlay: li,
1312
- renameDialog: ii,
1313
- renameTitle: ri,
1314
- renameInput: oi,
1315
- renameActions: ci,
1316
- renameBtn: di,
1317
- renameBtnPrimary: ui,
1318
- agentDetailBtn: pi,
1319
- agentItemShared: hi,
1320
- agentInfo: mi,
1321
- agentOwner: bi,
1322
- sharedBadge: gi,
1323
- createLocalDialog: fi,
1324
- createLocalLabel: _i,
1325
- agentTypeCards: yi,
1326
- agentTypeCard: vi,
1327
- agentTypeIcon: Ni,
1328
- agentTypeBody: ki,
1329
- agentTypeTitle: Ci,
1330
- agentTypeDesc: wi,
1331
- agentTypeBadge: Ti
1332
- }, dn = [
1333
- "#2F70F1",
1334
- "#52c41a",
1335
- "#fa8c16",
1336
- "#eb2f96",
1337
- "#722ed1",
1338
- "#13c2c2",
1339
- "#f5222d",
1340
- "#faad14"
1341
- ];
1342
- function un(a) {
1343
- let c = 0;
1344
- for (let b = 0; b < a.length; b++) c = c * 31 + a.charCodeAt(b) | 0;
1345
- return dn[Math.abs(c) % dn.length];
1346
- }
1347
- function pn(a) {
1348
- return a ? a.charAt(0).toUpperCase() : "?";
1349
- }
1350
- const Dt = "-1";
1351
- function Ii({
1352
- selectedAgentId: a,
1353
- selectedLocalAgentId: c,
1354
- onSelectAgent: b,
1355
- onShowDetail: g,
1356
- onChatWithAgent: A
1357
- }) {
1358
- const R = Oe((r) => r.token), v = Oe((r) => r.personalChatNav), [x, V] = m(
1359
- v.tab === "shared" ? "shared" : "remote"
1360
- ), [K, H] = m([]), [F, G] = m(!1), [k, C] = m(!1), [te, B] = m(""), [J, ee] = m(!1), [z, w] = m(null), [$, O] = m(null), [E, oe] = m(!1), [q, I] = m([]), [se, _] = m(!1), [ce, de] = m(null), [Ae, X] = m(!1), [Be, ve] = m([]), [Ne, ke] = m(!1), [ue, st] = m(!1), Ce = U(null), ne = Y(async () => {
1361
- G(!0);
1362
- try {
1363
- const r = await kn(R);
1364
- H(r), a && !r.find((S) => De(S.id, a)) && b(null);
1365
- } catch {
1366
- } finally {
1367
- G(!1);
1368
- }
1369
- }, [R, a, b]), $e = Y(async () => {
1370
- _(!0);
1371
- try {
1372
- const r = await aa(R);
1373
- I(r);
1374
- } catch {
1375
- } finally {
1376
- _(!1);
1377
- }
1378
- }, [R]);
1379
- M(() => {
1380
- v.trigger > 0 && v.tab && V(v.tab);
1381
- }, [v.trigger]), M(() => {
1382
- x === "remote" ? ne() : x === "shared" && $e();
1383
- }, [ne, $e, x]);
1384
- const we = Y(async () => {
1385
- try {
1386
- const r = await Gt();
1387
- ve(r);
1388
- } catch {
1389
- ve([]);
1390
- }
1391
- }, []);
1392
- M(() => {
1393
- x === "local" && zt().then((r) => {
1394
- X(r), r && we();
1395
- });
1396
- }, [x, we]), M(() => {
1397
- if (!z) return;
1398
- const r = (S) => {
1399
- Ce.current && !Ce.current.contains(S.target) && w(null);
1400
- };
1401
- return document.addEventListener("mousedown", r), () => document.removeEventListener("mousedown", r);
1402
- }, [z]);
1403
- const Le = async () => {
1404
- const r = te.trim();
1405
- if (r) {
1406
- ee(!0);
1407
- try {
1408
- const S = await sa(r, R);
1409
- H((le) => [...le, S]), B(""), C(!1), b(S);
1410
- } catch {
1411
- } finally {
1412
- ee(!1);
1413
- }
1414
- }
1415
- }, qe = async (r) => {
1416
- if (r === "jar") {
1417
- ke(!1), A({
1418
- id: Dt,
1419
- userId: "local",
1420
- agentHubAgentId: null,
1421
- agentCode: "local-default",
1422
- displayName: "本地 Agent",
1423
- avatar: null,
1424
- isLocal: !0
1425
- });
1426
- return;
1427
- }
1428
- if (!Ae) {
1429
- if (!await zt()) {
1430
- Bt.error(
1431
- "本地 Agent 未启动,请通过菜单栏「重启 Agent」启动后再试"
1432
- );
1433
- return;
1434
- }
1435
- X(!0);
1436
- }
1437
- st(!0);
1438
- try {
1439
- const S = r === "hermes" ? "hermes" : "claude-code";
1440
- await ya(S, r), Bt.success(`已引入 ${S},点击列表项即可开始对话`), ke(!1), await we();
1441
- } catch (S) {
1442
- Bt.error(
1443
- S.message || "创建失败,请检查本地 Agent 是否正常运行"
1444
- );
1445
- } finally {
1446
- st(!1);
1447
- }
1448
- }, Re = async (r) => {
1449
- if (await _t({ content: "确定删除此 Agent?" }))
1450
- try {
1451
- await va(r), await we();
1452
- } catch (S) {
1453
- Bt.error(S.message || "删除失败");
1454
- }
1455
- }, fe = async (r) => {
1456
- if (await _t({
1457
- content: `确定删除 Agent「${r.displayName}」吗?所有会话记录将一并删除。`
1458
- }))
1459
- try {
1460
- await la(r.id, R), H((S) => S.filter((le) => le.id !== r.id)), De(a, r.id) && b(null);
1461
- } catch {
1462
- }
1463
- }, Te = async () => {
1464
- if (!$) return;
1465
- const r = $.value.trim();
1466
- if (!r || r === $.agent.displayName) {
1467
- O(null);
1468
- return;
1469
- }
1470
- oe(!0);
1471
- try {
1472
- const S = await ia(
1473
- $.agent.id,
1474
- r,
1475
- R
1476
- );
1477
- H((le) => le.map((He) => He.id === S.id ? S : He)), De(a, S.id) && b(S), O(null);
1478
- } catch {
1479
- } finally {
1480
- oe(!1);
1481
- }
1482
- }, pe = async (r) => {
1483
- const S = r.shared === 1;
1484
- if (await _t({
1485
- title: S ? "取消共享" : "共享 Agent",
1486
- content: S ? `确定取消共享 Agent「${r.displayName}」吗?取消后其他用户将无法与此 Agent 聊天。` : `确定共享 Agent「${r.displayName}」吗?共享后其他用户可以与此 Agent 发起聊天。`,
1487
- danger: !1
1488
- })) {
1489
- de(r.id);
1490
- try {
1491
- const le = await ra(
1492
- r.id,
1493
- !S,
1494
- R
1495
- );
1496
- H((He) => He.map((Z) => Z.id === le.id ? le : Z));
1497
- } catch {
1498
- } finally {
1499
- de(null);
1500
- }
1501
- }
1502
- }, Pe = (r, S) => {
1503
- r.preventDefault(), r.stopPropagation(), w({ x: r.clientX, y: r.clientY, agent: S });
1504
- };
1505
- return /* @__PURE__ */ l("div", { className: p.sidebarInner, children: [
1506
- /* @__PURE__ */ l("div", { className: p.header, children: [
1507
- /* @__PURE__ */ e("span", { children: "个人 Agent" }),
1508
- x === "remote" && /* @__PURE__ */ e("div", { className: p.headerActions, children: /* @__PURE__ */ e(
1509
- "button",
1510
- {
1511
- type: "button",
1512
- className: p.btnSm,
1513
- onClick: () => {
1514
- C((r) => !r), B("");
1515
- },
1516
- title: "新建个人 Agent",
1517
- children: "+ 新建"
1518
- }
1519
- ) }),
1520
- x === "local" && /* @__PURE__ */ e("div", { className: p.headerActions, children: /* @__PURE__ */ e(
1521
- "button",
1522
- {
1523
- type: "button",
1524
- className: p.btnSm,
1525
- onClick: () => ke(!0),
1526
- title: "新建本地 Agent",
1527
- children: "+ 新增"
1528
- }
1529
- ) })
1530
- ] }),
1531
- /* @__PURE__ */ l("div", { className: p.tabBar, children: [
1532
- /* @__PURE__ */ e(
1533
- "button",
1534
- {
1535
- type: "button",
1536
- className: `${p.tab} ${x === "local" ? p.tabActive : ""}`,
1537
- onClick: () => V("local"),
1538
- title: "本地 Agent",
1539
- children: "本地"
1540
- }
1541
- ),
1542
- /* @__PURE__ */ e(
1543
- "button",
1544
- {
1545
- type: "button",
1546
- className: `${p.tab} ${x === "remote" ? p.tabActive : ""}`,
1547
- onClick: () => V("remote"),
1548
- children: "远程"
1549
- }
1550
- ),
1551
- /* @__PURE__ */ e(
1552
- "button",
1553
- {
1554
- type: "button",
1555
- className: `${p.tab} ${x === "shared" ? p.tabActive : ""}`,
1556
- onClick: () => V("shared"),
1557
- children: "共享"
1558
- }
1559
- )
1560
- ] }),
1561
- x === "local" ? /* @__PURE__ */ e("div", { className: p.agentSection, children: Ae ? /* @__PURE__ */ e(ze, { children: Be.map((r) => /* @__PURE__ */ l(
1562
- "div",
1563
- {
1564
- className: `${p.agentItem} ${De(a, Dt) && (r.type === "jar" && !c || c === r.id) ? p.agentItemActive : ""}`,
1565
- onClick: () => {
1566
- r.type === "jar" ? b({
1567
- id: Dt,
1568
- userId: "local",
1569
- agentHubAgentId: null,
1570
- agentCode: "local-default",
1571
- displayName: r.name,
1572
- avatar: null,
1573
- isLocal: !0
1574
- }) : b({
1575
- id: Dt,
1576
- userId: "local",
1577
- agentHubAgentId: null,
1578
- agentCode: r.name,
1579
- displayName: r.name,
1580
- avatar: null,
1581
- isLocal: !0,
1582
- localAgentId: r.id,
1583
- localAgentType: r.type
1584
- });
1585
- },
1586
- children: [
1587
- /* @__PURE__ */ e(
1588
- "div",
1589
- {
1590
- className: p.agentAvatar,
1591
- style: {
1592
- backgroundColor: r.type === "hermes" ? "#722ed1" : r.type === "claude-code" ? "#eb2f96" : "#52c41a"
1593
- },
1594
- children: r.type === "hermes" ? "H" : r.type === "claude-code" ? "C" : "L"
1595
- }
1596
- ),
1597
- /* @__PURE__ */ e("span", { className: p.agentName, children: r.name }),
1598
- r.type !== "jar" && /* @__PURE__ */ e(
1599
- "button",
1600
- {
1601
- type: "button",
1602
- className: p.agentDetailBtn,
1603
- onClick: (S) => {
1604
- S.stopPropagation(), Re(r.id);
1605
- },
1606
- title: "删除",
1607
- children: /* @__PURE__ */ e("span", { style: { fontSize: 14 }, children: "×" })
1608
- }
1609
- )
1610
- ]
1611
- },
1612
- r.id
1613
- )) }) : /* @__PURE__ */ l("div", { className: p.emptyState, children: [
1614
- /* @__PURE__ */ e("span", { children: "本地 Agent 未启动" }),
1615
- /* @__PURE__ */ e("span", { children: "请检查桌面端是否正常运行" })
1616
- ] }) }) : x === "shared" ? /* @__PURE__ */ e("div", { className: p.agentSection, children: se && q.length === 0 ? /* @__PURE__ */ e("div", { className: p.emptyState, children: "加载中..." }) : q.length === 0 ? /* @__PURE__ */ l("div", { className: p.emptyState, children: [
1617
- /* @__PURE__ */ e("span", { children: "暂无共享 Agent" }),
1618
- /* @__PURE__ */ e("span", { children: "其他用户共享的 Agent 会显示在这里" })
1619
- ] }) : q.map((r) => /* @__PURE__ */ l(
1620
- "div",
1621
- {
1622
- className: `${p.agentItem} ${p.agentItemShared}`,
1623
- onClick: () => A(r),
1624
- title: `点击与「${r.displayName}」聊天`,
1625
- children: [
1626
- /* @__PURE__ */ e(
1627
- "div",
1628
- {
1629
- className: p.agentAvatar,
1630
- style: {
1631
- backgroundColor: un(
1632
- r.agentCode || r.displayName
1633
- )
1634
- },
1635
- children: pn(r.displayName)
1636
- }
1637
- ),
1638
- /* @__PURE__ */ l("div", { className: p.agentInfo, children: [
1639
- /* @__PURE__ */ e("span", { className: p.agentName, children: r.displayName }),
1640
- /* @__PURE__ */ l("span", { className: p.agentOwner, children: [
1641
- "来自: ",
1642
- r.userId
1643
- ] })
1644
- ] }),
1645
- /* @__PURE__ */ e(
1646
- "button",
1647
- {
1648
- type: "button",
1649
- className: p.agentDetailBtn,
1650
- onClick: (S) => {
1651
- S.stopPropagation(), A(r);
1652
- },
1653
- title: "开始聊天",
1654
- children: /* @__PURE__ */ e(_n, { style: { fontSize: 12 } })
1655
- }
1656
- )
1657
- ]
1658
- },
1659
- r.id
1660
- )) }) : /* @__PURE__ */ l(ze, { children: [
1661
- k && /* @__PURE__ */ l("div", { className: p.createInputRow, children: [
1662
- /* @__PURE__ */ e(
1663
- "input",
1664
- {
1665
- className: p.createInput,
1666
- type: "text",
1667
- placeholder: "输入 Agent 名称",
1668
- value: te,
1669
- autoFocus: !0,
1670
- onChange: (r) => B(r.target.value),
1671
- onKeyDown: (r) => {
1672
- r.key === "Enter" && Le(), r.key === "Escape" && (C(!1), B(""));
1673
- }
1674
- }
1675
- ),
1676
- /* @__PURE__ */ e(
1677
- "button",
1678
- {
1679
- type: "button",
1680
- className: p.createConfirmBtn,
1681
- disabled: !te.trim() || J,
1682
- onClick: Le,
1683
- children: J ? "..." : "创建"
1684
- }
1685
- )
1686
- ] }),
1687
- /* @__PURE__ */ e("div", { className: p.agentSection, children: F && K.length === 0 ? /* @__PURE__ */ e("div", { className: p.emptyState, children: "加载中..." }) : K.length === 0 ? /* @__PURE__ */ l("div", { className: p.emptyState, children: [
1688
- /* @__PURE__ */ e("span", { children: "暂无个人 Agent" }),
1689
- /* @__PURE__ */ e("span", { children: "点击「新建」创建一个" })
1690
- ] }) : K.map((r) => /* @__PURE__ */ l(
1691
- "div",
1692
- {
1693
- className: `${p.agentItem} ${De(a, r.id) ? p.agentItemActive : ""}`,
1694
- onClick: () => b(r),
1695
- onContextMenu: (S) => Pe(S, r),
1696
- children: [
1697
- /* @__PURE__ */ e(
1698
- "div",
1699
- {
1700
- className: p.agentAvatar,
1701
- style: {
1702
- backgroundColor: un(
1703
- r.agentCode || r.displayName
1704
- )
1705
- },
1706
- children: pn(r.displayName)
1707
- }
1708
- ),
1709
- /* @__PURE__ */ l("span", { className: p.agentName, children: [
1710
- r.displayName,
1711
- r.shared === 1 && /* @__PURE__ */ e("span", { className: p.sharedBadge, children: "共享" })
1712
- ] }),
1713
- /* @__PURE__ */ e(
1714
- "button",
1715
- {
1716
- type: "button",
1717
- className: p.agentDetailBtn,
1718
- onClick: (S) => {
1719
- S.stopPropagation();
1720
- const le = S.currentTarget.getBoundingClientRect();
1721
- w({
1722
- x: le.right - 120,
1723
- y: le.bottom + 4,
1724
- agent: r
1725
- });
1726
- },
1727
- title: "更多操作",
1728
- children: /* @__PURE__ */ e(Wn, { style: { fontSize: 14 } })
1729
- }
1730
- )
1731
- ]
1732
- },
1733
- r.id
1734
- )) })
1735
- ] }),
1736
- z && /* @__PURE__ */ l(
1737
- "div",
1738
- {
1739
- ref: Ce,
1740
- className: p.contextMenu,
1741
- style: { top: z.y, left: z.x },
1742
- children: [
1743
- /* @__PURE__ */ e(
1744
- "div",
1745
- {
1746
- className: p.contextMenuItem,
1747
- onClick: () => {
1748
- A(z.agent), w(null);
1749
- },
1750
- children: "开始聊天"
1751
- }
1752
- ),
1753
- /* @__PURE__ */ e(
1754
- "div",
1755
- {
1756
- className: p.contextMenuItem,
1757
- onClick: () => {
1758
- g(z.agent), w(null);
1759
- },
1760
- children: "Agent 配置"
1761
- }
1762
- ),
1763
- /* @__PURE__ */ e("div", { className: p.contextMenuDivider }),
1764
- /* @__PURE__ */ e(
1765
- "div",
1766
- {
1767
- className: p.contextMenuItem,
1768
- onClick: () => {
1769
- O({
1770
- agent: z.agent,
1771
- value: z.agent.displayName
1772
- }), w(null);
1773
- },
1774
- children: "重命名"
1775
- }
1776
- ),
1777
- /* @__PURE__ */ e(
1778
- "div",
1779
- {
1780
- className: p.contextMenuItem,
1781
- onClick: () => {
1782
- ce === null && pe(z.agent), w(null);
1783
- },
1784
- children: z.agent.shared === 1 ? "取消共享" : "共享给他人"
1785
- }
1786
- ),
1787
- /* @__PURE__ */ e("div", { className: p.contextMenuDivider }),
1788
- /* @__PURE__ */ e(
1789
- "div",
1790
- {
1791
- className: `${p.contextMenuItem} ${p.contextMenuItemDanger}`,
1792
- onClick: () => {
1793
- fe(z.agent), w(null);
1794
- },
1795
- children: "删除"
1796
- }
1797
- )
1798
- ]
1799
- }
1800
- ),
1801
- Ne && /* @__PURE__ */ e(
1802
- "div",
1803
- {
1804
- className: p.renameOverlay,
1805
- onClick: () => !ue && ke(!1),
1806
- children: /* @__PURE__ */ l(
1807
- "div",
1808
- {
1809
- className: p.createLocalDialog,
1810
- onClick: (r) => r.stopPropagation(),
1811
- children: [
1812
- /* @__PURE__ */ e("div", { className: p.renameTitle, children: "新建本地 Agent" }),
1813
- /* @__PURE__ */ e("div", { className: p.createLocalLabel, children: ue ? "正在创建..." : "点击选择,直接开始聊天" }),
1814
- /* @__PURE__ */ l("div", { className: p.agentTypeCards, children: [
1815
- /* @__PURE__ */ l(
1816
- "div",
1817
- {
1818
- className: p.agentTypeCard,
1819
- onClick: () => qe("jar"),
1820
- children: [
1821
- /* @__PURE__ */ e(
1822
- "div",
1823
- {
1824
- className: p.agentTypeIcon,
1825
- style: { backgroundColor: "#52c41a" },
1826
- children: "L"
1827
- }
1828
- ),
1829
- /* @__PURE__ */ l("div", { className: p.agentTypeBody, children: [
1830
- /* @__PURE__ */ l("div", { className: p.agentTypeTitle, children: [
1831
- "自研",
1832
- " ",
1833
- /* @__PURE__ */ e("span", { className: p.agentTypeBadge, children: "已运行" })
1834
- ] }),
1835
- /* @__PURE__ */ e("div", { className: p.agentTypeDesc, children: "自研 Java Agent,内置 ReAct 推理引擎与工具调用" })
1836
- ] })
1837
- ]
1838
- }
1839
- ),
1840
- /* @__PURE__ */ l(
1841
- "div",
1842
- {
1843
- className: p.agentTypeCard,
1844
- onClick: () => qe("hermes"),
1845
- children: [
1846
- /* @__PURE__ */ e(
1847
- "div",
1848
- {
1849
- className: p.agentTypeIcon,
1850
- style: { backgroundColor: "#722ed1" },
1851
- children: "H"
1852
- }
1853
- ),
1854
- /* @__PURE__ */ l("div", { className: p.agentTypeBody, children: [
1855
- /* @__PURE__ */ e("div", { className: p.agentTypeTitle, children: "Hermes" }),
1856
- /* @__PURE__ */ e("div", { className: p.agentTypeDesc, children: "本地 Hermes CLI,支持 tool-calling 与多模型切换" })
1857
- ] })
1858
- ]
1859
- }
1860
- ),
1861
- /* @__PURE__ */ l(
1862
- "div",
1863
- {
1864
- className: p.agentTypeCard,
1865
- onClick: () => qe("claude-code"),
1866
- children: [
1867
- /* @__PURE__ */ e(
1868
- "div",
1869
- {
1870
- className: p.agentTypeIcon,
1871
- style: { backgroundColor: "#eb2f96" },
1872
- children: "C"
1873
- }
1874
- ),
1875
- /* @__PURE__ */ l("div", { className: p.agentTypeBody, children: [
1876
- /* @__PURE__ */ e("div", { className: p.agentTypeTitle, children: "Claude Code" }),
1877
- /* @__PURE__ */ e("div", { className: p.agentTypeDesc, children: "Anthropic Claude CLI 编码助手" })
1878
- ] })
1879
- ]
1880
- }
1881
- )
1882
- ] }),
1883
- /* @__PURE__ */ e("div", { className: p.renameActions, children: /* @__PURE__ */ e(
1884
- "button",
1885
- {
1886
- type: "button",
1887
- className: p.renameBtn,
1888
- onClick: () => ke(!1),
1889
- disabled: ue,
1890
- children: "取消"
1891
- }
1892
- ) })
1893
- ]
1894
- }
1895
- )
1896
- }
1897
- ),
1898
- $ && /* @__PURE__ */ e(
1899
- "div",
1900
- {
1901
- className: p.renameOverlay,
1902
- onClick: () => !E && O(null),
1903
- children: /* @__PURE__ */ l(
1904
- "div",
1905
- {
1906
- className: p.renameDialog,
1907
- onClick: (r) => r.stopPropagation(),
1908
- children: [
1909
- /* @__PURE__ */ e("div", { className: p.renameTitle, children: "重命名 Agent" }),
1910
- /* @__PURE__ */ e(
1911
- "input",
1912
- {
1913
- className: p.renameInput,
1914
- type: "text",
1915
- value: $.value,
1916
- autoFocus: !0,
1917
- onChange: (r) => O({ ...$, value: r.target.value }),
1918
- onKeyDown: (r) => {
1919
- r.key === "Enter" && Te(), r.key === "Escape" && O(null);
1920
- }
1921
- }
1922
- ),
1923
- /* @__PURE__ */ l("div", { className: p.renameActions, children: [
1924
- /* @__PURE__ */ e(
1925
- "button",
1926
- {
1927
- type: "button",
1928
- className: p.renameBtn,
1929
- onClick: () => O(null),
1930
- disabled: E,
1931
- children: "取消"
1932
- }
1933
- ),
1934
- /* @__PURE__ */ e(
1935
- "button",
1936
- {
1937
- type: "button",
1938
- className: p.renameBtnPrimary,
1939
- disabled: !$.value.trim() || E,
1940
- onClick: Te,
1941
- children: E ? "..." : "确定"
1942
- }
1943
- )
1944
- ] })
1945
- ]
1946
- }
1947
- )
1948
- }
1949
- )
1950
- ] });
1951
- }
1952
- const Si = "_shell_1w53k_2", Ai = "_inset_1w53k_33", Bi = "_main_1w53k_40", Li = "_pane_1w53k_52", Di = "_skipLink_1w53k_62", Ri = "_personalMainArea_1w53k_82", Ei = "_personalSidebar_1w53k_90", Mi = "_personalChatArea_1w53k_103", et = {
1953
- shell: Si,
1954
- inset: Ai,
1955
- main: Bi,
1956
- pane: Li,
1957
- skipLink: Di,
1958
- personalMainArea: Ri,
1959
- personalSidebar: Ei,
1960
- personalChatArea: Mi
1961
- }, xi = "_sidebar_y5tuo_1", Oi = "_collapsed_y5tuo_12", $i = "_sideHeader_y5tuo_17", Pi = "_sideHeaderIcon_y5tuo_32", Hi = "_sideHeaderTitle_y5tuo_45", Fi = "_sideContent_y5tuo_54", ji = "_groupLabel_y5tuo_61", Ki = "_navList_y5tuo_71", Wi = "_navItem_y5tuo_77", Ui = "_navItemActive_y5tuo_109", Vi = "_navIcon_y5tuo_114", Gi = "_navLabel_y5tuo_120", zi = "_sideFooter_y5tuo_131", qi = "_footHint_y5tuo_138", ae = {
1962
- sidebar: xi,
1963
- collapsed: Oi,
1964
- sideHeader: $i,
1965
- sideHeaderIcon: Pi,
1966
- sideHeaderTitle: Hi,
1967
- sideContent: Fi,
1968
- groupLabel: ji,
1969
- navList: Ki,
1970
- navItem: Wi,
1971
- navItemActive: Ui,
1972
- navIcon: Vi,
1973
- navLabel: Gi,
1974
- sideFooter: zi,
1975
- footHint: qi
1976
- };
1977
- function Zi({
1978
- items: a,
1979
- activeTab: c,
1980
- collapsed: b,
1981
- footerItems: g,
1982
- onSelect: A,
1983
- onSwitchMode: R
1984
- }) {
1985
- return /* @__PURE__ */ l(
1986
- "aside",
1987
- {
1988
- className: `${ae.sidebar} ${b ? ae.collapsed : ""}`,
1989
- "aria-label": "个人工作台导航",
1990
- children: [
1991
- /* @__PURE__ */ l("div", { className: ae.sideHeader, children: [
1992
- /* @__PURE__ */ e("span", { className: ae.sideHeaderIcon, children: /* @__PURE__ */ e(yn, {}) }),
1993
- !b && /* @__PURE__ */ e("span", { className: ae.sideHeaderTitle, children: "个人工作台" })
1994
- ] }),
1995
- /* @__PURE__ */ l("div", { className: ae.sideContent, children: [
1996
- !b && /* @__PURE__ */ e("p", { className: ae.groupLabel, children: "我的工作空间" }),
1997
- /* @__PURE__ */ e("nav", { className: ae.navList, "aria-label": "个人模块", children: a.map((v) => {
1998
- const x = c === v.key, V = /* @__PURE__ */ l(
1999
- "button",
2000
- {
2001
- type: "button",
2002
- className: `${ae.navItem} ${x ? ae.navItemActive : ""}`,
2003
- onClick: () => A(v.key),
2004
- "aria-current": x ? "page" : void 0,
2005
- children: [
2006
- /* @__PURE__ */ e("span", { className: ae.navIcon, children: v.icon }),
2007
- !b && /* @__PURE__ */ e("span", { className: ae.navLabel, children: v.label })
2008
- ]
2009
- },
2010
- v.key
2011
- );
2012
- return b ? /* @__PURE__ */ e(Ut, { placement: "right", title: v.label, children: V }, v.key) : V;
2013
- }) })
2014
- ] }),
2015
- /* @__PURE__ */ l("div", { className: ae.sideFooter, children: [
2016
- g.length > 0 && /* @__PURE__ */ e("nav", { className: ae.navList, "aria-label": "快捷切换", children: g.map((v) => {
2017
- const x = /* @__PURE__ */ l(
2018
- "button",
2019
- {
2020
- type: "button",
2021
- className: ae.navItem,
2022
- onClick: () => R == null ? void 0 : R(v.mode),
2023
- children: [
2024
- /* @__PURE__ */ e("span", { className: ae.navIcon, children: v.icon }),
2025
- !b && /* @__PURE__ */ e("span", { className: ae.navLabel, children: v.label })
2026
- ]
2027
- },
2028
- v.mode
2029
- );
2030
- return b ? /* @__PURE__ */ e(Ut, { placement: "right", title: v.label, children: x }, v.mode) : x;
2031
- }) }),
2032
- !b && /* @__PURE__ */ e("p", { className: ae.footHint, children: "⌘ / Ctrl + B 切换导航" })
2033
- ] })
2034
- ]
2035
- }
2036
- );
2037
- }
2038
- const Qi = "_topbar_ms4b7_1", Xi = "_topbarLeft_ms4b7_14", Yi = "_collapseBtn_ms4b7_22", Ji = "_crumbs_ms4b7_49", er = "_crumbsRoot_ms4b7_57", tr = "_crumbsSep_ms4b7_62", nr = "_crumbsCurrent_ms4b7_68", ar = "_topbarRight_ms4b7_76", tt = {
2039
- topbar: Qi,
2040
- topbarLeft: Xi,
2041
- collapseBtn: Yi,
2042
- crumbs: Ji,
2043
- crumbsRoot: er,
2044
- crumbsSep: tr,
2045
- crumbsCurrent: nr,
2046
- topbarRight: ar
2047
- };
2048
- function sr({
2049
- label: a,
2050
- collapsed: c,
2051
- onToggleCollapse: b
2052
- }) {
2053
- return /* @__PURE__ */ l("header", { className: tt.topbar, children: [
2054
- /* @__PURE__ */ l("div", { className: tt.topbarLeft, children: [
2055
- /* @__PURE__ */ e(
2056
- Ut,
2057
- {
2058
- title: c ? "展开个人菜单" : "收起个人菜单",
2059
- placement: "bottom",
2060
- children: /* @__PURE__ */ e(
2061
- "button",
2062
- {
2063
- type: "button",
2064
- className: tt.collapseBtn,
2065
- onClick: b,
2066
- "aria-label": "展开或收起个人菜单",
2067
- "aria-expanded": !c,
2068
- children: c ? /* @__PURE__ */ e(Un, {}) : /* @__PURE__ */ e(Vn, {})
2069
- }
2070
- )
2071
- }
2072
- ),
2073
- /* @__PURE__ */ l("div", { className: tt.crumbs, "aria-label": "当前位置", children: [
2074
- /* @__PURE__ */ e("span", { className: tt.crumbsRoot, children: "个人" }),
2075
- /* @__PURE__ */ e(bn, { className: tt.crumbsSep }),
2076
- /* @__PURE__ */ e("span", { className: tt.crumbsCurrent, children: a })
2077
- ] })
2078
- ] }),
2079
- /* @__PURE__ */ e("div", { className: tt.topbarRight })
2080
- ] });
2081
- }
2082
- const Mn = [
2083
- { key: "workbench", label: "场景工作台", icon: /* @__PURE__ */ e(yn, {}) },
2084
- { key: "projects", label: "工作单管理", icon: /* @__PURE__ */ e(Vt, {}) },
2085
- { key: "personal", label: "个人统计", icon: /* @__PURE__ */ e(zn, {}) },
2086
- { key: "business-stats", label: "业务指标", icon: /* @__PURE__ */ e(qn, {}) },
2087
- { key: "tools", label: "常用工具", icon: /* @__PURE__ */ e(Zn, {}) },
2088
- { key: "websites", label: "常用网站", icon: /* @__PURE__ */ e(Qn, {}) },
2089
- { key: "smart-partner", label: "智能伙伴", icon: /* @__PURE__ */ e(_n, {}) },
2090
- { key: "todo", label: "工作待办", icon: /* @__PURE__ */ e(Nn, {}) },
2091
- { key: "notes", label: "个人笔记", icon: /* @__PURE__ */ e(Yt, {}) },
2092
- {
2093
- key: "training",
2094
- label: "培训中心",
2095
- icon: /* @__PURE__ */ e(Xn, {}),
2096
- // 学员侧学习入口与培训管理(TRAINING)解耦:按需单独分配,不随培训入口发放
2097
- permission: "TRAINING_CENTER"
2098
- },
2099
- { key: "webide", label: "WebIDE", icon: /* @__PURE__ */ e(Yn, {}) }
2100
- ], xn = "ft_pw_sidebar_collapsed";
2101
- function lr() {
2102
- try {
2103
- return localStorage.getItem(xn) === "1";
2104
- } catch {
2105
- return !1;
2106
- }
2107
- }
2108
- function ir(a) {
2109
- const c = a;
2110
- return c ? c.tagName === "INPUT" || c.tagName === "TEXTAREA" || c.isContentEditable === !0 : !1;
2111
- }
2112
- function rr() {
2113
- try {
2114
- const a = new URLSearchParams(window.location.search).get("tab");
2115
- return a && Mn.some((c) => c.key === a) ? a : null;
2116
- } catch {
2117
- return null;
2118
- }
2119
- }
2120
- function or({
2121
- onOpenProject: a,
2122
- openTodoId: c,
2123
- selectedPersonalAgent: b,
2124
- personalView: g,
2125
- newSessionTrigger: A,
2126
- onSelectPersonalAgent: R,
2127
- onShowPersonalAgentDetail: v,
2128
- onChatWithPersonalAgent: x,
2129
- onSwitchMode: V
2130
- }) {
2131
- var q;
2132
- const [K, H] = m(
2133
- // 惰性初始化:命中深链时直接以目标 Tab 首屏渲染,不先渲染场景工作台再切
2134
- () => rr() ?? "workbench"
2135
- );
2136
- M(() => {
2137
- try {
2138
- const I = new URL(window.location.href);
2139
- if (!I.searchParams.has("tab")) return;
2140
- I.searchParams.delete("tab"), window.history.replaceState(window.history.state, "", I.toString());
2141
- } catch {
2142
- }
2143
- }, []);
2144
- const [F, G] = m(lr);
2145
- M(() => {
2146
- try {
2147
- localStorage.setItem(xn, F ? "1" : "0");
2148
- } catch {
2149
- }
2150
- }, [F]);
2151
- const k = Y(() => {
2152
- G((I) => !I), window.setTimeout(() => window.dispatchEvent(new Event("resize")), 300);
2153
- }, []);
2154
- M(() => {
2155
- function I(se) {
2156
- !(se.metaKey || se.ctrlKey) || se.altKey || se.key.toLowerCase() === "b" && (ir(se.target) || (se.preventDefault(), k()));
2157
- }
2158
- return window.addEventListener("keydown", I), () => window.removeEventListener("keydown", I);
2159
- }, [k]);
2160
- const C = Oe((I) => I.currentUser), te = Mn.filter(
2161
- (I) => !I.permission || Sn(C, I.permission)
2162
- ), B = ge(() => V ? [
2163
- { mode: "admin", label: "运营工作台", icon: /* @__PURE__ */ e(vn, {}) },
2164
- { mode: "collaboration", label: "协作工作台", icon: /* @__PURE__ */ e(Gn, {}) }
2165
- ].filter(
2166
- (se) => Tn(C, se.mode)
2167
- ) : [], [C, V]), J = ((q = te.find((I) => I.key === K)) == null ? void 0 : q.label) ?? "个人工作台", [ee, z] = m(null), [w, $] = m(null), O = Y((I) => {
2168
- H(I);
2169
- }, []), E = Y((I) => {
2170
- H("notes"), z({ id: I, ts: Date.now() });
2171
- }, []), oe = Y((I) => {
2172
- H("todo"), $({ id: I, ts: Date.now() });
2173
- }, []);
2174
- return M(() => {
2175
- c != null && c.id && (H("todo"), $({ id: c.id, ts: c.ts }));
2176
- }, [c == null ? void 0 : c.id, c == null ? void 0 : c.ts]), /* @__PURE__ */ l("div", { className: et.shell, children: [
2177
- /* @__PURE__ */ e("a", { className: et.skipLink, href: "#pw-content", children: "跳到个人工作台内容" }),
2178
- /* @__PURE__ */ e(
2179
- Zi,
2180
- {
2181
- items: te,
2182
- activeTab: K,
2183
- collapsed: F,
2184
- footerItems: B,
2185
- onSelect: H,
2186
- onSwitchMode: V
2187
- }
2188
- ),
2189
- /* @__PURE__ */ l("div", { className: et.inset, children: [
2190
- /* @__PURE__ */ e(
2191
- sr,
2192
- {
2193
- label: J,
2194
- collapsed: F,
2195
- onToggleCollapse: k
2196
- }
2197
- ),
2198
- /* @__PURE__ */ e(
2199
- "main",
2200
- {
2201
- id: "pw-content",
2202
- tabIndex: -1,
2203
- "aria-label": `${J}内容`,
2204
- className: et.main,
2205
- children: /* @__PURE__ */ l("div", { className: et.pane, children: [
2206
- (K === "workbench" || K === "projects" || K === "personal") && /* @__PURE__ */ e(
2207
- Qt,
2208
- {
2209
- activeTab: K,
2210
- onActiveTabChange: O,
2211
- onOpenProject: a,
2212
- hideTabs: !0
2213
- }
2214
- ),
2215
- K === "business-stats" && /* @__PURE__ */ e(hn, { source: "scenario" }),
2216
- K === "tools" && /* @__PURE__ */ e(Mt, { showTools: !0, showWebsites: !1 }),
2217
- K === "websites" && /* @__PURE__ */ e(Mt, { showTools: !1, showWebsites: !0 }),
2218
- K === "todo" && /* @__PURE__ */ e(
2219
- Rn,
2220
- {
2221
- onOpenProject: a,
2222
- onOpenNote: E,
2223
- openTodoId: w
2224
- }
2225
- ),
2226
- K === "notes" && /* @__PURE__ */ e(
2227
- mn,
2228
- {
2229
- onOpenProject: a,
2230
- onOpenTodo: oe,
2231
- openNoteId: ee
2232
- }
2233
- ),
2234
- K === "training" && /* @__PURE__ */ e(An, {}),
2235
- K === "webide" && /* @__PURE__ */ e(Bn, {}),
2236
- K === "smart-partner" && /* @__PURE__ */ l("div", { className: et.personalMainArea, children: [
2237
- /* @__PURE__ */ e("div", { className: et.personalSidebar, children: /* @__PURE__ */ e(
2238
- Ii,
2239
- {
2240
- selectedAgentId: (b == null ? void 0 : b.id) ?? null,
2241
- selectedLocalAgentId: (b == null ? void 0 : b.localAgentId) ?? null,
2242
- onSelectAgent: R,
2243
- onShowDetail: v,
2244
- onChatWithAgent: x
2245
- }
2246
- ) }),
2247
- /* @__PURE__ */ e("div", { className: et.personalChatArea, children: g === "detail" && b && !b.isLocal ? /* @__PURE__ */ e(
2248
- Ln,
2249
- {
2250
- agent: b,
2251
- onBack: () => R(b)
2252
- }
2253
- ) : b != null && b.isLocal ? /* @__PURE__ */ e(
2254
- En,
2255
- {
2256
- agent: b,
2257
- newSessionTrigger: A
2258
- }
2259
- ) : /* @__PURE__ */ e(
2260
- Dn,
2261
- {
2262
- agent: b,
2263
- newSessionTrigger: A
2264
- }
2265
- ) })
2266
- ] })
2267
- ] })
2268
- }
2269
- )
2270
- ] })
2271
- ] });
2272
- }
2273
- const cr = [
2274
- "帮我排查一个线上问题",
2275
- "总结一下今天的群聊进展",
2276
- "把这周的变更整理成周报"
2277
- ], dr = [
2278
- {
2279
- key: "video",
2280
- label: "视频生成",
2281
- icon: /* @__PURE__ */ e(Jn, {}),
2282
- action: "chat",
2283
- prompt: "帮我写一条 15 秒短视频脚本,主题是:"
2284
- },
2285
- {
2286
- key: "docs",
2287
- label: "文档办公",
2288
- icon: /* @__PURE__ */ e(Yt, {}),
2289
- action: "tools"
2290
- },
2291
- {
2292
- key: "vibe",
2293
- label: "Vibe Coding",
2294
- icon: /* @__PURE__ */ e(Sa, {}),
2295
- action: "webide"
2296
- },
2297
- {
2298
- key: "design",
2299
- label: "设计视觉",
2300
- icon: /* @__PURE__ */ e(Aa, {}),
2301
- action: "chat",
2302
- prompt: "帮我出一版视觉设计稿,风格偏:"
2303
- },
2304
- {
2305
- key: "ask",
2306
- label: "问问 Z-OPC",
2307
- icon: /* @__PURE__ */ e(qt, {}),
2308
- action: "ask"
2309
- }
2310
- ];
2311
- function ur() {
2312
- const a = (/* @__PURE__ */ new Date()).getHours();
2313
- return a < 5 ? "夜深了" : a < 12 ? "早上好" : a < 14 ? "中午好" : a < 18 ? "下午好" : "晚上好";
2314
- }
2315
- function pr(a) {
2316
- if (!a) return "";
2317
- const c = new Date(a), b = /* @__PURE__ */ new Date(), g = b.getTime() - a;
2318
- if (g < 6e4) return "刚刚";
2319
- if (g < 36e5) return `${Math.floor(g / 6e4)} 分钟前`;
2320
- if (c.toDateString() === b.toDateString()) {
2321
- const R = (v) => String(v).padStart(2, "0");
2322
- return `${R(c.getHours())}:${R(c.getMinutes())}`;
2323
- }
2324
- const A = new Date(b);
2325
- return A.setDate(b.getDate() - 1), c.toDateString() === A.toDateString() ? "昨天" : `${c.getMonth() + 1}月${c.getDate()}日`;
2326
- }
2327
- function hr({
2328
- agents: a,
2329
- activeAgent: c,
2330
- onSwitchAgent: b,
2331
- localAgentName: g,
2332
- onLocalSend: A,
2333
- localOffline: R = !1,
2334
- initialSpace: v,
2335
- onSend: x,
2336
- onOpenTab: V,
2337
- onQuickAsk: K,
2338
- recentTasks: H = [],
2339
- onOpenHistory: F
2340
- }) {
2341
- const G = Oe((_) => _.token), k = Oe((_) => _.currentUser), C = Et(), [te, B] = m(""), J = U(null), [ee, z] = m(!1), [w, $] = m(!1), [O, E] = m(v ?? null), [oe, q] = m(!1);
2342
- M(() => {
2343
- v && E(v);
2344
- }, [v]);
2345
- const I = Y(async () => {
2346
- const _ = te.trim();
2347
- if (!(!_ || ee) && !R) {
2348
- if (g && A) {
2349
- A(_), B("");
2350
- return;
2351
- }
2352
- if (c) {
2353
- z(!0);
2354
- try {
2355
- await x(_, O), B(""), E(null);
2356
- } finally {
2357
- z(!1);
2358
- }
2359
- }
2360
- }
2361
- }, [te, ee, R, g, A, c, x, O]), se = C.nickname || (k == null ? void 0 : k.display_name) || (k == null ? void 0 : k.username) || "";
2362
- return /* @__PURE__ */ e("div", { className: `${d.landing} ${d.xwScope}`, children: /* @__PURE__ */ l("div", { className: d.landingInner, children: [
2363
- /* @__PURE__ */ e("div", { className: d.mascot, "aria-hidden": "true", children: /* @__PURE__ */ e("img", { src: Na, alt: "" }) }),
2364
- /* @__PURE__ */ e("h1", { className: d.landingTitle, children: C.greetingEnabled ? `${ur()}${se ? `,${se}` : ""}` : "开始新的对话" }),
2365
- /* @__PURE__ */ e("p", { className: d.landingSub, children: g ? R ? "本机 Agent 未运行 —— 启动 Z-OPC 桌面端(伴生服务起来后自动连上)" : "本地模式:任务在你的电脑上执行,文件与上下文都不上云" : C.bio || "我是你的智能伙伴,有什么可以帮你?" }),
2366
- /* @__PURE__ */ l("div", { className: d.landingBox, children: [
2367
- /* @__PURE__ */ e(
2368
- "textarea",
2369
- {
2370
- ref: J,
2371
- className: d.landingInput,
2372
- placeholder: g ? R ? "本机 Agent 未运行,启动桌面端后即可在本地执行" : `给本机 Agent 发送消息,${an(C.sendKey)}` : `给智能伙伴发送消息,${an(C.sendKey)}`,
2373
- rows: 3,
2374
- value: te,
2375
- autoFocus: !0,
2376
- onChange: (_) => B(_.target.value),
2377
- onKeyDown: (_) => {
2378
- In(_, C.sendKey) && !_.nativeEvent.isComposing && (_.preventDefault(), I());
2379
- }
2380
- }
2381
- ),
2382
- /* @__PURE__ */ l("div", { className: d.landingBoxBar, children: [
2383
- g ? /* @__PURE__ */ l("span", { className: d.agentChip, children: [
2384
- /* @__PURE__ */ e(qt, {}),
2385
- /* @__PURE__ */ l("span", { children: [
2386
- g,
2387
- "(本机)"
2388
- ] })
2389
- ] }) : c ? /* @__PURE__ */ l("div", { className: d.agentChipWrap, children: [
2390
- /* @__PURE__ */ l(
2391
- "button",
2392
- {
2393
- type: "button",
2394
- className: d.agentChip,
2395
- onClick: () => $((_) => !_),
2396
- children: [
2397
- /* @__PURE__ */ e(qt, {}),
2398
- /* @__PURE__ */ e("span", { children: c.displayName }),
2399
- a.length > 1 && /* @__PURE__ */ e(Rt, { className: d.chipCaret })
2400
- ]
2401
- }
2402
- ),
2403
- w && a.length > 1 && /* @__PURE__ */ l(ze, { children: [
2404
- /* @__PURE__ */ e(
2405
- "div",
2406
- {
2407
- className: d.agentMenuMask,
2408
- onClick: () => $(!1)
2409
- }
2410
- ),
2411
- /* @__PURE__ */ e("div", { className: d.agentMenu, role: "menu", children: a.map((_) => /* @__PURE__ */ l(
2412
- "button",
2413
- {
2414
- type: "button",
2415
- role: "menuitem",
2416
- className: `${d.agentMenuItem} ${_.id === c.id ? d.agentMenuItemActive : ""}`,
2417
- onClick: () => {
2418
- b(_), $(!1);
2419
- },
2420
- children: [
2421
- /* @__PURE__ */ e(
2422
- "span",
2423
- {
2424
- className: d.agentDot,
2425
- style: { background: Ca(_.displayName) },
2426
- children: ka(_.displayName)
2427
- }
2428
- ),
2429
- _.displayName
2430
- ]
2431
- },
2432
- _.id
2433
- )) })
2434
- ] })
2435
- ] }) : /* @__PURE__ */ e("span", { className: d.agentChipEmpty, children: "还没有云端伙伴,可到个人工作台创建" }),
2436
- !g && c && /* @__PURE__ */ l("div", { className: d.agentChipWrap, children: [
2437
- /* @__PURE__ */ l(
2438
- "button",
2439
- {
2440
- type: "button",
2441
- className: d.agentChip,
2442
- title: "本次新建任务归入的项目空间(可选)",
2443
- onClick: () => q((_) => !_),
2444
- children: [
2445
- /* @__PURE__ */ e(Zt, {}),
2446
- /* @__PURE__ */ e("span", { children: O ? O.title : "不归组" }),
2447
- /* @__PURE__ */ e(Rt, { className: d.chipCaret })
2448
- ]
2449
- }
2450
- ),
2451
- oe && /* @__PURE__ */ l(ze, { children: [
2452
- /* @__PURE__ */ e(
2453
- "div",
2454
- {
2455
- className: d.agentMenuMask,
2456
- onClick: () => q(!1)
2457
- }
2458
- ),
2459
- /* @__PURE__ */ e(
2460
- wa,
2461
- {
2462
- token: G,
2463
- currentId: (O == null ? void 0 : O.id) ?? null,
2464
- onPick: (_) => {
2465
- E(_), q(!1);
2466
- }
2467
- }
2468
- )
2469
- ] })
2470
- ] }),
2471
- /* @__PURE__ */ e(
2472
- "button",
2473
- {
2474
- type: "button",
2475
- className: d.landingSend,
2476
- disabled: !te.trim() || ee || R || !c && !g,
2477
- onClick: () => void I(),
2478
- "aria-label": "发送",
2479
- children: ee ? /* @__PURE__ */ e(Ta, {}) : /* @__PURE__ */ e(Ia, {})
2480
- }
2481
- )
2482
- ] })
2483
- ] }),
2484
- H.length > 0 && /* @__PURE__ */ l("section", { className: d.recentBlock, "aria-label": "继续最近任务", children: [
2485
- /* @__PURE__ */ l("div", { className: d.recentHead, children: [
2486
- /* @__PURE__ */ e("span", { children: "继续最近任务" }),
2487
- F && /* @__PURE__ */ e(
2488
- "button",
2489
- {
2490
- type: "button",
2491
- className: d.recentAll,
2492
- onClick: F,
2493
- children: "全部 →"
2494
- }
2495
- )
2496
- ] }),
2497
- /* @__PURE__ */ e("div", { className: d.recentList, children: H.map((_) => /* @__PURE__ */ l(
2498
- "button",
2499
- {
2500
- type: "button",
2501
- className: d.recentRow,
2502
- title: _.title,
2503
- onClick: _.open,
2504
- children: [
2505
- /* @__PURE__ */ e(
2506
- "span",
2507
- {
2508
- className: `${d.recentLane} ${_.lane === "local" ? d.recentLaneLocal : ""}`,
2509
- children: _.lane === "local" ? "本地" : "云端"
2510
- }
2511
- ),
2512
- /* @__PURE__ */ e("span", { className: d.recentTitle, children: _.title }),
2513
- /* @__PURE__ */ e("span", { className: d.recentTime, children: pr(_.updatedAt) })
2514
- ]
2515
- },
2516
- _.key
2517
- )) })
2518
- ] }),
2519
- /* @__PURE__ */ e("div", { className: d.chipRow, children: dr.map((_) => /* @__PURE__ */ l(
2520
- "button",
2521
- {
2522
- type: "button",
2523
- className: d.capChip,
2524
- onClick: () => {
2525
- var ce;
2526
- if (_.action === "tools") {
2527
- V("tools");
2528
- return;
2529
- }
2530
- if (_.action === "webide") {
2531
- V("webide");
2532
- return;
2533
- }
2534
- if (_.action === "ask") {
2535
- K();
2536
- return;
2537
- }
2538
- B(_.prompt ?? ""), (ce = J.current) == null || ce.focus();
2539
- },
2540
- children: [
2541
- /* @__PURE__ */ e("span", { className: d.capChipIcon, children: _.icon }),
2542
- /* @__PURE__ */ e("span", { children: _.label })
2543
- ]
2544
- },
2545
- _.key
2546
- )) }),
2547
- /* @__PURE__ */ e("div", { className: d.chipRow, children: cr.map((_) => /* @__PURE__ */ e(
2548
- "button",
2549
- {
2550
- type: "button",
2551
- className: d.suggestChip,
2552
- onClick: () => {
2553
- var ce;
2554
- B(_), (ce = J.current) == null || ce.focus();
2555
- },
2556
- children: _
2557
- },
2558
- _
2559
- )) }),
2560
- /* @__PURE__ */ l("p", { className: d.shortcutHint, children: [
2561
- /* @__PURE__ */ e("kbd", { className: d.shortcutKbd, children: "⌘K" }),
2562
- /* @__PURE__ */ e("span", { children: "搜索与命令" }),
2563
- /* @__PURE__ */ e("span", { className: d.shortcutDot, children: "·" }),
2564
- /* @__PURE__ */ e("kbd", { className: d.shortcutKbd, children: "⌘N" }),
2565
- /* @__PURE__ */ e("span", { children: "新建任务" })
2566
- ] })
2567
- ] }) });
2568
- }
2569
- const ft = Ha() || typeof localStorage < "u" && localStorage.getItem("ft_exclusive_force_desktop") === "1";
2570
- function mr(a) {
2571
- return a.type === "jar" ? {
2572
- id: "-1",
2573
- userId: "local",
2574
- agentHubAgentId: null,
2575
- agentCode: "local-default",
2576
- displayName: a.name || "本地 Agent",
2577
- avatar: null,
2578
- isLocal: !0
2579
- } : {
2580
- id: "-1",
2581
- userId: "local",
2582
- agentHubAgentId: null,
2583
- agentCode: a.name,
2584
- displayName: a.name,
2585
- avatar: null,
2586
- isLocal: !0,
2587
- localAgentId: a.id,
2588
- localAgentType: a.type
2589
- };
2590
- }
2591
- function Br({
2592
- onSwitchMode: a,
2593
- onOpenProject: c,
2594
- openAgentRequest: b
2595
- }) {
2596
- const g = Oe((n) => n.token), A = Oe((n) => n.currentUser), R = Et(), [v, x] = m([]), [V, K] = m(!0), [H, F] = m(null), [G, k] = m("landing"), [C, te] = m(null), [B, J] = m(
2597
- ft ? "local" : "cloud"
2598
- ), [ee, z] = m(
2599
- []
2600
- ), [w, $] = m([]), [O, E] = m(!0), [oe, q] = m(!1), [I, se] = m(null), _ = Y(
2601
- (n) => {
2602
- se({ tab: n === "skills" ? "bind" : n === "plugins" || n === "connectors" ? "soon" : "agents", ts: Date.now() }), k("extensions");
2603
- },
2604
- []
2605
- ), ce = Oe((n) => n.projects), [de, Ae] = m([]), [X, Be] = m(null), [ve, Ne] = m(
2606
- /* @__PURE__ */ new Set()
2607
- ), [ke, ue] = m(0), [st, Ce] = m(null), [ne, $e] = m(null), [we, Le] = m(""), [qe, Re] = m(!1), [fe, Te] = m(!1), [pe, Pe] = m([]), [r, S] = m(null), [le, He] = m(!1), Z = ft || le, [Fe, Ee] = m(null), Ze = Y(
2608
- (n) => {
2609
- const o = Ba(n);
2610
- o && !Sn(A, o) || (lt(n), k("personalTab"));
2611
- },
2612
- [A]
2613
- ), [xt, je] = m(!1), [W, dt] = m(
2614
- null
2615
- ), [ut, yt] = m(
2616
- null
2617
- ), [vt, pt] = m(
2618
- null
2619
- ), Qe = Y(
2620
- (n, o) => {
2621
- c == null || c(n, o);
2622
- },
2623
- [c]
2624
- ), nt = Y((n) => {
2625
- lt("todo"), pt({ id: n, ts: Date.now() });
2626
- }, []), [be, lt] = m("personal"), Nt = U(!1), he = ge(() => La(v), [v]), me = ge(
2627
- () => v.find((n) => n.id === H) ?? he,
2628
- [v, H, he]
2629
- );
2630
- Z && fe && pe.length > 0;
2631
- const j = ge(
2632
- () => pe.find((n) => n.id === r) ?? null,
2633
- [pe, r]
2634
- );
2635
- M(() => {
2636
- let n = !0;
2637
- return K(!0), kn(g).then((o) => {
2638
- n && x(o);
2639
- }).catch(() => {
2640
- }).finally(() => {
2641
- n && K(!1);
2642
- }), () => {
2643
- n = !1;
2644
- };
2645
- }, [g]), M(() => {
2646
- let n = !0;
2647
- const o = async () => {
2648
- if (!ft) {
2649
- let N = !1;
2650
- try {
2651
- N = !!(await xa(g)).online;
2652
- } catch {
2653
- N = !1;
2654
- }
2655
- if (!n) return;
2656
- if (He(N), Fa(N ? "tunnel" : "direct", g), Te(N), !N) {
2657
- Pe([]);
2658
- return;
2659
- }
2660
- try {
2661
- const t = await Gt();
2662
- n && Pe(t);
2663
- } catch {
2664
- }
2665
- return;
2666
- }
2667
- const y = await zt();
2668
- if (n) {
2669
- if (Te(y), !y) {
2670
- Pe([]);
2671
- return;
2672
- }
2673
- try {
2674
- const N = await Gt();
2675
- n && Pe(N);
2676
- } catch {
2677
- }
2678
- }
2679
- };
2680
- o();
2681
- const h = window.setInterval(() => void o(), 3e4);
2682
- return () => {
2683
- n = !1, window.clearInterval(h);
2684
- };
2685
- }, [g]), M(() => {
2686
- if (!Z || pe.length === 0 || r && pe.some((o) => o.id === r))
2687
- return;
2688
- const n = pe.find((o) => o.type === "jar");
2689
- S((n ?? pe[0]).id);
2690
- }, [pe, r]);
2691
- const Me = ge(() => {
2692
- const n = /* @__PURE__ */ new Map();
2693
- for (const o of v) n.set(o.id, o);
2694
- return n;
2695
- }, [v]), Ke = Y(async () => {
2696
- E(!0);
2697
- const [n, o] = await Promise.allSettled([
2698
- oa(g),
2699
- Wa(g)
2700
- ]);
2701
- if (n.status === "fulfilled" && z(n.value || []), o.status === "fulfilled") {
2702
- const h = /* @__PURE__ */ new Set(), y = [];
2703
- for (const N of [...o.value.owned, ...o.value.joined])
2704
- h.has(N.id) || (h.add(N.id), y.push(N));
2705
- $(y);
2706
- }
2707
- E(!1);
2708
- }, [g]);
2709
- M(() => {
2710
- Ke();
2711
- }, [Ke, C == null ? void 0 : C.ts]);
2712
- const Ie = ge(() => {
2713
- const n = /* @__PURE__ */ new Map();
2714
- for (const t of w)
2715
- n.set(`sp:${String(t.id)}`, {
2716
- key: `sp:${String(t.id)}`,
2717
- title: t.title,
2718
- sessions: []
2719
- });
2720
- const o = [], h = [...ee].sort(
2721
- (t, s) => (s.updateTime || s.createTime || "").localeCompare(
2722
- t.updateTime || t.createTime || ""
2723
- )
2724
- );
2725
- for (const t of h)
2726
- if (t.projectSpaceId != null) {
2727
- const s = `sp:${String(t.projectSpaceId)}`;
2728
- n.has(s) || n.set(s, {
2729
- key: s,
2730
- title: t.projectSpaceTitle || `空间 ${t.projectSpaceId}`,
2731
- sessions: []
2732
- }), n.get(s).sessions.push(t);
2733
- } else
2734
- o.push(t);
2735
- const y = (t) => {
2736
- var s, u;
2737
- return ((s = t.sessions[0]) == null ? void 0 : s.updateTime) || ((u = t.sessions[0]) == null ? void 0 : u.createTime) || "";
2738
- }, N = [...n.values()];
2739
- return N.sort((t, s) => t.sessions.length > 0 && s.sessions.length > 0 ? y(s).localeCompare(y(t)) : t.sessions.length > 0 ? -1 : s.sessions.length > 0 ? 1 : t.title.localeCompare(s.title)), o.length > 0 && N.push({ key: "sp:none", title: "未归组", sessions: o }), N;
2740
- }, [w, ee]), We = ge(
2741
- () => {
2742
- var n;
2743
- return C != null && C.sessionId ? ((n = Ie.find(
2744
- (o) => o.sessions.some((h) => h.id === C.sessionId)
2745
- )) == null ? void 0 : n.key) ?? null : null;
2746
- },
2747
- [Ie, C == null ? void 0 : C.sessionId]
2748
- );
2749
- M(() => {
2750
- var o;
2751
- const n = We ?? (Nt.current ? null : ((o = Ie.find((h) => h.sessions.length > 0)) == null ? void 0 : o.key) ?? null);
2752
- n && (Nt.current = !0, Ne(
2753
- (h) => h.has(n) ? h : new Set(h).add(n)
2754
- ));
2755
- }, [We, Ie]);
2756
- const kt = U(!1);
2757
- M(() => {
2758
- ft || !le || kt.current || (kt.current = !0, J("local"));
2759
- }, [le]);
2760
- const Ue = j && j.type !== "jar" ? j.id : void 0;
2761
- M(() => {
2762
- if (!Z || B !== "local" || !fe) return;
2763
- let n = !0;
2764
- return Cn(Ue).then((o) => {
2765
- n && Ae([...o].sort((h, y) => y.updatedAt - h.updatedAt));
2766
- }).catch(() => {
2767
- n && Ae([]);
2768
- }), () => {
2769
- n = !1;
2770
- };
2771
- }, [
2772
- B,
2773
- fe,
2774
- Ue,
2775
- X,
2776
- ke
2777
- ]);
2778
- const ie = ge(() => {
2779
- const n = /* @__PURE__ */ new Map(), o = [];
2780
- for (const y of de) {
2781
- const N = y.workdir ?? null;
2782
- if (!N) {
2783
- o.push(y);
2784
- continue;
2785
- }
2786
- const t = `wd:${N}`;
2787
- if (!n.has(t)) {
2788
- const s = N.split("/").filter(Boolean);
2789
- n.set(t, {
2790
- key: t,
2791
- title: s.length ? s[s.length - 1] : N,
2792
- path: N,
2793
- sessions: []
2794
- });
2795
- }
2796
- n.get(t).sessions.push(y);
2797
- }
2798
- const h = [...n.values()].sort(
2799
- (y, N) => {
2800
- var t, s;
2801
- return (((t = N.sessions[0]) == null ? void 0 : t.updatedAt) ?? 0) - (((s = y.sessions[0]) == null ? void 0 : s.updatedAt) ?? 0);
2802
- }
2803
- );
2804
- return o.length > 0 && h.push({ key: "wd:none", title: "未绑定目录", path: null, sessions: o }), h;
2805
- }, [de]), Ve = ge(() => {
2806
- if (!X) return null;
2807
- const n = de.find((o) => o.id === X);
2808
- return n ? n.workdir ? `wd:${n.workdir}` : "wd:none" : null;
2809
- }, [de, X]);
2810
- M(() => {
2811
- Ve && Ne(
2812
- (n) => n.has(Ve) ? n : new Set(n).add(Ve)
2813
- );
2814
- }, [Ve]);
2815
- const ht = U(!1);
2816
- M(() => {
2817
- ht.current || ie.length === 0 || (ht.current = !0, Ne((n) => {
2818
- const o = new Set(n);
2819
- for (const h of ie)
2820
- h.sessions.length > 0 && o.add(h.key);
2821
- return o;
2822
- }));
2823
- }, [ie]);
2824
- const Ct = Y(() => Be(null), []), it = (n) => {
2825
- if (n !== B && (J(n), !(G !== "chat" && G !== "landing"))) {
2826
- if (n === "cloud") {
2827
- k(C ? "chat" : "landing");
2828
- return;
2829
- }
2830
- k(fe ? "chat" : "landing");
2831
- }
2832
- }, rt = (n) => {
2833
- J("local"), Be(n), k("chat");
2834
- }, wt = (n, o, h) => {
2835
- $e({ lane: n, id: o }), Le(h || "");
2836
- }, Tt = () => {
2837
- $e(null), Le("");
2838
- }, mt = async () => {
2839
- if (!ne || qe) return;
2840
- const n = ne, o = we.trim();
2841
- if ($e(null), Le(""), !!o) {
2842
- Re(!0);
2843
- try {
2844
- if (n.lane === "cloud") {
2845
- const h = ee.find((y) => De(y.id, n.id));
2846
- if (!h) return;
2847
- await da(
2848
- h.personalAgentId,
2849
- h.id,
2850
- o,
2851
- g
2852
- ), z(
2853
- (y) => y.map((N) => De(N.id, n.id) ? { ...N, title: o } : N)
2854
- );
2855
- } else
2856
- await wn(n.id, o), ue((h) => h + 1);
2857
- Lt("已重命名会话", "success");
2858
- } catch (h) {
2859
- Lt(h instanceof Error ? h.message : "重命名失败", "error");
2860
- } finally {
2861
- Re(!1);
2862
- }
2863
- }
2864
- }, bt = async (n, o, h) => {
2865
- if (await _t({
2866
- content: `确定删除会话「${h || "未命名会话"}」吗?删除后不可恢复。`
2867
- }))
2868
- try {
2869
- if (n === "cloud") {
2870
- const N = ee.find((t) => De(t.id, o));
2871
- if (!N) return;
2872
- await ua(N.personalAgentId, N.id, g), z((t) => t.filter((s) => !De(s.id, o))), De(C == null ? void 0 : C.sessionId, o) && (te(null), k("landing"));
2873
- } else
2874
- await Oa(o), ue((N) => N + 1), X === o && (Be(null), k("landing"));
2875
- Lt("已删除会话", "success");
2876
- } catch (N) {
2877
- Lt(N instanceof Error ? N.message : "删除失败", "error");
2878
- }
2879
- }, _e = (n, o = null, h = null) => {
2880
- J("cloud"), F(n.id), te(
2881
- (y) => y && y.agent.id === n.id && y.sessionId === o && !h ? y : { agent: n, sessionId: o, draft: h, ts: Date.now() }
2882
- ), k("chat");
2883
- };
2884
- M(() => {
2885
- const n = b;
2886
- if (!(n != null && n.agent) || !n.ts) return;
2887
- const o = n.agent;
2888
- if (F(o.id), n.view === "detail") {
2889
- dt(o), k("agentDetail");
2890
- return;
2891
- }
2892
- _e(o, n.sessionId ?? null), n.newSession > 0 && ue((h) => h + 1);
2893
- }, [b == null ? void 0 : b.ts]);
2894
- const It = () => {
2895
- J("cloud"), F((he == null ? void 0 : he.id) ?? null), te(null), k("landing");
2896
- }, gt = () => {
2897
- J("local"), ue((n) => n + 1), k("chat");
2898
- }, Ot = () => {
2899
- if (B === "local" && Z && j) {
2900
- gt();
2901
- return;
2902
- }
2903
- if (he) {
2904
- _e(he);
2905
- return;
2906
- }
2907
- It();
2908
- }, at = async (n, o) => {
2909
- if (me)
2910
- try {
2911
- const h = n.length > 20 ? `${n.slice(0, 20)}…` : n, y = await pa(
2912
- me.id,
2913
- h,
2914
- g,
2915
- o
2916
- );
2917
- Ee(null), J("cloud"), te({
2918
- agent: me,
2919
- sessionId: y.id,
2920
- draft: n,
2921
- ts: Date.now()
2922
- }), k("chat");
2923
- } catch {
2924
- }
2925
- }, Xe = (n) => {
2926
- J("local"), Ce(n), k("chat");
2927
- }, Ye = Y(() => {
2928
- if (Z && B === "local" && j) {
2929
- ue((n) => n + 1), k("chat");
2930
- return;
2931
- }
2932
- J("cloud"), F((he == null ? void 0 : he.id) ?? null), te(null), k("landing");
2933
- }, [Z, B, j, he]), $t = ge(() => {
2934
- const n = [
2935
- {
2936
- key: "new-task",
2937
- label: "新建任务",
2938
- icon: /* @__PURE__ */ e(gn, {}),
2939
- hint: "⌘N",
2940
- run: Ye
2941
- },
2942
- {
2943
- key: "schedule",
2944
- label: "定时任务",
2945
- icon: /* @__PURE__ */ e(ea, {}),
2946
- run: () => k("schedule")
2947
- },
2948
- {
2949
- key: "extensions",
2950
- label: "更多能力",
2951
- icon: /* @__PURE__ */ e(ta, {}),
2952
- run: () => k("extensions")
2953
- },
2954
- {
2955
- key: "todo",
2956
- label: "工作待办",
2957
- icon: /* @__PURE__ */ e(Nn, {}),
2958
- run: () => Ze("todo")
2959
- },
2960
- {
2961
- key: "notes",
2962
- label: "个人笔记",
2963
- icon: /* @__PURE__ */ e(Yt, {}),
2964
- run: () => Ze("notes")
2965
- },
2966
- {
2967
- key: "settings",
2968
- label: "设置",
2969
- icon: /* @__PURE__ */ e(vn, {}),
2970
- run: () => je(!0)
2971
- }
2972
- ];
2973
- return Z && n.push({
2974
- key: "switch-lane",
2975
- label: B === "local" ? "切换到云端车道" : "切换到本地车道",
2976
- icon: B === "local" ? /* @__PURE__ */ e(tn, {}) : /* @__PURE__ */ e(nn, {}),
2977
- run: () => it(B === "local" ? "cloud" : "local")
2978
- }), n;
2979
- }, [Ye, Ze, Z, B]);
2980
- M(() => {
2981
- const n = (o) => {
2982
- if (!(o.metaKey || o.ctrlKey) || o.altKey) return;
2983
- const h = o.key.toLowerCase();
2984
- if (h === "k") {
2985
- o.preventDefault(), q((y) => !y);
2986
- return;
2987
- }
2988
- h === "n" && (o.preventDefault(), Ye());
2989
- };
2990
- return document.addEventListener("keydown", n), () => document.removeEventListener("keydown", n);
2991
- }, [Ye]);
2992
- const St = ge(() => {
2993
- const n = [];
2994
- if (Z)
2995
- for (const o of de)
2996
- n.push({
2997
- key: `l-${o.id}`,
2998
- title: o.title || "未命名会话",
2999
- lane: "local",
3000
- updatedAt: o.updatedAt ?? 0,
3001
- open: () => rt(o.id)
3002
- });
3003
- for (const o of ee) {
3004
- const h = Me.get(o.personalAgentId);
3005
- if (!h) continue;
3006
- const y = new Date(
3007
- (o.updateTime || o.createTime || "").replace(" ", "T")
3008
- ).getTime();
3009
- n.push({
3010
- key: `c-${o.id}`,
3011
- title: o.title || "未命名会话",
3012
- lane: "cloud",
3013
- updatedAt: Number.isNaN(y) ? 0 : y,
3014
- open: () => _e(h, o.id)
3015
- });
3016
- }
3017
- return n.sort((o, h) => h.updatedAt - o.updatedAt), n.slice(0, 5);
3018
- }, [Z, de, ee, Me]), Pt = R.nickname || (A == null ? void 0 : A.display_name) || (A == null ? void 0 : A.username) || "", ot = ge(() => a ? [
3019
- {
3020
- mode: "personal",
3021
- label: "个人工作台",
3022
- icon: /* @__PURE__ */ e($a, {})
3023
- },
3024
- {
3025
- mode: "collaboration",
3026
- label: "协作工作台",
3027
- icon: /* @__PURE__ */ e(Pa, {})
3028
- }
3029
- ].filter(
3030
- (o) => Tn(A, o.mode)
3031
- ) : [], [A, a]), At = C ? `${C.agent.id}-${C.sessionId ?? 0}-${C.ts}` : "none";
3032
- let Se;
3033
- return G === "agentDetail" && W ? Se = /* @__PURE__ */ e("div", { className: d.detailHost, children: /* @__PURE__ */ e(
3034
- Ln,
3035
- {
3036
- agent: W,
3037
- onBack: () => k("extensions")
3038
- }
3039
- ) }) : G === "schedule" ? Se = /* @__PURE__ */ e(
3040
- za,
3041
- {
3042
- localOnline: fe,
3043
- agents: v,
3044
- token: g,
3045
- localAgents: pe,
3046
- defaultLane: B,
3047
- defaultAgentId: (me == null ? void 0 : me.id) ?? null
3048
- }
3049
- ) : G === "extensions" ? Se = /* @__PURE__ */ e(
3050
- qa,
3051
- {
3052
- agents: v,
3053
- loading: V,
3054
- skillsAgent: he,
3055
- token: g,
3056
- currentUser: A,
3057
- lane: B,
3058
- onChat: (n) => _e(n),
3059
- onConfig: (n) => {
3060
- dt(n), k("agentDetail");
3061
- },
3062
- onCreated: (n) => x((o) => [...o, n]),
3063
- onOpenPersonalTab: Ze,
3064
- onOpenWorkbenchShell: () => k("workbenchShell"),
3065
- onOpenHistory: () => k("history"),
3066
- capTabRequest: I
3067
- }
3068
- ) : G === "history" ? Se = /* @__PURE__ */ e(
3069
- Za,
3070
- {
3071
- agents: v,
3072
- token: g,
3073
- onOpenSession: (n, o) => _e(n, o),
3074
- onBack: () => k("extensions")
3075
- }
3076
- ) : G === "workbenchShell" ? Se = /* @__PURE__ */ e(
3077
- or,
3078
- {
3079
- onOpenProject: Qe,
3080
- selectedPersonalAgent: me,
3081
- personalView: "chat",
3082
- newSessionTrigger: ke,
3083
- onSelectPersonalAgent: (n) => F((n == null ? void 0 : n.id) ?? null),
3084
- onShowPersonalAgentDetail: (n) => {
3085
- dt(n), k("agentDetail");
3086
- },
3087
- onChatWithPersonalAgent: (n) => _e(n),
3088
- onSwitchMode: a
3089
- }
3090
- ) : G === "personalTab" ? Se = /* @__PURE__ */ l("div", { className: d.personalTabHost, children: [
3091
- be === "projects" && /* @__PURE__ */ e(
3092
- Qt,
3093
- {
3094
- activeTab: "projects",
3095
- onActiveTabChange: () => {
3096
- },
3097
- onOpenProject: Qe,
3098
- hideTabs: !0
3099
- }
3100
- ),
3101
- be === "personal" && /* @__PURE__ */ e(
3102
- Qt,
3103
- {
3104
- activeTab: "personal",
3105
- onActiveTabChange: () => {
3106
- },
3107
- onOpenProject: Qe,
3108
- hideTabs: !0
3109
- }
3110
- ),
3111
- be === "business-stats" && /* @__PURE__ */ e(hn, { source: "scenario" }),
3112
- be === "tools" && /* @__PURE__ */ e(Mt, { showTools: !0, showWebsites: !1 }),
3113
- be === "websites" && /* @__PURE__ */ e(Mt, { showTools: !1, showWebsites: !0 }),
3114
- be === "todo" && /* @__PURE__ */ e(
3115
- Rn,
3116
- {
3117
- onOpenProject: Qe,
3118
- onOpenNote: (n) => {
3119
- lt("notes"), yt({ id: n, ts: Date.now() });
3120
- },
3121
- onOpenAgentSession: (n, o) => {
3122
- const h = v.find((y) => De(y.id, o));
3123
- h && _e(h, n);
3124
- },
3125
- openTodoId: vt
3126
- }
3127
- ),
3128
- be === "notes" && /* @__PURE__ */ e(
3129
- mn,
3130
- {
3131
- onOpenProject: Qe,
3132
- onOpenTodo: nt,
3133
- openNoteId: ut
3134
- }
3135
- ),
3136
- be === "training" && /* @__PURE__ */ e(An, {}),
3137
- be === "webide" && /* @__PURE__ */ e(Bn, {})
3138
- ] }) : B === "cloud" && C ? Se = /* @__PURE__ */ e("div", { className: d.chatHost, children: /* @__PURE__ */ e(
3139
- Dn,
3140
- {
3141
- agent: C.agent,
3142
- initialSessionId: C.sessionId,
3143
- autoSendDraft: C.draft,
3144
- chromeless: !0,
3145
- agents: v,
3146
- onSwitchAgent: (n) => _e(n)
3147
- },
3148
- At
3149
- ) }) : B === "local" && Z && j && G !== "landing" ? Se = /* @__PURE__ */ e("div", { className: d.chatHost, children: /* @__PURE__ */ e(
3150
- En,
3151
- {
3152
- agent: mr(j),
3153
- newSessionTrigger: ke,
3154
- autoSendDraft: st,
3155
- onAutoSendConsumed: () => Ce(null),
3156
- openSessionId: X,
3157
- onOpenSessionConsumed: Ct,
3158
- onSessionsMutated: () => ue((n) => n + 1)
3159
- },
3160
- j.id
3161
- ) }) : Se = /* @__PURE__ */ e(
3162
- hr,
3163
- {
3164
- agents: v,
3165
- activeAgent: me,
3166
- onSwitchAgent: (n) => F(n.id),
3167
- localAgentName: B === "local" ? (j == null ? void 0 : j.name) ?? "本机 Agent" : null,
3168
- onLocalSend: B === "local" ? Xe : void 0,
3169
- localOffline: B === "local" && !fe,
3170
- initialSpace: Fe,
3171
- onSend: at,
3172
- onOpenTab: Ze,
3173
- onQuickAsk: Ot,
3174
- recentTasks: St,
3175
- onOpenHistory: () => k("history")
3176
- }
3177
- ), /* @__PURE__ */ l("div", { className: d.shell, children: [
3178
- /* @__PURE__ */ l("aside", { className: d.sidebar, "aria-label": "个人专享工作台导航", children: [
3179
- /* @__PURE__ */ l("div", { className: d.sideContent, children: [
3180
- Z && /* @__PURE__ */ l("div", { className: d.laneTabs, role: "tablist", "aria-label": "任务车道", children: [
3181
- /* @__PURE__ */ l(
3182
- "button",
3183
- {
3184
- type: "button",
3185
- role: "tab",
3186
- "aria-selected": B === "local",
3187
- className: `${d.laneTab} ${B === "local" ? d.laneTabActive : ""}`,
3188
- onClick: () => it("local"),
3189
- title: fe ? "本机 Agent 已连接:任务在你的电脑上执行" : "本机 Agent 未运行:启动 Z-OPC 桌面端伴生服务后可用",
3190
- children: [
3191
- /* @__PURE__ */ e(nn, { className: d.laneIcon }),
3192
- /* @__PURE__ */ e("span", { className: d.laneText, children: "本地" })
3193
- ]
3194
- }
3195
- ),
3196
- /* @__PURE__ */ l(
3197
- "button",
3198
- {
3199
- type: "button",
3200
- role: "tab",
3201
- "aria-selected": B === "cloud",
3202
- className: `${d.laneTab} ${B === "cloud" ? d.laneTabActive : ""}`,
3203
- onClick: () => it("cloud"),
3204
- title: "云端任务:跨设备同步,手机/网页都能继续",
3205
- children: [
3206
- /* @__PURE__ */ e(tn, { className: d.laneIcon }),
3207
- /* @__PURE__ */ e("span", { className: d.laneText, children: "云端" })
3208
- ]
3209
- }
3210
- )
3211
- ] }),
3212
- /* @__PURE__ */ e(
3213
- Da,
3214
- {
3215
- currentUser: A,
3216
- token: g,
3217
- isDesktop: ft,
3218
- activeNav: G === "schedule" ? "schedule" : null,
3219
- extensionsGroupActive: [
3220
- "extensions",
3221
- "agentDetail",
3222
- // 聊天记录已收进「更多能力」浮层(2026-10-30):进入后组行应点亮,
3223
- // 否则整页没有当前位置指示
3224
- "history",
3225
- "personalTab",
3226
- "workbenchShell"
3227
- ].includes(G),
3228
- activePersonalTab: G === "personalTab" ? be : null,
3229
- onDesktopNewTask: B === "local" && j ? gt : void 0,
3230
- onPickSpace: (n) => {
3231
- Ee(n), It();
3232
- },
3233
- currentSpaceId: (Fe == null ? void 0 : Fe.id) ?? null,
3234
- onOpenSchedule: () => k("schedule"),
3235
- onOpenExtensions: _,
3236
- onOpenHistory: () => k("history"),
3237
- onOpenSearch: () => {
3238
- q(!0), Oe.getState().loadProjects();
3239
- },
3240
- searchActive: oe,
3241
- onOpenPersonalTab: Ze,
3242
- onOpenWorkbenchShell: () => k("workbenchShell")
3243
- }
3244
- ),
3245
- /* @__PURE__ */ e("div", { className: d.sideTasks, children: B === "cloud" ? /* @__PURE__ */ l(ze, { children: [
3246
- /* @__PURE__ */ e("div", { className: d.tasksLabel, children: "项目" }),
3247
- Ie.length === 0 && !O && /* @__PURE__ */ e("div", { className: d.tasksEmpty, children: "还没有项目空间或云端任务" }),
3248
- Ie.map((n) => {
3249
- const o = ve.has(n.key);
3250
- return /* @__PURE__ */ l("div", { children: [
3251
- /* @__PURE__ */ l(
3252
- "button",
3253
- {
3254
- type: "button",
3255
- className: d.projFolder,
3256
- "aria-expanded": o,
3257
- onClick: () => Ne((h) => {
3258
- const y = new Set(h);
3259
- return y.has(n.key) ? y.delete(n.key) : y.add(n.key), y;
3260
- }),
3261
- children: [
3262
- /* @__PURE__ */ e(
3263
- Rt,
3264
- {
3265
- className: `${d.projCaret} ${o ? d.projCaretOpen : ""}`
3266
- }
3267
- ),
3268
- /* @__PURE__ */ e(Zt, { className: d.projIcon }),
3269
- /* @__PURE__ */ e("span", { className: d.projName, title: n.title, children: n.title }),
3270
- /* @__PURE__ */ e("span", { className: d.projMeta, children: n.sessions.length > 0 ? n.sessions.length : "暂无任务" })
3271
- ]
3272
- }
3273
- ),
3274
- o && n.sessions.length > 0 && /* @__PURE__ */ e("div", { className: d.projRows, children: n.sessions.map((h) => {
3275
- const y = Me.get(h.personalAgentId), N = ca(h.id), t = (ne == null ? void 0 : ne.lane) === "cloud" && ne.id === N;
3276
- return /* @__PURE__ */ e("div", { className: d.sessionRow, children: t ? /* @__PURE__ */ e(
3277
- "input",
3278
- {
3279
- className: d.rowRenameInput,
3280
- value: we,
3281
- autoFocus: !0,
3282
- "aria-label": "重命名会话",
3283
- onChange: (s) => Le(s.target.value),
3284
- onBlur: () => void mt(),
3285
- onKeyDown: (s) => {
3286
- s.key === "Enter" ? (s.preventDefault(), s.currentTarget.blur()) : s.key === "Escape" && (s.preventDefault(), Tt());
3287
- }
3288
- }
3289
- ) : /* @__PURE__ */ l(ze, { children: [
3290
- /* @__PURE__ */ e(
3291
- "button",
3292
- {
3293
- type: "button",
3294
- className: `${d.recentItem} ${(C == null ? void 0 : C.sessionId) === h.id ? d.recentItemActive : ""}`,
3295
- disabled: !y,
3296
- title: y ? h.title || "未命名会话" : "伙伴已不存在,无法打开",
3297
- onClick: () => y && _e(y, h.id),
3298
- children: /* @__PURE__ */ e("span", { className: d.recentItemText, children: h.title || "未命名会话" })
3299
- }
3300
- ),
3301
- /* @__PURE__ */ e(
3302
- Jt,
3303
- {
3304
- trigger: ["click"],
3305
- menu: {
3306
- items: [
3307
- { key: "rename", label: "重命名" },
3308
- {
3309
- key: "delete",
3310
- label: "删除",
3311
- danger: !0
3312
- }
3313
- ],
3314
- onClick: ({ key: s }) => {
3315
- y && (s === "rename" ? wt(
3316
- "cloud",
3317
- N,
3318
- h.title || ""
3319
- ) : s === "delete" && bt(
3320
- "cloud",
3321
- N,
3322
- h.title || ""
3323
- ));
3324
- }
3325
- },
3326
- children: /* @__PURE__ */ e(
3327
- "button",
3328
- {
3329
- type: "button",
3330
- className: d.rowMore,
3331
- title: "会话操作",
3332
- "aria-label": "会话操作",
3333
- "aria-haspopup": "menu",
3334
- disabled: !y,
3335
- children: "⋯"
3336
- }
3337
- )
3338
- }
3339
- )
3340
- ] }) }, h.id);
3341
- }) })
3342
- ] }, n.key);
3343
- })
3344
- ] }) : /* @__PURE__ */ l(ze, { children: [
3345
- /* @__PURE__ */ e("div", { className: d.tasksLabel, children: "目录" }),
3346
- ie.map((n) => {
3347
- const o = ve.has(n.key);
3348
- return /* @__PURE__ */ l("div", { children: [
3349
- /* @__PURE__ */ l(
3350
- "button",
3351
- {
3352
- type: "button",
3353
- className: d.projFolder,
3354
- "aria-expanded": o,
3355
- title: n.path ?? "未绑定目录:任务不带目录上下文",
3356
- onClick: () => Ne((h) => {
3357
- const y = new Set(h);
3358
- return y.has(n.key) ? y.delete(n.key) : y.add(n.key), y;
3359
- }),
3360
- children: [
3361
- /* @__PURE__ */ e(
3362
- Rt,
3363
- {
3364
- className: `${d.projCaret} ${o ? d.projCaretOpen : ""}`
3365
- }
3366
- ),
3367
- /* @__PURE__ */ e(Zt, { className: d.projIcon }),
3368
- /* @__PURE__ */ e("span", { className: d.projName, children: n.title }),
3369
- /* @__PURE__ */ e("span", { className: d.projMeta, children: n.sessions.length })
3370
- ]
3371
- }
3372
- ),
3373
- o && /* @__PURE__ */ e("div", { className: d.projRows, children: n.sessions.map((h) => {
3374
- const y = (ne == null ? void 0 : ne.lane) === "local" && ne.id === h.id;
3375
- return /* @__PURE__ */ e("div", { className: d.sessionRow, children: y ? /* @__PURE__ */ e(
3376
- "input",
3377
- {
3378
- className: d.rowRenameInput,
3379
- value: we,
3380
- autoFocus: !0,
3381
- "aria-label": "重命名会话",
3382
- onChange: (N) => Le(N.target.value),
3383
- onBlur: () => void mt(),
3384
- onKeyDown: (N) => {
3385
- N.key === "Enter" ? (N.preventDefault(), N.currentTarget.blur()) : N.key === "Escape" && (N.preventDefault(), Tt());
3386
- }
3387
- }
3388
- ) : /* @__PURE__ */ l(ze, { children: [
3389
- /* @__PURE__ */ e(
3390
- "button",
3391
- {
3392
- type: "button",
3393
- className: `${d.recentItem} ${X === h.id ? d.recentItemActive : ""}`,
3394
- title: h.title,
3395
- onClick: () => rt(h.id),
3396
- children: /* @__PURE__ */ e("span", { className: d.recentItemText, children: h.title || "未命名会话" })
3397
- }
3398
- ),
3399
- /* @__PURE__ */ e(
3400
- Jt,
3401
- {
3402
- trigger: ["click"],
3403
- menu: {
3404
- items: [
3405
- { key: "rename", label: "重命名" },
3406
- {
3407
- key: "delete",
3408
- label: "删除",
3409
- danger: !0
3410
- }
3411
- ],
3412
- onClick: ({ key: N }) => {
3413
- N === "rename" ? wt(
3414
- "local",
3415
- h.id,
3416
- h.title || ""
3417
- ) : N === "delete" && bt(
3418
- "local",
3419
- h.id,
3420
- h.title || ""
3421
- );
3422
- }
3423
- },
3424
- children: /* @__PURE__ */ e(
3425
- "button",
3426
- {
3427
- type: "button",
3428
- className: d.rowMore,
3429
- title: "会话操作",
3430
- "aria-label": "会话操作",
3431
- "aria-haspopup": "menu",
3432
- children: "⋯"
3433
- }
3434
- )
3435
- }
3436
- )
3437
- ] }) }, h.id);
3438
- }) })
3439
- ] }, n.key);
3440
- }),
3441
- de.length === 0 && /* @__PURE__ */ e("div", { className: d.tasksEmpty, children: fe ? "暂无本地任务,点上方「新建任务」开始" : "本机 Agent 未运行 —— 启动 Z-OPC 桌面端后自动连上" })
3442
- ] }) })
3443
- ] }),
3444
- /* @__PURE__ */ e(
3445
- Ra,
3446
- {
3447
- displayName: Pt,
3448
- subtitle: "Z-OPC · 个人(专享)",
3449
- onOpenSettings: () => je(!0),
3450
- children: ot.map((n) => /* @__PURE__ */ l(
3451
- "button",
3452
- {
3453
- type: "button",
3454
- role: "menuitem",
3455
- className: d.agentMenuItem,
3456
- onClick: () => a == null ? void 0 : a(n.mode),
3457
- children: [
3458
- /* @__PURE__ */ e("span", { className: d.navIcon, children: n.icon }),
3459
- /* @__PURE__ */ e("span", { children: n.label })
3460
- ]
3461
- },
3462
- n.mode
3463
- ))
3464
- }
3465
- )
3466
- ] }),
3467
- /* @__PURE__ */ e("main", { className: d.main, "aria-label": "个人专享工作台内容", children: V && !C && !j ? /* @__PURE__ */ e("div", { className: d.emptyState, children: /* @__PURE__ */ e("span", { className: d.emptyTitle, children: "正在加载智能伙伴…" }) }) : Se }),
3468
- /* @__PURE__ */ e(
3469
- Ea,
3470
- {
3471
- open: xt,
3472
- onClose: () => je(!1),
3473
- token: g
3474
- }
3475
- ),
3476
- oe && /* @__PURE__ */ e(
3477
- Ma,
3478
- {
3479
- sessions: ee,
3480
- localSessions: Z ? de : [],
3481
- agentsById: Me,
3482
- projects: ce,
3483
- token: g,
3484
- actions: $t,
3485
- onOpenSession: (n, o) => _e(n, o),
3486
- onOpenLocalSession: rt,
3487
- onOpenProject: (n) => Qe(n.id),
3488
- onClose: () => q(!1)
3489
- }
3490
- )
3491
- ] });
3492
- }
3493
- export {
3494
- Br as default
3495
- };