@rubytech/taskmaster 1.21.2 → 1.22.0
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/dist/agents/skills/agent-scope.js +4 -5
- package/dist/agents/skills/types.js +25 -1
- package/dist/agents/skills/workspace.js +29 -5
- package/dist/agents/skills-status.js +5 -0
- package/dist/auto-reply/reply/get-reply-run.js +1 -0
- package/dist/auto-reply/reply/session-updates.js +2 -1
- package/dist/build-info.json +3 -3
- package/dist/control-ui/assets/{index-fP8Y5Vwq.js → index-BErknDpG.js} +702 -649
- package/dist/control-ui/assets/index-BErknDpG.js.map +1 -0
- package/dist/control-ui/assets/index-C7ieCeTV.css +1 -0
- package/dist/control-ui/index.html +2 -2
- package/dist/gateway/protocol/schema/agents-models-skills.js +3 -0
- package/dist/gateway/protocol/schema/logs-chat.js +4 -0
- package/dist/gateway/server-broadcast.js +2 -0
- package/dist/gateway/server-methods/logs.js +22 -2
- package/dist/gateway/server-methods/skills.js +7 -0
- package/dist/logging/logger.js +6 -1
- package/dist/web/auto-reply/monitor.js +15 -5
- package/dist/web/inbound/monitor.js +7 -1
- package/package.json +1 -1
- package/scripts/install.sh +25 -0
- package/taskmaster-docs/USER-GUIDE.md +10 -2
- package/dist/control-ui/assets/index-0WHVrpg7.css +0 -1
- package/dist/control-ui/assets/index-fP8Y5Vwq.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@import"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500&display=swap";:root{--bg: #12141a;--bg-accent: #14161d;--bg-elevated: #1a1d25;--bg-hover: #262a35;--bg-muted: #262a35;--card: #181b22;--card-foreground: #f4f4f5;--card-highlight: rgba(255, 255, 255, .05);--popover: #181b22;--popover-foreground: #f4f4f5;--panel: #12141a;--panel-strong: #1a1d25;--panel-hover: #262a35;--chrome: rgba(18, 20, 26, .95);--chrome-strong: rgba(18, 20, 26, .98);--text: #e4e4e7;--text-strong: #fafafa;--chat-text: #e4e4e7;--muted: #71717a;--muted-strong: #52525b;--muted-foreground: #71717a;--border: #27272a;--border-strong: #3f3f46;--border-hover: #52525b;--input: #27272a;--ring: rgba(255, 255, 255, .2);--brand-bg: transparent;--brand-bg-subtle: transparent;--brand-bg-card: transparent;--accent: #00d4ff;--accent-hover: #33dfff;--accent-muted: #00d4ff;--accent-subtle: rgba(0, 212, 255, .15);--accent-foreground: #fafafa;--accent-glow: rgba(0, 212, 255, .25);--primary: #00d4ff;--primary-foreground: #111111;--secondary: #1e2028;--secondary-foreground: #f4f4f5;--accent-2: #14b8a6;--accent-2-muted: rgba(20, 184, 166, .7);--accent-2-subtle: rgba(20, 184, 166, .15);--ok: #22c55e;--ok-muted: rgba(34, 197, 94, .75);--ok-subtle: rgba(34, 197, 94, .12);--destructive: #ef4444;--destructive-foreground: #fafafa;--warn: #f59e0b;--warn-muted: rgba(245, 158, 11, .75);--warn-subtle: rgba(245, 158, 11, .12);--danger: #ef4444;--danger-muted: rgba(239, 68, 68, .75);--danger-subtle: rgba(239, 68, 68, .12);--info: #3b82f6;--focus: rgba(0, 212, 255, .25);--focus-ring: 0 0 0 2px var(--bg), 0 0 0 4px var(--ring);--focus-glow: 0 0 0 2px var(--bg), 0 0 0 4px var(--ring), 0 0 20px var(--accent-glow);--grid-line: rgba(255, 255, 255, .04);--theme-switch-x: 50%;--theme-switch-y: 50%;--mono: "JetBrains Mono", ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas, monospace;--font-body: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "DejaVu Sans", sans-serif;--font-display: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "DejaVu Sans", sans-serif;--shadow-sm: 0 1px 2px rgba(0, 0, 0, .2);--shadow-md: 0 4px 12px rgba(0, 0, 0, .25), 0 0 0 1px rgba(255, 255, 255, .03);--shadow-lg: 0 12px 28px rgba(0, 0, 0, .35), 0 0 0 1px rgba(255, 255, 255, .03);--shadow-xl: 0 24px 48px rgba(0, 0, 0, .4), 0 0 0 1px rgba(255, 255, 255, .03);--shadow-glow: 0 0 30px var(--accent-glow);--radius-sm: 6px;--radius-md: 8px;--radius-lg: 12px;--radius-xl: 16px;--radius-full: 9999px;--radius: 8px;--ease-out: cubic-bezier(.16, 1, .3, 1);--ease-in-out: cubic-bezier(.4, 0, .2, 1);--ease-spring: cubic-bezier(.34, 1.56, .64, 1);--duration-fast: .12s;--duration-normal: .2s;--duration-slow: .35s;color-scheme:dark}:root[data-theme=light]{--bg: #fafafa;--bg-accent: #f5f5f5;--bg-elevated: #ffffff;--bg-hover: #f0f0f0;--bg-muted: #f0f0f0;--bg-content: #f5f5f5;--card: #ffffff;--card-foreground: #18181b;--card-highlight: rgba(0, 0, 0, .03);--popover: #ffffff;--popover-foreground: #18181b;--panel: #fafafa;--panel-strong: #f5f5f5;--panel-hover: #ebebeb;--chrome: rgba(250, 250, 250, .95);--chrome-strong: rgba(250, 250, 250, .98);--text: #3f3f46;--text-strong: #18181b;--chat-text: #3f3f46;--muted: #71717a;--muted-strong: #52525b;--muted-foreground: #71717a;--border: #e4e4e7;--border-strong: #d4d4d8;--border-hover: #a1a1aa;--input: #e4e4e7;--accent: #0891b2;--accent-hover: #06b6d4;--accent-muted: #0891b2;--accent-subtle: rgba(8, 145, 178, .12);--accent-foreground: #ffffff;--accent-glow: rgba(8, 145, 178, .15);--primary: #0891b2;--primary-foreground: #ffffff;--secondary: #f4f4f5;--secondary-foreground: #3f3f46;--accent-2: #0d9488;--accent-2-muted: rgba(13, 148, 136, .75);--accent-2-subtle: rgba(13, 148, 136, .12);--ok: #16a34a;--ok-muted: rgba(22, 163, 74, .75);--ok-subtle: rgba(22, 163, 74, .1);--destructive: #dc2626;--destructive-foreground: #fafafa;--warn: #d97706;--warn-muted: rgba(217, 119, 6, .75);--warn-subtle: rgba(217, 119, 6, .1);--danger: #dc2626;--danger-muted: rgba(220, 38, 38, .75);--danger-subtle: rgba(220, 38, 38, .1);--info: #2563eb;--focus: rgba(8, 145, 178, .2);--focus-glow: 0 0 0 2px var(--bg), 0 0 0 4px var(--ring), 0 0 16px var(--accent-glow);--grid-line: rgba(0, 0, 0, .05);--shadow-sm: 0 1px 2px rgba(0, 0, 0, .06);--shadow-md: 0 4px 12px rgba(0, 0, 0, .08), 0 0 0 1px rgba(0, 0, 0, .04);--shadow-lg: 0 12px 28px rgba(0, 0, 0, .12), 0 0 0 1px rgba(0, 0, 0, .04);--shadow-xl: 0 24px 48px rgba(0, 0, 0, .15), 0 0 0 1px rgba(0, 0, 0, .04);--shadow-glow: 0 0 24px var(--accent-glow);color-scheme:light}*{box-sizing:border-box}html,body{height:100%}body{margin:0;font:400 14px/1.55 var(--font-body);letter-spacing:-.02em;background:linear-gradient(var(--brand-bg-subtle),var(--brand-bg-subtle)),var(--bg);color:var(--text);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@keyframes theme-circle-transition{0%{clip-path:circle(0% at var(--theme-switch-x, 50%) var(--theme-switch-y, 50%))}to{clip-path:circle(150% at var(--theme-switch-x, 50%) var(--theme-switch-y, 50%))}}html.theme-transition{view-transition-name:theme}html.theme-transition::view-transition-old(theme){mix-blend-mode:normal;animation:none;z-index:1}html.theme-transition::view-transition-new(theme){mix-blend-mode:normal;z-index:2;animation:theme-circle-transition .4s var(--ease-out) forwards}@media(prefers-reduced-motion:reduce){html.theme-transition::view-transition-old(theme),html.theme-transition::view-transition-new(theme){animation:none!important}}taskmaster-app{display:block;position:relative;z-index:1;min-height:100vh}a{color:var(--accent);text-decoration:none}a:hover{text-decoration:underline}button,input,textarea,select{font:inherit;color:inherit}::selection{background:var(--accent-subtle);color:var(--text-strong)}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:var(--border);border-radius:var(--radius-full)}::-webkit-scrollbar-thumb:hover{background:var(--border-strong)}@keyframes rise{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@keyframes fade-in{0%{opacity:0}to{opacity:1}}@keyframes scale-in{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}@keyframes dashboard-enter{0%{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}@keyframes shimmer{0%{background-position:-200% 0}to{background-position:200% 0}}@keyframes pulse-subtle{0%,to{opacity:1}50%{opacity:.7}}@keyframes glow-pulse{0%,to{box-shadow:0 0 #00d4ff00}50%{box-shadow:0 0 20px var(--accent-glow)}}.stagger-1{animation-delay:0ms}.stagger-2{animation-delay:50ms}.stagger-3{animation-delay:.1s}.stagger-4{animation-delay:.15s}.stagger-5{animation-delay:.2s}.stagger-6{animation-delay:.25s}:focus-visible{outline:none;box-shadow:var(--focus-ring)}.grid{display:grid;gap:20px}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.stat-grid{display:grid;gap:14px;grid-template-columns:repeat(auto-fit,minmax(150px,1fr))}.note-grid{display:grid;gap:16px;grid-template-columns:repeat(auto-fit,minmax(220px,1fr))}.row{display:flex;gap:12px;align-items:center}.stack{display:grid;gap:12px;grid-template-columns:minmax(0,1fr)}.filters{display:flex;flex-wrap:wrap;gap:8px;align-items:center}@media(max-width:1100px){.grid-cols-2,.grid-cols-3,.table-head,.table-row,.list-item{grid-template-columns:1fr}}@media(max-width:600px){.card{padding:12px;border-radius:var(--radius-md)}.card-title{font-size:13px}.stat-grid{gap:8px;grid-template-columns:repeat(2,1fr)}.stat{padding:10px;border-radius:var(--radius-md)}.stat-label{font-size:11px}.stat-value{font-size:18px}.note-grid{grid-template-columns:1fr;gap:8px}.form-grid{grid-template-columns:1fr;gap:10px}.field input,.field textarea,.field select{padding:8px 10px;border-radius:var(--radius-md);font-size:14px}.btn{padding:8px 12px;font-size:12px}.pill{padding:4px 10px;font-size:12px}.chat-header{flex-direction:column;align-items:stretch;gap:8px}.chat-header__left{flex-direction:column;align-items:stretch}.chat-header__right{justify-content:space-between}.chat-session{min-width:unset;width:100%}.chat-thread{margin-top:8px;padding:12px 8px}.chat-msg{max-width:90%}.chat-bubble{padding:8px 12px;border-radius:var(--radius-md)}.chat-compose{gap:8px}.chat-compose__field textarea{min-height:60px;padding:8px 10px;border-radius:var(--radius-md);font-size:14px}.log-stream{border-radius:var(--radius-md);max-height:380px}.log-row{grid-template-columns:1fr;gap:4px;padding:8px}.log-time{font-size:10px}.log-level{font-size:9px}.log-subsystem{font-size:11px}.log-message{font-size:12px}.list-item{padding:10px;border-radius:var(--radius-md)}.list-title{font-size:13px}.list-sub{font-size:11px}.code-block{padding:8px;border-radius:var(--radius-md);font-size:11px}.theme-toggle{--theme-item: 24px;--theme-gap: 2px;--theme-pad: 3px}.theme-icon{width:12px;height:12px}}@media(max-width:400px){.card{padding:10px}.stat{padding:8px}.stat-value{font-size:16px}.chat-bubble{padding:8px 10px}.chat-compose__field textarea{min-height:52px;padding:8px 10px;font-size:13px}.btn{padding:6px 10px;font-size:11px}.theme-toggle{--theme-item: 22px;--theme-gap: 2px;--theme-pad: 2px}.theme-icon{width:11px;height:11px}}.chat{position:relative;display:flex;flex-direction:column;flex:1 1 0;height:100%;min-height:0;overflow:hidden;background:transparent!important;border:none!important;box-shadow:none!important}.chat--dragover{outline:2px dashed var(--accent)!important;outline-offset:-2px;background:var(--accent-subtle)!important}.chat-header{display:flex;justify-content:space-between;align-items:center;gap:12px;flex-wrap:nowrap;flex-shrink:0;padding-bottom:12px;margin-bottom:12px;background:transparent}.chat-header__left{display:flex;align-items:center;gap:12px;flex-wrap:wrap;min-width:0}.chat-session{min-width:180px}.chat-thread{flex:1 1 0;overflow-y:auto;overflow-x:hidden;padding:12px 4px;margin:0 -4px;min-height:0;border-radius:12px;background:transparent}.chat-load-more{display:flex;align-items:center;justify-content:center;gap:8px;padding:12px 0;color:var(--muted);font-size:13px}.chat-load-more__spinner{display:inline-flex;animation:spin 1s linear infinite}.chat-load-more__spinner svg{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:2px}.chat-load-more__btn{border:1px solid var(--border);border-radius:16px;background:var(--panel);color:var(--muted);font-size:13px;padding:6px 16px;cursor:pointer;transition:color .15s,background .15s,border-color .15s}.chat-load-more__btn:hover{color:var(--text);background:var(--panel-strong);border-color:var(--border-strong, var(--border))}.chat-load-more__btn:focus,.chat-load-more__btn:focus-visible{outline:none;box-shadow:none;border-color:#fff3}:root[data-theme=light] .chat-load-more__btn{background:#fff;box-shadow:0 1px 3px #00000014}:root[data-theme=light] .chat-load-more__btn:hover{background:#f5f5f5}:root[data-theme=light] .chat-load-more__btn:focus,:root[data-theme=light] .chat-load-more__btn:focus-visible{outline:none;box-shadow:none;border-color:#00000026}.chat-scroll-bottom{position:absolute;bottom:8px;left:50%;transform:translate(-50%);z-index:5;width:36px;height:36px;border-radius:50%;border:1px solid var(--border);background:var(--card);color:var(--muted);cursor:pointer;display:flex;align-items:center;justify-content:center;padding:0;box-shadow:0 2px 8px #0000004d;transition:color .15s ease-out,background .15s ease-out,border-color .15s ease-out;animation:scroll-btn-enter .4s cubic-bezier(.34,1.56,.64,1)}@keyframes scroll-btn-enter{0%{opacity:0;transform:translate(-50%) translateY(8px)}to{opacity:1;transform:translate(-50%) translateY(0)}}.chat-scroll-bottom:hover{color:var(--text);background:var(--panel-strong);border-color:var(--border-strong, var(--border))}.chat-scroll-bottom svg{width:18px;height:18px;stroke:currentColor;fill:none;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round;animation:chevron-bounce 2s ease-in-out infinite}@keyframes chevron-bounce{0%,to{transform:translateY(0)}50%{transform:translateY(3px)}}:root[data-theme=light] .chat-scroll-bottom{background:#fff;box-shadow:0 2px 8px #0000001f}:root[data-theme=light] .chat-scroll-bottom:hover{background:#f5f5f5}.chat-focus-exit{position:absolute;top:12px;right:12px;z-index:100;width:32px;height:32px;border-radius:50%;border:1px solid var(--border);background:var(--panel);color:var(--muted);font-size:20px;line-height:1;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:background .15s ease-out,color .15s ease-out,border-color .15s ease-out;box-shadow:0 4px 12px #0003}.chat-focus-exit:hover{background:var(--panel-strong);color:var(--text);border-color:var(--accent)}.chat-focus-exit svg{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round}.chat-compose{position:sticky;bottom:0;flex-shrink:0;display:flex;flex-direction:column;gap:12px;margin-top:auto;padding:12px 4px 16px;background:linear-gradient(to bottom,transparent,var(--bg) 20%);z-index:10}.chat-attachments{display:inline-flex;flex-wrap:wrap;gap:8px;width:fit-content;max-width:100%;align-self:flex-start}.chat-attachment{position:relative;width:80px;height:80px;border-radius:6px;overflow:hidden;border:1px solid var(--border);background:var(--bg)}.chat-attachment__img{width:100%;height:100%;object-fit:contain}.chat-attachment__remove{position:absolute;top:4px;right:4px;width:20px;height:20px;border-radius:50%;border:none;background:#000000b3;color:#fff;font-size:12px;line-height:1;cursor:pointer;display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .15s ease-out}.chat-attachment:hover .chat-attachment__remove{opacity:1}.chat-attachment__remove:hover{background:#dc2626e6}.chat-attachment__remove svg{width:12px;height:12px;stroke:currentColor;fill:none;stroke-width:2px}.chat-attachment--file{width:auto;height:auto;display:inline-flex;align-items:center;gap:6px;padding:6px 10px;border-radius:8px;background:var(--panel);border:1px solid var(--border);max-width:220px}.chat-attachment__icon{flex-shrink:0;display:flex;color:var(--muted)}.chat-attachment__icon svg{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:1.5px;stroke-linecap:round;stroke-linejoin:round}.chat-attachment__name{font-size:13px;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}.chat-attachment__remove--file{position:static;opacity:.6;flex-shrink:0;width:24px;height:24px;border-radius:50%;border:none;background:#ffffff14;color:var(--muted);cursor:pointer;display:flex;align-items:center;justify-content:center;transition:opacity .15s ease-out,color .15s ease-out,background .15s ease-out}.chat-attachment__remove--file:hover{opacity:1;color:var(--danger, #dc2626);background:#dc262626}.chat-attachment__remove--file svg{width:14px;height:14px;stroke:currentColor;fill:none;stroke-width:2.5px}:root[data-theme=light] .chat-attachment{border-color:#10182826;background:#fff}:root[data-theme=light] .chat-attachment__remove{background:#0009}.chat-message-images{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:8px}.chat-message-image{max-width:300px;max-height:200px;border-radius:8px;object-fit:contain;cursor:pointer;transition:transform .15s ease-out}.chat-message-image:hover{transform:scale(1.02)}.chat-group.user .chat-message-images{justify-content:flex-end}.chat-message-files{display:flex;flex-direction:column;gap:6px;margin-bottom:8px}.chat-pdf-preview{display:flex;flex-direction:column;gap:4px;max-width:400px;cursor:pointer}.chat-pdf-preview__frame{width:100%;height:360px;border-radius:8px;border:1px solid rgba(255,255,255,.1);background:#fff;pointer-events:none}.chat-pdf-preview__link{color:var(--text-muted);text-decoration:none;font-size:.85em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chat-pdf-preview__link:hover{text-decoration:underline}:root[data-theme=light] .chat-pdf-preview__frame{border-color:#0000001a}.chat-pdf-modal-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background:#000000bf;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;padding:20px;z-index:300;animation:fade-in .15s var(--ease-out)}.chat-pdf-modal{display:flex;flex-direction:column;width:min(900px,calc(100vw - 40px));height:calc(100vh - 80px);background:var(--card);border:1px solid var(--border);border-radius:var(--radius-lg);overflow:hidden;box-shadow:var(--shadow-xl);animation:scale-in .2s var(--ease-out)}.chat-pdf-modal__header{display:flex;align-items:center;gap:12px;padding:12px 16px;border-bottom:1px solid var(--border);flex-shrink:0}.chat-pdf-modal__title{font-size:14px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1}.chat-pdf-modal__open{color:var(--text-muted);text-decoration:none;font-size:13px;white-space:nowrap;flex-shrink:0}.chat-pdf-modal__open:hover{text-decoration:underline;color:var(--text)}.chat-pdf-modal__close{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border:1px solid var(--border);border-radius:var(--radius-sm);background:transparent;color:var(--muted);cursor:pointer;transition:color .15s ease,background .15s ease;flex-shrink:0}.chat-pdf-modal__close:hover{color:var(--text);background:var(--bg-hover)}.chat-pdf-modal__close svg{width:14px;height:14px;stroke:currentColor;fill:none;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round}.chat-pdf-modal__frame{flex:1;width:100%;border:none;background:#fff}.chat-file-card{display:inline-flex;align-items:center;gap:8px;padding:8px 14px;border-radius:8px;background:#ffffff0f;border:1px solid rgba(255,255,255,.1);color:var(--text);text-decoration:none;font-size:.9em;max-width:300px;transition:background .15s ease-out}.chat-file-card:hover{background:#ffffff1a}.chat-file-card__icon{flex-shrink:0;font-size:1.2em}.chat-file-card__name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:root[data-theme=light] .chat-file-card{background:#0000000a;border-color:#0000001a}:root[data-theme=light] .chat-file-card:hover{background:#00000014}.vnp{display:flex;align-items:center;gap:10px;min-width:240px;max-width:360px;padding:8px 12px;border-radius:var(--radius-lg, 12px);background:var(--bg-elevated, #1a1d25);border:1px solid var(--border, #27272a)}.vnp__play{flex-shrink:0;display:flex;align-items:center;justify-content:center;width:36px;height:36px;border-radius:50%;border:none;background:var(--accent, #00d4ff);color:var(--primary-foreground, #111);cursor:pointer;transition:opacity var(--duration-fast, .12s) ease}.vnp__play:hover{opacity:.85}.vnp__play:active{opacity:.7}.vnp__play svg{width:16px;height:16px}.vnp__body{flex:1;min-width:0;display:flex;flex-direction:column;gap:6px}.vnp__waveform{display:flex;align-items:center;gap:2px;height:32px;cursor:pointer}.vnp__bar{flex:1;min-width:2px;max-width:5px;border-radius:1px;background:var(--muted-strong, #52525b);transition:background var(--duration-fast, .12s) ease}.vnp__bar--active{background:var(--accent, #00d4ff)}.vnp__loading{font-size:.7em;color:var(--muted, #71717a)}.vnp__meta{display:flex;align-items:center;gap:8px}.vnp__time{font-size:.75em;font-variant-numeric:tabular-nums;color:var(--muted, #71717a);min-width:2.5em}.vnp__speed{font-size:.7em;font-weight:500;padding:1px 5px;border-radius:var(--radius-sm, 6px);border:1px solid var(--border, #27272a);background:transparent;color:var(--muted, #71717a);cursor:pointer;transition:color var(--duration-fast, .12s) ease,border-color var(--duration-fast, .12s) ease}.vnp__speed:hover{color:var(--text, #e4e4e7);border-color:var(--border-strong, #3f3f46)}.vnp__name{font-size:.7em;color:var(--muted, #71717a);text-decoration:none;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin-left:auto}.vnp__name:hover{text-decoration:underline}:root[data-theme=light] .vnp{background:var(--bg-elevated, #fff);border-color:var(--border, #e4e4e7)}.chat-compose__row{display:flex;align-items:stretch;gap:12px;flex:1}:root[data-theme=light] .chat-compose{background:linear-gradient(to bottom,transparent,var(--bg-content) 20%)}.chat-compose__field{flex:1 1 auto;min-width:0;display:flex;align-items:stretch}.chat-compose__field>span{display:none}.chat-compose .chat-compose__field textarea{width:100%;height:44px;min-height:44px;max-height:150px;padding:11px 16px;border-radius:8px;resize:none;overflow-y:hidden;white-space:pre-wrap;font-family:var(--font-body);font-size:15px;line-height:1.45;outline:none}.chat-compose .chat-compose__field textarea:focus,.chat-compose .chat-compose__field textarea:focus-visible,.field.chat-compose__field textarea:focus,.field.chat-compose__field textarea:focus-visible{outline:none!important;box-shadow:none!important;border-color:var(--border)}.chat-compose__field textarea:disabled{opacity:.7;cursor:not-allowed}.chat-compose__attach{flex-shrink:0;align-self:flex-end;width:40px;height:40px;min-width:40px;border-radius:50%;display:flex;align-items:center;justify-content:center;padding:0;border:none;background:transparent;color:var(--muted);cursor:pointer;transition:color .15s ease-out}.chat-compose__attach:hover{color:var(--text)}.chat-compose__attach svg{width:20px;height:20px;stroke:currentColor;fill:none;stroke-width:1.5px;stroke-linecap:round;stroke-linejoin:round}.chat-compose__emoji{flex-shrink:0;align-self:flex-end;width:40px;height:40px;min-width:40px;border-radius:50%;display:flex;align-items:center;justify-content:center;padding:0;border:none;background:transparent;color:var(--muted);cursor:pointer;transition:color .15s ease-out}.chat-compose__emoji:hover{color:var(--text)}.chat-compose__emoji.active{color:var(--accent)}.chat-compose__emoji svg{width:22px;height:22px;stroke:currentColor;fill:none;stroke-width:1.5px;stroke-linecap:round;stroke-linejoin:round}.emoji-picker-popup{position:absolute;bottom:100%;left:0;margin-bottom:8px;z-index:50;border-radius:var(--radius-lg, 12px);overflow:hidden;box-shadow:0 4px 24px #0006;display:none}.emoji-picker-popup.active{display:block}emoji-picker{--background: var(--card);--border-color: var(--border);--indicator-color: var(--accent);--input-border-color: var(--border);--input-font-color: var(--text);--input-placeholder-color: var(--muted);--outline-color: var(--accent);--category-font-color: var(--muted);--button-active-background: var(--panel-strong);--button-hover-background: var(--panel);--num-columns: 8;height:320px}.chat-compose__send{flex-shrink:0;align-self:flex-end;width:40px;height:40px;min-width:40px;border-radius:50%;display:flex;align-items:center;justify-content:center;padding:0;border:none;cursor:pointer;transition:background .15s ease-out,opacity .15s ease-out}.chat-compose__send.primary{background:var(--accent);color:#fff}.chat-compose__send.primary:hover:not(:disabled){background:var(--accent-strong, var(--accent));opacity:.9}.chat-compose__send.primary:disabled{opacity:.4;cursor:not-allowed}.chat-compose__send:not(.primary){background:var(--panel-strong);color:var(--muted)}.chat-compose__send:not(.primary):hover{color:var(--text)}.chat-compose__send svg{width:18px;height:18px;stroke:currentColor;fill:none;stroke-width:1.5px;stroke-linecap:round;stroke-linejoin:round}.chat-compose__mic{flex-shrink:0;width:40px;height:40px;display:flex;align-items:center;justify-content:center;border-radius:50%;border:none;background:transparent;color:var(--text-secondary, rgba(255, 255, 255, .6));cursor:pointer;transition:color .15s,background .15s;padding:0;touch-action:none}.chat-compose__mic:hover:not(:disabled){color:var(--text);background:#ffffff14}.chat-compose__mic:disabled{opacity:.3;cursor:default}.chat-compose__mic svg{width:20px;height:20px;stroke:currentColor;fill:none;stroke-width:1.5px;stroke-linecap:round;stroke-linejoin:round}.chat-voice-recording{display:flex;align-items:center;gap:12px;padding:8px 12px;min-height:44px}.chat-voice-recording__indicator{flex:1;display:flex;align-items:center;gap:10px}.chat-voice-recording__dot{width:10px;height:10px;border-radius:50%;background:#ef4444;animation:voice-pulse 1s ease-in-out infinite}@keyframes voice-pulse{0%,to{opacity:1}50%{opacity:.3}}.chat-voice-recording__timer{font-variant-numeric:tabular-nums;font-size:14px;color:var(--text);min-width:36px}.chat-voice-recording__slide{font-size:13px;color:var(--text-secondary, rgba(255, 255, 255, .5));transition:color .15s}.chat-voice-recording__slide.cancelled{color:#ef4444}.chat-voice-recording__trash{flex-shrink:0;width:36px;height:36px;display:flex;align-items:center;justify-content:center;border-radius:50%;border:none;background:#ef444426;color:#ef4444;cursor:pointer;padding:0}.chat-voice-recording__trash:hover{background:#ef444440}.chat-voice-recording__trash svg{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:1.5px;stroke-linecap:round;stroke-linejoin:round}.chat-voice-recording__send{flex-shrink:0;width:36px;height:36px;display:flex;align-items:center;justify-content:center;border-radius:50%;border:none;cursor:pointer;padding:0}.chat-voice-recording__send svg{width:18px;height:18px;stroke:currentColor;fill:none;stroke-width:1.5px;stroke-linecap:round;stroke-linejoin:round}.chat-compose__actions{flex-shrink:0;display:flex;align-items:stretch;gap:8px}.chat-compose .chat-compose__actions .btn{padding:0 16px;font-size:13px;height:40px;min-height:40px;max-height:40px;line-height:1;white-space:nowrap;box-sizing:border-box}.chat-controls{display:flex;align-items:center;justify-content:flex-start;gap:12px;flex-wrap:wrap}.chat-controls__session{min-width:140px}.chat-controls__thinking{display:flex;align-items:center;gap:6px;font-size:13px}.btn--icon{padding:8px!important;min-width:36px;height:36px;display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--border);background:#ffffff0f}.chat-controls__separator{color:#fff6;font-size:18px;margin:0 8px;font-weight:300}:root[data-theme=light] .chat-controls__separator{color:#1018284d}.btn--icon:hover{background:#ffffff1f;border-color:#fff3}:root[data-theme=light] .btn--icon{background:#fff;border-color:var(--border);box-shadow:0 1px 2px #1018280d;color:var(--muted)}:root[data-theme=light] .btn--icon:hover{background:#fff;border-color:var(--border-strong);color:var(--text)}.btn--icon svg{display:block;width:18px;height:18px;stroke:currentColor;fill:none;stroke-width:1.5px;stroke-linecap:round;stroke-linejoin:round}.chat-controls__session select{padding:6px 10px;font-size:13px}.chat-controls__thinking{display:flex;align-items:center;gap:4px;font-size:12px;padding:4px 10px;background:#ffffff0a;border-radius:6px;border:1px solid var(--border)}:root[data-theme=light] .chat-controls__thinking{background:#ffffffe6;border-color:#10182826}@media(max-width:640px){.chat-session{min-width:140px}.chat-compose{grid-template-columns:1fr}.chat-controls{flex-wrap:wrap;gap:8px}.chat-controls__session{min-width:120px}}.chat-suggestions{display:flex;justify-content:center;gap:8px;padding:8px 4px 4px;flex-shrink:0;flex-wrap:wrap}.chat-suggestion-chip{display:inline-flex;align-items:center;padding:8px 16px;border-radius:20px;border:1px solid var(--border);background:var(--panel);color:var(--text);font-size:14px;line-height:1.3;cursor:pointer;max-width:45%;text-align:center;word-break:break-word;transition:background .15s ease-out,border-color .15s ease-out;animation:suggestion-enter .3s ease-out}@keyframes suggestion-enter{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}.chat-suggestion-chip:hover{background:var(--panel-strong);border-color:var(--border-strong, var(--border))}.chat-suggestion-chip:focus,.chat-suggestion-chip:focus-visible{outline:none;box-shadow:none;border-color:#fff3}:root[data-theme=light] .chat-suggestion-chip{background:#fff;border-color:var(--border);box-shadow:0 1px 3px #00000014}:root[data-theme=light] .chat-suggestion-chip:hover{background:#f5f5f5;border-color:var(--border-strong, var(--border))}:root[data-theme=light] .chat-suggestion-chip:focus,:root[data-theme=light] .chat-suggestion-chip:focus-visible{outline:none;box-shadow:none;border-color:#00000026}.chat-page-tabs{display:flex;gap:4px;padding:0 16px 8px}.chat-page-tab{padding:6px 16px;border:none;border-bottom:2px solid transparent;background:transparent;color:var(--muted);cursor:pointer;font-size:13px;font-weight:500;transition:color .15s ease-out}.chat-page-tab:hover{color:var(--text)}.chat-page-tab:focus,.chat-page-tab:focus-visible{outline:none;box-shadow:none}.chat-page-tab.active{color:var(--text);border-bottom-color:var(--text)}.wa-container{display:flex;height:100%;overflow:hidden}.wa-list{width:260px;min-width:200px;border-right:1px solid var(--border);display:flex;flex-direction:column;overflow:hidden}.wa-list__header{display:flex;gap:4px;padding:8px;border-bottom:1px solid var(--border)}.wa-list__search{flex:1;padding:6px 10px;border:1px solid var(--border);border-radius:6px;background:transparent;color:var(--text);font-size:13px}.wa-list__search:focus{outline:none;border-color:#fff3}.wa-list__refresh{padding:6px;border:1px solid var(--border);border-radius:6px;background:transparent;color:var(--muted);cursor:pointer}.wa-list__refresh:focus,.wa-list__refresh:focus-visible{outline:none;box-shadow:none}.wa-list__refresh:hover{color:var(--text)}.wa-list__items{flex:1;overflow-y:auto}.wa-list__empty{padding:24px 16px;text-align:center;color:var(--muted);font-size:13px}.wa-list__item{display:flex;align-items:center;gap:8px;width:100%;padding:10px 12px;border:none;border-bottom:1px solid var(--border);background:transparent;color:var(--text);cursor:pointer;text-align:left;font-size:13px}.wa-list__item:focus,.wa-list__item:focus-visible{outline:none;box-shadow:none}.wa-list__item:hover{background:#ffffff0a}.wa-list__item--selected{background:#ffffff14}.wa-list__icon{width:14px;height:14px;flex-shrink:0;color:var(--muted);display:flex;align-items:center}.wa-list__icon--group{color:var(--accent)}.wa-list__icon svg{width:14px;height:14px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}.wa-list__info{flex:1;min-width:0;display:flex;flex-direction:column}.wa-list__name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wa-list__jid{font-size:11px;color:var(--muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wa-badge{font-size:10px;padding:2px 6px;border-radius:8px;font-weight:500;flex-shrink:0}.wa-badge--always{background:#4caf5033;color:#81c784}.wa-badge--mention{background:#ffb74d33;color:#ffb74d}.wa-badge--off{background:#ffffff0f;color:var(--muted)}.wa-view{flex:1;display:flex;flex-direction:column;overflow:hidden;min-width:0}.wa-view__empty{display:flex;align-items:center;justify-content:center;height:100%;color:var(--muted);font-size:14px}.wa-header{display:flex;align-items:center;gap:8px;padding:10px 12px;border-bottom:1px solid var(--border)}.wa-header__back{display:none;padding:4px;border:none;background:transparent;color:var(--muted);cursor:pointer;border-radius:4px}.wa-header__back:hover{color:var(--text)}.wa-header__back:focus,.wa-header__back:focus-visible{outline:none;box-shadow:none}.wa-header__info{display:flex;flex-direction:column;min-width:0}.wa-header__name{font-size:14px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wa-header__jid{font-size:11px;color:var(--muted)}.wa-group-settings{padding:10px 16px;border-bottom:1px solid var(--border);display:flex;align-items:center;gap:16px}.wa-group-settings__row{display:flex;align-items:center;gap:8px}.wa-group-settings__label{font-size:12px;color:var(--muted)}.wa-group-settings__select{padding:4px 8px;border:1px solid var(--border);border-radius:4px;background:transparent;color:var(--text);font-size:12px}.wa-group-settings__select:focus{outline:none;border-color:#fff3}.wa-group-settings__meta{font-size:12px;color:var(--muted)}.wa-messages{flex:1;overflow-y:auto;padding:12px 16px;display:flex;flex-direction:column;gap:4px}.wa-messages__empty{display:flex;align-items:center;justify-content:center;height:100%;color:var(--muted);font-size:13px}.wa-bubble{max-width:75%;padding:6px 10px;border-radius:8px;background:#ffffff0f;font-size:13px;line-height:1.4;align-self:flex-start}.wa-bubble--me{align-self:flex-end;background:#ffffff1a}.wa-bubble__sender{font-size:11px;font-weight:600;color:var(--accent);margin-bottom:2px}.wa-bubble__quoted{font-size:11px;color:var(--muted);padding:4px 8px;border-left:2px solid var(--border);margin-bottom:4px}.wa-bubble__body{word-break:break-word;white-space:pre-wrap}.wa-bubble__time{font-size:10px;color:var(--muted);text-align:right;margin-top:2px}@media(max-width:640px){.wa-container .wa-list{width:100%;min-width:0;border-right:none}.wa-container .wa-view,.wa-container--detail .wa-list{display:none}.wa-container--detail .wa-view,.wa-header__back{display:flex}}.chat-thinking{margin-bottom:10px;padding:10px 12px;border-radius:10px;border:1px dashed rgba(255,255,255,.18);background:#ffffff0a;color:var(--muted);font-size:12px;line-height:1.4}:root[data-theme=light] .chat-thinking{border-color:#10182840;background:#1018280a}.chat-interim{padding:6px 12px;color:var(--muted);font-size:13px;font-style:italic;line-height:1.45;word-wrap:break-word;overflow-wrap:break-word}.chat-interim :where(p,ul,ol,pre,blockquote,table){margin:0}.chat-interim :where(p+p){margin-top:.5em}:root[data-theme=light] .chat-interim{color:var(--muted)}.chat-text{font-size:14px;line-height:1.5;word-wrap:break-word;overflow-wrap:break-word}.chat-text :where(p+p,p+ul,p+ol,p+pre,p+blockquote){margin-top:.75em}.chat-text :where(ul,ol){padding-left:1.5em}.chat-text :where(a){color:var(--accent);text-decoration:underline;text-underline-offset:2px}.chat-text :where(a:hover){opacity:.8}.chat-text :where(:not(pre)>code){background:#00000026;padding:.15em .4em;border-radius:4px}.chat-text :where(pre){background:#00000026;border-radius:6px;padding:10px 12px;overflow-x:auto}.chat-text :where(pre code){background:none;padding:0}.chat-text :where(blockquote){border-left:3px solid var(--border-strong);margin-left:0;color:var(--muted);background:#ffffff05;padding:8px 12px;border-radius:0 var(--radius-sm) var(--radius-sm) 0}.chat-text :where(blockquote blockquote){margin-top:8px;border-left-color:var(--border-hover);background:#ffffff08}.chat-text :where(blockquote blockquote blockquote){border-left-color:var(--muted-strong);background:#ffffff0a}:root[data-theme=light] .chat-text :where(blockquote){background:#00000008}:root[data-theme=light] .chat-text :where(blockquote blockquote){background:#0000000d}:root[data-theme=light] .chat-text :where(blockquote blockquote blockquote){background:#0000000a}:root[data-theme=light] .chat-text :where(:not(pre)>code){background:#00000014;border:1px solid rgba(0,0,0,.1)}:root[data-theme=light] .chat-text :where(pre){background:#0000000d;border:1px solid rgba(0,0,0,.1)}.chat-text :where(hr){border:none;border-top:1px solid var(--border);margin:1em 0}.chat-group{display:flex;gap:12px;align-items:flex-start;margin-bottom:16px;margin-left:44px;margin-right:44px}.chat-group.user{flex-direction:row-reverse;justify-content:flex-start}.chat-group-messages{display:flex;flex-direction:column;gap:2px;max-width:100%}.chat-group.user .chat-group-messages{align-items:flex-end;max-width:85%}.chat-group.user .chat-group-footer{justify-content:flex-end}.chat-group-footer{display:flex;gap:8px;align-items:baseline;margin-top:6px}.chat-sender-name{font-weight:500;font-size:12px;color:var(--muted)}.chat-group-timestamp{font-size:11px;color:var(--muted);opacity:.7}.chat-avatar{width:40px;height:40px;border-radius:8px;background:var(--panel-strong);display:grid;place-items:center;font-weight:600;font-size:14px;flex-shrink:0;align-self:flex-end;margin-bottom:4px}.chat-avatar.user{background:var(--accent-subtle);color:var(--accent)}.chat-avatar.assistant,.chat-avatar.other,.chat-avatar.tool{background:var(--secondary);color:var(--muted)}img.chat-avatar{display:block;object-fit:cover;object-position:center}.chat-bubble{position:relative;display:inline-block;border:1px solid transparent;background:var(--card);border-radius:var(--radius-lg);padding:10px 14px;box-shadow:none;transition:background .15s ease-out,border-color .15s ease-out;max-width:100%;word-wrap:break-word}.chat-copy-btn{position:absolute;top:6px;border:1px solid var(--border);background:var(--bg);color:var(--muted);border-radius:var(--radius-md);padding:4px 6px;font-size:14px;line-height:1;cursor:pointer;opacity:.5;transition:opacity .12s ease-out,background .12s ease-out}.chat-group.assistant .chat-copy-btn,.chat-group.other .chat-copy-btn{left:-40px}.chat-group.user .chat-copy-btn{right:-40px}.chat-copy-btn__icon{display:inline-flex;width:14px;height:14px;position:relative}.chat-copy-btn__icon svg{width:14px;height:14px;stroke:currentColor;fill:none;stroke-width:1.5px;stroke-linecap:round;stroke-linejoin:round}.chat-copy-btn__icon-copy,.chat-copy-btn__icon-check{position:absolute;top:0;left:0;transition:opacity .15s ease}.chat-copy-btn__icon-check,.chat-copy-btn[data-copied="1"] .chat-copy-btn__icon-copy{opacity:0}.chat-copy-btn[data-copied="1"] .chat-copy-btn__icon-check{opacity:1}.chat-copy-btn:hover{opacity:1;background:var(--bg-hover)}.chat-copy-btn[data-copying="1"]{opacity:.3;pointer-events:none}.chat-copy-btn[data-error="1"]{opacity:1;pointer-events:auto;border-color:var(--danger-subtle);background:var(--danger-subtle);color:var(--danger)}.chat-copy-btn[data-copied="1"]{opacity:1;pointer-events:auto;border-color:var(--ok-subtle);background:var(--ok-subtle);color:var(--ok)}.chat-copy-btn:focus-visible{opacity:1;pointer-events:auto;outline:2px solid var(--accent);outline-offset:2px}.chat-group.assistant .chat-bubble,.chat-group.other .chat-bubble{display:block;background:transparent;border-color:transparent;padding:4px 0;box-shadow:none}.chat-group.assistant .chat-bubble:hover,.chat-group.other .chat-bubble:hover{background:transparent}:root[data-theme=light] .chat-group.assistant .chat-bubble,:root[data-theme=light] .chat-group.other .chat-bubble{background:transparent;border-color:transparent;box-shadow:none}.chat-group.user .chat-bubble{background:var(--accent-subtle);border-color:transparent}:root[data-theme=light] .chat-group.user .chat-bubble{border-color:#ea580c33;background:#fb923c1f}.chat-bubble.streaming{border-left:2px solid var(--accent);padding-left:12px;animation:pulsing-accent 1.5s ease-out infinite}@keyframes pulsing-accent{0%,to{border-left-color:var(--accent);opacity:1}50%{border-left-color:var(--accent);opacity:.4}}.chat-bubble.fade-in{animation:fade-in .2s ease-out}@keyframes fade-in{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.chat-tool-card{border:1px solid var(--border);border-radius:8px;padding:12px;margin-top:8px;background:var(--card);box-shadow:inset 0 1px 0 var(--card-highlight);transition:border-color .15s ease-out,background .15s ease-out;max-height:120px;overflow:hidden}.chat-tool-card:hover{border-color:var(--border-strong);background:var(--bg-hover)}.chat-tool-card:first-child{margin-top:0}.chat-tool-card--clickable{cursor:pointer}.chat-tool-card--clickable:focus{outline:2px solid var(--accent);outline-offset:2px}.chat-tool-card__header{display:flex;justify-content:space-between;align-items:center;gap:8px}.chat-tool-card__title{display:inline-flex;align-items:center;gap:6px;font-weight:600;font-size:13px;line-height:1.2}.chat-tool-card__icon{display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;flex-shrink:0}.chat-tool-card__icon svg{width:14px;height:14px;stroke:currentColor;fill:none;stroke-width:1.5px;stroke-linecap:round;stroke-linejoin:round}.chat-tool-card__action{display:inline-flex;align-items:center;gap:4px;font-size:12px;color:var(--accent);opacity:.8;transition:opacity .15s ease-out}.chat-tool-card__action svg{width:12px;height:12px;stroke:currentColor;fill:none;stroke-width:1.5px;stroke-linecap:round;stroke-linejoin:round}.chat-tool-card--clickable:hover .chat-tool-card__action{opacity:1}.chat-tool-card__status{display:inline-flex;align-items:center;color:var(--ok)}.chat-tool-card__status svg{width:14px;height:14px;stroke:currentColor;fill:none;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round}.chat-tool-card__status-text{font-size:11px;margin-top:4px}.chat-tool-card__detail{font-size:12px;color:var(--muted);margin-top:4px}.chat-tool-card__preview{font-size:11px;color:var(--muted);margin-top:8px;padding:8px 10px;background:var(--secondary);border-radius:var(--radius-md);white-space:pre-wrap;overflow:hidden;max-height:44px;line-height:1.4;border:1px solid var(--border)}.chat-tool-card--clickable:hover .chat-tool-card__preview{background:var(--bg-hover);border-color:var(--border-strong)}.chat-tool-card__inline{font-size:11px;color:var(--text);margin-top:6px;padding:6px 8px;background:var(--secondary);border-radius:var(--radius-sm);white-space:pre-wrap;word-break:break-word}.chat-reading-indicator{background:transparent;border:1px solid var(--border);padding:12px;display:inline-flex}.chat-reading-indicator__dots{display:flex;gap:6px;align-items:center}.chat-reading-indicator__dots span{width:6px;height:6px;border-radius:50%;background:var(--muted);animation:reading-pulse 1.4s ease-in-out infinite}.chat-reading-indicator__dots span:nth-child(1){animation-delay:0s}.chat-reading-indicator__dots span:nth-child(2){animation-delay:.2s}.chat-reading-indicator__dots span:nth-child(3){animation-delay:.4s}@keyframes reading-pulse{0%,60%,to{opacity:.3;transform:scale(.8)}30%{opacity:1;transform:scale(1)}}.chat-split-container{display:flex;gap:0;flex:1;min-height:0;height:100%}.chat-main{position:relative;min-width:400px;display:flex;flex-direction:column;overflow:hidden;transition:flex .25s ease-out}.chat-sidebar{flex:1;min-width:300px;border-left:1px solid var(--border);display:flex;flex-direction:column;overflow:hidden;animation:slide-in .2s ease-out}@keyframes slide-in{0%{opacity:0;transform:translate(20px)}to{opacity:1;transform:translate(0)}}.sidebar-panel{display:flex;flex-direction:column;height:100%;background:var(--panel)}.sidebar-header{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;border-bottom:1px solid var(--border);flex-shrink:0;position:sticky;top:0;z-index:10;background:var(--panel)}.sidebar-header .btn{padding:4px 8px;font-size:14px;min-width:auto;line-height:1}.sidebar-title{font-weight:600;font-size:14px}.sidebar-content{flex:1;overflow:auto;padding:16px}.sidebar-markdown{font-size:14px;line-height:1.5}.sidebar-markdown pre{background:#0000001f;border-radius:4px;padding:12px;overflow-x:auto}.sidebar-markdown code{font-family:var(--mono);font-size:13px}@media(max-width:768px){.chat-split-container--open{position:fixed;top:0;left:0;right:0;bottom:0;z-index:1000}.chat-split-container--open .chat-main{display:none}.chat-split-container--open .chat-sidebar{width:100%;min-width:0;border-left:none}}.card{border:1px solid var(--border);background:var(--card);border-radius:var(--radius-lg);padding:20px;animation:rise .35s var(--ease-out) backwards;transition:border-color var(--duration-normal) var(--ease-out),box-shadow var(--duration-normal) var(--ease-out),transform var(--duration-normal) var(--ease-out);box-shadow:var(--shadow-sm),inset 0 1px 0 var(--card-highlight)}.card:hover{border-color:var(--border-strong);box-shadow:var(--shadow-md),inset 0 1px 0 var(--card-highlight)}.card-title{font-size:15px;font-weight:600;letter-spacing:-.02em;color:var(--text-strong)}.card-sub{color:var(--muted);font-size:13px;margin-top:6px;line-height:1.5}.stat{background:var(--card);border-radius:var(--radius-md);padding:14px 16px;border:1px solid var(--border);transition:border-color var(--duration-normal) var(--ease-out),box-shadow var(--duration-normal) var(--ease-out);box-shadow:inset 0 1px 0 var(--card-highlight)}.stat:hover{border-color:var(--border-strong);box-shadow:var(--shadow-sm),inset 0 1px 0 var(--card-highlight)}.stat-label{color:var(--muted);font-size:11px;font-weight:500;text-transform:uppercase;letter-spacing:.04em}.stat-value{font-size:24px;font-weight:700;margin-top:6px;letter-spacing:-.03em;line-height:1.1}.stat-value.ok{color:var(--ok)}.stat-value.warn{color:var(--warn)}.stat-card{display:grid;gap:6px}.note-title{font-weight:600;letter-spacing:-.01em}.status-list{display:grid;gap:8px}.status-list div{display:flex;justify-content:space-between;gap:12px;padding:8px 0;border-bottom:1px solid var(--border)}.status-list div:last-child{border-bottom:none}.account-count{margin-top:10px;font-size:12px;font-weight:500;color:var(--muted)}.account-card-list{margin-top:16px;display:grid;gap:12px}.account-card{border:1px solid var(--border);border-radius:var(--radius-md);padding:12px;background:var(--bg-elevated);transition:border-color var(--duration-fast) ease}.account-card:hover{border-color:var(--border-strong)}.account-card-header{display:flex;justify-content:space-between;align-items:baseline;gap:12px}.account-card-title{font-weight:500}.account-card-id{font-family:var(--mono);font-size:12px;color:var(--muted)}.account-card-status{margin-top:10px;font-size:13px}.account-card-status div{padding:4px 0}.account-card-error{margin-top:8px;color:var(--danger);font-size:12px}.badge{display:inline-block;padding:2px 8px;border-radius:10px;font-size:11px;font-weight:500;line-height:1.4}.badge-baileys{background:#25d36626;color:#25d366}.badge-cloud{background:#007aff26;color:#007aff}.label{color:var(--muted);font-size:12px;font-weight:500}.pill{display:inline-flex;align-items:center;gap:6px;border:1px solid var(--border);padding:6px 12px;border-radius:var(--radius-full);background:var(--secondary);font-size:13px;font-weight:500;transition:border-color var(--duration-fast) ease}.pill:hover{border-color:var(--border-strong)}.pill.danger{border-color:var(--danger-subtle);background:var(--danger-subtle);color:var(--danger)}.theme-toggle{--theme-item: 28px;--theme-gap: 2px;--theme-pad: 4px;position:relative}.theme-toggle__track{position:relative;display:grid;grid-template-columns:repeat(3,var(--theme-item));gap:var(--theme-gap);padding:var(--theme-pad);border-radius:var(--radius-full);border:1px solid var(--border);background:var(--secondary)}.theme-toggle__indicator{position:absolute;top:50%;left:var(--theme-pad);width:var(--theme-item);height:var(--theme-item);border-radius:var(--radius-full);transform:translateY(-50%) translate(calc(var(--theme-index, 0) * (var(--theme-item) + var(--theme-gap))));background:var(--accent);transition:transform var(--duration-normal) var(--ease-out);z-index:0}.theme-toggle__button{height:var(--theme-item);width:var(--theme-item);display:grid;place-items:center;border:0;border-radius:var(--radius-full);background:transparent;color:var(--muted);cursor:pointer;position:relative;z-index:1;transition:color var(--duration-fast) ease}.theme-toggle__button:hover{color:var(--text)}.theme-toggle__button.active{color:var(--accent-foreground)}.theme-toggle__button.active .theme-icon{stroke:var(--accent-foreground)}.theme-icon{width:14px;height:14px;stroke:currentColor;fill:none;stroke-width:1.5px;stroke-linecap:round;stroke-linejoin:round}.statusDot{width:8px;height:8px;border-radius:var(--radius-full);background:var(--danger);box-shadow:0 0 8px #ef444480;animation:pulse-subtle 2s ease-in-out infinite}.statusDot.ok{background:var(--ok);box-shadow:0 0 8px #22c55e80;animation:none}.btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;border:1px solid var(--border);background:var(--bg-elevated);padding:9px 16px;border-radius:var(--radius-md);font-size:13px;font-weight:500;letter-spacing:-.01em;cursor:pointer;transition:border-color var(--duration-fast) var(--ease-out),background var(--duration-fast) var(--ease-out),box-shadow var(--duration-fast) var(--ease-out),transform var(--duration-fast) var(--ease-out)}.btn:hover{background:var(--bg-hover);border-color:var(--border-strong);transform:translateY(-1px);box-shadow:var(--shadow-sm)}.btn:active{background:var(--secondary);transform:translateY(0);box-shadow:none}.btn svg{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:1.5px;stroke-linecap:round;stroke-linejoin:round;flex-shrink:0}.btn.primary{border-color:var(--accent);background:var(--accent);color:var(--primary-foreground);box-shadow:0 1px 2px #0003}.btn.primary:hover{background:var(--accent-hover);border-color:var(--accent-hover);box-shadow:var(--shadow-md),0 0 20px var(--accent-glow)}.btn-kbd{display:inline-flex;align-items:center;justify-content:center;margin-left:6px;padding:2px 5px;font-family:var(--mono);font-size:11px;font-weight:500;line-height:1;border-radius:4px;background:#ffffff26;color:inherit;opacity:.8}.btn.primary .btn-kbd{background:#fff3}:root[data-theme=light] .btn-kbd{background:#00000014}:root[data-theme=light] .btn.primary .btn-kbd{background:#ffffff40}.btn.active{border-color:var(--accent);background:var(--accent-subtle);color:var(--accent)}.btn.danger{border-color:transparent;background:var(--danger-subtle);color:var(--danger)}.btn.danger:hover{background:#ef444426}.btn--sm{padding:6px 10px;font-size:12px}.btn:disabled{opacity:.5;cursor:not-allowed}.field{display:grid;gap:6px}.field.full{grid-column:1 / -1}.field span{color:var(--muted);font-size:13px;font-weight:500}.field input,.field textarea,.field select{border:1px solid var(--input);background:var(--card);border-radius:var(--radius-md);padding:8px 12px;outline:none;box-shadow:inset 0 1px 0 var(--card-highlight);transition:border-color var(--duration-fast) ease,box-shadow var(--duration-fast) ease}.field input:focus,.field textarea:focus,.field select:focus{border-color:var(--ring);box-shadow:var(--focus-ring)}.field select{-webkit-appearance:none;-moz-appearance:none;appearance:none;padding-right:36px;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23a1a1aa' stroke-width='2'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 10px center;cursor:pointer}.field textarea{font-family:var(--mono);min-height:160px;resize:vertical;white-space:pre;line-height:1.5}.field.checkbox{grid-template-columns:auto 1fr;align-items:center}.field.checkbox input[type=checkbox]{border:none;background:none;box-shadow:none;padding:0;margin:0;width:16px;height:16px;accent-color:var(--accent)}.config-form .field.checkbox{grid-template-columns:18px minmax(0,1fr);column-gap:10px}.config-form .field.checkbox input[type=checkbox]{margin:0;width:16px;height:16px;accent-color:var(--accent)}.form-grid{display:grid;gap:12px;grid-template-columns:repeat(auto-fit,minmax(200px,1fr))}:root[data-theme=light] .field input,:root[data-theme=light] .field textarea,:root[data-theme=light] .field select{background:var(--card);border-color:var(--input)}:root[data-theme=light] .btn{background:var(--bg);border-color:var(--input)}:root[data-theme=light] .btn:hover{background:var(--bg-hover)}:root[data-theme=light] .btn.primary{background:var(--accent);border-color:var(--accent)}.muted{color:var(--muted)}.mono{font-family:var(--mono)}.callout{padding:14px 16px;border-radius:var(--radius-md);background:var(--secondary);border:1px solid var(--border);font-size:13px;line-height:1.5;position:relative}.callout.danger{border-color:#ef444440;background:linear-gradient(135deg,#ef444414,#ef44440a);color:var(--danger)}.callout.info{border-color:#3b82f640;background:linear-gradient(135deg,#3b82f614,#3b82f60a);color:var(--info)}.callout.success{border-color:#22c55e40;background:linear-gradient(135deg,#22c55e14,#22c55e0a);color:var(--ok)}.compaction-indicator{font-size:13px;padding:10px 12px;margin-bottom:8px;animation:fade-in .2s var(--ease-out)}.compaction-indicator--active{animation:compaction-pulse 1.5s ease-in-out infinite}.compaction-indicator--complete{animation:fade-in .2s var(--ease-out)}@keyframes compaction-pulse{0%,to{opacity:.7}50%{opacity:1}}.code-block{font-family:var(--mono);font-size:13px;line-height:1.5;background:var(--secondary);padding:12px;border-radius:var(--radius-md);border:1px solid var(--border);max-height:360px;overflow:auto;max-width:100%}:root[data-theme=light] .code-block,:root[data-theme=light] .list-item,:root[data-theme=light] .table-row,:root[data-theme=light] .chip{background:var(--bg)}.list{display:grid;gap:8px;container-type:inline-size}.list-item{display:grid;grid-template-columns:minmax(0,1fr) minmax(200px,260px);gap:16px;align-items:start;border:1px solid var(--border);border-radius:var(--radius-md);padding:12px;background:var(--card);transition:border-color var(--duration-fast) ease}.list-item-clickable{cursor:pointer}.list-item-clickable:hover{border-color:var(--border-strong)}.list-item-selected{border-color:var(--accent);box-shadow:var(--focus-ring)}.list-main{display:grid;gap:4px;min-width:0}.list-title{font-weight:500}.list-sub{color:var(--muted);font-size:12px}.list-meta{text-align:right;color:var(--muted);font-size:12px;display:grid;gap:4px;min-width:200px}.list-meta .btn{padding:6px 10px}.list-meta .field input,.list-meta .field textarea,.list-meta .field select{width:100%}@container (max-width: 560px){.list-item{grid-template-columns:1fr}.list-meta{min-width:0;text-align:left}}.chip-row{display:flex;flex-wrap:wrap;gap:8px}.chip{font-size:12px;font-weight:500;border:1px solid var(--border);border-radius:var(--radius-full);padding:5px 12px;color:var(--muted);background:var(--secondary);transition:border-color var(--duration-fast) var(--ease-out),background var(--duration-fast) var(--ease-out),transform var(--duration-fast) var(--ease-out)}.chip:hover{border-color:var(--border-strong);transform:translateY(-1px)}.chip input{margin-right:6px}.chip-ok{color:var(--ok);border-color:#22c55e4d;background:var(--ok-subtle)}.chip-warn{color:var(--warn);border-color:#f59e0b4d;background:var(--warn-subtle)}.chips-toggle{display:inline-flex;align-items:center;gap:4px;margin-top:10px;padding:0;background:none;border:none;font-size:12px;font-weight:500;color:var(--muted);cursor:pointer}.chips-toggle:hover{color:var(--foreground)}.chips-toggle-icon{display:inline-flex;width:14px;height:14px;transform:rotate(-90deg);transition:transform var(--duration-fast) var(--ease-out)}.chips-toggle-icon svg{stroke:currentColor;fill:none;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round}.chips-toggle-icon.expanded{transform:rotate(0)}.table{display:grid;gap:6px}.table-head,.table-row{display:grid;grid-template-columns:1.4fr 1fr .8fr .7fr .8fr .8fr .8fr .8fr .6fr;gap:12px;align-items:center}.table-head{font-size:12px;font-weight:500;color:var(--muted);padding:0 12px}.table-row{border:1px solid var(--border);padding:10px 12px;border-radius:var(--radius-md);background:var(--card);transition:border-color var(--duration-fast) ease}.table-row:hover{border-color:var(--border-strong)}.session-link{text-decoration:none;color:var(--accent);font-weight:500}.session-link:hover{text-decoration:underline}.logs-toolbar{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.logs-filter-input{flex:1;min-width:120px;font-size:13px}@media(min-width:768px){.logs-toolbar{flex-wrap:nowrap}}.logs-date-nav{display:flex;align-items:center;gap:8px;margin-top:10px}.logs-date-nav svg{width:14px;height:14px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;vertical-align:middle}.logs-date-label{font-family:var(--font-mono, monospace);font-size:13px;min-width:90px;text-align:center}.log-stream{border:1px solid var(--border);border-radius:var(--radius-md);background:var(--card);max-height:500px;overflow:auto;container-type:inline-size}.log-row{display:flex;flex-direction:column;gap:4px;padding:8px 12px;border-bottom:1px solid var(--border);font-size:12px;transition:background var(--duration-fast) ease}.log-row:hover{background:var(--bg-hover)}.log-row:last-child{border-bottom:none}.log-row-header{display:flex;align-items:center;gap:8px}.log-time{color:var(--muted);font-family:var(--mono)}.log-level{font-size:11px;font-weight:500;border:1px solid var(--border);border-radius:var(--radius-sm);padding:2px 6px;width:fit-content}.log-level.trace,.log-level.debug{color:var(--muted)}.log-level.info{color:var(--info);border-color:#3b82f64d}.log-level.warn{color:var(--warn);border-color:var(--warn-subtle)}.log-level.error,.log-level.fatal{color:var(--danger);border-color:var(--danger-subtle)}.log-chip.trace,.log-chip.debug{color:var(--muted)}.log-chip.info{color:var(--info);border-color:#3b82f64d}.log-chip.warn{color:var(--warn);border-color:var(--warn-subtle)}.log-chip.error,.log-chip.fatal{color:var(--danger);border-color:var(--danger-subtle)}.log-subsystem{color:var(--muted);font-family:var(--mono)}.log-message{white-space:pre-wrap;word-break:break-word;font-family:var(--mono)}@container (max-width: 620px){.log-subsystem{display:none}.log-row-header{flex-wrap:wrap}}.session-log-type{font-size:11px;font-weight:500;border:1px solid var(--border);border-radius:var(--radius-sm);padding:2px 6px;width:fit-content}.session-log-type.user{color:var(--success);border-color:var(--success-subtle)}.session-log-type.assistant{color:var(--info);border-color:#3b82f64d}.session-log-type.tool,.session-log-type.tool_call{color:var(--warn);border-color:var(--warn-subtle)}.session-log-type.tool_result{color:#8b8bcd;border-color:#8b8bcd4d}.session-log-type.thinking{color:var(--muted);border-color:var(--border)}.session-log-type.error{color:var(--danger);border-color:var(--danger-subtle)}.session-log-type.system{color:var(--muted);border-color:var(--border)}.session-log-chip.user{color:var(--success);border-color:var(--success-subtle)}.session-log-chip.assistant{color:var(--info);border-color:#3b82f64d}.session-log-chip.tool,.session-log-chip.tool_call{color:var(--warn);border-color:var(--warn-subtle)}.session-log-chip.tool_result{color:#8b8bcd;border-color:#8b8bcd4d}.session-log-chip.thinking{color:var(--muted)}.session-log-chip.error{color:var(--danger);border-color:var(--danger-subtle)}.session-label{color:var(--muted);font-family:var(--mono)}.session-tool,.session-model,.session-call-id{color:var(--muted);font-family:var(--mono);font-size:11px}.session-call-id{opacity:.6}.log-expand-btn{background:none;border:1px solid var(--border);border-radius:var(--radius-sm);color:var(--muted);font-size:11px;padding:2px 8px;cursor:pointer;align-self:flex-start;margin-top:2px}.log-expand-btn:hover{color:var(--text);border-color:var(--text-muted)}.session-entry.tool_result{border-left:2px solid rgba(139,139,205,.3)}.session-entry.tool_call{border-left:2px solid var(--warn-subtle)}.chat{display:flex;flex-direction:column;min-height:0}.shell--chat .chat{flex:1}.chat-header{display:flex;justify-content:space-between;align-items:flex-end;gap:16px;flex-wrap:wrap}.chat-header__left{display:flex;align-items:flex-end;gap:12px;flex-wrap:wrap;min-width:0}.chat-header__right{display:flex;align-items:center;gap:8px}.chat-session{min-width:240px}.chat-thread{margin-top:16px;display:flex;flex-direction:column;gap:12px;flex:1;min-height:0;overflow-y:auto;overflow-x:hidden;padding:16px 12px;min-width:0;border-radius:0;border:none;background:transparent}.chat-queue{margin-top:12px;padding:12px;border-radius:var(--radius-lg);border:1px solid var(--border);background:var(--card);display:grid;gap:8px}.chat-queue__title{font-family:var(--mono);font-size:12px;font-weight:500;color:var(--muted)}.chat-queue__list{display:grid;gap:8px}.chat-queue__item{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:start;gap:12px;padding:10px 12px;border-radius:var(--radius-md);border:1px dashed var(--border-strong);background:var(--secondary)}.chat-queue__text{color:var(--chat-text);font-size:13px;line-height:1.45;white-space:pre-wrap;overflow:hidden;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical}.chat-queue__remove{align-self:start;padding:4px 10px;font-size:12px;line-height:1}.chat-line{display:flex}.chat-line.user{justify-content:flex-end}.chat-line.assistant,.chat-line.other{justify-content:flex-start}.chat-msg{display:grid;gap:6px;max-width:min(700px,82%)}.chat-line.user .chat-msg{justify-items:end}.chat-bubble{border:1px solid transparent;background:var(--card);border-radius:var(--radius-lg);padding:10px 14px;min-width:0}:root[data-theme=light] .chat-bubble{border-color:var(--border);background:var(--bg)}.chat-line.user .chat-bubble{border-color:transparent;background:var(--accent-subtle)}:root[data-theme=light] .chat-line.user .chat-bubble{border-color:#ea580c33;background:#fb923c1f}.chat-line.assistant .chat-bubble{border-color:transparent;background:linear-gradient(var(--brand-bg-card, transparent),var(--brand-bg-card, transparent)),var(--secondary)}:root[data-theme=light] .chat-line.assistant .chat-bubble{border-color:var(--border);background:var(--bg-muted)}@keyframes chatStreamPulse{0%,to{border-color:var(--border)}50%{border-color:var(--accent)}}.chat-bubble.streaming{animation:chatStreamPulse 1.5s ease-in-out infinite}@media(prefers-reduced-motion:reduce){.chat-bubble.streaming{animation:none;border-color:var(--accent)}}.chat-bubble.chat-reading-indicator{width:fit-content;padding:10px 16px}.chat-reading-indicator__dots{display:inline-flex;align-items:center;gap:4px;height:12px}.chat-reading-indicator__dots>span{display:inline-block;width:6px;height:6px;border-radius:var(--radius-full);background:var(--muted);opacity:.6;transform:translateY(0);animation:chatReadingDot 1.2s ease-in-out infinite;will-change:transform,opacity}.chat-reading-indicator__dots>span:nth-child(2){animation-delay:.15s}.chat-reading-indicator__dots>span:nth-child(3){animation-delay:.3s}@keyframes chatReadingDot{0%,80%,to{opacity:.4;transform:translateY(0)}40%{opacity:1;transform:translateY(-3px)}}@media(prefers-reduced-motion:reduce){.chat-reading-indicator__dots>span{animation:none;opacity:.6}}.chat-text{overflow-wrap:anywhere;word-break:break-word;color:var(--chat-text);line-height:1.5}.chat-text :where(p,ul,ol,pre,blockquote,table){margin:0}.chat-text :where(p+p,p+ul,p+ol,p+pre,p+blockquote,p+table){margin-top:.75em}.chat-text :where(ul,ol){padding-left:1.2em}.chat-text :where(li+li){margin-top:.25em}.chat-text :where(a){color:var(--accent)}.chat-text :where(a:hover){text-decoration:underline}.chat-text :where(blockquote){border-left:2px solid var(--border-strong);padding-left:12px;color:var(--muted)}.chat-text :where(hr){border:0;border-top:1px solid var(--border);margin:1em 0}.chat-text :where(code){font-family:var(--mono);font-size:.9em}.chat-text :where(:not(pre)>code){padding:.15em .35em;border-radius:var(--radius-sm);border:1px solid var(--border);background:var(--secondary)}:root[data-theme=light] .chat-text :where(:not(pre)>code){background:var(--bg-muted)}.chat-text :where(pre){margin-top:.75em;padding:10px 12px;border-radius:var(--radius-md);border:1px solid var(--border);background:var(--secondary);overflow:auto}:root[data-theme=light] .chat-text :where(pre){background:var(--bg-muted)}.chat-text :where(pre code){font-size:12px;white-space:pre}.chat-text :where(table){margin-top:.75em;border-collapse:collapse;width:100%;font-size:13px}.chat-text :where(th,td){border:1px solid var(--border);padding:6px 10px;vertical-align:top}.chat-text :where(th){font-family:var(--mono);font-weight:500;color:var(--muted);background:var(--secondary)}.chat-tool-card{margin-top:8px;padding:10px 12px;border-radius:var(--radius-md);border:1px solid var(--border);background:var(--secondary);display:grid;gap:4px}:root[data-theme=light] .chat-tool-card{background:var(--bg-muted)}.chat-tool-card__title{font-family:var(--mono);font-size:12px;font-weight:500;color:var(--text)}.chat-tool-card__detail{font-family:var(--mono);font-size:11px;color:var(--muted)}.chat-tool-card__details{margin-top:6px}.chat-tool-card__summary{font-family:var(--mono);font-size:11px;color:var(--muted);cursor:pointer;list-style:none;display:inline-flex;align-items:center;gap:6px}.chat-tool-card__summary::-webkit-details-marker{display:none}.chat-tool-card__summary-meta{color:var(--muted);opacity:.7}.chat-tool-card__details[open] .chat-tool-card__summary{color:var(--text)}.chat-tool-card__output{margin-top:8px;font-family:var(--mono);font-size:11px;line-height:1.5;white-space:pre-wrap;color:var(--chat-text);padding:8px 10px;border-radius:var(--radius-md);border:1px solid var(--border);background:var(--card)}:root[data-theme=light] .chat-tool-card__output{background:var(--bg)}.chat-stamp{font-size:11px;color:var(--muted)}.chat-line.user .chat-stamp{text-align:right}.chat-compose{margin-top:12px;display:flex;flex-direction:column;gap:10px}.shell--chat .chat-compose{position:sticky;bottom:0;z-index:5;margin-top:0;padding-top:12px;background:linear-gradient(180deg,transparent 0%,var(--bg) 40%)}.shell--chat-focus .chat-compose{bottom:calc(var(--shell-pad) + 8px);padding-bottom:calc(12px + env(safe-area-inset-bottom,0px));border-bottom-left-radius:var(--radius-lg);border-bottom-right-radius:var(--radius-lg)}.chat-compose__field{gap:4px}.chat-compose__field textarea{min-height:72px;padding:10px 14px;border-radius:var(--radius-lg);resize:vertical;white-space:pre-wrap;font-family:var(--font-body);line-height:1.5;border:1px solid var(--input);background:var(--card);box-shadow:inset 0 1px 0 var(--card-highlight);transition:border-color var(--duration-fast) ease,box-shadow var(--duration-fast) ease}.chat-compose__field textarea:focus{border-color:var(--ring);box-shadow:var(--focus-ring)}.chat-compose__field textarea:disabled{opacity:.5;cursor:not-allowed}.chat-compose__actions{justify-content:flex-end;align-self:end}@media(max-width:900px){.chat-session{min-width:180px}.chat-compose{grid-template-columns:1fr}}.qr-wrap{margin-top:16px;border-radius:var(--radius-md);background:var(--card);border:1px dashed var(--border-strong);padding:16px;display:inline-flex}.qr-wrap img{width:160px;height:160px;border-radius:var(--radius-sm);image-rendering:pixelated}.exec-approval-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background:#000c;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;padding:24px;z-index:200}.exec-approval-card{width:min(540px,100%);background:var(--card);border:1px solid var(--border);border-radius:var(--radius-lg);padding:20px;animation:scale-in .2s var(--ease-out)}.exec-approval-header{display:flex;align-items:center;justify-content:space-between;gap:16px}.exec-approval-title{font-size:14px;font-weight:600}.exec-approval-sub{color:var(--muted);font-size:13px;margin-top:4px}.exec-approval-queue{font-size:11px;font-weight:500;color:var(--muted);border:1px solid var(--border);border-radius:var(--radius-full);padding:4px 10px}.exec-approval-command{margin-top:12px;padding:10px 12px;background:var(--secondary);border:1px solid var(--border);border-radius:var(--radius-md);word-break:break-word;white-space:pre-wrap;font-family:var(--mono);font-size:13px}.exec-approval-meta{margin-top:12px;display:grid;gap:6px;font-size:13px;color:var(--muted)}.exec-approval-meta-row{display:flex;justify-content:space-between;gap:12px}.exec-approval-meta-row span:last-child{color:var(--text);font-family:var(--mono)}.exec-approval-error{margin-top:10px;font-size:13px;color:var(--danger)}.exec-approval-actions{margin-top:16px;display:flex;flex-wrap:wrap;gap:8px}.event-status-bar{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;margin-bottom:20px}.event-status-bar__info{display:flex;align-items:center;gap:10px;font-size:13px;color:var(--muted);flex-wrap:wrap}.event-status-bar__info .statusDot{flex-shrink:0}.event-status-bar__sep{color:var(--border-strong);-webkit-user-select:none;user-select:none}.event-grid{display:grid;gap:12px;grid-template-columns:repeat(2,1fr)}@media(max-width:600px){.event-grid{grid-template-columns:1fr}}.event-card{border:1px solid var(--border);background:var(--card);border-radius:var(--radius-md);padding:14px;cursor:pointer;transition:border-color var(--duration-fast) ease,box-shadow var(--duration-fast) ease,transform var(--duration-fast) ease;box-shadow:var(--shadow-sm),inset 0 1px 0 var(--card-highlight);display:flex;flex-direction:column;gap:8px}.event-card:hover{border-color:var(--border-strong);box-shadow:var(--shadow-md),inset 0 1px 0 var(--card-highlight);transform:translateY(-1px)}.event-card.disabled{opacity:.6}.event-card__header{display:flex;align-items:baseline;justify-content:space-between;gap:8px}.event-card__name{font-weight:500;font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}.event-card__schedule{color:var(--muted);font-size:12px;line-height:1.4}.event-card__agent{color:var(--muted);font-size:11px;font-family:var(--mono)}.event-card__footer{display:flex;align-items:center;justify-content:space-between;gap:6px;margin-top:auto}.event-card__status{display:flex;align-items:center;gap:6px}.event-card__actions{display:flex;align-items:center;gap:4px}.event-card__actions .btn-icon{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border:1px solid transparent;border-radius:var(--radius-sm);background:transparent;color:var(--muted);cursor:pointer;transition:color var(--duration-fast) ease,background var(--duration-fast) ease,border-color var(--duration-fast) ease}.event-card__actions .btn-icon:hover{color:var(--text);background:var(--bg-hover);border-color:var(--border)}.event-card__actions .btn-icon.danger:hover{color:var(--danger);background:var(--danger-subtle);border-color:var(--danger-subtle)}.event-card__actions .btn-icon svg{width:14px;height:14px;stroke:currentColor;fill:none;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round}.event-modal-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background:#000000b3;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;padding:20px;z-index:200;animation:fade-in .15s var(--ease-out)}.event-modal-overlay *:focus,.event-modal-overlay *:focus-visible{outline:none!important;box-shadow:none}.event-modal{width:min(560px,100%);max-height:calc(100vh - 40px);overflow-y:auto;background:var(--card);border:1px solid var(--border);border-radius:var(--radius-lg);padding:24px;box-shadow:var(--shadow-xl);animation:scale-in .2s var(--ease-out)}.event-modal__header{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:20px}.event-modal__title{font-size:16px;font-weight:600;letter-spacing:-.02em}.event-modal__close{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border:1px solid var(--border);border-radius:var(--radius-sm);background:transparent;color:var(--muted);cursor:pointer;transition:color var(--duration-fast) ease,background var(--duration-fast) ease;flex-shrink:0}.event-modal__close:hover{color:var(--text);background:var(--bg-hover)}.event-modal__close svg{width:14px;height:14px;stroke:currentColor;fill:none;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round}.event-detail-section{margin-top:16px;padding-top:16px;border-top:1px solid var(--border)}.event-detail-section:first-of-type{margin-top:0;padding-top:0;border-top:none}.event-detail-row{display:flex;justify-content:space-between;align-items:baseline;gap:12px;padding:6px 0}.event-detail-label{color:var(--muted);font-size:13px;font-weight:500;flex-shrink:0}.event-detail-value{font-size:13px;text-align:right;word-break:break-word}.oh-schedule{display:flex;flex-direction:column;gap:8px}.oh-day-row{display:flex;align-items:center;gap:12px;font-size:13px}.oh-day-label{width:100px;flex-shrink:0;font-weight:500}.oh-day-times{display:flex;align-items:center;gap:6px;transition:opacity .15s}.oh-day-times input[type=time]{background:var(--card);color:var(--fg);border:1px solid var(--border);border-radius:6px;padding:4px 8px;font-size:13px}.oh-day-times input[type=time]:focus{outline:none;border-color:#fff3}.oh-time-sep{color:var(--muted);-webkit-user-select:none;user-select:none}.oh-closed-toggle{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--muted);cursor:pointer;-webkit-user-select:none;user-select:none}.oh-closed-toggle input[type=checkbox]{cursor:pointer}input[type=date].oh-date-input{background:var(--card);color:var(--fg);border:1px solid var(--border);border-radius:6px;padding:4px 8px;font-size:13px}input[type=date].oh-date-input:focus{outline:none;border-color:#fff3}.config-layout{display:grid;grid-template-columns:260px minmax(0,1fr);gap:0;height:calc(100vh - 160px);margin:-16px;border-radius:var(--radius-xl);overflow:hidden;border:1px solid var(--border);background:var(--panel)}.config-sidebar{display:flex;flex-direction:column;background:var(--bg-accent);border-right:1px solid var(--border);min-height:0;overflow:hidden}:root[data-theme=light] .config-sidebar{background:var(--bg-hover)}.config-sidebar__header{display:flex;align-items:center;justify-content:space-between;padding:18px;border-bottom:1px solid var(--border)}.config-sidebar__title{font-weight:600;font-size:14px;letter-spacing:-.01em}.config-sidebar__footer{margin-top:auto;padding:14px;border-top:1px solid var(--border)}.config-search{position:relative;padding:14px;border-bottom:1px solid var(--border)}.config-search__icon{position:absolute;left:28px;top:50%;transform:translateY(-50%);width:16px;height:16px;color:var(--muted);pointer-events:none}.config-search__input{width:100%;padding:11px 36px 11px 42px;border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg-elevated);font-size:13px;outline:none;transition:border-color var(--duration-fast) ease,box-shadow var(--duration-fast) ease,background var(--duration-fast) ease}.config-search__input::placeholder{color:var(--muted)}.config-search__input:focus{border-color:var(--accent);box-shadow:var(--focus-ring);background:var(--bg-hover)}:root[data-theme=light] .config-search__input{background:#fff}:root[data-theme=light] .config-search__input:focus{background:#fff}.config-search__clear{position:absolute;right:22px;top:50%;transform:translateY(-50%);width:22px;height:22px;border:none;border-radius:var(--radius-full);background:var(--bg-hover);color:var(--muted);font-size:14px;line-height:1;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:background var(--duration-fast) ease,color var(--duration-fast) ease}.config-search__clear:hover{background:var(--border-strong);color:var(--text)}.config-nav{flex:1;overflow-y:auto;padding:10px}.config-nav__item{display:flex;align-items:center;gap:12px;width:100%;padding:11px 14px;border:none;border-radius:var(--radius-md);background:transparent;color:var(--muted);font-size:13px;font-weight:500;text-align:left;cursor:pointer;transition:background var(--duration-fast) ease,color var(--duration-fast) ease}.config-nav__item:hover{background:var(--bg-hover);color:var(--text)}:root[data-theme=light] .config-nav__item:hover{background:#0000000a}.config-nav__item.active{background:var(--accent-subtle);color:var(--accent)}.config-nav__icon{width:20px;height:20px;display:flex;align-items:center;justify-content:center;font-size:15px;opacity:.7}.config-nav__item:hover .config-nav__icon,.config-nav__item.active .config-nav__icon{opacity:1}.config-nav__icon svg{width:18px;height:18px;stroke:currentColor;fill:none}.config-nav__label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.config-mode-toggle{display:flex;padding:4px;background:var(--bg-elevated);border-radius:var(--radius-md);border:1px solid var(--border)}:root[data-theme=light] .config-mode-toggle{background:#fff}.config-mode-toggle__btn{flex:1;padding:9px 14px;border:none;border-radius:var(--radius-sm);background:transparent;color:var(--muted);font-size:12px;font-weight:600;cursor:pointer;transition:background var(--duration-fast) ease,color var(--duration-fast) ease,box-shadow var(--duration-fast) ease}.config-mode-toggle__btn:hover{color:var(--text)}.config-mode-toggle__btn.active{background:var(--accent);color:#fff;box-shadow:var(--shadow-sm)}.config-main{display:flex;flex-direction:column;min-height:0;min-width:0;background:var(--panel);overflow:hidden}.config-actions{display:flex;align-items:center;justify-content:space-between;gap:14px;padding:14px 22px;background:var(--bg-accent);border-bottom:1px solid var(--border)}:root[data-theme=light] .config-actions{background:var(--bg-hover)}.config-actions__left,.config-actions__right{display:flex;align-items:center;gap:10px}.config-changes-badge{padding:6px 14px;border-radius:var(--radius-full);background:var(--accent-subtle);border:1px solid rgba(255,77,77,.3);color:var(--accent);font-size:12px;font-weight:600}.config-status{font-size:13px;color:var(--muted)}.config-diff{margin:18px 22px 0;border:1px solid rgba(255,77,77,.25);border-radius:var(--radius-lg);background:var(--accent-subtle);overflow:hidden}.config-diff__summary{display:flex;align-items:center;justify-content:space-between;padding:14px 18px;cursor:pointer;font-size:13px;font-weight:600;color:var(--accent);list-style:none}.config-diff__summary::-webkit-details-marker{display:none}.config-diff__chevron{width:16px;height:16px;transition:transform var(--duration-normal) var(--ease-out)}.config-diff__chevron svg{width:100%;height:100%}.config-diff[open] .config-diff__chevron{transform:rotate(180deg)}.config-diff__content{padding:0 18px 18px;display:grid;gap:10px}.config-diff__item{display:flex;align-items:baseline;gap:14px;padding:10px 14px;border-radius:var(--radius-md);background:var(--bg-elevated);font-size:12px;font-family:var(--mono)}:root[data-theme=light] .config-diff__item{background:#fff}.config-diff__path{font-weight:600;color:var(--text);flex-shrink:0}.config-diff__values{display:flex;align-items:baseline;gap:10px;min-width:0;flex-wrap:wrap}.config-diff__from{color:var(--danger);opacity:.85}.config-diff__arrow{color:var(--muted)}.config-diff__to{color:var(--ok)}.config-section-hero{display:flex;align-items:center;gap:16px;padding:16px 22px;border-bottom:1px solid var(--border);background:var(--bg-accent)}:root[data-theme=light] .config-section-hero{background:var(--bg-hover)}.config-section-hero__icon{width:30px;height:30px;color:var(--accent);display:flex;align-items:center;justify-content:center}.config-section-hero__icon svg{width:100%;height:100%;stroke:currentColor;fill:none}.config-section-hero__text{display:grid;gap:3px;min-width:0}.config-section-hero__title{font-size:16px;font-weight:600;letter-spacing:-.01em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.config-section-hero__desc{font-size:13px;color:var(--muted)}.config-subnav{display:flex;gap:8px;padding:12px 22px 14px;border-bottom:1px solid var(--border);background:var(--bg-accent);overflow-x:auto}:root[data-theme=light] .config-subnav{background:var(--bg-hover)}.config-subnav__item{border:1px solid transparent;border-radius:var(--radius-full);padding:7px 14px;font-size:12px;font-weight:600;color:var(--muted);background:var(--bg-elevated);cursor:pointer;transition:background var(--duration-fast) ease,color var(--duration-fast) ease,border-color var(--duration-fast) ease;white-space:nowrap}:root[data-theme=light] .config-subnav__item{background:#fff}.config-subnav__item:hover{color:var(--text);border-color:var(--border)}.config-subnav__item.active{color:var(--accent);border-color:#ff4d4d66;background:var(--accent-subtle)}.config-content{flex:1;overflow-y:auto;padding:22px}.config-raw-field textarea{min-height:500px;font-family:var(--mono);font-size:13px;line-height:1.55}.config-loading{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:18px;padding:80px 24px;color:var(--muted)}.config-loading__spinner{width:40px;height:40px;border:3px solid var(--border);border-top-color:var(--accent);border-radius:var(--radius-full);animation:spin .75s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.config-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:18px;padding:80px 24px;text-align:center}.config-empty__icon{font-size:56px;opacity:.35}.config-empty__text{color:var(--muted);font-size:15px}.config-form--modern{display:grid;gap:26px}.config-section-card{border:1px solid var(--border);border-radius:var(--radius-lg);background:var(--bg-elevated);overflow:hidden;transition:border-color var(--duration-fast) ease}.config-section-card:hover{border-color:var(--border-strong)}:root[data-theme=light] .config-section-card{background:#fff}.config-section-card__header{display:flex;align-items:flex-start;gap:16px;padding:20px 22px;background:var(--bg-accent);border-bottom:1px solid var(--border)}:root[data-theme=light] .config-section-card__header{background:var(--bg-hover)}.config-section-card__icon{width:34px;height:34px;color:var(--accent);flex-shrink:0}.config-section-card__icon svg{width:100%;height:100%}.config-section-card__titles{flex:1;min-width:0}.config-section-card__title{margin:0;font-size:17px;font-weight:600;letter-spacing:-.01em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.config-section-card__desc{margin:5px 0 0;font-size:13px;color:var(--muted);line-height:1.45}.config-section-card__content{padding:22px}.cfg-fields{display:grid;gap:22px}.cfg-field{display:grid;gap:8px}.cfg-field--error{padding:14px;border-radius:var(--radius-md);background:var(--danger-subtle);border:1px solid rgba(239,68,68,.3)}.cfg-field__label{font-size:13px;font-weight:600;color:var(--text)}.cfg-field__help{font-size:12px;color:var(--muted);line-height:1.45}.cfg-field__error{font-size:12px;color:var(--danger)}.cfg-input-wrap{display:flex;gap:10px}.cfg-input{flex:1;padding:11px 14px;border:1px solid var(--border-strong);border-radius:var(--radius-md);background:var(--bg-accent);font-size:14px;outline:none;transition:border-color var(--duration-fast) ease,box-shadow var(--duration-fast) ease,background var(--duration-fast) ease}.cfg-input::placeholder{color:var(--muted);opacity:.7}.cfg-input:focus{border-color:var(--accent);box-shadow:var(--focus-ring);background:var(--bg-hover)}:root[data-theme=light] .cfg-input{background:#fff}:root[data-theme=light] .cfg-input:focus{background:#fff}.cfg-input--sm{padding:9px 12px;font-size:13px}.cfg-input__reset{padding:10px 14px;border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg-elevated);color:var(--muted);font-size:14px;cursor:pointer;transition:background var(--duration-fast) ease,color var(--duration-fast) ease}.cfg-input__reset:hover:not(:disabled){background:var(--bg-hover);color:var(--text)}.cfg-input__reset:disabled{opacity:.5;cursor:not-allowed}.cfg-textarea{width:100%;padding:12px 14px;border:1px solid var(--border-strong);border-radius:var(--radius-md);background:var(--bg-accent);font-family:var(--mono);font-size:13px;line-height:1.55;resize:vertical;outline:none;transition:border-color var(--duration-fast) ease,box-shadow var(--duration-fast) ease}.cfg-textarea:focus{border-color:var(--accent);box-shadow:var(--focus-ring)}:root[data-theme=light] .cfg-textarea{background:#fff}.cfg-textarea--sm{padding:10px 12px;font-size:12px}.cfg-number{display:inline-flex;border:1px solid var(--border-strong);border-radius:var(--radius-md);overflow:hidden;background:var(--bg-accent)}:root[data-theme=light] .cfg-number{background:#fff}.cfg-number__btn{width:44px;border:none;background:var(--bg-elevated);color:var(--text);font-size:18px;font-weight:300;cursor:pointer;transition:background var(--duration-fast) ease}.cfg-number__btn:hover:not(:disabled){background:var(--bg-hover)}.cfg-number__btn:disabled{opacity:.4;cursor:not-allowed}:root[data-theme=light] .cfg-number__btn{background:var(--bg-hover)}:root[data-theme=light] .cfg-number__btn:hover:not(:disabled){background:var(--border)}.cfg-number__input{width:85px;padding:11px;border:none;border-left:1px solid var(--border);border-right:1px solid var(--border);background:transparent;font-size:14px;text-align:center;outline:none;-moz-appearance:textfield}.cfg-number__input::-webkit-outer-spin-button,.cfg-number__input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.cfg-select{padding:11px 40px 11px 14px;border:1px solid var(--border-strong);border-radius:var(--radius-md);background-color:var(--bg-accent);background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23888' stroke-width='2'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 12px center;font-size:14px;cursor:pointer;outline:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;transition:border-color var(--duration-fast) ease,box-shadow var(--duration-fast) ease}.cfg-select:focus{border-color:var(--accent);box-shadow:var(--focus-ring)}:root[data-theme=light] .cfg-select{background-color:#fff}.cfg-segmented{display:inline-flex;padding:4px;border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg-accent)}:root[data-theme=light] .cfg-segmented{background:var(--bg-hover)}.cfg-segmented__btn{padding:9px 18px;border:none;border-radius:var(--radius-sm);background:transparent;color:var(--muted);font-size:13px;font-weight:500;cursor:pointer;transition:background var(--duration-fast) ease,color var(--duration-fast) ease,box-shadow var(--duration-fast) ease}.cfg-segmented__btn:hover:not(:disabled):not(.active){color:var(--text)}.cfg-segmented__btn.active{background:var(--accent);color:#fff;box-shadow:var(--shadow-sm)}.cfg-segmented__btn:disabled{opacity:.5;cursor:not-allowed}.cfg-toggle-row{display:flex;align-items:center;justify-content:space-between;gap:18px;padding:16px 18px;border:1px solid var(--border);border-radius:var(--radius-lg);background:var(--bg-accent);cursor:pointer;transition:background var(--duration-fast) ease,border-color var(--duration-fast) ease}.cfg-toggle-row:hover:not(.disabled){background:var(--bg-hover);border-color:var(--border-strong)}.cfg-toggle-row.disabled{opacity:.55;cursor:not-allowed}:root[data-theme=light] .cfg-toggle-row{background:#fff}:root[data-theme=light] .cfg-toggle-row:hover:not(.disabled){background:var(--bg-hover)}.cfg-toggle-row__content{flex:1;min-width:0}.cfg-toggle-row__label{display:block;font-size:14px;font-weight:500;color:var(--text)}.cfg-toggle-row__help{display:block;margin-top:3px;font-size:12px;color:var(--muted);line-height:1.45}.cfg-toggle{position:relative;flex-shrink:0}.cfg-toggle input{position:absolute;opacity:0;width:0;height:0}.cfg-toggle__track{display:block;width:50px;height:28px;background:var(--bg-elevated);border:1px solid var(--border-strong);border-radius:var(--radius-full);position:relative;transition:background var(--duration-normal) ease,border-color var(--duration-normal) ease}:root[data-theme=light] .cfg-toggle__track{background:var(--border)}.cfg-toggle__track:after{content:"";position:absolute;top:3px;left:3px;width:20px;height:20px;background:var(--text);border-radius:var(--radius-full);box-shadow:var(--shadow-sm);transition:transform var(--duration-normal) var(--ease-out),background var(--duration-normal) ease}.cfg-toggle input:checked+.cfg-toggle__track{background:var(--ok-subtle);border-color:#22c55e66}.cfg-toggle input:checked+.cfg-toggle__track:after{transform:translate(22px);background:var(--ok)}.cfg-toggle input:focus+.cfg-toggle__track{box-shadow:var(--focus-ring)}.cfg-object{border:1px solid var(--border);border-radius:var(--radius-lg);background:var(--bg-accent);overflow:hidden}:root[data-theme=light] .cfg-object{background:#fff}.cfg-object__header{display:flex;align-items:center;justify-content:space-between;padding:14px 18px;cursor:pointer;list-style:none;transition:background var(--duration-fast) ease}.cfg-object__header:hover{background:var(--bg-hover)}.cfg-object__header::-webkit-details-marker{display:none}.cfg-object__title{font-size:14px;font-weight:600;color:var(--text)}.cfg-object__chevron{width:18px;height:18px;color:var(--muted);transition:transform var(--duration-normal) var(--ease-out)}.cfg-object__chevron svg{width:100%;height:100%}.cfg-object[open] .cfg-object__chevron{transform:rotate(180deg)}.cfg-object__help{padding:0 18px 14px;font-size:12px;color:var(--muted);border-bottom:1px solid var(--border)}.cfg-object__content{padding:18px;display:grid;gap:18px}.cfg-array{border:1px solid var(--border);border-radius:var(--radius-lg);overflow:hidden}.cfg-array__header{display:flex;align-items:center;gap:14px;padding:14px 18px;background:var(--bg-accent);border-bottom:1px solid var(--border)}:root[data-theme=light] .cfg-array__header{background:var(--bg-hover)}.cfg-array__label{flex:1;font-size:14px;font-weight:600;color:var(--text)}.cfg-array__count{font-size:12px;color:var(--muted);padding:4px 10px;background:var(--bg-elevated);border-radius:var(--radius-full)}:root[data-theme=light] .cfg-array__count{background:#fff}.cfg-array__add{display:inline-flex;align-items:center;gap:6px;padding:7px 14px;border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg-elevated);color:var(--text);font-size:12px;font-weight:500;cursor:pointer;transition:background var(--duration-fast) ease}.cfg-array__add:hover:not(:disabled){background:var(--bg-hover)}.cfg-array__add:disabled{opacity:.5;cursor:not-allowed}.cfg-array__add-icon{width:14px;height:14px}.cfg-array__add-icon svg{width:100%;height:100%}.cfg-array__help{padding:12px 18px;font-size:12px;color:var(--muted);border-bottom:1px solid var(--border)}.cfg-array__empty{padding:36px 18px;text-align:center;color:var(--muted);font-size:13px}.cfg-array__items{display:grid;gap:1px;background:var(--border)}.cfg-array__item{background:var(--panel)}.cfg-array__item-header{display:flex;align-items:center;justify-content:space-between;padding:12px 18px;background:var(--bg-accent);border-bottom:1px solid var(--border)}:root[data-theme=light] .cfg-array__item-header{background:var(--bg-hover)}.cfg-array__item-index{font-size:11px;font-weight:600;color:var(--muted);text-transform:uppercase;letter-spacing:.05em}.cfg-array__item-remove{width:30px;height:30px;display:flex;align-items:center;justify-content:center;border:none;border-radius:var(--radius-md);background:transparent;color:var(--muted);cursor:pointer;transition:background var(--duration-fast) ease,color var(--duration-fast) ease}.cfg-array__item-remove svg{width:16px;height:16px}.cfg-array__item-remove:hover:not(:disabled){background:var(--danger-subtle);color:var(--danger)}.cfg-array__item-remove:disabled{opacity:.4;cursor:not-allowed}.cfg-array__item-content{padding:18px}.cfg-map{border:1px solid var(--border);border-radius:var(--radius-lg);overflow:hidden}.cfg-map__header{display:flex;align-items:center;justify-content:space-between;gap:14px;padding:14px 18px;background:var(--bg-accent);border-bottom:1px solid var(--border)}:root[data-theme=light] .cfg-map__header{background:var(--bg-hover)}.cfg-map__label{font-size:13px;font-weight:600;color:var(--muted)}.cfg-map__add{display:inline-flex;align-items:center;gap:6px;padding:7px 14px;border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg-elevated);color:var(--text);font-size:12px;font-weight:500;cursor:pointer;transition:background var(--duration-fast) ease}.cfg-map__add:hover:not(:disabled){background:var(--bg-hover)}.cfg-map__add-icon{width:14px;height:14px}.cfg-map__add-icon svg{width:100%;height:100%}.cfg-map__empty{padding:28px 18px;text-align:center;color:var(--muted);font-size:13px}.cfg-map__items{display:grid;gap:10px;padding:14px}.cfg-map__item{display:grid;grid-template-columns:150px 1fr auto;gap:10px;align-items:start}.cfg-map__item-key,.cfg-map__item-value{min-width:0}.cfg-map__item-remove{width:34px;height:34px;display:flex;align-items:center;justify-content:center;border:none;border-radius:var(--radius-md);background:transparent;color:var(--muted);cursor:pointer;transition:background var(--duration-fast) ease,color var(--duration-fast) ease}.cfg-map__item-remove svg{width:16px;height:16px}.cfg-map__item-remove:hover:not(:disabled){background:var(--danger-subtle);color:var(--danger)}.pill--sm{padding:5px 12px;font-size:11px}.pill--ok{border-color:#22c55e59;color:var(--ok)}.pill--danger{border-color:#ef444459;color:var(--danger)}@media(max-width:768px){.config-layout{grid-template-columns:1fr}.config-sidebar{border-right:none;border-bottom:1px solid var(--border)}.config-sidebar__header{padding:14px 16px}.config-nav{display:flex;flex-wrap:nowrap;gap:6px;padding:10px 14px;overflow-x:auto;-webkit-overflow-scrolling:touch}.config-nav__item{flex:0 0 auto;padding:9px 14px;white-space:nowrap}.config-nav__label{display:inline}.config-sidebar__footer{display:none}.config-actions{flex-wrap:wrap;padding:14px 16px}.config-actions__left,.config-actions__right{width:100%;justify-content:center}.config-section-hero{padding:14px 16px}.config-subnav{padding:10px 16px 12px}.config-content{padding:18px}.config-section-card__header{padding:16px 18px}.config-section-card__content{padding:18px}.cfg-toggle-row{padding:14px 16px}.cfg-map__item{grid-template-columns:1fr;gap:10px}.cfg-map__item-remove{justify-self:end}}@media(max-width:480px){.config-nav__icon{width:26px;height:26px;font-size:17px}.config-nav__label{display:none}.config-section-card__icon{width:30px;height:30px}.config-section-card__title{font-size:16px}.cfg-segmented{flex-wrap:wrap}.cfg-segmented__btn{flex:1 0 auto;min-width:70px}}.setup-container{--tasker-black: #1a1a1a;--tasker-charcoal: #2d2d2d;--tasker-orange: var(--accent, #00d4ff);--tasker-orange-hover: var(--accent-hover, #00b8e0);--tasker-orange-glow: var(--accent-glow, rgba(0, 212, 255, .3));--tasker-white: #ffffff;--tasker-text-grey: #b0b0b0;--tasker-muted-grey: #888888;min-height:100vh;display:flex;align-items:flex-start;justify-content:center;background:linear-gradient(170deg,#1a1a1a,#111);padding:80px 20px 40px;position:relative;overflow-y:auto}.setup-container:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;background-image:linear-gradient(rgba(255,107,0,.03) 1px,transparent 1px),linear-gradient(90deg,rgba(255,107,0,.03) 1px,transparent 1px);background-size:60px 60px;pointer-events:none}.setup-card{background:linear-gradient(var(--brand-bg-card),var(--brand-bg-card)),var(--tasker-charcoal);border:1px solid rgba(255,255,255,.06);border-radius:16px;padding:32px 28px;text-align:center;max-width:420px;width:100%;box-shadow:0 24px 80px #00000080,0 0 0 1.5px #ffffff1a;position:relative;z-index:1;margin:auto 0}.setup-card h1{margin:0 0 12px;font-size:28px;font-weight:800;color:var(--tasker-white);letter-spacing:-.02em}.setup-card p{margin:0 0 24px;color:var(--tasker-text-grey);font-size:15px;line-height:1.6}.setup-qr{background:var(--tasker-white);padding:20px;border-radius:12px;display:inline-block;margin:24px 0;box-shadow:0 8px 32px #ff6b0024,0 0 60px #ff6b000f}.setup-qr img{display:block;width:256px;height:256px;image-rendering:pixelated}.setup-spinner{width:48px;height:48px;border:3px solid rgba(255,255,255,.1);border-top-color:var(--tasker-orange);border-radius:50%;animation:setup-spin .8s linear infinite;margin:0 auto 24px}@keyframes setup-spin{to{transform:rotate(360deg)}}.setup-success{border:2px solid var(--tasker-orange);box-shadow:0 0 40px #ff6b0026}.setup-success .setup-icon{width:72px;height:72px;background:var(--tasker-orange);border-radius:50%;display:flex;align-items:center;justify-content:center;margin:0 auto 24px;font-size:36px;color:var(--tasker-white);box-shadow:0 4px 20px var(--tasker-orange-glow)}.setup-waiting{color:var(--tasker-orange);font-weight:600;font-size:14px}.setup-error{color:#ef4444;background:#ef44441a;padding:12px 16px;border-radius:8px;border:1px solid rgba(239,68,68,.2)}.setup-hint{font-size:13px;color:var(--tasker-muted-grey);margin-top:8px}.setup-logo{height:72px;width:auto;margin-bottom:32px}.setup-steps{display:flex;flex-direction:column;gap:12px;margin-bottom:32px}.setup-step{display:flex;align-items:center;gap:10px;font-size:13px;color:var(--tasker-muted-grey)}.setup-step.active{color:var(--tasker-orange)}.setup-step.completed{color:var(--tasker-text-grey)}.setup-step-dot{width:12px;height:12px;border-radius:50%;border:2px solid currentColor;background:transparent}.setup-step.active .setup-step-dot{background:var(--tasker-orange);border-color:var(--tasker-orange);box-shadow:0 0 10px var(--tasker-orange-glow)}.setup-step.completed .setup-step-dot{background:var(--tasker-orange);border-color:var(--tasker-orange)}.setup-button{display:inline-block;padding:14px 28px;font-size:15px;font-weight:600;border-radius:10px;cursor:pointer;border:none;transition:all .2s ease;text-decoration:none;font-family:inherit}.setup-button.primary{background:var(--tasker-orange);color:var(--accent-foreground, #ffffff);box-shadow:0 4px 14px var(--tasker-orange-glow)}.setup-button.primary:hover{background:var(--tasker-orange-hover);transform:translateY(-1px);box-shadow:0 6px 20px var(--tasker-orange-glow)}.setup-button:not(.primary){background:#ffffff1a;color:var(--tasker-white);border:1px solid rgba(255,255,255,.15)}.setup-button:not(.primary):hover{background:#ffffff26}.setup-button:disabled{opacity:.5;cursor:not-allowed;transform:none!important}.setup-divider{display:flex;align-items:center;margin:24px 0;color:var(--tasker-muted-grey);font-size:13px}.setup-divider:before,.setup-divider:after{content:"";flex:1;height:1px;background:#ffffff1a}.setup-divider span{padding:0 16px}.setup-code-input{display:flex;gap:12px;margin-top:16px}.setup-code-input input{flex:1;padding:14px 16px;font-size:15px;border-radius:10px;border:1px solid rgba(255,255,255,.15);background:#0000004d;color:var(--tasker-white);font-family:inherit;outline:none;transition:border-color .2s ease}.setup-code-input input:focus{border-color:#fff3}.setup-code-input input::placeholder{color:var(--tasker-muted-grey)}.setup-device-id{margin:16px 0 8px;padding:12px 16px;border-radius:10px;background:#0000004d;border:1px solid rgba(255,255,255,.1)}.setup-device-id-label{display:block;font-size:11px;text-transform:uppercase;letter-spacing:.05em;color:var(--tasker-muted-grey);margin-bottom:4px}.setup-device-id-value{display:block;font-size:13px;font-family:SF Mono,Fira Code,Consolas,monospace;color:var(--tasker-orange);word-break:break-all;-webkit-user-select:all;user-select:all;cursor:text}.setup-device-id-copy{display:inline-block;margin-top:8px;background:#ffffff14;border:1px solid rgba(255,255,255,.15);border-radius:6px;color:var(--tasker-text-grey);font-size:11px;padding:4px 10px;cursor:pointer;transition:all .15s ease}.setup-device-id-copy:hover{background:#ffffff24;color:var(--tasker-white)}.setup-hint a.setup-link-danger{color:#ef4444;text-decoration:none;font-size:12px;opacity:.7;transition:opacity .15s ease}.setup-hint a.setup-link-danger:hover{color:#ef4444;opacity:1;text-decoration:underline}.setup-license-remove-confirm{margin-top:16px;padding:16px;border-radius:10px;background:#ef444414;border:1px solid rgba(239,68,68,.25)}.setup-license-remove-warning{font-size:14px;color:#ef4444;margin:0 0 14px;line-height:1.5}.setup-license-remove-actions{display:flex;gap:10px;justify-content:center}.setup-hint a{color:var(--tasker-orange);text-decoration:none}.setup-hint a:hover{text-decoration:underline}.setup-status-light{width:14px;height:14px;border-radius:50%;display:inline-block;flex-shrink:0;box-shadow:0 0 8px currentColor}.setup-status-row{display:flex;align-items:center;justify-content:center;gap:12px;font-size:22px;font-weight:700;color:var(--tasker-white);margin-bottom:16px}.setup-status-dashboard{display:flex;flex-direction:column;gap:8px;margin:16px 0;padding:12px;background:#0003;border-radius:12px;border:1px solid rgba(255,255,255,.08)}.setup-status-item{display:flex;align-items:center;gap:12px;padding:10px 14px;background:linear-gradient(var(--brand-bg-card, transparent),var(--brand-bg-card, transparent)),#0003;border-radius:8px}.setup-status-info{display:flex;flex-direction:column;align-items:flex-start;gap:2px;flex:1}.setup-status-info strong{font-size:15px;color:var(--tasker-white);font-weight:600}.setup-status-info span{font-size:13px;color:var(--tasker-text-grey)}.setup-model-select{background:#0000004d;color:var(--tasker-text-grey);border:1px solid rgba(255,255,255,.1);border-radius:4px;padding:3px 6px;font-size:12px;cursor:pointer;outline:none}.setup-model-select:focus,.setup-model-select:focus-visible{border-color:#fff3;box-shadow:none}.setup-select-sm{background:#0000004d;color:var(--tasker-text-grey);border:1px solid rgba(255,255,255,.1);border-radius:4px;padding:3px 6px;font-size:12px;cursor:pointer;outline:none}.setup-select-sm:focus,.setup-select-sm:focus-visible{border-color:#fff3;box-shadow:none}.setup-link-btn{background:transparent;border:none;color:var(--accent, #00d4ff);font-size:13px;cursor:pointer;padding:4px 8px;border-radius:4px;transition:opacity .15s ease;white-space:nowrap}.setup-link-btn:hover{opacity:.8}.setup-link-btn:focus,.setup-link-btn:focus-visible{outline:none}.setup-status-action{background:transparent;border:1px solid rgba(255,255,255,.15);border-radius:6px;color:var(--tasker-text-grey);padding:8px;cursor:pointer;transition:all .15s ease;display:flex;align-items:center;justify-content:center}.setup-status-action svg{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}.setup-status-action:hover:not(:disabled){background:#ffffff14;border-color:#ffffff40;color:var(--tasker-white)}.setup-status-action:disabled{opacity:.5;cursor:not-allowed}.setup-status-action.spinning svg{animation:spin 1s linear infinite}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.setup-success-message{font-size:18px;font-weight:600;color:#22c55e!important;margin-top:8px!important}.setup-warning{color:#eab308!important;background:#eab3081a;padding:12px 16px;border-radius:8px;border:1px solid rgba(234,179,8,.2);margin-bottom:16px}.setup-actions{display:flex;gap:12px;justify-content:center;flex-wrap:wrap;margin-top:16px;padding-top:16px;border-top:1px solid rgba(255,255,255,.1)}.setup-button.secondary{background:transparent;color:var(--tasker-text-grey);border:1px solid rgba(255,255,255,.15)}.setup-button.secondary:hover{background:#ffffff0d;color:var(--tasker-white)}.setup-button.danger{background:transparent;color:#ef4444;border:1px solid rgba(239,68,68,.3)}.setup-button.danger:hover{background:#ef44441a}.setup-add-account{margin-top:12px;padding:16px;border-radius:8px;background:#ffffff0a;border:1px solid rgba(255,255,255,.08);text-align:left}.setup-add-account strong{font-size:14px;color:var(--tasker-white)}.setup-add-account-label{display:block;margin-top:12px;font-size:12px;color:var(--tasker-text-grey, rgba(255, 255, 255, .5))}.setup-add-account-input{display:block;width:100%;margin-top:10px;padding:12px 14px;font-size:14px;border-radius:8px;border:1px solid rgba(255,255,255,.15);background:#0000004d;color:var(--tasker-white);font-family:inherit;outline:none;box-sizing:border-box;transition:border-color .2s ease}.setup-add-account-input:focus{border-color:#fff3;outline:none}.setup-add-account-input::placeholder{color:var(--tasker-muted-grey)}.setup-add-account-actions{display:flex;gap:8px;margin-top:10px}.setup-add-account-actions .setup-button{padding:10px 20px;font-size:14px}.setup-page{min-height:100vh;background:linear-gradient(var(--brand-bg-subtle, transparent),var(--brand-bg-subtle, transparent)),linear-gradient(170deg,#1a1a1a,#111)}.setup-button.small{padding:8px 14px;font-size:13px}.sp-card{background:linear-gradient(var(--brand-bg-card),var(--brand-bg-card)),var(--tasker-charcoal);border:1px solid rgba(255,255,255,.08);border-radius:12px;padding:24px;margin-top:24px}.sp-card-header{display:flex;justify-content:space-between;align-items:center;gap:16px;margin-bottom:8px}.sp-card-header h2{margin:0;font-size:18px;font-weight:600;color:var(--tasker-white)}.sp-form-row{display:flex;gap:12px;margin:16px 0}.sp-input{flex:1;padding:12px 14px;font-size:14px;border-radius:8px;border:1px solid rgba(255,255,255,.15);background:#0000004d;color:var(--tasker-white);font-family:inherit;outline:none;transition:border-color .2s ease}.sp-input:focus{border-color:#fff3}.sp-input::placeholder{color:var(--tasker-muted-grey)}.sp-input:disabled{opacity:.5}.sp-list{margin-top:16px;background:#0003;border:1px solid rgba(255,255,255,.08);border-radius:10px;overflow:hidden}.sp-list-empty{padding:24px;text-align:center;color:var(--tasker-muted-grey);font-size:14px}.sp-list-item{display:flex;align-items:center;gap:16px;padding:14px 16px;border-bottom:1px solid rgba(255,255,255,.06)}.sp-list-item:last-child{border-bottom:none}.sp-list-item-main{flex:1;min-width:0}.sp-list-item-title{font-size:15px;font-weight:500;color:var(--tasker-white);font-family:SF Mono,Fira Code,monospace}.sp-list-item-sub{font-size:13px;color:var(--tasker-muted-grey);margin-top:2px}.sp-callout{margin-top:20px;padding:14px 16px;background:#0003;border:1px solid rgba(255,255,255,.08);border-radius:8px;font-size:13px;line-height:1.5;color:var(--tasker-text-grey)}.sp-callout code{background:#ffffff1a;padding:2px 6px;border-radius:4px;font-family:SF Mono,Fira Code,monospace;font-size:12px;color:var(--tasker-orange)}.sp-error{color:#ef4444;background:#ef44441a;padding:12px 16px;border-radius:8px;border:1px solid rgba(239,68,68,.2);font-size:14px}.sp-card-wide{max-width:720px}.sp-toolbar{display:flex;gap:10px;justify-content:center;flex-wrap:wrap}.sp-search-bar{display:flex;gap:8px;align-items:center;margin-top:12px}.sp-search-input{flex:1;padding:8px 12px;font-size:14px;background:#ffffff0d;border:1px solid rgba(255,255,255,.15);border-radius:6px;color:var(--tasker-white);outline:none}.sp-search-input::placeholder{color:var(--tasker-muted-grey)}.sp-search-agent-select{padding:8px 12px;font-size:13px;background:#ffffff0d;border:1px solid rgba(255,255,255,.15);border-radius:6px;color:var(--tasker-white);outline:none;min-width:140px}.sp-search-results{display:flex;flex-direction:column;gap:2px;margin-top:16px;background:#0003;border:1px solid rgba(255,255,255,.08);border-radius:10px;max-height:400px;overflow-y:auto;text-align:left}.sp-search-result{padding:10px 12px;cursor:pointer;border-bottom:1px solid rgba(255,255,255,.04)}.sp-search-result:last-child{border-bottom:none}.sp-search-result:hover{background:#ffffff0a}.sp-search-result.selected{background:#00d4ff14}.sp-search-result-header{display:flex;justify-content:space-between;align-items:center;gap:12px}.sp-search-result-path{font-size:13px;font-weight:600;color:var(--tasker-white);word-break:break-all}.sp-search-result-score{font-size:12px;font-weight:600;color:var(--tasker-orange);white-space:nowrap}.sp-search-result-meta{font-size:12px;color:var(--tasker-muted-grey);margin-top:2px}.sp-search-result-snippet{font-size:12px;color:var(--tasker-text-grey);margin:6px 0 0;white-space:pre-wrap;word-break:break-word;max-height:80px;overflow:hidden;line-height:1.4}.sp-file-tree{margin-top:16px;background:#0003;border:1px solid rgba(255,255,255,.08);border-radius:10px;max-height:520px;overflow-y:auto;text-align:left}.sp-tree-item{display:flex;align-items:center;gap:8px;padding:8px 12px;font-size:14px;color:var(--tasker-text-grey);cursor:pointer;transition:background .12s ease;border-bottom:1px solid rgba(255,255,255,.04);-webkit-user-select:none;user-select:none}.sp-tree-item:last-child{border-bottom:none}.sp-tree-item:hover{background:#ffffff0a}.sp-tree-item.selected{background:#00d4ff14;color:var(--tasker-white)}.sp-tree-dir{color:var(--tasker-white);font-weight:500}.sp-tree-dir.current{background:#ffffff0f;border-left:2px solid rgba(255,255,255,.3)}.sp-tree-dir-delete{display:none;margin-left:auto;padding:0 6px;font-size:14px;color:var(--tasker-muted-grey);cursor:pointer;border-radius:3px}.sp-tree-dir-delete:hover{color:#ef4444;background:#ef444426}.sp-tree-dir:hover .sp-tree-dir-delete{display:inline}.sp-tree-chevron{width:16px;text-align:center;font-size:13px;color:var(--tasker-muted-grey);flex-shrink:0}.sp-tree-icon{flex-shrink:0;display:flex;align-items:center}.sp-tree-icon svg{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}.sp-tree-name{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sp-tree-size{font-size:12px;color:var(--tasker-muted-grey);flex-shrink:0;margin-left:auto}.sp-badge{font-size:10px;padding:1px 6px;border-radius:4px;background:#ffffff14;color:var(--tasker-muted-grey);flex-shrink:0}.sp-tree-file[draggable=true]{cursor:grab}.sp-tree-file[draggable=true]:active{cursor:grabbing}.sp-drop-target{background:#00d4ff14!important;outline:2px dashed var(--tasker-orange);outline-offset:-2px}.sp-bulk-actions{margin-top:12px;display:flex;align-items:center;gap:12px;padding:10px 16px;background:#0003;border:1px solid rgba(255,255,255,.08);border-radius:10px}.sp-file-preview{margin-top:16px;background:#0003;border:1px solid rgba(255,255,255,.08);border-radius:10px;overflow:hidden;text-align:left}.sp-file-preview-header{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:14px 16px;border-bottom:1px solid rgba(255,255,255,.06)}.sp-file-preview-header strong{color:var(--tasker-white);font-size:14px}.sp-file-preview-meta{font-size:12px;color:var(--tasker-muted-grey);margin-top:2px}.sp-file-actions{display:flex;gap:8px;flex-shrink:0}.sp-file-preview-body{padding:16px;max-height:300px;overflow:auto}.sp-file-code{font-family:SF Mono,Fira Code,Cascadia Code,monospace;font-size:13px;line-height:1.5;color:var(--tasker-text-grey);white-space:pre-wrap;word-break:break-all;margin:0}.sp-canvas-area{text-align:center}.sp-canvas-wrap{position:relative;display:inline-block;border:1px solid rgba(255,255,255,.08);border-radius:10px;overflow:hidden;background:#000}.sp-canvas-wrap.sp-input-active{border-color:var(--tasker-orange);box-shadow:0 0 16px var(--tasker-orange-glow)}.sp-canvas{display:block;max-width:100%;height:auto;cursor:default}.sp-canvas-wrap.sp-input-active .sp-canvas{cursor:crosshair}.sp-canvas-placeholder{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:16px;padding:60px 24px;background:#0003;border:1px solid rgba(255,255,255,.08);border-radius:10px}.sp-canvas-placeholder p{margin:0;font-size:14px;color:var(--tasker-muted-grey)}.sp-canvas-placeholder-icon{color:var(--tasker-muted-grey);opacity:.5}.sp-canvas-placeholder-icon svg{width:48px;height:48px;stroke:currentColor;fill:none;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round}.sp-fullscreen-overlay{position:fixed;top:0;right:0;bottom:0;left:0;z-index:9999;background:#000;display:flex;flex-direction:column}.sp-fullscreen-toolbar{display:flex;gap:8px;justify-content:center;padding:8px 12px;background:#000000e6;border-bottom:1px solid rgba(255,255,255,.1);flex-shrink:0}.sp-fullscreen-canvas-wrap{flex:1;display:flex;align-items:center;justify-content:center;overflow:hidden}.sp-fullscreen-canvas-wrap.sp-input-active{outline:2px solid var(--tasker-orange);outline-offset:-2px}.sp-canvas-fullscreen{max-width:100%;max-height:100%;object-fit:contain}.sp-page-nav{display:flex;justify-content:center;gap:24px;margin-top:24px;padding-top:16px;border-top:1px solid rgba(255,255,255,.08)}.sp-page-nav a,.sp-page-nav-fixed a,.setup-header-nav a{color:var(--tasker-muted-grey);text-decoration:none;font-size:13px;transition:color .15s ease}.sp-page-nav a:hover,.sp-page-nav-fixed a:hover,.setup-header-nav a:hover{color:var(--tasker-orange)}.sp-page-nav-current{font-size:13px;color:var(--tasker-white);font-weight:600}.setup-header{position:fixed;top:0;left:0;right:0;background:#1a1a1aeb;border-bottom:1px solid rgba(255,255,255,.08);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);z-index:10}.setup-header-inner{position:relative;z-index:11;display:flex;align-items:center;justify-content:space-between;max-width:1060px;margin:0 auto;padding:10px 20px}.setup-header-logo{height:28px;width:auto;border-radius:6px}.setup-header-nav{display:flex;gap:20px;align-items:center;margin-left:24px}.setup-header-nav a{color:var(--tasker-muted-grey);text-decoration:none;font-size:13px}.setup-header-nav a:hover{color:var(--tasker-orange)}.setup-header-nav .sp-page-nav-current{color:var(--tasker-white)}.setup-header-right{display:flex;align-items:center;gap:12px;margin-left:auto}.nav-logout-btn{background:none;border:1px solid rgba(255,255,255,.15);color:#fff9;cursor:pointer;padding:6px 8px;border-radius:6px;display:flex;align-items:center;transition:color .2s,border-color .2s}.nav-logout-btn:hover{color:#fff;border-color:#ffffff4d}.nav-audit-btn{background:none;border:1px solid rgba(255,170,0,.3);color:#fa0;cursor:pointer;padding:6px 8px;border-radius:6px;display:flex;align-items:center;gap:4px;transition:color .2s,border-color .2s;position:relative}.nav-audit-btn:hover{color:#fc4;border-color:#ffaa0080}.nav-audit-badge{font-size:11px;font-weight:600;min-width:16px;text-align:center}.nav-restart-btn{background:none;border:1px solid rgba(255,255,255,.15);color:#fff9;cursor:pointer;padding:6px 8px;border-radius:6px;display:flex;align-items:center;transition:color .2s,border-color .2s}.nav-restart-btn:hover{color:#fff;border-color:#ffffff4d}.nav-restart-confirm{position:absolute;top:calc(100% + 8px);right:0;background:var(--tasker-charcoal, #2d2d2d);border:1px solid rgba(255,255,255,.15);border-radius:10px;padding:16px;z-index:120;display:flex;flex-direction:column;gap:12px;min-width:200px;box-shadow:0 8px 24px #0006}.nav-restart-confirm p{margin:0;font-size:14px;color:#ffffffe6;white-space:nowrap}.nav-restart-confirm-actions{display:flex;gap:8px}.nav-restart-confirm-yes,.nav-restart-confirm-no{flex:1;padding:6px 12px;border-radius:6px;font-size:13px;cursor:pointer;border:none}.nav-restart-confirm-yes{background:#e74c3c;color:#fff}.nav-restart-confirm-yes:hover{background:#c0392b}.nav-restart-confirm-no{background:#ffffff1a;color:#fffc;border:1px solid rgba(255,255,255,.15)}.nav-restart-confirm-no:hover{background:#ffffff26}.audit-modal-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background:#0009;z-index:100;display:flex;align-items:center;justify-content:center;padding:20px}.audit-modal-card{background:var(--tasker-charcoal, #2d2d2d);border:1px solid rgba(255,255,255,.1);border-radius:12px;padding:24px;max-width:520px;width:100%;max-height:80vh;display:flex;flex-direction:column;box-shadow:0 24px 80px #00000080}.audit-modal-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}.audit-modal-header h3{margin:0;font-size:16px;font-weight:600;color:var(--tasker-white, #fff)}.audit-modal-close{background:none;border:none;color:#ffffff80;font-size:22px;cursor:pointer;padding:0 4px;line-height:1}.audit-modal-close:hover{color:#fff}.audit-modal-desc{font-size:13px;color:var(--tasker-muted-grey, #888);margin:0 0 16px;line-height:1.4}.audit-modal-empty{font-size:13px;color:var(--tasker-muted-grey, #888);text-align:center;padding:20px 0}.audit-modal-list{overflow-y:auto;max-height:50vh;display:flex;flex-direction:column;gap:8px;margin-bottom:16px}.audit-modal-entry{padding:8px 10px;background:#ffffff08;border-radius:6px;border:1px solid rgba(255,255,255,.06)}.audit-modal-entry-path{display:flex;align-items:center;gap:8px;margin-bottom:4px}.audit-modal-folder{font-size:10px;font-weight:600;text-transform:uppercase;padding:2px 6px;border-radius:3px;flex-shrink:0}.audit-modal-folder--shared{background:#ffaa0026;color:#fa0}.audit-modal-folder--public{background:#ff505026;color:#ff5050}.audit-modal-path-link{font-size:13px;color:var(--tasker-white, #fff);text-decoration:none;word-break:break-all}.audit-modal-path-link:hover{text-decoration:underline}.audit-modal-entry-meta{font-size:11px;color:var(--tasker-muted-grey, #888);display:flex;gap:8px}.audit-modal-agent{background:#ffffff0f;padding:0 5px;border-radius:3px}.audit-modal-clear{width:100%;margin-top:4px}.sp-workspace-selector{-moz-appearance:none;appearance:none;-webkit-appearance:none;background:#ffffff14;color:var(--tasker-white);border:1px solid rgba(255,255,255,.15);border-radius:6px;padding:5px 28px 5px 10px;font-size:13px;font-family:inherit;cursor:pointer;outline:none;max-width:180px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%23999'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 8px center;background-size:10px;transition:border-color .15s}.sp-workspace-selector:hover{border-color:#ffffff4d}.sp-workspace-selector:focus,.sp-workspace-selector:focus-visible,.sp-workspace-selector:focus-within{border-color:#ffffff4d;outline:none!important;outline-color:transparent!important;box-shadow:none!important;-webkit-focus-ring-color:transparent}.sp-workspace-selector option{background:#1e1e2e;color:var(--tasker-white)}.nav-burger-checkbox{display:none}.nav-burger-button{display:none;cursor:pointer;padding:8px;margin:-8px;-webkit-tap-highlight-color:transparent}.nav-burger-icon{display:block;width:20px;height:2px;background:#fff;border-radius:1px;position:relative;transition:background .2s}.nav-burger-icon:before,.nav-burger-icon:after{content:"";display:block;width:20px;height:2px;background:#fff;border-radius:1px;position:absolute;left:0;transition:transform .25s ease,top .25s ease}.nav-burger-icon:before{top:-6px}.nav-burger-icon:after{top:6px}.nav-burger-checkbox:checked~.setup-header-inner .nav-burger-icon{background:transparent}.nav-burger-checkbox:checked~.setup-header-inner .nav-burger-icon:before{top:0;transform:rotate(45deg)}.nav-burger-checkbox:checked~.setup-header-inner .nav-burger-icon:after{top:0;transform:rotate(-45deg)}.setup-header-dropdown{position:relative;z-index:11;display:none;flex-direction:column;gap:4px;padding:8px 20px 16px;max-width:1060px;margin:0 auto}.setup-header-dropdown a,.setup-header-dropdown .sp-page-nav-current{display:block;padding:10px 0;font-size:14px;border-bottom:1px solid rgba(255,255,255,.06)}.setup-header-dropdown a{color:#888;text-decoration:none}.setup-header-dropdown a:hover{color:var(--accent, #00d4ff)}.setup-header-dropdown .sp-page-nav-current{color:#fff;font-weight:600}.nav-selector-inline{display:inline-flex}.nav-selector-mobile{display:none}@media(max-width:768px){.setup-header-nav,.nav-selector-inline{display:none}.nav-selector-mobile{display:block;padding:8px 0;border-bottom:1px solid rgba(255,255,255,.06)}.nav-selector-mobile .sp-workspace-selector{width:100%;max-width:none}.nav-burger-button{display:block}.nav-burger-checkbox:checked~.setup-header-inner+.setup-header-dropdown{display:flex}}.setup-container--full{flex-direction:column;padding-top:88px;padding-bottom:0;min-height:100vh;align-items:stretch}.chat-viewport{width:100%;max-width:900px;flex:1;display:flex;flex-direction:column;min-height:0;margin:0 auto;padding:0 16px;text-align:left}.chat-viewport>.card.chat{border:none;background:transparent;padding:0;box-shadow:none;animation:none}.chat-viewport>.card.chat:hover{border-color:transparent;box-shadow:none}.chat-page{padding-bottom:0;height:100vh;overflow:hidden}.chat-public-link{display:inline-flex;align-items:center;gap:4px;align-self:flex-end;margin:0 16px;padding:4px 10px;font-size:12px;color:#ffffff80;text-decoration:none;border:1px solid rgba(255,255,255,.1);border-radius:6px;transition:color .15s,border-color .15s}.chat-public-link:hover{color:#fffc;border-color:#ffffff40}.chat-public-link svg{opacity:.6}.branding-row{display:flex;align-items:center;gap:12px;padding:10px 0;border-bottom:1px solid rgba(255,255,255,.06)}.branding-row:last-of-type{border-bottom:none;padding-bottom:0}.branding-label{width:120px;flex-shrink:0;font-size:13px;color:#fff9}.branding-color-pick{display:flex;align-items:center;gap:8px}.branding-color-pick input[type=color]{width:32px;height:32px;border:1px solid rgba(255,255,255,.15);border-radius:6px;padding:2px;background:transparent;cursor:pointer}.branding-color-hex-input{font-size:13px;font-family:var(--mono);color:#ffffffb3;background:#ffffff0f;border:1px solid rgba(255,255,255,.12);border-radius:6px;padding:4px 8px;width:90px;outline:none}.branding-color-hex-input:focus{border-color:#fff3}.branding-clear-btn{font-size:12px;color:#ffffff80;background:transparent;border:1px solid rgba(255,255,255,.1);border-radius:6px;padding:4px 10px;cursor:pointer;white-space:nowrap}.branding-clear-btn:hover{color:#fffc;border-color:#fff3}.branding-modal-close{position:absolute;top:16px;right:16px;background:none;border:none;color:#ffffff80;font-size:22px;cursor:pointer;padding:0 4px;line-height:1}.branding-modal-close:hover{color:#fff}.branding-logo-area{display:flex;align-items:center;gap:10px}.branding-logo-preview{width:40px;height:40px;object-fit:contain;border-radius:6px;border:1px solid rgba(255,255,255,.1);background:#0003}.branding-no-logo{font-size:13px;color:#ffffff59}.branding-upload-btn{font-size:12px;color:var(--accent);cursor:pointer;padding:4px 10px;border:1px solid rgba(255,255,255,.12);border-radius:6px;background:transparent}.branding-upload-btn:hover{border-color:#ffffff40}.branding-upload-btn.disabled{opacity:.5;pointer-events:none}.branding-remove-btn{font-size:12px;color:#ffffff80;background:transparent;border:1px solid rgba(255,255,255,.1);border-radius:6px;padding:4px 10px;cursor:pointer}.branding-remove-btn:hover{color:var(--danger);border-color:var(--danger-muted)}.branding-reset-btn{align-self:flex-start;font-size:12px;color:#ffffff80;background:transparent;border:1px solid rgba(255,255,255,.1);border-radius:6px;padding:5px 12px;cursor:pointer;margin-top:14px}.branding-reset-btn:hover{color:var(--danger);border-color:var(--danger-muted)}.sp-card-advanced{max-width:1060px;width:100%;text-align:left;margin:0;z-index:auto}.sp-card-advanced .table{overflow-x:auto}.sp-tabs{display:flex;gap:4px;margin-bottom:20px;border-bottom:1px solid rgba(255,255,255,.08);padding-bottom:12px}.sp-tab{padding:8px 16px;border:none;background:transparent;color:var(--tasker-muted-grey);font-size:14px;font-weight:500;cursor:pointer;border-radius:6px 6px 0 0;transition:color .15s ease,background .15s ease}.sp-tab:hover{color:var(--tasker-white);background:#ffffff0d}.sp-tab.active{color:var(--tasker-orange);border-bottom:2px solid var(--tasker-orange)}.setup-info-btn{background:transparent;border:1px solid rgba(255,255,255,.12);border-radius:50%;color:var(--tasker-muted-grey);width:22px;height:22px;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;transition:all .15s ease;flex-shrink:0;padding:0}.setup-info-btn:hover{background:#ffffff14;border-color:#ffffff40;color:var(--tasker-white)}.setup-info-btn svg{width:14px;height:14px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}.setup-info-btn.copied{color:#4ade80;border-color:#4ade8066}.setup-info-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background:#0009;z-index:100;display:flex;align-items:center;justify-content:center;padding:20px}.setup-info-card{background:linear-gradient(var(--brand-bg-card, transparent),var(--brand-bg-card, transparent)),var(--tasker-charcoal, #2d2d2d);border:1px solid rgba(255,255,255,.1);border-radius:12px;padding:24px;max-width:380px;width:100%;box-shadow:0 24px 80px #00000080}.setup-info-card h3{margin:0 0 16px;font-size:16px;font-weight:600;color:var(--tasker-white, #fff)}.setup-info-row{display:flex;justify-content:space-between;align-items:baseline;padding:8px 0;border-bottom:1px solid rgba(255,255,255,.06);gap:12px}.setup-info-row:last-of-type{border-bottom:none}.setup-info-label{font-size:13px;color:var(--tasker-muted-grey, #888);flex-shrink:0}.setup-info-value{font-size:13px;color:var(--tasker-white, #fff);text-align:right;overflow-wrap:break-word;word-break:break-word;min-width:0}@media(max-width:480px){.setup-card{padding:32px 24px}.setup-qr img{width:200px;height:200px}.setup-card h1{font-size:24px}.setup-steps{gap:10px}.setup-code-input{flex-direction:column}}.setup-container,.setup-page,.login-overlay,.setup-info-overlay{--ring: transparent;--focus-ring: none}.setup-container *:focus,.setup-container *:focus-visible,.setup-page *:focus,.setup-page *:focus-visible,.login-overlay *:focus,.login-overlay *:focus-visible,.setup-info-overlay *:focus,.setup-info-overlay *:focus-visible{outline:none!important;box-shadow:none!important}.login-overlay{position:fixed;top:0;right:0;bottom:0;left:0;z-index:10000;display:flex;align-items:center;justify-content:center;background:#111}.login-card{display:flex;flex-direction:column;align-items:center;padding:48px 40px;max-width:360px;width:100%}.login-logo{width:56px;height:56px;margin-bottom:16px}.login-title{color:#fff;font-size:22px;font-weight:600;margin:0 0 4px}.login-subtitle{color:#888;font-size:14px;margin:0 0 28px;text-align:center}.login-form{display:flex;flex-direction:column;gap:12px;width:100%}.login-pin-input{width:100%;padding:14px 16px;font-size:20px;letter-spacing:8px;text-align:center;background:#1a1a1a;border:1px solid #333333;border-radius:8px;color:#fff;outline:none;transition:border-color .2s;box-sizing:border-box}.login-pin-input:focus{border-color:#555}.login-pin-input::placeholder{font-size:14px;letter-spacing:normal;color:#555}.login-pin-wrapper{position:relative;width:100%}.login-pin-wrapper .login-pin-input{padding-right:44px}.login-pin-toggle{position:absolute;right:10px;top:50%;transform:translateY(-50%);background:none;border:none;cursor:pointer;padding:4px;color:#ffffff40;display:flex;align-items:center;justify-content:center;transition:color .15s}.login-pin-toggle svg{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}.login-pin-toggle:hover{color:#ffffff8c}.login-pin-toggle .pin-eye-hide{display:none}.login-pin-toggle.active{color:#ffffff8c}.login-pin-toggle.active .pin-eye-show{display:none}.login-pin-toggle.active .pin-eye-hide{display:flex}.login-error{color:#f44;font-size:13px;text-align:center;margin:0}.login-submit{width:100%;padding:14px;font-size:16px;font-weight:600;color:#000;background:var(--accent, #00d4ff);border:none;border-radius:8px;cursor:pointer;transition:opacity .2s}.login-submit:hover{opacity:.9}.login-submit:disabled{opacity:.5;cursor:not-allowed}.login-spinner{display:inline-block;width:18px;height:18px;border:2px solid rgba(0,0,0,.2);border-top-color:#000;border-radius:50%;animation:setup-spin .8s linear infinite;vertical-align:middle}.setup-button .login-spinner{border-color:#fff3;border-top-color:#fff}.login-account-select{width:100%;padding:12px 14px;font-size:15px;background:#1a1a1a;border:1px solid #333333;border-radius:8px;color:#fff;outline:none;cursor:pointer;-moz-appearance:none;appearance:none;-webkit-appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%23999'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 14px center;background-size:10px;transition:border-color .2s;box-sizing:border-box}.login-account-select:focus{border-color:#555}.login-account-select option{background:#1a1a1a;color:#fff}.login-success{color:#22c55e;font-size:13px;text-align:center;margin:0}.login-link{color:var(--accent, #00d4ff);text-decoration:none;cursor:pointer}.login-link:hover{text-decoration:underline}.login-hint{color:#666;font-size:12px;text-align:center;margin:20px 0 0;line-height:1.5}.setup-apikey-list{padding:8px 0 16px;display:flex;flex-direction:column;gap:12px;max-height:calc(100vh - 200px);overflow-y:auto;-webkit-overflow-scrolling:touch}.setup-apikey-row{display:flex;flex-direction:column;gap:6px;padding:10px 12px;background:#ffffff08;border-radius:6px}.setup-apikey-info{display:flex;align-items:center;gap:8px}.setup-apikey-info strong{font-size:.9rem;color:#fff}.setup-apikey-category{font-size:.75rem;color:var(--tasker-muted-grey);background:#ffffff0f;padding:2px 8px;border-radius:3px}.setup-apikey-input{display:flex;align-items:center;gap:6px}.setup-apikey-input input{flex:1;min-width:0;background:#0000004d;border:1px solid rgba(255,255,255,.1);border-radius:4px;color:#fff;font-size:.85rem;padding:6px 10px;outline:none}.setup-apikey-input input:focus{border-color:#fff3}.setup-apikey-input input::placeholder{color:#555}.setup-apikey-save{padding:6px 10px;font-size:.8rem;min-width:50px}.setup-apikey-badge{font-size:.75rem;padding:2px 8px;border-radius:3px;white-space:nowrap}.setup-apikey-badge.saving{color:var(--tasker-text-grey, #999)}.setup-apikey-badge.saved{color:#22c55e;background:#22c55e1a}.setup-apikey-badge.removed{color:#eab308;background:#eab3081a}.setup-apikey-icon-btn{background:none;border:none;cursor:pointer;padding:4px;color:#ffffff59;display:flex;align-items:center;justify-content:center;border-radius:4px;transition:color .15s}.setup-apikey-icon-btn svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}.setup-apikey-icon-btn:hover{color:#ffffffb3}.setup-apikey-icon-btn.active{color:var(--tasker-orange)}.setup-apikey-icon-btn.danger:hover{color:#ef4444}.setup-apikey-row.disabled{opacity:.45}.setup-apikey-row.disabled input{text-decoration:line-through;color:#666}.setup-apikey-badge.apikey-disabled{color:#888;background:#ffffff0f;font-size:.7rem}.setup-apikey-advanced{margin-top:4px;border-top:1px solid rgba(255,255,255,.06);padding-top:4px}.setup-apikey-advanced summary{cursor:pointer;font-size:12px;color:#ffffff73;padding:6px 0;-webkit-user-select:none;user-select:none}.setup-apikey-advanced summary:hover{color:#ffffffa6}.setup-update-progress{margin:12px 0 4px;padding:10px 12px;background:#ffffff08;border:1px solid rgba(255,255,255,.08);border-radius:8px;font-size:13px;line-height:1.5;max-height:300px;overflow-y:auto}.setup-update-step{display:flex;align-items:center;gap:8px;padding:2px 0;color:#ffffff80}.setup-update-step.done{color:#ffffffb3}.setup-update-step.failed{color:#ef4444}.setup-update-step.running{color:var(--tasker-white)}.setup-update-step-icon{width:16px;text-align:center;flex-shrink:0}.setup-update-icon-ok svg,.setup-update-icon-fail svg{width:14px;height:14px;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}.setup-update-icon-ok{color:#22c55e}.setup-update-icon-fail{color:#ef4444}.setup-update-result-icon{display:flex;justify-content:center;margin-bottom:8px}.setup-update-result-icon svg{width:40px;height:40px;fill:none;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round}.setup-update-result-icon.ok{color:#22c55e}.setup-update-result-icon.fail{color:#ef4444}.setup-update-spinner{display:inline-block;width:12px;height:12px;border:2px solid rgba(255,255,255,.2);border-top-color:var(--tasker-white);border-radius:50%;animation:spin .8s linear infinite}.setup-update-step-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.setup-update-step-time{color:#ffffff59;font-size:12px;flex-shrink:0}.setup-update-status{margin-top:6px;padding-top:6px;border-top:1px solid rgba(255,255,255,.06);color:#fff9;font-size:12px}@media(min-width:768px){.setup-card.setup-dashboard-wide{max-width:780px;border:none;box-shadow:none;background:transparent;padding:32px 0}.setup-card.setup-dashboard-wide.setup-success{border:none;box-shadow:none}.setup-card.setup-dashboard-wide .setup-status-dashboard{display:grid;grid-template-columns:1fr 1fr;align-items:start;gap:10px;background:transparent;border:none;padding:0}.setup-card.setup-dashboard-wide .setup-status-item{border:1px solid rgba(255,255,255,.08);border-radius:10px;padding:14px 16px}}.public-chat-page{padding:0}.public-chat-header{display:flex;align-items:center;gap:10px;padding:12px 20px;background:#ffffff0a;border-bottom:1px solid rgba(255,255,255,.08);width:100%;box-sizing:border-box}.public-chat-header__avatar{width:32px;height:32px;border-radius:50%;object-fit:cover}.public-chat-header__name{font-size:15px;font-weight:600;color:var(--tasker-white, #ffffff)}.public-chat-page .chat-viewport{padding:0;max-width:100%}.public-chat-page .chat-split-container,.public-chat-page .chat-main{min-width:0}.public-chat-page .chat-thread{margin-left:0;margin-right:0;padding:12px 10px}.public-chat-page .chat-group{margin-left:6px;margin-right:6px}.public-chat-page .chat-copy-btn{display:none}.public-chat-page .chat-compose{padding:8px 8px 10px}.public-chat-page .chat-compose__row{flex-wrap:wrap;gap:0;border:1px solid var(--border);border-radius:16px;background:var(--card);padding:0 0 4px;align-items:center}.public-chat-page .chat-compose__row:has(textarea:focus){border-color:#fff3}.public-chat-page .chat-compose__field{flex:1 1 100%;order:-1}.public-chat-page .chat-compose__field textarea,.public-chat-page .chat-compose .chat-compose__field textarea,.public-chat-page .field.chat-compose__field textarea{border:none;background:transparent;border-radius:0;box-shadow:none;min-height:40px;height:40px;padding:10px 14px}.public-chat-page .chat-compose__field textarea:focus,.public-chat-page .chat-compose__field textarea:focus-visible,.public-chat-page .chat-compose .chat-compose__field textarea:focus,.public-chat-page .field.chat-compose__field textarea:focus{border:none;box-shadow:none;outline:none}.public-chat-page .chat-compose__emoji{order:0;margin-left:8px}.public-chat-page .chat-compose__attach{order:1}.public-chat-page .chat-compose__emoji,.public-chat-page .chat-compose__attach{width:28px;min-width:28px;height:28px;min-height:28px;padding:0}.public-chat-page .chat-compose__emoji svg,.public-chat-page .chat-compose__attach svg{width:18px;height:18px}.public-chat-page .chat-compose__send{order:10;width:32px;min-width:32px;height:32px;min-height:32px;margin-right:6px}.public-chat-page .chat-compose__send.primary{margin-left:auto}.public-chat-page .chat-compose__send:not(.primary){margin-left:auto}.public-chat-page .chat-compose__send:not(.primary)~.chat-compose__send.primary{display:none}.public-auth{display:flex;flex-direction:column;align-items:center;max-width:380px;width:100%;padding:40px 24px;text-align:center}.public-auth__avatar{width:64px;height:64px;border-radius:50%;object-fit:cover;margin-bottom:16px}.public-auth__title{font-size:22px;font-weight:600;color:var(--tasker-white, #ffffff);margin:0 0 8px}.public-auth__subtitle{font-size:14px;color:#ffffff8c;margin:0 0 24px;line-height:1.5}.public-auth__form{width:100%;display:flex;flex-direction:column;gap:12px}.public-auth__field{text-align:left}.public-auth__field span{display:block;font-size:12px;color:#ffffff80;margin-bottom:4px}.public-auth__field input{width:100%;padding:10px 12px;font-size:15px;background:#ffffff0f;border:1px solid rgba(255,255,255,.12);border-radius:8px;color:#fff;outline:none;box-sizing:border-box;transition:border-color .15s}.public-auth__field input:focus{border-color:#fff3}.public-auth__field input::placeholder{color:#ffffff4d}.public-auth__error{font-size:13px;color:#ef4444;text-align:left}.public-auth__btn{width:100%;padding:12px;font-size:15px;border-radius:8px;cursor:pointer}.public-auth__btn--link{background:none;border:none;color:#ffffff80;font-size:13px;padding:8px}.public-auth__btn--link:hover{color:#fffc}.public-auth__choices{width:100%;display:flex;flex-direction:column;gap:10px}.public-auth__hint{font-size:12px;color:#fff6;margin:16px 0 0;line-height:1.5}.tailscale-progress-bar{width:100%;height:6px;background:#ffffff14;border-radius:3px;overflow:hidden}.tailscale-progress-fill{height:100%;background:var(--tasker-orange, #00d4ff);border-radius:3px;transition:width .5s ease-out}.tailscale-pulse{animation:tailscale-pulse 2s ease-in-out infinite}@keyframes tailscale-pulse{0%,to{opacity:.6}50%{opacity:1}}.contacts-search{display:flex;gap:12px;align-items:stretch}.contacts-search input{flex:1;padding:10px 14px;font-size:14px;border-radius:8px;border:1px solid rgba(255,255,255,.15);background:#0000004d;color:var(--tasker-white);font-family:inherit}.contacts-search input::placeholder{color:#ffffff59}.contacts-record{border:1px solid rgba(255,255,255,.08);border-radius:8px;margin-bottom:8px;overflow:hidden}.contacts-record-header{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;cursor:pointer;transition:background .15s}.contacts-record-header:hover{background:#ffffff0a}.contacts-record-info{min-width:0;overflow:hidden}.contacts-record-name{font-weight:600;color:var(--tasker-white);font-size:14px}.contacts-record-phone{font-size:13px;color:#ffffff80;margin-left:8px}.contacts-record-meta{font-size:12px;color:#ffffff59}.contacts-record-fields{padding:0 16px 16px;border-top:1px solid rgba(255,255,255,.06)}.contacts-field-row{display:flex;gap:8px;align-items:center;margin-top:8px}.contacts-field-row input{padding:8px 12px;font-size:13px;border-radius:6px;border:1px solid rgba(255,255,255,.12);background:#0000004d;color:var(--tasker-white);font-family:inherit}.contacts-field-row .field-key{width:140px;flex-shrink:0}.contacts-field-row .field-value{flex:1}.contacts-field-row .field-delete{padding:6px 10px;font-size:12px;flex-shrink:0}.contacts-record-actions{display:flex;gap:8px;margin-top:12px;padding-top:12px;border-top:1px solid rgba(255,255,255,.06)}.contacts-add-form{display:flex;flex-direction:column;gap:12px;padding:16px;background:#0003;border-radius:8px;margin-top:16px}.contacts-add-form input{padding:10px 14px;font-size:14px;border-radius:8px;border:1px solid rgba(255,255,255,.15);background:#0000004d;color:var(--tasker-white);font-family:inherit}.contacts-add-form input::placeholder{color:#ffffff59}.contacts-add-form-buttons{display:flex;gap:8px}.contacts-empty{text-align:center;color:#fff6;padding:32px 16px;font-size:14px}.contacts-modal-record-preview{display:flex;align-items:baseline;gap:8px;padding:12px 14px;background:#00000040;border-radius:8px;margin-bottom:20px}.contacts-modal-actions{display:flex;justify-content:flex-end;gap:8px;margin-top:20px}.contacts-modal-actions .setup-button{padding:10px 20px;font-size:14px}.contacts-modal-form{display:flex;flex-direction:column;gap:14px}.contacts-modal-label{display:flex;flex-direction:column;gap:6px;font-size:13px;color:#fff9}.contacts-modal-label input{padding:10px 14px;font-size:14px;border-radius:8px;border:1px solid rgba(255,255,255,.15);background:#0000004d;color:var(--tasker-white);font-family:inherit}.contacts-modal-label input::placeholder{color:#ffffff59}@media(max-width:520px){.contacts-record-header{flex-direction:column;align-items:flex-start;gap:4px;padding:10px 12px}.contacts-record-phone{margin-left:0;font-size:12px}.contacts-record-meta{font-size:11px}.contacts-field-row{flex-wrap:wrap}.contacts-field-row .field-key{width:100%;flex-shrink:1}.contacts-field-row .field-value{flex:1;min-width:0}.contacts-record-fields{padding:0 12px 12px}.contacts-record-actions{flex-wrap:wrap}.contacts-search{flex-direction:column}.sp-toolbar{flex-wrap:wrap}}
|
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
<title>Taskmaster Control</title>
|
|
7
7
|
<meta name="color-scheme" content="dark light" />
|
|
8
8
|
<link rel="icon" type="image/png" href="./favicon.png" />
|
|
9
|
-
<script type="module" crossorigin src="./assets/index-
|
|
10
|
-
<link rel="stylesheet" crossorigin href="./assets/index-
|
|
9
|
+
<script type="module" crossorigin src="./assets/index-BErknDpG.js"></script>
|
|
10
|
+
<link rel="stylesheet" crossorigin href="./assets/index-C7ieCeTV.css">
|
|
11
11
|
</head>
|
|
12
12
|
<body>
|
|
13
13
|
<taskmaster-app></taskmaster-app>
|
|
@@ -44,6 +44,9 @@ export const SkillsUpdateParamsSchema = Type.Object({
|
|
|
44
44
|
enabled: Type.Optional(Type.Boolean()),
|
|
45
45
|
apiKey: Type.Optional(Type.String()),
|
|
46
46
|
env: Type.Optional(Type.Record(NonEmptyString, Type.String())),
|
|
47
|
+
agents: Type.Optional(Type.Array(Type.Union([Type.Literal("admin"), Type.Literal("public")]), {
|
|
48
|
+
minItems: 1,
|
|
49
|
+
})),
|
|
47
50
|
}, { additionalProperties: false });
|
|
48
51
|
export const SkillsReadParamsSchema = Type.Object({
|
|
49
52
|
name: NonEmptyString,
|
|
@@ -10,6 +10,8 @@ export const LogsTailParamsSchema = Type.Object({
|
|
|
10
10
|
Type.Literal("warn"),
|
|
11
11
|
Type.Literal("info"),
|
|
12
12
|
])),
|
|
13
|
+
/** YYYY-MM-DD date to view historical logs. Omit for today's logs. */
|
|
14
|
+
date: Type.Optional(Type.String({ pattern: "^\\d{4}-\\d{2}-\\d{2}$" })),
|
|
13
15
|
/** PIN access session token. Required when the device has a master PIN and the caller is the control UI. */
|
|
14
16
|
accessToken: Type.Optional(Type.String()),
|
|
15
17
|
}, { additionalProperties: false });
|
|
@@ -20,6 +22,8 @@ export const LogsTailResultSchema = Type.Object({
|
|
|
20
22
|
lines: Type.Array(Type.String()),
|
|
21
23
|
truncated: Type.Optional(Type.Boolean()),
|
|
22
24
|
reset: Type.Optional(Type.Boolean()),
|
|
25
|
+
/** Available log dates (YYYY-MM-DD), most recent first. */
|
|
26
|
+
availableDates: Type.Optional(Type.Array(Type.String())),
|
|
23
27
|
}, { additionalProperties: false });
|
|
24
28
|
// WebChat/WebSocket-native chat methods
|
|
25
29
|
export const ChatHistoryParamsSchema = Type.Object({
|
|
@@ -14,6 +14,8 @@ const EVENT_SCOPE_GUARDS = {
|
|
|
14
14
|
"device.pair.resolved": [PAIRING_SCOPE],
|
|
15
15
|
"node.pair.requested": [PAIRING_SCOPE],
|
|
16
16
|
"node.pair.resolved": [PAIRING_SCOPE],
|
|
17
|
+
// Infrastructure alerts (model fallbacks, rate limits, etc.) are admin-only.
|
|
18
|
+
notification: [ADMIN_SCOPE],
|
|
17
19
|
};
|
|
18
20
|
function hasEventScope(client, event) {
|
|
19
21
|
const required = EVENT_SCOPE_GUARDS[event];
|
|
@@ -123,6 +123,21 @@ async function readLogSlice(params) {
|
|
|
123
123
|
await handle.close();
|
|
124
124
|
}
|
|
125
125
|
}
|
|
126
|
+
const DATE_EXTRACT_RE = /^taskmaster-(\d{4}-\d{2}-\d{2})\.log$/;
|
|
127
|
+
async function listAvailableLogDates(dir) {
|
|
128
|
+
const entries = await fs.readdir(dir, { withFileTypes: true }).catch(() => null);
|
|
129
|
+
if (!entries)
|
|
130
|
+
return [];
|
|
131
|
+
const dates = [];
|
|
132
|
+
for (const entry of entries) {
|
|
133
|
+
if (!entry.isFile())
|
|
134
|
+
continue;
|
|
135
|
+
const match = entry.name.match(DATE_EXTRACT_RE);
|
|
136
|
+
if (match)
|
|
137
|
+
dates.push(match[1]);
|
|
138
|
+
}
|
|
139
|
+
return dates.sort().reverse(); // most recent first
|
|
140
|
+
}
|
|
126
141
|
export const logsHandlers = {
|
|
127
142
|
"logs.tail": async ({ params, client, respond }) => {
|
|
128
143
|
if (!validateLogsTailParams(params)) {
|
|
@@ -143,8 +158,12 @@ export const logsHandlers = {
|
|
|
143
158
|
}
|
|
144
159
|
}
|
|
145
160
|
const configuredFile = getResolvedLoggerSettings().file;
|
|
161
|
+
const logDir = path.dirname(configuredFile);
|
|
146
162
|
try {
|
|
147
|
-
|
|
163
|
+
// When a specific date is requested, resolve to that day's rolling log file.
|
|
164
|
+
const file = p.date
|
|
165
|
+
? path.join(logDir, `taskmaster-${p.date}.log`)
|
|
166
|
+
: await resolveLogFile(configuredFile);
|
|
148
167
|
const result = await readLogSlice({
|
|
149
168
|
file,
|
|
150
169
|
cursor: p.cursor,
|
|
@@ -165,7 +184,8 @@ export const logsHandlers = {
|
|
|
165
184
|
return levelNum <= minLevelNum;
|
|
166
185
|
})
|
|
167
186
|
: result.lines;
|
|
168
|
-
|
|
187
|
+
const availableDates = await listAvailableLogDates(logDir);
|
|
188
|
+
respond(true, { file, ...result, lines: filteredLines, availableDates }, undefined);
|
|
169
189
|
}
|
|
170
190
|
catch (err) {
|
|
171
191
|
respond(false, undefined, errorShape(ErrorCodes.UNAVAILABLE, `log read failed: ${String(err)}`));
|
|
@@ -119,6 +119,10 @@ export const skillsHandlers = {
|
|
|
119
119
|
respond(false, undefined, errorShape(ErrorCodes.INVALID_REQUEST, "preloaded skills cannot be disabled"));
|
|
120
120
|
return;
|
|
121
121
|
}
|
|
122
|
+
if (p.agents && isPreloadedSkill(p.skillKey)) {
|
|
123
|
+
respond(false, undefined, errorShape(ErrorCodes.INVALID_REQUEST, "agent access for preloaded skills cannot be changed"));
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
122
126
|
const cfg = loadConfig();
|
|
123
127
|
const skills = cfg.skills ? { ...cfg.skills } : {};
|
|
124
128
|
const entries = skills.entries ? { ...skills.entries } : {};
|
|
@@ -147,6 +151,9 @@ export const skillsHandlers = {
|
|
|
147
151
|
}
|
|
148
152
|
current.env = nextEnv;
|
|
149
153
|
}
|
|
154
|
+
if (Array.isArray(p.agents)) {
|
|
155
|
+
current.agents = p.agents;
|
|
156
|
+
}
|
|
150
157
|
entries[p.skillKey] = current;
|
|
151
158
|
skills.entries = entries;
|
|
152
159
|
const nextConfig = {
|
package/dist/logging/logger.js
CHANGED
|
@@ -77,11 +77,16 @@ function buildLogger(settings) {
|
|
|
77
77
|
minLevel: levelToMinLevel(settings.level),
|
|
78
78
|
type: "hidden", // no ansi formatting
|
|
79
79
|
});
|
|
80
|
+
// For rolling logs, resolve the file path on each write so that date
|
|
81
|
+
// rollover targets today's file — even for child loggers cached by
|
|
82
|
+
// subsystem loggers that outlive a parent logger rebuild.
|
|
83
|
+
const fixedFile = isRollingPath(settings.file) ? null : settings.file;
|
|
80
84
|
logger.attachTransport((logObj) => {
|
|
81
85
|
try {
|
|
86
|
+
const file = fixedFile ?? defaultRollingPathForToday();
|
|
82
87
|
const time = logObj.date?.toISOString?.() ?? new Date().toISOString();
|
|
83
88
|
const line = JSON.stringify({ ...logObj, time });
|
|
84
|
-
fs.appendFileSync(
|
|
89
|
+
fs.appendFileSync(file, `${line}\n`, { encoding: "utf8" });
|
|
85
90
|
}
|
|
86
91
|
catch {
|
|
87
92
|
// never block on logging failures
|
|
@@ -169,16 +169,22 @@ export async function monitorWebChannel(verbose, listenerFactory = monitorWebInb
|
|
|
169
169
|
// of letting the error escape the loop and kill the channel permanently.
|
|
170
170
|
const statusCode = getStatusCode(setupErr) ?? "unknown";
|
|
171
171
|
const errorStr = formatError(setupErr);
|
|
172
|
-
|
|
172
|
+
// A "conflict" stream error (another WhatsApp Web session took over) can
|
|
173
|
+
// carry status 401, but it is NOT a true logout — credentials remain valid.
|
|
174
|
+
const isConflict = /conflict/i.test(errorStr);
|
|
175
|
+
const loggedOut = statusCode === 401 && !isConflict;
|
|
176
|
+
const userError = isConflict
|
|
177
|
+
? "WhatsApp was opened on another device or browser. Reconnecting automatically…"
|
|
178
|
+
: errorStr;
|
|
173
179
|
status.connected = false;
|
|
174
180
|
status.lastEventAt = Date.now();
|
|
175
181
|
status.lastDisconnect = {
|
|
176
182
|
at: status.lastEventAt,
|
|
177
183
|
status: typeof statusCode === "number" ? statusCode : undefined,
|
|
178
|
-
error:
|
|
184
|
+
error: userError,
|
|
179
185
|
loggedOut,
|
|
180
186
|
};
|
|
181
|
-
status.lastError =
|
|
187
|
+
status.lastError = userError;
|
|
182
188
|
status.reconnectAttempts = reconnectAttempts;
|
|
183
189
|
emitStatus();
|
|
184
190
|
reconnectLogger.info({ connectionId, status: statusCode, loggedOut, reconnectAttempts, error: errorStr }, "web reconnect: connection setup failed");
|
|
@@ -349,15 +355,19 @@ export async function monitorWebChannel(verbose, listenerFactory = monitorWebInb
|
|
|
349
355
|
"isLoggedOut" in reason &&
|
|
350
356
|
reason.isLoggedOut;
|
|
351
357
|
const errorStr = formatError(reason);
|
|
358
|
+
const isConflict = /conflict/i.test(errorStr);
|
|
359
|
+
const userError = isConflict
|
|
360
|
+
? "WhatsApp was opened on another device or browser. Reconnecting automatically…"
|
|
361
|
+
: errorStr;
|
|
352
362
|
status.connected = false;
|
|
353
363
|
status.lastEventAt = Date.now();
|
|
354
364
|
status.lastDisconnect = {
|
|
355
365
|
at: status.lastEventAt,
|
|
356
366
|
status: typeof statusCode === "number" ? statusCode : undefined,
|
|
357
|
-
error:
|
|
367
|
+
error: userError,
|
|
358
368
|
loggedOut: Boolean(loggedOut),
|
|
359
369
|
};
|
|
360
|
-
status.lastError =
|
|
370
|
+
status.lastError = userError;
|
|
361
371
|
status.reconnectAttempts = reconnectAttempts;
|
|
362
372
|
emitStatus();
|
|
363
373
|
reconnectLogger.info({
|
|
@@ -349,9 +349,15 @@ export async function monitorWebInbox(options) {
|
|
|
349
349
|
}, "connection.update");
|
|
350
350
|
if (update.connection === "close") {
|
|
351
351
|
const status = getStatusCode(update.lastDisconnect?.error);
|
|
352
|
+
// A "conflict" stream error means another WhatsApp Web session took
|
|
353
|
+
// over — credentials are still valid so this is NOT a logout, even
|
|
354
|
+
// when the server sends status 401. Baileys constructs the Boom
|
|
355
|
+
// message as "Stream Errored (conflict)".
|
|
356
|
+
const errorMsg = String(update.lastDisconnect?.error?.message ?? "");
|
|
357
|
+
const isConflict = /conflict/i.test(errorMsg);
|
|
352
358
|
resolveClose({
|
|
353
359
|
status,
|
|
354
|
-
isLoggedOut: status === DisconnectReason.loggedOut,
|
|
360
|
+
isLoggedOut: status === DisconnectReason.loggedOut && !isConflict,
|
|
355
361
|
error: update.lastDisconnect?.error,
|
|
356
362
|
});
|
|
357
363
|
}
|
package/package.json
CHANGED
package/scripts/install.sh
CHANGED
|
@@ -189,6 +189,31 @@ if [ "$PLATFORM" = "linux" ]; then
|
|
|
189
189
|
as_root systemctl restart avahi-daemon 2>/dev/null || true
|
|
190
190
|
echo " mDNS: ${TM_HOSTNAME}.local ready"
|
|
191
191
|
|
|
192
|
+
# mDNS watchdog — restarts avahi if it silently stops responding after Wi-Fi reconnection
|
|
193
|
+
as_root tee /etc/systemd/system/avahi-watchdog.service > /dev/null << 'WATCHSVC'
|
|
194
|
+
[Unit]
|
|
195
|
+
Description=Restart avahi if mDNS is unresponsive
|
|
196
|
+
|
|
197
|
+
[Service]
|
|
198
|
+
Type=oneshot
|
|
199
|
+
ExecCondition=/bin/sh -c '! avahi-resolve -n $(hostname).local -4 >/dev/null 2>&1'
|
|
200
|
+
ExecStart=/bin/systemctl restart avahi-daemon
|
|
201
|
+
WATCHSVC
|
|
202
|
+
as_root tee /etc/systemd/system/avahi-watchdog.timer > /dev/null << 'WATCHTMR'
|
|
203
|
+
[Unit]
|
|
204
|
+
Description=Check avahi mDNS health every 5 minutes
|
|
205
|
+
|
|
206
|
+
[Timer]
|
|
207
|
+
OnBootSec=2min
|
|
208
|
+
OnUnitActiveSec=5min
|
|
209
|
+
|
|
210
|
+
[Install]
|
|
211
|
+
WantedBy=timers.target
|
|
212
|
+
WATCHTMR
|
|
213
|
+
as_root systemctl daemon-reload
|
|
214
|
+
as_root systemctl enable --now avahi-watchdog.timer 2>/dev/null || true
|
|
215
|
+
echo " mDNS watchdog enabled"
|
|
216
|
+
|
|
192
217
|
# Tailscale (for optional internet access via Funnel)
|
|
193
218
|
if ! command -v tailscale >/dev/null 2>&1; then
|
|
194
219
|
curl -fsSL https://tailscale.com/install.sh | as_root sh >/dev/null 2>&1 \
|
|
@@ -961,7 +961,7 @@ Tap the delete icon on a user skill's card. You will be asked to confirm before
|
|
|
961
961
|
|
|
962
962
|
#### Skill Packs (Licensed Skills)
|
|
963
963
|
|
|
964
|
-
Your Taskmaster provider can send you additional skills as **skill packs** — signed files that install licensed capabilities onto your device. These are skills built specifically for your business or industry.
|
|
964
|
+
Your Taskmaster provider can send you additional skills as **skill packs** — signed files that install licensed capabilities onto your device. These are skills built specifically for your business or industry. A pack can contain a single skill or a **bundle** of multiple related skills (e.g. all the skills needed for estate agency work).
|
|
965
965
|
|
|
966
966
|
**How to install a skill pack:**
|
|
967
967
|
|
|
@@ -970,7 +970,9 @@ Your Taskmaster provider can send you additional skills as **skill packs** — s
|
|
|
970
970
|
3. Ask your assistant to install it — for example: "Please install this skill pack"
|
|
971
971
|
4. The assistant verifies the file is genuine and licensed for your device, then installs it
|
|
972
972
|
|
|
973
|
-
Once installed,
|
|
973
|
+
Once installed, each skill appears in the Skills tab with a **Licensed** badge. Bundles install all their skills in one step — you only forward one file.
|
|
974
|
+
|
|
975
|
+
**Sharing your Device ID:** Your provider needs your device ID to create a skill pack for your device. Find it on the **Setup** page → **License** card → tap the info icon → copy the **Device ID** using the copy button. Alternatively, ask your admin assistant: "What's my device ID?"
|
|
974
976
|
|
|
975
977
|
**Updating a skill pack:** Your provider sends you a new version of the file. Follow the same steps — forwarding and asking your assistant to install. The new version replaces the old one automatically.
|
|
976
978
|
|
|
@@ -1139,6 +1141,12 @@ If your control panel URL suddenly stops working and you notice the hostname has
|
|
|
1139
1141
|
|
|
1140
1142
|
**To avoid this in future:** Connect via WiFi first, then remove the Ethernet cable — don't unplug Ethernet while the Pi is running with both cables connected.
|
|
1141
1143
|
|
|
1144
|
+
#### `.local` address stops working (but IP still works)
|
|
1145
|
+
|
|
1146
|
+
If you can reach your device by IP address (e.g. `http://192.168.88.11:18789`) but the `.local` address has stopped resolving, the mDNS service (Avahi) on the Pi has likely lost its network registration. This can happen after a Wi-Fi reconnection — the service is still running but has stopped responding to name lookups.
|
|
1147
|
+
|
|
1148
|
+
Taskmaster includes an mDNS watchdog that detects this and restarts the service automatically every 5 minutes. If your device is on v1.22 or later, this should self-heal within a few minutes. If it doesn't, reboot the device — the watchdog will be active after the reboot.
|
|
1149
|
+
|
|
1142
1150
|
### Static IP Address
|
|
1143
1151
|
|
|
1144
1152
|
You don't need to assign a static IP address — Taskmaster uses a `.local` hostname that resolves automatically via mDNS, even if the IP changes after a reboot or DHCP renewal. You'll always find your control panel at the same `.local` address.
|