@evandu/super-pi 0.1.31 → 0.1.32
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 +2 -2
- package/dist/client/assets/index-BBfRhf7h.js +50 -0
- package/dist/client/assets/index-sZQBUBuS.css +1 -0
- package/dist/client/index.html +2 -2
- package/dist/server/application/run-service.js +54 -11
- package/dist/server/http-server.js +19 -0
- package/dist/server/model-filter.js +3 -2
- package/dist/server/runtime.js +29 -4
- package/dist/server/terminal.d.ts +1 -2
- package/dist/server/terminal.js +2 -3
- package/dist/server/tool-calls.d.ts +21 -0
- package/dist/server/tool-calls.js +40 -0
- package/dist/server/types.d.ts +8 -1
- package/package.json +3 -2
- package/dist/client/assets/index-BVsQMo7-.css +0 -1
- package/dist/client/assets/index-Bv8kBXop.js +0 -50
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@import "https://fonts.googleapis.com/css2?family=DM+Mono:wght@400;500&family=Manrope:wght@400;500;600;700;800&display=swap";:root{--picker-drop:0px;--picker-nudge:0px;--sidebar-width:270px;--bg-app:#060709;--bg-panel:#11151c;--bg-elevated:#222935;--bg-raised:#1e242f;--bg-hover:#333c4d;--bg-input:#0c0e13;--bg-inset:#040507;--text-primary:#f4f5f6;--text-secondary:#caced3;--text-muted:#b5b9c0;--border-subtle:#1d2026;--border-default:#626b7a;--border-strong:#a0a7b0;--accent:#62d6da;--accent-hover:#84e8eb;--accent-contrast:#022021;--accent-bg:#153637;--accent-border:#317072;--selected:#b7bcc2;--selected-bg:#364254;--selected-border:#6a7fa0;--tab-active-bg:#334157;--danger:#f3afb4;--danger-bg:#220c0d;--danger-border:#68272b;--danger-contrast:#220c0d;--warning:#eead58;--warning-bg:#2a1e0f;--warning-border:#684c27;--success:#86dfa1;--info:#96b6ee;--overlay:#060709cc;--shadow:#000000a8;--shadow-faint:#0005;--focus-ring:#80ecef;--focus-ring-glow:#62d6da33;--scrollbar-thumb:#8b929c;--scrollbar-track:#040507;--scrollbar-thumb-active:#b8bcc1}[data-theme=midnight],[data-preview=midnight]{--bg-app:#060709;--bg-panel:#11151c;--bg-elevated:#222935;--bg-raised:#1e242f;--bg-hover:#333c4d;--bg-input:#0c0e13;--bg-inset:#040507;--text-primary:#f4f5f6;--text-secondary:#caced3;--text-muted:#b5b9c0;--border-subtle:#1d2026;--border-default:#626b7a;--border-strong:#a0a7b0;--accent:#62d6da;--accent-hover:#84e8eb;--accent-contrast:#022021;--accent-bg:#153637;--accent-border:#317072;--selected:#b7bcc2;--selected-bg:#364254;--selected-border:#6a7fa0;--tab-active-bg:#334157;--danger:#f3afb4;--danger-bg:#220c0d;--danger-border:#68272b;--danger-contrast:#220c0d;--warning:#eead58;--warning-bg:#2a1e0f;--warning-border:#684c27;--success:#86dfa1;--info:#96b6ee;--overlay:#060709cc;--shadow:#000000a8;--shadow-faint:#0005;--focus-ring:#80ecef;--focus-ring-glow:#62d6da33;--scrollbar-thumb:#8b929c;--scrollbar-track:#040507;--scrollbar-thumb-active:#b8bcc1}[data-theme=slate],[data-preview=slate]{--bg-app:#0f0f0f;--bg-panel:#141414;--bg-elevated:#232323;--bg-raised:#212121;--bg-hover:#2a2a2a;--bg-input:#121212;--bg-inset:#040404;--text-primary:#b8bcba;--text-secondary:#a2a7a4;--text-muted:#9ba09e;--border-subtle:#2e2e2e;--border-default:#747774;--border-strong:#b4b8b6;--accent:#d9c045;--accent-hover:#e8d368;--accent-contrast:#292305;--accent-bg:#342e14;--accent-border:#6d622c;--selected:#bcbfbd;--selected-bg:#3e4246;--selected-border:#838a91;--tab-active-bg:#3e4246;--danger:#e1989d;--danger-bg:#271112;--danger-border:#642b2f;--danger-contrast:#2b1214;--warning:#f89554;--warning-bg:#291a0f;--warning-border:#674128;--success:#72b692;--info:#9facbc;--overlay:#000000bf;--shadow:#000000b3;--shadow-faint:#00000070;--focus-ring:#edd86e;--focus-ring-glow:#d9c04533;--scrollbar-thumb:#8d908e;--scrollbar-track:#040404;--scrollbar-thumb-active:#b5b8b6}[data-theme=ocean],[data-preview=ocean]{--bg-app:#e2ecef;--bg-panel:#eff6f8;--bg-elevated:#f9fcfd;--bg-raised:#fff;--bg-hover:#d0dfe4;--bg-input:#d8e6ea;--bg-inset:#ccdade;--text-primary:#12232b;--text-secondary:#344751;--text-muted:#48555b;--border-subtle:#d1d8db;--border-default:#6e7e87;--border-strong:#394146;--accent:#0b5b60;--accent-hover:#07474b;--accent-contrast:#fff;--accent-bg:#daeff1;--accent-border:#8dcace;--selected:#38454c;--selected-bg:#729fb6;--selected-border:#4b748b;--tab-active-bg:#e1eef4;--danger:#91121a;--danger-bg:#f7dee0;--danger-border:#e2a2a6;--danger-contrast:#fff;--warning:#7c4c03;--warning-bg:#faead1;--warning-border:#deb77c;--success:#0a5230;--info:#0a3d8a;--overlay:#0f202999;--shadow:#0f20291f;--shadow-faint:#0f202914;--focus-ring:#07474b;--focus-ring-glow:#0b5b6022;--scrollbar-thumb:#47545c;--scrollbar-track:#b1babe;--scrollbar-thumb-active:#2e383e}[data-theme=dawn],[data-preview=dawn]{--bg-app:#f1ece4;--bg-panel:#f8f6f1;--bg-elevated:#fdfdfb;--bg-raised:#fefefd;--bg-hover:#e6e0d6;--bg-input:#ede7de;--bg-inset:#e1dbd0;--text-primary:#2e3238;--text-secondary:#4d535b;--text-muted:#525860;--border-subtle:#d3d6d9;--border-default:#7c838d;--border-strong:#4c5057;--accent:#211c87;--accent-hover:#171372;--accent-contrast:#fff;--accent-bg:#e3e2f3;--accent-border:#aaa7d2;--selected:#40474f;--selected-bg:#8b99a7;--selected-border:#56616c;--tab-active-bg:#fdfdfb;--danger:#9a131c;--danger-bg:#f8e2e4;--danger-border:#e3a6aa;--danger-contrast:#fff;--warning:#804c00;--warning-bg:#fceacf;--warning-border:#e0bc85;--success:#166437;--info:#124a82;--overlay:#2a262299;--shadow:#2a26221f;--shadow-faint:#2a262214;--focus-ring:#140f70;--focus-ring-glow:#211c8722;--scrollbar-thumb:#51565c;--scrollbar-track:#cbc8c2;--scrollbar-thumb-active:#34383d}.shell{background:radial-gradient(circle at 75% 5%,var(--bg-raised) 0,transparent 28rem),var(--bg-app);grid-template-rows:minmax(0,1fr);grid-template-columns:270px minmax(0,1fr);height:100dvh;display:grid;overflow:hidden}.message-revert{border:1px solid var(--border-default);color:var(--text-muted);cursor:pointer;opacity:.55;background:0 0;border-radius:6px;margin-left:12px;padding:2px 8px;font:11px Manrope;transition:opacity .12s,color .12s,border-color .12s}.message:hover .message-revert,.message-revert:focus-visible{opacity:1}.message-revert:hover{color:var(--text-primary);border-color:var(--border-strong)}@keyframes pulse{50%{opacity:.25}}@media (width<=700px){.shell{grid-template-rows:minmax(0,auto) minmax(254px,1fr);grid-template-columns:minmax(0,1fr)}aside{border-right:0;border-bottom:1px solid var(--border-subtle);min-height:0;padding:12px}.brand{padding:3px 8px 12px}.label,aside footer{display:none}nav{flex:0 auto;min-height:0;max-height:min(30vh,190px);display:grid;overflow:auto}.workspace-group{min-width:0}.chat{padding:0 17px}header{min-height:0;padding:14px 0;overflow:clip}form{margin-bottom:14px}.messages{padding:14px 0}.picker{padding:14px}.picker-list{height:min(320px,45vh)}}:root{color:var(--text-primary);background:var(--bg-app);font-family:Manrope,system-ui,sans-serif}*{box-sizing:border-box}body{min-width:320px;margin:0}.shell{grid-template-columns:var(--sidebar-width,270px) minmax(0,1fr) var(--rail-col,320px);--rail-col:var(--rail-width);background:radial-gradient(circle at 75% 5%,var(--bg-raised) 0,transparent 28rem),var(--bg-app);grid-template-rows:minmax(0,1fr);height:100dvh;display:grid;position:relative;overflow:hidden}aside{border-right:1px solid var(--border-subtle);background:var(--bg-panel);flex-direction:column;min-height:0;padding:20px 13px;display:flex}.brand{align-items:center;gap:10px;padding:3px 8px 24px;display:flex}.brand>span,.orb{background:linear-gradient(135deg,var(--selected),var(--info));width:34px;height:34px;color:var(--bg-app);border-radius:11px;place-items:center;font:700 25px Georgia;display:grid}.brand strong{letter-spacing:.14em;font-size:13px}.brand small,aside footer,aside footer span{color:var(--text-muted);margin-top:2px;font:11px DM Mono,monospace;display:block}.sidebar-actions{display:grid}.workspace-new{border:1px solid var(--border-default);color:var(--text-secondary);cursor:pointer;background:0 0;border-radius:10px;padding:10px 9px;font-size:12px}.empty button{background:var(--accent);color:var(--accent-contrast);cursor:pointer;border:0;border-radius:10px;padding:12px;font-weight:800}.label{text-transform:uppercase;letter-spacing:.13em;color:var(--text-muted);margin:27px 9px 9px;font:700 12px DM Mono,monospace}nav{flex:1;grid-template-columns:minmax(0,1fr);align-content:start;gap:7px;min-height:0;display:grid;overflow:auto}.workspace-group{border-bottom:1px solid var(--border-subtle);padding-bottom:7px}.workspace-header{align-items:center;gap:3px;display:flex}.workspace-toggle{min-width:0;color:var(--text-primary);text-align:left;cursor:pointer;background:0 0;border:0;flex:1;align-items:center;gap:7px;padding:8px 6px;display:flex}.workspace-toggle strong,.workspace-toggle small{text-overflow:ellipsis;white-space:nowrap;display:block;overflow:hidden}.workspace-toggle strong{font-size:12px}.workspace-toggle>span{min-width:0;overflow:hidden}.workspace-toggle small{color:var(--text-muted);margin-top:3px;font:10px DM Mono,monospace}.chevron{color:var(--text-muted);font-size:14px}.workspace-add,.workspace-settings,.workspace-delete{color:var(--text-muted);cursor:pointer;background:0 0;border:0;padding:5px;font-size:16px}.workspace-settings,.workspace-delete{font-size:13px}.conversation{color:var(--text-primary);text-align:left;cursor:pointer;background:0 0;border:0;border-radius:8px;justify-content:space-between;gap:8px;min-width:0;padding:8px 9px 8px 25px;font:500 12px Manrope;display:flex}.conversation small{color:var(--text-muted);flex:none;font:10px DM Mono,monospace}.conversation.selected{background:var(--bg-hover);color:var(--text-primary)}.conversation.selected small{color:var(--text-secondary)}.conversation-empty{color:var(--text-muted);text-overflow:ellipsis;white-space:nowrap;padding:7px 9px 7px 29px;font:700 11px DM Mono,monospace;overflow:hidden}aside footer{flex-direction:column;align-items:stretch;gap:8px;margin-top:auto;padding:20px 8px 3px;display:flex}aside footer .footer-status{border-bottom:1px solid var(--border-subtle);align-items:center;gap:7px;padding-bottom:9px;display:flex}aside footer .footer-status>span{margin-left:auto}.online,.offline{background:var(--success);border-radius:50%;width:7px;height:7px}.offline{background:var(--warning)}.chat{flex-direction:column;width:100%;max-width:1080px;min-height:0;margin:0 auto;padding:0 42px;display:flex}header{border-bottom:1px solid var(--border-subtle);flex-shrink:0;justify-content:space-between;align-items:center;padding:27px 0 23px;display:flex}h1{margin:0;font-size:19px}header p{color:var(--text-muted);margin:5px 0 0;font-size:12px}.badge{text-transform:uppercase;border:1px solid var(--border-default);color:var(--text-secondary);border-radius:99px;padding:6px 9px;font:11px DM Mono,monospace}.messages{flex:1;align-content:start;gap:26px;min-height:0;padding:32px 0;display:grid;overflow:auto}.message{grid-template-columns:34px minmax(0,1fr);gap:13px;display:grid}.avatar{background:var(--bg-raised);width:32px;height:32px;color:var(--text-primary);border-radius:50%;place-items:center;font:700 12px Manrope;display:grid}.assistant .avatar{background:var(--bg-elevated);color:var(--text-primary)}.meta{margin:2px 0 7px;font-size:12px;font-weight:700}.meta time{color:var(--text-muted);margin-left:10px;font:400 10px DM Mono,monospace}.content{white-space:pre-wrap;color:var(--text-primary);font-size:14px;line-height:1.75}.typing:after{content:"···";animation:1s infinite pulse}.error{background:var(--danger-bg);color:var(--danger);border-radius:8px;margin-top:14px;padding:10px 13px;font-size:13px}form{border:1px solid var(--border-default);background:var(--bg-raised);box-shadow:0 15px 40px var(--shadow-faint);border-radius:13px;flex-shrink:0;margin:0 0 30px}textarea{resize:none;width:100%;height:88px;color:var(--text-primary);background:0 0;border:0;outline:0;padding:15px;font:14px Manrope}.composer{color:var(--text-muted);justify-content:space-between;align-items:center;padding:0 10px 10px 15px;font:10px DM Mono,monospace;display:flex}.composer button{background:var(--accent);color:var(--accent-contrast);cursor:pointer;border:0;border-radius:8px;padding:8px 13px;font-weight:800}.composer .stop{background:var(--danger)}.composer .send:disabled{opacity:1;cursor:not-allowed;background:var(--bg-raised);border:1px solid var(--border-default);color:var(--text-secondary);box-shadow:inset 0 1px var(--shadow-faint)}.overlay{background:var(--overlay);z-index:10;place-items:center;padding:16px;display:grid;position:fixed;inset:0}.picker{background:var(--bg-raised);border:1px solid var(--border-default);width:min(480px,100%);box-shadow:0 25px 60px var(--shadow-faint);border-radius:14px;padding:20px}.picker h2{margin:0 0 12px;font-size:15px}.picker-path{color:var(--text-secondary);word-break:break-all;margin-bottom:9px;font:12px DM Mono,monospace}.picker-list{border:1px solid var(--border-subtle);background:var(--bg-input);border-radius:9px;height:320px;overflow:auto}.picker-dir{width:100%;color:var(--text-primary);cursor:pointer;text-align:left;background:0 0;border:0;align-items:center;gap:8px;padding:8px 11px;font:12px DM Mono,monospace;display:flex}.picker-dir:hover{background:var(--bg-hover)}.picker-status{color:var(--text-muted);padding:12px;font:11px DM Mono,monospace}.picker-error{background:var(--danger-bg);color:var(--danger);border-radius:8px;justify-content:space-between;align-items:center;gap:10px;margin:12px;padding:10px 13px;font-size:12px;display:flex}.picker-error button{border:1px solid var(--danger-border);color:var(--danger);cursor:pointer;background:0 0;border-radius:6px;padding:3px 9px}.picker-name{color:var(--text-secondary);align-items:center;gap:9px;margin-top:14px;font-size:12px;display:flex}.picker-name input{border:1px solid var(--border-default);background:var(--bg-input);min-width:0;color:var(--text-primary);border-radius:8px;outline:0;flex:1;padding:8px 10px;font:13px Manrope}.picker-actions{justify-content:flex-end;gap:8px;margin-top:16px;display:flex}.picker-actions button{cursor:pointer;border:0;border-radius:8px;padding:9px 14px;font-weight:700}.picker-cancel{border:1px solid var(--border-default);color:var(--text-secondary);background:0 0}.picker-ok{background:var(--accent);color:var(--accent-contrast)}.picker-ok:disabled{opacity:.4;cursor:not-allowed}.empty{text-align:center;color:var(--text-secondary);place-self:center;margin-top:20vh}.empty .orb{width:55px;height:55px;margin:auto;font-size:38px}.empty h2{color:var(--text-primary);margin-bottom:5px}.empty p{font-size:13px}.empty button{margin-top:14px}@media (width<=700px){.shell{grid-template-rows:minmax(0,auto) minmax(254px,1fr);grid-template-columns:minmax(0,1fr)}aside{border-right:0;border-bottom:1px solid var(--border-subtle);min-height:0;padding:12px}.brand{padding:3px 8px 12px}.label,aside footer{display:none}nav{flex:0 auto;min-height:0;max-height:min(30vh,190px);display:grid;overflow:auto}.workspace-group{min-width:0}.chat{padding:0 17px}header{min-height:0;padding:14px 0;overflow:clip}form{margin-bottom:14px}.messages{padding:14px 0}.picker{padding:14px}.picker-list{height:min(320px,45vh)}}.extui{flex:0 auto;gap:10px;min-width:0;max-height:min(45vh,420px);margin-bottom:12px;display:grid;overflow:auto}.extui-card{border:1px solid var(--border-default);background:var(--bg-elevated);min-width:0;box-shadow:0 12px 30px var(--shadow-faint);border-radius:12px;gap:9px;padding:13px 14px;display:grid}.extui-head{flex-wrap:wrap;align-items:center;gap:8px;min-width:0;display:flex}.extui-badge{letter-spacing:.1em;text-transform:uppercase;color:var(--info);border:1px solid var(--info);border-radius:99px;padding:3px 8px;font:10px DM Mono,monospace}.extui-deadline{color:var(--warning);font:10px DM Mono,monospace}.extui-title{color:var(--text-primary);overflow-wrap:anywhere;min-width:0;margin:0;font-size:14px;line-height:1.5}.extui-body{color:var(--text-secondary);overflow-wrap:anywhere;min-width:0;margin:0;font-size:13px;line-height:1.7}.extui-options{gap:6px;min-width:0;display:grid}.extui-option{border:1px solid var(--border-default);background:var(--bg-input);width:100%;min-width:0;color:var(--text-primary);cursor:pointer;text-align:left;overflow-wrap:anywhere;border-radius:8px;padding:9px 11px;font:12px DM Mono,monospace}.extui-option:hover{background:var(--bg-hover)}.extui-form{gap:9px;min-width:0;display:grid}.extui-field{box-sizing:border-box;border:1px solid var(--border-default);background:var(--bg-inset);width:100%;min-width:0;color:var(--text-primary);resize:vertical;border-radius:8px;outline:0;padding:9px 11px;font:13px Manrope}.extui-field:focus{border-color:var(--focus-ring)}.extui-actions{flex-wrap:wrap;gap:8px;min-width:0;display:flex}.extui-actions button{cursor:pointer;border:0;border-radius:8px;padding:8px 13px;font-size:12px;font-weight:700}.extui-primary{background:var(--accent);color:var(--accent-contrast)}.extui-primary:disabled{opacity:.4;cursor:not-allowed}.extui-no{background:var(--danger);color:var(--danger-contrast)}.extui-cancel{border:1px solid var(--border-default);color:var(--text-secondary);background:0 0}.extui-widget{border:1px dashed var(--border-default);background:var(--bg-raised);min-width:0;max-height:min(30vh,220px);color:var(--text-secondary);overflow-wrap:anywhere;border-radius:10px;gap:3px;margin-bottom:10px;padding:9px 12px;font:11px DM Mono,monospace;display:grid;overflow:auto}.extui-title-note{border:1px solid var(--border-default);background:var(--bg-elevated);color:var(--text-secondary);overflow-wrap:anywhere;border-radius:8px;min-width:0;margin-top:12px;padding:7px 11px;font:11px DM Mono,monospace}.toasts{gap:8px;min-width:0;margin:12px 0 0;display:grid}.toast{border:1px solid var(--border-default);background:var(--bg-raised);min-width:0;color:var(--text-primary);overflow-wrap:anywhere;word-break:break-word;border-radius:10px;padding:10px 13px;font-size:12px;line-height:1.6}.toast-warning{border-color:var(--warning-border);background:var(--warning-bg);color:var(--warning)}.toast-error{border-color:var(--danger-border);background:var(--danger-bg);color:var(--danger)}@media (width<=700px){.toasts{width:min(560px,100vw - 32px);max-width:calc(100vw - 32px);left:50%}.extui{max-height:min(38vh,320px)}.extui-card{padding:11px 12px}.extui-title{font-size:13px}.extui-body{font-size:12px}.extui-actions button{padding:7px 11px}}.extui-form{box-shadow:none;background:0 0;border:0;border-radius:0;flex-shrink:0;gap:9px;min-width:0;margin:0;padding:0;display:grid}.stream-tail{border:1px solid var(--border-default);background:var(--bg-raised);min-height:38px;color:var(--text-secondary);border-bottom:0;border-radius:9px 9px 0 0;grid-template-columns:1fr auto 1fr;align-items:center;margin:0;padding:0 15px;font:10px DM Mono,monospace;display:grid;position:relative}.stream-tail-status{white-space:nowrap;text-overflow:ellipsis;justify-self:start;overflow:hidden}.stream-tail-jump{border:1px solid var(--border-default);background:var(--bg-input);color:var(--text-primary);cursor:pointer;border-radius:7px;justify-self:center;padding:6px 12px;font:700 11px Manrope}.stream-tail-jump:hover{border-color:var(--focus-ring);color:var(--accent-hover)}.stream-tail-mode{color:var(--text-secondary);white-space:nowrap;justify-self:end}.stream-tail-mode[data-follow-tail=true]{color:var(--accent)}@media (width<=700px){.stream-tail{grid-template-columns:minmax(0,1fr) auto;gap:8px;padding:5px 15px}.stream-tail-mode{grid-column:1/-1;justify-self:start;font-size:9px}}.conversation-row{align-items:center;gap:2px;min-width:0;display:flex}.conversation{flex:1 1 0}.conversation>span{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.conversation>small{flex:none}.conversation-archive{width:20px;height:20px;color:var(--text-secondary);cursor:pointer;background:0 0;border:0;border-radius:5px;flex:0 0 20px;place-items:center;font-size:14px;line-height:1;transition:color .12s,background .12s;display:grid}.conversation-archive:hover{background:var(--bg-hover);color:var(--text-primary)}.conversation-archive:focus-visible{outline:1px solid var(--focus-ring);outline-offset:1px}.archived-group{border-top:1px dashed var(--border-subtle);margin-top:5px;padding-top:5px}.archived-toggle{width:100%;min-width:0;color:var(--text-muted);text-align:left;cursor:pointer;background:0 0;border:0;align-items:center;gap:7px;padding:6px 6px 6px 25px;font:11px DM Mono,monospace;display:flex}.archived-toggle:hover{color:var(--text-secondary)}.archived-label{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.conversation-archived{color:var(--text-muted);cursor:default;border-radius:8px;justify-content:space-between;align-items:center;gap:8px;min-width:0;padding:8px 9px 8px 25px;font:500 12px Manrope;display:flex}.conversation-archived>span{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.conversation-archived small{color:var(--text-muted);flex:none;font:500 10px DM Mono,monospace}.conversation-restore{color:var(--text-muted);cursor:pointer;background:0 0;border:0;border-radius:5px;flex:none;padding:1px 3px;font-size:14px;line-height:1}.conversation-restore:hover{background:var(--bg-hover);color:var(--text-primary)}@media (width<=700px){.conversation-archived{padding-left:25px}}.inline-edit{flex:1 1 0;align-items:center;gap:3px;min-width:0;display:flex}.inline-edit-input{border:1px solid var(--border-default);background:var(--bg-raised);min-width:0;color:var(--text-primary);border-radius:7px;outline:0;flex:1 1 0;padding:6px 8px;font:600 12px Manrope}.inline-edit-input:focus{border-color:var(--focus-ring);box-shadow:0 0 0 2px var(--focus-ring-glow)}.inline-edit-ok,.inline-edit-cancel{border:1px solid var(--border-strong);background:var(--bg-raised);width:22px;height:22px;color:var(--text-primary);cursor:pointer;border-radius:6px;flex:0 0 22px;place-items:center;font-size:12px;line-height:1;transition:background .12s,color .12s,border-color .12s;display:grid}.inline-edit-ok:hover{background:var(--accent);border-color:var(--border-strong);color:var(--accent-contrast)}.inline-edit-cancel:hover{background:var(--bg-hover);border-color:var(--border-strong);color:var(--text-primary)}.inline-edit-ok:focus-visible,.inline-edit-cancel:focus-visible{outline:1px solid var(--focus-ring);outline-offset:1px}.inline-edit-ok:disabled{background:var(--bg-raised);border-color:var(--border-default);color:var(--text-muted);cursor:not-allowed}.conversation-time{color:var(--text-secondary);flex:none;font:10px DM Mono,monospace}.session-picker{border-bottom:1px solid var(--border-subtle);flex-wrap:wrap;align-items:center;gap:8px;min-width:0;margin-bottom:11px;padding:9px 10px 0 15px;display:flex}.session-picker-item{min-width:0;max-width:100%;position:relative}.session-picker-trigger{border:1px solid var(--border-default);background:var(--bg-raised);min-width:0;max-width:100%;color:var(--text-primary);cursor:pointer;border-radius:9px;align-items:baseline;gap:7px;padding:5px 9px;transition:border-color .12s,background .12s;display:flex}.session-picker-trigger:hover{border-color:var(--border-default);background:var(--bg-hover)}.session-picker-trigger:focus-visible{outline:1px solid var(--focus-ring);outline-offset:1px}.session-picker-name{text-overflow:ellipsis;white-space:nowrap;flex:0 auto;min-width:0;font:700 12px Manrope;overflow:hidden}.session-picker-detail{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--text-secondary);flex:0 auto;font:10px DM Mono,monospace;overflow:hidden}.session-picker-caret{color:var(--text-secondary);flex:none;font-size:10px}.session-picker-trigger:disabled{cursor:not-allowed;background:var(--bg-raised);border-color:var(--border-default)}.session-picker-trigger:disabled .session-picker-name,.session-picker-trigger:disabled .session-picker-detail,.session-picker-trigger:disabled .session-picker-caret{color:var(--text-secondary)}.picker-menu{z-index:20;border:1px solid var(--border-default);background:var(--bg-elevated);width:max-content;min-width:100%;max-width:min(420px,88vw);box-shadow:0 18px 44px var(--shadow);transform:translate(var(--picker-nudge,0px),var(--picker-drop,0px));border-radius:12px;padding:6px;position:absolute;bottom:calc(100% + 7px);left:0}.picker-list{background:var(--bg-input);border:0;border-radius:9px;align-content:start;height:auto;max-height:min(46vh,340px);display:grid;overflow:auto}.picker-option{width:100%;min-width:0;color:var(--text-primary);cursor:pointer;text-align:left;background:0 0;border:0;border-radius:7px;align-items:baseline;gap:8px;padding:8px 10px;display:flex}.picker-option:hover{background:var(--bg-hover);color:var(--text-primary)}.picker-option:focus-visible{outline:1px solid var(--focus-ring);outline-offset:-1px}.picker-option.selected{background:var(--bg-raised)}.picker-option.selected:hover{background:var(--bg-hover)}.picker-option-name{text-overflow:ellipsis;white-space:nowrap;flex:0 auto;min-width:0;font:600 12px Manrope;overflow:hidden}.picker-option.selected .picker-option-name{color:var(--text-primary)}.picker-option-detail{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--text-secondary);text-align:right;flex:auto;font:10px DM Mono,monospace;overflow:hidden}.picker-option-swatch{border-radius:50%;flex:none;align-self:center;width:7px;height:7px}.session-picker-agent .picker-menu{min-width:min(330px,78vw)}.picker-option:hover .picker-option-detail{color:var(--text-primary)}.picker-option-mark{color:var(--selected);flex:none;font-size:12px}@media (width<=700px){.session-picker{gap:6px;padding:8px 9px 0 12px}.session-picker-trigger{padding:5px 7px}.picker-menu{max-width:calc(100vw - 44px)}.picker-list{max-height:min(38vh,260px)}}.session-picker-kind{border-right:1px solid var(--border-default);color:var(--text-muted);letter-spacing:.06em;flex:none;align-self:stretch;align-items:center;padding-right:7px;font:700 10px Manrope;display:flex}.session-picker-trigger:disabled .session-picker-kind{color:var(--text-secondary);border-right-color:var(--border-default)}.session-picker-trigger:hover .session-picker-kind{color:var(--text-muted)}.chat>form{flex-direction:column;flex:0 auto;min-height:0;display:flex}.chat>form textarea{flex:auto;min-height:56px}@media (width<=700px){nav{max-height:min(190px,max(84px,44vh - 113px))}}@media (width<=440px){.session-picker-detail{display:none}}.picker-filter{border:1px solid var(--border-default);background:var(--bg-inset);border-radius:9px;align-items:center;gap:7px;margin:0 2px 6px;padding:0 9px;display:flex}.picker-filter:focus-within{border-color:var(--focus-ring)}.picker-filter-icon{color:var(--text-muted);flex:none;font-size:11px;line-height:1}.picker-filter-input{min-width:0;color:var(--text-primary);background:0 0;border:0;outline:0;flex:1 1 0;padding:8px 0;font:12px Manrope}.picker-filter-input::placeholder{color:var(--text-muted)}.picker-filter-clear{color:var(--text-secondary);cursor:pointer;background:0 0;border:0;border-radius:5px;flex:none;padding:2px 5px;font-size:11px;line-height:1}.picker-filter-clear:hover{background:var(--bg-hover);color:var(--text-primary)}.picker-current{background:var(--bg-raised);border-radius:9px;align-items:baseline;gap:7px;min-width:0;margin:0 2px 6px;padding:6px 9px;display:flex}.picker-current-label{color:var(--selected);letter-spacing:.06em;flex:none;font:700 10px Manrope}.picker-current-value{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--text-primary);flex:0 auto;font:600 12px Manrope;overflow:hidden}.picker-empty{color:var(--text-secondary);text-align:center;overflow-wrap:anywhere;padding:14px 10px;font:11px DM Mono,monospace}.picker-option.preview{background:var(--bg-hover);box-shadow:inset 2px 0 0 var(--border-strong)}.picker-option.preview .picker-option-name,.picker-option.preview .picker-option-detail{color:var(--text-primary)}.settings-dialog{width:min(440px,100%)}.settings-scope{color:var(--text-muted);text-overflow:ellipsis;white-space:nowrap;margin:-6px 0 2px;font:11px DM Mono,monospace;overflow:hidden}.settings-row{grid-template-columns:76px minmax(0,1fr);align-items:center;gap:10px;margin-top:12px;display:grid}.settings-label{color:var(--text-secondary);font-size:12px}.settings-row .session-picker-trigger{width:100%}.picker-actions .settings-rename{border:1px solid var(--border-default);color:var(--text-secondary);background:0 0;margin-right:auto}@media (width<=700px){.settings-row{grid-template-columns:1fr;gap:5px}}.subagent-card{border:1px solid var(--border-strong);background:var(--bg-elevated);min-width:0;box-shadow:0 10px 26px var(--shadow-faint);border-radius:12px;gap:8px;margin:2px 0 14px 46px;padding:12px 14px;display:grid}.subagent-card.subagent-running{border-color:var(--info)}.subagent-card.subagent-failed{border-color:var(--danger-border)}.subagent-head{flex-wrap:wrap;align-items:center;gap:8px;min-width:0;display:flex}.subagent-badge{letter-spacing:.1em;text-transform:uppercase;color:var(--info);border:1px solid var(--info);border-radius:99px;flex:none;padding:3px 8px;font:10px DM Mono,monospace}.subagent-name{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--text-primary);flex:0 auto;font:700 13px Manrope;overflow:hidden}.subagent-status{color:var(--text-secondary);border-left:1px solid var(--border-default);flex:none;padding-left:8px;font:10px DM Mono,monospace}.subagent-running .subagent-status{color:var(--info)}.subagent-failed .subagent-status{color:var(--danger)}.subagent-clock,.subagent-duration{letter-spacing:.02em;white-space:nowrap;flex:none;font:10px DM Mono,monospace}.subagent-clock{color:var(--text-secondary)}.subagent-duration{color:var(--text-muted)}.subagent-activity{min-width:0;color:var(--text-secondary);overflow-wrap:anywhere;align-items:center;gap:7px;font:11px DM Mono,monospace;display:flex}.subagent-activity-dot{background:var(--info);border-radius:99px;flex:none;width:6px;height:6px;animation:1.2s ease-in-out infinite subagent-pulse}@keyframes subagent-pulse{0%,to{opacity:1;transform:scale(1)}50%{opacity:.35;transform:scale(.7)}}@media (prefers-reduced-motion:reduce){.subagent-activity-dot{animation:none}}.subagent-failure{min-width:0;color:var(--danger);background:var(--danger-bg);border:1px solid var(--danger-border);overflow-wrap:anywhere;border-radius:8px;flex-wrap:wrap;align-items:baseline;gap:8px;padding:6px 9px;font:11px DM Mono,monospace;display:flex}.subagent-failure-label{letter-spacing:.06em;color:var(--danger);flex:none;font-weight:700}.subagent-failure-stage{min-width:0;color:var(--danger);flex:0 auto}.subagent-failure-tool,.subagent-failure-progress{min-width:0;color:var(--danger);overflow-wrap:anywhere;flex:0 auto}.subagent-stop{border:1px solid var(--border-default);background:var(--bg-raised);color:var(--text-primary);cursor:pointer;border-radius:8px;flex:none;margin-left:auto;padding:4px 11px;font:700 11px Manrope}.subagent-stop:hover{background:var(--danger);border-color:var(--danger-border);color:var(--danger-contrast)}.subagent-stop:focus-visible{outline:1px solid var(--focus-ring);outline-offset:1px}.subagent-task{min-width:0;color:var(--text-secondary);overflow-wrap:anywhere;border-left:2px solid var(--border-default);padding-left:9px;font:11px DM Mono,monospace}.subagent-by-model{border-color:var(--warning-border)}.subagent-source{letter-spacing:.04em;color:var(--warning);background:var(--warning-bg);border:1px solid var(--warning-border);white-space:nowrap;border-radius:99px;flex:none;align-items:center;gap:5px;padding:3px 9px;font:700 10px Manrope;display:inline-flex}.subagent-source-glyph{flex:none;font-size:11px;line-height:1}.subagent-task-source{letter-spacing:.06em;color:var(--warning);margin-right:7px;font:700 10px Manrope;display:inline-block}.subagent-output{min-width:0;max-height:min(38vh,300px);color:var(--text-primary);white-space:pre-wrap;overflow-wrap:anywhere;font:13px/1.7 Manrope;overflow:auto}.subagent-error{min-width:0;color:var(--danger);background:var(--danger-bg);border:1px solid var(--danger-border);overflow-wrap:anywhere;border-radius:8px;padding:8px 10px;font:12px/1.6 Manrope}.subagent-tools{gap:3px;min-width:0;display:grid}.subagent-tool{min-width:0;color:var(--text-muted);background:var(--bg-raised);border-radius:6px;align-items:baseline;gap:7px;padding:4px 8px;font:11px DM Mono,monospace;display:flex}.subagent-tool-glyph{color:var(--text-secondary);flex:none}.subagent-tool-label{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--text-primary);flex:0 auto;overflow:hidden}.subagent-tool-error .subagent-tool-glyph{color:var(--danger)}.subagent-tool-detail{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--text-muted);text-align:right;flex:auto;overflow:hidden}.subagent-tool-duration{color:var(--text-muted);flex:none;padding-left:2px;font-size:10px}.subagent-more{color:var(--text-secondary);cursor:pointer;text-align:left;background:0 0;border:0;flex:none;padding:2px 0;font:11px DM Mono,monospace}.subagent-more:hover{color:var(--text-primary)}.subagent-usage{border-top:1px solid var(--border-subtle);min-width:0;color:var(--text-secondary);flex-wrap:wrap;gap:10px;padding-top:8px;font:10px DM Mono,monospace;display:flex}.subagent-collapse{border:1px solid var(--border-default);color:var(--text-secondary);cursor:pointer;background:0 0;border-radius:7px;flex:none;align-self:flex-start;padding:3px 9px;font:11px DM Mono,monospace}.subagent-collapse:hover{background:var(--bg-hover);color:var(--text-primary)}@media (width<=700px){.subagent-card{margin-left:0}.subagent-output{max-height:min(34vh,240px)}}.call-blocks{gap:5px;min-width:0;margin-top:8px;margin-bottom:8px;display:grid}.call-block{border:1px solid var(--border-default);border-left:1px solid var(--border-strong);background:var(--bg-elevated);border-radius:8px;min-width:0;padding:5px 9px 5px 15px;position:relative}.call-fold-edge{cursor:pointer;z-index:1;background:0 0;border:0;width:12px;min-width:12px;padding:0;position:absolute;inset-block:0;inset-inline-start:0}.call-fold-edge:before{content:"";background:var(--bg-raised);border-radius:99px;width:3px;transition:background .12s linear,width .12s linear,inset-inline-start .12s linear;position:absolute;inset-block:4px;inset-inline-start:4px}.call-fold-edge:hover:before,.call-fold-edge:focus-visible:before{background:var(--border-strong);width:7px;inset-inline-start:2px}.call-fold-edge:focus-visible{outline:1px solid var(--focus-ring);outline-offset:-1px;border-radius:4px}.call-head-row{align-items:center;gap:6px;min-width:0;display:flex}.call-head{min-width:0;color:inherit;cursor:pointer;text-align:left;background:0 0;border:0;flex:auto;align-items:baseline;gap:7px;padding:2px 0;font:11px DM Mono,monospace;display:flex}.call-chevron{color:var(--text-muted);flex:none;font-size:10px}.call-glyph{color:var(--text-secondary);flex:none}.call-block-error .call-glyph{color:var(--danger)}.call-label{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--text-primary);flex:0 auto;overflow:hidden}.call-detail{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--text-muted);flex:auto;overflow:hidden}.call-duration{color:var(--text-muted);flex:none;padding-left:2px;font-size:10px}.call-fold-top{border:1px solid var(--border-default);color:var(--text-secondary);cursor:pointer;background:0 0;border-radius:6px;flex:none;padding:2px 8px;font:11px DM Mono,monospace}.call-fold-top:hover{background:var(--bg-hover);color:var(--text-primary)}.call-fold-top:focus-visible{outline:1px solid var(--focus-ring);outline-offset:1px}.call-args{border-top:1px solid var(--border-subtle);gap:2px;min-width:0;max-height:min(40vh,320px);margin-top:5px;padding-top:5px;display:grid;overflow:auto}.call-arg{min-width:0;color:var(--text-muted);background:var(--bg-raised);border-radius:5px;align-items:baseline;gap:8px;padding:3px 8px;font:11px DM Mono,monospace;display:flex}.call-arg-key{color:var(--selected);flex:none}.call-arg-value{overflow-wrap:anywhere;min-width:0;color:var(--text-muted);flex:auto}.call-arg-empty{color:var(--text-muted)}@media (width<=700px){.call-fold-edge{width:10px;min-width:10px}.call-fold-edge:before{inset-inline-start:3px}.call-block{padding-left:13px}}.queue-dock{border:1px solid var(--border-default);background:var(--bg-raised);border-radius:11px;flex-direction:column;flex:none;gap:0;min-width:0;margin-bottom:10px;display:flex;overflow:hidden}.queue-dock-head{background:var(--bg-raised);width:100%;min-width:0;color:var(--text-primary);cursor:pointer;text-align:left;border:0;align-items:center;gap:8px;padding:9px 12px;font:12px Manrope;display:flex}.queue-dock-head:hover{background:var(--bg-hover)}.queue-dock-head strong{color:var(--text-primary);flex:none;font-weight:700}.queue-dock-head .chevron{color:var(--text-muted);flex:none}.queue-dock-preview{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--text-muted);flex:auto;font:11px DM Mono,monospace;overflow:hidden}.queue-dock-badge{color:var(--warning);border:1px solid var(--warning-border);border-radius:99px;flex:none;padding:2px 8px;font:10px DM Mono,monospace}.queue-dock-note{color:var(--text-secondary);overflow-wrap:anywhere;margin:0;padding:0 12px 9px;font:11px/1.7 Manrope}.queue-dock-list{flex-direction:column;gap:5px;min-width:0;max-height:min(26vh,190px);margin:0;padding:0 6px 7px;list-style:none;display:flex;overflow-y:auto}.queue-row{background:var(--bg-raised);border-radius:8px;align-items:center;gap:8px;min-width:0;padding:6px 8px;display:flex}.queue-row-sending{background:var(--bg-raised)}.queue-index{background:var(--bg-hover);width:17px;height:17px;color:var(--text-muted);border-radius:99px;flex:none;place-items:center;font:10px DM Mono,monospace;display:grid}.queue-text{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--text-primary);flex:auto;font:12px Manrope;overflow:hidden}.queue-state{color:var(--text-muted);border:1px solid var(--border-default);border-radius:99px;flex:none;padding:2px 8px;font:10px DM Mono,monospace}.queue-row-sending .queue-state{color:var(--warning);border-color:var(--warning-border)}.queue-steer{border:1px solid var(--selected-border);background:var(--selected-bg);color:var(--text-secondary);cursor:pointer;border-radius:7px;flex:none;padding:4px 10px;font:700 11px Manrope}.queue-steer:hover{background:var(--selected-bg)}.queue-steer:focus-visible{outline:1px solid var(--focus-ring);outline-offset:1px}.queue-cancel{border:1px solid var(--border-default);color:var(--text-secondary);cursor:pointer;background:0 0;border-radius:7px;flex:none;padding:4px 10px;font:11px Manrope}.queue-cancel:hover{background:var(--bg-hover);color:var(--danger);border-color:var(--danger-border)}.queue-cancel:focus-visible{outline:1px solid var(--focus-ring);outline-offset:1px}.queue-locked{color:var(--warning);flex:none;font:10px DM Mono,monospace}.queue-steer-idle{color:var(--text-muted);flex:none;font:10px DM Mono,monospace}.send-queued{border-color:var(--warning-border);background:var(--warning-bg);color:var(--warning)}@media (width<=700px){.queue-dock-list{max-height:min(30vh,220px)}.queue-dock-note{font-size:10px}.queue-row{flex-wrap:wrap}}.md{white-space:normal}.md>:first-child{margin-top:0}.md>:last-child{margin-bottom:0}.md-p{white-space:pre-wrap;margin:0 0 11px}.md-h{color:var(--text-primary);margin:19px 0 9px;font-weight:800;line-height:1.35}.md-h1{font-size:19px}.md-h2{font-size:17px}.md-h3{font-size:15px}.md-h4,.md-h5,.md-h6{color:var(--text-primary);font-size:14px}.md-strong{color:var(--text-primary);font-weight:800}.md-em{font-style:italic}.md-del{opacity:.62}.md-ul,.md-ol{margin:0 0 11px;padding-left:23px}.md-li{margin:3px 0}.md-li>.md-ul,.md-li>.md-ol{margin:3px 0 0}.md-li>.md-p:last-child{margin-bottom:0}.md-quote{border-left:3px solid var(--border-default);color:var(--text-secondary);margin:0 0 11px;padding:2px 0 2px 12px}.md-rule{border:0;border-top:1px solid var(--border-subtle);margin:16px 0}.md-link{color:var(--accent);text-underline-offset:2px;overflow-wrap:anywhere;text-decoration:underline}.md-link:hover{color:var(--accent-hover)}.md-code-inline{background:var(--bg-raised);border:1px solid var(--border-subtle);color:var(--text-primary);border-radius:5px;padding:1px 5px;font:12px DM Mono,ui-monospace,monospace}.md-pre{background:var(--bg-inset);border:1px solid var(--border-subtle);border-radius:9px;max-width:100%;margin:0 0 12px;padding:11px 13px;overflow:auto}.md-code{color:var(--text-primary);white-space:pre;font:12px/1.6 DM Mono,ui-monospace,monospace}.md-pre[data-md-lang]:before{content:attr(data-md-lang);color:var(--text-muted);letter-spacing:.08em;text-transform:uppercase;margin-bottom:7px;font:10px DM Mono,monospace;display:block}.md-table-wrap{max-width:100%;margin:0 0 12px;overflow-x:auto}.md-table{border-collapse:collapse;width:100%;font-size:13px}.md-table th,.md-table td{border:1px solid var(--border-subtle);text-align:left;vertical-align:top;padding:6px 10px}.md-table th{background:var(--bg-raised);color:var(--text-primary);font-weight:800}.md-table tbody tr:nth-child(2n){background:var(--bg-raised)}.md-math{color:var(--text-primary);font-family:DM Mono,ui-monospace,monospace}.md-math-block{text-align:center;margin:0 0 12px;padding:9px 0;font-size:15px;display:block;overflow-x:auto}.md-m-var{color:var(--text-primary);font-style:italic}.md-m-fn{color:var(--text-secondary);font-style:normal}.md-m-op{color:var(--text-primary)}.md-m-number{color:var(--text-secondary)}.md-m-script{white-space:nowrap}.md-m-sup,.md-m-sub{font-size:.72em}.md-m-sup{vertical-align:.55em}.md-m-sub{vertical-align:-.25em}.md-m-frac{vertical-align:middle;text-align:center;flex-direction:column;align-items:center;margin:0 .2em;line-height:1.2;display:inline-flex}.md-m-num{padding:0 .3em}.md-m-den{border-top:1.4px solid;padding:0 .3em}.md-m-root{white-space:nowrap}.md-m-body{border-top:1.4px solid;padding:0 .12em 0 .05em}.md-m-radical{font-size:1.15em}.md-m-index{font-size:.65em}.md-m-rowbreak{height:0;display:block}.md-m-unsupported{color:var(--warning);border-bottom:1px dashed var(--warning-border);cursor:help}:root{--rail-width:320px}.shell.shell-rail-collapsed{--rail-width:30px}.right-rail{border-left:1px solid var(--border-subtle);background:var(--bg-panel);flex-direction:column;min-width:0;min-height:0;display:flex}.right-rail-collapsed{border-left-color:var(--border-subtle);background:var(--bg-inset)}.right-rail-open{border:1px solid var(--border-default);background:var(--bg-elevated);width:26px;height:34px;color:var(--text-secondary);cursor:pointer;border-radius:8px;align-self:center;margin-top:14px;font-size:15px;line-height:1}.right-rail-open:hover{border-color:var(--border-strong);color:var(--text-primary)}.right-rail-open:focus-visible{outline:1px solid var(--focus-ring);outline-offset:1px}.right-rail-head{border-bottom:1px solid var(--border-subtle);align-items:center;gap:6px;min-width:0;padding:14px 10px 0 13px;display:flex}.right-tabs{flex-wrap:wrap;flex:auto;align-items:center;gap:4px;min-width:0;display:flex}.right-tab{color:var(--text-muted);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:8px 8px 0 0;padding:6px 11px;font:700 12px Manrope}.right-tab:hover{color:var(--text-primary);background:var(--bg-elevated)}.right-tab-active{border-color:var(--border-default);border-bottom-color:var(--selected);background:var(--bg-elevated);color:var(--text-primary)}.right-tab:focus-visible{outline:1px solid var(--focus-ring);outline-offset:1px}.right-rail-collapse{border:1px solid var(--border-default);color:var(--text-secondary);cursor:pointer;background:0 0;border-radius:8px;flex:none;padding:5px 9px;font-size:14px;line-height:1}.right-rail-collapse:hover{border-color:var(--border-strong);color:var(--text-primary)}.right-rail-collapse:focus-visible{outline:1px solid var(--focus-ring);outline-offset:1px}.right-rail-body{flex:1;min-height:0;padding:0 13px 16px;overflow-y:auto}.rail-section-head{justify-content:space-between;align-items:baseline;gap:8px;min-width:0;margin:15px 0 8px;display:flex}.rail-section-head:first-child{margin-top:14px}.rail-section-title{text-overflow:ellipsis;white-space:nowrap;letter-spacing:.1em;text-transform:uppercase;min-width:0;color:var(--text-muted);flex:0 auto;margin:0;font:700 11px DM Mono,monospace;overflow:hidden}.rail-section-count{color:var(--text-muted);white-space:nowrap;flex:none;font:10px DM Mono,monospace}.rail-empty{border:1px dashed var(--border-default);background:var(--bg-input);color:var(--text-secondary);overflow-wrap:anywhere;border-radius:10px;margin:0;padding:11px 12px;font:11px/1.7 Manrope}.todo-list{gap:5px;min-width:0;margin:0;padding:0;list-style:none;display:grid}.todo-item{border:1px solid var(--border-subtle);border-left-width:3px;border-radius:8px;align-items:baseline;gap:7px;min-width:0;padding:7px 9px;font:12px/1.55 Manrope;display:flex}.todo-text{overflow-wrap:anywhere;flex:auto;min-width:0}.todo-status{color:inherit;opacity:.9;white-space:nowrap;flex:none;font:10px DM Mono,monospace}.todo-priority{border:1px solid var(--border-default);color:var(--text-secondary);border-radius:99px;flex:none;padding:1px 6px;font:10px DM Mono,monospace}.todo-mark{flex:none;font-size:11px;line-height:1.6}.todo-pending{border-left-color:var(--border-strong);background:var(--bg-raised);color:var(--text-secondary)}.todo-in_progress{border-left-color:var(--info);background:var(--selected-bg);color:var(--text-primary)}.todo-in_progress .todo-priority{border-color:var(--info);color:var(--info)}.todo-completed{border-left-color:var(--border-subtle);background:var(--bg-inset);color:var(--text-muted)}.todo-completed .todo-text{text-decoration:line-through;text-decoration-thickness:1px}.bg-list{gap:5px;min-width:0;margin:0;padding:0;list-style:none;display:grid}.bg-item{border:1px solid var(--border-subtle);background:var(--bg-raised);border-radius:8px;gap:3px;min-width:0;padding:7px 9px;display:grid}.bg-title{min-width:0;color:var(--text-primary);overflow-wrap:anywhere;font:600 12px Manrope}.bg-meta{min-width:0;color:var(--text-muted);align-items:baseline;gap:8px;font:10px DM Mono,monospace;display:flex}.bg-agent{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--selected);overflow:hidden}.bg-status{white-space:nowrap;flex:none}@media (width<=1100px){.shell{grid-template-columns:var(--sidebar-width,270px) minmax(0,1fr)}.right-rail{z-index:15;width:min(var(--rail-width),86vw);box-shadow:-14px 0 34px var(--shadow-faint);position:absolute;top:0;bottom:0;right:0}}@media (width<=700px){.right-rail{width:min(var(--rail-width),94vw)}.right-rail-body{padding:0 11px 14px}}.tool-grid{grid-template-columns:repeat(auto-fill,minmax(74px,1fr));gap:8px;min-width:0;margin:0;padding:0;list-style:none;display:grid}.tool-slot{min-width:0;position:relative}.tool-icon{border:1px solid var(--border-default);background:var(--bg-raised);cursor:pointer;width:100%;min-width:0;color:var(--text-muted);border-radius:11px;align-content:center;place-items:center;gap:3px;padding:9px 5px 7px;display:grid}.tool-icon:hover{border-color:var(--border-strong);color:var(--text-primary)}.tool-icon:focus-visible{outline:1px solid var(--focus-ring);outline-offset:1px}.tool-icon{aspect-ratio:1;min-height:74px}.tool-icon[data-tool-state=open]{border-color:var(--selected-border);background:var(--selected-bg);color:var(--text-primary)}.tool-icon-glyph{pointer-events:none;font:400 26px/1 Manrope,system-ui,sans-serif}.tool-icon-name{text-overflow:ellipsis;white-space:nowrap;max-width:100%;color:inherit;opacity:.95;font:10px DM Mono,monospace;overflow:hidden}.tool-remove{border:1px solid var(--border-default);background:var(--bg-elevated);width:19px;height:19px;color:var(--text-secondary);cursor:pointer;border-radius:99px;place-items:center;padding:0;font:11px/1 Manrope;display:grid;position:absolute;top:-5px;right:-5px}.tool-remove:hover{border-color:var(--danger-border);color:var(--danger)}.tool-remove:focus-visible{outline:1px solid var(--focus-ring);outline-offset:1px}.tool-presets{gap:6px;min-width:0;display:grid}.tool-preset{border:1px solid var(--border-subtle);background:var(--bg-raised);border-radius:9px;align-items:center;gap:9px;min-width:0;padding:8px 9px;display:flex}.tool-preset-glyph{border:1px solid var(--border-default);background:var(--bg-elevated);width:28px;height:28px;color:var(--text-secondary);border-radius:8px;flex:none;place-items:center;font:400 16px/1 Manrope,system-ui,sans-serif;display:grid}.tool-preset-text{flex:auto;gap:2px;min-width:0;display:grid}.tool-preset-text strong{color:var(--text-primary);font:600 12px Manrope}.tool-preset-text small{color:var(--text-muted);overflow-wrap:anywhere;font:10px/1.5 Manrope}.tool-preset-add{border:1px solid var(--border-default);color:var(--text-secondary);cursor:pointer;white-space:nowrap;background:0 0;border-radius:8px;flex:none;padding:5px 9px;font:600 11px Manrope}.tool-preset-add:hover:not(:disabled){border-color:var(--border-strong);color:var(--text-primary)}.tool-preset-add:disabled{opacity:.5;cursor:not-allowed}.tool-preset-add:focus-visible{outline:1px solid var(--focus-ring);outline-offset:1px}.tool-hint{color:var(--text-secondary);overflow-wrap:anywhere;margin:0 0 8px;font:11px/1.65 Manrope}.tool-hint b{color:var(--text-primary)}.tool-input{border:1px solid var(--border-default);background:var(--bg-input);width:100%;min-width:0;color:var(--text-primary);border-radius:9px;outline:0;margin:0 0 6px;padding:8px 10px;font:12px DM Mono,monospace;display:block}.tool-input:focus-visible{border-color:var(--focus-ring)}.tool-url-add{border:1px solid var(--border-default);background:var(--bg-elevated);width:100%;color:var(--text-secondary);cursor:pointer;border-radius:9px;padding:8px 10px;font:600 12px Manrope;display:block}.tool-url-add:hover:not(:disabled){border-color:var(--border-strong);color:var(--text-primary)}.tool-url-add:disabled{opacity:.45;cursor:not-allowed}.tool-url-add:focus-visible{outline:1px solid var(--focus-ring);outline-offset:1px}.tool-error{border:1px solid var(--danger-border);background:var(--danger-bg);color:var(--danger);overflow-wrap:anywhere;border-radius:9px;margin:8px 0 0;padding:8px 10px;font:11px/1.6 Manrope}.tools-settings-btn{border:1px dashed var(--border-default);width:100%;color:var(--text-secondary);cursor:pointer;background:0 0;border-radius:10px;margin-top:10px;padding:9px 10px;font:600 11px Manrope;display:block}.tools-settings-btn:hover{border-color:var(--border-strong);color:var(--text-primary)}.tools-settings-btn:focus-visible{outline:1px solid var(--focus-ring);outline-offset:1px}.tool-overlay{z-index:60;background:var(--overlay);place-items:center;padding:16px;display:grid;position:fixed;inset:0}.tool-dialog{border:1px solid var(--border-default);background:var(--bg-raised);width:min(760px,100%);max-height:min(86vh,760px);box-shadow:0 25px 60px var(--shadow-faint);border-radius:14px;flex-direction:column;display:flex;overflow:auto}.tool-dialog-head{border-bottom:1px solid var(--border-subtle);justify-content:space-between;align-items:center;gap:10px;min-width:0;padding:13px 14px;display:flex}.tool-dialog-title{min-width:0;color:var(--text-primary);text-overflow:ellipsis;white-space:nowrap;align-items:center;gap:8px;margin:0;font:700 14px Manrope;display:flex;overflow:hidden}.tool-dialog-glyph{border:1px solid var(--border-default);background:var(--bg-elevated);width:26px;height:26px;color:var(--text-secondary);border-radius:7px;flex:none;place-items:center;font:400 16px/1 Manrope,system-ui,sans-serif;display:grid}.tool-dialog-close{border:1px solid var(--border-default);width:28px;height:28px;color:var(--text-secondary);cursor:pointer;background:0 0;border-radius:8px;flex:none;place-items:center;padding:0;font:13px/1 Manrope;display:grid}.tool-dialog-close:hover{border-color:var(--border-strong);color:var(--text-primary)}.tool-dialog-close:focus-visible{outline:1px solid var(--focus-ring);outline-offset:1px}.tool-dialog-body{min-width:0;padding:14px}.tool-calc{gap:10px;min-width:0;display:grid}.tool-calc-input{text-align:right;min-height:40px;font:15px DM Mono,monospace}.tool-calc-keys{grid-template-columns:repeat(6,minmax(0,1fr));gap:6px;min-width:0;display:grid}.tool-calc-key{border:1px solid var(--border-default);background:var(--bg-elevated);min-width:0;min-height:44px;color:var(--text-primary);cursor:pointer;border-radius:9px;padding:0;font:600 14px Manrope}.tool-calc-key:hover{border-color:var(--border-strong);color:var(--text-primary)}.tool-calc-key:focus-visible{outline:1px solid var(--focus-ring);outline-offset:1px}.tool-calc-result{border:1px solid var(--border-default);background:var(--bg-raised);color:var(--text-secondary);text-align:right;overflow-wrap:anywhere;border-radius:11px;margin:0;padding:14px;font:700 26px DM Mono,monospace}.tool-calc-error{border:1px solid var(--danger-border);background:var(--danger-bg);color:var(--danger);overflow-wrap:anywhere;border-radius:11px;margin:0;padding:12px 14px;font:12px/1.6 Manrope}.tool-stamp{gap:8px;min-width:0;display:grid}.tool-stamp-out{grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:8px;margin:0;display:grid}.tool-stamp-out>div{border:1px solid var(--border-default);background:var(--bg-input);border-radius:9px;min-width:0;padding:9px 10px}.tool-stamp-out dt{letter-spacing:.08em;text-transform:uppercase;color:var(--text-muted);font:700 10px DM Mono,monospace}.tool-stamp-out dd{color:var(--text-primary);overflow-wrap:anywhere;margin:5px 0 0;font:600 13px DM Mono,monospace}.tool-stamp-error{border:1px dashed var(--border-default);background:var(--bg-input);color:var(--text-secondary);overflow-wrap:anywhere;border-radius:9px;margin:0;padding:11px 12px;font:11px/1.7 Manrope}.tool-link{gap:10px;min-width:0;display:grid}.tool-link-url{border:1px solid var(--border-default);background:var(--bg-input);min-width:0;color:var(--text-muted);overflow-wrap:anywhere;border-radius:9px;padding:10px 11px;font:12px DM Mono,monospace;display:block}.tool-link-open{border:1px solid var(--border-default);background:var(--bg-elevated);color:var(--text-primary);border-radius:9px;justify-self:start;padding:9px 14px;font:600 12px Manrope;text-decoration:none}.tool-link-open:hover{border-color:var(--border-strong);color:var(--text-primary)}.tool-link-open:focus-visible{outline:1px solid var(--focus-ring);outline-offset:1px}@media (width<=700px){.tool-overlay{padding:10px}.tool-calc-keys{grid-template-columns:repeat(3,minmax(0,1fr))}}.workspace-tab-strip,.file-tab-strip,.session-tab-strip{background:var(--bg-inset);border-bottom:1px solid var(--border-subtle);--tab-h:34px;--tab-fs:12px;--tab-close:20px;flex-direction:column;flex:auto;align-items:stretch;gap:0;min-width:0;display:flex;overflow-x:auto}.workspace-tab-row,.file-tab-row,.session-tab-row{flex-wrap:nowrap;align-items:stretch;min-width:0;display:flex}.workspace-tab-row+.workspace-tab-row,.file-tab-row+.file-tab-row,.session-tab-row+.session-tab-row{border-top:1px solid var(--border-subtle)}.workspace-tab-strip[data-workspace-tab-frozen],.file-tab-strip[data-file-tab-frozen],.session-tab-strip[data-session-tab-frozen]{outline:1px dashed var(--focus-ring);outline-offset:-1px;border-radius:6px}.workspace-tab,.file-tab,.session-tab{min-width:0;height:var(--tab-h);border:0;border-right:1px solid var(--border-subtle);color:var(--text-muted);font:600 var(--tab-fs) Manrope;cursor:pointer;background:0 0;flex:none;align-items:center;gap:6px;padding:0 8px 0 10px;display:flex}.workspace-tab:hover,.file-tab:hover,.session-tab:hover{background:var(--bg-elevated);color:var(--text-primary)}.workspace-tab:focus-visible,.file-tab:focus-visible,.session-tab:focus-visible{outline:1px solid var(--focus-ring);outline-offset:-2px}.workspace-tab-active,.session-tab-active{background:var(--bg-elevated);color:var(--text-primary);box-shadow:inset 0 -2px 0 var(--focus-ring-glow)}.workspace-tab-label,.file-tab-label,.session-tab-label{text-overflow:ellipsis;white-space:nowrap;text-align:left;flex:auto;min-width:0;overflow:hidden}.workspace-tab-badge,.file-tab-badge{color:var(--text-muted);flex:none;font-size:9px;line-height:1}.workspace-tab-close,.file-tab-close,.session-tab-close{flex:0 0 var(--tab-close);width:var(--tab-close);height:var(--tab-close);color:var(--text-muted);cursor:pointer;background:0 0;border:0;border-radius:5px;justify-content:center;align-items:center;margin-right:-2px;padding:0;font:700 13px/1 Manrope;display:flex}.workspace-tab-close:hover,.file-tab-close:hover,.session-tab-close:hover{background:var(--bg-raised);color:var(--danger)}.workspace-tab-close:focus-visible,.file-tab-close:focus-visible,.session-tab-close:focus-visible{outline:1px solid var(--focus-ring);outline-offset:1px}.chat-tab-strip{background:var(--bg-inset);border-bottom:1px solid var(--border-subtle);flex-direction:row;flex:none;align-items:stretch;min-width:0;display:flex}.chat-tab-strip>.workspace-tab-strip,.chat-tab-strip>.session-tab-strip,.chat-tab-strip>.file-tab-strip{background:0 0;border-bottom:0;flex:auto;align-self:stretch;min-width:0}.chat-tab-divider{display:none}.file-tab-strip{background:var(--bg-elevated)}.file-tab{color:var(--text-secondary)}.file-tab:before{content:"▤";color:var(--text-muted);flex:none;font:600 10px/1 DM Mono,monospace}.file-tab:hover{background:var(--bg-hover);color:var(--text-primary)}.file-tab:hover:before{color:var(--text-primary)}.file-tab-active{background:var(--tab-active-bg);color:var(--text-primary);box-shadow:inset 0 -2px 0 var(--warning)}.file-tab-active:before{color:var(--warning)}.file-tab-active .file-tab-badge,.file-tab-active .file-tab-close{color:var(--text-primary)}.file-tab-active .file-tab-close:hover{background:var(--danger-bg);color:var(--danger)}.file-tab-close{color:var(--text-muted)}.file-tab-close:hover{background:var(--danger-bg);color:var(--danger)}.file-tab:focus-visible{outline:1px solid var(--warning);outline-offset:-2px}.file-tab-close:focus-visible{outline:1px solid var(--warning);outline-offset:1px}.file-open-mark{color:var(--warning);flex:none;font-size:9px;line-height:1}.chat>header{gap:14px;padding:10px 0 9px}.chat-head{flex:1;align-items:baseline;gap:10px;min-width:0;display:flex;overflow:hidden}.chat-head h1{text-overflow:ellipsis;white-space:nowrap;min-width:0;margin:0;font-size:15px;line-height:1.35;overflow:hidden}.chat-head p{text-overflow:ellipsis;white-space:nowrap;flex:none;max-width:100%;margin:0;overflow:hidden}.chat>header .badge{flex:none;padding:4px 8px}.files-panel{flex-direction:column;gap:9px;padding-top:13px;display:flex}.files-search{align-items:center;gap:6px;display:flex}.files-search-input{box-sizing:border-box;border:1px solid var(--border-subtle);background:var(--bg-input);min-width:0;color:var(--text-primary);border-radius:8px;flex:auto;padding:5px 9px;font:11px Manrope}.files-search-input:focus-visible{outline:1px solid var(--focus-ring);outline-offset:1px}.files-refresh{border:1px solid var(--border-subtle);background:var(--bg-elevated);width:26px;height:26px;color:var(--text-secondary);cursor:pointer;border-radius:8px;flex:none;font-size:13px;line-height:1}.files-refresh:hover{border-color:var(--border-strong);color:var(--text-primary)}.files-refresh:disabled{opacity:.4;cursor:not-allowed}.files-refresh:focus-visible{outline:1px solid var(--focus-ring);outline-offset:1px}.files-tree{border:1px solid var(--border-subtle);background:var(--bg-input);border-radius:9px;min-width:0;max-height:min(300px,38vh);padding:4px 0;overflow:auto}.file-list,.file-children{min-width:0;margin:0;padding:0;list-style:none}.file-row{box-sizing:border-box;width:100%;color:var(--text-primary);text-align:left;cursor:pointer;background:0 0;border:0;align-items:center;gap:6px;min-width:0;padding:3px 8px;font:11px Manrope;display:flex}.file-row:hover:not(:disabled){background:var(--bg-elevated);color:var(--text-primary)}.file-row:disabled{cursor:not-allowed;color:var(--text-muted)}.file-row:focus-visible{outline:1px solid var(--focus-ring);outline-offset:-2px}.file-caret{width:10px;color:var(--text-muted);flex:0 0 10px;font-size:9px;line-height:1}.file-name{text-overflow:ellipsis;white-space:nowrap;flex:auto;min-width:0;overflow:hidden}.file-badge,.picker-option-badge{border:1px solid var(--border-default);color:var(--text-muted);white-space:nowrap;border-radius:5px;flex:none;padding:1px 5px;font:9px DM Mono,monospace}.file-badge-path{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--text-muted);flex:0 auto;font:9px DM Mono,monospace;overflow:hidden}.file-row-loading,.file-row-empty,.file-row-error{color:var(--text-muted);padding:3px 10px;font:10px/1.6 Manrope;display:block}.file-row-error{color:var(--danger);overflow-wrap:anywhere}.file-search-note{border:1px dashed var(--border-default);color:var(--text-muted);overflow-wrap:anywhere;border-radius:8px;margin:0 0 5px;padding:5px 8px;font:10px/1.6 Manrope}.file-problem{border-style:solid;border-left:3px solid var(--danger-border)}.file-problem-title{color:var(--danger);margin:0 0 4px;font:600 11px/1.6 Manrope}.file-problem-hint{color:var(--text-muted);margin:0 0 5px;font:10px/1.7 Manrope}.file-problem-path{background:var(--bg-inset);color:var(--text-primary);overflow-wrap:anywhere;-webkit-user-select:all;user-select:all;border-radius:7px;margin:0;padding:5px 7px;font:10px/1.6 DM Mono,monospace;display:block}.files-footnote{color:var(--text-muted);overflow-wrap:anywhere;margin:2px 0 0;font:10px/1.6 Manrope}.file-editor{flex-direction:column;gap:7px;min-width:0;display:flex}.file-editor-head{justify-content:space-between;align-items:center;gap:8px;min-width:0;display:flex}.file-editor-path{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--text-muted);flex:auto;font:10px DM Mono,monospace;overflow:hidden}.file-editor-flags{flex:none;align-items:center;gap:7px;display:flex}.file-dirty{color:var(--warning);font:9px DM Mono,monospace}.file-save{border:1px solid var(--border-default);background:var(--bg-elevated);color:var(--text-primary);cursor:pointer;border-radius:7px;padding:3px 10px;font:700 10px Manrope}.file-save:hover{border-color:var(--border-strong);color:var(--text-primary)}.file-save:disabled{opacity:.5;cursor:not-allowed}.file-save:focus-visible{outline:1px solid var(--focus-ring);outline-offset:1px}.file-conflict{border:1px solid var(--warning-border);border-left:3px solid var(--warning-border);background:var(--warning-bg);border-radius:9px;padding:8px 10px}.file-conflict p{color:var(--warning);margin:0 0 7px;font:11px/1.6 Manrope}.file-conflict-actions{flex-wrap:wrap;gap:6px;display:flex}.file-conflict-actions button{border:1px solid var(--warning-border);background:var(--warning-bg);color:var(--warning);cursor:pointer;border-radius:7px;padding:3px 9px;font:600 10px Manrope}.file-conflict-actions button:hover{border-color:var(--warning-border)}.file-conflict-actions button:focus-visible{outline:1px solid var(--focus-ring);outline-offset:1px}.file-editor-message{overflow-wrap:anywhere;margin:0;font:10px/1.6 Manrope}.file-message-saved{color:var(--success)}.file-message-error{color:var(--danger)}.file-textarea{box-sizing:border-box;resize:vertical;border:1px solid var(--border-subtle);background:var(--bg-inset);width:100%;min-width:0;max-width:100%;height:min(340px,42vh);color:var(--text-primary);white-space:pre;tab-size:2;border-radius:9px;padding:8px 9px;font:12px/1.65 DM Mono,ui-monospace,monospace;overflow:auto}.file-textarea:focus-visible{outline:1px solid var(--focus-ring);outline-offset:1px}.chat>.chat-file-view{max-width:none;padding:32px 24px}.chat-file-view{flex-direction:column;flex:auto;min-height:0;display:flex}.chat-file-view>.file-editor{flex:auto;min-height:0}.chat-file-view>.file-editor>.file-textarea{flex:auto;height:auto;min-height:120px}@media (width<=700px){.chat-file-view{padding:14px 6px}}.chat-view{border:1px solid var(--border-default);min-width:0;color:var(--text-secondary);white-space:nowrap;border-left-width:3px;border-radius:7px;flex:0 auto;align-items:baseline;gap:6px;padding:3px 9px;display:flex}.chat-view-label{color:var(--text-muted);font:10px DM Mono,monospace}.chat-view-kind{color:var(--text-primary);font:700 11px Manrope}.chat-view-name{text-overflow:ellipsis;min-width:0;color:var(--text-muted);font:10px DM Mono,monospace;overflow:hidden}.chat-view-file{border-left-color:var(--warning)}.chat-view-session{border-left-color:var(--selected)}.chat-view-name{max-width:30ch}.conversation-fork{width:20px;height:20px;color:var(--text-secondary);cursor:pointer;opacity:0;background:0 0;border:0;border-radius:5px;flex:0 0 20px;place-items:center;font-size:13px;line-height:1;transition:color .12s,background .12s;display:grid}.conversation-row:hover .conversation-fork,.conversation-row:focus-within .conversation-fork,.conversation-archived:hover .conversation-fork,.conversation-archived:focus-within .conversation-fork,.conversation-fork:focus-visible{opacity:1}.conversation-row:has(.conversation.selected) .conversation-fork{opacity:1}.conversation-fork:hover{background:var(--bg-hover);color:var(--text-primary)}.conversation-fork:focus-visible{outline:1px solid var(--focus-ring);outline-offset:1px}.conversation-fork[data-fork-state=pending]{opacity:1;color:var(--warning);cursor:progress}.conversation-fork:disabled{cursor:progress}.conversation-fork:disabled:hover{color:var(--text-muted);background:0 0}.rail-resizer{z-index:5;cursor:col-resize;touch-action:none;-webkit-user-select:none;user-select:none;background:0 0;border:0;width:10px;padding:0;position:absolute;top:0;bottom:0}.rail-resizer:before{content:"";background:0 0;width:1px;transition:background .12s,width .12s;position:absolute;left:50%;transform:translate(-50%)}.rail-resizer-left{left:calc(var(--sidebar-width,270px) - 5px)}.rail-resizer-right{right:calc(var(--rail-col,320px) - 5px)}.rail-resizer:hover:before,.rail-resizer:focus-visible:before{background:var(--border-strong);width:2px}.rail-resizer:focus-visible{outline:1px solid var(--focus-ring);outline-offset:-1px}.rail-resizer.rail-resizer-dragging:before{background:var(--selected);width:3px;transition:none}@media (width<=1100px){.rail-resizer-right{display:none}}@media (width<=700px){.rail-resizer-left{display:none}}@media (prefers-reduced-motion:reduce){.rail-resizer:before{transition:none}}.chat{max-width:1680px}.chat>:not(.messages),.chat>.chat-tab-strip{width:100%;max-width:none;margin-inline:0;padding-inline:0}.chat-tab-strip>.workspace-tab-strip>.workspace-tab-row,.chat-tab-strip>.session-tab-strip>.session-tab-row,.chat-tab-strip>.file-tab-strip>.file-tab-row{width:100%;max-width:none;margin-inline:0}.messages{grid-template-columns:minmax(0,1fr);padding:32px 24px}.messages>*,.message-body{min-width:0}.message.assistant .message-body{width:100%}.message.assistant .content{min-width:0}.message.user{grid-template-columns:minmax(0,1fr) 34px}.message.user>.message-body{flex-direction:column;grid-area:1/1;align-items:flex-end;min-width:0;max-width:100%;display:flex}.message.user .meta{color:var(--text-secondary);margin:0 0 5px;font-size:11px;font-weight:600}.bubble{border:1px solid var(--border-default);background:var(--bg-raised);overflow-wrap:anywhere;border-radius:14px;width:fit-content;min-width:0;max-width:min(78%,720px);padding:10px 14px}.message.user .content{min-width:0}.message-actions{opacity:.42;align-items:center;gap:6px;margin-top:5px;transition:opacity .12s;display:flex}.message.user:hover .message-actions,.message.user:focus-within .message-actions,.message-actions:focus-within{opacity:1}@media (hover:none){.message-actions{opacity:1}}.message-copy,.message-revert{opacity:1;border:1px solid var(--border-default);color:var(--text-muted);cursor:pointer;background:0 0;border-radius:6px;margin-left:0;padding:2px 8px;font:11px Manrope;transition:opacity .12s,color .12s,border-color .12s}.message-copy:hover,.message-revert:hover{color:var(--text-primary);border-color:var(--border-strong)}.message-copy:focus-visible,.message-revert:focus-visible{outline:2px solid var(--focus-ring);outline-offset:2px}.message-copy[data-copy-state=copied]{color:var(--success);border-color:var(--success)}.message-copy[data-copy-state=error]{color:var(--danger);border-color:var(--danger-border)}@media (width<=700px){.shell{grid-template-rows:minmax(0,auto) minmax(254px,1fr);grid-template-columns:minmax(0,1fr)}}.mobile-nav{display:none}@media (width<=700px){html,body,#root{width:100%;min-width:0;height:100%;overflow:hidden}.shell{grid-template-rows:auto minmax(0,1fr);height:100dvh;min-height:0;overflow:hidden}aside{max-height:min(34dvh,250px);padding:8px 10px 6px;overflow:hidden}.brand{padding:2px 4px 8px}.brand>span{width:30px;height:30px;font-size:22px}.brand small{display:none}.sidebar-actions{display:block}.workspace-new{width:100%;min-height:42px;padding:9px 11px}.label{margin:10px 4px 6px;font-size:11px}nav{scrollbar-gutter:stable;gap:4px;max-height:min(22dvh,160px)}.workspace-group{padding-bottom:4px}.workspace-toggle,.conversation,.archived-toggle{min-height:42px}.workspace-toggle{padding:7px 5px}.workspace-add,.workspace-settings,.workspace-delete,.conversation-fork,.conversation-archive,.conversation-restore{min-width:38px;min-height:38px}.conversation{gap:6px;padding:7px 5px 7px 7px}aside footer{display:none}.chat{min-width:0;max-width:none;padding:0 10px}header{gap:8px;padding:10px 0 9px}header h1{text-overflow:ellipsis;white-space:nowrap;min-width:0;max-width:72%;font-size:16px;overflow:hidden}header p{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.badge{flex:none;padding:6px 8px}.messages{overscroll-behavior:contain;gap:18px;padding:14px 0 12px}.message{grid-template-columns:30px minmax(0,1fr);gap:9px}.avatar{width:30px;height:30px}.content{overflow-wrap:anywhere;font-size:14px;line-height:1.65}form{margin-bottom:max(8px, env(safe-area-inset-bottom));border-radius:11px}textarea{height:72px;min-height:72px;padding:12px;font-size:16px}.composer{min-height:48px;padding:5px 8px 8px 12px}.composer button{min-height:40px;padding:9px 15px}.chat-tab-strip{-webkit-overflow-scrolling:touch;min-height:36px;overflow-x:auto}.workspace-tab,.file-tab,.session-tab{height:40px;min-height:40px;padding-inline:9px}.right-rail{width:min(94vw,380px);max-width:100vw}.right-rail-head{min-height:52px;padding:8px 9px 0}.right-tab{min-height:42px;padding:9px 11px}.right-rail-collapse,.right-rail-open{min-width:40px;min-height:40px}.right-rail-body{padding:0 10px max(14px, env(safe-area-inset-bottom))}.tool-overlay{padding:8px}.tool-dialog{border-radius:12px;width:100%;max-height:calc(100dvh - 16px)}.mobile-nav{z-index:30;inset-inline:0;height:calc(58px + env(safe-area-inset-bottom));padding:4px 8px env(safe-area-inset-bottom);background:var(--bg-panel);border-top:1px solid var(--border-subtle);justify-content:space-around;gap:6px;display:flex;position:fixed;bottom:0}.mobile-nav button{color:var(--text-muted);cursor:pointer;background:0 0;border:0;border-radius:8px;flex:1;place-items:center;gap:1px;font-size:17px;display:grid}.mobile-nav button span{font:10px Manrope}.mobile-nav button.active{color:var(--selected);background:var(--selected-bg)}.shell{padding-bottom:calc(58px + env(safe-area-inset-bottom))}.shell.mobile-panel-workspaces>.chat,.shell.mobile-panel-workspaces>.right-rail{display:none}.shell.mobile-panel-workspaces>aside{height:100%;max-height:none;display:flex;overflow:auto}.shell.mobile-panel-chat>aside,.shell.mobile-panel-chat>.right-rail{display:none}.shell.mobile-panel-chat>.chat{grid-column:1}.shell.mobile-panel-rail>aside,.shell.mobile-panel-rail>.chat{display:none}.shell.mobile-panel-rail>.right-rail{width:100%;max-width:none;box-shadow:none;grid-column:1;display:flex;position:static}.shell.mobile-panel-rail>.right-rail .right-rail-open{display:none}}@media (width<=380px){aside{max-height:30dvh}nav{max-height:18dvh}.chat{padding-inline:8px}header p{display:none}.message{grid-template-columns:26px minmax(0,1fr);gap:7px}.avatar{width:26px;height:26px}.session-tab,.file-tab,.workspace-tab{padding-inline:7px}}@supports not selector(::-webkit-scrollbar){:root{scrollbar-width:thin;scrollbar-color:var(--scrollbar-thumb) var(--scrollbar-track)}}nav::-webkit-scrollbar{background:var(--bg-inset);width:12px;height:12px}.messages::-webkit-scrollbar{background:var(--bg-inset);width:12px;height:12px}.picker-list::-webkit-scrollbar{background:var(--bg-inset);width:12px;height:12px}.extui::-webkit-scrollbar{background:var(--bg-inset);width:12px;height:12px}.extui-widget::-webkit-scrollbar{background:var(--bg-inset);width:12px;height:12px}.subagent-output::-webkit-scrollbar{background:var(--bg-inset);width:12px;height:12px}.call-args::-webkit-scrollbar{background:var(--bg-inset);width:12px;height:12px}.queue-dock-list::-webkit-scrollbar{background:var(--bg-inset);width:12px;height:12px}.right-rail-body::-webkit-scrollbar{background:var(--bg-inset);width:12px;height:12px}.tool-dialog::-webkit-scrollbar{background:var(--bg-inset);width:12px;height:12px}.files-tree::-webkit-scrollbar{background:var(--bg-inset);width:12px;height:12px}.md-pre::-webkit-scrollbar{background:var(--bg-inset);width:12px;height:12px}.file-textarea::-webkit-scrollbar{background:var(--bg-inset);width:12px;height:12px}.md-table-wrap::-webkit-scrollbar{background:var(--bg-inset);width:12px;height:12px}.md-math-block::-webkit-scrollbar{background:var(--bg-inset);width:12px;height:12px}.file-tab-strip::-webkit-scrollbar{background:var(--bg-inset);width:12px;height:12px}.session-tab-strip::-webkit-scrollbar{background:var(--bg-inset);width:12px;height:12px}nav::-webkit-scrollbar-thumb{background:var(--scrollbar-thumb);background-clip:padding-box;border:3px solid #0000;border-radius:99px}.messages::-webkit-scrollbar-thumb{background:var(--scrollbar-thumb);background-clip:padding-box;border:3px solid #0000;border-radius:99px}.picker-list::-webkit-scrollbar-thumb{background:var(--scrollbar-thumb);background-clip:padding-box;border:3px solid #0000;border-radius:99px}.extui::-webkit-scrollbar-thumb{background:var(--scrollbar-thumb);background-clip:padding-box;border:3px solid #0000;border-radius:99px}.extui-widget::-webkit-scrollbar-thumb{background:var(--scrollbar-thumb);background-clip:padding-box;border:3px solid #0000;border-radius:99px}.subagent-output::-webkit-scrollbar-thumb{background:var(--scrollbar-thumb);background-clip:padding-box;border:3px solid #0000;border-radius:99px}.call-args::-webkit-scrollbar-thumb{background:var(--scrollbar-thumb);background-clip:padding-box;border:3px solid #0000;border-radius:99px}.queue-dock-list::-webkit-scrollbar-thumb{background:var(--scrollbar-thumb);background-clip:padding-box;border:3px solid #0000;border-radius:99px}.right-rail-body::-webkit-scrollbar-thumb{background:var(--scrollbar-thumb);background-clip:padding-box;border:3px solid #0000;border-radius:99px}.tool-dialog::-webkit-scrollbar-thumb{background:var(--scrollbar-thumb);background-clip:padding-box;border:3px solid #0000;border-radius:99px}.files-tree::-webkit-scrollbar-thumb{background:var(--scrollbar-thumb);background-clip:padding-box;border:3px solid #0000;border-radius:99px}.md-pre::-webkit-scrollbar-thumb{background:var(--scrollbar-thumb);background-clip:padding-box;border:3px solid #0000;border-radius:99px}.file-textarea::-webkit-scrollbar-thumb{background:var(--scrollbar-thumb);background-clip:padding-box;border:3px solid #0000;border-radius:99px}.md-table-wrap::-webkit-scrollbar-thumb{background:var(--scrollbar-thumb);background-clip:padding-box;border:3px solid #0000;border-radius:99px}.md-math-block::-webkit-scrollbar-thumb{background:var(--scrollbar-thumb);background-clip:padding-box;border:3px solid #0000;border-radius:99px}.file-tab-strip::-webkit-scrollbar-thumb{background:var(--scrollbar-thumb);background-clip:padding-box;border:3px solid #0000;border-radius:99px}.session-tab-strip::-webkit-scrollbar-thumb{background:var(--scrollbar-thumb);background-clip:padding-box;border:3px solid #0000;border-radius:99px}nav:hover::-webkit-scrollbar-thumb{background:var(--scrollbar-thumb-active);border-width:1px}.messages:hover::-webkit-scrollbar-thumb{background:var(--scrollbar-thumb-active);border-width:1px}.picker-list:hover::-webkit-scrollbar-thumb{background:var(--scrollbar-thumb-active);border-width:1px}.extui:hover::-webkit-scrollbar-thumb{background:var(--scrollbar-thumb-active);border-width:1px}.extui-widget:hover::-webkit-scrollbar-thumb{background:var(--scrollbar-thumb-active);border-width:1px}.subagent-output:hover::-webkit-scrollbar-thumb{background:var(--scrollbar-thumb-active);border-width:1px}.call-args:hover::-webkit-scrollbar-thumb{background:var(--scrollbar-thumb-active);border-width:1px}.queue-dock-list:hover::-webkit-scrollbar-thumb{background:var(--scrollbar-thumb-active);border-width:1px}.right-rail-body:hover::-webkit-scrollbar-thumb{background:var(--scrollbar-thumb-active);border-width:1px}.tool-dialog:hover::-webkit-scrollbar-thumb{background:var(--scrollbar-thumb-active);border-width:1px}.files-tree:hover::-webkit-scrollbar-thumb{background:var(--scrollbar-thumb-active);border-width:1px}.md-pre:hover::-webkit-scrollbar-thumb{background:var(--scrollbar-thumb-active);border-width:1px}.file-textarea:hover::-webkit-scrollbar-thumb{background:var(--scrollbar-thumb-active);border-width:1px}.md-table-wrap:hover::-webkit-scrollbar-thumb{background:var(--scrollbar-thumb-active);border-width:1px}.md-math-block:hover::-webkit-scrollbar-thumb{background:var(--scrollbar-thumb-active);border-width:1px}.file-tab-strip:hover::-webkit-scrollbar-thumb{background:var(--scrollbar-thumb-active);border-width:1px}.session-tab-strip:hover::-webkit-scrollbar-thumb{background:var(--scrollbar-thumb-active);border-width:1px}nav::-webkit-scrollbar-thumb:hover{background:var(--scrollbar-thumb-active);border-width:1px}.messages::-webkit-scrollbar-thumb:hover{background:var(--scrollbar-thumb-active);border-width:1px}.picker-list::-webkit-scrollbar-thumb:hover{background:var(--scrollbar-thumb-active);border-width:1px}.extui::-webkit-scrollbar-thumb:hover{background:var(--scrollbar-thumb-active);border-width:1px}.extui-widget::-webkit-scrollbar-thumb:hover{background:var(--scrollbar-thumb-active);border-width:1px}.subagent-output::-webkit-scrollbar-thumb:hover{background:var(--scrollbar-thumb-active);border-width:1px}.call-args::-webkit-scrollbar-thumb:hover{background:var(--scrollbar-thumb-active);border-width:1px}.queue-dock-list::-webkit-scrollbar-thumb:hover{background:var(--scrollbar-thumb-active);border-width:1px}.right-rail-body::-webkit-scrollbar-thumb:hover{background:var(--scrollbar-thumb-active);border-width:1px}.tool-dialog::-webkit-scrollbar-thumb:hover{background:var(--scrollbar-thumb-active);border-width:1px}.files-tree::-webkit-scrollbar-thumb:hover{background:var(--scrollbar-thumb-active);border-width:1px}.md-pre::-webkit-scrollbar-thumb:hover{background:var(--scrollbar-thumb-active);border-width:1px}.file-textarea::-webkit-scrollbar-thumb:hover{background:var(--scrollbar-thumb-active);border-width:1px}.md-table-wrap::-webkit-scrollbar-thumb:hover{background:var(--scrollbar-thumb-active);border-width:1px}.md-math-block::-webkit-scrollbar-thumb:hover{background:var(--scrollbar-thumb-active);border-width:1px}.file-tab-strip::-webkit-scrollbar-thumb:hover{background:var(--scrollbar-thumb-active);border-width:1px}.session-tab-strip::-webkit-scrollbar-thumb:hover{background:var(--scrollbar-thumb-active);border-width:1px}nav::-webkit-scrollbar-thumb:active{background:var(--scrollbar-thumb-active);border-width:1px}.messages::-webkit-scrollbar-thumb:active{background:var(--scrollbar-thumb-active);border-width:1px}.picker-list::-webkit-scrollbar-thumb:active{background:var(--scrollbar-thumb-active);border-width:1px}.extui::-webkit-scrollbar-thumb:active{background:var(--scrollbar-thumb-active);border-width:1px}.extui-widget::-webkit-scrollbar-thumb:active{background:var(--scrollbar-thumb-active);border-width:1px}.subagent-output::-webkit-scrollbar-thumb:active{background:var(--scrollbar-thumb-active);border-width:1px}.call-args::-webkit-scrollbar-thumb:active{background:var(--scrollbar-thumb-active);border-width:1px}.queue-dock-list::-webkit-scrollbar-thumb:active{background:var(--scrollbar-thumb-active);border-width:1px}.right-rail-body::-webkit-scrollbar-thumb:active{background:var(--scrollbar-thumb-active);border-width:1px}.tool-dialog::-webkit-scrollbar-thumb:active{background:var(--scrollbar-thumb-active);border-width:1px}.files-tree::-webkit-scrollbar-thumb:active{background:var(--scrollbar-thumb-active);border-width:1px}.md-pre::-webkit-scrollbar-thumb:active{background:var(--scrollbar-thumb-active);border-width:1px}.file-textarea::-webkit-scrollbar-thumb:active{background:var(--scrollbar-thumb-active);border-width:1px}.md-table-wrap::-webkit-scrollbar-thumb:active{background:var(--scrollbar-thumb-active);border-width:1px}.md-math-block::-webkit-scrollbar-thumb:active{background:var(--scrollbar-thumb-active);border-width:1px}.file-tab-strip::-webkit-scrollbar-thumb:active{background:var(--scrollbar-thumb-active);border-width:1px}.session-tab-strip::-webkit-scrollbar-thumb:active{background:var(--scrollbar-thumb-active);border-width:1px}nav,.messages,.picker-list,.extui,.extui-widget,.subagent-output,.call-args,.queue-dock-list,.right-rail-body,.tool-dialog,.files-tree{scrollbar-gutter:stable}.theme-settings-trigger{border:1px solid var(--border-default);background:var(--bg-raised);width:100%;color:var(--text-secondary);cursor:pointer;text-align:left;border-radius:8px;align-items:center;gap:7px;padding:7px 8px;font:11px DM Mono,monospace;transition:background .12s,border-color .12s,color .12s;display:flex}.theme-settings-trigger:hover{background:var(--bg-hover);border-color:var(--border-strong);color:var(--text-primary)}.theme-settings-trigger:focus-visible{outline:2px solid var(--focus-ring);outline-offset:-1px}.theme-settings-trigger[aria-expanded=true]{background:var(--bg-hover);border-color:var(--border-strong);color:var(--text-primary)}.settings-window{width:min(720px,100vw - 32px);padding:0}.settings-window-head{padding:18px 20px 0}.settings-window-body{border-top:1px solid var(--border-subtle);grid-template-columns:156px minmax(0,1fr);margin-top:13px;display:grid}.settings-nav{border-right:1px solid var(--border-subtle);background:var(--bg-panel);align-content:start;gap:2px;padding:14px 10px;display:grid}.settings-nav-label{letter-spacing:.13em;text-transform:uppercase;color:var(--text-muted);padding:0 9px 7px;font:700 10px Manrope}.settings-category{width:100%;color:var(--text-secondary);cursor:pointer;text-align:left;background:0 0;border:0;border-radius:8px;padding:8px 9px;font:600 12px Manrope}.settings-category:hover{background:var(--bg-hover);color:var(--text-primary)}.settings-category:focus-visible{outline:1px solid var(--focus-ring);outline-offset:-1px}.settings-category[aria-selected=true]{background:var(--selected-bg);color:var(--text-primary);box-shadow:inset 2px 0 0 var(--selected-border)}.settings-panel{align-content:start;min-width:0;padding:16px 20px 20px;display:grid}.settings-panel-title{color:var(--text-primary);margin:0 0 2px;font:600 13px Manrope}.settings-window .picker-actions{margin-top:20px}.theme-options{grid-template-columns:1fr 1fr;gap:10px;margin:16px 0 0;display:grid}.theme-option{border:1px solid var(--border-default);background:var(--bg-input);color:var(--text-primary);cursor:pointer;text-align:left;border-radius:11px;gap:8px;padding:10px;display:grid;position:relative}.theme-option:hover{border-color:var(--border-strong)}.theme-option:focus-visible{outline:2px solid var(--focus-ring);outline-offset:1px}.theme-option[aria-pressed=true]{border-color:var(--selected);box-shadow:0 0 0 1px var(--selected)}.theme-option-name{align-items:baseline;gap:7px;font:600 13px Manrope;display:flex}.theme-option-name small,.theme-option-blurb{color:var(--text-muted);font:11px DM Mono,monospace}.theme-current-line{margin-top:10px}.theme-preview{border:1px solid var(--border-default);background:var(--bg-app);border-radius:7px;grid-template-columns:22px 1fr;gap:5px;height:52px;padding:5px;display:grid;overflow:hidden}.theme-preview-rail{background:var(--bg-panel);border-radius:3px}.theme-preview-body{align-content:start;gap:3px;display:grid}.theme-preview-line{background:var(--text-primary);opacity:.9;border-radius:2px;height:5px}.theme-preview-line.dim{background:var(--text-muted)}.theme-preview-line.accent{background:var(--accent)}.theme-preview-panel{background:var(--bg-elevated);border-radius:3px;height:100%}.theme-option-current{letter-spacing:.06em;color:var(--selected);align-items:center;gap:4px;margin-left:auto;font:700 10px Manrope;display:inline-flex}.theme-empty{text-align:center;color:var(--text-muted);overflow-wrap:anywhere;padding:26px 14px;font:11px DM Mono,monospace}@media (width<=560px){.theme-options{grid-template-columns:1fr}}@media (width<=620px){.settings-window-body{grid-template-columns:1fr}.settings-nav{border-right:0;border-bottom:1px solid var(--border-subtle);grid-auto-columns:max-content;grid-auto-flow:column;justify-content:start;padding:10px}.settings-nav-label{align-self:center;padding:0 9px 0 0}}.settings-agents-container{gap:16px;min-width:0;display:grid}.settings-agents-header{background:var(--bg-elevated);border:1px solid var(--border-subtle);border-radius:10px;justify-content:space-between;align-items:flex-start;gap:14px;padding:12px 14px;display:flex}.settings-agents-desc{color:var(--text-secondary);flex:1;margin:0;font-size:12px;line-height:1.6}.settings-agent-rescan-btn{background:var(--bg-input);border:1px solid var(--border-default);color:var(--text-primary);cursor:pointer;border-radius:8px;flex-shrink:0;padding:6px 12px;font:600 12px Manrope}.settings-agent-rescan-btn:hover{background:var(--bg-hover);border-color:var(--border-strong)}.settings-agent-rescan-btn:disabled{opacity:.5;cursor:not-allowed}.settings-section{gap:10px;display:grid}.settings-section-title{color:var(--text-primary);letter-spacing:.02em;margin:0;font:600 12px Manrope}.settings-dirs-list{gap:6px;display:grid}.settings-dir-row{border:1px solid var(--border-default);background:var(--bg-input);border-radius:8px;justify-content:space-between;align-items:center;gap:10px;min-width:0;padding:8px 12px;display:flex}.settings-dir-info{flex:1;align-items:center;gap:8px;min-width:0;display:flex;overflow:hidden}.settings-dir-priority{color:var(--text-muted);flex-shrink:0;font:700 11px DM Mono,monospace}.settings-dir-path{color:var(--text-primary);text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;font:12px DM Mono,monospace;overflow:hidden}.settings-dir-tag{border:1px solid var(--border-subtle);background:var(--bg-raised);color:var(--text-secondary);border-radius:4px;flex-shrink:0;padding:2px 6px;font:10px Manrope}.settings-dir-count{color:var(--text-muted);flex-shrink:0;font:11px Manrope}.settings-dir-remove-btn{border:1px solid var(--danger-border);background:var(--danger-bg);color:var(--danger);cursor:pointer;border-radius:6px;flex-shrink:0;padding:3px 8px;font:11px Manrope}.settings-dir-remove-btn:hover{filter:brightness(1.1)}.settings-add-dir-form{gap:8px;display:flex}.settings-dir-input{border:1px solid var(--border-default);background:var(--bg-input);min-width:0;color:var(--text-primary);border-radius:8px;outline:0;flex:1;padding:8px 11px;font:12px DM Mono,monospace}.settings-dir-input:focus{border-color:var(--focus-ring)}.settings-dir-add-btn{border:1px solid var(--border-default);background:var(--bg-hover);color:var(--text-primary);cursor:pointer;border-radius:8px;flex-shrink:0;padding:8px 14px;font:600 12px Manrope}.settings-dir-add-btn:hover:not(:disabled){border-color:var(--border-strong)}.settings-dir-add-btn:disabled{opacity:.4;cursor:not-allowed}.settings-dir-error{color:var(--danger);font:11px Manrope}.settings-problems-section{border:1px solid var(--warning-border);background:var(--warning-bg);border-radius:10px;padding:12px}.settings-problems-title{color:var(--warning)}.settings-problems-list{color:var(--text-primary);gap:4px;font:11px DM Mono,monospace;display:grid}.settings-problem-row{overflow-wrap:anywhere}.settings-problem-file{color:var(--warning);font-weight:700}.settings-empty-hint{color:var(--text-muted);border:1px dashed var(--border-subtle);text-align:center;border-radius:8px;padding:14px;font:12px Manrope}.settings-agent-grid{grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:10px;max-height:260px;padding-right:4px;display:grid;overflow-y:auto}.settings-agent-card{border:1px solid var(--border-default);background:var(--bg-input);border-radius:9px;gap:6px;padding:10px 12px;display:grid}.settings-agent-card:hover{border-color:var(--border-strong)}.settings-agent-card-header{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.settings-agent-name{color:var(--text-primary);font:600 13px Manrope}.settings-agent-id{color:var(--text-muted);font:11px DM Mono,monospace}.settings-agent-mode-badge{border:1px solid var(--border-subtle);background:var(--bg-raised);color:var(--text-secondary);border-radius:99px;margin-left:auto;padding:1px 6px;font:10px Manrope}.settings-agent-mode-badge.subagent{color:var(--info);border-color:var(--info)}.settings-agent-source{color:var(--text-muted);text-overflow:ellipsis;white-space:nowrap;font:10px DM Mono,monospace;overflow:hidden}.settings-agent-desc{color:var(--text-secondary);-webkit-line-clamp:2;-webkit-box-orient:vertical;font:11px/1.4 Manrope;display:-webkit-box;overflow:hidden}.settings-agent-footer{border-top:1px solid var(--border-subtle);color:var(--text-muted);justify-content:space-between;align-items:center;gap:6px;padding-top:6px;font:10px DM Mono,monospace;display:flex}.settings-agent-tools{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.settings-agent-model{color:var(--text-secondary);flex-shrink:0}.restart-needed-trigger{border-color:var(--warning-border);color:var(--warning);background:var(--warning-bg)}.restart-needed-trigger:hover{border-color:var(--warning)}.chevron-folder{text-align:center;font-size:15px;line-height:1}.workspace-toggle>.chevron-folder,.archived-toggle>.chevron-folder{flex:none;min-width:auto;overflow:visible}.ctx-menu{z-index:45;border:1px solid var(--border-default);background:var(--bg-raised);min-width:190px;max-width:min(320px,100vw - 16px);box-shadow:0 12px 32px var(--shadow-faint);border-radius:10px;gap:1px;padding:5px;display:grid;position:fixed}.ctx-menu-item{width:100%;color:var(--text-primary);text-align:left;cursor:pointer;background:0 0;border:0;border-radius:7px;padding:7px 10px;font:12px Manrope;display:block}.ctx-menu-item:hover{background:var(--bg-hover)}.ctx-menu-item:focus-visible{outline:2px solid var(--focus-ring);outline-offset:-2px}.ctx-menu-hint{color:var(--text-muted);overflow-wrap:anywhere;padding:2px 10px 4px;font:10px DM Mono,monospace}.toasts{z-index:55;pointer-events:none;justify-items:end;gap:8px;width:max-content;max-width:min(360px,100vw - 32px);margin:0;display:grid;position:fixed;top:14px;right:16px}.toast{pointer-events:auto;border:1px solid var(--border-default);background:var(--bg-raised);min-width:0;color:var(--text-primary);overflow-wrap:anywhere;word-break:break-word;box-shadow:0 10px 24px var(--shadow-faint);border-radius:10px;padding:10px 13px;font-size:12px;line-height:1.6}.toast-info{border-color:var(--accent-border);background:var(--accent-bg);color:var(--text-primary)}.toast{pointer-events:auto;box-shadow:0 10px 28px var(--shadow-faint)}.workspace-picker{width:min(580px,100vw - 32px)}.picker-path-bar{gap:7px;margin-bottom:8px;display:flex}.picker-path-input{border:1px solid var(--border-default);background:var(--bg-input);min-width:0;color:var(--text-primary);border-radius:8px;outline:0;flex:1;padding:7px 10px;font:12px DM Mono,monospace}.picker-path-input:focus{border-color:var(--focus-ring)}.picker-go-btn{border:1px solid var(--border-default);background:var(--bg-hover);color:var(--text-primary);cursor:pointer;border-radius:8px;flex-shrink:0;padding:7px 13px;font:600 12px Manrope}.picker-go-btn:hover:not(:disabled){border-color:var(--border-strong)}.picker-go-btn:disabled{opacity:.4;cursor:not-allowed}.picker-up-btn{border:1px solid var(--border-default);background:var(--bg-input);color:var(--text-secondary);cursor:pointer;border-radius:8px;flex-shrink:0;padding:7px 11px;font:12px Manrope}.picker-up-btn:hover:not(:disabled){background:var(--bg-hover);color:var(--text-primary);border-color:var(--border-strong)}.picker-up-btn:disabled{opacity:.4;cursor:not-allowed}.picker-shortcuts{flex-wrap:wrap;align-items:center;gap:6px;margin-bottom:9px;display:flex}.picker-shortcuts-label{color:var(--text-muted);font:11px Manrope}.picker-shortcut{border:1px solid var(--border-subtle);background:var(--bg-input);color:var(--text-secondary);cursor:pointer;border-radius:6px;padding:3px 8px;font:11px DM Mono,monospace}.picker-shortcut:hover{background:var(--bg-hover);color:var(--text-primary);border-color:var(--border-default)}.message-images{flex-wrap:wrap;gap:8px;margin-bottom:8px;display:flex}.message-image-btn{border:1px solid var(--border-default);background:var(--bg-raised);cursor:pointer;border-radius:8px;justify-content:center;align-items:center;max-width:240px;max-height:180px;padding:0;transition:border-color .12s;display:inline-flex;overflow:hidden}.message-image-btn:hover{border-color:var(--border-strong)}.message-image-btn:focus-visible{outline:2px solid var(--focus-ring);outline-offset:2px}.message-image-thumb{object-fit:cover;border-radius:7px;max-width:100%;max-height:180px;display:block}.composer-dropzone-active{outline:2px dashed var(--border-strong);outline-offset:-2px}.composer-attachments{border-top:1px solid var(--border-subtle);background:var(--bg-raised);flex-wrap:wrap;gap:8px;padding:8px 14px;display:flex}.composer-attachment-item{background:var(--bg-panel);border:1px solid var(--border-default);color:var(--text-secondary);border-radius:6px;align-items:center;gap:6px;max-width:220px;padding:3px 8px;font:11px DM Mono,monospace;display:inline-flex}.composer-attachment-thumb{object-fit:cover;cursor:pointer;border-radius:4px;flex-shrink:0;width:26px;height:26px}.composer-attachment-name{text-overflow:ellipsis;white-space:nowrap;flex:auto;min-width:0;overflow:hidden}.composer-attachment-remove{color:var(--text-muted);cursor:pointer;background:0 0;border:0;border-radius:3px;flex-shrink:0;padding:1px 4px;font-size:11px;line-height:1}.composer-attachment-remove:hover{color:var(--danger);background:var(--bg-hover)}.composer-attachment-uploading{color:var(--text-muted);font:italic 11px Manrope}.composer-hints{align-items:center;gap:10px;min-width:0;display:flex}.composer-actions{flex-shrink:0;align-items:center;gap:8px;display:flex}.composer button.composer-attach-btn{border:1px solid var(--border-default);background:var(--bg-panel);color:var(--text-secondary);cursor:pointer;border-radius:6px;align-items:center;gap:4px;padding:4px 9px;font:600 11px Manrope;transition:border-color .12s,color .12s,background .12s;display:inline-flex}.composer button.composer-attach-btn:hover:not(:disabled){background:var(--bg-hover);color:var(--text-primary);border-color:var(--border-strong)}.composer button.composer-attach-btn:disabled{opacity:.4;cursor:not-allowed}.lightbox-overlay{z-index:70;background:var(--overlay);place-items:center;padding:16px;display:grid;position:fixed;inset:0}.lightbox-dialog{border:1px solid var(--border-strong);background:var(--bg-raised);width:min(900px,100%);max-height:min(90vh,860px);box-shadow:0 25px 60px var(--shadow);border-radius:14px;flex-direction:column;display:flex;overflow:hidden}.lightbox-head{border-bottom:1px solid var(--border-subtle);justify-content:space-between;align-items:center;gap:10px;min-width:0;padding:12px 16px;display:flex}.lightbox-title{min-width:0;color:var(--text-primary);text-overflow:ellipsis;white-space:nowrap;align-items:center;gap:8px;margin:0;font:700 13px Manrope;display:flex;overflow:hidden}.lightbox-close{color:var(--text-muted);cursor:pointer;background:0 0;border:0;border-radius:6px;padding:4px 8px;font-size:16px;line-height:1;transition:color .12s,background .12s}.lightbox-close:hover{color:var(--text-primary);background:var(--bg-hover)}.lightbox-close:focus-visible{outline:1px solid var(--focus-ring);outline-offset:1px}.lightbox-body{background:var(--bg-inset);justify-content:center;align-items:center;padding:16px;display:flex;overflow:auto}.lightbox-image{object-fit:contain;border-radius:6px;max-width:100%;max-height:calc(min(90vh,860px) - 70px);display:block}.workflow-card{border:1px solid var(--border-subtle);background:var(--bg-panel);border-radius:8px;margin:8px 0;padding:10px 12px}.workflow-running{border-left:3px solid var(--info)}.workflow-completed{border-left:3px solid var(--success)}.workflow-failed{border-left:3px solid var(--danger)}.workflow-stopped{border-left:3px solid var(--border-strong)}.workflow-head{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.workflow-badge{color:var(--text-muted);border:1px solid var(--border-subtle);border-radius:999px;flex:none;padding:0 6px;font-size:11px}.workflow-summary{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--text-primary);flex:auto;font-size:13px;overflow:hidden}.workflow-progress{color:var(--text-secondary);font-variant-numeric:tabular-nums;flex:none;font-size:12px}.workflow-policy{color:var(--text-muted);flex:none;font-size:11px}.workflow-status{color:var(--text-secondary);flex:none;font-size:12px}.workflow-clock{color:var(--text-muted);font-variant-numeric:tabular-nums;flex:none;font-size:11px}.workflow-stop{color:var(--danger);background:var(--danger-bg);border:1px solid var(--danger-border);cursor:pointer;border-radius:4px;flex:none;padding:1px 8px;font-size:11px}.workflow-stop:hover{background:var(--bg-hover)}.workflow-stop:focus-visible{outline:1px solid var(--focus-ring);outline-offset:1px}.workflow-steps{flex-direction:column;gap:2px;margin:8px 0 0;padding:0;list-style:none;display:flex}.workflow-step{border-left:2px solid var(--border-subtle);align-items:baseline;gap:8px;padding:3px 6px 3px 8px;font-size:12px;line-height:1.5;display:flex}.workflow-step-completed{border-left-color:var(--success)}.workflow-step-running{border-left-color:var(--info)}.workflow-step-failed{border-left-color:var(--danger)}.workflow-step-skipped{border-left-color:var(--warning)}.workflow-step-stopped{border-left-color:var(--border-strong)}.workflow-step-mark{width:1em;color:var(--text-muted);flex:none;font-size:11px}.workflow-step-completed .workflow-step-mark{color:var(--success)}.workflow-step-running .workflow-step-mark{color:var(--info)}.workflow-step-failed .workflow-step-mark{color:var(--danger)}.workflow-step-skipped .workflow-step-mark{color:var(--warning)}.workflow-step-n{color:var(--text-muted);font-variant-numeric:tabular-nums;flex:none}.workflow-step-name{color:var(--text-primary);text-overflow:ellipsis;white-space:nowrap;font-weight:500;overflow:hidden}.workflow-step-skipped .workflow-step-name,.workflow-step-stopped .workflow-step-name{color:var(--text-muted)}.workflow-step-agent{color:var(--text-muted);flex:none;font-size:11px}.workflow-step-tries{color:var(--warning);flex:none;font-size:11px}.workflow-step-status{color:var(--text-secondary);flex:none;margin-left:auto;font-size:11px}.workflow-step-why{color:var(--danger);flex:1 0 100%;margin:2px 0 0;font-size:11px;line-height:1.5}.help-window{width:min(780px,100vw - 32px)}.help-window-head{justify-content:space-between;align-items:center;padding:18px 20px 0;display:flex}.help-head-title{align-items:center;gap:10px;display:flex}.help-badge{background:var(--bg-hover);color:var(--text-muted);border:1px solid var(--border-subtle);border-radius:4px;padding:2px 6px;font:700 10px DM Mono,monospace}.help-close-button{color:var(--text-muted);cursor:pointer;background:0 0;border:0;border-radius:6px;padding:4px 8px;font-size:14px;transition:background .12s,color .12s}.help-close-button:hover{background:var(--bg-hover);color:var(--text-primary)}.help-close-button:focus-visible{outline:2px solid var(--focus-ring);outline-offset:-1px}.help-window-body{max-height:min(75vh,640px)}.help-nav{overflow-y:auto}.help-category{align-items:center;gap:8px;display:flex}.help-tab-icon{font-size:13px;line-height:1}.help-panel{max-height:min(75vh,640px);padding:18px 24px;overflow-y:auto}.help-panel-header{border-bottom:1px solid var(--border-subtle);margin-bottom:16px;padding-bottom:12px}.help-panel-title{color:var(--text-primary);margin:0 0 4px;font:700 15px Manrope}.help-panel-desc{color:var(--text-muted);margin:0;font:12px/1.5 DM Mono,monospace}.help-panel-content{flex-direction:column;gap:14px;display:flex}.help-section-group{flex-direction:column;gap:12px;display:flex}.help-card{border:1px solid var(--border-default);background:var(--bg-raised);border-radius:9px;padding:14px 16px}.help-card.highlight{background:var(--bg-elevated);border-color:var(--border-strong)}.help-card h4{color:var(--text-primary);margin:0 0 8px;font:700 13px Manrope}.help-card p{color:var(--text-secondary);margin:0;font:12px/1.6 Manrope,system-ui}.help-list{color:var(--text-secondary);flex-direction:column;gap:6px;margin:8px 0 0;padding-left:18px;font:12px/1.6 Manrope,system-ui;display:flex}.help-steps{flex-direction:column;gap:12px;margin-top:10px;display:flex}.help-step{align-items:flex-start;gap:10px;display:flex}.step-num{background:var(--bg-hover);width:22px;height:22px;color:var(--text-primary);border:1px solid var(--border-default);border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;font:700 11px DM Mono,monospace;display:flex}.step-body{min-width:0;color:var(--text-secondary);flex:1;font:12px/1.6 Manrope,system-ui}.step-body strong{color:var(--text-primary);margin-bottom:2px;display:block}.help-code-block{background:var(--bg-inset);border:1px solid var(--border-subtle);color:var(--text-primary);border-radius:6px;margin:8px 0 0;padding:10px 12px;font:11px/1.5 DM Mono,monospace;overflow-x:auto}.help-command-table{flex-direction:column;gap:8px;margin-top:8px;display:flex}.cmd-row{background:var(--bg-inset);border:1px solid var(--border-subtle);border-radius:6px;flex-direction:column;gap:3px;padding:8px 10px;font:12px Manrope,system-ui;display:flex}.cmd-row code{color:var(--text-primary);width:fit-content;font:500 11px DM Mono,monospace}.cmd-row span{color:var(--text-muted);font-size:11px}.help-theme-list{grid-template-columns:1fr 1fr;gap:10px;margin-top:10px;display:grid}.help-theme-item{background:var(--bg-inset);border:1px solid var(--border-subtle);border-radius:6px;padding:10px 12px}.help-theme-item strong{color:var(--text-primary);margin-bottom:4px;font:600 12px Manrope;display:block}.help-theme-item p{color:var(--text-muted);margin:0;font:11px/1.5 Manrope}.help-hint{color:var(--text-muted);margin:10px 0 0;font:11px DM Mono,monospace}.help-actions{justify-content:flex-end;margin-top:16px;display:flex}.model-rules-fields{border:0;gap:12px;margin:0;padding:0;display:grid}.model-rules-fields [role=alert]{color:var(--danger)}.settings-panel-container{gap:16px;min-width:0;display:grid}.settings-rule-card{border:1px solid var(--border-default);background:var(--bg-input);border-radius:8px;justify-content:space-between;align-items:center;gap:12px;min-width:0;padding:10px 14px;transition:border-color .15s;display:flex}.settings-rule-card:hover{border-color:var(--border-strong)}.settings-rule-card.editing{border-color:var(--focus-ring);background:var(--bg-raised)}.settings-rule-info{flex:1;align-items:center;gap:10px;min-width:0;display:flex;overflow:hidden}.settings-rule-patterns{flex-wrap:wrap;align-items:center;gap:8px;min-width:0;display:flex}.settings-rule-pill{align-items:center;gap:6px;min-width:0;display:inline-flex}.settings-rule-pill-tag{border:1px solid var(--border-subtle);background:var(--bg-raised);color:var(--text-secondary);border-radius:4px;flex-shrink:0;padding:2px 6px;font:600 10px Manrope}.settings-rule-code{color:var(--text-primary);background:var(--bg-inset);border:1px solid var(--border-subtle);text-overflow:ellipsis;white-space:nowrap;border-radius:4px;max-width:180px;padding:3px 7px;font:11px/1.4 DM Mono,monospace;overflow:hidden}.settings-rule-arrow{color:var(--text-muted);flex-shrink:0;font-size:12px;font-weight:700}.settings-rule-actions{flex-shrink:0;align-items:center;gap:8px;display:flex}.settings-rule-edit-btn{border:1px solid var(--border-default);background:var(--bg-hover);color:var(--text-primary);cursor:pointer;border-radius:6px;flex-shrink:0;padding:4px 10px;font:600 11px Manrope;transition:border-color .15s}.settings-rule-edit-btn:hover{border-color:var(--border-strong)}.settings-rule-cancel-btn{border:1px solid var(--border-subtle);color:var(--text-muted);cursor:pointer;background:0 0;border-radius:8px;flex-shrink:0;padding:8px 14px;font:500 12px Manrope;transition:color .15s,border-color .15s}.settings-rule-cancel-btn:hover{color:var(--text-primary);border-color:var(--border-default)}.settings-rule-fieldset{border:0;gap:12px;margin:0;padding:0;display:grid}.settings-rule-form-grid{grid-template-columns:1fr 1fr;gap:12px;display:grid}@media (width<=600px){.settings-rule-form-grid{grid-template-columns:1fr}}.settings-rule-input-group{gap:6px;display:grid}.settings-rule-label-text{color:var(--text-secondary);letter-spacing:.02em;font:600 11px Manrope}.settings-rule-form-buttons{align-items:center;gap:10px;margin-top:2px;display:flex}.settings-memory-fieldset{border:0;gap:16px;margin:0;padding:0;display:grid}.settings-memory-switches{flex-wrap:wrap;align-items:center;gap:16px;display:flex}.settings-checkbox-label{color:var(--text-primary);cursor:pointer;align-items:center;gap:8px;font:500 12px Manrope;display:inline-flex}.settings-checkbox-label input[type=checkbox]{cursor:pointer;accent-color:var(--selected)}.settings-memory-interval-row{flex-wrap:wrap;align-items:center;gap:10px;display:flex}.settings-memory-interval-label{color:var(--text-secondary);align-items:center;gap:8px;font:500 12px Manrope;display:inline-flex}.settings-interval-input{text-align:center;width:70px;padding:6px 8px}.settings-memory-category-header{justify-content:space-between;align-items:center;gap:10px;display:flex}.settings-memory-select{border:1px solid var(--border-default);background:var(--bg-input);color:var(--text-primary);cursor:pointer;border-radius:8px;outline:0;padding:6px 12px;font:500 12px Manrope}.settings-memory-select:focus{border-color:var(--focus-ring)}.settings-memory-entries-list{gap:8px;max-height:220px;padding-right:4px;display:grid;overflow-y:auto}.settings-memory-card{border:1px solid var(--border-default);background:var(--bg-input);border-radius:8px;justify-content:space-between;align-items:flex-start;gap:12px;min-width:0;padding:10px 14px;display:flex}.settings-memory-card:hover{border-color:var(--border-strong)}.settings-memory-content{color:var(--text-primary);white-space:pre-wrap;word-break:break-word;flex:1;min-width:0;margin:0;font:12px/1.5 DM Mono,monospace}.settings-memory-card-actions{flex-shrink:0;align-items:center;gap:8px;display:flex}.settings-memory-editor{background:var(--bg-elevated);border:1px solid var(--border-subtle);border-radius:8px;gap:8px;padding:12px 14px;display:grid}.settings-memory-editor-title{color:var(--text-primary);margin:0;font:600 12px Manrope}.settings-memory-textarea{border:1px solid var(--border-default);background:var(--bg-input);color:var(--text-primary);resize:vertical;box-sizing:border-box;border-radius:8px;outline:0;min-height:80px;padding:10px 12px;font:12px/1.5 DM Mono,monospace}.settings-memory-textarea:focus{border-color:var(--focus-ring)}.settings-proposal-card{border:1px solid var(--border-default);background:var(--bg-input);border-radius:8px;gap:8px;padding:10px 14px;display:grid}.settings-proposal-header{align-items:center;gap:8px;display:flex}.settings-proposal-badge{border:1px solid var(--info);background:var(--bg-raised);color:var(--info);border-radius:4px;padding:2px 6px;font:600 10px Manrope}.settings-proposal-action{color:var(--text-muted);font:700 11px DM Mono,monospace}.settings-proposal-diff{white-space:pre-wrap;word-break:break-word;border-radius:6px;margin:0;padding:6px 10px;font:11px/1.4 DM Mono,monospace}.settings-proposal-diff.old{background:var(--danger-bg);color:var(--danger);border:1px solid var(--danger-border)}.settings-proposal-diff.new{background:var(--bg-inset);color:var(--text-primary);border:1px solid var(--border-subtle)}.settings-proposal-actions{justify-content:flex-end;align-items:center;gap:8px;display:flex}.empty-workspace-select{color:var(--text-secondary);justify-content:center;align-items:center;gap:8px;margin-top:14px;font-size:13px;display:flex}.empty-workspace-select select{border:1px solid var(--border-default);background:var(--bg-input);color:var(--text-primary);cursor:pointer;border-radius:8px;outline:0;padding:6px 12px;font:500 13px Manrope}.empty-workspace-select select:focus{border-color:var(--focus-ring)}.empty-secondary-action{color:var(--text-muted);cursor:pointer;background:0 0;border:0;margin-top:14px;padding:0;font-size:12px;display:block}.empty-secondary-action:hover{color:var(--text-primary);text-decoration:underline}:root{--term-ansi-0:#1c2129;--term-ansi-1:#e05263;--term-ansi-2:#4ec98a;--term-ansi-3:#d9a441;--term-ansi-4:#5aa2f0;--term-ansi-5:#c07ce8;--term-ansi-6:#3fc0c9;--term-ansi-7:#c8d3e0;--term-ansi-8:#5a6675;--term-ansi-9:#ff6b7d;--term-ansi-10:#6ee7a3;--term-ansi-11:#f2c563;--term-ansi-12:#7cbcff;--term-ansi-13:#d9a6ff;--term-ansi-14:#5fe0e8;--term-ansi-15:#eef4fb;--term-bg:#05070c;--term-fg:#dbe4f0}.terminal-panel{grid-template-rows:auto auto auto minmax(0,1fr);gap:10px;min-height:0;display:grid}.terminal-unavailable{gap:8px;display:grid}.terminal-unavailable-reason{color:var(--text-primary);margin:0;font:500 12px Manrope}.terminal-close-btn,.terminal-restart-btn{border:1px solid var(--border-default);color:var(--text-secondary);cursor:pointer;background:0 0;border-radius:6px;padding:3px 9px;font:600 11px Manrope;transition:border-color .15s,color .15s}.terminal-close-btn:hover{border-color:var(--danger-border);color:var(--danger)}.terminal-restart-btn:hover{border-color:var(--border-strong);color:var(--text-primary)}.terminal-surface{background:var(--term-bg);border:1px solid var(--border-default);cursor:text;border-radius:9px;outline:0;min-height:180px;padding:6px 8px;position:relative;overflow:hidden}.terminal-surface:focus-visible{border-color:var(--focus-ring);box-shadow:0 0 0 2px var(--focus-ring-glow)}.terminal-probe{opacity:0;pointer-events:none;font:12.5px/1.35 Consolas,Cascadia Mono,DejaVu Sans Mono,monospace;position:absolute;top:0;left:0}.terminal-grid{color:var(--term-fg);caret-color:var(--term-fg);font:12.5px/1.35 Consolas,Cascadia Mono,DejaVu Sans Mono,monospace}.terminal-row{white-space:pre;min-height:1.35em}.terminal-cell.is-bold{font-weight:700}.terminal-cell.is-dim{opacity:.6}.terminal-cell.is-underline{text-decoration:underline}.terminal-cell.is-inverse{background:var(--term-fg);color:var(--term-bg)}.tool-link-actions{flex-wrap:wrap;align-items:center;gap:8px;margin-top:10px;display:flex}.tool-link-copy-prompt{border:1px solid var(--border-default);background:var(--bg-elevated);color:var(--text-secondary);cursor:pointer;border-radius:6px;padding:6px 10px}.tool-link-copy-prompt:hover{color:var(--text-primary);border-color:var(--border-strong)}.tool-link-frame{border:1px solid var(--border-default);background:var(--bg-inset);border-radius:8px;width:100%;height:360px;margin-top:14px;display:block}.stream-tail-status[data-stream-state=ready]{color:var(--success)}.stream-tail-status[data-stream-state=waiting]{color:var(--warning)}.stream-tail-status[data-stream-state=streaming]{color:var(--accent)}.stream-tail-status[data-stream-state=failed]{color:var(--danger)}.stream-tail+form{border-radius:0 0 13px 13px}.call-result{border-top:1px dashed var(--border-subtle);margin-top:8px;padding-top:8px}.call-result-head{justify-content:space-between;align-items:center;margin-bottom:6px;display:flex}.call-result-title{color:var(--text-muted);letter-spacing:.02em;font-size:11px;font-weight:700}.call-result-copy{border:1px solid var(--border-default);background:var(--bg-elevated);color:var(--text-secondary);cursor:pointer;border-radius:4px;padding:2px 8px;font-size:10px}.call-result-copy:hover{color:var(--text-primary);border-color:var(--border-strong)}.call-result-body{background:var(--bg-inset);border:1px solid var(--border-subtle);color:var(--text-primary);white-space:pre-wrap;word-break:break-all;border-radius:6px;max-height:240px;margin:0;padding:8px 10px;font:11px/1.45 DM Mono,monospace;overflow-y:auto}.call-block-error .call-result-body{border-color:var(--danger-border);background:var(--danger-bg);color:var(--danger)}.call-result-truncated{color:var(--text-muted);margin-top:4px;font-size:10px}.session-state{flex:none;align-items:center;gap:4px;font-size:11px;line-height:1;display:inline-flex}.session-state-mark{flex:none;display:inline-block}.session-state-running .session-state-mark{color:var(--accent);animation:1.1s linear infinite session-state-spin}@keyframes session-state-spin{to{transform:rotate(360deg)}}.session-state-failed{color:var(--danger)}.session-state-question{color:var(--warning)}.session-state-unread{color:var(--accent)}@media (prefers-reduced-motion:reduce){.session-state-running .session-state-mark{animation:none}}.call-preparing{color:var(--accent);font-size:10px "DM Mono",monospace;white-space:nowrap;animation:1.1s ease-in-out infinite call-preparing-pulse}@keyframes call-preparing-pulse{0%,to{opacity:.45}50%{opacity:1}}@media (prefers-reduced-motion:reduce){.call-preparing{opacity:.85;animation:none}}.shell{background:var(--bg-app)}aside,.right-rail{background:var(--bg-panel)}.chat{background:var(--bg-app)}.label,.rail-section-title{letter-spacing:.08em;color:var(--text-muted)}.workspace-toggle:hover,.conversation:hover{background:var(--bg-hover)}.conversation.selected{box-shadow:inset 2px 0 0 var(--selected-border);background:var(--selected-bg)}.messages{gap:22px}.message{padding:0 2px}.assistant .content{max-width:78ch}.user .content{border:1px solid var(--border-subtle);background:var(--bg-raised);border-radius:12px;max-width:min(78ch,100%);padding:10px 13px;display:inline-block}header{border-bottom-color:var(--border-subtle)}form{border-color:var(--border-default);background:var(--bg-raised);box-shadow:0 10px 30px var(--shadow-faint)}textarea:focus{box-shadow:inset 0 0 0 1px var(--focus-ring)}.right-rail-head{background:var(--bg-panel);padding-top:10px}.right-tab{color:var(--text-muted);padding:8px 11px}.right-tab-active{background:var(--bg-elevated);border-color:var(--border-subtle);border-bottom-color:var(--selected-border)}.stream-tail{background:var(--bg-elevated);border-color:var(--border-subtle);grid-template-columns:minmax(0,1fr) auto minmax(0,1fr);column-gap:12px;min-width:0;padding-inline:18px}.stream-tail-status,.stream-tail-mode{text-overflow:ellipsis;min-width:0;max-width:100%;padding-inline:4px;overflow:hidden}.stream-tail-status{justify-self:start}.stream-tail-mode{justify-self:end}.stream-tail-jump{white-space:nowrap;background:var(--bg-input);min-width:112px;padding-inline:12px}.stream-tail+form{border-top-color:var(--border-subtle);border-top:0;border-radius:0 0 13px 13px;margin-top:0}.stream-tail{border-bottom:1px solid var(--border-subtle);border-radius:9px 9px 0 0}.stream-tail-status,.stream-tail-mode{border:1px solid var(--border-subtle);background:var(--bg-input);border-radius:999px;align-items:center;min-height:26px;padding:0 10px;line-height:1;display:inline-flex}.stream-tail-status{margin-inline-start:4px}.stream-tail-mode{grid-column:3;justify-self:end;margin-inline-end:4px}.chat>form{height:var(--composer-height,148px);min-height:148px;max-height:55vh}.stream-tail{touch-action:none;cursor:ns-resize}.stream-tail:before{content:"";inset-inline:0;pointer-events:auto;height:6px;position:absolute;top:-3px}.stream-tail:hover{border-top-color:var(--selected-border)}.todo-item,.subagent-card,.queue-dock,.call-block{border-color:var(--border-subtle)}.rail-empty{border-style:solid;border-color:var(--border-subtle);background:var(--bg-inset)}.tool-dialog,.picker,.settings-window{border-color:var(--border-subtle);box-shadow:0 24px 70px var(--shadow)}button,a,input,textarea,select{transition:background-color .15s,border-color .15s,color .15s,box-shadow .15s}@media (width<=700px){.chat>form{height:var(--composer-height,148px);min-height:148px;max-height:55dvh}.stream-tail{grid-template-columns:minmax(0,1fr) auto minmax(0,1fr);align-items:center;padding-inline:10px}.stream-tail-status,.stream-tail-mode{background:var(--bg-elevated);border-color:var(--border-subtle);padding-inline:8px}.stream-tail-mode{grid-column:3;justify-self:end;margin-inline-end:0;font-size:9px}.stream-tail-jump{min-width:0}.user .content{max-width:100%}.assistant .content{max-width:none}}.conversation{justify-content:flex-start;padding:8px 9px}.conversation-mark{width:13px;color:var(--text-secondary);flex:0 0 13px;place-items:center;font-style:normal;display:grid}.conversation>span{flex:auto}.conversation-archived{justify-content:flex-start;padding:8px 9px}.conversation-archived>span{flex:auto}
|
package/dist/client/index.html
CHANGED
|
@@ -8,8 +8,8 @@
|
|
|
8
8
|
<link rel="alternate icon" href="/favicon.ico" />
|
|
9
9
|
<link rel="apple-touch-icon" href="/favicon.svg" />
|
|
10
10
|
<title>Super Pi</title>
|
|
11
|
-
<script type="module" crossorigin src="/assets/index-
|
|
12
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
11
|
+
<script type="module" crossorigin src="/assets/index-BBfRhf7h.js"></script>
|
|
12
|
+
<link rel="stylesheet" crossorigin href="/assets/index-sZQBUBuS.css">
|
|
13
13
|
</head>
|
|
14
14
|
<body>
|
|
15
15
|
<div id="root"></div>
|
|
@@ -165,9 +165,23 @@ export class RunService {
|
|
|
165
165
|
// an order that never happened. The runtime calls `onToolCall` synchronously between yields, so a
|
|
166
166
|
// counter advanced once per yielded delta is the real position of the call in the answer.
|
|
167
167
|
let spoken = 0;
|
|
168
|
+
/**
|
|
169
|
+
* ONE COUNTER FOR EVERY ROW, AND THE ONLY WAY A ROW NUMBER IS EVER MADE.
|
|
170
|
+
*
|
|
171
|
+
* Both maps below are addressed by POSITION in the message's `toolCalls` array, so both have to count
|
|
172
|
+
* in the same space. They did not: each kept its own `map.size`, and those two numbers stop agreeing
|
|
173
|
+
* the moment a turn makes two tool calls - the first call's placeholder is consumed and the map is
|
|
174
|
+
* cleared, so the SECOND placeholder is handed the row number `0` while `appendToolCall` actually put
|
|
175
|
+
* it at `1`. From there every later write lands on the wrong row: the second call's arguments overwrote
|
|
176
|
+
* the first call's finished block, and the second call's own row was never settled, so it kept
|
|
177
|
+
* 「正在生成参数…」 for the rest of the turn. A finished tool that still claims to be generating its
|
|
178
|
+
* arguments is worse than a missing one - it says the agent is stuck on work it already did.
|
|
179
|
+
*/
|
|
180
|
+
let rows = 0;
|
|
168
181
|
const rowByToolCallId = new Map();
|
|
169
182
|
/**
|
|
170
|
-
* Rows for calls the model is STILL WRITING, keyed by the contentIndex its toolcall_start named
|
|
183
|
+
* Rows for calls the model is STILL WRITING, keyed by the contentIndex its toolcall_start named, and
|
|
184
|
+
* carrying the name that index announced when it had one.
|
|
171
185
|
*
|
|
172
186
|
* The index is the only handle that exists before the arguments are parsed: the tool's id arrives
|
|
173
187
|
* with toolcall_end, and the host is told nothing until tool_execution_start. Keeping the index → row
|
|
@@ -175,34 +189,63 @@ export class RunService {
|
|
|
175
189
|
* already looking at, instead of appending a second block for the same call and making one call look
|
|
176
190
|
* like two.
|
|
177
191
|
*/
|
|
178
|
-
const
|
|
192
|
+
const preparingRows = new Map();
|
|
179
193
|
const onToolPreparing = (call) => {
|
|
180
|
-
const existing =
|
|
194
|
+
const existing = preparingRows.get(call.contentIndex);
|
|
181
195
|
if (existing !== undefined) {
|
|
196
|
+
// The line naming the call IMPROVES as the arguments arrive - a `read` learns its path from the
|
|
197
|
+
// first fragment - so it is patched rather than frozen at whatever the first frame could say. The
|
|
198
|
+
// fragment is stored as well, because that is what the reader watches grow.
|
|
182
199
|
if (call.delta)
|
|
183
|
-
enqueueTools("a tool call argument", () => this.store.updateToolCall(conversation.id, assistant.id, existing, { live: call.delta }));
|
|
200
|
+
enqueueTools("a tool call argument", () => this.store.updateToolCall(conversation.id, assistant.id, existing.row, { live: call.delta, ...(call.detail ? { detail: call.detail } : {}) }));
|
|
184
201
|
return;
|
|
185
202
|
}
|
|
186
203
|
// No name yet is the normal first token, and it is NOT a reason to wait: the block appearing with an
|
|
187
204
|
// empty name the instant the model starts writing is what tells the reader anything is happening at
|
|
188
205
|
// all, and it fills in on the next delta.
|
|
189
206
|
const at = spoken;
|
|
190
|
-
|
|
191
|
-
|
|
207
|
+
const row = rows++;
|
|
208
|
+
// The block says WHICH TOOL and WHAT IT IS AIMED AT as soon as either is known. 「工具」 as the name
|
|
209
|
+
// and 「正在生成参数…」 as the only line below it told a reader nothing for the seconds a large `edit`
|
|
210
|
+
// spends writing its replacement text - and by the time the file path was on screen, the block looked
|
|
211
|
+
// broken rather than early. The placeholder word is now only the FALLBACK for the first fragment, when
|
|
212
|
+
// Pi has not yet said what the call is or what it opens.
|
|
213
|
+
enqueueTools("a tool call being prepared", () => this.store.appendToolCall(conversation.id, assistant.id, {
|
|
214
|
+
label: call.name || "工具",
|
|
215
|
+
...(call.detail ? { detail: call.detail } : { detail: "正在生成参数…" }),
|
|
216
|
+
preparing: true,
|
|
217
|
+
at,
|
|
218
|
+
}));
|
|
219
|
+
preparingRows.set(call.contentIndex, { row, name: call.name });
|
|
192
220
|
};
|
|
193
221
|
const onToolCall = (call) => {
|
|
194
|
-
if (call.id)
|
|
195
|
-
rowByToolCallId.set(call.id, rowByToolCallId.size);
|
|
196
222
|
const at = spoken;
|
|
197
|
-
|
|
223
|
+
// THE PLACEHOLDER THAT BELONGS TO THIS CALL, IF ONE IS ON SCREEN.
|
|
224
|
+
//
|
|
225
|
+
// A model writing two tool calls writes their arguments in one unbroken stream, so more than one
|
|
226
|
+
// placeholder can be waiting when the first execution starts, and the newest is not necessarily the
|
|
227
|
+
// one being run. The NAME is the only thing that can tell them apart - `toolcall_start` carries it
|
|
228
|
+
// when Pi has parsed it - so a name match wins over recency, and recency is only the fallback for a
|
|
229
|
+
// placeholder that never got a name.
|
|
230
|
+
const pending = [...preparingRows];
|
|
231
|
+
const prepared = pending.find(([, entry]) => entry.name === call.name) ?? pending.at(-1);
|
|
198
232
|
// THE CALL THAT IS ALREADY ON SCREEN GETS FILLED IN. Appending here instead would show one call
|
|
199
233
|
// twice - once as a placeholder, once as the real thing - which reads as the agent calling a tool
|
|
200
234
|
// it never called.
|
|
201
235
|
if (prepared !== undefined) {
|
|
202
|
-
|
|
203
|
-
|
|
236
|
+
const row = prepared[1].row;
|
|
237
|
+
preparingRows.delete(prepared[0]);
|
|
238
|
+
// The id is bound to the row it was FILLED IN, not to a row of the caller's own counting. Every
|
|
239
|
+
// later update and the outcome resolve through this binding, so a wrong number here is a block
|
|
240
|
+
// that never settles and one that belongs to a different call.
|
|
241
|
+
if (call.id)
|
|
242
|
+
rowByToolCallId.set(call.id, row);
|
|
243
|
+
enqueueTools("a tool call", () => this.store.updateToolCall(conversation.id, assistant.id, row, { label: call.name, detail: call.detail, args: call.args, live: "", preparing: false }));
|
|
204
244
|
return;
|
|
205
245
|
}
|
|
246
|
+
const row = rows++;
|
|
247
|
+
if (call.id)
|
|
248
|
+
rowByToolCallId.set(call.id, row);
|
|
206
249
|
enqueueTools("a tool call", () => this.store.appendToolCall(conversation.id, assistant.id, { label: call.name, detail: call.detail, args: call.args, at }));
|
|
207
250
|
};
|
|
208
251
|
const onToolUpdate = (call) => {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { createReadStream, existsSync } from "node:fs";
|
|
2
|
+
import { spawn } from "node:child_process";
|
|
2
3
|
import { readdir, stat } from "node:fs/promises";
|
|
3
4
|
import { createServer } from "node:http";
|
|
4
5
|
import { homedir, networkInterfaces } from "node:os";
|
|
@@ -191,6 +192,24 @@ export function createHttpServer(options) {
|
|
|
191
192
|
setTimeout(() => { void onShutdown("api-shutdown"); }, 50);
|
|
192
193
|
return;
|
|
193
194
|
}
|
|
195
|
+
if (url.pathname === "/api/update" && request.method === "POST") {
|
|
196
|
+
if (!isLocalOrPrivateAddress(remote)) {
|
|
197
|
+
response.writeHead(403).end("Update requires a loopback or private network POST");
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
response.writeHead(202, { "content-type": "application/json; charset=utf-8" }).end(JSON.stringify({ status: "updating" }));
|
|
201
|
+
const command = process.platform === "win32" ? "pi.cmd" : "pi";
|
|
202
|
+
const child = spawn(command, ["update", "npm:@evandu/super-pi"], { cwd: rootDir, detached: true, stdio: "ignore", shell: process.platform === "win32", env: process.env });
|
|
203
|
+
child.on("close", (code) => {
|
|
204
|
+
if (code !== 0)
|
|
205
|
+
return;
|
|
206
|
+
const restart = spawn(process.execPath, [join(rootDir, "scripts", "restart-server.mjs")], { cwd: rootDir, detached: true, stdio: "ignore", env: process.env });
|
|
207
|
+
restart.unref();
|
|
208
|
+
});
|
|
209
|
+
child.on("error", () => { });
|
|
210
|
+
child.unref();
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
194
213
|
if (url.pathname === "/api/health") {
|
|
195
214
|
const version = checkDiskVersion(rootDir);
|
|
196
215
|
response.writeHead(200, { "content-type": "application/json; charset=utf-8" })
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Workspace
|
|
1
|
+
// Workspace paths match case-insensitively. A model is allowed when either its label
|
|
2
2
|
// or provider/modelId matches. All matching rules must allow it (intersection).
|
|
3
3
|
// Invalid regexes are skipped with a diagnostic, never interpreted as deny-all.
|
|
4
4
|
export function applicableRules(rules, workspace) {
|
|
@@ -6,7 +6,8 @@ export function applicableRules(rules, workspace) {
|
|
|
6
6
|
try {
|
|
7
7
|
const workspaceRegex = new RegExp(rule.workspacePattern, "i");
|
|
8
8
|
const modelRegex = new RegExp(rule.modelPattern, "i");
|
|
9
|
-
|
|
9
|
+
const workspacePath = workspace.path.replace(/[\\/]+/g, "/");
|
|
10
|
+
return workspaceRegex.test(workspacePath) ? [{ rule, modelRegex }] : [];
|
|
10
11
|
}
|
|
11
12
|
catch (error) {
|
|
12
13
|
console.warn(`模型过滤规则 ${rule.id} 无效,已跳过:${rule.workspacePattern} → ${rule.modelPattern}:${String(error)}`);
|
package/dist/server/runtime.js
CHANGED
|
@@ -8,7 +8,7 @@ import { resolvePiCommand, shellQuote } from "./pi-command.js";
|
|
|
8
8
|
import { TASK_CONVERSATION_ENV, TASK_DEPTH_ENV, TASK_ENDPOINT_ENV, TASK_ROSTER_ENV, TASK_TOOL_NAME, TODO_ENDPOINT_ENV, TODO_TOOL_NAME, WORKFLOW_ENDPOINT_ENV, WORKFLOW_TOOL_NAME, rosterPayload, } from "./task-tool.js";
|
|
9
9
|
import { BLOCKING_UI_METHODS, EXTENSION_UI_METHODS, } from "./types.js";
|
|
10
10
|
import { loadConversationImages } from "./upload.js";
|
|
11
|
-
import { describeToolCall, describeToolCallArgs, extractToolResultText } from "./tool-calls.js";
|
|
11
|
+
import { describeToolCall, describeToolCallArgs, describeToolCallInProgress, extractToolResultText } from "./tool-calls.js";
|
|
12
12
|
/** Deterministic offline runtime used by tests and local UI development. */
|
|
13
13
|
export class WelcomeRuntime {
|
|
14
14
|
async *answer({ prompt, signal }) {
|
|
@@ -827,6 +827,18 @@ export class PiRpcRuntime {
|
|
|
827
827
|
// record is announced once per distinct type and then tallied instead of logging per event.
|
|
828
828
|
const announced = new Set();
|
|
829
829
|
const repeats = new Map();
|
|
830
|
+
/**
|
|
831
|
+
* THE ARGUMENT TEXT EACH CALL HAS PRODUCED SO FAR, keyed by the contentIndex `toolcall_start` named.
|
|
832
|
+
*
|
|
833
|
+
* Held per TURN and cleared with it, so a second turn writing a different call to the same index
|
|
834
|
+
* starts from an empty string rather than from the previous call's file path. The fragments are
|
|
835
|
+
* still handed on one at a time as `delta`; this is only what a line naming the call is read out of,
|
|
836
|
+
* and a block that could show 「正在生成参数…」 instead of the file it is about to open was telling
|
|
837
|
+
* the reader less than the record already knew.
|
|
838
|
+
*/
|
|
839
|
+
const argumentText = new Map();
|
|
840
|
+
/** The tool name `toolcall_start` announced for each index, so a later fragment can still name it. */
|
|
841
|
+
const toolNames = new Map();
|
|
830
842
|
const noteUnhandled = (key) => {
|
|
831
843
|
if (announced.has(key))
|
|
832
844
|
repeats.set(key, (repeats.get(key) ?? 0) + 1);
|
|
@@ -977,10 +989,23 @@ export class PiRpcRuntime {
|
|
|
977
989
|
// would mean guessing at a document that is not finished. It is handed on as it comes.
|
|
978
990
|
if (event?.type === "text_delta")
|
|
979
991
|
yield event.delta ?? "";
|
|
980
|
-
else if (event?.type === "toolcall_start" && typeof event.contentIndex === "number")
|
|
992
|
+
else if (event?.type === "toolcall_start" && typeof event.contentIndex === "number") {
|
|
993
|
+
// A fresh index means a fresh call, so anything the PREVIOUS call at this index wrote is
|
|
994
|
+
// dropped here rather than carried into this one's first fragment.
|
|
995
|
+
argumentText.delete(event.contentIndex);
|
|
996
|
+
toolNames.set(event.contentIndex, toolNameOf(event.partial));
|
|
981
997
|
onToolPreparing?.({ contentIndex: event.contentIndex, name: toolNameOf(event.partial) });
|
|
982
|
-
|
|
983
|
-
|
|
998
|
+
}
|
|
999
|
+
else if (event?.type === "toolcall_delta" && typeof event.contentIndex === "number") {
|
|
1000
|
+
const delta = typeof event.delta === "string" ? event.delta : "";
|
|
1001
|
+
// The NAME IS CARRIED FORWARD because the line naming the call needs it: `toolcall_start`
|
|
1002
|
+
// is the only event that carries one, and by the second fragment the mapping has to choose
|
|
1003
|
+
// between a `read`'s path and a `bash`'s command.
|
|
1004
|
+
const name = toolNames.get(event.contentIndex) ?? "";
|
|
1005
|
+
argumentText.set(event.contentIndex, `${argumentText.get(event.contentIndex) ?? ""}${delta}`);
|
|
1006
|
+
const detail = describeToolCallInProgress(name, argumentText.get(event.contentIndex) ?? "");
|
|
1007
|
+
onToolPreparing?.({ contentIndex: event.contentIndex, name, ...(delta ? { delta } : {}), ...(detail ? { detail } : {}) });
|
|
1008
|
+
}
|
|
984
1009
|
else
|
|
985
1010
|
noteUnhandled(`message_update:${JSON.stringify(event?.type ?? "(missing)")}`);
|
|
986
1011
|
continue;
|
|
@@ -99,8 +99,7 @@ export type TerminalEvent = {
|
|
|
99
99
|
reason?: string;
|
|
100
100
|
};
|
|
101
101
|
/**
|
|
102
|
-
* Reads the opt-in flag. Anything other than an explicit truthy string leaves the terminal OFF
|
|
103
|
-
* typo in a deployment config fails closed rather than silently exposing a shell.
|
|
102
|
+
* Reads the opt-in flag. Anything other than an explicit truthy string leaves the terminal OFF.
|
|
104
103
|
*/
|
|
105
104
|
export declare function isTerminalEnabled(env?: NodeJS.ProcessEnv): boolean;
|
|
106
105
|
/** The sentence a browser shows when the terminal is missing. Says WHICH of the three gates closed. */
|
package/dist/server/terminal.js
CHANGED
|
@@ -164,8 +164,7 @@ const MAX_CHUNK_BYTES = 64 * 1024;
|
|
|
164
164
|
/** Hard per-session backlog. Beyond this the session is considered runaway and is killed. */
|
|
165
165
|
const MAX_BACKLOG_BYTES = 4 * 1024 * 1024;
|
|
166
166
|
/**
|
|
167
|
-
* Reads the opt-in flag. Anything other than an explicit truthy string leaves the terminal OFF
|
|
168
|
-
* typo in a deployment config fails closed rather than silently exposing a shell.
|
|
167
|
+
* Reads the opt-in flag. Anything other than an explicit truthy string leaves the terminal OFF.
|
|
169
168
|
*/
|
|
170
169
|
export function isTerminalEnabled(env = process.env) {
|
|
171
170
|
const raw = env.SUPER_PI_TERMINAL?.trim().toLowerCase();
|
|
@@ -174,7 +173,7 @@ export function isTerminalEnabled(env = process.env) {
|
|
|
174
173
|
/** The sentence a browser shows when the terminal is missing. Says WHICH of the three gates closed. */
|
|
175
174
|
export function terminalDisabledReason(env = process.env) {
|
|
176
175
|
if (!isTerminalEnabled(env))
|
|
177
|
-
return "终端未启用。设置 SUPER_PI_TERMINAL=1
|
|
176
|
+
return "终端未启用。设置 SUPER_PI_TERMINAL=1 后重启即可使用。";
|
|
178
177
|
if (ptyLoadFailure)
|
|
179
178
|
return `node-pty 未能加载(${ptyLoadFailure})。请重新安装依赖,或确认 node-pty 版本不低于 ${MINIMUM_PTY_VERSION}。`;
|
|
180
179
|
return "";
|
|
@@ -62,6 +62,27 @@ export declare function extractToolResultText(result: unknown): ToolResultSummar
|
|
|
62
62
|
* shape can be regression-tested at all.
|
|
63
63
|
*/
|
|
64
64
|
export declare function describeToolCall(name: string, args: unknown): string | undefined;
|
|
65
|
+
/**
|
|
66
|
+
* THE SAME LINE, READ OUT OF A CALL THAT IS STILL BEING WRITTEN.
|
|
67
|
+
*
|
|
68
|
+
* The block for a call appears the instant the model starts writing it, and for an `edit` that is several
|
|
69
|
+
* seconds before the arguments are complete. Showing 「工具 · 正在生成参数…」 through all of it says the
|
|
70
|
+
* reader nothing they can act on - not WHICH tool, and not what it is aimed at, which are the two things
|
|
71
|
+
* the finished block is going to say. So the same `describeToolCall` mapping runs against the fragments
|
|
72
|
+
* that have arrived so far.
|
|
73
|
+
*
|
|
74
|
+
* TWO STEPS, because a partial JSON document almost never parses. The fragments are tried whole first -
|
|
75
|
+
* that is the case where the last one closed the object. Failing that, the FIRST `"key": "value"` pair in
|
|
76
|
+
* the text is read out on its own, and its value does not have to be CLOSED - a fragment usually stops
|
|
77
|
+
* mid-string, and a path that has arrived half-written still says more than a placeholder does. A fragment
|
|
78
|
+
* that has produced neither yet yields `undefined`, and the caller decides what an unknown call says
|
|
79
|
+
* rather than this module inventing a word for it.
|
|
80
|
+
*
|
|
81
|
+
* The pair is read with a pattern rather than by parsing a repaired document: repairing JSON is a parser's
|
|
82
|
+
* job, and a half-repaired document here would risk naming the wrong file - the one thing this line must
|
|
83
|
+
* never do.
|
|
84
|
+
*/
|
|
85
|
+
export declare function describeToolCallInProgress(name: string, argumentsSoFar: string): string | undefined;
|
|
65
86
|
/**
|
|
66
87
|
* Every parameter of one call, as a bounded list of `key`/`value` pairs a block can show when expanded.
|
|
67
88
|
*
|
|
@@ -152,6 +152,46 @@ export function describeToolCall(name, args) {
|
|
|
152
152
|
}
|
|
153
153
|
return undefined;
|
|
154
154
|
}
|
|
155
|
+
/**
|
|
156
|
+
* THE SAME LINE, READ OUT OF A CALL THAT IS STILL BEING WRITTEN.
|
|
157
|
+
*
|
|
158
|
+
* The block for a call appears the instant the model starts writing it, and for an `edit` that is several
|
|
159
|
+
* seconds before the arguments are complete. Showing 「工具 · 正在生成参数…」 through all of it says the
|
|
160
|
+
* reader nothing they can act on - not WHICH tool, and not what it is aimed at, which are the two things
|
|
161
|
+
* the finished block is going to say. So the same `describeToolCall` mapping runs against the fragments
|
|
162
|
+
* that have arrived so far.
|
|
163
|
+
*
|
|
164
|
+
* TWO STEPS, because a partial JSON document almost never parses. The fragments are tried whole first -
|
|
165
|
+
* that is the case where the last one closed the object. Failing that, the FIRST `"key": "value"` pair in
|
|
166
|
+
* the text is read out on its own, and its value does not have to be CLOSED - a fragment usually stops
|
|
167
|
+
* mid-string, and a path that has arrived half-written still says more than a placeholder does. A fragment
|
|
168
|
+
* that has produced neither yet yields `undefined`, and the caller decides what an unknown call says
|
|
169
|
+
* rather than this module inventing a word for it.
|
|
170
|
+
*
|
|
171
|
+
* The pair is read with a pattern rather than by parsing a repaired document: repairing JSON is a parser's
|
|
172
|
+
* job, and a half-repaired document here would risk naming the wrong file - the one thing this line must
|
|
173
|
+
* never do.
|
|
174
|
+
*/
|
|
175
|
+
export function describeToolCallInProgress(name, argumentsSoFar) {
|
|
176
|
+
const text = argumentsSoFar.trim();
|
|
177
|
+
if (!text)
|
|
178
|
+
return undefined;
|
|
179
|
+
try {
|
|
180
|
+
const parsed = JSON.parse(text);
|
|
181
|
+
const described = describeToolCall(name, parsed);
|
|
182
|
+
if (described)
|
|
183
|
+
return described;
|
|
184
|
+
}
|
|
185
|
+
catch { /* the document is still being written, which is the normal case here */ }
|
|
186
|
+
const pair = /"([A-Za-z_][A-Za-z0-9_-]*)"\s*:\s*"((?:[^"\\]|\\.)*)/.exec(text);
|
|
187
|
+
if (!pair)
|
|
188
|
+
return undefined;
|
|
189
|
+
// The closing quote is OPTIONAL in the pattern because a fragment almost always stops mid-string, and a
|
|
190
|
+
// path that has arrived half-written is still worth more than the placeholder word. What is captured is
|
|
191
|
+
// unescaped because an escaped quote is part of the VALUE, not the end of it - without this, a file
|
|
192
|
+
// named with a quote in it would be displayed with a backslash the reader never typed.
|
|
193
|
+
return describeToolCall(name, { [pair[1]]: pair[2].replace(/\\(["\\])/g, "$1") });
|
|
194
|
+
}
|
|
155
195
|
/**
|
|
156
196
|
* How one non-string argument value is NAMED without being read.
|
|
157
197
|
*
|