aims-workstation 0.1.8 → 0.1.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"@earendil-works/pi-ai": "^1.2.0"
|
|
14
14
|
},
|
|
15
15
|
"packageManager": "pnpm@11.21.0+sha512.521705bce689924eac72f5a3587122f362689ef6571e55ba80076fd637c11132ecffada26fad4ea79c485bfddbfd3d5a2a5b05805a77e893de71ec8a6cca3bb1",
|
|
16
|
-
"version": "0.1.
|
|
16
|
+
"version": "0.1.9",
|
|
17
17
|
"description": "AIMS 工作站:本地智能体工作站——ARM 助手本地化(下载/离线/升级)、工作台对话式定制、多工作区隔离、分级自主与审计",
|
|
18
18
|
"bin": {
|
|
19
19
|
"aims-workstation": "bin/aims-workstation.js"
|
package/server.js
CHANGED
|
@@ -76,7 +76,7 @@ const PORT = +(process.env.PORT || env.PORT || 5600);
|
|
|
76
76
|
const HOST = process.env.AIMS_HOST || '0.0.0.0'; // 默认局域网可达(团队共用);仅本机使用可设 AIMS_HOST=127.0.0.1
|
|
77
77
|
// ── 运行时配置(ARM 源与 LLM 均可私有化部署:在「系统设置」页切换,存 AIMS_HOME/config/platform.json,优先级 运行时 > 环境变量 > .env)──
|
|
78
78
|
const CFG_FILE = path.join(AIMS_HOME, 'config/platform.json');
|
|
79
|
-
const cfg = { arm_api_base: '', arm_token: '', llm_base_url: '', llm_api_key: '', llm_model: '', scene_profile: '', access_token: '' };
|
|
79
|
+
const cfg = { arm_api_base: '', arm_token: '', llm_base_url: '', llm_api_key: '', llm_model: '', llm_context_tokens: 0, scene_profile: '', access_token: '' };
|
|
80
80
|
// 守护栏默认策略(可在「系统设置·守护栏」维护,存 platform.json,保存即热生效):deny=正则源串(命中即永久拒绝,任何级别不豁免);
|
|
81
81
|
// ro=只读白名单命令名(免确认直行);sudo_u_l2=true 时 `sudo -u <用户>` 降权形式不再永久拒绝、按写命令走 L2 人工确认(裸 sudo 仍拒绝)
|
|
82
82
|
const GUARD_DEFAULT = {
|
|
@@ -106,6 +106,9 @@ const LLM_DEFAULT_BASE = 'http://bifrost.infra.dev.aimstek.cn/v1';
|
|
|
106
106
|
const llmBaseUrl = () => cfg.llm_base_url || env.LLM_BASE_URL || LLM_DEFAULT_BASE;
|
|
107
107
|
const llmApiKey = () => cfg.llm_api_key || env.LLM_API_KEY || 'def';
|
|
108
108
|
const llmModelName = () => cfg.llm_model || env.LLM_MODEL || 'def';
|
|
109
|
+
// 上下文窗口(token):设置页可配(跟随所选模型的真实窗口),驱动会话历史裁剪预算;0/未配 = 默认 128K
|
|
110
|
+
const LLM_DEFAULT_CONTEXT_TOKENS = 128_000;
|
|
111
|
+
const llmContextTokens = () => { const n = +cfg.llm_context_tokens; return Number.isFinite(n) && n > 0 ? n : LLM_DEFAULT_CONTEXT_TOKENS; };
|
|
109
112
|
// 场景画像:平台级、全局一份的用户场景描述(团队环境/系统清单/规范),注入所有助手;空则不注入。
|
|
110
113
|
// 与知识检索互补(常驻事实 vs 按需检索);凭据不进画像(放"凭据在哪、找谁要")。
|
|
111
114
|
const sceneProfile = () => String(cfg.scene_profile || '').trim();
|
|
@@ -175,6 +178,8 @@ async function llmProbe() { // 设置页「保存并测试」:一次极小补
|
|
|
175
178
|
}
|
|
176
179
|
async function llmComplete(systemPrompt, userText) { // 无工具的一次性调用(起草/摘要)
|
|
177
180
|
const r = await models.complete(model, { systemPrompt, messages: [{ role: 'user', content: userText, timestamp: Date.now() }], tools: [] });
|
|
181
|
+
// pi-ai 把认证/请求失败表现为 stopReason=error 而非异常(同 llmProbe 判定)——不抛会变成空串静默流向调用方
|
|
182
|
+
if (r.stopReason === 'error') throw new Error(`LLM 请求失败: ${r.errorMessage || r.rawStopReason || 'stop=error'}`);
|
|
178
183
|
return (r.content || []).filter(b => b.type === 'text').map(b => b.text).join('');
|
|
179
184
|
}
|
|
180
185
|
|
|
@@ -1304,17 +1309,18 @@ const DEV_TOOLS = {
|
|
|
1304
1309
|
const devCtx = { agentId: null };
|
|
1305
1310
|
const devSessions = new Map();
|
|
1306
1311
|
|
|
1307
|
-
//
|
|
1308
|
-
//
|
|
1312
|
+
// 会话上下文裁剪(dev/主对话共用):前端 sessionId 固定(dev-<agentId前缀> / chat-<agentId>-<wsId>),会话跨请求长存——
|
|
1313
|
+
// 不裁剪会无限增长,最终超过模型上下文窗口被网关整单拒绝(2026-10-21 海立实例"发消息没反应"根因)。
|
|
1314
|
+
// 预算随设置页「上下文窗口(token)」联动:预留 16K token 给系统提示/当前轮/输出,1.6 char/token 对中文最坏比例(~0.67 token/char)仍在预留内。
|
|
1315
|
+
const ctxCharBudget = () => Math.max(4_000, Math.floor((llmContextTokens() - 16_000) * 1.6));
|
|
1309
1316
|
// 超预算从最旧轮次整轮丢弃;下刀点只选 user 消息边界,剩余前缀不会出现孤儿 toolResult(转换层要求其紧跟 assistant 的 toolCall);当前轮永不裁。
|
|
1310
|
-
|
|
1311
|
-
function trimDevContext(ctx) {
|
|
1317
|
+
function trimContext(ctx, budget = ctxCharBudget()) {
|
|
1312
1318
|
const msgs = ctx.messages;
|
|
1313
1319
|
const size = () => msgs.reduce((n, m) => n + JSON.stringify(m.content ?? '').length, 0);
|
|
1314
|
-
if (size() <=
|
|
1320
|
+
if (size() <= budget) return 0;
|
|
1315
1321
|
const lastUser = msgs.length - 1 - [...msgs].reverse().findIndex((m) => m.role === 'user');
|
|
1316
1322
|
let dropped = 0;
|
|
1317
|
-
while (size() >
|
|
1323
|
+
while (size() > budget) {
|
|
1318
1324
|
const cut = msgs.slice(1, lastUser - dropped).findIndex((m) => m.role === 'user');
|
|
1319
1325
|
if (cut < 0) break; // 当前轮之前再无完整轮次可丢(单轮就超预算只能放行,交由模型侧报错)
|
|
1320
1326
|
dropped += cut + 1;
|
|
@@ -1417,7 +1423,7 @@ async function devChatLoop(session, emit, signal = null) {
|
|
|
1417
1423
|
}
|
|
1418
1424
|
final = await stream.result();
|
|
1419
1425
|
// pi-ai 把认证/请求失败表现为 stopReason=error 而非异常(同 llmProbe 判定)——不检查会被吞成静默空回复
|
|
1420
|
-
if (final?.stopReason === 'error') throw new Error(`LLM 请求失败: ${final.
|
|
1426
|
+
if (final?.stopReason === 'error') throw new Error(`LLM 请求失败: ${final.errorMessage || final.rawStopReason || 'stop=error'}`);
|
|
1421
1427
|
} catch (e) {
|
|
1422
1428
|
if (!interrupted()) throw e; // 真实错误上抛给路由 catch → SSE error → 前端 toast;中断路径用占位消息兜底
|
|
1423
1429
|
}
|
|
@@ -1643,6 +1649,7 @@ const server = http.createServer(async (req, res) => {
|
|
|
1643
1649
|
model: llmModelName(), model_runtime: !!cfg.llm_model, catalog: llmCatalog,
|
|
1644
1650
|
key_set: !!k, key_masked: k ? `${k.slice(0, 6)}…${k.slice(-4)}` : '',
|
|
1645
1651
|
key_source: cfg.llm_api_key ? 'runtime' : (env.LLM_API_KEY ? 'env' : 'none'),
|
|
1652
|
+
context_tokens: llmContextTokens(), context_tokens_runtime: !!cfg.llm_context_tokens, default_context_tokens: LLM_DEFAULT_CONTEXT_TOKENS,
|
|
1646
1653
|
},
|
|
1647
1654
|
scene: { profile: sceneProfile(), length: sceneProfile().length },
|
|
1648
1655
|
auth: { enabled: !!accessToken(), token_masked: accessToken() ? `${accessToken().slice(0, 4)}…${accessToken().slice(-2)}` : '' },
|
|
@@ -1650,7 +1657,7 @@ const server = http.createServer(async (req, res) => {
|
|
|
1650
1657
|
});
|
|
1651
1658
|
}
|
|
1652
1659
|
if (req.method === 'PUT' && pathname === '/api/settings') {
|
|
1653
|
-
const { arm_api_base, arm_token, llm_base_url, llm_api_key, llm_model, scene_profile, access_token, guard } = await body(req);
|
|
1660
|
+
const { arm_api_base, arm_token, llm_base_url, llm_api_key, llm_model, llm_context_tokens, scene_profile, access_token, guard } = await body(req);
|
|
1654
1661
|
// 守护栏维护:deny 正则可编译 / ro 须为单命令名;保存即热生效(classifyExec 每次调用现读配置);删减危险规则记入审计
|
|
1655
1662
|
let guardAudit = null;
|
|
1656
1663
|
if (guard !== undefined) {
|
|
@@ -1692,6 +1699,15 @@ const server = http.createServer(async (req, res) => {
|
|
|
1692
1699
|
if (m && !/^[\w.:@\/-]{1,80}$/.test(m)) return json(res, 400, { error: `模型名不合法:${m}` });
|
|
1693
1700
|
cfg.llm_model = m;
|
|
1694
1701
|
}
|
|
1702
|
+
if (llm_context_tokens !== undefined) { // 上下文窗口(token):驱动会话裁剪预算;留空/0 = 默认 128K。不影响 provider,无需热切换
|
|
1703
|
+
const raw = String(llm_context_tokens ?? '').trim();
|
|
1704
|
+
if (raw === '') cfg.llm_context_tokens = 0;
|
|
1705
|
+
else {
|
|
1706
|
+
const n = Math.floor(+raw);
|
|
1707
|
+
if (!Number.isFinite(n) || n < 4_000 || n > 2_000_000) return json(res, 400, { error: `上下文窗口须为 4000-2000000 的 token 数(留空 = 默认 ${LLM_DEFAULT_CONTEXT_TOKENS}):${raw}` });
|
|
1708
|
+
cfg.llm_context_tokens = n;
|
|
1709
|
+
}
|
|
1710
|
+
}
|
|
1695
1711
|
if (llm_api_key !== undefined) cfg.llm_api_key = String(llm_api_key || '').trim();
|
|
1696
1712
|
// LLM 热切换:先应用验证,失败整体回滚(应用只是构建对象,无网络请求)
|
|
1697
1713
|
let llm_probe = null;
|
|
@@ -1706,7 +1722,7 @@ const server = http.createServer(async (req, res) => {
|
|
|
1706
1722
|
try { llm_probe = await llmProbe(); } catch (e) { llm_probe = { online: false, error: String(e.message).slice(0, 150) }; }
|
|
1707
1723
|
}
|
|
1708
1724
|
saveCfg();
|
|
1709
|
-
audit({ actor: 'settings', action: 'save', arm_api_base: cfg.arm_api_base, llm_model: cfg.llm_model, llm_base_changed: llm_base_url !== undefined, token_changed: arm_token !== undefined || llm_api_key !== undefined, scene_profile_changed: sceneChanged, scene_profile_len: sceneProfile().length, auth_changed: authChanged, guard_changed: guardAudit });
|
|
1725
|
+
audit({ actor: 'settings', action: 'save', arm_api_base: cfg.arm_api_base, llm_model: cfg.llm_model, llm_context_tokens: cfg.llm_context_tokens, llm_base_changed: llm_base_url !== undefined, token_changed: arm_token !== undefined || llm_api_key !== undefined, scene_profile_changed: sceneChanged, scene_profile_len: sceneProfile().length, auth_changed: authChanged, guard_changed: guardAudit });
|
|
1710
1726
|
// ARM 保存后即时探测(失败不回滚:允许先配置后启动 ARM)
|
|
1711
1727
|
let probe = { online: false, error: '' };
|
|
1712
1728
|
if ([arm_api_base, arm_token].some((v) => v !== undefined)) {
|
|
@@ -1794,8 +1810,12 @@ const server = http.createServer(async (req, res) => {
|
|
|
1794
1810
|
};
|
|
1795
1811
|
const stream = models.stream(model, ctx);
|
|
1796
1812
|
let out = '';
|
|
1797
|
-
for await (const ev of stream) {
|
|
1813
|
+
for await (const ev of stream) {
|
|
1814
|
+
if (ev.type === 'text_delta') out += ev.delta;
|
|
1815
|
+
else if (ev.type === 'error') throw new Error(`LLM 流错误: ${ev.error?.errorMessage || JSON.stringify(ev.error).slice(0, 200)}`); // pi-ai 失败不抛异常,须显式拦截,否则 200 返回空 prompt
|
|
1816
|
+
}
|
|
1798
1817
|
const final = await stream.result();
|
|
1818
|
+
if (final?.stopReason === 'error') throw new Error(`LLM 请求失败: ${final.errorMessage || final.rawStopReason || 'stop=error'}`);
|
|
1799
1819
|
const text = ((final.content || []).filter(b => b.type === 'text').map(b => b.text).join('') || out).trim();
|
|
1800
1820
|
let draftName = '', prompt = text;
|
|
1801
1821
|
const jm = text.match(/\{[\s\S]*\}/); // JSON 容错解析:失败则整段当 prompt,不阻断
|
|
@@ -2017,7 +2037,9 @@ const server = http.createServer(async (req, res) => {
|
|
|
2017
2037
|
const toolsAvail = dep.toolset.map(t => t.tool).join(', ');
|
|
2018
2038
|
const sys = '你是工业智能体平台的工作台设计师。根据助手档案生成工作台 DSL(JSON)。面板类型只允许: realtime_list(实时告警流)/status_grid(设备状态矩阵)/agent_dialog(诊断对话)/action_group(操作区)/kpi_strip(指标条)/inspection_report(自检报告)。结构: {"workbench":"名称","owner_agent":"agentId","version":"v0.1-draft","layout":[...],"panels":[{"id","type","title"}...]}。action_group 的 panels 含 "actions":[{"id","label","orchestration","autonomy","confirm":{"text","double_check"}}],orchestration 只能引用这些: logic://设备复位流程@mock / logic://告警派工@mock / logic://服务滚动重启@mock / logic://环境自检@mock。只输出 JSON,不要 markdown 代码围栏。';
|
|
2019
2039
|
const user = `助手: ${arm.name} ${arm.version}\n职责: ${arm.prompt}\n可用工具: ${toolsAvail}\n默认自主级别: ${dep.default_autonomy}\n请生成 4-6 个面板,含一个 agent_dialog 和一个 action_group。`;
|
|
2020
|
-
|
|
2040
|
+
let out;
|
|
2041
|
+
try { out = await llmComplete(sys, user); }
|
|
2042
|
+
catch (e) { return json(res, 502, { error: `AI 草稿生成失败: ${e.message}` }); }
|
|
2021
2043
|
const cleaned = out.replace(/```json|```/g, '').trim();
|
|
2022
2044
|
let draft;
|
|
2023
2045
|
try { draft = JSON.parse(cleaned); } catch (e) { return json(res, 502, { error: 'AI 草稿解析失败', raw: cleaned.slice(0, 500) }); }
|
|
@@ -2344,7 +2366,7 @@ const server = http.createServer(async (req, res) => {
|
|
|
2344
2366
|
s.context.systemPrompt = devSystemPrompt();
|
|
2345
2367
|
}
|
|
2346
2368
|
s.context.messages.push({ role: 'user', content: message, timestamp: Date.now() });
|
|
2347
|
-
const dropped =
|
|
2369
|
+
const dropped = trimContext(s.context);
|
|
2348
2370
|
if (dropped > 0) emit('status', { text: `会话历史过长,已自动裁剪最早 ${dropped} 条消息` });
|
|
2349
2371
|
await devChatLoop(s, emit, ctl.signal);
|
|
2350
2372
|
emit('meta', { hasDraft: !!loadDraft(agentId) });
|
|
@@ -2375,6 +2397,8 @@ const server = http.createServer(async (req, res) => {
|
|
|
2375
2397
|
return res.end();
|
|
2376
2398
|
}
|
|
2377
2399
|
s.context.messages.push({ role: 'user', content: context ? `${message}\n(界面注入上下文:当前选中设备 ${context.device})` : message, timestamp: Date.now() });
|
|
2400
|
+
const dropped = trimContext(s.context); // 主对话 sessionId 同样固定(chat-<agentId>-<wsId>),不裁剪会同样撑死
|
|
2401
|
+
if (dropped > 0) emit('status', { text: `会话历史过长,已自动裁剪最早 ${dropped} 条消息` });
|
|
2378
2402
|
s.running = true; s.sinceTs = Date.now(); s.abortCtl = ctl;
|
|
2379
2403
|
const out = await agentLoop(s, deployment, emit, ctl.signal);
|
|
2380
2404
|
emit('done', { reply: out.reply, pending: out.pending });
|
|
@@ -2418,6 +2442,18 @@ const server = http.createServer(async (req, res) => {
|
|
|
2418
2442
|
finally { finished = true; if (s) { s.running = false; s.statusText = ''; s.abortCtl = null; } }
|
|
2419
2443
|
return res.end();
|
|
2420
2444
|
}
|
|
2445
|
+
// ── 会话清空:主动丢弃上下文重开(上下文污染/换思路);运行中拒绝(先中断),pending 确认卡随会话一并作废 ──
|
|
2446
|
+
if (req.method === 'POST' && pathname === '/api/session/reset') {
|
|
2447
|
+
const { scope, sessionId } = await body(req);
|
|
2448
|
+
if (!sessionId || !String(sessionId).trim()) return json(res, 400, { error: '缺少 sessionId' });
|
|
2449
|
+
const store = scope === 'dev' ? devSessions : sessions;
|
|
2450
|
+
const s = store.get(String(sessionId).trim());
|
|
2451
|
+
if (!s) return json(res, 200, { ok: true, note: '会话本就为空' });
|
|
2452
|
+
if (s.running) return json(res, 409, { error: '会话正在处理中,请先中断再清空' });
|
|
2453
|
+
store.delete(String(sessionId).trim());
|
|
2454
|
+
audit({ actor: 'user', action: 'session-reset', scope: scope === 'dev' ? 'dev' : 'chat', sessionId: String(sessionId).slice(0, 48) });
|
|
2455
|
+
return json(res, 200, { ok: true });
|
|
2456
|
+
}
|
|
2421
2457
|
// ── 会话历史与进度(切换助手后回来:上下文回放 + 后台运行状态;服务端为唯一事实源)──
|
|
2422
2458
|
if (req.method === 'GET' && pathname === '/api/chat/history') {
|
|
2423
2459
|
const sid = url.searchParams.get('sessionId');
|
|
@@ -2470,7 +2506,9 @@ const server = http.createServer(async (req, res) => {
|
|
|
2470
2506
|
if (!s) return json(res, 400, { error: '会话不存在' });
|
|
2471
2507
|
const convo = s.context.messages.filter(m => m.role === 'user' || m.role === 'assistant')
|
|
2472
2508
|
.slice(-12).map(m => `${m.role === 'user' ? '用户' : '助手'}: ${(m.content || []).filter?.(b => b.type === 'text').map(b => b.text).join('') ?? m.content}`).join('\n');
|
|
2473
|
-
|
|
2509
|
+
let md;
|
|
2510
|
+
try { md = await llmComplete('你是经验沉淀器。把运维对话提炼为一条结构化经验 markdown,章节固定:## 现象 / ## 根因 / ## 处置步骤 / ## 验证 / ## 预防。事实不确定就写"待确认"。只输出 markdown 正文。', convo || '(空会话)'); }
|
|
2511
|
+
catch (e) { return json(res, 502, { error: `经验起草失败: ${e.message}` }); }
|
|
2474
2512
|
return json(res, 200, { markdown: md });
|
|
2475
2513
|
}
|
|
2476
2514
|
if (req.method === 'POST' && pathname === '/api/experience/commit') {
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
|
|
2
|
-
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-content:"";--tw-animation-delay:0s;--tw-animation-direction:normal;--tw-animation-duration:initial;--tw-animation-fill-mode:none;--tw-animation-iteration-count:1;--tw-enter-blur:0;--tw-enter-opacity:1;--tw-enter-rotate:0;--tw-enter-scale:1;--tw-enter-translate-x:0;--tw-enter-translate-y:0;--tw-exit-blur:0;--tw-exit-opacity:1;--tw-exit-rotate:0;--tw-exit-scale:1;--tw-exit-translate-x:0;--tw-exit-translate-y:0}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-300:oklch(80.8% .114 19.571);--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-amber-200:oklch(92.4% .12 95.746);--color-amber-300:oklch(87.9% .169 91.605);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-emerald-300:oklch(84.5% .143 164.978);--color-emerald-400:oklch(76.5% .177 163.223);--color-emerald-500:oklch(69.6% .17 162.48);--color-cyan-400:oklch(78.9% .154 211.53);--color-sky-400:oklch(74.6% .16 232.661);--color-sky-500:oklch(68.5% .169 237.323);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-500:oklch(62.3% .214 259.815);--color-violet-300:oklch(81.1% .111 293.571);--color-violet-400:oklch(70.2% .183 293.541);--color-violet-500:oklch(60.6% .25 292.717);--color-pink-400:oklch(71.8% .202 349.761);--color-slate-500:oklch(55.4% .046 257.417);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-2xl:42rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wide:.025em;--leading-tight:1.25;--leading-snug:1.375;--leading-relaxed:1.625;--radius-xs:.125rem;--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--blur-sm:8px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*{border-color:var(--border);outline-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){*{outline-color:color-mix(in oklab, var(--ring) 50%, transparent)}}body{background-color:var(--background);color:var(--foreground)}}@layer components;@layer utilities{.\@container\/card-header{container:card-header/inline-size}.pointer-events-none{pointer-events:none}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{inset:0}.inset-x-0{inset-inline:0}.-top-0,.top-0{top:0}.top-1\/2{top:50%}.top-2\.5{top:calc(var(--spacing) * 2.5)}.top-4{top:calc(var(--spacing) * 4)}.top-\[50\%\]{top:50%}.right-0{right:0}.right-2{right:calc(var(--spacing) * 2)}.right-4{right:calc(var(--spacing) * 4)}.bottom-0{bottom:0}.left-2\.5{left:calc(var(--spacing) * 2.5)}.left-3{left:calc(var(--spacing) * 3)}.left-\[50\%\]{left:50%}.z-10{z-index:10}.z-50{z-index:50}.col-start-2{grid-column-start:2}.row-span-2{grid-row:span 2/span 2}.row-start-1{grid-row-start:1}.-mx-1{margin-inline:calc(var(--spacing) * -1)}.mx-1{margin-inline:var(--spacing)}.my-1{margin-block:var(--spacing)}.my-4{margin-block:calc(var(--spacing) * 4)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-10{margin-top:calc(var(--spacing) * 10)}.mt-auto{margin-top:auto}.mr-0\.5{margin-right:calc(var(--spacing) * .5)}.mr-1{margin-right:var(--spacing)}.mr-1\.5{margin-right:calc(var(--spacing) * 1.5)}.mb-0\.5{margin-bottom:calc(var(--spacing) * .5)}.mb-1{margin-bottom:var(--spacing)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.ml-0\.5{margin-left:calc(var(--spacing) * .5)}.ml-1{margin-left:var(--spacing)}.ml-1\.5{margin-left:calc(var(--spacing) * 1.5)}.ml-6{margin-left:calc(var(--spacing) * 6)}.ml-auto{margin-left:auto}.line-clamp-1{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.flex{display:flex}.grid{display:grid}.inline{display:inline}.inline-flex{display:inline-flex}.table{display:table}.table-caption{display:table-caption}.table-cell{display:table-cell}.table-row{display:table-row}.field-sizing-content{field-sizing:content}.size-2\.5{width:calc(var(--spacing) * 2.5);height:calc(var(--spacing) * 2.5)}.size-3\.5{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-9{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}.size-10{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.size-full{width:100%;height:100%}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-3{height:calc(var(--spacing) * 3)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-12{height:calc(var(--spacing) * 12)}.h-20{height:calc(var(--spacing) * 20)}.h-40{height:calc(var(--spacing) * 40)}.h-44{height:calc(var(--spacing) * 44)}.h-52{height:calc(var(--spacing) * 52)}.h-64{height:calc(var(--spacing) * 64)}.h-\[calc\(100\%-1px\)\]{height:calc(100% - 1px)}.h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-\(--radix-select-content-available-height\){max-height:var(--radix-select-content-available-height)}.max-h-32{max-height:calc(var(--spacing) * 32)}.max-h-36{max-height:calc(var(--spacing) * 36)}.max-h-40{max-height:calc(var(--spacing) * 40)}.max-h-72{max-height:calc(var(--spacing) * 72)}.max-h-80{max-height:calc(var(--spacing) * 80)}.max-h-96{max-height:calc(var(--spacing) * 96)}.max-h-\[88vh\]{max-height:88vh}.min-h-0{min-height:0}.min-h-4{min-height:calc(var(--spacing) * 4)}.min-h-16{min-height:calc(var(--spacing) * 16)}.min-h-\[38px\]{min-height:38px}.min-h-\[56px\]{min-height:56px}.min-h-\[260px\]{min-height:260px}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-3{width:calc(var(--spacing) * 3)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-6{width:calc(var(--spacing) * 6)}.w-7{width:calc(var(--spacing) * 7)}.w-8{width:calc(var(--spacing) * 8)}.w-9{width:calc(var(--spacing) * 9)}.w-36{width:calc(var(--spacing) * 36)}.w-40{width:calc(var(--spacing) * 40)}.w-52{width:calc(var(--spacing) * 52)}.w-64{width:calc(var(--spacing) * 64)}.w-\[118px\]{width:118px}.w-fit{width:fit-content}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-28{max-width:calc(var(--spacing) * 28)}.max-w-56{max-width:calc(var(--spacing) * 56)}.max-w-64{max-width:calc(var(--spacing) * 64)}.max-w-\[85\%\]{max-width:85%}.max-w-\[90\%\]{max-width:90%}.max-w-\[92\%\]{max-width:92%}.max-w-\[calc\(100\%-2rem\)\]{max-width:calc(100% - 2rem)}.max-w-full{max-width:100%}.max-w-md{max-width:var(--container-md)}.max-w-xl{max-width:var(--container-xl)}.min-w-0{min-width:0}.min-w-36{min-width:calc(var(--spacing) * 36)}.min-w-\[8rem\]{min-width:8rem}.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.caption-bottom{caption-side:bottom}.origin-\(--radix-select-content-transform-origin\){transform-origin:var(--radix-select-content-transform-origin)}.origin-\(--radix-tooltip-content-transform-origin\){transform-origin:var(--radix-tooltip-content-transform-origin)}.translate-x-\[-50\%\]{--tw-translate-x:-50%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-\[3px\]{--tw-translate-x:3px;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-\[-50\%\]{--tw-translate-y:-50%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-\[3px\]{--tw-translate-y:3px;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-\[calc\(-50\%_-_2px\)\]{--tw-translate-y:calc(-50% - 2px);translate:var(--tw-translate-x) var(--tw-translate-y)}.rotate-45{rotate:45deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-in{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-grab{cursor:grab}.cursor-nwse-resize{cursor:nwse-resize}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.resize{resize:both}.resize-none{resize:none}.resize-y{resize:vertical}.scroll-my-1{scroll-margin-block:var(--spacing)}.list-disc{list-style-type:disc}.auto-rows-min{grid-auto-rows:min-content}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.grid-cols-\[0_1fr\]{grid-template-columns:0 1fr}.grid-cols-\[1fr_380px\]{grid-template-columns:1fr 380px}.grid-rows-\[auto_auto\]{grid-template-rows:auto auto}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-nowrap{flex-wrap:nowrap}.flex-wrap{flex-wrap:wrap}.place-content-center{place-content:center}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-items-start{justify-items:start}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-6{gap:calc(var(--spacing) * 6)}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}.gap-y-0\.5{row-gap:calc(var(--spacing) * .5)}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}.self-start{align-self:flex-start}.justify-self-end{justify-self:flex-end}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-\[2px\]{border-radius:2px}.rounded-\[4px\]{border-radius:4px}.rounded-\[inherit\]{border-radius:inherit}.rounded-full{border-radius:2147483647px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-sm{border-radius:.25rem}.rounded-xl{border-radius:.75rem}.rounded-xs{border-radius:var(--radius-xs)}.rounded-br-md{border-bottom-right-radius:.375rem}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-amber-500\/30{border-color:#f99c004d}@supports (color:color-mix(in lab, red, red)){.border-amber-500\/30{border-color:color-mix(in oklab, var(--color-amber-500) 30%, transparent)}}.border-amber-500\/40{border-color:#f99c0066}@supports (color:color-mix(in lab, red, red)){.border-amber-500\/40{border-color:color-mix(in oklab, var(--color-amber-500) 40%, transparent)}}.border-amber-500\/50{border-color:#f99c0080}@supports (color:color-mix(in lab, red, red)){.border-amber-500\/50{border-color:color-mix(in oklab, var(--color-amber-500) 50%, transparent)}}.border-blue-500\/30{border-color:#3080ff4d}@supports (color:color-mix(in lab, red, red)){.border-blue-500\/30{border-color:color-mix(in oklab, var(--color-blue-500) 30%, transparent)}}.border-border,.border-border\/60{border-color:var(--border)}@supports (color:color-mix(in lab, red, red)){.border-border\/60{border-color:color-mix(in oklab, var(--border) 60%, transparent)}}.border-emerald-500\/30{border-color:#00bb7f4d}@supports (color:color-mix(in lab, red, red)){.border-emerald-500\/30{border-color:color-mix(in oklab, var(--color-emerald-500) 30%, transparent)}}.border-emerald-500\/40{border-color:#00bb7f66}@supports (color:color-mix(in lab, red, red)){.border-emerald-500\/40{border-color:color-mix(in oklab, var(--color-emerald-500) 40%, transparent)}}.border-input{border-color:var(--input)}.border-primary,.border-primary\/30{border-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.border-primary\/30{border-color:color-mix(in oklab, var(--primary) 30%, transparent)}}.border-primary\/40{border-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.border-primary\/40{border-color:color-mix(in oklab, var(--primary) 40%, transparent)}}.border-primary\/60{border-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.border-primary\/60{border-color:color-mix(in oklab, var(--primary) 60%, transparent)}}.border-red-500\/30{border-color:#fb2c364d}@supports (color:color-mix(in lab, red, red)){.border-red-500\/30{border-color:color-mix(in oklab, var(--color-red-500) 30%, transparent)}}.border-red-500\/40{border-color:#fb2c3666}@supports (color:color-mix(in lab, red, red)){.border-red-500\/40{border-color:color-mix(in oklab, var(--color-red-500) 40%, transparent)}}.border-red-500\/50{border-color:#fb2c3680}@supports (color:color-mix(in lab, red, red)){.border-red-500\/50{border-color:color-mix(in oklab, var(--color-red-500) 50%, transparent)}}.border-red-500\/60{border-color:#fb2c3699}@supports (color:color-mix(in lab, red, red)){.border-red-500\/60{border-color:color-mix(in oklab, var(--color-red-500) 60%, transparent)}}.border-sidebar-border{border-color:var(--sidebar-border)}.border-transparent{border-color:#0000}.border-violet-500\/40{border-color:#8d54ff66}@supports (color:color-mix(in lab, red, red)){.border-violet-500\/40{border-color:color-mix(in oklab, var(--color-violet-500) 40%, transparent)}}.border-t-transparent{border-top-color:#0000}.border-l-transparent{border-left-color:#0000}.bg-accent{background-color:var(--accent)}.bg-amber-500{background-color:var(--color-amber-500)}.bg-amber-500\/5{background-color:#f99c000d}@supports (color:color-mix(in lab, red, red)){.bg-amber-500\/5{background-color:color-mix(in oklab, var(--color-amber-500) 5%, transparent)}}.bg-amber-500\/10{background-color:#f99c001a}@supports (color:color-mix(in lab, red, red)){.bg-amber-500\/10{background-color:color-mix(in oklab, var(--color-amber-500) 10%, transparent)}}.bg-amber-500\/15{background-color:#f99c0026}@supports (color:color-mix(in lab, red, red)){.bg-amber-500\/15{background-color:color-mix(in oklab, var(--color-amber-500) 15%, transparent)}}.bg-background,.bg-background\/85{background-color:var(--background)}@supports (color:color-mix(in lab, red, red)){.bg-background\/85{background-color:color-mix(in oklab, var(--background) 85%, transparent)}}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab, red, red)){.bg-black\/50{background-color:color-mix(in oklab, var(--color-black) 50%, transparent)}}.bg-blue-500\/5{background-color:#3080ff0d}@supports (color:color-mix(in lab, red, red)){.bg-blue-500\/5{background-color:color-mix(in oklab, var(--color-blue-500) 5%, transparent)}}.bg-border{background-color:var(--border)}.bg-card{background-color:var(--card)}.bg-destructive{background-color:var(--destructive)}.bg-emerald-500{background-color:var(--color-emerald-500)}.bg-emerald-500\/10{background-color:#00bb7f1a}@supports (color:color-mix(in lab, red, red)){.bg-emerald-500\/10{background-color:color-mix(in oklab, var(--color-emerald-500) 10%, transparent)}}.bg-emerald-500\/15{background-color:#00bb7f26}@supports (color:color-mix(in lab, red, red)){.bg-emerald-500\/15{background-color:color-mix(in oklab, var(--color-emerald-500) 15%, transparent)}}.bg-foreground{background-color:var(--foreground)}.bg-muted,.bg-muted\/20{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/20{background-color:color-mix(in oklab, var(--muted) 20%, transparent)}}.bg-muted\/30{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/30{background-color:color-mix(in oklab, var(--muted) 30%, transparent)}}.bg-muted\/40{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/40{background-color:color-mix(in oklab, var(--muted) 40%, transparent)}}.bg-muted\/50{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/50{background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.bg-popover{background-color:var(--popover)}.bg-primary,.bg-primary\/5{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.bg-primary\/5{background-color:color-mix(in oklab, var(--primary) 5%, transparent)}}.bg-primary\/10{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.bg-primary\/10{background-color:color-mix(in oklab, var(--primary) 10%, transparent)}}.bg-primary\/15{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.bg-primary\/15{background-color:color-mix(in oklab, var(--primary) 15%, transparent)}}.bg-primary\/20{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.bg-primary\/20{background-color:color-mix(in oklab, var(--primary) 20%, transparent)}}.bg-primary\/25{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.bg-primary\/25{background-color:color-mix(in oklab, var(--primary) 25%, transparent)}}.bg-red-500{background-color:var(--color-red-500)}.bg-red-500\/5{background-color:#fb2c360d}@supports (color:color-mix(in lab, red, red)){.bg-red-500\/5{background-color:color-mix(in oklab, var(--color-red-500) 5%, transparent)}}.bg-red-500\/10{background-color:#fb2c361a}@supports (color:color-mix(in lab, red, red)){.bg-red-500\/10{background-color:color-mix(in oklab, var(--color-red-500) 10%, transparent)}}.bg-red-500\/15{background-color:#fb2c3626}@supports (color:color-mix(in lab, red, red)){.bg-red-500\/15{background-color:color-mix(in oklab, var(--color-red-500) 15%, transparent)}}.bg-secondary{background-color:var(--secondary)}.bg-sidebar{background-color:var(--sidebar)}.bg-sky-500{background-color:var(--color-sky-500)}.bg-slate-500{background-color:var(--color-slate-500)}.bg-transparent{background-color:#0000}.bg-violet-500\/15{background-color:#8d54ff26}@supports (color:color-mix(in lab, red, red)){.bg-violet-500\/15{background-color:color-mix(in oklab, var(--color-violet-500) 15%, transparent)}}.fill-foreground{fill:var(--foreground)}.p-0{padding:0}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:var(--spacing)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-2\.5{padding:calc(var(--spacing) * 2.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.p-8{padding:calc(var(--spacing) * 8)}.p-\[3px\]{padding:3px}.p-px{padding:1px}.px-1{padding-inline:var(--spacing)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-0{padding-block:0}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.pt-0\.5{padding-top:calc(var(--spacing) * .5)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pr-0\.5{padding-right:calc(var(--spacing) * .5)}.pr-1{padding-right:var(--spacing)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-7{padding-right:calc(var(--spacing) * 7)}.pr-8{padding-right:calc(var(--spacing) * 8)}.pb-1{padding-bottom:var(--spacing)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pl-0\.5{padding-left:calc(var(--spacing) * .5)}.pl-2{padding-left:calc(var(--spacing) * 2)}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-8{padding-left:calc(var(--spacing) * 8)}.pl-9{padding-left:calc(var(--spacing) * 9)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.align-middle{vertical-align:middle}.font-mono{font-family:var(--font-mono)}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[0\.85em\]{font-size:.85em}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.text-balance{text-wrap:balance}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-300{color:var(--color-amber-300)}.text-amber-400{color:var(--color-amber-400)}.text-background{color:var(--background)}.text-blue-300{color:var(--color-blue-300)}.text-card-foreground{color:var(--card-foreground)}.text-current{color:currentColor}.text-cyan-400{color:var(--color-cyan-400)}.text-destructive{color:var(--destructive)}.text-emerald-300{color:var(--color-emerald-300)}.text-emerald-400{color:var(--color-emerald-400)}.text-foreground,.text-foreground\/60{color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){.text-foreground\/60{color:color-mix(in oklab, var(--foreground) 60%, transparent)}}.text-muted-foreground{color:var(--muted-foreground)}.text-pink-400{color:var(--color-pink-400)}.text-popover-foreground{color:var(--popover-foreground)}.text-primary{color:var(--primary)}.text-primary-foreground{color:var(--primary-foreground)}.text-red-300{color:var(--color-red-300)}.text-red-400{color:var(--color-red-400)}.text-secondary-foreground{color:var(--secondary-foreground)}.text-sidebar-foreground{color:var(--sidebar-foreground)}.text-sky-400{color:var(--color-sky-400)}.text-violet-300{color:var(--color-violet-300)}.text-violet-400{color:var(--color-violet-400)}.text-white{color:var(--color-white)}.uppercase{text-transform:uppercase}.underline{text-decoration-line:underline}.underline-offset-2{text-underline-offset:2px}.underline-offset-4{text-underline-offset:4px}.opacity-50{opacity:.5}.opacity-70{opacity:.7}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-0{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-primary\/50{--tw-ring-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.ring-primary\/50{--tw-ring-color:color-mix(in oklab, var(--primary) 50%, transparent)}}.ring-offset-background{--tw-ring-offset-color:var(--background)}.outline-hidden{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.outline-hidden{outline-offset:2px;outline:2px solid #0000}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition-\[color\,box-shadow\]{transition-property:color,box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-shadow{transition-property:box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-none{transition-property:none}.duration-200{--tw-duration:.2s;transition-duration:.2s}.fade-in-0{--tw-enter-opacity:0}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.zoom-in-95{--tw-enter-scale:.95}.running{animation-play-state:running}@media (hover:hover){.group-hover\:text-foreground:is(:where(.group):hover *){color:var(--foreground)}}.group-data-\[disabled\=true\]\:pointer-events-none:is(:where(.group)[data-disabled=true] *){pointer-events:none}.group-data-\[disabled\=true\]\:opacity-50:is(:where(.group)[data-disabled=true] *){opacity:.5}.group-data-\[orientation\=horizontal\]\/tabs\:h-9:is(:where(.group\/tabs)[data-orientation=horizontal] *){height:calc(var(--spacing) * 9)}.group-data-\[orientation\=vertical\]\/tabs\:h-fit:is(:where(.group\/tabs)[data-orientation=vertical] *){height:fit-content}.group-data-\[orientation\=vertical\]\/tabs\:w-full:is(:where(.group\/tabs)[data-orientation=vertical] *){width:100%}.group-data-\[orientation\=vertical\]\/tabs\:flex-col:is(:where(.group\/tabs)[data-orientation=vertical] *){flex-direction:column}.group-data-\[orientation\=vertical\]\/tabs\:justify-start:is(:where(.group\/tabs)[data-orientation=vertical] *){justify-content:flex-start}.group-data-\[size\=default\]\/switch\:size-4:is(:where(.group\/switch)[data-size=default] *){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.group-data-\[size\=sm\]\/switch\:size-3:is(:where(.group\/switch)[data-size=sm] *){width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.group-data-\[variant\=line\]\/tabs-list\:bg-transparent:is(:where(.group\/tabs-list)[data-variant=line] *){background-color:#0000}.peer-disabled\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed}.peer-disabled\:opacity-50:is(:where(.peer):disabled~*){opacity:.5}.selection\:bg-primary ::selection{background-color:var(--primary)}.selection\:bg-primary::selection{background-color:var(--primary)}.selection\:text-primary-foreground ::selection{color:var(--primary-foreground)}.selection\:text-primary-foreground::selection{color:var(--primary-foreground)}.file\:inline-flex::file-selector-button{display:inline-flex}.file\:h-7::file-selector-button{height:calc(var(--spacing) * 7)}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\:bg-transparent::file-selector-button{background-color:#0000}.file\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.file\:text-foreground::file-selector-button{color:var(--foreground)}.placeholder\:text-muted-foreground::placeholder{color:var(--muted-foreground)}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:bg-foreground:after{content:var(--tw-content);background-color:var(--foreground)}.after\:opacity-0:after{content:var(--tw-content);opacity:0}.after\:transition-opacity:after{content:var(--tw-content);transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.group-data-\[orientation\=horizontal\]\/tabs\:after\:inset-x-0:is(:where(.group\/tabs)[data-orientation=horizontal] *):after{content:var(--tw-content);inset-inline:0}.group-data-\[orientation\=horizontal\]\/tabs\:after\:bottom-\[-5px\]:is(:where(.group\/tabs)[data-orientation=horizontal] *):after{content:var(--tw-content);bottom:-5px}.group-data-\[orientation\=horizontal\]\/tabs\:after\:h-0\.5:is(:where(.group\/tabs)[data-orientation=horizontal] *):after{content:var(--tw-content);height:calc(var(--spacing) * .5)}.group-data-\[orientation\=vertical\]\/tabs\:after\:inset-y-0:is(:where(.group\/tabs)[data-orientation=vertical] *):after{content:var(--tw-content);inset-block:0}.group-data-\[orientation\=vertical\]\/tabs\:after\:-right-1:is(:where(.group\/tabs)[data-orientation=vertical] *):after{content:var(--tw-content);right:calc(var(--spacing) * -1)}.group-data-\[orientation\=vertical\]\/tabs\:after\:w-0\.5:is(:where(.group\/tabs)[data-orientation=vertical] *):after{content:var(--tw-content);width:calc(var(--spacing) * .5)}@media (hover:hover){.hover\:border-primary\/50:hover{border-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.hover\:border-primary\/50:hover{border-color:color-mix(in oklab, var(--primary) 50%, transparent)}}.hover\:border-primary\/60:hover{border-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.hover\:border-primary\/60:hover{border-color:color-mix(in oklab, var(--primary) 60%, transparent)}}.hover\:bg-accent:hover{background-color:var(--accent)}.hover\:bg-amber-500\/25:hover{background-color:#f99c0040}@supports (color:color-mix(in lab, red, red)){.hover\:bg-amber-500\/25:hover{background-color:color-mix(in oklab, var(--color-amber-500) 25%, transparent)}}.hover\:bg-destructive\/90:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab, var(--destructive) 90%, transparent)}}.hover\:bg-emerald-500\/25:hover{background-color:#00bb7f40}@supports (color:color-mix(in lab, red, red)){.hover\:bg-emerald-500\/25:hover{background-color:color-mix(in oklab, var(--color-emerald-500) 25%, transparent)}}.hover\:bg-muted\/50:hover{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-muted\/50:hover{background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.hover\:bg-primary\/10:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-primary\/10:hover{background-color:color-mix(in oklab, var(--primary) 10%, transparent)}}.hover\:bg-primary\/50:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-primary\/50:hover{background-color:color-mix(in oklab, var(--primary) 50%, transparent)}}.hover\:bg-primary\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab, var(--primary) 90%, transparent)}}.hover\:bg-red-500\/25:hover{background-color:#fb2c3640}@supports (color:color-mix(in lab, red, red)){.hover\:bg-red-500\/25:hover{background-color:color-mix(in oklab, var(--color-red-500) 25%, transparent)}}.hover\:bg-secondary\/80:hover{background-color:var(--secondary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-secondary\/80:hover{background-color:color-mix(in oklab, var(--secondary) 80%, transparent)}}.hover\:text-accent-foreground:hover{color:var(--accent-foreground)}.hover\:text-amber-200:hover{color:var(--color-amber-200)}.hover\:text-foreground:hover{color:var(--foreground)}.hover\:text-primary:hover{color:var(--primary)}.hover\:text-red-300:hover{color:var(--color-red-300)}.hover\:text-red-400:hover{color:var(--color-red-400)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}}.focus\:bg-accent:focus{background-color:var(--accent)}.focus\:text-accent-foreground:focus{color:var(--accent-foreground)}.focus\:text-amber-300:focus{color:var(--color-amber-300)}.focus\:text-red-300:focus{color:var(--color-red-300)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\:ring-ring:focus{--tw-ring-color:var(--ring)}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus\:outline-hidden:focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.focus\:outline-hidden:focus{outline-offset:2px;outline:2px solid #0000}}.focus-visible\:border-ring:focus-visible{border-color:var(--ring)}.focus-visible\:ring-\[3px\]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:color-mix(in oklab, var(--ring) 50%, transparent)}}.focus-visible\:outline-1:focus-visible{outline-style:var(--tw-outline-style);outline-width:1px}.focus-visible\:outline-ring:focus-visible{outline-color:var(--ring)}.active\:cursor-grabbing:active{cursor:grabbing}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.has-aria-expanded\:bg-muted\/50:has([aria-expanded=true]){background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.has-aria-expanded\:bg-muted\/50:has([aria-expanded=true]){background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.has-data-\[slot\=card-action\]\:grid-cols-\[1fr_auto\]:has([data-slot=card-action]){grid-template-columns:1fr auto}.has-\[\>svg\]\:grid-cols-\[calc\(var\(--spacing\)\*4\)_1fr\]:has(>svg){grid-template-columns:calc(var(--spacing) * 4) 1fr}.has-\[\>svg\]\:gap-x-3:has(>svg){column-gap:calc(var(--spacing) * 3)}.has-\[\>svg\]\:px-1\.5:has(>svg){padding-inline:calc(var(--spacing) * 1.5)}.has-\[\>svg\]\:px-2\.5:has(>svg){padding-inline:calc(var(--spacing) * 2.5)}.has-\[\>svg\]\:px-3:has(>svg){padding-inline:calc(var(--spacing) * 3)}.has-\[\>svg\]\:px-4:has(>svg){padding-inline:calc(var(--spacing) * 4)}.aria-invalid\:border-destructive[aria-invalid=true]{border-color:var(--destructive)}.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[orientation\=horizontal\]\:h-px[data-orientation=horizontal]{height:1px}.data-\[orientation\=horizontal\]\:w-full[data-orientation=horizontal]{width:100%}.data-\[orientation\=horizontal\]\:flex-col[data-orientation=horizontal]{flex-direction:column}.data-\[orientation\=vertical\]\:h-full[data-orientation=vertical]{height:100%}.data-\[orientation\=vertical\]\:w-px[data-orientation=vertical]{width:1px}.data-\[placeholder\]\:text-muted-foreground[data-placeholder]{color:var(--muted-foreground)}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y:var(--spacing);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=bottom\]\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y:calc(2*var(--spacing)*-1)}.data-\[side\=left\]\:-translate-x-1[data-side=left]{--tw-translate-x:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=left\]\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x:calc(2*var(--spacing))}.data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x:var(--spacing);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=right\]\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x:calc(2*var(--spacing)*-1)}.data-\[side\=top\]\:-translate-y-1[data-side=top]{--tw-translate-y:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=top\]\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y:calc(2*var(--spacing))}.data-\[size\=default\]\:h-9[data-size=default]{height:calc(var(--spacing) * 9)}.data-\[size\=default\]\:h-\[1\.15rem\][data-size=default]{height:1.15rem}.data-\[size\=default\]\:w-8[data-size=default]{width:calc(var(--spacing) * 8)}.data-\[size\=sm\]\:h-3\.5[data-size=sm]{height:calc(var(--spacing) * 3.5)}.data-\[size\=sm\]\:h-8[data-size=sm]{height:calc(var(--spacing) * 8)}.data-\[size\=sm\]\:w-6[data-size=sm]{width:calc(var(--spacing) * 6)}:is(.\*\:data-\[slot\=alert-description\]\:text-destructive\/90>*)[data-slot=alert-description]{color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){:is(.\*\:data-\[slot\=alert-description\]\:text-destructive\/90>*)[data-slot=alert-description]{color:color-mix(in oklab, var(--destructive) 90%, transparent)}}:is(.\*\:data-\[slot\=select-value\]\:line-clamp-1>*)[data-slot=select-value]{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}:is(.\*\:data-\[slot\=select-value\]\:flex>*)[data-slot=select-value]{display:flex}:is(.\*\:data-\[slot\=select-value\]\:items-center>*)[data-slot=select-value]{align-items:center}:is(.\*\:data-\[slot\=select-value\]\:gap-2>*)[data-slot=select-value]{gap:calc(var(--spacing) * 2)}.data-\[state\=active\]\:bg-background[data-state=active]{background-color:var(--background)}.data-\[state\=active\]\:text-foreground[data-state=active]{color:var(--foreground)}.group-data-\[variant\=default\]\/tabs-list\:data-\[state\=active\]\:shadow-sm:is(:where(.group\/tabs-list)[data-variant=default] *)[data-state=active]{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.group-data-\[variant\=line\]\/tabs-list\:data-\[state\=active\]\:bg-transparent:is(:where(.group\/tabs-list)[data-variant=line] *)[data-state=active]{background-color:#0000}.group-data-\[variant\=line\]\/tabs-list\:data-\[state\=active\]\:shadow-none:is(:where(.group\/tabs-list)[data-variant=line] *)[data-state=active]{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.group-data-\[variant\=line\]\/tabs-list\:data-\[state\=active\]\:after\:opacity-100:is(:where(.group\/tabs-list)[data-variant=line] *)[data-state=active]:after{content:var(--tw-content);opacity:1}.data-\[state\=checked\]\:translate-x-\[calc\(100\%-2px\)\][data-state=checked]{--tw-translate-x:calc(100% - 2px);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=checked\]\:border-primary[data-state=checked]{border-color:var(--primary)}.data-\[state\=checked\]\:bg-primary[data-state=checked]{background-color:var(--primary)}.data-\[state\=checked\]\:text-primary-foreground[data-state=checked]{color:var(--primary-foreground)}.data-\[state\=closed\]\:animate-out[data-state=closed]{animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-\[state\=closed\]\:fade-out-0[data-state=closed]{--tw-exit-opacity:0}.data-\[state\=closed\]\:zoom-out-95[data-state=closed]{--tw-exit-scale:.95}.data-\[state\=open\]\:animate-in[data-state=open]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:var(--accent)}.data-\[state\=open\]\:text-muted-foreground[data-state=open]{color:var(--muted-foreground)}.data-\[state\=open\]\:fade-in-0[data-state=open]{--tw-enter-opacity:0}.data-\[state\=open\]\:zoom-in-95[data-state=open]{--tw-enter-scale:.95}.data-\[state\=selected\]\:bg-muted[data-state=selected]{background-color:var(--muted)}.data-\[state\=unchecked\]\:translate-x-0[data-state=unchecked]{--tw-translate-x:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=unchecked\]\:bg-input[data-state=unchecked]{background-color:var(--input)}.data-\[variant\=line\]\:rounded-none[data-variant=line]{border-radius:0}@media (width>=40rem){.sm\:max-w-2xl{max-width:var(--container-2xl)}.sm\:max-w-lg{max-width:var(--container-lg)}.sm\:flex-row{flex-direction:row}.sm\:justify-between{justify-content:space-between}.sm\:justify-end{justify-content:flex-end}.sm\:text-left{text-align:left}}@media (width>=48rem){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}@media (width>=80rem){.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.xl\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}}.dark\:border-input:is(.dark *){border-color:var(--input)}.dark\:bg-destructive\/60:is(.dark *){background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-destructive\/60:is(.dark *){background-color:color-mix(in oklab, var(--destructive) 60%, transparent)}}.dark\:bg-input\/30:is(.dark *){background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-input\/30:is(.dark *){background-color:color-mix(in oklab, var(--input) 30%, transparent)}}.dark\:text-muted-foreground:is(.dark *){color:var(--muted-foreground)}@media (hover:hover){.dark\:hover\:bg-accent\/50:is(.dark *):hover{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-accent\/50:is(.dark *):hover{background-color:color-mix(in oklab, var(--accent) 50%, transparent)}}.dark\:hover\:bg-input\/50:is(.dark *):hover{background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-input\/50:is(.dark *):hover{background-color:color-mix(in oklab, var(--input) 50%, transparent)}}.dark\:hover\:text-foreground:is(.dark *):hover{color:var(--foreground)}}.dark\:focus-visible\:ring-destructive\/40:is(.dark *):focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:focus-visible\:ring-destructive\/40:is(.dark *):focus-visible{--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.dark\:aria-invalid\:ring-destructive\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:aria-invalid\:ring-destructive\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.dark\:data-\[state\=active\]\:border-input:is(.dark *)[data-state=active]{border-color:var(--input)}.dark\:data-\[state\=active\]\:bg-input\/30:is(.dark *)[data-state=active]{background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.dark\:data-\[state\=active\]\:bg-input\/30:is(.dark *)[data-state=active]{background-color:color-mix(in oklab, var(--input) 30%, transparent)}}.dark\:data-\[state\=active\]\:text-foreground:is(.dark *)[data-state=active]{color:var(--foreground)}.dark\:group-data-\[variant\=line\]\/tabs-list\:data-\[state\=active\]\:border-transparent:is(.dark *):is(:where(.group\/tabs-list)[data-variant=line] *)[data-state=active]{border-color:#0000}.dark\:group-data-\[variant\=line\]\/tabs-list\:data-\[state\=active\]\:bg-transparent:is(.dark *):is(:where(.group\/tabs-list)[data-variant=line] *)[data-state=active]{background-color:#0000}.dark\:data-\[state\=checked\]\:bg-primary:is(.dark *)[data-state=checked]{background-color:var(--primary)}.dark\:data-\[state\=checked\]\:bg-primary-foreground:is(.dark *)[data-state=checked]{background-color:var(--primary-foreground)}.dark\:data-\[state\=unchecked\]\:bg-foreground:is(.dark *)[data-state=unchecked]{background-color:var(--foreground)}.dark\:data-\[state\=unchecked\]\:bg-input\/80:is(.dark *)[data-state=unchecked]{background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.dark\:data-\[state\=unchecked\]\:bg-input\/80:is(.dark *)[data-state=unchecked]{background-color:color-mix(in oklab, var(--input) 80%, transparent)}}.\[\&_a\]\:text-primary a{color:var(--primary)}.\[\&_a\]\:underline a{text-decoration-line:underline}.\[\&_a\]\:underline-offset-2 a{text-underline-offset:2px}.\[\&_blockquote\]\:my-1 blockquote{margin-block:var(--spacing)}.\[\&_blockquote\]\:border-l-2 blockquote{border-left-style:var(--tw-border-style);border-left-width:2px}.\[\&_blockquote\]\:border-border blockquote{border-color:var(--border)}.\[\&_blockquote\]\:pl-2 blockquote{padding-left:calc(var(--spacing) * 2)}.\[\&_blockquote\]\:text-muted-foreground blockquote{color:var(--muted-foreground)}.\[\&_code\]\:rounded code{border-radius:.25rem}.\[\&_code\]\:bg-muted code{background-color:var(--muted)}.\[\&_code\]\:px-1 code{padding-inline:var(--spacing)}.\[\&_code\]\:py-0\.5 code{padding-block:calc(var(--spacing) * .5)}.\[\&_code\]\:font-mono code{font-family:var(--font-mono)}.\[\&_code\]\:text-\[0\.85em\] code{font-size:.85em}.\[\&_code\]\:break-all code{word-break:break-all}.\[\&_h1\]\:mt-2 h1{margin-top:calc(var(--spacing) * 2)}.\[\&_h1\]\:mb-1 h1{margin-bottom:var(--spacing)}.\[\&_h1\]\:text-sm h1{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.\[\&_h1\]\:font-bold h1{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.\[\&_h2\]\:mt-2 h2{margin-top:calc(var(--spacing) * 2)}.\[\&_h2\]\:mb-1 h2{margin-bottom:var(--spacing)}.\[\&_h2\]\:text-xs h2{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.\[\&_h2\]\:font-bold h2{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.\[\&_h3\]\:mt-1\.5 h3{margin-top:calc(var(--spacing) * 1.5)}.\[\&_h3\]\:mb-0\.5 h3{margin-bottom:calc(var(--spacing) * .5)}.\[\&_h3\]\:font-semibold h3{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.\[\&_hr\]\:my-2 hr{margin-block:calc(var(--spacing) * 2)}.\[\&_hr\]\:border-border hr{border-color:var(--border)}.\[\&_li\]\:my-0\.5 li{margin-block:calc(var(--spacing) * .5)}.\[\&_ol\]\:my-1 ol{margin-block:var(--spacing)}.\[\&_ol\]\:list-decimal ol{list-style-type:decimal}.\[\&_ol\]\:pl-4 ol{padding-left:calc(var(--spacing) * 4)}.\[\&_p\]\:leading-relaxed p{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.\[\&_pre\]\:my-1 pre{margin-block:var(--spacing)}.\[\&_pre\]\:max-w-full pre{max-width:100%}.\[\&_pre\]\:overflow-x-auto pre{overflow-x:auto}.\[\&_pre\]\:rounded pre{border-radius:.25rem}.\[\&_pre\]\:bg-muted pre{background-color:var(--muted)}.\[\&_pre\]\:p-2 pre{padding:calc(var(--spacing) * 2)}.\[\&_pre\]\:text-\[10px\] pre{font-size:10px}.\[\&_pre_code\]\:bg-transparent pre code{background-color:#0000}.\[\&_pre_code\]\:p-0 pre code{padding:0}.\[\&_pre_code\]\:break-normal pre code{overflow-wrap:normal;word-break:normal}.\[\&_strong\]\:font-semibold strong{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:h-3\.5 svg{height:calc(var(--spacing) * 3.5)}.\[\&_svg\]\:w-3\.5 svg{width:calc(var(--spacing) * 3.5)}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-3 svg:not([class*=size-]){width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4 svg:not([class*=size-]){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&_svg\:not\(\[class\*\=\'text-\'\]\)\]\:text-muted-foreground svg:not([class*=text-]){color:var(--muted-foreground)}.\[\&_table\]\:my-1\.5 table{margin-block:calc(var(--spacing) * 1.5)}.\[\&_table\]\:block table{display:block}.\[\&_table\]\:w-full table{width:100%}.\[\&_table\]\:max-w-full table{max-width:100%}.\[\&_table\]\:border-collapse table{border-collapse:collapse}.\[\&_table\]\:overflow-x-auto table{overflow-x:auto}.\[\&_table\]\:text-\[11px\] table{font-size:11px}.\[\&_td\]\:border td{border-style:var(--tw-border-style);border-width:1px}.\[\&_td\]\:border-border td{border-color:var(--border)}.\[\&_td\]\:px-2 td{padding-inline:calc(var(--spacing) * 2)}.\[\&_td\]\:py-1 td{padding-block:var(--spacing)}.\[\&_td\]\:break-words td{overflow-wrap:break-word}.\[\&_th\]\:border th{border-style:var(--tw-border-style);border-width:1px}.\[\&_th\]\:border-border th{border-color:var(--border)}.\[\&_th\]\:bg-muted\/50 th{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.\[\&_th\]\:bg-muted\/50 th{background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.\[\&_th\]\:px-2 th{padding-inline:calc(var(--spacing) * 2)}.\[\&_th\]\:py-1 th{padding-block:var(--spacing)}.\[\&_th\]\:text-left th{text-align:left}.\[\&_th\]\:font-semibold th{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.\[\&_tr\]\:border-b tr{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.\[\&_tr\:last-child\]\:border-0 tr:last-child{border-style:var(--tw-border-style);border-width:0}.\[\&_ul\]\:my-1 ul{margin-block:var(--spacing)}.\[\&_ul\]\:list-disc ul{list-style-type:disc}.\[\&_ul\]\:pl-4 ul{padding-left:calc(var(--spacing) * 4)}.\[\&\:has\(\[role\=checkbox\]\)\]\:pr-0:has([role=checkbox]){padding-right:0}.\[\.border-b\]\:pb-6.border-b{padding-bottom:calc(var(--spacing) * 6)}.\[\.border-t\]\:pt-6.border-t{padding-top:calc(var(--spacing) * 6)}:is(.\*\:\[span\]\:last\:flex>*):is(span):last-child{display:flex}:is(.\*\:\[span\]\:last\:items-center>*):is(span):last-child{align-items:center}:is(.\*\:\[span\]\:last\:gap-2>*):is(span):last-child{gap:calc(var(--spacing) * 2)}.\[\&\>\[role\=checkbox\]\]\:translate-y-\[2px\]>[role=checkbox]{--tw-translate-y:2px;translate:var(--tw-translate-x) var(--tw-translate-y)}.\[\&\>div\>div\]\:block\!>div>div{display:block!important}.\[\&\>svg\]\:pointer-events-none>svg{pointer-events:none}.\[\&\>svg\]\:size-3>svg{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.\[\&\>svg\]\:size-4>svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&\>svg\]\:translate-y-0\.5>svg{--tw-translate-y:calc(var(--spacing) * .5);translate:var(--tw-translate-x) var(--tw-translate-y)}.\[\&\>svg\]\:text-current>svg{color:currentColor}.\[\&\>tr\]\:last\:border-b-0>tr:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}@media (hover:hover){a.\[a\&\]\:hover\:bg-accent:hover{background-color:var(--accent)}a.\[a\&\]\:hover\:bg-destructive\/90:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){a.\[a\&\]\:hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab, var(--destructive) 90%, transparent)}}a.\[a\&\]\:hover\:bg-primary\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){a.\[a\&\]\:hover\:bg-primary\/90:hover{background-color:color-mix(in oklab, var(--primary) 90%, transparent)}}a.\[a\&\]\:hover\:bg-secondary\/90:hover{background-color:var(--secondary)}@supports (color:color-mix(in lab, red, red)){a.\[a\&\]\:hover\:bg-secondary\/90:hover{background-color:color-mix(in oklab, var(--secondary) 90%, transparent)}}a.\[a\&\]\:hover\:text-accent-foreground:hover{color:var(--accent-foreground)}a.\[a\&\]\:hover\:underline:hover{text-decoration-line:underline}}}@property --tw-animation-delay{syntax:"*";inherits:false;initial-value:0s}@property --tw-animation-direction{syntax:"*";inherits:false;initial-value:normal}@property --tw-animation-duration{syntax:"*";inherits:false}@property --tw-animation-fill-mode{syntax:"*";inherits:false;initial-value:none}@property --tw-animation-iteration-count{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-translate-y{syntax:"*";inherits:false;initial-value:0}:root{--background:oklch(14.5% 0 0);--foreground:oklch(98.5% 0 0);--card:oklch(18.5% .012 260);--card-foreground:oklch(98.5% 0 0);--popover:oklch(18.5% .012 260);--popover-foreground:oklch(98.5% 0 0);--primary:oklch(68% .16 250);--primary-foreground:oklch(14.5% 0 0);--secondary:oklch(26% .014 260);--secondary-foreground:oklch(98.5% 0 0);--muted:oklch(24% .012 260);--muted-foreground:oklch(70% .015 260);--accent:oklch(28% .02 250);--accent-foreground:oklch(98.5% 0 0);--destructive:oklch(62% .21 22);--destructive-foreground:oklch(98.5% 0 0);--border:oklch(30% .012 260);--input:oklch(30% .012 260);--ring:oklch(68% .16 250);--chart-1:oklch(65% .2 150);--chart-2:oklch(70% .15 250);--sidebar:oklch(16% .012 260);--sidebar-foreground:oklch(98.5% 0 0);--sidebar-border:oklch(30% .012 260)}.dark{--background:oklch(14.5% 0 0);--foreground:oklch(98.5% 0 0);--card:oklch(18.5% .012 260);--card-foreground:oklch(98.5% 0 0);--popover:oklch(18.5% .012 260);--popover-foreground:oklch(98.5% 0 0);--primary:oklch(68% .16 250);--primary-foreground:oklch(14.5% 0 0);--secondary:oklch(26% .014 260);--secondary-foreground:oklch(98.5% 0 0);--muted:oklch(24% .012 260);--muted-foreground:oklch(70% .015 260);--accent:oklch(28% .02 250);--accent-foreground:oklch(98.5% 0 0);--destructive:oklch(62% .21 22);--destructive-foreground:oklch(98.5% 0 0);--border:oklch(30% .012 260);--input:oklch(30% .012 260);--ring:oklch(68% .16 250)}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0)scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1))rotate(var(--tw-enter-rotate,0));filter:blur(var(--tw-enter-blur,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0)scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1))rotate(var(--tw-exit-rotate,0));filter:blur(var(--tw-exit-blur,0))}}
|
|
2
|
+
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-content:"";--tw-animation-delay:0s;--tw-animation-direction:normal;--tw-animation-duration:initial;--tw-animation-fill-mode:none;--tw-animation-iteration-count:1;--tw-enter-blur:0;--tw-enter-opacity:1;--tw-enter-rotate:0;--tw-enter-scale:1;--tw-enter-translate-x:0;--tw-enter-translate-y:0;--tw-exit-blur:0;--tw-exit-opacity:1;--tw-exit-rotate:0;--tw-exit-scale:1;--tw-exit-translate-x:0;--tw-exit-translate-y:0}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-300:oklch(80.8% .114 19.571);--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-amber-200:oklch(92.4% .12 95.746);--color-amber-300:oklch(87.9% .169 91.605);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-emerald-300:oklch(84.5% .143 164.978);--color-emerald-400:oklch(76.5% .177 163.223);--color-emerald-500:oklch(69.6% .17 162.48);--color-cyan-400:oklch(78.9% .154 211.53);--color-sky-400:oklch(74.6% .16 232.661);--color-sky-500:oklch(68.5% .169 237.323);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-500:oklch(62.3% .214 259.815);--color-violet-300:oklch(81.1% .111 293.571);--color-violet-400:oklch(70.2% .183 293.541);--color-violet-500:oklch(60.6% .25 292.717);--color-pink-400:oklch(71.8% .202 349.761);--color-slate-500:oklch(55.4% .046 257.417);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-2xl:42rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wide:.025em;--leading-tight:1.25;--leading-snug:1.375;--leading-relaxed:1.625;--radius-xs:.125rem;--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--blur-sm:8px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*{border-color:var(--border);outline-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){*{outline-color:color-mix(in oklab, var(--ring) 50%, transparent)}}body{background-color:var(--background);color:var(--foreground)}}@layer components;@layer utilities{.\@container\/card-header{container:card-header/inline-size}.pointer-events-none{pointer-events:none}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{inset:0}.inset-x-0{inset-inline:0}.-top-0,.top-0{top:0}.top-1\/2{top:50%}.top-2\.5{top:calc(var(--spacing) * 2.5)}.top-4{top:calc(var(--spacing) * 4)}.top-\[50\%\]{top:50%}.right-0{right:0}.right-2{right:calc(var(--spacing) * 2)}.right-4{right:calc(var(--spacing) * 4)}.bottom-0{bottom:0}.left-2\.5{left:calc(var(--spacing) * 2.5)}.left-3{left:calc(var(--spacing) * 3)}.left-\[50\%\]{left:50%}.z-10{z-index:10}.z-50{z-index:50}.col-start-2{grid-column-start:2}.row-span-2{grid-row:span 2/span 2}.row-start-1{grid-row-start:1}.-mx-1{margin-inline:calc(var(--spacing) * -1)}.mx-1{margin-inline:var(--spacing)}.my-1{margin-block:var(--spacing)}.my-4{margin-block:calc(var(--spacing) * 4)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-10{margin-top:calc(var(--spacing) * 10)}.mt-auto{margin-top:auto}.mr-0\.5{margin-right:calc(var(--spacing) * .5)}.mr-1{margin-right:var(--spacing)}.mr-1\.5{margin-right:calc(var(--spacing) * 1.5)}.mb-0\.5{margin-bottom:calc(var(--spacing) * .5)}.mb-1{margin-bottom:var(--spacing)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.ml-0\.5{margin-left:calc(var(--spacing) * .5)}.ml-1{margin-left:var(--spacing)}.ml-1\.5{margin-left:calc(var(--spacing) * 1.5)}.ml-6{margin-left:calc(var(--spacing) * 6)}.ml-auto{margin-left:auto}.line-clamp-1{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.flex{display:flex}.grid{display:grid}.inline{display:inline}.inline-flex{display:inline-flex}.table{display:table}.table-caption{display:table-caption}.table-cell{display:table-cell}.table-row{display:table-row}.field-sizing-content{field-sizing:content}.size-2\.5{width:calc(var(--spacing) * 2.5);height:calc(var(--spacing) * 2.5)}.size-3\.5{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-9{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}.size-10{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.size-full{width:100%;height:100%}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-3{height:calc(var(--spacing) * 3)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-12{height:calc(var(--spacing) * 12)}.h-20{height:calc(var(--spacing) * 20)}.h-40{height:calc(var(--spacing) * 40)}.h-44{height:calc(var(--spacing) * 44)}.h-52{height:calc(var(--spacing) * 52)}.h-64{height:calc(var(--spacing) * 64)}.h-\[calc\(100\%-1px\)\]{height:calc(100% - 1px)}.h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-\(--radix-select-content-available-height\){max-height:var(--radix-select-content-available-height)}.max-h-32{max-height:calc(var(--spacing) * 32)}.max-h-36{max-height:calc(var(--spacing) * 36)}.max-h-40{max-height:calc(var(--spacing) * 40)}.max-h-72{max-height:calc(var(--spacing) * 72)}.max-h-80{max-height:calc(var(--spacing) * 80)}.max-h-96{max-height:calc(var(--spacing) * 96)}.max-h-\[88vh\]{max-height:88vh}.min-h-0{min-height:0}.min-h-4{min-height:calc(var(--spacing) * 4)}.min-h-16{min-height:calc(var(--spacing) * 16)}.min-h-\[38px\]{min-height:38px}.min-h-\[56px\]{min-height:56px}.min-h-\[260px\]{min-height:260px}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-3{width:calc(var(--spacing) * 3)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-6{width:calc(var(--spacing) * 6)}.w-7{width:calc(var(--spacing) * 7)}.w-8{width:calc(var(--spacing) * 8)}.w-9{width:calc(var(--spacing) * 9)}.w-36{width:calc(var(--spacing) * 36)}.w-40{width:calc(var(--spacing) * 40)}.w-52{width:calc(var(--spacing) * 52)}.w-64{width:calc(var(--spacing) * 64)}.w-\[118px\]{width:118px}.w-fit{width:fit-content}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-28{max-width:calc(var(--spacing) * 28)}.max-w-56{max-width:calc(var(--spacing) * 56)}.max-w-64{max-width:calc(var(--spacing) * 64)}.max-w-\[85\%\]{max-width:85%}.max-w-\[90\%\]{max-width:90%}.max-w-\[92\%\]{max-width:92%}.max-w-\[calc\(100\%-2rem\)\]{max-width:calc(100% - 2rem)}.max-w-full{max-width:100%}.max-w-md{max-width:var(--container-md)}.max-w-xl{max-width:var(--container-xl)}.min-w-0{min-width:0}.min-w-36{min-width:calc(var(--spacing) * 36)}.min-w-\[8rem\]{min-width:8rem}.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.caption-bottom{caption-side:bottom}.origin-\(--radix-select-content-transform-origin\){transform-origin:var(--radix-select-content-transform-origin)}.origin-\(--radix-tooltip-content-transform-origin\){transform-origin:var(--radix-tooltip-content-transform-origin)}.translate-x-\[-50\%\]{--tw-translate-x:-50%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-\[3px\]{--tw-translate-x:3px;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-\[-50\%\]{--tw-translate-y:-50%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-\[3px\]{--tw-translate-y:3px;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-\[calc\(-50\%_-_2px\)\]{--tw-translate-y:calc(-50% - 2px);translate:var(--tw-translate-x) var(--tw-translate-y)}.rotate-45{rotate:45deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-in{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-grab{cursor:grab}.cursor-nwse-resize{cursor:nwse-resize}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.resize{resize:both}.resize-none{resize:none}.resize-y{resize:vertical}.scroll-my-1{scroll-margin-block:var(--spacing)}.list-disc{list-style-type:disc}.auto-rows-min{grid-auto-rows:min-content}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.grid-cols-\[0_1fr\]{grid-template-columns:0 1fr}.grid-cols-\[1fr_380px\]{grid-template-columns:1fr 380px}.grid-rows-\[auto_auto\]{grid-template-rows:auto auto}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-nowrap{flex-wrap:nowrap}.flex-wrap{flex-wrap:wrap}.place-content-center{place-content:center}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-items-start{justify-items:start}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-6{gap:calc(var(--spacing) * 6)}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}.gap-y-0\.5{row-gap:calc(var(--spacing) * .5)}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}.self-start{align-self:flex-start}.justify-self-end{justify-self:flex-end}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-\[2px\]{border-radius:2px}.rounded-\[4px\]{border-radius:4px}.rounded-\[inherit\]{border-radius:inherit}.rounded-full{border-radius:2147483647px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-sm{border-radius:.25rem}.rounded-xl{border-radius:.75rem}.rounded-xs{border-radius:var(--radius-xs)}.rounded-br-md{border-bottom-right-radius:.375rem}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-amber-500\/30{border-color:#f99c004d}@supports (color:color-mix(in lab, red, red)){.border-amber-500\/30{border-color:color-mix(in oklab, var(--color-amber-500) 30%, transparent)}}.border-amber-500\/40{border-color:#f99c0066}@supports (color:color-mix(in lab, red, red)){.border-amber-500\/40{border-color:color-mix(in oklab, var(--color-amber-500) 40%, transparent)}}.border-amber-500\/50{border-color:#f99c0080}@supports (color:color-mix(in lab, red, red)){.border-amber-500\/50{border-color:color-mix(in oklab, var(--color-amber-500) 50%, transparent)}}.border-blue-500\/30{border-color:#3080ff4d}@supports (color:color-mix(in lab, red, red)){.border-blue-500\/30{border-color:color-mix(in oklab, var(--color-blue-500) 30%, transparent)}}.border-border,.border-border\/60{border-color:var(--border)}@supports (color:color-mix(in lab, red, red)){.border-border\/60{border-color:color-mix(in oklab, var(--border) 60%, transparent)}}.border-emerald-500\/30{border-color:#00bb7f4d}@supports (color:color-mix(in lab, red, red)){.border-emerald-500\/30{border-color:color-mix(in oklab, var(--color-emerald-500) 30%, transparent)}}.border-emerald-500\/40{border-color:#00bb7f66}@supports (color:color-mix(in lab, red, red)){.border-emerald-500\/40{border-color:color-mix(in oklab, var(--color-emerald-500) 40%, transparent)}}.border-input{border-color:var(--input)}.border-primary,.border-primary\/30{border-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.border-primary\/30{border-color:color-mix(in oklab, var(--primary) 30%, transparent)}}.border-primary\/40{border-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.border-primary\/40{border-color:color-mix(in oklab, var(--primary) 40%, transparent)}}.border-primary\/60{border-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.border-primary\/60{border-color:color-mix(in oklab, var(--primary) 60%, transparent)}}.border-red-500\/30{border-color:#fb2c364d}@supports (color:color-mix(in lab, red, red)){.border-red-500\/30{border-color:color-mix(in oklab, var(--color-red-500) 30%, transparent)}}.border-red-500\/40{border-color:#fb2c3666}@supports (color:color-mix(in lab, red, red)){.border-red-500\/40{border-color:color-mix(in oklab, var(--color-red-500) 40%, transparent)}}.border-red-500\/50{border-color:#fb2c3680}@supports (color:color-mix(in lab, red, red)){.border-red-500\/50{border-color:color-mix(in oklab, var(--color-red-500) 50%, transparent)}}.border-red-500\/60{border-color:#fb2c3699}@supports (color:color-mix(in lab, red, red)){.border-red-500\/60{border-color:color-mix(in oklab, var(--color-red-500) 60%, transparent)}}.border-sidebar-border{border-color:var(--sidebar-border)}.border-transparent{border-color:#0000}.border-violet-500\/40{border-color:#8d54ff66}@supports (color:color-mix(in lab, red, red)){.border-violet-500\/40{border-color:color-mix(in oklab, var(--color-violet-500) 40%, transparent)}}.border-t-transparent{border-top-color:#0000}.border-l-transparent{border-left-color:#0000}.bg-accent{background-color:var(--accent)}.bg-amber-500{background-color:var(--color-amber-500)}.bg-amber-500\/5{background-color:#f99c000d}@supports (color:color-mix(in lab, red, red)){.bg-amber-500\/5{background-color:color-mix(in oklab, var(--color-amber-500) 5%, transparent)}}.bg-amber-500\/10{background-color:#f99c001a}@supports (color:color-mix(in lab, red, red)){.bg-amber-500\/10{background-color:color-mix(in oklab, var(--color-amber-500) 10%, transparent)}}.bg-amber-500\/15{background-color:#f99c0026}@supports (color:color-mix(in lab, red, red)){.bg-amber-500\/15{background-color:color-mix(in oklab, var(--color-amber-500) 15%, transparent)}}.bg-background,.bg-background\/85{background-color:var(--background)}@supports (color:color-mix(in lab, red, red)){.bg-background\/85{background-color:color-mix(in oklab, var(--background) 85%, transparent)}}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab, red, red)){.bg-black\/50{background-color:color-mix(in oklab, var(--color-black) 50%, transparent)}}.bg-blue-500\/5{background-color:#3080ff0d}@supports (color:color-mix(in lab, red, red)){.bg-blue-500\/5{background-color:color-mix(in oklab, var(--color-blue-500) 5%, transparent)}}.bg-border{background-color:var(--border)}.bg-card{background-color:var(--card)}.bg-destructive{background-color:var(--destructive)}.bg-emerald-500{background-color:var(--color-emerald-500)}.bg-emerald-500\/10{background-color:#00bb7f1a}@supports (color:color-mix(in lab, red, red)){.bg-emerald-500\/10{background-color:color-mix(in oklab, var(--color-emerald-500) 10%, transparent)}}.bg-emerald-500\/15{background-color:#00bb7f26}@supports (color:color-mix(in lab, red, red)){.bg-emerald-500\/15{background-color:color-mix(in oklab, var(--color-emerald-500) 15%, transparent)}}.bg-foreground{background-color:var(--foreground)}.bg-muted,.bg-muted\/20{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/20{background-color:color-mix(in oklab, var(--muted) 20%, transparent)}}.bg-muted\/30{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/30{background-color:color-mix(in oklab, var(--muted) 30%, transparent)}}.bg-muted\/40{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/40{background-color:color-mix(in oklab, var(--muted) 40%, transparent)}}.bg-muted\/50{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/50{background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.bg-popover{background-color:var(--popover)}.bg-primary,.bg-primary\/5{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.bg-primary\/5{background-color:color-mix(in oklab, var(--primary) 5%, transparent)}}.bg-primary\/10{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.bg-primary\/10{background-color:color-mix(in oklab, var(--primary) 10%, transparent)}}.bg-primary\/15{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.bg-primary\/15{background-color:color-mix(in oklab, var(--primary) 15%, transparent)}}.bg-primary\/20{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.bg-primary\/20{background-color:color-mix(in oklab, var(--primary) 20%, transparent)}}.bg-primary\/25{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.bg-primary\/25{background-color:color-mix(in oklab, var(--primary) 25%, transparent)}}.bg-red-500{background-color:var(--color-red-500)}.bg-red-500\/5{background-color:#fb2c360d}@supports (color:color-mix(in lab, red, red)){.bg-red-500\/5{background-color:color-mix(in oklab, var(--color-red-500) 5%, transparent)}}.bg-red-500\/10{background-color:#fb2c361a}@supports (color:color-mix(in lab, red, red)){.bg-red-500\/10{background-color:color-mix(in oklab, var(--color-red-500) 10%, transparent)}}.bg-red-500\/15{background-color:#fb2c3626}@supports (color:color-mix(in lab, red, red)){.bg-red-500\/15{background-color:color-mix(in oklab, var(--color-red-500) 15%, transparent)}}.bg-secondary{background-color:var(--secondary)}.bg-sidebar{background-color:var(--sidebar)}.bg-sky-500{background-color:var(--color-sky-500)}.bg-slate-500{background-color:var(--color-slate-500)}.bg-transparent{background-color:#0000}.bg-violet-500\/15{background-color:#8d54ff26}@supports (color:color-mix(in lab, red, red)){.bg-violet-500\/15{background-color:color-mix(in oklab, var(--color-violet-500) 15%, transparent)}}.fill-foreground{fill:var(--foreground)}.p-0{padding:0}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:var(--spacing)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-2\.5{padding:calc(var(--spacing) * 2.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.p-8{padding:calc(var(--spacing) * 8)}.p-\[3px\]{padding:3px}.p-px{padding:1px}.px-1{padding-inline:var(--spacing)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-0{padding-block:0}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.pt-0\.5{padding-top:calc(var(--spacing) * .5)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pr-0\.5{padding-right:calc(var(--spacing) * .5)}.pr-1{padding-right:var(--spacing)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-7{padding-right:calc(var(--spacing) * 7)}.pr-8{padding-right:calc(var(--spacing) * 8)}.pb-1{padding-bottom:var(--spacing)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pl-0\.5{padding-left:calc(var(--spacing) * .5)}.pl-2{padding-left:calc(var(--spacing) * 2)}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-8{padding-left:calc(var(--spacing) * 8)}.pl-9{padding-left:calc(var(--spacing) * 9)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.align-middle{vertical-align:middle}.font-mono{font-family:var(--font-mono)}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[0\.85em\]{font-size:.85em}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.text-balance{text-wrap:balance}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-300{color:var(--color-amber-300)}.text-amber-400{color:var(--color-amber-400)}.text-background{color:var(--background)}.text-blue-300{color:var(--color-blue-300)}.text-card-foreground{color:var(--card-foreground)}.text-current{color:currentColor}.text-cyan-400{color:var(--color-cyan-400)}.text-destructive{color:var(--destructive)}.text-emerald-300{color:var(--color-emerald-300)}.text-emerald-400{color:var(--color-emerald-400)}.text-foreground,.text-foreground\/60{color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){.text-foreground\/60{color:color-mix(in oklab, var(--foreground) 60%, transparent)}}.text-muted-foreground{color:var(--muted-foreground)}.text-pink-400{color:var(--color-pink-400)}.text-popover-foreground{color:var(--popover-foreground)}.text-primary{color:var(--primary)}.text-primary-foreground{color:var(--primary-foreground)}.text-red-300{color:var(--color-red-300)}.text-red-400{color:var(--color-red-400)}.text-secondary-foreground{color:var(--secondary-foreground)}.text-sidebar-foreground{color:var(--sidebar-foreground)}.text-sky-400{color:var(--color-sky-400)}.text-violet-300{color:var(--color-violet-300)}.text-violet-400{color:var(--color-violet-400)}.text-white{color:var(--color-white)}.uppercase{text-transform:uppercase}.underline{text-decoration-line:underline}.underline-offset-2{text-underline-offset:2px}.underline-offset-4{text-underline-offset:4px}.opacity-50{opacity:.5}.opacity-70{opacity:.7}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-0{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-primary\/50{--tw-ring-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.ring-primary\/50{--tw-ring-color:color-mix(in oklab, var(--primary) 50%, transparent)}}.ring-offset-background{--tw-ring-offset-color:var(--background)}.outline-hidden{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.outline-hidden{outline-offset:2px;outline:2px solid #0000}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition-\[color\,box-shadow\]{transition-property:color,box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-shadow{transition-property:box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-none{transition-property:none}.duration-200{--tw-duration:.2s;transition-duration:.2s}.fade-in-0{--tw-enter-opacity:0}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.zoom-in-95{--tw-enter-scale:.95}.running{animation-play-state:running}@media (hover:hover){.group-hover\:text-foreground:is(:where(.group):hover *){color:var(--foreground)}}.group-data-\[disabled\=true\]\:pointer-events-none:is(:where(.group)[data-disabled=true] *){pointer-events:none}.group-data-\[disabled\=true\]\:opacity-50:is(:where(.group)[data-disabled=true] *){opacity:.5}.group-data-\[orientation\=horizontal\]\/tabs\:h-9:is(:where(.group\/tabs)[data-orientation=horizontal] *){height:calc(var(--spacing) * 9)}.group-data-\[orientation\=vertical\]\/tabs\:h-fit:is(:where(.group\/tabs)[data-orientation=vertical] *){height:fit-content}.group-data-\[orientation\=vertical\]\/tabs\:w-full:is(:where(.group\/tabs)[data-orientation=vertical] *){width:100%}.group-data-\[orientation\=vertical\]\/tabs\:flex-col:is(:where(.group\/tabs)[data-orientation=vertical] *){flex-direction:column}.group-data-\[orientation\=vertical\]\/tabs\:justify-start:is(:where(.group\/tabs)[data-orientation=vertical] *){justify-content:flex-start}.group-data-\[size\=default\]\/switch\:size-4:is(:where(.group\/switch)[data-size=default] *){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.group-data-\[size\=sm\]\/switch\:size-3:is(:where(.group\/switch)[data-size=sm] *){width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.group-data-\[variant\=line\]\/tabs-list\:bg-transparent:is(:where(.group\/tabs-list)[data-variant=line] *){background-color:#0000}.peer-disabled\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed}.peer-disabled\:opacity-50:is(:where(.peer):disabled~*){opacity:.5}.selection\:bg-primary ::selection{background-color:var(--primary)}.selection\:bg-primary::selection{background-color:var(--primary)}.selection\:text-primary-foreground ::selection{color:var(--primary-foreground)}.selection\:text-primary-foreground::selection{color:var(--primary-foreground)}.file\:inline-flex::file-selector-button{display:inline-flex}.file\:h-7::file-selector-button{height:calc(var(--spacing) * 7)}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\:bg-transparent::file-selector-button{background-color:#0000}.file\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.file\:text-foreground::file-selector-button{color:var(--foreground)}.placeholder\:text-muted-foreground::placeholder{color:var(--muted-foreground)}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:bg-foreground:after{content:var(--tw-content);background-color:var(--foreground)}.after\:opacity-0:after{content:var(--tw-content);opacity:0}.after\:transition-opacity:after{content:var(--tw-content);transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.group-data-\[orientation\=horizontal\]\/tabs\:after\:inset-x-0:is(:where(.group\/tabs)[data-orientation=horizontal] *):after{content:var(--tw-content);inset-inline:0}.group-data-\[orientation\=horizontal\]\/tabs\:after\:bottom-\[-5px\]:is(:where(.group\/tabs)[data-orientation=horizontal] *):after{content:var(--tw-content);bottom:-5px}.group-data-\[orientation\=horizontal\]\/tabs\:after\:h-0\.5:is(:where(.group\/tabs)[data-orientation=horizontal] *):after{content:var(--tw-content);height:calc(var(--spacing) * .5)}.group-data-\[orientation\=vertical\]\/tabs\:after\:inset-y-0:is(:where(.group\/tabs)[data-orientation=vertical] *):after{content:var(--tw-content);inset-block:0}.group-data-\[orientation\=vertical\]\/tabs\:after\:-right-1:is(:where(.group\/tabs)[data-orientation=vertical] *):after{content:var(--tw-content);right:calc(var(--spacing) * -1)}.group-data-\[orientation\=vertical\]\/tabs\:after\:w-0\.5:is(:where(.group\/tabs)[data-orientation=vertical] *):after{content:var(--tw-content);width:calc(var(--spacing) * .5)}@media (hover:hover){.hover\:border-primary\/50:hover{border-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.hover\:border-primary\/50:hover{border-color:color-mix(in oklab, var(--primary) 50%, transparent)}}.hover\:border-primary\/60:hover{border-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.hover\:border-primary\/60:hover{border-color:color-mix(in oklab, var(--primary) 60%, transparent)}}.hover\:bg-accent:hover{background-color:var(--accent)}.hover\:bg-amber-500\/25:hover{background-color:#f99c0040}@supports (color:color-mix(in lab, red, red)){.hover\:bg-amber-500\/25:hover{background-color:color-mix(in oklab, var(--color-amber-500) 25%, transparent)}}.hover\:bg-destructive\/90:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab, var(--destructive) 90%, transparent)}}.hover\:bg-emerald-500\/25:hover{background-color:#00bb7f40}@supports (color:color-mix(in lab, red, red)){.hover\:bg-emerald-500\/25:hover{background-color:color-mix(in oklab, var(--color-emerald-500) 25%, transparent)}}.hover\:bg-muted\/50:hover{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-muted\/50:hover{background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.hover\:bg-primary\/10:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-primary\/10:hover{background-color:color-mix(in oklab, var(--primary) 10%, transparent)}}.hover\:bg-primary\/50:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-primary\/50:hover{background-color:color-mix(in oklab, var(--primary) 50%, transparent)}}.hover\:bg-primary\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab, var(--primary) 90%, transparent)}}.hover\:bg-red-500\/25:hover{background-color:#fb2c3640}@supports (color:color-mix(in lab, red, red)){.hover\:bg-red-500\/25:hover{background-color:color-mix(in oklab, var(--color-red-500) 25%, transparent)}}.hover\:bg-secondary\/80:hover{background-color:var(--secondary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-secondary\/80:hover{background-color:color-mix(in oklab, var(--secondary) 80%, transparent)}}.hover\:text-accent-foreground:hover{color:var(--accent-foreground)}.hover\:text-amber-200:hover{color:var(--color-amber-200)}.hover\:text-foreground:hover{color:var(--foreground)}.hover\:text-primary:hover{color:var(--primary)}.hover\:text-red-300:hover{color:var(--color-red-300)}.hover\:text-red-400:hover{color:var(--color-red-400)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}}.focus\:bg-accent:focus{background-color:var(--accent)}.focus\:text-accent-foreground:focus{color:var(--accent-foreground)}.focus\:text-amber-300:focus{color:var(--color-amber-300)}.focus\:text-red-300:focus{color:var(--color-red-300)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\:ring-ring:focus{--tw-ring-color:var(--ring)}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus\:outline-hidden:focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.focus\:outline-hidden:focus{outline-offset:2px;outline:2px solid #0000}}.focus-visible\:border-ring:focus-visible{border-color:var(--ring)}.focus-visible\:ring-\[3px\]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:color-mix(in oklab, var(--ring) 50%, transparent)}}.focus-visible\:outline-1:focus-visible{outline-style:var(--tw-outline-style);outline-width:1px}.focus-visible\:outline-ring:focus-visible{outline-color:var(--ring)}.active\:cursor-grabbing:active{cursor:grabbing}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.has-aria-expanded\:bg-muted\/50:has([aria-expanded=true]){background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.has-aria-expanded\:bg-muted\/50:has([aria-expanded=true]){background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.has-data-\[slot\=card-action\]\:grid-cols-\[1fr_auto\]:has([data-slot=card-action]){grid-template-columns:1fr auto}.has-\[\>svg\]\:grid-cols-\[calc\(var\(--spacing\)\*4\)_1fr\]:has(>svg){grid-template-columns:calc(var(--spacing) * 4) 1fr}.has-\[\>svg\]\:gap-x-3:has(>svg){column-gap:calc(var(--spacing) * 3)}.has-\[\>svg\]\:px-1\.5:has(>svg){padding-inline:calc(var(--spacing) * 1.5)}.has-\[\>svg\]\:px-2\.5:has(>svg){padding-inline:calc(var(--spacing) * 2.5)}.has-\[\>svg\]\:px-3:has(>svg){padding-inline:calc(var(--spacing) * 3)}.has-\[\>svg\]\:px-4:has(>svg){padding-inline:calc(var(--spacing) * 4)}.aria-invalid\:border-destructive[aria-invalid=true]{border-color:var(--destructive)}.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[orientation\=horizontal\]\:h-px[data-orientation=horizontal]{height:1px}.data-\[orientation\=horizontal\]\:w-full[data-orientation=horizontal]{width:100%}.data-\[orientation\=horizontal\]\:flex-col[data-orientation=horizontal]{flex-direction:column}.data-\[orientation\=vertical\]\:h-full[data-orientation=vertical]{height:100%}.data-\[orientation\=vertical\]\:w-px[data-orientation=vertical]{width:1px}.data-\[placeholder\]\:text-muted-foreground[data-placeholder]{color:var(--muted-foreground)}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y:var(--spacing);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=bottom\]\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y:calc(2*var(--spacing)*-1)}.data-\[side\=left\]\:-translate-x-1[data-side=left]{--tw-translate-x:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=left\]\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x:calc(2*var(--spacing))}.data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x:var(--spacing);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=right\]\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x:calc(2*var(--spacing)*-1)}.data-\[side\=top\]\:-translate-y-1[data-side=top]{--tw-translate-y:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=top\]\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y:calc(2*var(--spacing))}.data-\[size\=default\]\:h-9[data-size=default]{height:calc(var(--spacing) * 9)}.data-\[size\=default\]\:h-\[1\.15rem\][data-size=default]{height:1.15rem}.data-\[size\=default\]\:w-8[data-size=default]{width:calc(var(--spacing) * 8)}.data-\[size\=sm\]\:h-3\.5[data-size=sm]{height:calc(var(--spacing) * 3.5)}.data-\[size\=sm\]\:h-8[data-size=sm]{height:calc(var(--spacing) * 8)}.data-\[size\=sm\]\:w-6[data-size=sm]{width:calc(var(--spacing) * 6)}:is(.\*\:data-\[slot\=alert-description\]\:text-destructive\/90>*)[data-slot=alert-description]{color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){:is(.\*\:data-\[slot\=alert-description\]\:text-destructive\/90>*)[data-slot=alert-description]{color:color-mix(in oklab, var(--destructive) 90%, transparent)}}:is(.\*\:data-\[slot\=select-value\]\:line-clamp-1>*)[data-slot=select-value]{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}:is(.\*\:data-\[slot\=select-value\]\:flex>*)[data-slot=select-value]{display:flex}:is(.\*\:data-\[slot\=select-value\]\:items-center>*)[data-slot=select-value]{align-items:center}:is(.\*\:data-\[slot\=select-value\]\:gap-2>*)[data-slot=select-value]{gap:calc(var(--spacing) * 2)}.data-\[state\=active\]\:bg-background[data-state=active]{background-color:var(--background)}.data-\[state\=active\]\:text-foreground[data-state=active]{color:var(--foreground)}.group-data-\[variant\=default\]\/tabs-list\:data-\[state\=active\]\:shadow-sm:is(:where(.group\/tabs-list)[data-variant=default] *)[data-state=active]{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.group-data-\[variant\=line\]\/tabs-list\:data-\[state\=active\]\:bg-transparent:is(:where(.group\/tabs-list)[data-variant=line] *)[data-state=active]{background-color:#0000}.group-data-\[variant\=line\]\/tabs-list\:data-\[state\=active\]\:shadow-none:is(:where(.group\/tabs-list)[data-variant=line] *)[data-state=active]{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.group-data-\[variant\=line\]\/tabs-list\:data-\[state\=active\]\:after\:opacity-100:is(:where(.group\/tabs-list)[data-variant=line] *)[data-state=active]:after{content:var(--tw-content);opacity:1}.data-\[state\=checked\]\:translate-x-\[calc\(100\%-2px\)\][data-state=checked]{--tw-translate-x:calc(100% - 2px);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=checked\]\:border-primary[data-state=checked]{border-color:var(--primary)}.data-\[state\=checked\]\:bg-primary[data-state=checked]{background-color:var(--primary)}.data-\[state\=checked\]\:text-primary-foreground[data-state=checked]{color:var(--primary-foreground)}.data-\[state\=closed\]\:animate-out[data-state=closed]{animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-\[state\=closed\]\:fade-out-0[data-state=closed]{--tw-exit-opacity:0}.data-\[state\=closed\]\:zoom-out-95[data-state=closed]{--tw-exit-scale:.95}.data-\[state\=open\]\:animate-in[data-state=open]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:var(--accent)}.data-\[state\=open\]\:text-muted-foreground[data-state=open]{color:var(--muted-foreground)}.data-\[state\=open\]\:fade-in-0[data-state=open]{--tw-enter-opacity:0}.data-\[state\=open\]\:zoom-in-95[data-state=open]{--tw-enter-scale:.95}.data-\[state\=selected\]\:bg-muted[data-state=selected]{background-color:var(--muted)}.data-\[state\=unchecked\]\:translate-x-0[data-state=unchecked]{--tw-translate-x:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=unchecked\]\:bg-input[data-state=unchecked]{background-color:var(--input)}.data-\[variant\=line\]\:rounded-none[data-variant=line]{border-radius:0}@media (width>=40rem){.sm\:max-w-2xl{max-width:var(--container-2xl)}.sm\:max-w-lg{max-width:var(--container-lg)}.sm\:flex-row{flex-direction:row}.sm\:justify-between{justify-content:space-between}.sm\:justify-end{justify-content:flex-end}.sm\:text-left{text-align:left}}@media (width>=48rem){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}@media (width>=80rem){.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.xl\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}}.dark\:border-input:is(.dark *){border-color:var(--input)}.dark\:bg-destructive\/60:is(.dark *){background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-destructive\/60:is(.dark *){background-color:color-mix(in oklab, var(--destructive) 60%, transparent)}}.dark\:bg-input\/30:is(.dark *){background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-input\/30:is(.dark *){background-color:color-mix(in oklab, var(--input) 30%, transparent)}}.dark\:text-muted-foreground:is(.dark *){color:var(--muted-foreground)}@media (hover:hover){.dark\:hover\:bg-accent\/50:is(.dark *):hover{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-accent\/50:is(.dark *):hover{background-color:color-mix(in oklab, var(--accent) 50%, transparent)}}.dark\:hover\:bg-input\/50:is(.dark *):hover{background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-input\/50:is(.dark *):hover{background-color:color-mix(in oklab, var(--input) 50%, transparent)}}.dark\:hover\:text-foreground:is(.dark *):hover{color:var(--foreground)}}.dark\:focus-visible\:ring-destructive\/40:is(.dark *):focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:focus-visible\:ring-destructive\/40:is(.dark *):focus-visible{--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.dark\:aria-invalid\:ring-destructive\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:aria-invalid\:ring-destructive\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.dark\:data-\[state\=active\]\:border-input:is(.dark *)[data-state=active]{border-color:var(--input)}.dark\:data-\[state\=active\]\:bg-input\/30:is(.dark *)[data-state=active]{background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.dark\:data-\[state\=active\]\:bg-input\/30:is(.dark *)[data-state=active]{background-color:color-mix(in oklab, var(--input) 30%, transparent)}}.dark\:data-\[state\=active\]\:text-foreground:is(.dark *)[data-state=active]{color:var(--foreground)}.dark\:group-data-\[variant\=line\]\/tabs-list\:data-\[state\=active\]\:border-transparent:is(.dark *):is(:where(.group\/tabs-list)[data-variant=line] *)[data-state=active]{border-color:#0000}.dark\:group-data-\[variant\=line\]\/tabs-list\:data-\[state\=active\]\:bg-transparent:is(.dark *):is(:where(.group\/tabs-list)[data-variant=line] *)[data-state=active]{background-color:#0000}.dark\:data-\[state\=checked\]\:bg-primary:is(.dark *)[data-state=checked]{background-color:var(--primary)}.dark\:data-\[state\=checked\]\:bg-primary-foreground:is(.dark *)[data-state=checked]{background-color:var(--primary-foreground)}.dark\:data-\[state\=unchecked\]\:bg-foreground:is(.dark *)[data-state=unchecked]{background-color:var(--foreground)}.dark\:data-\[state\=unchecked\]\:bg-input\/80:is(.dark *)[data-state=unchecked]{background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.dark\:data-\[state\=unchecked\]\:bg-input\/80:is(.dark *)[data-state=unchecked]{background-color:color-mix(in oklab, var(--input) 80%, transparent)}}.\[\&_a\]\:text-primary a{color:var(--primary)}.\[\&_a\]\:underline a{text-decoration-line:underline}.\[\&_a\]\:underline-offset-2 a{text-underline-offset:2px}.\[\&_blockquote\]\:my-1 blockquote{margin-block:var(--spacing)}.\[\&_blockquote\]\:border-l-2 blockquote{border-left-style:var(--tw-border-style);border-left-width:2px}.\[\&_blockquote\]\:border-border blockquote{border-color:var(--border)}.\[\&_blockquote\]\:pl-2 blockquote{padding-left:calc(var(--spacing) * 2)}.\[\&_blockquote\]\:text-muted-foreground blockquote{color:var(--muted-foreground)}.\[\&_code\]\:rounded code{border-radius:.25rem}.\[\&_code\]\:bg-muted code{background-color:var(--muted)}.\[\&_code\]\:px-1 code{padding-inline:var(--spacing)}.\[\&_code\]\:py-0\.5 code{padding-block:calc(var(--spacing) * .5)}.\[\&_code\]\:font-mono code{font-family:var(--font-mono)}.\[\&_code\]\:text-\[0\.85em\] code{font-size:.85em}.\[\&_code\]\:break-all code{word-break:break-all}.\[\&_h1\]\:mt-2 h1{margin-top:calc(var(--spacing) * 2)}.\[\&_h1\]\:mb-1 h1{margin-bottom:var(--spacing)}.\[\&_h1\]\:text-sm h1{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.\[\&_h1\]\:font-bold h1{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.\[\&_h2\]\:mt-2 h2{margin-top:calc(var(--spacing) * 2)}.\[\&_h2\]\:mb-1 h2{margin-bottom:var(--spacing)}.\[\&_h2\]\:text-xs h2{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.\[\&_h2\]\:font-bold h2{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.\[\&_h3\]\:mt-1\.5 h3{margin-top:calc(var(--spacing) * 1.5)}.\[\&_h3\]\:mb-0\.5 h3{margin-bottom:calc(var(--spacing) * .5)}.\[\&_h3\]\:font-semibold h3{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.\[\&_hr\]\:my-2 hr{margin-block:calc(var(--spacing) * 2)}.\[\&_hr\]\:border-border hr{border-color:var(--border)}.\[\&_li\]\:my-0\.5 li{margin-block:calc(var(--spacing) * .5)}.\[\&_ol\]\:my-1 ol{margin-block:var(--spacing)}.\[\&_ol\]\:list-decimal ol{list-style-type:decimal}.\[\&_ol\]\:pl-4 ol{padding-left:calc(var(--spacing) * 4)}.\[\&_p\]\:leading-relaxed p{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.\[\&_pre\]\:my-1 pre{margin-block:var(--spacing)}.\[\&_pre\]\:max-w-full pre{max-width:100%}.\[\&_pre\]\:overflow-x-auto pre{overflow-x:auto}.\[\&_pre\]\:rounded pre{border-radius:.25rem}.\[\&_pre\]\:bg-muted pre{background-color:var(--muted)}.\[\&_pre\]\:p-2 pre{padding:calc(var(--spacing) * 2)}.\[\&_pre\]\:text-\[10px\] pre{font-size:10px}.\[\&_pre_code\]\:bg-transparent pre code{background-color:#0000}.\[\&_pre_code\]\:p-0 pre code{padding:0}.\[\&_pre_code\]\:break-normal pre code{overflow-wrap:normal;word-break:normal}.\[\&_strong\]\:font-semibold strong{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:h-3\.5 svg{height:calc(var(--spacing) * 3.5)}.\[\&_svg\]\:w-3\.5 svg{width:calc(var(--spacing) * 3.5)}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-3 svg:not([class*=size-]){width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4 svg:not([class*=size-]){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&_svg\:not\(\[class\*\=\'text-\'\]\)\]\:text-muted-foreground svg:not([class*=text-]){color:var(--muted-foreground)}.\[\&_table\]\:my-1\.5 table{margin-block:calc(var(--spacing) * 1.5)}.\[\&_table\]\:block table{display:block}.\[\&_table\]\:w-full table{width:100%}.\[\&_table\]\:max-w-full table{max-width:100%}.\[\&_table\]\:border-collapse table{border-collapse:collapse}.\[\&_table\]\:overflow-x-auto table{overflow-x:auto}.\[\&_table\]\:text-\[11px\] table{font-size:11px}.\[\&_td\]\:border td{border-style:var(--tw-border-style);border-width:1px}.\[\&_td\]\:border-border td{border-color:var(--border)}.\[\&_td\]\:px-2 td{padding-inline:calc(var(--spacing) * 2)}.\[\&_td\]\:py-1 td{padding-block:var(--spacing)}.\[\&_td\]\:break-words td{overflow-wrap:break-word}.\[\&_th\]\:border th{border-style:var(--tw-border-style);border-width:1px}.\[\&_th\]\:border-border th{border-color:var(--border)}.\[\&_th\]\:bg-muted\/50 th{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.\[\&_th\]\:bg-muted\/50 th{background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.\[\&_th\]\:px-2 th{padding-inline:calc(var(--spacing) * 2)}.\[\&_th\]\:py-1 th{padding-block:var(--spacing)}.\[\&_th\]\:text-left th{text-align:left}.\[\&_th\]\:font-semibold th{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.\[\&_tr\]\:border-b tr{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.\[\&_tr\:last-child\]\:border-0 tr:last-child{border-style:var(--tw-border-style);border-width:0}.\[\&_ul\]\:my-1 ul{margin-block:var(--spacing)}.\[\&_ul\]\:list-disc ul{list-style-type:disc}.\[\&_ul\]\:pl-4 ul{padding-left:calc(var(--spacing) * 4)}.\[\&\:has\(\[role\=checkbox\]\)\]\:pr-0:has([role=checkbox]){padding-right:0}.\[\.border-b\]\:pb-6.border-b{padding-bottom:calc(var(--spacing) * 6)}.\[\.border-t\]\:pt-6.border-t{padding-top:calc(var(--spacing) * 6)}:is(.\*\:\[span\]\:last\:flex>*):is(span):last-child{display:flex}:is(.\*\:\[span\]\:last\:items-center>*):is(span):last-child{align-items:center}:is(.\*\:\[span\]\:last\:gap-2>*):is(span):last-child{gap:calc(var(--spacing) * 2)}.\[\&\>\[role\=checkbox\]\]\:translate-y-\[2px\]>[role=checkbox]{--tw-translate-y:2px;translate:var(--tw-translate-x) var(--tw-translate-y)}.\[\&\>div\>div\]\:block\!>div>div{display:block!important}.\[\&\>svg\]\:pointer-events-none>svg{pointer-events:none}.\[\&\>svg\]\:size-3>svg{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.\[\&\>svg\]\:size-4>svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&\>svg\]\:translate-y-0\.5>svg{--tw-translate-y:calc(var(--spacing) * .5);translate:var(--tw-translate-x) var(--tw-translate-y)}.\[\&\>svg\]\:text-current>svg{color:currentColor}.\[\&\>tr\]\:last\:border-b-0>tr:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}@media (hover:hover){a.\[a\&\]\:hover\:bg-accent:hover{background-color:var(--accent)}a.\[a\&\]\:hover\:bg-destructive\/90:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){a.\[a\&\]\:hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab, var(--destructive) 90%, transparent)}}a.\[a\&\]\:hover\:bg-primary\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){a.\[a\&\]\:hover\:bg-primary\/90:hover{background-color:color-mix(in oklab, var(--primary) 90%, transparent)}}a.\[a\&\]\:hover\:bg-secondary\/90:hover{background-color:var(--secondary)}@supports (color:color-mix(in lab, red, red)){a.\[a\&\]\:hover\:bg-secondary\/90:hover{background-color:color-mix(in oklab, var(--secondary) 90%, transparent)}}a.\[a\&\]\:hover\:text-accent-foreground:hover{color:var(--accent-foreground)}a.\[a\&\]\:hover\:underline:hover{text-decoration-line:underline}}}@property --tw-animation-delay{syntax:"*";inherits:false;initial-value:0s}@property --tw-animation-direction{syntax:"*";inherits:false;initial-value:normal}@property --tw-animation-duration{syntax:"*";inherits:false}@property --tw-animation-fill-mode{syntax:"*";inherits:false;initial-value:none}@property --tw-animation-iteration-count{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-translate-y{syntax:"*";inherits:false;initial-value:0}:root{--background:oklch(14.5% 0 0);--foreground:oklch(98.5% 0 0);--card:oklch(18.5% .012 260);--card-foreground:oklch(98.5% 0 0);--popover:oklch(18.5% .012 260);--popover-foreground:oklch(98.5% 0 0);--primary:oklch(68% .16 250);--primary-foreground:oklch(14.5% 0 0);--secondary:oklch(26% .014 260);--secondary-foreground:oklch(98.5% 0 0);--muted:oklch(24% .012 260);--muted-foreground:oklch(70% .015 260);--accent:oklch(28% .02 250);--accent-foreground:oklch(98.5% 0 0);--destructive:oklch(62% .21 22);--destructive-foreground:oklch(98.5% 0 0);--border:oklch(30% .012 260);--input:oklch(30% .012 260);--ring:oklch(68% .16 250);--chart-1:oklch(65% .2 150);--chart-2:oklch(70% .15 250);--sidebar:oklch(16% .012 260);--sidebar-foreground:oklch(98.5% 0 0);--sidebar-border:oklch(30% .012 260)}.dark{--background:oklch(14.5% 0 0);--foreground:oklch(98.5% 0 0);--card:oklch(18.5% .012 260);--card-foreground:oklch(98.5% 0 0);--popover:oklch(18.5% .012 260);--popover-foreground:oklch(98.5% 0 0);--primary:oklch(68% .16 250);--primary-foreground:oklch(14.5% 0 0);--secondary:oklch(26% .014 260);--secondary-foreground:oklch(98.5% 0 0);--muted:oklch(24% .012 260);--muted-foreground:oklch(70% .015 260);--accent:oklch(28% .02 250);--accent-foreground:oklch(98.5% 0 0);--destructive:oklch(62% .21 22);--destructive-foreground:oklch(98.5% 0 0);--border:oklch(30% .012 260);--input:oklch(30% .012 260);--ring:oklch(68% .16 250)}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0)scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1))rotate(var(--tw-enter-rotate,0));filter:blur(var(--tw-enter-blur,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0)scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1))rotate(var(--tw-exit-rotate,0));filter:blur(var(--tw-exit-blur,0))}}
|
|
@@ -94,11 +94,11 @@ Error generating stack: `+e.message+`
|
|
|
94
94
|
[&_pre_code]:bg-transparent [&_pre_code]:p-0 [&_pre_code]:break-normal
|
|
95
95
|
[&_table]:my-1.5 [&_table]:block [&_table]:w-full [&_table]:max-w-full [&_table]:overflow-x-auto [&_table]:border-collapse [&_table]:text-[11px]
|
|
96
96
|
[&_th]:border [&_th]:border-border [&_th]:bg-muted/50 [&_th]:px-2 [&_th]:py-1 [&_th]:text-left [&_th]:font-semibold
|
|
97
|
-
[&_td]:border [&_td]:border-border [&_td]:px-2 [&_td]:py-1 [&_td]:break-words`,children:(0,K.jsx)(Kw,{remarkPlugins:[QD],children:e})})}function eO({className:e,children:t,...n}){return(0,K.jsxs)(Bd,{"data-slot":`scroll-area`,className:mn(`relative`,e),...n,children:[(0,K.jsx)(Ud,{"data-slot":`scroll-area-viewport`,className:`size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1`,children:t}),(0,K.jsx)(tO,{}),(0,K.jsx)(lf,{})]})}function tO({className:e,orientation:t=`vertical`,...n}){return(0,K.jsx)(Jd,{"data-slot":`scroll-area-scrollbar`,orientation:t,className:mn(`flex touch-none p-px transition-colors select-none`,t===`vertical`&&`h-full w-2.5 border-l border-l-transparent`,t===`horizontal`&&`h-2.5 flex-col border-t border-t-transparent`,e),...n,children:(0,K.jsx)(of,{"data-slot":`scroll-area-thumb`,className:`relative flex-1 rounded-full bg-border`})})}function nO({className:e,...t}){return(0,K.jsx)(`textarea`,{"data-slot":`textarea`,className:mn(`flex field-sizing-content min-h-16 w-full rounded-md border border-input bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:aria-invalid:ring-destructive/40`,e),...t})}function rO({agentId:e,sessionId:t,wsId:n,injectedDevice:r,autonomy:i,onAutonomy:a}){let[o,s]=(0,v.useState)([]),[c,l]=(0,v.useState)(``),[u,d]=(0,v.useState)(!1),[f,p]=(0,v.useState)(null),[m,h]=(0,v.useState)(``),[g,_]=(0,v.useState)(!1),[y,b]=(0,v.useState)(``),[x,S]=(0,v.useState)(``),C=(0,v.useRef)(null),w=(0,v.useRef)(null),T=(0,v.useRef)(!1);(0,v.useEffect)(()=>{T.current=u},[u]);let E=(0,v.useRef)(!1),D=(0,v.useRef)(!1);(0,v.useEffect)(()=>{let e=!0,n=async()=>{if(T.current||!e)return;let n;try{n=await ot(`/api/chat/history?sessionId=${encodeURIComponent(t)}`)}catch{return}if(!e||!n.exists)return;let r=!!(n.running||n.pending);(!E.current||r||D.current)&&(E.current=!0,D.current=r,s([...n.msgs||[],...n.pending?[{kind:`pending`,intro:`(恢复现场)待确认操作:${n.pending.tool}`}]:[]]),p(n.pending||null),h(r?`后台进行中:${n.statusText||(n.pending?`等待人工确认`:``)}`:``))};n();let r=setInterval(n,2500);return()=>{e=!1,clearInterval(r)}},[t]);let O=(0,v.useRef)(!0),k=(0,v.useCallback)(()=>{let e=C.current?.closest(`[data-slot="scroll-area-viewport"]`);e&&(e.scrollTop=e.scrollHeight)},[]);(0,v.useEffect)(()=>{let e=C.current?.closest(`[data-slot="scroll-area-viewport"]`);if(!e)return;let t=()=>{O.current=e.scrollHeight-e.scrollTop-e.clientHeight<80};return e.addEventListener(`scroll`,t),()=>e.removeEventListener(`scroll`,t)},[]),(0,v.useEffect)(()=>{O.current&&k()},[o,m,k]),(0,v.useEffect)(()=>{O.current=!0},[t]);let A=e=>s(t=>[...t,e]),j=(0,v.useRef)(null),M=()=>{j.current?.abort(),st(`/api/chat/interrupt`,{sessionId:t}).catch(()=>{})},N=e=>{let t=e.type;if(t===`status`)h(String(e.text||``));else if(t===`text_delta`){let t=e.delta;h(``),s(e=>{let n=e[e.length-1];return n?.kind===`bot`?[...e.slice(0,-1),{...n,text:(n.text||``)+t}]:[...e,{kind:`bot`,text:t}]})}else t===`tool_start`?A({kind:`evt`,evt:{tool:e.tool,args:e.args,result:`…`,status:`start`}}):t===`tool_end`?s(t=>{let n=[...t].reverse().findIndex(t=>t.kind===`evt`&&t.evt?.tool===e.tool&&t.evt?.status===`start`);if(n<0)return[...t,{kind:`evt`,evt:e}];let r=t.length-1-n;return t.map((t,n)=>n===r?{kind:`evt`,evt:e}:t)}):t===`pending`?(p(e.pending),A({kind:`pending`,intro:e.intro}),h(``)):t===`done`?(h(``),e.reply&&s(t=>{let n=t[t.length-1];return n?.kind===`bot`&&n.text&&e.reply&&n.text.trim()===String(e.reply).trim()?t:[...t,{kind:`bot`,text:String(e.reply)}]})):t===`interrupted`?(h(``),s(e=>{let t=e[e.length-1];return t?.kind===`bot`?[...e.slice(0,-1),{...t,text:(t.text||``)+`
|
|
97
|
+
[&_td]:border [&_td]:border-border [&_td]:px-2 [&_td]:py-1 [&_td]:break-words`,children:(0,K.jsx)(Kw,{remarkPlugins:[QD],children:e})})}function eO({className:e,children:t,...n}){return(0,K.jsxs)(Bd,{"data-slot":`scroll-area`,className:mn(`relative`,e),...n,children:[(0,K.jsx)(Ud,{"data-slot":`scroll-area-viewport`,className:`size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1`,children:t}),(0,K.jsx)(tO,{}),(0,K.jsx)(lf,{})]})}function tO({className:e,orientation:t=`vertical`,...n}){return(0,K.jsx)(Jd,{"data-slot":`scroll-area-scrollbar`,orientation:t,className:mn(`flex touch-none p-px transition-colors select-none`,t===`vertical`&&`h-full w-2.5 border-l border-l-transparent`,t===`horizontal`&&`h-2.5 flex-col border-t border-t-transparent`,e),...n,children:(0,K.jsx)(of,{"data-slot":`scroll-area-thumb`,className:`relative flex-1 rounded-full bg-border`})})}function nO({className:e,...t}){return(0,K.jsx)(`textarea`,{"data-slot":`textarea`,className:mn(`flex field-sizing-content min-h-16 w-full rounded-md border border-input bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:aria-invalid:ring-destructive/40`,e),...t})}function rO({agentId:e,sessionId:t,wsId:n,injectedDevice:r,autonomy:i,onAutonomy:a}){let[o,s]=(0,v.useState)([]),[c,l]=(0,v.useState)(``),[u,d]=(0,v.useState)(!1),[f,p]=(0,v.useState)(null),[m,h]=(0,v.useState)(``),[g,_]=(0,v.useState)(!1),[y,b]=(0,v.useState)(``),[x,S]=(0,v.useState)(``),C=(0,v.useRef)(null),w=(0,v.useRef)(null),T=(0,v.useRef)(!1);(0,v.useEffect)(()=>{T.current=u},[u]);let E=(0,v.useRef)(!1),D=(0,v.useRef)(!1);(0,v.useEffect)(()=>{let e=!0,n=async()=>{if(T.current||!e)return;let n;try{n=await ot(`/api/chat/history?sessionId=${encodeURIComponent(t)}`)}catch{return}if(!e||!n.exists)return;let r=!!(n.running||n.pending);(!E.current||r||D.current)&&(E.current=!0,D.current=r,s([...n.msgs||[],...n.pending?[{kind:`pending`,intro:`(恢复现场)待确认操作:${n.pending.tool}`}]:[]]),p(n.pending||null),h(r?`后台进行中:${n.statusText||(n.pending?`等待人工确认`:``)}`:``))};n();let r=setInterval(n,2500);return()=>{e=!1,clearInterval(r)}},[t]);let O=(0,v.useRef)(!0),k=(0,v.useCallback)(()=>{let e=C.current?.closest(`[data-slot="scroll-area-viewport"]`);e&&(e.scrollTop=e.scrollHeight)},[]);(0,v.useEffect)(()=>{let e=C.current?.closest(`[data-slot="scroll-area-viewport"]`);if(!e)return;let t=()=>{O.current=e.scrollHeight-e.scrollTop-e.clientHeight<80};return e.addEventListener(`scroll`,t),()=>e.removeEventListener(`scroll`,t)},[]),(0,v.useEffect)(()=>{O.current&&k()},[o,m,k]),(0,v.useEffect)(()=>{O.current=!0},[t]);let A=e=>s(t=>[...t,e]),j=(0,v.useRef)(null),M=()=>{j.current?.abort(),st(`/api/chat/interrupt`,{sessionId:t}).catch(()=>{})},N=async()=>{if(u)Z.info(`对话进行中,请先中断再清空`);else if(window.confirm(`清空当前会话?服务端上下文与待确认操作将被丢弃,从零开始对话。`))try{await st(`/api/session/reset`,{scope:`chat`,sessionId:t}),s([]),p(null),h(``),E.current=!1,Z.success(`会话已清空`)}catch(e){Z.error(String(e.message))}},P=e=>{let t=e.type;if(t===`status`)h(String(e.text||``));else if(t===`text_delta`){let t=e.delta;h(``),s(e=>{let n=e[e.length-1];return n?.kind===`bot`?[...e.slice(0,-1),{...n,text:(n.text||``)+t}]:[...e,{kind:`bot`,text:t}]})}else t===`tool_start`?A({kind:`evt`,evt:{tool:e.tool,args:e.args,result:`…`,status:`start`}}):t===`tool_end`?s(t=>{let n=[...t].reverse().findIndex(t=>t.kind===`evt`&&t.evt?.tool===e.tool&&t.evt?.status===`start`);if(n<0)return[...t,{kind:`evt`,evt:e}];let r=t.length-1-n;return t.map((t,n)=>n===r?{kind:`evt`,evt:e}:t)}):t===`pending`?(p(e.pending),A({kind:`pending`,intro:e.intro}),h(``)):t===`done`?(h(``),e.reply&&s(t=>{let n=t[t.length-1];return n?.kind===`bot`&&n.text&&e.reply&&n.text.trim()===String(e.reply).trim()?t:[...t,{kind:`bot`,text:String(e.reply)}]})):t===`interrupted`?(h(``),s(e=>{let t=e[e.length-1];return t?.kind===`bot`?[...e.slice(0,-1),{...t,text:(t.text||``)+`
|
|
98
98
|
|
|
99
|
-
(已中断)`}]:[...e,{kind:`bot`,text:`(已中断)`}]})):t===`error`&&(Z.error(String(e.message)),h(``))},
|
|
100
|
-
`||t===`\r`?(s(),r=2):i+=t),r===3&&i===`!--`&&(r=4,o=o[0])}return s(),o}(e)),t),arguments,[])).length>1?t:t[0]}var sO=oO.bind(v.createElement),cO=class extends v.Component{state={err:null};static getDerivedStateFromError(e){return{err:String(e?.message||e)}}componentDidCatch(e){try{this.props.onError?.(String(e?.message||e))}catch{}}render(){return this.state.err?(0,K.jsxs)(`div`,{className:`p-3 text-[11px] leading-relaxed text-red-400`,children:[`面板运行错误:`,this.state.err,(0,K.jsx)(`br`,{}),`可在「定制工作台」中修正代码后重新发布。`]}):this.props.children}};function lO(e){return Function(`React`,`html`,`useState`,`useEffect`,`useRef`,`useMemo`,`"use strict";\n${e}\n;if (typeof Panel !== "function") throw new Error("插件代码必须定义 function Panel(props)");\nreturn Panel;`)(v,sO,v.useState,v.useEffect,v.useRef,v.useMemo)}function uO(e,t,n){if(e)try{fetch(`/api/panel-error`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({...e,kind:t,message:n})}).catch(()=>{})}catch{}}function dO({code:e,data:t,meta:n}){let r=n?.agentId,i=n?.panelId,a=n?.pluginId,o=(0,v.useMemo)(()=>{let t={agentId:r,panelId:i,pluginId:a};try{return lO(e)}catch(e){return uO(t,`compile`,String(e.message)),()=>(0,K.jsxs)(`div`,{className:`p-3 text-[11px] text-red-400`,children:[`编译失败:`,String(e.message)]})}},[e,r,i,a]);return(0,K.jsx)(cO,{onError:e=>uO(n,`runtime`,e),children:(0,K.jsx)(o,{...t})})}var fO=12;function pO({dsl:e,renderPanel:t,renderDialog:n,renderPlaceholder:r,edit:i,className:a}){let o=(0,v.useRef)(null),s=(0,v.useRef)(null),c=e.panels.reduce((e,t)=>Math.max(e,(t.grid?.y||1)+(t.grid?.h||1)-1),1),l=()=>{let e=o.current?.getBoundingClientRect();return{col:e?(e.width+fO)/12:100,row:e?(e.height+fO)/c:178}},u=(t,n,r)=>{if(!i||t.button!==0)return;t.stopPropagation();let a=e.panels[n].grid||{x:1,y:1,w:6,h:1};s.current={i:n,mode:r,sx:t.clientX,sy:t.clientY,g:{...a},moved:!1};try{t.currentTarget.setPointerCapture(t.pointerId)}catch{}},d=e=>{let t=s.current;if(!i||!t)return;let n=e.clientX-t.sx,r=e.clientY-t.sy;if(!t.moved&&Math.abs(n)<4&&Math.abs(r)<4)return;t.moved=!0;let{col:a,row:o}=l(),c=Math.round(n/a),u=Math.round(r/o);t.mode===`move`?i.onGrid(t.i,{x:Math.min(Math.max(1,t.g.x+c),12-t.g.w+1),y:Math.max(1,t.g.y+u)}):i.onGrid(t.i,{w:Math.min(Math.max(1,t.g.w+c),12-t.g.x+1),h:Math.min(Math.max(1,t.g.h+u),12)})},f=()=>{setTimeout(()=>{s.current=null},0)};return(0,K.jsx)(`div`,{ref:o,className:it(`grid gap-3`,i&&`touch-none select-none`,a),style:{gridTemplateColumns:`repeat(12, minmax(0, 1fr))`,gridTemplateRows:`repeat(${c}, minmax(120px, 1fr))`},onPointerDown:()=>{i&&i.onSelect(null)},children:e.panels.map((e,a)=>{let o=e.grid||{x:1,y:1,w:6,h:1},s=Math.round(o.w/12*100),c=e.type===`agent_dialog`?n?n(e):null:e.type===`placeholder`?r?r(e):null:t(e);return(0,K.jsxs)(`div`,{style:{gridColumn:`${o.x} / span ${o.w}`,gridRow:`${o.y} / span ${o.h}`},className:it(`relative flex min-h-0 flex-col overflow-hidden rounded-lg border bg-card`,i?i.sel===a?`border-primary ring-2 ring-primary/50`:`border-border hover:border-primary/50`:`border-border`,i&&`cursor-grab active:cursor-grabbing`),onPointerDown:e=>{i&&(e.stopPropagation(),i.onSelect(a),u(e,a,`move`))},onPointerMove:d,onPointerUp:f,onPointerCancel:f,children:[i&&(0,K.jsxs)(`div`,{className:`pointer-events-none absolute inset-x-0 top-0 z-10 flex items-center gap-1.5 border-b bg-background/85 px-2 py-1 text-[10px] backdrop-blur-sm`,children:[(0,K.jsx)(`span`,{className:`font-medium`,children:e.title}),(0,K.jsx)(J,{variant:`secondary`,className:`h-4 px-1 text-[9px]`,children:e.panel||e.type}),(0,K.jsxs)(`span`,{className:`ml-auto font-mono text-muted-foreground`,children:[s,`%宽·`,o.h,`行`]})]}),(0,K.jsx)(`div`,{className:it(`min-h-0 flex-1 overflow-auto`,i&&`pointer-events-none pt-4`),children:c}),i&&(0,K.jsx)(`span`,{onPointerDown:e=>u(e,a,`resize`),onPointerMove:d,onPointerUp:f,onPointerCancel:f,className:`absolute bottom-0 right-0 z-10 h-4 w-4 cursor-nwse-resize rounded-br-md border-b border-r border-primary/60 bg-primary/25 hover:bg-primary/50`,title:`拖拽调跨列/跨行(当前 ${s}% 宽)`,children:(0,K.jsx)(rg,{className:`h-2.5 w-2.5 translate-x-[3px] translate-y-[3px] text-primary`})})]},e.id)})})}function mO(){return(0,K.jsxs)(`div`,{className:`relative mb-1 h-4 select-none text-[9px] text-muted-foreground`,children:[(0,K.jsx)(`div`,{className:`grid h-full grid-cols-12`,children:[...Array(12)].map((e,t)=>(0,K.jsx)(`div`,{className:`border-l border-border/60 pl-0.5 pt-0.5 font-mono`,children:t+1},t))}),[25,50,75].map(e=>(0,K.jsxs)(`span`,{className:`absolute -top-0 font-mono`,style:{left:`${e}%`},children:[e,`%`]},e))]})}function hO({open:e,onOpenChange:t,onPick:n}){let[r,i]=(0,v.useState)(null),[a,o]=(0,v.useState)(!1),[s,c]=(0,v.useState)(``),l=e=>{o(!0),c(``),ot(`/api/fs/dirs${e?`?path=${encodeURIComponent(e)}`:``}`).then(e=>i(e)).catch(e=>c(String(e.message))).finally(()=>o(!1))};return(0,v.useEffect)(()=>{e&&!r&&l()},[e]),(0,K.jsx)(a_,{open:e,onOpenChange:t,children:(0,K.jsxs)(c_,{className:`max-w-md`,children:[(0,K.jsx)(l_,{children:(0,K.jsx)(d_,{children:`选择工作区目录`})}),(0,K.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,K.jsxs)(Y,{size:`sm`,variant:`outline`,className:`h-7 gap-1 px-2 text-[11px]`,disabled:!r?.parent,onClick:()=>r?.parent&&l(r.parent),title:`上级目录`,children:[(0,K.jsx)(Zm,{className:`h-3 w-3`}),`上级`]}),(0,K.jsxs)(Y,{size:`sm`,variant:`outline`,className:`h-7 gap-1 px-2 text-[11px]`,onClick:()=>l(),children:[(0,K.jsx)(zh,{className:`h-3 w-3`}),`主目录`]}),(0,K.jsx)(`span`,{className:`min-w-0 flex-1 truncate rounded-md border bg-muted/40 px-2 py-1.5 font-mono text-[11px] text-muted-foreground`,title:r?.path,children:r?.path||`…`})]}),(0,K.jsxs)(eO,{className:`h-64 rounded-md border`,children:[a&&(0,K.jsxs)(`div`,{className:`flex h-full items-center justify-center gap-2 text-xs text-muted-foreground`,children:[(0,K.jsx)($h,{className:`h-4 w-4 animate-spin`}),`读取中…`]}),!a&&s&&(0,K.jsx)(`div`,{className:`p-3 text-xs text-red-400`,children:s}),!a&&!s&&r&&r.dirs.length===0&&(0,K.jsx)(`div`,{className:`p-3 text-xs text-muted-foreground`,children:`此目录下没有子目录——可直接点「选择当前目录」。`}),!a&&!s&&r&&r.dirs.map(e=>(0,K.jsxs)(`button`,{onClick:()=>l(`${r.path}/${e}`),className:`flex w-full items-center gap-2 px-3 py-1.5 text-left text-xs hover:bg-accent`,children:[(0,K.jsx)(Fh,{className:`h-3.5 w-3.5 shrink-0 text-muted-foreground`}),(0,K.jsx)(`span`,{className:`truncate`,children:e})]},e))]}),(0,K.jsxs)(u_,{children:[(0,K.jsx)(Y,{variant:`outline`,onClick:()=>t(!1),children:`取消`}),(0,K.jsxs)(Y,{className:`gap-1`,disabled:!r||a,onClick:()=>{r&&(n(r.path),t(!1))},children:[(0,K.jsx)(rh,{className:`h-3.5 w-3.5`}),`选择当前目录`]})]})]})})}function gO({agentId:e,onName:t,onEdit:n}){let[r,i]=(0,v.useState)(null),[a,o]=(0,v.useState)(null),[s,c]=(0,v.useState)(null),[l,u]=(0,v.useState)([]),[d,f]=(0,v.useState)(null),[p,m]=(0,v.useState)(2),[h,g]=(0,v.useState)(null),[_,y]=(0,v.useState)(!1),[b,x]=(0,v.useState)(``),[S,C]=(0,v.useState)(``),[w,T]=(0,v.useState)(!1),[E,D]=(0,v.useState)(!1),[O,k]=(0,v.useState)(null),[A,j]=(0,v.useState)(!1),M=(0,v.useMemo)(()=>h?.workspaces.find(e=>e.id===h.current)||null,[h]),N=M?.id||`default`,P=(0,v.useMemo)(()=>`chat-${e}-${N}`,[e,N]),F=()=>ot(`/api/state`).then(c).catch(()=>{}),I=()=>ot(`/api/workspaces?agent_id=${e}`).then(g).catch(()=>{});(0,v.useEffect)(()=>{ot(`/api/workbench?agent_id=${e}`).then(e=>{i(e.dsl),e.dsl&&t(e.dsl.workbench)}),ot(`/api/deployment?agent_id=${e}`).then(e=>{o(e.deployment),m({L0:0,L1:1,L2:2,L3:3}[e.deployment?.default_autonomy||`L2`]??2)}),ot(`/api/panels?with_code=1`).then(e=>u(e.plugins||[])),I(),F();let n=setInterval(F,5e3);return()=>clearInterval(n)},[e]);let L=async t=>{try{g(await st(`/api/workspaces/select`,{agent_id:e,ws_id:t}))}catch(e){Z.error(String(e.message))}},R=async()=>{D(!0);try{let t=await st(`/api/workspaces`,{agent_id:e,name:b||void 0,...S?{path:S}:{}});g(t),y(!1),x(``),C(``),Z.success(`工作区已创建${S?`(登记外部目录)`:``}`),await L(t.workspaces[t.workspaces.length-1].id)}catch(e){Z.error(String(e.message))}finally{D(!1)}},ee=async()=>{if(O)try{g(await lt(`/api/workspaces/${O.id}?agent_id=${e}`,{purge:A})),Z.success(`工作区已删除${A?`(目录已清除)`:`(仅移除登记)`}`),k(null),j(!1)}catch(e){Z.error(String(e.message))}},te=(0,v.useMemo)(()=>r?.panels||[],[r]).filter(e=>e.type===`custom`||e.type===`custom_panel`).map(e=>({panel:e,code:e.type===`custom`?e.code||``:l.find(t=>t.id===e.panel)?.code||``})).filter(e=>e.code),z=t=>({devices:s?.devices||[],alarms:s?.alarms||[],kpi:s?.kpi||{},work_orders:s?.work_orders||[],inspections:s?.inspections||{},selected:d,onSelect:f,agentId:e,store:mt(e,N),runAction:(n,r)=>ht(e,String(t?.id||``),n,r),params:{...t?.params||{},agentId:e,wsId:N}});return!r||!s?(0,K.jsx)(`div`,{className:`flex h-full items-center justify-center text-sm text-muted-foreground`,children:`工作台加载中…`}):(0,K.jsxs)(`div`,{className:`flex h-full flex-col gap-2 overflow-hidden px-4 py-2.5`,children:[(0,K.jsx)(`h1`,{className:`sr-only`,children:r.workbench}),(0,K.jsxs)(`div`,{className:`flex items-center gap-2 text-[11px]`,children:[(0,K.jsx)(J,{variant:`secondary`,className:`h-5 shrink-0 text-[10px]`,children:r.version}),te.length>0&&(0,K.jsxs)(J,{variant:`outline`,className:`h-5 shrink-0 text-[10px] text-violet-400 border-violet-500/40`,children:[(0,K.jsx)(pg,{className:`mr-0.5 h-2.5 w-2.5`}),`插件 ×`,te.length]}),(0,K.jsxs)(`span`,{className:`shrink-0 text-muted-foreground`,children:[a?.name,` · 工具 `,a?.toolset.length,` 个`]}),M&&(0,K.jsxs)(K.Fragment,{children:[(0,K.jsx)(jh,{className:`h-3 w-3 shrink-0 text-muted-foreground`}),(0,K.jsx)(`span`,{className:`min-w-0 flex-1 truncate font-mono text-muted-foreground`,title:M.path,children:M.path}),(0,K.jsx)(`span`,{className:`shrink-0 text-[10px] text-muted-foreground`,children:`(exec 工作目录 · 数据与文件随工作区隔离)`})]}),(0,K.jsxs)(`div`,{className:`ml-auto flex items-center gap-1.5`,children:[(0,K.jsx)(qh,{className:`h-3.5 w-3.5 text-muted-foreground`}),(0,K.jsxs)(h_,{value:N,onValueChange:L,children:[(0,K.jsx)(__,{className:`h-8 w-52 text-xs`,title:M?.path,children:(0,K.jsx)(g_,{children:(0,K.jsx)(`span`,{className:`truncate`,children:M?`${M.name}${M.external?`(外部)`:``}`:`默认工作区`})})}),(0,K.jsx)(v_,{children:(h?.workspaces||[]).map(e=>(0,K.jsx)(y_,{value:e.id,className:`text-xs`,children:(0,K.jsxs)(`span`,{className:`max-w-64 truncate`,title:e.path,children:[e.name,e.external?` · 外部目录`:``,e.id===h?.current?` ✓`:``]})},e.id))})]}),(0,K.jsxs)(Y,{size:`sm`,variant:`outline`,className:`h-8 gap-1 text-xs`,onClick:()=>y(!0),title:`新建工作区(默认目录或自定义路径)`,children:[(0,K.jsx)(Nh,{className:`h-3.5 w-3.5`}),`新建`]}),M&&M.id!=="default"&&(0,K.jsx)(Y,{size:`sm`,variant:`ghost`,className:`h-8 w-8 p-0 text-muted-foreground`,onClick:()=>k(M),title:`删除当前工作区`,children:(0,K.jsx)(qg,{className:`h-3.5 w-3.5`})}),(0,K.jsxs)(Y,{size:`sm`,variant:`outline`,className:`h-8 gap-1 text-xs`,onClick:n,children:[(0,K.jsx)(Dg,{className:`h-3.5 w-3.5`}),`编辑布局`]})]})]}),(0,K.jsx)(`div`,{className:`relative min-h-0 flex-1`,children:(0,K.jsx)(pO,{className:`absolute inset-0 overflow-auto p-0.5`,dsl:r,renderPanel:t=>{let n=te.find(e=>e.panel.id===t.id);return n?(0,K.jsx)(dO,{code:n.code,data:z(t),meta:{agentId:e,panelId:t.id,pluginId:t.panel}},`${t.id}:${N}`):null},renderDialog:()=>(0,K.jsx)(rO,{agentId:e,sessionId:P,wsId:N,injectedDevice:d,autonomy:p,onAutonomy:m},`${e}:${N}`),renderPlaceholder:()=>(0,K.jsx)(`div`,{className:`flex h-full items-center justify-center p-4 text-center text-[11px] text-muted-foreground`,children:`空区块——到「编辑布局」添加插件或让 AI 定制`})})}),(0,K.jsx)(a_,{open:_,onOpenChange:y,children:(0,K.jsxs)(c_,{children:[(0,K.jsx)(l_,{children:(0,K.jsx)(d_,{children:`新建工作区`})}),(0,K.jsxs)(`div`,{className:`space-y-3`,children:[(0,K.jsxs)(`div`,{className:`space-y-1`,children:[(0,K.jsx)(m_,{className:`text-xs`,children:`名称`}),(0,K.jsx)(p_,{value:b,onChange:e=>x(e.target.value),placeholder:`如:产线B改造`,className:`text-xs`})]}),(0,K.jsxs)(`div`,{className:`space-y-1`,children:[(0,K.jsx)(m_,{className:`text-xs`,children:`自定义目录(可选,留空则在平台 workspace 目录下动态新增)`}),(0,K.jsxs)(`div`,{className:`flex gap-1.5`,children:[(0,K.jsx)(p_,{value:S,onChange:e=>C(e.target.value),placeholder:`/Users/you/projects/line-b 或点浏览选择`,className:`font-mono text-xs`}),(0,K.jsxs)(Y,{size:`sm`,variant:`outline`,className:`h-8 shrink-0 gap-1 text-xs`,onClick:()=>T(!0),children:[(0,K.jsx)(jh,{className:`h-3.5 w-3.5`}),`浏览…`]})]}),(0,K.jsx)(`p`,{className:`text-[10px] text-amber-400`,children:`⚠ 助手将能读写该目录(exec 工作目录即此处);目录须已存在,平台不会在其中写入数据库文件。`})]})]}),(0,K.jsxs)(u_,{children:[(0,K.jsx)(Y,{variant:`outline`,disabled:E,onClick:()=>y(!1),children:`取消`}),(0,K.jsx)(Y,{disabled:E,onClick:R,children:E?`创建中…`:`创建并切换`})]}),(0,K.jsx)(hO,{open:w,onOpenChange:T,onPick:e=>C(e)})]})}),(0,K.jsx)(a_,{open:!!O,onOpenChange:e=>{e||(k(null),j(!1))},children:(0,K.jsxs)(c_,{children:[(0,K.jsx)(l_,{children:(0,K.jsxs)(d_,{children:[`删除工作区 · `,O?.name]})}),(0,K.jsxs)(`div`,{className:`space-y-2 text-xs`,children:[(0,K.jsx)(`p`,{className:`font-mono text-[11px] text-muted-foreground`,children:O?.path}),O?.external?(0,K.jsxs)(`p`,{children:[`外部目录工作区:仅移除登记,`,(0,K.jsx)(`b`,{children:`不删除`}),`你的文件;该工作区的数据集库将一并删除。`]}):(0,K.jsxs)(`label`,{className:`flex items-start gap-2 rounded-md border border-red-500/30 bg-red-500/5 p-2.5`,children:[(0,K.jsx)(i_,{checked:A,onCheckedChange:e=>j(!!e)}),(0,K.jsx)(`span`,{children:`同时删除平台目录下的工作区文件夹(数据集库始终删除)`})]})]}),(0,K.jsxs)(u_,{children:[(0,K.jsx)(Y,{variant:`outline`,onClick:()=>k(null),children:`取消`}),(0,K.jsx)(Y,{variant:`destructive`,onClick:ee,children:`确认删除`})]})]})})]})}function _O({className:e,orientation:t=`horizontal`,decorative:n=!0,...r}){return(0,K.jsx)(Fp,{"data-slot":`separator`,decorative:n,orientation:t,className:mn(`shrink-0 bg-border data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px`,e),...r})}function vO({className:e,orientation:t=`horizontal`,...n}){return(0,K.jsx)(lm,{"data-slot":`tabs`,"data-orientation":t,orientation:t,className:mn(`group/tabs flex gap-2 data-[orientation=horizontal]:flex-col`,e),...n})}var yO=yt(`group/tabs-list inline-flex w-fit items-center justify-center rounded-lg p-[3px] text-muted-foreground group-data-[orientation=horizontal]/tabs:h-9 group-data-[orientation=vertical]/tabs:h-fit group-data-[orientation=vertical]/tabs:flex-col data-[variant=line]:rounded-none`,{variants:{variant:{default:`bg-muted`,line:`gap-1 bg-transparent`}},defaultVariants:{variant:`default`}});function bO({className:e,variant:t=`default`,...n}){return(0,K.jsx)(dm,{"data-slot":`tabs-list`,"data-variant":t,className:mn(yO({variant:t}),e),...n})}function xO({className:e,...t}){return(0,K.jsx)(pm,{"data-slot":`tabs-trigger`,className:mn(`relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-2 py-1 text-sm font-medium whitespace-nowrap text-foreground/60 transition-all group-data-[orientation=vertical]/tabs:w-full group-data-[orientation=vertical]/tabs:justify-start hover:text-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-50 group-data-[variant=default]/tabs-list:data-[state=active]:shadow-sm group-data-[variant=line]/tabs-list:data-[state=active]:shadow-none dark:text-muted-foreground dark:hover:text-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4`,`group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-[state=active]:bg-transparent dark:group-data-[variant=line]/tabs-list:data-[state=active]:border-transparent dark:group-data-[variant=line]/tabs-list:data-[state=active]:bg-transparent`,`data-[state=active]:bg-background data-[state=active]:text-foreground dark:data-[state=active]:border-input dark:data-[state=active]:bg-input/30 dark:data-[state=active]:text-foreground`,`after:absolute after:bg-foreground after:opacity-0 after:transition-opacity group-data-[orientation=horizontal]/tabs:after:inset-x-0 group-data-[orientation=horizontal]/tabs:after:bottom-[-5px] group-data-[orientation=horizontal]/tabs:after:h-0.5 group-data-[orientation=vertical]/tabs:after:inset-y-0 group-data-[orientation=vertical]/tabs:after:-right-1 group-data-[orientation=vertical]/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-[state=active]:after:opacity-100`,e),...t})}function SO({className:e,...t}){return(0,K.jsx)(hm,{"data-slot":`tabs-content`,className:mn(`flex-1 outline-none`,e),...t})}function CO({...e}){return(0,K.jsx)(gd,{"data-slot":`dropdown-menu`,...e})}function wO({...e}){return(0,K.jsx)(vd,{"data-slot":`dropdown-menu-trigger`,...e})}function TO({className:e,sideOffset:t=4,...n}){return(0,K.jsx)(yd,{children:(0,K.jsx)(xd,{"data-slot":`dropdown-menu-content`,sideOffset:t,className:mn(`z-50 min-w-36 overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95`,e),...n})})}function EO({className:e,...t}){return(0,K.jsx)(Sd,{"data-slot":`dropdown-menu-item`,className:mn(`relative flex cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-1.5 text-xs outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:h-3.5 [&_svg]:w-3.5 [&_svg]:shrink-0`,e),...t})}function DO({className:e,...t}){return(0,K.jsx)(Cd,{"data-slot":`dropdown-menu-separator`,className:mn(`-mx-1 my-1 h-px bg-border`,e),...t})}async function OO(e,t){let n=e.usage.length?`插件「${e.name}」被 ${e.usage.length} 处引用,删除将从这些工作台摘除该面板。确认删除?`:`删除插件「${e.name}」?`;if(window.confirm(n))try{await lt(`/api/panels`,{id:e.id,force:!0}),Z.success(`已删除`),t()}catch(e){Z.error(String(e.message))}}function kO({target:e,onClose:t,agents:n}){let[r,i]=(0,v.useState)(null),[a,o]=(0,v.useState)(``),[s,c]=(0,v.useState)(!0),[l,u]=(0,v.useState)(!1);(0,v.useEffect)(()=>{if(!e){i(null);return}let n=e.type===`panel`?`id=${encodeURIComponent(e.id||``)}`:`agentId=${encodeURIComponent(e.agentId||``)}`;ot(`/api/assets/preview?type=${e.type}&${n}`).then(e=>{i(e),o(e.name)}).catch(e=>{Z.error(String(e.message)),t()})},[e]);let d=async()=>{if(e){u(!0);try{let n=await st(`/api/assets/share`,{type:e.type,id:e.id,agentId:e.agentId,name:a,bind_agent:s&&e.agentId?e.agentId:void 0}),i=r?.manifest.requires.apis.length||0,o=r?.manifest.requires.actions.length||0;Z.success(`已发布 ${n.name}@${n.version}${n.bound?`,已绑定到助手`:``}`,{description:`外部 API ×${i} · 交互脚本 ×${o}${o?`(命令全文已在 ARM 资产包 SKILL.md 留档)`:``}`}),t()}catch(e){Z.error(String(e.message))}finally{u(!1)}}};if(!e)return null;let f=r?.manifest.requires;return(0,K.jsx)(a_,{open:!!e,onOpenChange:e=>{!e&&!l&&t()},children:(0,K.jsxs)(c_,{children:[(0,K.jsx)(l_,{children:(0,K.jsxs)(d_,{className:`flex items-center gap-2`,children:[(0,K.jsx)(_h,{className:`h-4 w-4 text-primary`}),`发布为 UI 资产 · `,e.title]})}),(0,K.jsx)(eO,{className:`max-h-96`,children:(0,K.jsxs)(`div`,{className:`space-y-3 pr-2 text-xs`,children:[(0,K.jsxs)(`div`,{className:`space-y-1`,children:[(0,K.jsx)(m_,{className:`text-xs`,children:`资产名(全局唯一锚,同名发布追加新版本)`}),(0,K.jsx)(p_,{value:a,onChange:e=>o(e.target.value),className:`font-mono text-xs`})]}),r&&(0,K.jsxs)(K.Fragment,{children:[(0,K.jsxs)(`div`,{className:`rounded-md border bg-muted/30 p-2.5`,children:[(0,K.jsx)(`div`,{className:`font-medium`,children:`包含内容`}),(0,K.jsxs)(`div`,{className:`mt-1 text-muted-foreground`,children:[`面板插件:`,r.manifest.provides.panels.join(`、`)||`无`,(0,K.jsx)(`br`,{}),`数据集 schema:`,r.manifest.provides.collections.join(`、`)||`无`,`(仅建表定义,不含数据)`,r.manifest.provides.workbench&&(0,K.jsxs)(K.Fragment,{children:[(0,K.jsx)(`br`,{}),`工作台 DSL:workbench.json`]})]}),(0,K.jsx)(`div`,{className:`mt-1 font-mono text-[10px] text-muted-foreground`,children:r.files.join(` · `)})]}),!!f?.apis.length&&(0,K.jsxs)(`div`,{className:`rounded-md border border-blue-500/30 bg-blue-500/5 p-2.5`,children:[(0,K.jsx)(`div`,{className:`font-medium text-blue-300`,children:`外部 API 依赖(安装后环境需可达)`}),(0,K.jsx)(`ul`,{className:`mt-1 list-disc pl-4 text-muted-foreground`,children:f.apis.map(e=>(0,K.jsxs)(`li`,{children:[(0,K.jsx)(`span`,{className:`font-mono`,children:e.host}),`:`,e.usage]},e.host))})]}),!!f?.actions.length&&(0,K.jsxs)(`div`,{className:`rounded-md border border-amber-500/30 bg-amber-500/5 p-2.5`,children:[(0,K.jsx)(`div`,{className:`font-medium text-amber-300`,children:`交互脚本(真实 shell 命令,随包公开)`}),(0,K.jsx)(`ul`,{className:`mt-1 space-y-1`,children:f.actions.map(e=>(0,K.jsxs)(`li`,{className:`text-muted-foreground`,children:[`[`,e.panel,`/`,e.id,`] `,e.label,e.has_credentials&&(0,K.jsx)(J,{className:`ml-1 h-4 bg-amber-500/15 px-1 text-[9px] text-amber-300`,children:`⚠️ 疑似含凭据`}),(0,K.jsx)(`div`,{className:`mt-0.5 break-all rounded bg-muted/50 p-1 font-mono text-[10px]`,children:e.exec})]},`${e.panel}/${e.id}`))}),(0,K.jsx)(`p`,{className:`mt-1.5 text-[10px] text-amber-400`,children:`命令明文将进入资产包——含密码/令牌的命令请先改用环境变量或凭据占位,再发布。`})]}),e.agentId&&n&&n.length>0&&(0,K.jsxs)(`label`,{className:`flex items-center gap-2 rounded-md border p-2.5`,children:[(0,K.jsx)(i_,{checked:s,onCheckedChange:e=>c(!!e)}),(0,K.jsx)(`span`,{children:`发布后同时绑定到当前助手(下载该助手的其他现场将自动物化此工作台)`})]})]})]})}),(0,K.jsxs)(u_,{children:[(0,K.jsx)(Y,{variant:`outline`,disabled:l,onClick:t,children:`取消`}),(0,K.jsx)(Y,{disabled:l||!a,onClick:d,children:l?`发布中…`:`发布到 ARM`})]})]})})}function AO({open:e,onClose:t,onInstalled:n,agents:r}){let[i,a]=(0,v.useState)(``),[o,s]=(0,v.useState)([]),[c,l]=(0,v.useState)(!1),[u,d]=(0,v.useState)(null),[f,p]=(0,v.useState)(``),m=(0,v.useRef)(0);(0,v.useEffect)(()=>{if(!e)return;let t=setTimeout(()=>{let e=++m.current;l(!0),ot(`/api/assets/arm-library${i?`?keyword=${encodeURIComponent(i)}`:``}`).then(t=>{e===m.current&&s(t.items||[])}).catch(e=>Z.error(String(e.message))).finally(()=>{e===m.current&&l(!1)})},400);return()=>clearTimeout(t)},[i,e]),(0,v.useEffect)(()=>{e&&!f&&r.length&&p(r[0].agent_id)},[e,r]);let h=async e=>{if(e.asset_type===`workbench`&&!f)Z.warning(`请先选择目标助手`);else{d(e.name);try{let r=await st(`/api/assets/install`,{name:e.name,agentId:e.asset_type===`workbench`?f:void 0}),i=r.workbench?`,工作台已导入为草稿(审阅后在「定制工作台」发布)`:``,a=r.skipped_collections.length?`;同名数据集保留本地:${r.skipped_collections.join(`、`)}`:``;Z.success(`已安装 ${e.name}:面板 ×${r.panels.length}${i}${a}`),n(),t()}catch(e){Z.error(String(e.message))}finally{d(null)}}};return(0,K.jsx)(a_,{open:e,onOpenChange:e=>{!e&&!u&&t()},children:(0,K.jsxs)(c_,{children:[(0,K.jsx)(l_,{children:(0,K.jsxs)(d_,{className:`flex items-center gap-2`,children:[(0,K.jsx)(Yh,{className:`h-4 w-4 text-primary`}),`从 ARM 安装 UI 资产`]})}),(0,K.jsxs)(`div`,{className:`relative`,children:[(0,K.jsx)(xg,{className:`absolute left-3 top-2.5 h-3.5 w-3.5 text-muted-foreground`}),(0,K.jsx)(p_,{placeholder:`搜索资产名 / 描述…`,value:i,onChange:e=>a(e.target.value),className:`pl-9`,autoFocus:!0})]}),(0,K.jsxs)(`div`,{className:`flex items-center gap-2 text-xs text-muted-foreground`,children:[(0,K.jsx)(`span`,{className:`shrink-0`,children:`工作台资产安装到:`}),(0,K.jsx)(`select`,{value:f,onChange:e=>p(e.target.value),className:`h-8 flex-1 rounded-md border bg-background px-2 text-xs`,children:r.map(e=>(0,K.jsx)(`option`,{value:e.agent_id,children:e.name},e.agent_id))})]}),(0,K.jsx)(eO,{className:`max-h-80`,children:(0,K.jsxs)(`div`,{className:`space-y-1.5 pr-2`,children:[c&&!o.length&&(0,K.jsx)(`div`,{className:`py-6 text-center text-xs text-muted-foreground`,children:`加载中…`}),!c&&!o.length&&(0,K.jsx)(`div`,{className:`py-6 text-center text-xs text-muted-foreground`,children:i?`没有匹配资产`:`ARM 上暂无 UI 资产`}),o.map(e=>(0,K.jsxs)(`div`,{className:`flex items-center gap-2.5 rounded-md border p-2.5`,children:[e.asset_type===`workbench`?(0,K.jsx)(Yh,{className:`h-4 w-4 shrink-0 text-violet-400`}):(0,K.jsx)(pg,{className:`h-4 w-4 shrink-0 text-primary`}),(0,K.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,K.jsxs)(`div`,{className:`flex items-center gap-1.5 text-xs font-medium`,children:[(0,K.jsx)(`span`,{className:`truncate font-mono`,children:e.name}),e.latest_version&&(0,K.jsx)(J,{variant:`secondary`,className:`h-4 px-1 text-[9px]`,children:e.latest_version}),e.installed&&(0,K.jsx)(J,{className:`h-4 bg-emerald-500/15 px-1 text-[9px] text-emerald-400`,children:`本地已有`}),e.upgrade_available&&(0,K.jsx)(J,{className:`h-4 bg-amber-500/15 px-1 text-[9px] text-amber-300`,children:`⤴ 可升级`})]}),(0,K.jsxs)(`div`,{className:`truncate text-[10px] text-muted-foreground`,children:[e.description||`—`,` · 下载 `,e.download_count,` 次 · `,e.publisher]})]}),(0,K.jsx)(Y,{size:`sm`,variant:`secondary`,className:`h-7 text-[11px]`,disabled:u!==null,onClick:()=>h(e),children:u===e.name?`安装中…`:`安装`})]},e.name))]})}),(0,K.jsx)(u_,{children:(0,K.jsx)(Y,{variant:`outline`,onClick:t,children:`关闭`})})]})})}function jO(){let[e,t]=(0,v.useState)(null),[n,r]=(0,v.useState)(null),[i,a]=(0,v.useState)(!1),[o,s]=(0,v.useState)([]),c=()=>ot(`/api/plugins/center`).then(t);if((0,v.useEffect)(()=>{c(),ot(`/api/agents`).then(e=>s((e.agents||[]).filter(e=>e.installed).map(({agent_id:e,name:t})=>({agent_id:e,name:t})))).catch(()=>{})},[]),!e)return(0,K.jsx)(`div`,{className:`flex h-full items-center justify-center text-sm text-muted-foreground`,children:`插件中心加载中…`});let l=async(e,t,n)=>{let r=n===`deprecated`?`active`:`deprecated`;try{await st(`/api/plugins/lifecycle`,{kind:e,id:t,status:r}),Z.success(r===`deprecated`?`已停用(存量引用仍可渲染,新增被阻止)`:`已恢复`),c()}catch(e){Z.error(String(e.message))}},u=({icon:e,name:t,sub:n,status:r,usage:i,onToggle:a,tag:o,onDelete:s,onShare:c,armRef:l})=>(0,K.jsxs)(`div`,{className:`flex items-center gap-2.5 rounded-md border p-2.5`,children:[(0,K.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,K.jsxs)(`div`,{className:`flex items-center gap-1.5 text-xs font-medium`,children:[e,t,(0,K.jsx)(J,{variant:`secondary`,className:`h-4 px-1 text-[9px]`,children:o}),(0,K.jsx)(J,{className:`h-4 px-1 text-[9px] ${r===`deprecated`?`bg-red-500/15 text-red-400 hover:bg-red-500/25`:`bg-emerald-500/15 text-emerald-400 hover:bg-emerald-500/25`}`,children:r===`deprecated`?`已停用`:`在用`}),l&&(0,K.jsxs)(J,{className:`h-4 bg-violet-500/15 px-1 text-[9px] text-violet-300`,title:`ARM ${l.skill_name}@${l.version||``}`,children:[`已发布`,l.version?` ${l.version}`:``]})]}),(0,K.jsx)(`div`,{className:`truncate text-[10px] text-muted-foreground`,children:n}),(0,K.jsxs)(`div`,{className:`mt-0.5 text-[10px] text-muted-foreground`,children:[`引用:`,i.length?i.map(e=>`${e.agent}${e.draft?`*`:``}`).join(`、`):`无`]})]}),c&&(0,K.jsxs)(Y,{size:`sm`,variant:`ghost`,className:`h-7 text-[11px] text-violet-400`,onClick:c,title:`发布到 ARM UI 资产市场`,children:[(0,K.jsx)(_h,{className:`h-3 w-3`}),l?`更新`:`发布`]}),s&&(0,K.jsx)(Y,{size:`sm`,variant:`ghost`,className:`h-7 text-[11px] text-red-400`,onClick:s,children:`删除`}),(0,K.jsx)(Y,{size:`sm`,variant:r===`deprecated`?`secondary`:`ghost`,className:`h-7 text-[11px] ${r===`deprecated`?``:`text-red-400`}`,onClick:a,children:r===`deprecated`?`恢复`:`停用`})]});return(0,K.jsxs)(`div`,{className:`h-full overflow-auto p-5`,children:[(0,K.jsxs)(`div`,{className:`mb-4`,children:[(0,K.jsxs)(`h1`,{className:`flex items-center gap-2 text-lg font-bold`,children:[(0,K.jsx)(pg,{className:`h-5 w-5 text-primary`}),`插件中心`]}),(0,K.jsxs)(`p`,{className:`mt-0.5 text-xs text-muted-foreground`,children:[`统一注册表:系统面板与契约插件同源治理 · 生命周期(在用/停用)· 引用追踪(* 为草稿引用)· `,(0,K.jsx)(`span`,{className:`text-violet-400`,children:`发布/安装 ARM UI 资产(三资产模型)`})]})]}),(0,K.jsxs)(`div`,{className:`grid grid-cols-2 gap-4`,children:[(0,K.jsxs)(bm,{className:`py-0`,children:[(0,K.jsx)(xm,{className:`border-b py-2.5`,children:(0,K.jsxs)(Sm,{className:`flex items-center gap-1.5 text-xs`,children:[(0,K.jsx)(Dh,{className:`h-3.5 w-3.5`}),`系统插件(平台预装)`]})}),(0,K.jsx)(Cm,{className:`p-3`,children:(0,K.jsx)(`div`,{className:`space-y-1.5`,children:e.system.map(e=>(0,K.jsx)(u,{icon:(0,K.jsx)(`span`,{className:`font-mono text-[10px] text-muted-foreground`,children:e.id}),name:e.name,sub:e.note,status:e.status,usage:e.usage,tag:`system`,onToggle:()=>l(`system`,e.id,e.status)},e.id))})})]}),(0,K.jsxs)(bm,{className:`py-0`,children:[(0,K.jsx)(xm,{className:`border-b py-2.5`,children:(0,K.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,K.jsxs)(Sm,{className:`flex items-center gap-1.5 text-xs`,children:[(0,K.jsx)(th,{className:`h-3.5 w-3.5`}),`插件库(AI 开发 / 人工沉淀)`]}),(0,K.jsxs)(Y,{size:`sm`,variant:`outline`,className:`h-7 gap-1 text-[11px]`,onClick:()=>a(!0),children:[(0,K.jsx)(Yh,{className:`h-3 w-3`}),`从 ARM 安装`]})]})}),(0,K.jsx)(Cm,{className:`p-3`,children:(0,K.jsxs)(`div`,{className:`space-y-1.5`,children:[e.library.map(e=>(0,K.jsx)(u,{icon:(0,K.jsx)(pg,{className:`h-3 w-3 text-primary`}),name:`${e.name} ${e.version}`,sub:`${e.author===`ai`?`AI 开发`:e.author===`arm`?`ARM 安装`:`人工`} · ${e.description||e.id}`,status:e.status,usage:e.usage,tag:e.author===`ai`?`ai`:e.author===`arm`?`arm`:`human`,onToggle:()=>l(`plugin`,e.id,e.status),onDelete:()=>OO(e,c),onShare:()=>r({type:`panel`,id:e.id,title:e.name}),armRef:e.arm_ref},e.id)),e.library.length===0&&(0,K.jsx)(`div`,{className:`py-6 text-center text-xs text-muted-foreground`,children:`插件库为空`})]})})]})]}),(0,K.jsx)(_O,{className:`my-4`}),(0,K.jsxs)(bm,{className:`py-0`,children:[(0,K.jsx)(xm,{className:`border-b py-2.5`,children:(0,K.jsxs)(Sm,{className:`flex items-center gap-1.5 text-xs`,children:[(0,K.jsx)(Ng,{className:`h-3.5 w-3.5`}),`治理策略`]})}),(0,K.jsx)(Cm,{className:`p-3 text-[11px] leading-relaxed text-muted-foreground`,children:(0,K.jsx)(eO,{className:`max-h-40`,children:(0,K.jsxs)(`ul`,{className:`list-disc space-y-1 pl-4`,children:[(0,K.jsx)(`li`,{children:`一切面板进同一注册表:系统插件也有 manifest 与生命周期,不再是编译进前端的二等公民`}),(0,K.jsx)(`li`,{children:`停用(deprecate)不破坏存量:已引用的工作台继续渲染,但编辑器「添加面板」不再出现——安全下线`}),(0,K.jsx)(`li`,{children:`入库强制过校验器(check-panel.mjs):编译/契约/沙箱/模板四关 + 质量警告入审计——ARM 安装的插件同样过检`}),(0,K.jsx)(`li`,{children:`出网最小化:/api/proxy 仅放行插件代码中声明过的主机(防止面板成为任意内网跳板)`}),(0,K.jsx)(`li`,{children:`版本化与回滚:插件独立版本(同 id 覆盖自增),工作台按 id 引用,升级即时生效可回滚`}),(0,K.jsx)(`li`,{children:`数据隔离:插件数据集按助手分库(store-助手ID.db),共享需显式 scope=shared;资产包只带 schema 不带数据`}),(0,K.jsx)(`li`,{children:`UI 资产四红线(docs/08):包非运行时 · 数据必走 collection · 外部依赖必声明 · 单向 DAG`})]})})})]}),(0,K.jsx)(kO,{target:n,onClose:()=>{r(null),c()},agents:o}),(0,K.jsx)(AO,{open:i,onClose:()=>a(!1),onInstalled:c,agents:o})]})}function MO({pluginId:e,onRollback:t}){let[n,r]=(0,v.useState)(null);return(0,v.useEffect)(()=>{e&&ot(`/api/panels?id=${e}`).then(e=>r(e.plugin)).catch(()=>r(null))},[e]),n?(0,K.jsxs)(`div`,{className:`space-y-1`,children:[(0,K.jsxs)(`div`,{className:`flex items-center gap-1.5 text-[11px]`,children:[(0,K.jsx)(`span`,{className:`font-mono`,children:n.version}),(0,K.jsx)(`span`,{className:`text-muted-foreground`,children:`(当前)`})]}),(n.history||[]).slice().reverse().map(n=>(0,K.jsxs)(`div`,{className:`flex items-center gap-2 text-[11px]`,children:[(0,K.jsx)(`span`,{className:`font-mono`,children:n.version}),(0,K.jsx)(`span`,{className:`text-[10px] text-muted-foreground`,children:gt(n.at,`dts`)}),(0,K.jsx)(Y,{size:`sm`,variant:`ghost`,className:`ml-auto h-6 text-[10px]`,onClick:()=>t(e,n.version),children:`回退`})]},n.version)),!(n.history||[]).length&&(0,K.jsx)(`div`,{className:`text-[10px] text-muted-foreground`,children:`无历史版本`})]}):(0,K.jsx)(`div`,{className:`text-[10px] text-muted-foreground`,children:`(插件信息加载中…)`})}var NO=e=>({x:1,y:e.reduce((e,t)=>Math.max(e,t.grid?t.grid.y+t.grid.h-1:0),0)+1,w:6,h:1});function PO({agentId:e}){let[t,n]=(0,v.useState)(null),[r,i]=(0,v.useState)(!1),[a,o]=(0,v.useState)([]),[s,c]=(0,v.useState)(``),[l,u]=(0,v.useState)(!1),[d,f]=(0,v.useState)([]),[p,m]=(0,v.useState)(!1),[h,g]=(0,v.useState)(null),[_,y]=(0,v.useState)(null),[b,x]=(0,v.useState)(!1),[S,C]=(0,v.useState)(0),[w,T]=(0,v.useState)(null),[E,D]=(0,v.useState)([]),[O,k]=(0,v.useState)(null),A=(0,v.useRef)(`dev-${e.slice(0,8)}`).current,j=(0,v.useRef)(null),[M,N]=(0,v.useState)([]),[P,F]=(0,v.useState)(``),[I,L]=(0,v.useState)(!1),[R,ee]=(0,v.useState)(``),[te,z]=(0,v.useState)(null),[ne,re]=(0,v.useState)(!1),[ie,ae]=(0,v.useState)(null),oe=(0,v.useRef)(null),se=(0,v.useRef)(!0),ce=(0,v.useCallback)(()=>{let e=oe.current?.closest(`[data-slot="scroll-area-viewport"]`);e&&(e.scrollTop=e.scrollHeight)},[]);(0,v.useEffect)(()=>{let e=oe.current?.closest(`[data-slot="scroll-area-viewport"]`);if(!e)return;let t=()=>{se.current=e.scrollHeight-e.scrollTop-e.clientHeight<80};return e.addEventListener(`scroll`,t),()=>e.removeEventListener(`scroll`,t)},[]),(0,v.useEffect)(()=>{se.current&&ce()},[M,I,R,ce]);let le=()=>{ot(`/api/workbench?agent_id=${e}&draft=1`).then(e=>{n(e.dsl),i(e.isDraft),o(e.versions||[]),c(JSON.stringify(e.dsl,null,2))}),ot(`/api/panels`).then(e=>f(e.plugins||[]))};if((0,v.useEffect)(()=>{le()},[e]),(0,v.useEffect)(()=>{let e=()=>ot(`/api/state`).then(T).catch(()=>{});e();let t=setInterval(e,5e3);return ot(`/api/panels?with_code=1`).then(e=>D(e.plugins||[])),()=>clearInterval(t)},[]),!t)return(0,K.jsx)(`div`,{className:`flex h-full items-center justify-center text-sm text-muted-foreground`,children:`加载工作台 DSL…`});let B=t.panels,V=_===null?null:B[_],H=e=>{let r=JSON.parse(JSON.stringify(t));e(r),n(r),c(JSON.stringify(r,null,2)),i(!0)},ue=(e,t)=>H(n=>{let r=n.panels[e].grid||{x:1,y:1,w:6,h:1};n.panels[e].grid={...r,...t}}),de=t=>({devices:w?.devices||[],alarms:w?.alarms||[],kpi:w?.kpi||{},work_orders:w?.work_orders||[],inspections:w?.inspections||{},selected:O,onSelect:k,agentId:e,store:mt(e),runAction:(n,r)=>ht(e,String(t.id),n,r),params:{...t.params||{},agentId:e,wsId:`default`}}),fe=e=>e.type===`custom`?e.code:E.find(t=>t.id===e.panel)?.code||``,pe=()=>H(e=>e.panels.push({id:`block_${Math.random().toString(36).slice(2,6)}`,type:`placeholder`,title:`空区块`,grid:NO(e.panels)})),me=(e,t)=>{H(n=>{if(e!==null&&e<n.panels.length){let r=n.panels[e];Object.assign(r,{type:`custom_panel`,panel:t.id,title:r.title===`空区块`?t.name:r.title})}else n.panels.push({id:`plug_${t.id}_${Math.random().toString(36).slice(2,5)}`,type:`custom_panel`,title:t.name,panel:t.id,grid:NO(n.panels)})}),m(!1),g(null),Z.success(`已插入「${t.name}」(草稿,待发布)`)},he=async e=>{let t=B[e];z(e);let n=``;try{let e=t.panel||t.id,r=await ot(`/api/panel-errors?key=${encodeURIComponent(e)}`);n=r.errors?.length?r.errors.map(e=>`[${e.kind}] ${e.message}`).join(` | `):``}catch{}F(`请调试该插件:${n?`最近运行错误:${n}。`:`暂无上报错误,请先 read_panel_plugin 审代码,重点检查结果处理与错误路径。`}请定位根因、修复并说明验证方式。`),Z.info(`已锁定调试目标并带上错误上下文,发送即开始`)},ge=async(e,t)=>{try{let n=await st(`/api/panels/rollback`,{id:e,version:t});Z.success(`已回退到 ${t}(新版本号 ${n.plugin.version},引用即时生效)`),le()}catch(e){Z.error(String(e.message))}},_e=()=>{if(te===null||!B[te])return``;let e=B[te],t=e.grid||{x:1,y:1,w:6,h:1},n=Math.round(t.w/12*100),r=t.w<=3?`窄条(紧凑单列列表/迷你卡)`:t.w>=9?`宽区块(表格/多列仪表)`:`中等宽度(两列卡/紧凑表)`;return`【定制目标】区块「${e.title}」(id=${e.id}):第${t.x}列起、跨${t.w}列(约${n}%宽)、跨${t.h}行(${r})。${e.panel?`当前引用插件 ${e.panel}——先 read_panel_plugin 再决定改造还是重写。`:`空区块,可新建插件。`}`},ve=e=>{z(e),F(``),Z.info(`已锁定定制目标「${B[e].title}」——在右侧描述需求即可`)},ye=async()=>{u(!0);try{let r=await ct(`/api/workbench`,{agent_id:e,dsl:t});n(r.dsl),o(r.versions),c(JSON.stringify(r.dsl,null,2)),i(!1),re(!1),Z.success(`已发布 ${r.dsl.version},工作台即时生效`)}catch(e){Z.error(String(e.message))}finally{u(!1)}},be=async()=>{await lt(`/api/workbench/draft`,{agent_id:e}),Z.success(`已放弃草稿`),le()},xe=async t=>{try{let r=await st(`/api/workbench/rollback`,{agent_id:e,version:t});n(r.dsl),o(r.versions),c(JSON.stringify(r.dsl,null,2)),i(!1),Z.success(`已回滚到 ${t}`)}catch(e){Z.error(String(e.message))}},U=()=>{j.current?.abort()},Se=async()=>{let t=P.trim();if(!t||I)return;let n=_e()?`${_e()}\n需求:${t}`:t;F(``),L(!0),re(!1),se.current=!0,N(e=>[...e,{role:`user`,text:t}]);let r=!1,i=new AbortController;j.current=i;try{await ut(`/api/dev/chat`,{sessionId:A,agentId:e,message:n},e=>{let t=e.type;t===`status`?ee(String(e.text||``)):t===`text_delta`?(ee(``),N(t=>{let n=t[t.length-1];return n?.role===`agent`&&n.streaming?[...t.slice(0,-1),{...n,text:n.text+String(e.delta)}]:[...t,{role:`agent`,text:String(e.delta),streaming:!0}]})):t===`tool_start`?(r=!0,N(t=>[...t,{role:`agent`,text:``,streaming:!1,events:[{tool:String(e.tool),args:e.args||{}}]}])):t===`tool_end`?N(t=>{for(let n=t.length-1;n>=0;n--){let r=t[n];if(r.role===`agent`&&r.events){for(let n=r.events.length-1;n>=0;n--)if(r.events[n].tool===e.tool&&r.events[n].result===void 0)return r.events[n].result=String(e.result||``),r.events[n].ok=e.ok!==!1,[...t]}}return t}):t===`interrupted`?(ee(``),N(e=>[...e,{role:`agent`,text:`(已中断)`}])):t===`meta`?e.hasDraft?(re(!0),le()):r&&le():t===`error`&&Z.error(String(e.message))},i.signal)}catch(e){i.signal.aborted?N(e=>[...e,{role:`agent`,text:`(已中断)`}]):N(t=>[...t,{role:`agent`,text:`❌ ${String(e.message)}`}])}finally{ee(``),L(!1),j.current===i&&(j.current=null)}};return(0,K.jsxs)(`div`,{className:`flex h-full flex-col gap-3 overflow-hidden p-5`,children:[(0,K.jsxs)(`div`,{className:`flex shrink-0 items-end justify-between`,children:[(0,K.jsxs)(`div`,{children:[(0,K.jsx)(`h1`,{className:`text-lg font-bold`,children:`定制工作台`}),(0,K.jsx)(`p`,{className:`mt-0.5 text-xs text-muted-foreground`,children:`区块你规划 · 插件按区块占比定制 · 一切修改走草稿审阅发布`})]}),(0,K.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,K.jsx)(J,{variant:`secondary`,children:r?`草稿(未发布)`:`线上 ${t.version}`}),(0,K.jsxs)(Y,{size:`sm`,variant:`outline`,onClick:()=>{g(null),m(!0)},children:[(0,K.jsx)(pg,{className:`mr-1 h-3.5 w-3.5`}),`插件库`]}),(0,K.jsxs)(Y,{size:`sm`,variant:`outline`,title:`把当前工作台(含依赖插件/数据集 schema/交互脚本)发布为 ARM UI 资产`,onClick:()=>ae({type:`workbench`,agentId:e,title:t.workbench}),children:[(0,K.jsx)(_h,{className:`mr-1 h-3.5 w-3.5 text-violet-400`}),`导出资产`]}),(0,K.jsxs)(Y,{size:`sm`,disabled:l||!r,onClick:ye,children:[(0,K.jsx)(yg,{className:`mr-1 h-3.5 w-3.5`}),l?`发布中…`:`审阅后发布`]})]})]}),r&&(0,K.jsxs)(`div`,{className:`flex shrink-0 items-center gap-2 rounded-md border border-amber-500/50 bg-amber-500/10 px-3 py-2 text-xs text-amber-300`,children:[(0,K.jsx)(`span`,{children:`⚠`}),`草稿未发布——审阅后发布生效,或`,(0,K.jsx)(`button`,{className:`underline underline-offset-2`,onClick:be,children:`放弃草稿`})]}),(0,K.jsxs)(`div`,{className:`grid min-h-0 flex-1 grid-cols-[1fr_380px] gap-4`,children:[(0,K.jsx)(`div`,{className:`flex min-h-0 flex-col`,children:(0,K.jsxs)(vO,{defaultValue:`canvas`,className:`flex min-h-0 flex-1 flex-col`,children:[(0,K.jsxs)(bO,{className:`shrink-0`,children:[(0,K.jsxs)(xO,{value:`canvas`,className:`text-xs`,children:[(0,K.jsx)(Yh,{className:`mr-1 h-3.5 w-3.5`}),`布局画布`]}),(0,K.jsx)(xO,{value:`json`,className:`text-xs`,children:`JSON`})]}),(0,K.jsxs)(SO,{value:`canvas`,className:`mt-2 flex min-h-0 flex-1 flex-col gap-2`,children:[(0,K.jsxs)(`div`,{className:`flex shrink-0 flex-nowrap items-center gap-1.5 overflow-x-auto rounded-md border bg-card p-2`,children:[(0,K.jsxs)(Y,{size:`sm`,variant:`secondary`,className:`h-7 shrink-0 text-xs`,onClick:pe,children:[(0,K.jsx)(dg,{className:`mr-1 h-3 w-3`}),`添加区块`]}),(0,K.jsx)(_O,{orientation:`vertical`,className:`mx-1 h-5 shrink-0`}),V?(0,K.jsxs)(K.Fragment,{children:[(0,K.jsxs)(`span`,{className:`max-w-28 shrink-0 truncate text-[11px] text-muted-foreground`,title:V.title,children:[`「`,V.title,`」`]}),(0,K.jsx)(`span`,{className:`shrink-0 text-[11px]`,children:`列`}),(0,K.jsx)(Y,{size:`icon`,variant:`ghost`,className:`h-7 w-7 shrink-0`,title:`左移一列`,onClick:()=>ue(_,{x:Math.max(1,(V.grid?.x||1)-1)}),children:(0,K.jsx)(qm,{className:`h-3 w-3`})}),(0,K.jsx)(Y,{size:`icon`,variant:`ghost`,className:`h-7 w-7 shrink-0`,title:`右移一列`,onClick:()=>ue(_,{x:Math.min(12,(V.grid?.x||1)+1)}),children:(0,K.jsx)(Ym,{className:`h-3 w-3`})}),(0,K.jsx)(`span`,{className:`shrink-0 text-[11px]`,children:`跨列`}),(0,K.jsx)(Y,{size:`icon`,variant:`ghost`,className:`h-7 w-7 shrink-0`,title:`跨列减一`,onClick:()=>ue(_,{w:Math.max(1,(V.grid?.w||6)-1)}),children:`−`}),(0,K.jsx)(Y,{size:`icon`,variant:`ghost`,className:`h-7 w-7 shrink-0`,title:`跨列加一`,onClick:()=>ue(_,{w:Math.min(12,(V.grid?.w||6)+1)}),children:`+`}),(0,K.jsx)(`span`,{className:`shrink-0 text-[11px]`,children:`跨行`}),(0,K.jsx)(Y,{size:`icon`,variant:`ghost`,className:`h-7 w-7 shrink-0`,title:`跨行减一`,onClick:()=>ue(_,{h:Math.max(1,(V.grid?.h||1)-1)}),children:(0,K.jsx)(Zm,{className:`h-3 w-3`})}),(0,K.jsx)(Y,{size:`icon`,variant:`ghost`,className:`h-7 w-7 shrink-0`,title:`跨行加一`,onClick:()=>ue(_,{h:Math.min(8,(V.grid?.h||1)+1)}),children:(0,K.jsx)(Gm,{className:`h-3 w-3`})}),(0,K.jsxs)(Y,{size:`sm`,variant:`ghost`,className:`h-7 shrink-0 text-xs text-primary`,onClick:()=>ve(_),children:[(0,K.jsx)(th,{className:`mr-1 h-3 w-3`}),`AI 定制`]}),(0,K.jsxs)(CO,{children:[(0,K.jsx)(wO,{asChild:!0,children:(0,K.jsxs)(Y,{size:`sm`,variant:`ghost`,className:`h-7 shrink-0 text-xs`,children:[(0,K.jsx)(Th,{className:`h-3 w-3`}),`更多`]})}),(0,K.jsxs)(TO,{align:`end`,children:[(V.type===`custom`||V.type===`custom_panel`)&&(0,K.jsxs)(EO,{className:`text-amber-400 focus:text-amber-300`,onClick:()=>he(_),children:[(0,K.jsx)(t_,{}),`AI 调试`]}),(0,K.jsxs)(EO,{onClick:()=>ue(_,{x:1,w:12}),children:[(0,K.jsx)(Ug,{className:`text-muted-foreground`}),`占满宽度`]}),(0,K.jsxs)(EO,{onClick:()=>{let e=B.reduce((e,t)=>Math.max(e,(t.grid?.y||1)+(t.grid?.h||1)-1),1);ue(_,{h:Math.max(1,e-(V.grid?.y||1)+1)})},children:[(0,K.jsx)(Gg,{className:`text-muted-foreground`}),`延到底部`]}),(0,K.jsxs)(EO,{onClick:()=>ue(_,{x:1}),children:[(0,K.jsx)(Um,{className:`text-muted-foreground`}),`贴左`]}),(0,K.jsxs)(EO,{onClick:()=>ue(_,{x:12-(V.grid?.w||6)+1}),children:[(0,K.jsx)(Vm,{className:`text-muted-foreground`}),`贴右`]}),(0,K.jsx)(DO,{}),(0,K.jsxs)(EO,{onClick:()=>{g(_),m(!0)},children:[(0,K.jsx)(pg,{className:`text-muted-foreground`}),`换插件`]}),(0,K.jsxs)(EO,{onClick:()=>{C(_),x(!0)},children:[(0,K.jsx)(Dg,{className:`text-muted-foreground`}),`面板设置`]}),(0,K.jsxs)(EO,{className:`text-red-400 focus:text-red-300`,onClick:()=>{H(e=>e.panels.splice(_,1)),y(null)},children:[(0,K.jsx)(qg,{}),`删除区块`]})]})]})]}):(0,K.jsx)(`span`,{className:`shrink-0 text-[11px] text-muted-foreground`,children:`点击画布中的区块进行编辑`})]}),(0,K.jsx)(`div`,{className:`shrink-0`,children:(0,K.jsx)(mO,{})}),(0,K.jsx)(`div`,{className:`relative min-h-0 flex-1 overflow-hidden rounded-lg border bg-muted/20 p-2`,children:(0,K.jsx)(pO,{className:`absolute inset-0 overflow-auto`,dsl:t,edit:{sel:_,onSelect:y,onGrid:(e,t)=>ue(e,t)},renderPanel:t=>{let n=fe(t);return n?(0,K.jsx)(dO,{code:n,data:de(t),meta:{agentId:e,panelId:t.id,pluginId:t.panel}}):(0,K.jsx)(`div`,{className:`p-3 text-[11px] text-muted-foreground`,children:`(插件代码加载中…)`})},renderDialog:()=>(0,K.jsxs)(`div`,{className:`flex h-full flex-col items-center justify-center gap-1 text-[11px] text-muted-foreground`,children:[(0,K.jsx)(th,{className:`h-5 w-5 text-primary`}),`诊断对话(内核)`,(0,K.jsx)(`span`,{className:`text-[10px]`,children:`发布后在工作台可交互`})]}),renderPlaceholder:()=>(0,K.jsxs)(`div`,{className:`flex h-full flex-col items-center justify-center gap-1 text-[11px] text-muted-foreground`,children:[(0,K.jsx)(dg,{className:`h-4 w-4`}),`空区块`,(0,K.jsx)(`span`,{className:`text-[10px]`,children:`选中后「换插件」或「AI 定制」`})]})})}),(0,K.jsx)(`p`,{className:`shrink-0 text-[10px] text-muted-foreground`,children:`所见即所得(比例一致):画布 = 缩小的可视区,行高为可视区等分——跨 n 行即占 n/总行数,与实际浏览时任何屏幕尺寸下的比例完全一致;内容超高时面板内部滚动。拖拽移动(吸附网格)· 手柄调跨列跨行 · 右上角显示占比。`})]}),(0,K.jsxs)(SO,{value:`json`,className:`mt-2 flex min-h-0 flex-1 flex-col gap-2`,children:[(0,K.jsx)(`textarea`,{value:s,onChange:e=>c(e.target.value),spellCheck:!1,className:`min-h-0 w-full flex-1 resize-none rounded-md border bg-muted p-3 font-mono text-[11px] leading-relaxed`}),(0,K.jsxs)(`div`,{className:`flex shrink-0 gap-2`,children:[(0,K.jsx)(Y,{size:`sm`,onClick:()=>{try{let e=JSON.parse(s);if(!e.panels)throw Error(`缺少 panels`);n(e),i(!0),Z.success(`JSON 已应用(未发布)`)}catch(e){Z.error(`JSON 解析失败: ${e.message}`)}},children:`应用 JSON`}),(0,K.jsx)(Y,{size:`sm`,variant:`outline`,onClick:()=>c(JSON.stringify(t,null,2)),children:`从画布刷新`})]})]})]})}),(0,K.jsxs)(`div`,{className:`flex min-h-0 flex-col gap-4`,children:[(0,K.jsx)(bm,{className:`flex min-h-0 flex-1 flex-col py-0`,children:(0,K.jsxs)(Cm,{className:`flex min-h-0 flex-1 flex-col p-0`,children:[(0,K.jsxs)(`div`,{className:`flex shrink-0 items-center gap-1.5 border-b px-3 py-2 text-xs font-semibold`,children:[(0,K.jsx)(Lg,{className:`h-3.5 w-3.5 text-primary`}),`二开助手`,(0,K.jsx)(`span`,{className:`font-normal text-muted-foreground`,children:`· 描述需求,直接定制区块`})]}),te!==null&&B[te]&&(()=>{let e=B[te],t=e.grid||{x:1,y:1,w:6,h:1},n=Math.round(t.w/12*100);return(0,K.jsxs)(`div`,{className:`flex shrink-0 items-center gap-1.5 border-b bg-primary/5 px-3 py-1.5 text-[11px]`,children:[(0,K.jsx)(yh,{className:`h-3.5 w-3.5 shrink-0 text-primary`}),(0,K.jsxs)(`span`,{className:`min-w-0 truncate`,children:[`定制目标:`,(0,K.jsx)(`b`,{children:e.title}),` · `,n,`% 宽 · `,t.h,` 行`,e.panel?(0,K.jsxs)(K.Fragment,{children:[` · `,(0,K.jsx)(`span`,{className:`font-mono`,children:e.panel})]}):` · 空区块`]}),(0,K.jsx)(`button`,{className:`ml-auto shrink-0 rounded p-0.5 text-muted-foreground hover:text-foreground`,title:`取消目标,改为自由描述`,onClick:()=>z(null),children:`×`})]})})(),ne&&r&&(0,K.jsxs)(`div`,{className:`flex shrink-0 items-center gap-1.5 border-b bg-emerald-500/10 px-3 py-1.5 text-[11px] text-emerald-400`,children:[(0,K.jsx)(ph,{className:`h-3.5 w-3.5 shrink-0`}),`草稿已生成——到顶部「审阅后发布」生效`]}),(0,K.jsx)(eO,{className:`min-h-0 flex-1`,children:(0,K.jsxs)(`div`,{className:`space-y-2.5 p-3`,ref:oe,children:[M.length===0&&(0,K.jsx)(`div`,{className:`space-y-2`,children:(0,K.jsxs)(`div`,{className:`rounded-md border border-dashed border-primary/30 bg-primary/5 p-3 text-[11px] leading-relaxed`,children:[(0,K.jsx)(`div`,{className:`mb-1 text-xs font-semibold text-primary`,children:`✨ 两种玩法`}),(0,K.jsxs)(`div`,{children:[`① 画布选中区块 → 工具条「`,(0,K.jsx)(`b`,{children:`AI 定制`}),`」→ 目标钉在上方,只管补需求`]}),(0,K.jsx)(`div`,{children:`② 直接描述需求,助手自动建区块进草稿`}),(0,K.jsx)(`div`,{className:`mt-1.5 flex flex-wrap gap-1.5`,children:[[`窄条:最近告警`,`新建一个窄条区块(跨3列):最近活动告警列表,高级别标红,点击可选中设备`],[`横条:KPI 摘要`,`新建一个单行横条区块:关键指标摘要读数(props.kpi),异常着色`],[`宽表:设备台账`,`新建一个宽区块(跨9列以上):设备台账表格,显示全部字段,支持点击选中`]].map(([e,t])=>(0,K.jsx)(`button`,{onClick:()=>F(t),className:`rounded-full border px-2.5 py-1 text-[11px] text-muted-foreground transition-colors hover:border-primary/60 hover:text-primary`,children:e},e))})]})}),M.map((e,t)=>(0,K.jsxs)(`div`,{children:[(0,K.jsx)(`div`,{className:e.role===`user`?`ml-auto max-w-[90%] rounded-lg bg-primary/20 px-2.5 py-1.5 text-xs break-words whitespace-pre-wrap`:`max-w-full rounded-lg bg-card px-2.5 py-1.5 text-xs leading-relaxed break-words whitespace-pre-wrap`,children:e.text}),(e.events||[]).map((e,t)=>(0,K.jsxs)(`div`,{className:`mt-1 min-w-0 rounded-md border border-dashed px-2 py-1 text-[10px]`,children:[(0,K.jsx)(`span`,{children:e.ok===!1?`❌`:`🛠`}),` `,(0,K.jsx)(`span`,{className:`font-mono font-semibold`,children:e.tool}),(0,K.jsx)(`pre`,{className:`mt-0.5 max-h-32 overflow-auto whitespace-pre-wrap break-all text-muted-foreground`,children:String(e.result||``).slice(0,260)})]},t))]},t)),(I||R)&&(0,K.jsxs)(`div`,{className:`flex items-center gap-1.5 px-1 text-[11px] text-muted-foreground`,children:[(0,K.jsx)(`span`,{className:`h-1.5 w-1.5 animate-pulse rounded-full bg-primary`}),R||`开发中…`]})]})}),(0,K.jsxs)(`div`,{className:`shrink-0 space-y-1 border-t p-2`,children:[(0,K.jsx)(`textarea`,{value:P,onChange:e=>F(e.target.value),rows:2,onKeyDown:e=>{e.key===`Enter`&&!e.shiftKey&&!e.nativeEvent.isComposing&&(e.preventDefault(),Se())},placeholder:te===null?`描述需求,如「左上窄条做一个最近工单列表」(Enter 发送)…`:`描述对「${B[te]?.title}」的需求(Enter 发送,Shift+Enter 换行)…`,className:`min-h-[56px] w-full resize-none rounded-md border bg-background px-2 py-1.5 text-xs`}),(0,K.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,K.jsx)(`span`,{className:`text-[10px] text-muted-foreground`,children:te===null?`未锁定目标——助手会自动规划区块位置`:`目标上下文(位置/几何/插件)发送时自动携带`}),I?(0,K.jsxs)(Y,{size:`sm`,variant:`destructive`,className:`h-7 gap-1 text-xs`,onClick:U,children:[(0,K.jsx)(Vg,{className:`h-3 w-3`}),`停止`]}):(0,K.jsxs)(Y,{size:`sm`,className:`h-7 gap-1 text-xs`,disabled:!P.trim(),onClick:Se,children:[(0,K.jsx)(Cg,{className:`h-3 w-3`}),`发送`]})]})]})]})}),(0,K.jsx)(bm,{className:`shrink-0 py-0`,children:(0,K.jsxs)(Cm,{className:`p-0`,children:[(0,K.jsxs)(`div`,{className:`flex items-center gap-1.5 border-b px-3 py-2 text-xs font-semibold`,children:[(0,K.jsx)(_g,{className:`h-3.5 w-3.5`}),`版本历史`]}),(0,K.jsx)(`div`,{className:`max-h-40 overflow-y-auto`,children:(0,K.jsxs)(`div`,{className:`divide-y`,children:[a.length===0&&(0,K.jsx)(`div`,{className:`p-3 text-center text-xs text-muted-foreground`,children:`暂无历史`}),[...a].reverse().map((e,t)=>(0,K.jsxs)(`div`,{className:`flex items-center gap-2 px-3 py-1.5 text-xs`,children:[(0,K.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,K.jsx)(`span`,{className:`font-mono font-semibold`,children:e.version}),t===0&&!r&&(0,K.jsx)(J,{className:`ml-1 h-4 px-1 text-[9px]`,children:`线上`}),(0,K.jsx)(`div`,{className:`text-[10px] text-muted-foreground`,children:gt(e.at,`dts`)})]}),t!==0&&(0,K.jsx)(Y,{size:`sm`,variant:`ghost`,className:`h-6 text-[10px]`,onClick:()=>xe(e.version),children:`回滚`})]},`${e.version}-${e.at}`))]})})]})})]})]}),(0,K.jsx)(a_,{open:b,onOpenChange:x,children:(0,K.jsxs)(c_,{className:`max-w-md`,children:[(0,K.jsx)(l_,{children:(0,K.jsxs)(d_,{children:[`区块设置 · `,B[S]?.title]})}),(0,K.jsxs)(`div`,{className:`space-y-2`,children:[(0,K.jsxs)(`div`,{className:`space-y-1`,children:[(0,K.jsx)(m_,{className:`text-xs`,children:`标题`}),(0,K.jsx)(p_,{defaultValue:B[S]?.title||``,className:`text-xs`,onBlur:e=>H(t=>{t.panels[S].title=e.target.value})})]}),B[S]?.type===`custom`&&(0,K.jsxs)(`div`,{className:`space-y-1`,children:[(0,K.jsx)(m_,{className:`text-xs`,children:`内联代码(契约:function Panel(props))`}),(0,K.jsx)(`textarea`,{defaultValue:B[S]?.code||``,spellCheck:!1,onBlur:e=>H(t=>{t.panels[S].code=e.target.value}),className:`h-40 w-full rounded-md border bg-muted p-2 font-mono text-[10px]`})]}),B[S]?.type===`custom_panel`&&(0,K.jsxs)(`div`,{className:`space-y-1`,children:[(0,K.jsx)(m_,{className:`text-xs`,children:`插件版本(可回退,回退即时生效)`}),(0,K.jsx)(MO,{pluginId:String(B[S]?.panel||``),onRollback:ge})]}),(0,K.jsxs)(`div`,{className:`space-y-1`,children:[(0,K.jsx)(m_,{className:`text-xs`,children:`params(插件经 props.params 读取)`}),(0,K.jsx)(`textarea`,{defaultValue:JSON.stringify(B[S]?.params||{},null,1),spellCheck:!1,onBlur:e=>{try{H(t=>{t.panels[S].params=JSON.parse(e.target.value||`{}`)})}catch{Z.error(`params JSON 无效`)}},className:`h-20 w-full rounded-md border bg-muted p-2 font-mono text-[10px]`})]})]}),(0,K.jsx)(u_,{children:(0,K.jsx)(Y,{onClick:()=>x(!1),children:`完成`})})]})}),(0,K.jsx)(a_,{open:p,onOpenChange:e=>{m(e),e||g(null)},children:(0,K.jsxs)(c_,{children:[(0,K.jsx)(l_,{children:(0,K.jsxs)(d_,{className:`flex items-center gap-1.5`,children:[(0,K.jsx)(pg,{className:`h-4 w-4`}),`插件库`,h===null?``:` · 插入到选中区块`]})}),(0,K.jsx)(`div`,{className:`max-h-72 overflow-y-auto`,children:(0,K.jsx)(`div`,{className:`space-y-1.5`,children:d.filter(e=>e.status!==`deprecated`).map(e=>(0,K.jsxs)(`div`,{className:`flex items-center gap-2 rounded-md border p-2.5`,children:[(0,K.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,K.jsxs)(`div`,{className:`flex min-w-0 items-center gap-1.5 text-xs font-medium`,children:[(0,K.jsx)(`span`,{className:`min-w-0 truncate`,title:e.name,children:e.name}),(0,K.jsx)(J,{variant:`secondary`,className:`h-4 shrink-0 px-1 text-[9px]`,children:e.version}),(0,K.jsx)(J,{variant:`outline`,className:`h-4 shrink-0 px-1 text-[9px]`,children:e.author===`system`?`范本`:e.author===`ai`?`AI`:`人工`})]}),(0,K.jsx)(`div`,{className:`truncate text-[10px] text-muted-foreground`,children:e.description||e.id})]}),(0,K.jsx)(Y,{size:`sm`,variant:`secondary`,className:`h-7 shrink-0 text-[11px]`,onClick:()=>me(h,e),children:`插入`})]},e.id))})}),(0,K.jsxs)(u_,{children:[(0,K.jsx)(Y,{variant:`outline`,size:`sm`,onClick:pe,children:`先加空区块`}),(0,K.jsx)(Y,{variant:`outline`,onClick:()=>m(!1),children:`关闭`})]})]})}),(0,K.jsx)(kO,{target:ie,onClose:()=>ae(null),agents:[{agent_id:e,name:t.workbench||`当前助手`}]}),(0,K.jsx)(`p`,{className:`shrink-0 text-center text-[11px] text-muted-foreground`,children:`区块几何 = 插件设计输入:宽≤3 列紧凑列表、≥9 列表格/仪表 · AI 定制锁定目标、上下文自动携带 · 草稿审阅发布。`})]})}var FO=[{key:`tool_calls`,label:`工具调用`,icon:(0,K.jsx)(t_,{className:`h-3.5 w-3.5`}),tone:`text-sky-400`},{key:`guardrail_blocks`,label:`守护栏拦截`,icon:(0,K.jsx)(jg,{className:`h-3.5 w-3.5`}),tone:`text-red-400`},{key:`human_confirms`,label:`人工确认执行`,icon:(0,K.jsx)(zm,{className:`h-3.5 w-3.5`}),tone:`text-amber-400`},{key:`orchestrations`,label:`编排执行`,icon:(0,K.jsx)(Lg,{className:`h-3.5 w-3.5`}),tone:`text-violet-400`},{key:`experiences`,label:`经验回流`,icon:(0,K.jsx)($m,{className:`h-3.5 w-3.5`}),tone:`text-emerald-400`},{key:`kb_searches`,label:`知识检索`,icon:(0,K.jsx)(xg,{className:`h-3.5 w-3.5`}),tone:`text-cyan-400`},{key:`ai_drafts`,label:`AI 起草`,icon:(0,K.jsx)(Yg,{className:`h-3.5 w-3.5`}),tone:`text-pink-400`}];function IO(){let[e,t]=(0,v.useState)(null),[n,r]=(0,v.useState)(``),[i,a]=(0,v.useState)(null),[o,s]=(0,v.useState)(!1),c=()=>ot(`/api/evolution`).then(t);(0,v.useEffect)(()=>{c();let e=setInterval(c,1e4);return()=>clearInterval(e)},[]);let l=async()=>{if(n.trim()){s(!0);try{let e=await ot(`/api/kb/search?q=${encodeURIComponent(n)}`);a(e.items),c()}finally{s(!1)}}};return e?(0,K.jsxs)(`div`,{className:`h-full overflow-auto p-5`,children:[(0,K.jsxs)(`div`,{className:`mb-4`,children:[(0,K.jsxs)(`h1`,{className:`flex items-center gap-2 text-lg font-bold`,children:[(0,K.jsx)(Yg,{className:`h-5 w-5 text-primary`}),`自进化看板`]}),(0,K.jsxs)(`p`,{className:`mt-0.5 text-xs text-muted-foreground`,children:[e.flywheel_note,` · 数据来自审计日志与指标流的实时聚合`]})]}),(0,K.jsx)(`div`,{className:`grid grid-cols-4 gap-3 xl:grid-cols-7`,children:FO.map(t=>(0,K.jsx)(bm,{className:`py-3`,children:(0,K.jsxs)(Cm,{className:`px-3`,children:[(0,K.jsxs)(`div`,{className:`flex items-center gap-1.5 text-[11px] text-muted-foreground`,children:[t.icon,t.label]}),(0,K.jsx)(`div`,{className:`mt-1 text-xl font-bold ${t.tone}`,children:e.totals[t.key]??0})]})},t.key))}),(0,K.jsxs)(`div`,{className:`mt-4 grid grid-cols-2 gap-4`,children:[(0,K.jsxs)(bm,{className:`py-0`,children:[(0,K.jsx)(xm,{className:`border-b py-2.5`,children:(0,K.jsx)(Sm,{className:`text-xs text-muted-foreground`,children:`飞轮证据 · 检索相似度趋势(回流前后对比)`})}),(0,K.jsx)(Cm,{className:`p-0`,children:(0,K.jsx)(eO,{className:`h-64`,children:(0,K.jsxs)(`div`,{className:`space-y-1.5 p-3`,children:[e.similarity_trend.length===0&&(0,K.jsx)(`div`,{className:`py-8 text-center text-xs text-muted-foreground`,children:`尚无检索记录`}),e.similarity_trend.map((e,t)=>(0,K.jsxs)(`div`,{className:`flex items-center gap-2 text-xs`,children:[(0,K.jsx)(`span`,{className:`w-40 shrink-0 truncate text-muted-foreground`,title:e.query,children:e.query}),(0,K.jsx)(`div`,{className:`h-2 flex-1 overflow-hidden rounded bg-muted`,children:(0,K.jsx)(`div`,{className:`h-full rounded ${e.similarity>=75?`bg-emerald-500`:e.similarity>=55?`bg-amber-500`:`bg-slate-500`}`,style:{width:`${e.similarity}%`}})}),(0,K.jsxs)(`span`,{className:`w-9 text-right font-mono ${e.similarity>=75?`text-emerald-400`:`text-muted-foreground`}`,children:[e.similarity,`%`]})]},t))]})})})]}),(0,K.jsxs)(bm,{className:`py-0`,children:[(0,K.jsx)(xm,{className:`border-b py-2.5`,children:(0,K.jsxs)(Sm,{className:`flex items-center gap-1.5 text-xs text-muted-foreground`,children:[(0,K.jsx)($m,{className:`h-3.5 w-3.5`}),`经验沉淀(写入 ARM 知识库)`]})}),(0,K.jsx)(Cm,{className:`p-0`,children:(0,K.jsx)(eO,{className:`h-64`,children:(0,K.jsxs)(`div`,{className:`divide-y`,children:[e.experiences.length===0&&(0,K.jsx)(`div`,{className:`p-8 text-center text-xs text-muted-foreground`,children:`尚无回流记录`}),e.experiences.map((e,t)=>(0,K.jsxs)(`div`,{className:`flex items-center gap-2 px-3 py-2 text-xs`,children:[(0,K.jsx)(kh,{className:`h-3 w-3 shrink-0 text-emerald-400`}),(0,K.jsx)(`span`,{className:`min-w-0 flex-1 truncate`,title:e.title,children:e.title}),(0,K.jsx)(`span`,{className:`shrink-0 font-mono text-[10px] text-muted-foreground`,children:e.knowledge_id?e.knowledge_id.slice(0,8):`—`}),(0,K.jsx)(`span`,{className:`shrink-0 text-[10px] text-muted-foreground`,children:gt(e.ts)})]},t))]})})})]})]}),(0,K.jsxs)(`div`,{className:`mt-4 grid grid-cols-3 gap-4`,children:[(0,K.jsxs)(bm,{className:`py-0`,children:[(0,K.jsx)(xm,{className:`border-b py-2.5`,children:(0,K.jsx)(Sm,{className:`text-xs text-muted-foreground`,children:`工具调用分布`})}),(0,K.jsxs)(Cm,{className:`p-3`,children:[Object.keys(e.by_tool).length===0&&(0,K.jsx)(`div`,{className:`py-6 text-center text-xs text-muted-foreground`,children:`暂无数据`}),Object.entries(e.by_tool).sort((e,t)=>t[1]-e[1]).map(([t,n])=>{let r=Math.max(...Object.values(e.by_tool));return(0,K.jsxs)(`div`,{className:`mb-1.5 flex items-center gap-2 text-xs`,children:[(0,K.jsx)(`span`,{className:`w-36 shrink-0 truncate font-mono`,children:t}),(0,K.jsx)(`div`,{className:`h-2 flex-1 overflow-hidden rounded bg-muted`,children:(0,K.jsx)(`div`,{className:`h-full rounded bg-sky-500`,style:{width:`${n/r*100}%`}})}),(0,K.jsx)(`span`,{className:`w-6 text-right font-mono`,children:n})]},t)})]})]}),(0,K.jsxs)(bm,{className:`py-0`,children:[(0,K.jsx)(xm,{className:`border-b py-2.5`,children:(0,K.jsxs)(Sm,{className:`flex items-center gap-1.5 text-xs text-muted-foreground`,children:[(0,K.jsx)(xh,{className:`h-3.5 w-3.5`}),`ARM 知识库实检(真实 RAG)`]})}),(0,K.jsxs)(Cm,{className:`p-3`,children:[(0,K.jsxs)(`div`,{className:`flex gap-2`,children:[(0,K.jsx)(p_,{value:n,onChange:e=>r(e.target.value),onKeyDown:e=>e.key===`Enter`&&l(),placeholder:`如:堆垛机 货叉定位偏移`,className:`text-xs`}),(0,K.jsx)(Y,{size:`sm`,disabled:o,onClick:l,children:o?`检索中`:`检索`})]}),(0,K.jsx)(eO,{className:`mt-2 h-44`,children:(0,K.jsxs)(`div`,{className:`space-y-1.5`,children:[!i&&(0,K.jsx)(`div`,{className:`py-6 text-center text-xs text-muted-foreground`,children:`输入问题检索企业经验库(与助手使用同一数据源)`}),i?.length===0&&(0,K.jsx)(`div`,{className:`py-6 text-center text-xs text-muted-foreground`,children:`无命中`}),i?.map((e,t)=>(0,K.jsxs)(`div`,{className:`rounded-md bg-card px-2.5 py-1.5`,children:[(0,K.jsxs)(`div`,{className:`flex items-center gap-1.5 text-xs`,children:[e.similarity!=null&&(0,K.jsxs)(J,{variant:`secondary`,className:`h-4 text-[9px] ${e.similarity>=75?`text-emerald-400`:``}`,children:[e.similarity,`%`]}),(0,K.jsx)(`span`,{className:`truncate font-medium`,children:e.title})]}),(0,K.jsx)(`p`,{className:`mt-0.5 line-clamp-2 text-[10px] leading-relaxed text-muted-foreground`,children:e.snippet})]},t))]})})]})]}),(0,K.jsxs)(bm,{className:`py-0`,children:[(0,K.jsx)(xm,{className:`border-b py-2.5`,children:(0,K.jsx)(Sm,{className:`text-xs text-muted-foreground`,children:`审计流(实时)`})}),(0,K.jsx)(Cm,{className:`p-0`,children:(0,K.jsx)(eO,{className:`h-52`,children:(0,K.jsx)(`div`,{className:`divide-y font-mono text-[10px]`,children:e.recent_audit.map((e,t)=>(0,K.jsxs)(`div`,{className:`flex items-center gap-2 px-3 py-1.5`,children:[(0,K.jsx)(`span`,{className:`text-muted-foreground`,children:gt(e.ts,`t`)}),(0,K.jsx)(J,{variant:`outline`,className:`h-4 px-1 text-[9px]`,children:e.actor}),(0,K.jsx)(`span`,{className:`truncate`,children:e.tool||e.logic||e.action||e.name||e.verdict||``})]},t))})})})]})]})]}):(0,K.jsx)(`div`,{className:`flex h-full items-center justify-center text-sm text-muted-foreground`,children:`进化数据加载中…`})}function LO({className:e,size:t=`default`,...n}){return(0,K.jsx)(qp,{"data-slot":`switch`,"data-size":t,className:mn(`peer group/switch inline-flex shrink-0 items-center rounded-full border border-transparent shadow-xs transition-all outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 data-[size=default]:h-[1.15rem] data-[size=default]:w-8 data-[size=sm]:h-3.5 data-[size=sm]:w-6 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input dark:data-[state=unchecked]:bg-input/80`,e),...n,children:(0,K.jsx)(Yp,{"data-slot":`switch-thumb`,className:mn(`pointer-events-none block rounded-full bg-background ring-0 transition-transform group-data-[size=default]/switch:size-4 group-data-[size=sm]/switch:size-3 data-[state=checked]:translate-x-[calc(100%-2px)] data-[state=unchecked]:translate-x-0 dark:data-[state=checked]:bg-primary-foreground dark:data-[state=unchecked]:bg-foreground`)})})}function RO(){let[e,t]=(0,v.useState)(null),[n,r]=(0,v.useState)(null),[i,a]=(0,v.useState)(``),[o,s]=(0,v.useState)(``),[c,l]=(0,v.useState)(!1),[u,d]=(0,v.useState)(null),[f,p]=(0,v.useState)(``),[m,h]=(0,v.useState)(``),[g,_]=(0,v.useState)(``),[y,b]=(0,v.useState)(!1),[x,S]=(0,v.useState)(null),[C,w]=(0,v.useState)(``),[T,E]=(0,v.useState)(!1),[D,O]=(0,v.useState)(``),[k,A]=(0,v.useState)(!1),[j,M]=(0,v.useState)([]),[N,P]=(0,v.useState)([]),[F,I]=(0,v.useState)(!1),[L,R]=(0,v.useState)(``),[ee,te]=(0,v.useState)(``),[z,ne]=(0,v.useState)(!1),[re,ie]=(0,v.useState)(null),ae=()=>{ot(`/api/settings`).then(e=>{t(e),a(e.arm.api_base),p(e.llm.model),h(e.llm.base_url_runtime?e.llm.base_url:``),w(e.scene.profile),M(e.guard.deny),P(e.guard.ro),I(e.guard.sudo_u_l2)}),ot(`/api/arm/status`).then(r).catch(()=>r(null))};(0,v.useEffect)(()=>{ae()},[]);let oe=async()=>{l(!0),d(null);try{let e=await ct(`/api/settings`,{arm_api_base:i.trim(),...o.trim()?{arm_token:o.trim()}:{}});d(e.probe||null),s(``),e.probe?.online?Z.success(`已保存并连通(${e.probe.latency_ms}ms),源切换即时生效`):Z.warning(`已保存,但当前源不可达`,{description:e.note}),ae()}catch(e){Z.error(String(e.message))}finally{l(!1)}},se=async()=>{b(!0),S(null);try{let e=await ct(`/api/settings`,{llm_model:f.trim(),llm_base_url:m.trim(),...g.trim()?{llm_api_key:g.trim()}:{}});_(``),S(e.llm_probe||null),e.llm_probe?.online?Z.success(`模型已切换(探针 ${e.llm_probe.latency_ms}ms:${e.llm_probe.reply||`ok`})`):e.note&&Z.warning(`已保存,但探针未通过`,{description:e.note}),ae()}catch(e){Z.error(String(e.message))}finally{b(!1)}},ce=async()=>{A(!0);try{if(await ct(`/api/settings`,{access_token:D}),D.trim()){if(!(await fetch(`/api/auth/login`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({token:D.trim()})})).ok)throw Error(`已保存但自动登录失败,刷新后输入令牌进入`);Z.success(`访问令牌已启用(当前浏览器已自动登录)`)}else Z.success(`访问令牌已关闭(恢复开放访问)`);O(``),ae()}catch(e){Z.error(String(e.message))}finally{A(!1)}},le=async()=>{E(!0);try{await ct(`/api/settings`,{scene_profile:C}),Z.success(C.trim()?`场景画像已保存,对全部助手即时生效(新对话起)`:`场景画像已清空(不再注入)`),ae()}catch(e){Z.error(String(e.message))}finally{E(!1)}},B=async()=>{ne(!0);try{await ct(`/api/settings`,{guard:{deny:j,ro:N,sudo_u_l2:F}}),Z.success(`守护栏已更新(危险规则 ${j.length} 条 · 白名单 ${N.length} 命令),即时生效`),ie(null),ae()}catch(e){Z.error(String(e.message))}finally{ne(!1)}};return(0,K.jsxs)(`div`,{className:`h-full overflow-auto p-5`,children:[(0,K.jsxs)(`div`,{className:`mb-4`,children:[(0,K.jsxs)(`h1`,{className:`flex items-center gap-2 text-lg font-bold`,children:[(0,K.jsx)(kg,{className:`h-5 w-5 text-primary`}),`系统设置`]}),(0,K.jsx)(`p`,{className:`mt-0.5 text-xs text-muted-foreground`,children:`平台全局配置 · 修改保存后即时生效(无需重启)· 运行时配置优先于 .env`})]}),(0,K.jsxs)(vO,{defaultValue:`arm`,className:`max-w-2xl`,children:[(0,K.jsxs)(bO,{children:[(0,K.jsxs)(xO,{value:`arm`,className:`text-xs`,children:[(0,K.jsx)(Tg,{className:`mr-1 h-3.5 w-3.5`}),`ARM 源`,n&&(0,K.jsx)(`span`,{className:`ml-1 h-1.5 w-1.5 rounded-full ${n.online?`bg-emerald-500`:`bg-amber-500`}`})]}),(0,K.jsxs)(xO,{value:`llm`,className:`text-xs`,children:[(0,K.jsx)(th,{className:`mr-1 h-3.5 w-3.5`}),`LLM 模型服务`]}),(0,K.jsxs)(xO,{value:`scene`,className:`text-xs`,children:[(0,K.jsx)(Lh,{className:`mr-1 h-3.5 w-3.5`}),`场景画像`,e&&e.scene.length>0&&(0,K.jsx)(`span`,{className:`ml-1 h-1.5 w-1.5 rounded-full bg-emerald-500`})]}),(0,K.jsxs)(xO,{value:`auth`,className:`text-xs`,children:[(0,K.jsx)(tg,{className:`mr-1 h-3.5 w-3.5`}),`访问安全`,e?.auth.enabled&&(0,K.jsx)(`span`,{className:`ml-1 h-1.5 w-1.5 rounded-full bg-emerald-500`})]}),(0,K.jsxs)(xO,{value:`guard`,className:`text-xs`,children:[(0,K.jsx)(Fg,{className:`mr-1 h-3.5 w-3.5`}),`守护栏`,(0,K.jsxs)(`span`,{className:`ml-1 text-[9px] text-muted-foreground`,children:[j.length,`规`]})]})]}),(0,K.jsx)(SO,{value:`arm`,className:`mt-3`,children:(0,K.jsxs)(bm,{className:`mb-3 max-w-2xl`,children:[(0,K.jsxs)(xm,{className:`pb-2`,children:[(0,K.jsxs)(Sm,{className:`flex items-center gap-2 text-sm`,children:[(0,K.jsx)(Tg,{className:`h-4 w-4 text-primary`}),`ARM 源`,n&&(0,K.jsx)(J,{variant:`outline`,className:`text-[10px] ${n.online?`text-emerald-400`:`text-amber-400`}`,children:n.online?`在线 · ${n.latency_ms}ms`:`不可达(回落本地库)`})]}),(0,K.jsx)(`p`,{className:`text-[11px] leading-relaxed text-muted-foreground`,children:`ARM 是可私有化部署的资源管理系统(助手档案 + 知识库):在此切换源(如 本地开发版 → 客户私有站点), 检索/下载/同步全部即时跟随;助手已下载的本地档案不受影响。`})]}),(0,K.jsxs)(Cm,{className:`space-y-3`,children:[e&&!e.arm.token_set&&e.arm.token_source===`none`&&(0,K.jsxs)(`div`,{className:`flex items-start gap-2 rounded-md border border-amber-500/40 bg-amber-500/10 p-2.5 text-[11px] leading-relaxed text-amber-300`,children:[(0,K.jsx)(`span`,{className:`shrink-0`,children:`🔑`}),(0,K.jsxs)(`div`,{className:`flex-1`,children:[`尚未配置访问令牌——匿名仅能浏览目录,`,(0,K.jsx)(`b`,{children:`下载 / 上岗 / 新建 / 经验回流`}),`等操作会被 ARM 拒绝(401/403)。 请登录 ARM 站点生成访问令牌(arm_pat_… 开头),粘贴到下方「访问令牌」并保存。`,(0,K.jsx)(`a`,{href:e.arm.api_base,target:`_blank`,rel:`noreferrer`,className:`ml-1 underline underline-offset-2 hover:text-amber-200`,children:`打开 ARM 生成令牌 →`})]})]}),(0,K.jsxs)(`div`,{className:`space-y-1`,children:[(0,K.jsxs)(m_,{className:`flex items-center gap-2 text-xs`,children:[`站点地址(REST API 根地址)`,e&&(0,K.jsx)(J,{variant:`outline`,className:`h-4 px-1 text-[9px]`,children:e.arm.api_base_runtime?`运行时配置`:`默认(${(e.arm.default_base||``).replace(/^https?:\/\//,``)})`})]}),(0,K.jsx)(p_,{value:i,onChange:e=>a(e.target.value),placeholder:`如 http://localhost:3001 或 https://arm.customer.com`,className:`font-mono text-xs`})]}),(0,K.jsxs)(`div`,{className:`space-y-1`,children:[(0,K.jsxs)(m_,{className:`flex items-center gap-2 text-xs`,children:[`访问令牌(Token)`,e&&(0,K.jsx)(J,{variant:`outline`,className:`h-4 px-1 text-[9px]`,children:e.arm.token_set?`${e.arm.token_masked} · ${e.arm.token_source}`:`未配置(${e.arm.token_source===`pat`?`回落 ~/.arm PAT`:`匿名/只读`})`})]}),(0,K.jsx)(p_,{type:`password`,value:o,onChange:e=>s(e.target.value),placeholder:e?.arm.token_set?`已配置(留空保持不变)`:`arm_pat_…`,className:`font-mono text-xs`})]}),(0,K.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,K.jsx)(Y,{size:`sm`,className:`text-xs`,disabled:c,onClick:oe,children:c?`保存中…`:`保存并测试连接`}),u&&(0,K.jsx)(`span`,{className:`flex items-center gap-1 text-[11px] ${u.online?`text-emerald-400`:`text-amber-400`}`,children:u.online?(0,K.jsxs)(K.Fragment,{children:[(0,K.jsx)(ph,{className:`h-3.5 w-3.5`}),`连通 `,u.latency_ms,`ms,源已切换`]}):(0,K.jsxs)(K.Fragment,{children:[(0,K.jsx)(hh,{className:`h-3.5 w-3.5`}),`不可达:`,u.error]})})]})]})]})}),(0,K.jsx)(SO,{value:`llm`,className:`mt-3`,children:(0,K.jsxs)(bm,{className:`mb-3 max-w-2xl`,children:[(0,K.jsxs)(xm,{className:`pb-2`,children:[(0,K.jsxs)(Sm,{className:`flex items-center gap-2 text-sm`,children:[(0,K.jsx)(th,{className:`h-4 w-4 text-primary`}),`LLM 模型服务`,e&&(0,K.jsx)(J,{variant:`outline`,className:`text-[10px]`,children:e.llm.model})]}),(0,K.jsx)(`p`,{className:`text-[11px] leading-relaxed text-muted-foreground`,children:`OpenAI 兼容端点:缺省公司内网 bifrost 网关(内网开箱可用),可切换模型 / 自建网关 / 公有云端点。保存后新对话即时使用新模型,应用失败自动回滚。`})]}),(0,K.jsxs)(Cm,{className:`space-y-3`,children:[(0,K.jsxs)(`div`,{className:`space-y-1`,children:[(0,K.jsxs)(m_,{className:`flex items-center gap-2 text-xs`,children:[`模型`,e&&(0,K.jsx)(J,{variant:`outline`,className:`h-4 px-1 text-[9px]`,children:e.llm.model_runtime?`运行时配置`:`默认(.env)`})]}),(0,K.jsx)(p_,{value:f,onChange:e=>p(e.target.value),list:`llm-catalog`,placeholder:`如 def / glm-5.3 / 自定义名称`,className:`font-mono text-xs`}),(0,K.jsx)(`datalist`,{id:`llm-catalog`,children:(e?.llm.catalog||[]).map(e=>(0,K.jsx)(`option`,{value:e},e))})]}),(0,K.jsxs)(`div`,{className:`space-y-1`,children:[(0,K.jsxs)(m_,{className:`text-xs`,children:[`端点地址(留空 = `,e?.llm.default_base||`默认内网 bifrost`,`)`]}),(0,K.jsx)(p_,{value:m,onChange:e=>h(e.target.value),placeholder:`https://your-gateway/v1(OpenAI 兼容)`,className:`font-mono text-xs`})]}),(0,K.jsxs)(`div`,{className:`space-y-1`,children:[(0,K.jsxs)(m_,{className:`flex items-center gap-2 text-xs`,children:[`API Key`,e&&(0,K.jsx)(J,{variant:`outline`,className:`h-4 px-1 text-[9px]`,children:e.llm.key_set?`${e.llm.key_masked} · ${e.llm.key_source}`:`未配置`})]}),(0,K.jsx)(p_,{type:`password`,value:g,onChange:e=>_(e.target.value),placeholder:e?.llm.key_set?`已配置(留空保持不变)`:`sk-… / api key`,className:`font-mono text-xs`})]}),(0,K.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,K.jsx)(Y,{size:`sm`,className:`text-xs`,disabled:y,onClick:se,children:y?`切换中…`:`保存并测试模型`}),x&&(0,K.jsx)(`span`,{className:`flex items-center gap-1 text-[11px] ${x.online?`text-emerald-400`:`text-amber-400`}`,children:x.online?(0,K.jsxs)(K.Fragment,{children:[(0,K.jsx)(ph,{className:`h-3.5 w-3.5`}),`探针通过 `,x.latency_ms,`ms:`,x.reply]}):(0,K.jsxs)(K.Fragment,{children:[(0,K.jsx)(hh,{className:`h-3.5 w-3.5`}),`未通过:`,x.error]})})]})]})]})}),(0,K.jsx)(SO,{value:`scene`,className:`mt-3`,children:(0,K.jsxs)(bm,{className:`mb-3 max-w-2xl`,children:[(0,K.jsxs)(xm,{className:`pb-2`,children:[(0,K.jsxs)(Sm,{className:`flex items-center gap-2 text-sm`,children:[(0,K.jsx)(Lh,{className:`h-4 w-4 text-primary`}),`场景画像`,e&&(0,K.jsx)(J,{variant:`outline`,className:`text-[10px] ${e.scene.length?`text-emerald-400`:``}`,children:e.scene.length?`已启用 · ${e.scene.length} 字`:`未配置(不注入)`})]}),(0,K.jsxs)(`p`,{className:`text-[11px] leading-relaxed text-muted-foreground`,children:[`平台级、全局一份的使用方场景描述(团队环境 / 系统清单 / 规范 / 联系人),作为常驻事实注入`,(0,K.jsx)(`b`,{children:`所有助手`}),`的上下文—— 助手不必每次重新探索环境。与知识检索互补(常驻事实 vs 按需检索)。⚠ 不放凭据:写"凭据在哪、找谁要"即可。`]})]}),(0,K.jsxs)(Cm,{className:`space-y-2`,children:[(0,K.jsx)(`textarea`,{value:C,onChange:e=>w(e.target.value),spellCheck:!1,rows:8,placeholder:`例如:
|
|
99
|
+
(已中断)`}]:[...e,{kind:`bot`,text:`(已中断)`}]})):t===`error`&&(Z.error(String(e.message)),h(``))},F=async()=>{let e=c.trim();e&&!u&&(l(``),await I(e))},I=async a=>{if(u)return;d(!0),O.current=!0,A({kind:`user`,text:a});let o=new AbortController;j.current=o;try{await ut(`/api/chat`,{sessionId:t,agentId:e,message:a,autonomyLevel:i,ws_id:n,context:r?{device:r}:null},P,o.signal)}catch(e){o.signal.aborted||Z.error(String(e.message))}finally{d(!1),j.current===o&&(j.current=null)}},L=async e=>{if(!f)return;p(null),d(!0),O.current=!0,s(e=>e.filter(e=>e.kind!==`pending`));let n=new AbortController;j.current=n;try{await ut(`/api/chat/confirm`,{sessionId:t,approved:e},P,n.signal)}catch(e){n.signal.aborted||Z.error(String(e.message))}finally{d(!1),j.current===n&&(j.current=null)}};return(0,K.jsxs)(`div`,{className:`flex h-full flex-col`,children:[(0,K.jsxs)(`div`,{className:`flex items-center gap-2 border-b px-3 py-1`,children:[(0,K.jsx)(th,{className:`h-3.5 w-3.5 text-primary`}),(0,K.jsx)(`span`,{className:`text-xs font-medium`,children:`诊断对话`}),(0,K.jsx)(`span`,{className:`text-[10px] text-muted-foreground`,children:r?`上下文:${r}(点选设备自动注入)`:`点击左侧设备可注入上下文`}),(0,K.jsxs)(`div`,{className:`ml-auto flex items-center gap-1.5`,children:[(0,K.jsx)(`span`,{className:`text-[10px] text-muted-foreground`,children:`自主级别`}),(0,K.jsxs)(h_,{value:String(i),onValueChange:e=>a(+e),children:[(0,K.jsx)(__,{className:`h-7 w-[118px] text-xs`,children:(0,K.jsx)(g_,{})}),(0,K.jsxs)(v_,{children:[(0,K.jsx)(y_,{value:`0`,className:`text-xs`,children:`L0 只读问答`}),(0,K.jsx)(y_,{value:`1`,className:`text-xs`,children:`L1 诊断建议`}),(0,K.jsx)(y_,{value:`2`,className:`text-xs`,children:`L2 确认执行`}),(0,K.jsx)(y_,{value:`3`,className:`text-xs text-red-400`,children:`L3 完全自主(免确认)`})]})]})]})]}),(0,K.jsx)(eO,{className:`min-h-0 flex-1 [&>div>div]:block!`,children:(0,K.jsxs)(`div`,{className:`space-y-2.5 p-3`,ref:C,children:[o.length===0&&(0,K.jsxs)(`div`,{className:`flex h-40 flex-col items-center justify-center gap-1 text-xs text-muted-foreground`,children:[(0,K.jsx)(Vh,{className:`h-5 w-5 opacity-50`}),`试试:「STK-R3 什么情况?帮我处理」 / 「服务器 CPU 高,怎么处理」`]}),o.map((e,t)=>{if(e.kind===`user`)return(0,K.jsx)(`div`,{className:`ml-auto max-w-[85%] rounded-lg bg-primary/20 px-3 py-1.5 text-xs leading-relaxed break-words`,children:e.text},t);if(e.kind===`bot`)return(0,K.jsx)(`div`,{className:`max-w-[92%] rounded-lg bg-card px-3 py-2 text-xs leading-relaxed break-words`,children:(e.text||``).split(/```a2ui\s*\n?([\s\S]*?)```/g).map((e,t)=>t%2==0?e.trim()?(0,K.jsx)($D,{text:e},t):null:(0,K.jsx)(av,{raw:e,onSend:I},t))},t);if(e.kind===`evt`&&e.evt){let n=e.evt.status,r={ok:`✅`,executed:`▶`,blocked:`⛔`,cancelled:`🚫`,rejected:`❌`,start:`⏳`}[n]||`•`;return(0,K.jsxs)(`div`,{className:it(`max-w-[92%] rounded-md border border-dashed px-2.5 py-1.5 text-[11px]`,n===`blocked`?`border-red-500/50 text-red-300`:n===`start`?`border-border text-muted-foreground`:`border-border`),children:[(0,K.jsxs)(`div`,{className:`flex min-w-0 items-center gap-1.5`,children:[(0,K.jsx)(`span`,{className:`shrink-0`,children:r}),(0,K.jsx)(t_,{className:`h-3 w-3 shrink-0`}),(0,K.jsx)(`span`,{className:`shrink-0 font-mono font-semibold`,children:e.evt.tool}),(0,K.jsx)(`span`,{className:`min-w-0 flex-1 truncate text-muted-foreground`,children:JSON.stringify(e.evt.args)})]}),n!==`start`&&(0,K.jsx)(`pre`,{className:`mt-1 max-h-40 overflow-auto whitespace-pre-wrap break-all text-[10px] leading-relaxed text-muted-foreground`,children:String(e.evt.result).slice(0,700)})]},t)}return e.kind===`pending`?(0,K.jsx)(bm,{className:`max-w-[92%] border-amber-500/50 bg-amber-500/5`,children:(0,K.jsxs)(Cm,{className:`space-y-2 p-3`,children:[(0,K.jsxs)(`div`,{className:`flex items-center gap-1.5 text-xs font-semibold text-amber-300`,children:[(0,K.jsx)(jg,{className:`h-3.5 w-3.5`}),`人工确认(L2)· 助手请求执行写操作`]}),e.intro&&(0,K.jsx)(`div`,{className:`text-[11px] text-muted-foreground`,children:(0,K.jsx)($D,{text:e.intro})}),(0,K.jsxs)(`div`,{className:`flex gap-2`,children:[(0,K.jsx)(Y,{size:`sm`,variant:`destructive`,onClick:()=>L(!1),children:`取消`}),(0,K.jsx)(Y,{size:`sm`,onClick:()=>L(!0),children:`确认执行`})]})]})},t):null}),m&&(0,K.jsxs)(`div`,{className:`flex items-center gap-1.5 px-1 text-[11px] text-muted-foreground`,children:[(0,K.jsx)(`span`,{className:`h-1.5 w-1.5 animate-pulse rounded-full bg-primary`}),m,m.startsWith(`后台进行中`)&&(0,K.jsx)(Y,{size:`sm`,variant:`ghost`,className:`h-5 gap-1 px-1.5 text-[10px] text-red-400 hover:text-red-300`,onClick:()=>{h(``),M()},children:`⏹ 中断`}),(0,K.jsx)(`span`,{ref:w})]})]})}),(0,K.jsxs)(`div`,{className:`flex items-center gap-2 border-t p-2`,children:[(0,K.jsx)(nO,{value:c,onChange:e=>l(e.target.value),rows:1,placeholder:`描述问题…(Enter 发送,Shift+Enter 换行)`,className:`min-h-[38px] resize-none text-xs`,onKeyDown:e=>{e.key===`Enter`&&!e.shiftKey&&(e.preventDefault(),F())}}),u?(0,K.jsx)(Y,{size:`icon`,variant:`destructive`,title:`中断当前对话`,onClick:M,children:(0,K.jsx)(Vg,{className:`h-3.5 w-3.5`})}):(0,K.jsx)(Y,{size:`icon`,disabled:!c.trim(),onClick:F,children:(0,K.jsx)(Cg,{className:`h-3.5 w-3.5`})}),(0,K.jsx)(Y,{size:`icon`,variant:`outline`,title:`清空会话(丢弃服务端上下文,从零开始)`,disabled:u,onClick:N,children:(0,K.jsx)(qg,{className:`h-3.5 w-3.5`})}),(0,K.jsx)(Y,{size:`sm`,variant:`outline`,className:`shrink-0 text-[11px]`,onClick:async()=>{try{let e=await st(`/api/experience/draft`,{sessionId:t});S(e.markdown),b(``),_(!0)}catch(e){Z.error(String(e.message))}},children:`📥 沉淀经验`})]}),(0,K.jsx)(a_,{open:g,onOpenChange:_,children:(0,K.jsxs)(c_,{className:`max-w-xl`,children:[(0,K.jsx)(l_,{children:(0,K.jsx)(d_,{children:`经验回流 · AI 起草 → 人工审阅 → 写入 ARM`})}),(0,K.jsx)(p_,{value:y,onChange:e=>b(e.target.value),placeholder:`经验标题(留空自动生成)`,className:`text-xs`}),(0,K.jsx)(nO,{value:x,onChange:e=>S(e.target.value),className:`min-h-[260px] font-mono text-[11px]`}),(0,K.jsxs)(u_,{children:[(0,K.jsx)(Y,{variant:`outline`,onClick:()=>_(!1),children:`取消`}),(0,K.jsx)(Y,{onClick:async()=>{try{let t=await st(`/api/experience/commit`,{agentId:e,name:y.trim()||`MVP经验-${gt(new Date().toISOString())}`,description:`工作台人工审阅沉淀`,content:x});_(!1),Z.success(`已回流 ARM 知识库`,{description:t.result.slice(0,90)})}catch(e){Z.error(String(e.message))}},children:`确认沉淀到 ARM 知识库`})]})]})})]})}var iO=function(e,t,n,r){var i;t[0]=0;for(var a=1;a<t.length;a++){var o=t[a++],s=t[a]?(t[0]|=o?1:2,n[t[a++]]):t[++a];o===3?r[0]=s:o===4?r[1]=Object.assign(r[1]||{},s):o===5?(r[1]=r[1]||{})[t[++a]]=s:o===6?r[1][t[++a]]+=s+``:o?(i=e.apply(s,iO(e,s,n,[``,null])),r.push(i),s[0]?t[0]|=2:(t[a-2]=0,t[a]=i)):r.push(s)}return r},aO=new Map;function oO(e){var t=aO.get(this);return t||(t=new Map,aO.set(this,t)),(t=iO(this,t.get(e)||(t.set(e,t=function(e){for(var t,n,r=1,i=``,a=``,o=[0],s=function(e){r===1&&(e||(i=i.replace(/^\s*\n\s*|\s*\n\s*$/g,``)))?o.push(0,e,i):r===3&&(e||i)?(o.push(3,e,i),r=2):r===2&&i===`...`&&e?o.push(4,e,0):r===2&&i&&!e?o.push(5,0,!0,i):r>=5&&((i||!e&&r===5)&&(o.push(r,0,i,n),r=6),e&&(o.push(r,e,0,n),r=6)),i=``},c=0;c<e.length;c++){c&&(r===1&&s(),s(c));for(var l=0;l<e[c].length;l++)t=e[c][l],r===1?t===`<`?(s(),o=[o],r=3):i+=t:r===4?i===`--`&&t===`>`?(r=1,i=``):i=t+i[0]:a?t===a?a=``:i+=t:t===`"`||t===`'`?a=t:t===`>`?(s(),r=1):r&&(t===`=`?(r=5,n=i,i=``):t===`/`&&(r<5||e[c][l+1]===`>`)?(s(),r===3&&(o=o[0]),r=o,(o=o[0]).push(2,0,r),r=0):t===` `||t===` `||t===`
|
|
100
|
+
`||t===`\r`?(s(),r=2):i+=t),r===3&&i===`!--`&&(r=4,o=o[0])}return s(),o}(e)),t),arguments,[])).length>1?t:t[0]}var sO=oO.bind(v.createElement),cO=class extends v.Component{state={err:null};static getDerivedStateFromError(e){return{err:String(e?.message||e)}}componentDidCatch(e){try{this.props.onError?.(String(e?.message||e))}catch{}}render(){return this.state.err?(0,K.jsxs)(`div`,{className:`p-3 text-[11px] leading-relaxed text-red-400`,children:[`面板运行错误:`,this.state.err,(0,K.jsx)(`br`,{}),`可在「定制工作台」中修正代码后重新发布。`]}):this.props.children}};function lO(e){return Function(`React`,`html`,`useState`,`useEffect`,`useRef`,`useMemo`,`"use strict";\n${e}\n;if (typeof Panel !== "function") throw new Error("插件代码必须定义 function Panel(props)");\nreturn Panel;`)(v,sO,v.useState,v.useEffect,v.useRef,v.useMemo)}function uO(e,t,n){if(e)try{fetch(`/api/panel-error`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({...e,kind:t,message:n})}).catch(()=>{})}catch{}}function dO({code:e,data:t,meta:n}){let r=n?.agentId,i=n?.panelId,a=n?.pluginId,o=(0,v.useMemo)(()=>{let t={agentId:r,panelId:i,pluginId:a};try{return lO(e)}catch(e){return uO(t,`compile`,String(e.message)),()=>(0,K.jsxs)(`div`,{className:`p-3 text-[11px] text-red-400`,children:[`编译失败:`,String(e.message)]})}},[e,r,i,a]);return(0,K.jsx)(cO,{onError:e=>uO(n,`runtime`,e),children:(0,K.jsx)(o,{...t})})}var fO=12;function pO({dsl:e,renderPanel:t,renderDialog:n,renderPlaceholder:r,edit:i,className:a}){let o=(0,v.useRef)(null),s=(0,v.useRef)(null),c=e.panels.reduce((e,t)=>Math.max(e,(t.grid?.y||1)+(t.grid?.h||1)-1),1),l=()=>{let e=o.current?.getBoundingClientRect();return{col:e?(e.width+fO)/12:100,row:e?(e.height+fO)/c:178}},u=(t,n,r)=>{if(!i||t.button!==0)return;t.stopPropagation();let a=e.panels[n].grid||{x:1,y:1,w:6,h:1};s.current={i:n,mode:r,sx:t.clientX,sy:t.clientY,g:{...a},moved:!1};try{t.currentTarget.setPointerCapture(t.pointerId)}catch{}},d=e=>{let t=s.current;if(!i||!t)return;let n=e.clientX-t.sx,r=e.clientY-t.sy;if(!t.moved&&Math.abs(n)<4&&Math.abs(r)<4)return;t.moved=!0;let{col:a,row:o}=l(),c=Math.round(n/a),u=Math.round(r/o);t.mode===`move`?i.onGrid(t.i,{x:Math.min(Math.max(1,t.g.x+c),12-t.g.w+1),y:Math.max(1,t.g.y+u)}):i.onGrid(t.i,{w:Math.min(Math.max(1,t.g.w+c),12-t.g.x+1),h:Math.min(Math.max(1,t.g.h+u),12)})},f=()=>{setTimeout(()=>{s.current=null},0)};return(0,K.jsx)(`div`,{ref:o,className:it(`grid gap-3`,i&&`touch-none select-none`,a),style:{gridTemplateColumns:`repeat(12, minmax(0, 1fr))`,gridTemplateRows:`repeat(${c}, minmax(120px, 1fr))`},onPointerDown:()=>{i&&i.onSelect(null)},children:e.panels.map((e,a)=>{let o=e.grid||{x:1,y:1,w:6,h:1},s=Math.round(o.w/12*100),c=e.type===`agent_dialog`?n?n(e):null:e.type===`placeholder`?r?r(e):null:t(e);return(0,K.jsxs)(`div`,{style:{gridColumn:`${o.x} / span ${o.w}`,gridRow:`${o.y} / span ${o.h}`},className:it(`relative flex min-h-0 flex-col overflow-hidden rounded-lg border bg-card`,i?i.sel===a?`border-primary ring-2 ring-primary/50`:`border-border hover:border-primary/50`:`border-border`,i&&`cursor-grab active:cursor-grabbing`),onPointerDown:e=>{i&&(e.stopPropagation(),i.onSelect(a),u(e,a,`move`))},onPointerMove:d,onPointerUp:f,onPointerCancel:f,children:[i&&(0,K.jsxs)(`div`,{className:`pointer-events-none absolute inset-x-0 top-0 z-10 flex items-center gap-1.5 border-b bg-background/85 px-2 py-1 text-[10px] backdrop-blur-sm`,children:[(0,K.jsx)(`span`,{className:`font-medium`,children:e.title}),(0,K.jsx)(J,{variant:`secondary`,className:`h-4 px-1 text-[9px]`,children:e.panel||e.type}),(0,K.jsxs)(`span`,{className:`ml-auto font-mono text-muted-foreground`,children:[s,`%宽·`,o.h,`行`]})]}),(0,K.jsx)(`div`,{className:it(`min-h-0 flex-1 overflow-auto`,i&&`pointer-events-none pt-4`),children:c}),i&&(0,K.jsx)(`span`,{onPointerDown:e=>u(e,a,`resize`),onPointerMove:d,onPointerUp:f,onPointerCancel:f,className:`absolute bottom-0 right-0 z-10 h-4 w-4 cursor-nwse-resize rounded-br-md border-b border-r border-primary/60 bg-primary/25 hover:bg-primary/50`,title:`拖拽调跨列/跨行(当前 ${s}% 宽)`,children:(0,K.jsx)(rg,{className:`h-2.5 w-2.5 translate-x-[3px] translate-y-[3px] text-primary`})})]},e.id)})})}function mO(){return(0,K.jsxs)(`div`,{className:`relative mb-1 h-4 select-none text-[9px] text-muted-foreground`,children:[(0,K.jsx)(`div`,{className:`grid h-full grid-cols-12`,children:[...Array(12)].map((e,t)=>(0,K.jsx)(`div`,{className:`border-l border-border/60 pl-0.5 pt-0.5 font-mono`,children:t+1},t))}),[25,50,75].map(e=>(0,K.jsxs)(`span`,{className:`absolute -top-0 font-mono`,style:{left:`${e}%`},children:[e,`%`]},e))]})}function hO({open:e,onOpenChange:t,onPick:n}){let[r,i]=(0,v.useState)(null),[a,o]=(0,v.useState)(!1),[s,c]=(0,v.useState)(``),l=e=>{o(!0),c(``),ot(`/api/fs/dirs${e?`?path=${encodeURIComponent(e)}`:``}`).then(e=>i(e)).catch(e=>c(String(e.message))).finally(()=>o(!1))};return(0,v.useEffect)(()=>{e&&!r&&l()},[e]),(0,K.jsx)(a_,{open:e,onOpenChange:t,children:(0,K.jsxs)(c_,{className:`max-w-md`,children:[(0,K.jsx)(l_,{children:(0,K.jsx)(d_,{children:`选择工作区目录`})}),(0,K.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,K.jsxs)(Y,{size:`sm`,variant:`outline`,className:`h-7 gap-1 px-2 text-[11px]`,disabled:!r?.parent,onClick:()=>r?.parent&&l(r.parent),title:`上级目录`,children:[(0,K.jsx)(Zm,{className:`h-3 w-3`}),`上级`]}),(0,K.jsxs)(Y,{size:`sm`,variant:`outline`,className:`h-7 gap-1 px-2 text-[11px]`,onClick:()=>l(),children:[(0,K.jsx)(zh,{className:`h-3 w-3`}),`主目录`]}),(0,K.jsx)(`span`,{className:`min-w-0 flex-1 truncate rounded-md border bg-muted/40 px-2 py-1.5 font-mono text-[11px] text-muted-foreground`,title:r?.path,children:r?.path||`…`})]}),(0,K.jsxs)(eO,{className:`h-64 rounded-md border`,children:[a&&(0,K.jsxs)(`div`,{className:`flex h-full items-center justify-center gap-2 text-xs text-muted-foreground`,children:[(0,K.jsx)($h,{className:`h-4 w-4 animate-spin`}),`读取中…`]}),!a&&s&&(0,K.jsx)(`div`,{className:`p-3 text-xs text-red-400`,children:s}),!a&&!s&&r&&r.dirs.length===0&&(0,K.jsx)(`div`,{className:`p-3 text-xs text-muted-foreground`,children:`此目录下没有子目录——可直接点「选择当前目录」。`}),!a&&!s&&r&&r.dirs.map(e=>(0,K.jsxs)(`button`,{onClick:()=>l(`${r.path}/${e}`),className:`flex w-full items-center gap-2 px-3 py-1.5 text-left text-xs hover:bg-accent`,children:[(0,K.jsx)(Fh,{className:`h-3.5 w-3.5 shrink-0 text-muted-foreground`}),(0,K.jsx)(`span`,{className:`truncate`,children:e})]},e))]}),(0,K.jsxs)(u_,{children:[(0,K.jsx)(Y,{variant:`outline`,onClick:()=>t(!1),children:`取消`}),(0,K.jsxs)(Y,{className:`gap-1`,disabled:!r||a,onClick:()=>{r&&(n(r.path),t(!1))},children:[(0,K.jsx)(rh,{className:`h-3.5 w-3.5`}),`选择当前目录`]})]})]})})}function gO({agentId:e,onName:t,onEdit:n}){let[r,i]=(0,v.useState)(null),[a,o]=(0,v.useState)(null),[s,c]=(0,v.useState)(null),[l,u]=(0,v.useState)([]),[d,f]=(0,v.useState)(null),[p,m]=(0,v.useState)(2),[h,g]=(0,v.useState)(null),[_,y]=(0,v.useState)(!1),[b,x]=(0,v.useState)(``),[S,C]=(0,v.useState)(``),[w,T]=(0,v.useState)(!1),[E,D]=(0,v.useState)(!1),[O,k]=(0,v.useState)(null),[A,j]=(0,v.useState)(!1),M=(0,v.useMemo)(()=>h?.workspaces.find(e=>e.id===h.current)||null,[h]),N=M?.id||`default`,P=(0,v.useMemo)(()=>`chat-${e}-${N}`,[e,N]),F=()=>ot(`/api/state`).then(c).catch(()=>{}),I=()=>ot(`/api/workspaces?agent_id=${e}`).then(g).catch(()=>{});(0,v.useEffect)(()=>{ot(`/api/workbench?agent_id=${e}`).then(e=>{i(e.dsl),e.dsl&&t(e.dsl.workbench)}),ot(`/api/deployment?agent_id=${e}`).then(e=>{o(e.deployment),m({L0:0,L1:1,L2:2,L3:3}[e.deployment?.default_autonomy||`L2`]??2)}),ot(`/api/panels?with_code=1`).then(e=>u(e.plugins||[])),I(),F();let n=setInterval(F,5e3);return()=>clearInterval(n)},[e]);let L=async t=>{try{g(await st(`/api/workspaces/select`,{agent_id:e,ws_id:t}))}catch(e){Z.error(String(e.message))}},R=async()=>{D(!0);try{let t=await st(`/api/workspaces`,{agent_id:e,name:b||void 0,...S?{path:S}:{}});g(t),y(!1),x(``),C(``),Z.success(`工作区已创建${S?`(登记外部目录)`:``}`),await L(t.workspaces[t.workspaces.length-1].id)}catch(e){Z.error(String(e.message))}finally{D(!1)}},ee=async()=>{if(O)try{g(await lt(`/api/workspaces/${O.id}?agent_id=${e}`,{purge:A})),Z.success(`工作区已删除${A?`(目录已清除)`:`(仅移除登记)`}`),k(null),j(!1)}catch(e){Z.error(String(e.message))}},te=(0,v.useMemo)(()=>r?.panels||[],[r]).filter(e=>e.type===`custom`||e.type===`custom_panel`).map(e=>({panel:e,code:e.type===`custom`?e.code||``:l.find(t=>t.id===e.panel)?.code||``})).filter(e=>e.code),z=t=>({devices:s?.devices||[],alarms:s?.alarms||[],kpi:s?.kpi||{},work_orders:s?.work_orders||[],inspections:s?.inspections||{},selected:d,onSelect:f,agentId:e,store:mt(e,N),runAction:(n,r)=>ht(e,String(t?.id||``),n,r),params:{...t?.params||{},agentId:e,wsId:N}});return!r||!s?(0,K.jsx)(`div`,{className:`flex h-full items-center justify-center text-sm text-muted-foreground`,children:`工作台加载中…`}):(0,K.jsxs)(`div`,{className:`flex h-full flex-col gap-2 overflow-hidden px-4 py-2.5`,children:[(0,K.jsx)(`h1`,{className:`sr-only`,children:r.workbench}),(0,K.jsxs)(`div`,{className:`flex items-center gap-2 text-[11px]`,children:[(0,K.jsx)(J,{variant:`secondary`,className:`h-5 shrink-0 text-[10px]`,children:r.version}),te.length>0&&(0,K.jsxs)(J,{variant:`outline`,className:`h-5 shrink-0 text-[10px] text-violet-400 border-violet-500/40`,children:[(0,K.jsx)(pg,{className:`mr-0.5 h-2.5 w-2.5`}),`插件 ×`,te.length]}),(0,K.jsxs)(`span`,{className:`shrink-0 text-muted-foreground`,children:[a?.name,` · 工具 `,a?.toolset.length,` 个`]}),M&&(0,K.jsxs)(K.Fragment,{children:[(0,K.jsx)(jh,{className:`h-3 w-3 shrink-0 text-muted-foreground`}),(0,K.jsx)(`span`,{className:`min-w-0 flex-1 truncate font-mono text-muted-foreground`,title:M.path,children:M.path}),(0,K.jsx)(`span`,{className:`shrink-0 text-[10px] text-muted-foreground`,children:`(exec 工作目录 · 数据与文件随工作区隔离)`})]}),(0,K.jsxs)(`div`,{className:`ml-auto flex items-center gap-1.5`,children:[(0,K.jsx)(qh,{className:`h-3.5 w-3.5 text-muted-foreground`}),(0,K.jsxs)(h_,{value:N,onValueChange:L,children:[(0,K.jsx)(__,{className:`h-8 w-52 text-xs`,title:M?.path,children:(0,K.jsx)(g_,{children:(0,K.jsx)(`span`,{className:`truncate`,children:M?`${M.name}${M.external?`(外部)`:``}`:`默认工作区`})})}),(0,K.jsx)(v_,{children:(h?.workspaces||[]).map(e=>(0,K.jsx)(y_,{value:e.id,className:`text-xs`,children:(0,K.jsxs)(`span`,{className:`max-w-64 truncate`,title:e.path,children:[e.name,e.external?` · 外部目录`:``,e.id===h?.current?` ✓`:``]})},e.id))})]}),(0,K.jsxs)(Y,{size:`sm`,variant:`outline`,className:`h-8 gap-1 text-xs`,onClick:()=>y(!0),title:`新建工作区(默认目录或自定义路径)`,children:[(0,K.jsx)(Nh,{className:`h-3.5 w-3.5`}),`新建`]}),M&&M.id!=="default"&&(0,K.jsx)(Y,{size:`sm`,variant:`ghost`,className:`h-8 w-8 p-0 text-muted-foreground`,onClick:()=>k(M),title:`删除当前工作区`,children:(0,K.jsx)(qg,{className:`h-3.5 w-3.5`})}),(0,K.jsxs)(Y,{size:`sm`,variant:`outline`,className:`h-8 gap-1 text-xs`,onClick:n,children:[(0,K.jsx)(Dg,{className:`h-3.5 w-3.5`}),`编辑布局`]})]})]}),(0,K.jsx)(`div`,{className:`relative min-h-0 flex-1`,children:(0,K.jsx)(pO,{className:`absolute inset-0 overflow-auto p-0.5`,dsl:r,renderPanel:t=>{let n=te.find(e=>e.panel.id===t.id);return n?(0,K.jsx)(dO,{code:n.code,data:z(t),meta:{agentId:e,panelId:t.id,pluginId:t.panel}},`${t.id}:${N}`):null},renderDialog:()=>(0,K.jsx)(rO,{agentId:e,sessionId:P,wsId:N,injectedDevice:d,autonomy:p,onAutonomy:m},`${e}:${N}`),renderPlaceholder:()=>(0,K.jsx)(`div`,{className:`flex h-full items-center justify-center p-4 text-center text-[11px] text-muted-foreground`,children:`空区块——到「编辑布局」添加插件或让 AI 定制`})})}),(0,K.jsx)(a_,{open:_,onOpenChange:y,children:(0,K.jsxs)(c_,{children:[(0,K.jsx)(l_,{children:(0,K.jsx)(d_,{children:`新建工作区`})}),(0,K.jsxs)(`div`,{className:`space-y-3`,children:[(0,K.jsxs)(`div`,{className:`space-y-1`,children:[(0,K.jsx)(m_,{className:`text-xs`,children:`名称`}),(0,K.jsx)(p_,{value:b,onChange:e=>x(e.target.value),placeholder:`如:产线B改造`,className:`text-xs`})]}),(0,K.jsxs)(`div`,{className:`space-y-1`,children:[(0,K.jsx)(m_,{className:`text-xs`,children:`自定义目录(可选,留空则在平台 workspace 目录下动态新增)`}),(0,K.jsxs)(`div`,{className:`flex gap-1.5`,children:[(0,K.jsx)(p_,{value:S,onChange:e=>C(e.target.value),placeholder:`/Users/you/projects/line-b 或点浏览选择`,className:`font-mono text-xs`}),(0,K.jsxs)(Y,{size:`sm`,variant:`outline`,className:`h-8 shrink-0 gap-1 text-xs`,onClick:()=>T(!0),children:[(0,K.jsx)(jh,{className:`h-3.5 w-3.5`}),`浏览…`]})]}),(0,K.jsx)(`p`,{className:`text-[10px] text-amber-400`,children:`⚠ 助手将能读写该目录(exec 工作目录即此处);目录须已存在,平台不会在其中写入数据库文件。`})]})]}),(0,K.jsxs)(u_,{children:[(0,K.jsx)(Y,{variant:`outline`,disabled:E,onClick:()=>y(!1),children:`取消`}),(0,K.jsx)(Y,{disabled:E,onClick:R,children:E?`创建中…`:`创建并切换`})]}),(0,K.jsx)(hO,{open:w,onOpenChange:T,onPick:e=>C(e)})]})}),(0,K.jsx)(a_,{open:!!O,onOpenChange:e=>{e||(k(null),j(!1))},children:(0,K.jsxs)(c_,{children:[(0,K.jsx)(l_,{children:(0,K.jsxs)(d_,{children:[`删除工作区 · `,O?.name]})}),(0,K.jsxs)(`div`,{className:`space-y-2 text-xs`,children:[(0,K.jsx)(`p`,{className:`font-mono text-[11px] text-muted-foreground`,children:O?.path}),O?.external?(0,K.jsxs)(`p`,{children:[`外部目录工作区:仅移除登记,`,(0,K.jsx)(`b`,{children:`不删除`}),`你的文件;该工作区的数据集库将一并删除。`]}):(0,K.jsxs)(`label`,{className:`flex items-start gap-2 rounded-md border border-red-500/30 bg-red-500/5 p-2.5`,children:[(0,K.jsx)(i_,{checked:A,onCheckedChange:e=>j(!!e)}),(0,K.jsx)(`span`,{children:`同时删除平台目录下的工作区文件夹(数据集库始终删除)`})]})]}),(0,K.jsxs)(u_,{children:[(0,K.jsx)(Y,{variant:`outline`,onClick:()=>k(null),children:`取消`}),(0,K.jsx)(Y,{variant:`destructive`,onClick:ee,children:`确认删除`})]})]})})]})}function _O({className:e,orientation:t=`horizontal`,decorative:n=!0,...r}){return(0,K.jsx)(Fp,{"data-slot":`separator`,decorative:n,orientation:t,className:mn(`shrink-0 bg-border data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px`,e),...r})}function vO({className:e,orientation:t=`horizontal`,...n}){return(0,K.jsx)(lm,{"data-slot":`tabs`,"data-orientation":t,orientation:t,className:mn(`group/tabs flex gap-2 data-[orientation=horizontal]:flex-col`,e),...n})}var yO=yt(`group/tabs-list inline-flex w-fit items-center justify-center rounded-lg p-[3px] text-muted-foreground group-data-[orientation=horizontal]/tabs:h-9 group-data-[orientation=vertical]/tabs:h-fit group-data-[orientation=vertical]/tabs:flex-col data-[variant=line]:rounded-none`,{variants:{variant:{default:`bg-muted`,line:`gap-1 bg-transparent`}},defaultVariants:{variant:`default`}});function bO({className:e,variant:t=`default`,...n}){return(0,K.jsx)(dm,{"data-slot":`tabs-list`,"data-variant":t,className:mn(yO({variant:t}),e),...n})}function xO({className:e,...t}){return(0,K.jsx)(pm,{"data-slot":`tabs-trigger`,className:mn(`relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-2 py-1 text-sm font-medium whitespace-nowrap text-foreground/60 transition-all group-data-[orientation=vertical]/tabs:w-full group-data-[orientation=vertical]/tabs:justify-start hover:text-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-50 group-data-[variant=default]/tabs-list:data-[state=active]:shadow-sm group-data-[variant=line]/tabs-list:data-[state=active]:shadow-none dark:text-muted-foreground dark:hover:text-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4`,`group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-[state=active]:bg-transparent dark:group-data-[variant=line]/tabs-list:data-[state=active]:border-transparent dark:group-data-[variant=line]/tabs-list:data-[state=active]:bg-transparent`,`data-[state=active]:bg-background data-[state=active]:text-foreground dark:data-[state=active]:border-input dark:data-[state=active]:bg-input/30 dark:data-[state=active]:text-foreground`,`after:absolute after:bg-foreground after:opacity-0 after:transition-opacity group-data-[orientation=horizontal]/tabs:after:inset-x-0 group-data-[orientation=horizontal]/tabs:after:bottom-[-5px] group-data-[orientation=horizontal]/tabs:after:h-0.5 group-data-[orientation=vertical]/tabs:after:inset-y-0 group-data-[orientation=vertical]/tabs:after:-right-1 group-data-[orientation=vertical]/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-[state=active]:after:opacity-100`,e),...t})}function SO({className:e,...t}){return(0,K.jsx)(hm,{"data-slot":`tabs-content`,className:mn(`flex-1 outline-none`,e),...t})}function CO({...e}){return(0,K.jsx)(gd,{"data-slot":`dropdown-menu`,...e})}function wO({...e}){return(0,K.jsx)(vd,{"data-slot":`dropdown-menu-trigger`,...e})}function TO({className:e,sideOffset:t=4,...n}){return(0,K.jsx)(yd,{children:(0,K.jsx)(xd,{"data-slot":`dropdown-menu-content`,sideOffset:t,className:mn(`z-50 min-w-36 overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95`,e),...n})})}function EO({className:e,...t}){return(0,K.jsx)(Sd,{"data-slot":`dropdown-menu-item`,className:mn(`relative flex cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-1.5 text-xs outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:h-3.5 [&_svg]:w-3.5 [&_svg]:shrink-0`,e),...t})}function DO({className:e,...t}){return(0,K.jsx)(Cd,{"data-slot":`dropdown-menu-separator`,className:mn(`-mx-1 my-1 h-px bg-border`,e),...t})}async function OO(e,t){let n=e.usage.length?`插件「${e.name}」被 ${e.usage.length} 处引用,删除将从这些工作台摘除该面板。确认删除?`:`删除插件「${e.name}」?`;if(window.confirm(n))try{await lt(`/api/panels`,{id:e.id,force:!0}),Z.success(`已删除`),t()}catch(e){Z.error(String(e.message))}}function kO({target:e,onClose:t,agents:n}){let[r,i]=(0,v.useState)(null),[a,o]=(0,v.useState)(``),[s,c]=(0,v.useState)(!0),[l,u]=(0,v.useState)(!1);(0,v.useEffect)(()=>{if(!e){i(null);return}let n=e.type===`panel`?`id=${encodeURIComponent(e.id||``)}`:`agentId=${encodeURIComponent(e.agentId||``)}`;ot(`/api/assets/preview?type=${e.type}&${n}`).then(e=>{i(e),o(e.name)}).catch(e=>{Z.error(String(e.message)),t()})},[e]);let d=async()=>{if(e){u(!0);try{let n=await st(`/api/assets/share`,{type:e.type,id:e.id,agentId:e.agentId,name:a,bind_agent:s&&e.agentId?e.agentId:void 0}),i=r?.manifest.requires.apis.length||0,o=r?.manifest.requires.actions.length||0;Z.success(`已发布 ${n.name}@${n.version}${n.bound?`,已绑定到助手`:``}`,{description:`外部 API ×${i} · 交互脚本 ×${o}${o?`(命令全文已在 ARM 资产包 SKILL.md 留档)`:``}`}),t()}catch(e){Z.error(String(e.message))}finally{u(!1)}}};if(!e)return null;let f=r?.manifest.requires;return(0,K.jsx)(a_,{open:!!e,onOpenChange:e=>{!e&&!l&&t()},children:(0,K.jsxs)(c_,{children:[(0,K.jsx)(l_,{children:(0,K.jsxs)(d_,{className:`flex items-center gap-2`,children:[(0,K.jsx)(_h,{className:`h-4 w-4 text-primary`}),`发布为 UI 资产 · `,e.title]})}),(0,K.jsx)(eO,{className:`max-h-96`,children:(0,K.jsxs)(`div`,{className:`space-y-3 pr-2 text-xs`,children:[(0,K.jsxs)(`div`,{className:`space-y-1`,children:[(0,K.jsx)(m_,{className:`text-xs`,children:`资产名(全局唯一锚,同名发布追加新版本)`}),(0,K.jsx)(p_,{value:a,onChange:e=>o(e.target.value),className:`font-mono text-xs`})]}),r&&(0,K.jsxs)(K.Fragment,{children:[(0,K.jsxs)(`div`,{className:`rounded-md border bg-muted/30 p-2.5`,children:[(0,K.jsx)(`div`,{className:`font-medium`,children:`包含内容`}),(0,K.jsxs)(`div`,{className:`mt-1 text-muted-foreground`,children:[`面板插件:`,r.manifest.provides.panels.join(`、`)||`无`,(0,K.jsx)(`br`,{}),`数据集 schema:`,r.manifest.provides.collections.join(`、`)||`无`,`(仅建表定义,不含数据)`,r.manifest.provides.workbench&&(0,K.jsxs)(K.Fragment,{children:[(0,K.jsx)(`br`,{}),`工作台 DSL:workbench.json`]})]}),(0,K.jsx)(`div`,{className:`mt-1 font-mono text-[10px] text-muted-foreground`,children:r.files.join(` · `)})]}),!!f?.apis.length&&(0,K.jsxs)(`div`,{className:`rounded-md border border-blue-500/30 bg-blue-500/5 p-2.5`,children:[(0,K.jsx)(`div`,{className:`font-medium text-blue-300`,children:`外部 API 依赖(安装后环境需可达)`}),(0,K.jsx)(`ul`,{className:`mt-1 list-disc pl-4 text-muted-foreground`,children:f.apis.map(e=>(0,K.jsxs)(`li`,{children:[(0,K.jsx)(`span`,{className:`font-mono`,children:e.host}),`:`,e.usage]},e.host))})]}),!!f?.actions.length&&(0,K.jsxs)(`div`,{className:`rounded-md border border-amber-500/30 bg-amber-500/5 p-2.5`,children:[(0,K.jsx)(`div`,{className:`font-medium text-amber-300`,children:`交互脚本(真实 shell 命令,随包公开)`}),(0,K.jsx)(`ul`,{className:`mt-1 space-y-1`,children:f.actions.map(e=>(0,K.jsxs)(`li`,{className:`text-muted-foreground`,children:[`[`,e.panel,`/`,e.id,`] `,e.label,e.has_credentials&&(0,K.jsx)(J,{className:`ml-1 h-4 bg-amber-500/15 px-1 text-[9px] text-amber-300`,children:`⚠️ 疑似含凭据`}),(0,K.jsx)(`div`,{className:`mt-0.5 break-all rounded bg-muted/50 p-1 font-mono text-[10px]`,children:e.exec})]},`${e.panel}/${e.id}`))}),(0,K.jsx)(`p`,{className:`mt-1.5 text-[10px] text-amber-400`,children:`命令明文将进入资产包——含密码/令牌的命令请先改用环境变量或凭据占位,再发布。`})]}),e.agentId&&n&&n.length>0&&(0,K.jsxs)(`label`,{className:`flex items-center gap-2 rounded-md border p-2.5`,children:[(0,K.jsx)(i_,{checked:s,onCheckedChange:e=>c(!!e)}),(0,K.jsx)(`span`,{children:`发布后同时绑定到当前助手(下载该助手的其他现场将自动物化此工作台)`})]})]})]})}),(0,K.jsxs)(u_,{children:[(0,K.jsx)(Y,{variant:`outline`,disabled:l,onClick:t,children:`取消`}),(0,K.jsx)(Y,{disabled:l||!a,onClick:d,children:l?`发布中…`:`发布到 ARM`})]})]})})}function AO({open:e,onClose:t,onInstalled:n,agents:r}){let[i,a]=(0,v.useState)(``),[o,s]=(0,v.useState)([]),[c,l]=(0,v.useState)(!1),[u,d]=(0,v.useState)(null),[f,p]=(0,v.useState)(``),m=(0,v.useRef)(0);(0,v.useEffect)(()=>{if(!e)return;let t=setTimeout(()=>{let e=++m.current;l(!0),ot(`/api/assets/arm-library${i?`?keyword=${encodeURIComponent(i)}`:``}`).then(t=>{e===m.current&&s(t.items||[])}).catch(e=>Z.error(String(e.message))).finally(()=>{e===m.current&&l(!1)})},400);return()=>clearTimeout(t)},[i,e]),(0,v.useEffect)(()=>{e&&!f&&r.length&&p(r[0].agent_id)},[e,r]);let h=async e=>{if(e.asset_type===`workbench`&&!f)Z.warning(`请先选择目标助手`);else{d(e.name);try{let r=await st(`/api/assets/install`,{name:e.name,agentId:e.asset_type===`workbench`?f:void 0}),i=r.workbench?`,工作台已导入为草稿(审阅后在「定制工作台」发布)`:``,a=r.skipped_collections.length?`;同名数据集保留本地:${r.skipped_collections.join(`、`)}`:``;Z.success(`已安装 ${e.name}:面板 ×${r.panels.length}${i}${a}`),n(),t()}catch(e){Z.error(String(e.message))}finally{d(null)}}};return(0,K.jsx)(a_,{open:e,onOpenChange:e=>{!e&&!u&&t()},children:(0,K.jsxs)(c_,{children:[(0,K.jsx)(l_,{children:(0,K.jsxs)(d_,{className:`flex items-center gap-2`,children:[(0,K.jsx)(Yh,{className:`h-4 w-4 text-primary`}),`从 ARM 安装 UI 资产`]})}),(0,K.jsxs)(`div`,{className:`relative`,children:[(0,K.jsx)(xg,{className:`absolute left-3 top-2.5 h-3.5 w-3.5 text-muted-foreground`}),(0,K.jsx)(p_,{placeholder:`搜索资产名 / 描述…`,value:i,onChange:e=>a(e.target.value),className:`pl-9`,autoFocus:!0})]}),(0,K.jsxs)(`div`,{className:`flex items-center gap-2 text-xs text-muted-foreground`,children:[(0,K.jsx)(`span`,{className:`shrink-0`,children:`工作台资产安装到:`}),(0,K.jsx)(`select`,{value:f,onChange:e=>p(e.target.value),className:`h-8 flex-1 rounded-md border bg-background px-2 text-xs`,children:r.map(e=>(0,K.jsx)(`option`,{value:e.agent_id,children:e.name},e.agent_id))})]}),(0,K.jsx)(eO,{className:`max-h-80`,children:(0,K.jsxs)(`div`,{className:`space-y-1.5 pr-2`,children:[c&&!o.length&&(0,K.jsx)(`div`,{className:`py-6 text-center text-xs text-muted-foreground`,children:`加载中…`}),!c&&!o.length&&(0,K.jsx)(`div`,{className:`py-6 text-center text-xs text-muted-foreground`,children:i?`没有匹配资产`:`ARM 上暂无 UI 资产`}),o.map(e=>(0,K.jsxs)(`div`,{className:`flex items-center gap-2.5 rounded-md border p-2.5`,children:[e.asset_type===`workbench`?(0,K.jsx)(Yh,{className:`h-4 w-4 shrink-0 text-violet-400`}):(0,K.jsx)(pg,{className:`h-4 w-4 shrink-0 text-primary`}),(0,K.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,K.jsxs)(`div`,{className:`flex items-center gap-1.5 text-xs font-medium`,children:[(0,K.jsx)(`span`,{className:`truncate font-mono`,children:e.name}),e.latest_version&&(0,K.jsx)(J,{variant:`secondary`,className:`h-4 px-1 text-[9px]`,children:e.latest_version}),e.installed&&(0,K.jsx)(J,{className:`h-4 bg-emerald-500/15 px-1 text-[9px] text-emerald-400`,children:`本地已有`}),e.upgrade_available&&(0,K.jsx)(J,{className:`h-4 bg-amber-500/15 px-1 text-[9px] text-amber-300`,children:`⤴ 可升级`})]}),(0,K.jsxs)(`div`,{className:`truncate text-[10px] text-muted-foreground`,children:[e.description||`—`,` · 下载 `,e.download_count,` 次 · `,e.publisher]})]}),(0,K.jsx)(Y,{size:`sm`,variant:`secondary`,className:`h-7 text-[11px]`,disabled:u!==null,onClick:()=>h(e),children:u===e.name?`安装中…`:`安装`})]},e.name))]})}),(0,K.jsx)(u_,{children:(0,K.jsx)(Y,{variant:`outline`,onClick:t,children:`关闭`})})]})})}function jO(){let[e,t]=(0,v.useState)(null),[n,r]=(0,v.useState)(null),[i,a]=(0,v.useState)(!1),[o,s]=(0,v.useState)([]),c=()=>ot(`/api/plugins/center`).then(t);if((0,v.useEffect)(()=>{c(),ot(`/api/agents`).then(e=>s((e.agents||[]).filter(e=>e.installed).map(({agent_id:e,name:t})=>({agent_id:e,name:t})))).catch(()=>{})},[]),!e)return(0,K.jsx)(`div`,{className:`flex h-full items-center justify-center text-sm text-muted-foreground`,children:`插件中心加载中…`});let l=async(e,t,n)=>{let r=n===`deprecated`?`active`:`deprecated`;try{await st(`/api/plugins/lifecycle`,{kind:e,id:t,status:r}),Z.success(r===`deprecated`?`已停用(存量引用仍可渲染,新增被阻止)`:`已恢复`),c()}catch(e){Z.error(String(e.message))}},u=({icon:e,name:t,sub:n,status:r,usage:i,onToggle:a,tag:o,onDelete:s,onShare:c,armRef:l})=>(0,K.jsxs)(`div`,{className:`flex items-center gap-2.5 rounded-md border p-2.5`,children:[(0,K.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,K.jsxs)(`div`,{className:`flex items-center gap-1.5 text-xs font-medium`,children:[e,t,(0,K.jsx)(J,{variant:`secondary`,className:`h-4 px-1 text-[9px]`,children:o}),(0,K.jsx)(J,{className:`h-4 px-1 text-[9px] ${r===`deprecated`?`bg-red-500/15 text-red-400 hover:bg-red-500/25`:`bg-emerald-500/15 text-emerald-400 hover:bg-emerald-500/25`}`,children:r===`deprecated`?`已停用`:`在用`}),l&&(0,K.jsxs)(J,{className:`h-4 bg-violet-500/15 px-1 text-[9px] text-violet-300`,title:`ARM ${l.skill_name}@${l.version||``}`,children:[`已发布`,l.version?` ${l.version}`:``]})]}),(0,K.jsx)(`div`,{className:`truncate text-[10px] text-muted-foreground`,children:n}),(0,K.jsxs)(`div`,{className:`mt-0.5 text-[10px] text-muted-foreground`,children:[`引用:`,i.length?i.map(e=>`${e.agent}${e.draft?`*`:``}`).join(`、`):`无`]})]}),c&&(0,K.jsxs)(Y,{size:`sm`,variant:`ghost`,className:`h-7 text-[11px] text-violet-400`,onClick:c,title:`发布到 ARM UI 资产市场`,children:[(0,K.jsx)(_h,{className:`h-3 w-3`}),l?`更新`:`发布`]}),s&&(0,K.jsx)(Y,{size:`sm`,variant:`ghost`,className:`h-7 text-[11px] text-red-400`,onClick:s,children:`删除`}),(0,K.jsx)(Y,{size:`sm`,variant:r===`deprecated`?`secondary`:`ghost`,className:`h-7 text-[11px] ${r===`deprecated`?``:`text-red-400`}`,onClick:a,children:r===`deprecated`?`恢复`:`停用`})]});return(0,K.jsxs)(`div`,{className:`h-full overflow-auto p-5`,children:[(0,K.jsxs)(`div`,{className:`mb-4`,children:[(0,K.jsxs)(`h1`,{className:`flex items-center gap-2 text-lg font-bold`,children:[(0,K.jsx)(pg,{className:`h-5 w-5 text-primary`}),`插件中心`]}),(0,K.jsxs)(`p`,{className:`mt-0.5 text-xs text-muted-foreground`,children:[`统一注册表:系统面板与契约插件同源治理 · 生命周期(在用/停用)· 引用追踪(* 为草稿引用)· `,(0,K.jsx)(`span`,{className:`text-violet-400`,children:`发布/安装 ARM UI 资产(三资产模型)`})]})]}),(0,K.jsxs)(`div`,{className:`grid grid-cols-2 gap-4`,children:[(0,K.jsxs)(bm,{className:`py-0`,children:[(0,K.jsx)(xm,{className:`border-b py-2.5`,children:(0,K.jsxs)(Sm,{className:`flex items-center gap-1.5 text-xs`,children:[(0,K.jsx)(Dh,{className:`h-3.5 w-3.5`}),`系统插件(平台预装)`]})}),(0,K.jsx)(Cm,{className:`p-3`,children:(0,K.jsx)(`div`,{className:`space-y-1.5`,children:e.system.map(e=>(0,K.jsx)(u,{icon:(0,K.jsx)(`span`,{className:`font-mono text-[10px] text-muted-foreground`,children:e.id}),name:e.name,sub:e.note,status:e.status,usage:e.usage,tag:`system`,onToggle:()=>l(`system`,e.id,e.status)},e.id))})})]}),(0,K.jsxs)(bm,{className:`py-0`,children:[(0,K.jsx)(xm,{className:`border-b py-2.5`,children:(0,K.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,K.jsxs)(Sm,{className:`flex items-center gap-1.5 text-xs`,children:[(0,K.jsx)(th,{className:`h-3.5 w-3.5`}),`插件库(AI 开发 / 人工沉淀)`]}),(0,K.jsxs)(Y,{size:`sm`,variant:`outline`,className:`h-7 gap-1 text-[11px]`,onClick:()=>a(!0),children:[(0,K.jsx)(Yh,{className:`h-3 w-3`}),`从 ARM 安装`]})]})}),(0,K.jsx)(Cm,{className:`p-3`,children:(0,K.jsxs)(`div`,{className:`space-y-1.5`,children:[e.library.map(e=>(0,K.jsx)(u,{icon:(0,K.jsx)(pg,{className:`h-3 w-3 text-primary`}),name:`${e.name} ${e.version}`,sub:`${e.author===`ai`?`AI 开发`:e.author===`arm`?`ARM 安装`:`人工`} · ${e.description||e.id}`,status:e.status,usage:e.usage,tag:e.author===`ai`?`ai`:e.author===`arm`?`arm`:`human`,onToggle:()=>l(`plugin`,e.id,e.status),onDelete:()=>OO(e,c),onShare:()=>r({type:`panel`,id:e.id,title:e.name}),armRef:e.arm_ref},e.id)),e.library.length===0&&(0,K.jsx)(`div`,{className:`py-6 text-center text-xs text-muted-foreground`,children:`插件库为空`})]})})]})]}),(0,K.jsx)(_O,{className:`my-4`}),(0,K.jsxs)(bm,{className:`py-0`,children:[(0,K.jsx)(xm,{className:`border-b py-2.5`,children:(0,K.jsxs)(Sm,{className:`flex items-center gap-1.5 text-xs`,children:[(0,K.jsx)(Ng,{className:`h-3.5 w-3.5`}),`治理策略`]})}),(0,K.jsx)(Cm,{className:`p-3 text-[11px] leading-relaxed text-muted-foreground`,children:(0,K.jsx)(eO,{className:`max-h-40`,children:(0,K.jsxs)(`ul`,{className:`list-disc space-y-1 pl-4`,children:[(0,K.jsx)(`li`,{children:`一切面板进同一注册表:系统插件也有 manifest 与生命周期,不再是编译进前端的二等公民`}),(0,K.jsx)(`li`,{children:`停用(deprecate)不破坏存量:已引用的工作台继续渲染,但编辑器「添加面板」不再出现——安全下线`}),(0,K.jsx)(`li`,{children:`入库强制过校验器(check-panel.mjs):编译/契约/沙箱/模板四关 + 质量警告入审计——ARM 安装的插件同样过检`}),(0,K.jsx)(`li`,{children:`出网最小化:/api/proxy 仅放行插件代码中声明过的主机(防止面板成为任意内网跳板)`}),(0,K.jsx)(`li`,{children:`版本化与回滚:插件独立版本(同 id 覆盖自增),工作台按 id 引用,升级即时生效可回滚`}),(0,K.jsx)(`li`,{children:`数据隔离:插件数据集按助手分库(store-助手ID.db),共享需显式 scope=shared;资产包只带 schema 不带数据`}),(0,K.jsx)(`li`,{children:`UI 资产四红线(docs/08):包非运行时 · 数据必走 collection · 外部依赖必声明 · 单向 DAG`})]})})})]}),(0,K.jsx)(kO,{target:n,onClose:()=>{r(null),c()},agents:o}),(0,K.jsx)(AO,{open:i,onClose:()=>a(!1),onInstalled:c,agents:o})]})}function MO({pluginId:e,onRollback:t}){let[n,r]=(0,v.useState)(null);return(0,v.useEffect)(()=>{e&&ot(`/api/panels?id=${e}`).then(e=>r(e.plugin)).catch(()=>r(null))},[e]),n?(0,K.jsxs)(`div`,{className:`space-y-1`,children:[(0,K.jsxs)(`div`,{className:`flex items-center gap-1.5 text-[11px]`,children:[(0,K.jsx)(`span`,{className:`font-mono`,children:n.version}),(0,K.jsx)(`span`,{className:`text-muted-foreground`,children:`(当前)`})]}),(n.history||[]).slice().reverse().map(n=>(0,K.jsxs)(`div`,{className:`flex items-center gap-2 text-[11px]`,children:[(0,K.jsx)(`span`,{className:`font-mono`,children:n.version}),(0,K.jsx)(`span`,{className:`text-[10px] text-muted-foreground`,children:gt(n.at,`dts`)}),(0,K.jsx)(Y,{size:`sm`,variant:`ghost`,className:`ml-auto h-6 text-[10px]`,onClick:()=>t(e,n.version),children:`回退`})]},n.version)),!(n.history||[]).length&&(0,K.jsx)(`div`,{className:`text-[10px] text-muted-foreground`,children:`无历史版本`})]}):(0,K.jsx)(`div`,{className:`text-[10px] text-muted-foreground`,children:`(插件信息加载中…)`})}var NO=e=>({x:1,y:e.reduce((e,t)=>Math.max(e,t.grid?t.grid.y+t.grid.h-1:0),0)+1,w:6,h:1});function PO({agentId:e}){let[t,n]=(0,v.useState)(null),[r,i]=(0,v.useState)(!1),[a,o]=(0,v.useState)([]),[s,c]=(0,v.useState)(``),[l,u]=(0,v.useState)(!1),[d,f]=(0,v.useState)([]),[p,m]=(0,v.useState)(!1),[h,g]=(0,v.useState)(null),[_,y]=(0,v.useState)(null),[b,x]=(0,v.useState)(!1),[S,C]=(0,v.useState)(0),[w,T]=(0,v.useState)(null),[E,D]=(0,v.useState)([]),[O,k]=(0,v.useState)(null),A=(0,v.useRef)(`dev-${e.slice(0,8)}`).current,j=(0,v.useRef)(null),[M,N]=(0,v.useState)([]),[P,F]=(0,v.useState)(``),[I,L]=(0,v.useState)(!1),[R,ee]=(0,v.useState)(``),[te,z]=(0,v.useState)(null),[ne,re]=(0,v.useState)(!1),[ie,ae]=(0,v.useState)(null),oe=(0,v.useRef)(null),se=(0,v.useRef)(!0),ce=(0,v.useCallback)(()=>{let e=oe.current?.closest(`[data-slot="scroll-area-viewport"]`);e&&(e.scrollTop=e.scrollHeight)},[]);(0,v.useEffect)(()=>{let e=oe.current?.closest(`[data-slot="scroll-area-viewport"]`);if(!e)return;let t=()=>{se.current=e.scrollHeight-e.scrollTop-e.clientHeight<80};return e.addEventListener(`scroll`,t),()=>e.removeEventListener(`scroll`,t)},[]),(0,v.useEffect)(()=>{se.current&&ce()},[M,I,R,ce]);let le=()=>{ot(`/api/workbench?agent_id=${e}&draft=1`).then(e=>{n(e.dsl),i(e.isDraft),o(e.versions||[]),c(JSON.stringify(e.dsl,null,2))}),ot(`/api/panels`).then(e=>f(e.plugins||[]))};if((0,v.useEffect)(()=>{le()},[e]),(0,v.useEffect)(()=>{let e=()=>ot(`/api/state`).then(T).catch(()=>{});e();let t=setInterval(e,5e3);return ot(`/api/panels?with_code=1`).then(e=>D(e.plugins||[])),()=>clearInterval(t)},[]),!t)return(0,K.jsx)(`div`,{className:`flex h-full items-center justify-center text-sm text-muted-foreground`,children:`加载工作台 DSL…`});let B=t.panels,V=_===null?null:B[_],H=e=>{let r=JSON.parse(JSON.stringify(t));e(r),n(r),c(JSON.stringify(r,null,2)),i(!0)},ue=(e,t)=>H(n=>{let r=n.panels[e].grid||{x:1,y:1,w:6,h:1};n.panels[e].grid={...r,...t}}),de=t=>({devices:w?.devices||[],alarms:w?.alarms||[],kpi:w?.kpi||{},work_orders:w?.work_orders||[],inspections:w?.inspections||{},selected:O,onSelect:k,agentId:e,store:mt(e),runAction:(n,r)=>ht(e,String(t.id),n,r),params:{...t.params||{},agentId:e,wsId:`default`}}),fe=e=>e.type===`custom`?e.code:E.find(t=>t.id===e.panel)?.code||``,pe=()=>H(e=>e.panels.push({id:`block_${Math.random().toString(36).slice(2,6)}`,type:`placeholder`,title:`空区块`,grid:NO(e.panels)})),me=(e,t)=>{H(n=>{if(e!==null&&e<n.panels.length){let r=n.panels[e];Object.assign(r,{type:`custom_panel`,panel:t.id,title:r.title===`空区块`?t.name:r.title})}else n.panels.push({id:`plug_${t.id}_${Math.random().toString(36).slice(2,5)}`,type:`custom_panel`,title:t.name,panel:t.id,grid:NO(n.panels)})}),m(!1),g(null),Z.success(`已插入「${t.name}」(草稿,待发布)`)},he=async e=>{let t=B[e];z(e);let n=``;try{let e=t.panel||t.id,r=await ot(`/api/panel-errors?key=${encodeURIComponent(e)}`);n=r.errors?.length?r.errors.map(e=>`[${e.kind}] ${e.message}`).join(` | `):``}catch{}F(`请调试该插件:${n?`最近运行错误:${n}。`:`暂无上报错误,请先 read_panel_plugin 审代码,重点检查结果处理与错误路径。`}请定位根因、修复并说明验证方式。`),Z.info(`已锁定调试目标并带上错误上下文,发送即开始`)},ge=async(e,t)=>{try{let n=await st(`/api/panels/rollback`,{id:e,version:t});Z.success(`已回退到 ${t}(新版本号 ${n.plugin.version},引用即时生效)`),le()}catch(e){Z.error(String(e.message))}},_e=()=>{if(te===null||!B[te])return``;let e=B[te],t=e.grid||{x:1,y:1,w:6,h:1},n=Math.round(t.w/12*100),r=t.w<=3?`窄条(紧凑单列列表/迷你卡)`:t.w>=9?`宽区块(表格/多列仪表)`:`中等宽度(两列卡/紧凑表)`;return`【定制目标】区块「${e.title}」(id=${e.id}):第${t.x}列起、跨${t.w}列(约${n}%宽)、跨${t.h}行(${r})。${e.panel?`当前引用插件 ${e.panel}——先 read_panel_plugin 再决定改造还是重写。`:`空区块,可新建插件。`}`},ve=e=>{z(e),F(``),Z.info(`已锁定定制目标「${B[e].title}」——在右侧描述需求即可`)},ye=async()=>{u(!0);try{let r=await ct(`/api/workbench`,{agent_id:e,dsl:t});n(r.dsl),o(r.versions),c(JSON.stringify(r.dsl,null,2)),i(!1),re(!1),Z.success(`已发布 ${r.dsl.version},工作台即时生效`)}catch(e){Z.error(String(e.message))}finally{u(!1)}},be=async()=>{await lt(`/api/workbench/draft`,{agent_id:e}),Z.success(`已放弃草稿`),le()},xe=async t=>{try{let r=await st(`/api/workbench/rollback`,{agent_id:e,version:t});n(r.dsl),o(r.versions),c(JSON.stringify(r.dsl,null,2)),i(!1),Z.success(`已回滚到 ${t}`)}catch(e){Z.error(String(e.message))}},U=()=>{j.current?.abort()},Se=async()=>{if(I)Z.info(`对话进行中,请先停止再清空`);else if(window.confirm(`清空二开助手的会话历史?服务端上下文将被丢弃并从零开始;已生成的草稿与插件不受影响。`))try{await st(`/api/session/reset`,{scope:`dev`,sessionId:A}),N([]),ee(``),Z.success(`会话已清空`)}catch(e){Z.error(String(e.message))}},Ce=async()=>{let t=P.trim();if(!t||I)return;let n=_e()?`${_e()}\n需求:${t}`:t;F(``),L(!0),re(!1),se.current=!0,N(e=>[...e,{role:`user`,text:t}]);let r=!1,i=!1,a=new AbortController;j.current=a;try{await ut(`/api/dev/chat`,{sessionId:A,agentId:e,message:n},e=>{let t=e.type;t===`status`?ee(String(e.text||``)):t===`text_delta`?(i=!0,ee(``),N(t=>{let n=t[t.length-1];return n?.role===`agent`&&n.streaming?[...t.slice(0,-1),{...n,text:n.text+String(e.delta)}]:[...t,{role:`agent`,text:String(e.delta),streaming:!0}]})):t===`done`?!i&&!r&&N(e=>[...e,{role:`agent`,text:`(模型返回了空回复——请重试;若持续出现请到「系统设置」检查模型配置)`}]):t===`tool_start`?(r=!0,N(t=>[...t,{role:`agent`,text:``,streaming:!1,events:[{tool:String(e.tool),args:e.args||{}}]}])):t===`tool_end`?N(t=>{for(let n=t.length-1;n>=0;n--){let r=t[n];if(r.role===`agent`&&r.events){for(let n=r.events.length-1;n>=0;n--)if(r.events[n].tool===e.tool&&r.events[n].result===void 0)return r.events[n].result=String(e.result||``),r.events[n].ok=e.ok!==!1,[...t]}}return t}):t===`interrupted`?(ee(``),N(e=>[...e,{role:`agent`,text:`(已中断)`}])):t===`meta`?e.hasDraft?(re(!0),le()):r&&le():t===`error`&&Z.error(String(e.message))},a.signal)}catch(e){a.signal.aborted?N(e=>[...e,{role:`agent`,text:`(已中断)`}]):N(t=>[...t,{role:`agent`,text:`❌ ${String(e.message)}`}])}finally{ee(``),L(!1),j.current===a&&(j.current=null)}};return(0,K.jsxs)(`div`,{className:`flex h-full flex-col gap-3 overflow-hidden p-5`,children:[(0,K.jsxs)(`div`,{className:`flex shrink-0 items-end justify-between`,children:[(0,K.jsxs)(`div`,{children:[(0,K.jsx)(`h1`,{className:`text-lg font-bold`,children:`定制工作台`}),(0,K.jsx)(`p`,{className:`mt-0.5 text-xs text-muted-foreground`,children:`区块你规划 · 插件按区块占比定制 · 一切修改走草稿审阅发布`})]}),(0,K.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,K.jsx)(J,{variant:`secondary`,children:r?`草稿(未发布)`:`线上 ${t.version}`}),(0,K.jsxs)(Y,{size:`sm`,variant:`outline`,onClick:()=>{g(null),m(!0)},children:[(0,K.jsx)(pg,{className:`mr-1 h-3.5 w-3.5`}),`插件库`]}),(0,K.jsxs)(Y,{size:`sm`,variant:`outline`,title:`把当前工作台(含依赖插件/数据集 schema/交互脚本)发布为 ARM UI 资产`,onClick:()=>ae({type:`workbench`,agentId:e,title:t.workbench}),children:[(0,K.jsx)(_h,{className:`mr-1 h-3.5 w-3.5 text-violet-400`}),`导出资产`]}),(0,K.jsxs)(Y,{size:`sm`,disabled:l||!r,onClick:ye,children:[(0,K.jsx)(yg,{className:`mr-1 h-3.5 w-3.5`}),l?`发布中…`:`审阅后发布`]})]})]}),r&&(0,K.jsxs)(`div`,{className:`flex shrink-0 items-center gap-2 rounded-md border border-amber-500/50 bg-amber-500/10 px-3 py-2 text-xs text-amber-300`,children:[(0,K.jsx)(`span`,{children:`⚠`}),`草稿未发布——审阅后发布生效,或`,(0,K.jsx)(`button`,{className:`underline underline-offset-2`,onClick:be,children:`放弃草稿`})]}),(0,K.jsxs)(`div`,{className:`grid min-h-0 flex-1 grid-cols-[1fr_380px] gap-4`,children:[(0,K.jsx)(`div`,{className:`flex min-h-0 flex-col`,children:(0,K.jsxs)(vO,{defaultValue:`canvas`,className:`flex min-h-0 flex-1 flex-col`,children:[(0,K.jsxs)(bO,{className:`shrink-0`,children:[(0,K.jsxs)(xO,{value:`canvas`,className:`text-xs`,children:[(0,K.jsx)(Yh,{className:`mr-1 h-3.5 w-3.5`}),`布局画布`]}),(0,K.jsx)(xO,{value:`json`,className:`text-xs`,children:`JSON`})]}),(0,K.jsxs)(SO,{value:`canvas`,className:`mt-2 flex min-h-0 flex-1 flex-col gap-2`,children:[(0,K.jsxs)(`div`,{className:`flex shrink-0 flex-nowrap items-center gap-1.5 overflow-x-auto rounded-md border bg-card p-2`,children:[(0,K.jsxs)(Y,{size:`sm`,variant:`secondary`,className:`h-7 shrink-0 text-xs`,onClick:pe,children:[(0,K.jsx)(dg,{className:`mr-1 h-3 w-3`}),`添加区块`]}),(0,K.jsx)(_O,{orientation:`vertical`,className:`mx-1 h-5 shrink-0`}),V?(0,K.jsxs)(K.Fragment,{children:[(0,K.jsxs)(`span`,{className:`max-w-28 shrink-0 truncate text-[11px] text-muted-foreground`,title:V.title,children:[`「`,V.title,`」`]}),(0,K.jsx)(`span`,{className:`shrink-0 text-[11px]`,children:`列`}),(0,K.jsx)(Y,{size:`icon`,variant:`ghost`,className:`h-7 w-7 shrink-0`,title:`左移一列`,onClick:()=>ue(_,{x:Math.max(1,(V.grid?.x||1)-1)}),children:(0,K.jsx)(qm,{className:`h-3 w-3`})}),(0,K.jsx)(Y,{size:`icon`,variant:`ghost`,className:`h-7 w-7 shrink-0`,title:`右移一列`,onClick:()=>ue(_,{x:Math.min(12,(V.grid?.x||1)+1)}),children:(0,K.jsx)(Ym,{className:`h-3 w-3`})}),(0,K.jsx)(`span`,{className:`shrink-0 text-[11px]`,children:`跨列`}),(0,K.jsx)(Y,{size:`icon`,variant:`ghost`,className:`h-7 w-7 shrink-0`,title:`跨列减一`,onClick:()=>ue(_,{w:Math.max(1,(V.grid?.w||6)-1)}),children:`−`}),(0,K.jsx)(Y,{size:`icon`,variant:`ghost`,className:`h-7 w-7 shrink-0`,title:`跨列加一`,onClick:()=>ue(_,{w:Math.min(12,(V.grid?.w||6)+1)}),children:`+`}),(0,K.jsx)(`span`,{className:`shrink-0 text-[11px]`,children:`跨行`}),(0,K.jsx)(Y,{size:`icon`,variant:`ghost`,className:`h-7 w-7 shrink-0`,title:`跨行减一`,onClick:()=>ue(_,{h:Math.max(1,(V.grid?.h||1)-1)}),children:(0,K.jsx)(Zm,{className:`h-3 w-3`})}),(0,K.jsx)(Y,{size:`icon`,variant:`ghost`,className:`h-7 w-7 shrink-0`,title:`跨行加一`,onClick:()=>ue(_,{h:Math.min(8,(V.grid?.h||1)+1)}),children:(0,K.jsx)(Gm,{className:`h-3 w-3`})}),(0,K.jsxs)(Y,{size:`sm`,variant:`ghost`,className:`h-7 shrink-0 text-xs text-primary`,onClick:()=>ve(_),children:[(0,K.jsx)(th,{className:`mr-1 h-3 w-3`}),`AI 定制`]}),(0,K.jsxs)(CO,{children:[(0,K.jsx)(wO,{asChild:!0,children:(0,K.jsxs)(Y,{size:`sm`,variant:`ghost`,className:`h-7 shrink-0 text-xs`,children:[(0,K.jsx)(Th,{className:`h-3 w-3`}),`更多`]})}),(0,K.jsxs)(TO,{align:`end`,children:[(V.type===`custom`||V.type===`custom_panel`)&&(0,K.jsxs)(EO,{className:`text-amber-400 focus:text-amber-300`,onClick:()=>he(_),children:[(0,K.jsx)(t_,{}),`AI 调试`]}),(0,K.jsxs)(EO,{onClick:()=>ue(_,{x:1,w:12}),children:[(0,K.jsx)(Ug,{className:`text-muted-foreground`}),`占满宽度`]}),(0,K.jsxs)(EO,{onClick:()=>{let e=B.reduce((e,t)=>Math.max(e,(t.grid?.y||1)+(t.grid?.h||1)-1),1);ue(_,{h:Math.max(1,e-(V.grid?.y||1)+1)})},children:[(0,K.jsx)(Gg,{className:`text-muted-foreground`}),`延到底部`]}),(0,K.jsxs)(EO,{onClick:()=>ue(_,{x:1}),children:[(0,K.jsx)(Um,{className:`text-muted-foreground`}),`贴左`]}),(0,K.jsxs)(EO,{onClick:()=>ue(_,{x:12-(V.grid?.w||6)+1}),children:[(0,K.jsx)(Vm,{className:`text-muted-foreground`}),`贴右`]}),(0,K.jsx)(DO,{}),(0,K.jsxs)(EO,{onClick:()=>{g(_),m(!0)},children:[(0,K.jsx)(pg,{className:`text-muted-foreground`}),`换插件`]}),(0,K.jsxs)(EO,{onClick:()=>{C(_),x(!0)},children:[(0,K.jsx)(Dg,{className:`text-muted-foreground`}),`面板设置`]}),(0,K.jsxs)(EO,{className:`text-red-400 focus:text-red-300`,onClick:()=>{H(e=>e.panels.splice(_,1)),y(null)},children:[(0,K.jsx)(qg,{}),`删除区块`]})]})]})]}):(0,K.jsx)(`span`,{className:`shrink-0 text-[11px] text-muted-foreground`,children:`点击画布中的区块进行编辑`})]}),(0,K.jsx)(`div`,{className:`shrink-0`,children:(0,K.jsx)(mO,{})}),(0,K.jsx)(`div`,{className:`relative min-h-0 flex-1 overflow-hidden rounded-lg border bg-muted/20 p-2`,children:(0,K.jsx)(pO,{className:`absolute inset-0 overflow-auto`,dsl:t,edit:{sel:_,onSelect:y,onGrid:(e,t)=>ue(e,t)},renderPanel:t=>{let n=fe(t);return n?(0,K.jsx)(dO,{code:n,data:de(t),meta:{agentId:e,panelId:t.id,pluginId:t.panel}}):(0,K.jsx)(`div`,{className:`p-3 text-[11px] text-muted-foreground`,children:`(插件代码加载中…)`})},renderDialog:()=>(0,K.jsxs)(`div`,{className:`flex h-full flex-col items-center justify-center gap-1 text-[11px] text-muted-foreground`,children:[(0,K.jsx)(th,{className:`h-5 w-5 text-primary`}),`诊断对话(内核)`,(0,K.jsx)(`span`,{className:`text-[10px]`,children:`发布后在工作台可交互`})]}),renderPlaceholder:()=>(0,K.jsxs)(`div`,{className:`flex h-full flex-col items-center justify-center gap-1 text-[11px] text-muted-foreground`,children:[(0,K.jsx)(dg,{className:`h-4 w-4`}),`空区块`,(0,K.jsx)(`span`,{className:`text-[10px]`,children:`选中后「换插件」或「AI 定制」`})]})})}),(0,K.jsx)(`p`,{className:`shrink-0 text-[10px] text-muted-foreground`,children:`所见即所得(比例一致):画布 = 缩小的可视区,行高为可视区等分——跨 n 行即占 n/总行数,与实际浏览时任何屏幕尺寸下的比例完全一致;内容超高时面板内部滚动。拖拽移动(吸附网格)· 手柄调跨列跨行 · 右上角显示占比。`})]}),(0,K.jsxs)(SO,{value:`json`,className:`mt-2 flex min-h-0 flex-1 flex-col gap-2`,children:[(0,K.jsx)(`textarea`,{value:s,onChange:e=>c(e.target.value),spellCheck:!1,className:`min-h-0 w-full flex-1 resize-none rounded-md border bg-muted p-3 font-mono text-[11px] leading-relaxed`}),(0,K.jsxs)(`div`,{className:`flex shrink-0 gap-2`,children:[(0,K.jsx)(Y,{size:`sm`,onClick:()=>{try{let e=JSON.parse(s);if(!e.panels)throw Error(`缺少 panels`);n(e),i(!0),Z.success(`JSON 已应用(未发布)`)}catch(e){Z.error(`JSON 解析失败: ${e.message}`)}},children:`应用 JSON`}),(0,K.jsx)(Y,{size:`sm`,variant:`outline`,onClick:()=>c(JSON.stringify(t,null,2)),children:`从画布刷新`})]})]})]})}),(0,K.jsxs)(`div`,{className:`flex min-h-0 flex-col gap-4`,children:[(0,K.jsx)(bm,{className:`flex min-h-0 flex-1 flex-col py-0`,children:(0,K.jsxs)(Cm,{className:`flex min-h-0 flex-1 flex-col p-0`,children:[(0,K.jsxs)(`div`,{className:`flex shrink-0 items-center gap-1.5 border-b px-3 py-2 text-xs font-semibold`,children:[(0,K.jsx)(Lg,{className:`h-3.5 w-3.5 text-primary`}),`二开助手`,(0,K.jsx)(`span`,{className:`font-normal text-muted-foreground`,children:`· 描述需求,直接定制区块`}),(0,K.jsx)(`button`,{className:`ml-auto shrink-0 rounded p-0.5 text-muted-foreground hover:text-foreground disabled:opacity-40`,title:`清空会话(丢弃服务端上下文,从零开始)`,disabled:I,onClick:Se,children:(0,K.jsx)(qg,{className:`h-3.5 w-3.5`})})]}),te!==null&&B[te]&&(()=>{let e=B[te],t=e.grid||{x:1,y:1,w:6,h:1},n=Math.round(t.w/12*100);return(0,K.jsxs)(`div`,{className:`flex shrink-0 items-center gap-1.5 border-b bg-primary/5 px-3 py-1.5 text-[11px]`,children:[(0,K.jsx)(yh,{className:`h-3.5 w-3.5 shrink-0 text-primary`}),(0,K.jsxs)(`span`,{className:`min-w-0 truncate`,children:[`定制目标:`,(0,K.jsx)(`b`,{children:e.title}),` · `,n,`% 宽 · `,t.h,` 行`,e.panel?(0,K.jsxs)(K.Fragment,{children:[` · `,(0,K.jsx)(`span`,{className:`font-mono`,children:e.panel})]}):` · 空区块`]}),(0,K.jsx)(`button`,{className:`ml-auto shrink-0 rounded p-0.5 text-muted-foreground hover:text-foreground`,title:`取消目标,改为自由描述`,onClick:()=>z(null),children:`×`})]})})(),ne&&r&&(0,K.jsxs)(`div`,{className:`flex shrink-0 items-center gap-1.5 border-b bg-emerald-500/10 px-3 py-1.5 text-[11px] text-emerald-400`,children:[(0,K.jsx)(ph,{className:`h-3.5 w-3.5 shrink-0`}),`草稿已生成——到顶部「审阅后发布」生效`]}),(0,K.jsx)(eO,{className:`min-h-0 flex-1`,children:(0,K.jsxs)(`div`,{className:`space-y-2.5 p-3`,ref:oe,children:[M.length===0&&(0,K.jsx)(`div`,{className:`space-y-2`,children:(0,K.jsxs)(`div`,{className:`rounded-md border border-dashed border-primary/30 bg-primary/5 p-3 text-[11px] leading-relaxed`,children:[(0,K.jsx)(`div`,{className:`mb-1 text-xs font-semibold text-primary`,children:`✨ 两种玩法`}),(0,K.jsxs)(`div`,{children:[`① 画布选中区块 → 工具条「`,(0,K.jsx)(`b`,{children:`AI 定制`}),`」→ 目标钉在上方,只管补需求`]}),(0,K.jsx)(`div`,{children:`② 直接描述需求,助手自动建区块进草稿`}),(0,K.jsx)(`div`,{className:`mt-1.5 flex flex-wrap gap-1.5`,children:[[`窄条:最近告警`,`新建一个窄条区块(跨3列):最近活动告警列表,高级别标红,点击可选中设备`],[`横条:KPI 摘要`,`新建一个单行横条区块:关键指标摘要读数(props.kpi),异常着色`],[`宽表:设备台账`,`新建一个宽区块(跨9列以上):设备台账表格,显示全部字段,支持点击选中`]].map(([e,t])=>(0,K.jsx)(`button`,{onClick:()=>F(t),className:`rounded-full border px-2.5 py-1 text-[11px] text-muted-foreground transition-colors hover:border-primary/60 hover:text-primary`,children:e},e))})]})}),M.map((e,t)=>(0,K.jsxs)(`div`,{children:[(0,K.jsx)(`div`,{className:e.role===`user`?`ml-auto max-w-[90%] rounded-lg bg-primary/20 px-2.5 py-1.5 text-xs break-words whitespace-pre-wrap`:`max-w-full rounded-lg bg-card px-2.5 py-1.5 text-xs leading-relaxed break-words whitespace-pre-wrap`,children:e.text}),(e.events||[]).map((e,t)=>(0,K.jsxs)(`div`,{className:`mt-1 min-w-0 rounded-md border border-dashed px-2 py-1 text-[10px]`,children:[(0,K.jsx)(`span`,{children:e.ok===!1?`❌`:`🛠`}),` `,(0,K.jsx)(`span`,{className:`font-mono font-semibold`,children:e.tool}),(0,K.jsx)(`pre`,{className:`mt-0.5 max-h-32 overflow-auto whitespace-pre-wrap break-all text-muted-foreground`,children:String(e.result||``).slice(0,260)})]},t))]},t)),(I||R)&&(0,K.jsxs)(`div`,{className:`flex items-center gap-1.5 px-1 text-[11px] text-muted-foreground`,children:[(0,K.jsx)(`span`,{className:`h-1.5 w-1.5 animate-pulse rounded-full bg-primary`}),R||`开发中…`]})]})}),(0,K.jsxs)(`div`,{className:`shrink-0 space-y-1 border-t p-2`,children:[(0,K.jsx)(`textarea`,{value:P,onChange:e=>F(e.target.value),rows:2,onKeyDown:e=>{e.key===`Enter`&&!e.shiftKey&&!e.nativeEvent.isComposing&&(e.preventDefault(),Ce())},placeholder:te===null?`描述需求,如「左上窄条做一个最近工单列表」(Enter 发送)…`:`描述对「${B[te]?.title}」的需求(Enter 发送,Shift+Enter 换行)…`,className:`min-h-[56px] w-full resize-none rounded-md border bg-background px-2 py-1.5 text-xs`}),(0,K.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,K.jsx)(`span`,{className:`text-[10px] text-muted-foreground`,children:te===null?`未锁定目标——助手会自动规划区块位置`:`目标上下文(位置/几何/插件)发送时自动携带`}),I?(0,K.jsxs)(Y,{size:`sm`,variant:`destructive`,className:`h-7 gap-1 text-xs`,onClick:U,children:[(0,K.jsx)(Vg,{className:`h-3 w-3`}),`停止`]}):(0,K.jsxs)(Y,{size:`sm`,className:`h-7 gap-1 text-xs`,disabled:!P.trim(),onClick:Ce,children:[(0,K.jsx)(Cg,{className:`h-3 w-3`}),`发送`]})]})]})]})}),(0,K.jsx)(bm,{className:`shrink-0 py-0`,children:(0,K.jsxs)(Cm,{className:`p-0`,children:[(0,K.jsxs)(`div`,{className:`flex items-center gap-1.5 border-b px-3 py-2 text-xs font-semibold`,children:[(0,K.jsx)(_g,{className:`h-3.5 w-3.5`}),`版本历史`]}),(0,K.jsx)(`div`,{className:`max-h-40 overflow-y-auto`,children:(0,K.jsxs)(`div`,{className:`divide-y`,children:[a.length===0&&(0,K.jsx)(`div`,{className:`p-3 text-center text-xs text-muted-foreground`,children:`暂无历史`}),[...a].reverse().map((e,t)=>(0,K.jsxs)(`div`,{className:`flex items-center gap-2 px-3 py-1.5 text-xs`,children:[(0,K.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,K.jsx)(`span`,{className:`font-mono font-semibold`,children:e.version}),t===0&&!r&&(0,K.jsx)(J,{className:`ml-1 h-4 px-1 text-[9px]`,children:`线上`}),(0,K.jsx)(`div`,{className:`text-[10px] text-muted-foreground`,children:gt(e.at,`dts`)})]}),t!==0&&(0,K.jsx)(Y,{size:`sm`,variant:`ghost`,className:`h-6 text-[10px]`,onClick:()=>xe(e.version),children:`回滚`})]},`${e.version}-${e.at}`))]})})]})})]})]}),(0,K.jsx)(a_,{open:b,onOpenChange:x,children:(0,K.jsxs)(c_,{className:`max-w-md`,children:[(0,K.jsx)(l_,{children:(0,K.jsxs)(d_,{children:[`区块设置 · `,B[S]?.title]})}),(0,K.jsxs)(`div`,{className:`space-y-2`,children:[(0,K.jsxs)(`div`,{className:`space-y-1`,children:[(0,K.jsx)(m_,{className:`text-xs`,children:`标题`}),(0,K.jsx)(p_,{defaultValue:B[S]?.title||``,className:`text-xs`,onBlur:e=>H(t=>{t.panels[S].title=e.target.value})})]}),B[S]?.type===`custom`&&(0,K.jsxs)(`div`,{className:`space-y-1`,children:[(0,K.jsx)(m_,{className:`text-xs`,children:`内联代码(契约:function Panel(props))`}),(0,K.jsx)(`textarea`,{defaultValue:B[S]?.code||``,spellCheck:!1,onBlur:e=>H(t=>{t.panels[S].code=e.target.value}),className:`h-40 w-full rounded-md border bg-muted p-2 font-mono text-[10px]`})]}),B[S]?.type===`custom_panel`&&(0,K.jsxs)(`div`,{className:`space-y-1`,children:[(0,K.jsx)(m_,{className:`text-xs`,children:`插件版本(可回退,回退即时生效)`}),(0,K.jsx)(MO,{pluginId:String(B[S]?.panel||``),onRollback:ge})]}),(0,K.jsxs)(`div`,{className:`space-y-1`,children:[(0,K.jsx)(m_,{className:`text-xs`,children:`params(插件经 props.params 读取)`}),(0,K.jsx)(`textarea`,{defaultValue:JSON.stringify(B[S]?.params||{},null,1),spellCheck:!1,onBlur:e=>{try{H(t=>{t.panels[S].params=JSON.parse(e.target.value||`{}`)})}catch{Z.error(`params JSON 无效`)}},className:`h-20 w-full rounded-md border bg-muted p-2 font-mono text-[10px]`})]})]}),(0,K.jsx)(u_,{children:(0,K.jsx)(Y,{onClick:()=>x(!1),children:`完成`})})]})}),(0,K.jsx)(a_,{open:p,onOpenChange:e=>{m(e),e||g(null)},children:(0,K.jsxs)(c_,{children:[(0,K.jsx)(l_,{children:(0,K.jsxs)(d_,{className:`flex items-center gap-1.5`,children:[(0,K.jsx)(pg,{className:`h-4 w-4`}),`插件库`,h===null?``:` · 插入到选中区块`]})}),(0,K.jsx)(`div`,{className:`max-h-72 overflow-y-auto`,children:(0,K.jsx)(`div`,{className:`space-y-1.5`,children:d.filter(e=>e.status!==`deprecated`).map(e=>(0,K.jsxs)(`div`,{className:`flex items-center gap-2 rounded-md border p-2.5`,children:[(0,K.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,K.jsxs)(`div`,{className:`flex min-w-0 items-center gap-1.5 text-xs font-medium`,children:[(0,K.jsx)(`span`,{className:`min-w-0 truncate`,title:e.name,children:e.name}),(0,K.jsx)(J,{variant:`secondary`,className:`h-4 shrink-0 px-1 text-[9px]`,children:e.version}),(0,K.jsx)(J,{variant:`outline`,className:`h-4 shrink-0 px-1 text-[9px]`,children:e.author===`system`?`范本`:e.author===`ai`?`AI`:`人工`})]}),(0,K.jsx)(`div`,{className:`truncate text-[10px] text-muted-foreground`,children:e.description||e.id})]}),(0,K.jsx)(Y,{size:`sm`,variant:`secondary`,className:`h-7 shrink-0 text-[11px]`,onClick:()=>me(h,e),children:`插入`})]},e.id))})}),(0,K.jsxs)(u_,{children:[(0,K.jsx)(Y,{variant:`outline`,size:`sm`,onClick:pe,children:`先加空区块`}),(0,K.jsx)(Y,{variant:`outline`,onClick:()=>m(!1),children:`关闭`})]})]})}),(0,K.jsx)(kO,{target:ie,onClose:()=>ae(null),agents:[{agent_id:e,name:t.workbench||`当前助手`}]}),(0,K.jsx)(`p`,{className:`shrink-0 text-center text-[11px] text-muted-foreground`,children:`区块几何 = 插件设计输入:宽≤3 列紧凑列表、≥9 列表格/仪表 · AI 定制锁定目标、上下文自动携带 · 草稿审阅发布。`})]})}var FO=[{key:`tool_calls`,label:`工具调用`,icon:(0,K.jsx)(t_,{className:`h-3.5 w-3.5`}),tone:`text-sky-400`},{key:`guardrail_blocks`,label:`守护栏拦截`,icon:(0,K.jsx)(jg,{className:`h-3.5 w-3.5`}),tone:`text-red-400`},{key:`human_confirms`,label:`人工确认执行`,icon:(0,K.jsx)(zm,{className:`h-3.5 w-3.5`}),tone:`text-amber-400`},{key:`orchestrations`,label:`编排执行`,icon:(0,K.jsx)(Lg,{className:`h-3.5 w-3.5`}),tone:`text-violet-400`},{key:`experiences`,label:`经验回流`,icon:(0,K.jsx)($m,{className:`h-3.5 w-3.5`}),tone:`text-emerald-400`},{key:`kb_searches`,label:`知识检索`,icon:(0,K.jsx)(xg,{className:`h-3.5 w-3.5`}),tone:`text-cyan-400`},{key:`ai_drafts`,label:`AI 起草`,icon:(0,K.jsx)(Yg,{className:`h-3.5 w-3.5`}),tone:`text-pink-400`}];function IO(){let[e,t]=(0,v.useState)(null),[n,r]=(0,v.useState)(``),[i,a]=(0,v.useState)(null),[o,s]=(0,v.useState)(!1),c=()=>ot(`/api/evolution`).then(t);(0,v.useEffect)(()=>{c();let e=setInterval(c,1e4);return()=>clearInterval(e)},[]);let l=async()=>{if(n.trim()){s(!0);try{let e=await ot(`/api/kb/search?q=${encodeURIComponent(n)}`);a(e.items),c()}finally{s(!1)}}};return e?(0,K.jsxs)(`div`,{className:`h-full overflow-auto p-5`,children:[(0,K.jsxs)(`div`,{className:`mb-4`,children:[(0,K.jsxs)(`h1`,{className:`flex items-center gap-2 text-lg font-bold`,children:[(0,K.jsx)(Yg,{className:`h-5 w-5 text-primary`}),`自进化看板`]}),(0,K.jsxs)(`p`,{className:`mt-0.5 text-xs text-muted-foreground`,children:[e.flywheel_note,` · 数据来自审计日志与指标流的实时聚合`]})]}),(0,K.jsx)(`div`,{className:`grid grid-cols-4 gap-3 xl:grid-cols-7`,children:FO.map(t=>(0,K.jsx)(bm,{className:`py-3`,children:(0,K.jsxs)(Cm,{className:`px-3`,children:[(0,K.jsxs)(`div`,{className:`flex items-center gap-1.5 text-[11px] text-muted-foreground`,children:[t.icon,t.label]}),(0,K.jsx)(`div`,{className:`mt-1 text-xl font-bold ${t.tone}`,children:e.totals[t.key]??0})]})},t.key))}),(0,K.jsxs)(`div`,{className:`mt-4 grid grid-cols-2 gap-4`,children:[(0,K.jsxs)(bm,{className:`py-0`,children:[(0,K.jsx)(xm,{className:`border-b py-2.5`,children:(0,K.jsx)(Sm,{className:`text-xs text-muted-foreground`,children:`飞轮证据 · 检索相似度趋势(回流前后对比)`})}),(0,K.jsx)(Cm,{className:`p-0`,children:(0,K.jsx)(eO,{className:`h-64`,children:(0,K.jsxs)(`div`,{className:`space-y-1.5 p-3`,children:[e.similarity_trend.length===0&&(0,K.jsx)(`div`,{className:`py-8 text-center text-xs text-muted-foreground`,children:`尚无检索记录`}),e.similarity_trend.map((e,t)=>(0,K.jsxs)(`div`,{className:`flex items-center gap-2 text-xs`,children:[(0,K.jsx)(`span`,{className:`w-40 shrink-0 truncate text-muted-foreground`,title:e.query,children:e.query}),(0,K.jsx)(`div`,{className:`h-2 flex-1 overflow-hidden rounded bg-muted`,children:(0,K.jsx)(`div`,{className:`h-full rounded ${e.similarity>=75?`bg-emerald-500`:e.similarity>=55?`bg-amber-500`:`bg-slate-500`}`,style:{width:`${e.similarity}%`}})}),(0,K.jsxs)(`span`,{className:`w-9 text-right font-mono ${e.similarity>=75?`text-emerald-400`:`text-muted-foreground`}`,children:[e.similarity,`%`]})]},t))]})})})]}),(0,K.jsxs)(bm,{className:`py-0`,children:[(0,K.jsx)(xm,{className:`border-b py-2.5`,children:(0,K.jsxs)(Sm,{className:`flex items-center gap-1.5 text-xs text-muted-foreground`,children:[(0,K.jsx)($m,{className:`h-3.5 w-3.5`}),`经验沉淀(写入 ARM 知识库)`]})}),(0,K.jsx)(Cm,{className:`p-0`,children:(0,K.jsx)(eO,{className:`h-64`,children:(0,K.jsxs)(`div`,{className:`divide-y`,children:[e.experiences.length===0&&(0,K.jsx)(`div`,{className:`p-8 text-center text-xs text-muted-foreground`,children:`尚无回流记录`}),e.experiences.map((e,t)=>(0,K.jsxs)(`div`,{className:`flex items-center gap-2 px-3 py-2 text-xs`,children:[(0,K.jsx)(kh,{className:`h-3 w-3 shrink-0 text-emerald-400`}),(0,K.jsx)(`span`,{className:`min-w-0 flex-1 truncate`,title:e.title,children:e.title}),(0,K.jsx)(`span`,{className:`shrink-0 font-mono text-[10px] text-muted-foreground`,children:e.knowledge_id?e.knowledge_id.slice(0,8):`—`}),(0,K.jsx)(`span`,{className:`shrink-0 text-[10px] text-muted-foreground`,children:gt(e.ts)})]},t))]})})})]})]}),(0,K.jsxs)(`div`,{className:`mt-4 grid grid-cols-3 gap-4`,children:[(0,K.jsxs)(bm,{className:`py-0`,children:[(0,K.jsx)(xm,{className:`border-b py-2.5`,children:(0,K.jsx)(Sm,{className:`text-xs text-muted-foreground`,children:`工具调用分布`})}),(0,K.jsxs)(Cm,{className:`p-3`,children:[Object.keys(e.by_tool).length===0&&(0,K.jsx)(`div`,{className:`py-6 text-center text-xs text-muted-foreground`,children:`暂无数据`}),Object.entries(e.by_tool).sort((e,t)=>t[1]-e[1]).map(([t,n])=>{let r=Math.max(...Object.values(e.by_tool));return(0,K.jsxs)(`div`,{className:`mb-1.5 flex items-center gap-2 text-xs`,children:[(0,K.jsx)(`span`,{className:`w-36 shrink-0 truncate font-mono`,children:t}),(0,K.jsx)(`div`,{className:`h-2 flex-1 overflow-hidden rounded bg-muted`,children:(0,K.jsx)(`div`,{className:`h-full rounded bg-sky-500`,style:{width:`${n/r*100}%`}})}),(0,K.jsx)(`span`,{className:`w-6 text-right font-mono`,children:n})]},t)})]})]}),(0,K.jsxs)(bm,{className:`py-0`,children:[(0,K.jsx)(xm,{className:`border-b py-2.5`,children:(0,K.jsxs)(Sm,{className:`flex items-center gap-1.5 text-xs text-muted-foreground`,children:[(0,K.jsx)(xh,{className:`h-3.5 w-3.5`}),`ARM 知识库实检(真实 RAG)`]})}),(0,K.jsxs)(Cm,{className:`p-3`,children:[(0,K.jsxs)(`div`,{className:`flex gap-2`,children:[(0,K.jsx)(p_,{value:n,onChange:e=>r(e.target.value),onKeyDown:e=>e.key===`Enter`&&l(),placeholder:`如:堆垛机 货叉定位偏移`,className:`text-xs`}),(0,K.jsx)(Y,{size:`sm`,disabled:o,onClick:l,children:o?`检索中`:`检索`})]}),(0,K.jsx)(eO,{className:`mt-2 h-44`,children:(0,K.jsxs)(`div`,{className:`space-y-1.5`,children:[!i&&(0,K.jsx)(`div`,{className:`py-6 text-center text-xs text-muted-foreground`,children:`输入问题检索企业经验库(与助手使用同一数据源)`}),i?.length===0&&(0,K.jsx)(`div`,{className:`py-6 text-center text-xs text-muted-foreground`,children:`无命中`}),i?.map((e,t)=>(0,K.jsxs)(`div`,{className:`rounded-md bg-card px-2.5 py-1.5`,children:[(0,K.jsxs)(`div`,{className:`flex items-center gap-1.5 text-xs`,children:[e.similarity!=null&&(0,K.jsxs)(J,{variant:`secondary`,className:`h-4 text-[9px] ${e.similarity>=75?`text-emerald-400`:``}`,children:[e.similarity,`%`]}),(0,K.jsx)(`span`,{className:`truncate font-medium`,children:e.title})]}),(0,K.jsx)(`p`,{className:`mt-0.5 line-clamp-2 text-[10px] leading-relaxed text-muted-foreground`,children:e.snippet})]},t))]})})]})]}),(0,K.jsxs)(bm,{className:`py-0`,children:[(0,K.jsx)(xm,{className:`border-b py-2.5`,children:(0,K.jsx)(Sm,{className:`text-xs text-muted-foreground`,children:`审计流(实时)`})}),(0,K.jsx)(Cm,{className:`p-0`,children:(0,K.jsx)(eO,{className:`h-52`,children:(0,K.jsx)(`div`,{className:`divide-y font-mono text-[10px]`,children:e.recent_audit.map((e,t)=>(0,K.jsxs)(`div`,{className:`flex items-center gap-2 px-3 py-1.5`,children:[(0,K.jsx)(`span`,{className:`text-muted-foreground`,children:gt(e.ts,`t`)}),(0,K.jsx)(J,{variant:`outline`,className:`h-4 px-1 text-[9px]`,children:e.actor}),(0,K.jsx)(`span`,{className:`truncate`,children:e.tool||e.logic||e.action||e.name||e.verdict||``})]},t))})})})]})]})]}):(0,K.jsx)(`div`,{className:`flex h-full items-center justify-center text-sm text-muted-foreground`,children:`进化数据加载中…`})}function LO({className:e,size:t=`default`,...n}){return(0,K.jsx)(qp,{"data-slot":`switch`,"data-size":t,className:mn(`peer group/switch inline-flex shrink-0 items-center rounded-full border border-transparent shadow-xs transition-all outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 data-[size=default]:h-[1.15rem] data-[size=default]:w-8 data-[size=sm]:h-3.5 data-[size=sm]:w-6 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input dark:data-[state=unchecked]:bg-input/80`,e),...n,children:(0,K.jsx)(Yp,{"data-slot":`switch-thumb`,className:mn(`pointer-events-none block rounded-full bg-background ring-0 transition-transform group-data-[size=default]/switch:size-4 group-data-[size=sm]/switch:size-3 data-[state=checked]:translate-x-[calc(100%-2px)] data-[state=unchecked]:translate-x-0 dark:data-[state=checked]:bg-primary-foreground dark:data-[state=unchecked]:bg-foreground`)})})}function RO(){let[e,t]=(0,v.useState)(null),[n,r]=(0,v.useState)(null),[i,a]=(0,v.useState)(``),[o,s]=(0,v.useState)(``),[c,l]=(0,v.useState)(!1),[u,d]=(0,v.useState)(null),[f,p]=(0,v.useState)(``),[m,h]=(0,v.useState)(``),[g,_]=(0,v.useState)(``),[y,b]=(0,v.useState)(``),[x,S]=(0,v.useState)(!1),[C,w]=(0,v.useState)(null),[T,E]=(0,v.useState)(``),[D,O]=(0,v.useState)(!1),[k,A]=(0,v.useState)(``),[j,M]=(0,v.useState)(!1),[N,P]=(0,v.useState)([]),[F,I]=(0,v.useState)([]),[L,R]=(0,v.useState)(!1),[ee,te]=(0,v.useState)(``),[z,ne]=(0,v.useState)(``),[re,ie]=(0,v.useState)(!1),[ae,oe]=(0,v.useState)(null),se=()=>{ot(`/api/settings`).then(e=>{t(e),a(e.arm.api_base),p(e.llm.model),h(e.llm.base_url_runtime?e.llm.base_url:``),b(e.llm.context_tokens_runtime?String(e.llm.context_tokens):``),E(e.scene.profile),P(e.guard.deny),I(e.guard.ro),R(e.guard.sudo_u_l2)}),ot(`/api/arm/status`).then(r).catch(()=>r(null))};(0,v.useEffect)(()=>{se()},[]);let ce=async()=>{l(!0),d(null);try{let e=await ct(`/api/settings`,{arm_api_base:i.trim(),...o.trim()?{arm_token:o.trim()}:{}});d(e.probe||null),s(``),e.probe?.online?Z.success(`已保存并连通(${e.probe.latency_ms}ms),源切换即时生效`):Z.warning(`已保存,但当前源不可达`,{description:e.note}),se()}catch(e){Z.error(String(e.message))}finally{l(!1)}},le=async()=>{S(!0),w(null);try{let e=await ct(`/api/settings`,{llm_model:f.trim(),llm_base_url:m.trim(),llm_context_tokens:y.trim(),...g.trim()?{llm_api_key:g.trim()}:{}});_(``),w(e.llm_probe||null),e.llm_probe?.online?Z.success(`模型已切换(探针 ${e.llm_probe.latency_ms}ms:${e.llm_probe.reply||`ok`})`):e.note&&Z.warning(`已保存,但探针未通过`,{description:e.note}),se()}catch(e){Z.error(String(e.message))}finally{S(!1)}},B=async()=>{M(!0);try{if(await ct(`/api/settings`,{access_token:k}),k.trim()){if(!(await fetch(`/api/auth/login`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({token:k.trim()})})).ok)throw Error(`已保存但自动登录失败,刷新后输入令牌进入`);Z.success(`访问令牌已启用(当前浏览器已自动登录)`)}else Z.success(`访问令牌已关闭(恢复开放访问)`);A(``),se()}catch(e){Z.error(String(e.message))}finally{M(!1)}},V=async()=>{O(!0);try{await ct(`/api/settings`,{scene_profile:T}),Z.success(T.trim()?`场景画像已保存,对全部助手即时生效(新对话起)`:`场景画像已清空(不再注入)`),se()}catch(e){Z.error(String(e.message))}finally{O(!1)}},H=async()=>{ie(!0);try{await ct(`/api/settings`,{guard:{deny:N,ro:F,sudo_u_l2:L}}),Z.success(`守护栏已更新(危险规则 ${N.length} 条 · 白名单 ${F.length} 命令),即时生效`),oe(null),se()}catch(e){Z.error(String(e.message))}finally{ie(!1)}};return(0,K.jsxs)(`div`,{className:`h-full overflow-auto p-5`,children:[(0,K.jsxs)(`div`,{className:`mb-4`,children:[(0,K.jsxs)(`h1`,{className:`flex items-center gap-2 text-lg font-bold`,children:[(0,K.jsx)(kg,{className:`h-5 w-5 text-primary`}),`系统设置`]}),(0,K.jsx)(`p`,{className:`mt-0.5 text-xs text-muted-foreground`,children:`平台全局配置 · 修改保存后即时生效(无需重启)· 运行时配置优先于 .env`})]}),(0,K.jsxs)(vO,{defaultValue:`arm`,className:`max-w-2xl`,children:[(0,K.jsxs)(bO,{children:[(0,K.jsxs)(xO,{value:`arm`,className:`text-xs`,children:[(0,K.jsx)(Tg,{className:`mr-1 h-3.5 w-3.5`}),`ARM 源`,n&&(0,K.jsx)(`span`,{className:`ml-1 h-1.5 w-1.5 rounded-full ${n.online?`bg-emerald-500`:`bg-amber-500`}`})]}),(0,K.jsxs)(xO,{value:`llm`,className:`text-xs`,children:[(0,K.jsx)(th,{className:`mr-1 h-3.5 w-3.5`}),`LLM 模型服务`]}),(0,K.jsxs)(xO,{value:`scene`,className:`text-xs`,children:[(0,K.jsx)(Lh,{className:`mr-1 h-3.5 w-3.5`}),`场景画像`,e&&e.scene.length>0&&(0,K.jsx)(`span`,{className:`ml-1 h-1.5 w-1.5 rounded-full bg-emerald-500`})]}),(0,K.jsxs)(xO,{value:`auth`,className:`text-xs`,children:[(0,K.jsx)(tg,{className:`mr-1 h-3.5 w-3.5`}),`访问安全`,e?.auth.enabled&&(0,K.jsx)(`span`,{className:`ml-1 h-1.5 w-1.5 rounded-full bg-emerald-500`})]}),(0,K.jsxs)(xO,{value:`guard`,className:`text-xs`,children:[(0,K.jsx)(Fg,{className:`mr-1 h-3.5 w-3.5`}),`守护栏`,(0,K.jsxs)(`span`,{className:`ml-1 text-[9px] text-muted-foreground`,children:[N.length,`规`]})]})]}),(0,K.jsx)(SO,{value:`arm`,className:`mt-3`,children:(0,K.jsxs)(bm,{className:`mb-3 max-w-2xl`,children:[(0,K.jsxs)(xm,{className:`pb-2`,children:[(0,K.jsxs)(Sm,{className:`flex items-center gap-2 text-sm`,children:[(0,K.jsx)(Tg,{className:`h-4 w-4 text-primary`}),`ARM 源`,n&&(0,K.jsx)(J,{variant:`outline`,className:`text-[10px] ${n.online?`text-emerald-400`:`text-amber-400`}`,children:n.online?`在线 · ${n.latency_ms}ms`:`不可达(回落本地库)`})]}),(0,K.jsx)(`p`,{className:`text-[11px] leading-relaxed text-muted-foreground`,children:`ARM 是可私有化部署的资源管理系统(助手档案 + 知识库):在此切换源(如 本地开发版 → 客户私有站点), 检索/下载/同步全部即时跟随;助手已下载的本地档案不受影响。`})]}),(0,K.jsxs)(Cm,{className:`space-y-3`,children:[e&&!e.arm.token_set&&e.arm.token_source===`none`&&(0,K.jsxs)(`div`,{className:`flex items-start gap-2 rounded-md border border-amber-500/40 bg-amber-500/10 p-2.5 text-[11px] leading-relaxed text-amber-300`,children:[(0,K.jsx)(`span`,{className:`shrink-0`,children:`🔑`}),(0,K.jsxs)(`div`,{className:`flex-1`,children:[`尚未配置访问令牌——匿名仅能浏览目录,`,(0,K.jsx)(`b`,{children:`下载 / 上岗 / 新建 / 经验回流`}),`等操作会被 ARM 拒绝(401/403)。 请登录 ARM 站点生成访问令牌(arm_pat_… 开头),粘贴到下方「访问令牌」并保存。`,(0,K.jsx)(`a`,{href:e.arm.api_base,target:`_blank`,rel:`noreferrer`,className:`ml-1 underline underline-offset-2 hover:text-amber-200`,children:`打开 ARM 生成令牌 →`})]})]}),(0,K.jsxs)(`div`,{className:`space-y-1`,children:[(0,K.jsxs)(m_,{className:`flex items-center gap-2 text-xs`,children:[`站点地址(REST API 根地址)`,e&&(0,K.jsx)(J,{variant:`outline`,className:`h-4 px-1 text-[9px]`,children:e.arm.api_base_runtime?`运行时配置`:`默认(${(e.arm.default_base||``).replace(/^https?:\/\//,``)})`})]}),(0,K.jsx)(p_,{value:i,onChange:e=>a(e.target.value),placeholder:`如 http://localhost:3001 或 https://arm.customer.com`,className:`font-mono text-xs`})]}),(0,K.jsxs)(`div`,{className:`space-y-1`,children:[(0,K.jsxs)(m_,{className:`flex items-center gap-2 text-xs`,children:[`访问令牌(Token)`,e&&(0,K.jsx)(J,{variant:`outline`,className:`h-4 px-1 text-[9px]`,children:e.arm.token_set?`${e.arm.token_masked} · ${e.arm.token_source}`:`未配置(${e.arm.token_source===`pat`?`回落 ~/.arm PAT`:`匿名/只读`})`})]}),(0,K.jsx)(p_,{type:`password`,value:o,onChange:e=>s(e.target.value),placeholder:e?.arm.token_set?`已配置(留空保持不变)`:`arm_pat_…`,className:`font-mono text-xs`})]}),(0,K.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,K.jsx)(Y,{size:`sm`,className:`text-xs`,disabled:c,onClick:ce,children:c?`保存中…`:`保存并测试连接`}),u&&(0,K.jsx)(`span`,{className:`flex items-center gap-1 text-[11px] ${u.online?`text-emerald-400`:`text-amber-400`}`,children:u.online?(0,K.jsxs)(K.Fragment,{children:[(0,K.jsx)(ph,{className:`h-3.5 w-3.5`}),`连通 `,u.latency_ms,`ms,源已切换`]}):(0,K.jsxs)(K.Fragment,{children:[(0,K.jsx)(hh,{className:`h-3.5 w-3.5`}),`不可达:`,u.error]})})]})]})]})}),(0,K.jsx)(SO,{value:`llm`,className:`mt-3`,children:(0,K.jsxs)(bm,{className:`mb-3 max-w-2xl`,children:[(0,K.jsxs)(xm,{className:`pb-2`,children:[(0,K.jsxs)(Sm,{className:`flex items-center gap-2 text-sm`,children:[(0,K.jsx)(th,{className:`h-4 w-4 text-primary`}),`LLM 模型服务`,e&&(0,K.jsx)(J,{variant:`outline`,className:`text-[10px]`,children:e.llm.model})]}),(0,K.jsx)(`p`,{className:`text-[11px] leading-relaxed text-muted-foreground`,children:`OpenAI 兼容端点:缺省公司内网 bifrost 网关(内网开箱可用),可切换模型 / 自建网关 / 公有云端点。保存后新对话即时使用新模型,应用失败自动回滚。`})]}),(0,K.jsxs)(Cm,{className:`space-y-3`,children:[(0,K.jsxs)(`div`,{className:`space-y-1`,children:[(0,K.jsxs)(m_,{className:`flex items-center gap-2 text-xs`,children:[`模型`,e&&(0,K.jsx)(J,{variant:`outline`,className:`h-4 px-1 text-[9px]`,children:e.llm.model_runtime?`运行时配置`:`默认(.env)`})]}),(0,K.jsx)(p_,{value:f,onChange:e=>p(e.target.value),list:`llm-catalog`,placeholder:`如 def / glm-5.3 / 自定义名称`,className:`font-mono text-xs`}),(0,K.jsx)(`datalist`,{id:`llm-catalog`,children:(e?.llm.catalog||[]).map(e=>(0,K.jsx)(`option`,{value:e},e))})]}),(0,K.jsxs)(`div`,{className:`space-y-1`,children:[(0,K.jsxs)(m_,{className:`text-xs`,children:[`端点地址(留空 = `,e?.llm.default_base||`默认内网 bifrost`,`)`]}),(0,K.jsx)(p_,{value:m,onChange:e=>h(e.target.value),placeholder:`https://your-gateway/v1(OpenAI 兼容)`,className:`font-mono text-xs`})]}),(0,K.jsxs)(`div`,{className:`space-y-1`,children:[(0,K.jsxs)(m_,{className:`flex items-center gap-2 text-xs`,children:[`API Key`,e&&(0,K.jsx)(J,{variant:`outline`,className:`h-4 px-1 text-[9px]`,children:e.llm.key_set?`${e.llm.key_masked} · ${e.llm.key_source}`:`未配置`})]}),(0,K.jsx)(p_,{type:`password`,value:g,onChange:e=>_(e.target.value),placeholder:e?.llm.key_set?`已配置(留空保持不变)`:`sk-… / api key`,className:`font-mono text-xs`})]}),(0,K.jsxs)(`div`,{className:`space-y-1`,children:[(0,K.jsxs)(m_,{className:`flex items-center gap-2 text-xs`,children:[`上下文窗口(token)`,e&&(0,K.jsx)(J,{variant:`outline`,className:`h-4 px-1 text-[9px]`,children:e.llm.context_tokens_runtime?`运行时配置 ${e.llm.context_tokens}`:`默认 ${e.llm.default_context_tokens}`})]}),(0,K.jsx)(p_,{type:`number`,inputMode:`numeric`,min:4e3,max:2e6,step:1e3,value:y,onChange:e=>b(e.target.value),placeholder:`${e?.llm.default_context_tokens||128e3}(留空 = 默认)`,className:`font-mono text-xs`}),(0,K.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:`按所选模型的真实窗口填写。会话历史超出窗口时自动丢弃最早轮次(保留当前轮),避免长期使用后请求被模型拒绝。`})]}),(0,K.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,K.jsx)(Y,{size:`sm`,className:`text-xs`,disabled:x,onClick:le,children:x?`切换中…`:`保存并测试模型`}),C&&(0,K.jsx)(`span`,{className:`flex items-center gap-1 text-[11px] ${C.online?`text-emerald-400`:`text-amber-400`}`,children:C.online?(0,K.jsxs)(K.Fragment,{children:[(0,K.jsx)(ph,{className:`h-3.5 w-3.5`}),`探针通过 `,C.latency_ms,`ms:`,C.reply]}):(0,K.jsxs)(K.Fragment,{children:[(0,K.jsx)(hh,{className:`h-3.5 w-3.5`}),`未通过:`,C.error]})})]})]})]})}),(0,K.jsx)(SO,{value:`scene`,className:`mt-3`,children:(0,K.jsxs)(bm,{className:`mb-3 max-w-2xl`,children:[(0,K.jsxs)(xm,{className:`pb-2`,children:[(0,K.jsxs)(Sm,{className:`flex items-center gap-2 text-sm`,children:[(0,K.jsx)(Lh,{className:`h-4 w-4 text-primary`}),`场景画像`,e&&(0,K.jsx)(J,{variant:`outline`,className:`text-[10px] ${e.scene.length?`text-emerald-400`:``}`,children:e.scene.length?`已启用 · ${e.scene.length} 字`:`未配置(不注入)`})]}),(0,K.jsxs)(`p`,{className:`text-[11px] leading-relaxed text-muted-foreground`,children:[`平台级、全局一份的使用方场景描述(团队环境 / 系统清单 / 规范 / 联系人),作为常驻事实注入`,(0,K.jsx)(`b`,{children:`所有助手`}),`的上下文—— 助手不必每次重新探索环境。与知识检索互补(常驻事实 vs 按需检索)。⚠ 不放凭据:写"凭据在哪、找谁要"即可。`]})]}),(0,K.jsxs)(Cm,{className:`space-y-2`,children:[(0,K.jsx)(`textarea`,{value:T,onChange:e=>E(e.target.value),spellCheck:!1,rows:8,placeholder:`例如:
|
|
101
101
|
· 团队负责公司内部系统的运维与研发提效
|
|
102
102
|
· 系统:ARM(助手管理)、Nexus(nexus.aimstek.cn)、Jenkins、玄武环境、WMS
|
|
103
103
|
· 服务器多为 root/统一密码策略,凭据找张三
|
|
104
|
-
· 告警需通知刘工;报告用中文`,className:`w-full resize-y rounded-md border bg-background p-2.5 font-mono text-xs leading-relaxed`}),(0,K.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,K.jsxs)(`span`,{className:`text-[10px] text-muted-foreground`,children:[C.length,`/4000 字 · 修改对新对话即时生效 · 清空则恢复"不注入"`]}),(0,K.jsx)(Y,{size:`sm`,className:`text-xs`,disabled:T||C.length>4e3,onClick:le,children:T?`保存中…`:`保存画像`})]})]})]})}),(0,K.jsx)(SO,{value:`auth`,className:`mt-3`,children:(0,K.jsxs)(bm,{children:[(0,K.jsxs)(xm,{className:`pb-2`,children:[(0,K.jsxs)(Sm,{className:`flex items-center gap-2 text-sm`,children:[(0,K.jsx)(tg,{className:`h-4 w-4 text-primary`}),`访问令牌`,e&&(0,K.jsx)(J,{variant:`outline`,className:`text-[10px] ${e.auth.enabled?`text-emerald-400`:`text-amber-400`}`,children:e.auth.enabled?`已启用 · ${e.auth.token_masked}`:`未启用(局域网内开放访问)`})]}),(0,K.jsxs)(`p`,{className:`text-[11px] leading-relaxed text-muted-foreground`,children:[`工作站监听 0.0.0.0(局域网可达),启用令牌后所有 API 需要认证:浏览器登录换 Cookie(自动携带), 脚本用 `,(0,K.jsx)(`span`,{className:`font-mono`,children:`Authorization: Bearer <token>`}),`。留空保存即关闭。`]})]}),(0,K.jsxs)(Cm,{className:`space-y-2`,children:[(0,K.jsx)(p_,{type:`password`,value:D,onChange:e=>O(e.target.value),placeholder:e?.auth.enabled?`输入新令牌替换(留空保存=关闭认证)`:`设置访问令牌(留空=不启用)`,className:`font-mono text-xs`}),(0,K.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,K.jsx)(Y,{size:`sm`,className:`text-xs`,disabled:k,onClick:ce,children:k?`保存中…`:`保存`}),(0,K.jsx)(`span`,{className:`text-[10px] text-muted-foreground`,children:`启用后其他设备首次访问将看到登录页 · 替换令牌会使所有已登录设备失效`})]})]})]})}),(0,K.jsx)(SO,{value:`guard`,className:`mt-3`,children:(0,K.jsxs)(bm,{className:`mb-3 max-w-2xl`,children:[(0,K.jsxs)(xm,{className:`pb-2`,children:[(0,K.jsxs)(Sm,{className:`flex items-center gap-2 text-sm`,children:[(0,K.jsx)(Fg,{className:`h-4 w-4 text-primary`}),`守护栏 · 助手命令执行策略`,(0,K.jsxs)(J,{variant:`outline`,className:`text-[10px]`,children:[j.length,` 危险规则 · `,N.length,` 白名单命令`]})]}),(0,K.jsxs)(`p`,{className:`text-[11px] leading-relaxed text-muted-foreground`,children:[`危险清单(正则,命中即`,(0,K.jsx)(`b`,{children:`永久拒绝`}),`,任何自主级别不豁免)与只读白名单(免确认直行)保存后即时生效,全程写审计。 只读之外的命令按写命令分级:L0/L1 拒绝、L2 人工确认、L3 免确认。`]})]}),(0,K.jsxs)(Cm,{className:`space-y-4`,children:[(0,K.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,K.jsx)(m_,{className:`text-xs`,children:`危险命令清单(正则,对整条命令做词面匹配)`}),(0,K.jsx)(`div`,{className:`space-y-1`,children:j.map(e=>(0,K.jsxs)(`div`,{className:`flex items-center gap-2 rounded-md border border-red-500/30 bg-red-500/5 px-2 py-1`,children:[(0,K.jsx)(`code`,{className:`min-w-0 flex-1 break-all font-mono text-[11px] text-red-300`,children:e}),(0,K.jsx)(Y,{size:`icon`,variant:`ghost`,className:`h-5 w-5 shrink-0`,onClick:()=>M(t=>t.filter(t=>t!==e)),title:`删除该规则`,children:(0,K.jsx)(r_,{className:`h-3 w-3`})})]},e))}),(0,K.jsxs)(`div`,{className:`flex gap-2`,children:[(0,K.jsx)(p_,{value:L,onChange:e=>R(e.target.value),placeholder:`新增正则,如 \\b(fdisk|parted)\\b 或 \\bmv\\b\\s+--force`,className:`font-mono text-xs`,onKeyDown:e=>{e.key===`Enter`&&L.trim()&&(M(e=>[...new Set([...e,L.trim()])]),R(``))}}),(0,K.jsxs)(Y,{size:`sm`,variant:`outline`,className:`shrink-0 text-xs`,disabled:!L.trim(),onClick:()=>{M(e=>[...new Set([...e,L.trim()])]),R(``)},children:[(0,K.jsx)(dg,{className:`h-3 w-3`}),`添加`]})]}),j.length===0&&(0,K.jsx)(`p`,{className:`text-[10px] text-red-400`,children:`⚠ 清单为空 = 无任何命令会被永久拒绝(写命令仍走 L2/L3 分级)`})]}),(0,K.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,K.jsx)(m_,{className:`text-xs`,children:`只读白名单(单个命令名,复合命令逐段判定)`}),(0,K.jsx)(`div`,{className:`flex flex-wrap gap-1`,children:N.map(e=>(0,K.jsxs)(`span`,{className:`inline-flex items-center gap-1 rounded-md border bg-muted/50 px-1.5 py-0.5 font-mono text-[10px]`,children:[e,(0,K.jsx)(`button`,{className:`text-muted-foreground hover:text-red-400`,onClick:()=>P(t=>t.filter(t=>t!==e)),title:`移除`,children:(0,K.jsx)(r_,{className:`h-2.5 w-2.5`})})]},e))}),(0,K.jsxs)(`div`,{className:`flex gap-2`,children:[(0,K.jsx)(p_,{value:ee,onChange:e=>te(e.target.value),placeholder:`新增命令名,如 jq / awk / ss`,className:`font-mono text-xs`,onKeyDown:e=>{e.key===`Enter`&&ee.trim()&&(P(e=>[...new Set([...e,ee.trim()])]),te(``))}}),(0,K.jsxs)(Y,{size:`sm`,variant:`outline`,className:`shrink-0 text-xs`,disabled:!ee.trim(),onClick:()=>{P(e=>[...new Set([...e,ee.trim()])]),te(``)},children:[(0,K.jsx)(dg,{className:`h-3 w-3`}),`添加`]})]}),(0,K.jsx)(`p`,{className:`text-[10px] text-muted-foreground`,children:`⚠ 白名单命令带重定向(> / >> / tee)时不算只读;sqlite3 的 INSERT/UPDATE/DELETE 等写语句不算只读`})]}),(0,K.jsxs)(`div`,{className:`flex items-start gap-2.5 rounded-md border border-amber-500/30 bg-amber-500/5 p-2.5`,children:[(0,K.jsx)(LO,{checked:F,onCheckedChange:I,className:`mt-0.5`}),(0,K.jsxs)(`div`,{className:`space-y-0.5`,children:[(0,K.jsx)(`div`,{className:`text-xs font-medium`,children:`允许 sudo 降权形式(sudo -u <用户>)经 L2 人工确认后执行`}),(0,K.jsx)(`p`,{className:`text-[10px] leading-relaxed text-muted-foreground`,children:"默认关闭:所有含 sudo 的命令永久拒绝(含远程 SSH 命令中的 sudo)。开启后 `sudo -u 用户` 片段不再触发永久拒绝、 按写命令走 L2 确认(L3 免确认);裸 sudo(如 sudo reboot)与嵌套危险命令仍永久拒绝。"})]})]}),(0,K.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,K.jsx)(Y,{size:`sm`,className:`text-xs`,disabled:z,onClick:()=>{let t=(e?.guard.deny||[]).filter(e=>!j.includes(e));t.length?ie(t):B()},children:z?`保存中…`:`保存(即时生效)`}),(0,K.jsx)(Y,{size:`sm`,variant:`outline`,className:`text-xs`,onClick:()=>{e&&(M(e.guard.default_deny.slice()),P(e.guard.default_ro.slice()),I(!1),Z.info(`已填入出厂默认(未保存,点击「保存」生效)`))},children:`恢复出厂默认`}),(0,K.jsx)(`span`,{className:`text-[10px] text-muted-foreground`,children:`修改立即作用于全部助手对话 · 删减危险规则需二次确认并写审计`})]})]})]})})]}),(0,K.jsxs)(bm,{className:`mt-1 max-w-2xl text-xs text-muted-foreground`,children:[(0,K.jsx)(xm,{className:`pb-1`,children:(0,K.jsx)(Sm,{className:`text-sm`,children:`只读信息`})}),(0,K.jsxs)(Cm,{className:`space-y-1`,children:[(0,K.jsxs)(`div`,{children:[`本地助手库:`,n?.local_count??`…`,` 名 · 离线经验待回流:`,n?.outbox_pending??0,` 条`]}),(0,K.jsx)(`div`,{children:`优先级:运行时配置(本页)> 环境变量 > .env 默认值 · 令牌仅存本机 config/platform.json,界面永远掩码展示`})]})]}),(0,K.jsx)(a_,{open:re!==null,onOpenChange:e=>{e||ie(null)},children:(0,K.jsxs)(c_,{className:`max-w-md`,children:[(0,K.jsxs)(l_,{children:[(0,K.jsxs)(d_,{className:`flex items-center gap-2 text-sm`,children:[(0,K.jsx)(Fg,{className:`h-4 w-4 text-red-400`}),`确认放行危险命令规则?`]}),(0,K.jsxs)(f_,{className:`text-xs leading-relaxed`,children:[`你正在移除 `,re?.length,` 条永久拒绝规则,保存后助手将可以发起匹配这些规则的命令(仍按写命令分级:L2 需人工确认 / L3 免确认)。此操作将写入审计日志。`]})]}),(0,K.jsx)(`div`,{className:`max-h-40 space-y-1 overflow-auto`,children:re?.map(e=>(0,K.jsx)(`div`,{className:`rounded-md border border-red-500/40 bg-red-500/10 px-2 py-1 font-mono text-[11px] break-all text-red-300`,children:e},e))}),(0,K.jsxs)(u_,{children:[(0,K.jsx)(Y,{variant:`outline`,size:`sm`,onClick:()=>ie(null),children:`取消`}),(0,K.jsx)(Y,{variant:`destructive`,size:`sm`,disabled:z,onClick:B,children:z?`保存中…`:`确认放行并保存`})]})]})})]})}function zO({onOk:e}){let[t,n]=(0,v.useState)(``),[r,i]=(0,v.useState)(!1),[a,o]=(0,v.useState)(``),s=async()=>{if(t.trim()&&!r){i(!0),o(``);try{let n=await fetch(`/api/auth/login`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({token:t.trim()})});if(!n.ok)throw Error((await n.json().catch(()=>({}))).error||`令牌不正确`);e()}catch(e){o(String(e.message))}finally{i(!1)}}};return(0,K.jsxs)(`div`,{className:`flex h-screen flex-col items-center justify-center gap-4 bg-background text-foreground`,children:[(0,K.jsx)(tg,{className:`h-8 w-8 text-primary`}),(0,K.jsx)(`div`,{className:`text-base font-semibold`,children:`AIMS 工作站已启用访问令牌`}),(0,K.jsxs)(`div`,{className:`flex gap-2`,children:[(0,K.jsx)(p_,{type:`password`,value:t,onChange:e=>n(e.target.value),onKeyDown:e=>{e.key===`Enter`&&!e.nativeEvent.isComposing&&s()},placeholder:`输入访问令牌…`,className:`w-64`,autoFocus:!0}),(0,K.jsx)(Y,{onClick:s,disabled:r||!t.trim(),children:r?`验证中…`:`进入`})]}),a&&(0,K.jsx)(`div`,{className:`text-xs text-red-400`,children:a}),(0,K.jsx)(`div`,{className:`text-[11px] text-muted-foreground`,children:`令牌在「系统设置 → 访问安全」配置 · 脚本访问可用 Authorization: Bearer 头`})]})}function BO(){let[e,t]=(0,v.useState)(`hub`),[n,r]=(0,v.useState)(null),[i,a]=(0,v.useState)(``),[o,s]=(0,v.useState)(null),[c,l]=(0,v.useState)(!1),[u,d]=(0,v.useState)([]),[f,p]=(0,v.useState)(null);(0,v.useEffect)(()=>{ot(`/api/health`).then(e=>{s(e),l(!!e.auth_required)}).catch(()=>s(null));let e=()=>ot(`/api/quick-switch`).then(e=>d(e.agents||[])).catch(()=>{});e();let t=setInterval(e,5e3);return()=>clearInterval(t)},[]),(0,v.useEffect)(()=>{n&&p(n)},[n]);let m=(e,n,i)=>{r(e),a(n),t(i)},h=u.filter(e=>e.running||e.pending).length;if(c)return(0,K.jsx)(zO,{onOk:()=>{l(!1),ot(`/api/health`).then(e=>{s(e),l(!!e.auth_required)}).catch(()=>{})}});let g=e=>it(`flex items-center gap-2 rounded-md px-3 py-2 text-sm transition-colors`,e?`bg-primary/15 font-medium text-primary`:`text-muted-foreground hover:bg-accent hover:text-foreground`);return(0,K.jsxs)(`div`,{className:`flex h-screen overflow-hidden bg-background text-foreground`,children:[(0,K.jsxs)(`aside`,{className:`flex w-52 shrink-0 flex-col border-r border-sidebar-border bg-sidebar text-sidebar-foreground`,children:[(0,K.jsxs)(`div`,{className:`flex items-center gap-2 px-4 py-4`,children:[(0,K.jsx)(Dh,{className:`h-6 w-6 text-primary`}),(0,K.jsxs)(`div`,{children:[(0,K.jsx)(`div`,{className:`text-sm font-bold leading-tight`,children:`AIMS 工业智能体平台`}),(0,K.jsx)(`div`,{className:`text-[10px] text-muted-foreground`,children:`平台AI化 · 系统工具化`})]})]}),(0,K.jsxs)(`nav`,{className:`flex flex-col gap-1 px-2`,children:[(0,K.jsxs)(`button`,{onClick:()=>t(`hub`),className:g(e===`hub`),children:[(0,K.jsx)(Yh,{className:`h-4 w-4`}),`助手大厅`]}),(0,K.jsxs)(`button`,{onClick:()=>t(`evolution`),className:g(e===`evolution`),children:[(0,K.jsx)(Yg,{className:`h-4 w-4`}),`自进化`]}),(0,K.jsxs)(`button`,{onClick:()=>t(`plugins`),className:g(e===`plugins`),children:[(0,K.jsx)(pg,{className:`h-4 w-4`}),`插件中心`]}),(0,K.jsxs)(`button`,{onClick:()=>t(`settings`),className:g(e===`settings`),children:[(0,K.jsx)(kg,{className:`h-4 w-4`}),`系统设置`]})]}),(0,K.jsxs)(`div`,{className:`mt-3 flex items-center justify-between border-t border-sidebar-border px-4 pb-1 pt-3`,children:[(0,K.jsxs)(`span`,{className:`text-[11px] font-semibold uppercase tracking-wide text-muted-foreground`,children:[`小助手 · 在岗 `,u.length]}),h>0&&(0,K.jsxs)(`span`,{className:`text-[10px] text-emerald-400`,title:`会话在后台运行中,切回即可看到进度`,children:[`● `,h,` 运行`]})]}),(0,K.jsxs)(`div`,{className:`min-h-0 flex-1 overflow-y-auto px-2 pb-2`,children:[u.length===0&&(0,K.jsx)(`p`,{className:`px-3 py-2 text-[11px] leading-relaxed text-muted-foreground`,children:`在「助手大厅」完成上岗配置后,这里按助手分组,一键直达各自的工作台。`}),u.map(t=>{let r=n===t.agent_id,i=f===t.agent_id,a=e=>it(`flex items-center gap-2 rounded-md px-2.5 py-1.5 text-xs transition-colors`,e?`bg-primary/15 font-medium text-primary`:`text-muted-foreground hover:bg-accent hover:text-foreground`);return(0,K.jsxs)(`div`,{className:`mb-0.5`,children:[(0,K.jsxs)(`div`,{className:it(`group flex items-center gap-0.5 rounded-md pr-1 transition-colors`,r&&e!==`hub`?`bg-primary/10`:`hover:bg-accent`),children:[(0,K.jsx)(`button`,{onClick:()=>p(i?null:t.agent_id),className:`flex h-9 w-6 shrink-0 items-center justify-center text-muted-foreground hover:text-foreground`,title:i?`折叠`:`展开`,children:i?(0,K.jsx)(ah,{className:`h-3.5 w-3.5`}):(0,K.jsx)(sh,{className:`h-3.5 w-3.5`})}),(0,K.jsxs)(`button`,{onClick:()=>m(t.agent_id,t.name,`workbench`),title:t.running||t.pending?`${t.name} · ${t.statusText}`:t.name,className:it(`flex min-w-0 flex-1 items-center gap-1.5 py-2 pr-1 text-left text-sm`,r&&e!==`hub`?`font-medium text-primary`:`text-muted-foreground group-hover:text-foreground`),children:[(t.running||t.pending)&&(0,K.jsx)(`span`,{className:it(`h-1.5 w-1.5 shrink-0 rounded-full`,t.running?`animate-pulse bg-emerald-500`:`bg-amber-500`)}),(0,K.jsx)(`span`,{className:`truncate`,children:t.name})]})]}),i&&(0,K.jsxs)(`div`,{className:`ml-6 mt-0.5 flex flex-col gap-0.5 border-l border-border/60 pl-2`,children:[(0,K.jsxs)(`button`,{onClick:()=>m(t.agent_id,t.name,`workbench`),className:a(r&&e===`workbench`),children:[(0,K.jsx)(ag,{className:`h-3.5 w-3.5`}),`工作台`]}),(0,K.jsxs)(`button`,{onClick:()=>m(t.agent_id,t.name,`editor`),className:a(r&&e===`editor`),children:[(0,K.jsx)(Dg,{className:`h-3.5 w-3.5`}),`定制工作台`]})]})]},t.agent_id)})]}),(0,K.jsxs)(`div`,{className:`mt-auto space-y-1.5 border-t border-sidebar-border px-4 pb-4 pt-3 text-[11px] text-muted-foreground`,children:[(0,K.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,K.jsx)(`span`,{className:it(`h-1.5 w-1.5 rounded-full`,o?`bg-emerald-500`:`bg-red-500`)}),`LLM `,o?.model||`未连接`,`(pi-ai)`]}),(0,K.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,K.jsx)(`span`,{className:it(`h-1.5 w-1.5 rounded-full`,o?`bg-emerald-500`:`bg-red-500`)}),`ARM `,o?o.pat?`已连接·PAT`:`已连接·只读`:`未连接`]})]})]}),(0,K.jsxs)(`div`,{className:`flex min-w-0 flex-1 flex-col`,children:[(0,K.jsxs)(`header`,{className:`flex h-12 shrink-0 items-center gap-3 border-b bg-card px-5`,children:[(0,K.jsx)(th,{className:`h-4 w-4 text-primary`}),(0,K.jsx)(`span`,{className:`text-sm font-semibold`,children:i||`数字员工队伍`}),n&&(0,K.jsx)(J,{variant:`outline`,className:`text-[10px]`,children:`在岗`}),(0,K.jsxs)(`span`,{className:`ml-auto text-xs text-muted-foreground`,children:[e===`hub`&&`从 ARM 员工库选择助手,或为未上岗助手完成上岗配置`,e===`editor`&&`AI 起草 → 人工审阅 → 版本化发布 → 可回滚`,e===`evolution`&&`数据回流 · 评测迭代 · 知识沉淀 · 飞轮证据`,e===`plugins`&&`统一注册表 · 生命周期 · 引用追踪 · 治理策略`,e===`settings`&&`ARM 源切换 · 令牌管理 · 保存即生效`]})]}),(0,K.jsxs)(`main`,{className:`min-h-0 flex-1 overflow-hidden`,children:[e===`hub`&&(0,K.jsx)(ev,{onOpen:m}),e===`workbench`&&n&&(0,K.jsx)(gO,{agentId:n,onName:a,onEdit:()=>t(`editor`)},n),e===`editor`&&n&&(0,K.jsx)(PO,{agentId:n},n),e===`evolution`&&(0,K.jsx)(IO,{}),e===`plugins`&&(0,K.jsx)(jO,{}),e===`settings`&&(0,K.jsx)(RO,{}),(e===`workbench`||e===`editor`)&&!n&&(0,K.jsx)(`div`,{className:`flex h-full items-center justify-center text-sm text-muted-foreground`,children:`请先在助手大厅选择一名助手`})]})]})]})}var VO=(e,t,n,r,i,a,o,s)=>{let c=document.documentElement,l=[`light`,`dark`];function u(t){(Array.isArray(e)?e:[e]).forEach(e=>{let n=e===`class`,r=n&&a?i.map(e=>a[e]||e):i;n?(c.classList.remove(...r),c.classList.add(a&&a[t]?a[t]:t)):c.setAttribute(e,t)}),d(t)}function d(e){s&&l.includes(e)&&(c.style.colorScheme=e)}function f(){return window.matchMedia(`(prefers-color-scheme: dark)`).matches?`dark`:`light`}if(r)u(r);else try{let e=localStorage.getItem(t)||n;u(o&&e===`system`?f():e)}catch{}},HO=v.createContext(void 0),UO={setTheme:e=>{},themes:[]},WO=()=>v.useContext(HO)??UO;v.memo(({forcedTheme:e,storageKey:t,attribute:n,enableSystem:r,enableColorScheme:i,defaultTheme:a,value:o,themes:s,nonce:c,scriptProps:l})=>{let u=JSON.stringify([n,t,a,e,s,o,r,i]).slice(1,-1);return v.createElement(`script`,{...l,suppressHydrationWarning:!0,nonce:typeof window>`u`?c:``,dangerouslySetInnerHTML:{__html:`(${VO.toString()})(${u})`}})}),(0,y.createRoot)(document.getElementById(`root`)).render((0,K.jsxs)(v.StrictMode,{children:[(0,K.jsx)(BO,{}),(0,K.jsx)(({...e})=>{let{theme:t=`system`}=WO();return(0,K.jsx)(Q_,{theme:t,className:`toaster group`,icons:{success:(0,K.jsx)(ph,{className:`size-4`}),info:(0,K.jsx)(Uh,{className:`size-4`}),warning:(0,K.jsx)(Zg,{className:`size-4`}),error:(0,K.jsx)(lg,{className:`size-4`}),loading:(0,K.jsx)($h,{className:`size-4 animate-spin`})},style:{"--normal-bg":`var(--popover)`,"--normal-text":`var(--popover-foreground)`,"--normal-border":`var(--border)`,"--border-radius":`var(--radius)`},...e})},{richColors:!0,position:`top-center`})]}));
|
|
104
|
+
· 告警需通知刘工;报告用中文`,className:`w-full resize-y rounded-md border bg-background p-2.5 font-mono text-xs leading-relaxed`}),(0,K.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,K.jsxs)(`span`,{className:`text-[10px] text-muted-foreground`,children:[T.length,`/4000 字 · 修改对新对话即时生效 · 清空则恢复"不注入"`]}),(0,K.jsx)(Y,{size:`sm`,className:`text-xs`,disabled:D||T.length>4e3,onClick:V,children:D?`保存中…`:`保存画像`})]})]})]})}),(0,K.jsx)(SO,{value:`auth`,className:`mt-3`,children:(0,K.jsxs)(bm,{children:[(0,K.jsxs)(xm,{className:`pb-2`,children:[(0,K.jsxs)(Sm,{className:`flex items-center gap-2 text-sm`,children:[(0,K.jsx)(tg,{className:`h-4 w-4 text-primary`}),`访问令牌`,e&&(0,K.jsx)(J,{variant:`outline`,className:`text-[10px] ${e.auth.enabled?`text-emerald-400`:`text-amber-400`}`,children:e.auth.enabled?`已启用 · ${e.auth.token_masked}`:`未启用(局域网内开放访问)`})]}),(0,K.jsxs)(`p`,{className:`text-[11px] leading-relaxed text-muted-foreground`,children:[`工作站监听 0.0.0.0(局域网可达),启用令牌后所有 API 需要认证:浏览器登录换 Cookie(自动携带), 脚本用 `,(0,K.jsx)(`span`,{className:`font-mono`,children:`Authorization: Bearer <token>`}),`。留空保存即关闭。`]})]}),(0,K.jsxs)(Cm,{className:`space-y-2`,children:[(0,K.jsx)(p_,{type:`password`,value:k,onChange:e=>A(e.target.value),placeholder:e?.auth.enabled?`输入新令牌替换(留空保存=关闭认证)`:`设置访问令牌(留空=不启用)`,className:`font-mono text-xs`}),(0,K.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,K.jsx)(Y,{size:`sm`,className:`text-xs`,disabled:j,onClick:B,children:j?`保存中…`:`保存`}),(0,K.jsx)(`span`,{className:`text-[10px] text-muted-foreground`,children:`启用后其他设备首次访问将看到登录页 · 替换令牌会使所有已登录设备失效`})]})]})]})}),(0,K.jsx)(SO,{value:`guard`,className:`mt-3`,children:(0,K.jsxs)(bm,{className:`mb-3 max-w-2xl`,children:[(0,K.jsxs)(xm,{className:`pb-2`,children:[(0,K.jsxs)(Sm,{className:`flex items-center gap-2 text-sm`,children:[(0,K.jsx)(Fg,{className:`h-4 w-4 text-primary`}),`守护栏 · 助手命令执行策略`,(0,K.jsxs)(J,{variant:`outline`,className:`text-[10px]`,children:[N.length,` 危险规则 · `,F.length,` 白名单命令`]})]}),(0,K.jsxs)(`p`,{className:`text-[11px] leading-relaxed text-muted-foreground`,children:[`危险清单(正则,命中即`,(0,K.jsx)(`b`,{children:`永久拒绝`}),`,任何自主级别不豁免)与只读白名单(免确认直行)保存后即时生效,全程写审计。 只读之外的命令按写命令分级:L0/L1 拒绝、L2 人工确认、L3 免确认。`]})]}),(0,K.jsxs)(Cm,{className:`space-y-4`,children:[(0,K.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,K.jsx)(m_,{className:`text-xs`,children:`危险命令清单(正则,对整条命令做词面匹配)`}),(0,K.jsx)(`div`,{className:`space-y-1`,children:N.map(e=>(0,K.jsxs)(`div`,{className:`flex items-center gap-2 rounded-md border border-red-500/30 bg-red-500/5 px-2 py-1`,children:[(0,K.jsx)(`code`,{className:`min-w-0 flex-1 break-all font-mono text-[11px] text-red-300`,children:e}),(0,K.jsx)(Y,{size:`icon`,variant:`ghost`,className:`h-5 w-5 shrink-0`,onClick:()=>P(t=>t.filter(t=>t!==e)),title:`删除该规则`,children:(0,K.jsx)(r_,{className:`h-3 w-3`})})]},e))}),(0,K.jsxs)(`div`,{className:`flex gap-2`,children:[(0,K.jsx)(p_,{value:ee,onChange:e=>te(e.target.value),placeholder:`新增正则,如 \\b(fdisk|parted)\\b 或 \\bmv\\b\\s+--force`,className:`font-mono text-xs`,onKeyDown:e=>{e.key===`Enter`&&ee.trim()&&(P(e=>[...new Set([...e,ee.trim()])]),te(``))}}),(0,K.jsxs)(Y,{size:`sm`,variant:`outline`,className:`shrink-0 text-xs`,disabled:!ee.trim(),onClick:()=>{P(e=>[...new Set([...e,ee.trim()])]),te(``)},children:[(0,K.jsx)(dg,{className:`h-3 w-3`}),`添加`]})]}),N.length===0&&(0,K.jsx)(`p`,{className:`text-[10px] text-red-400`,children:`⚠ 清单为空 = 无任何命令会被永久拒绝(写命令仍走 L2/L3 分级)`})]}),(0,K.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,K.jsx)(m_,{className:`text-xs`,children:`只读白名单(单个命令名,复合命令逐段判定)`}),(0,K.jsx)(`div`,{className:`flex flex-wrap gap-1`,children:F.map(e=>(0,K.jsxs)(`span`,{className:`inline-flex items-center gap-1 rounded-md border bg-muted/50 px-1.5 py-0.5 font-mono text-[10px]`,children:[e,(0,K.jsx)(`button`,{className:`text-muted-foreground hover:text-red-400`,onClick:()=>I(t=>t.filter(t=>t!==e)),title:`移除`,children:(0,K.jsx)(r_,{className:`h-2.5 w-2.5`})})]},e))}),(0,K.jsxs)(`div`,{className:`flex gap-2`,children:[(0,K.jsx)(p_,{value:z,onChange:e=>ne(e.target.value),placeholder:`新增命令名,如 jq / awk / ss`,className:`font-mono text-xs`,onKeyDown:e=>{e.key===`Enter`&&z.trim()&&(I(e=>[...new Set([...e,z.trim()])]),ne(``))}}),(0,K.jsxs)(Y,{size:`sm`,variant:`outline`,className:`shrink-0 text-xs`,disabled:!z.trim(),onClick:()=>{I(e=>[...new Set([...e,z.trim()])]),ne(``)},children:[(0,K.jsx)(dg,{className:`h-3 w-3`}),`添加`]})]}),(0,K.jsx)(`p`,{className:`text-[10px] text-muted-foreground`,children:`⚠ 白名单命令带重定向(> / >> / tee)时不算只读;sqlite3 的 INSERT/UPDATE/DELETE 等写语句不算只读`})]}),(0,K.jsxs)(`div`,{className:`flex items-start gap-2.5 rounded-md border border-amber-500/30 bg-amber-500/5 p-2.5`,children:[(0,K.jsx)(LO,{checked:L,onCheckedChange:R,className:`mt-0.5`}),(0,K.jsxs)(`div`,{className:`space-y-0.5`,children:[(0,K.jsx)(`div`,{className:`text-xs font-medium`,children:`允许 sudo 降权形式(sudo -u <用户>)经 L2 人工确认后执行`}),(0,K.jsx)(`p`,{className:`text-[10px] leading-relaxed text-muted-foreground`,children:"默认关闭:所有含 sudo 的命令永久拒绝(含远程 SSH 命令中的 sudo)。开启后 `sudo -u 用户` 片段不再触发永久拒绝、 按写命令走 L2 确认(L3 免确认);裸 sudo(如 sudo reboot)与嵌套危险命令仍永久拒绝。"})]})]}),(0,K.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,K.jsx)(Y,{size:`sm`,className:`text-xs`,disabled:re,onClick:()=>{let t=(e?.guard.deny||[]).filter(e=>!N.includes(e));t.length?oe(t):H()},children:re?`保存中…`:`保存(即时生效)`}),(0,K.jsx)(Y,{size:`sm`,variant:`outline`,className:`text-xs`,onClick:()=>{e&&(P(e.guard.default_deny.slice()),I(e.guard.default_ro.slice()),R(!1),Z.info(`已填入出厂默认(未保存,点击「保存」生效)`))},children:`恢复出厂默认`}),(0,K.jsx)(`span`,{className:`text-[10px] text-muted-foreground`,children:`修改立即作用于全部助手对话 · 删减危险规则需二次确认并写审计`})]})]})]})})]}),(0,K.jsxs)(bm,{className:`mt-1 max-w-2xl text-xs text-muted-foreground`,children:[(0,K.jsx)(xm,{className:`pb-1`,children:(0,K.jsx)(Sm,{className:`text-sm`,children:`只读信息`})}),(0,K.jsxs)(Cm,{className:`space-y-1`,children:[(0,K.jsxs)(`div`,{children:[`本地助手库:`,n?.local_count??`…`,` 名 · 离线经验待回流:`,n?.outbox_pending??0,` 条`]}),(0,K.jsx)(`div`,{children:`优先级:运行时配置(本页)> 环境变量 > .env 默认值 · 令牌仅存本机 config/platform.json,界面永远掩码展示`})]})]}),(0,K.jsx)(a_,{open:ae!==null,onOpenChange:e=>{e||oe(null)},children:(0,K.jsxs)(c_,{className:`max-w-md`,children:[(0,K.jsxs)(l_,{children:[(0,K.jsxs)(d_,{className:`flex items-center gap-2 text-sm`,children:[(0,K.jsx)(Fg,{className:`h-4 w-4 text-red-400`}),`确认放行危险命令规则?`]}),(0,K.jsxs)(f_,{className:`text-xs leading-relaxed`,children:[`你正在移除 `,ae?.length,` 条永久拒绝规则,保存后助手将可以发起匹配这些规则的命令(仍按写命令分级:L2 需人工确认 / L3 免确认)。此操作将写入审计日志。`]})]}),(0,K.jsx)(`div`,{className:`max-h-40 space-y-1 overflow-auto`,children:ae?.map(e=>(0,K.jsx)(`div`,{className:`rounded-md border border-red-500/40 bg-red-500/10 px-2 py-1 font-mono text-[11px] break-all text-red-300`,children:e},e))}),(0,K.jsxs)(u_,{children:[(0,K.jsx)(Y,{variant:`outline`,size:`sm`,onClick:()=>oe(null),children:`取消`}),(0,K.jsx)(Y,{variant:`destructive`,size:`sm`,disabled:re,onClick:H,children:re?`保存中…`:`确认放行并保存`})]})]})})]})}function zO({onOk:e}){let[t,n]=(0,v.useState)(``),[r,i]=(0,v.useState)(!1),[a,o]=(0,v.useState)(``),s=async()=>{if(t.trim()&&!r){i(!0),o(``);try{let n=await fetch(`/api/auth/login`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({token:t.trim()})});if(!n.ok)throw Error((await n.json().catch(()=>({}))).error||`令牌不正确`);e()}catch(e){o(String(e.message))}finally{i(!1)}}};return(0,K.jsxs)(`div`,{className:`flex h-screen flex-col items-center justify-center gap-4 bg-background text-foreground`,children:[(0,K.jsx)(tg,{className:`h-8 w-8 text-primary`}),(0,K.jsx)(`div`,{className:`text-base font-semibold`,children:`AIMS 工作站已启用访问令牌`}),(0,K.jsxs)(`div`,{className:`flex gap-2`,children:[(0,K.jsx)(p_,{type:`password`,value:t,onChange:e=>n(e.target.value),onKeyDown:e=>{e.key===`Enter`&&!e.nativeEvent.isComposing&&s()},placeholder:`输入访问令牌…`,className:`w-64`,autoFocus:!0}),(0,K.jsx)(Y,{onClick:s,disabled:r||!t.trim(),children:r?`验证中…`:`进入`})]}),a&&(0,K.jsx)(`div`,{className:`text-xs text-red-400`,children:a}),(0,K.jsx)(`div`,{className:`text-[11px] text-muted-foreground`,children:`令牌在「系统设置 → 访问安全」配置 · 脚本访问可用 Authorization: Bearer 头`})]})}function BO(){let[e,t]=(0,v.useState)(`hub`),[n,r]=(0,v.useState)(null),[i,a]=(0,v.useState)(``),[o,s]=(0,v.useState)(null),[c,l]=(0,v.useState)(!1),[u,d]=(0,v.useState)([]),[f,p]=(0,v.useState)(null);(0,v.useEffect)(()=>{ot(`/api/health`).then(e=>{s(e),l(!!e.auth_required)}).catch(()=>s(null));let e=()=>ot(`/api/quick-switch`).then(e=>d(e.agents||[])).catch(()=>{});e();let t=setInterval(e,5e3);return()=>clearInterval(t)},[]),(0,v.useEffect)(()=>{n&&p(n)},[n]);let m=(e,n,i)=>{r(e),a(n),t(i)},h=u.filter(e=>e.running||e.pending).length;if(c)return(0,K.jsx)(zO,{onOk:()=>{l(!1),ot(`/api/health`).then(e=>{s(e),l(!!e.auth_required)}).catch(()=>{})}});let g=e=>it(`flex items-center gap-2 rounded-md px-3 py-2 text-sm transition-colors`,e?`bg-primary/15 font-medium text-primary`:`text-muted-foreground hover:bg-accent hover:text-foreground`);return(0,K.jsxs)(`div`,{className:`flex h-screen overflow-hidden bg-background text-foreground`,children:[(0,K.jsxs)(`aside`,{className:`flex w-52 shrink-0 flex-col border-r border-sidebar-border bg-sidebar text-sidebar-foreground`,children:[(0,K.jsxs)(`div`,{className:`flex items-center gap-2 px-4 py-4`,children:[(0,K.jsx)(Dh,{className:`h-6 w-6 text-primary`}),(0,K.jsxs)(`div`,{children:[(0,K.jsx)(`div`,{className:`text-sm font-bold leading-tight`,children:`AIMS 工业智能体平台`}),(0,K.jsx)(`div`,{className:`text-[10px] text-muted-foreground`,children:`平台AI化 · 系统工具化`})]})]}),(0,K.jsxs)(`nav`,{className:`flex flex-col gap-1 px-2`,children:[(0,K.jsxs)(`button`,{onClick:()=>t(`hub`),className:g(e===`hub`),children:[(0,K.jsx)(Yh,{className:`h-4 w-4`}),`助手大厅`]}),(0,K.jsxs)(`button`,{onClick:()=>t(`evolution`),className:g(e===`evolution`),children:[(0,K.jsx)(Yg,{className:`h-4 w-4`}),`自进化`]}),(0,K.jsxs)(`button`,{onClick:()=>t(`plugins`),className:g(e===`plugins`),children:[(0,K.jsx)(pg,{className:`h-4 w-4`}),`插件中心`]}),(0,K.jsxs)(`button`,{onClick:()=>t(`settings`),className:g(e===`settings`),children:[(0,K.jsx)(kg,{className:`h-4 w-4`}),`系统设置`]})]}),(0,K.jsxs)(`div`,{className:`mt-3 flex items-center justify-between border-t border-sidebar-border px-4 pb-1 pt-3`,children:[(0,K.jsxs)(`span`,{className:`text-[11px] font-semibold uppercase tracking-wide text-muted-foreground`,children:[`小助手 · 在岗 `,u.length]}),h>0&&(0,K.jsxs)(`span`,{className:`text-[10px] text-emerald-400`,title:`会话在后台运行中,切回即可看到进度`,children:[`● `,h,` 运行`]})]}),(0,K.jsxs)(`div`,{className:`min-h-0 flex-1 overflow-y-auto px-2 pb-2`,children:[u.length===0&&(0,K.jsx)(`p`,{className:`px-3 py-2 text-[11px] leading-relaxed text-muted-foreground`,children:`在「助手大厅」完成上岗配置后,这里按助手分组,一键直达各自的工作台。`}),u.map(t=>{let r=n===t.agent_id,i=f===t.agent_id,a=e=>it(`flex items-center gap-2 rounded-md px-2.5 py-1.5 text-xs transition-colors`,e?`bg-primary/15 font-medium text-primary`:`text-muted-foreground hover:bg-accent hover:text-foreground`);return(0,K.jsxs)(`div`,{className:`mb-0.5`,children:[(0,K.jsxs)(`div`,{className:it(`group flex items-center gap-0.5 rounded-md pr-1 transition-colors`,r&&e!==`hub`?`bg-primary/10`:`hover:bg-accent`),children:[(0,K.jsx)(`button`,{onClick:()=>p(i?null:t.agent_id),className:`flex h-9 w-6 shrink-0 items-center justify-center text-muted-foreground hover:text-foreground`,title:i?`折叠`:`展开`,children:i?(0,K.jsx)(ah,{className:`h-3.5 w-3.5`}):(0,K.jsx)(sh,{className:`h-3.5 w-3.5`})}),(0,K.jsxs)(`button`,{onClick:()=>m(t.agent_id,t.name,`workbench`),title:t.running||t.pending?`${t.name} · ${t.statusText}`:t.name,className:it(`flex min-w-0 flex-1 items-center gap-1.5 py-2 pr-1 text-left text-sm`,r&&e!==`hub`?`font-medium text-primary`:`text-muted-foreground group-hover:text-foreground`),children:[(t.running||t.pending)&&(0,K.jsx)(`span`,{className:it(`h-1.5 w-1.5 shrink-0 rounded-full`,t.running?`animate-pulse bg-emerald-500`:`bg-amber-500`)}),(0,K.jsx)(`span`,{className:`truncate`,children:t.name})]})]}),i&&(0,K.jsxs)(`div`,{className:`ml-6 mt-0.5 flex flex-col gap-0.5 border-l border-border/60 pl-2`,children:[(0,K.jsxs)(`button`,{onClick:()=>m(t.agent_id,t.name,`workbench`),className:a(r&&e===`workbench`),children:[(0,K.jsx)(ag,{className:`h-3.5 w-3.5`}),`工作台`]}),(0,K.jsxs)(`button`,{onClick:()=>m(t.agent_id,t.name,`editor`),className:a(r&&e===`editor`),children:[(0,K.jsx)(Dg,{className:`h-3.5 w-3.5`}),`定制工作台`]})]})]},t.agent_id)})]}),(0,K.jsxs)(`div`,{className:`mt-auto space-y-1.5 border-t border-sidebar-border px-4 pb-4 pt-3 text-[11px] text-muted-foreground`,children:[(0,K.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,K.jsx)(`span`,{className:it(`h-1.5 w-1.5 rounded-full`,o?`bg-emerald-500`:`bg-red-500`)}),`LLM `,o?.model||`未连接`,`(pi-ai)`]}),(0,K.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,K.jsx)(`span`,{className:it(`h-1.5 w-1.5 rounded-full`,o?`bg-emerald-500`:`bg-red-500`)}),`ARM `,o?o.pat?`已连接·PAT`:`已连接·只读`:`未连接`]})]})]}),(0,K.jsxs)(`div`,{className:`flex min-w-0 flex-1 flex-col`,children:[(0,K.jsxs)(`header`,{className:`flex h-12 shrink-0 items-center gap-3 border-b bg-card px-5`,children:[(0,K.jsx)(th,{className:`h-4 w-4 text-primary`}),(0,K.jsx)(`span`,{className:`text-sm font-semibold`,children:i||`数字员工队伍`}),n&&(0,K.jsx)(J,{variant:`outline`,className:`text-[10px]`,children:`在岗`}),(0,K.jsxs)(`span`,{className:`ml-auto text-xs text-muted-foreground`,children:[e===`hub`&&`从 ARM 员工库选择助手,或为未上岗助手完成上岗配置`,e===`editor`&&`AI 起草 → 人工审阅 → 版本化发布 → 可回滚`,e===`evolution`&&`数据回流 · 评测迭代 · 知识沉淀 · 飞轮证据`,e===`plugins`&&`统一注册表 · 生命周期 · 引用追踪 · 治理策略`,e===`settings`&&`ARM 源切换 · 令牌管理 · 保存即生效`]})]}),(0,K.jsxs)(`main`,{className:`min-h-0 flex-1 overflow-hidden`,children:[e===`hub`&&(0,K.jsx)(ev,{onOpen:m}),e===`workbench`&&n&&(0,K.jsx)(gO,{agentId:n,onName:a,onEdit:()=>t(`editor`)},n),e===`editor`&&n&&(0,K.jsx)(PO,{agentId:n},n),e===`evolution`&&(0,K.jsx)(IO,{}),e===`plugins`&&(0,K.jsx)(jO,{}),e===`settings`&&(0,K.jsx)(RO,{}),(e===`workbench`||e===`editor`)&&!n&&(0,K.jsx)(`div`,{className:`flex h-full items-center justify-center text-sm text-muted-foreground`,children:`请先在助手大厅选择一名助手`})]})]})]})}var VO=(e,t,n,r,i,a,o,s)=>{let c=document.documentElement,l=[`light`,`dark`];function u(t){(Array.isArray(e)?e:[e]).forEach(e=>{let n=e===`class`,r=n&&a?i.map(e=>a[e]||e):i;n?(c.classList.remove(...r),c.classList.add(a&&a[t]?a[t]:t)):c.setAttribute(e,t)}),d(t)}function d(e){s&&l.includes(e)&&(c.style.colorScheme=e)}function f(){return window.matchMedia(`(prefers-color-scheme: dark)`).matches?`dark`:`light`}if(r)u(r);else try{let e=localStorage.getItem(t)||n;u(o&&e===`system`?f():e)}catch{}},HO=v.createContext(void 0),UO={setTheme:e=>{},themes:[]},WO=()=>v.useContext(HO)??UO;v.memo(({forcedTheme:e,storageKey:t,attribute:n,enableSystem:r,enableColorScheme:i,defaultTheme:a,value:o,themes:s,nonce:c,scriptProps:l})=>{let u=JSON.stringify([n,t,a,e,s,o,r,i]).slice(1,-1);return v.createElement(`script`,{...l,suppressHydrationWarning:!0,nonce:typeof window>`u`?c:``,dangerouslySetInnerHTML:{__html:`(${VO.toString()})(${u})`}})}),(0,y.createRoot)(document.getElementById(`root`)).render((0,K.jsxs)(v.StrictMode,{children:[(0,K.jsx)(BO,{}),(0,K.jsx)(({...e})=>{let{theme:t=`system`}=WO();return(0,K.jsx)(Q_,{theme:t,className:`toaster group`,icons:{success:(0,K.jsx)(ph,{className:`size-4`}),info:(0,K.jsx)(Uh,{className:`size-4`}),warning:(0,K.jsx)(Zg,{className:`size-4`}),error:(0,K.jsx)(lg,{className:`size-4`}),loading:(0,K.jsx)($h,{className:`size-4 animate-spin`})},style:{"--normal-bg":`var(--popover)`,"--normal-text":`var(--popover-foreground)`,"--normal-border":`var(--border)`,"--border-radius":`var(--radius)`},...e})},{richColors:!0,position:`top-center`})]}));
|
package/web/dist/index.html
CHANGED
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
|
|
6
6
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
7
7
|
<title>AIMS 工业智能体平台</title>
|
|
8
|
-
<script type="module" crossorigin src="/assets/index-
|
|
9
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
8
|
+
<script type="module" crossorigin src="/assets/index-yKpm2RG4.js"></script>
|
|
9
|
+
<link rel="stylesheet" crossorigin href="/assets/index-CNak0man.css">
|
|
10
10
|
</head>
|
|
11
11
|
<body>
|
|
12
12
|
<div id="root"></div>
|