@vheins/local-memory-mcp 0.8.42 → 0.8.44
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-JWJOO5N5.js → chunk-RHTFBGAQ.js} +689 -20
- package/dist/dashboard/public/assets/index-BESxlve8.js +86 -0
- package/dist/dashboard/public/assets/index-DSdSQ0sh.css +1 -0
- package/dist/dashboard/public/index.html +2 -2
- package/dist/dashboard/server.js +13 -1
- package/dist/mcp/server.js +243 -1
- package/dist/prompts/create-task.md +5 -3
- package/dist/prompts/csl-scrapper.md +60 -0
- package/dist/prompts/memory-agent-core.md +7 -3
- package/dist/prompts/memory-guided-review.md +5 -3
- package/dist/prompts/memory-index-policy.md +8 -1
- package/dist/prompts/project-briefing.md +7 -4
- package/dist/prompts/review-and-audit.md +7 -3
- package/dist/prompts/session-planner.md +7 -4
- package/dist/prompts/task-management-guidelines.md +7 -3
- package/dist/prompts/task-memory-executor.md +13 -8
- package/dist/prompts/tech-affinity-scout.md +4 -2
- package/dist/prompts/tool-usage-guidelines.md +28 -11
- package/package.json +1 -1
- package/dist/dashboard/public/assets/index-BbuGTan5.css +0 -1
- package/dist/dashboard/public/assets/index-mXYdB6rj.js +0 -86
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@import "https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800;900&family=JetBrains+Mono:wght@400;500;700&display=swap";:root{--glass-bg:#ffffff85;--glass-bg-strong:#ffffffb8;--glass-bg-ultra:#ffffffe0;--glass-border:#fff6;--glass-border-inner:#ffffffb3;--glass-shadow:0 20px 70px #0f172a1a, 0 4px 16px #0f172a0f;--glass-shadow-elevated:0 32px 96px #0f172a29, 0 8px 32px #0f172a14;--glass-blur:blur(28px) saturate(1.2);--panel-dark:#060c1cb3;--panel-dark-strong:#040916e0;--panel-dark-ultra:#020610f5;--panel-dark-border:#94a3b81a;--panel-dark-border-glow:#38bdf833;--panel-dark-shadow:0 28px 90px #02061799, inset 0 1px 0 #94a3b80f;--glow-primary:#0ea5e959;--glow-accent:#6366f159;--glow-success:#10b98159;--glow-danger:#ef444459;--glow-purple:#a855f759;--glow-cyan:#06b6d459;--sidebar-width:280px;--sidebar-collapsed-width:72px;--header-height:60px;--radius-sm:8px;--radius-md:12px;--radius-lg:16px;--radius-xl:20px;--radius-2xl:24px;--color-bg:#f0f8ff;--color-surface:#fff;--color-border:#e1ecf7;--color-text:#0a1628;--color-text-muted:#556f8a;--color-text-faint:#8faec4;--color-primary:#0ea5e9;--color-primary-dark:#0284c7;--color-primary-light:#38bdf8;--color-accent:#6366f1;--color-accent-dark:#4f46e5;--color-success:#10b981;--color-warning:#f59e0b;--color-danger:#ef4444;--color-purple:#a855f7;--ease-spring:cubic-bezier(.34, 1.56, .64, 1);--ease-smooth:cubic-bezier(.4, 0, .2, 1);--ease-expo:cubic-bezier(.16, 1, .3, 1);--duration-fast:.15s;--duration-base:.25s;--duration-slow:.4s}.dark{--color-bg:#010c1e;--color-surface:#070f1f;--color-border:#94a3b81a;--color-text:#e9f1fa;--color-text-muted:#7fa3be;--color-text-faint:#4a6782;--color-primary:#38bdf8;--color-primary-dark:#0ea5e9;--color-primary-light:#7dd3fc}*,:before,:after{box-sizing:border-box;margin:0;padding:0}html{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:radial-gradient(at 8% 10%,#38bdf847 0%,#0000 38%),radial-gradient(at 92% 8%,#6366f12e 0%,#0000 32%),radial-gradient(at 75% 88%,#a855f71f 0%,#0000 28%),radial-gradient(at 20% 75%,#0ea5e91a 0%,#0000 26%),linear-gradient(160deg,#eef8ff 0%,#f0f4ff 45%,#f5f0ff 100%) fixed;min-height:100vh;font-family:Inter,system-ui,sans-serif;font-size:16px;line-height:1.5;transition:background .5s}html.dark{background:radial-gradient(at 8% 10%,#0ea5e924 0%,#0000 38%),radial-gradient(at 92% 8%,#4338ca1f 0%,#0000 32%),radial-gradient(at 75% 88%,#581c871a 0%,#0000 28%),radial-gradient(at 20% 75%,#0ea5e90f 0%,#0000 26%),linear-gradient(160deg,#010c1e 0%,#040d1e 45%,#050c1a 100%) fixed}body{min-height:100vh;color:var(--color-text);transition:color var(--duration-base) ease;background:0 0;overflow-x:hidden}h1,h2,h3,h4,h5,h6{font-weight:700;line-height:1.3}code,pre{font-family:JetBrains Mono,Fira Code,monospace}a{color:var(--color-primary);text-decoration:none}a:hover{color:var(--color-primary-dark)}::-webkit-scrollbar{width:5px;height:5px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:#94a3b840;border-radius:10px}::-webkit-scrollbar-thumb:hover{background:#94a3b873}.dark ::-webkit-scrollbar-thumb{background:#3341558c}.glass{background:var(--glass-bg);border:1px solid var(--glass-border);box-shadow:var(--glass-shadow);-webkit-backdrop-filter:var(--glass-blur);position:relative}.glass:before{content:"";border-radius:inherit;border:1px solid var(--glass-border-inner);opacity:.6;pointer-events:none;z-index:0;border-bottom-color:#0000;border-right-color:#0000;position:absolute;inset:0}.dark .glass{background:var(--panel-dark);border-color:var(--panel-dark-border);box-shadow:var(--panel-dark-shadow)}.dark .glass:before{opacity:.8;border-color:#94a3b812 #0000 #0000 #94a3b812}.glass-strong{background:var(--glass-bg-strong)!important}.dark .glass-strong{background:var(--panel-dark-strong)!important}.glass-card{border-radius:var(--radius-lg);padding:20px;position:relative;overflow:hidden}.glass-card:after{content:"";border-radius:inherit;pointer-events:none;z-index:0;background:linear-gradient(135deg,#ffffff14 0%,#0000 60%);position:absolute;inset:0}.dark .glass-card:after{background:linear-gradient(135deg,#94a3b80a 0%,#0000 60%)}.app-layout{min-height:100vh;display:flex}.sidebar{width:var(--sidebar-width);height:100dvh;transition:width .3s var(--ease-smooth);z-index:40;position:fixed;top:0;left:0;overflow:hidden}.sidebar.collapsed{width:var(--sidebar-collapsed-width)}.main-content{min-width:0;margin-left:var(--sidebar-width);transition:margin-left .3s var(--ease-smooth);flex:1}.dashboard-shell{min-width:0;min-height:100vh;padding:20px}.sidebar.collapsed~.main-content,.main-content.sidebar-collapsed{margin-left:var(--sidebar-collapsed-width)}@media (width<=1024px){.app-layout>.sidebar{display:none!important}.main-content{margin-left:0!important}}.mobile-sidebar-shell{z-index:39;flex-direction:column;width:min(320px,86vw);height:100dvh;display:flex;position:fixed;inset:0 auto 0 0}.mobile-sidebar-shell .sidebar{width:100%!important;height:100dvh!important;display:flex!important;position:relative!important}.top-bar{z-index:30;position:sticky;top:0}.tab-nav{border-radius:var(--radius-md);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);background:#f1f5f9b3;border:1px solid #e2e8f0cc;gap:3px;padding:4px;display:flex}.tabs-wrap{scrollbar-width:none;max-width:100%;margin-bottom:20px;overflow:auto hidden}.tabs-wrap::-webkit-scrollbar{display:none}.dark .tab-nav{background:#0f172a99;border-color:#94a3b81a}.tab-btn{color:var(--color-text-muted);transition:all var(--duration-base) var(--ease-smooth);cursor:pointer;white-space:nowrap;background:0 0;border:none;border-radius:9px;align-items:center;gap:6px;padding:7px 14px;font-size:.8rem;font-weight:600;display:flex;position:relative;overflow:hidden}.tab-btn:after{content:"";opacity:0;transition:opacity var(--duration-base) ease;pointer-events:none;background:radial-gradient(circle,#0ea5e91f,#0000 70%);position:absolute;inset:0}.tab-btn:hover{color:var(--color-text)}.tab-btn:hover:after{opacity:1}.dark .tab-btn:hover{color:var(--color-text)}.tab-btn.active{color:var(--color-primary);background:#fff;box-shadow:0 2px 10px #00000012,0 1px 3px #0000000d}.tab-btn.active:after{opacity:0}.dark .tab-btn.active{color:#7dd3fc;background:#0a1226f2;box-shadow:0 0 0 1px #38bdf833,0 4px 12px #00000059}.btn{border-radius:var(--radius-md);transition:all var(--duration-base) var(--ease-smooth);cursor:pointer;white-space:nowrap;border:1px solid #0000;align-items:center;gap:6px;padding:8px 16px;font-size:.8rem;font-weight:600;display:inline-flex;position:relative;overflow:hidden}.btn:after{content:"";opacity:0;transition:opacity var(--duration-fast) ease;pointer-events:none;background:linear-gradient(135deg,#ffffff26 0%,#0000 100%);position:absolute;inset:0}.btn:hover:after{opacity:1}.btn:active{transform:scale(.97)}.btn-primary{background:linear-gradient(135deg, var(--color-primary) 0%, var(--color-primary-dark) 100%);color:#fff;box-shadow:0 4px 14px var(--glow-primary), inset 0 1px 0 #fff3;border-color:#0284c780}.btn-primary:hover{box-shadow:0 6px 20px var(--glow-primary), inset 0 1px 0 #fff3;transform:translateY(-1px)}.dark .btn-primary{color:#7dd3fc;background:linear-gradient(135deg,#0ea5e933 0%,#0284c71f 100%);border-color:#0ea5e966;box-shadow:inset 0 0 0 1px #0ea5e926,0 4px 14px #0ea5e92e}.dark .btn-primary:hover{color:#bae6fd;background:linear-gradient(135deg,#0ea5e94d 0%,#0284c733 100%);box-shadow:inset 0 0 0 1px #38bdf840,0 6px 20px #0ea5e947}.btn-accent{background:linear-gradient(135deg, var(--color-accent) 0%, var(--color-accent-dark) 100%);color:#fff;box-shadow:0 4px 14px var(--glow-accent), inset 0 1px 0 #fff3;border-color:#4f46e580}.btn-accent:hover{box-shadow:0 6px 20px var(--glow-accent), inset 0 1px 0 #fff3;transform:translateY(-1px)}.dark .btn-accent{color:#a5b4fc;background:linear-gradient(135deg,#6366f138 0%,#4f46e524 100%);border-color:#6366f16b;box-shadow:inset 0 0 0 1px #6366f126}.dark .btn-accent:hover{color:#c7d2fe;background:linear-gradient(135deg,#6366f152 0%,#4f46e538 100%);box-shadow:inset 0 0 0 1px #818cf84d,0 6px 20px #6366f147}.btn-ghost{color:var(--color-text-muted);border-color:var(--color-border);background:0 0}.btn-ghost:hover{color:var(--color-text);background:#f1f5f9cc;border-color:#0ea5e933}.dark .btn-ghost:hover{background:#1e293bb3;border-color:#94a3b833}.btn-sm{padding:5px 10px;font-size:.72rem}.btn-icon{border-radius:var(--radius-sm);padding:7px}.btn-icon-lg{border-radius:var(--radius-md);padding:9px}.form-input,.form-select,.form-textarea{border-radius:var(--radius-md);border:1px solid var(--color-border);width:100%;color:var(--color-text);transition:all var(--duration-base) var(--ease-smooth);background:#ffffffa6;outline:none;padding:8px 12px;font-family:inherit;font-size:.85rem}.form-input:focus,.form-select:focus,.form-textarea:focus{border-color:var(--color-primary);background:#ffffffd9;box-shadow:0 0 0 3px #0ea5e924,0 2px 8px #0ea5e914}.dark .form-input,.dark .form-select,.dark .form-textarea{color:var(--color-text);background:#0a1226a6;border-color:#94a3b82e}.dark .form-input:focus,.dark .form-select:focus,.dark .form-textarea:focus{background:#0a1226d9;border-color:#38bdf880;box-shadow:0 0 0 3px #38bdf81f,0 0 16px #38bdf814}.card{border-radius:var(--radius-lg);padding:20px}.stat-card{border-radius:var(--radius-md);transition:transform var(--duration-base) var(--ease-spring), box-shadow var(--duration-base) ease;padding:12px 14px}.stat-card:hover{box-shadow:var(--glass-shadow-elevated);transform:translateY(-3px)}.dark .stat-card:hover{box-shadow:0 32px 96px #020617b3,0 0 24px #38bdf80f}.type-chip{text-transform:uppercase;letter-spacing:.07em;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);transition:all var(--duration-base) ease;border:1px solid #0000;border-radius:9999px;align-items:center;gap:4px;padding:.2rem .6rem;font-size:.62rem;font-weight:700;display:inline-flex}.type-decision{color:#1565c0;background:linear-gradient(135deg,#2196f324,#1976d214);border-color:#2196f34d}.type-mistake{color:#c62828;background:linear-gradient(135deg,#f4433624,#d32f2f14);border-color:#f443364d}.type-code_fact{color:#6a1b9a;background:linear-gradient(135deg,#9c27b024,#7b1fa214);border-color:#9c27b04d}.type-pattern{color:#1b5e20;background:linear-gradient(135deg,#388e3c24,#1b5e2014);border-color:#388e3c4d}.type-file_claim{color:#006064;background:linear-gradient(135deg,#00bcd424,#0097a714);border-color:#00bcd44d}.type-task_archive{color:#3e2723;background:linear-gradient(135deg,#79554824,#5d403714);border-color:#7955484d}.dark .type-decision{color:#7dd3fc;background:linear-gradient(135deg,#38bdf833,#0ea5e914);border-color:#38bdf852}.dark .type-mistake{color:#fda4af;background:linear-gradient(135deg,#fb718533,#f43f5e14);border-color:#fb718552}.dark .type-code_fact{color:#d8b4fe;background:linear-gradient(135deg,#c084fc33,#a78bfa14);border-color:#c084fc52}.dark .type-pattern{color:#6ee7b7;background:linear-gradient(135deg,#34d39933,#10b98114);border-color:#34d39952}.dark .type-file_claim{color:#67e8f9;background:linear-gradient(135deg,#22d3ee33,#06b6d414);border-color:#22d3ee52}.dark .type-task_archive{color:#d4a08a;background:linear-gradient(135deg,#b4786433,#965a4614);border-color:#b4786452}.status-chip{text-transform:uppercase;letter-spacing:.05em;transition:all var(--duration-base) ease;border-radius:9999px;align-items:center;gap:4px;padding:2px 10px;font-size:.62rem;font-weight:700;display:inline-flex}.status-chip:before{content:"";background:currentColor;border-radius:50%;flex-shrink:0;width:5px;height:5px;display:inline-block}.status-backlog{color:#64748b;background:#64748b1f;border:1px solid #64748b47}.status-pending{color:#475569;background:#94a3b81f;border:1px solid #94a3b847}.status-inprogress{color:#0284c7;background:#38bdf81f;border:1px solid #38bdf847}.status-completed{color:#059669;background:#10b9811f;border:1px solid #10b98147}.status-blocked{color:#dc2626;background:#ef44441f;border:1px solid #ef444447}.status-canceled{color:#9ca3af;background:#9ca3af14;border:1px solid #9ca3af2e}.status-default{color:#94a3b8;background:#cbd5e11f;border:1px solid #cbd5e147}.dark .status-backlog{color:#94a3b8;background:#64748b2e}.dark .status-pending{color:#cbd5e1;background:#94a3b82e}.dark .status-inprogress{color:#7dd3fc;background:#38bdf82e}.dark .status-completed{color:#6ee7b7;background:#10b9812e}.dark .status-blocked{color:#fca5a5;background:#ef44442e}.dark .status-canceled{color:#6b7280;background:#9ca3af1f}.repo-item{border-radius:var(--radius-md);cursor:pointer;transition:all var(--duration-base) var(--ease-smooth);border:1px solid #0000;align-items:center;gap:10px;padding:9px 11px;display:flex;position:relative;overflow:hidden}.repo-item:before{content:"";opacity:0;transition:opacity var(--duration-base) ease;pointer-events:none;background:linear-gradient(90deg,#0ea5e90f 0%,#0000 100%);position:absolute;inset:0}.repo-item:hover:before{opacity:1}.repo-item:hover{border-color:#0ea5e91f}.dark .repo-item:hover{background:#0ea5e90a;border-color:#38bdf824}.repo-item.active{background:#ffffffe6;border-color:#0ea5e938;box-shadow:0 4px 14px #0f172a0f,inset 0 1px #fffc}.dark .repo-item.active{background:#0ea5e912;border-color:#38bdf847;box-shadow:inset 0 0 0 1px #38bdf81a,0 4px 16px #0ea5e914}.repo-avatar{border-radius:var(--radius-sm);color:#fff;width:34px;height:34px;transition:box-shadow var(--duration-base) ease, transform var(--duration-base) var(--ease-spring);background:linear-gradient(135deg,#0ea5e9 0%,#6366f1 100%);flex-shrink:0;justify-content:center;align-items:center;font-size:11px;font-weight:800;display:flex;position:relative;box-shadow:0 4px 12px #0ea5e947}.repo-item:hover .repo-avatar{transform:scale(1.06);box-shadow:0 4px 16px #0ea5e966}.repo-active-indicator{background:linear-gradient(180deg, var(--color-primary-light) 0%, var(--color-primary) 100%);width:3px;height:22px;box-shadow:2px 0 8px var(--glow-primary);border-radius:0 4px 4px 0;position:absolute;top:50%;left:0;transform:translateY(-50%)}.repo-item.collapsed{justify-content:center;padding:8px}.stat-number{letter-spacing:-.03em;font-size:1.75rem;font-weight:900;line-height:1}.stat-label{text-transform:uppercase;letter-spacing:.07em;color:var(--color-text-muted);font-size:.68rem;font-weight:700}.kanban-board{grid-auto-columns:minmax(280px,1fr);grid-auto-flow:column;gap:16px;padding-bottom:8px;display:grid;overflow-x:auto}@media (width<=900px){.kanban-board{scroll-snap-type:x mandatory;-webkit-overflow-scrolling:touch;grid-auto-columns:280px;grid-auto-flow:column}}.kanban-col{border-radius:var(--radius-lg);flex-direction:column;min-height:200px;display:flex}@media (width<=900px){.kanban-col{scroll-snap-align:center}}.task-card{border-radius:var(--radius-md);border:1px solid var(--color-border);cursor:pointer;transition:all var(--duration-base) var(--ease-smooth);background:#ffffff9e;flex-shrink:0;padding:14px;position:relative;overflow:hidden}.task-card:before{content:"";background:linear-gradient(90deg, var(--color-primary), var(--color-accent));opacity:0;height:2px;transition:opacity var(--duration-base) ease;position:absolute;top:0;left:0;right:0}.task-card:hover:before{opacity:1}.dark .task-card{background:#0a122a8c;border-color:#94a3b81a}.task-card:hover{border-color:#0ea5e938;transform:translateY(-3px);box-shadow:0 10px 28px #0000001a,0 0 0 1px #0ea5e92e}.dark .task-card:hover{border-color:#38bdf83d;transform:translateY(-3px);box-shadow:0 10px 28px #00000059,0 0 0 1px #38bdf838}.markdown-body{color:#374151;word-break:break-word;font-size:.875rem;line-height:1.75}.dark .markdown-body{color:#d1d5db}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{color:#111827;margin:1.2em 0 .5em;font-weight:700;line-height:1.3}.dark .markdown-body h1,.dark .markdown-body h2,.dark .markdown-body h3,.dark .markdown-body h4{color:#f9fafb}.markdown-body h1{border-bottom:2px solid #e5e7eb;padding-bottom:.4rem;font-size:1.25rem}.markdown-body h2{border-bottom:1px solid #e5e7eb;padding-bottom:.3rem;font-size:1.1rem}.markdown-body h3{font-size:.95rem}.markdown-body p{margin:.6em 0}.markdown-body ul,.markdown-body ol{margin:.5em 0;padding-left:1.5rem}.markdown-body ul{list-style-type:disc}.markdown-body ol{list-style-type:decimal}.markdown-body li{margin:.25em 0}.markdown-body code{color:#6d28d9;background:#f3f4f6;border:1px solid #e5e7eb;border-radius:5px;padding:.15em .4em;font-family:JetBrains Mono,monospace;font-size:.8rem}.dark .markdown-body code{color:#c4b5fd;background:#8b5cf624;border-color:#8b5cf638}.markdown-body pre{background:#f8fafc;border:1px solid #e5e7eb;border-radius:10px;margin:.75em 0;padding:1rem;overflow-x:auto}.dark .markdown-body pre{background:#0a121e;border-color:#1e2d40}.markdown-body pre code{color:inherit;background:0 0;border:none;padding:0;font-size:.82rem}.markdown-body blockquote{color:#4b5563;background:#0ea5e90d;border-left:3px solid #0ea5e9;border-radius:0 8px 8px 0;margin:.75em 0;padding:.5rem 1rem;font-style:italic}.dark .markdown-body blockquote{color:#9ca3af;background:#0ea5e914}.markdown-body a{color:#0ea5e9;text-underline-offset:2px;text-decoration:underline}.markdown-body strong{color:#111827;font-weight:700}.dark .markdown-body strong{color:#f9fafb}.markdown-body table{border-collapse:collapse;width:100%;margin:.75em 0;font-size:.8rem}.markdown-body th{text-align:left;background:#f1f5f9;border:1px solid #e5e7eb;padding:.5rem .75rem;font-weight:700}.dark .markdown-body th{background:#1e293b;border-color:#334155}.markdown-body td{border:1px solid #e5e7eb;padding:.4rem .75rem}.dark .markdown-body td{border-color:#334155}.markdown-body tr:nth-child(2n){background:#f8fafc}.dark .markdown-body tr:nth-child(2n){background:#1e293b66}.chat-bubble{border-radius:1.25rem;max-width:85%;padding:.75rem 1rem;font-size:.875rem;line-height:1.5;box-shadow:0 2px 8px #0000000f}.chat-bubble-agent{color:#fff;border-bottom-right-radius:.25rem;align-self:flex-end}.chat-bubble-mcp{color:#1e293b;background:#f1f5f9e6;border:1px solid #e2e8f0;border-bottom-left-radius:.25rem;align-self:flex-start}.dark .chat-bubble-mcp{color:#f1f5f9;background:#1e293bd9;border-color:#334155b3}.skeleton{background:linear-gradient(90deg,#f1f5f9 25%,#e8ecf0 50%,#f1f5f9 75%) 0 0/200% 100%;border-radius:8px;animation:1.8s ease-in-out infinite skeleton-pulse}.dark .skeleton{background:linear-gradient(90deg,#12213a 25%,#1a2f4a 50%,#12213a 75%) 0 0/200% 100%}@keyframes skeleton-pulse{0%{background-position:200% 0}to{background-position:-200% 0}}@keyframes fade-in-up{0%{opacity:0;transform:translateY(14px)}to{opacity:1;transform:translateY(0)}}@keyframes fade-in-scale{0%{opacity:0;transform:scale(.96)}to{opacity:1;transform:scale(1)}}@keyframes slide-in-right{0%{opacity:0;transform:translate(20px)}to{opacity:1;transform:translate(0)}}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes pulse-glow{0%,to{box-shadow:0 0 6px #0ea5e94d}50%{box-shadow:0 0 18px #0ea5e999,0 0 30px #0ea5e933}}@keyframes float{0%,to{transform:translateY(0)}50%{transform:translateY(-4px)}}@keyframes status-blink{0%,to{opacity:1}50%{opacity:.4}}@keyframes orbit-glow{0%{transform:translate(-50%,-50%)rotate(0)translate(12px)rotate(0)}to{transform:translate(-50%,-50%)rotate(360deg)translate(12px)rotate(-360deg)}}.animate-fade-in{animation:fade-in-up var(--duration-slow) var(--ease-expo)}.animate-fade-in-scale{animation:fade-in-scale var(--duration-slow) var(--ease-expo)}.animate-slide-in{animation:slide-in-right var(--duration-slow) var(--ease-expo)}.animate-spin{animation:.8s linear infinite spin}.animate-float{animation:3s ease-in-out infinite float}.animate-pulse-glow{animation:2s ease-in-out infinite pulse-glow}.animate-status-blink{animation:1.8s ease-in-out infinite status-blink}.stagger-item:first-child{animation-delay:0s}.stagger-item:nth-child(2){animation-delay:50ms}.stagger-item:nth-child(3){animation-delay:.1s}.stagger-item:nth-child(4){animation-delay:.15s}.stagger-item:nth-child(5){animation-delay:.2s}.stagger-item:nth-child(n+6){animation-delay:.25s}.drawer-overlay{z-index:50;-webkit-backdrop-filter:blur(6px);background:#010c1e8c;position:fixed;inset:0}.drawer-panel{-webkit-backdrop-filter:blur(20px);z-index:51;background:#fffffff5;border-left:1px solid #e2e8f0cc;flex-direction:column;width:min(620px,95vw);height:100dvh;display:flex;position:fixed;top:0;right:0;overflow:hidden;box-shadow:-20px 0 60px #00000024,-1px 0 #0ea5e914}.dark .drawer-panel{background:#060c1cf5;border-color:#94a3b81a;box-shadow:-20px 0 60px #00000080,-1px 0 #38bdf81f}.dark table thead tr{background:#0a1226e6!important}.dark table th{color:var(--color-text-muted);border-bottom-color:#94a3b81f!important}.dark table td{color:var(--color-text);border-bottom-color:#94a3b812!important}.dark table tbody tr:hover td{background:#0ea5e90a}.dark table tbody tr:nth-child(2n) td{background:#080f2059}.dark table tbody tr:nth-child(2n):hover td{background:#0ea5e90f}.dark table input[type=checkbox]{accent-color:#0ea5e9}.badge{letter-spacing:.03em;border-radius:9999px;align-items:center;padding:1px 8px;font-size:.62rem;font-weight:700;display:inline-flex}.section-label{text-transform:uppercase;letter-spacing:.08em;color:var(--color-text-muted);font-size:.68rem;font-weight:700}.status-dot{border-radius:9999px;flex-shrink:0;width:8px;height:8px}.status-dot-online{background:#10b981;animation:2.4s ease-in-out infinite pulse-glow;box-shadow:0 0 0 3px #10b9812e}.icon-btn{border-radius:var(--radius-sm);width:32px;height:32px;color:var(--color-text-muted);cursor:pointer;transition:all var(--duration-base) var(--ease-smooth);background:0 0;border:none;justify-content:center;align-items:center;display:inline-flex}.icon-btn:hover{color:var(--color-text);background:#f1f5f9e6;transform:scale(1.1)}.dark .icon-btn:hover{background:#1e293bcc}.icon-btn svg{transition:transform var(--duration-base) var(--ease-spring)}.icon-btn:hover svg{transform:scale(1.05)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.min-w-0{min-width:0}.flex{display:flex}.flex-col{flex-direction:column}.flex-1{flex:1}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-1{gap:4px}.gap-2{gap:8px}.gap-3{gap:12px}.gap-4{gap:16px}.gap-5{gap:20px}.p-2{padding:8px}.p-3{padding:12px}.p-4{padding:16px}.p-5{padding:20px}.px-3{padding-left:12px;padding-right:12px}.px-4{padding-left:16px;padding-right:16px}.py-2{padding-top:8px;padding-bottom:8px}.py-3{padding-top:12px;padding-bottom:12px}.mt-1{margin-top:4px}.mt-2{margin-top:8px}.mt-3{margin-top:12px}.mt-4{margin-top:16px}.mb-1{margin-bottom:4px}.mb-2{margin-bottom:8px}.mb-3{margin-bottom:12px}.mb-4{margin-bottom:16px}.text-sm{font-size:.875rem}.text-xs{font-size:.75rem}.font-medium{font-weight:500}.font-semibold{font-weight:600}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.opacity-0{opacity:0}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.w-full{width:100%}.h-full{height:100%}.overflow-hidden{overflow:hidden}.overflow-auto{overflow:auto}.overflow-y-auto{overflow-y:auto}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:12px}.rounded-xl{border-radius:16px}.relative{position:relative}.absolute{position:absolute}.inset-0{inset:0}.z-10{z-index:10}.z-50{z-index:50}.hidden{display:none}.grid{display:grid}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;user-select:none}.pointer-events-none{pointer-events:none}.shrink-0{flex-shrink:0}.text-center{text-align:center}.priority-dot{border-radius:9999px;flex-shrink:0;width:8px;height:8px}.priority-1{background:#94a3b8}.priority-2{background:#3b82f6;box-shadow:0 0 6px #3b82f680}.priority-3{background:#f59e0b;box-shadow:0 0 6px #f59e0b80}.priority-4{background:#f97316;box-shadow:0 0 6px #f9731680}.priority-5{background:#ef4444;animation:2s ease-in-out infinite pulse-glow;box-shadow:0 0 8px #ef444499}.divider{background:var(--color-border);height:1px;margin:12px 0}.dark .divider{background:#94a3b81a}.hover-glow{transition:box-shadow var(--duration-base) ease}.hover-glow:hover{box-shadow:var(--glass-shadow-elevated), 0 0 24px #0ea5e914}.dark .hover-glow:hover{box-shadow:var(--panel-dark-shadow), 0 0 24px #38bdf814}.text-success{color:var(--color-success)!important}.text-danger{color:var(--color-danger)!important}.text-primary{color:var(--color-primary)!important}.text-accent{color:var(--color-accent)!important}.btn-icon:hover{background:#0ea5e914;transform:scale(1.1)}@media (width<=760px){html,body,#app,.app-layout,.main-content{max-width:100vw;overflow-x:hidden}.dashboard-shell{padding:12px}.tabs-wrap{margin:0 -12px 12px;padding:0 12px}.tab-nav{max-width:max-content}.tab-btn{padding:7px 10px;font-size:.74rem}.card{border-radius:var(--radius-lg);padding:14px}}.sidebar-header.svelte-vbr9x3{justify-content:space-between;align-items:center;min-height:60px;padding:14px 16px;display:flex}.brand-icon.svelte-vbr9x3{color:#fff;background:linear-gradient(135deg,#0ea5e9,#6366f1);border-radius:9px;flex-shrink:0;justify-content:center;align-items:center;width:30px;height:30px;transition:box-shadow .2s,transform .2s;display:flex;box-shadow:0 4px 12px #0ea5e94d}.brand-icon.svelte-vbr9x3:hover{transform:scale(1.05);box-shadow:0 4px 18px #0ea5e980}.collapse-btn.svelte-vbr9x3{flex-shrink:0}.search-wrapper.svelte-vbr9x3{position:relative}.search-icon.svelte-vbr9x3{color:var(--color-text-muted);pointer-events:none;display:flex;position:absolute;top:50%;left:10px;transform:translateY(-50%)}.search-input.svelte-vbr9x3{background:#ffffff80;padding-left:32px;font-size:.8rem}html.dark .search-input.svelte-vbr9x3{background:#0a122680}.group-label.svelte-vbr9x3{text-transform:uppercase;letter-spacing:.07em;color:var(--color-text-muted);opacity:.75;align-items:center;gap:5px;padding:6px 10px 4px;font-size:.6rem;font-weight:700;display:flex}.repo-count-chip.svelte-vbr9x3{color:#0ea5e9;background:#0ea5e91f;border:1px solid #0ea5e938;border-radius:9999px;padding:1px 7px;font-size:.62rem;font-weight:700}.pin-star.svelte-vbr9x3{color:#fff;background:#0ea5e9;border-radius:9999px;justify-content:center;align-items:center;width:14px;height:14px;font-size:8px;line-height:1;display:flex;position:absolute;top:-4px;right:-4px;box-shadow:0 2px 6px #0ea5e966}.task-badges.svelte-vbr9x3{flex-wrap:wrap;gap:3px;margin-top:4px;display:flex}.task-badge.svelte-vbr9x3{white-space:nowrap;border:1px solid #0000;border-radius:9999px;align-items:center;gap:2px;padding:1px 5px;font-size:.6rem;font-weight:700;transition:all .15s;display:inline-flex}.task-badge.active.svelte-vbr9x3{color:#a855f7;background:#a855f71f;border-color:#a855f740}.task-badge.todo.svelte-vbr9x3{color:#0ea5e9;background:#0ea5e91f;border-color:#0ea5e940}.task-badge.blocked.svelte-vbr9x3{color:#ef4444;background:#ef44441f;border-color:#ef444440}.task-badge.backlog.svelte-vbr9x3{color:#64748b;background:#64748b1f;border-color:#64748b40}html.dark .task-badge.active.svelte-vbr9x3{color:#c084fc;background:#a855f72e}html.dark .task-badge.todo.svelte-vbr9x3{color:#7dd3fc;background:#38bdf82e}html.dark .task-badge.blocked.svelte-vbr9x3{color:#fca5a5;background:#fca5a52e}html.dark .task-badge.backlog.svelte-vbr9x3{color:#94a3b8;background:#94a3b82e}.pin-btn.svelte-vbr9x3{opacity:0;color:var(--color-text-muted);cursor:pointer;background:0 0;border:none;border-radius:6px;flex-shrink:0;justify-content:center;align-items:center;padding:5px;transition:opacity .15s,transform .15s,color .15s;display:flex}.repo-item.svelte-vbr9x3:hover .pin-btn:where(.svelte-vbr9x3){opacity:1}@media (hover:none),(width<=1024px){.pin-btn.svelte-vbr9x3{opacity:1}}.pin-btn.svelte-vbr9x3:hover{color:#0ea5e9;background:#0ea5e91a;transform:scale(1.15)}.top-bar-inner.svelte-2va9hf{justify-content:space-between;align-items:center;gap:12px;min-height:60px;padding:10px 20px;display:flex}.current-repo.svelte-2va9hf{align-items:center;gap:8px;min-width:0;display:flex}.current-repo-name.svelte-2va9hf{color:var(--color-text);text-overflow:ellipsis;white-space:nowrap;max-width:200px;font-size:.82rem;overflow:hidden}.top-actions.svelte-2va9hf,.refresh-group.svelte-2va9hf,.top-status.svelte-2va9hf{align-items:center;gap:8px;display:flex}.top-actions.svelte-2va9hf{min-width:0}.top-separator.svelte-2va9hf{background:var(--color-border);opacity:.6;width:1px;height:20px}@media (width<=1024px){#mobileMenuBtn.svelte-2va9hf{display:flex!important}}@media (width<=760px){.top-bar-inner.svelte-2va9hf{padding:8px 12px}.current-repo-name.svelte-2va9hf{max-width:112px}.ext-links-group.svelte-2va9hf,.top-separator.svelte-2va9hf,.db-path-label.svelte-2va9hf,.top-status.svelte-2va9hf span:where(.svelte-2va9hf){display:none!important}.top-actions.svelte-2va9hf{flex-shrink:0;gap:6px}}@media (width<=420px){.current-repo-name.svelte-2va9hf{max-width:82px}}.ext-links-group.svelte-2va9hf{border:1px solid var(--color-border);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);background:#f1f5f9bf;border-radius:10px;align-items:center;gap:0;display:flex;overflow:hidden}html.dark .ext-links-group.svelte-2va9hf{background:#0f172abf;border-color:#94a3b81f}.ext-link-btn.svelte-2va9hf{color:var(--color-text-muted);white-space:nowrap;align-items:center;gap:5px;padding:5px 10px;font-size:.72rem;font-weight:600;line-height:1;text-decoration:none;transition:background .15s,color .15s;display:flex}.ext-link-btn.svelte-2va9hf:hover{color:var(--color-text);background:#0ea5e914}html.dark .ext-link-btn.svelte-2va9hf:hover{background:#0ea5e91f}.ext-link-star.svelte-2va9hf:hover{color:#ca8a04!important;background:#eab3081a!important}html.dark .ext-link-star.svelte-2va9hf:hover{color:#fbbf24!important;background:#eab3081f!important}.ext-link-npm.svelte-2va9hf:hover{color:#cb2431!important;background:#cb243114!important}html.dark .ext-link-npm.svelte-2va9hf:hover{color:#f87171!important;background:#cb24311f!important}.ext-link-divider.svelte-2va9hf{background:var(--color-border);opacity:.6;flex-shrink:0;width:1px;height:20px}.ext-link-label.svelte-2va9hf{font-size:.7rem}.npm-dl-badge.svelte-2va9hf{color:inherit;align-items:center;gap:3px;display:flex}.npm-dl-skeleton.svelte-2va9hf{background:#94a3b82e;border-radius:4px;width:36px;height:10px;animation:1.4s ease-in-out infinite svelte-2va9hf-skeleton-pulse;display:inline-block}@keyframes svelte-2va9hf-skeleton-pulse{0%,to{opacity:1}50%{opacity:.4}}.countdown-bar.svelte-2va9hf{border:1px solid var(--color-border);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);background:#f1f5f9bf;border-radius:10px;align-items:center;gap:6px;padding:5px 10px;display:flex}html.dark .countdown-bar.svelte-2va9hf{background:#0f172abf;border-color:#94a3b81f}.countdown-track.svelte-2va9hf{background:#94a3b82e;border-radius:9999px;width:52px;height:3px;overflow:hidden}.countdown-fill.svelte-2va9hf{border-radius:9999px;height:100%;transition:width 1s linear,background .3s}.countdown-label.svelte-2va9hf{width:26px;font-size:.65rem;font-weight:600;transition:color .3s}.btn.refreshing.svelte-2va9hf{color:var(--color-primary)}@media (width<=640px){.ext-links-group.svelte-2va9hf{display:none}}@media (width<=760px){.countdown-bar.svelte-2va9hf{padding:5px 8px}.countdown-track.svelte-2va9hf{width:32px}}@media (width<=420px){.countdown-label.svelte-2va9hf{display:none}}.priority-bar.svelte-1797zcc{opacity:0;border-radius:12px 12px 0 0;height:2px;transition:opacity .2s;position:absolute;top:0;left:0;right:0}.task-card.svelte-1797zcc:hover .priority-bar:where(.svelte-1797zcc){opacity:1}.card-header.svelte-1797zcc{justify-content:space-between;align-items:center;gap:6px;margin-bottom:7px;display:flex}.code-row.svelte-1797zcc{flex:1;align-items:center;gap:4px;min-width:0;display:flex}.status-icon-dot.svelte-1797zcc{opacity:.85;flex-shrink:0;display:inline-flex}.task-code-text.svelte-1797zcc{color:var(--color-text-muted);white-space:nowrap;text-overflow:ellipsis;max-width:110px;font-family:JetBrains Mono,monospace;font-size:.64rem;font-weight:700;overflow:hidden}.task-title.svelte-1797zcc{color:var(--color-text);-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;margin-bottom:4px;font-size:.82rem;font-weight:600;line-height:1.35;display:-webkit-box;overflow:hidden}.task-desc.svelte-1797zcc{color:var(--color-text-muted);-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;margin-bottom:12px;font-size:.72rem;line-height:1.4;display:-webkit-box;overflow:hidden}.phase-chip.svelte-1797zcc{color:#6366f1;letter-spacing:.02em;white-space:nowrap;background:#6366f11a;border:1px solid #6366f133;border-radius:9999px;flex-shrink:0;padding:2px 6px;font-size:.58rem;font-weight:700}html.dark .phase-chip.svelte-1797zcc{color:#a5b4fc;background:#818cf826;border-color:#818cf840}.hierarchy-row.svelte-1797zcc{flex-wrap:wrap;gap:4px;margin-bottom:8px;display:flex}.h-badge.svelte-1797zcc{border-radius:4px;align-items:center;gap:3px;padding:1px 6px;font-family:JetBrains Mono,monospace;font-size:.58rem;font-weight:700;display:inline-flex}.h-badge.parent.svelte-1797zcc{color:#10b981;background:#10b9811a;border:1px solid #10b98133}.h-badge.depends.svelte-1797zcc{color:#f59e0b;background:#f59e0b1a;border:1px solid #f59e0b33}.card-footer.svelte-1797zcc{justify-content:space-between;align-items:center;margin-top:8px;display:flex}.agent-row.svelte-1797zcc{align-items:center;gap:4px;display:flex}.agent-avatar.svelte-1797zcc{color:#fff;background:linear-gradient(135deg,#6366f1,#0ea5e9);border-radius:9999px;flex-shrink:0;justify-content:center;align-items:center;width:18px;height:18px;display:flex}.agent-name.svelte-1797zcc{color:var(--color-text-muted);text-overflow:ellipsis;white-space:nowrap;max-width:80px;font-size:.64rem;overflow:hidden}.time-row.svelte-1797zcc{color:var(--color-text-faint);align-items:center;gap:3px;font-size:.62rem;display:flex}.token-row.svelte-1797zcc{margin-top:6px}.token-badge.svelte-1797zcc{color:#0ea5e9;background:#38bdf81a;border:1px solid #38bdf833;border-radius:9999px;align-items:center;gap:3px;padding:2px 7px;font-size:.6rem;font-weight:600;display:inline-flex}html.dark .token-badge.svelte-1797zcc{color:#7dd3fc;background:#38bdf81f;border-color:#38bdf838}.search-wrap.svelte-173w724{position:relative}.search-icon-inner.svelte-173w724{color:var(--color-text-muted);pointer-events:none;display:flex;position:absolute;top:50%;left:10px;transform:translateY(-50%)}.col-count.svelte-173w724{border-radius:9999px;padding:1px 8px;font-size:.65rem;font-weight:700}.empty-col.svelte-173w724{text-align:center;flex-direction:column;align-items:center;padding:28px 8px;display:flex}.drag-over.svelte-173w724{border-color:var(--color-accent)!important;background:#6366f11a!important}.glassy-badge.svelte-1imzu92{-webkit-backdrop-filter:blur(12px);border:1px solid var(--badge-color);cursor:default;background:#ffffff0a;border-radius:9999px;padding:4px 12px;transition:all .3s cubic-bezier(.4,0,.2,1);box-shadow:0 4px 12px #0000000d,inset 0 0 0 1px #ffffff0d}html.dark .glassy-badge.svelte-1imzu92{box-shadow:0 8px 16px #0003, inset 0 0 0 1px var(--badge-color);background:#0003;border-color:#ffffff1a}.glassy-badge.svelte-1imzu92:hover{box-shadow:0 6px 16px #00000014, inset 0 0 0 1px var(--badge-color);background:#ffffff14;transform:translateY(-1px)}.indicator-dot.svelte-1imzu92{background:var(--badge-color);width:6px;height:6px;box-shadow:0 0 10px var(--badge-color);border-radius:9999px;position:relative}.indicator-dot.svelte-1imzu92:after{content:"";border:1px solid var(--badge-color);opacity:0;border-radius:9999px;animation:2s infinite svelte-1imzu92-pulse;position:absolute;inset:-2px}@keyframes svelte-1imzu92-pulse{0%{opacity:.5;transform:scale(1)}70%{opacity:0;transform:scale(3)}to{opacity:0;transform:scale(3)}}.count.svelte-1imzu92{color:var(--badge-color);letter-spacing:-.01em;font-size:.75rem;font-weight:900}.label.svelte-1imzu92{color:var(--color-text);text-transform:uppercase;letter-spacing:.06em;opacity:.7;font-size:.62rem;font-weight:700}.metrics-grid.svelte-9j0inj{grid-template-columns:repeat(2,1fr);gap:12px;margin-bottom:16px;display:grid}.compact-empty.svelte-9j0inj{min-height:56px;color:var(--color-text-muted);justify-content:center;align-items:center;font-size:.75rem;display:flex}@media (width<=640px){.metrics-grid.svelte-9j0inj{grid-template-columns:1fr}}.mem-table-wrap.svelte-83aj9g{border:1px solid var(--color-border);border-radius:14px;overflow-x:auto}.mem-table.svelte-83aj9g{border-collapse:collapse;width:100%;min-width:600px}.mem-thead-row.svelte-83aj9g{border-bottom:1px solid var(--color-border);background:#f8fafce6}html.dark .mem-thead-row.svelte-83aj9g{background:#0a1226d9}.mem-th.svelte-83aj9g{text-align:left;text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-muted);white-space:nowrap;-webkit-user-select:none;user-select:none;padding:10px 12px;font-size:.7rem;font-weight:700}.mem-th.sortable.svelte-83aj9g{cursor:pointer}.mem-th.sortable.svelte-83aj9g:hover{color:var(--color-text)}.mem-td.svelte-83aj9g{border-bottom:1px solid var(--color-border);padding:10px 12px}html.dark .mem-td.svelte-83aj9g{border-color:#94a3b814}.mem-row.svelte-83aj9g{cursor:pointer;transition:background .15s}.mem-row.svelte-83aj9g:hover{background:#f1f5f9b3}html.dark .mem-row.svelte-83aj9g:hover,.mem-row.selected.svelte-83aj9g{background:#0ea5e90d}html.dark .mem-row.selected.svelte-83aj9g{background:#0ea5e914}.mem-row.svelte-83aj9g:last-child .mem-td:where(.svelte-83aj9g){border-bottom:none}.row-actions.svelte-83aj9g{opacity:0;white-space:nowrap;align-items:center;gap:4px;transition:opacity .15s;display:flex}.mem-row.svelte-83aj9g:hover .row-actions:where(.svelte-83aj9g){opacity:1}.row-action-btn.svelte-83aj9g{cursor:pointer;width:28px;height:28px;color:var(--color-text-muted);background:0 0;border:none;border-radius:7px;justify-content:center;align-items:center;transition:background .15s,color .15s;display:inline-flex}.edit-btn.svelte-83aj9g:hover{color:#0ea5e9;background:#0ea5e91a}html.dark .edit-btn.svelte-83aj9g:hover{color:#38bdf8;background:#0ea5e926}.delete-btn.svelte-83aj9g:hover{color:#ef4444;background:#ef44441a}html.dark .delete-btn.svelte-83aj9g:hover{color:#fca5a5;background:#ef444426}.bulk-actions-bar.svelte-83aj9g{-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);z-index:1000;color:#fff;background:#1e293bf2;border:1px solid #ffffff1a;border-radius:9999px;align-items:center;gap:8px;padding:10px 16px;font-size:.85rem;animation:.3s cubic-bezier(.16,1,.3,1) forwards svelte-83aj9g-slideUp;display:flex;position:fixed;bottom:32px;left:50%;transform:translate(-50%);box-shadow:0 10px 30px #0000004d}html:not(.dark) .bulk-actions-bar.svelte-83aj9g{color:var(--color-text);border-color:var(--color-border);background:#fffffff2;box-shadow:0 10px 30px #0000001a}@keyframes svelte-83aj9g-slideUp{0%{opacity:0;transform:translate(-50%,20px)scale(.95)}to{opacity:1;transform:translate(-50%)scale(1)}}.markdown-body.svelte-d5v60e{line-height:1.6}.markdown-body.svelte-d5v60e p:where(.svelte-d5v60e){margin-bottom:1em}.markdown-body.svelte-d5v60e code:where(.svelte-d5v60e){background-color:#0000000d;border-radius:3px;padding:.2em .4em;font-family:monospace}.markdown-body.svelte-d5v60e pre:where(.svelte-d5v60e){background-color:#0000000d;border-radius:5px;padding:1em;overflow:auto}.markdown-body.svelte-d5v60e table:where(.svelte-d5v60e){border-collapse:collapse;width:100%;margin-bottom:1em}.markdown-body.svelte-d5v60e th:where(.svelte-d5v60e),.markdown-body.svelte-d5v60e td:where(.svelte-d5v60e){text-align:left;border:1px solid #ddd;padding:8px}.markdown-body.svelte-d5v60e blockquote:where(.svelte-d5v60e){color:#666;border-left:4px solid #ddd;margin:1em 0;padding-left:1em}.chat-container-viewport.svelte-h6z84x{scroll-behavior:smooth;background:#00000005;flex-direction:column;flex:1;padding:24px 32px;display:flex;overflow-y:auto}html.dark .chat-container-viewport.svelte-h6z84x{background-color:#0b141a;background-image:radial-gradient(#ffffff08 1px,#0000 1px);background-size:20px 20px}.chat-container.svelte-h6z84x{flex-direction:column;gap:12px;min-height:min-content;padding-bottom:20px;display:flex}.date-header.svelte-h6z84x{z-index:10;justify-content:center;margin:24px 0 12px;display:flex;position:sticky;top:-12px}.date-header.svelte-h6z84x span:where(.svelte-h6z84x){-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);color:#54656f;text-transform:uppercase;letter-spacing:.06em;background:#fffffff2;border:1px solid #0000000d;border-radius:10px;padding:6px 14px;font-size:.7rem;font-weight:700;box-shadow:0 1px 3px #00000014}html.dark .date-header.svelte-h6z84x span:where(.svelte-h6z84x){color:#8696a0;background:#182229}.bubble-row.svelte-h6z84x{align-items:flex-end;gap:8px;width:100%;margin-bottom:4px;display:flex}.bubble-row-right.svelte-h6z84x{justify-content:flex-end}.bubble-row-left.svelte-h6z84x{justify-content:flex-start}.bubble-wrap.svelte-h6z84x{max-width:80%;position:relative}.chat-bubble.svelte-h6z84x{border-radius:12px;padding:8px 10px 18px;font-size:.875rem;line-height:1.4;transition:transform .2s;position:relative;box-shadow:0 1px .5px #00000021}.chat-bubble-action.svelte-h6z84x{background:var(--bubble-bg-light);color:#111b21;border-top-right-radius:0}.chat-bubble-mcp.svelte-h6z84x{background:var(--bubble-bg-light);color:#111b21;border-top-left-radius:0}html.dark .chat-bubble-action.svelte-h6z84x,html.dark .chat-bubble-mcp.svelte-h6z84x{background:var(--bubble-bg-dark);color:#e9edef}.tail.svelte-h6z84x{width:12px;height:12px;position:absolute;top:0}.tail-right.svelte-h6z84x{background:radial-gradient(circle at 100% 0,#0000 8px,#dcf8c6 8px);right:-8px}.tail-left.svelte-h6z84x{background:radial-gradient(circle at 0 0,#0000 8px,#fff 8px);left:-8px}html.dark .chat-bubble-action.svelte-h6z84x{--bubble-bg-dark:#056162}html.dark .tail-right.svelte-h6z84x{background:radial-gradient(circle at 100% 0,#0000 8px,#056162 8px)}html.dark .tail-left.svelte-h6z84x{background:radial-gradient(circle at 0 0,#0000 8px,#202c33 8px)}.chat-avatar.svelte-h6z84x{border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;width:28px;height:28px;display:flex;box-shadow:0 2px 8px #0000001a}.agent-avatar.svelte-h6z84x{color:#fff;background:linear-gradient(135deg,#0ea5e9,#6366f1)}.mcp-avatar.svelte-h6z84x{color:#54656f;background:#f0f2f5}html.dark .mcp-avatar.svelte-h6z84x{color:#8696a0;background:#182229}.action-badge.svelte-h6z84x{text-transform:uppercase;letter-spacing:.05em;border-radius:4px;align-items:center;gap:4px;margin-bottom:4px;padding:2px 6px;font-size:.62rem;font-weight:800;display:inline-flex}.action-main.svelte-h6z84x{color:inherit;word-break:break-word;font-weight:600}.action-sub.svelte-h6z84x{opacity:.7;margin-top:2px;font-size:.75rem}.mcp-sender.svelte-h6z84x{color:#34b7f1;text-transform:uppercase;letter-spacing:.04em;align-items:center;gap:4px;margin-bottom:6px;font-size:.72rem;font-weight:800;display:flex}.read-more-btn.svelte-h6z84x{color:#34b7f1;cursor:pointer;text-align:left;background:0 0;border:none;width:100%;margin-top:4px;padding:4px 0;font-size:.75rem;font-weight:700;display:block}.read-more-btn.svelte-h6z84x:hover{text-decoration:underline}.bubble-meta.svelte-h6z84x{pointer-events:none;align-items:center;gap:3px;display:flex;position:absolute;bottom:4px;right:7px}.bubble-time.svelte-h6z84x{color:#667781;font-size:.65rem}html.dark .bubble-time.svelte-h6z84x{color:#ffffff80}.bubble-status.svelte-h6z84x{color:#53bdeb;display:flex}.load-more-spinner.svelte-h6z84x{color:var(--color-text-muted);opacity:.8;justify-content:center;align-items:center;gap:8px;padding:12px;font-size:.75rem;font-weight:600;display:flex}@keyframes svelte-h6z84x-slideInRight{0%{opacity:0;transform:translate(20px)}to{opacity:1;transform:translate(0)}}@keyframes svelte-h6z84x-slideInLeft{0%{opacity:0;transform:translate(-20px)}to{opacity:1;transform:translate(0)}}.animate-slide-in-right.svelte-h6z84x{animation:.3s ease-out forwards svelte-h6z84x-slideInRight}.animate-slide-in-left.svelte-h6z84x{animation:.3s ease-out forwards svelte-h6z84x-slideInLeft}.drawer-header.svelte-9n99wb{border-bottom:1px solid var(--color-border);flex-shrink:0;justify-content:space-between;align-items:flex-start;gap:12px;padding:20px;display:flex}.drawer-title.svelte-9n99wb{color:var(--color-text);font-size:1rem;font-weight:700;line-height:1.3}.editable-title.svelte-9n99wb{cursor:pointer;border-radius:6px;align-items:center;gap:6px;margin:-2px -4px;padding:2px 4px;transition:background .15s;display:flex}.editable-title.svelte-9n99wb:hover{background:#6366f112}.edit-hint.svelte-9n99wb{opacity:0;font-size:.7rem;transition:opacity .15s}.editable-title.svelte-9n99wb:hover .edit-hint:where(.svelte-9n99wb){opacity:1}.drawer-body.svelte-9n99wb{flex:1;padding:20px;overflow-y:auto}.meta-grid.svelte-9n99wb{grid-template-columns:1fr 1fr;gap:10px;display:grid}.meta-cell.svelte-9n99wb{border:1px solid var(--color-border);background:#f1f5f9cc;border-radius:10px;padding:10px}.dark .meta-cell.svelte-9n99wb{background:#1e293bcc}.meta-label.svelte-9n99wb{text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-muted);margin-bottom:2px;font-size:.65rem;font-weight:700}.meta-value.svelte-9n99wb{color:var(--color-text);font-size:.85rem;font-weight:600}.section-label.svelte-9n99wb{text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-muted);margin-bottom:8px;font-size:.65rem;font-weight:700}.tag-chip.svelte-9n99wb{color:#6366f1;background:#6366f11a;border:1px solid #6366f133;border-radius:9999px;padding:2px 10px;font-size:.72rem}.md-card.svelte-9n99wb{border:1px solid var(--color-border);background:#f8fafccc;border-radius:12px;padding:16px}.dark .md-card.svelte-9n99wb{background:#0f172acc}.json-pre.svelte-9n99wb{border:1px solid var(--color-border);color:var(--color-text);background:#f8fafccc;border-radius:12px;padding:12px;font-family:JetBrains Mono,monospace;font-size:.75rem;overflow-x:auto}.dark .json-pre.svelte-9n99wb{background:#0f172acc}.comment-card.svelte-9n99wb{border:1px solid var(--color-border);background:#f1f5f980;border-radius:10px;padding:10px 14px}.dark .comment-card.svelte-9n99wb{background:#1e293b80}.comment-avatar.svelte-9n99wb{color:#fff;background:linear-gradient(135deg,#6366f1,#0ea5e9);border-radius:9999px;justify-content:center;align-items:center;width:20px;height:20px;font-size:9px;font-weight:700;display:flex}.comment-compose.svelte-9n99wb{border:1px solid var(--color-border);background:#f1f5f980;border-radius:10px;padding:12px}.dark .comment-compose.svelte-9n99wb{background:#1e293b66}.drawer-header.svelte-17ad9lv{border-bottom:1px solid var(--color-border);flex-shrink:0;justify-content:space-between;align-items:flex-start;gap:12px;padding:20px;display:flex}.drawer-title.svelte-17ad9lv{color:var(--color-text);word-break:break-all;font-size:1rem;font-weight:700;line-height:1.3}.type-chip.svelte-17ad9lv{text-transform:uppercase;letter-spacing:.05em;color:#0ea5e9;background:#0ea5e91a;border-radius:20px;padding:3px 8px;font-size:.7rem;font-weight:700}.drawer-body.svelte-17ad9lv{flex-direction:column;gap:20px;padding:20px 24px;display:flex;overflow-y:auto}.drawer-section.svelte-17ad9lv{flex-direction:column;gap:8px;display:flex}.section-label.svelte-17ad9lv{text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-muted);margin-bottom:4px;font-size:.75rem;font-weight:700}.md-card.svelte-17ad9lv{border:1px solid var(--color-border);background:#f8fafccc;border-radius:12px;padding:16px}.dark .md-card.svelte-17ad9lv{background:#0f172acc}.modal-backdrop.svelte-intd6h{z-index:58;-webkit-backdrop-filter:blur(4px);background:#010c1e73;position:fixed;inset:0}.modal-panel.svelte-intd6h{z-index:59;background:var(--color-surface,#fff);border:1px solid var(--color-border);border-radius:20px;flex-direction:column;width:600px;max-width:96vw;max-height:92vh;display:flex;position:fixed;top:50%;left:50%;overflow-y:auto;transform:translate(-50%,-50%);box-shadow:0 32px 96px #010c1e33,0 8px 32px #010c1e1f,inset 0 1px #ffffffb3}html.dark .modal-panel.svelte-intd6h{background:#070f1f;border-color:#94a3b81f;box-shadow:0 32px 96px #0009,0 8px 32px #0006,inset 0 1px #ffffff0a}.modal-header.svelte-intd6h{border-bottom:1px solid var(--color-border);flex-shrink:0;align-items:center;gap:12px;padding:18px 20px 16px;display:flex}.modal-header-icon.svelte-intd6h{color:#fff;background:linear-gradient(135deg,#6366f1,#a855f7);border-radius:10px;flex-shrink:0;justify-content:center;align-items:center;width:34px;height:34px;display:flex;box-shadow:0 4px 12px #6366f159}.modal-mode-label.svelte-intd6h{text-transform:uppercase;letter-spacing:.07em;color:var(--color-text-muted);margin-bottom:4px;font-size:.62rem;font-weight:700}.modal-title-input.svelte-intd6h{width:100%;padding:5px 10px;font-size:.92rem;font-weight:700}.modal-title-text.svelte-intd6h{color:var(--color-text);text-overflow:ellipsis;white-space:nowrap;font-size:.95rem;font-weight:700;line-height:1.3;overflow:hidden}.modal-header-actions.svelte-intd6h{flex-shrink:0;align-items:center;gap:6px;margin-left:auto;display:flex}.danger-btn.svelte-intd6h{color:#ef4444!important}.modal-close-btn.svelte-intd6h{width:28px;height:28px;color:var(--color-text-muted);cursor:pointer;background:0 0;border:none;border-radius:8px;flex-shrink:0;justify-content:center;align-items:center;transition:background .15s,color .15s;display:flex}.modal-close-btn.svelte-intd6h:hover{color:#ef4444;background:#ef44441a}.modal-body.svelte-intd6h{flex-direction:column;flex:1;gap:14px;padding:18px 20px;display:flex;overflow-y:auto}.field-grid-2.svelte-intd6h{grid-template-columns:1fr 1fr;gap:12px;display:grid}.field-group.svelte-intd6h{flex-direction:column;gap:5px;display:flex}.field-label.svelte-intd6h{text-transform:uppercase;letter-spacing:.06em;color:var(--color-text-muted);align-items:center;gap:4px;font-size:.68rem;font-weight:700;display:flex}.required.svelte-intd6h{color:#ef4444;font-size:.7rem}.field-hint.svelte-intd6h{text-transform:none;letter-spacing:0;color:var(--color-text-faint);margin-left:2px;font-size:.62rem;font-style:italic;font-weight:400}.importance-badge.svelte-intd6h{border-radius:9999px;margin-left:4px;padding:1px 7px;font-size:.72rem;font-weight:800}.importance-slider.svelte-intd6h{cursor:pointer;background:0 0;border:none;border-radius:9999px;outline:none;width:100%;height:4px;margin-top:4px;padding:0}.importance-ticks.svelte-intd6h{color:var(--color-text-muted);justify-content:space-between;margin-top:2px;padding:0 2px;font-size:.6rem;display:flex}.importance-ticks.svelte-intd6h span:where(.svelte-intd6h){font-weight:600;transition:color .2s}.importance-ticks.svelte-intd6h span.active:where(.svelte-intd6h){color:var(--color-text)}.content-label-row.svelte-intd6h{justify-content:space-between;align-items:center;margin-bottom:2px;display:flex}.preview-btn.svelte-intd6h{padding:3px 8px;font-size:.65rem}.content-textarea.svelte-intd6h{resize:vertical;min-height:140px;font-family:JetBrains Mono,monospace;font-size:.82rem;line-height:1.6}.meta-grid.svelte-intd6h{grid-template-columns:1fr 1fr;gap:10px;display:grid}.meta-cell.svelte-intd6h{border:1px solid var(--color-border);background:#f1f5f9cc;border-radius:10px;padding:10px 12px}html.dark .meta-cell.svelte-intd6h{background:#1e293bcc}.meta-label.svelte-intd6h{text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-muted);margin-bottom:2px;font-size:.62rem;font-weight:700}.meta-value.svelte-intd6h{color:var(--color-text);font-size:.85rem;font-weight:600}.section-block.svelte-intd6h{flex-direction:column;gap:6px;display:flex}.tags-row.svelte-intd6h{flex-wrap:wrap;gap:6px;display:flex}.tag-chip.svelte-intd6h{color:#6366f1;background:#6366f11a;border:1px solid #6366f133;border-radius:9999px;padding:2px 10px;font-size:.72rem}html.dark .tag-chip.svelte-intd6h{color:#a5b4fc;background:#6366f12e;border-color:#6366f14d}.md-card.svelte-intd6h{border:1px solid var(--color-border);background:#f8fafccc;border-radius:12px;padding:16px}html.dark .md-card.svelte-intd6h{background:#0f172acc}.json-pre.svelte-intd6h{border:1px solid var(--color-border);color:var(--color-text);background:#f8fafccc;border-radius:12px;padding:12px;font-family:JetBrains Mono,monospace;font-size:.75rem;overflow-x:auto}html.dark .json-pre.svelte-intd6h{background:#0f172acc}.mem-error.svelte-intd6h{color:#ef4444;background:#ef444414;border:1px solid #ef444438;border-radius:10px;align-items:center;gap:8px;padding:10px 14px;font-size:.8rem;display:flex}.modal-footer.svelte-intd6h{border-top:1px solid var(--color-border);flex-shrink:0;justify-content:flex-end;align-items:center;gap:8px;padding:14px 20px;display:flex}.modal-save-btn.svelte-intd6h:disabled{opacity:.45;pointer-events:none}.modal-backdrop.svelte-lenod{-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);z-index:2000;background:#0009;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.modal-content.svelte-lenod{background:var(--color-bg);border:1px solid var(--color-border);border-radius:20px;flex-direction:column;width:700px;max-width:95vw;max-height:90vh;display:flex;overflow:hidden;box-shadow:0 30px 60px #00000080}.modal-header.svelte-lenod{border-bottom:1px solid var(--color-border);background:linear-gradient(90deg,#0ea5e914,#0000);justify-content:space-between;align-items:center;padding:20px 24px;display:flex}.header-icon.svelte-lenod{background:#0ea5e91a;border-radius:8px;justify-content:center;align-items:center;width:32px;height:32px;display:flex}.modal-header.svelte-lenod h3:where(.svelte-lenod){color:var(--color-text);margin:0;font-size:1.15rem;font-weight:700}.close-btn.svelte-lenod{opacity:.6;transition:opacity .2s}.close-btn.svelte-lenod:hover{opacity:1}.drop-zone.svelte-lenod{border:2px dashed var(--color-border);background:#f1f5f908;border-radius:16px;justify-content:center;align-items:center;width:100%;height:240px;transition:all .3s;display:flex}.drop-zone.svelte-lenod:hover{background:#0ea5e908;border-color:#0ea5e9}.drop-zone-content.svelte-lenod{text-align:center;flex-direction:column;align-items:center;gap:12px;display:flex}.drop-zone-content.svelte-lenod p:where(.svelte-lenod){color:var(--color-text);margin:0;font-size:.95rem}.preview-container.svelte-lenod{border:1px solid var(--color-border);background:var(--color-bg-secondary);border-radius:12px;overflow:hidden}.preview-header.svelte-lenod{color:var(--color-text-muted);text-transform:uppercase;letter-spacing:.05em;border-bottom:1px solid var(--color-border);background:#0000000d;padding:8px 12px;font-size:.75rem;font-weight:700}.table-wrapper.svelte-lenod{max-height:200px;overflow-y:auto}table.svelte-lenod{border-collapse:collapse;width:100%;font-size:.75rem}th.svelte-lenod{text-align:left;color:var(--color-text-muted);border-bottom:1px solid var(--color-border);z-index:1;background:#00000005;padding:8px 12px;font-weight:600;position:sticky;top:0}td.svelte-lenod{border-bottom:1px solid var(--color-border);color:var(--color-text);white-space:nowrap;text-overflow:ellipsis;max-width:200px;padding:8px 12px;overflow:hidden}tr.svelte-lenod:last-child td:where(.svelte-lenod){border-bottom:none}.modal-footer.svelte-lenod{border-top:1px solid var(--color-border);background:#00000005;justify-content:flex-end;gap:12px;padding:16px 24px;display:flex}.error-msg.svelte-lenod{color:#f87171;background:#ef444414;border:1px solid #ef444433;border-radius:8px;margin-top:16px;padding:10px 14px;font-size:.8rem;font-weight:500}.spinner.svelte-lenod{border:2px solid #ffffff4d;border-top-color:#fff;border-radius:50%;width:16px;height:16px;animation:.8s linear infinite svelte-lenod-spin}@keyframes svelte-lenod-spin{to{transform:rotate(360deg)}}.hidden.svelte-lenod{display:none}.modal-backdrop.svelte-l0ytfo{z-index:58;-webkit-backdrop-filter:blur(4px);background:#010c1e73;position:fixed;inset:0}.modal-panel.svelte-l0ytfo{z-index:59;background:var(--color-surface,#fff);border:1px solid var(--color-border);border-radius:20px;flex-direction:column;width:520px;max-width:95vw;max-height:92vh;display:flex;position:fixed;top:50%;left:50%;overflow-y:auto;transform:translate(-50%,-50%);box-shadow:0 32px 96px #010c1e33,0 8px 32px #010c1e1f,inset 0 1px #ffffffb3}html.dark .modal-panel.svelte-l0ytfo{background:#070f1f;border-color:#94a3b81f;box-shadow:0 32px 96px #0009,0 8px 32px #0006,inset 0 1px #ffffff0a}.modal-header.svelte-l0ytfo{border-bottom:1px solid var(--color-border);flex-shrink:0;align-items:center;gap:12px;padding:18px 20px 16px;display:flex}.modal-header-icon.svelte-l0ytfo{color:#fff;background:linear-gradient(135deg,#0ea5e9,#6366f1);border-radius:10px;flex-shrink:0;justify-content:center;align-items:center;width:34px;height:34px;display:flex;box-shadow:0 4px 12px #0ea5e94d}.modal-title.svelte-l0ytfo{color:var(--color-text);letter-spacing:-.01em;font-size:.9rem;font-weight:800}.modal-subtitle.svelte-l0ytfo{color:var(--color-text-muted);margin-top:1px;font-size:.68rem}.modal-close-btn.svelte-l0ytfo{width:28px;height:28px;color:var(--color-text-muted);cursor:pointer;background:0 0;border:none;border-radius:8px;flex-shrink:0;justify-content:center;align-items:center;margin-left:auto;transition:background .15s,color .15s;display:flex}.modal-close-btn.svelte-l0ytfo:hover{color:#ef4444;background:#ef44441a}.modal-body.svelte-l0ytfo{flex-direction:column;flex:1;gap:14px;padding:18px 20px;display:flex}.field-grid-2.svelte-l0ytfo{grid-template-columns:1fr 1fr;gap:12px;display:grid}.field-group.svelte-l0ytfo{flex-direction:column;gap:5px;display:flex}.field-label.svelte-l0ytfo{text-transform:uppercase;letter-spacing:.06em;color:var(--color-text-muted);align-items:center;gap:4px;font-size:.68rem;font-weight:700;display:flex}.required.svelte-l0ytfo{color:#ef4444;font-size:.7rem}.field-hint.svelte-l0ytfo{color:var(--color-text-faint);text-transform:none;letter-spacing:0;margin-left:auto;font-size:.62rem;font-weight:500}.modal-textarea.svelte-l0ytfo{resize:vertical;min-height:96px;font-size:.82rem;line-height:1.55}.modal-footer.svelte-l0ytfo{border-top:1px solid var(--color-border);flex-shrink:0;justify-content:flex-end;align-items:center;gap:8px;padding:14px 20px;display:flex}.modal-save-btn.svelte-l0ytfo:disabled{opacity:.45;pointer-events:none}.ref-header.svelte-w0wd5z{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:12px;display:flex}.ref-total-badge.svelte-w0wd5z{color:#0ea5e9;background:#0ea5e91a;border:1px solid #0ea5e933;border-radius:9999px;padding:2px 8px;font-size:.62rem;font-weight:700}.ref-search-wrap.svelte-w0wd5z{flex:1;max-width:300px;position:relative}.ref-search-icon.svelte-w0wd5z{color:var(--color-text-muted);pointer-events:none;display:flex;position:absolute;top:50%;left:10px;transform:translateY(-50%)}.ref-search-input.svelte-w0wd5z{width:100%;padding-left:32px;padding-right:28px;font-size:.8rem}.ref-clear-btn.svelte-w0wd5z{cursor:pointer;color:var(--color-text-muted);background:0 0;border:none;border-radius:4px;padding:2px;transition:color .15s;display:flex;position:absolute;top:50%;right:8px;transform:translateY(-50%)}.ref-clear-btn.svelte-w0wd5z:hover{color:var(--color-text)}.ref-body.svelte-w0wd5z{grid-template-columns:160px 1fr;align-items:start;gap:16px;display:grid}@media (width<=700px){.ref-body.svelte-w0wd5z{grid-template-columns:1fr}}.ref-sidebar.svelte-w0wd5z{border:1px solid var(--color-border);border-radius:16px;flex-direction:column;gap:3px;padding:12px;display:flex;position:sticky;top:80px}.ref-sidebar-label.svelte-w0wd5z{text-transform:uppercase;letter-spacing:.07em;color:var(--color-text-muted);padding:4px 8px 8px;font-size:.6rem;font-weight:700}.ref-cat-btn.svelte-w0wd5z{color:var(--color-text-muted);cursor:pointer;text-align:left;background:0 0;border:none;border-radius:9px;align-items:center;gap:7px;width:100%;padding:7px 10px;font-size:.8rem;font-weight:600;transition:all .15s;display:flex}.ref-cat-btn.svelte-w0wd5z:hover{color:var(--color-text);background:#0ea5e90f}.ref-cat-btn.active.svelte-w0wd5z{color:#0ea5e9;background:#0ea5e91a;border:1px solid #0ea5e933}html.dark .ref-cat-btn.active.svelte-w0wd5z{color:#38bdf8;background:#0ea5e926;border-color:#38bdf840}.ref-cat-count.svelte-w0wd5z{color:var(--color-text-muted);background:#64748b1f;border-radius:9999px;margin-left:auto;padding:1px 6px;font-size:.62rem;font-weight:700}.ref-main.svelte-w0wd5z{flex-direction:column;display:flex}.ref-section-header.svelte-w0wd5z{text-transform:uppercase;letter-spacing:.07em;color:var(--color-text-muted);align-items:center;gap:6px;margin-bottom:10px;font-size:.72rem;font-weight:700;display:flex}.ref-section-count.svelte-w0wd5z{color:var(--color-text-muted);background:#64748b1a;border-radius:9999px;padding:1px 6px;font-size:.6rem;font-weight:700}.ref-grid.svelte-w0wd5z{grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:10px;display:grid}.ref-card.svelte-w0wd5z{cursor:pointer;background:#fff;border:1px solid #0000000f;border-radius:16px;flex-direction:column;gap:8px;padding:18px 20px;transition:all .2s cubic-bezier(.4,0,.2,1);display:flex;position:relative;overflow:hidden;box-shadow:0 4px 6px -1px #0000000d,0 2px 4px -2px #00000008}.ref-card.svelte-w0wd5z:before{content:"";background:0 0;height:3px;transition:all .2s;position:absolute;top:0;left:0;right:0}.ref-card.svelte-w0wd5z:hover{border-color:#00000014;transform:translateY(-2px);box-shadow:0 12px 24px -4px #00000014,0 8px 12px -6px #0000000a}html.dark .ref-card.svelte-w0wd5z{background:#0a1226cc;border:1px solid #ffffff14;box-shadow:0 4px 12px #0003}html.dark .ref-card.svelte-w0wd5z:hover{border-color:#ffffff26;box-shadow:0 10px 30px #0006}.ref-card-tool.svelte-w0wd5z:hover:before{background:linear-gradient(90deg,#6366f1,#a855f7)}.ref-card-prompt.svelte-w0wd5z:hover:before{background:linear-gradient(90deg,#a855f7,#ec4899)}.ref-card-resource.svelte-w0wd5z:hover:before{background:linear-gradient(90deg,#10b981,#3b82f6)}.ref-card-top.svelte-w0wd5z{align-items:center;gap:6px;display:flex}.ref-type-badge.svelte-w0wd5z{text-transform:uppercase;letter-spacing:.06em;border:1px solid #0000;border-radius:9999px;align-items:center;gap:4px;padding:2px 7px;font-size:.6rem;font-weight:700;display:inline-flex}.ref-type-tool.svelte-w0wd5z{color:#6366f1;background:#6366f11a;border-color:#6366f133}.ref-type-prompt.svelte-w0wd5z{color:#a855f7;background:#a855f71a;border-color:#a855f733}html.dark .ref-type-tool.svelte-w0wd5z{color:#818cf8}html.dark .ref-type-prompt.svelte-w0wd5z{color:#c084fc}.ref-card-name.svelte-w0wd5z{color:var(--color-text);word-break:break-word;font-size:.82rem;font-weight:700}.ref-card-desc.svelte-w0wd5z{color:var(--color-text-muted);font-size:.72rem;line-height:1.55}.ref-params.svelte-w0wd5z{flex-wrap:wrap;gap:4px;margin-top:4px;display:flex}.ref-param-tag.svelte-w0wd5z{color:#0ea5e9;background:#0ea5e914;border:1px solid #0ea5e92e;border-radius:5px;padding:1px 6px;font-family:JetBrains Mono,Fira Code,monospace;font-size:.65rem}.ref-param-more.svelte-w0wd5z{color:var(--color-text-muted);background:#64748b1a;border-color:#64748b33}html.dark .ref-param-tag.svelte-w0wd5z{color:#38bdf8;background:#0ea5e91f;border-color:#38bdf833}.fab-backdrop.svelte-10ega5z{z-index:49;cursor:default;background:0 0;position:fixed;inset:0}.fab-container.svelte-10ega5z{z-index:50;flex-direction:column;align-items:flex-end;gap:10px;display:flex;position:fixed;bottom:28px;right:28px}.fab-actions.svelte-10ega5z{flex-direction:column;align-items:flex-end;gap:10px;display:flex}.fab-action-item.svelte-10ega5z{opacity:0;pointer-events:none;align-items:center;gap:10px;transition:opacity .2s,transform .2s;display:flex;transform:translateY(12px)scale(.92)}.fab-container.open.svelte-10ega5z .fab-action-item:where(.svelte-10ega5z){opacity:1;pointer-events:auto;transform:translateY(0)scale(1)}.fab-action-label.svelte-10ega5z{color:var(--color-text);background:var(--color-surface,#fff);border:1px solid var(--color-border);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);white-space:nowrap;letter-spacing:.01em;border-radius:8px;padding:4px 10px;font-size:.72rem;font-weight:700;box-shadow:0 2px 8px #0000001a}html.dark .fab-action-label.svelte-10ega5z{color:#e2e8f0;background:#0f172aeb}.fab-action-btn.svelte-10ega5z{cursor:pointer;color:#fff;border:none;border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;width:44px;height:44px;transition:transform .2s,box-shadow .2s;display:flex}.fab-action-btn.memory.svelte-10ega5z{background:linear-gradient(135deg,#6366f1,#8b5cf6);box-shadow:0 4px 14px #6366f166}.fab-action-btn.task.svelte-10ega5z{background:linear-gradient(135deg,#0ea5e9,#06b6d4);box-shadow:0 4px 14px #0ea5e966}.fab-action-btn.svelte-10ega5z:hover{transform:scale(1.1)}.fab-action-btn.memory.svelte-10ega5z:hover{box-shadow:0 6px 20px #6366f18c}.fab-action-btn.task.svelte-10ega5z:hover{box-shadow:0 6px 20px #0ea5e98c}.fab-main.svelte-10ega5z{cursor:pointer;color:#fff;background:linear-gradient(135deg,#0ea5e9,#6366f1);border:none;border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;width:52px;height:52px;transition:transform .2s,box-shadow .2s;display:flex;box-shadow:0 4px 20px #0ea5e973,0 0 #0ea5e900}.fab-main.svelte-10ega5z:hover{transform:scale(1.08);box-shadow:0 6px 28px #0ea5e999,0 0 #0ea5e900}.fab-main.svelte-10ega5z:active{transform:scale(.96)}.fab-icon.svelte-10ega5z{justify-content:center;align-items:center;transition:transform .25s cubic-bezier(.4,0,.2,1);display:flex}.fab-icon.rotated.svelte-10ega5z{transform:rotate(45deg)}.fab-container.svelte-10ega5z:not(.open) .fab-main:where(.svelte-10ega5z):after{content:"";pointer-events:none;border:2px solid #0ea5e966;border-radius:50%;animation:2.4s ease-out infinite svelte-10ega5z-fab-pulse;position:absolute;inset:-4px}@keyframes svelte-10ega5z-fab-pulse{0%{opacity:.7;transform:scale(1)}to{opacity:0;transform:scale(1.45)}}@media (width<=640px){.fab-container.svelte-10ega5z{bottom:max(18px, env(safe-area-inset-bottom));right:14px}.fab-main.svelte-10ega5z{width:48px;height:48px}.fab-container.svelte-10ega5z:not(.open) .fab-main:where(.svelte-10ega5z):after{display:none}}.feature-shell.svelte-owkwhr{flex-direction:column;gap:14px;display:flex}.feature-toolbar.svelte-owkwhr{grid-template-columns:1fr auto;align-items:start;gap:14px;padding:16px;display:grid}.toolbar-title.svelte-owkwhr{align-items:center;gap:10px;display:flex}.toolbar-action.svelte-owkwhr{justify-self:end}.toolbar-subtitle.svelte-owkwhr{color:var(--color-text-muted);margin-top:2px;font-size:.72rem;font-weight:600}.toolbar-controls.svelte-owkwhr{grid-column:1/-1;grid-template-columns:minmax(220px,1.2fr) minmax(130px,.6fr) minmax(180px,1fr) minmax(140px,.6fr);gap:10px;display:grid}.feature-grid.svelte-owkwhr{grid-template-columns:minmax(320px,.9fr) minmax(0,1.25fr);align-items:start;gap:14px;display:grid}.panel-card.svelte-owkwhr{min-width:0;padding:16px}.panel-heading.svelte-owkwhr{justify-content:space-between;align-items:center;gap:12px;margin-bottom:12px;display:flex}.form-grid.svelte-owkwhr{grid-template-columns:repeat(3,minmax(0,1fr));gap:10px;margin:12px 0 10px;display:grid}label.svelte-owkwhr span:where(.svelte-owkwhr){color:var(--color-text-muted);text-transform:uppercase;letter-spacing:.04em;margin-bottom:4px;font-size:.68rem;font-weight:800;display:block}.content-input.svelte-owkwhr{resize:vertical;min-height:150px;margin-bottom:10px}.content-label.svelte-owkwhr{display:block}.list-panel.svelte-owkwhr,.detail-panel.svelte-owkwhr{min-height:460px}.standard-list.svelte-owkwhr{flex-direction:column;gap:8px;max-height:650px;margin-top:12px;display:flex;overflow:auto}.standard-row.svelte-owkwhr{text-align:left;border:1px solid var(--color-border);cursor:pointer;color:var(--color-text);background:#ffffff7a;border-radius:8px;padding:12px}.standard-row.svelte-owkwhr:hover,.standard-row.selected.svelte-owkwhr{background:#0ea5e914;border-color:#0ea5e973}.row-title.svelte-owkwhr{margin-bottom:6px;font-size:.9rem;font-weight:800}.row-meta.svelte-owkwhr{color:var(--color-text-muted);flex-wrap:wrap;gap:8px;font-size:.72rem;font-weight:600;display:flex}.tag-row.svelte-owkwhr{flex-wrap:wrap;gap:5px;margin-top:8px;display:flex}.mini-chip.svelte-owkwhr,.scope-pill.svelte-owkwhr{border:1px solid var(--color-border);color:var(--color-text-muted);border-radius:999px;padding:2px 7px;font-size:.68rem;font-weight:700}.detail-heading.svelte-owkwhr{justify-content:space-between;align-items:flex-start;gap:12px;margin-bottom:12px;display:flex}.detail-title.svelte-owkwhr{color:var(--color-text);margin-bottom:6px;font-size:1rem;font-weight:850}.muted-state.svelte-owkwhr{color:var(--color-text-muted);text-align:center;padding:24px 4px;font-size:.85rem}.empty-state.svelte-owkwhr{min-height:260px;color:var(--color-text-muted);text-align:center;flex-direction:column;justify-content:center;align-items:center;gap:8px;display:flex}.empty-title.svelte-owkwhr{color:var(--color-text);font-size:.92rem;font-weight:850}.empty-copy.svelte-owkwhr{max-width:260px;font-size:.78rem;line-height:1.45}.detail-empty.svelte-owkwhr{min-height:360px}.error-banner.svelte-owkwhr{color:#dc2626;background:#fef2f2;border:1px solid #fecaca;border-radius:8px;padding:10px 12px;font-size:.82rem;font-weight:700}html.dark .standard-row.svelte-owkwhr{background:#0f172a73}html.dark .standard-row.svelte-owkwhr:hover,html.dark .standard-row.selected.svelte-owkwhr{background:#0ea5e91f}@media (width<=1100px){.toolbar-controls.svelte-owkwhr,.feature-grid.svelte-owkwhr,.form-grid.svelte-owkwhr,.feature-toolbar.svelte-owkwhr{grid-template-columns:1fr}.toolbar-action.svelte-owkwhr{justify-content:center;justify-self:stretch}.list-panel.svelte-owkwhr,.detail-panel.svelte-owkwhr{min-height:auto}}.feature-shell.svelte-1ik2acm{flex-direction:column;gap:14px;display:flex}.feature-toolbar.svelte-1ik2acm{grid-template-columns:1fr auto;align-items:start;gap:14px;padding:16px;display:grid}.toolbar-title.svelte-1ik2acm{align-items:center;gap:10px;display:flex}.toolbar-subtitle.svelte-1ik2acm{color:var(--color-text-muted);margin-top:2px;font-size:.72rem;font-weight:600}.toolbar-actions.svelte-1ik2acm{justify-content:flex-end;align-items:center;gap:8px;display:flex}.toolbar-controls.svelte-1ik2acm{grid-column:1/-1;grid-template-columns:160px minmax(180px,1fr) auto;align-items:center;gap:10px;display:grid}.action-grid.svelte-1ik2acm{grid-template-columns:repeat(2,minmax(0,1fr));gap:14px;display:grid}.feature-grid.svelte-1ik2acm{grid-template-columns:minmax(360px,.95fr) minmax(0,1.05fr);align-items:start;gap:14px;display:grid}.panel-card.svelte-1ik2acm{min-width:0;padding:16px}.action-panel.svelte-1ik2acm{min-height:0}.panel-heading.svelte-1ik2acm{justify-content:space-between;align-items:center;gap:12px;margin-bottom:12px;display:flex}.form-stack.svelte-1ik2acm{flex-direction:column;gap:8px;margin-top:12px;display:flex}label.svelte-1ik2acm span:where(.svelte-1ik2acm){color:var(--color-text-muted);text-transform:uppercase;letter-spacing:.04em;margin-bottom:4px;font-size:.68rem;font-weight:800;display:block}.summary-input.svelte-1ik2acm{resize:vertical;min-height:92px}.json-input.svelte-1ik2acm{resize:vertical;min-height:86px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:.78rem}.handoff-list.svelte-1ik2acm{flex-direction:column;gap:8px;max-height:650px;margin-top:12px;display:flex;overflow:auto}.handoff-row.svelte-1ik2acm{text-align:left;border:1px solid var(--color-border);cursor:pointer;color:var(--color-text);background:#ffffff7a;border-radius:8px;padding:12px}.handoff-row.svelte-1ik2acm:hover,.handoff-row.selected.svelte-1ik2acm{background:#0ea5e914;border-color:#0ea5e973}.handoff-top.svelte-1ik2acm{justify-content:space-between;align-items:center;gap:10px;margin-bottom:8px;display:flex}.status-pill.svelte-1ik2acm{text-transform:uppercase;border:1px solid var(--color-border);border-radius:999px;padding:2px 8px;font-size:.67rem;font-weight:850}.status-pending.svelte-1ik2acm{color:#0369a1;background:#0ea5e91f}.status-accepted.svelte-1ik2acm{color:#047857;background:#10b9811f}.status-rejected.svelte-1ik2acm{color:#b91c1c;background:#ef44441f}.status-expired.svelte-1ik2acm{color:#64748b;background:#64748b1f}.row-title.svelte-1ik2acm{margin-bottom:6px;font-size:.9rem;font-weight:800;line-height:1.35}.row-meta.svelte-1ik2acm{color:var(--color-text-muted);flex-wrap:wrap;gap:8px;font-size:.72rem;font-weight:600;display:flex}.row-date.svelte-1ik2acm{color:var(--color-text-muted);font-size:.7rem;font-weight:700}.claim-result.svelte-1ik2acm,.linked-task.svelte-1ik2acm{background:#10b98114;border:1px solid #10b98140;border-radius:8px;margin-top:14px;padding:12px}.detail-title.svelte-1ik2acm{color:var(--color-text);margin-bottom:14px;font-size:1rem;font-weight:850;line-height:1.35}.detail-grid.svelte-1ik2acm{grid-template-columns:1fr 1fr;gap:10px;display:grid}.detail-grid.svelte-1ik2acm div:where(.svelte-1ik2acm){border:1px solid var(--color-border);border-radius:8px;padding:10px}.detail-grid.svelte-1ik2acm span:where(.svelte-1ik2acm){color:var(--color-text-muted);text-transform:uppercase;margin-bottom:4px;font-size:.68rem;font-weight:750;display:block}.detail-grid.svelte-1ik2acm strong:where(.svelte-1ik2acm){color:var(--color-text);word-break:break-word;font-size:.82rem}.muted-state.svelte-1ik2acm{color:var(--color-text-muted);text-align:center;padding:24px 4px;font-size:.85rem}.empty-state.svelte-1ik2acm{min-height:260px;color:var(--color-text-muted);text-align:center;flex-direction:column;justify-content:center;align-items:center;gap:8px;display:flex}.empty-title.svelte-1ik2acm{color:var(--color-text);font-size:.92rem;font-weight:850}.empty-copy.svelte-1ik2acm{max-width:260px;font-size:.78rem;line-height:1.45}.detail-empty.svelte-1ik2acm{min-height:260px}.error-banner.svelte-1ik2acm{color:#dc2626;background:#fef2f2;border:1px solid #fecaca;border-radius:8px;padding:10px 12px;font-size:.82rem;font-weight:700}html.dark .handoff-row.svelte-1ik2acm{background:#0f172a73}html.dark .handoff-row.svelte-1ik2acm:hover,html.dark .handoff-row.selected.svelte-1ik2acm{background:#0ea5e91f}@media (width<=1280px){.feature-toolbar.svelte-1ik2acm{grid-template-columns:1fr}.toolbar-actions.svelte-1ik2acm{justify-content:stretch}.toolbar-actions.svelte-1ik2acm .btn:where(.svelte-1ik2acm){flex:1;justify-content:center}}@media (width<=760px){.toolbar-controls.svelte-1ik2acm,.feature-grid.svelte-1ik2acm,.detail-grid.svelte-1ik2acm,.action-grid.svelte-1ik2acm{grid-template-columns:1fr}.toolbar-actions.svelte-1ik2acm{flex-direction:column}.toolbar-actions.svelte-1ik2acm .btn:where(.svelte-1ik2acm){width:100%}}@media (width<=900px){.dashboard-grid.svelte-1m88iwd{grid-template-columns:1fr!important}}
|
|
@@ -8,8 +8,8 @@
|
|
|
8
8
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
9
9
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
10
10
|
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
|
11
|
-
<script type="module" crossorigin src="/assets/index-
|
|
12
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
11
|
+
<script type="module" crossorigin src="/assets/index-BESxlve8.js"></script>
|
|
12
|
+
<link rel="stylesheet" crossorigin href="/assets/index-DSdSQ0sh.css">
|
|
13
13
|
</head>
|
|
14
14
|
<body>
|
|
15
15
|
<div id="app"></div>
|
package/dist/dashboard/server.js
CHANGED
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
createFileSink,
|
|
9
9
|
listResources,
|
|
10
10
|
logger
|
|
11
|
-
} from "../chunk-
|
|
11
|
+
} from "../chunk-RHTFBGAQ.js";
|
|
12
12
|
|
|
13
13
|
// src/dashboard/server.ts
|
|
14
14
|
import express from "express";
|
|
@@ -29,6 +29,7 @@ var MAX_RESTARTS = 3;
|
|
|
29
29
|
var REQUEST_TIMEOUT_MS = 1e4;
|
|
30
30
|
var MCPClient = class {
|
|
31
31
|
process = null;
|
|
32
|
+
starting = null;
|
|
32
33
|
requestId = 0;
|
|
33
34
|
pendingRequests = /* @__PURE__ */ new Map();
|
|
34
35
|
isInitialized = false;
|
|
@@ -38,6 +39,16 @@ var MCPClient = class {
|
|
|
38
39
|
this.serverPathOverride = serverPath;
|
|
39
40
|
}
|
|
40
41
|
async start() {
|
|
42
|
+
if (this.isInitialized && this.process) return;
|
|
43
|
+
if (this.starting) return this.starting;
|
|
44
|
+
this.starting = this.startInternal();
|
|
45
|
+
try {
|
|
46
|
+
await this.starting;
|
|
47
|
+
} finally {
|
|
48
|
+
this.starting = null;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
async startInternal() {
|
|
41
52
|
if (this.process) return;
|
|
42
53
|
const serverPath = this.serverPathOverride || (fs.existsSync(path.join(__dirname, "../mcp/server.js")) ? path.join(__dirname, "../mcp/server.js") : path.join(__dirname, "./server.js"));
|
|
43
54
|
this.process = spawn("node", [serverPath], {
|
|
@@ -53,6 +64,7 @@ var MCPClient = class {
|
|
|
53
64
|
logger.error("MCP server process closed unexpectedly", { code, restartCount: this.restartCount });
|
|
54
65
|
this.process = null;
|
|
55
66
|
this.isInitialized = false;
|
|
67
|
+
this.starting = null;
|
|
56
68
|
if (this.restartCount < MAX_RESTARTS) {
|
|
57
69
|
this.restartCount++;
|
|
58
70
|
logger.info("Attempting to restart MCP server", { attempt: this.restartCount });
|
package/dist/mcp/server.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
CAPABILITIES,
|
|
4
|
+
HandoffCreateSchema,
|
|
5
|
+
HandoffListSchema,
|
|
4
6
|
LOG_LEVEL_VALUES,
|
|
5
7
|
MCP_PROTOCOL_VERSION,
|
|
6
8
|
MemoryAcknowledgeSchema,
|
|
@@ -13,7 +15,10 @@ import {
|
|
|
13
15
|
MemorySynthesizeSchema,
|
|
14
16
|
MemoryUpdateSchema,
|
|
15
17
|
SQLiteStore,
|
|
18
|
+
StandardSearchSchema,
|
|
19
|
+
StandardStoreSchema,
|
|
16
20
|
TOOL_DEFINITIONS,
|
|
21
|
+
TaskClaimSchema,
|
|
17
22
|
TaskCreateInteractiveSchema,
|
|
18
23
|
TaskCreateSchema,
|
|
19
24
|
TaskDeleteSchema,
|
|
@@ -43,7 +48,7 @@ import {
|
|
|
43
48
|
setLogLevel,
|
|
44
49
|
updateSessionFromInitialize,
|
|
45
50
|
updateSessionRoots
|
|
46
|
-
} from "../chunk-
|
|
51
|
+
} from "../chunk-RHTFBGAQ.js";
|
|
47
52
|
|
|
48
53
|
// src/mcp/server.ts
|
|
49
54
|
import readline from "readline";
|
|
@@ -1624,6 +1629,230 @@ async function handleMemoryDetail(args, storage) {
|
|
|
1624
1629
|
});
|
|
1625
1630
|
}
|
|
1626
1631
|
|
|
1632
|
+
// src/mcp/tools/handoff.manage.ts
|
|
1633
|
+
function buildHandoffListSummary(repo, count, status, fromAgent, toAgent) {
|
|
1634
|
+
const parts = [`Found ${count} handoff${count === 1 ? "" : "s"} in repo "${repo}".`];
|
|
1635
|
+
if (status) {
|
|
1636
|
+
parts.push(`Status filter: ${status}.`);
|
|
1637
|
+
}
|
|
1638
|
+
if (fromAgent) {
|
|
1639
|
+
parts.push(`From agent: ${fromAgent}.`);
|
|
1640
|
+
}
|
|
1641
|
+
if (toAgent) {
|
|
1642
|
+
parts.push(`To agent: ${toAgent}.`);
|
|
1643
|
+
}
|
|
1644
|
+
return parts.join("\n");
|
|
1645
|
+
}
|
|
1646
|
+
async function handleHandoffCreate(args, storage) {
|
|
1647
|
+
const validated = HandoffCreateSchema.parse(args);
|
|
1648
|
+
const { repo, from_agent, to_agent, task_id, task_code, summary, context, expires_at, structured } = validated;
|
|
1649
|
+
let resolvedTaskId = task_id ?? null;
|
|
1650
|
+
if (!resolvedTaskId && task_code) {
|
|
1651
|
+
const task = storage.tasks.getTaskByCode(repo, task_code);
|
|
1652
|
+
if (!task) {
|
|
1653
|
+
throw new Error(`Task not found: ${task_code} in repo ${repo}`);
|
|
1654
|
+
}
|
|
1655
|
+
resolvedTaskId = task.id;
|
|
1656
|
+
}
|
|
1657
|
+
const handoff = storage.handoffs.createHandoff({
|
|
1658
|
+
repo,
|
|
1659
|
+
from_agent,
|
|
1660
|
+
to_agent,
|
|
1661
|
+
task_id: resolvedTaskId,
|
|
1662
|
+
summary,
|
|
1663
|
+
context,
|
|
1664
|
+
expires_at
|
|
1665
|
+
});
|
|
1666
|
+
const contentSummary = [
|
|
1667
|
+
`Created handoff ${handoff.id}.`,
|
|
1668
|
+
`Repo: ${handoff.repo}`,
|
|
1669
|
+
`From: ${handoff.from_agent}`,
|
|
1670
|
+
`To: ${handoff.to_agent || "unassigned"}`,
|
|
1671
|
+
`Status: ${handoff.status}`,
|
|
1672
|
+
`Task ID: ${handoff.task_id || "-"}`,
|
|
1673
|
+
`Summary: ${handoff.summary}`
|
|
1674
|
+
].join("\n");
|
|
1675
|
+
return createMcpResponse(handoff, contentSummary, {
|
|
1676
|
+
contentSummary,
|
|
1677
|
+
includeSerializedStructuredContent: structured
|
|
1678
|
+
});
|
|
1679
|
+
}
|
|
1680
|
+
async function handleHandoffList(args, storage) {
|
|
1681
|
+
const validated = HandoffListSchema.parse(args);
|
|
1682
|
+
const { repo, status, from_agent, to_agent, limit, offset, structured } = validated;
|
|
1683
|
+
const handoffs = storage.handoffs.listHandoffs({
|
|
1684
|
+
repo,
|
|
1685
|
+
status,
|
|
1686
|
+
from_agent,
|
|
1687
|
+
to_agent,
|
|
1688
|
+
limit,
|
|
1689
|
+
offset
|
|
1690
|
+
});
|
|
1691
|
+
const COLUMNS = ["id", "from_agent", "to_agent", "task_id", "status", "created_at", "summary"];
|
|
1692
|
+
const rows = handoffs.map((handoff) => [
|
|
1693
|
+
handoff.id,
|
|
1694
|
+
handoff.from_agent,
|
|
1695
|
+
handoff.to_agent,
|
|
1696
|
+
handoff.task_id,
|
|
1697
|
+
handoff.status,
|
|
1698
|
+
handoff.created_at,
|
|
1699
|
+
handoff.summary
|
|
1700
|
+
]);
|
|
1701
|
+
const structuredData = {
|
|
1702
|
+
schema: "handoff-list",
|
|
1703
|
+
handoffs: {
|
|
1704
|
+
columns: [...COLUMNS],
|
|
1705
|
+
rows
|
|
1706
|
+
},
|
|
1707
|
+
count: rows.length,
|
|
1708
|
+
offset
|
|
1709
|
+
};
|
|
1710
|
+
const contentSummary = buildHandoffListSummary(repo, rows.length, status, from_agent, to_agent);
|
|
1711
|
+
return createMcpResponse(structuredData, contentSummary, {
|
|
1712
|
+
contentSummary,
|
|
1713
|
+
includeSerializedStructuredContent: structured
|
|
1714
|
+
});
|
|
1715
|
+
}
|
|
1716
|
+
async function handleTaskClaim(args, storage) {
|
|
1717
|
+
const validated = TaskClaimSchema.parse(args);
|
|
1718
|
+
const { repo, task_id, task_code, agent, role, metadata, structured } = validated;
|
|
1719
|
+
let taskId = task_id;
|
|
1720
|
+
let resolvedTaskCode;
|
|
1721
|
+
if (taskId) {
|
|
1722
|
+
const task = storage.tasks.getTaskById(taskId);
|
|
1723
|
+
if (!task || task.repo !== repo) {
|
|
1724
|
+
throw new Error(`Task not found: ${taskId} in repo ${repo}`);
|
|
1725
|
+
}
|
|
1726
|
+
resolvedTaskCode = task.task_code;
|
|
1727
|
+
} else if (task_code) {
|
|
1728
|
+
const task = storage.tasks.getTaskByCode(repo, task_code);
|
|
1729
|
+
if (!task) {
|
|
1730
|
+
throw new Error(`Task not found: ${task_code} in repo ${repo}`);
|
|
1731
|
+
}
|
|
1732
|
+
taskId = task.id;
|
|
1733
|
+
resolvedTaskCode = task.task_code;
|
|
1734
|
+
} else {
|
|
1735
|
+
throw new Error("Either task_id or task_code must be provided");
|
|
1736
|
+
}
|
|
1737
|
+
const claim = storage.handoffs.claimTask({
|
|
1738
|
+
repo,
|
|
1739
|
+
task_id: taskId,
|
|
1740
|
+
agent,
|
|
1741
|
+
role,
|
|
1742
|
+
metadata
|
|
1743
|
+
});
|
|
1744
|
+
const responseData = {
|
|
1745
|
+
...claim,
|
|
1746
|
+
task_code: resolvedTaskCode
|
|
1747
|
+
};
|
|
1748
|
+
const contentSummary = [
|
|
1749
|
+
`Claimed task ${resolvedTaskCode || claim.task_id}.`,
|
|
1750
|
+
`Repo: ${claim.repo}`,
|
|
1751
|
+
`Task ID: ${claim.task_id}`,
|
|
1752
|
+
`Agent: ${claim.agent}`,
|
|
1753
|
+
`Role: ${claim.role}`,
|
|
1754
|
+
`Claimed At: ${claim.claimed_at}`
|
|
1755
|
+
].join("\n");
|
|
1756
|
+
const response = createMcpResponse(responseData, contentSummary, {
|
|
1757
|
+
contentSummary,
|
|
1758
|
+
includeSerializedStructuredContent: structured
|
|
1759
|
+
});
|
|
1760
|
+
if (structured) {
|
|
1761
|
+
response.structuredContent = responseData;
|
|
1762
|
+
}
|
|
1763
|
+
return response;
|
|
1764
|
+
}
|
|
1765
|
+
|
|
1766
|
+
// src/mcp/tools/standard.store.ts
|
|
1767
|
+
import { randomUUID as randomUUID3 } from "crypto";
|
|
1768
|
+
async function handleStandardStore(params, db2) {
|
|
1769
|
+
const validated = StandardStoreSchema.parse(params);
|
|
1770
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
1771
|
+
const entry = {
|
|
1772
|
+
id: randomUUID3(),
|
|
1773
|
+
title: validated.name,
|
|
1774
|
+
content: validated.content,
|
|
1775
|
+
context: validated.context || "general",
|
|
1776
|
+
version: validated.version || "1.0.0",
|
|
1777
|
+
language: validated.language || null,
|
|
1778
|
+
stack: validated.stack || [],
|
|
1779
|
+
is_global: validated.is_global !== false,
|
|
1780
|
+
repo: validated.repo || null,
|
|
1781
|
+
tags: validated.tags || [],
|
|
1782
|
+
metadata: validated.metadata || {},
|
|
1783
|
+
created_at: now,
|
|
1784
|
+
updated_at: now,
|
|
1785
|
+
agent: validated.agent || "unknown",
|
|
1786
|
+
model: validated.model || "unknown"
|
|
1787
|
+
};
|
|
1788
|
+
db2.standards.insert(entry);
|
|
1789
|
+
logger.info("[Tool] standard.store - saved coding standard", {
|
|
1790
|
+
standardId: entry.id,
|
|
1791
|
+
title: entry.title,
|
|
1792
|
+
stack: entry.stack,
|
|
1793
|
+
language: entry.language
|
|
1794
|
+
});
|
|
1795
|
+
return createMcpResponse(
|
|
1796
|
+
{
|
|
1797
|
+
success: true,
|
|
1798
|
+
standard: entry,
|
|
1799
|
+
message: `Coding standard "${entry.title}" saved successfully.`
|
|
1800
|
+
},
|
|
1801
|
+
`Saved coding standard: ${entry.title}`,
|
|
1802
|
+
{
|
|
1803
|
+
structuredContentPathHint: "standard",
|
|
1804
|
+
includeSerializedStructuredContent: true
|
|
1805
|
+
}
|
|
1806
|
+
);
|
|
1807
|
+
}
|
|
1808
|
+
|
|
1809
|
+
// src/mcp/tools/standard.search.ts
|
|
1810
|
+
async function handleStandardSearch(params, db2) {
|
|
1811
|
+
const validated = StandardSearchSchema.parse(params);
|
|
1812
|
+
const searchOptions = {
|
|
1813
|
+
limit: validated.limit || 20,
|
|
1814
|
+
offset: validated.offset || 0
|
|
1815
|
+
};
|
|
1816
|
+
if (validated.query) {
|
|
1817
|
+
searchOptions.query = validated.query;
|
|
1818
|
+
}
|
|
1819
|
+
if (validated.stack && validated.stack.length > 0) {
|
|
1820
|
+
searchOptions.stack = validated.stack[0];
|
|
1821
|
+
}
|
|
1822
|
+
if (validated.language) {
|
|
1823
|
+
searchOptions.language = validated.language;
|
|
1824
|
+
}
|
|
1825
|
+
if (validated.version) {
|
|
1826
|
+
searchOptions.context = validated.version;
|
|
1827
|
+
}
|
|
1828
|
+
if (validated.repo !== void 0) {
|
|
1829
|
+
searchOptions.repo = validated.repo;
|
|
1830
|
+
}
|
|
1831
|
+
if (validated.is_global !== void 0) {
|
|
1832
|
+
searchOptions.is_global = validated.is_global;
|
|
1833
|
+
}
|
|
1834
|
+
const results = db2.standards.search(searchOptions);
|
|
1835
|
+
logger.info("[Tool] standard.search - searched coding standards", {
|
|
1836
|
+
resultCount: results.length,
|
|
1837
|
+
stack: validated.stack,
|
|
1838
|
+
language: validated.language,
|
|
1839
|
+
version: validated.version
|
|
1840
|
+
});
|
|
1841
|
+
return createMcpResponse(
|
|
1842
|
+
{
|
|
1843
|
+
success: true,
|
|
1844
|
+
standards: results,
|
|
1845
|
+
count: results.length,
|
|
1846
|
+
message: results.length === 0 ? "No matching coding standards found." : `Found ${results.length} matching standards.`
|
|
1847
|
+
},
|
|
1848
|
+
`Found ${results.length} coding standards matching your query`,
|
|
1849
|
+
{
|
|
1850
|
+
structuredContentPathHint: "standards",
|
|
1851
|
+
includeSerializedStructuredContent: true
|
|
1852
|
+
}
|
|
1853
|
+
);
|
|
1854
|
+
}
|
|
1855
|
+
|
|
1627
1856
|
// src/mcp/tools/task.get.ts
|
|
1628
1857
|
async function handleTaskGet(args, storage) {
|
|
1629
1858
|
const validated = TaskGetSchema.parse(args);
|
|
@@ -1742,8 +1971,11 @@ function createRouter(db2, vectors2, options) {
|
|
|
1742
1971
|
"memory-delete",
|
|
1743
1972
|
"memory-bulk-delete",
|
|
1744
1973
|
"memory-summarize",
|
|
1974
|
+
"handoff-create",
|
|
1975
|
+
"standard-store",
|
|
1745
1976
|
"task-create",
|
|
1746
1977
|
"task-create-interactive",
|
|
1978
|
+
"task-claim",
|
|
1747
1979
|
"task-update",
|
|
1748
1980
|
"task-delete"
|
|
1749
1981
|
]);
|
|
@@ -1780,6 +2012,16 @@ function createRouter(db2, vectors2, options) {
|
|
|
1780
2012
|
return await handleMemoryDelete(args, db2, vectors2, onProgress);
|
|
1781
2013
|
case "memory-detail":
|
|
1782
2014
|
return await handleMemoryDetail(args, db2);
|
|
2015
|
+
case "handoff-create":
|
|
2016
|
+
return await handleHandoffCreate(args, db2);
|
|
2017
|
+
case "handoff-list":
|
|
2018
|
+
return await handleHandoffList(args, db2);
|
|
2019
|
+
case "task-claim":
|
|
2020
|
+
return await handleTaskClaim(args, db2);
|
|
2021
|
+
case "standard-store":
|
|
2022
|
+
return await handleStandardStore(args, db2);
|
|
2023
|
+
case "standard-search":
|
|
2024
|
+
return await handleStandardSearch(args, db2);
|
|
1783
2025
|
case "task-create":
|
|
1784
2026
|
return await handleTaskCreate(args, db2);
|
|
1785
2027
|
case "task-create-interactive":
|
|
@@ -18,8 +18,10 @@ ONLY call MCP tools. No prose, no code, no plans outside MCP.
|
|
|
18
18
|
|
|
19
19
|
## 1. PRE-ANALYSIS
|
|
20
20
|
1. **Search Memory**: Call `memory-search` (architecture/history).
|
|
21
|
-
2. **
|
|
22
|
-
3. **
|
|
21
|
+
2. **Search Standards**: Call `standard-search` when coding conventions may constrain the task.
|
|
22
|
+
3. **Check Handoffs**: Call `handoff-list` for pending context that may already describe the work.
|
|
23
|
+
4. **Research Codebase**: Read relevant source files to verify current implementation and paths.
|
|
24
|
+
5. **De-duplicate**: Call `task-list`. DO NOT duplicate existing tasks. Link related tasks via `parent_id`/`depends_on`.
|
|
23
25
|
|
|
24
26
|
## 2. TASK DESIGN
|
|
25
27
|
- **Atomic**: One logical change per task.
|
|
@@ -43,7 +45,7 @@ ONLY call MCP tools. No prose, no code, no plans outside MCP.
|
|
|
43
45
|
- **Testing**: Scenarios.
|
|
44
46
|
|
|
45
47
|
## 4. MEMORY
|
|
46
|
-
Log architectural/feature changes as `type: decision` via `memory-store`. Skip for simple bug fixes.
|
|
48
|
+
Log architectural/feature changes as `type: decision` via `memory-store`. Store reusable implementation rules via `standard-store`. Skip for simple bug fixes.
|
|
47
49
|
|
|
48
50
|
## 5. MULTI-TASK
|
|
49
51
|
- Parent/Child logic for complex directives.
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: csl-scrapper
|
|
3
|
+
description: Scrape trusted documentation into atomic CSL coding standards entries.
|
|
4
|
+
arguments:
|
|
5
|
+
- name: source_title
|
|
6
|
+
description: Human-readable title of the documentation source.
|
|
7
|
+
required: true
|
|
8
|
+
- name: source_url
|
|
9
|
+
description: Canonical URL for the documentation source.
|
|
10
|
+
required: true
|
|
11
|
+
- name: documentation_content
|
|
12
|
+
description: Documentation excerpt or page content to normalize into atomic coding standards.
|
|
13
|
+
required: true
|
|
14
|
+
agent: Documentation Scraper
|
|
15
|
+
---
|
|
16
|
+
Convert trusted documentation into atomic CSL (Coding Standards Library) entries for the coding_standards entity.
|
|
17
|
+
|
|
18
|
+
Source title: {{source_title}}
|
|
19
|
+
Source URL: {{source_url}}
|
|
20
|
+
Current repo: {{current_repo}}
|
|
21
|
+
|
|
22
|
+
Documentation to analyze:
|
|
23
|
+
{{documentation_content}}
|
|
24
|
+
|
|
25
|
+
Goal:
|
|
26
|
+
- Extract only source-backed coding standards from the documentation.
|
|
27
|
+
- Produce one atomic CSL entry per distinct rule, constraint, prohibition, or required workflow.
|
|
28
|
+
- Each entry must be ready for the standard-store tool shape: name, content, context, version, language, stack, tags, metadata, repo, is_global.
|
|
29
|
+
|
|
30
|
+
Atomic entry rules:
|
|
31
|
+
- One entry = one rule. Split bundled guidance into separate entries.
|
|
32
|
+
- Keep content concise, imperative, and implementation-relevant.
|
|
33
|
+
- Preserve the source meaning without inventing requirements.
|
|
34
|
+
- Ignore navigation text, marketing copy, release notes, changelog noise, and examples that do not establish a rule.
|
|
35
|
+
- Do not emit duplicates or near-duplicates.
|
|
36
|
+
- Do not infer version, language, stack, or scope unless the source makes them explicit.
|
|
37
|
+
- Use metadata to preserve provenance, including source_title, source_url, and a short evidence_excerpt for each entry.
|
|
38
|
+
|
|
39
|
+
Output contract:
|
|
40
|
+
- If tool calls are available, emit one standard-store call per accepted entry.
|
|
41
|
+
- If tool calls are unavailable, return a JSON array of standard-store-compatible payloads.
|
|
42
|
+
- Use title-like names for the "name" field and store the atomic rule text in "content".
|
|
43
|
+
- Use "context" for the topic area (for example: naming, error-handling, routing, testing, hooks, security).
|
|
44
|
+
- Default version to "1.0.0" only when the source gives no versioning signal.
|
|
45
|
+
- Prefer is_global=true unless the source is clearly repo-specific.
|
|
46
|
+
|
|
47
|
+
Refusal rules:
|
|
48
|
+
- Refuse when the material is not documentation or not clearly normative reference content.
|
|
49
|
+
- Refuse when the source is too incomplete to verify atomic rules.
|
|
50
|
+
- Refuse when the request asks you to guess, invent, or fill missing guidance from prior knowledge.
|
|
51
|
+
- Refuse when no source-backed coding standards can be extracted.
|
|
52
|
+
|
|
53
|
+
If you refuse, return exactly:
|
|
54
|
+
```json
|
|
55
|
+
{
|
|
56
|
+
"action": "refuse",
|
|
57
|
+
"reason": "<short explanation>",
|
|
58
|
+
"missing": ["<missing evidence or source requirement>"]
|
|
59
|
+
}
|
|
60
|
+
```
|
|
@@ -17,13 +17,17 @@ You are a memory-aware agent. Memory is project truth, not a suggestion.
|
|
|
17
17
|
6. **Search Mechanics**: Hybrid Search (70% Cosine, 30% BM25). 0.55 similarity threshold prevents duplication.
|
|
18
18
|
|
|
19
19
|
## Execution Policy
|
|
20
|
-
1. **
|
|
21
|
-
2. **
|
|
22
|
-
3. **
|
|
20
|
+
1. **Orient**: Call `task-list` for active work and `handoff-list` for pending transfers when starting a repository session.
|
|
21
|
+
2. **Claim**: Use `task-claim` before taking ownership of a concrete task.
|
|
22
|
+
3. **Search**: Call `memory-search` with `current_file_path` and `current_tags` before coding.
|
|
23
|
+
4. **Standards**: Call `standard-search` when implementation may be governed by coding standards.
|
|
24
|
+
5. **Retrieve**: Use `memory-detail` for full content if search pointer rows are insufficient.
|
|
25
|
+
6. **Select**: Use ONLY highly relevant memories and standards.
|
|
23
26
|
|
|
24
27
|
## Creation Policy
|
|
25
28
|
Store memory ONLY if knowledge is durable (architecture, patterns, fixes) and affects future behavior.
|
|
26
29
|
1. **Categorize**: Use technology `tags`.
|
|
27
30
|
2. **Maintain**: Use `supersedes` for overrides.
|
|
31
|
+
3. **Separate concerns**: Use `standard-store` for normative coding rules and `handoff-create` for agent transfer context. Do not store these as generic memories.
|
|
28
32
|
|
|
29
33
|
Protect codebase health by respecting project history.
|
|
@@ -10,6 +10,8 @@ agent: Code Auditor
|
|
|
10
10
|
Audit {{file_path}} against stored project knowledge.
|
|
11
11
|
|
|
12
12
|
Steps:
|
|
13
|
-
1. **Search**: Call `memory-search` using `current_file_path='{{file_path}}'`.
|
|
14
|
-
2. **
|
|
15
|
-
3. **
|
|
13
|
+
1. **Search Memory**: Call `memory-search` using `current_file_path='{{file_path}}'`.
|
|
14
|
+
2. **Hydrate**: Call `memory-detail` for any relevant pointer row before enforcing it.
|
|
15
|
+
3. **Search Standards**: Call `standard-search` with inferred language/stack/repo filters.
|
|
16
|
+
4. **Evaluate**: Check for compliance with established patterns, documented mistakes, and applicable coding standards.
|
|
17
|
+
5. **Feedback**: Suggest fixes for violations, citing whether the source is memory or standard.
|
|
@@ -13,7 +13,14 @@ agent: Memory Auditor
|
|
|
13
13
|
|
|
14
14
|
## ✅ MANDATORY
|
|
15
15
|
Only store durable, project-specific knowledge.
|
|
16
|
-
- **Types**: `code_fact`, `decision`, `mistake`, `pattern`, `
|
|
16
|
+
- **Types**: `code_fact`, `decision`, `mistake`, `pattern`, `file_claim`, `task_archive`.
|
|
17
17
|
- **Content**: Architecture, UI/UX choices, stack patterns, hard-won bug fixes.
|
|
18
18
|
- **Global**: Set `is_global` only if applicable across repositories (e.g., framework anti-patterns).
|
|
19
19
|
- **Categorization**: Use accurate technology tags.
|
|
20
|
+
|
|
21
|
+
## Operational Note
|
|
22
|
+
- Do **not** store agent coordination state as memory.
|
|
23
|
+
- Use `handoff-create` and `handoff-list` for agent handoffs.
|
|
24
|
+
- Use `task-claim` for task ownership instead of encoding claims in memory metadata.
|
|
25
|
+
- Use `standard-store` for normative coding standards; do not bury implementation rules in generic `decision` memories.
|
|
26
|
+
- Use `standard-search` as the standards navigation layer before applying or creating standards.
|