@polderlabs/bizar 5.4.0 → 5.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/bizar-dash/dist/assets/{EnvVarsSection-DqvB8ZcJ.js → EnvVarsSection-DhLHZ5ua.js} +1 -1
  2. package/bizar-dash/dist/assets/{EnvVarsSection-DqvB8ZcJ.js.map → EnvVarsSection-DhLHZ5ua.js.map} +1 -1
  3. package/bizar-dash/dist/assets/{MobileChat-DRXP2ERQ.js → MobileChat-9UpvDP6-.js} +1 -1
  4. package/bizar-dash/dist/assets/{MobileChat-DRXP2ERQ.js.map → MobileChat-9UpvDP6-.js.map} +1 -1
  5. package/bizar-dash/dist/assets/{MobileSettings-CVW9VhEo.js → MobileSettings-BFmN9ZWR.js} +1 -1
  6. package/bizar-dash/dist/assets/{MobileSettings-CVW9VhEo.js.map → MobileSettings-BFmN9ZWR.js.map} +1 -1
  7. package/bizar-dash/dist/assets/{Toast-CcZVVN4i.js → Toast-BlcKl_dN.js} +1 -1
  8. package/bizar-dash/dist/assets/{Toast-CcZVVN4i.js.map → Toast-BlcKl_dN.js.map} +1 -1
  9. package/bizar-dash/dist/assets/{icons-OMEGx5KA.js → icons-CMPxNV8t.js} +124 -129
  10. package/bizar-dash/dist/assets/icons-CMPxNV8t.js.map +1 -0
  11. package/bizar-dash/dist/assets/{main-CMAGZouj.js → main-Dhrvp9Gt.js} +1 -1
  12. package/bizar-dash/dist/assets/{main-CMAGZouj.js.map → main-Dhrvp9Gt.js.map} +1 -1
  13. package/bizar-dash/dist/assets/mobile-DDY1lquG.js +1 -0
  14. package/bizar-dash/dist/assets/{mobile-XN2P7YfM.js.map → mobile-DDY1lquG.js.map} +1 -1
  15. package/bizar-dash/dist/assets/mobile-layout-BjkoHh1W.js +2 -0
  16. package/bizar-dash/dist/assets/mobile-layout-BjkoHh1W.js.map +1 -0
  17. package/bizar-dash/dist/assets/{mobile-layout-D6V-7WnA.css → mobile-layout-CJnZNLy3.css} +1 -1
  18. package/bizar-dash/dist/assets/{useSlashCommands-iyoW95UB.js → useSlashCommands-eFCiWHVt.js} +2 -2
  19. package/bizar-dash/dist/assets/{useSlashCommands-iyoW95UB.js.map → useSlashCommands-eFCiWHVt.js.map} +1 -1
  20. package/bizar-dash/dist/index.html +7 -7
  21. package/bizar-dash/dist/mobile.html +4 -4
  22. package/bizar-dash/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
  23. package/bizar-dash/src/web/MobileApp.tsx +1 -10
  24. package/bizar-dash/src/web/styles/mobile-layout.css +7 -5
  25. package/bizar-dash/src/web/styles/settings.css +46 -0
  26. package/bizar-dash/tests/mobile-layout.test.tsx +36 -0
  27. package/package.json +1 -1
  28. package/bizar-dash/dist/assets/icons-OMEGx5KA.js.map +0 -1
  29. package/bizar-dash/dist/assets/mobile-XN2P7YfM.js +0 -1
  30. package/bizar-dash/dist/assets/mobile-layout-DqTxvXZp.js +0 -2
  31. package/bizar-dash/dist/assets/mobile-layout-DqTxvXZp.js.map +0 -1
