@vheins/local-memory-mcp 0.7.3 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-ZCK6RZFX.js → chunk-CQK2B6SF.js} +99 -170
- package/dist/dashboard/public/assets/{index-Bd8FKzVy.js → index-CUiLXjvg.js} +2 -2
- package/dist/dashboard/public/assets/index-OXSJZbwn.css +1 -0
- package/dist/dashboard/public/index.html +2 -2
- package/dist/dashboard/server.js +54 -4
- package/dist/mcp/server.js +186 -52
- package/package.json +5 -4
- package/dist/dashboard/public/assets/index-Bd7v94SO.css +0 -1
|
@@ -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}.sidebar.collapsed~.main-content,.main-content.sidebar-collapsed{margin-left:var(--sidebar-collapsed-width)}@media (width<=1024px){.sidebar{display:none}.main-content{margin-left:0!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}.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-agent_handoff{color:#e65100;background:linear-gradient(135deg,#ff980024,#f57c0014);border-color:#ff98004d}.type-agent_registered{color:#33691e;background:linear-gradient(135deg,#9ccc6524,#8bc34a14);border-color:#9ccc654d}.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-agent_handoff{color:#fdba74;background:linear-gradient(135deg,#fb923c33,#f9731614);border-color:#fb923c52}.dark .type-agent_registered{color:#bef264;background:linear-gradient(135deg,#a3e63533,#84cc1614);border-color:#a3e63552}.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)}.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}.pin-btn.svelte-vbr9x3:hover{color:#0ea5e9;background:#0ea5e91a;transform:scale(1.15)}@media (width<=1024px){#mobileMenuBtn.svelte-2va9hf{display:flex!important}}.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}}.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}.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}.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}.mem-header.svelte-intd6h{border-bottom:1px solid var(--color-border);flex-shrink:0;justify-content:space-between;align-items:flex-start;gap:12px;padding:20px;display:flex}.mem-header-actions.svelte-intd6h{flex-shrink:0;align-items:center;gap:6px;display:flex}.mem-title-input.svelte-intd6h{padding:6px 10px;font-size:.95rem;font-weight:700}.mem-error.svelte-intd6h{color:#ef4444;background:#ef444414;border:1px solid #ef444438;border-radius:10px;margin-bottom:14px;padding:10px 14px;font-size:.8rem}.mem-form.svelte-intd6h{flex-direction:column;gap:14px;display:flex}.form-row-2.svelte-intd6h{grid-template-columns:1fr 1fr;gap:12px;display:grid}.form-label.svelte-intd6h{text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-muted);align-items:center;gap:6px;margin-bottom:5px;font-size:.68rem;font-weight:700;display:flex}.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;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)}.mem-footer.svelte-intd6h{border-top:1px solid var(--color-border);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);background:#f8fafc99;flex-shrink:0;justify-content:flex-end;gap:8px;padding:14px 20px;display:flex}html.dark .mem-footer.svelte-intd6h{background:#050c1999}.drawer-title.svelte-intd6h{color:var(--color-text);font-size:1rem;font-weight:700;line-height:1.3}.drawer-body.svelte-intd6h{flex:1;padding:20px;overflow-y:auto}.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}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:.65rem;font-weight:700}.meta-value.svelte-intd6h{color:var(--color-text);font-size:.85rem;font-weight:600}.section-label.svelte-intd6h{text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-muted);margin-bottom:8px;font-size:.65rem;font-weight:700}.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}.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}.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}@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-CUiLXjvg.js"></script>
|
|
12
|
+
<link rel="stylesheet" crossorigin href="/assets/index-OXSJZbwn.css">
|
|
13
13
|
</head>
|
|
14
14
|
<body>
|
|
15
15
|
<div id="app"></div>
|
package/dist/dashboard/server.js
CHANGED
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
TOOL_DEFINITIONS,
|
|
7
7
|
listResources,
|
|
8
8
|
logger
|
|
9
|
-
} from "../chunk-
|
|
9
|
+
} from "../chunk-CQK2B6SF.js";
|
|
10
10
|
|
|
11
11
|
// src/dashboard/server.ts
|
|
12
12
|
import express from "express";
|
|
@@ -344,7 +344,8 @@ var SystemController = class {
|
|
|
344
344
|
id: tool.name,
|
|
345
345
|
attributes: tool
|
|
346
346
|
}));
|
|
347
|
-
const
|
|
347
|
+
const resourceList = listResources();
|
|
348
|
+
const resources = (resourceList.resources || []).map((resource) => ({
|
|
348
349
|
type: "resource",
|
|
349
350
|
id: resource.uri,
|
|
350
351
|
attributes: resource
|
|
@@ -845,11 +846,60 @@ app.use((req, res, next) => {
|
|
|
845
846
|
next();
|
|
846
847
|
});
|
|
847
848
|
app.use("/api", routes_default);
|
|
848
|
-
|
|
849
|
+
function getStaticRoot() {
|
|
850
|
+
const possibleRoots = [
|
|
851
|
+
path3.join(__dirname3, "public"),
|
|
852
|
+
// Production bundled path
|
|
853
|
+
path3.join(process.cwd(), "dist", "dashboard", "public"),
|
|
854
|
+
// Root-relative dist path
|
|
855
|
+
path3.join(process.cwd(), "src", "dashboard", "public")
|
|
856
|
+
// Source path (unbuilt)
|
|
857
|
+
];
|
|
858
|
+
for (const root of possibleRoots) {
|
|
859
|
+
if (fs3.existsSync(path3.join(root, "index.html"))) {
|
|
860
|
+
return root;
|
|
861
|
+
}
|
|
862
|
+
}
|
|
863
|
+
return possibleRoots[0];
|
|
864
|
+
}
|
|
865
|
+
var staticRoot = getStaticRoot();
|
|
866
|
+
logger.debug("Dashboard serving assets from", { staticRoot });
|
|
849
867
|
app.use(express.static(staticRoot));
|
|
850
868
|
app.use((req, res, next) => {
|
|
851
869
|
if (req.path.startsWith("/api")) return next();
|
|
852
|
-
|
|
870
|
+
const indexPath = path3.join(staticRoot, "index.html");
|
|
871
|
+
if (fs3.existsSync(indexPath)) {
|
|
872
|
+
res.sendFile(indexPath);
|
|
873
|
+
} else {
|
|
874
|
+
logger.warn("Dashboard index.html not found", { path: indexPath });
|
|
875
|
+
res.status(404).send(`
|
|
876
|
+
<!DOCTYPE html>
|
|
877
|
+
<html lang="en">
|
|
878
|
+
<head>
|
|
879
|
+
<meta charset="UTF-8">
|
|
880
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
881
|
+
<title>Dashboard Not Built - Local Memory MCP</title>
|
|
882
|
+
<style>
|
|
883
|
+
body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 40px auto; padding: 20px; text-align: center; }
|
|
884
|
+
h1 { color: #e53e3e; }
|
|
885
|
+
code { background: #f7fafc; padding: 2px 4px; border-radius: 4px; border: 1px solid #edf2f7; font-family: monospace; }
|
|
886
|
+
.container { border: 1px solid #e2e8f0; border-radius: 8px; padding: 30px; box-shadow: 0 4px 6px -1px rgba(0,0,0,0.1); }
|
|
887
|
+
.footer { margin-top: 30px; font-size: 0.8rem; color: #718096; }
|
|
888
|
+
</style>
|
|
889
|
+
</head>
|
|
890
|
+
<body>
|
|
891
|
+
<div class="container">
|
|
892
|
+
<h1>Dashboard Assets Not Found</h1>
|
|
893
|
+
<p>The dashboard frontend has not been built yet or assets are missing at:</p>
|
|
894
|
+
<code>${indexPath}</code>
|
|
895
|
+
<p style="margin-top: 20px;">To fix this, please run the build command in the repository root:</p>
|
|
896
|
+
<code>npm run build</code>
|
|
897
|
+
</div>
|
|
898
|
+
<div class="footer">Local Memory MCP v${pkg2.version}</div>
|
|
899
|
+
</body>
|
|
900
|
+
</html>
|
|
901
|
+
`);
|
|
902
|
+
}
|
|
853
903
|
});
|
|
854
904
|
if (process.env.DASHBOARD_ENABLE_MCP === "true") {
|
|
855
905
|
mcpClient.start().catch((e) => logger.error("MCP Client failed", { error: e.message }));
|
package/dist/mcp/server.js
CHANGED
|
@@ -42,7 +42,7 @@ import {
|
|
|
42
42
|
setLogLevel,
|
|
43
43
|
updateSessionFromInitialize,
|
|
44
44
|
updateSessionRoots
|
|
45
|
-
} from "../chunk-
|
|
45
|
+
} from "../chunk-CQK2B6SF.js";
|
|
46
46
|
|
|
47
47
|
// src/mcp/server.ts
|
|
48
48
|
import readline from "readline";
|
|
@@ -214,7 +214,7 @@ function createMcpResponse(data, summary, options) {
|
|
|
214
214
|
resourceLinks,
|
|
215
215
|
structuredContentPathHint,
|
|
216
216
|
contentSummary,
|
|
217
|
-
includeSerializedStructuredContent =
|
|
217
|
+
includeSerializedStructuredContent = false
|
|
218
218
|
} = options || {};
|
|
219
219
|
void includeSerializedStructuredContent;
|
|
220
220
|
let finalData = data;
|
|
@@ -411,11 +411,12 @@ async function handleMemoryStore(params, db2, vectors2) {
|
|
|
411
411
|
{
|
|
412
412
|
contentSummary: `Stored [${entry.code}] "${entry.title}" in repo "${entry.scope.repo}".`,
|
|
413
413
|
structuredContentPathHint: "code",
|
|
414
|
+
includeSerializedStructuredContent: validated.structured,
|
|
414
415
|
resourceLinks: [
|
|
415
416
|
{
|
|
416
417
|
uri: `memory://${entry.id}`,
|
|
417
418
|
name: entry.title,
|
|
418
|
-
description: `Stored memory in repo ${entry.scope.repo}`,
|
|
419
|
+
description: `Stored memory [${entry.code}] in repo ${entry.scope.repo}`,
|
|
419
420
|
mimeType: "application/json",
|
|
420
421
|
annotations: {
|
|
421
422
|
audience: ["assistant"],
|
|
@@ -489,11 +490,12 @@ async function handleMemoryUpdate(params, db2, vectors2) {
|
|
|
489
490
|
`Updated memory ${validated.id} in repo "${existing.scope.repo}". Fields: ${Object.keys(updates).join(", ") || "none"}.`,
|
|
490
491
|
{
|
|
491
492
|
structuredContentPathHint: "updatedFields",
|
|
493
|
+
includeSerializedStructuredContent: validated.structured,
|
|
492
494
|
resourceLinks: [
|
|
493
495
|
{
|
|
494
496
|
uri: `memory://${validated.id}`,
|
|
495
497
|
name: existing.title || validated.id,
|
|
496
|
-
description: `Updated memory in repo ${existing.scope.repo}`,
|
|
498
|
+
description: `Updated memory [${existing.code}] in repo ${existing.scope.repo}`,
|
|
497
499
|
mimeType: "application/json",
|
|
498
500
|
annotations: {
|
|
499
501
|
audience: ["assistant"],
|
|
@@ -675,7 +677,7 @@ async function handleMemorySummarize(params, db2) {
|
|
|
675
677
|
${fullSummary}`;
|
|
676
678
|
return createMcpResponse(null, content, {
|
|
677
679
|
contentSummary: content,
|
|
678
|
-
includeSerializedStructuredContent:
|
|
680
|
+
includeSerializedStructuredContent: validated.structured
|
|
679
681
|
});
|
|
680
682
|
}
|
|
681
683
|
|
|
@@ -724,37 +726,35 @@ async function handleMemoryRecap(params, db2) {
|
|
|
724
726
|
}
|
|
725
727
|
}
|
|
726
728
|
let contentSummary;
|
|
727
|
-
if (
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
parts.push(`${capitalize2(memType)}: ${count}`);
|
|
733
|
-
}
|
|
734
|
-
}
|
|
735
|
-
const memoriesByType = {};
|
|
736
|
-
for (const row of rows) {
|
|
737
|
-
const typeLabel = row.type || "unknown";
|
|
738
|
-
if (!memoriesByType[typeLabel]) {
|
|
739
|
-
memoriesByType[typeLabel] = [];
|
|
740
|
-
}
|
|
741
|
-
memoriesByType[typeLabel].push(row);
|
|
729
|
+
if (total > 0) {
|
|
730
|
+
const parts = [];
|
|
731
|
+
for (const [memType, count] of Object.entries(byType)) {
|
|
732
|
+
if (count > 0) {
|
|
733
|
+
parts.push(`${capitalize2(memType)}: ${count}`);
|
|
742
734
|
}
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
parts.push(`- ${code}|${row.importance}|${row.title}`);
|
|
750
|
-
}
|
|
735
|
+
}
|
|
736
|
+
const memoriesByType = {};
|
|
737
|
+
for (const row of rows) {
|
|
738
|
+
const typeLabel = row.type || "unknown";
|
|
739
|
+
if (!memoriesByType[typeLabel]) {
|
|
740
|
+
memoriesByType[typeLabel] = [];
|
|
751
741
|
}
|
|
742
|
+
memoriesByType[typeLabel].push(row);
|
|
743
|
+
}
|
|
744
|
+
for (const [memType, items] of Object.entries(memoriesByType)) {
|
|
752
745
|
parts.push("");
|
|
753
|
-
parts.push(
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
746
|
+
parts.push(`${capitalize2(memType)}:`);
|
|
747
|
+
parts.push("- code|importance|title");
|
|
748
|
+
for (const row of items) {
|
|
749
|
+
const code = row.code || "-";
|
|
750
|
+
parts.push(`- ${code}|${row.importance}|${row.title}`);
|
|
751
|
+
}
|
|
757
752
|
}
|
|
753
|
+
parts.push("");
|
|
754
|
+
parts.push("Use memory-detail with memory_id (or code) for full content.");
|
|
755
|
+
contentSummary = parts.join("\n").trim();
|
|
756
|
+
} else {
|
|
757
|
+
contentSummary = `No memories found for repo "${validated.repo}".`;
|
|
758
758
|
}
|
|
759
759
|
const structuredData = {
|
|
760
760
|
schema: "memory-recap",
|
|
@@ -902,7 +902,7 @@ async function handleTaskList(args, storage) {
|
|
|
902
902
|
query,
|
|
903
903
|
limit,
|
|
904
904
|
offset,
|
|
905
|
-
structured: isStructuredRequest
|
|
905
|
+
structured: isStructuredRequest = false
|
|
906
906
|
} = validated;
|
|
907
907
|
let statuses = [];
|
|
908
908
|
if (status !== "all") {
|
|
@@ -942,7 +942,19 @@ async function handleTaskList(args, storage) {
|
|
|
942
942
|
}
|
|
943
943
|
return createMcpResponse(structuredData, contentSummary || "", {
|
|
944
944
|
contentSummary,
|
|
945
|
-
includeSerializedStructuredContent: isStructuredRequest
|
|
945
|
+
includeSerializedStructuredContent: isStructuredRequest,
|
|
946
|
+
resourceLinks: [
|
|
947
|
+
{
|
|
948
|
+
uri: `repository://${encodeURIComponent(repo)}/tasks`,
|
|
949
|
+
name: `Task Index (${repo})`,
|
|
950
|
+
description: `Repository task index for ${repo}`,
|
|
951
|
+
mimeType: "application/json",
|
|
952
|
+
annotations: {
|
|
953
|
+
audience: ["assistant"],
|
|
954
|
+
priority: 0.6
|
|
955
|
+
}
|
|
956
|
+
}
|
|
957
|
+
]
|
|
946
958
|
});
|
|
947
959
|
}
|
|
948
960
|
async function handleTaskCreate(args, storage) {
|
|
@@ -979,10 +991,10 @@ async function handleTaskCreate(args, storage) {
|
|
|
979
991
|
}
|
|
980
992
|
}
|
|
981
993
|
const statusTimestamps2 = deriveTaskStatusTimestamps(normalizedStatus, now2);
|
|
982
|
-
const
|
|
994
|
+
const tags = [...taskData.tags || []];
|
|
983
995
|
const phaseTag2 = `phase:${taskData.phase}`;
|
|
984
|
-
if (!
|
|
985
|
-
|
|
996
|
+
if (!tags.includes(phaseTag2)) {
|
|
997
|
+
tags.push(phaseTag2);
|
|
986
998
|
}
|
|
987
999
|
const task2 = {
|
|
988
1000
|
id: randomUUID2(),
|
|
@@ -1002,17 +1014,52 @@ async function handleTaskCreate(args, storage) {
|
|
|
1002
1014
|
finished_at: statusTimestamps2.finished_at,
|
|
1003
1015
|
canceled_at: statusTimestamps2.canceled_at,
|
|
1004
1016
|
est_tokens: taskData.est_tokens ?? 0,
|
|
1005
|
-
tags
|
|
1017
|
+
tags,
|
|
1006
1018
|
metadata: taskData.metadata || {},
|
|
1007
1019
|
parent_id: taskData.parent_id || null,
|
|
1008
1020
|
depends_on: taskData.depends_on || null
|
|
1009
1021
|
};
|
|
1010
1022
|
storage.tasks.insertTask(task2);
|
|
1011
1023
|
createdTasks.push(task2.task_code);
|
|
1024
|
+
task2._temp_id = task2.id;
|
|
1012
1025
|
}
|
|
1026
|
+
const resourceLinks = bulkTasks.slice(0, 10).map((t) => {
|
|
1027
|
+
const taskCode = t.task_code;
|
|
1028
|
+
const taskId2 = t._temp_id;
|
|
1029
|
+
return {
|
|
1030
|
+
uri: `task://${taskId2}`,
|
|
1031
|
+
name: `Task [${taskCode}]`,
|
|
1032
|
+
description: `Created task [${taskCode}] in repo ${repo}`,
|
|
1033
|
+
mimeType: "application/json",
|
|
1034
|
+
annotations: {
|
|
1035
|
+
audience: ["assistant"],
|
|
1036
|
+
priority: 0.9
|
|
1037
|
+
}
|
|
1038
|
+
};
|
|
1039
|
+
});
|
|
1040
|
+
resourceLinks.push({
|
|
1041
|
+
uri: `repository://${encodeURIComponent(repo)}/tasks`,
|
|
1042
|
+
name: `Task Index (${repo})`,
|
|
1043
|
+
description: `Repository task index for ${repo}`,
|
|
1044
|
+
mimeType: "application/json",
|
|
1045
|
+
annotations: {
|
|
1046
|
+
audience: ["assistant"],
|
|
1047
|
+
priority: 0.6
|
|
1048
|
+
}
|
|
1049
|
+
});
|
|
1013
1050
|
return createMcpResponse(
|
|
1014
1051
|
{ success: true, repo, createdCount: bulkTasks.length, taskCodes: createdTasks },
|
|
1015
|
-
`Created ${bulkTasks.length} tasks in repo "${repo}"
|
|
1052
|
+
`Created ${bulkTasks.length} tasks in repo "${repo}".`,
|
|
1053
|
+
{
|
|
1054
|
+
includeSerializedStructuredContent: parsed.structured || false,
|
|
1055
|
+
resourceLinks: resourceLinks.map((link) => ({
|
|
1056
|
+
...link,
|
|
1057
|
+
annotations: {
|
|
1058
|
+
...link.annotations,
|
|
1059
|
+
audience: link.annotations.audience
|
|
1060
|
+
}
|
|
1061
|
+
}))
|
|
1062
|
+
}
|
|
1016
1063
|
);
|
|
1017
1064
|
}
|
|
1018
1065
|
const {
|
|
@@ -1025,7 +1072,6 @@ async function handleTaskCreate(args, storage) {
|
|
|
1025
1072
|
agent,
|
|
1026
1073
|
role,
|
|
1027
1074
|
doc_path,
|
|
1028
|
-
tags,
|
|
1029
1075
|
metadata,
|
|
1030
1076
|
parent_id,
|
|
1031
1077
|
depends_on,
|
|
@@ -1090,7 +1136,32 @@ async function handleTaskCreate(args, storage) {
|
|
|
1090
1136
|
priority: task.priority,
|
|
1091
1137
|
depends_on: task.depends_on
|
|
1092
1138
|
},
|
|
1093
|
-
`Created task [${task.task_code}] ${task.title} in repo "${task.repo}" with status "${task.status}"
|
|
1139
|
+
`Created task [${task.task_code}] ${task.title} in repo "${task.repo}" with status "${task.status}".`,
|
|
1140
|
+
{
|
|
1141
|
+
includeSerializedStructuredContent: parsed.structured || false,
|
|
1142
|
+
resourceLinks: [
|
|
1143
|
+
{
|
|
1144
|
+
uri: `task://${task.id}`,
|
|
1145
|
+
name: `Task [${task.task_code}]`,
|
|
1146
|
+
description: `Created task [${task.task_code}] in repo ${task.repo}`,
|
|
1147
|
+
mimeType: "application/json",
|
|
1148
|
+
annotations: {
|
|
1149
|
+
audience: ["assistant"],
|
|
1150
|
+
priority: 0.9
|
|
1151
|
+
}
|
|
1152
|
+
},
|
|
1153
|
+
{
|
|
1154
|
+
uri: `repository://${encodeURIComponent(task.repo)}/tasks`,
|
|
1155
|
+
name: `Task Index (${task.repo})`,
|
|
1156
|
+
description: `Repository task index for ${task.repo}`,
|
|
1157
|
+
mimeType: "application/json",
|
|
1158
|
+
annotations: {
|
|
1159
|
+
audience: ["assistant"],
|
|
1160
|
+
priority: 0.6
|
|
1161
|
+
}
|
|
1162
|
+
}
|
|
1163
|
+
]
|
|
1164
|
+
}
|
|
1094
1165
|
);
|
|
1095
1166
|
}
|
|
1096
1167
|
async function handleTaskCreateInteractive(args, storage, options = {}) {
|
|
@@ -1122,7 +1193,8 @@ async function handleTaskCreateInteractive(args, storage, options = {}) {
|
|
|
1122
1193
|
{
|
|
1123
1194
|
...completedDraft,
|
|
1124
1195
|
status: completedDraft.status ?? "backlog",
|
|
1125
|
-
priority: completedDraft.priority ?? 3
|
|
1196
|
+
priority: completedDraft.priority ?? 3,
|
|
1197
|
+
structured: true
|
|
1126
1198
|
},
|
|
1127
1199
|
storage
|
|
1128
1200
|
);
|
|
@@ -1199,6 +1271,7 @@ async function handleTaskUpdate(args, storage, vectors2) {
|
|
|
1199
1271
|
throw new Error("Either 'id' or 'ids' must be provided for update");
|
|
1200
1272
|
}
|
|
1201
1273
|
let updatedCount = 0;
|
|
1274
|
+
const updatedTasks = [];
|
|
1202
1275
|
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
1203
1276
|
const isStatusChangingGlobal = updates.status !== void 0;
|
|
1204
1277
|
for (const targetId of targetIds) {
|
|
@@ -1260,8 +1333,29 @@ async function handleTaskUpdate(args, storage, vectors2) {
|
|
|
1260
1333
|
if (updates.status === "completed" && existingTask.status !== "completed") {
|
|
1261
1334
|
await archiveTaskToMemory(targetId, repo, storage, vectors2);
|
|
1262
1335
|
}
|
|
1336
|
+
updatedTasks.push({ id: targetId, code: updates.task_code || existingTask.task_code });
|
|
1263
1337
|
updatedCount++;
|
|
1264
1338
|
}
|
|
1339
|
+
const resourceLinks = updatedTasks.slice(0, 10).map((t) => ({
|
|
1340
|
+
uri: `task://${t.id}`,
|
|
1341
|
+
name: `Task [${t.code}]`,
|
|
1342
|
+
description: `Updated task [${t.code}] in repo ${repo}`,
|
|
1343
|
+
mimeType: "application/json",
|
|
1344
|
+
annotations: {
|
|
1345
|
+
audience: ["assistant"],
|
|
1346
|
+
priority: 0.9
|
|
1347
|
+
}
|
|
1348
|
+
}));
|
|
1349
|
+
resourceLinks.push({
|
|
1350
|
+
uri: `repository://${encodeURIComponent(repo)}/tasks`,
|
|
1351
|
+
name: `Task Index (${repo})`,
|
|
1352
|
+
description: `Repository task index for ${repo}`,
|
|
1353
|
+
mimeType: "application/json",
|
|
1354
|
+
annotations: {
|
|
1355
|
+
audience: ["assistant"],
|
|
1356
|
+
priority: 0.6
|
|
1357
|
+
}
|
|
1358
|
+
});
|
|
1265
1359
|
return createMcpResponse(
|
|
1266
1360
|
{
|
|
1267
1361
|
success: true,
|
|
@@ -1272,11 +1366,22 @@ async function handleTaskUpdate(args, storage, vectors2) {
|
|
|
1272
1366
|
updatedCount,
|
|
1273
1367
|
updatedFields: Object.keys(updates)
|
|
1274
1368
|
},
|
|
1275
|
-
`Updated ${updatedCount} task(s) in repo "${repo}"
|
|
1369
|
+
`Updated ${updatedCount} task(s) in repo "${repo}".`,
|
|
1370
|
+
{
|
|
1371
|
+
includeSerializedStructuredContent: updateData.structured,
|
|
1372
|
+
resourceLinks: resourceLinks.map((link) => ({
|
|
1373
|
+
...link,
|
|
1374
|
+
annotations: {
|
|
1375
|
+
...link.annotations,
|
|
1376
|
+
audience: link.annotations.audience
|
|
1377
|
+
}
|
|
1378
|
+
}))
|
|
1379
|
+
}
|
|
1276
1380
|
);
|
|
1277
1381
|
}
|
|
1278
1382
|
async function handleTaskDelete(args, storage) {
|
|
1279
|
-
const
|
|
1383
|
+
const validated = TaskDeleteSchema.parse(args);
|
|
1384
|
+
const { repo, id, ids } = validated;
|
|
1280
1385
|
const targetIds = ids || (id ? [id] : []);
|
|
1281
1386
|
if (targetIds.length === 0) {
|
|
1282
1387
|
throw new Error("Either 'id' or 'ids' must be provided for deletion");
|
|
@@ -1292,7 +1397,22 @@ async function handleTaskDelete(args, storage) {
|
|
|
1292
1397
|
repo,
|
|
1293
1398
|
deletedCount: targetIds.length
|
|
1294
1399
|
},
|
|
1295
|
-
`Deleted ${targetIds.length} task(s) from repo "${repo}"
|
|
1400
|
+
`Deleted ${targetIds.length} task(s) from repo "${repo}".`,
|
|
1401
|
+
{
|
|
1402
|
+
includeSerializedStructuredContent: validated.structured,
|
|
1403
|
+
resourceLinks: [
|
|
1404
|
+
{
|
|
1405
|
+
uri: `repository://${encodeURIComponent(repo)}/tasks`,
|
|
1406
|
+
name: `Task Index (${repo})`,
|
|
1407
|
+
description: `Repository task index for ${repo}`,
|
|
1408
|
+
mimeType: "application/json",
|
|
1409
|
+
annotations: {
|
|
1410
|
+
audience: ["assistant"],
|
|
1411
|
+
priority: 0.6
|
|
1412
|
+
}
|
|
1413
|
+
}
|
|
1414
|
+
]
|
|
1415
|
+
}
|
|
1296
1416
|
);
|
|
1297
1417
|
}
|
|
1298
1418
|
|
|
@@ -1406,7 +1526,8 @@ ${contextBlock || "No additional context provided."}`
|
|
|
1406
1526
|
},
|
|
1407
1527
|
`Synthesized answer for "${validated.objective}" using repository "${repo}".`,
|
|
1408
1528
|
{
|
|
1409
|
-
structuredContentPathHint: "answer"
|
|
1529
|
+
structuredContentPathHint: "answer",
|
|
1530
|
+
includeSerializedStructuredContent: true
|
|
1410
1531
|
}
|
|
1411
1532
|
);
|
|
1412
1533
|
}
|
|
@@ -1528,12 +1649,14 @@ async function executeSamplingTool(toolName, rawInput, db2, vectors2) {
|
|
|
1528
1649
|
|
|
1529
1650
|
// src/mcp/tools/memory.delete.ts
|
|
1530
1651
|
async function handleMemoryDelete(params, db2, vectors2, onProgress) {
|
|
1531
|
-
const
|
|
1652
|
+
const validated = MemoryDeleteSchema.parse(params);
|
|
1653
|
+
const { id, ids, repo, structured } = validated;
|
|
1532
1654
|
const targetIds = ids || (id ? [id] : []);
|
|
1533
1655
|
if (targetIds.length === 0) {
|
|
1534
1656
|
throw new Error("Either 'id' or 'ids' must be provided for deletion");
|
|
1535
1657
|
}
|
|
1536
1658
|
let deletedCount = 0;
|
|
1659
|
+
const deletedCodes = [];
|
|
1537
1660
|
let lastRepo = repo || "unknown";
|
|
1538
1661
|
const total = targetIds.length;
|
|
1539
1662
|
let progress = 0;
|
|
@@ -1544,6 +1667,7 @@ async function handleMemoryDelete(params, db2, vectors2, onProgress) {
|
|
|
1544
1667
|
const existing = db2.memories.getById(targetId);
|
|
1545
1668
|
if (existing) {
|
|
1546
1669
|
lastRepo = existing.scope.repo;
|
|
1670
|
+
deletedCodes.push(existing.code || existing.id);
|
|
1547
1671
|
db2.memories.delete(targetId);
|
|
1548
1672
|
await vectors2.remove(targetId);
|
|
1549
1673
|
deletedCount++;
|
|
@@ -1562,11 +1686,13 @@ async function handleMemoryDelete(params, db2, vectors2, onProgress) {
|
|
|
1562
1686
|
id: id || void 0,
|
|
1563
1687
|
ids: ids || void 0,
|
|
1564
1688
|
repo: lastRepo,
|
|
1565
|
-
deletedCount
|
|
1689
|
+
deletedCount,
|
|
1690
|
+
deletedCodes: deletedCount > 10 ? [...deletedCodes.slice(0, 10), "..."] : deletedCodes
|
|
1566
1691
|
},
|
|
1567
1692
|
`Deleted ${deletedCount} memory entry(ies) from repo "${lastRepo}".`,
|
|
1568
1693
|
{
|
|
1569
1694
|
structuredContentPathHint: "deletedCount",
|
|
1695
|
+
includeSerializedStructuredContent: structured,
|
|
1570
1696
|
resourceLinks: [
|
|
1571
1697
|
{
|
|
1572
1698
|
uri: `repository://${encodeURIComponent(lastRepo)}/memories`,
|
|
@@ -1607,9 +1733,10 @@ async function handleMemoryAcknowledge(params, db2) {
|
|
|
1607
1733
|
id: memory.id,
|
|
1608
1734
|
status: validated.status
|
|
1609
1735
|
},
|
|
1610
|
-
`Acknowledged memory ${memory.
|
|
1736
|
+
`Acknowledged memory [${memory.code}] as "${validated.status}".`,
|
|
1611
1737
|
{
|
|
1612
|
-
structuredContentPathHint: "status"
|
|
1738
|
+
structuredContentPathHint: "status",
|
|
1739
|
+
includeSerializedStructuredContent: validated.structured
|
|
1613
1740
|
}
|
|
1614
1741
|
);
|
|
1615
1742
|
}
|
|
@@ -1719,8 +1846,13 @@ function createRouter(db2, vectors2, options) {
|
|
|
1719
1846
|
return listResources(getSessionContext?.(), params);
|
|
1720
1847
|
case "resources/templates/list":
|
|
1721
1848
|
return listResourceTemplates(params);
|
|
1722
|
-
case "resources/read":
|
|
1723
|
-
|
|
1849
|
+
case "resources/read": {
|
|
1850
|
+
const result = readResource(params?.uri, db2, getSessionContext?.());
|
|
1851
|
+
if (result && Array.isArray(result.contents) && !result.content) {
|
|
1852
|
+
result.content = result.contents;
|
|
1853
|
+
}
|
|
1854
|
+
return result;
|
|
1855
|
+
}
|
|
1724
1856
|
// ---- prompts ----
|
|
1725
1857
|
case "prompts/list":
|
|
1726
1858
|
return listPrompts(db2, getSessionContext?.(), params);
|
|
@@ -2052,7 +2184,9 @@ var logNotificationsEnabled = false;
|
|
|
2052
2184
|
var handleMethod = createRouter(db, vectors, {
|
|
2053
2185
|
getSessionContext: () => session,
|
|
2054
2186
|
sampleMessage: (params) => requestClient("sampling/createMessage", params),
|
|
2187
|
+
// eslint-disable-line @typescript-eslint/no-explicit-any
|
|
2055
2188
|
elicit: (params) => requestClient("elicitation/create", params),
|
|
2189
|
+
// eslint-disable-line @typescript-eslint/no-explicit-any
|
|
2056
2190
|
onResourcesMutated: (uris) => notifyUpdatedResources(uris)
|
|
2057
2191
|
});
|
|
2058
2192
|
addLogSink((payload) => {
|