@yuku123/z-team-component 0.2.103 → 0.2.105

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 (60) hide show
  1. package/dist/ChangeLogView-B0ML82u0.js +542 -0
  2. package/dist/ComponentDoc-C_289lsE.js +8035 -0
  3. package/dist/InvitationManagementPage-D2ezz4ZQ.js +495 -0
  4. package/dist/OnboardingPage-BXsJ-kcJ.js +393 -0
  5. package/dist/ScheduledTasks-Cn8BsDkN.js +12127 -0
  6. package/dist/SystemShell-gcfNlt2L.js +688 -0
  7. package/dist/_commonjsHelpers-B52_cu2H.js +26 -0
  8. package/dist/admin-logs-B6K1DwRL.js +198 -0
  9. package/dist/api-BdP8mK8v.js +101 -0
  10. package/dist/api-DxSgE7qw.js +20 -0
  11. package/dist/browser-jb_PFvU3.js +1538 -0
  12. package/dist/createWorkspaceWsHandler-DcNA1pfi.js +13142 -0
  13. package/dist/ctc-sso-DtJHC-2M.js +117 -0
  14. package/dist/echarts-B1OU1xr4.js +16 -0
  15. package/dist/history-BlrA1eaW.js +41 -0
  16. package/dist/index-54iTaRVW.js +316 -0
  17. package/dist/index-BCw3Oxp1.js +42049 -0
  18. package/dist/index-BDq0ofl2.js +348 -0
  19. package/dist/index-BN-o5nZM.js +8 -0
  20. package/dist/index-B_LJRFsK.js +339 -0
  21. package/dist/index-Bf1K9zpk.js +112 -0
  22. package/dist/index-BfMFQ6RD.js +169 -0
  23. package/dist/index-BohoJQPr.js +7631 -0
  24. package/dist/index-C-8n6xxK.js +93 -0
  25. package/dist/index-C815hPWS.js +430 -0
  26. package/dist/index-C8m8s-SU.js +479 -0
  27. package/dist/index-CXJXSmhB.js +2217 -0
  28. package/dist/index-CdugR2_4.js +5892 -0
  29. package/dist/index-CeCsncoT.js +913 -0
  30. package/dist/index-CgCB0-yK.js +1645 -0
  31. package/dist/index-Cjddvrij.js +2699 -0
  32. package/dist/index-D487Inba.js +315 -0
  33. package/dist/index-DK71mfJn.js +999 -0
  34. package/dist/index-DLHcoHS9.js +189 -0
  35. package/dist/index-DUiFk01c.js +178 -0
  36. package/dist/index-DWsfQMp8.js +208 -0
  37. package/dist/index-DgN13A-E.js +10169 -0
  38. package/dist/index-DhDdFRHC.js +279 -0
  39. package/dist/index-DpLamT1r.js +574 -0
  40. package/dist/index-Dpii3P5J.js +1302 -0
  41. package/dist/index-DszzQwsc.js +956 -0
  42. package/dist/index-HJ3Kt-NT.js +358 -0
  43. package/dist/index-Nj-dlFKY.js +242 -0
  44. package/dist/index-ZuYJoo9E.js +118 -0
  45. package/dist/index-etyS3HY2.js +142 -0
  46. package/dist/index-jIh52A4c.js +132 -0
  47. package/dist/index.js +10 -0
  48. package/dist/index.module-CAa-2T7m.js +72 -0
  49. package/dist/index.module-UI0iz8K0.js +42 -0
  50. package/dist/instance-p-ezisoS.js +216 -0
  51. package/dist/menuPermission-u3Gd_c8S.js +60 -0
  52. package/dist/mobile-client-O3yr9h6t.js +24 -0
  53. package/dist/pages.js +21 -0
  54. package/dist/send-default-agent-team-message-BhIV6T6O.js +35 -0
  55. package/dist/spark-md5-Dld54a-T.js +178 -0
  56. package/dist/sso-user-Ib1jhF7t.js +43 -0
  57. package/dist/training-D3Uy5K_M.js +450 -0
  58. package/dist/webide-BGQnArzY.js +5233 -0
  59. package/dist/z-team-component.css +1 -0
  60. package/package.json +1 -1
