@glyphs-ai/glyph 0.1.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/LICENSE +21 -0
- package/README.md +245 -0
- package/bundle/glyph.js +67489 -0
- package/bundle/static/assets/index-C38eId2v.js +59 -0
- package/bundle/static/assets/index-mJln7r2H.css +1 -0
- package/bundle/static/index.html +13 -0
- package/bundle/static/mockServiceWorker.js +349 -0
- package/package.json +72 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
:root{--color-bg:#fff;--color-surface:#f7f8fa;--color-surface-hover:#eef0f4;--color-border:#e4e7eb;--color-border-strong:#c8cdd5;--color-text:#1a1d23;--color-text-muted:#6b7280;--color-text-subtle:#9aa1ac;--color-text-meta:#5d6470;--color-accent:#2563eb;--color-accent-hover:#1d4ed8;--color-accent-bg:#eef4ff;--color-success:#15803d;--color-success-bg:#ecfdf5;--color-warn:#b45309;--color-warn-bg:#fef3c7;--color-danger:#b91c1c;--color-danger-bg:#fef2f2;--color-sidebar-bg:#fafbfc;--color-sidebar-border:#e4e7eb;--color-sidebar-text:#4b5563;--color-sidebar-text-muted:#9aa1ac;--color-sidebar-active-bg:#eef4ff;--color-sidebar-active-text:#1d4ed8;--color-sidebar-active-border:#2563eb;--color-sidebar-hover-bg:#f0f1f5;--color-sidebar-divider:#e4e7eb;--radius-sm:4px;--radius-md:6px;--radius-lg:10px;--space-1:4px;--space-2:8px;--space-3:12px;--space-4:16px;--space-5:24px;--space-6:32px;--space-7:48px;--font-mono:ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", "Inter", system-ui, sans-serif;--shadow-sm:0 1px 2px #0f172a0a;--shadow-md:0 1px 3px #0f172a14, 0 1px 2px #0f172a0a;--sidebar-width:240px;--topbar-height:72px}*,:before,:after{box-sizing:border-box}html,body,#root{height:100%;margin:0;padding:0}body{font-family:var(--font-sans);color:var(--color-text);background:var(--color-bg);-webkit-font-smoothing:antialiased;font-size:14px;line-height:1.5}code,pre,.mono{font-family:var(--font-mono);font-size:.92em}a{color:var(--color-accent);text-decoration:none}a:hover{text-decoration:underline}button{font-family:inherit;font-size:inherit;cursor:pointer}.shell{grid-template-columns:var(--sidebar-width) 1fr;height:100vh;display:grid}.sidebar{background:var(--color-sidebar-bg);border-right:1px solid var(--color-sidebar-border);color:var(--color-sidebar-text);flex-direction:column;display:flex}.sidebar__header{height:var(--topbar-height);padding:0 var(--space-3);border-bottom:1px solid var(--color-sidebar-divider);flex-direction:column;flex-shrink:0;justify-content:center;gap:4px;display:flex}.sidebar__switcher{align-items:center;gap:4px;display:flex}.sidebar__switcher-select-wrap{flex:1;min-width:0}.sidebar__switcher-select{width:100%;color:var(--color-sidebar-text,var(--color-text));border-radius:var(--radius-md);letter-spacing:-.01em;cursor:pointer;background:0 0;border:1px solid #0000;padding:6px 8px;font-family:inherit;font-size:14px;font-weight:600;transition:background .12s,border-color .12s}.sidebar__switcher-select:hover,.sidebar__switcher-select:focus-visible{background:var(--color-sidebar-hover-bg,var(--color-surface));border-color:var(--color-sidebar-border,var(--color-border));outline:none}.sidebar__icon-btn{border-radius:var(--radius-md);width:28px;height:28px;color:var(--color-sidebar-text-muted,var(--color-text-muted));cursor:pointer;background:0 0;border:1px solid #0000;flex-shrink:0;justify-content:center;align-items:center;padding:0;transition:background .12s,color .12s;display:inline-flex}.sidebar__icon-btn:hover:not(:disabled),.sidebar__icon-btn:focus-visible:not(:disabled){background:var(--color-sidebar-hover-bg,var(--color-surface));color:var(--color-sidebar-text,var(--color-text));outline:none}.sidebar__icon-btn:disabled{opacity:.4;cursor:not-allowed}.sidebar__icon-btn-svg{width:14px;height:14px}.sidebar__rename{align-items:center;gap:4px;display:flex}.sidebar__rename-input{background:var(--color-bg);min-width:0;color:var(--color-text);border:1px solid var(--color-accent);border-radius:var(--radius-md);font-size:14px;font-weight:600;font-family:var(--font-mono);letter-spacing:-.01em;flex:1;padding:6px 8px}.sidebar__rename-input:focus{outline:none;box-shadow:0 0 0 2px #5e6ad233}.sidebar__rename-error{color:var(--color-danger,#c84747);padding:0 var(--space-2);word-break:break-word;font-size:11px}.sidebar__nav{padding:var(--space-4) var(--space-3);flex:1;overflow-y:auto}.sidebar__group{flex-direction:column;display:flex}.sidebar__children{padding:0 0 0 var(--space-3);flex-direction:column;margin:0;list-style:none;display:flex}.sidebar__item--parent{margin-bottom:0}.sidebar__item--child{padding-left:var(--space-3);font-size:13px}.sidebar__icon--child{opacity:.85}.sidebar__item{align-items:center;gap:var(--space-3);padding:var(--space-2) var(--space-3);border-radius:var(--radius-md);color:var(--color-sidebar-text);text-align:left;cursor:pointer;background:0 0;border:0;width:100%;margin-bottom:2px;font-size:13px;font-weight:500;transition:background .1s;display:flex}.sidebar__item:hover{background:var(--color-sidebar-hover-bg);color:var(--color-text)}.sidebar__item--active{background:var(--color-sidebar-active-bg);color:var(--color-sidebar-active-text);font-weight:600}.sidebar__item--active:hover{background:var(--color-sidebar-active-bg)}.sidebar__item--disabled{opacity:.5;cursor:not-allowed}.sidebar__item--disabled:hover{color:var(--color-sidebar-text);background:0 0}.sidebar__icon{color:currentColor;flex-shrink:0;justify-content:center;align-items:center;width:16px;height:16px;display:inline-flex}.sidebar__icon svg{width:16px;height:16px;display:block}.sidebar__badge{background:var(--color-surface-hover);color:var(--color-text-muted);text-transform:uppercase;letter-spacing:.04em;border-radius:999px;margin-left:auto;padding:1px 6px;font-size:10px;font-weight:600}.sidebar__footer{padding:var(--space-2) var(--space-3) var(--space-3);flex-shrink:0}.sidebar__home-link{align-items:center;gap:var(--space-3);width:100%;padding:var(--space-2) var(--space-3);border-radius:var(--radius-md);color:var(--color-sidebar-text-muted);font-size:13px;font-weight:500;text-decoration:none;transition:background .1s,color .1s;display:flex}.sidebar__home-link:hover,.sidebar__home-link:focus-visible{background:var(--color-sidebar-hover-bg);color:var(--color-sidebar-text);outline:none;text-decoration:none}.sidebar__home-link-icon{flex-shrink:0;width:16px;height:16px}.main{background:var(--color-bg);flex-direction:column;display:flex;overflow:hidden}.topbar{height:var(--topbar-height);border-bottom:1px solid var(--color-border);padding:0 var(--space-6);align-items:center;gap:var(--space-4);background:var(--color-bg);display:flex}.topbar__title{letter-spacing:-.01em;margin:0;font-size:18px;font-weight:600}.topbar__crumb{color:var(--color-text-muted);font-size:13px}.topbar__spacer{flex:1}.topbar__actions{align-items:center;gap:var(--space-2);display:flex}.content{padding:var(--space-6);flex:1;overflow-y:auto}.section-tabs{gap:var(--space-1);border-bottom:1px solid var(--color-border);margin-bottom:var(--space-5);display:flex}.section-tabs button{padding:var(--space-3) var(--space-4);color:var(--color-text-muted);background:0 0;border:0;border-bottom:2px solid #0000;margin-bottom:-1px;font-size:14px}.section-tabs button:hover{color:var(--color-text)}.section-tabs button.active{color:var(--color-accent);border-bottom-color:var(--color-accent);font-weight:600}.section-tabs .count{margin-left:var(--space-2);background:var(--color-surface);color:var(--color-text-muted);border-radius:999px;padding:1px 6px;font-size:11px}.section-tabs button.active .count{background:var(--color-accent-bg);color:var(--color-accent)}.btn{align-items:center;gap:var(--space-2);padding:var(--space-2) var(--space-4);border-radius:var(--radius-md);border:1px solid var(--color-border);background:var(--color-bg);color:var(--color-text);font-size:13px;transition:background .1s;display:inline-flex}.btn svg{width:14px;height:14px}.btn:hover{background:var(--color-surface-hover)}.btn--primary{background:var(--color-accent);border-color:var(--color-accent);color:#fff}.btn--primary:hover{background:var(--color-accent-hover)}.btn--ghost{background:0 0;border-color:#0000}.btn--ghost:hover{background:var(--color-surface)}.btn--icon{padding:var(--space-2);line-height:0}.btn--icon svg{width:16px;height:16px}.btn--danger{background:var(--color-danger);border-color:var(--color-danger);color:#fff}.btn--danger:hover{background:#991b1b}.btn:disabled{opacity:.5;cursor:not-allowed}.page-toolbar{justify-content:space-between;align-items:flex-end;gap:var(--space-4);border-bottom:1px solid var(--color-border);margin-bottom:var(--space-5);display:flex}.page-toolbar .section-tabs{border-bottom:0;margin-bottom:0}.page-toolbar__actions{padding:0 0 var(--space-3);gap:var(--space-2);display:flex}.filter-menu{display:inline-block;position:relative}.filter-menu__trigger{cursor:pointer;align-items:center;gap:var(--space-1);display:inline-flex}.filter-menu__icon{font-size:13px;line-height:1}.filter-menu__sep{color:var(--color-text-subtle);margin:0 2px}.filter-menu__current{color:var(--color-accent);font-weight:600}.filter-menu__trigger--active{background:var(--color-accent-bg);color:var(--color-accent)}.filter-menu__panel{z-index:30;min-width:200px;padding:var(--space-2);background:var(--color-bg);border:1px solid var(--color-border);border-radius:var(--radius-md);box-shadow:var(--shadow-md);flex-direction:column;gap:2px;display:flex;position:absolute;top:calc(100% + 4px);right:0}.filter-menu__group-label{padding:var(--space-1) var(--space-2);letter-spacing:.04em;text-transform:uppercase;color:var(--color-text-subtle);font-size:11px;font-weight:600}.filter-menu__option{align-items:center;gap:var(--space-2);padding:var(--space-2);border-radius:var(--radius-sm);color:var(--color-text);cursor:pointer;text-align:left;background:0 0;border:0;font-size:13px;display:flex}.filter-menu__option:hover{background:var(--color-surface-hover)}.filter-menu__option--active{color:var(--color-accent);font-weight:600}.filter-menu__radio{text-align:center;width:14px;color:var(--color-text-subtle);font-size:12px}.filter-menu__option--active .filter-menu__radio{color:var(--color-accent)}.filter-menu__option-label{flex:1}.filter-menu__option-count{background:var(--color-surface);min-width:18px;color:var(--color-text-muted);border-radius:999px;justify-content:center;align-items:center;padding:1px 6px;font-size:11px;font-weight:500;display:inline-flex}.card{background:var(--color-bg);border:1px solid var(--color-border);border-radius:var(--radius-lg);padding:var(--space-5);box-shadow:var(--shadow-sm)}.card__header{margin-bottom:var(--space-3);align-items:center;display:flex}.card__title{letter-spacing:-.01em;margin:0;font-size:15px;font-weight:600}.stat-grid{gap:var(--space-4);grid-template-columns:repeat(auto-fit,minmax(140px,1fr));display:grid}.stat{background:var(--color-surface);border-radius:var(--radius-lg);padding:var(--space-4) var(--space-5);border:1px solid var(--color-border)}.stat__value{letter-spacing:-.02em;font-size:28px;font-weight:600;line-height:1.1}.stat__value--warn{color:var(--color-danger)}.stat__label{margin-top:var(--space-1);text-transform:uppercase;letter-spacing:.06em;color:var(--color-text-muted);font-size:12px;font-weight:500}.table{border-collapse:collapse;table-layout:fixed;width:100%;max-width:1100px;font-size:13px}.table th{text-align:left;padding:var(--space-3);text-transform:uppercase;letter-spacing:.06em;color:var(--color-text-muted);border-bottom:1px solid var(--color-border);background:var(--color-surface);font-size:11px;font-weight:500}.table td{padding:var(--space-3);border-bottom:1px solid var(--color-border);vertical-align:top}.table tbody tr:hover{background:var(--color-surface-hover)}.table .name-cell{font-family:var(--font-mono);text-overflow:ellipsis;white-space:nowrap;font-weight:500;overflow:hidden}.table .name-cell .link-button{text-overflow:ellipsis;white-space:nowrap;vertical-align:bottom;max-width:100%;display:inline-block;overflow:hidden}.table .desc-cell{color:var(--color-text-muted);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.table .desc-cell.mono{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.table .version-cell{font-family:var(--font-mono);color:var(--color-text-muted);white-space:nowrap;font-size:12px}.table th.col-name{width:200px}.table th.col-version{width:80px}.table th.col-status{width:110px}.table th.col-path{width:auto}.badge{align-items:center;gap:var(--space-1);border-radius:var(--radius-sm);text-transform:uppercase;letter-spacing:.04em;padding:2px 8px;font-size:11px;font-weight:500;display:inline-flex}.badge--ready{color:var(--color-success);background:#15803d1a}.badge--disabled{color:var(--color-warn);background:#b453091a}.badge--ok,.badge--success{color:var(--color-success);background:#15803d1a}.badge--danger{background:var(--color-danger-bg,#dc26261a);color:var(--color-danger)}.badge--muted{background:var(--color-surface-hover);color:var(--color-text-muted)}.badge--info{color:var(--color-accent);background:#2563eb1a}.badge--warn{color:var(--color-warn);background:#b453091a}.muted{color:var(--color-text-muted)}.copy-row{align-items:center;gap:var(--space-2);padding:var(--space-2) var(--space-3);background:var(--color-surface-hover);border-radius:var(--radius-md);font-family:var(--font-mono);font-size:12px;display:flex}.copy-row__text{white-space:nowrap;flex:auto;min-width:0;overflow-x:auto}.copy-row__btn{flex:none}.empty{text-align:center;padding:var(--space-7) var(--space-5);color:var(--color-text-muted);border:1px dashed var(--color-border);border-radius:var(--radius-lg);background:var(--color-surface)}.empty__icon{margin-bottom:var(--space-3);opacity:.6;font-size:32px}.empty__icon svg{width:1em;height:1em}.empty__title{color:var(--color-text);margin:0 0 var(--space-2);font-size:15px;font-weight:600}.empty__hint{margin:0;font-size:13px}.empty__hint code{background:var(--color-surface-hover);border-radius:4px;padding:1px 6px}.alert{padding:var(--space-3) var(--space-4);border-radius:var(--radius-md);margin-bottom:var(--space-4);align-items:center;gap:var(--space-2);display:flex}.alert--error{background:var(--color-danger-bg);color:var(--color-danger);border:1px solid var(--color-danger)}.alert--info{background:var(--color-accent-bg);color:var(--color-accent);border:1px solid var(--color-accent);font-size:13px;line-height:1.5;display:block}.alert--info code{word-break:break-all;background:#0000000d;border-radius:3px;padding:0 4px;font-size:12px}.detail-dialog{overflow-wrap:anywhere;min-width:0}.detail-hero{align-items:flex-start;gap:var(--space-3);flex:1;min-width:0;display:flex}.detail-hero__icon{border-radius:var(--radius-md);background:#0000000a;border:1px solid #00000014;flex-shrink:0;justify-content:center;align-items:center;width:40px;height:40px;font-size:20px;line-height:1;display:inline-flex}.detail-hero__text{flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.detail-hero__kind{letter-spacing:.08em;color:var(--color-text-muted);text-transform:uppercase;font-size:10px;font-weight:600}.detail-hero__title{align-items:center;gap:var(--space-2);flex-wrap:wrap;min-width:0;display:flex}.detail-hero__name{font-family:var(--font-mono,ui-monospace, SFMono-Regular, monospace);letter-spacing:-.01em;word-break:break-word;min-width:0;font-size:17px;font-weight:600}.detail-hero__status{border:1px solid #0000;border-radius:999px;align-items:center;gap:4px;padding:2px 8px;font-size:11px;font-weight:500;display:inline-flex}.detail-hero__status--ready{color:#1f7a3a;background:#1f7a3a14;border-color:#1f7a3a33}.detail-hero__status--blocked{color:#b54708;background:#b5470814;border-color:#b5470833}.detail-hero__status-dot{font-size:8px;line-height:1}.detail-hero__status-dot--ready{color:#1f7a3a}.detail-hero__status-dot--blocked{color:#b54708}.detail-hero__namespace{font-family:var(--font-mono,ui-monospace, SFMono-Regular, monospace);color:var(--color-text-muted);word-break:break-word;font-size:12px}.detail-dialog__tabs{gap:var(--space-2);border-bottom:1px solid var(--color-border);margin:calc(-1 * var(--space-2)) 0 0 0;display:flex}.detail-dialog__tab{appearance:none;padding:var(--space-2) var(--space-3);color:var(--color-text-muted);cursor:pointer;background:0 0;border:none;border-bottom:2px solid #0000;margin-bottom:-1px;font-size:13px;font-weight:500;transition:color .12s,border-color .12s}.detail-dialog__tab:hover{color:var(--color-text)}.detail-dialog__tab--active{color:var(--color-text);border-bottom-color:var(--color-accent)}.detail-dialog__dl{gap:var(--space-2) var(--space-4);margin:0 0 var(--space-4) 0;grid-template-columns:110px 1fr;font-size:13px;line-height:1.5;display:grid}.detail-dialog__dl dt{color:var(--color-text-muted);padding-top:2px;font-weight:500}.detail-dialog__dl dd{word-wrap:break-word;min-width:0;margin:0}.detail-dialog__dl code{background:#0000000d;border-radius:3px;padding:1px 6px;font-size:12px}.detail-dialog__origin{font-family:var(--font-mono,ui-monospace, SFMono-Regular, monospace);color:var(--color-accent);word-break:break-all;font-size:12px;text-decoration:none}.detail-dialog__origin:hover{text-decoration:underline}.detail-dialog__origin-scheme{color:var(--color-text-muted);font-size:11px}.detail-dialog__status{align-items:center;gap:6px;display:inline-flex}.detail-dialog__empty{color:var(--color-text-muted);font-style:italic}.detail-dialog__deps{flex-direction:column;gap:4px;min-width:0;margin:0;padding:0;list-style:none;display:flex}.detail-dialog__deps li{min-width:0;margin:0}.detail-dialog__dep{font-family:var(--font-mono,ui-monospace, SFMono-Regular, monospace);color:var(--color-text);word-break:break-all;overflow-wrap:anywhere;background:#0000000a;border:1px solid #00000014;border-radius:4px;padding:4px 8px;font-size:11px;line-height:1.4;text-decoration:none;display:block}.detail-dialog__dep:hover{background:var(--color-accent-bg);border-color:var(--color-accent);color:var(--color-accent)}.detail-dialog__prereqs{padding:var(--space-2) var(--space-3);border-radius:var(--radius-md);font-family:var(--font-mono,ui-monospace, SFMono-Regular, monospace);white-space:pre-wrap;word-wrap:break-word;background:#00000008;margin:0;font-size:12px}.detail-dialog__code{padding:var(--space-2) var(--space-3);border-radius:var(--radius-md);font-family:var(--font-mono,ui-monospace, SFMono-Regular, monospace);white-space:pre;background:#0000000a;max-height:400px;margin:0;font-size:12px;line-height:1.45;overflow-x:auto}.kv-list{gap:var(--space-3) var(--space-5);grid-template-columns:180px 1fr;font-size:13px;display:grid}.kv-list dt{color:var(--color-text-muted);font-weight:500}.kv-list dd{font-family:var(--font-mono);word-break:break-all;margin:0}.env-hint{vertical-align:middle;align-items:center;margin-left:4px;display:inline-flex;position:relative}.env-hint__trigger{color:var(--color-text-muted);cursor:help;background:0 0;border:0;border-radius:999px;justify-content:center;align-items:center;padding:0;display:inline-flex}.env-hint__trigger:hover,.env-hint__trigger:focus-visible{color:var(--color-text);outline:none}.env-hint__icon{width:14px;height:14px}.env-hint__bubble{color:#f5f6f8;width:max-content;max-width:260px;box-shadow:var(--shadow-md);font-family:var(--font-sans);text-align:left;white-space:normal;opacity:0;visibility:hidden;pointer-events:none;z-index:100;background:#1a1d23eb;border-radius:4px;padding:5px 8px;font-size:11px;font-weight:400;line-height:1.45;transition:opacity .12s .15s,visibility .12s .15s;position:absolute;top:calc(100% + 4px);left:0}.env-hint:hover .env-hint__bubble,.env-hint:focus-within .env-hint__bubble{opacity:1;visibility:visible}.card-grid{gap:var(--space-3);grid-template-columns:repeat(auto-fill,minmax(360px,1fr));display:grid}.card-grid__item{gap:var(--space-2);padding:var(--space-4);border:1px solid var(--color-border);border-radius:var(--radius-lg);background:var(--color-bg);cursor:pointer;border-left-width:3px;flex-direction:column;transition:border-color .1s,box-shadow .1s,transform .1s;display:flex;position:relative}.card-grid__item[data-status=ready]{border-left-color:var(--color-success)}.card-grid__item[data-status=blocked]{border-left-color:var(--color-warn);background:var(--color-surface)}.card-grid__item:hover{border-color:var(--color-border-strong);box-shadow:var(--shadow-md)}.card-grid__item[data-status=ready]:hover{border-left-color:var(--color-success)}.card-grid__item[data-status=blocked]:hover{border-left-color:var(--color-warn)}.card-grid__item:focus-visible{outline:2px solid var(--color-accent);outline-offset:2px}.card-grid__item--highlight{animation:2s ease-out both card-grid-highlight}@keyframes card-grid-highlight{0%{background:var(--color-accent-bg);box-shadow:0 0 0 2px var(--color-accent)}to{background:0 0;box-shadow:0 0 #0000}}.card-grid__header{justify-content:space-between;align-items:center;min-height:18px;display:flex}.card-grid__kind{letter-spacing:.06em;text-transform:uppercase;color:var(--color-text-subtle);align-items:center;gap:4px;font-size:10px;font-weight:600;display:inline-flex}.card-grid__title{margin-top:var(--space-1);flex-direction:column;gap:2px;display:flex}.card-grid__namespace{font-family:var(--font-mono);color:var(--color-text-subtle);letter-spacing:-.01em;word-break:break-all;min-height:13.2px;font-size:11px;line-height:1.2}.card-grid__short{letter-spacing:-.01em;color:var(--color-text);word-break:break-word;overflow-wrap:anywhere;font-size:16px;font-weight:600;line-height:1.25}.card-grid__reason{padding:var(--space-1) 0;color:#0000;min-height:calc(12px * 1.4 + var(--space-1) * 2);align-items:baseline;gap:4px;margin:0;font-size:12px;line-height:1.4;display:flex}.card-grid__reason--filled{color:var(--color-warn)}.card-grid__footer{align-items:center;gap:var(--space-2);color:var(--color-text-subtle);padding-top:var(--space-2);border-top:1px solid var(--color-border);margin-top:auto;font-size:11px;display:flex}.card-grid__meta-item{font-family:var(--font-mono)}.card-grid__meta-sep{background:var(--color-border);width:1px;height:12px}.card-grid__meta-spacer{flex:1}.card-grid__status{font-family:var(--font-sans);align-items:center;gap:5px;font-size:11px;font-weight:500;display:inline-flex}.card-grid__status-dot{background:currentColor;border-radius:50%;width:6px;height:6px}.card-grid__status--ready{color:var(--color-success)}.card-grid__status--blocked{color:var(--color-warn)}.card-grid__action--icon{border-radius:var(--radius-sm);color:var(--color-text-subtle);cursor:pointer;opacity:0;background:0 0;border:0;flex-shrink:0;align-items:center;padding:4px;transition:opacity .1s,background .1s,color .1s;display:inline-flex}.card-grid__item:hover .card-grid__action--icon,.card-grid__action--icon:focus-visible{opacity:1}.card-grid__action--icon:hover{background:var(--color-danger-bg);color:var(--color-danger)}.card-grid__action--icon svg{width:14px;height:14px;display:block}.card-grid__desc{color:var(--color-text-muted);-webkit-line-clamp:2;-webkit-box-orient:vertical;min-height:37.7px;margin:0;font-size:13px;line-height:1.45;display:-webkit-box;overflow:hidden}.modal{border-radius:var(--radius-lg);background:var(--color-bg);width:480px;max-width:90vw;max-height:85vh;color:var(--color-text);border:0;padding:0;overflow:hidden;box-shadow:0 12px 32px #0f172a2e}.modal--large{width:800px;max-width:95vw}.modal::backdrop{background:#0f172a66}.modal__inner{flex-direction:column;max-height:85vh;display:flex}.modal__header{padding:var(--space-3) var(--space-3) var(--space-3) var(--space-5);border-bottom:1px solid var(--color-border);flex-shrink:0;align-items:center;display:flex}.modal__header--rich{padding:var(--space-4) var(--space-3) var(--space-4) var(--space-5);align-items:flex-start}.modal__close{flex-shrink:0}.modal__header--rich .modal__close{margin-top:4px}.modal__title{letter-spacing:-.01em;flex:1;margin:0;font-size:15px;font-weight:600}.modal__body{padding:var(--space-5);gap:var(--space-4);flex-direction:column;flex:1;min-height:0;display:flex;overflow-y:auto}.modal__inner>form{flex-direction:column;flex:auto;min-height:0;display:flex;overflow:hidden}.modal__body--scroll{padding:var(--space-4) var(--space-5)}.modal__body p{color:var(--color-text);margin:0}.modal__body p code{background:var(--color-surface-hover);border-radius:4px;padding:1px 6px}.modal__footer{justify-content:flex-end;gap:var(--space-2);padding:var(--space-3) var(--space-5);border-top:1px solid var(--color-border);background:var(--color-surface);border-bottom-left-radius:var(--radius-lg);border-bottom-right-radius:var(--radius-lg);flex-shrink:0;display:flex}.modal__footer-secondary{margin-right:auto}.form-field{gap:var(--space-2);flex-direction:column;display:flex}.form-field label{color:var(--color-text);font-size:12px;font-weight:500}.form-label-aside{color:var(--color-text-muted);margin-left:6px;font-weight:400}.form-field input,.form-field textarea,.form-field select{font-family:var(--font-sans);padding:var(--space-2) var(--space-3);border:1px solid var(--color-border);border-radius:var(--radius-md);background:var(--color-bg);color:var(--color-text);resize:vertical;font-size:13px}.form-field input{font-family:var(--font-mono)}.form-field select{appearance:none;background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12' fill='none' stroke='%23666' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'><polyline points='3 4.5 6 7.5 9 4.5'/></svg>");background-repeat:no-repeat;background-position:right var(--space-3) center;padding-right:calc(var(--space-3) + 18px);cursor:pointer;background-size:12px 12px}.form-field input:focus,.form-field textarea:focus,.form-field select:focus{outline:2px solid var(--color-accent);outline-offset:-1px;border-color:var(--color-accent)}.form-field input:disabled,.form-field textarea:disabled,.form-field select:disabled{background:var(--color-surface);cursor:not-allowed}.install-dialog__provider{max-width:200px}.metadata-form{gap:var(--space-4);flex-direction:column;display:flex}.chips{position:relative}.chips__row{align-items:center;gap:var(--space-1);padding:var(--space-2);border:1px solid var(--color-border);border-radius:var(--radius-md);background:var(--color-bg);flex-wrap:wrap;min-height:36px;display:flex}.chips__row:focus-within{outline:2px solid var(--color-accent);outline-offset:-1px;border-color:var(--color-accent)}.chips__chip{align-items:center;gap:var(--space-1);background:var(--color-accent-bg);border-radius:var(--radius-sm);font-family:var(--font-mono);color:var(--color-accent);padding:2px 4px 2px 8px;font-size:12px;display:inline-flex}.chips__chip--invalid{color:#b91c1c;background:#dc26261a}.chips__chip--invalid .chips__chip-remove{color:#b91c1c}.chips__chip--invalid .chips__chip-remove:hover{background:#dc26262e}.chips__chip-text{line-height:1.2}.chips__chip-remove{width:16px;height:16px;color:var(--color-accent);cursor:pointer;background:0 0;border:0;border-radius:3px;justify-content:center;align-items:center;padding:0;display:inline-flex}.chips__chip-remove:hover{background:#2563eb2e}.chips__chip-remove svg{width:12px;height:12px}.chips__input{min-width:100px;font-family:var(--font-mono);color:var(--color-text);background:0 0;border:0;outline:none;flex:1;padding:2px 4px;font-size:12px}.chips__empty{color:var(--color-text-subtle);padding:0 var(--space-1);font-size:12px;font-style:italic}.chips__suggest{z-index:1000;background:var(--color-bg);border:1px solid var(--color-border);border-radius:var(--radius-md);max-height:200px;box-shadow:var(--shadow-md);padding:var(--space-1);position:fixed;overflow-y:auto}.chips__suggest-item{align-items:center;gap:var(--space-2);width:100%;padding:var(--space-2) var(--space-3);border-radius:var(--radius-sm);font-family:var(--font-mono);text-align:left;color:var(--color-text);cursor:pointer;background:0 0;border:0;font-size:12px;display:flex}.chips__suggest-item:hover{background:var(--color-surface-hover)}.chips__suggest-item svg{width:12px;height:12px;color:var(--color-text-subtle)}.form-hint{color:var(--color-text-muted);margin:0;font-size:12px}.form-hint code{background:var(--color-surface-hover);border-radius:4px;padding:1px 6px;font-size:11px}.code-editor{border:1px solid var(--color-border);border-radius:var(--radius-md);background:var(--color-bg);overflow:hidden}.code-editor:focus-within{border-color:var(--color-accent);outline:2px solid var(--color-accent);outline-offset:-1px}.code-editor .cm-editor{background:var(--color-bg)}.code-editor .cm-editor.cm-focused{outline:none}.code-editor .cm-scroller{overflow:auto}.code-editor .cm-gutters{background:var(--color-surface);border-right:1px solid var(--color-border);color:var(--color-text-subtle)}.code-editor .cm-activeLine{background:#2563eb0a}.code-editor .cm-activeLineGutter{background:#2563eb0f}.link-button{color:var(--color-accent);font-family:var(--font-mono);font-size:inherit;cursor:pointer;text-align:left;background:0 0;border:0;padding:0;font-weight:500}.select{padding:var(--space-2) var(--space-3);padding-right:var(--space-6);border:1px solid var(--color-border);border-radius:var(--radius-md);background-color:var(--color-bg);color:var(--color-text);cursor:pointer;appearance:none;background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%236b7280' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>");background-repeat:no-repeat;background-position:right var(--space-3) center;background-size:12px;font-family:inherit;font-size:13px;line-height:1.4}.select:hover{border-color:var(--color-border-strong)}.select:focus{outline:2px solid var(--color-accent);outline-offset:-1px;border-color:var(--color-accent)}.select:disabled{opacity:.5;cursor:not-allowed;background-color:var(--color-surface)}.select--full{width:100%}.input{padding:var(--space-2) var(--space-3);border:1px solid var(--color-border);border-radius:var(--radius-md);background-color:var(--color-bg);color:var(--color-text);font-family:inherit;font-size:13px;line-height:1.4}.input:hover{border-color:var(--color-border-strong)}.input:focus{outline:2px solid var(--color-accent);outline-offset:-1px;border-color:var(--color-accent)}.input:disabled{opacity:.5;cursor:not-allowed;background-color:var(--color-surface)}.pills{border:1px solid var(--color-border);border-radius:var(--radius-md);background-color:var(--color-bg);flex-shrink:0;display:inline-flex;overflow:hidden}.pills__btn{appearance:none;padding:var(--space-2) var(--space-3);color:var(--color-text-muted);cursor:pointer;background:0 0;border:0;font-family:inherit;font-size:13px;line-height:1.4}.pills__btn:not(:last-child){border-right:1px solid var(--color-border)}.pills__btn:hover:not(.pills__btn--active){background-color:var(--color-surface);color:var(--color-text)}.pills__btn--active{background-color:var(--color-accent);color:#fff;cursor:default}.pills__btn:disabled{opacity:.5;cursor:not-allowed}.table .col-session{width:200px}.table .col-agent{max-width:280px}.activity-cell{align-items:baseline;gap:var(--space-2);min-width:0;font-size:13px;display:flex}.activity-cell__count{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--color-text);flex:0 auto;font-weight:600;overflow:hidden}.activity-cell__sep{color:var(--color-text-subtle);flex:none}.activity-cell .muted{white-space:nowrap;flex:none}@keyframes spin{to{transform:rotate(360deg)}}.spin{animation:.9s linear infinite spin}.landing{background:radial-gradient(ellipse 1000px 600px at 50% -10%, #6366f11a, transparent 60%), radial-gradient(ellipse 700px 500px at 50% 110%, #2563eb0d, transparent 60%), var(--color-bg);flex-direction:column;min-height:100vh;display:flex;position:relative;overflow:hidden}.landing__topbar{justify-content:space-between;align-items:center;gap:var(--space-4);padding:var(--space-3) var(--space-6);border-bottom:1px solid var(--color-border);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);z-index:1;background:#ffffff8c;display:flex;position:relative}.landing__topbar-brand{align-items:center;gap:var(--space-3);flex-direction:row;display:flex}.landing__topbar-brand .landing__brand-glyph{filter:drop-shadow(0 3px 10px #6366f138);width:40px;height:40px;margin-bottom:0}.landing__topbar-brand .landing__brand-glyph svg{width:100%;height:100%;display:block}.landing__topbar-wordmark{letter-spacing:-.025em;background:linear-gradient(135deg,#2563eb 0%,#6366f1 45%,#8b5cf6 100%);color:#0000;-webkit-text-fill-color:transparent;-webkit-background-clip:text;background-clip:text;margin:0;padding-bottom:.12em;font-size:20px;font-weight:600;line-height:1}.landing__topbar-actions{justify-content:flex-end;align-items:center;gap:var(--space-3);display:flex}.landing__search{align-items:center;width:260px;display:flex;position:relative}.landing__search svg{left:var(--space-3);width:14px;height:14px;color:var(--color-text-subtle);pointer-events:none;position:absolute}.landing__search-input{width:100%;padding:8px var(--space-3) 8px calc(var(--space-3) + 22px);font-size:13px;font-family:var(--font-sans);color:var(--color-text);background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-md);outline:none;transition:border-color .12s,box-shadow .12s}.landing__search-input:focus{border-color:var(--color-accent);box-shadow:0 0 0 3px #2563eb1f}.landing__search-input::placeholder{color:var(--color-text-subtle)}.landing__main{width:100%;max-width:1200px;padding:var(--space-6) var(--space-6) var(--space-7);gap:var(--space-4);z-index:1;flex-direction:column;flex:1;margin:0 auto;display:flex;position:relative}.landing__section-header{align-items:center;gap:var(--space-3);display:flex}.landing__section-title{color:var(--color-text);align-items:center;gap:var(--space-2);letter-spacing:-.01em;margin:0;font-size:18px;font-weight:600;display:flex}.landing__section-count{color:var(--color-text-subtle);background:var(--color-surface);letter-spacing:0;border-radius:999px;padding:2px 8px;font-size:12px;font-weight:500}.landing__grid{gap:var(--space-3);grid-template-columns:repeat(auto-fill,minmax(300px,1fr));display:grid}.landing__card{align-items:stretch;gap:var(--space-3);padding:var(--space-4);border-radius:var(--radius-lg);border:1px solid var(--color-border);background:var(--color-bg);cursor:pointer;text-align:left;transition:border-color .12s,background .12s,box-shadow .12s,transform .12s;display:flex}.landing__card:hover{border-color:var(--color-accent);transform:translateY(-1px);box-shadow:0 4px 16px #2563eb1a}.landing__card:focus-visible{outline:2px solid var(--color-accent);outline-offset:2px}.landing__card-body{flex-direction:column;flex:1;gap:4px;min-width:0;display:flex}.landing__card-header{align-items:center;gap:var(--space-2);min-width:0;display:flex}.landing__card-name{color:var(--color-text);letter-spacing:-.01em;text-overflow:ellipsis;white-space:nowrap;font-size:15px;font-weight:600;overflow:hidden}.landing__card-badge{text-transform:uppercase;letter-spacing:.06em;color:var(--color-accent);background:var(--color-accent-bg);border-radius:999px;flex-shrink:0;padding:2px 8px;font-size:10px;font-weight:600}.landing__card-path{font-family:var(--font-mono);color:var(--color-text-muted);text-overflow:ellipsis;white-space:nowrap;font-size:11px;overflow:hidden}.landing__card-footer{justify-content:space-between;align-items:center;gap:var(--space-3);padding-top:var(--space-1);margin-top:auto;display:flex}.landing__card-meta{color:var(--color-text-subtle);white-space:nowrap;font-size:11px}.landing__card-remove{border-radius:var(--radius-md);width:26px;height:26px;color:var(--color-text-subtle);cursor:pointer;opacity:0;background:0 0;border:0;justify-content:center;align-items:center;padding:0;transition:background .1s,color .1s,opacity .12s;display:inline-flex}.landing__card:hover .landing__card-remove,.landing__card:focus-within .landing__card-remove{opacity:1}.landing__card-remove svg{width:14px;height:14px}.landing__card-remove:hover:not(:disabled){background:var(--color-danger-bg);color:var(--color-danger)}.landing__card-remove:disabled{opacity:.4;cursor:not-allowed}.landing__footer{justify-content:center;align-items:center;gap:var(--space-5);padding:var(--space-4) var(--space-6) var(--space-5);border-top:1px solid var(--color-border);z-index:1;display:flex;position:relative}.landing__footer-link{color:var(--color-text-muted);letter-spacing:.01em;align-items:center;gap:6px;font-size:12px;font-weight:500;text-decoration:none;transition:color .12s;display:inline-flex}.landing__footer-link:hover{color:var(--color-accent)}.landing__footer-link svg{width:14px;height:14px}.landing__footer-version{font-family:var(--font-mono);color:var(--color-text-subtle);letter-spacing:.04em;font-size:11px}@media (width<=720px){.landing__topbar{gap:var(--space-3);padding:var(--space-4);flex-direction:column}.landing__topbar-actions{flex-wrap:wrap;justify-content:center}.landing__search{width:100%}.landing__main{padding:var(--space-5) var(--space-4)}}.landing__empty{border:1px dashed var(--color-border-strong);border-radius:var(--radius-lg);padding:var(--space-6);text-align:center;background:var(--color-surface)}.landing__empty-title{color:var(--color-text);margin:0 0 var(--space-2);font-size:14px;font-weight:600}.session-list{gap:var(--space-2);flex-direction:column;margin:0;padding:0;list-style:none;display:flex}.session-list__item{gap:var(--space-2);padding:var(--space-3) var(--space-4);border:1px solid var(--color-border);border-radius:var(--radius-lg);background:var(--color-bg);flex-direction:column;transition:border-color .1s,box-shadow .1s;display:flex}.session-list__item:hover{border-color:var(--color-border-strong);box-shadow:var(--shadow-md)}.session-list__head{justify-content:space-between;align-items:flex-start;gap:var(--space-2);display:flex}.session-list__headline{min-width:0;color:var(--color-text);word-break:break-word;flex:1 1 0;font-size:13px;font-weight:500}.session-list__id{font-family:var(--font-mono);color:var(--color-text-subtle);word-break:break-all;font-size:11px}.session-list__meta{align-items:baseline;gap:0 var(--space-1);flex-wrap:wrap;font-size:12px;display:flex}.session-list__sep{color:var(--color-text-muted,var(--color-text-subtle));opacity:.5}.session-list__actions{align-items:center;gap:var(--space-1);flex-shrink:0;display:flex}.session-list__activity{text-overflow:ellipsis;white-space:nowrap;font-size:12px;overflow:hidden}.resume-split{align-items:stretch;display:inline-flex;position:relative}.resume-split__main{border-top-right-radius:0;border-bottom-right-radius:0}.resume-split__chevron{padding-left:var(--space-2);padding-right:var(--space-2);border-left:1px solid #ffffff2e;border-top-left-radius:0;border-bottom-left-radius:0}.resume-split__chevron svg{width:14px;height:14px}.resume-split__menu{z-index:10;background:var(--color-bg);border:1px solid var(--color-border-strong);border-radius:var(--radius-md);min-width:220px;box-shadow:var(--shadow-md);padding:var(--space-1);flex-direction:column;gap:2px;display:flex;position:absolute;top:calc(100% + 4px);right:0}.resume-split__menu-item{align-items:flex-start;gap:var(--space-2);padding:var(--space-2);border-radius:var(--radius-sm);color:var(--color-text);cursor:pointer;text-align:left;background:0 0;border:0;font-family:inherit;transition:background .1s;display:flex}.resume-split__menu-item:hover{background:var(--color-surface-hover)}.resume-split__menu-item--active{background:var(--color-surface)}.resume-split__menu-item svg{flex-shrink:0;width:16px;height:16px;margin-top:2px}.resume-split__menu-text{flex-direction:column;gap:1px;display:flex}.resume-split__menu-title{font-size:13px;font-weight:500}.resume-split__menu-hint{color:var(--color-text-subtle);font-size:11px}.task-list{margin:0;padding:0;list-style:none}.task-list__item{border-bottom:1px solid var(--color-border);grid-template-columns:minmax(0,1fr) auto;align-items:start;transition:background .12s;display:grid}.task-list__item:last-child{border-bottom:0}.task-list__item:hover{background:var(--color-surface-hover)}.task-list__item--selected{background:var(--color-surface-hover);box-shadow:inset 3px 0 0 var(--color-accent,#3b82f6)}.task-list__item-select{gap:var(--space-1);width:100%;padding:var(--space-3) var(--space-2) var(--space-3) var(--space-4);color:inherit;font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;flex-direction:column;margin:0;display:flex}.task-list__item-select:focus-visible{outline:2px solid var(--color-accent,#3b82f6);outline-offset:-2px}.task-list__item-head{align-items:flex-start;gap:var(--space-2);display:flex}.task-list__item-meta{align-items:baseline;gap:0 var(--space-1);flex-wrap:wrap;font-size:12px;display:flex}.task-list__id{font-family:var(--font-mono);color:var(--color-text-subtle);word-break:break-all;font-size:11px;display:block}.task-list__item-headline{color:var(--color-text);-webkit-line-clamp:2;word-break:break-word;-webkit-box-orient:vertical;font-size:13px;font-weight:500;display:-webkit-box;overflow:hidden}.task-list__sep{color:var(--color-text-muted,var(--color-text-subtle));opacity:.5}.badge--with-dot{align-items:center;gap:6px;display:inline-flex}.badge__dot{background:currentColor;border-radius:50%;width:6px;height:6px}.badge__dot--pulse{animation:1.4s ease-in-out infinite badge-pulse}@keyframes badge-pulse{0%,to{opacity:.4;transform:scale(.85)}50%{opacity:1;transform:scale(1.15)}}.task-list__item--running .task-list__item-headline{color:var(--color-text)}.tasks-pane{gap:var(--space-3);grid-template-columns:minmax(280px,380px) minmax(0,1fr);align-items:stretch;min-height:0;display:grid}.tasks-pane__list{border:1px solid var(--color-border);border-radius:var(--radius-md);flex-direction:column;height:100%;min-height:0;display:flex;overflow:hidden}.tasks-pane__list-scroll{flex:auto;min-height:0;overflow-y:auto}.tasks-pane__detail{gap:var(--space-3);padding:var(--space-4);border:1px solid var(--color-border);border-radius:var(--radius-md);background:var(--color-bg);flex-direction:column;min-width:0;height:100%;min-height:240px;display:flex;overflow:hidden}.tasks-pane__detail--empty{justify-content:center;align-items:center;min-height:240px}.tasks-pane--zero{grid-template-columns:minmax(0,1fr)}.tasks-pane__zero{justify-content:center;align-items:center;gap:var(--space-3);width:100%;min-height:240px;padding:var(--space-7) var(--space-4);border:1px dashed var(--color-border);border-radius:var(--radius-md);text-align:center;flex-direction:column;grid-column:1/-1;display:flex}.tasks-pane__zero .empty__title{margin:0}.tasks-pane__zero .empty__hint{max-width:480px}@media (width<=1024px){.tasks-pane{grid-template-columns:minmax(0,1fr)}}.task-detail__head{gap:var(--space-2);padding-bottom:var(--space-3);border-bottom:1px solid var(--color-border);flex-direction:column;display:flex}.task-detail__title{color:var(--color-text);word-break:break-word;margin:0;font-size:1.05rem;font-weight:600;line-height:1.3}.task-detail__statbar{gap:var(--space-1) var(--space-3);color:var(--color-text);flex-wrap:wrap;font-size:12px;display:flex}.task-detail__statbar-key{color:var(--color-text-subtle);margin-right:2px;font-weight:500}.task-detail__body{flex:1;min-height:200px;overflow:auto}.activity-list{gap:var(--space-3);flex-direction:column;margin:0;padding:0;list-style:none;display:flex}.activity-row{gap:var(--space-1);padding:var(--space-2) var(--space-3);border-radius:var(--radius-sm);background:var(--color-surface);flex-direction:column;min-width:0;display:flex}.activity-row--user{background:#2563eb0a}.activity-row--summary{background:var(--color-surface-hover)}.activity-row__head{align-items:baseline;gap:var(--space-2);display:flex}.activity-row__role{text-transform:uppercase;letter-spacing:.04em;border-radius:var(--radius-sm);padding:1px 6px;font-size:11px;font-weight:600}.activity-row__role--user{color:var(--color-accent);background:#2563eb1a}.activity-row__role--assistant{color:var(--color-success);background:#15803d1a}.activity-row__role--summary{color:var(--color-text-subtle);background:var(--color-surface-hover)}.activity-row__time{color:var(--color-text-subtle);font-size:11px}.activity-row__body{color:var(--color-text);white-space:pre-wrap;word-break:break-word;overflow-wrap:anywhere;min-width:0;margin:0;font-size:13px;line-height:1.5}.activity-row__pre{font-family:var(--font-mono);color:var(--color-text);background:var(--color-surface-hover);padding:var(--space-2);border-radius:var(--radius-sm);white-space:pre-wrap;word-break:break-all;overflow-wrap:anywhere;min-width:0;max-height:240px;margin:0;font-size:11px;line-height:1.45;overflow-y:auto}.activity-row__tool{font-family:var(--font-mono);border-radius:var(--radius-sm);background:var(--color-surface-hover);color:var(--color-text-subtle);padding:1px 6px;font-size:11px}.activity-row__summary-grid{color:var(--color-text);flex-direction:column;gap:2px;font-size:12px;display:flex}.resolve-tree{gap:var(--space-3);margin-top:var(--space-3);flex-direction:column;display:flex}.resolve-tree__summary{flex-wrap:wrap;align-items:center;gap:8px;font-size:12px;display:flex}.resolve-tree__count{color:var(--color-text-muted);background:#0000000d;border-radius:999px;align-items:center;padding:2px 8px;font-weight:500;display:inline-flex}.resolve-tree__count--new{background:var(--color-accent-bg);color:var(--color-accent)}.resolve-tree__count--existing{color:var(--color-text-muted);background:#0000000d}.resolve-tree__count--sync{color:#92400e;background:#fef3c7}.resolve-tree__count--problem{background:var(--color-danger-bg);color:var(--color-danger)}.resolve-tree__list{flex-direction:column;gap:4px;margin:0;padding:0;list-style:none;display:flex}.resolve-tree__item{margin:0}.resolve-tree__row{align-items:flex-start;gap:var(--space-3);padding:var(--space-2) var(--space-3);background:var(--color-bg);border:1px solid var(--color-border);border-radius:var(--radius-md);display:flex}.resolve-tree__row--root{border-color:var(--color-accent);box-shadow:0 0 0 1px var(--color-accent-bg)}.resolve-tree__row--problem{border-color:var(--color-danger);background:var(--color-danger-bg)}.resolve-tree__kind{background:#0000000a;border-radius:6px;flex-shrink:0;justify-content:center;align-items:center;width:28px;height:28px;font-size:14px;line-height:1;display:inline-flex}.resolve-tree__kind[data-kind=agent]{background:#ede9fe}.resolve-tree__kind[data-kind=skill]{background:#dbeafe}.resolve-tree__kind[data-kind=mcp]{background:#fef3c7}.resolve-tree__main{flex-direction:column;flex:1;gap:4px;min-width:0;display:flex}.resolve-tree__line{flex-wrap:wrap;align-items:center;gap:8px;font-size:13px;display:flex}.resolve-tree__fqn{font-family:var(--font-mono,ui-monospace, SFMono-Regular, monospace);color:var(--color-text);word-break:break-all;background:#0000000a;border-radius:4px;max-width:100%;padding:2px 8px;font-size:12px}.resolve-tree__root-tag{text-transform:uppercase;letter-spacing:.04em;color:var(--color-accent);background:var(--color-accent-bg);border-radius:3px;padding:2px 6px;font-size:10px;font-weight:600}.resolve-tree__status{white-space:nowrap;border-radius:999px;margin-left:auto;padding:2px 8px;font-size:11px;font-weight:500}.resolve-tree__status--new{background:var(--color-accent-bg);color:var(--color-accent)}.resolve-tree__status--already-installed{color:var(--color-text-muted);background:#0000000d}.resolve-tree__status--will-sync{color:#92400e;background:#fef3c7}.resolve-tree__status--would-conflict,.resolve-tree__status--fetch-failed,.resolve-tree__status--parse-failed{background:var(--color-danger);color:#fff}.resolve-tree__error{color:var(--color-danger);align-items:flex-start;gap:6px;font-size:12px;line-height:1.45;display:flex}.resolve-tree__error-icon{flex-shrink:0}.resolve-tree__error-msg{word-break:break-word;font-family:var(--font-mono,ui-monospace, SFMono-Regular, monospace);font-size:11px}.task-list__item-menu{padding:var(--space-3) var(--space-4) var(--space-3) 0;display:inline-flex;position:relative}.task-list__item-menu-trigger{padding:4px}.task-list__item-menu-panel{z-index:40;min-width:160px;padding:var(--space-2);background:var(--color-bg);border:1px solid var(--color-border);border-radius:var(--radius-md);box-shadow:var(--shadow-md);max-height:var(--menu-max-height,none);transform-origin:100% 0;flex-direction:column;gap:2px;display:flex;position:absolute;right:0;overflow-y:auto}.task-list__item-menu-panel--below{transform-origin:100% 0;top:calc(100% + 4px);bottom:auto}.task-list__item-menu-panel--above{transform-origin:100% 100%;top:auto;bottom:calc(100% + 4px)}.task-list__item-menu-option{align-items:center;gap:var(--space-2);padding:var(--space-2);border-radius:var(--radius-sm);color:var(--color-text);font:inherit;cursor:pointer;text-align:left;background:0 0;border:0;font-size:13px;display:flex}.task-list__item-menu-option:hover{background:var(--color-surface-hover)}.task-list__item-menu-option:disabled,.task-list__item-menu-option[aria-disabled=true]{opacity:.6;cursor:not-allowed}.task-list__item-menu-option--danger{color:var(--color-danger,#c0392b)}.task-list__item-menu-option--danger:hover{background:var(--color-danger-bg,#c0392b14)}.task-list__item--paused .task-list__item-headline,.task-list__item--paused .task-list__item-meta{color:var(--color-text-muted)}.task-filters{gap:var(--space-2);padding:var(--space-2) var(--space-3);border-bottom:1px solid var(--color-border);background:var(--color-bg);flex-direction:column;flex:none;display:flex}.task-filters__row{align-items:center;gap:var(--space-2);flex-wrap:wrap;display:flex}.task-filters__row--compact{gap:var(--space-2)}.task-filters__search-wrap{flex:200px;align-items:center;min-width:200px;display:flex;position:relative}.task-filters__search-icon{color:var(--color-text-subtle);pointer-events:none;position:absolute;top:50%;left:10px;transform:translateY(-50%)}.task-filters__search{box-sizing:border-box;width:100%;height:32px;padding-top:4px;padding-bottom:4px;padding-left:30px;font-size:12px;line-height:1.2}.task-filters__select{flex:0 auto;min-width:92px;height:30px;padding-top:2px;padding-bottom:2px;font-size:12px}.task-filters__pills{flex:0 auto}.task-list-groups{gap:var(--space-3);padding:var(--space-2);flex-direction:column;display:flex}.task-list-group{gap:var(--space-1);flex-direction:column;display:flex}.task-list-group__header{align-items:center;gap:var(--space-2);padding:var(--space-2) var(--space-2);cursor:pointer;font:inherit;color:var(--color-text-muted);text-align:left;border-radius:var(--radius-sm);background:0 0;border:0;display:flex}.task-list-group__header:hover{background:var(--color-surface-hover)}.task-list-group__caret{width:12px;color:var(--color-text-subtle);font-size:10px;transition:transform .12s;display:inline-block}.task-list-group__label{text-transform:uppercase;letter-spacing:.05em;font-size:11px;font-weight:700}.task-list-group__count{color:var(--color-text-subtle);background:var(--color-surface);padding:0 var(--space-2);border:1px solid var(--color-border);border-radius:999px;margin-left:auto;font-size:11px}.task-list-group--empty .task-list-group__header{opacity:.55;cursor:default}.task-list-group--empty .task-list-group__header:hover{background:0 0}.task-detail__title-row{justify-content:space-between;align-items:flex-start;gap:var(--space-3);padding:0 0 var(--space-2);flex-wrap:wrap;display:flex}.task-detail__title-row>.task-detail__title{flex:auto;min-width:0}.task-detail__title-actions{align-items:center;gap:var(--space-2);flex-shrink:0;display:flex}.fire-task-nav{align-items:center;gap:var(--space-1);border:1px solid var(--color-border);border-radius:var(--radius-md);background:var(--color-surface);flex-wrap:nowrap;padding:2px 4px;font-size:.85rem;line-height:1;display:inline-flex}.fire-task-nav--fallback{gap:var(--space-2);padding:var(--space-2) var(--space-3);border:0;border-bottom:1px solid var(--color-border);background:0 0;border-radius:0;flex:none;display:flex}.fire-task-nav__back{border-radius:var(--radius-sm);max-width:180px;color:var(--color-text);font:inherit;cursor:pointer;background:0 0;border:0;align-items:center;gap:2px;padding:4px 8px;display:inline-flex}.fire-task-nav__back:hover{background:var(--color-surface-hover)}.fire-task-nav__back-label{text-overflow:ellipsis;white-space:nowrap;max-width:140px;overflow:hidden}.fire-task-nav__sep{background:var(--color-border);width:1px;height:16px;margin:0 2px}.fire-task-nav__step{border-radius:var(--radius-sm);min-width:22px;height:22px;color:var(--color-text);font:inherit;cursor:pointer;background:0 0;border:0;justify-content:center;align-items:center;padding:0;display:inline-flex}.fire-task-nav__step:hover:not(:disabled){background:var(--color-surface-hover)}.fire-task-nav__step:disabled{color:var(--color-text-subtle);cursor:not-allowed;opacity:.5}.fire-task-nav__pos{font-variant-numeric:tabular-nums;color:var(--color-text-subtle);text-align:center;white-space:nowrap;min-width:36px;padding:0 4px}.task-detail__meta-row{gap:var(--space-2);padding:0 0 var(--space-3);flex-wrap:wrap;display:flex}.task-detail__meta-chip{align-items:center;gap:var(--space-1);padding:2px var(--space-2);color:var(--color-text-muted);background:var(--color-surface);border:1px solid var(--color-border);border-radius:999px;font-size:12px;display:inline-flex}.task-detail__statbar-id{color:var(--color-text-subtle);align-items:center;gap:6px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;display:inline-flex}.task-detail__statbar-id>code{font:inherit;color:inherit}.task-tabs{gap:var(--space-1);padding:0 var(--space-4);border-bottom:1px solid var(--color-border);display:flex}.task-tabs__btn{padding:var(--space-2) var(--space-3);font:inherit;color:var(--color-text-muted);cursor:pointer;background:0 0;border:0;border-bottom:2px solid #0000;font-size:13px}.task-tabs__btn:hover{color:var(--color-text)}.task-tabs__btn--active{color:var(--color-accent);border-bottom-color:var(--color-accent)}.overview-tab{gap:var(--space-3);padding:var(--space-4);flex-direction:column;flex:auto;min-height:0;display:flex}.task-details{background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-md);padding:var(--space-3)}.task-details__copy{border-radius:var(--radius-sm);cursor:pointer;color:var(--color-text-subtle);background:0 0;border:0;justify-content:center;align-items:center;padding:2px;font-size:11px;line-height:0;display:inline-flex}.task-details__copy:hover{background:var(--color-surface-hover);color:var(--color-text)}.task-details__copy-wrap{align-items:center;display:inline-flex}.artifacts-pane{gap:var(--space-3);flex-direction:column;height:100%;min-height:0;display:flex}.artifacts-pane__header{align-items:center;gap:var(--space-3);flex:none;display:flex}.artifacts-pane__selector-label{flex:auto;min-width:0}.artifacts-pane__selector{background:var(--color-surface);width:100%;color:var(--color-text);border:1px solid var(--color-border);border-radius:var(--radius-sm,4px);font:inherit;cursor:pointer;padding:6px 10px}.artifacts-pane__selector:focus-visible{outline:2px solid var(--color-accent,var(--color-text));outline-offset:1px}.artifacts-pane__download{color:var(--color-text-subtle);border:1px solid var(--color-border);border-radius:var(--radius-sm,4px);background:var(--color-surface);flex:none;padding:6px 12px;font-size:12px;text-decoration:none}.artifacts-pane__download:hover{color:var(--color-text)}.artifacts-pane__download--disabled{opacity:.5;cursor:not-allowed;pointer-events:none}.artifacts-pane__preview{border:1px solid var(--color-border);border-radius:var(--radius-md);background:var(--color-surface);min-height:0;padding:var(--space-3);flex-direction:column;flex:auto;display:flex;overflow:auto}.artifacts-pane__preview>*{flex:auto;min-height:0}.artifact-viewer{color:var(--color-text);min-height:60px;font-size:13px}.artifact-viewer--empty,.artifact-viewer--error{padding:var(--space-6,24px);color:var(--color-text-subtle);justify-content:center;align-items:center;gap:var(--space-2);display:flex}.artifact-viewer--error{color:var(--color-danger,#c92a2a)}.artifact-viewer__spinner{border:2px solid var(--color-border);border-top-color:var(--color-text);border-radius:50%;width:12px;height:12px;animation:.8s linear infinite artifact-spinner;display:inline-block}@keyframes artifact-spinner{to{transform:rotate(360deg)}}.artifact-viewer--code,.artifact-viewer--text{padding:var(--space-3);background:var(--color-surface-elevated,var(--color-surface));border-radius:var(--radius-sm,4px);font-family:var(--font-mono,ui-monospace, SFMono-Regular, monospace);white-space:pre-wrap;word-break:break-word;margin:0;font-size:12px;line-height:1.5;overflow:auto}.artifact-viewer--code code{font:inherit;background:0 0;padding:0}.artifact-viewer--html{flex-direction:column;height:100%;min-height:0;padding:0;display:flex}.artifact-viewer__html-controls{justify-content:space-between;align-items:center;row-gap:var(--space-1);gap:var(--space-2);border-bottom:1px solid var(--color-border);background:var(--color-surface-elevated,var(--color-surface));color:var(--color-text-muted);flex-wrap:wrap;flex:none;padding:4px 8px;font-size:12px;display:flex}.artifact-viewer__html-status{font-variant-numeric:tabular-nums}.artifact-viewer__html-status[data-scripts=on]{color:var(--color-accent,var(--color-text));font-weight:600}.artifact-viewer__html-toggle{cursor:pointer;color:var(--color-text);-webkit-user-select:none;user-select:none;align-items:center;gap:6px;display:inline-flex}.artifact-viewer__html-toggle input{cursor:pointer;margin:0}.artifact-viewer__html-toggle input:focus-visible{outline:2px solid var(--color-accent,var(--color-text));outline-offset:2px}.artifact-viewer__iframe{border-radius:var(--radius-sm,4px);background:#fff;border:0;flex:auto;width:100%;height:100%;min-height:0}.artifact-viewer--image{padding:var(--space-2);justify-content:center;align-items:center;display:flex}.artifact-viewer__img{object-fit:contain;max-width:100%;height:auto;max-height:100%}.artifact-viewer--binary{gap:var(--space-2);padding:var(--space-4);text-align:center;flex-direction:column;align-items:center;display:flex}.artifact-viewer__download{border:1px solid var(--color-border);border-radius:var(--radius-sm,4px);color:var(--color-text);padding:6px 12px;text-decoration:none;display:inline-block}.artifact-viewer__download:hover{background:var(--color-surface-elevated,var(--color-surface))}.task-list__item-headline--clamp{-webkit-line-clamp:2;word-break:break-word;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.task-list__id--muted{color:var(--color-text-subtle);text-align:right;text-overflow:ellipsis;white-space:nowrap;align-self:flex-end;max-width:100%;margin-left:auto;font-size:10px;overflow:hidden}.overview-tab__failure-callout{gap:var(--space-2);flex-direction:column;flex:none;margin:0;display:flex}.overview-tab__strip{flex:none;margin:0}.overview-tab__failure-head{align-items:center;gap:var(--space-2);font-size:13px;display:flex}.overview-tab__failure-chip{border-radius:var(--radius-sm);background:#0000000f;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px}.overview-tab__failure-message{word-break:break-word;margin:0;font-size:13px;line-height:1.5}.overview-tab__failure-meta{margin:0;font-size:12px}.overview-tab__failure-actions{gap:var(--space-3);flex-wrap:wrap;display:flex}.overview-card{background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-md);flex-direction:column;flex:1 1 0;min-height:200px;display:flex;overflow:hidden}.overview-card__head{padding:var(--space-2) var(--space-3);border-bottom:1px solid var(--color-border);background:var(--color-bg);flex:none}.overview-card__title{text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-subtle);margin:0;font-size:11px}.overview-card__body{min-height:0;padding:var(--space-3);flex:auto;overflow:auto}.overview-card__pre{white-space:pre-wrap;word-break:break-word;margin:0;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;line-height:1.5}.overview-tab__no-details{margin:0;font-size:13px}.overview-tab__running-hint{font-size:13px;line-height:1.5}.link-button{font:inherit;color:var(--color-accent);cursor:pointer;background:0 0;border:0;margin:0;padding:0;text-decoration:underline}.link-button:hover{text-decoration:none}.md{color:var(--color-text);font-size:14px;line-height:1.6}.md h1,.md h2,.md h3{margin:var(--space-4) 0 var(--space-2)}.md h1{font-size:18px}.md h2{font-size:16px}.md h3{text-transform:uppercase;letter-spacing:.04em;color:var(--color-text-muted);font-size:14px}.md p{margin:0 0 var(--space-3)}.md ul,.md ol{margin:0 0 var(--space-3);padding-left:var(--space-5)}.md li{margin-bottom:var(--space-1)}.md a{color:var(--color-accent);text-decoration:underline}.md-code{background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-sm);padding:1px 4px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px}.md pre{margin:0 0 var(--space-3);padding:var(--space-3);background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-md);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;line-height:1.5;overflow-x:auto}.md pre code{background:0 0;border:0;padding:0}@media (width<=768px){.tasks-pane--with-detail{grid-template-columns:1fr}}.tasks-page{flex-direction:column;height:100%;min-height:0;display:flex}.tasks-page>.alert{flex:none}.tasks-page>.tasks-pane{flex:auto;min-height:0}.tasks-pane__detail>.task-detail__head,.tasks-pane__detail>.task-tabs{flex:none}.tasks-pane__detail>.overview-tab,.tasks-pane__detail>.task-detail__body,.tasks-pane__detail>.activity-view,.tasks-pane__detail>.artifacts{flex:auto;min-height:0;overflow:auto}.tasks-pane__detail>.agent-detail__header{flex:none}.tasks-pane__detail>.agent-overview,.tasks-pane__detail>.empty,.tasks-pane__detail>.alert{flex:auto;min-height:0;overflow:auto}.task-details__copy-icon{stroke-width:1.5px;width:12px;height:12px;transform:translateY(1px)}.visually-hidden{clip:rect(0, 0, 0, 0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.overview-tab__no-summary{color:var(--color-text-muted);margin:0;font-size:13px;line-height:1.5}.agent-overview__list{gap:var(--space-1);flex-direction:column;margin:0;padding:0;list-style:none;display:flex}.agent-overview__item{margin:0}.agent-overview__row{align-items:center;gap:var(--space-2);padding:var(--space-2) var(--space-3);border-radius:var(--radius-md);color:inherit;border:1px solid #0000;text-decoration:none;transition:background-color .1s,border-color .1s;display:flex}.agent-overview__row:hover,.agent-overview__row:focus-visible{background:var(--color-bg-subtle,#0000000a);border-color:var(--color-border);outline:none;text-decoration:none}.agent-overview__title{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.agent-overview__meta{flex:none}.session-list__item--preselected{border-color:var(--color-accent,var(--color-border-strong));box-shadow:var(--shadow-md)}.agents-page{flex-direction:column;height:100%;min-height:0;display:flex}.agents-page>.alert{flex:none}.agents-page>.tasks-pane{flex:auto;min-height:0}.agents-list-toolbar{align-items:center;gap:var(--space-3);padding:var(--space-2) var(--space-3);border-bottom:1px solid var(--color-border);background:var(--color-bg);flex-wrap:wrap;flex:none;display:flex}.agents-list-toolbar__search{flex:160px;min-width:160px;max-width:320px;margin-left:auto}.agents-list{flex-direction:column;margin:0;padding:0;list-style:none;display:flex}.agents-list__item{border-bottom:1px solid var(--color-border);margin:0;transition:background-color .1s;position:relative}.agents-list__item:last-child{border-bottom:0}.agents-list__item-select{align-items:center;gap:var(--space-3);width:100%;min-height:64px;padding:var(--space-3) var(--space-4);color:inherit;font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;margin:0;transition:background-color .1s;display:flex}.agents-list__item-select:hover{background:var(--color-surface-hover)}.agents-list__item-select:focus-visible{outline:2px solid var(--color-accent,#3b82f6);outline-offset:-2px}.agents-list__item--selected{background:var(--color-surface-hover);box-shadow:inset 4px 0 0 var(--color-accent,#3b82f6)}.agents-list__item--selected .agent-fqn__short,.agents-list__item--selected .agent-fqn__sep{font-weight:700}.agents-list__item--selected .agent-fqn__scope{font-weight:500}.agents-list__identity{flex-direction:column;flex:auto;gap:2px;min-width:0;display:flex}.agents-list__subline{font-size:12px;line-height:1.3}.agents-list__status-col{align-items:flex-end;gap:var(--space-1);flex-direction:column;flex:none;display:flex}.agents-list__activity{align-items:center;min-height:14px;font-size:12px;display:inline-flex}.skeleton{background:linear-gradient(90deg, var(--color-surface-hover) 0%, var(--color-surface) 50%, var(--color-surface-hover) 100%);border-radius:var(--radius-sm);background-size:200% 100%;animation:1.4s ease-in-out infinite skeleton-shimmer;display:inline-block}.skeleton--text{width:56px;height:10px}@keyframes skeleton-shimmer{0%{background-position:100% 0}to{background-position:-100% 0}}.agent-status-pill{align-items:center;gap:var(--space-1);padding:2px var(--space-2);border:1px solid var(--color-border);background:var(--color-bg);color:var(--color-text-muted);white-space:nowrap;border-radius:999px;font-size:12px;font-weight:500;line-height:1.4;display:inline-flex}.agent-status-pill__dot{background:var(--color-text-subtle);border-radius:50%;flex:none;width:6px;height:6px}.agent-status-pill--running{color:var(--color-success);background:#15803d14;border-color:#15803d59}.agent-status-pill--running .agent-status-pill__dot{background:var(--color-success)}.agent-status-pill--idle{background:var(--color-surface)}.agent-detail__header{gap:var(--space-3);flex-direction:column;display:flex}.agent-detail__title-row{align-items:center;gap:var(--space-3);flex-wrap:wrap;display:flex}.agent-detail__name-block{flex-direction:column;gap:2px;min-width:0;display:flex}.agent-detail__title{color:var(--color-text);margin:0;font-size:24px;font-weight:700;line-height:1.15}.agent-detail__scope{color:var(--color-text-muted);font-size:13px}.agent-detail__version{color:var(--color-text-subtle);font-size:12px;font-family:var(--font-mono,monospace)}.agent-detail__spacer{flex:1}.agent-detail__actions{align-items:center;gap:var(--space-2);flex-wrap:wrap;display:inline-flex}.agent-detail__kpis{gap:var(--space-3);grid-template-columns:repeat(auto-fit,minmax(180px,1fr));display:grid}@media (width<=1024px){.agent-detail__kpis{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (width<=640px){.agent-detail__kpis{grid-template-columns:1fr}}.kpi-tile{gap:var(--space-1);padding:var(--space-3) var(--space-4);background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-md);flex-direction:column;display:flex}.kpi-tile__label{color:var(--color-text-muted);text-transform:uppercase;letter-spacing:.04em;font-size:12px;font-weight:600}.kpi-tile__value{color:var(--color-text);font-size:28px;font-weight:700;line-height:1.1}.kpi-tile__caption{font-size:12px}.agent-overview__more{align-items:center;gap:var(--space-1);margin-top:var(--space-2);padding:var(--space-1) var(--space-2);color:var(--color-accent);border-radius:var(--radius-sm);font-size:13px;font-weight:500;text-decoration:none;transition:background-color .1s,color .1s;display:inline-flex}.agent-overview__more:hover,.agent-overview__more:focus-visible{background:var(--color-accent-bg);color:var(--color-accent-hover);outline:none;text-decoration:none}.agent-overview__heading{margin:0 0 var(--space-2);color:var(--color-text);font-size:14px;font-weight:600}.agent-overview{gap:var(--space-5);flex-direction:column;display:flex}.agent-overview--grid{gap:var(--space-4);grid-template-rows:auto auto;grid-template-columns:1fr 1fr;display:grid}@media (width<=1024px){.agent-overview--grid{grid-template-columns:1fr}}.agent-overview__cell{padding:var(--space-3) var(--space-4);background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-md);flex-direction:column;min-width:0;min-height:140px;display:flex}.agent-overview__cell--wide{grid-column:1/-1}.agent-overview__activity{align-items:center;gap:var(--space-2);min-width:0;margin:0;display:flex}.agent-overview__activity>.agent-overview__title{flex:1 1 0;min-width:0}.agent-overview__activity-dots{align-items:center;gap:2px;display:inline-flex}.agent-overview__activity-dot{background:var(--color-accent);border-radius:50%;width:4px;height:4px;animation:1.2s ease-in-out infinite agent-activity-pulse}.agent-overview__activity-dot:nth-child(2){animation-delay:.2s}.agent-overview__activity-dot:nth-child(3){animation-delay:.4s}@keyframes agent-activity-pulse{0%,80%,to{opacity:.3}40%{opacity:1}}.agent-overview__badge{border-radius:var(--radius-sm);text-transform:uppercase;letter-spacing:.04em;background:var(--color-surface-hover);color:var(--color-text-muted);flex:none;align-items:center;padding:2px 6px;font-size:11px;font-weight:500;display:inline-flex}.agent-overview__badge--running{color:var(--color-accent);background:#2563eb1a}.agent-overview__badge--succeeded{color:var(--color-success);background:#15803d1a}.agent-overview__badge--failed{background:var(--color-danger-bg);color:var(--color-danger)}.agent-overview__badge--cancelled{background:var(--color-surface-hover);color:var(--color-text-muted)}.agent-avatar{letter-spacing:.04em;text-transform:uppercase;-webkit-user-select:none;user-select:none;border-radius:50%;flex:none;justify-content:center;align-items:center;font-weight:700;display:inline-flex}.agent-avatar--sm{font-size:11px}.agent-avatar--md{font-size:14px}.agent-avatar--lg{font-size:18px}.agent-fqn{min-width:0;color:var(--color-text);align-items:baseline;gap:0;line-height:1.3;display:inline-flex}.agent-fqn__scope{color:var(--color-text);min-width:0;font-weight:400}.agent-fqn--truncate-scope .agent-fqn__scope{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.agent-fqn__sep{color:var(--color-text);padding:0 1px;font-weight:600}.agent-fqn__short{color:var(--color-text);white-space:nowrap;font-weight:600}.schedule-cron{font-family:var(--font-mono);background:var(--color-surface-hover);border-radius:var(--radius-sm);color:var(--color-text);letter-spacing:-.01em;padding:1px 6px;font-size:12px}.schedule-detail__head{gap:var(--space-2);flex-direction:column}.schedule-detail__head-row{justify-content:space-between;align-items:flex-start;gap:var(--space-4);flex-wrap:wrap;display:flex}.schedule-detail__head-left{gap:var(--space-2);flex-direction:column;flex:auto;min-width:0;display:flex}.schedule-detail__head-right{text-align:right;flex-direction:column;flex:none;align-items:flex-end;gap:2px;display:flex}.schedule-detail__temporal-line{color:var(--color-text-muted);white-space:nowrap;font-size:12px}.schedule-detail__temporal-line strong{color:var(--color-text);font-weight:500}.task-list__item--button{width:100%;font:inherit;color:inherit;text-align:left;background:0 0;border:0}.task-list__item--row{align-items:center;gap:var(--space-3);padding:var(--space-2) var(--space-3);grid-template-columns:auto auto auto 1fr;display:grid}.task-list__row-clock{font-family:var(--font-mono);color:var(--color-text);white-space:nowrap;font-variant-numeric:tabular-nums;font-size:12px}.task-list__row-duration{color:var(--color-text-muted);white-space:nowrap;font-variant-numeric:tabular-nums;min-width:56px;font-size:12px}.task-list__row-id{font-family:var(--font-mono);color:var(--color-text-subtle);text-align:right;white-space:nowrap;text-overflow:ellipsis;min-width:0;font-size:11px;overflow:hidden}.workflow-dag{padding:var(--space-3) var(--space-2);display:block;position:relative;overflow:auto}.workflow-dag--empty{padding:var(--space-4);display:block}.workflow-dag__edges{pointer-events:none;z-index:0;position:absolute;top:0;left:0;overflow:visible}.workflow-dag__edge{stroke:var(--color-border-strong);stroke-width:1.5px;fill:none}.workflow-dag__arrow-head{fill:var(--color-border-strong);stroke:none}.workflow-dag__phases{z-index:1;gap:var(--space-4);flex-direction:column;margin:0;padding:0;list-style:none;display:flex;position:relative}.workflow-dag__phase{gap:var(--space-2);flex-direction:column;margin:0;list-style:none;display:flex}.workflow-dag__phase-label{text-transform:uppercase;letter-spacing:.04em;font-size:11px}.workflow-dag__phase-row{gap:var(--space-3);flex-flow:wrap;justify-content:center;display:flex}.dag-node{align-items:center;column-gap:var(--space-2);min-width:200px;padding:var(--space-2) var(--space-3);background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-md);font:inherit;color:inherit;text-align:left;cursor:pointer;border-left-width:3px;grid-template-rows:auto auto;grid-template-columns:auto auto 1fr;row-gap:2px;display:grid}.dag-node[aria-disabled=true]{cursor:help}.dag-node:focus-visible{outline:2px solid var(--color-accent);outline-offset:2px}.dag-node--selected,.dag-node[aria-current=true]{outline:2px solid var(--color-accent);outline-offset:1px}.dag-node__kind-icon{font-size:14px;line-height:1}.dag-node__id{font-family:var(--font-mono);color:var(--color-text-muted);font-size:11px}.dag-node__agent{color:var(--color-text-muted);white-space:nowrap;text-overflow:ellipsis;grid-column:1/-1;font-size:12px;overflow:hidden}.dag-node__brief{color:var(--color-text);-webkit-line-clamp:2;word-break:break-word;-webkit-box-orient:vertical;grid-column:1/-1;font-size:13px;font-weight:500;display:-webkit-box;overflow:hidden}.dag-node__timing{color:var(--color-text-meta);gap:0 var(--space-1);flex-wrap:wrap;grid-column:1/-1;font-size:11px;display:flex}.dag-node__status{text-transform:uppercase;letter-spacing:.04em;justify-self:end;font-size:10px}.dag-node--coordinator{border-left-color:var(--color-accent)}.dag-node--worker{border-left-color:var(--color-border-strong)}.dag-node--running{background:var(--color-accent-bg)}.dag-node--succeeded{background:var(--color-success-bg)}.dag-node--failed{background:var(--color-danger-bg);border-color:var(--color-danger)}.dag-node--cancelled{background:var(--color-warn-bg)}.dag-node__status--running{color:var(--color-accent)}.dag-node__status--succeeded{color:var(--color-success)}.dag-node__status--failed{color:var(--color-danger)}.dag-node__status--cancelled{color:var(--color-warn)}.dag-node__status--ready{color:var(--color-text-muted)}.workflow-detail__title{white-space:nowrap;text-overflow:ellipsis;flex:auto;min-width:0;margin:0;font-size:16px;font-weight:600;overflow:hidden}.workflow-tabpanel{padding:var(--space-3) 0}.workflow-tabpanel:focus-visible{outline:2px solid var(--color-accent);outline-offset:2px}.workflow-overview__metadata{gap:var(--space-1);flex-direction:column;margin:0;display:flex}.workflow-overview__meta-row{gap:var(--space-2);grid-template-columns:140px 1fr;font-size:13px;display:grid}.workflow-overview__meta-row dt{color:var(--color-text-muted);margin:0}.workflow-overview__meta-row dd{font-family:var(--font-mono);word-break:break-word;margin:0;font-size:12px}.workflow-graph{display:block}.workflow-node-nav{align-items:center;gap:var(--space-1);padding:2px var(--space-2);background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-md);font-size:12px;display:inline-flex}.workflow-node-nav--fallback{padding:var(--space-2);background:0 0;border-top:0;border-left:0;border-right:0;border-radius:0;display:flex}.workflow-node-nav__back,.workflow-node-nav__step{appearance:none;font:inherit;color:var(--color-text);cursor:pointer;padding:2px var(--space-1);border-radius:var(--radius-sm);background:0 0;border:0}.workflow-node-nav__back:hover,.workflow-node-nav__step:hover{background:var(--color-surface-hover)}.workflow-node-nav__step[disabled]{color:var(--color-text-subtle);cursor:not-allowed}.workflow-node-nav__sep{background:var(--color-border);width:1px;height:14px}.workflow-node-nav__pos{font-variant-numeric:tabular-nums;color:var(--color-text-muted);text-align:center;min-width:32px;font-size:11px}.workflow-list-skeleton{width:100%;display:block}.workflow-list-skeleton__list{margin:0;padding:0;list-style:none}.workflow-list-skeleton__row,.workflow-list-skeleton__row:hover{background:0 0}.workflow-list-skeleton__cell{cursor:default}.workflow-list-skeleton__head{align-items:center;gap:var(--space-2);display:flex}.workflow-list-skeleton__badge{border-radius:999px;width:64px;height:14px}.workflow-list-skeleton__headline{width:80%;height:13px}.workflow-list-skeleton__meta{width:55%;height:11px}.workflow-list-skeleton__id{width:40%;height:10px}.workflow-detail-skeleton{flex-direction:column;min-height:0;display:flex}.workflow-detail-skeleton__inner{flex-direction:column;width:100%;display:flex}.workflow-detail-skeleton__head{gap:var(--space-2);flex-direction:column;display:flex}.workflow-detail-skeleton__title{width:60%;height:18px}.workflow-detail-skeleton__meta-row{gap:var(--space-2);display:flex}.workflow-detail-skeleton__chip{border-radius:999px;width:72px;height:18px}.workflow-detail-skeleton__chip--wide{width:140px}.workflow-detail-skeleton__statbar{gap:var(--space-3);flex-wrap:wrap;display:flex}.workflow-detail-skeleton__stat{width:96px;height:12px}.workflow-detail-skeleton__tabs{gap:var(--space-2);padding:var(--space-2) 0;display:flex}.workflow-detail-skeleton__tab{width:72px;height:16px}.workflow-detail-skeleton__body{gap:var(--space-2);padding:var(--space-3) 0;flex-direction:column;display:flex}.workflow-detail-skeleton__line{height:12px}.workflow-detail-skeleton__line--long{width:92%}.workflow-detail-skeleton__line--med{width:70%}.workflow-detail-skeleton__line--short{width:48%}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
+
<title>Glyph Dashboard</title>
|
|
7
|
+
<script type="module" crossorigin src="/assets/index-C38eId2v.js"></script>
|
|
8
|
+
<link rel="stylesheet" crossorigin href="/assets/index-mJln7r2H.css">
|
|
9
|
+
</head>
|
|
10
|
+
<body>
|
|
11
|
+
<div id="root"></div>
|
|
12
|
+
</body>
|
|
13
|
+
</html>
|
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
/* eslint-disable */
|
|
2
|
+
/* tslint:disable */
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Mock Service Worker.
|
|
6
|
+
* @see https://github.com/mswjs/msw
|
|
7
|
+
* - Please do NOT modify this file.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
const PACKAGE_VERSION = '2.14.6'
|
|
11
|
+
const INTEGRITY_CHECKSUM = '4db4a41e972cec1b64cc569c66952d82'
|
|
12
|
+
const IS_MOCKED_RESPONSE = Symbol('isMockedResponse')
|
|
13
|
+
const activeClientIds = new Set()
|
|
14
|
+
|
|
15
|
+
addEventListener('install', function () {
|
|
16
|
+
self.skipWaiting()
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
addEventListener('activate', function (event) {
|
|
20
|
+
event.waitUntil(self.clients.claim())
|
|
21
|
+
})
|
|
22
|
+
|
|
23
|
+
addEventListener('message', async function (event) {
|
|
24
|
+
const clientId = Reflect.get(event.source || {}, 'id')
|
|
25
|
+
|
|
26
|
+
if (!clientId || !self.clients) {
|
|
27
|
+
return
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const client = await self.clients.get(clientId)
|
|
31
|
+
|
|
32
|
+
if (!client) {
|
|
33
|
+
return
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const allClients = await self.clients.matchAll({
|
|
37
|
+
type: 'window',
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
switch (event.data) {
|
|
41
|
+
case 'KEEPALIVE_REQUEST': {
|
|
42
|
+
sendToClient(client, {
|
|
43
|
+
type: 'KEEPALIVE_RESPONSE',
|
|
44
|
+
})
|
|
45
|
+
break
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
case 'INTEGRITY_CHECK_REQUEST': {
|
|
49
|
+
sendToClient(client, {
|
|
50
|
+
type: 'INTEGRITY_CHECK_RESPONSE',
|
|
51
|
+
payload: {
|
|
52
|
+
packageVersion: PACKAGE_VERSION,
|
|
53
|
+
checksum: INTEGRITY_CHECKSUM,
|
|
54
|
+
},
|
|
55
|
+
})
|
|
56
|
+
break
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
case 'MOCK_ACTIVATE': {
|
|
60
|
+
activeClientIds.add(clientId)
|
|
61
|
+
|
|
62
|
+
sendToClient(client, {
|
|
63
|
+
type: 'MOCKING_ENABLED',
|
|
64
|
+
payload: {
|
|
65
|
+
client: {
|
|
66
|
+
id: client.id,
|
|
67
|
+
frameType: client.frameType,
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
})
|
|
71
|
+
break
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
case 'CLIENT_CLOSED': {
|
|
75
|
+
activeClientIds.delete(clientId)
|
|
76
|
+
|
|
77
|
+
const remainingClients = allClients.filter((client) => {
|
|
78
|
+
return client.id !== clientId
|
|
79
|
+
})
|
|
80
|
+
|
|
81
|
+
// Unregister itself when there are no more clients
|
|
82
|
+
if (remainingClients.length === 0) {
|
|
83
|
+
self.registration.unregister()
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
break
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
})
|
|
90
|
+
|
|
91
|
+
addEventListener('fetch', function (event) {
|
|
92
|
+
const requestInterceptedAt = Date.now()
|
|
93
|
+
|
|
94
|
+
// Bypass navigation requests.
|
|
95
|
+
if (event.request.mode === 'navigate') {
|
|
96
|
+
return
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Opening the DevTools triggers the "only-if-cached" request
|
|
100
|
+
// that cannot be handled by the worker. Bypass such requests.
|
|
101
|
+
if (
|
|
102
|
+
event.request.cache === 'only-if-cached' &&
|
|
103
|
+
event.request.mode !== 'same-origin'
|
|
104
|
+
) {
|
|
105
|
+
return
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// Bypass all requests when there are no active clients.
|
|
109
|
+
// Prevents the self-unregistered worked from handling requests
|
|
110
|
+
// after it's been terminated (still remains active until the next reload).
|
|
111
|
+
if (activeClientIds.size === 0) {
|
|
112
|
+
return
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
const requestId = crypto.randomUUID()
|
|
116
|
+
event.respondWith(handleRequest(event, requestId, requestInterceptedAt))
|
|
117
|
+
})
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* @param {FetchEvent} event
|
|
121
|
+
* @param {string} requestId
|
|
122
|
+
* @param {number} requestInterceptedAt
|
|
123
|
+
*/
|
|
124
|
+
async function handleRequest(event, requestId, requestInterceptedAt) {
|
|
125
|
+
const client = await resolveMainClient(event)
|
|
126
|
+
const requestCloneForEvents = event.request.clone()
|
|
127
|
+
const response = await getResponse(
|
|
128
|
+
event,
|
|
129
|
+
client,
|
|
130
|
+
requestId,
|
|
131
|
+
requestInterceptedAt,
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
// Send back the response clone for the "response:*" life-cycle events.
|
|
135
|
+
// Ensure MSW is active and ready to handle the message, otherwise
|
|
136
|
+
// this message will pend indefinitely.
|
|
137
|
+
if (client && activeClientIds.has(client.id)) {
|
|
138
|
+
const serializedRequest = await serializeRequest(requestCloneForEvents)
|
|
139
|
+
|
|
140
|
+
// Clone the response so both the client and the library could consume it.
|
|
141
|
+
const responseClone = response.clone()
|
|
142
|
+
|
|
143
|
+
sendToClient(
|
|
144
|
+
client,
|
|
145
|
+
{
|
|
146
|
+
type: 'RESPONSE',
|
|
147
|
+
payload: {
|
|
148
|
+
isMockedResponse: IS_MOCKED_RESPONSE in response,
|
|
149
|
+
request: {
|
|
150
|
+
id: requestId,
|
|
151
|
+
...serializedRequest,
|
|
152
|
+
},
|
|
153
|
+
response: {
|
|
154
|
+
type: responseClone.type,
|
|
155
|
+
status: responseClone.status,
|
|
156
|
+
statusText: responseClone.statusText,
|
|
157
|
+
headers: Object.fromEntries(responseClone.headers.entries()),
|
|
158
|
+
body: responseClone.body,
|
|
159
|
+
},
|
|
160
|
+
},
|
|
161
|
+
},
|
|
162
|
+
responseClone.body ? [serializedRequest.body, responseClone.body] : [],
|
|
163
|
+
)
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
return response
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Resolve the main client for the given event.
|
|
171
|
+
* Client that issues a request doesn't necessarily equal the client
|
|
172
|
+
* that registered the worker. It's with the latter the worker should
|
|
173
|
+
* communicate with during the response resolving phase.
|
|
174
|
+
* @param {FetchEvent} event
|
|
175
|
+
* @returns {Promise<Client | undefined>}
|
|
176
|
+
*/
|
|
177
|
+
async function resolveMainClient(event) {
|
|
178
|
+
const client = await self.clients.get(event.clientId)
|
|
179
|
+
|
|
180
|
+
if (activeClientIds.has(event.clientId)) {
|
|
181
|
+
return client
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
if (client?.frameType === 'top-level') {
|
|
185
|
+
return client
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
const allClients = await self.clients.matchAll({
|
|
189
|
+
type: 'window',
|
|
190
|
+
})
|
|
191
|
+
|
|
192
|
+
return allClients
|
|
193
|
+
.filter((client) => {
|
|
194
|
+
// Get only those clients that are currently visible.
|
|
195
|
+
return client.visibilityState === 'visible'
|
|
196
|
+
})
|
|
197
|
+
.find((client) => {
|
|
198
|
+
// Find the client ID that's recorded in the
|
|
199
|
+
// set of clients that have registered the worker.
|
|
200
|
+
return activeClientIds.has(client.id)
|
|
201
|
+
})
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* @param {FetchEvent} event
|
|
206
|
+
* @param {Client | undefined} client
|
|
207
|
+
* @param {string} requestId
|
|
208
|
+
* @param {number} requestInterceptedAt
|
|
209
|
+
* @returns {Promise<Response>}
|
|
210
|
+
*/
|
|
211
|
+
async function getResponse(event, client, requestId, requestInterceptedAt) {
|
|
212
|
+
// Clone the request because it might've been already used
|
|
213
|
+
// (i.e. its body has been read and sent to the client).
|
|
214
|
+
const requestClone = event.request.clone()
|
|
215
|
+
|
|
216
|
+
function passthrough() {
|
|
217
|
+
// Cast the request headers to a new Headers instance
|
|
218
|
+
// so the headers can be manipulated with.
|
|
219
|
+
const headers = new Headers(requestClone.headers)
|
|
220
|
+
|
|
221
|
+
// Remove the "accept" header value that marked this request as passthrough.
|
|
222
|
+
// This prevents request alteration and also keeps it compliant with the
|
|
223
|
+
// user-defined CORS policies.
|
|
224
|
+
const acceptHeader = headers.get('accept')
|
|
225
|
+
if (acceptHeader) {
|
|
226
|
+
const values = acceptHeader.split(',').map((value) => value.trim())
|
|
227
|
+
const filteredValues = values.filter(
|
|
228
|
+
(value) => value !== 'msw/passthrough',
|
|
229
|
+
)
|
|
230
|
+
|
|
231
|
+
if (filteredValues.length > 0) {
|
|
232
|
+
headers.set('accept', filteredValues.join(', '))
|
|
233
|
+
} else {
|
|
234
|
+
headers.delete('accept')
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
return fetch(requestClone, { headers })
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
// Bypass mocking when the client is not active.
|
|
242
|
+
if (!client) {
|
|
243
|
+
return passthrough()
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
// Bypass initial page load requests (i.e. static assets).
|
|
247
|
+
// The absence of the immediate/parent client in the map of the active clients
|
|
248
|
+
// means that MSW hasn't dispatched the "MOCK_ACTIVATE" event yet
|
|
249
|
+
// and is not ready to handle requests.
|
|
250
|
+
if (!activeClientIds.has(client.id)) {
|
|
251
|
+
return passthrough()
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
// Notify the client that a request has been intercepted.
|
|
255
|
+
const serializedRequest = await serializeRequest(event.request)
|
|
256
|
+
const clientMessage = await sendToClient(
|
|
257
|
+
client,
|
|
258
|
+
{
|
|
259
|
+
type: 'REQUEST',
|
|
260
|
+
payload: {
|
|
261
|
+
id: requestId,
|
|
262
|
+
interceptedAt: requestInterceptedAt,
|
|
263
|
+
...serializedRequest,
|
|
264
|
+
},
|
|
265
|
+
},
|
|
266
|
+
[serializedRequest.body],
|
|
267
|
+
)
|
|
268
|
+
|
|
269
|
+
switch (clientMessage.type) {
|
|
270
|
+
case 'MOCK_RESPONSE': {
|
|
271
|
+
return respondWithMock(clientMessage.data)
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
case 'PASSTHROUGH': {
|
|
275
|
+
return passthrough()
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
return passthrough()
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* @param {Client} client
|
|
284
|
+
* @param {any} message
|
|
285
|
+
* @param {Array<Transferable>} transferrables
|
|
286
|
+
* @returns {Promise<any>}
|
|
287
|
+
*/
|
|
288
|
+
function sendToClient(client, message, transferrables = []) {
|
|
289
|
+
return new Promise((resolve, reject) => {
|
|
290
|
+
const channel = new MessageChannel()
|
|
291
|
+
|
|
292
|
+
channel.port1.onmessage = (event) => {
|
|
293
|
+
if (event.data && event.data.error) {
|
|
294
|
+
return reject(event.data.error)
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
resolve(event.data)
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
client.postMessage(message, [
|
|
301
|
+
channel.port2,
|
|
302
|
+
...transferrables.filter(Boolean),
|
|
303
|
+
])
|
|
304
|
+
})
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
/**
|
|
308
|
+
* @param {Response} response
|
|
309
|
+
* @returns {Response}
|
|
310
|
+
*/
|
|
311
|
+
function respondWithMock(response) {
|
|
312
|
+
// Setting response status code to 0 is a no-op.
|
|
313
|
+
// However, when responding with a "Response.error()", the produced Response
|
|
314
|
+
// instance will have status code set to 0. Since it's not possible to create
|
|
315
|
+
// a Response instance with status code 0, handle that use-case separately.
|
|
316
|
+
if (response.status === 0) {
|
|
317
|
+
return Response.error()
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
const mockedResponse = new Response(response.body, response)
|
|
321
|
+
|
|
322
|
+
Reflect.defineProperty(mockedResponse, IS_MOCKED_RESPONSE, {
|
|
323
|
+
value: true,
|
|
324
|
+
enumerable: true,
|
|
325
|
+
})
|
|
326
|
+
|
|
327
|
+
return mockedResponse
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
/**
|
|
331
|
+
* @param {Request} request
|
|
332
|
+
*/
|
|
333
|
+
async function serializeRequest(request) {
|
|
334
|
+
return {
|
|
335
|
+
url: request.url,
|
|
336
|
+
mode: request.mode,
|
|
337
|
+
method: request.method,
|
|
338
|
+
headers: Object.fromEntries(request.headers.entries()),
|
|
339
|
+
cache: request.cache,
|
|
340
|
+
credentials: request.credentials,
|
|
341
|
+
destination: request.destination,
|
|
342
|
+
integrity: request.integrity,
|
|
343
|
+
redirect: request.redirect,
|
|
344
|
+
referrer: request.referrer,
|
|
345
|
+
referrerPolicy: request.referrerPolicy,
|
|
346
|
+
body: await request.arrayBuffer(),
|
|
347
|
+
keepalive: request.keepalive,
|
|
348
|
+
}
|
|
349
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@glyphs-ai/glyph",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "glyph — orchestrate agentic systems built on the MetaAgents format spec",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "https://github.com/glyphs-ai/glyph.git"
|
|
9
|
+
},
|
|
10
|
+
"homepage": "https://github.com/glyphs-ai/glyph#readme",
|
|
11
|
+
"bugs": {
|
|
12
|
+
"url": "https://github.com/glyphs-ai/glyph/issues"
|
|
13
|
+
},
|
|
14
|
+
"keywords": [
|
|
15
|
+
"agents",
|
|
16
|
+
"ai",
|
|
17
|
+
"copilot",
|
|
18
|
+
"metaagents",
|
|
19
|
+
"mcp",
|
|
20
|
+
"skills"
|
|
21
|
+
],
|
|
22
|
+
"type": "module",
|
|
23
|
+
"engines": {
|
|
24
|
+
"node": ">=22"
|
|
25
|
+
},
|
|
26
|
+
"packageManager": "pnpm@10.33.4",
|
|
27
|
+
"bin": {
|
|
28
|
+
"glyph": "bundle/glyph.js"
|
|
29
|
+
},
|
|
30
|
+
"files": [
|
|
31
|
+
"bundle/",
|
|
32
|
+
"README.md",
|
|
33
|
+
"LICENSE"
|
|
34
|
+
],
|
|
35
|
+
"scripts": {
|
|
36
|
+
"build": "pnpm -r --filter \"./packages/**\" run build",
|
|
37
|
+
"test": "pnpm -r --filter \"./packages/**\" run test",
|
|
38
|
+
"typecheck": "pnpm -r --filter \"./packages/**\" run typecheck",
|
|
39
|
+
"lint": "biome check .",
|
|
40
|
+
"format": "biome format --write .",
|
|
41
|
+
"dev": "pnpm -r --parallel --filter \"./packages/**\" run dev",
|
|
42
|
+
"bundle": "pnpm build && pnpm --filter @glyphs-ai/dashboard build && node scripts/inline-migrations.mjs && node esbuild.config.js && node scripts/copy-dashboard.mjs",
|
|
43
|
+
"prepublishOnly": "pnpm bundle",
|
|
44
|
+
"new-pkg": "node scripts/new-pkg.mjs",
|
|
45
|
+
"knip": "knip"
|
|
46
|
+
},
|
|
47
|
+
"dependencies": {
|
|
48
|
+
"@github/copilot-sdk": "1.0.0-beta.4",
|
|
49
|
+
"better-sqlite3": "^12.10.0",
|
|
50
|
+
"bindings": "^1.5.0",
|
|
51
|
+
"pino": "^9.5.0",
|
|
52
|
+
"pino-pretty": "^11.3.0",
|
|
53
|
+
"pino-roll": "^3.0.0"
|
|
54
|
+
},
|
|
55
|
+
"devDependencies": {
|
|
56
|
+
"@biomejs/biome": "^2.3.0",
|
|
57
|
+
"esbuild": "^0.25.0",
|
|
58
|
+
"knip": "^6.14.1",
|
|
59
|
+
"typescript": "^5.7.0"
|
|
60
|
+
},
|
|
61
|
+
"pnpm": {
|
|
62
|
+
"onlyBuiltDependencies": [
|
|
63
|
+
"better-sqlite3",
|
|
64
|
+
"esbuild",
|
|
65
|
+
"msw"
|
|
66
|
+
],
|
|
67
|
+
"overrides": {
|
|
68
|
+
"better-sqlite3": "^12.10.0",
|
|
69
|
+
"mute-stream": "^3.0.0"
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|