@@ -1 +1 @@
1
- @media (max-width: 480px){.chat-composer-wrap{padding:.375rem .375rem .5rem}.chat-welcome-h1{font-size:1.875rem}}:root{--bg: #0b0e14;--bg-elev: #12161f;--bg-elev-2: #1a1f2b;--bg-elev-3: #232a39;--surface: var(--bg-elev);--surface-2: var(--bg-elev-2);--border: #232a39;--border-strong: #2d3648;--text: #c9d1d9;--text-muted: #6e7681;--text-dim: #484f58;--text-strong: #f0f6fc;--accent: #8b5cf6;--accent-bg: rgba(139, 92, 246, .12);--accent-border: rgba(139, 92, 246, .4);--accent-2: #a78bfa;--success: #3fb950;--warning: #d29922;--error: #f85149;--info: #58a6ff;--font-sans: "Inter var", "Inter", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;--font-mono: "JetBrains Mono", "Fira Code", ui-monospace, monospace;--mobile-tap-target: 44px;--mobile-nav-height: 56px;--mobile-topbar-height: 48px;--mobile-padding: 16px;--mobile-font-base: 16px}*,*:before,*:after{box-sizing:border-box;-webkit-tap-highlight-color:transparent;-webkit-touch-callout:none;touch-action:manipulation}html,body{margin:0;padding:0;height:100%;overflow:hidden}body{font-family:var(--font-sans);font-size:var(--mobile-font-base);line-height:1.5;background:var(--bg);color:var(--text);-webkit-font-smoothing:antialiased;overscroll-behavior:none}button,[role=button],a,input,select,textarea{touch-action:manipulation}input,textarea,select{user-select:text;-webkit-user-select:text;font-size:var(--mobile-font-base)}a{color:var(--accent);text-decoration:none}code,.mono{font-family:var(--font-mono)}.mobile-app{display:flex;flex-direction:column;height:100vh;height:100dvh;background:var(--bg);color:var(--text);font-family:var(--font-sans);padding-top:env(safe-area-inset-top,0);padding-bottom:env(safe-area-inset-bottom,0);overscroll-behavior:none}.mobile-topbar{height:var(--mobile-topbar-height);flex-shrink:0;display:flex;align-items:center;justify-content:space-between;padding:0 var(--mobile-padding);background:var(--surface);border-bottom:1px solid var(--border);position:sticky;top:0;z-index:10}.mobile-topbar-left{display:flex;align-items:center;gap:8px}.mobile-logo{font-size:20px;line-height:1}.mobile-title{font-size:16px;font-weight:600;color:var(--text-strong)}.mobile-topbar-right{display:flex;align-items:center;gap:4px}.mobile-icon-btn{width:var(--mobile-tap-target);height:var(--mobile-tap-target);min-width:var(--mobile-tap-target);min-height:var(--mobile-tap-target);display:flex;align-items:center;justify-content:center;background:transparent;border:none;border-radius:8px;color:var(--text-muted);cursor:pointer;transition:background .12s ease,color .12s ease;padding:0}.mobile-icon-btn:hover{background:var(--bg-elev-2);color:var(--text)}.mobile-icon-btn:active{background:var(--bg-elev-3)}.mobile-icon-btn-danger{color:var(--error)}.mobile-content{flex:1;overflow-y:auto;overflow-x:hidden;-webkit-overflow-scrolling:touch;padding:var(--mobile-padding);padding-bottom:calc(var(--mobile-nav-height) + var(--mobile-padding) + env(safe-area-inset-bottom,0))}.mobile-view{max-width:100%;min-width:0}.mobile-view-footer{padding:24px 0;text-align:center}.mobile-bottom-nav{position:fixed;bottom:0;left:0;right:0;height:calc(var(--mobile-nav-height) + env(safe-area-inset-bottom,0));background:var(--surface);border-top:1px solid var(--border);display:flex;align-items:stretch;padding-bottom:env(safe-area-inset-bottom,0);z-index:50}.mobile-nav-btn{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;background:transparent;border:none;color:var(--text-muted);cursor:pointer;min-height:var(--mobile-tap-target);padding:8px 4px;transition:color .12s ease}.mobile-nav-btn-active{color:var(--accent)}.mobile-nav-label{font-size:10px;font-weight:500}.mobile-loading{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100vh;height:100dvh;gap:12px;color:var(--text-muted)}.mobile-stats{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-bottom:20px}.mobile-stat{background:var(--surface);border:1px solid var(--border);border-radius:12px;padding:16px;text-align:center}.mobile-stat-value{font-size:28px;font-weight:700;color:var(--accent);line-height:1}.mobile-stat-label{font-size:12px;color:var(--text-muted);margin-top:4px}.mobile-section{margin-bottom:20px}.mobile-section-title{font-size:12px;font-weight:600;color:var(--text-muted);text-transform:uppercase;letter-spacing:.05em;margin:0 0 8px;display:flex;align-items:center;gap:6px}.mobile-card{background:var(--surface);border:1px solid var(--border);border-radius:12px;padding:14px;margin-bottom:12px}.mobile-card-list{display:flex;flex-direction:column;gap:6px}.mobile-agent-card{display:flex;align-items:center;gap:10px;padding:12px;background:var(--surface);border:1px solid var(--border);border-radius:10px}.mobile-agent-dot{width:8px;height:8px;border-radius:50%;background:var(--text-dim);flex-shrink:0}.mobile-agent-dot[data-status=working],.mobile-agent-dot[data-status=doing]{background:var(--success);animation:pulse-dot 1.6s ease-in-out infinite}.mobile-agent-dot[data-status=error],.mobile-agent-dot[data-status=stuck]{background:var(--error)}.mobile-agent-dot[data-status=idle]{background:var(--text-dim)}@keyframes pulse-dot{0%,to{opacity:1}50%{opacity:.4}}.mobile-agent-info{flex:1;min-width:0}.mobile-agent-name{font-size:14px;font-weight:500;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden;white-space:normal;overflow-wrap:anywhere}.mobile-agent-meta{font-size:12px;color:var(--text-muted);display:block;overflow-wrap:anywhere}.mobile-task-card{width:100%;padding:12px;background:var(--surface);border:1px solid var(--border);border-radius:10px;display:flex;align-items:center;gap:10px;text-align:left}.mobile-task-actions{display:flex;gap:2px;flex-shrink:0}.priority-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}.task-content{flex:1;min-width:0}.task-title{font-size:14px;font-weight:500;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden;white-space:normal;overflow-wrap:anywhere}.task-meta{font-size:12px;color:var(--text-muted);display:block;overflow-wrap:anywhere}.mobile-tasks-toolbar{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-bottom:16px}.mobile-search-input{flex:1;height:var(--mobile-tap-target);padding:0 14px;background:var(--surface);border:1px solid var(--border);border-radius:22px;color:var(--text);font-family:inherit;font-size:var(--mobile-font-base);outline:none}.mobile-search-input:focus{border-color:var(--accent)}.mobile-empty-inline{font-size:13px;color:var(--text-muted);padding:4px 0}.mobile-empty-compact{padding:24px 16px}.mobile-setting-row{display:flex;justify-content:space-between;align-items:center;padding:10px 0;border-bottom:1px solid var(--border)}.mobile-setting-row:last-child{border-bottom:none}.mobile-setting-label{font-size:14px;color:var(--text)}.mobile-setting-value{font-size:14px;color:var(--text-muted);text-align:right}.mobile-list-item{display:flex;align-items:center;gap:12px;padding:12px;background:var(--surface);border:1px solid var(--border);border-radius:10px}.mobile-list-icon{color:var(--text-muted);flex-shrink:0}.mobile-list-content{flex:1;min-width:0}.mobile-list-title{font-size:14px;font-weight:500;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden;white-space:normal;overflow-wrap:anywhere}.mobile-list-meta{font-size:12px;color:var(--text-muted);display:block;overflow-wrap:anywhere}.mobile-list-badge{font-size:11px;padding:2px 8px;border-radius:12px;background:var(--bg-elev-3);color:var(--text-muted);flex-shrink:0}.mobile-list-badge[data-status=working],.mobile-list-badge[data-status=doing]{background:#3fb95026;color:var(--success)}.mobile-list-badge[data-status=error],.mobile-list-badge[data-status=stuck]{background:#f8514926;color:var(--error)}.badge-on{background:#3fb95026;color:var(--success)}.badge-off{background:var(--bg-elev-3);color:var(--text-dim)}.mobile-active-badge{font-size:11px;padding:2px 8px;border-radius:12px;background:var(--accent-bg);color:var(--accent);flex-shrink:0}.mobile-empty{text-align:center;padding:48px 20px;color:var(--text-muted)}.mobile-empty svg{margin-bottom:12px;opacity:.4}.mobile-empty p{margin:0 0 6px}.muted{color:var(--text-muted);font-size:13px}.mobile-btn{min-height:var(--mobile-tap-target);min-width:var(--mobile-tap-target);padding:12px 20px;border-radius:10px;font-size:15px;font-weight:500;border:none;background:var(--accent);color:#fff;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;gap:8px;transition:opacity .12s ease;text-decoration:none}.mobile-btn:active{opacity:.7}.mobile-btn-secondary{background:var(--surface);border:1px solid var(--border);color:var(--text)}.mobile-more-footer{padding:16px 0;border-top:1px solid var(--border);margin-top:8px}.mobile-more-link{display:flex;align-items:center;justify-content:center;gap:4px;color:var(--accent);font-size:14px;text-decoration:none;min-height:var(--mobile-tap-target);padding:12px}[data-theme=dark] .mobile-app{background:#0d1117}[data-theme=light]{--bg: #ffffff;--bg-elev: #f6f8fa;--bg-elev-2: #eaeef2;--bg-elev-3: #d0d7de;--surface: var(--bg-elev);--surface-2: var(--bg-elev-2);--border: #d0d7de;--border-strong: #afb8c1;--text: #1f2328;--text-muted: #656d76;--text-dim: #8c959f;--text-strong: #1f2328;--accent: #7c3aed;--accent-2: #6d28d9;--accent-bg: rgba(124, 58, 237, .08);--accent-border: rgba(124, 58, 237, .3)}.mobile-sheet-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background:#0009;z-index:100;display:flex;align-items:flex-end;animation:sheet-fade-in .15s ease}@keyframes sheet-fade-in{0%{opacity:0}to{opacity:1}}.mobile-sheet{width:100%;background:var(--surface);border-radius:16px 16px 0 0;max-height:85vh;overflow-y:auto;overflow-x:hidden;animation:sheet-slide-up .2s cubic-bezier(.32,.72,0,1);display:flex;flex-direction:column}@keyframes sheet-slide-up{0%{transform:translateY(100%)}to{transform:translateY(0)}}.mobile-sheet-handle{width:36px;height:4px;background:var(--border-strong);border-radius:2px;margin:10px auto 0;flex-shrink:0}.mobile-sheet-header{display:flex;align-items:center;justify-content:space-between;padding:12px 16px 8px;border-bottom:1px solid var(--border);flex-shrink:0}.mobile-sheet-title{font-size:16px;font-weight:600;color:var(--text-strong);margin:0}.mobile-sheet-content{flex:1;overflow-y:auto;padding:12px 16px}.mobile-sheet-actions{padding:12px 16px;border-top:1px solid var(--border);flex-shrink:0;display:flex;gap:8px}.mobile-modal-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background:var(--bg);z-index:200;display:flex;flex-direction:column;animation:modal-fade-in .15s ease}@keyframes modal-fade-in{0%{opacity:0}to{opacity:1}}.mobile-modal{flex:1;display:flex;flex-direction:column;overflow:hidden}.mobile-modal-header{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;border-bottom:1px solid var(--border);flex-shrink:0}.mobile-modal-title{font-size:18px;font-weight:600;color:var(--text-strong);margin:0}.mobile-modal-content{flex:1;overflow-y:auto;padding:16px}.mobile-modal-actions{padding:12px 16px;border-top:1px solid var(--border);flex-shrink:0;display:flex;gap:8px}.mobile-search-container{display:flex;flex-direction:column;gap:12px;height:100%}.mobile-search-input-row{display:flex;align-items:center;gap:8px;background:var(--surface);border:1px solid var(--border);border-radius:12px;padding:0 14px;height:var(--mobile-tap-target)}.mobile-search-field{flex:1;background:transparent;border:none;outline:none;color:var(--text);font-family:inherit;font-size:var(--mobile-font-base)}.mobile-search-scopes{display:flex;gap:6px;flex-wrap:wrap}.mobile-scope-chip{min-height:var(--mobile-tap-target);padding:10px 14px;border-radius:16px;font-size:13px;font-weight:500;background:var(--surface);border:1px solid var(--border);color:var(--text-muted);cursor:pointer;transition:all .12s ease}.mobile-scope-chip.active{background:var(--accent-bg);border-color:var(--accent-border);color:var(--accent)}.mobile-search-results{flex:1;overflow-y:auto}.mobile-search-group{margin-bottom:16px}.mobile-search-group-title{font-size:11px;font-weight:600;color:var(--text-muted);text-transform:uppercase;letter-spacing:.05em;margin:0 0 6px;display:flex;align-items:center;gap:4px}.mobile-search-result-item{padding:10px 12px;background:var(--surface);border:1px solid var(--border);border-radius:8px;margin-bottom:4px;cursor:pointer}.mobile-search-result-title{font-size:14px;font-weight:500;display:block;overflow-wrap:anywhere}.mobile-search-result-meta{font-size:12px;color:var(--text-muted);display:block;overflow-wrap:anywhere}.mobile-search-loading{text-align:center;padding:20px;color:var(--text-muted);font-size:14px}.mobile-notif-btn{position:relative}.mobile-notif-badge{position:absolute;top:4px;right:4px;min-width:16px;height:16px;background:var(--error);color:#fff;font-size:10px;font-weight:700;border-radius:8px;display:flex;align-items:center;justify-content:center;padding:0 4px}.mobile-notif-list{display:flex;flex-direction:column;gap:4px}.mobile-notif-item{width:100%;min-height:var(--mobile-tap-target);display:flex;align-items:flex-start;gap:12px;padding:12px;background:var(--surface);border:1px solid var(--border);border-radius:10px;cursor:pointer;position:relative}.mobile-notif-item.unread{border-color:var(--accent-border)}.mobile-notif-icon{width:28px;height:28px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:14px;flex-shrink:0}.mobile-notif-icon.severity-success{background:#3fb95026;color:var(--success)}.mobile-notif-icon.severity-error{background:#f8514926;color:var(--error)}.mobile-notif-icon.severity-warning{background:#d2992226;color:var(--warning)}.mobile-notif-icon.severity-info{background:#58a6ff26;color:var(--info)}.mobile-notif-body{flex:1;min-width:0}.mobile-notif-title{font-size:14px;font-weight:500;display:block;overflow-wrap:anywhere}.mobile-notif-text{font-size:13px;color:var(--text-muted);display:block;margin-top:2px}.mobile-notif-time{font-size:11px;color:var(--text-dim);display:block;margin-top:4px}.mobile-notif-dot{width:8px;height:8px;border-radius:50%;background:var(--accent);flex-shrink:0;margin-top:6px}.mobile-project-btn{display:flex;align-items:center;gap:4px;background:transparent;border:none;color:var(--text-muted);cursor:pointer;min-height:var(--mobile-tap-target);min-width:var(--mobile-tap-target);padding:10px 8px;border-radius:6px;font-size:14px;font-family:inherit}.mobile-project-btn:hover{background:var(--bg-elev-2);color:var(--text)}.mobile-project-name{max-width:120px;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden;white-space:normal}.mobile-project-list{display:flex;flex-direction:column;gap:6px}.mobile-project-item{display:flex;align-items:center;gap:12px;padding:12px;background:var(--surface);border:1px solid var(--border);border-radius:10px;cursor:pointer}.mobile-project-item.active{border-color:var(--accent-border)}.mobile-project-status{width:8px;height:8px;border-radius:50%;background:var(--text-dim);flex-shrink:0}.mobile-project-status[data-status=active]{background:var(--success)}.mobile-project-status[data-status=error]{background:var(--error)}.mobile-project-info{flex:1;min-width:0}.mobile-project-item-name{font-size:14px;font-weight:500;display:block}.mobile-project-item-path{font-size:11px;color:var(--text-muted);display:block;overflow-wrap:anywhere;font-family:var(--font-mono)}.mobile-back-btn{position:fixed;top:calc(var(--mobile-topbar-height) + 8px);left:12px;z-index:60;background:var(--surface);border:1px solid var(--border);color:var(--text);font-size:13px;font-weight:500;min-height:var(--mobile-tap-target);padding:10px 14px;border-radius:20px;cursor:pointer;display:flex;align-items:center;gap:4px;box-shadow:0 2px 8px #0000004d}.mobile-kanban-tabs{display:flex;gap:4px;margin-bottom:12px;overflow-x:auto;-webkit-overflow-scrolling:touch}.mobile-kanban-tab{min-height:var(--mobile-tap-target);padding:10px 14px;border-radius:20px;font-size:13px;font-weight:500;background:var(--surface);border:1px solid var(--border);color:var(--text-muted);cursor:pointer;white-space:nowrap;transition:all .12s ease;flex-shrink:0}.mobile-kanban-tab.active{background:var(--accent-bg);border-color:var(--accent-border);color:var(--accent)}.mobile-tasks-filters{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:12px}.mobile-filter-select{min-height:var(--mobile-tap-target);padding:0 10px;background:var(--surface);border:1px solid var(--border);border-radius:18px;color:var(--text);font-family:inherit;font-size:13px;cursor:pointer}.mobile-fab{position:fixed;bottom:calc(var(--mobile-nav-height) + 80px + env(safe-area-inset-bottom,0));right:20px;width:56px;height:56px;border-radius:50%;background:var(--accent);color:#fff;border:none;cursor:pointer;display:flex;align-items:center;justify-content:center;box-shadow:0 4px 16px #8b5cf666;z-index:30;transition:transform .12s ease,box-shadow .12s ease}.mobile-fab:active{transform:scale(.94);box-shadow:0 2px 8px #8b5cf64d}.mobile-task-detail-actions{display:flex;gap:8px;flex-wrap:wrap}.mobile-task-detail{display:flex;flex-direction:column;gap:12px}.mobile-task-detail-header{display:flex;align-items:center;gap:8px}.mobile-task-status-badge{font-size:11px;font-weight:600;padding:3px 10px;border-radius:12px;text-transform:capitalize}.mobile-task-status-badge.status-queued{background:#58a6ff26;color:var(--info)}.mobile-task-status-badge.status-doing{background:#3fb95026;color:var(--success)}.mobile-task-status-badge.status-blocked{background:#f8514926;color:var(--error)}.mobile-task-status-badge.status-done{background:#3fb95026;color:var(--success)}.mobile-task-priority{font-size:11px;font-weight:600;padding:3px 10px;border-radius:12px;text-transform:capitalize}.mobile-task-priority.priority-high{background:#f8514926;color:var(--error)}.mobile-task-priority.priority-normal{background:#58a6ff26;color:var(--info)}.mobile-task-priority.priority-low{background:var(--bg-elev-3);color:var(--text-dim)}.mobile-task-detail-title{font-size:18px;font-weight:600;color:var(--text-strong);margin:0}.mobile-task-detail-desc{font-size:14px;color:var(--text-muted);line-height:1.5;margin:0;overflow-wrap:anywhere}.mobile-task-detail-meta{display:flex;flex-direction:column;gap:0}.mobile-task-detail-row{display:flex;justify-content:space-between;align-items:center;padding:8px 0;border-bottom:1px solid var(--border);font-size:13px}.mobile-task-detail-row:last-child{border-bottom:none}.mobile-task-detail-row span:first-child{color:var(--text-muted)}.mobile-task-detail-row span:last-child{color:var(--text);font-weight:500}.mobile-task-form{display:flex;flex-direction:column;gap:12px}.mobile-field-label{font-size:12px;font-weight:600;color:var(--text-muted);text-transform:uppercase;letter-spacing:.04em;margin-bottom:4px;display:block}.mobile-input{width:100%;min-height:var(--mobile-tap-target);padding:10px 14px;background:var(--surface);border:1px solid var(--border);border-radius:10px;color:var(--text);font-family:inherit;font-size:var(--mobile-font-base);outline:none;transition:border-color .12s ease}.mobile-input:focus{border-color:var(--accent)}.mobile-input-sm{min-height:var(--mobile-tap-target);padding:8px 12px}.mobile-agent-detail{display:flex;flex-direction:column;gap:12px}.mobile-agent-detail-status{display:flex;align-items:center;gap:8px}.mobile-agent-detail-status-text{font-size:14px;font-weight:500;text-transform:capitalize}.mobile-agent-detail-desc{font-size:14px;color:var(--text-muted);line-height:1.5;margin:0;overflow-wrap:anywhere}.mobile-view-canvas{padding-bottom:80px}.mobile-canvas-bar{display:flex;align-items:center;justify-content:space-between;padding:0 0 12px;border-bottom:1px solid var(--border);margin-bottom:12px}.mobile-canvas-meta{display:flex;flex-direction:column;gap:2px}.mobile-canvas-title{font-size:16px;font-weight:600;color:var(--text-strong)}.mobile-canvas-status{font-size:11px;font-weight:600;padding:2px 8px;border-radius:10px;text-transform:capitalize}.mobile-canvas-status[data-status=approved],.mobile-canvas-status[data-status=done]{background:#3fb95026;color:var(--success)}.mobile-canvas-status[data-status=in-progress],.mobile-canvas-status[data-status=doing]{background:#58a6ff26;color:var(--info)}.mobile-canvas-status[data-status=draft]{background:var(--bg-elev-3);color:var(--text-dim)}.mobile-canvas-actions{display:flex;align-items:center;gap:4px}.mobile-canvas-comment-count{position:absolute;top:2px;right:2px;background:var(--accent);color:#fff;font-size:9px;font-weight:700;border-radius:6px;padding:1px 4px;min-width:14px;text-align:center}.mobile-canvas-elements{display:flex;flex-direction:column;gap:10px}.mobile-canvas-element{background:var(--surface);border:2px solid var(--border);border-radius:12px;overflow:hidden;cursor:pointer}.mobile-canvas-element.selected{box-shadow:0 0 0 2px var(--accent)}.mobile-canvas-el-header{display:flex;align-items:center;gap:6px;padding:8px 12px}.mobile-canvas-el-type{font-size:11px;font-weight:600;text-transform:uppercase}.mobile-canvas-el-status{font-size:10px;padding:1px 6px;border-radius:8px;background:var(--bg-elev-3);color:var(--text-muted);margin-left:auto}.mobile-canvas-el-title{font-size:14px;font-weight:600;padding:8px 12px;color:var(--text-strong)}.mobile-canvas-el-content{font-size:13px;color:var(--text-muted);padding:0 12px 8px;line-height:1.4}.mobile-canvas-el-comments{display:flex;align-items:center;gap:4px;padding:6px 12px;border-top:1px solid var(--border);font-size:11px;color:var(--text-dim)}.mobile-canvas-comments{margin-top:16px;background:var(--surface);border:1px solid var(--border);border-radius:12px;overflow:hidden}.mobile-canvas-comments-header{display:flex;align-items:center;justify-content:space-between;padding:12px;border-bottom:1px solid var(--border)}.mobile-canvas-comments-header h4{margin:0;font-size:14px;font-weight:600}.mobile-canvas-comment-list{max-height:300px;overflow-y:auto;padding:12px}.mobile-canvas-comment{margin-bottom:12px}.mobile-canvas-comment-head{display:flex;align-items:center;gap:8px;margin-bottom:4px}.mobile-canvas-comment-head .mono{font-size:11px;font-weight:600}.mobile-canvas-comment-head .muted{font-size:11px;color:var(--text-dim);margin-left:auto}.mobile-canvas-comment-text{font-size:13px;color:var(--text-muted);line-height:1.4}.mobile-canvas-comment-input{display:flex;gap:8px;padding:12px;border-top:1px solid var(--border)}.mobile-canvas-comment-input .mobile-input{flex:1}.mobile-activity-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}.mobile-event-item{display:flex;align-items:flex-start;gap:10px;padding:10px 12px;background:var(--surface);border:1px solid var(--border);border-radius:10px;margin-bottom:4px;cursor:pointer}.mobile-event-kind{font-size:10px;font-weight:700;padding:2px 8px;border-radius:8px;background:var(--bg-elev-3);color:var(--text-muted);text-transform:uppercase;flex-shrink:0}.mobile-event-msg{flex:1;font-size:13px;color:var(--text);overflow-wrap:anywhere}.mobile-event-time{font-size:11px;color:var(--text-dim);flex-shrink:0}.mobile-submit-hero{background:linear-gradient(135deg,var(--accent-bg) 0%,var(--bg-elev) 100%);border:1px solid var(--accent-border);border-radius:16px;padding:16px;margin-bottom:16px}.mobile-submit-input{width:100%;background:var(--surface);border:1px solid var(--border);border-radius:12px;padding:12px;color:var(--text);font-family:inherit;font-size:var(--mobile-font-base);resize:none;outline:none;margin-bottom:12px}.mobile-submit-input:focus{border-color:var(--accent)}.mobile-submit-actions{display:flex;flex-direction:column;gap:10px}.mobile-submit-chips{display:flex;gap:6px;flex-wrap:wrap}.mobile-submit-chip{min-height:var(--mobile-tap-target);padding:10px 12px;border-radius:16px;font-size:12px;font-weight:500;background:var(--surface);border:1px solid var(--border);color:var(--text-muted);cursor:pointer;transition:all .12s ease}.mobile-submit-chip:hover{border-color:var(--accent-border);color:var(--accent)}.mobile-more-nav-item{display:flex;align-items:center;gap:14px;padding:14px 12px;background:var(--surface);border:1px solid var(--border);border-radius:12px;margin-bottom:6px;cursor:pointer;transition:all .12s ease}.mobile-more-nav-item:hover{border-color:var(--accent-border);background:var(--bg-elev-2)}.mobile-more-nav-icon{width:40px;height:40px;border-radius:10px;background:var(--bg-elev-2);color:var(--accent);display:flex;align-items:center;justify-content:center;flex-shrink:0}.mobile-more-nav-content{flex:1;min-width:0}.mobile-more-nav-label{font-size:15px;font-weight:600;color:var(--text-strong);display:flex;align-items:center;gap:8px}.mobile-more-nav-count{font-size:11px;font-weight:600;padding:1px 7px;border-radius:10px;background:var(--bg-elev-3);color:var(--text-muted)}.mobile-more-nav-desc{font-size:12px;color:var(--text-muted);display:block;margin-top:2px}.mobile-more-nav-arrow{color:var(--text-dim);flex-shrink:0}.mobile-config-list{display:flex;flex-direction:column;gap:0}.mobile-config-row{display:flex;align-items:flex-start;flex-wrap:wrap;gap:10px;padding:10px 0;border-bottom:1px solid var(--border)}.mobile-config-row:last-child{border-bottom:none}.mobile-config-key{flex:0 0 104px;display:flex;flex-direction:column;gap:2px}.mobile-config-key .mono{font-size:12px;font-weight:500;color:var(--text);word-break:break-all}.mobile-config-type{font-size:10px;color:var(--text-dim);text-transform:uppercase}.mobile-config-value{flex:1;min-width:0}.mobile-config-value .mobile-input{min-height:var(--mobile-tap-target);padding:6px 10px;font-size:13px}.mobile-toggle{position:relative;display:inline-flex;align-items:center;cursor:pointer;width:44px;height:24px}.mobile-toggle input{opacity:0;width:0;height:0;position:absolute}.mobile-toggle-slider{position:absolute;top:0;right:0;bottom:0;left:0;background:var(--bg-elev-3);border-radius:12px;transition:background .2s ease}.mobile-toggle-slider:before{content:"";position:absolute;left:2px;top:2px;width:20px;height:20px;background:#fff;border-radius:50%;transition:transform .2s ease}.mobile-toggle input:checked+.mobile-toggle-slider{background:var(--accent)}.mobile-toggle input:checked+.mobile-toggle-slider:before{transform:translate(20px)}.mobile-theme-btns{display:flex;gap:6px}.mobile-theme-btn{display:flex;align-items:center;gap:4px;min-height:var(--mobile-tap-target);padding:10px 12px;border-radius:16px;font-size:12px;font-weight:500;background:var(--surface);border:1px solid var(--border);color:var(--text-muted);cursor:pointer;transition:all .12s ease}.mobile-theme-btn.active{background:var(--accent-bg);border-color:var(--accent-border);color:var(--accent)}.mobile-accent-swatches{display:flex;gap:8px;flex-wrap:wrap}.mobile-accent-swatch{width:var(--mobile-tap-target);height:var(--mobile-tap-target);border-radius:50%;border:2px solid transparent;cursor:pointer;transition:transform .12s ease}.mobile-accent-swatch:hover{transform:scale(1.1)}.mobile-accent-swatch.active{border-color:#fff;box-shadow:0 0 0 2px var(--accent)}.mobile-settings-save-bar{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;padding:10px 16px;background:var(--warning);color:#000;font-size:13px;font-weight:500;margin:calc(-1 * var(--mobile-padding));margin-bottom:12px}.mobile-list-item-interactive{cursor:pointer;transition:all .12s ease}.mobile-list-item-interactive:hover{border-color:var(--accent-border);background:var(--bg-elev-2)}.mobile-list-item-interactive:active{opacity:.8}.mobile-list-status-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}.mobile-list-status-dot[data-status=working],.mobile-list-status-dot[data-status=doing]{background:var(--success)}.mobile-list-status-dot[data-status=error],.mobile-list-status-dot[data-status=stuck]{background:var(--error)}.mobile-list-status-dot[data-status=idle]{background:var(--text-dim)}.mobile-list-badge.badge-accent{background:var(--accent-bg);color:var(--accent)}.mobile-list-badge.badge-warning{background:#d2992226;color:var(--warning)}.mobile-btn-danger{background:var(--error);color:#fff}.mobile-btn-danger:active{opacity:.8}.mobile-artifact-iframe{width:100%;min-height:min(70dvh,560px);border:1px solid var(--border);border-radius:12px;background:#fff}@media (max-width: 420px){.mobile-config-key,.mobile-config-value{flex-basis:100%}.mobile-task-detail-row{flex-direction:column}.mobile-task-detail-row span:first-child,.mobile-task-detail-row span:last-child{flex:none;text-align:left}}.mobile-overview{display:flex;flex-direction:column;gap:16px}.mobile-hero{padding:20px 16px;background:linear-gradient(135deg,#8b5cf626,#3b82f61a);border:1px solid var(--border);border-radius:14px}.mobile-hero h1{margin:0 0 8px;font-size:24px;font-weight:700;line-height:1.2}.mobile-hero p{margin:0 0 12px;font-size:13px;color:var(--text-dim);line-height:1.4}.mobile-hero-input{width:100%;background:var(--surface-2);border:1px solid var(--border);border-radius:8px;padding:10px 12px;color:var(--text);font-size:14px;font-family:inherit;resize:vertical;margin-bottom:8px;box-sizing:border-box}.mobile-hero-submit{width:100%;padding:10px;background:var(--accent, #8b5cf6);color:#fff;border:none;border-radius:8px;font-weight:600;font-size:14px;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;gap:6px}.mobile-hero-submit:disabled{opacity:.5;cursor:not-allowed}.mobile-stats-stack{display:flex;flex-direction:column;gap:8px}.mobile-stat-card{display:flex;align-items:center;gap:14px;padding:14px 16px;background:var(--surface-1);border:1px solid var(--border);border-radius:10px}.mobile-stat-card.is-blue{border-left:4px solid #58a6ff}.mobile-stat-card.is-purple{border-left:4px solid #8b5cf6}.mobile-stat-card.is-green{border-left:4px solid #3fb950}.mobile-stat-card.is-yellow{border-left:4px solid #d29922}.mobile-stat-icon{display:flex;align-items:center;justify-content:center;width:40px;height:40px;border-radius:10px;background:var(--surface-2);color:var(--text);flex-shrink:0}.mobile-stat-body{flex:1;min-width:0}.mobile-stat-label{font-size:12px;color:var(--text-dim);text-transform:uppercase;letter-spacing:.05em}.mobile-stat-value{font-size:24px;font-weight:700;margin-top:2px}.mobile-stat-subtext{font-size:11px;color:var(--text-dim);margin-top:2px}.mobile-activity-card,.mobile-quick-actions{padding:16px;background:var(--surface-1);border:1px solid var(--border);border-radius:10px}.mobile-activity-card h3{margin:0 0 12px;font-size:14px;font-weight:600}.mobile-activity-list{list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:8px}.mobile-activity-item{display:flex;gap:8px;padding:8px;border-radius:6px;background:var(--surface-2);font-size:12px}.mobile-activity-time{color:var(--text-dim);font-variant-numeric:tabular-nums;flex-shrink:0}.mobile-activity-text{word-break:break-word}.mobile-quick-actions{display:flex;flex-direction:column;gap:8px}.mobile-quick-action{display:flex;align-items:center;gap:8px;padding:12px;background:var(--surface-2);border:1px solid var(--border);border-radius:8px;color:var(--text);font-size:14px;font-weight:500;text-align:left;cursor:pointer}@media (prefers-reduced-motion: reduce){*,*:before,*:after{animation-duration:.01ms!important;transition-duration:.01ms!important}}.mobile-layout{display:flex;flex-direction:column;min-height:100vh;min-height:100dvh;background:var(--bg)}.mobile-header{position:sticky;top:0;z-index:100;display:flex;align-items:center;gap:12px;height:56px;padding:0 16px;background:var(--surface-1, var(--surface, var(--bg-elev)));border-bottom:1px solid transparent;transition:border-color .2s ease}.mobile-header.is-scrolled{border-bottom-color:var(--border)}.mobile-header-title{flex:1;font-size:18px;font-weight:600;margin:0;color:var(--text-strong, var(--text))}.mobile-menu-btn,.mobile-search-btn,.mobile-settings-exit{background:transparent;border:none;color:var(--text);padding:8px;border-radius:8px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:background .12s ease}.mobile-menu-btn:hover,.mobile-search-btn:hover,.mobile-settings-exit:hover{background:var(--bg-elev-2, var(--bg-elev))}.mobile-menu-btn:active,.mobile-search-btn:active,.mobile-settings-exit:active{background:var(--bg-elev-3)}.mobile-content{flex:1;overflow-y:auto;overflow-x:hidden;padding:16px 16px 80px;-webkit-overflow-scrolling:touch}.mobile-bottom-nav{position:fixed;bottom:0;left:0;right:0;display:flex;height:64px;background:var(--surface-1, var(--surface, var(--bg-elev)));border-top:1px solid var(--border);z-index:50;padding-bottom:env(safe-area-inset-bottom,0)}.mobile-nav-item{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;background:transparent;border:none;color:var(--text-dim, var(--text-muted));font-size:10px;font-family:inherit;cursor:pointer;padding:4px 0;transition:color .12s ease}.mobile-nav-item.is-active{color:var(--accent)}.mobile-nav-label{font-size:10px;font-weight:500;line-height:1}.mobile-drawer-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background:#00000080;z-index:60;animation:fadeIn .2s ease}.mobile-drawer{position:fixed;top:0;left:0;bottom:0;width:80%;max-width:320px;background:var(--surface-1, var(--surface, var(--bg-elev)));z-index:70;transform:translate(-100%);transition:transform .25s cubic-bezier(.4,0,.2,1);overflow-y:auto;-webkit-overflow-scrolling:touch;display:flex;flex-direction:column}.mobile-drawer.is-open{transform:translate(0)}.mobile-drawer-head{position:sticky;top:0;display:flex;align-items:center;justify-content:space-between;padding:16px;background:var(--surface-1, var(--surface, var(--bg-elev)));border-bottom:1px solid var(--border);flex-shrink:0}.mobile-drawer-head h2{font-size:18px;font-weight:600;margin:0;color:var(--text-strong, var(--text))}.mobile-drawer-close{background:transparent;border:none;color:var(--text);padding:8px;border-radius:8px;cursor:pointer;display:flex;align-items:center;justify-content:center}.mobile-drawer-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:8px;padding:16px;flex:1}.mobile-drawer-item{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;padding:16px 8px;background:var(--surface-2, var(--bg-elev-2));border:1px solid var(--border);border-radius:8px;color:var(--text);font-size:12px;font-family:inherit;cursor:pointer;min-height:80px;transition:border-color .12s ease,background .12s ease}.mobile-drawer-item.is-active{border-color:var(--accent);background:#8b5cf61a}.mobile-drawer-item:active{opacity:.8}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@media (min-width: 1024px){.mobile-layout,.mobile-bottom-nav,.mobile-drawer,.mobile-header{display:none}}
1
+ @media (max-width: 480px){.chat-composer-wrap{padding:.375rem .375rem .5rem}.chat-welcome-h1{font-size:1.875rem}}:root{--bg: #0b0e14;--bg-elev: #12161f;--bg-elev-2: #1a1f2b;--bg-elev-3: #232a39;--surface: var(--bg-elev);--surface-2: var(--bg-elev-2);--border: #232a39;--border-strong: #2d3648;--text: #c9d1d9;--text-muted: #6e7681;--text-dim: #484f58;--text-strong: #f0f6fc;--accent: #8b5cf6;--accent-bg: rgba(139, 92, 246, .12);--accent-border: rgba(139, 92, 246, .4);--accent-2: #a78bfa;--success: #3fb950;--warning: #d29922;--error: #f85149;--info: #58a6ff;--font-sans: "Inter var", "Inter", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;--font-mono: "JetBrains Mono", "Fira Code", ui-monospace, monospace;--mobile-tap-target: 44px;--mobile-nav-height: 56px;--mobile-topbar-height: 48px;--mobile-padding: 16px;--mobile-font-base: 16px}*,*:before,*:after{box-sizing:border-box;-webkit-tap-highlight-color:transparent;-webkit-touch-callout:none;touch-action:manipulation}html,body{margin:0;padding:0;height:100%;overflow:hidden}body{font-family:var(--font-sans);font-size:var(--mobile-font-base);line-height:1.5;background:var(--bg);color:var(--text);-webkit-font-smoothing:antialiased;overscroll-behavior:none}button,[role=button],a,input,select,textarea{touch-action:manipulation}input,textarea,select{user-select:text;-webkit-user-select:text;font-size:var(--mobile-font-base)}a{color:var(--accent);text-decoration:none}code,.mono{font-family:var(--font-mono)}.mobile-app{display:flex;flex-direction:column;height:100vh;height:100dvh;background:var(--bg);color:var(--text);font-family:var(--font-sans);padding-top:env(safe-area-inset-top,0);padding-bottom:env(safe-area-inset-bottom,0);overscroll-behavior:none}.mobile-topbar{height:var(--mobile-topbar-height);flex-shrink:0;display:flex;align-items:center;justify-content:space-between;padding:0 var(--mobile-padding);background:var(--surface);border-bottom:1px solid var(--border);position:sticky;top:0;z-index:10}.mobile-topbar-left{display:flex;align-items:center;gap:8px}.mobile-logo{font-size:20px;line-height:1}.mobile-title{font-size:16px;font-weight:600;color:var(--text-strong)}.mobile-topbar-right{display:flex;align-items:center;gap:4px}.mobile-icon-btn{width:var(--mobile-tap-target);height:var(--mobile-tap-target);min-width:var(--mobile-tap-target);min-height:var(--mobile-tap-target);display:flex;align-items:center;justify-content:center;background:transparent;border:none;border-radius:8px;color:var(--text-muted);cursor:pointer;transition:background .12s ease,color .12s ease;padding:0}.mobile-icon-btn:hover{background:var(--bg-elev-2);color:var(--text)}.mobile-icon-btn:active{background:var(--bg-elev-3)}.mobile-icon-btn-danger{color:var(--error)}.mobile-content{flex:1;overflow-y:auto;overflow-x:hidden;-webkit-overflow-scrolling:touch;padding:var(--mobile-padding);padding-bottom:calc(var(--mobile-nav-height) + var(--mobile-padding) + env(safe-area-inset-bottom,0))}.mobile-view{max-width:100%;min-width:0}.mobile-view-footer{padding:24px 0;text-align:center}.mobile-bottom-nav{position:fixed;bottom:0;left:0;right:0;height:calc(var(--mobile-nav-height) + env(safe-area-inset-bottom,0));background:var(--surface);border-top:1px solid var(--border);display:flex;align-items:stretch;padding-bottom:env(safe-area-inset-bottom,0);z-index:50}.mobile-nav-btn{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;background:transparent;border:none;color:var(--text-muted);cursor:pointer;min-height:var(--mobile-tap-target);padding:8px 4px;transition:color .12s ease}.mobile-nav-btn-active{color:var(--accent)}.mobile-nav-label{font-size:10px;font-weight:500}.mobile-loading{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100vh;height:100dvh;gap:12px;color:var(--text-muted)}.mobile-stats{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-bottom:20px}.mobile-stat{background:var(--surface);border:1px solid var(--border);border-radius:12px;padding:16px;text-align:center}.mobile-stat-value{font-size:28px;font-weight:700;color:var(--accent);line-height:1}.mobile-stat-label{font-size:12px;color:var(--text-muted);margin-top:4px}.mobile-section{margin-bottom:20px}.mobile-section-title{font-size:12px;font-weight:600;color:var(--text-muted);text-transform:uppercase;letter-spacing:.05em;margin:0 0 8px;display:flex;align-items:center;gap:6px}.mobile-card{background:var(--surface);border:1px solid var(--border);border-radius:12px;padding:14px;margin-bottom:12px}.mobile-card-list{display:flex;flex-direction:column;gap:6px}.mobile-agent-card{display:flex;align-items:center;gap:10px;padding:12px;background:var(--surface);border:1px solid var(--border);border-radius:10px}.mobile-agent-dot{width:8px;height:8px;border-radius:50%;background:var(--text-dim);flex-shrink:0}.mobile-agent-dot[data-status=working],.mobile-agent-dot[data-status=doing]{background:var(--success);animation:pulse-dot 1.6s ease-in-out infinite}.mobile-agent-dot[data-status=error],.mobile-agent-dot[data-status=stuck]{background:var(--error)}.mobile-agent-dot[data-status=idle]{background:var(--text-dim)}@keyframes pulse-dot{0%,to{opacity:1}50%{opacity:.4}}.mobile-agent-info{flex:1;min-width:0}.mobile-agent-name{font-size:14px;font-weight:500;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden;white-space:normal;overflow-wrap:anywhere}.mobile-agent-meta{font-size:12px;color:var(--text-muted);display:block;overflow-wrap:anywhere}.mobile-task-card{width:100%;padding:12px;background:var(--surface);border:1px solid var(--border);border-radius:10px;display:flex;align-items:center;gap:10px;text-align:left}.mobile-task-actions{display:flex;gap:2px;flex-shrink:0}.priority-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}.task-content{flex:1;min-width:0}.task-title{font-size:14px;font-weight:500;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden;white-space:normal;overflow-wrap:anywhere}.task-meta{font-size:12px;color:var(--text-muted);display:block;overflow-wrap:anywhere}.mobile-tasks-toolbar{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-bottom:16px}.mobile-search-input{flex:1;height:var(--mobile-tap-target);padding:0 14px;background:var(--surface);border:1px solid var(--border);border-radius:22px;color:var(--text);font-family:inherit;font-size:var(--mobile-font-base);outline:none}.mobile-search-input:focus{border-color:var(--accent)}.mobile-empty-inline{font-size:13px;color:var(--text-muted);padding:4px 0}.mobile-empty-compact{padding:24px 16px}.mobile-setting-row{display:flex;justify-content:space-between;align-items:center;padding:10px 0;border-bottom:1px solid var(--border)}.mobile-setting-row:last-child{border-bottom:none}.mobile-setting-label{font-size:14px;color:var(--text)}.mobile-setting-value{font-size:14px;color:var(--text-muted);text-align:right}.mobile-list-item{display:flex;align-items:center;gap:12px;padding:12px;background:var(--surface);border:1px solid var(--border);border-radius:10px}.mobile-list-icon{color:var(--text-muted);flex-shrink:0}.mobile-list-content{flex:1;min-width:0}.mobile-list-title{font-size:14px;font-weight:500;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden;white-space:normal;overflow-wrap:anywhere}.mobile-list-meta{font-size:12px;color:var(--text-muted);display:block;overflow-wrap:anywhere}.mobile-list-badge{font-size:11px;padding:2px 8px;border-radius:12px;background:var(--bg-elev-3);color:var(--text-muted);flex-shrink:0}.mobile-list-badge[data-status=working],.mobile-list-badge[data-status=doing]{background:#3fb95026;color:var(--success)}.mobile-list-badge[data-status=error],.mobile-list-badge[data-status=stuck]{background:#f8514926;color:var(--error)}.badge-on{background:#3fb95026;color:var(--success)}.badge-off{background:var(--bg-elev-3);color:var(--text-dim)}.mobile-active-badge{font-size:11px;padding:2px 8px;border-radius:12px;background:var(--accent-bg);color:var(--accent);flex-shrink:0}.mobile-empty{text-align:center;padding:48px 20px;color:var(--text-muted)}.mobile-empty svg{margin-bottom:12px;opacity:.4}.mobile-empty p{margin:0 0 6px}.muted{color:var(--text-muted);font-size:13px}.mobile-btn{min-height:var(--mobile-tap-target);min-width:var(--mobile-tap-target);padding:12px 20px;border-radius:10px;font-size:15px;font-weight:500;border:none;background:var(--accent);color:#fff;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;gap:8px;transition:opacity .12s ease;text-decoration:none}.mobile-btn:active{opacity:.7}.mobile-btn-secondary{background:var(--surface);border:1px solid var(--border);color:var(--text)}.mobile-more-footer{padding:16px 0;border-top:1px solid var(--border);margin-top:8px}.mobile-more-link{display:flex;align-items:center;justify-content:center;gap:4px;color:var(--accent);font-size:14px;text-decoration:none;min-height:var(--mobile-tap-target);padding:12px}[data-theme=dark] .mobile-app{background:#0d1117}[data-theme=light]{--bg: #ffffff;--bg-elev: #f6f8fa;--bg-elev-2: #eaeef2;--bg-elev-3: #d0d7de;--surface: var(--bg-elev);--surface-2: var(--bg-elev-2);--border: #d0d7de;--border-strong: #afb8c1;--text: #1f2328;--text-muted: #656d76;--text-dim: #8c959f;--text-strong: #1f2328;--accent: #7c3aed;--accent-2: #6d28d9;--accent-bg: rgba(124, 58, 237, .08);--accent-border: rgba(124, 58, 237, .3)}.mobile-sheet-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background:#0009;z-index:100;display:flex;align-items:flex-end;animation:sheet-fade-in .15s ease}@keyframes sheet-fade-in{0%{opacity:0}to{opacity:1}}.mobile-sheet{width:100%;background:var(--surface);border-radius:16px 16px 0 0;max-height:85vh;overflow-y:auto;overflow-x:hidden;animation:sheet-slide-up .2s cubic-bezier(.32,.72,0,1);display:flex;flex-direction:column}@keyframes sheet-slide-up{0%{transform:translateY(100%)}to{transform:translateY(0)}}.mobile-sheet-handle{width:36px;height:4px;background:var(--border-strong);border-radius:2px;margin:10px auto 0;flex-shrink:0}.mobile-sheet-header{display:flex;align-items:center;justify-content:space-between;padding:12px 16px 8px;border-bottom:1px solid var(--border);flex-shrink:0}.mobile-sheet-title{font-size:16px;font-weight:600;color:var(--text-strong);margin:0}.mobile-sheet-content{flex:1;overflow-y:auto;padding:12px 16px}.mobile-sheet-actions{padding:12px 16px;border-top:1px solid var(--border);flex-shrink:0;display:flex;gap:8px}.mobile-modal-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background:var(--bg);z-index:200;display:flex;flex-direction:column;animation:modal-fade-in .15s ease}@keyframes modal-fade-in{0%{opacity:0}to{opacity:1}}.mobile-modal{flex:1;display:flex;flex-direction:column;overflow:hidden}.mobile-modal-header{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;border-bottom:1px solid var(--border);flex-shrink:0}.mobile-modal-title{font-size:18px;font-weight:600;color:var(--text-strong);margin:0}.mobile-modal-content{flex:1;overflow-y:auto;padding:16px}.mobile-modal-actions{padding:12px 16px;border-top:1px solid var(--border);flex-shrink:0;display:flex;gap:8px}.mobile-search-container{display:flex;flex-direction:column;gap:12px;height:100%}.mobile-search-input-row{display:flex;align-items:center;gap:8px;background:var(--surface);border:1px solid var(--border);border-radius:12px;padding:0 14px;height:var(--mobile-tap-target)}.mobile-search-field{flex:1;background:transparent;border:none;outline:none;color:var(--text);font-family:inherit;font-size:var(--mobile-font-base)}.mobile-search-scopes{display:flex;gap:6px;flex-wrap:wrap}.mobile-scope-chip{min-height:var(--mobile-tap-target);padding:10px 14px;border-radius:16px;font-size:13px;font-weight:500;background:var(--surface);border:1px solid var(--border);color:var(--text-muted);cursor:pointer;transition:all .12s ease}.mobile-scope-chip.active{background:var(--accent-bg);border-color:var(--accent-border);color:var(--accent)}.mobile-search-results{flex:1;overflow-y:auto}.mobile-search-group{margin-bottom:16px}.mobile-search-group-title{font-size:11px;font-weight:600;color:var(--text-muted);text-transform:uppercase;letter-spacing:.05em;margin:0 0 6px;display:flex;align-items:center;gap:4px}.mobile-search-result-item{padding:10px 12px;background:var(--surface);border:1px solid var(--border);border-radius:8px;margin-bottom:4px;cursor:pointer}.mobile-search-result-title{font-size:14px;font-weight:500;display:block;overflow-wrap:anywhere}.mobile-search-result-meta{font-size:12px;color:var(--text-muted);display:block;overflow-wrap:anywhere}.mobile-search-loading{text-align:center;padding:20px;color:var(--text-muted);font-size:14px}.mobile-notif-btn{position:relative}.mobile-notif-badge{position:absolute;top:4px;right:4px;min-width:16px;height:16px;background:var(--error);color:#fff;font-size:10px;font-weight:700;border-radius:8px;display:flex;align-items:center;justify-content:center;padding:0 4px}.mobile-notif-list{display:flex;flex-direction:column;gap:4px}.mobile-notif-item{width:100%;min-height:var(--mobile-tap-target);display:flex;align-items:flex-start;gap:12px;padding:12px;background:var(--surface);border:1px solid var(--border);border-radius:10px;cursor:pointer;position:relative}.mobile-notif-item.unread{border-color:var(--accent-border)}.mobile-notif-icon{width:28px;height:28px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:14px;flex-shrink:0}.mobile-notif-icon.severity-success{background:#3fb95026;color:var(--success)}.mobile-notif-icon.severity-error{background:#f8514926;color:var(--error)}.mobile-notif-icon.severity-warning{background:#d2992226;color:var(--warning)}.mobile-notif-icon.severity-info{background:#58a6ff26;color:var(--info)}.mobile-notif-body{flex:1;min-width:0}.mobile-notif-title{font-size:14px;font-weight:500;display:block;overflow-wrap:anywhere}.mobile-notif-text{font-size:13px;color:var(--text-muted);display:block;margin-top:2px}.mobile-notif-time{font-size:11px;color:var(--text-dim);display:block;margin-top:4px}.mobile-notif-dot{width:8px;height:8px;border-radius:50%;background:var(--accent);flex-shrink:0;margin-top:6px}.mobile-project-btn{display:flex;align-items:center;gap:4px;background:transparent;border:none;color:var(--text-muted);cursor:pointer;min-height:var(--mobile-tap-target);min-width:var(--mobile-tap-target);padding:10px 8px;border-radius:6px;font-size:14px;font-family:inherit}.mobile-project-btn:hover{background:var(--bg-elev-2);color:var(--text)}.mobile-project-name{max-width:120px;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden;white-space:normal}.mobile-project-list{display:flex;flex-direction:column;gap:6px}.mobile-project-item{display:flex;align-items:center;gap:12px;padding:12px;background:var(--surface);border:1px solid var(--border);border-radius:10px;cursor:pointer}.mobile-project-item.active{border-color:var(--accent-border)}.mobile-project-status{width:8px;height:8px;border-radius:50%;background:var(--text-dim);flex-shrink:0}.mobile-project-status[data-status=active]{background:var(--success)}.mobile-project-status[data-status=error]{background:var(--error)}.mobile-project-info{flex:1;min-width:0}.mobile-project-item-name{font-size:14px;font-weight:500;display:block}.mobile-project-item-path{font-size:11px;color:var(--text-muted);display:block;overflow-wrap:anywhere;font-family:var(--font-mono)}.mobile-back-btn{position:fixed;top:calc(var(--mobile-topbar-height) + 8px);left:12px;z-index:60;background:var(--surface);border:1px solid var(--border);color:var(--text);font-size:13px;font-weight:500;min-height:var(--mobile-tap-target);padding:10px 14px;border-radius:20px;cursor:pointer;display:flex;align-items:center;gap:4px;box-shadow:0 2px 8px #0000004d}.mobile-kanban-tabs{display:flex;gap:4px;margin-bottom:12px;overflow-x:auto;-webkit-overflow-scrolling:touch}.mobile-kanban-tab{min-height:var(--mobile-tap-target);padding:10px 14px;border-radius:20px;font-size:13px;font-weight:500;background:var(--surface);border:1px solid var(--border);color:var(--text-muted);cursor:pointer;white-space:nowrap;transition:all .12s ease;flex-shrink:0}.mobile-kanban-tab.active{background:var(--accent-bg);border-color:var(--accent-border);color:var(--accent)}.mobile-tasks-filters{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:12px}.mobile-filter-select{min-height:var(--mobile-tap-target);padding:0 10px;background:var(--surface);border:1px solid var(--border);border-radius:18px;color:var(--text);font-family:inherit;font-size:13px;cursor:pointer}.mobile-fab{position:fixed;bottom:calc(var(--mobile-nav-height) + 80px + env(safe-area-inset-bottom,0));right:20px;width:56px;height:56px;border-radius:50%;background:var(--accent);color:#fff;border:none;cursor:pointer;display:flex;align-items:center;justify-content:center;box-shadow:0 4px 16px #8b5cf666;z-index:30;transition:transform .12s ease,box-shadow .12s ease}.mobile-fab:active{transform:scale(.94);box-shadow:0 2px 8px #8b5cf64d}.mobile-task-detail-actions{display:flex;gap:8px;flex-wrap:wrap}.mobile-task-detail{display:flex;flex-direction:column;gap:12px}.mobile-task-detail-header{display:flex;align-items:center;gap:8px}.mobile-task-status-badge{font-size:11px;font-weight:600;padding:3px 10px;border-radius:12px;text-transform:capitalize}.mobile-task-status-badge.status-queued{background:#58a6ff26;color:var(--info)}.mobile-task-status-badge.status-doing{background:#3fb95026;color:var(--success)}.mobile-task-status-badge.status-blocked{background:#f8514926;color:var(--error)}.mobile-task-status-badge.status-done{background:#3fb95026;color:var(--success)}.mobile-task-priority{font-size:11px;font-weight:600;padding:3px 10px;border-radius:12px;text-transform:capitalize}.mobile-task-priority.priority-high{background:#f8514926;color:var(--error)}.mobile-task-priority.priority-normal{background:#58a6ff26;color:var(--info)}.mobile-task-priority.priority-low{background:var(--bg-elev-3);color:var(--text-dim)}.mobile-task-detail-title{font-size:18px;font-weight:600;color:var(--text-strong);margin:0}.mobile-task-detail-desc{font-size:14px;color:var(--text-muted);line-height:1.5;margin:0;overflow-wrap:anywhere}.mobile-task-detail-meta{display:flex;flex-direction:column;gap:0}.mobile-task-detail-row{display:flex;justify-content:space-between;align-items:center;padding:8px 0;border-bottom:1px solid var(--border);font-size:13px}.mobile-task-detail-row:last-child{border-bottom:none}.mobile-task-detail-row span:first-child{color:var(--text-muted)}.mobile-task-detail-row span:last-child{color:var(--text);font-weight:500}.mobile-task-form{display:flex;flex-direction:column;gap:12px}.mobile-field-label{font-size:12px;font-weight:600;color:var(--text-muted);text-transform:uppercase;letter-spacing:.04em;margin-bottom:4px;display:block}.mobile-input{width:100%;min-height:var(--mobile-tap-target);padding:10px 14px;background:var(--surface);border:1px solid var(--border);border-radius:10px;color:var(--text);font-family:inherit;font-size:var(--mobile-font-base);outline:none;transition:border-color .12s ease}.mobile-input:focus{border-color:var(--accent)}.mobile-input-sm{min-height:var(--mobile-tap-target);padding:8px 12px}.mobile-agent-detail{display:flex;flex-direction:column;gap:12px}.mobile-agent-detail-status{display:flex;align-items:center;gap:8px}.mobile-agent-detail-status-text{font-size:14px;font-weight:500;text-transform:capitalize}.mobile-agent-detail-desc{font-size:14px;color:var(--text-muted);line-height:1.5;margin:0;overflow-wrap:anywhere}.mobile-view-canvas{padding-bottom:80px}.mobile-canvas-bar{display:flex;align-items:center;justify-content:space-between;padding:0 0 12px;border-bottom:1px solid var(--border);margin-bottom:12px}.mobile-canvas-meta{display:flex;flex-direction:column;gap:2px}.mobile-canvas-title{font-size:16px;font-weight:600;color:var(--text-strong)}.mobile-canvas-status{font-size:11px;font-weight:600;padding:2px 8px;border-radius:10px;text-transform:capitalize}.mobile-canvas-status[data-status=approved],.mobile-canvas-status[data-status=done]{background:#3fb95026;color:var(--success)}.mobile-canvas-status[data-status=in-progress],.mobile-canvas-status[data-status=doing]{background:#58a6ff26;color:var(--info)}.mobile-canvas-status[data-status=draft]{background:var(--bg-elev-3);color:var(--text-dim)}.mobile-canvas-actions{display:flex;align-items:center;gap:4px}.mobile-canvas-comment-count{position:absolute;top:2px;right:2px;background:var(--accent);color:#fff;font-size:9px;font-weight:700;border-radius:6px;padding:1px 4px;min-width:14px;text-align:center}.mobile-canvas-elements{display:flex;flex-direction:column;gap:10px}.mobile-canvas-element{background:var(--surface);border:2px solid var(--border);border-radius:12px;overflow:hidden;cursor:pointer}.mobile-canvas-element.selected{box-shadow:0 0 0 2px var(--accent)}.mobile-canvas-el-header{display:flex;align-items:center;gap:6px;padding:8px 12px}.mobile-canvas-el-type{font-size:11px;font-weight:600;text-transform:uppercase}.mobile-canvas-el-status{font-size:10px;padding:1px 6px;border-radius:8px;background:var(--bg-elev-3);color:var(--text-muted);margin-left:auto}.mobile-canvas-el-title{font-size:14px;font-weight:600;padding:8px 12px;color:var(--text-strong)}.mobile-canvas-el-content{font-size:13px;color:var(--text-muted);padding:0 12px 8px;line-height:1.4}.mobile-canvas-el-comments{display:flex;align-items:center;gap:4px;padding:6px 12px;border-top:1px solid var(--border);font-size:11px;color:var(--text-dim)}.mobile-canvas-comments{margin-top:16px;background:var(--surface);border:1px solid var(--border);border-radius:12px;overflow:hidden}.mobile-canvas-comments-header{display:flex;align-items:center;justify-content:space-between;padding:12px;border-bottom:1px solid var(--border)}.mobile-canvas-comments-header h4{margin:0;font-size:14px;font-weight:600}.mobile-canvas-comment-list{max-height:300px;overflow-y:auto;padding:12px}.mobile-canvas-comment{margin-bottom:12px}.mobile-canvas-comment-head{display:flex;align-items:center;gap:8px;margin-bottom:4px}.mobile-canvas-comment-head .mono{font-size:11px;font-weight:600}.mobile-canvas-comment-head .muted{font-size:11px;color:var(--text-dim);margin-left:auto}.mobile-canvas-comment-text{font-size:13px;color:var(--text-muted);line-height:1.4}.mobile-canvas-comment-input{display:flex;gap:8px;padding:12px;border-top:1px solid var(--border)}.mobile-canvas-comment-input .mobile-input{flex:1}.mobile-activity-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}.mobile-event-item{display:flex;align-items:flex-start;gap:10px;padding:10px 12px;background:var(--surface);border:1px solid var(--border);border-radius:10px;margin-bottom:4px;cursor:pointer}.mobile-event-kind{font-size:10px;font-weight:700;padding:2px 8px;border-radius:8px;background:var(--bg-elev-3);color:var(--text-muted);text-transform:uppercase;flex-shrink:0}.mobile-event-msg{flex:1;font-size:13px;color:var(--text);overflow-wrap:anywhere}.mobile-event-time{font-size:11px;color:var(--text-dim);flex-shrink:0}.mobile-submit-hero{background:linear-gradient(135deg,var(--accent-bg) 0%,var(--bg-elev) 100%);border:1px solid var(--accent-border);border-radius:16px;padding:16px;margin-bottom:16px}.mobile-submit-input{width:100%;background:var(--surface);border:1px solid var(--border);border-radius:12px;padding:12px;color:var(--text);font-family:inherit;font-size:var(--mobile-font-base);resize:none;outline:none;margin-bottom:12px}.mobile-submit-input:focus{border-color:var(--accent)}.mobile-submit-actions{display:flex;flex-direction:column;gap:10px}.mobile-submit-chips{display:flex;gap:6px;flex-wrap:wrap}.mobile-submit-chip{min-height:var(--mobile-tap-target);padding:10px 12px;border-radius:16px;font-size:12px;font-weight:500;background:var(--surface);border:1px solid var(--border);color:var(--text-muted);cursor:pointer;transition:all .12s ease}.mobile-submit-chip:hover{border-color:var(--accent-border);color:var(--accent)}.mobile-more-nav-item{display:flex;align-items:center;gap:14px;padding:14px 12px;background:var(--surface);border:1px solid var(--border);border-radius:12px;margin-bottom:6px;cursor:pointer;transition:all .12s ease}.mobile-more-nav-item:hover{border-color:var(--accent-border);background:var(--bg-elev-2)}.mobile-more-nav-icon{width:40px;height:40px;border-radius:10px;background:var(--bg-elev-2);color:var(--accent);display:flex;align-items:center;justify-content:center;flex-shrink:0}.mobile-more-nav-content{flex:1;min-width:0}.mobile-more-nav-label{font-size:15px;font-weight:600;color:var(--text-strong);display:flex;align-items:center;gap:8px}.mobile-more-nav-count{font-size:11px;font-weight:600;padding:1px 7px;border-radius:10px;background:var(--bg-elev-3);color:var(--text-muted)}.mobile-more-nav-desc{font-size:12px;color:var(--text-muted);display:block;margin-top:2px}.mobile-more-nav-arrow{color:var(--text-dim);flex-shrink:0}.mobile-config-list{display:flex;flex-direction:column;gap:0}.mobile-config-row{display:flex;align-items:flex-start;flex-wrap:wrap;gap:10px;padding:10px 0;border-bottom:1px solid var(--border)}.mobile-config-row:last-child{border-bottom:none}.mobile-config-key{flex:0 0 104px;display:flex;flex-direction:column;gap:2px}.mobile-config-key .mono{font-size:12px;font-weight:500;color:var(--text);word-break:break-all}.mobile-config-type{font-size:10px;color:var(--text-dim);text-transform:uppercase}.mobile-config-value{flex:1;min-width:0}.mobile-config-value .mobile-input{min-height:var(--mobile-tap-target);padding:6px 10px;font-size:13px}.mobile-toggle{position:relative;display:inline-flex;align-items:center;cursor:pointer;width:44px;height:24px}.mobile-toggle input{opacity:0;width:0;height:0;position:absolute}.mobile-toggle-slider{position:absolute;top:0;right:0;bottom:0;left:0;background:var(--bg-elev-3);border-radius:12px;transition:background .2s ease}.mobile-toggle-slider:before{content:"";position:absolute;left:2px;top:2px;width:20px;height:20px;background:#fff;border-radius:50%;transition:transform .2s ease}.mobile-toggle input:checked+.mobile-toggle-slider{background:var(--accent)}.mobile-toggle input:checked+.mobile-toggle-slider:before{transform:translate(20px)}.mobile-theme-btns{display:flex;gap:6px}.mobile-theme-btn{display:flex;align-items:center;gap:4px;min-height:var(--mobile-tap-target);padding:10px 12px;border-radius:16px;font-size:12px;font-weight:500;background:var(--surface);border:1px solid var(--border);color:var(--text-muted);cursor:pointer;transition:all .12s ease}.mobile-theme-btn.active{background:var(--accent-bg);border-color:var(--accent-border);color:var(--accent)}.mobile-accent-swatches{display:flex;gap:8px;flex-wrap:wrap}.mobile-accent-swatch{width:var(--mobile-tap-target);height:var(--mobile-tap-target);border-radius:50%;border:2px solid transparent;cursor:pointer;transition:transform .12s ease}.mobile-accent-swatch:hover{transform:scale(1.1)}.mobile-accent-swatch.active{border-color:#fff;box-shadow:0 0 0 2px var(--accent)}.mobile-settings-save-bar{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;padding:10px 16px;background:var(--warning);color:#000;font-size:13px;font-weight:500;margin:calc(-1 * var(--mobile-padding));margin-bottom:12px}.mobile-list-item-interactive{cursor:pointer;transition:all .12s ease}.mobile-list-item-interactive:hover{border-color:var(--accent-border);background:var(--bg-elev-2)}.mobile-list-item-interactive:active{opacity:.8}.mobile-list-status-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}.mobile-list-status-dot[data-status=working],.mobile-list-status-dot[data-status=doing]{background:var(--success)}.mobile-list-status-dot[data-status=error],.mobile-list-status-dot[data-status=stuck]{background:var(--error)}.mobile-list-status-dot[data-status=idle]{background:var(--text-dim)}.mobile-list-badge.badge-accent{background:var(--accent-bg);color:var(--accent)}.mobile-list-badge.badge-warning{background:#d2992226;color:var(--warning)}.mobile-btn-danger{background:var(--error);color:#fff}.mobile-btn-danger:active{opacity:.8}.mobile-artifact-iframe{width:100%;min-height:min(70dvh,560px);border:1px solid var(--border);border-radius:12px;background:#fff}@media (max-width: 420px){.mobile-config-key,.mobile-config-value{flex-basis:100%}.mobile-task-detail-row{flex-direction:column}.mobile-task-detail-row span:first-child,.mobile-task-detail-row span:last-child{flex:none;text-align:left}}.mobile-overview{display:flex;flex-direction:column;gap:16px}.mobile-hero{padding:20px 16px;background:linear-gradient(135deg,#8b5cf626,#3b82f61a);border:1px solid var(--border);border-radius:14px}.mobile-hero h1{margin:0 0 8px;font-size:24px;font-weight:700;line-height:1.2}.mobile-hero p{margin:0 0 12px;font-size:13px;color:var(--text-dim);line-height:1.4}.mobile-hero-input{width:100%;background:var(--surface-2);border:1px solid var(--border);border-radius:8px;padding:10px 12px;color:var(--text);font-size:14px;font-family:inherit;resize:vertical;margin-bottom:8px;box-sizing:border-box}.mobile-hero-submit{width:100%;padding:10px;background:var(--accent, #8b5cf6);color:#fff;border:none;border-radius:8px;font-weight:600;font-size:14px;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;gap:6px}.mobile-hero-submit:disabled{opacity:.5;cursor:not-allowed}.mobile-stats-stack{display:flex;flex-direction:column;gap:8px}.mobile-stat-card{display:flex;align-items:center;gap:14px;padding:14px 16px;background:var(--surface-1);border:1px solid var(--border);border-radius:10px}.mobile-stat-card.is-blue{border-left:4px solid #58a6ff}.mobile-stat-card.is-purple{border-left:4px solid #8b5cf6}.mobile-stat-card.is-green{border-left:4px solid #3fb950}.mobile-stat-card.is-yellow{border-left:4px solid #d29922}.mobile-stat-icon{display:flex;align-items:center;justify-content:center;width:40px;height:40px;border-radius:10px;background:var(--surface-2);color:var(--text);flex-shrink:0}.mobile-stat-body{flex:1;min-width:0}.mobile-stat-label{font-size:12px;color:var(--text-dim);text-transform:uppercase;letter-spacing:.05em}.mobile-stat-value{font-size:24px;font-weight:700;margin-top:2px}.mobile-stat-subtext{font-size:11px;color:var(--text-dim);margin-top:2px}.mobile-activity-card,.mobile-quick-actions{padding:16px;background:var(--surface-1);border:1px solid var(--border);border-radius:10px}.mobile-activity-card h3{margin:0 0 12px;font-size:14px;font-weight:600}.mobile-activity-list{list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:8px}.mobile-activity-item{display:flex;gap:8px;padding:8px;border-radius:6px;background:var(--surface-2);font-size:12px}.mobile-activity-time{color:var(--text-dim);font-variant-numeric:tabular-nums;flex-shrink:0}.mobile-activity-text{word-break:break-word}.mobile-quick-actions{display:flex;flex-direction:column;gap:8px}.mobile-quick-action{display:flex;align-items:center;gap:8px;padding:12px;background:var(--surface-2);border:1px solid var(--border);border-radius:8px;color:var(--text);font-size:14px;font-weight:500;text-align:left;cursor:pointer}@media (prefers-reduced-motion: reduce){*,*:before,*:after{animation-duration:.01ms!important;transition-duration:.01ms!important}}.mobile-layout{display:flex;flex-direction:column;height:100vh;height:100dvh;overflow:hidden;background:var(--bg)}.mobile-header{position:sticky;top:0;z-index:100;display:flex;align-items:center;gap:12px;height:56px;padding:0 16px;background:var(--surface-1, var(--surface, var(--bg-elev)));border-bottom:1px solid transparent;transition:border-color .2s ease}.mobile-header.is-scrolled{border-bottom-color:var(--border)}.mobile-header-title{flex:1;font-size:18px;font-weight:600;margin:0;color:var(--text-strong, var(--text))}.mobile-menu-btn,.mobile-search-btn,.mobile-settings-exit{background:transparent;border:none;color:var(--text);padding:8px;border-radius:8px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:background .12s ease}.mobile-menu-btn:hover,.mobile-search-btn:hover,.mobile-settings-exit:hover{background:var(--bg-elev-2, var(--bg-elev))}.mobile-menu-btn:active,.mobile-search-btn:active,.mobile-settings-exit:active{background:var(--bg-elev-3)}.mobile-content{flex:1 1 auto;min-height:0;overflow-y:auto;overflow-x:hidden;padding:12px 16px 80px;-webkit-overflow-scrolling:touch;overscroll-behavior:contain}.mobile-bottom-nav{position:fixed;bottom:0;left:0;right:0;display:flex;height:64px;background:var(--surface-1, var(--surface, var(--bg-elev)));border-top:1px solid var(--border);z-index:50;padding-bottom:env(safe-area-inset-bottom,0)}.mobile-nav-item{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;background:transparent;border:none;color:var(--text-dim, var(--text-muted));font-size:10px;font-family:inherit;cursor:pointer;padding:4px 0;transition:color .12s ease}.mobile-nav-item.is-active{color:var(--accent)}.mobile-nav-label{font-size:10px;font-weight:500;line-height:1}.mobile-drawer-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background:#00000080;z-index:60;animation:fadeIn .2s ease}.mobile-drawer{position:fixed;top:0;left:0;bottom:0;width:80%;max-width:320px;background:var(--surface-1, var(--surface, var(--bg-elev)));z-index:70;transform:translate(-100%);transition:transform .25s cubic-bezier(.4,0,.2,1);overflow-y:auto;-webkit-overflow-scrolling:touch;display:flex;flex-direction:column}.mobile-drawer.is-open{transform:translate(0)}.mobile-drawer-head{position:sticky;top:0;display:flex;align-items:center;justify-content:space-between;padding:16px;background:var(--surface-1, var(--surface, var(--bg-elev)));border-bottom:1px solid var(--border);flex-shrink:0}.mobile-drawer-head h2{font-size:18px;font-weight:600;margin:0;color:var(--text-strong, var(--text))}.mobile-drawer-close{background:transparent;border:none;color:var(--text);padding:8px;border-radius:8px;cursor:pointer;display:flex;align-items:center;justify-content:center}.mobile-drawer-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:8px;padding:16px;flex:1}.mobile-drawer-item{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;padding:16px 8px;background:var(--surface-2, var(--bg-elev-2));border:1px solid var(--border);border-radius:8px;color:var(--text);font-size:12px;font-family:inherit;cursor:pointer;min-height:80px;transition:border-color .12s ease,background .12s ease}.mobile-drawer-item.is-active{border-color:var(--accent);background:#8b5cf61a}.mobile-drawer-item:active{opacity:.8}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@media (min-width: 1024px){.mobile-layout,.mobile-bottom-nav,.mobile-drawer,.mobile-header{display:none}}
@@ -1,2 +1,2 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/mobile-layout-DqTxvXZp.js","assets/react-vendor-Dn4wqh4Z.js","assets/icons-OMEGx5KA.js","assets/mobile-layout-D6V-7WnA.css"])))=>i.map(i=>d[i]);
2
- import{r as n,j as s}from"./react-vendor-Dn4wqh4Z.js";import{b as Le,d as xe,bi as Ae,aM as Be,bj as Ue,bk as Pe,aC as Fe,R as We,bl as Ge,Z as qe,B as He,bm as be,X as Ke,i as Ye,U as Ve}from"./icons-OMEGx5KA.js";import{b as Qe,e as Je,a as O,A as le,_ as Xe}from"./mobile-layout-DqTxvXZp.js";import{M as Ze,r as es}from"./markdown-C6mXtQxD.js";function ss({items:i,renderItem:f,itemHeight:h=80,height:l=400,overscan:d=5,className:x}){const[g,S]=n.useState(0),j=n.useRef(null),E=n.useMemo(()=>{const C=Math.max(0,Math.floor(g/h)-d),I=Math.min(i.length,Math.ceil((g+l)/h)+d);return{start:C,end:I}},[g,h,l,d,i.length]),M=i.length*h,R=E.start*h,$=i.slice(E.start,E.end);return s.jsx("div",{ref:j,onScroll:C=>S(C.currentTarget.scrollTop),style:{height:l,overflowY:"auto"},className:x,children:s.jsx("div",{style:{height:M,position:"relative"},children:s.jsx("div",{style:{transform:`translateY(${R}px)`},children:$.map((C,I)=>s.jsx("div",{style:{height:h},children:f(C,E.start+I)},E.start+I))})})})}function ms({activeProject:i,sessionCount:f,sessionsOpen:h,infoOpen:l,onToggleSessions:d,onToggleInfo:x,onOpenOverview:g}){return s.jsxs("header",{className:"chat-topbar",children:[s.jsxs("button",{type:"button",className:"chat-topbar-project",onClick:g,children:[s.jsx(Le,{size:14}),s.jsx("span",{className:"chat-topbar-project-name",children:(i==null?void 0:i.name)??"No project"}),s.jsx(xe,{size:12})]}),s.jsx("div",{className:"chat-topbar-spacer"}),s.jsxs("button",{type:"button",className:`chat-topbar-btn ${h?"active":""}`,onClick:d,"aria-pressed":h,children:["Sessions (",f,")"]}),s.jsx("button",{type:"button",className:`chat-topbar-btn ${l?"active":""}`,onClick:x,"aria-pressed":l,children:"Info"})]})}function ts({count:i=3}){return s.jsx("div",{className:"chat-loading-skeleton","aria-label":"Loading messages",children:Array.from({length:i}).map((f,h)=>s.jsxs("div",{className:"chat-loading-skeleton-bubble",children:[s.jsx("div",{className:"chat-loading-skeleton-meta"}),s.jsx("div",{className:"chat-loading-skeleton-line"}),s.jsx("div",{className:"chat-loading-skeleton-line short"})]},h))})}function ns({projectName:i,onPickSuggestion:f}){const h=[{icon:s.jsx(Ae,{size:16}),title:i?`Explain ${i}`:"Explain this project",preview:"Give me a tour of the codebase, highlight the architecture, and call out any anti-patterns or hotspots.",prompt:i?`Explain the ${i} project. Give me a tour of the codebase, highlight the architecture, and call out any anti-patterns or hotspots.`:"Explain the current project. Give me a tour of the codebase, highlight the architecture, and call out any anti-patterns or hotspots."},{icon:s.jsx(Be,{size:16}),title:"Summarize recent sessions",preview:"Read my last 5 chat sessions and give me a 3-bullet summary of what I worked on and what got stuck.",prompt:"Read my last 5 chat sessions and give me a 3-bullet summary of what I worked on and what got stuck."},{icon:s.jsx(Ue,{size:16}),title:"Suggest a refactor",preview:"Look for the largest, most painful files in this project and propose a concrete refactor for the worst one.",prompt:"Look for the largest, most painful files in this project and propose a concrete refactor for the worst one."},{icon:s.jsx(Pe,{size:16}),title:"Find visual regressions",preview:"Open the dashboard, screenshot the Chat tab, and flag any layout problems or anti-patterns you see.",prompt:"Open the dashboard, screenshot the Chat tab, and flag any layout problems or anti-patterns you see."}];return s.jsx("div",{className:"chat-suggestions",children:h.map((l,d)=>s.jsxs("button",{type:"button",className:"chat-suggestion",onClick:()=>f(l.prompt),children:[s.jsxs("div",{className:"chat-suggestion-title",children:[l.icon,s.jsx("span",{children:l.title})]}),s.jsx("div",{className:"chat-suggestion-preview",children:l.preview})]},d))})}function ye({variant:i,projectName:f,onPickSuggestion:h}){if(i==="no-project")return s.jsxs("div",{className:"chat-welcome",children:[s.jsx("h1",{className:"chat-welcome-h1",children:s.jsx("span",{className:"chat-greeting-hello",children:"No project selected."})}),s.jsx("p",{className:"chat-welcome-subtitle",children:"Pick a project in Overview to scope chat sessions."})]});const l=f||"there";return s.jsxs("div",{className:"chat-welcome",children:[s.jsxs("h1",{className:"chat-welcome-h1",children:[s.jsx("span",{className:"chat-greeting-hello",children:"Hello, "}),s.jsxs("span",{className:"chat-greeting-name",children:[l,"."]})]}),s.jsx("p",{className:"chat-welcome-subtitle",children:"How can I help you today?"}),s.jsx(ns,{projectName:f,onPickSuggestion:h})]})}function as({message:i,pinned:f,onCopy:h,onDelete:l,onTogglePin:d,onRegenerate:x}){const g=(i.role||"assistant").toLowerCase(),S=i.ts?Qe(i.ts):"",j=i.content||i.message||"",E=g==="user";return s.jsxs("article",{className:`chat-message ${E?"chat-message-user":"chat-message-assistant"} ${f?"chat-message-pinned":""}`,children:[s.jsxs("header",{className:"chat-message-meta",children:[s.jsx("span",{className:"chat-message-role",children:g}),i.agent&&s.jsxs("span",{className:"chat-message-agent",children:["@",i.agent]}),S&&s.jsx("time",{className:"chat-message-time",children:S}),f&&s.jsx("span",{className:"chat-message-pin",children:"pinned"}),s.jsxs("div",{className:"chat-message-actions",children:[s.jsx("button",{type:"button",className:"chat-msg-action-btn",onClick:h,title:"Copy","aria-label":"Copy",children:s.jsx(Fe,{size:12})}),!E&&s.jsx("button",{type:"button",className:"chat-msg-action-btn",onClick:x,title:"Regenerate","aria-label":"Regenerate",children:s.jsx(We,{size:12})}),s.jsx("button",{type:"button",className:"chat-msg-action-btn",onClick:d,title:"Pin","aria-label":"Pin",children:s.jsx(Ge,{size:12})}),s.jsx("button",{type:"button",className:"chat-msg-action-btn chat-msg-action-btn-danger",onClick:l,title:"Delete","aria-label":"Delete",children:s.jsx(qe,{size:12})})]})]}),s.jsx("div",{className:"chat-message-content markdown-body",children:s.jsx(Ze,{remarkPlugins:[es],children:j})})]})}function ps({messages:i,loading:f,activeProject:h,sessionId:l,pinned:d,activeSource:x,onPickSuggestion:g,onCopy:S,onDelete:j,onTogglePin:E,onRegenerate:M}){const R=n.useRef(null);n.useEffect(()=>{const C=R.current;if(!C)return;let I=C.parentElement,P=!1;for(;I;){if(I.classList.contains("chat-thread-scroll")){P=!0;break}I=I.parentElement}P||(C.scrollTop=C.scrollHeight)},[i]);const $=x==="opencode"?"opencode":"bizar";return f?s.jsx("div",{className:"chat-thread legacy",ref:R,"data-stream":$,children:s.jsx(ts,{count:3})}):h?i.length===0?s.jsx("div",{className:"chat-thread legacy",ref:R,"data-stream":$,children:s.jsx(ye,{variant:"empty",projectName:h.name,onPickSuggestion:g})}):s.jsx("div",{className:"chat-thread legacy",ref:R,children:s.jsx(ss,{items:i,itemHeight:120,height:800,className:"chat-thread-virtual",renderItem:(C,I)=>s.jsx(as,{message:C,pinned:d.has(I),onCopy:()=>S(C),onDelete:()=>j(I),onTogglePin:()=>E(I),onRegenerate:()=>M(String(C.ts??I))})})}):s.jsx("div",{className:"chat-thread legacy",ref:R,"data-stream":$,children:s.jsx(ye,{variant:"no-project",projectName:"",onPickSuggestion:g})})}function rs({agent:i,setAgent:f,agents:h}){const[l,d]=n.useState(!1),x=n.useRef(null);n.useEffect(()=>{if(!l)return;const j=E=>{x.current&&!x.current.contains(E.target)&&d(!1)};return document.addEventListener("mousedown",j),()=>document.removeEventListener("mousedown",j)},[l]);const g=i||"no agent",S=g.startsWith("@")?g.slice(1):g;return s.jsxs("div",{className:"chat-agent-chip",ref:x,children:[s.jsxs("button",{type:"button",className:"chat-agent-chip-btn",onClick:()=>d(j=>!j),"aria-haspopup":"listbox","aria-expanded":l,children:[s.jsx(He,{size:14}),s.jsx("span",{children:S}),s.jsx(xe,{size:12,className:l?"rotated":""})]}),l&&s.jsxs("div",{className:"chat-agent-chip-menu",role:"listbox",children:[s.jsx("button",{type:"button",role:"option","aria-selected":!i,onClick:()=>{f(""),d(!1)},children:s.jsx("span",{children:"no agent"})}),h.map(j=>s.jsx("button",{type:"button",role:"option","aria-selected":i===j.name,onClick:()=>{f(j.name),d(!1)},children:s.jsxs("span",{children:["@",j.name]})},j.name))]})]})}function os(i,f,h=240){n.useLayoutEffect(()=>{const l=i.current;if(!l)return;l.style.height="auto";const d=Math.min(l.scrollHeight,h);l.style.height=`${d}px`,l.style.overflowY=l.scrollHeight>h?"auto":"hidden"},[i,f,h])}function hs({agent:i,setAgent:f,model:h,setModel:l,text:d,setText:x,sending:g,onSend:S,attachments:j,setAttachments:E,suggestions:M,onPickSuggestion:R,agents:$,onAttach:C}){const I=n.useRef(null),P=n.useRef(null);os(I,d,160);const F=b=>{if(b.key==="Enter"&&(b.metaKey||b.ctrlKey))b.preventDefault(),S();else if(b.key==="Enter"&&!b.shiftKey)b.preventDefault(),S();else if(b.key==="Tab"&&M.length){b.preventDefault();const D=M[0].cmd.split(" ")[0];x(`${D} `)}},W=b=>{const D=b.target.files;if(!D)return;const A=[];for(let G=0;G<D.length;G++)A.push(D[G].name);E(G=>[...G,...A]),b.target.value=""};return s.jsxs("div",{className:"chat-composer",children:[M.length>0&&s.jsx("div",{className:"chat-composer-suggestions",children:M.map(b=>s.jsxs("button",{type:"button",className:"chat-composer-suggestion",onClick:()=>{var A;const D=b.cmd.split(" ")[0];x(`${D} `),(A=I.current)==null||A.focus()},children:[s.jsx("span",{className:"mono",children:b.cmd}),s.jsx("span",{children:b.desc})]},b.cmd))}),j.length>0&&s.jsx("div",{className:"chat-composer-attachments",children:j.map((b,D)=>s.jsxs("span",{className:"chat-composer-attachment-tag",children:[s.jsx(be,{size:10})," ",b,s.jsx("button",{type:"button",className:"chat-composer-attachment-remove",onClick:()=>E(A=>A.filter((G,q)=>q!==D)),"aria-label":`Remove ${b}`,children:s.jsx(Ke,{size:10})})]},D))}),s.jsxs("div",{className:"chat-composer-input",children:[s.jsx(rs,{agent:i,setAgent:f,agents:$}),s.jsx("textarea",{ref:I,className:"chat-composer-textarea",placeholder:g?"Sending…":"Send a message…",rows:1,value:d,onChange:b=>x(b.target.value),onKeyDown:F,disabled:g,"aria-label":"Message"}),s.jsx("input",{ref:P,type:"file",multiple:!0,style:{display:"none"},onChange:W,"aria-label":"Attach files",tabIndex:-1}),s.jsx("button",{type:"button",className:"chat-attach-btn",onClick:C,title:"Attach files","aria-label":"Attach files",children:s.jsx(be,{size:14})}),s.jsx("button",{type:"button",className:"chat-attach-btn",onClick:async()=>{if(!d.trim())return;const b=await Je(d);b!==d&&x(b)},title:"Enhance prompt with AI","aria-label":"Enhance prompt",children:s.jsx(Ye,{size:14})}),s.jsx("button",{type:"button",className:"chat-send-btn",onClick:S,disabled:g||!d.trim(),title:"Send (Enter)","aria-label":"Send message",children:s.jsx(Ve,{size:16})})]})]})}function fs(i,f,h){const[l,d]=n.useState([]),[x,g]=n.useState([]),[S,j]=n.useState(""),[E,M]=n.useState(!0),[R,$]=n.useState({create:!1,send:!1,rename:!1,delete:!1}),[C,I]=n.useState([]),[P,F]=n.useState([]),[W,b]=n.useState(null),[D,A]=n.useState(null),[G,q]=n.useState(null),[je,Z]=n.useState(null),[we,ee]=n.useState(null),[se,ue]=n.useState({}),[de,me]=n.useState(!0),[Se,ce]=n.useState(0),[ke,pe]=n.useState(new Set),[Ce,he]=n.useState(new Set),V=n.useRef(null),v=n.useRef(null),T=n.useRef(null),ne=n.useRef(0),z=n.useRef(null),Q=n.useRef(null),Y=n.useRef(!1),J=n.useCallback(e=>{e&&F(a=>{if(e.id&&a.some(r=>r.id===e.id))return a;const t=a.findIndex(r=>typeof r.id=="string"&&r.id.startsWith("msg_")&&r.role===e.role&&(r.content||"")===(e.content||""));if(t>=0){const r=a.slice();return r[t]={...e,id:e.id??a[t].id},r}return[...a,e]})},[]),X=n.useCallback(e=>{e&&pe(a=>{if(a.has(e))return a;const t=new Set(a);return t.add(e),t})},[]),H=n.useCallback((e,a)=>{ue(t=>{const r=t[e]??{state:"idle",unread:0,pinned:!1};return{...t,[e]:{...r,...a}}})},[]),B=n.useCallback((e,a)=>{H(e,{state:a?"streaming":"idle"})},[H]),Ie=n.useCallback(e=>{v.current=e},[]),K=n.useCallback(async e=>{var a;try{const t=e?`/chat?session=${encodeURIComponent(e)}`:"/chat?limit=200",r=await O.get(t);d(r.messages||[]),g(r.sessions||[])}catch(t){(a=v.current)==null||a.error(`Chat load failed: ${t.message}`)}finally{M(!1)}},[]),ae=n.useCallback(async e=>{var a;M(!0);try{const t=await O.get(`/tasks/${encodeURIComponent(e)}/chat`);d(t.messages||[]),j(t.sessionId||e)}catch(t){(a=v.current)==null||a.error(`Task chat load failed: ${t.message}`)}finally{M(!1)}},[]),ie=n.useCallback(async()=>{try{const e=await O.get("/chat/sessions");g(e.sessions||[])}catch{}},[]),re=n.useCallback(async()=>{try{const a=((await O.get("/opencode-sessions")).sessions||[]).map(t=>({...t,source:"opencode",title:t.title||t.id}));I(a)}catch{}},[]),fe=n.useCallback(e=>{if(T.current){try{T.current.close()}catch{}T.current=null}z.current!==null&&(clearTimeout(z.current),z.current=null);const a=O.getToken(),t=a?`/api/opencode-sessions/${encodeURIComponent(e)}/stream?token=${encodeURIComponent(a)}`:`/api/opencode-sessions/${encodeURIComponent(e)}/stream`;Q.current=e,Y.current=!0,ne.current=0,q(null),Z(null),ee(null);const r=()=>{if(!Y.current||Q.current!==e)return;const o=new EventSource(t);T.current=o;const p=c=>{var w,_,L,U;if(!c||!c.type||c.sessionID&&c.sessionID!==e)return;const m=new Date().toISOString(),y=e;if(c.type==="message.user.created"||c.type==="message.user.updated"){const u=c.data;J({id:(u==null?void 0:u.messageID)??c.messageID,role:"user",content:((w=u==null?void 0:u.data)==null?void 0:w.content)??"",ts:m}),X((u==null?void 0:u.messageID)??c.messageID);return}if(c.type==="message.assistant.created"||c.type==="message.assistant.updated"){const u=c.data;J({id:(u==null?void 0:u.messageID)??c.messageID,role:"assistant",content:((_=u==null?void 0:u.data)==null?void 0:_.content)??"",ts:m}),X((u==null?void 0:u.messageID)??c.messageID),B(y,!0);return}if(c.type==="message.part.updated"){const u=c.data,ge=((L=u==null?void 0:u.part)==null?void 0:L.text)??"";if(!ge)return;J({id:(u==null?void 0:u.id)??(u==null?void 0:u.messageID)??c.messageID,role:"assistant",content:ge,ts:m}),X((u==null?void 0:u.id)??(u==null?void 0:u.messageID)??c.messageID),B(y,!0);return}if(c.type==="session.idle"||c.type==="message.assistant.completed"||c.type==="session.completed"){B(y,!1);return}if(c.type==="session.awaiting"||c.type==="session.awaiting_input"||c.type==="message.assistant.awaiting"){H(y,{state:"awaiting"});return}if(c.type==="session.error"){q(((U=c.data)==null?void 0:U.message)||"opencode session error");return}},k=c=>{if(!c)return null;try{const m=JSON.parse(c);if(typeof m.type=="string"){const y=m.properties,w=m.data??y,_=typeof m.sessionID=="string"?m.sessionID:typeof(y==null?void 0:y.sessionID)=="string"?y.sessionID:typeof(w==null?void 0:w.sessionID)=="string"?w.sessionID:void 0,L=typeof m.messageID=="string"?m.messageID:typeof(y==null?void 0:y.messageID)=="string"?y.messageID:typeof(w==null?void 0:w.messageID)=="string"?w.messageID:void 0;let U=m.type;const u=/\.\d+$/.exec(U);return u&&(U=U.slice(0,u.index)),{type:U,sessionID:_,messageID:L,data:m}}if(m.type==="sync"&&m.syncEvent&&typeof m.syncEvent=="object"){const y=m.syncEvent;let w=y.type||"";const _=/\.\d+$/.exec(w);_&&(w=w.slice(0,_.index));const L=y.data||{};return{type:w,sessionID:typeof L.sessionID=="string"?L.sessionID:void 0,messageID:typeof L.messageID=="string"?L.messageID:void 0,data:y}}return null}catch{return null}},N=["message.user.created","message.user.updated","message.assistant.created","message.assistant.updated","message.part.updated","session.idle","message.assistant.completed","session.completed","session.awaiting","session.awaiting_input","message.assistant.awaiting","session.error"];for(const c of N)o.addEventListener(c,m=>{p(k(m.data))});o.onerror=()=>{if(Q.current!==e)return;if(!Y.current){try{o.close()}catch{}T.current=null;return}try{o.close()}catch{}T.current=null;const c=ne.current+1;ne.current=c;const m=Math.min(3e4,1e3*2**(c-1));z.current!==null&&clearTimeout(z.current),z.current=window.setTimeout(()=>{z.current=null,Y.current&&Q.current===e&&r()},m)},o.onopen=()=>{ne.current=0,q(null),Z(null),ee(null)}};r()},[J,X,B,H]),te=n.useCallback(()=>{if(Y.current=!1,Q.current=null,z.current!==null&&(clearTimeout(z.current),z.current=null),T.current){try{T.current.close()}catch{}T.current=null}F([]),pe(new Set),q(null),Z(null),ee(null),A(null),b("bizar")},[]),oe=n.useCallback(async e=>{var a;if(Y.current=!1,T.current){try{T.current.close()}catch{}T.current=null}z.current!==null&&(clearTimeout(z.current),z.current=null),q(null),Z(null),ee(null),M(!0);try{const t=await O.get(`/opencode-sessions/${encodeURIComponent(e)}/messages`);F(t.messages||[])}catch(t){const r=t.message;let o=null;if(t instanceof le&&t.data&&typeof t.data=="object"){const p=t.data,k=p.error||"unknown",N=k!=="bad_request"&&k!=="too_many_subscribers"&&k!=="unauthorized";o={type:"session_load_failed",code:k,message:p.message||r,cause:p.cause,status:p.status,suggestion:p.suggestion??null,canRetry:N}}else t instanceof le&&(o={type:"session_load_failed",code:"unknown",message:r,suggestion:null,canRetry:!0});q(o?`Opencode session load failed (${o.code}): ${o.message}`:`Opencode session load failed: ${r}`),Z((o==null?void 0:o.suggestion)??null),ee(o),(a=v.current)==null||a.error(o?`Opencode session load failed: ${o.message}`:`Opencode session load failed: ${r}`),F([])}finally{M(!1)}A(e),b("opencode"),B(e,!1),fe(e)},[B,fe]),ve=n.useCallback(e=>{te(),j(e),b("bizar"),K(e),H(e,{unread:0})},[te,K,H]),Ne=n.useCallback(async()=>{var a,t,r,o,p;if(R.create)return{ok:!1};const e=f.defaultAgent||"odin";$(k=>({...k,create:!0}));try{try{const N=await O.post("/opencode-sessions/new",{agent:e});return await re(),await oe(N.id),(a=v.current)==null||a.success(`Session ${N.id} created.`),{ok:!0,source:"opencode",id:N.id}}catch(N){if(!(N instanceof le)||N.status!==503)return(t=v.current)==null||t.error(`Create failed: ${N.message}`),{ok:!1}}if(!i.activeProject)return(r=v.current)==null||r.error("Pick a project in Overview to scope chat sessions."),{ok:!1};const k=await O.post("/chat/sessions",{});return j(k.id),d([]),he(new Set),H(k.id,{state:"idle",unread:0}),await K(k.id),ie().catch(()=>{}),(o=v.current)==null||o.success(`Session ${k.id} created.`),{ok:!0,source:"bizar",id:k.id}}catch(k){return(p=v.current)==null||p.error(`Create failed: ${k.message}`),{ok:!1}}finally{$(k=>({...k,create:!1}))}},[R.create,f.defaultAgent,i.activeProject,re,oe,K,ie,H]),Re=n.useCallback(async(e,a,t,r)=>{var k,N,c;if(R.send)return{ok:!1};const o=e.trim();if(!o)return{ok:!1};if(W==="opencode"&&D){const m=D,y=`msg_${Date.now().toString(36)}${Math.random().toString(36).slice(2,8)}`,w={id:y,role:"user",content:o,agent:a,ts:new Date().toISOString()};J(w),X(y),$(_=>({..._,send:!0}));try{return await O.post(`/opencode-sessions/${encodeURIComponent(m)}/send`,{message:o,agent:a}),B(m,!0),{ok:!0}}catch(_){return F(L=>L.filter(U=>U.id!==y)),(k=v.current)==null||k.error(`Send failed: ${_.message}`),{ok:!1}}finally{$(_=>({..._,send:!1}))}}const p={role:"user",content:o,agent:a,ts:new Date().toISOString()};d(m=>[...m,p]),$(m=>({...m,send:!0})),B(S,!0);try{const m=await O.post("/chat",{message:o,agent:a,model:t,attachments:r||[]});if(m!=null&&m.messages)for(const y of m.messages)y.role==="assistant"&&d(w=>w.some(L=>L.ts===y.ts)?w:[...w,y]);else(N=v.current)==null||N.info("Still processing… the response will appear shortly.");return{ok:!0}}catch(m){return d(y=>y.filter(w=>w!==p)),(c=v.current)==null||c.error(`Send failed: ${m.message}`),{ok:!1}}finally{$(m=>({...m,send:!1})),B(S,!1)}},[W,D,J,X,B,S,R.send]),De=n.useCallback(async e=>{var a,t;if(!S){(a=v.current)==null||a.error("No active session to regenerate.");return}try{await O.post("/chat/regenerate",{sessionId:S,messageId:e}),await K(S)}catch(r){(t=v.current)==null||t.error(`Regenerate failed: ${r.message}`)}},[S,K]),$e=n.useCallback(e=>{W==="opencode"?F(a=>a.filter((t,r)=>r!==e)):d(a=>a.filter((t,r)=>r!==e))},[W]),Ee=n.useCallback(e=>{he(a=>{const t=new Set(a);return t.has(e)?t.delete(e):t.add(e),t})},[]),ze=n.useCallback(e=>{var t,r;const a=e.content||e.message||"";try{(t=navigator.clipboard)==null||t.writeText(a).then(()=>{var o;return(o=v.current)==null?void 0:o.success("Copied.")},()=>{var o;return(o=v.current)==null?void 0:o.error("Copy failed.")})}catch{(r=v.current)==null||r.error("Copy failed.")}},[]),Te=n.useCallback(()=>{const e=V.current;if(!e)return;const t=e.scrollHeight-e.scrollTop-e.clientHeight<32;me(t),t&&ce(0)},[]),Oe=n.useCallback(()=>{const e=V.current;e&&(e.scrollTop=e.scrollHeight,me(!0),ce(0))},[]),Me=n.useCallback(async(e,a)=>{var t,r,o;if(R.rename)return!1;$(p=>({...p,rename:!0}));try{const p=a.trim();return p?(C.some(N=>N.id===e)?(await O.patch(`/opencode-sessions/${encodeURIComponent(e)}`,{title:p}),I(N=>N.map(c=>c.id===e?{...c,title:p}:c))):(await O.post(`/chat/sessions/${encodeURIComponent(e)}/rename`,{title:p}),g(N=>N.map(c=>c.id===e?{...c,title:p}:c))),(r=v.current)==null||r.success("Renamed."),!0):((t=v.current)==null||t.error("Title cannot be empty."),!1)}catch(p){return(o=v.current)==null||o.error(`Rename failed: ${p.message}`),!1}finally{$(p=>({...p,rename:!1}))}},[R.rename,C]),_e=n.useCallback(async e=>{var a,t;if(R.delete)return!1;$(r=>({...r,delete:!0}));try{return C.some(o=>o.id===e)?(await O.del(`/opencode-sessions/${encodeURIComponent(e)}`),I(o=>o.filter(p=>p.id!==e)),D===e&&te()):(await O.del(`/chat/sessions/${encodeURIComponent(e)}`),g(o=>o.filter(p=>p.id!==e)),S===e&&(j(""),d([]))),ue(o=>{const p={...o};return delete p[e],p}),(a=v.current)==null||a.success("Session deleted."),!0}catch(r){return(t=v.current)==null||t.error(`Delete failed: ${r.message}`),!1}finally{$(r=>({...r,delete:!1}))}},[R.delete,C,D,te,S]);return n.useEffect(()=>{V.current&&(de?V.current.scrollTop=V.current.scrollHeight:ce(e=>e+1))},[l,P]),n.useEffect(()=>()=>{if(Y.current=!1,Q.current=null,z.current!==null&&(clearTimeout(z.current),z.current=null),T.current){try{T.current.close()}catch{}T.current=null}},[]),n.useEffect(()=>{h?ae(h):K(),re()},[]),n.useEffect(()=>{const e=a=>{var r;const t=(r=a.detail)==null?void 0:r.taskId;t&&ae(t)};return window.addEventListener("bizar:setChatTask",e),()=>window.removeEventListener("bizar:setChatTask",e)},[ae]),n.useEffect(()=>{let e=!1;return Xe(async()=>{const{Ws:a}=await import("./mobile-layout-DqTxvXZp.js").then(t=>t.w);return{Ws:a}},__vite__mapDeps([0,1,2,3])).then(({Ws:a})=>{if(e)return;new a().on(r=>{if(r.type!=="chat:message")return;const o=r.message;o&&d(p=>p.some(N=>N.ts===o.ts)?p:[...p,o])})}),()=>{e=!0}},[]),{messages:W==="opencode"?P:l,bizarMessages:l,opencodeMessages:P,sessions:x,opencodeSessions:C,sessionId:S,setSessionId:j,loading:E,sending:R.send,pinned:Ce,listRef:V,activeSource:W,activeOpencodeSessionId:D,opencodeError:G,opencodeSuggestion:je,opencodeErrorInfo:we,retryOpencodeSession:()=>{D&&oe(D)},sessionStates:se,busy:R,getSessionDisplay:e=>{var a,t,r,o;return{...e,state:((a=se[e.id])==null?void 0:a.state)??"idle",unread:((t=se[e.id])==null?void 0:t.unread)??0,pinned:((r=se[e.id])==null?void 0:r.pinned)??!1,tree:(o=se[e.id])==null?void 0:o.tree}},stickToBottom:de,newMessageCount:Se,handleScroll:Te,jumpToLatest:Oe,setToast:Ie,loadChat:K,loadTaskChat:ae,refreshSessions:ie,refreshOpencodeSessions:re,loadOpencodeSession:oe,closeOpencodeSession:te,selectBizarSession:ve,onCreateSession:Ne,onSend:Re,onRegenerate:De,deleteMessage:$e,togglePin:Ee,copyMessage:ze,renameSession:Me,deleteSession:_e,seenOpencodeMessages:ke}}const cs=[{cmd:"/visual-plan [on|off|status]",desc:"Toggle or view visual plan mode"},{cmd:"/plan new <slug> [template]",desc:"Create a new plan"},{cmd:"/plan list",desc:"List all plans"},{cmd:"/plan open <slug>",desc:"Open a plan in the viewer"},{cmd:"/plan status <slug> <status>",desc:"Set plan status"},{cmd:"/plan get <slug>",desc:"Fetch plan canvas"},{cmd:"/plan add <slug> --title T --type kind",desc:"Add element to a plan"},{cmd:"/plan update <slug> <id>",desc:"Update a plan element"},{cmd:"/plan delete <slug> <id>",desc:"Delete a plan element"},{cmd:'/plan comment <slug> [id] "text"',desc:"Add a comment"},{cmd:"/plan comments <slug> [id]",desc:"Read plan comments"},{cmd:"/bizar",desc:"Launch Bizar dashboard"},{cmd:"/bizar <args>",desc:"Route via Bizar menu"},{cmd:"/audit",desc:"Run security audit"},{cmd:"/explain <q>",desc:"Read-only code Q&A"},{cmd:"/init",desc:"Initialize .bizar/ in this project"},{cmd:"/learn",desc:"Extract patterns from session"},{cmd:"/pr-review",desc:"PR review"},{cmd:"/help | /commands",desc:"Show all Bizar commands"}];function gs(i){const[f,h]=n.useState(""),l=n.useMemo(()=>[...cs,...(i.mods||[]).flatMap(x=>{var g;return(g=x.entry)!=null&&g.command?[{cmd:`/${x.id}`,desc:x.description||x.name,mod:x.id}]:[]})],[i.mods]),d=n.useMemo(()=>{if(!f.startsWith("/")||f.includes(" "))return[];const x=f.toLowerCase();return l.filter(g=>g.cmd.toLowerCase().startsWith(x)).slice(0,6)},[f,l]);return{allCommands:l,suggestions:d,setQuery:h}}export{hs as C,ss as V,gs as a,ms as b,ps as c,fs as u};
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/mobile-layout-BjkoHh1W.js","assets/react-vendor-Dn4wqh4Z.js","assets/icons-CMPxNV8t.js","assets/mobile-layout-CJnZNLy3.css"])))=>i.map(i=>d[i]);
2
+ import{r as n,j as s}from"./react-vendor-Dn4wqh4Z.js";import{b as Le,d as xe,bh as Ae,aM as Be,bi as Ue,bj as Pe,aC as Fe,R as We,bk as Ge,Z as qe,B as He,bl as be,X as Ke,i as Ye,U as Ve}from"./icons-CMPxNV8t.js";import{b as Qe,e as Je,a as O,A as le,_ as Xe}from"./mobile-layout-BjkoHh1W.js";import{M as Ze,r as es}from"./markdown-C6mXtQxD.js";function ss({items:i,renderItem:f,itemHeight:h=80,height:l=400,overscan:d=5,className:x}){const[g,S]=n.useState(0),j=n.useRef(null),E=n.useMemo(()=>{const C=Math.max(0,Math.floor(g/h)-d),I=Math.min(i.length,Math.ceil((g+l)/h)+d);return{start:C,end:I}},[g,h,l,d,i.length]),M=i.length*h,R=E.start*h,$=i.slice(E.start,E.end);return s.jsx("div",{ref:j,onScroll:C=>S(C.currentTarget.scrollTop),style:{height:l,overflowY:"auto"},className:x,children:s.jsx("div",{style:{height:M,position:"relative"},children:s.jsx("div",{style:{transform:`translateY(${R}px)`},children:$.map((C,I)=>s.jsx("div",{style:{height:h},children:f(C,E.start+I)},E.start+I))})})})}function ms({activeProject:i,sessionCount:f,sessionsOpen:h,infoOpen:l,onToggleSessions:d,onToggleInfo:x,onOpenOverview:g}){return s.jsxs("header",{className:"chat-topbar",children:[s.jsxs("button",{type:"button",className:"chat-topbar-project",onClick:g,children:[s.jsx(Le,{size:14}),s.jsx("span",{className:"chat-topbar-project-name",children:(i==null?void 0:i.name)??"No project"}),s.jsx(xe,{size:12})]}),s.jsx("div",{className:"chat-topbar-spacer"}),s.jsxs("button",{type:"button",className:`chat-topbar-btn ${h?"active":""}`,onClick:d,"aria-pressed":h,children:["Sessions (",f,")"]}),s.jsx("button",{type:"button",className:`chat-topbar-btn ${l?"active":""}`,onClick:x,"aria-pressed":l,children:"Info"})]})}function ts({count:i=3}){return s.jsx("div",{className:"chat-loading-skeleton","aria-label":"Loading messages",children:Array.from({length:i}).map((f,h)=>s.jsxs("div",{className:"chat-loading-skeleton-bubble",children:[s.jsx("div",{className:"chat-loading-skeleton-meta"}),s.jsx("div",{className:"chat-loading-skeleton-line"}),s.jsx("div",{className:"chat-loading-skeleton-line short"})]},h))})}function ns({projectName:i,onPickSuggestion:f}){const h=[{icon:s.jsx(Ae,{size:16}),title:i?`Explain ${i}`:"Explain this project",preview:"Give me a tour of the codebase, highlight the architecture, and call out any anti-patterns or hotspots.",prompt:i?`Explain the ${i} project. Give me a tour of the codebase, highlight the architecture, and call out any anti-patterns or hotspots.`:"Explain the current project. Give me a tour of the codebase, highlight the architecture, and call out any anti-patterns or hotspots."},{icon:s.jsx(Be,{size:16}),title:"Summarize recent sessions",preview:"Read my last 5 chat sessions and give me a 3-bullet summary of what I worked on and what got stuck.",prompt:"Read my last 5 chat sessions and give me a 3-bullet summary of what I worked on and what got stuck."},{icon:s.jsx(Ue,{size:16}),title:"Suggest a refactor",preview:"Look for the largest, most painful files in this project and propose a concrete refactor for the worst one.",prompt:"Look for the largest, most painful files in this project and propose a concrete refactor for the worst one."},{icon:s.jsx(Pe,{size:16}),title:"Find visual regressions",preview:"Open the dashboard, screenshot the Chat tab, and flag any layout problems or anti-patterns you see.",prompt:"Open the dashboard, screenshot the Chat tab, and flag any layout problems or anti-patterns you see."}];return s.jsx("div",{className:"chat-suggestions",children:h.map((l,d)=>s.jsxs("button",{type:"button",className:"chat-suggestion",onClick:()=>f(l.prompt),children:[s.jsxs("div",{className:"chat-suggestion-title",children:[l.icon,s.jsx("span",{children:l.title})]}),s.jsx("div",{className:"chat-suggestion-preview",children:l.preview})]},d))})}function ye({variant:i,projectName:f,onPickSuggestion:h}){if(i==="no-project")return s.jsxs("div",{className:"chat-welcome",children:[s.jsx("h1",{className:"chat-welcome-h1",children:s.jsx("span",{className:"chat-greeting-hello",children:"No project selected."})}),s.jsx("p",{className:"chat-welcome-subtitle",children:"Pick a project in Overview to scope chat sessions."})]});const l=f||"there";return s.jsxs("div",{className:"chat-welcome",children:[s.jsxs("h1",{className:"chat-welcome-h1",children:[s.jsx("span",{className:"chat-greeting-hello",children:"Hello, "}),s.jsxs("span",{className:"chat-greeting-name",children:[l,"."]})]}),s.jsx("p",{className:"chat-welcome-subtitle",children:"How can I help you today?"}),s.jsx(ns,{projectName:f,onPickSuggestion:h})]})}function as({message:i,pinned:f,onCopy:h,onDelete:l,onTogglePin:d,onRegenerate:x}){const g=(i.role||"assistant").toLowerCase(),S=i.ts?Qe(i.ts):"",j=i.content||i.message||"",E=g==="user";return s.jsxs("article",{className:`chat-message ${E?"chat-message-user":"chat-message-assistant"} ${f?"chat-message-pinned":""}`,children:[s.jsxs("header",{className:"chat-message-meta",children:[s.jsx("span",{className:"chat-message-role",children:g}),i.agent&&s.jsxs("span",{className:"chat-message-agent",children:["@",i.agent]}),S&&s.jsx("time",{className:"chat-message-time",children:S}),f&&s.jsx("span",{className:"chat-message-pin",children:"pinned"}),s.jsxs("div",{className:"chat-message-actions",children:[s.jsx("button",{type:"button",className:"chat-msg-action-btn",onClick:h,title:"Copy","aria-label":"Copy",children:s.jsx(Fe,{size:12})}),!E&&s.jsx("button",{type:"button",className:"chat-msg-action-btn",onClick:x,title:"Regenerate","aria-label":"Regenerate",children:s.jsx(We,{size:12})}),s.jsx("button",{type:"button",className:"chat-msg-action-btn",onClick:d,title:"Pin","aria-label":"Pin",children:s.jsx(Ge,{size:12})}),s.jsx("button",{type:"button",className:"chat-msg-action-btn chat-msg-action-btn-danger",onClick:l,title:"Delete","aria-label":"Delete",children:s.jsx(qe,{size:12})})]})]}),s.jsx("div",{className:"chat-message-content markdown-body",children:s.jsx(Ze,{remarkPlugins:[es],children:j})})]})}function ps({messages:i,loading:f,activeProject:h,sessionId:l,pinned:d,activeSource:x,onPickSuggestion:g,onCopy:S,onDelete:j,onTogglePin:E,onRegenerate:M}){const R=n.useRef(null);n.useEffect(()=>{const C=R.current;if(!C)return;let I=C.parentElement,P=!1;for(;I;){if(I.classList.contains("chat-thread-scroll")){P=!0;break}I=I.parentElement}P||(C.scrollTop=C.scrollHeight)},[i]);const $=x==="opencode"?"opencode":"bizar";return f?s.jsx("div",{className:"chat-thread legacy",ref:R,"data-stream":$,children:s.jsx(ts,{count:3})}):h?i.length===0?s.jsx("div",{className:"chat-thread legacy",ref:R,"data-stream":$,children:s.jsx(ye,{variant:"empty",projectName:h.name,onPickSuggestion:g})}):s.jsx("div",{className:"chat-thread legacy",ref:R,children:s.jsx(ss,{items:i,itemHeight:120,height:800,className:"chat-thread-virtual",renderItem:(C,I)=>s.jsx(as,{message:C,pinned:d.has(I),onCopy:()=>S(C),onDelete:()=>j(I),onTogglePin:()=>E(I),onRegenerate:()=>M(String(C.ts??I))})})}):s.jsx("div",{className:"chat-thread legacy",ref:R,"data-stream":$,children:s.jsx(ye,{variant:"no-project",projectName:"",onPickSuggestion:g})})}function rs({agent:i,setAgent:f,agents:h}){const[l,d]=n.useState(!1),x=n.useRef(null);n.useEffect(()=>{if(!l)return;const j=E=>{x.current&&!x.current.contains(E.target)&&d(!1)};return document.addEventListener("mousedown",j),()=>document.removeEventListener("mousedown",j)},[l]);const g=i||"no agent",S=g.startsWith("@")?g.slice(1):g;return s.jsxs("div",{className:"chat-agent-chip",ref:x,children:[s.jsxs("button",{type:"button",className:"chat-agent-chip-btn",onClick:()=>d(j=>!j),"aria-haspopup":"listbox","aria-expanded":l,children:[s.jsx(He,{size:14}),s.jsx("span",{children:S}),s.jsx(xe,{size:12,className:l?"rotated":""})]}),l&&s.jsxs("div",{className:"chat-agent-chip-menu",role:"listbox",children:[s.jsx("button",{type:"button",role:"option","aria-selected":!i,onClick:()=>{f(""),d(!1)},children:s.jsx("span",{children:"no agent"})}),h.map(j=>s.jsx("button",{type:"button",role:"option","aria-selected":i===j.name,onClick:()=>{f(j.name),d(!1)},children:s.jsxs("span",{children:["@",j.name]})},j.name))]})]})}function os(i,f,h=240){n.useLayoutEffect(()=>{const l=i.current;if(!l)return;l.style.height="auto";const d=Math.min(l.scrollHeight,h);l.style.height=`${d}px`,l.style.overflowY=l.scrollHeight>h?"auto":"hidden"},[i,f,h])}function hs({agent:i,setAgent:f,model:h,setModel:l,text:d,setText:x,sending:g,onSend:S,attachments:j,setAttachments:E,suggestions:M,onPickSuggestion:R,agents:$,onAttach:C}){const I=n.useRef(null),P=n.useRef(null);os(I,d,160);const F=b=>{if(b.key==="Enter"&&(b.metaKey||b.ctrlKey))b.preventDefault(),S();else if(b.key==="Enter"&&!b.shiftKey)b.preventDefault(),S();else if(b.key==="Tab"&&M.length){b.preventDefault();const D=M[0].cmd.split(" ")[0];x(`${D} `)}},W=b=>{const D=b.target.files;if(!D)return;const A=[];for(let G=0;G<D.length;G++)A.push(D[G].name);E(G=>[...G,...A]),b.target.value=""};return s.jsxs("div",{className:"chat-composer",children:[M.length>0&&s.jsx("div",{className:"chat-composer-suggestions",children:M.map(b=>s.jsxs("button",{type:"button",className:"chat-composer-suggestion",onClick:()=>{var A;const D=b.cmd.split(" ")[0];x(`${D} `),(A=I.current)==null||A.focus()},children:[s.jsx("span",{className:"mono",children:b.cmd}),s.jsx("span",{children:b.desc})]},b.cmd))}),j.length>0&&s.jsx("div",{className:"chat-composer-attachments",children:j.map((b,D)=>s.jsxs("span",{className:"chat-composer-attachment-tag",children:[s.jsx(be,{size:10})," ",b,s.jsx("button",{type:"button",className:"chat-composer-attachment-remove",onClick:()=>E(A=>A.filter((G,q)=>q!==D)),"aria-label":`Remove ${b}`,children:s.jsx(Ke,{size:10})})]},D))}),s.jsxs("div",{className:"chat-composer-input",children:[s.jsx(rs,{agent:i,setAgent:f,agents:$}),s.jsx("textarea",{ref:I,className:"chat-composer-textarea",placeholder:g?"Sending…":"Send a message…",rows:1,value:d,onChange:b=>x(b.target.value),onKeyDown:F,disabled:g,"aria-label":"Message"}),s.jsx("input",{ref:P,type:"file",multiple:!0,style:{display:"none"},onChange:W,"aria-label":"Attach files",tabIndex:-1}),s.jsx("button",{type:"button",className:"chat-attach-btn",onClick:C,title:"Attach files","aria-label":"Attach files",children:s.jsx(be,{size:14})}),s.jsx("button",{type:"button",className:"chat-attach-btn",onClick:async()=>{if(!d.trim())return;const b=await Je(d);b!==d&&x(b)},title:"Enhance prompt with AI","aria-label":"Enhance prompt",children:s.jsx(Ye,{size:14})}),s.jsx("button",{type:"button",className:"chat-send-btn",onClick:S,disabled:g||!d.trim(),title:"Send (Enter)","aria-label":"Send message",children:s.jsx(Ve,{size:16})})]})]})}function fs(i,f,h){const[l,d]=n.useState([]),[x,g]=n.useState([]),[S,j]=n.useState(""),[E,M]=n.useState(!0),[R,$]=n.useState({create:!1,send:!1,rename:!1,delete:!1}),[C,I]=n.useState([]),[P,F]=n.useState([]),[W,b]=n.useState(null),[D,A]=n.useState(null),[G,q]=n.useState(null),[je,Z]=n.useState(null),[we,ee]=n.useState(null),[se,ue]=n.useState({}),[de,me]=n.useState(!0),[Se,ce]=n.useState(0),[ke,pe]=n.useState(new Set),[Ce,he]=n.useState(new Set),V=n.useRef(null),v=n.useRef(null),T=n.useRef(null),ne=n.useRef(0),z=n.useRef(null),Q=n.useRef(null),Y=n.useRef(!1),J=n.useCallback(e=>{e&&F(a=>{if(e.id&&a.some(r=>r.id===e.id))return a;const t=a.findIndex(r=>typeof r.id=="string"&&r.id.startsWith("msg_")&&r.role===e.role&&(r.content||"")===(e.content||""));if(t>=0){const r=a.slice();return r[t]={...e,id:e.id??a[t].id},r}return[...a,e]})},[]),X=n.useCallback(e=>{e&&pe(a=>{if(a.has(e))return a;const t=new Set(a);return t.add(e),t})},[]),H=n.useCallback((e,a)=>{ue(t=>{const r=t[e]??{state:"idle",unread:0,pinned:!1};return{...t,[e]:{...r,...a}}})},[]),B=n.useCallback((e,a)=>{H(e,{state:a?"streaming":"idle"})},[H]),Ie=n.useCallback(e=>{v.current=e},[]),K=n.useCallback(async e=>{var a;try{const t=e?`/chat?session=${encodeURIComponent(e)}`:"/chat?limit=200",r=await O.get(t);d(r.messages||[]),g(r.sessions||[])}catch(t){(a=v.current)==null||a.error(`Chat load failed: ${t.message}`)}finally{M(!1)}},[]),ae=n.useCallback(async e=>{var a;M(!0);try{const t=await O.get(`/tasks/${encodeURIComponent(e)}/chat`);d(t.messages||[]),j(t.sessionId||e)}catch(t){(a=v.current)==null||a.error(`Task chat load failed: ${t.message}`)}finally{M(!1)}},[]),ie=n.useCallback(async()=>{try{const e=await O.get("/chat/sessions");g(e.sessions||[])}catch{}},[]),re=n.useCallback(async()=>{try{const a=((await O.get("/opencode-sessions")).sessions||[]).map(t=>({...t,source:"opencode",title:t.title||t.id}));I(a)}catch{}},[]),fe=n.useCallback(e=>{if(T.current){try{T.current.close()}catch{}T.current=null}z.current!==null&&(clearTimeout(z.current),z.current=null);const a=O.getToken(),t=a?`/api/opencode-sessions/${encodeURIComponent(e)}/stream?token=${encodeURIComponent(a)}`:`/api/opencode-sessions/${encodeURIComponent(e)}/stream`;Q.current=e,Y.current=!0,ne.current=0,q(null),Z(null),ee(null);const r=()=>{if(!Y.current||Q.current!==e)return;const o=new EventSource(t);T.current=o;const p=c=>{var w,_,L,U;if(!c||!c.type||c.sessionID&&c.sessionID!==e)return;const m=new Date().toISOString(),y=e;if(c.type==="message.user.created"||c.type==="message.user.updated"){const u=c.data;J({id:(u==null?void 0:u.messageID)??c.messageID,role:"user",content:((w=u==null?void 0:u.data)==null?void 0:w.content)??"",ts:m}),X((u==null?void 0:u.messageID)??c.messageID);return}if(c.type==="message.assistant.created"||c.type==="message.assistant.updated"){const u=c.data;J({id:(u==null?void 0:u.messageID)??c.messageID,role:"assistant",content:((_=u==null?void 0:u.data)==null?void 0:_.content)??"",ts:m}),X((u==null?void 0:u.messageID)??c.messageID),B(y,!0);return}if(c.type==="message.part.updated"){const u=c.data,ge=((L=u==null?void 0:u.part)==null?void 0:L.text)??"";if(!ge)return;J({id:(u==null?void 0:u.id)??(u==null?void 0:u.messageID)??c.messageID,role:"assistant",content:ge,ts:m}),X((u==null?void 0:u.id)??(u==null?void 0:u.messageID)??c.messageID),B(y,!0);return}if(c.type==="session.idle"||c.type==="message.assistant.completed"||c.type==="session.completed"){B(y,!1);return}if(c.type==="session.awaiting"||c.type==="session.awaiting_input"||c.type==="message.assistant.awaiting"){H(y,{state:"awaiting"});return}if(c.type==="session.error"){q(((U=c.data)==null?void 0:U.message)||"opencode session error");return}},k=c=>{if(!c)return null;try{const m=JSON.parse(c);if(typeof m.type=="string"){const y=m.properties,w=m.data??y,_=typeof m.sessionID=="string"?m.sessionID:typeof(y==null?void 0:y.sessionID)=="string"?y.sessionID:typeof(w==null?void 0:w.sessionID)=="string"?w.sessionID:void 0,L=typeof m.messageID=="string"?m.messageID:typeof(y==null?void 0:y.messageID)=="string"?y.messageID:typeof(w==null?void 0:w.messageID)=="string"?w.messageID:void 0;let U=m.type;const u=/\.\d+$/.exec(U);return u&&(U=U.slice(0,u.index)),{type:U,sessionID:_,messageID:L,data:m}}if(m.type==="sync"&&m.syncEvent&&typeof m.syncEvent=="object"){const y=m.syncEvent;let w=y.type||"";const _=/\.\d+$/.exec(w);_&&(w=w.slice(0,_.index));const L=y.data||{};return{type:w,sessionID:typeof L.sessionID=="string"?L.sessionID:void 0,messageID:typeof L.messageID=="string"?L.messageID:void 0,data:y}}return null}catch{return null}},N=["message.user.created","message.user.updated","message.assistant.created","message.assistant.updated","message.part.updated","session.idle","message.assistant.completed","session.completed","session.awaiting","session.awaiting_input","message.assistant.awaiting","session.error"];for(const c of N)o.addEventListener(c,m=>{p(k(m.data))});o.onerror=()=>{if(Q.current!==e)return;if(!Y.current){try{o.close()}catch{}T.current=null;return}try{o.close()}catch{}T.current=null;const c=ne.current+1;ne.current=c;const m=Math.min(3e4,1e3*2**(c-1));z.current!==null&&clearTimeout(z.current),z.current=window.setTimeout(()=>{z.current=null,Y.current&&Q.current===e&&r()},m)},o.onopen=()=>{ne.current=0,q(null),Z(null),ee(null)}};r()},[J,X,B,H]),te=n.useCallback(()=>{if(Y.current=!1,Q.current=null,z.current!==null&&(clearTimeout(z.current),z.current=null),T.current){try{T.current.close()}catch{}T.current=null}F([]),pe(new Set),q(null),Z(null),ee(null),A(null),b("bizar")},[]),oe=n.useCallback(async e=>{var a;if(Y.current=!1,T.current){try{T.current.close()}catch{}T.current=null}z.current!==null&&(clearTimeout(z.current),z.current=null),q(null),Z(null),ee(null),M(!0);try{const t=await O.get(`/opencode-sessions/${encodeURIComponent(e)}/messages`);F(t.messages||[])}catch(t){const r=t.message;let o=null;if(t instanceof le&&t.data&&typeof t.data=="object"){const p=t.data,k=p.error||"unknown",N=k!=="bad_request"&&k!=="too_many_subscribers"&&k!=="unauthorized";o={type:"session_load_failed",code:k,message:p.message||r,cause:p.cause,status:p.status,suggestion:p.suggestion??null,canRetry:N}}else t instanceof le&&(o={type:"session_load_failed",code:"unknown",message:r,suggestion:null,canRetry:!0});q(o?`Opencode session load failed (${o.code}): ${o.message}`:`Opencode session load failed: ${r}`),Z((o==null?void 0:o.suggestion)??null),ee(o),(a=v.current)==null||a.error(o?`Opencode session load failed: ${o.message}`:`Opencode session load failed: ${r}`),F([])}finally{M(!1)}A(e),b("opencode"),B(e,!1),fe(e)},[B,fe]),ve=n.useCallback(e=>{te(),j(e),b("bizar"),K(e),H(e,{unread:0})},[te,K,H]),Ne=n.useCallback(async()=>{var a,t,r,o,p;if(R.create)return{ok:!1};const e=f.defaultAgent||"odin";$(k=>({...k,create:!0}));try{try{const N=await O.post("/opencode-sessions/new",{agent:e});return await re(),await oe(N.id),(a=v.current)==null||a.success(`Session ${N.id} created.`),{ok:!0,source:"opencode",id:N.id}}catch(N){if(!(N instanceof le)||N.status!==503)return(t=v.current)==null||t.error(`Create failed: ${N.message}`),{ok:!1}}if(!i.activeProject)return(r=v.current)==null||r.error("Pick a project in Overview to scope chat sessions."),{ok:!1};const k=await O.post("/chat/sessions",{});return j(k.id),d([]),he(new Set),H(k.id,{state:"idle",unread:0}),await K(k.id),ie().catch(()=>{}),(o=v.current)==null||o.success(`Session ${k.id} created.`),{ok:!0,source:"bizar",id:k.id}}catch(k){return(p=v.current)==null||p.error(`Create failed: ${k.message}`),{ok:!1}}finally{$(k=>({...k,create:!1}))}},[R.create,f.defaultAgent,i.activeProject,re,oe,K,ie,H]),Re=n.useCallback(async(e,a,t,r)=>{var k,N,c;if(R.send)return{ok:!1};const o=e.trim();if(!o)return{ok:!1};if(W==="opencode"&&D){const m=D,y=`msg_${Date.now().toString(36)}${Math.random().toString(36).slice(2,8)}`,w={id:y,role:"user",content:o,agent:a,ts:new Date().toISOString()};J(w),X(y),$(_=>({..._,send:!0}));try{return await O.post(`/opencode-sessions/${encodeURIComponent(m)}/send`,{message:o,agent:a}),B(m,!0),{ok:!0}}catch(_){return F(L=>L.filter(U=>U.id!==y)),(k=v.current)==null||k.error(`Send failed: ${_.message}`),{ok:!1}}finally{$(_=>({..._,send:!1}))}}const p={role:"user",content:o,agent:a,ts:new Date().toISOString()};d(m=>[...m,p]),$(m=>({...m,send:!0})),B(S,!0);try{const m=await O.post("/chat",{message:o,agent:a,model:t,attachments:r||[]});if(m!=null&&m.messages)for(const y of m.messages)y.role==="assistant"&&d(w=>w.some(L=>L.ts===y.ts)?w:[...w,y]);else(N=v.current)==null||N.info("Still processing… the response will appear shortly.");return{ok:!0}}catch(m){return d(y=>y.filter(w=>w!==p)),(c=v.current)==null||c.error(`Send failed: ${m.message}`),{ok:!1}}finally{$(m=>({...m,send:!1})),B(S,!1)}},[W,D,J,X,B,S,R.send]),De=n.useCallback(async e=>{var a,t;if(!S){(a=v.current)==null||a.error("No active session to regenerate.");return}try{await O.post("/chat/regenerate",{sessionId:S,messageId:e}),await K(S)}catch(r){(t=v.current)==null||t.error(`Regenerate failed: ${r.message}`)}},[S,K]),$e=n.useCallback(e=>{W==="opencode"?F(a=>a.filter((t,r)=>r!==e)):d(a=>a.filter((t,r)=>r!==e))},[W]),Ee=n.useCallback(e=>{he(a=>{const t=new Set(a);return t.has(e)?t.delete(e):t.add(e),t})},[]),ze=n.useCallback(e=>{var t,r;const a=e.content||e.message||"";try{(t=navigator.clipboard)==null||t.writeText(a).then(()=>{var o;return(o=v.current)==null?void 0:o.success("Copied.")},()=>{var o;return(o=v.current)==null?void 0:o.error("Copy failed.")})}catch{(r=v.current)==null||r.error("Copy failed.")}},[]),Te=n.useCallback(()=>{const e=V.current;if(!e)return;const t=e.scrollHeight-e.scrollTop-e.clientHeight<32;me(t),t&&ce(0)},[]),Oe=n.useCallback(()=>{const e=V.current;e&&(e.scrollTop=e.scrollHeight,me(!0),ce(0))},[]),Me=n.useCallback(async(e,a)=>{var t,r,o;if(R.rename)return!1;$(p=>({...p,rename:!0}));try{const p=a.trim();return p?(C.some(N=>N.id===e)?(await O.patch(`/opencode-sessions/${encodeURIComponent(e)}`,{title:p}),I(N=>N.map(c=>c.id===e?{...c,title:p}:c))):(await O.post(`/chat/sessions/${encodeURIComponent(e)}/rename`,{title:p}),g(N=>N.map(c=>c.id===e?{...c,title:p}:c))),(r=v.current)==null||r.success("Renamed."),!0):((t=v.current)==null||t.error("Title cannot be empty."),!1)}catch(p){return(o=v.current)==null||o.error(`Rename failed: ${p.message}`),!1}finally{$(p=>({...p,rename:!1}))}},[R.rename,C]),_e=n.useCallback(async e=>{var a,t;if(R.delete)return!1;$(r=>({...r,delete:!0}));try{return C.some(o=>o.id===e)?(await O.del(`/opencode-sessions/${encodeURIComponent(e)}`),I(o=>o.filter(p=>p.id!==e)),D===e&&te()):(await O.del(`/chat/sessions/${encodeURIComponent(e)}`),g(o=>o.filter(p=>p.id!==e)),S===e&&(j(""),d([]))),ue(o=>{const p={...o};return delete p[e],p}),(a=v.current)==null||a.success("Session deleted."),!0}catch(r){return(t=v.current)==null||t.error(`Delete failed: ${r.message}`),!1}finally{$(r=>({...r,delete:!1}))}},[R.delete,C,D,te,S]);return n.useEffect(()=>{V.current&&(de?V.current.scrollTop=V.current.scrollHeight:ce(e=>e+1))},[l,P]),n.useEffect(()=>()=>{if(Y.current=!1,Q.current=null,z.current!==null&&(clearTimeout(z.current),z.current=null),T.current){try{T.current.close()}catch{}T.current=null}},[]),n.useEffect(()=>{h?ae(h):K(),re()},[]),n.useEffect(()=>{const e=a=>{var r;const t=(r=a.detail)==null?void 0:r.taskId;t&&ae(t)};return window.addEventListener("bizar:setChatTask",e),()=>window.removeEventListener("bizar:setChatTask",e)},[ae]),n.useEffect(()=>{let e=!1;return Xe(async()=>{const{Ws:a}=await import("./mobile-layout-BjkoHh1W.js").then(t=>t.w);return{Ws:a}},__vite__mapDeps([0,1,2,3])).then(({Ws:a})=>{if(e)return;new a().on(r=>{if(r.type!=="chat:message")return;const o=r.message;o&&d(p=>p.some(N=>N.ts===o.ts)?p:[...p,o])})}),()=>{e=!0}},[]),{messages:W==="opencode"?P:l,bizarMessages:l,opencodeMessages:P,sessions:x,opencodeSessions:C,sessionId:S,setSessionId:j,loading:E,sending:R.send,pinned:Ce,listRef:V,activeSource:W,activeOpencodeSessionId:D,opencodeError:G,opencodeSuggestion:je,opencodeErrorInfo:we,retryOpencodeSession:()=>{D&&oe(D)},sessionStates:se,busy:R,getSessionDisplay:e=>{var a,t,r,o;return{...e,state:((a=se[e.id])==null?void 0:a.state)??"idle",unread:((t=se[e.id])==null?void 0:t.unread)??0,pinned:((r=se[e.id])==null?void 0:r.pinned)??!1,tree:(o=se[e.id])==null?void 0:o.tree}},stickToBottom:de,newMessageCount:Se,handleScroll:Te,jumpToLatest:Oe,setToast:Ie,loadChat:K,loadTaskChat:ae,refreshSessions:ie,refreshOpencodeSessions:re,loadOpencodeSession:oe,closeOpencodeSession:te,selectBizarSession:ve,onCreateSession:Ne,onSend:Re,onRegenerate:De,deleteMessage:$e,togglePin:Ee,copyMessage:ze,renameSession:Me,deleteSession:_e,seenOpencodeMessages:ke}}const cs=[{cmd:"/visual-plan [on|off|status]",desc:"Toggle or view visual plan mode"},{cmd:"/plan new <slug> [template]",desc:"Create a new plan"},{cmd:"/plan list",desc:"List all plans"},{cmd:"/plan open <slug>",desc:"Open a plan in the viewer"},{cmd:"/plan status <slug> <status>",desc:"Set plan status"},{cmd:"/plan get <slug>",desc:"Fetch plan canvas"},{cmd:"/plan add <slug> --title T --type kind",desc:"Add element to a plan"},{cmd:"/plan update <slug> <id>",desc:"Update a plan element"},{cmd:"/plan delete <slug> <id>",desc:"Delete a plan element"},{cmd:'/plan comment <slug> [id] "text"',desc:"Add a comment"},{cmd:"/plan comments <slug> [id]",desc:"Read plan comments"},{cmd:"/bizar",desc:"Launch Bizar dashboard"},{cmd:"/bizar <args>",desc:"Route via Bizar menu"},{cmd:"/audit",desc:"Run security audit"},{cmd:"/explain <q>",desc:"Read-only code Q&A"},{cmd:"/init",desc:"Initialize .bizar/ in this project"},{cmd:"/learn",desc:"Extract patterns from session"},{cmd:"/pr-review",desc:"PR review"},{cmd:"/help | /commands",desc:"Show all Bizar commands"}];function gs(i){const[f,h]=n.useState(""),l=n.useMemo(()=>[...cs,...(i.mods||[]).flatMap(x=>{var g;return(g=x.entry)!=null&&g.command?[{cmd:`/${x.id}`,desc:x.description||x.name,mod:x.id}]:[]})],[i.mods]),d=n.useMemo(()=>{if(!f.startsWith("/")||f.includes(" "))return[];const x=f.toLowerCase();return l.filter(g=>g.cmd.toLowerCase().startsWith(x)).slice(0,6)},[f,l]);return{allCommands:l,suggestions:d,setQuery:h}}export{hs as C,ss as V,gs as a,ms as b,ps as c,fs as u};