@ailog/cli 0.2.6 → 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/README.md +9 -11
- package/dist/client/assets/index-BBTm7Mxn.js +160 -0
- package/dist/client/assets/index-x-B7u97h.css +1 -0
- package/dist/client/index.html +4 -4
- package/dist/index.d.ts +35 -57
- package/dist/index.js +153 -81
- package/dist/viewer/server.js +117 -64
- package/package.json +1 -1
- package/dist/client/assets/index-BMqO0rJT.js +0 -190
- package/dist/client/assets/index-CdQ1JjwT.css +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
*{box-sizing:border-box}:root{--bg-0: oklch(.145 .005 264);--bg-1: oklch(.175 .006 264);--bg-2: oklch(.205 .007 264);--bg-3: oklch(.235 .008 264);--bg-4: oklch(.265 .009 264);--bg-input: oklch(.195 .007 264);--border: oklch(.27 .01 264);--border-strong: oklch(.34 .012 264);--border-subtle: oklch(.22 .008 264);--fg: oklch(.965 .002 264);--fg-muted: oklch(.74 .006 264);--fg-dim: oklch(.55 .008 264);--fg-faint: oklch(.42 .008 264);--accent: oklch(.72 .16 254);--accent-soft: oklch(.72 .16 254 / .14);--accent-fg: oklch(.78 .13 254);--tool: oklch(.74 .16 305);--tool-soft: oklch(.74 .16 305 / .14);--text-out: oklch(.78 .14 165);--text-out-soft: oklch(.78 .14 165 / .14);--reasoning: oklch(.82 .13 80);--reasoning-soft: oklch(.82 .13 80 / .14);--subagent: oklch(.78 .13 200);--subagent-soft: oklch(.78 .13 200 / .14);--error: oklch(.7 .18 25);--error-soft: oklch(.7 .18 25 / .16);--warn: oklch(.78 .13 80);--warn-soft: oklch(.78 .13 80 / .14);--ok: oklch(.74 .13 152);--ok-soft: oklch(.74 .13 152 / .14);--radius-sm: 4px;--radius: 6px;--radius-md: 8px;--radius-lg: 10px;--shadow-card: 0 1px 0 0 oklch(1 0 0 / .03) inset, 0 1px 2px oklch(0 0 0 / .4);--mono: ui-monospace, "JetBrains Mono", "SF Mono", Menlo, Consolas, monospace;--sans: ui-sans-serif, "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif}html,body,#root{height:100%;margin:0}body{background:var(--bg-0);color:var(--fg);font-family:var(--sans);font-size:13px;line-height:1.5;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;overflow:hidden;font-feature-settings:"cv11","ss01","ss03"}.dot-bg{background-image:radial-gradient(oklch(1 0 0 / .025) 1px,transparent 1px);background-size:24px 24px;background-position:-1px -1px}.app{display:grid;grid-template-rows:44px 1fr;height:100vh}.topbar{display:flex;align-items:center;gap:12px;padding:0 12px;border-bottom:1px solid var(--border);background:var(--bg-1);-webkit-app-region:drag}.brand{display:flex;align-items:center;gap:8px;font-family:var(--mono);font-size:12px;letter-spacing:.02em;color:var(--fg)}.brand .logo{width:22px;height:22px;border-radius:var(--radius-sm);background:linear-gradient(135deg,var(--accent),var(--tool));display:grid;place-items:center;color:#0f1216;font-weight:700;font-size:11px;letter-spacing:0}.brand .sep{width:1px;height:14px;background:var(--border-strong);margin:0 4px}.brand .ver{color:var(--fg-faint);font-size:11px}.topbar .url{font-family:var(--mono);font-size:11px;color:var(--fg-dim);padding:3px 8px;border-radius:999px;background:var(--bg-2);border:1px solid var(--border);display:inline-flex;align-items:center;gap:6px}.topbar .url .dot{width:6px;height:6px;border-radius:999px;background:var(--ok);box-shadow:0 0 8px var(--ok)}.topbar-spacer{flex:1}.topbar-actions{display:flex;gap:4px;align-items:center;-webkit-app-region:no-drag}.btn{display:inline-flex;align-items:center;gap:6px;padding:5px 10px;border-radius:var(--radius);font-family:var(--sans);font-size:12px;background:transparent;border:1px solid transparent;color:var(--fg-muted);cursor:pointer;transition:.1s ease;-webkit-user-select:none;user-select:none;white-space:nowrap}.btn:hover{background:var(--bg-2);color:var(--fg)}.btn:active{background:var(--bg-3)}.btn.ghost-border{border-color:var(--border);background:var(--bg-2)}.btn.ghost-border:hover{background:var(--bg-3);border-color:var(--border-strong)}.btn.danger:hover{color:var(--error);border-color:var(--error-soft);background:var(--error-soft)}.btn .sh{font-family:var(--mono);font-size:10px;color:var(--fg-faint);padding:1px 4px;border-radius:3px;background:#ffffff0a;border:1px solid var(--border-subtle);margin-left:4px}.btn.icon{padding:5px 6px}.tabs{display:flex;padding:2px;background:var(--bg-2);border-radius:var(--radius);border:1px solid var(--border)}.tabs button{background:transparent;border:0;color:var(--fg-dim);font-size:12px;padding:4px 10px;border-radius:4px;cursor:pointer;display:inline-flex;align-items:center;gap:6px;font-family:var(--sans)}.tabs button.active{background:var(--bg-3);color:var(--fg);box-shadow:0 0 0 1px var(--border-strong)}.body{display:grid;grid-template-columns:260px 1fr 1.35fr;grid-template-rows:auto 1fr;height:100%;min-height:0}.body .sidebar{grid-row:1 / 3;grid-column:1}.body .thread-head-full{grid-column:2 / 4;grid-row:1}.body .middle{grid-column:2;grid-row:2;min-height:0;overflow:hidden;display:grid;grid-template-rows:1fr;background:var(--bg-0);border-right:1px solid var(--border)}.body .middle>*{min-height:0}.body .run-details-pane{grid-column:3;grid-row:2;min-height:0;border-left:1px solid var(--border);display:grid;grid-template-rows:1fr;overflow:hidden}.body .run-details-pane>*{min-height:0;min-width:0}.body>.empty-spread{grid-column:2 / 4;grid-row:2}.app.focus-thread .sidebar .run-card.active,.app.focus-step .middle .step-group.selected,.app.focus-step .middle .run-row-compact.selected,.app.focus-step .middle .ttl-runline.selected{background:var(--accent-soft)}.focus-hint{position:fixed;bottom:12px;left:50%;transform:translate(-50%);display:inline-flex;align-items:center;gap:6px;padding:5px 10px;background:var(--bg-2);border:1px solid var(--border);border-radius:999px;font-family:var(--mono);font-size:10.5px;color:var(--fg-muted);pointer-events:none;opacity:0;transition:opacity .18s;z-index:50}.focus-hint.visible{opacity:1}.focus-hint .kbd{font-family:var(--mono);font-size:9.5px;background:var(--bg-3);border:1px solid var(--border-strong);border-radius:3px;padding:1px 4px;color:var(--fg)}.thread-head-full{display:flex;flex-direction:column;gap:4px;padding:6px 18px;border-bottom:1px solid var(--border);background:var(--bg-1)}.th-row1{display:flex;align-items:center;gap:12px;min-height:22px}.thread-head-title{font-size:13px;font-weight:600;color:var(--fg);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1;min-width:0;line-height:22px}.th-row1 .tabs{flex-shrink:0;padding:1px;border-radius:4px}.th-row1 .tabs button{font-size:10.5px;padding:2px 7px;gap:4px;border-radius:3px}.th-row1 .tabs button svg{width:10px;height:10px}.th-row2{display:flex;align-items:center;gap:8px;font-family:var(--mono);font-size:10.5px;color:var(--fg-faint);white-space:nowrap;overflow-x:auto;overflow-y:hidden;min-height:18px;scrollbar-width:none}.th-row2::-webkit-scrollbar{display:none}.th-row2>*{flex-shrink:0}.th-sep{width:1px;height:11px;background:var(--border)}.th-id{cursor:pointer;border-radius:3px;padding:1px 4px;margin:0 -4px;transition:background .1s}.th-id:hover{background:var(--bg-2)}.th-id .mono.auto{color:var(--fg-faint);font-style:italic}.th-stat{color:var(--fg-faint)}.th-stat .v{color:var(--fg-muted)}.th-stat .th-k{color:var(--fg-faint);opacity:.7;margin-right:1px}.th-bad{color:var(--error);background:var(--error-soft);border-radius:3px;padding:1px 5px;font-size:10px}.th-meta-label{color:var(--fg-faint);letter-spacing:.04em;font-size:9.5px;text-transform:uppercase}.th-meta-empty{color:var(--fg-faint);opacity:.55;font-style:italic}.th-meta-pills{display:inline-flex;gap:4px}.th-pill{background:var(--bg-2);border:1px solid var(--border);border-radius:3px;padding:0 5px;font-size:10px;display:inline-flex;gap:3px;align-items:baseline;line-height:14px}.th-pill .k{color:var(--fg-faint)}.th-pill .v{color:var(--fg-muted)}.sidebar{border-right:1px solid var(--border);background:var(--bg-1);display:grid;grid-template-rows:36px 36px 1fr;min-height:0}.sidebar-head{display:flex;align-items:center;justify-content:space-between;padding:0 12px;font-size:11px;font-family:var(--mono);letter-spacing:.08em;color:var(--fg-faint);text-transform:uppercase;border-bottom:1px solid var(--border)}.sidebar-head .count{font-family:var(--mono);font-size:11px;color:var(--fg-dim);background:var(--bg-2);padding:1px 6px;border-radius:999px;border:1px solid var(--border)}.sidebar-search{display:flex;align-items:center;gap:6px;padding:0 10px;border-bottom:1px solid var(--border)}.sidebar-search input{flex:1;background:transparent;border:0;color:var(--fg);font:inherit;outline:none;padding:6px 0}.sidebar-search input::placeholder{color:var(--fg-faint)}.sidebar-search .kbd{font-family:var(--mono);font-size:10px;color:var(--fg-faint);border:1px solid var(--border);padding:1px 5px;border-radius:3px;background:var(--bg-2)}.runs{overflow-y:auto;padding:4px}.run-card{display:block;padding:9px 10px;border-radius:var(--radius);cursor:pointer;position:relative;border:1px solid transparent}.run-card+.run-card{margin-top:1px}.run-card:hover{background:var(--bg-2)}.run-card.active{border-color:transparent}.run-card.active:before{content:"";position:absolute;left:-1px;top:8px;bottom:8px;width:2px;border-radius:2px;background:var(--accent)}.run-status{display:none}@keyframes pulse{0%,to{box-shadow:0 0 0 3px #5da7ff29;box-shadow:0 0 0 3px oklch(.72 .16 254 / .16)}50%{box-shadow:0 0 0 6px #5da7ff05;box-shadow:0 0 0 6px oklch(.72 .16 254 / .02)}}.run-main{min-width:0}.run-title{font-size:12.5px;color:var(--fg);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:1.35}.run-meta{font-family:var(--mono);font-size:10.5px;color:var(--fg-faint);display:flex;gap:8px;margin-top:4px;align-items:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.run-meta .fn{color:var(--fg-dim)}.run-meta .sep{color:var(--fg-faint);opacity:.6}.run-meta .err{color:var(--error)}.run-meta .warn{color:var(--warn)}.run-time{font-family:var(--mono);font-size:10.5px;color:var(--fg-faint);align-self:start;padding-top:1px}.type-badge{font-family:var(--mono);font-size:9.5px;letter-spacing:.05em;padding:1px 5px;border-radius:3px;border:1px solid var(--border);color:var(--fg-dim);background:var(--bg-2);text-transform:uppercase}.type-badge.stream{color:#59e0ad;border-color:#49d3a159;background:#49d3a11a}.type-badge.generate{color:#d5b1ff;color:oklch(.82 .14 305);border-color:#c28efb59;background:#c28efb1a}.chat-scroll{overflow-y:auto;padding:14px 16px 80px}.chat-inner{display:grid;gap:8px}.run-divider{text-align:center;font-family:var(--mono);font-size:10.5px;color:var(--fg-faint);margin:12px 0 6px;position:relative}.run-divider:before,.run-divider:after{content:"";position:absolute;top:50%;width:calc(50% - 36px);height:1px;background:var(--border)}.run-divider:before{left:0}.run-divider:after{right:0}.run-divider span{background:var(--bg-0);padding:0 8px;position:relative;z-index:1}.chat-scroll .md pre{white-space:pre-wrap;word-break:break-word;overflow-x:hidden}.chat-scroll .cm-tool-line,.chat-scroll .cm-body{overflow-wrap:anywhere;word-break:break-word}.step-group{position:relative;padding:6px 10px 6px 14px;border-radius:8px;border-left:2px solid transparent;display:grid;gap:6px;cursor:pointer;transition:background .12s,border-color .12s}.step-group:hover{border-left-color:var(--border-strong);background:#ffffff04}.step-group.selected{border-left-color:var(--accent)}.step-group .cm{cursor:pointer}.step-group .cm.focused{outline:1px dashed var(--accent);outline-offset:-1px}.cm{border-radius:8px;padding:8px 12px;border:1px solid var(--border);background:var(--bg-1);cursor:pointer;font-size:13px;line-height:1.55;transition:border-color .1s ease,background .1s ease}.cm:hover{border-color:var(--border-strong)}.cm.selected{border-color:var(--accent);box-shadow:0 0 0 2px var(--accent-soft)}.cm-meta{display:flex;align-items:center;gap:6px;font-family:var(--mono);font-size:10px;color:var(--fg-faint);margin-bottom:4px;text-transform:uppercase;letter-spacing:.04em}.cm-meta>*{white-space:nowrap}.cm-meta .sep{opacity:.55;text-transform:none}.cm-meta .tc-id{font-family:var(--mono);font-size:9.5px;padding:0 5px;border-radius:3px;background:#c28efb29;color:#d5b1ff;color:oklch(.82 .14 305);text-transform:none;letter-spacing:0}.cm-meta .tc-id.matched{background:#49d3a129;color:#70e9b9}.cm-body{color:var(--fg)}.cm-body .md{font-size:13px}.cm-user{justify-self:end;max-width:86%;background:var(--accent-soft);border-color:#5da7ff59;border-color:oklch(.72 .16 254 / .35);margin-left:14%}.cm-user .cm-meta{color:#83bbff;color:oklch(.78 .13 254)}.cm-user .cm-body{color:var(--fg);white-space:pre-wrap}.cm-text{background:var(--bg-1)}.cm-tool-call{background:#c28efb12;border-color:#c28efb40}.cm-tool-call .cm-meta{color:var(--tool)}.cm-tool-call .cm-tool-line{font-family:var(--mono);font-size:12.5px;color:var(--fg)}.cm-tool-call .tc-name{color:#dcbfff;color:oklch(.85 .14 305);font-weight:600}.cm-tool-call .tc-args{color:var(--fg-muted)}.cm-tool-result{background:#49d3a10f;border-color:#49d3a138}.cm-tool-result .cm-meta{color:var(--text-out)}.cm-tool-result .cm-tool-line{font-family:var(--mono);font-size:12.5px;color:var(--fg)}.cm-tool-result .tc-name{color:#70e9b9;font-weight:600}.cm-tool-result .tc-args{color:var(--fg-muted)}.cm-reasoning{background:#f0ba590d;border-color:#f0ba5938}.cm-reasoning .cm-meta{color:var(--reasoning)}.cm-reasoning-text{color:var(--fg-muted);font-style:italic;font-size:12.5px;line-height:1.5}.cm-error{background:#fa686314;border-color:#fa68634d}.cm-error .cm-meta{color:var(--error)}.cm-error .cm-body{color:var(--error);font-family:var(--mono);font-size:12px}.cm-aborted{background:#e3ad4b12;border-color:#e3ad4b4d}.cm-aborted .cm-meta{color:var(--warn)}.cm-aborted .cm-body{color:var(--warn);font-family:var(--mono);font-size:12px}.rv{display:grid;grid-template-rows:auto 1fr;min-height:0;min-width:0;height:100%;background:var(--bg-0);overflow:hidden}.rv.rv-inspector{grid-template-rows:auto auto 1fr auto}.rh{padding:12px 16px 10px;border-bottom:1px solid var(--border);background:var(--bg-1);display:grid;gap:8px;min-width:0}.rh-row1{display:flex;align-items:center;gap:10px;min-width:0}.rh-title{font-size:14px;font-weight:600;color:var(--fg);flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.rh-row2{display:flex;flex-wrap:wrap;gap:12px;font-family:var(--mono);font-size:10.5px;color:var(--fg-faint);align-items:center}.rh-row2>span{white-space:nowrap}.rh-row2 .k{color:var(--fg-faint);margin-right:3px}.rh-row2 .v{color:var(--fg-muted)}.rh-more{background:transparent;border:1px solid var(--border);color:var(--fg-faint);font-family:var(--mono);font-size:10px;padding:2px 8px;border-radius:3px;cursor:pointer;margin-left:auto}.rh-more:hover{color:var(--fg-muted);border-color:var(--border-strong)}.rh-meta{display:flex;flex-wrap:wrap;gap:6px;align-items:center;padding-top:4px}.rh-id{font-family:var(--mono);font-size:10.5px;color:var(--fg-dim);padding:2px 6px;background:var(--bg-2);border:1px solid var(--border);border-radius:3px;cursor:pointer;display:inline-flex;align-items:center;gap:4px}.rh-id:hover{color:var(--fg)}.rv-body{overflow-y:auto;min-height:0}.rv-toolbar{display:flex;align-items:center;gap:4px;margin-bottom:10px;padding:0 2px}.rv-toolbar-muted{font-family:var(--mono);font-size:11px;color:var(--fg-faint)}.rv-mini-btn{background:var(--bg-2);border:1px solid var(--border);color:var(--fg-dim);font-family:var(--mono);font-size:10.5px;padding:3px 9px;border-radius:4px;cursor:pointer;display:inline-flex;align-items:center;gap:4px}.rv-mini-btn:hover{color:var(--fg);border-color:var(--border-strong)}.rv-mini-btn:disabled{opacity:.4;cursor:not-allowed}.rv-compact-body{padding:14px 14px 60px;display:grid;gap:4px}.rv-compact-body .step-body{grid-template-columns:1fr}.rv-compact-body .step-pane+.step-pane{border-left:0;border-top:1px solid var(--border)}.rv-compact-body .step-summary-aside{gap:8px;font-size:10.5px}.rv-notebook-body{padding:14px 14px 60px;display:grid;gap:12px}.nb-cell{display:grid;grid-template-columns:28px 1fr;gap:12px;position:relative}.nb-cell-rail{display:grid;justify-content:center;position:relative}.nb-cell-rail:after{content:"";position:absolute;top:28px;bottom:-12px;left:50%;transform:translate(-50%);width:2px;background:var(--border)}.nb-cell:last-child .nb-cell-rail:after{display:none}.nb-cell-rail .step-num{width:24px;height:24px;font-size:11px;z-index:1}.nb-cell-card{background:var(--bg-1);border:1px solid var(--border);border-radius:var(--radius-md);overflow:hidden;transition:border-color .12s,box-shadow .12s}.nb-cell.focused .nb-cell-card{border-color:var(--accent);box-shadow:0 0 0 2px var(--accent-soft)}.nb-cell.err .nb-cell-card{border-color:#fa686366}.nb-cell.ab .nb-cell-card{border-color:#e3ad4b66}.nb-cell-head{display:flex;align-items:center;gap:8px;padding:9px 12px;background:var(--bg-2);border-bottom:1px solid var(--border)}.nb-cell.sub .nb-cell-head{background:#17d0d80f}.nb-meta{font-family:var(--mono);font-size:10.5px;color:var(--fg-faint);white-space:nowrap}.nb-meta .k{color:var(--fg-faint)}.nb-cell-sec{padding:12px 14px}.nb-cell-sec+.nb-cell-sec{border-top:1px dashed var(--border-subtle)}.nb-sec-head{display:flex;align-items:center;gap:8px;font-family:var(--mono);font-size:10.5px;letter-spacing:.06em;text-transform:uppercase;color:var(--fg-faint);margin-bottom:8px}.nb-sec-aside{color:var(--fg-dim);font-family:var(--mono);text-transform:none;letter-spacing:0}.rv-inspector{grid-template-rows:auto 1fr}.rv-inspector-body{padding:14px 14px 60px;display:grid;grid-template-columns:minmax(0,1fr);gap:8px}.rv-inspector-body>*{min-width:0}.ic{border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg-1);overflow:hidden;transition:border-color .12s}.ic:hover{border-color:var(--border-strong)}.ic.focused{border-color:var(--accent);box-shadow:0 0 0 2px var(--accent-soft)}.ic.err{border-color:#fa686366}.ic.ab{border-color:#e3ad4b66}.ic.sub .ic-head{background:linear-gradient(90deg,oklch(.78 .13 200 / .06),transparent 240px)}.ic-head{display:flex;align-items:center;gap:8px;padding:8px 12px;cursor:pointer;-webkit-user-select:none;user-select:none;min-width:0}.ic-head:hover{background:var(--bg-2)}.ic.open .ic-head{border-bottom:1px solid var(--border)}.ic-chev{color:var(--fg-faint);transition:transform .12s;flex-shrink:0}.ic-chev.open{transform:rotate(90deg)}.ic-meta{font-family:var(--mono);font-size:10.5px;color:var(--fg-faint);white-space:nowrap;flex-shrink:0}.ic-summary{font-size:12px;color:var(--fg-dim);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;flex:1;font-family:var(--sans);margin-left:6px}.ic-body{background:var(--bg-0)}.ic-finish{padding:8px 14px;font-family:var(--mono);font-size:10.5px;color:var(--fg-muted);border-bottom:1px dashed var(--border-subtle);background:var(--bg-1);display:flex;gap:5px;flex-wrap:wrap;align-items:center}.ic-finish .k{color:var(--fg-faint);margin-right:2px}.ic-finish .sep{opacity:.5}.ic-io{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr))}.ic-io>.ic-section{padding:12px 14px}.ic-io>.ic-section+.ic-section{border-top:1px solid var(--border);border-left:0}@supports (selector(:has(*))){.ic-io:has(>.ic-section:nth-child(2))>.ic-section+.ic-section{border-top:1px solid var(--border)}}@container (min-width: 580px){.ic-io>.ic-section+.ic-section{border-top:0;border-left:1px solid var(--border)}}.ic-body{container-type:inline-size}.ic-section{padding:12px 14px}.ic-section-head{display:flex;gap:8px;align-items:center;font-family:var(--mono);font-size:10.5px;letter-spacing:.06em;text-transform:uppercase;color:var(--fg-faint);margin-bottom:10px}.ic-section-aside{color:var(--fg-dim);text-transform:none;letter-spacing:0;font-size:10.5px}.rv-mini-btn.icon-only{padding:4px 6px;width:28px;justify-content:center}.step-pane-root{display:grid;grid-template-rows:auto auto 1fr;min-height:0;background:var(--bg-0);overflow:hidden}.step-pane-head{padding:7px 12px;background:var(--bg-1);border-bottom:1px solid var(--border);display:grid;gap:0}.sph-row{display:flex;align-items:center;gap:8px;flex-wrap:wrap;min-height:26px}.sph-row-main{gap:14px}.sph-row-crumb{gap:6px 10px;font-size:11.5px;color:var(--fg-muted);min-width:0;justify-content:space-between}.sph-row-left,.sph-row-right{display:flex;align-items:center;gap:7px;flex-wrap:nowrap;min-width:0}.sph-row-left{flex:0 1 auto;min-width:0}.sph-row-right{flex:0 0 auto}.sph-sep{width:1px;height:14px;background:var(--border);display:inline-block}.sph-row-crumb svg{color:var(--fg-faint);flex-shrink:0}.sph-crumb-thread{color:var(--fg);font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:240px}.sph-crumb-run,.sph-crumb-step{color:var(--fg-muted);white-space:nowrap}.sph-crumb-run .mono,.sph-crumb-step .mono{color:var(--fg);font-variant-numeric:tabular-nums;font-weight:500}.sph-crumb-of{color:var(--fg-faint);font-family:var(--mono);font-variant-numeric:tabular-nums}.sph-crumb-fn{font-family:var(--mono);font-size:10.5px;color:var(--fg-muted);background:var(--bg-2);border:1px solid var(--border);padding:1px 5px;border-radius:3px;white-space:nowrap;max-width:160px;overflow:hidden;text-overflow:ellipsis}.sph-status{display:inline-flex;align-items:center;gap:4px;font-size:10.5px;text-transform:uppercase;letter-spacing:.05em;font-weight:500;padding:2px 6px;border-radius:3px;margin-left:4px}.sph-status.err{background:var(--error-soft);color:var(--error)}.sph-status.ab{background:var(--warn-soft);color:var(--warn)}.sph-ts{font-family:var(--mono);font-size:11px;color:var(--fg-faint);white-space:nowrap;margin-left:4px}.sph-id-btn{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;background:transparent;border:1px solid var(--border);color:var(--fg-muted);border-radius:4px;cursor:pointer;padding:0;margin-left:2px;transition:color .12s,background .12s,border-color .12s}.sph-id-btn:hover{color:var(--fg);background:var(--bg-2);border-color:var(--border-strong)}.sph-title{display:inline-flex;align-items:center;gap:7px;min-width:0;color:var(--fg-muted)}.sph-step-label{font-size:12px;font-weight:500;color:var(--fg-muted);letter-spacing:.01em;line-height:1;white-space:nowrap}.sph-step-n{color:var(--fg);font-family:var(--mono);font-variant-numeric:tabular-nums;font-weight:600}.sph-step-of{color:var(--fg-faint);font-family:var(--mono);font-variant-numeric:tabular-nums}.sph-metric{display:inline-flex;align-items:baseline;gap:5px;font-family:var(--mono);font-size:12.5px;color:var(--fg);white-space:nowrap;font-variant-numeric:tabular-nums;letter-spacing:-.005em}.sph-metric-l{font-size:9.5px;color:var(--fg-faint);text-transform:uppercase;letter-spacing:.06em;font-weight:500}.sph-metric-v{color:var(--fg);font-weight:500}.sph-row-sub{gap:8px;font-family:var(--mono);font-size:10.5px;color:var(--fg-faint)}.sph-sub{display:inline-flex;align-items:center;gap:4px}.sph-sub svg{color:var(--fg-faint)}.sph-sub-sep{color:var(--fg-faint);opacity:.5}.sph-id{cursor:pointer;color:var(--fg-dim);border-radius:3px;padding:1px 4px;margin:-1px -4px;transition:color .12s,background .12s}.sph-id:hover{color:var(--fg-muted);background:var(--bg-2)}.sph-id svg{color:var(--fg-faint);opacity:.7}.sph-id:hover svg{opacity:1}.sph-meta{font-family:var(--mono);font-size:10.5px;color:var(--fg-faint);white-space:nowrap}.sph-tabs{background:var(--bg-1);border-bottom:1px solid var(--border);padding:0 12px}.step-pane-body{overflow-y:auto;min-height:0}.sp-io{padding:14px;display:grid;gap:12px}.sp-meta-strip{display:flex;align-items:center;flex-wrap:wrap;gap:8px;padding:2px 0 0}.sp-meta-item{font-family:var(--mono);font-size:11px;color:var(--fg-muted);white-space:nowrap}.sp-meta-item .sp-meta-k{color:var(--fg-faint);text-transform:uppercase;letter-spacing:.05em;font-size:9.5px;margin-right:4px}.sp-section{background:var(--bg-1);border:1px solid var(--border);border-radius:var(--radius-md);padding:12px 14px}.sp-section-head{display:flex;align-items:center;gap:8px;font-family:var(--mono);font-size:10.5px;text-transform:uppercase;letter-spacing:.06em;color:var(--fg-faint);margin-bottom:10px}.sp-padded{padding:14px 18px 60px}.sp-meta-grid{margin-top:12px;padding:10px 12px;background:var(--bg-2);border:1px solid var(--border);border-radius:6px;font-family:var(--mono);font-size:11.5px;color:var(--fg-muted);display:grid;grid-template-columns:auto 1fr;gap:6px 14px}.sp-meta-grid .k{color:var(--fg-faint)}.sp-block-head{margin-top:18px;margin-bottom:6px;font-family:var(--mono);font-size:10.5px;color:var(--fg-faint);letter-spacing:.04em;text-transform:uppercase}.sp-empty{font-family:var(--mono);font-size:11.5px;color:var(--fg-faint);font-style:italic;padding:6px 10px;background:var(--bg-2);border:1px dashed var(--border);border-radius:4px;width:fit-content}.sp-raw-grid{display:flex;flex-direction:column;gap:4px}.raw-row{display:flex;align-items:center;gap:10px;padding:5px 10px;background:var(--bg-2);border:1px solid var(--border);border-radius:4px;font-family:var(--mono);font-size:11.5px}.raw-row.blob{border-left:2px solid var(--accent)}.raw-row-k{color:var(--fg-faint);min-width:110px;flex-shrink:0}.raw-row-empty{color:var(--fg-faint);opacity:.6;font-style:italic}.raw-blob-chip{display:inline-flex;align-items:center;gap:4px;color:var(--fg-muted);background:var(--accent-soft);padding:2px 6px;border-radius:3px;font-size:11px}.raw-row-inline{display:flex;gap:8px;align-items:baseline;color:var(--fg-muted);flex:1;min-width:0}.raw-inline-len{color:var(--fg-faint);font-size:10.5px;flex-shrink:0}.raw-inline-peek{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;color:var(--fg-muted);opacity:.85}.run-meta .mono.tiny{font-family:var(--mono);font-size:9.5px;color:var(--fg-faint);letter-spacing:-.01em}.run-meta .mono.tiny.auto{font-style:italic;opacity:.7}.step-list{overflow-y:auto;padding:12px 14px 60px;display:grid;gap:14px}.step-list-run{border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg-1);overflow:hidden}.step-list-run-head{padding:9px 12px;border-bottom:1px solid var(--border);background:var(--bg-2);display:flex;align-items:center;gap:10px}.step-list-run-title{font-size:12.5px;color:var(--fg);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1}.step-list-run-meta{display:flex;align-items:center;gap:6px;font-family:var(--mono);font-size:10.5px;color:var(--fg-faint);flex-shrink:0}.step-list-run-meta .sep{opacity:.5}.step-list-rows{display:grid}.step-list-row{display:flex;align-items:center;gap:8px;padding:8px 12px;border-top:1px solid var(--border-subtle);cursor:pointer;transition:background .1s;min-width:0}.step-list-row:first-child{border-top:0}.step-list-row:hover{background:var(--bg-2)}.step-list-row.selected{background:var(--accent-soft);box-shadow:inset 2px 0 0 var(--accent)}.step-list-row.errored{box-shadow:inset 2px 0 0 var(--error)}.step-list-row.aborted{box-shadow:inset 2px 0 0 var(--warn)}.step-list-row .step-num{width:20px;height:20px;font-size:10.5px;border-radius:4px}.step-list-row .model-badge{flex-shrink:0;color:var(--fg-dim)}.step-list-summary{font-size:12px;color:var(--fg-muted);flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}.step-list-aside{display:inline-flex;gap:4px;font-family:var(--mono);font-size:10.5px;color:var(--fg-faint);white-space:nowrap;flex-shrink:0}.step-list-aside .sep{opacity:.5}.step-num.small{width:18px;height:18px;font-size:10px;border-radius:4px}.step-num.err{background:var(--error-soft);color:var(--error);border-color:#fa686380}.step-num.ab{background:var(--warn-soft);color:var(--warn);border-color:#e3ad4b80}.step-num.sub{background:var(--subagent-soft);color:var(--subagent);border-color:#17d0d880}.run-list-mid{overflow-y:auto;padding:8px 12px 60px;display:flex;flex-direction:column;gap:1px;align-content:flex-start}.run-row-compact{display:grid;grid-template-columns:20px 1fr auto auto auto;gap:10px;align-items:center;padding:3px 10px;height:26px;border-radius:4px;cursor:pointer;border-left:2px solid transparent;min-width:0;line-height:1}.run-row-compact:hover{background:var(--bg-2)}.run-row-compact.selected{border-left-color:var(--accent)}.run-row-compact.errored{border-left-color:var(--error)}.run-row-compact.aborted{border-left-color:var(--warn)}.rrc-idx{font-family:var(--mono);font-size:10.5px;color:var(--fg-faint);text-align:right}.rrc-title{font-size:12.5px;color:var(--fg);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}.rrc-meta{font-family:var(--mono);font-size:10.5px;color:var(--fg-dim);white-space:nowrap}.rrc-time{font-family:var(--mono);font-size:10.5px;color:var(--fg-faint);white-space:nowrap}.ttl-scroll{overflow-y:auto;padding:12px 16px 60px;display:flex;flex-direction:column;gap:14px}.ttl-axis-wrap{position:sticky;top:0;background:var(--bg-0);padding-bottom:6px;z-index:2}.ttl-axis{position:relative;height:18px;border-bottom:1px solid var(--border)}.ttl-tick{position:absolute;top:0;height:18px;font-family:var(--mono);font-size:10px;color:var(--fg-faint);padding-left:4px;border-left:1px solid var(--border)}.ttl-runs{display:flex;flex-direction:column;gap:4px}.ttl-runline{display:grid;grid-template-columns:180px 1fr auto;gap:10px;align-items:center;flex-shrink:0;cursor:pointer;padding:3px 6px;border-radius:4px;border-left:2px solid transparent}.ttl-runline:hover{background:var(--bg-2)}.ttl-runline.selected{border-left-color:var(--accent)}.ttl-rl-label{display:flex;align-items:center;gap:6px;min-width:0}.ttl-rl-idx{font-family:var(--mono);font-size:10px;color:var(--fg-faint);background:var(--bg-2);border:1px solid var(--border);padding:0 5px;border-radius:3px;flex-shrink:0}.ttl-rl-title{font-size:12px;color:var(--fg);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}.ttl-rl-track{position:relative;height:22px;background:linear-gradient(90deg,var(--border-subtle) 1px,transparent 1px) 0 0 / 10% 100% repeat-x,var(--bg-1);border:1px solid var(--border);border-radius:4px}.ttl-rl-bar{position:absolute;top:2px;bottom:2px;background:var(--accent);border-radius:3px;min-width:4px;cursor:pointer;display:flex;align-items:center;padding:0 6px;gap:6px;overflow:hidden;transition:filter .1s}.ttl-rl-bar:hover{filter:brightness(1.2)}.ttl-rl-bar.has-sub{background:linear-gradient(90deg,var(--accent) 60%,var(--subagent))}.ttl-rl-bar.err{background:var(--error)}.ttl-rl-bar.ab{background:var(--warn)}.ttl-rl-bar.selected{outline:2px solid var(--accent-fg);outline-offset:1px;z-index:2}.ttl-rl-bar-inner{display:flex;align-items:center;gap:6px;font-family:var(--mono);font-size:9.5px;font-weight:700;color:#0a0b0d;white-space:nowrap;pointer-events:none}.ttl-rl-bar-steps{opacity:.75;font-weight:600}.ttl-rl-meta{font-family:var(--mono);font-size:10px;color:var(--fg-faint);white-space:nowrap}.ttl-legend{display:flex;gap:14px;flex-wrap:wrap;padding:8px 0 0;border-top:1px solid var(--border);font-family:var(--mono);font-size:10px;color:var(--fg-faint)}.ttl-legend span{display:inline-flex;align-items:center;gap:6px}.ttl-legend .dot{width:10px;height:10px;border-radius:2px}.ttl-legend .dot.orch{background:var(--accent)}.ttl-legend .dot.sub{background:var(--subagent)}.ttl-legend .dot.err{background:var(--error)}.ttl-legend .dot.ab{background:var(--warn)}.run-row{background:var(--bg-1);border:1px solid var(--border);border-radius:var(--radius-md);padding:10px 12px;cursor:pointer;transition:border-color .1s,background .1s}.run-row:hover{border-color:var(--border-strong);background:var(--bg-2)}.run-row.selected{border-color:var(--accent);box-shadow:0 0 0 2px var(--accent-soft)}.run-row.errored{border-color:#fa686366}.run-row.aborted{border-color:#e3ad4b66}.run-row-head{display:flex;align-items:center;gap:8px;margin-bottom:4px}.run-row-idx{font-family:var(--mono);font-size:11px;color:var(--fg-faint);background:var(--bg-3);border:1px solid var(--border);padding:1px 6px;border-radius:4px;flex-shrink:0}.run-row-title{font-size:12.5px;color:var(--fg);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1}.run-row-meta{display:flex;gap:6px;align-items:center;font-family:var(--mono);font-size:10.5px;color:var(--fg-faint)}.run-row-meta .sep{opacity:.5}.details{display:grid;grid-template-rows:auto 1fr;min-height:0;background:var(--bg-0);overflow:hidden}.details.empty{display:grid;place-items:center;background:var(--bg-0)}.details-head{padding:12px 18px;border-bottom:1px solid var(--border);background:var(--bg-1);min-height:78px;display:grid;gap:6px;align-content:center}.d-kind{display:flex;align-items:center;gap:6px;font-size:13px;font-weight:600;white-space:nowrap}.d-bread{margin-top:4px;display:flex;align-items:center;gap:4px;font-family:var(--mono);font-size:11px;color:var(--fg-faint);white-space:nowrap;overflow:hidden}.d-bread>*{flex-shrink:0}.d-bread .d-bread-item:first-child{flex-shrink:1;overflow:hidden;text-overflow:ellipsis;min-width:0}.d-bread svg{color:var(--fg-faint)}.d-bread-item.mono{color:var(--fg-dim)}.details-scroll{overflow-y:auto;padding:14px 18px 60px;display:grid;gap:12px}.d-section{background:var(--bg-1);border:1px solid var(--border);border-radius:var(--radius-md);padding:12px 14px}.d-section-head{display:flex;align-items:center;gap:6px;font-family:var(--mono);font-size:10.5px;letter-spacing:.06em;text-transform:uppercase;color:var(--fg-faint);margin-bottom:10px;min-width:0}.d-section-head .model-badge{text-transform:none;letter-spacing:0;margin-left:auto}.d-section-head svg{color:var(--fg-faint);flex-shrink:0}.d-section-head .d-small{overflow:hidden;text-overflow:ellipsis;min-width:0;white-space:nowrap}.d-section-head .d-small .copy-btn{flex-shrink:0}.d-quote{font-size:14px;line-height:1.55;color:var(--fg);padding-left:10px;border-left:2px solid var(--accent);white-space:pre-wrap}.d-prose{font-size:13px;line-height:1.6;color:var(--fg)}.d-prose.d-reasoning{color:var(--fg-muted);font-style:italic}.d-kv{display:flex;gap:8px;align-items:baseline;margin-bottom:8px;font-size:12px}.d-kv .k{color:var(--fg-faint);font-family:var(--mono);font-size:10px;text-transform:uppercase;letter-spacing:.06em;width:60px}.d-kv .v{color:var(--fg)}.d-kv .v.mono{font-family:var(--mono);font-size:12px}.d-sub-label{font-family:var(--mono);font-size:10px;text-transform:uppercase;letter-spacing:.06em;color:var(--fg-faint);margin-bottom:4px}.d-grid{display:grid;grid-template-columns:1fr 1fr;gap:6px 14px;font-family:var(--mono);font-size:11.5px}.d-grid>div{display:flex;justify-content:space-between;padding:2px 0;border-bottom:1px dashed var(--border-subtle)}.d-grid .k{color:var(--fg-faint)}.d-grid .v{color:var(--fg)}.d-jump{margin-top:10px;display:inline-flex}.d-note{font-size:11.5px;color:var(--fg-faint);font-style:italic;padding:6px 0}.d-pre{font-family:var(--mono);font-size:12px;background:var(--bg-4);border:1px solid var(--border);border-radius:var(--radius-sm);padding:10px 12px;white-space:pre-wrap;color:var(--fg);max-height:360px;overflow-y:auto;margin:0}.d-small{font-family:var(--mono);font-size:10.5px;color:var(--fg-muted);display:inline-flex;align-items:center}.d-small-btn{background:var(--bg-3);border:1px solid var(--border);color:var(--fg-dim);font-family:var(--mono);font-size:10px;padding:1px 6px;border-radius:3px;cursor:pointer}.d-small-btn:hover{color:var(--fg);border-color:var(--border-strong)}.d-prompt{margin-top:8px}.run-detail-embedded{display:grid;grid-template-rows:auto 1fr}.run-detail-embedded .detail-head{padding:12px 16px;background:var(--bg-1)}.run-detail-embedded .detail-title{font-size:13.5px}.run-detail-embedded .stat-row{gap:10px}.run-detail-embedded .steps-scroll{padding:12px 14px 60px}.run-detail-embedded .step-summary{padding:8px 10px;gap:8px}.run-detail-embedded .timeline{padding:12px 14px 60px}.run-detail-embedded .tl-head,.run-detail-embedded .tl-row{grid-template-columns:140px 1fr}.run-detail-embedded .step-summary-aside{display:none}.main{min-height:0;display:grid;grid-template-rows:auto 1fr;background:var(--bg-0)}.empty{display:grid;place-items:center;height:100%}.empty-card{max-width:480px;padding:32px;text-align:center}.empty-card h2{margin:0 0 6px;font-size:16px;font-weight:600;color:var(--fg)}.empty-card p{margin:0;color:var(--fg-dim);font-size:13px}.empty-card .install{margin-top:18px;text-align:left;background:var(--bg-1);border:1px solid var(--border);border-radius:var(--radius-md);padding:10px 12px;font-family:var(--mono);font-size:12px;color:var(--fg-muted)}.empty-card .install .c{color:var(--accent-fg)}.empty-card .install .d{color:var(--fg-faint)}.detail-head{padding:16px 24px 14px;border-bottom:1px solid var(--border);background:var(--bg-1);display:grid;gap:8px}.detail-title-row{display:flex;align-items:flex-start;gap:12px;justify-content:space-between}.detail-title{font-size:16px;font-weight:600;color:var(--fg);line-height:1.4;flex:1;text-wrap:pretty}.detail-title .quote{color:var(--fg-muted);font-weight:500}.detail-id{font-family:var(--mono);font-size:11px;color:var(--fg-faint);display:inline-flex;align-items:center;gap:6px}.detail-id .copy-btn{color:var(--fg-faint);cursor:pointer;padding:2px;border-radius:3px}.detail-id .copy-btn:hover{color:var(--fg);background:var(--bg-3)}.stat-row{display:flex;gap:18px;flex-wrap:wrap;align-items:center}.stat{display:inline-flex;align-items:center;gap:6px;font-family:var(--mono);font-size:11.5px;color:var(--fg-muted);white-space:nowrap}.stat .l{color:var(--fg-faint)}.stat .v{color:var(--fg)}.stat svg{color:var(--fg-faint)}.pill-row{display:flex;gap:6px;flex-wrap:wrap}.pill{font-family:var(--mono);font-size:11px;padding:2px 8px;border-radius:999px;background:var(--bg-2);border:1px solid var(--border);color:var(--fg-muted);display:inline-flex;gap:4px}.pill .k{color:var(--fg-faint)}.pill .v{color:var(--fg)}.state-chip{display:inline-flex;align-items:center;gap:6px;font-size:11px;font-family:var(--mono);padding:2px 9px;border-radius:999px;border:1px solid var(--border);color:var(--fg-muted);background:var(--bg-2);text-transform:uppercase;letter-spacing:.04em}.state-chip .d{display:none}.state-chip.ok{color:var(--ok);border-color:#65c28159;background:var(--ok-soft)}.state-chip.err{color:var(--error);border-color:#fa686359;background:var(--error-soft)}.state-chip.warn{color:var(--warn);border-color:#e3ad4b59;background:var(--warn-soft)}.state-chip.running{color:var(--accent-fg);border-color:#5da7ff66;border-color:oklch(.72 .16 254 / .4);background:var(--accent-soft)}.steps-scroll{overflow-y:auto;padding:18px 24px 80px}.step{position:relative}.step+.step{margin-top:4px}.step-num{width:22px;height:22px;border-radius:6px;background:var(--bg-3);border:1px solid var(--border);color:var(--fg-muted);font-family:var(--mono);font-size:11px;display:grid;place-items:center;flex-shrink:0}.step.subagent .step-num{border-color:#17d0d880;color:var(--subagent);background:var(--subagent-soft)}.step.errored .step-num{border-color:#fa686380;color:var(--error);background:var(--error-soft)}.step.aborted .step-num{border-color:#e3ad4b80;color:var(--warn);background:var(--warn-soft)}.step-card{background:var(--bg-1);border:1px solid var(--border);border-radius:var(--radius-md);overflow:hidden;transition:border-color .1s ease}.step-card:hover{border-color:var(--border-strong)}.step.errored .step-card{border-color:#fa686359}.step-summary{display:grid;grid-template-columns:auto auto 1fr auto;gap:10px;align-items:center;padding:9px 12px;cursor:pointer;-webkit-user-select:none;user-select:none}.step-summary:hover{background:var(--bg-2)}.step.subagent .step-card{background:linear-gradient(90deg,oklch(.78 .13 200 / .06) 0%,var(--bg-1) 220px);border-left:2px solid oklch(.78 .13 200 / .5)}.chev{width:14px;height:14px;color:var(--fg-faint);transition:transform .12s ease;flex-shrink:0}.step.open .chev{transform:rotate(90deg)}.step-summary-main{display:flex;align-items:center;gap:10px;min-width:0}.fn-badge{font-family:var(--mono);font-size:10.5px;color:var(--fg-muted);background:var(--bg-3);border:1px solid var(--border);padding:1px 6px;border-radius:4px;white-space:nowrap}.fn-badge.subagent{color:var(--subagent);background:var(--subagent-soft);border-color:#17d0d84d}.model-badge{font-family:var(--mono);font-size:11px;color:var(--fg-muted);display:inline-flex;align-items:center;gap:5px;flex-shrink:0;white-space:nowrap}.model-badge .dot{display:none}.snip{font-size:12px;color:var(--fg-dim);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-family:var(--sans);min-width:0}.snip .arrow{color:var(--fg-faint);margin:0 4px}.snip .out{color:var(--fg-muted)}.snip .tag{color:var(--tool);font-family:var(--mono);font-size:11px}.snip .tag.text{color:var(--text-out)}.snip .tag.reason{color:var(--reasoning)}.step-summary-aside{display:flex;align-items:center;gap:12px;font-family:var(--mono);font-size:11px;color:var(--fg-faint);flex-shrink:0}.step-summary-aside .v{color:var(--fg-muted)}.step-body{border-top:1px solid var(--border);display:grid;grid-template-columns:1fr 1fr;gap:0}.step-pane{padding:14px;min-width:0}.step-pane+.step-pane{border-left:1px solid var(--border)}.pane-head{display:flex;align-items:center;justify-content:space-between;font-family:var(--mono);font-size:10.5px;letter-spacing:.08em;text-transform:uppercase;color:var(--fg-faint);margin-bottom:10px}.pane-head .actions{display:flex;gap:4px}.pane-head .actions button{color:var(--fg-faint);background:transparent;border:0;font:inherit;cursor:pointer;padding:2px 4px;border-radius:3px}.pane-head .actions button:hover{color:var(--fg);background:var(--bg-3)}.msg{border-radius:var(--radius);background:var(--bg-2);border:1px solid var(--border);padding:8px 10px;margin-bottom:6px;font-size:12.5px}.msg.system{background:#23262c66}.msg-role{font-family:var(--mono);font-size:10px;letter-spacing:.08em;color:var(--fg-faint);text-transform:uppercase;margin-bottom:4px;display:flex;align-items:center;gap:6px}.msg-content{font-family:var(--sans);color:var(--fg);line-height:1.5;white-space:pre-wrap;word-break:break-word}.msg.system .msg-content{color:var(--fg-muted);font-size:12px}.part{background:var(--bg-2);border:1px solid var(--border);border-radius:var(--radius);margin-bottom:6px;overflow:hidden}.part-head{display:flex;align-items:center;gap:8px;padding:7px 10px;cursor:pointer;font-family:var(--mono);font-size:10.5px;letter-spacing:.06em;text-transform:uppercase}.part-head .ico{width:12px;height:12px}.part-head .name{color:var(--fg);font-weight:500}.part-head .tail{margin-left:auto;font-family:var(--mono);font-size:10px;color:var(--fg-faint);text-transform:none;letter-spacing:0}.part-head .chev{width:11px;height:11px;color:var(--fg-faint)}.part.tool-call .part-head{background:#c28efb14;color:var(--tool);border-bottom:1px solid oklch(.74 .16 305 / .15)}.part.tool-result .part-head{background:#49d3a112;color:var(--text-out);border-bottom:1px solid oklch(.78 .14 165 / .15)}.part.reasoning .part-head{background:#f0ba5912;color:var(--reasoning);border-bottom:1px solid oklch(.82 .13 80 / .18)}.part.text-out .part-head{background:#49d3a10f;color:var(--text-out);border-bottom:1px solid oklch(.78 .14 165 / .15)}.part.collapsed .part-head{border-bottom:0}.part-body{padding:10px 12px;font-size:12.5px;color:var(--fg)}.part-body .reasoning-text{color:var(--fg-muted);font-style:italic;line-height:1.6;white-space:pre-wrap}.tool-call-id{font-family:var(--mono);font-size:10px;padding:1px 5px;border-radius:3px;background:#c28efb24;color:#d5b1ff;color:oklch(.82 .14 305);cursor:pointer;border:1px solid transparent}.tool-call-id.matched{background:#49d3a129;color:#70e9b9}.tool-call-id:hover{border-color:currentColor}.tool-call-id.highlight{outline:2px solid var(--accent);outline-offset:1px}.json{font-family:var(--mono);font-size:11.5px;color:var(--fg);background:var(--bg-4);border-radius:var(--radius-sm);padding:8px 10px;white-space:pre;overflow-x:auto;line-height:1.55;max-height:360px;overflow-y:auto}.json .k{color:#83bbff;color:oklch(.78 .13 254)}.json .s{color:#7fdc9a}.json .n{color:#f0ba59}.json .b{color:#cc9fff;color:oklch(.78 .16 305)}.json .nu,.json .p{color:var(--fg-faint)}.md{font-size:13px;line-height:1.6;color:var(--fg)}.md p{margin:0 0 8px}.md p:last-child{margin-bottom:0}.md strong{color:var(--fg);font-weight:600}.md em{color:var(--fg-muted)}.md code{font-family:var(--mono);font-size:12px;background:var(--bg-4);border:1px solid var(--border);padding:0 5px;border-radius:3px;color:#f0ba59}.md pre{font-family:var(--mono);font-size:12px;background:var(--bg-4);border:1px solid var(--border);border-radius:var(--radius-sm);padding:10px 12px;margin:8px 0;overflow-x:auto;color:var(--fg);line-height:1.55}.md pre code{background:transparent;border:0;padding:0;color:inherit}.md ul,.md ol{margin:0 0 8px 18px;padding:0}.md li{margin-bottom:2px}.md h2,.md h3{margin:8px 0 6px;font-size:14px;font-weight:600}.stream-cursor{display:inline-block;width:7px;height:14px;background:var(--accent);margin-left:2px;vertical-align:text-bottom;animation:blink 1s steps(2,end) infinite}@keyframes blink{50%{opacity:0}}.usage-grid{display:grid;grid-template-columns:1fr 1fr;gap:8px}.usage-card{background:var(--bg-2);border:1px solid var(--border);border-radius:var(--radius);padding:10px 12px}.usage-card .l{font-family:var(--mono);font-size:10px;text-transform:uppercase;letter-spacing:.08em;color:var(--fg-faint)}.usage-card .v{font-family:var(--mono);font-size:18px;color:var(--fg);margin-top:4px}.usage-card .bd{margin-top:6px;font-family:var(--mono);font-size:10.5px;color:var(--fg-dim);display:flex;flex-direction:column;gap:2px}.error-pane{margin-top:8px;border:1px solid oklch(.7 .18 25 / .35);background:var(--error-soft);border-radius:var(--radius);padding:10px 12px;display:flex;gap:10px;align-items:flex-start;color:var(--error);font-family:var(--mono);font-size:12px}.error-pane.warn{border-color:#e3ad4b59;background:var(--warn-soft);color:var(--warn)}.error-pane svg{flex-shrink:0;margin-top:1px}.step-tabs{display:flex;gap:0;border-bottom:1px solid var(--border);padding:0 12px;background:var(--bg-1)}.step-tabs button{background:transparent;border:0;font-family:var(--sans);font-size:11.5px;color:var(--fg-dim);padding:8px 12px;cursor:pointer;position:relative;display:inline-flex;align-items:center;gap:6px;border-bottom:2px solid transparent;margin-bottom:-1px}.step-tabs button:hover{color:var(--fg)}.step-tabs button.active{color:var(--fg);border-bottom-color:var(--accent)}.step-tabs button .ct{font-family:var(--mono);font-size:10px;color:var(--fg-faint);background:var(--bg-3);padding:0 5px;border-radius:999px}.step-single{padding:14px}*::-webkit-scrollbar{width:10px;height:10px}*::-webkit-scrollbar-track{background:transparent}*::-webkit-scrollbar-thumb{background:#ffffff0f;border-radius:999px;border:2px solid transparent;background-clip:padding-box}*::-webkit-scrollbar-thumb:hover{background:#ffffff1f;border:2px solid transparent;background-clip:padding-box}.timeline{padding:16px 24px 80px;overflow-y:auto}.tl-head{display:grid;grid-template-columns:200px 1fr;gap:12px;position:sticky;top:0;background:var(--bg-0);z-index:2;padding-bottom:8px;border-bottom:1px solid var(--border)}.tl-axis{position:relative;height:22px}.tl-tick{position:absolute;top:0;font-family:var(--mono);font-size:10px;color:var(--fg-faint);padding-left:4px;border-left:1px solid var(--border);height:22px}.tl-rows{display:grid;gap:6px;padding-top:12px}.tl-row{display:grid;grid-template-columns:200px 1fr;gap:12px;align-items:center;min-height:32px}.tl-label{font-size:12px;color:var(--fg-muted);display:flex;align-items:center;gap:8px;min-width:0}.tl-label .step-num{width:22px;height:22px;font-size:10.5px}.tl-label .nm{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-family:var(--mono);font-size:11px}.tl-track{position:relative;height:28px;background:linear-gradient(90deg,var(--border-subtle) 1px,transparent 1px) 0 0 / 10% 100% repeat-x,var(--bg-1);border-radius:var(--radius-sm);border:1px solid var(--border)}.tl-bar{position:absolute;top:4px;bottom:4px;border-radius:3px;background:var(--accent);border:1px solid oklch(1 0 0 / .1);cursor:pointer;transition:filter .1s ease}.tl-bar:hover{filter:brightness(1.15)}.tl-bar.subagent{background:var(--subagent)}.tl-bar.errored{background:var(--error)}.tl-bar.aborted{background:var(--warn)}.tl-bar.running{background:linear-gradient(90deg,var(--accent),oklch(.72 .16 254 / .3));animation:shimmer 2s ease-in-out infinite}@keyframes shimmer{0%,to{opacity:.95}50%{opacity:.6}}.tl-bar-label{position:absolute;left:6px;top:50%;transform:translateY(-50%);font-family:var(--mono);font-size:10px;color:#0a0b0d;white-space:nowrap;pointer-events:none;font-weight:600;letter-spacing:.02em}.tweaks-anchor{position:fixed;bottom:16px;right:16px;z-index:50}.chat-scroll{overflow-y:auto;padding:18px 24px 80px}.chat-inner{max-width:820px;margin:0 auto;display:grid;gap:14px}.chat-turn{display:grid;gap:6px}.chat-bubble{border-radius:10px;padding:10px 14px;background:var(--bg-1);border:1px solid var(--border);font-size:13px;line-height:1.55;max-width:92%}.chat-bubble.user{justify-self:end;background:var(--accent-soft);border-color:#5da7ff59;border-color:oklch(.72 .16 254 / .35);color:var(--fg);max-width:72%}.chat-bubble.assistant{justify-self:start;background:var(--bg-1);width:100%}.chat-bubble.assistant.error{border-color:#fa68634d}.chat-bubble.assistant.aborted{border-color:#e3ad4b4d}.bubble-meta{display:flex;align-items:center;gap:6px;font-family:var(--mono);font-size:10.5px;color:var(--fg-faint);margin-bottom:6px;flex-wrap:wrap}.bubble-meta>*{white-space:nowrap}.bubble-meta .sep{opacity:.55}.bubble-meta .model-extra{color:var(--fg-dim);background:var(--bg-3);padding:0 5px;border-radius:999px;font-size:10px}.chat-bubble.user .bubble-meta{color:#83bbff;color:oklch(.78 .13 254)}.bubble-body{color:var(--fg)}.bubble-body .md{font-size:13px}.bubble-empty{color:var(--fg-faint);font-style:italic;font-size:12.5px;display:inline-flex;align-items:center;gap:6px}.bubble-empty.err{color:var(--error);font-style:normal}.bubble-foot{margin-top:10px;padding-top:8px;border-top:1px dashed var(--border);display:flex;align-items:center;gap:6px;font-family:var(--mono);font-size:10.5px;color:var(--fg-faint);cursor:pointer;-webkit-user-select:none;user-select:none}.bubble-foot:hover{color:var(--fg-muted)}.bubble-foot .run-id-chip{margin-left:auto;font-size:10px;color:var(--fg-faint);background:var(--bg-3);border:1px solid var(--border);padding:0 6px;border-radius:999px}.inline-steps{margin-top:12px;padding-top:12px;border-top:1px solid var(--border);display:grid;gap:4px}.thread-run{background:var(--bg-1);border:1px solid var(--border);border-radius:var(--radius-md);margin-bottom:6px}.thread-run:hover,.thread-run.open{border-color:var(--border-strong)}.thread-run.errored{border-color:#fa68634d}.thread-run-head{display:grid;grid-template-columns:auto auto 1fr auto;gap:10px;align-items:center;padding:10px 14px;cursor:pointer;-webkit-user-select:none;user-select:none}.thread-run-head .chev{color:var(--fg-faint);transition:transform .12s ease}.thread-run.open .thread-run-head .chev{transform:rotate(90deg)}.thread-run-title{font-size:12.5px;color:var(--fg);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.thread-run-aside{display:flex;gap:14px;font-family:var(--mono);font-size:11px;color:var(--fg-faint)}.thread-run .inline-steps{margin:0;padding:12px 14px;border-top:1px solid var(--border)}.kbd-inline{font-family:var(--mono);font-size:10.5px;background:var(--bg-3);border:1px solid var(--border-strong);border-radius:3px;padding:0 4px;color:var(--fg-muted)}.dialog-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;background:#00000080;display:grid;place-items:center;z-index:100;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}.dialog{background:var(--bg-1);border:1px solid var(--border-strong);border-radius:var(--radius-lg);padding:20px;width:380px;box-shadow:0 16px 40px #00000080}.dialog h3{margin:0 0 6px;font-size:14px;font-weight:600}.dialog p{margin:0 0 16px;color:var(--fg-muted);font-size:13px}.dialog .actions{display:flex;justify-content:flex-end;gap:8px}.btn.primary{background:var(--accent);color:#0f1216;border-color:var(--accent);font-weight:500}.btn.primary:hover{background:#77b4ff;background:oklch(.76 .16 254)}.btn.dangerous{background:var(--error);color:#0f1216;border-color:var(--error);font-weight:500}.btn.dangerous:hover{background:#ff7e77;background:oklch(.74 .18 25)}.app.dense .run-card{padding:7px 10px 7px 6px}.app.dense .step+.step{margin-top:2px}.app.dense .steps-scroll{padding:12px 18px 60px}.app.dense .detail-head{padding:12px 18px}.sidebar-load-more{display:block;width:calc(100% - 16px);margin:8px;padding:8px 10px;font-family:var(--mono);font-size:11px;color:var(--fg-muted);background:var(--bg-2);border:1px dashed var(--border);border-radius:6px;cursor:pointer;text-align:center;letter-spacing:.04em;text-transform:uppercase}.sidebar-load-more:hover:not(:disabled){border-style:solid;border-color:var(--border-strong);color:var(--fg)}.sidebar-load-more:disabled{opacity:.5;cursor:progress}.cm.subagent{border-left:2px solid var(--subagent)}.cm.subagent .cm-meta{color:var(--subagent)}.sub-badge{font-family:var(--mono);font-size:9px;padding:0 5px;border-radius:3px;background:var(--subagent-soft);color:var(--subagent);letter-spacing:.04em;text-transform:uppercase}.run-row-compact.subagent .rrc-idx{background:var(--subagent-soft);color:var(--subagent);border-color:#17d0d880}.run-row-compact.subagent .rrc-title{color:var(--subagent)}.ttl-rl-idx.subagent{background:var(--subagent-soft);color:var(--subagent);border-color:#17d0d880}.ttl-rl-bar.subagent{background:var(--subagent-soft);border-color:var(--subagent)}.ttl-rl-bar.subagent .ttl-rl-bar-dur,.ttl-rl-bar.subagent .ttl-rl-bar-steps{color:var(--subagent)}
|
package/dist/client/index.html
CHANGED
|
@@ -3,15 +3,15 @@
|
|
|
3
3
|
<head>
|
|
4
4
|
<meta charset="UTF-8" />
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
-
<title>ailog</title>
|
|
6
|
+
<title>ailog — LLM viewer</title>
|
|
7
7
|
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
|
8
8
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
|
9
9
|
<link
|
|
10
|
-
href="https://fonts.googleapis.com/css2?family=
|
|
10
|
+
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap"
|
|
11
11
|
rel="stylesheet"
|
|
12
12
|
/>
|
|
13
|
-
<script type="module" crossorigin src="/assets/index-
|
|
14
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
13
|
+
<script type="module" crossorigin src="/assets/index-BBTm7Mxn.js"></script>
|
|
14
|
+
<link rel="stylesheet" crossorigin href="/assets/index-x-B7u97h.css">
|
|
15
15
|
</head>
|
|
16
16
|
<body>
|
|
17
17
|
<div id="root"></div>
|
package/dist/index.d.ts
CHANGED
|
@@ -1,69 +1,53 @@
|
|
|
1
1
|
import { LanguageModelV4Middleware } from '@ai-sdk/provider';
|
|
2
2
|
|
|
3
3
|
interface AiSdkMiddlewareOptions {
|
|
4
|
-
/**
|
|
5
|
-
* Optional run id. If provided, every step recorded by this middleware
|
|
6
|
-
* instance is appended to the run with this id. Multiple middleware /
|
|
7
|
-
* `createLogger` instances that share the same `runId` will write into
|
|
8
|
-
* the same run — that's how an orchestrator and its subagents end up
|
|
9
|
-
* grouped together. Auto-generated when omitted.
|
|
10
|
-
*/
|
|
11
|
-
runId?: string;
|
|
12
|
-
/**
|
|
13
|
-
* Caller-supplied metadata stored on the run (e.g. `userId`,
|
|
14
|
-
* `organizationId`). Honored only when the run is created (first
|
|
15
|
-
* writer wins). Ignored when reusing an existing `runId`.
|
|
16
|
-
*/
|
|
17
|
-
metadata?: Record<string, unknown> | null;
|
|
18
4
|
/**
|
|
19
5
|
* Optional label stored on the run, surfaced as `function_id` in the
|
|
20
6
|
* viewer. Honored only when the run is created (first writer wins).
|
|
21
7
|
*/
|
|
22
8
|
functionId?: string;
|
|
23
9
|
/**
|
|
24
|
-
* Optional thread id. When provided,
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
10
|
+
* Optional thread id. When provided, every run produced by this
|
|
11
|
+
* middleware instance is tagged with this thread, so orchestrator and
|
|
12
|
+
* subagent runs that share the same `threadId` show up side-by-side
|
|
13
|
+
* under one Thread in the viewer. **If omitted**, an `auto-<short>`
|
|
14
|
+
* thread is generated for each run.
|
|
28
15
|
*/
|
|
29
16
|
threadId?: string;
|
|
17
|
+
/**
|
|
18
|
+
* Caller-supplied metadata stored on the **Thread** (e.g. `userId`,
|
|
19
|
+
* `organizationId`, `topic`, `persona`). First-writer-wins: only the
|
|
20
|
+
* call that creates the Thread record sets this; subsequent runs
|
|
21
|
+
* joining the same thread can't change it.
|
|
22
|
+
*/
|
|
23
|
+
metadata?: Record<string, unknown> | null;
|
|
30
24
|
}
|
|
31
25
|
/**
|
|
32
26
|
* AI SDK `LanguageModelV4Middleware` that records every `generateText`
|
|
33
27
|
* / `streamText` call to ailog.
|
|
34
28
|
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
29
|
+
* Each middleware instance owns one Run. Within a single `generateText`
|
|
30
|
+
* invocation (incl. multi-step tool-calling) every step lands in that
|
|
31
|
+
* Run. To group multiple Runs (e.g. orchestrator + subagent calls that
|
|
32
|
+
* each construct their own wrapped model), share a `threadId`:
|
|
39
33
|
*
|
|
40
34
|
* ```ts
|
|
41
|
-
* import {
|
|
42
|
-
*
|
|
43
|
-
* const runId = generateRunId();
|
|
35
|
+
* import { aiSdkMiddleware } from '@ailog/cli';
|
|
44
36
|
*
|
|
45
37
|
* const orchestrator = wrapLanguageModel({
|
|
46
|
-
* middleware: aiSdkMiddleware({
|
|
38
|
+
* middleware: aiSdkMiddleware({ threadId: 'tokyo', functionId: 'plan-trip' }),
|
|
47
39
|
* model,
|
|
48
40
|
* });
|
|
49
41
|
*
|
|
50
|
-
* // Inside a tool's execute callback,
|
|
42
|
+
* // Inside a tool's execute callback — share the threadId, not the run:
|
|
51
43
|
* const subagent = wrapLanguageModel({
|
|
52
|
-
* middleware: aiSdkMiddleware({
|
|
44
|
+
* middleware: aiSdkMiddleware({ threadId: 'tokyo' }),
|
|
53
45
|
* model,
|
|
54
46
|
* });
|
|
55
47
|
* ```
|
|
56
48
|
*/
|
|
57
49
|
declare const aiSdkMiddleware: (options?: AiSdkMiddlewareOptions) => LanguageModelV4Middleware;
|
|
58
50
|
|
|
59
|
-
/**
|
|
60
|
-
* Generate a fresh runId. Callers can pre-generate one with this helper
|
|
61
|
-
* and pass the same value to multiple `aiSdkMiddleware({ runId })` /
|
|
62
|
-
* `createLogger({ runId })` instances to make them write into the same
|
|
63
|
-
* run (orchestrator + subagents share one run).
|
|
64
|
-
*/
|
|
65
|
-
declare const generateRunId: () => string;
|
|
66
|
-
|
|
67
51
|
interface StartStepInput {
|
|
68
52
|
type?: 'generate' | 'stream';
|
|
69
53
|
modelId: string;
|
|
@@ -88,38 +72,32 @@ interface RunHandle {
|
|
|
88
72
|
step(input: StartStepInput): Promise<StepHandle>;
|
|
89
73
|
}
|
|
90
74
|
interface CreateLoggerOptions {
|
|
91
|
-
/**
|
|
92
|
-
* Reuse an existing run by id. When provided, every step created
|
|
93
|
-
* through this logger is appended to that run (orchestrator and
|
|
94
|
-
* subagents pass the same `runId` to group their calls together).
|
|
95
|
-
* Auto-generated when omitted.
|
|
96
|
-
*/
|
|
97
|
-
runId?: string;
|
|
98
75
|
/**
|
|
99
76
|
* Run label shown in the viewer. Honored only when the run is being
|
|
100
77
|
* created (first writer wins).
|
|
101
78
|
*/
|
|
102
79
|
functionId?: string;
|
|
103
|
-
/**
|
|
104
|
-
* Metadata stored on the run. Honored only when the run is being
|
|
105
|
-
* created; ignored when reusing an existing `runId`.
|
|
106
|
-
*/
|
|
107
|
-
metadata?: Record<string, unknown> | null;
|
|
108
80
|
/**
|
|
109
81
|
* Optional thread id. When provided, the run is tagged with this id
|
|
110
|
-
* and a `Thread` record is created or updated
|
|
111
|
-
*
|
|
112
|
-
*
|
|
113
|
-
*
|
|
82
|
+
* and a `Thread` record is created or updated. **If omitted**, an
|
|
83
|
+
* `auto-<short>` thread is generated. Two loggers that share a
|
|
84
|
+
* `threadId` create two distinct Runs that show up side-by-side in
|
|
85
|
+
* the same Thread (run-level merging across loggers is intentionally
|
|
86
|
+
* not supported — share a Thread, not a Run).
|
|
114
87
|
*/
|
|
115
88
|
threadId?: string;
|
|
89
|
+
/**
|
|
90
|
+
* Caller-supplied metadata stored on the **Thread** (e.g. `userId`,
|
|
91
|
+
* `topic`, `persona`). First-writer-wins — only the call that
|
|
92
|
+
* actually creates the Thread record sets this.
|
|
93
|
+
*/
|
|
94
|
+
metadata?: Record<string, unknown> | null;
|
|
116
95
|
}
|
|
117
96
|
/**
|
|
118
97
|
* Provider-agnostic logger. Use this to record LLM calls from any SDK
|
|
119
|
-
* or provider, not just the Vercel AI SDK. Each
|
|
120
|
-
*
|
|
121
|
-
*
|
|
122
|
-
* can share one run.
|
|
98
|
+
* or provider, not just the Vercel AI SDK. Each `createLogger()` call
|
|
99
|
+
* creates a fresh Run; pass a shared `threadId` to group several Runs
|
|
100
|
+
* (orchestrator + subagent loggers) under one Thread in the viewer.
|
|
123
101
|
*
|
|
124
102
|
* ```ts
|
|
125
103
|
* import { createLogger } from '@ailog/cli';
|
|
@@ -141,4 +119,4 @@ interface CreateLoggerOptions {
|
|
|
141
119
|
*/
|
|
142
120
|
declare function createLogger(options?: CreateLoggerOptions): Promise<RunHandle>;
|
|
143
121
|
|
|
144
|
-
export { aiSdkMiddleware, createLogger
|
|
122
|
+
export { aiSdkMiddleware, createLogger };
|