@@ -0,0 +1,348 @@
1
+ import { jsxs as t, jsx as n, Fragment as _ } from "react/jsx-runtime";
2
+ import { useState as i, useRef as D, useCallback as B, useEffect as N } from "react";
3
+ import { u as j } from "./ComponentDoc-C_289lsE.js";
4
+ /* empty css */
5
+ import { l as F, c as G, a as z, b as K, p as W } from "./api-BdP8mK8v.js";
6
+ const L = "dev_brain_scenario";
7
+ function q() {
8
+ var M;
9
+ const [y, E] = i([]), [r, R] = i(
10
+ null
11
+ ), [d, g] = i([]), [c, H] = i([]), [m, h] = i(""), [O, u] = i(!1), [f, x] = i(!1), [b, v] = i(""), S = D(null), { token: s } = j(), w = B(() => {
12
+ var e;
13
+ (e = S.current) == null || e.scrollIntoView({ behavior: "smooth" });
14
+ }, []);
15
+ N(() => {
16
+ w();
17
+ }, [d, w]), N(() => {
18
+ T();
19
+ }, []);
20
+ const T = async () => {
21
+ try {
22
+ const e = await F(s || void 0);
23
+ E(e || []);
24
+ } catch (e) {
25
+ console.error("Failed to load instances:", e);
26
+ }
27
+ }, A = async () => {
28
+ const e = b.trim();
29
+ if (e) {
30
+ x(!0);
31
+ try {
32
+ const o = await G(
33
+ { scenario_code: L, name: e },
34
+ s || void 0
35
+ );
36
+ v(""), await T(), k(o);
37
+ } catch (o) {
38
+ alert(o instanceof Error ? o.message : "Create failed");
39
+ } finally {
40
+ x(!1);
41
+ }
42
+ }
43
+ }, k = async (e) => {
44
+ R(e), u(!0);
45
+ try {
46
+ const [o, l] = await Promise.all([
47
+ z(e.id, 50, void 0, s || void 0),
48
+ K(e.id, s || void 0)
49
+ ]);
50
+ g(o || []), H(l || []);
51
+ } catch (o) {
52
+ console.error("Failed to load instance data:", o);
53
+ } finally {
54
+ u(!1);
55
+ }
56
+ }, I = async () => {
57
+ const e = m.trim();
58
+ if (!e || !r) return;
59
+ const o = c.filter((a) => a.memberType === "AGENT");
60
+ let l, C = "TEXT";
61
+ for (const a of o)
62
+ if (e.includes(`@${a.displayName}`)) {
63
+ l = String(a.id), C = "AT_AGENT";
64
+ break;
65
+ }
66
+ h("");
67
+ try {
68
+ await W(
69
+ r.id,
70
+ {
71
+ content: e,
72
+ message_type: C,
73
+ ...l ? { at_agent_ref_id: l } : {}
74
+ },
75
+ s || void 0
76
+ );
77
+ const a = await z(
78
+ r.id,
79
+ 50,
80
+ void 0,
81
+ s || void 0
82
+ );
83
+ g(a || []);
84
+ } catch (a) {
85
+ alert(a instanceof Error ? a.message : "Send failed");
86
+ }
87
+ }, p = c.filter((e) => e.memberType === "AGENT"), U = c.filter((e) => e.memberType === "HUMAN");
88
+ return /* @__PURE__ */ t("div", { style: { display: "flex", height: "100vh", fontFamily: "sans-serif" }, children: [
89
+ /* @__PURE__ */ t(
90
+ "div",
91
+ {
92
+ style: {
93
+ width: 260,
94
+ borderRight: "1px solid #e8e8e8",
95
+ display: "flex",
96
+ flexDirection: "column",
97
+ background: "#fafafa"
98
+ },
99
+ children: [
100
+ /* @__PURE__ */ t("div", { style: { padding: 16, borderBottom: "1px solid #e8e8e8" }, children: [
101
+ /* @__PURE__ */ n("h3", { style: { margin: "0 0 12px" }, children: "Scenario Instances" }),
102
+ /* @__PURE__ */ t("div", { style: { display: "flex", gap: 8 }, children: [
103
+ /* @__PURE__ */ n(
104
+ "input",
105
+ {
106
+ style: {
107
+ flex: 1,
108
+ padding: "6px 8px",
109
+ border: "1px solid #d9d9d9",
110
+ borderRadius: 4
111
+ },
112
+ placeholder: "Instance name",
113
+ value: b,
114
+ onChange: (e) => v(e.target.value),
115
+ onKeyDown: (e) => e.key === "Enter" && A()
116
+ }
117
+ ),
118
+ /* @__PURE__ */ n(
119
+ "button",
120
+ {
121
+ style: {
122
+ padding: "6px 12px",
123
+ background: "#1677ff",
124
+ color: "#fff",
125
+ border: "none",
126
+ borderRadius: 4,
127
+ cursor: f ? "not-allowed" : "pointer"
128
+ },
129
+ disabled: f,
130
+ onClick: A,
131
+ children: f ? "..." : "+"
132
+ }
133
+ )
134
+ ] })
135
+ ] }),
136
+ /* @__PURE__ */ t("div", { style: { flex: 1, overflow: "auto" }, children: [
137
+ y.map((e) => /* @__PURE__ */ t(
138
+ "div",
139
+ {
140
+ onClick: () => k(e),
141
+ style: {
142
+ padding: "10px 16px",
143
+ cursor: "pointer",
144
+ background: (r == null ? void 0 : r.id) === e.id ? "#e6f4ff" : "transparent",
145
+ borderBottom: "1px solid #f0f0f0"
146
+ },
147
+ children: [
148
+ /* @__PURE__ */ n("div", { style: { fontWeight: 500, fontSize: 13 }, children: e.name }),
149
+ /* @__PURE__ */ t("div", { style: { fontSize: 11, color: "#999" }, children: [
150
+ e.scenarioCode,
151
+ " · ",
152
+ e.status
153
+ ] })
154
+ ]
155
+ },
156
+ e.id
157
+ )),
158
+ y.length === 0 ? /* @__PURE__ */ n("div", { style: { padding: 16, color: "#999", fontSize: 12 }, children: "No instances yet. Create one above." }) : null
159
+ ] })
160
+ ]
161
+ }
162
+ ),
163
+ /* @__PURE__ */ n("div", { style: { flex: 1, display: "flex", flexDirection: "column" }, children: r ? /* @__PURE__ */ t(_, { children: [
164
+ /* @__PURE__ */ t(
165
+ "div",
166
+ {
167
+ style: {
168
+ padding: "12px 20px",
169
+ borderBottom: "1px solid #e8e8e8",
170
+ display: "flex",
171
+ justifyContent: "space-between",
172
+ alignItems: "center"
173
+ },
174
+ children: [
175
+ /* @__PURE__ */ t("div", { children: [
176
+ /* @__PURE__ */ n("span", { style: { fontWeight: 600, fontSize: 15 }, children: r.name }),
177
+ /* @__PURE__ */ t("span", { style: { marginLeft: 8, fontSize: 12, color: "#999" }, children: [
178
+ "ID: ",
179
+ r.id
180
+ ] })
181
+ ] }),
182
+ /* @__PURE__ */ t("div", { style: { fontSize: 12, color: "#666" }, children: [
183
+ "Members: ",
184
+ U.length,
185
+ " human · ",
186
+ p.length,
187
+ " ",
188
+ "agent"
189
+ ] })
190
+ ]
191
+ }
192
+ ),
193
+ /* @__PURE__ */ t(
194
+ "div",
195
+ {
196
+ style: {
197
+ flex: 1,
198
+ overflow: "auto",
199
+ padding: "16px 20px",
200
+ background: "#fff"
201
+ },
202
+ children: [
203
+ d.length === 0 ? /* @__PURE__ */ n(
204
+ "div",
205
+ {
206
+ style: { color: "#999", textAlign: "center", marginTop: 80 },
207
+ children: "Send a message to start. Use @agent_name to mention an agent."
208
+ }
209
+ ) : null,
210
+ d.map((e) => /* @__PURE__ */ t(
211
+ "div",
212
+ {
213
+ style: {
214
+ marginBottom: 12,
215
+ display: "flex",
216
+ flexDirection: e.senderType === "HUMAN" ? "row-reverse" : "row",
217
+ gap: 8
218
+ },
219
+ children: [
220
+ /* @__PURE__ */ n(
221
+ "div",
222
+ {
223
+ style: {
224
+ width: 32,
225
+ height: 32,
226
+ borderRadius: "50%",
227
+ background: e.senderType === "HUMAN" ? "#1677ff" : "#52c41a",
228
+ color: "#fff",
229
+ display: "flex",
230
+ alignItems: "center",
231
+ justifyContent: "center",
232
+ fontSize: 14,
233
+ flexShrink: 0
234
+ },
235
+ children: e.senderType === "HUMAN" ? "U" : "A"
236
+ }
237
+ ),
238
+ /* @__PURE__ */ t("div", { style: { maxWidth: "70%" }, children: [
239
+ /* @__PURE__ */ t(
240
+ "div",
241
+ {
242
+ style: {
243
+ fontSize: 11,
244
+ color: "#999",
245
+ marginBottom: 2,
246
+ textAlign: e.senderType === "HUMAN" ? "right" : "left"
247
+ },
248
+ children: [
249
+ e.senderType === "HUMAN" ? "You" : "Agent",
250
+ " ·",
251
+ " ",
252
+ e.messageType
253
+ ]
254
+ }
255
+ ),
256
+ /* @__PURE__ */ n(
257
+ "div",
258
+ {
259
+ style: {
260
+ padding: "8px 12px",
261
+ borderRadius: 8,
262
+ background: e.senderType === "HUMAN" ? "#1677ff" : "#f5f5f5",
263
+ color: e.senderType === "HUMAN" ? "#fff" : "#333",
264
+ fontSize: 13,
265
+ whiteSpace: "pre-wrap",
266
+ wordBreak: "break-word"
267
+ },
268
+ children: e.content
269
+ }
270
+ )
271
+ ] })
272
+ ]
273
+ },
274
+ e.id
275
+ )),
276
+ /* @__PURE__ */ n("div", { ref: S })
277
+ ]
278
+ }
279
+ ),
280
+ /* @__PURE__ */ t(
281
+ "div",
282
+ {
283
+ style: {
284
+ padding: "12px 20px",
285
+ borderTop: "1px solid #e8e8e8",
286
+ display: "flex",
287
+ gap: 8,
288
+ background: "#fafafa"
289
+ },
290
+ children: [
291
+ /* @__PURE__ */ n(
292
+ "textarea",
293
+ {
294
+ style: {
295
+ flex: 1,
296
+ padding: "8px 12px",
297
+ border: "1px solid #d9d9d9",
298
+ borderRadius: 4,
299
+ resize: "none",
300
+ minHeight: 40,
301
+ maxHeight: 120,
302
+ fontSize: 13
303
+ },
304
+ placeholder: p.length > 0 ? `Type message. @${(M = p[0]) == null ? void 0 : M.displayName} to mention agent.` : "Type message...",
305
+ value: m,
306
+ onChange: (e) => h(e.target.value),
307
+ onKeyDown: (e) => {
308
+ e.key === "Enter" && !e.shiftKey && (e.preventDefault(), I());
309
+ }
310
+ }
311
+ ),
312
+ /* @__PURE__ */ n(
313
+ "button",
314
+ {
315
+ style: {
316
+ padding: "8px 20px",
317
+ background: "#1677ff",
318
+ color: "#fff",
319
+ border: "none",
320
+ borderRadius: 4,
321
+ cursor: "pointer",
322
+ fontSize: 13
323
+ },
324
+ onClick: I,
325
+ children: "Send"
326
+ }
327
+ )
328
+ ]
329
+ }
330
+ )
331
+ ] }) : /* @__PURE__ */ n(
332
+ "div",
333
+ {
334
+ style: {
335
+ flex: 1,
336
+ display: "flex",
337
+ alignItems: "center",
338
+ justifyContent: "center",
339
+ color: "#999"
340
+ },
341
+ children: "Select or create a scenario instance to start"
342
+ }
343
+ ) })
344
+ ] });
345
+ }
346
+ export {
347
+ q as default
348
+ };
@@ -0,0 +1,8 @@
1
+ import { jsx as e } from "react/jsx-runtime";
2
+ import { C as r } from "./ChangeLogView-B0ML82u0.js";
3
+ function n() {
4
+ return /* @__PURE__ */ e(r, { variant: "page" });
5
+ }
6
+ export {
7
+ n as default
8
+ };
@@ -0,0 +1,339 @@
1
+ import { jsxs as r, jsx as n } from "react/jsx-runtime";
2
+ import { useState as o, useEffect as m, useCallback as k, useMemo as M } from "react";
3
+ import { h as l } from "./history-BlrA1eaW.js";
4
+ import { f as N, p as v, L as d, M as S, A as C, a as O, b as W } from "./index-DWsfQMp8.js";
5
+ const R = "_page_15tgf_8", E = "_bgWash_15tgf_48", F = "_bgGrid_15tgf_59", G = "_navbar_15tgf_74", z = "_navInner_15tgf_84", H = "_navBrand_15tgf_95", Z = "_navMark_15tgf_102", $ = "_navBrandText_15tgf_116", U = "_navBack_15tgf_123", K = "_hero_15tgf_143", j = "_eyebrow_15tgf_151", X = "_eyebrowDot_15tgf_166", Q = "_heroTitle_15tgf_174", V = "_heroLead_15tgf_183", q = "_grid_15tgf_192", J = "_card_15tgf_203", Y = "_cardFocused_15tgf_219", ee = "_cardHead_15tgf_224", ae = "_cardIcon_15tgf_230", ne = "_cardHeadText_15tgf_243", te = "_cardTitle_15tgf_248", re = "_cardEn_15tgf_256", se = "_cardBadges_15tgf_262", ce = "_badge_15tgf_270", oe = "_badgeDevice_15tgf_271", de = "_badge_ready_15tgf_286", ie = "_badge_beta_15tgf_292", le = "_badge_soon_15tgf_298", _e = "_badge_free_15tgf_304", ge = "_badge_instant_15tgf_310", me = "_cardDesc_15tgf_316", he = "_metaRow_15tgf_323", be = "_metaItem_15tgf_330", fe = "_changelog_15tgf_343", ue = "_changelogLabel_15tgf_351", ke = "_changelogText_15tgf_358", Ne = "_steps_15tgf_365", ve = "_cardAction_15tgf_381", we = "_btnPrimary_15tgf_385", ye = "_btnGhost_15tgf_386", pe = "_btnDisabled_15tgf_387", Te = "_cardNote_15tgf_432", Ae = "_footer_15tgf_439", Pe = "_footerLink_15tgf_455", e = {
6
+ page: R,
7
+ bgWash: E,
8
+ bgGrid: F,
9
+ navbar: G,
10
+ navInner: z,
11
+ navBrand: H,
12
+ navMark: Z,
13
+ navBrandText: $,
14
+ navBack: U,
15
+ hero: K,
16
+ eyebrow: j,
17
+ eyebrowDot: X,
18
+ heroTitle: Q,
19
+ heroLead: V,
20
+ grid: q,
21
+ card: J,
22
+ cardFocused: Y,
23
+ cardHead: ee,
24
+ cardIcon: ae,
25
+ cardHeadText: ne,
26
+ cardTitle: te,
27
+ cardEn: re,
28
+ cardBadges: se,
29
+ badge: ce,
30
+ badgeDevice: oe,
31
+ badge_ready: de,
32
+ badge_beta: ie,
33
+ badge_soon: le,
34
+ badge_free: _e,
35
+ badge_instant: ge,
36
+ cardDesc: me,
37
+ metaRow: he,
38
+ metaItem: be,
39
+ changelog: fe,
40
+ changelogLabel: ue,
41
+ changelogText: ke,
42
+ steps: Ne,
43
+ cardAction: ve,
44
+ btnPrimary: we,
45
+ btnGhost: ye,
46
+ btnDisabled: pe,
47
+ cardNote: Te,
48
+ footer: Ae,
49
+ footerLink: Pe
50
+ }, Le = {
51
+ ready: "正式版",
52
+ beta: "内测中",
53
+ soon: "即将发布",
54
+ free: "免安装",
55
+ instant: "即刻可用"
56
+ }, g = [
57
+ {
58
+ key: "macos",
59
+ icon: "laptop",
60
+ name: "macOS 桌面客户端",
61
+ en: "Z-OPC 桌面端 · Apple Silicon",
62
+ state: "ready",
63
+ desc: "本地 Agent 沙箱、火箭跳转、自动更新。桌面端与生产 Agent 集群双向打通,敏感操作不出本地。"
64
+ },
65
+ {
66
+ key: "windows",
67
+ icon: "windows",
68
+ name: "Windows 桌面客户端",
69
+ en: "Z-OPC 桌面端 · Windows 10+",
70
+ state: "ready",
71
+ desc: "与 macOS 同源交付:本地 Agent 沙箱、火箭跳转、自动更新一套不打折。安装包为 x64 setup 格式。"
72
+ },
73
+ {
74
+ key: "ios",
75
+ icon: "phone",
76
+ name: "iOS App",
77
+ en: "Z-OPC · iPhone / iPad",
78
+ state: "beta",
79
+ desc: "iOS 版通过 TestFlight 分发内测版本,测试通过后上架 App Store。后续版本由 TestFlight 自动推送。"
80
+ },
81
+ {
82
+ key: "android",
83
+ icon: "bot",
84
+ name: "Android App",
85
+ en: "Z-OPC · APK 直装包",
86
+ state: "soon",
87
+ desc: "APK 直装包,支持手机浏览器直接下载安装。若提示「未知来源」,需在系统设置中允许浏览器安装应用。"
88
+ },
89
+ {
90
+ key: "web",
91
+ icon: "globe",
92
+ name: "Web 版",
93
+ en: "浏览器 · 全平台",
94
+ state: "free",
95
+ desc: "无需安装,浏览器直接进入完整工作台。手机浏览器自动进入移动端界面,数据与客户端完全同步。"
96
+ },
97
+ {
98
+ key: "cli",
99
+ icon: "terminal",
100
+ name: "CLI Agent",
101
+ en: "claude-code 等多运行时",
102
+ state: "instant",
103
+ desc: "接入既有 CLI 运行时,在命令行里把任务交给 Agent 执行,结论回到会话。详见操作手册的接入章节。"
104
+ }
105
+ ];
106
+ function De(s, c) {
107
+ return c && c.releaseType === "beta" ? "beta" : s.state;
108
+ }
109
+ function Ie(s, c) {
110
+ return c && c.releaseType === "beta" ? "内测版" : Le[s.state];
111
+ }
112
+ function xe() {
113
+ const s = navigator.userAgent;
114
+ return /iPad|iPhone|iPod/.test(s) ? "ios" : /Android/i.test(s) ? "android" : /Mac OS X|Macintosh/.test(s) ? "macos" : "web";
115
+ }
116
+ function w() {
117
+ if (typeof window > "u") return null;
118
+ const s = new URLSearchParams(window.location.search).get("platform");
119
+ return s && g.some((c) => c.key === s) ? s : null;
120
+ }
121
+ function We() {
122
+ const [s, c] = o(null), [h, y] = o(null), [b, f] = o(!1), [p, u] = o(!1), [_, T] = o(
123
+ w
124
+ ), [A, Be] = o(() => xe());
125
+ m(() => {
126
+ let a = !0;
127
+ return N(S).then((t) => {
128
+ a && (c(t), f(!0));
129
+ }).catch(() => a && f(!0)), N(C).then((t) => {
130
+ a && (y(t), u(!0));
131
+ }).catch(() => a && u(!0)), () => {
132
+ a = !1;
133
+ };
134
+ }, []), m(() => {
135
+ const a = () => T(w());
136
+ return window.addEventListener("popstate", a), () => window.removeEventListener("popstate", a);
137
+ }, []), m(() => {
138
+ if (!_) return;
139
+ const a = document.getElementById(`dl-${_}`);
140
+ if (!a) return;
141
+ const t = window.setTimeout(
142
+ () => a.scrollIntoView({ behavior: "smooth", block: "center" }),
143
+ 120
144
+ );
145
+ return () => window.clearTimeout(t);
146
+ }, [_]);
147
+ const P = k(() => {
148
+ const a = /iPad|iPhone|iPod|Android/i.test(navigator.userAgent);
149
+ l.push(a ? "/phone" : "/workspace");
150
+ }, []), i = k(
151
+ (a) => a === "macos" ? v(s, "macos") : a === "windows" ? v(s, "windows") : a === "android" ? h : null,
152
+ [s, h]
153
+ ), L = (a) => {
154
+ const t = i(a.key);
155
+ return a.key === "macos" ? t ? /* @__PURE__ */ r(
156
+ "a",
157
+ {
158
+ className: e.btnPrimary,
159
+ href: t.downloadUrl,
160
+ target: "_blank",
161
+ rel: "noreferrer",
162
+ children: [
163
+ /* @__PURE__ */ n(d, { name: "download", size: 15, strokeWidth: 2 }),
164
+ "下载 DMG · v",
165
+ t.version
166
+ ]
167
+ }
168
+ ) : /* @__PURE__ */ n("button", { className: e.btnDisabled, disabled: !0, children: b ? "版本清单未获取" : "版本清单加载中…" }) : a.key === "windows" ? t ? /* @__PURE__ */ r(
169
+ "a",
170
+ {
171
+ className: e.btnPrimary,
172
+ href: t.downloadUrl,
173
+ target: "_blank",
174
+ rel: "noreferrer",
175
+ children: [
176
+ /* @__PURE__ */ n(d, { name: "download", size: 15, strokeWidth: 2 }),
177
+ "下载 Windows 版 · v",
178
+ t.version
179
+ ]
180
+ }
181
+ ) : /* @__PURE__ */ n("button", { className: e.btnDisabled, disabled: !0, children: b ? "版本清单未获取" : "版本清单加载中…" }) : a.key === "android" ? t ? /* @__PURE__ */ r(
182
+ "a",
183
+ {
184
+ className: e.btnPrimary,
185
+ href: t.downloadUrl,
186
+ target: "_blank",
187
+ rel: "noreferrer",
188
+ children: [
189
+ /* @__PURE__ */ n(d, { name: "download", size: 15, strokeWidth: 2 }),
190
+ "下载 APK · v",
191
+ t.version
192
+ ]
193
+ }
194
+ ) : /* @__PURE__ */ n("button", { className: e.btnDisabled, disabled: !0, children: p ? "即将发布 · 敬请期待" : "版本清单加载中…" }) : a.key === "ios" ? /* @__PURE__ */ n("button", { className: e.btnDisabled, disabled: !0, children: "内测资格申请中 · 敬请期待" }) : a.key === "web" ? /* @__PURE__ */ r("button", { className: e.btnPrimary, onClick: P, children: [
195
+ /* @__PURE__ */ n(d, { name: "arrow", size: 15, strokeWidth: 2 }),
196
+ "立即进入工作台"
197
+ ] }) : a.key === "cli" ? /* @__PURE__ */ n(
198
+ "button",
199
+ {
200
+ className: e.btnGhost,
201
+ onClick: () => l.push("/docs"),
202
+ children: "查看接入方式"
203
+ }
204
+ ) : /* @__PURE__ */ n("button", { className: e.btnDisabled, disabled: !0, children: "安装包制作中" });
205
+ }, D = (a) => {
206
+ const t = i(a.key);
207
+ return t ? /* @__PURE__ */ r("div", { className: e.metaRow, children: [
208
+ /* @__PURE__ */ r("span", { className: e.metaItem, children: [
209
+ /* @__PURE__ */ n(d, { name: "check", size: 13, strokeWidth: 2.2 }),
210
+ "v",
211
+ t.version
212
+ ] }),
213
+ t.fileSize > 0 && /* @__PURE__ */ n("span", { className: e.metaItem, children: O(t.fileSize) }),
214
+ t.releaseTime && /* @__PURE__ */ n("span", { className: e.metaItem, children: W(t.releaseTime) }),
215
+ t.arch && /* @__PURE__ */ n("span", { className: e.metaItem, children: t.arch })
216
+ ] }) : null;
217
+ }, I = M(
218
+ () => g.filter((a) => a.key === "web" || a.key === "cli" ? !0 : !!i(a.key)).length,
219
+ [i]
220
+ );
221
+ return /* @__PURE__ */ r("div", { className: e.page, children: [
222
+ /* @__PURE__ */ n("div", { className: e.bgWash }),
223
+ /* @__PURE__ */ n("div", { className: e.bgGrid }),
224
+ /* @__PURE__ */ n("nav", { className: e.navbar, children: /* @__PURE__ */ r("div", { className: e.navInner, children: [
225
+ /* @__PURE__ */ r(
226
+ "div",
227
+ {
228
+ className: e.navBrand,
229
+ onClick: () => l.push("/welcome"),
230
+ role: "button",
231
+ tabIndex: 0,
232
+ children: [
233
+ /* @__PURE__ */ n("span", { className: e.navMark, children: "ZO" }),
234
+ /* @__PURE__ */ n("span", { className: e.navBrandText, children: "Z-OPC" })
235
+ ]
236
+ }
237
+ ),
238
+ /* @__PURE__ */ n(
239
+ "button",
240
+ {
241
+ className: e.navBack,
242
+ onClick: () => l.push("/welcome"),
243
+ children: "返回产品首页"
244
+ }
245
+ )
246
+ ] }) }),
247
+ /* @__PURE__ */ r("header", { className: e.hero, children: [
248
+ /* @__PURE__ */ r("span", { className: e.eyebrow, children: [
249
+ /* @__PURE__ */ n("span", { className: e.eyebrowDot }),
250
+ "下载中心"
251
+ ] }),
252
+ /* @__PURE__ */ n("h1", { className: e.heroTitle, children: "全平台客户端" }),
253
+ /* @__PURE__ */ r("p", { className: e.heroLead, children: [
254
+ g.length,
255
+ " 个终端、同一条消息协议、同一套账号。 桌面端跑本地 Agent,移动端随手跟进,Web 与 CLI 随时接入。 当前 ",
256
+ I,
257
+ " 个终端可直接下载或使用。"
258
+ ] })
259
+ ] }),
260
+ /* @__PURE__ */ n("main", { className: e.grid, children: g.map((a) => {
261
+ const t = i(a.key), x = a.key === A, B = _ === a.key;
262
+ return /* @__PURE__ */ r(
263
+ "section",
264
+ {
265
+ id: `dl-${a.key}`,
266
+ className: `${e.card} ${B ? e.cardFocused : ""}`,
267
+ children: [
268
+ /* @__PURE__ */ r("div", { className: e.cardHead, children: [
269
+ /* @__PURE__ */ n("span", { className: e.cardIcon, children: /* @__PURE__ */ n(
270
+ d,
271
+ {
272
+ name: a.icon,
273
+ size: 21,
274
+ strokeWidth: 1.8
275
+ }
276
+ ) }),
277
+ /* @__PURE__ */ r("div", { className: e.cardHeadText, children: [
278
+ /* @__PURE__ */ n("h2", { className: e.cardTitle, children: a.name }),
279
+ /* @__PURE__ */ n("div", { className: e.cardEn, children: a.en })
280
+ ] }),
281
+ /* @__PURE__ */ r("div", { className: e.cardBadges, children: [
282
+ x && /* @__PURE__ */ n("span", { className: e.badgeDevice, children: "当前设备" }),
283
+ /* @__PURE__ */ n(
284
+ "span",
285
+ {
286
+ className: `${e.badge} ${e[`badge_${De(a, t)}`]}`,
287
+ children: Ie(a, t)
288
+ }
289
+ )
290
+ ] })
291
+ ] }),
292
+ /* @__PURE__ */ n("p", { className: e.cardDesc, children: a.desc }),
293
+ D(a),
294
+ (t == null ? void 0 : t.changelog) && /* @__PURE__ */ r("div", { className: e.changelog, children: [
295
+ /* @__PURE__ */ n("span", { className: e.changelogLabel, children: "本次更新" }),
296
+ /* @__PURE__ */ n("p", { className: e.changelogText, children: t.changelog })
297
+ ] }),
298
+ a.key === "ios" && /* @__PURE__ */ r("ol", { className: e.steps, children: [
299
+ /* @__PURE__ */ r("li", { children: [
300
+ "在 App Store 搜索并安装",
301
+ " ",
302
+ /* @__PURE__ */ n("b", { children: "TestFlight" }),
303
+ "(苹果官方测试平台)"
304
+ ] }),
305
+ /* @__PURE__ */ r("li", { children: [
306
+ "用 iPhone 打开",
307
+ /* @__PURE__ */ n("b", { children: "邀请链接" }),
308
+ ",点击「接受」 加入内测"
309
+ ] }),
310
+ /* @__PURE__ */ r("li", { children: [
311
+ "在 TestFlight 中安装 Z-OPC,后续版本",
312
+ /* @__PURE__ */ n("b", { children: "自动推送" })
313
+ ] })
314
+ ] }),
315
+ /* @__PURE__ */ n("div", { className: e.cardAction, children: L(a) }),
316
+ a.key === "macos" && /* @__PURE__ */ n("p", { className: e.cardNote, children: "下载后拖入「应用程序」即可使用,客户端支持自动检查更新" }),
317
+ a.key === "web" && /* @__PURE__ */ n("p", { className: e.cardNote, children: "平台 SSO 登录后使用,数据与客户端完全同步" }),
318
+ a.key === "android" && /* @__PURE__ */ n("p", { className: e.cardNote, children: "建议用手机浏览器打开本页直接下载安装" })
319
+ ]
320
+ },
321
+ a.key
322
+ );
323
+ }) }),
324
+ /* @__PURE__ */ r("footer", { className: e.footer, children: [
325
+ /* @__PURE__ */ n("span", { children: "© 2026 Z-OPC · 一人公司基建" }),
326
+ /* @__PURE__ */ n(
327
+ "button",
328
+ {
329
+ className: e.footerLink,
330
+ onClick: () => l.push("/welcome"),
331
+ children: "返回产品首页"
332
+ }
333
+ )
334
+ ] })
335
+ ] });
336
+ }
337
+ export {
338
+ We as default
339
+ };