:root{--bg: #0a0a0f;--surface: #12121a;--surface-2: #1a1a26;--surface-3: #22222f;--border: #26263a;--border-soft: #1e1e2e;--text: #e8e8f0;--muted: #8a8aa0;--faint: #5a5a72;--accent-1: #8b5cf6;--accent-2: #22d3ee;--green: #34d399;--amber: #fbbf24;--red: #f87171;--grad: linear-gradient(120deg, var(--accent-1), var(--accent-2));--mono: "JetBrains Mono", "SFMono-Regular", Consolas, "Liberation Mono", monospace;--sans: "Inter", -apple-system, "Segoe UI", "PingFang SC", "Microsoft YaHei", sans-serif}*{box-sizing:border-box}html,body,#root{height:100%}body{margin:0;background:var(--bg);color:var(--text);font-family:var(--sans);font-size:14px;line-height:1.6;-webkit-font-smoothing:antialiased}::selection{background:#8b5cf659}a{color:var(--accent-2);text-decoration:none}a:hover{text-decoration:underline}.app-shell{display:flex;flex-direction:column;height:100vh;overflow:hidden}.app-body{display:flex;flex:1;min-height:0}.topbar{display:flex;align-items:center;gap:20px;padding:0 20px;height:52px;background:#12121ad1;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);border-bottom:1px solid var(--border-soft);flex-shrink:0}.brand{font-weight:700;font-size:16px;letter-spacing:.02em;background:var(--grad);-webkit-background-clip:text;background-clip:text;color:transparent}.brand small{font-size:11px;font-weight:400;color:var(--faint);-webkit-text-fill-color:var(--faint);margin-left:8px}.nav{display:flex;gap:4px;height:100%}.nav a{display:flex;align-items:center;padding:0 14px;color:var(--muted);font-size:13px;border-bottom:2px solid transparent;transition:color .15s,border-color .15s}.nav a:hover{color:var(--text);text-decoration:none}.nav a.active{color:var(--text);border-bottom-color:var(--accent-1)}.topbar .spacer{flex:1}.role-chip{font-size:11px;font-family:var(--mono);padding:3px 10px;border-radius:999px;border:1px solid var(--border);color:var(--muted)}.role-chip.admin{color:var(--green);border-color:#34d39959}.role-chip.user{color:var(--amber);border-color:#fbbf2459}.link-btn{background:none;border:none;color:var(--muted);font-size:12px;cursor:pointer;padding:4px 8px;border-radius:6px;font-family:var(--sans)}.link-btn:hover{color:var(--text);background:var(--surface-2)}.page{flex:1;overflow-y:auto;padding:28px 32px;min-width:0}.page-narrow{max-width:1200px;margin:0 auto}.card{background:var(--surface);border:1px solid var(--border-soft);border-radius:14px;position:relative;overflow:hidden}.card:before{content:"";position:absolute;top:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,rgba(139,92,246,.4),transparent);opacity:.7}.card-pad{padding:18px 20px}.grid-stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:14px}.stat-label{font-size:12px;color:var(--muted)}.stat-value{font-family:var(--mono);font-size:24px;font-weight:600;margin-top:4px;background:var(--grad);-webkit-background-clip:text;background-clip:text;color:transparent}.stat-sub{font-size:11px;color:var(--faint);margin-top:2px;font-family:var(--mono)}.section-title{font-size:13px;font-weight:600;color:var(--muted);margin:26px 0 12px;letter-spacing:.04em}input[type=text],input[type=password],input[type=search],select,textarea{background:var(--surface-2);border:1px solid var(--border);color:var(--text);border-radius:8px;padding:7px 12px;font-size:13px;font-family:var(--sans);outline:none;transition:border-color .15s}input:focus,select:focus,textarea:focus{border-color:var(--accent-1)}select{cursor:pointer}.btn{background:var(--surface-2);color:var(--text);border:1px solid var(--border);border-radius:8px;padding:7px 16px;font-size:13px;cursor:pointer;font-family:var(--sans);transition:background .15s,border-color .15s,transform .1s}.btn:hover{background:var(--surface-3)}.btn:active{transform:translateY(1px)}.btn:disabled{opacity:.45;cursor:not-allowed}.btn-primary{background:var(--grad);border:none;color:#0a0a0f;font-weight:600}.btn-primary:hover{filter:brightness(1.1);background:var(--grad)}.btn-danger{color:var(--red);border-color:#f8717159}table.tbl{width:100%;border-collapse:collapse;font-size:13px}.tbl th{text-align:left;font-size:11px;font-weight:500;color:var(--faint);padding:8px 12px;border-bottom:1px solid var(--border);letter-spacing:.05em;white-space:nowrap}.tbl td{padding:10px 12px;border-bottom:1px solid var(--border-soft);vertical-align:top}.tbl tr.rowlink{cursor:pointer;transition:background .12s}.tbl tr.rowlink:hover{background:var(--surface-2)}.tbl .num{font-family:var(--mono);font-size:12px}.mono{font-family:var(--mono)}.muted{color:var(--muted)}.faint{color:var(--faint)}.small{font-size:12px}.truncate{max-width:420px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.badge{display:inline-block;font-size:10px;font-family:var(--mono);padding:2px 8px;border-radius:999px;border:1px solid var(--border);color:var(--muted);letter-spacing:.03em}.badge.local{color:var(--accent-2);border-color:#22d3ee4d}.badge.ecs{color:var(--accent-1);border-color:#8b5cf64d}.badge.err{color:var(--red);border-color:#f871714d}.msg{margin:14px 0}.msg-role{font-size:10px;font-family:var(--mono);color:var(--faint);letter-spacing:.08em;margin-bottom:4px;text-transform:uppercase}.msg-role.user{color:var(--accent-2)}.msg-role.assistant{color:var(--accent-1)}.msg-user{background:var(--surface-2);border:1px solid var(--border-soft);border-left:2px solid var(--accent-2);border-radius:4px 12px 12px;padding:12px 16px;white-space:pre-wrap;max-width:900px}.msg-assistant{padding:2px 0;max-width:940px}details.thinking{margin:6px 0}details.thinking summary{cursor:pointer;font-size:11px;color:var(--faint);font-family:var(--mono);padding:4px 0;-webkit-user-select:none;user-select:none}details.thinking summary:hover{color:var(--muted)}details.thinking .body{border-left:2px solid var(--border);padding:4px 12px;margin:4px 0;color:var(--muted);font-size:12.5px;white-space:pre-wrap;max-height:300px;overflow-y:auto}.toolcard{border:1px solid var(--border);border-radius:10px;margin:10px 0;background:var(--surface);max-width:940px;overflow:hidden}.toolcard-head{display:flex;align-items:center;gap:10px;padding:8px 14px;background:var(--surface-2);cursor:pointer;-webkit-user-select:none;user-select:none;font-family:var(--mono);font-size:12px}.toolcard-head .tname{color:var(--accent-2);font-weight:600}.toolcard-head .tstatus{margin-left:auto;font-size:10px}.toolcard-head .tstatus.ok{color:var(--green)}.toolcard-head .tstatus.error{color:var(--red)}.toolcard-body{border-top:1px solid var(--border-soft);padding:10px 14px}.toolcard pre,pre.code{background:#0d0d14;border:1px solid var(--border-soft);border-radius:8px;padding:10px 14px;overflow-x:auto;font-size:12px;line-height:1.5;font-family:var(--mono);margin:8px 0;max-height:420px;overflow-y:auto}.toolcard pre{margin:6px 0}.chip{display:inline-flex;align-items:center;gap:6px;font-size:11px;font-family:var(--mono);color:var(--muted);background:var(--surface);border:1px solid var(--border-soft);border-radius:999px;padding:3px 12px;margin:3px 4px 3px 0}.md{font-size:13.5px}.md p{margin:8px 0}.md h1,.md h2,.md h3,.md h4{margin:18px 0 8px;line-height:1.35}.md h1{font-size:19px}.md h2{font-size:17px}.md h3{font-size:15px}.md ul,.md ol{padding-left:22px;margin:8px 0}.md li{margin:3px 0}.md blockquote{margin:8px 0;padding:6px 14px;border-left:2px solid var(--border);color:var(--muted);background:var(--surface)}.md table{border-collapse:collapse;margin:10px 0;font-size:12.5px}.md th,.md td{border:1px solid var(--border);padding:6px 12px}.md th{background:var(--surface-2)}.md code{font-family:var(--mono);font-size:12px;background:var(--surface-2);border:1px solid var(--border-soft);border-radius:4px;padding:1px 5px}.md pre code{background:none;border:none;padding:0;font-size:12px}.md pre{background:#0d0d14;border:1px solid var(--border-soft);border-radius:8px;padding:12px 14px;overflow-x:auto}.md hr{border:none;border-top:1px solid var(--border);margin:16px 0}.md img{max-width:100%;border-radius:8px}.hljs{background:transparent!important;color:#c9d1d9!important}.hljs-keyword,.hljs-selector-tag,.hljs-literal{color:#c792ea}.hljs-string,.hljs-attr{color:#7ee787}.hljs-number,.hljs-symbol{color:#f2cc60}.hljs-title,.hljs-name,.hljs-function .hljs-title{color:#79c0ff}.hljs-comment,.hljs-quote{color:#6a6a85}.hljs-built_in,.hljs-type{color:#56d4dd}.login-wrap{flex:1;display:flex;align-items:center;justify-content:center;padding:24px}.login-card{width:100%;max-width:460px}.login-title{font-size:17px;font-weight:700;display:flex;align-items:center;gap:10px}.login-decl{font-size:12px;color:var(--muted);line-height:1.7;margin:12px 0 18px}.login-row{display:flex;gap:10px}.login-row input{flex:1}.chat-wrap{display:flex;flex-direction:column;flex:1;min-height:0;height:100%}.chat-log{flex:1;overflow-y:auto;padding:20px 0}.chat-input-row{display:flex;gap:10px;padding:14px 0 6px;border-top:1px solid var(--border-soft);align-items:flex-end}.chat-input-row textarea{flex:1;resize:none;min-height:44px;max-height:180px;font-size:13.5px}.chat-meta{display:flex;align-items:center;gap:10px;padding:8px 0;flex-wrap:wrap}.spin{display:inline-block;width:10px;height:10px;border-radius:50%;border:2px solid var(--faint);border-top-color:var(--accent-2);animation:spin .8s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.heat{display:flex;align-items:flex-end;gap:2px;height:60px}.heat .bar{flex:1;min-width:3px;border-radius:2px 2px 0 0;background:linear-gradient(180deg,var(--accent-1),rgba(34,211,238,.25));min-height:2px;opacity:.9}.heat .bar:hover{opacity:1;filter:brightness(1.3)}.empty{color:var(--faint);font-size:13px;padding:40px 0;text-align:center}.pager{display:flex;align-items:center;gap:12px;justify-content:flex-end;padding:14px 0 0;font-size:12px;color:var(--muted)}.filterbar{display:flex;gap:10px;flex-wrap:wrap;margin-bottom:16px;align-items:center}.filterbar input[type=search]{min-width:260px}.detail-head{display:flex;flex-wrap:wrap;gap:8px 20px;align-items:baseline;margin-bottom:20px}.detail-title{font-size:17px;font-weight:650;max-width:720px}.kv{font-size:12px;font-family:var(--mono);color:var(--muted)}.kv b{color:var(--text);font-weight:500}.restricted{flex:1;display:flex;align-items:center;justify-content:center;padding:24px}.restricted .box{max-width:420px;text-align:center;padding:32px;font-size:13px;color:var(--muted)}
