agentglow 0.2.11 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import "./style.css";
3
- import { A as E, T as s, a as T } from "./chunks/index-Ci8tSMhc.js";
3
+ import { A as E, T as s, a as T } from "./chunks/index-Bp54n3io.js";
4
4
  export {
5
5
  E as AgentScene,
6
6
  s as THEMES,
package/dist/style.css CHANGED
@@ -1 +1 @@
1
- .scene-root{position:fixed;top:0;right:0;bottom:0;left:0;background:#03050b;color:#e8edf5;font-family:Public Sans,system-ui,sans-serif;overflow:hidden}.scene-root canvas{display:block}.hud{position:absolute;z-index:10;background:#0a0e1a8c;border:1px solid rgba(148,163,255,.16);border-radius:14px;backdrop-filter:blur(14px) saturate(1.3);-webkit-backdrop-filter:blur(14px) saturate(1.3);box-shadow:0 8px 32px #00000059,inset 0 1px #ffffff0a}.hud-topwrap{position:absolute;z-index:10;top:12px;left:12px;max-width:calc(100% - var(--hud-side, 320px) - 36px);display:flex;flex-wrap:wrap;align-items:flex-start;gap:8px;pointer-events:none}.hud-topwrap.is-rail{--hud-side: 40px}.hud-topwrap>*{pointer-events:auto}.hud-top{position:relative;padding:6px 8px 6px 12px;min-width:0}.hud-bar{display:flex;align-items:center;gap:4px 8px;flex-wrap:wrap}.hud-bar .hud-run{margin-top:0}.hud-info{all:unset;cursor:pointer;width:18px;height:18px;border-radius:50%;display:grid;place-items:center;font:italic 600 11px/1 Georgia,serif;color:#94a3b8;border:1px solid rgba(148,163,184,.35)}.hud-info:hover,.hud-info.on{color:#e2e8f0;border-color:#818cf8}.hud-theme{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:#03050b8c url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='5'%3E%3Cpath d='M0 0l4 5 4-5z' fill='%2394a3b8'/%3E%3C/svg%3E") no-repeat right 9px center;color:#cbd5e1;border:1px solid rgba(148,163,255,.22);border-radius:999px;font:inherit;font-size:11px;text-transform:uppercase;letter-spacing:.08em;padding:4px 24px 4px 10px;cursor:pointer;outline:none}.hud-theme:hover{border-color:#818cf8}.hud-title{display:flex;align-items:center;gap:8px;font-weight:700;font-size:15px;letter-spacing:-.01em;white-space:nowrap}.hud-sub{margin:6px 0 2px;max-width:460px;font-size:12px;line-height:1.45;color:#94a3b8}.hud-dot{width:9px;height:9px;border-radius:50%;background:#22c55e;box-shadow:0 0 10px #22c55e;animation:hud-ping 1.6s ease-out infinite}@keyframes hud-ping{0%{box-shadow:0 0 #22c55eb3}to{box-shadow:0 0 0 10px #22c55e00}}.hud-badge{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.08em;padding:2px 7px;border-radius:999px;background:#94a3b829;color:#cbd5e1}.hud-stats{display:flex;flex-wrap:wrap;align-items:center;gap:4px}.hud-stat{font-size:11px;color:#94a3b8;padding:2px 8px;border-radius:999px;background:#03050b66;white-space:nowrap}.hud-stat b{color:#f1f5f9;font-weight:700;font-variant-numeric:tabular-nums}.scene-root :focus-visible{outline:2px solid #818cf8;outline-offset:2px}.hud-side{top:12px;right:12px;bottom:12px;width:320px;display:flex;flex-direction:column;padding:8px 10px 10px;font-size:13px;box-sizing:border-box;animation:hs-in .18s ease-out}.hud-side.is-rail{width:40px;padding:6px 0;align-items:center}@keyframes hs-in{0%{opacity:.4}}.hs-head{display:flex;align-items:center;gap:2px;padding-bottom:8px;margin:0 -2px 2px;border-bottom:1px solid rgba(148,163,255,.12)}.hs-head button{all:unset;cursor:pointer;display:flex;align-items:center;gap:5px;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.08em;color:#94a3b8;padding:5px 9px;border-radius:999px}.hs-head button:hover{color:#e2e8f0}.hs-head button.on{color:#f1f5f9;background:#818cf838}.hs-head em,.hs-icon em{font-style:normal;font-size:10px;font-weight:700;font-variant-numeric:tabular-nums;color:#c7d2fe;letter-spacing:0}.hs-head .hs-collapse{margin-left:auto;font-size:14px;padding:2px 8px;letter-spacing:0}.hs-rail{display:flex;flex-direction:column;align-items:center;gap:6px}.hs-rail button{all:unset;cursor:pointer;position:relative;width:30px;height:30px;display:grid;place-items:center;border-radius:9px;color:#94a3b8}.hs-rail button:hover{color:#e2e8f0;background:#94a3ff1a}.hs-rail .hs-collapse{font-size:14px;margin-bottom:4px}.hs-icon em{position:absolute;top:-3px;right:-5px;min-width:14px;height:14px;padding:0 3px;box-sizing:border-box;border-radius:999px;display:grid;place-items:center;font-size:9px;background:#4f46e5;color:#eef2ff}.hs-icon em:empty{min-width:8px;width:8px;height:8px;padding:0;top:1px;right:1px;background:#22d3ee;box-shadow:0 0 8px #22d3ee}.hs-body{flex:1;min-height:0;display:flex;flex-direction:column}.hs-body[hidden]{display:none}.hs-empty{margin:14px 4px;font-size:12px;line-height:1.5;color:#64748b}.hs-events{list-style:none;margin:6px -4px 0;padding:0;overflow-y:auto;min-height:0;flex:1;font-size:11.5px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.hs-events li>*{all:unset;box-sizing:border-box;width:100%;display:flex;gap:8px;align-items:baseline;padding:4px 6px;border-radius:7px;color:#cbd5e1;line-height:1.4}.hs-events li>button{cursor:pointer}.hs-events li>button:hover{background:#94a3ff1a;color:#f1f5f9}.hs-events i{flex:0 0 7px;height:7px;border-radius:50%;background:var(--c);box-shadow:0 0 8px var(--c);transform:translateY(-1px)}.hs-events span{min-width:0;overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow-wrap:anywhere}.ap-head{display:flex;align-items:center;gap:8px;margin-top:6px}.ap-count{flex:none;color:#64748b;font-size:11px;font-variant-numeric:tabular-nums}.ap-link{all:unset;cursor:pointer;font-size:12px;color:#93c5fd}.ap-link:hover{color:#bfdbfe}.ap-searchrow{display:flex;align-items:center;gap:8px;margin-top:8px}.ap-search{flex:1;min-width:0;width:100%;box-sizing:border-box;background:#03050b99;border:1px solid rgba(148,163,255,.2);border-radius:8px;color:inherit;font:inherit;font-size:12px;padding:6px 9px;outline:none}.ap-search:focus{border-color:#818cf8}.ap-chips{display:flex;flex-wrap:wrap;gap:4px;margin-top:8px}.ap-chips button{all:unset;cursor:pointer;display:flex;align-items:center;gap:5px;font-size:11px;padding:3px 7px;border-radius:999px;border:1px solid rgba(148,163,255,.15);color:#cbd5e1}.ap-chips button.on{border-color:var(--c);background:color-mix(in srgb,var(--c) 18%,transparent);color:#f8fafc}.ap-chips i{width:8px;height:8px;border-radius:50%;background:var(--c);box-shadow:0 0 8px var(--c)}.ap-chips em{font-style:normal;color:var(--c);font-weight:700;font-variant-numeric:tabular-nums}.ap-row-filters{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px;align-items:center}.ap-seg{display:flex;border:1px solid rgba(148,163,255,.15);border-radius:8px;overflow:hidden}.ap-seg{flex:none}.ap-seg button{all:unset;cursor:pointer;font-size:11px;padding:3px 6px;color:#94a3b8;text-transform:capitalize}.ap-seg button.on{background:#818cf840;color:#f1f5f9}.ap-row-filters select{flex:1;min-width:64px;background:#03050b99;color:#cbd5e1;border:1px solid rgba(148,163,255,.15);border-radius:8px;font:inherit;font-size:11px;padding:3px 6px}.ap-list{list-style:none;margin:8px -4px 0;padding:0;overflow-y:auto;min-height:0;flex:1}.ap-list li button{all:unset;box-sizing:border-box;width:100%;cursor:pointer;display:flex;align-items:center;gap:8px;padding:6px;border-radius:8px}.ap-list li button:hover{background:#94a3ff1a}.ap-list li button.is-done{opacity:.55}.ap-list i{flex:0 0 9px;height:9px;border-radius:50%;background:var(--c);box-shadow:0 0 8px var(--c)}.ap-list i[data-status=thinking]{animation:ap-pulse .9s ease-in-out infinite}.ap-list i[data-status=waiting]{opacity:.5}.ap-list i[data-status=done]{background:transparent;border:1.5px solid var(--c);box-shadow:none}@keyframes ap-pulse{50%{transform:scale(1.5)}}.ap-name{flex:1;min-width:0;display:flex;flex-direction:column;font-size:12px;color:#e2e8f0}.ap-name small{color:#64748b;font-size:11px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ap-meta{text-align:right;font-size:11px;color:#94a3b8;font-variant-numeric:tabular-nums;display:flex;flex-direction:column}.ap-meta b{color:var(--c);font-weight:600;text-transform:lowercase}.hs-events li.is-skill>*{background:#f5b83d12}.hs-skill{flex:0 0 auto;font-size:9.5px;font-weight:600;line-height:1.5;text-transform:uppercase;letter-spacing:.06em;color:#fcd581;padding:0 6px;border-radius:999px;border:1px solid rgba(245,184,61,.55);background:#f5b83d1f}.ap-title{display:flex;align-items:center;gap:6px;min-width:0}.ap-skill{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-style:normal;font-size:9.5px;font-weight:600;color:#fcd581;padding:0 6px;border-radius:999px;border:1px solid rgba(245,184,61,.55);background:#f5b83d1f}.ap-skill:before{content:"skill:";color:#b8893a;font-weight:500}.hs-skill:before{content:"";display:inline-block;width:6px;height:6px;margin:0 4px 0 -1px;border:1px solid currentColor;border-radius:50%;vertical-align:0;box-shadow:0 0 4px #f5b83d99}.ap-skills{display:flex;flex-wrap:wrap;gap:4px}.ap-skills span{font-size:11px;color:#e2e8f0;padding:2px 8px;border-radius:999px;border:1px solid rgba(245,184,61,.35);background:#f5b83d0f;display:inline-flex;gap:5px;align-items:baseline}.ap-skills span.on{border-color:#f5b83d;background:#f5b83d2e;color:#fde7b0;box-shadow:0 0 10px #f5b83d40}.ap-skills em{font-style:normal;font-size:10px;color:#b8893a;font-variant-numeric:tabular-nums}.ap-more{padding:6px;color:#64748b;font-size:11px}.ap-detail{overflow-y:auto;min-height:0;margin-top:8px;flex:1}.ap-detail h3{margin:0;display:flex;align-items:center;gap:8px;font-size:15px;color:var(--c)}.ap-detail h3 i{width:11px;height:11px;border-radius:50%;background:var(--c);box-shadow:0 0 10px var(--c)}.ap-detail h3 small{color:#64748b;font-size:11px;font-weight:500}.ap-status{margin-top:3px;font-size:12px;color:#cbd5e1}.ap-status[data-status=thinking]{color:#fde68a}.ap-stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(46px,1fr));gap:4px;margin:10px 0 4px}.ap-stats div{background:#03050b73;border-radius:8px;padding:6px;text-align:center}.ap-stats dt{font-size:9px;text-transform:uppercase;letter-spacing:.06em;color:#64748b}.ap-stats dd{margin:2px 0 0;font-size:15px;font-weight:700;color:#f1f5f9;font-variant-numeric:tabular-nums}.ap-detail section{margin-top:10px}.ap-detail h4{margin:0 0 4px;font-size:10px;text-transform:uppercase;letter-spacing:.08em;color:#64748b}.ap-detail p{margin:0;font-size:12px;color:#cbd5e1}.ap-steps{display:flex;flex-wrap:wrap;gap:4px;margin-top:4px}.ap-steps span{max-width:120px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:10px;text-transform:uppercase;letter-spacing:.06em;padding:2px 7px;border-radius:999px;border:1px solid #334155;color:#64748b}.ap-steps span[data-status=running]{border-color:#fbbf24;color:#fde68a}.ap-steps span[data-status=done]{border-color:#22c55e;color:#86efac}.ap-steps span[data-status=failed]{border-color:#ef4444;color:#fca5a5}.ap-chip-link{all:unset;cursor:pointer;display:block;font-size:12px;color:#e2e8f0;padding:3px 6px;border-left:2px solid var(--c);margin:2px 0;border-radius:0 6px 6px 0}.ap-chip-link:hover{background:#94a3ff1a}.ap-wait{color:#fbbf24!important;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.ap-nodes{line-height:1.5}.ap-events{margin:0;padding-left:14px;display:grid;gap:3px;font-size:11px;color:#cbd5e1;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.hud-badge--live{background:#22c55e2e;color:#86efac}.hud-badge--denied{background:#f871712e;color:#fca5a5;text-transform:none;letter-spacing:.02em}.hud-chip{text-transform:none;letter-spacing:.02em;font-weight:500;background:#818cf829;color:#c7d2fe;white-space:nowrap;max-width:180px;overflow:hidden;text-overflow:ellipsis}.hud-chip b{font-weight:650;color:#e0e7ff}.hud-run{display:flex;gap:6px;margin-top:8px;align-items:center;flex-wrap:wrap}.hud-run input{flex:1;min-width:160px;background:#03050b99;border:1px solid rgba(148,163,255,.2);border-radius:999px;color:inherit;font:inherit;font-size:12px;padding:6px 11px;outline:none}.hud-run button{border:0;border-radius:999px;padding:6px 13px;font:inherit;font-size:12px;font-weight:600;background:linear-gradient(135deg,#818cf8,#22d3ee);color:#03050b;cursor:pointer}.hud-run button:disabled{opacity:.5}.hud-run select{max-width:160px;min-width:0;background:#03050b99;color:#cbd5e1;border:1px solid rgba(148,163,255,.2);border-radius:999px;font:inherit;font-size:12px;padding:5px 9px;cursor:pointer}.hud-run span{font-size:11px;color:#86efac}.agentglow-embed{position:relative;overflow:hidden;width:100%;height:100%;min-height:320px;isolation:isolate}.agentglow-embed .scene-root{position:absolute;top:0;right:0;bottom:0;left:0}.lod-cluster-label{all:unset;box-sizing:border-box;display:grid;gap:1px;text-align:center;cursor:pointer;pointer-events:auto;font-size:12px;font-weight:600;color:#f8fafc;padding:4px 11px 5px;border-radius:12px;white-space:nowrap;background:#03050b9e;border:1px solid color-mix(in srgb,var(--c, #818cf8) 60%,transparent);text-shadow:0 0 10px var(--c, #818cf8);box-shadow:0 0 18px color-mix(in srgb,var(--c, #818cf8) 22%,transparent);transition:border-color .2s,background .2s}.lod-cluster-label:hover{background:color-mix(in srgb,var(--c, #818cf8) 22%,rgba(3,5,11,.7));border-color:var(--c, #818cf8)}.lod-cluster-label b{font-weight:700;letter-spacing:-.01em}.lod-cluster-label small{font-size:10px;font-weight:500;color:#94a3b8;text-shadow:none;font-variant-numeric:tabular-nums}.hud-dock{display:flex;align-items:center;gap:8px}.hud-dock:empty{display:none}.hud-dock>.hud{position:static}.hud-lod{padding:6px 8px 6px 12px;display:flex;align-items:center;gap:8px;font-size:12px;color:#cbd5e1;white-space:nowrap}.hud-lod span b{margin:0 1px}.hud-lod b{color:#f1f5f9;font-variant-numeric:tabular-nums}.hud-lod i{width:7px;height:7px;border-radius:50%;background:#a5b4fc;box-shadow:0 0 8px #a5b4fc}.hud-lod button{all:unset;cursor:pointer;font-size:11px;padding:3px 9px;border-radius:999px;border:1px solid rgba(148,163,255,.25);color:#c7d2fe}.hud-lod button:hover{background:#818cf833;color:#f8fafc}.scene-root{container:agscene / size}@container agscene (max-width: 719px){.scene-root .hud-top{padding:5px 7px 5px 10px}.scene-root .hud-title{font-size:13px}.scene-root .hud-theme{padding:3px 20px 3px 8px;font-size:10px;background-position:right 7px center}.scene-root .hud-stat:nth-child(n+3){display:none}.scene-root .hud-side:not(.is-rail){width:min(290px,calc(100% - 64px));padding:6px 8px 8px}.scene-root .hs-head button{padding:4px 6px;letter-spacing:.04em;font-size:10.5px}.scene-root .hs-head .hs-collapse{padding:2px 4px}.scene-root .ap-list li button{padding:4px 6px}.scene-root .hud-topwrap:not(.is-rail){--hud-side: min(290px, calc(100% - 64px) )}}@container agscene (max-height: 520px){.scene-root .hud-sub{max-height:4.5em;overflow:auto}}.scene-label.subway-station{font-size:10px;font-weight:500;padding:1px 6px;letter-spacing:.08em;text-transform:uppercase;color:#cbd5e1;opacity:.85}.scene-label.subway-airport{font-size:11px}.scene-label.subway-run{display:flex;flex-direction:column;align-items:flex-start;gap:3px;padding:4px 9px;border-radius:10px;font-size:11px}.subway-steps{display:flex;gap:4px}.subway-steps b{font-size:9px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;padding:0 5px;border-radius:999px;color:#94a3b8;border:1px solid #334155;text-shadow:none}.subway-steps b[data-st=running]{color:#fde68a;border-color:#fbbf24;box-shadow:0 0 8px #fbbf2499}.subway-steps b[data-st=done]{color:#bbf7d0;border-color:#22c55e}.subway-steps b[data-st=failed]{color:#fecaca;border-color:#ef4444}.scene-label.subway-flare{font-size:10px;transition:opacity .2s}.city-root{background:#05040d}.city-district{display:grid;gap:4px;padding:5px 10px 6px;border-radius:10px;transition:opacity .4s}.city-district-top{display:flex;align-items:baseline;gap:8px}.city-district-top b{font-size:12px;color:#f8fafc}.city-count{font-size:10px;font-weight:500;color:#a5b4fc;text-shadow:none}.city-steps{display:flex;gap:4px}.city-chip{--sc: #3b4256;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.08em;padding:1px 7px;border-radius:999px;color:var(--sc);border:1px solid color-mix(in srgb,var(--sc) 70%,transparent);text-shadow:none}.city-chip[data-st=running]{color:#03050b;background:var(--sc);box-shadow:0 0 10px var(--sc)}.city-chip[data-st=done]{color:var(--sc);background:color-mix(in srgb,var(--sc) 18%,transparent)}.city-chip[data-st=queued]{color:#64748b;border-color:#334155}.city-chip+.city-chip:before{content:""}.city-tower-label{font-size:13px}.city-mcp-label{font-size:11px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.city-tower-label{font-size:15px;font-weight:800;letter-spacing:.06em;padding:3px 12px}.city-node-label{font-size:10px;transition:opacity .2s}.tunnel-pause{padding:7px 14px;color:#e2e8f0;font:600 11px/1 Public Sans,system-ui,sans-serif;letter-spacing:.08em;text-transform:uppercase;cursor:pointer;white-space:nowrap}.flow-run{display:flex;flex-direction:column;align-items:center;gap:4px;pointer-events:none}.flow-run .scene-label{font-size:11px;max-width:220px;overflow:hidden;text-overflow:ellipsis}.flow-steps{display:flex;gap:3px;font:600 9px/1 ui-monospace,SFMono-Regular,Menlo,monospace;text-transform:uppercase;letter-spacing:.06em}.flow-steps span{padding:2px 5px;border-radius:999px;color:#64748b;background:#03050b8c;border:1px solid rgba(100,116,139,.35)}.flow-steps span[data-s=running]{color:#03050b;background:var(--c);border-color:var(--c);box-shadow:0 0 12px var(--c)}.flow-steps span[data-s=done]{color:var(--c);border-color:color-mix(in srgb,var(--c) 60%,transparent)}.flow-steps span[data-s=failed]{color:#fecaca;background:#7f1d1d}.flow-step{font:600 9px/1 ui-monospace,SFMono-Regular,Menlo,monospace;text-transform:uppercase;letter-spacing:.08em;color:color-mix(in srgb,var(--c) 70%,white);text-shadow:0 0 8px var(--c);opacity:.55;pointer-events:none;white-space:nowrap;transition:opacity .3s}.flow-step[data-s=running]{opacity:1}.flow-hint{font-size:10px;padding:1px 7px;opacity:.9}.flow-label-core{font-size:11px;letter-spacing:.04em}.ap-root{background:radial-gradient(ellipse at 45% 50%,#03140e,#010604 60%,#000302)}.ap-root,.ap-tag,.ap-airport,.ap-gate,.ap-strip,.ap-wp,.ap-bearing{--mono: ui-monospace, "SF Mono", "JetBrains Mono", Menlo, monospace}.ap-bearing{font:600 9px/1 var(--mono);color:#2fae6e;letter-spacing:.08em;opacity:.85;text-shadow:0 0 6px rgba(70,255,154,.5)}.ap-tag{position:relative;width:0;height:0;pointer-events:none;transition:none}.ap-leader{position:absolute;left:6px;top:-22px;overflow:visible}.ap-leader line{stroke:color-mix(in srgb,var(--c) 45%,#46ff9a);stroke-width:1;opacity:.7}.ap-tag-box{position:absolute;left:28px;top:-38px;display:grid;gap:1px;padding:2px 6px 2px 5px;border-left:2px solid var(--c);background:#010c089e;white-space:nowrap}.ap-call{font:700 10px/1.15 var(--mono);letter-spacing:.06em;color:#d9ffe9;text-shadow:0 0 8px color-mix(in srgb,var(--c) 70%,transparent)}.ap-data{font:500 9px/1.15 var(--mono);letter-spacing:.05em;color:#57d897}.ap-tag-big .ap-call{font-size:12px}.ap-tag-big .ap-data{font-size:10px}.ap-airport{width:max-content;display:flex;align-items:center;gap:6px;white-space:nowrap;font:600 10px/1 var(--mono);color:#c8f7de;letter-spacing:.04em;padding:3px 7px;border:1px solid color-mix(in srgb,var(--c) 55%,transparent);background:#010a07b3;text-shadow:0 0 8px color-mix(in srgb,var(--c) 60%,transparent)}.ap-airport-code{font-weight:800;color:var(--c);letter-spacing:.1em}.ap-gate{white-space:nowrap;font:500 9px/1 var(--mono);color:#a6e9c6;letter-spacing:.03em;padding:2px 5px;background:#010a078c;border-bottom:1px solid color-mix(in srgb,var(--c) 50%,transparent)}.ap-gate.ap-hot{color:#fff;font-weight:700;border-bottom-color:var(--c);box-shadow:0 0 10px color-mix(in srgb,var(--c) 50%,transparent)}.ap-strip{width:max-content;display:grid;gap:2px;text-align:left;padding:4px 9px 4px 8px;border-left:3px solid var(--c);background:#010c08b8;outline:1px solid rgba(70,255,154,.14);max-width:260px}.ap-strip-topic{font:600 11px/1.25 Public Sans,system-ui,sans-serif;color:#e8fff1;white-space:normal}.ap-strip-sub{font:500 9px/1.2 var(--mono);color:#5fbf8d;letter-spacing:.05em;white-space:nowrap}.ap-wp{white-space:nowrap;font:600 9px/1 var(--mono);letter-spacing:.05em;color:#e9fffb;padding:2px 5px;border:1px solid color-mix(in srgb,var(--c, #38e8ff) 60%,transparent);background:#010a0aa6;text-shadow:0 0 8px var(--c, #38e8ff)}.ap-tag-left .ap-leader{left:-28px;transform:scaleX(-1)}.ap-tag-left .ap-tag-box{left:auto;right:28px;text-align:right;border-left:0;border-right:2px solid var(--c);padding:2px 5px 2px 6px}
1
+ .scene-root{position:fixed;top:0;right:0;bottom:0;left:0;background:#03050b;color:#e8edf5;font-family:Public Sans,system-ui,sans-serif;overflow:hidden}.scene-root canvas{display:block}.hud{position:absolute;z-index:10;background:#0a0e1a8c;border:1px solid rgba(148,163,255,.16);border-radius:14px;backdrop-filter:blur(14px) saturate(1.3);-webkit-backdrop-filter:blur(14px) saturate(1.3);box-shadow:0 8px 32px #00000059,inset 0 1px #ffffff0a}.hud-topwrap{position:absolute;z-index:10;top:12px;left:12px;max-width:calc(100% - var(--hud-side, 320px) - 36px);display:flex;flex-wrap:wrap;align-items:flex-start;gap:8px;pointer-events:none}.hud-topwrap.is-rail{--hud-side: 40px}.hud-topwrap>*{pointer-events:auto}.hud-top{position:relative;padding:6px 8px 6px 12px;min-width:0}.hud-bar{display:flex;align-items:center;gap:4px 8px;flex-wrap:wrap}.hud-bar .hud-run{margin-top:0}.hud-info{all:unset;cursor:pointer;width:18px;height:18px;border-radius:50%;display:grid;place-items:center;font:italic 600 11px/1 Georgia,serif;color:#94a3b8;border:1px solid rgba(148,163,184,.35)}.hud-info:hover,.hud-info.on{color:#e2e8f0;border-color:#818cf8}.hud-theme{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:#03050b8c url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='5'%3E%3Cpath d='M0 0l4 5 4-5z' fill='%2394a3b8'/%3E%3C/svg%3E") no-repeat right 9px center;color:#cbd5e1;border:1px solid rgba(148,163,255,.22);border-radius:999px;font:inherit;font-size:11px;text-transform:uppercase;letter-spacing:.08em;padding:4px 24px 4px 10px;cursor:pointer;outline:none}.hud-theme:hover{border-color:#818cf8}.hud-title{display:flex;align-items:center;gap:8px;font-weight:700;font-size:15px;letter-spacing:-.01em;white-space:nowrap}.hud-sub{margin:6px 0 2px;max-width:460px;font-size:12px;line-height:1.45;color:#94a3b8}.hud-dot{width:9px;height:9px;border-radius:50%;background:#22c55e;box-shadow:0 0 10px #22c55e;animation:hud-ping 1.6s ease-out infinite}@keyframes hud-ping{0%{box-shadow:0 0 #22c55eb3}to{box-shadow:0 0 0 10px #22c55e00}}.hud-badge{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.08em;padding:2px 7px;border-radius:999px;background:#94a3b829;color:#cbd5e1}.hud-stats{display:flex;flex-wrap:wrap;align-items:center;gap:4px}.hud-stat{font-size:11px;color:#94a3b8;padding:2px 8px;border-radius:999px;background:#03050b66;white-space:nowrap}.hud-stat b{color:#f1f5f9;font-weight:700;font-variant-numeric:tabular-nums}.hud-dec{--dc: 94, 234, 212;animation:hud-dec-pulse .7s ease-out}.hud-dec.is-deny{--dc: 251, 59, 92}@keyframes hud-dec-pulse{0%{background:rgba(var(--dc),.5);box-shadow:0 0 rgba(var(--dc),.7);color:#fff}35%{background:rgba(var(--dc),.28);box-shadow:0 0 0 5px rgba(var(--dc),0)}to{background:#03050b66;box-shadow:0 0 rgba(var(--dc),0)}}@media(prefers-reduced-motion:reduce){.hud-dec{animation:none}}.hud-dec-hv{display:inline-flex;align-items:center;gap:4px;color:#a7f3d0;background:#5eead41a}.hud-dec-hv.is-deny{color:#fecdd3;background:#fb3b5c24}.hud-spark{color:#5eead4;margin-left:2px}.hud-dec-hv.is-deny .hud-spark{color:#fb7185}.scene-root :focus-visible{outline:2px solid #818cf8;outline-offset:2px}.hud-side{top:12px;right:12px;bottom:12px;width:320px;display:flex;flex-direction:column;padding:8px 10px 10px;font-size:13px;box-sizing:border-box;animation:hs-in .18s ease-out}.hud-side.is-rail{width:40px;padding:6px 0;align-items:center}@keyframes hs-in{0%{opacity:.4}}.hs-head{display:flex;align-items:center;gap:2px;padding-bottom:8px;margin:0 -2px 2px;border-bottom:1px solid rgba(148,163,255,.12)}.hs-head button{all:unset;cursor:pointer;display:flex;align-items:center;gap:5px;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.08em;color:#94a3b8;padding:5px 9px;border-radius:999px}.hs-head button:hover{color:#e2e8f0}.hs-head button.on{color:#f1f5f9;background:#818cf838}.hs-head em,.hs-icon em{font-style:normal;font-size:10px;font-weight:700;font-variant-numeric:tabular-nums;color:#c7d2fe;letter-spacing:0}.hs-head .hs-collapse{margin-left:auto;font-size:14px;padding:2px 8px;letter-spacing:0}.hs-rail{display:flex;flex-direction:column;align-items:center;gap:6px}.hs-rail button{all:unset;cursor:pointer;position:relative;width:30px;height:30px;display:grid;place-items:center;border-radius:9px;color:#94a3b8}.hs-rail button:hover{color:#e2e8f0;background:#94a3ff1a}.hs-rail .hs-collapse{font-size:14px;margin-bottom:4px}.hs-icon em{position:absolute;top:-3px;right:-5px;min-width:14px;height:14px;padding:0 3px;box-sizing:border-box;border-radius:999px;display:grid;place-items:center;font-size:9px;background:#4f46e5;color:#eef2ff}.hs-icon em:empty{min-width:8px;width:8px;height:8px;padding:0;top:1px;right:1px;background:#22d3ee;box-shadow:0 0 8px #22d3ee}.hs-body{flex:1;min-height:0;display:flex;flex-direction:column}.hs-body[hidden]{display:none}.hs-empty{margin:14px 4px;font-size:12px;line-height:1.5;color:#64748b}.hs-events{list-style:none;margin:6px -4px 0;padding:0;overflow-y:auto;min-height:0;flex:1;font-size:11.5px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.hs-events li>*{all:unset;box-sizing:border-box;width:100%;display:flex;gap:8px;align-items:baseline;padding:4px 6px;border-radius:7px;color:#cbd5e1;line-height:1.4}.hs-events li>button{cursor:pointer}.hs-events li>button:hover{background:#94a3ff1a;color:#f1f5f9}.hs-events i{flex:0 0 7px;height:7px;border-radius:50%;background:var(--c);box-shadow:0 0 8px var(--c);transform:translateY(-1px)}.hs-events span{min-width:0;overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow-wrap:anywhere}.ap-head{display:flex;align-items:center;gap:8px;margin-top:6px}.ap-count{flex:none;color:#64748b;font-size:11px;font-variant-numeric:tabular-nums}.ap-link{all:unset;cursor:pointer;font-size:12px;color:#93c5fd}.ap-link:hover{color:#bfdbfe}.ap-searchrow{display:flex;align-items:center;gap:8px;margin-top:8px}.ap-search{flex:1;min-width:0;width:100%;box-sizing:border-box;background:#03050b99;border:1px solid rgba(148,163,255,.2);border-radius:8px;color:inherit;font:inherit;font-size:12px;padding:6px 9px;outline:none}.ap-search:focus{border-color:#818cf8}.ap-chips{display:flex;flex-wrap:wrap;gap:4px;margin-top:8px}.ap-chips button{all:unset;cursor:pointer;display:flex;align-items:center;gap:5px;font-size:11px;padding:3px 7px;border-radius:999px;border:1px solid rgba(148,163,255,.15);color:#cbd5e1}.ap-chips button.on{border-color:var(--c);background:color-mix(in srgb,var(--c) 18%,transparent);color:#f8fafc}.ap-chips i{width:8px;height:8px;border-radius:50%;background:var(--c);box-shadow:0 0 8px var(--c)}.ap-chips em{font-style:normal;color:var(--c);font-weight:700;font-variant-numeric:tabular-nums}.ap-row-filters{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px;align-items:center}.ap-seg{display:flex;border:1px solid rgba(148,163,255,.15);border-radius:8px;overflow:hidden}.ap-seg{flex:none}.ap-seg button{all:unset;cursor:pointer;font-size:11px;padding:3px 6px;color:#94a3b8;text-transform:capitalize}.ap-seg button.on{background:#818cf840;color:#f1f5f9}.ap-row-filters select{flex:1;min-width:64px;background:#03050b99;color:#cbd5e1;border:1px solid rgba(148,163,255,.15);border-radius:8px;font:inherit;font-size:11px;padding:3px 6px}.ap-list{list-style:none;margin:8px -4px 0;padding:0;overflow-y:auto;min-height:0;flex:1}.ap-list li button{all:unset;box-sizing:border-box;width:100%;cursor:pointer;display:flex;align-items:center;gap:8px;padding:6px;border-radius:8px}.ap-list li button:hover{background:#94a3ff1a}.ap-list li button.is-done{opacity:.55}.ap-list i{flex:0 0 9px;height:9px;border-radius:50%;background:var(--c);box-shadow:0 0 8px var(--c)}.ap-list i[data-status=thinking]{animation:ap-pulse .9s ease-in-out infinite}.ap-list i[data-status=waiting]{opacity:.5}.ap-list i[data-status=done]{background:transparent;border:1.5px solid var(--c);box-shadow:none}@keyframes ap-pulse{50%{transform:scale(1.5)}}.ap-name{flex:1;min-width:0;display:flex;flex-direction:column;font-size:12px;color:#e2e8f0}.ap-name small{color:#64748b;font-size:11px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ap-meta{text-align:right;font-size:11px;color:#94a3b8;font-variant-numeric:tabular-nums;display:flex;flex-direction:column}.ap-meta b{color:var(--c);font-weight:600;text-transform:lowercase}.hs-events li.is-skill>*{background:#f5b83d12}.hs-skill{flex:0 0 auto;font-size:9.5px;font-weight:600;line-height:1.5;text-transform:uppercase;letter-spacing:.06em;color:#fcd581;padding:0 6px;border-radius:999px;border:1px solid rgba(245,184,61,.55);background:#f5b83d1f}.ap-title{display:flex;align-items:center;gap:6px;min-width:0}.ap-skill{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-style:normal;font-size:9.5px;font-weight:600;color:#fcd581;padding:0 6px;border-radius:999px;border:1px solid rgba(245,184,61,.55);background:#f5b83d1f}.ap-skill:before{content:"skill:";color:#b8893a;font-weight:500}.hs-skill:before{content:"";display:inline-block;width:6px;height:6px;margin:0 4px 0 -1px;border:1px solid currentColor;border-radius:50%;vertical-align:0;box-shadow:0 0 4px #f5b83d99}.hs-events li.is-dec>*{background:#5eead40d}.hs-events li.is-deny>*{background:#fb3b5c1f}.hs-dec{flex:0 0 auto;font-size:9.5px;font-weight:600;line-height:1.5;text-transform:uppercase;letter-spacing:.06em;color:var(--c);padding:0 6px;border-radius:3px;border:1px solid var(--c);background:#ffffff0a}.ap-decisions{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:3px}.ap-decisions li{display:flex;gap:6px;align-items:baseline;font-size:11px;color:#e2e8f0;padding:2px 6px;border-left:2px solid var(--c);background:#ffffff08}.ap-decisions li.is-deny{background:#fb3b5c1f}.ap-decisions li.is-strike span{text-decoration:line-through;color:#94a3b8}.ap-hv{font-size:11.5px;color:#e2e8f0;margin:0 0 4px;font-variant-numeric:tabular-nums}.ap-hv-bar{display:flex;height:6px;border-radius:3px;overflow:hidden;gap:1px;background:#ffffff0d}.ap-hv-bar span{flex-basis:0;min-width:2px}.ap-decisions b{flex:0 0 auto;font-size:9.5px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--c)}.ap-decisions span{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ap-decisions em{flex:0 0 auto;font-style:normal;font-size:10px;color:#94a3b8;font-variant-numeric:tabular-nums}.ap-skills{display:flex;flex-wrap:wrap;gap:4px}.ap-skills span{font-size:11px;color:#e2e8f0;padding:2px 8px;border-radius:999px;border:1px solid rgba(245,184,61,.35);background:#f5b83d0f;display:inline-flex;gap:5px;align-items:baseline}.ap-skills span.on{border-color:#f5b83d;background:#f5b83d2e;color:#fde7b0;box-shadow:0 0 10px #f5b83d40}.ap-skills em{font-style:normal;font-size:10px;color:#b8893a;font-variant-numeric:tabular-nums}.ap-more{padding:6px;color:#64748b;font-size:11px}.ap-detail{overflow-y:auto;min-height:0;margin-top:8px;flex:1}.ap-detail h3{margin:0;display:flex;align-items:center;gap:8px;font-size:15px;color:var(--c)}.ap-detail h3 i{width:11px;height:11px;border-radius:50%;background:var(--c);box-shadow:0 0 10px var(--c)}.ap-detail h3 small{color:#64748b;font-size:11px;font-weight:500}.ap-status{margin-top:3px;font-size:12px;color:#cbd5e1}.ap-status[data-status=thinking]{color:#fde68a}.ap-status[data-status=waiting]{color:#fcd34d}.ap-stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(46px,1fr));gap:4px;margin:10px 0 4px}.ap-stats div{background:#03050b73;border-radius:8px;padding:6px;text-align:center}.ap-stats dt{font-size:9px;text-transform:uppercase;letter-spacing:.06em;color:#64748b}.ap-stats dd{margin:2px 0 0;font-size:15px;font-weight:700;color:#f1f5f9;font-variant-numeric:tabular-nums}.ap-detail section{margin-top:10px}.ap-detail h4{margin:0 0 4px;font-size:10px;text-transform:uppercase;letter-spacing:.08em;color:#64748b}.ap-detail p{margin:0;font-size:12px;color:#cbd5e1}.ap-steps{display:flex;flex-wrap:wrap;gap:4px;margin-top:4px}.ap-steps span{max-width:120px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:10px;text-transform:uppercase;letter-spacing:.06em;padding:2px 7px;border-radius:999px;border:1px solid #334155;color:#64748b}.ap-steps span[data-status=running]{border-color:#fbbf24;color:#fde68a}.ap-steps span[data-status=waiting]{border-color:#f59e0b;color:#fcd34d;background:#f59e0b24;animation:ap-wait-pulse 1.8s ease-in-out infinite}.ap-steps span[data-status=done]{border-color:#22c55e;color:#86efac}.ap-steps span[data-status=failed]{border-color:#ef4444;color:#fca5a5}.ap-chip-link{all:unset;cursor:pointer;display:block;font-size:12px;color:#e2e8f0;padding:3px 6px;border-left:2px solid var(--c);margin:2px 0;border-radius:0 6px 6px 0}.ap-chip-link:hover{background:#94a3ff1a}.ap-wait{color:#fbbf24!important;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.ap-nodes{line-height:1.5}.ap-chat{margin:0;padding:0;list-style:none;display:grid;gap:6px;font-size:12px;color:#e2e8f0;white-space:pre-wrap;overflow-wrap:anywhere;max-height:320px;overflow-y:auto}.ap-chat li[data-role=user]{color:#c7d2fe}.ap-chat li[data-role=agent]{padding-bottom:6px;border-bottom:1px solid rgba(148,163,255,.12)}.ap-chat b{font-weight:650}.ap-events{margin:0;padding-left:14px;display:grid;gap:3px;font-size:11px;color:#cbd5e1;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.hud-badge--live{background:#22c55e2e;color:#86efac}.hud-badge--denied{background:#f871712e;color:#fca5a5;text-transform:none;letter-spacing:.02em}.hud-chip{text-transform:none;letter-spacing:.02em;font-weight:500;background:#818cf829;color:#c7d2fe;white-space:nowrap;max-width:180px;overflow:hidden;text-overflow:ellipsis}.hud-chip b{font-weight:650;color:#e0e7ff}.hud-run{display:flex;gap:6px;margin-top:8px;align-items:center;flex-wrap:wrap}.hud-run input{flex:1;min-width:160px;background:#03050b99;border:1px solid rgba(148,163,255,.2);border-radius:999px;color:inherit;font:inherit;font-size:12px;padding:6px 11px;outline:none}.hud-run button{border:0;border-radius:999px;padding:6px 13px;font:inherit;font-size:12px;font-weight:600;background:linear-gradient(135deg,#818cf8,#22d3ee);color:#03050b;cursor:pointer}.hud-run button:disabled{opacity:.5}.hud-run select{max-width:160px;min-width:0;background:#03050b99;color:#cbd5e1;border:1px solid rgba(148,163,255,.2);border-radius:999px;font:inherit;font-size:12px;padding:5px 9px;cursor:pointer}.hud-run span{font-size:11px;color:#86efac}.agentglow-embed{position:relative;overflow:hidden;width:100%;height:100%;min-height:320px;isolation:isolate}.agentglow-embed .scene-root{position:absolute;top:0;right:0;bottom:0;left:0}.lod-cluster-label{all:unset;box-sizing:border-box;display:grid;gap:1px;text-align:center;cursor:pointer;pointer-events:auto;font-size:12px;font-weight:600;color:#f8fafc;padding:4px 11px 5px;border-radius:12px;white-space:nowrap;background:#03050b9e;border:1px solid color-mix(in srgb,var(--c, #818cf8) 60%,transparent);text-shadow:0 0 10px var(--c, #818cf8);box-shadow:0 0 18px color-mix(in srgb,var(--c, #818cf8) 22%,transparent);transition:border-color .2s,background .2s}.lod-cluster-label:hover{background:color-mix(in srgb,var(--c, #818cf8) 22%,rgba(3,5,11,.7));border-color:var(--c, #818cf8)}.lod-cluster-label b{font-weight:700;letter-spacing:-.01em}.lod-cluster-label small{font-size:10px;font-weight:500;color:#94a3b8;text-shadow:none;font-variant-numeric:tabular-nums}.hud-dock{display:flex;align-items:center;gap:8px}.hud-dock:empty{display:none}.hud-dock>.hud{position:static}.hud-lod{padding:6px 8px 6px 12px;display:flex;align-items:center;gap:8px;font-size:12px;color:#cbd5e1;white-space:nowrap}.hud-lod span b{margin:0 1px}.hud-lod b{color:#f1f5f9;font-variant-numeric:tabular-nums}.hud-lod i{width:7px;height:7px;border-radius:50%;background:#a5b4fc;box-shadow:0 0 8px #a5b4fc}.hud-lod button{all:unset;cursor:pointer;font-size:11px;padding:3px 9px;border-radius:999px;border:1px solid rgba(148,163,255,.25);color:#c7d2fe}.hud-lod button:hover{background:#818cf833;color:#f8fafc}.scene-root{container:agscene / size}@container agscene (max-width: 719px){.scene-root .hud-top{padding:5px 7px 5px 10px}.scene-root .hud-title{font-size:13px}.scene-root .hud-theme{padding:3px 20px 3px 8px;font-size:10px;background-position:right 7px center}.scene-root .hud-stat:nth-child(n+3){display:none}.scene-root .hud-side:not(.is-rail){width:min(290px,calc(100% - 64px));padding:6px 8px 8px}.scene-root .hs-head button{padding:4px 6px;letter-spacing:.04em;font-size:10.5px}.scene-root .hs-head .hs-collapse{padding:2px 4px}.scene-root .ap-list li button{padding:4px 6px}.scene-root .hud-topwrap:not(.is-rail){--hud-side: min(290px, calc(100% - 64px) )}}@container agscene (max-height: 520px){.scene-root .hud-sub{max-height:4.5em;overflow:auto}}@keyframes ap-wait-pulse{50%{box-shadow:0 0 10px #f59e0b8c;border-color:#fbbf24}}@media(prefers-reduced-motion:reduce){.ap-steps span[data-status=waiting]{animation:none}}.hud-approve{display:flex;align-items:center;flex-wrap:wrap;gap:6px;margin-top:8px}.hud-approve button{border:1px solid transparent;border-radius:999px;padding:5px 13px;font:inherit;font-size:12px;font-weight:650;cursor:pointer}.hud-approve .ha-yes{background:linear-gradient(135deg,#34d399,#22d3ee);color:#03050b}.hud-approve .ha-no{background:#fb3b5c24;border-color:#fb718599;color:#fecdd3}.hud-approve .ha-yes:hover{filter:brightness(1.1)}.hud-approve .ha-no:hover{background:#fb3b5c47}.hud-approve span{font-size:11px;color:#94a3b8}.hud-approve[data-verdict=approved] span,.hud-approve[data-verdict=approving] span{color:#86efac}.hud-approve[data-verdict=rejected] span,.hud-approve[data-verdict=rejecting] span,.hud-approve[data-verdict=error] span{color:#fda4af}.hud-approve.is-compact{margin-top:0;flex:none;gap:4px}.hud-approve.is-compact button{padding:3px 9px;font-size:11px}.hud-approvals{left:12px;bottom:12px;z-index:9;width:max-content;max-width:min(460px,calc(100% - 356px));padding:8px 10px;font-size:12px;box-sizing:border-box;border-color:#f59e0b73;box-shadow:0 8px 32px #00000059,0 0 18px #f59e0b1f}.hud-approvals.is-rail{max-width:min(460px,calc(100% - 76px))}.hud-approvals h4{margin:0 0 6px;font-size:10px;text-transform:uppercase;letter-spacing:.08em;color:#fcd34d;display:flex;gap:6px;align-items:baseline}.hud-approvals h4 em{font-style:normal;font-variant-numeric:tabular-nums;color:#fde68a}.hud-approvals ul{list-style:none;margin:0;padding:0;display:grid;gap:4px}.hud-approvals li{display:flex;align-items:center;gap:8px;min-width:0}.hud-approvals .ha-who{all:unset;cursor:pointer;flex:1;min-width:0;display:flex;align-items:baseline;gap:6px;padding:2px 4px;border-radius:6px}.hud-approvals .ha-who:hover{background:#94a3ff1a}.hud-approvals .ha-who i{flex:0 0 8px;height:8px;border-radius:50%;background:var(--c);box-shadow:0 0 8px var(--c);align-self:center}.hud-approvals .ha-who b{color:#e2e8f0;font-weight:650;white-space:nowrap}.hud-approvals .ha-who span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#fbbf24;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px}.hud-approvals p{margin:6px 0 0;font-size:11px;color:#64748b}@container agscene (max-width: 719px){.scene-root .hud-approvals{max-width:calc(100% - 76px);padding:6px 8px}.scene-root .hud-approvals .ha-who span{display:none}}.flow-run{display:flex;flex-direction:column;align-items:center;gap:4px;pointer-events:none}.flow-run .scene-label{font-size:11px;max-width:220px;overflow:hidden;text-overflow:ellipsis}.flow-steps{display:flex;gap:3px;font:600 9px/1 ui-monospace,SFMono-Regular,Menlo,monospace;text-transform:uppercase;letter-spacing:.06em}.flow-steps span{padding:2px 5px;border-radius:999px;color:#64748b;background:#03050b8c;border:1px solid rgba(100,116,139,.35)}.flow-steps span[data-s=running]{color:#03050b;background:var(--c);border-color:var(--c);box-shadow:0 0 12px var(--c)}.flow-steps span[data-s=done]{color:var(--c);border-color:color-mix(in srgb,var(--c) 60%,transparent)}.flow-steps span[data-s=failed]{color:#fecaca;background:#7f1d1d}.flow-step{font:600 9px/1 ui-monospace,SFMono-Regular,Menlo,monospace;text-transform:uppercase;letter-spacing:.08em;color:color-mix(in srgb,var(--c) 70%,white);text-shadow:0 0 8px var(--c);opacity:.55;pointer-events:none;white-space:nowrap;transition:opacity .3s}.flow-step[data-s=running]{opacity:1}.flow-hint{font-size:10px;padding:1px 7px;opacity:.9}.flow-label-core{font-size:11px;letter-spacing:.04em}
@@ -9,7 +9,7 @@ export type AgentSceneProps = {
9
9
  /** Show the HUD (counts, event ticker, agent panel). Default true. */
10
10
  hud?: boolean;
11
11
  /** Use the built-in simulator instead of a server. Default false (auto-fallback if the server is unreachable). */
12
- sim?: boolean;
12
+ sim?: boolean | "hf";
13
13
  /**
14
14
  * Only show agents in this scope (e.g. a user or tenant id). Sent as the `X-AgentGlow-Scope` header, never in a URL.
15
15
  * On a server that requires tokens the token decides the scope; this is then only a label (and the POST /live/run scope).
@@ -1,6 +1,6 @@
1
1
  /** The AgentGlow themes (scene modules live in src/scenes/<theme>/index.tsx). */
2
2
  import type { ComponentType } from "react";
3
- export declare const THEMES: readonly ["orbit", "neural", "subway", "city", "ocean", "circuit", "tunnel", "flow", "hive", "forest", "constellation", "factory", "airport", "mycelium", "atom"];
3
+ export declare const THEMES: readonly ["neural", "constellation", "orbit", "atom", "flow"];
4
4
  export type Theme = (typeof THEMES)[number];
5
5
  export declare const THEME_INFO: Record<Theme, {
6
6
  name: string;
@@ -14,7 +14,9 @@ export type WorldEvent = {
14
14
  type: "step";
15
15
  run_id: string;
16
16
  step: StepName;
17
- status: "running" | "done" | "failed";
17
+ status: "running" | "waiting" | "done" | "failed";
18
+ reason?: string;
19
+ until?: number;
18
20
  ts: number;
19
21
  } | {
20
22
  type: "spawn";
@@ -35,6 +37,8 @@ export type WorldEvent = {
35
37
  run_id: string;
36
38
  id: string;
37
39
  status: "thinking" | "waiting";
40
+ reason?: string;
41
+ until?: number;
38
42
  ts: number;
39
43
  } | {
40
44
  type: "llm";
@@ -42,6 +46,8 @@ export type WorldEvent = {
42
46
  id: string;
43
47
  tokens_in: number;
44
48
  tokens_out: number;
49
+ tokens_cached?: number;
50
+ tokens_cache_write?: number;
45
51
  latency_ms: number;
46
52
  ts: number;
47
53
  } | {
@@ -70,6 +76,13 @@ export type WorldEvent = {
70
76
  run_id: string;
71
77
  text: string;
72
78
  ts: number;
79
+ } | {
80
+ type: "chat";
81
+ run_id: string;
82
+ id: string;
83
+ role: "user" | "agent";
84
+ text: string;
85
+ ts: number;
73
86
  } | {
74
87
  type: "skill";
75
88
  run_id: string;
@@ -77,6 +90,48 @@ export type WorldEvent = {
77
90
  name: string;
78
91
  status: "start" | "end";
79
92
  ts: number;
93
+ } | {
94
+ type: "decision";
95
+ run_id: string;
96
+ id: string;
97
+ kind: DecisionKind;
98
+ question: string;
99
+ result: string;
100
+ p?: number;
101
+ options?: {
102
+ name: string;
103
+ p: number;
104
+ }[];
105
+ provider: string;
106
+ purpose?: string;
107
+ target?: string;
108
+ ms: number;
109
+ ts: number;
110
+ hv?: boolean;
111
+ why?: string;
112
+ } | {
113
+ type: "decision_stats";
114
+ run_id: string;
115
+ id: string;
116
+ window_ms: number;
117
+ n: number;
118
+ by_purpose: DecisionStatsByPurpose;
119
+ p50_ms: number;
120
+ p95_ms: number;
121
+ providers: Record<string, number>;
122
+ ts: number;
123
+ } | {
124
+ type: "order";
125
+ run_id: string;
126
+ id: string;
127
+ side: string;
128
+ qty: number;
129
+ price?: number;
130
+ status: OrderStatus;
131
+ instrument: string;
132
+ dry_run: boolean;
133
+ reason?: string;
134
+ ts: number;
80
135
  } | {
81
136
  type: "mcp_register";
82
137
  run_id?: string;
@@ -98,6 +153,117 @@ export type WorldEvent = {
98
153
  resource?: string;
99
154
  resource_kind?: ResourceKind;
100
155
  };
156
+ export type DecisionKind = "choice" | "score" | "noul";
157
+ export type DecisionStatsByPurpose = {
158
+ route?: {
159
+ n: number;
160
+ results: Record<string, number>;
161
+ };
162
+ guard?: {
163
+ n: number;
164
+ allow: number;
165
+ deny: number;
166
+ };
167
+ check?: {
168
+ n: number;
169
+ yes: number;
170
+ no: number;
171
+ };
172
+ };
173
+ export type OrderStatus = "would_place" | "placed" | "filled" | "rejected" | "cancelled";
174
+ /** One order on one agent; `at` = performance.now() when it arrived (its chip plays from there). */
175
+ export type OrderUse = Omit<Extract<WorldEvent, {
176
+ type: "order";
177
+ }>, "type" | "run_id" | "id"> & {
178
+ at: number;
179
+ };
180
+ export declare const ORDER_LIFE_MS = 1500;
181
+ /**
182
+ * High-volume decisions, per agent (from `decision_stats`): smoothed (EMA) so the halo and its label never flicker.
183
+ * `seg` = smoothed share of each outcome category, in HALO_CATS order.
184
+ */
185
+ export type HvStats = {
186
+ at: number;
187
+ bump: number;
188
+ bumpDeny: boolean;
189
+ rate: number;
190
+ deny: number;
191
+ p50: number;
192
+ p95: number;
193
+ seg: number[];
194
+ provider: string;
195
+ n: number;
196
+ windows: number;
197
+ };
198
+ /** outcome categories of a decision halo arc: allow, deny, check yes, check no, route result slots 0..3, other */
199
+ export declare const HALO_CATS: readonly ["allow", "deny", "yes", "no", "r0", "r1", "r2", "r3", "other"];
200
+ export declare const HALO_COLORS: string[];
201
+ /** route result name -> accent slot 0..3 (first four names seen in this session; later ones are "other") */
202
+ export declare const routeSlots: Map<string, number>;
203
+ /** a halo fades out once its agent sent no stats for this long (ms), over HV_FADE_MS */
204
+ export declare const HV_QUIET_MS = 2500;
205
+ export declare const HV_FADE_MS = 1500;
206
+ /** 0..1 visibility of an agent's decision halo */
207
+ export declare function haloMix(h: HvStats | null, now?: number): number;
208
+ /** the agent is in high-volume mode now (recent decision_stats) */
209
+ export declare const hvActive: (i: Instance, now?: number) => boolean;
210
+ /** `jev 42/s · 3% deny · p50 38ms` */
211
+ export declare function haloText(h: HvStats): string;
212
+ /** One decision on one agent; `at` (performance.now()) = when its glyph starts (staggered so a burst reads one by one). */
213
+ export type DecisionUse = Omit<Extract<WorldEvent, {
214
+ type: "decision";
215
+ }>, "type" | "run_id" | "id"> & {
216
+ at: number;
217
+ /** high volume: not shown as a glyph (over the on-screen cap; it only flashed the halo) */
218
+ hidden?: boolean;
219
+ /** high volume: pre-empted by a more important glyph at this time (fades out fast) */
220
+ cut?: number;
221
+ };
222
+ /** Decision glyph timing (ms): snap in fast (much faster than LLM pulses / skill rings on purpose), then hold long
223
+ * enough to read on a video; a guard deny holds longer. */
224
+ export declare const DECISION_SNAP_MS = 150;
225
+ export declare const DECISION_HOLD_MS = 1800;
226
+ export declare const DECISION_LIFE_MS = 2400;
227
+ export declare const DENY_HOLD_MS = 2500;
228
+ export declare const DENY_LIFE_MS = 3100;
229
+ /** min gap between two glyph starts on one agent (a burst of decisions plays as a quick sequence) */
230
+ export declare const DECISION_STAGGER_MS = 220;
231
+ /** high-volume mode (`hv` decisions): short holds so glyphs don't pile up */
232
+ export declare const HV_HOLD_MS = 800;
233
+ export declare const HV_LIFE_MS = 1150;
234
+ /** how long a decision's glyph lives (ms) */
235
+ export declare const decisionLife: (d: {
236
+ kind: string;
237
+ result: string;
238
+ purpose?: string;
239
+ hv?: boolean;
240
+ }) => number;
241
+ /** 0..1 visibility of a decision glyph: snaps in (DECISION_SNAP_MS), holds, fades out by decisionLife(d). */
242
+ export declare function decisionMix(d: DecisionUse, now?: number): number;
243
+ /** a guardrail that said no (shown as a red X / shut gate) */
244
+ export declare const isDeny: (d: {
245
+ kind: string;
246
+ result: string;
247
+ purpose?: string;
248
+ }) => boolean;
249
+ export declare const pct: (p?: number) => string;
250
+ /** short text for a decision: `jev · route → haiku 92%`, `guard: deny rollback_deploy 97%` */
251
+ export declare function decisionText(d: {
252
+ kind: string;
253
+ question: string;
254
+ result: string;
255
+ p?: number;
256
+ provider: string;
257
+ purpose?: string;
258
+ target?: string;
259
+ }): string;
260
+ /** `YES 3 @ 42c`, `SELL 10 @ 101.5` (prices below 1 read as cents) */
261
+ export declare function orderText(o: {
262
+ side: string;
263
+ qty: number;
264
+ price?: number;
265
+ status?: string;
266
+ }): string;
101
267
  /** What sits behind an MCP server (the server is a node; its backends are nodes too). */
102
268
  export type ResourceKind = "db" | "warehouse" | "spark" | "api" | "storage" | "queue";
103
269
  export declare const AGENT_TYPES: {
@@ -135,6 +301,7 @@ export type Instance = {
135
301
  pulse: number;
136
302
  pulseAt: number;
137
303
  tokens: number;
304
+ tokensCached: number;
138
305
  index: number;
139
306
  recent: WorldEvent[];
140
307
  llmCalls: number;
@@ -146,6 +313,26 @@ export type Instance = {
146
313
  /** newest started skill ("" = none yet) and when the last active one ended (0 while one is active) */
147
314
  skill: string;
148
315
  skillEndAt: number;
316
+ /** recent decisions (newest last, capped); glyphs play from `at` */
317
+ decisions: DecisionUse[];
318
+ /** high-volume decision stats (null until its first `decision_stats`) */
319
+ hv: HvStats | null;
320
+ /** recent orders (newest last, capped) */
321
+ orders: OrderUse[];
322
+ /** the MCP server this agent called last (a guard deny flashes the agent's line to it) */
323
+ lastMcp?: string;
324
+ /** opt-in prompt capture: this agent's turns, oldest first (user prompt, then its reply), capped */
325
+ chat: {
326
+ role: "user" | "agent";
327
+ text: string;
328
+ }[];
329
+ /** what it is waiting on (status "waiting" with a reason), else null */
330
+ wait: Wait | null;
331
+ };
332
+ /** A declared wait: what it waits on ("approval", "sleep", an event key) and its deadline / wake-up (epoch ms, 0 = none). */
333
+ export type Wait = {
334
+ reason: string;
335
+ until: number;
149
336
  };
150
337
  /** one skill on one agent; startAt / endAt (performance.now()) drive its sigil ring (endAt 0 while active) */
151
338
  export type SkillUse = {
@@ -175,8 +362,11 @@ export type Run = {
175
362
  color: string;
176
363
  slot: number;
177
364
  status: "started" | "completed" | "failed";
178
- /** status of every step seen so far; a step is only known once its first event arrives */
365
+ /** status of every step seen so far; a step is only known once its first event arrives. A waiting step stays
366
+ * "running" here (running but paused) and is listed in `waits`. */
179
367
  steps: Record<StepName, StepStatus>;
368
+ /** steps paused in a wait (durable approval / sleep): step -> what it waits on */
369
+ waits: Record<StepName, Wait>;
180
370
  /** step names in first-seen order */
181
371
  stepOrder: StepName[];
182
372
  /** true once a step event arrives (e.g. Hatchet); plain agent runs have no steps */
@@ -198,6 +388,12 @@ export declare function slotStatus(r: Run, k: number): StepStatus;
198
388
  /** A slot's caption: its step, or the running (else latest) one plus "+N" when the last slot holds several; "" if none yet. */
199
389
  export declare function slotLabel(r: Run, k: number): string;
200
390
  /** Steps for chips / label lines: the first MAX_STEP_CHIPS in order, plus how many more are hidden. */
391
+ /** The run's first waiting step (in step order), or null. */
392
+ export declare function runWait(r: Run): (Wait & {
393
+ step: StepName;
394
+ }) | null;
395
+ /** "sleeping until 14:05" / "waiting on approval" / "waiting on approval (until Oct 3, 09:00)" */
396
+ export declare function waitLabel(w: Wait, now?: number): string;
201
397
  export declare function stepChips(r: Run, max?: number): {
202
398
  shown: StepName[];
203
399
  more: number;
@@ -297,6 +493,8 @@ export declare const world: {
297
493
  mcpResolved: (McpPending & {
298
494
  resolvedAt: number;
299
495
  })[];
496
+ /** MCP tool name -> the server it was last called on (a guard deny on that tool flashes the line to it) */
497
+ mcpTools: Map<string, string>;
300
498
  ticker: WorldEvent[];
301
499
  stats: {
302
500
  runs: number;
@@ -307,6 +505,35 @@ export declare const world: {
307
505
  graphReads: number;
308
506
  graphWrites: number;
309
507
  mcpCalls: number;
508
+ decisions: number;
509
+ decisionMs: number;
510
+ };
511
+ /** decisions per provider (jev / laya / llm ...): count + summed latency (HUD chip tooltip) */
512
+ decisionProviders: Map<string, {
513
+ n: number;
514
+ ms: number;
515
+ }>;
516
+ /** session-wide decision rate (HUD): last full second's rate, deny share, p50/p95, 60 s sparkline (per second) */
517
+ rate: {
518
+ perS: number;
519
+ deny: number;
520
+ p50: number;
521
+ p95: number;
522
+ spark: number[];
523
+ rollAt: number;
524
+ acc: {
525
+ n: number;
526
+ deny: number;
527
+ msN: number;
528
+ p50: number;
529
+ p95: number;
530
+ };
531
+ };
532
+ /** orders seen: total, paper (dry_run), rejected/cancelled */
533
+ orders: {
534
+ n: number;
535
+ paper: number;
536
+ rejected: number;
310
537
  };
311
538
  lastFinal: string;
312
539
  simulated: boolean;
@@ -357,6 +584,8 @@ export declare function useWorld(): {
357
584
  mcpResolved: (McpPending & {
358
585
  resolvedAt: number;
359
586
  })[];
587
+ /** MCP tool name -> the server it was last called on (a guard deny on that tool flashes the line to it) */
588
+ mcpTools: Map<string, string>;
360
589
  ticker: WorldEvent[];
361
590
  stats: {
362
591
  runs: number;
@@ -367,6 +596,35 @@ export declare function useWorld(): {
367
596
  graphReads: number;
368
597
  graphWrites: number;
369
598
  mcpCalls: number;
599
+ decisions: number;
600
+ decisionMs: number;
601
+ };
602
+ /** decisions per provider (jev / laya / llm ...): count + summed latency (HUD chip tooltip) */
603
+ decisionProviders: Map<string, {
604
+ n: number;
605
+ ms: number;
606
+ }>;
607
+ /** session-wide decision rate (HUD): last full second's rate, deny share, p50/p95, 60 s sparkline (per second) */
608
+ rate: {
609
+ perS: number;
610
+ deny: number;
611
+ p50: number;
612
+ p95: number;
613
+ spark: number[];
614
+ rollAt: number;
615
+ acc: {
616
+ n: number;
617
+ deny: number;
618
+ msN: number;
619
+ p50: number;
620
+ p95: number;
621
+ };
622
+ };
623
+ /** orders seen: total, paper (dry_run), rejected/cancelled */
624
+ orders: {
625
+ n: number;
626
+ paper: number;
627
+ rejected: number;
370
628
  };
371
629
  lastFinal: string;
372
630
  simulated: boolean;
@@ -399,6 +657,8 @@ export declare function useWorld(): {
399
657
  };
400
658
  /** Stable pseudo-random 0..1 from a string (same id → same value, different ids → different values). */
401
659
  export declare const hash01: (id: string, salt?: number) => number;
660
+ /** high volume: most individual decision glyphs on screen at once (all agents) */
661
+ export declare const HV_GLYPHS_MAX = 3;
402
662
  export declare function apply(ev: WorldEvent): void;
403
663
  export declare function tick(now?: number): void;
404
664
  /** 0..1 visibility for an instance: grows in on spawn, fades out after exit. */
@@ -425,6 +685,14 @@ export declare function resetWorld(): void;
425
685
  export declare function setMode(m: "sim" | "live"): void;
426
686
  /** Mark that this session has a knowledge graph (sticky: once true it stays true). */
427
687
  export declare function setHasGraph(v: boolean, doNotify?: boolean): void;
688
+ /** An MCP server / backend stays fully lit this long after its last call or result, then its glow decays. */
689
+ export declare const MCP_GLOW_HOLD_MS = 2500;
690
+ /**
691
+ * 0..1 "recently active" glow of an MCP server or backend (its `activeAt`): 1 for MCP_GLOW_HOLD_MS after the last
692
+ * call/result, then exp(-rate * seconds). Shared by every theme so MCP activity stays visible alongside the graph
693
+ * reads that usually follow it.
694
+ */
695
+ export declare function mcpGlow(activeAt: number, now: number, rate?: number): number;
428
696
  /** An MCP server with no calls for this long (and none in flight) fades out; the next call fades it back in. */
429
697
  export declare const MCP_IDLE_MS = 90000;
430
698
  /** Should this MCP server (and its used backends) be drawn now? Shared "only show resources while used" rule. */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentglow",
3
- "version": "0.2.11",
3
+ "version": "0.3.0",
4
4
  "description": "Live 3D views of agent systems (LangGraph, deepagents, any OpenTelemetry-instrumented agents) as a React component.",
5
5
  "keywords": [
6
6
  "claude-code",