@evandu/super-pi 0.1.32 → 0.1.34
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 +4 -0
- package/agents/super-pi-task/index.ts +4 -0
- package/dist/client/assets/index-BhsIL1Qa.js +50 -0
- package/dist/client/assets/index-Da9PkxxS.css +1 -0
- package/dist/client/index.html +2 -2
- package/dist/extension.js +7 -2
- package/dist/server/active-memory.d.ts +15 -0
- package/dist/server/active-memory.js +36 -1
- package/dist/server/application/conversation-service.d.ts +39 -0
- package/dist/server/application/conversation-service.js +65 -4
- package/dist/server/application/extension-ui-service.js +16 -0
- package/dist/server/application/run-service.d.ts +21 -0
- package/dist/server/application/run-service.js +130 -19
- package/dist/server/command-handler.d.ts +14 -0
- package/dist/server/command-handler.js +22 -0
- package/dist/server/git.d.ts +37 -0
- package/dist/server/git.js +30 -0
- package/dist/server/http-server.js +126 -8
- package/dist/server/index.js +7 -2
- package/dist/server/memory.d.ts +27 -0
- package/dist/server/memory.js +56 -0
- package/dist/server/persistence/json-state-repository.d.ts +2 -0
- package/dist/server/persistence/json-state-repository.js +24 -5
- package/dist/server/runtime.d.ts +4 -1
- package/dist/server/runtime.js +51 -14
- package/dist/server/store.d.ts +6 -0
- package/dist/server/store.js +46 -3
- package/dist/server/terminal.js +20 -7
- package/dist/server/types.d.ts +36 -2
- package/dist/server/upload.js +8 -19
- package/dist/server/ws-server.js +89 -28
- package/package.json +5 -3
- package/dist/client/assets/index-BBfRhf7h.js +0 -50
- package/dist/client/assets/index-sZQBUBuS.css +0 -1
|
@@ -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;--composer-height:148px;--bg-app:#060709;--bg-panel:#11151c;--bg-elevated:#222935;--bg-raised:#1e242f;--bg-hover:#2c3646;--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;--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:#2c3646;--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;--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;--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;--selected:#38454c;--selected-bg:#729fb6;--selected-border:#4b748b;--tab-active-bg:#fff;--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;--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)}.stream-tail-mode{color:var(--text-secondary);white-space:nowrap;justify-self:end}.stream-tail-mode[data-follow-tail=true]{color:var(--info)}@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);scrollbar-width:none;flex-wrap:nowrap;align-items:center;gap:6px;min-width:0;margin-bottom:11px;padding:8px 10px 0 15px;display:flex;overflow-x:auto}.session-picker::-webkit-scrollbar{display:none}.session-picker-item{min-width:0;max-width:100%;position:relative}.session-picker-trigger{white-space:nowrap;border:1px solid var(--border-default);background:var(--bg-raised);min-width:max-content;max-width:none;color:var(--text-primary);cursor:pointer;border-radius:9px;align-items:center;gap:5px;padding:6px 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}.stream-tail-resize{z-index:8;cursor:ns-resize;touch-action:none;height:8px;margin-bottom:-4px;position:relative}.stream-tail-resize:before{content:"";background:var(--border-default);opacity:.65;border-radius:2px;height:2px;position:absolute;top:3px;left:20%;right:20%}.stream-tail-resize:hover:before{background:var(--focus-ring);opacity:1}.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}.git-panel{flex-direction:column;gap:9px;padding-top:13px;display:flex}.git-head{flex-wrap:wrap;align-items:center;gap:8px;min-width:0;display:flex}.git-branch{color:var(--text-primary);text-overflow:ellipsis;white-space:nowrap;min-width:0;font:700 12px Manrope;overflow:hidden}.git-ahead-behind{color:var(--text-muted);white-space:nowrap;font:11px DM Mono,monospace}.git-refresh{border:1px solid var(--border-subtle);background:var(--bg-elevated);color:var(--text-primary);cursor:pointer;border-radius:8px;min-width:0;padding:3px 9px;font:700 11px Manrope}.git-refresh:hover{background:var(--bg-hover)}.git-refresh:focus-visible{outline:1px solid var(--focus-ring);outline-offset:1px}.git-group-head{color:var(--text-secondary);letter-spacing:.02em;margin-top:4px;font:700 11px Manrope}.git-file-row{box-sizing:border-box;width:100%;color:var(--text-primary);text-align:left;cursor:pointer;background:0 0;border:1px solid #0000;border-radius:7px;align-items:center;gap:6px;min-width:0;padding:3px 8px;font:11px Manrope;display:flex}.git-file-row:hover:not(:disabled){background:var(--bg-elevated)}.git-file-row:focus-visible{outline:1px solid var(--focus-ring);outline-offset:-2px}.git-path{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.git-diff{border:1px solid var(--border-subtle);background:var(--bg-inset);min-width:0;max-height:min(320px,40vh);color:var(--text-primary);white-space:pre;border-radius:9px;margin:0;padding:8px 10px;font:11px/1.6 DM Mono,monospace;overflow:auto}.git-log{border:1px solid var(--border-subtle);background:var(--bg-input);border-radius:9px;flex-direction:column;gap:2px;min-width:0;max-height:min(240px,30vh);padding:4px 0;display:flex;overflow:auto}.git-log-row{color:var(--text-primary);min-width:0;padding:3px 8px;font:11px Manrope}.git-log-meta{color:var(--text-muted);text-overflow:ellipsis;white-space:nowrap;font:10px DM Mono,monospace;overflow:hidden}.git-error{border:1px solid var(--border-subtle);background:var(--bg-input);color:var(--text-primary);border-radius:9px;padding:8px 10px;font:11px Manrope}.git-state-card{border:1px solid var(--border-default);background:var(--bg-input);color:var(--text-primary);border-radius:11px;grid-template-columns:24px minmax(0,1fr);gap:5px 9px;padding:14px 12px;display:grid}.git-state-card-empty{border-color:var(--border-subtle);background:linear-gradient(145deg,var(--bg-input),var(--bg-raised))}.git-state-icon{border:1px solid var(--border-default);width:24px;height:24px;color:var(--text-secondary);border-radius:7px;grid-row:span 2;place-items:center;font:700 17px DM Mono,monospace;display:grid}.git-state-card strong{align-self:end;font:700 12px Manrope}.git-state-card p{color:var(--text-secondary);grid-column:2;margin:0;font:11px/1.6 Manrope}.git-state-action{border:1px solid var(--border-default);color:var(--text-primary);cursor:pointer;background:0 0;border-radius:7px;grid-column:2;justify-self:start;margin-top:4px;padding:5px 9px;font:600 11px Manrope}.git-state-action:hover{background:var(--bg-hover)}.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(--info)}.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-bg-top:#080b12;--term-fg:#dbe4f0;--term-border:#65718a;--term-highlight:#ffffff0a;--term-shadow:#0000002e;--term-glow:#dbe4f02e}.terminal-panel{grid-template-rows:auto auto auto minmax(260px,1fr);gap:10px;height:100%;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:linear-gradient(180deg,var(--term-bg-top) 0%,var(--term-bg) 100%);border:1px solid var(--term-border);cursor:text;min-height:260px;box-shadow:inset 0 1px 0 var(--term-highlight),0 8px 24px var(--term-shadow);border-radius:10px;outline:0;padding:10px 9px;position:relative;overflow:hidden}.terminal-input-capture{opacity:0;resize:none;z-index:2;caret-color:#0000;border:0;width:1px;height:1px;padding:0;position:absolute;inset:0}.terminal-cursor{background:var(--term-fg);opacity:.85;pointer-events:none;width:.65ch;height:1.35em;animation:1.1s steps(2,start) infinite terminal-caret;position:absolute}.terminal-surface:not(:focus-within) .terminal-cursor{opacity:.35;animation:none}@keyframes terminal-caret{50%{opacity:0}}.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);text-shadow:0 0 1px var(--term-glow);font:13px/1.4 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(--info)}.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}.workspace-tab .session-state{order:-1;margin-right:2px}.session-state-mark{flex:none;justify-content:center;align-items:center;width:11px;height:11px;font-size:10px;line-height:1;display:inline-flex}.session-state-running .session-state-mark{border:1.5px solid var(--info);border-right-color:#0000;border-radius:50%;width:11px;height:11px;animation:.75s 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(--info)}@media (prefers-reduced-motion:reduce){.session-state-running .session-state-mark{animation:none}}.call-preparing{color:var(--info);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-default);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:0;border-radius:0 0 13px 13px;margin-top:0}.stream-tail{border-bottom:0;border-radius:13px 13px 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);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-top-color:var(--border-subtle);border-right-color:var(--border-subtle);border-bottom-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);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}.thinking-block{border-left:2px solid var(--info);background:var(--bg-inset);color:var(--text-secondary);white-space:pre-wrap;border-radius:0 8px 8px 0;margin:0 0 10px;padding:9px 12px;font-size:12px;line-height:1.5}.thinking-label{color:var(--info);letter-spacing:.04em;margin-bottom:4px;font-size:10px;font-weight:700;display:block}.slash-menu{z-index:8;background:var(--bg-elevated);border:1px solid var(--border-default);max-height:260px;box-shadow:0 12px 30px var(--shadow-faint);border-radius:10px;padding:6px;position:absolute;bottom:calc(100% - 2px);left:14px;right:14px;overflow:auto}.slash-menu-title{color:var(--text-muted);text-transform:uppercase;padding:5px 9px;font:10px DM Mono,monospace}.slash-item{width:100%;color:var(--text-secondary);text-align:left;cursor:pointer;background:0 0;border:0;border-radius:7px;align-items:center;gap:12px;padding:8px 9px;display:flex}.slash-item code{min-width:90px;color:var(--text-secondary);font:12px DM Mono,monospace}.slash-item span{font-size:12px}.slash-menu{z-index:8;background:var(--bg-elevated);border:1px solid var(--border-default);border-radius:10px;max-height:260px;padding:6px;position:absolute;bottom:calc(100% - 2px);left:14px;right:14px;overflow:auto}.slash-menu-title{color:var(--text-muted);padding:5px 9px;font:10px DM Mono,monospace}.slash-item{width:100%;color:var(--text-secondary);text-align:left;cursor:pointer;background:0 0;border:0;border-radius:7px;gap:12px;padding:8px 9px;display:flex}.slash-item.selected,.slash-item:hover{background:var(--bg-hover);color:var(--text-primary)}.slash-item code{min-width:90px;color:var(--text-secondary)}.file-code-preview,.file-markdown-preview{background:var(--bg-elevated);white-space:pre;flex:1;min-height:120px;padding:14px;font:12px/1.6 DM Mono,monospace;overflow:auto}.file-markdown-preview{white-space:normal;font-family:inherit}:root{--code-comment:#7f9f7f;--code-string:#dca561;--code-number:#c586c0;--code-keyword:#569cd6}.code-token-comment{color:var(--code-comment)}.code-token-string{color:var(--code-string)}.code-token-number{color:var(--code-number)}.code-token-keyword{color:var(--code-keyword)}.file-preview-toggle{background:var(--bg-elevated);color:var(--text-secondary);border:1px solid var(--border-default);border-radius:4px;padding:3px 8px}.file-code-preview,.file-markdown-preview{background:var(--bg-elevated);flex:1;min-height:120px;padding:14px;overflow:auto}.file-code-preview{white-space:pre;font:12px/1.6 DM Mono,monospace}.file-markdown-preview{overflow:auto}.composer .session-picker{border-bottom:0;flex:0 auto;gap:6px;min-width:0;margin:0 10px 0 0;padding:0;overflow:visible}.composer .composer-hints{margin-left:auto}.composer{gap:12px}.composer .session-picker-item{flex:0 auto;min-width:0}.composer button.session-picker-trigger{border:1px solid var(--border-default);background:var(--bg-panel);color:var(--text-secondary);white-space:nowrap;cursor:pointer;border-radius:6px;gap:4px;min-width:0;max-width:100%;padding:4px 9px;font:600 11px Manrope;transition:border-color .12s,color .12s,background .12s}.composer button.session-picker-trigger:hover:not(:disabled){background:var(--bg-hover);color:var(--text-primary);border-color:var(--border-strong)}.composer button.session-picker-trigger:disabled{opacity:.4;cursor:not-allowed}.composer .session-picker-kind{letter-spacing:.04em;color:var(--text-muted);border-right-color:var(--border-default);padding-right:6px;font:600 10px Manrope}.composer .session-picker-name{color:inherit;flex:0 auto;max-width:16ch;font:600 11px Manrope}.composer .session-picker-detail{display:none}.composer .session-picker-caret{color:var(--text-muted);font-size:9px}@media (width<=1100px){.composer .composer-hints>span{display:none}}@media (width<=700px){.composer{flex-wrap:wrap;row-gap:6px}.composer .session-picker{flex:100%;margin:0;padding:2px 0 0;overflow:visible}.composer .session-picker-name{max-width:9ch}}.composer button.picker-option{color:var(--text-primary);text-align:left;background:0 0;border:0;border-radius:7px;padding:8px 10px;font-weight:400}.composer button.picker-option:hover{background:var(--bg-hover);color:var(--text-primary)}.composer button.picker-option.selected{background:var(--bg-raised)}.composer button.picker-option.selected:hover{background:var(--bg-hover)}.composer button.picker-option.preview{background:var(--bg-hover);box-shadow:inset 2px 0 0 var(--border-strong)}.composer button.picker-filter-clear{color:var(--text-secondary);background:0 0;border:0;border-radius:5px;padding:2px 5px;font-size:11px;font-weight:400;line-height:1}.composer button.picker-filter-clear:hover{background:var(--bg-hover);color:var(--text-primary)}
|
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-BhsIL1Qa.js"></script>
|
|
12
|
+
<link rel="stylesheet" crossorigin href="/assets/index-Da9PkxxS.css">
|
|
13
13
|
</head>
|
|
14
14
|
<body>
|
|
15
15
|
<div id="root"></div>
|
package/dist/extension.js
CHANGED
|
@@ -63,8 +63,13 @@ export default function (pi) {
|
|
|
63
63
|
ctx.ui.notify?.(`Super Pi is not currently running on port ${port}`, "info");
|
|
64
64
|
return;
|
|
65
65
|
}
|
|
66
|
-
await stopServer(port);
|
|
67
|
-
|
|
66
|
+
const stopped = await stopServer(port);
|
|
67
|
+
if (stopped) {
|
|
68
|
+
ctx.ui.notify?.("Super Pi server shutdown requested.", "info");
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
ctx.ui.notify?.(`Super Pi server did not accept the shutdown request on port ${port} - it may require an access token (SUPER_PI_ACCESS_TOKEN) or may have already stopped.`, "error");
|
|
72
|
+
}
|
|
68
73
|
return;
|
|
69
74
|
}
|
|
70
75
|
if (sub === "restart") {
|
|
@@ -36,6 +36,21 @@ export declare class ActiveMemory {
|
|
|
36
36
|
private save;
|
|
37
37
|
private locked;
|
|
38
38
|
configuration(): Promise<MemorySettings>;
|
|
39
|
+
/**
|
|
40
|
+
* Undoes what this conversation taught memory, from `sinceIso` onwards. Called by the revert path.
|
|
41
|
+
*
|
|
42
|
+
* Two things happen here and only the first is obvious. The JSON entries go through `MemoryStore.forget`,
|
|
43
|
+
* which is where the "why a timestamp is a safe cut" argument lives. The second is the MIRRORED SKILL
|
|
44
|
+
* FILES: `manage` writes one `<id>.md` per skill under `skills/<hex(workspaceId)>/` and prunes files that
|
|
45
|
+
* are no longer in the manifest, so dropping entries from the JSON without pruning here would leave a
|
|
46
|
+
* skill on disk that nothing advertises and nothing removes - invisible, and exactly the kind of stale
|
|
47
|
+
* thing that later reads as a bug of its own.
|
|
48
|
+
*
|
|
49
|
+
* Nothing is thrown at the caller. A revert has already destroyed the transcript by the time this runs,
|
|
50
|
+
* so a memory store that cannot be opened must not turn a successful revert into a failed one - the
|
|
51
|
+
* failure is reported and the rewind stands.
|
|
52
|
+
*/
|
|
53
|
+
forgetAfter(conversationId: string, sinceIso: string): Promise<number>;
|
|
39
54
|
configure(settings: MemorySettings): Promise<void>;
|
|
40
55
|
issue(conversationId: string, options?: {
|
|
41
56
|
review?: boolean;
|
|
@@ -44,6 +44,41 @@ export class ActiveMemory {
|
|
|
44
44
|
const settings = this.settings ??= await this.json("settings.json", { enabled: process.env.SUPER_PI_MEMORY_ENABLED !== "0", reviewInterval: memoryReviewInterval(), writeApproval: false });
|
|
45
45
|
return process.env.SUPER_PI_MEMORY_ENABLED === "0" ? { ...settings, enabled: false } : settings;
|
|
46
46
|
}
|
|
47
|
+
/**
|
|
48
|
+
* Undoes what this conversation taught memory, from `sinceIso` onwards. Called by the revert path.
|
|
49
|
+
*
|
|
50
|
+
* Two things happen here and only the first is obvious. The JSON entries go through `MemoryStore.forget`,
|
|
51
|
+
* which is where the "why a timestamp is a safe cut" argument lives. The second is the MIRRORED SKILL
|
|
52
|
+
* FILES: `manage` writes one `<id>.md` per skill under `skills/<hex(workspaceId)>/` and prunes files that
|
|
53
|
+
* are no longer in the manifest, so dropping entries from the JSON without pruning here would leave a
|
|
54
|
+
* skill on disk that nothing advertises and nothing removes - invisible, and exactly the kind of stale
|
|
55
|
+
* thing that later reads as a bug of its own.
|
|
56
|
+
*
|
|
57
|
+
* Nothing is thrown at the caller. A revert has already destroyed the transcript by the time this runs,
|
|
58
|
+
* so a memory store that cannot be opened must not turn a successful revert into a failed one - the
|
|
59
|
+
* failure is reported and the rewind stands.
|
|
60
|
+
*/
|
|
61
|
+
async forgetAfter(conversationId, sinceIso) {
|
|
62
|
+
try {
|
|
63
|
+
const conversation = this.store.snapshot().conversations.find((item) => item.id === conversationId);
|
|
64
|
+
if (!conversation)
|
|
65
|
+
return 0;
|
|
66
|
+
const dropped = await this.notes.forget(conversation.workspaceId, conversationId, sinceIso);
|
|
67
|
+
const folder = join(this.directory, "skills", Buffer.from(conversation.workspaceId).toString("hex"));
|
|
68
|
+
// The live set is whatever SURVIVED, read back rather than derived from the dropped ids: deriving it
|
|
69
|
+
// as "everything not dropped" would be wrong the moment an entry was removed by someone else.
|
|
70
|
+
const live = new Set((await this.notes.apply(conversation.workspaceId, "", { target: "skills", action: "list" })).map((entry) => entry.id));
|
|
71
|
+
for (const name of await readdir(folder)) {
|
|
72
|
+
if (name.endsWith(".md") && !live.has(name.slice(0, -3)))
|
|
73
|
+
await unlink(join(folder, name)).catch(() => { });
|
|
74
|
+
}
|
|
75
|
+
return Object.values(dropped).flat().length;
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
console.warn(`Super Pi: 撤回后的记忆回滚失败,历史已经回退但记忆可能残留:${error instanceof Error ? error.message : "unknown error"}`);
|
|
79
|
+
return 0;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
47
82
|
async configure(settings) {
|
|
48
83
|
if (typeof settings.enabled !== "boolean" || typeof settings.writeApproval !== "boolean" || !Number.isInteger(settings.reviewInterval) || settings.reviewInterval < 0)
|
|
49
84
|
throw new Error("记忆设置无效");
|
|
@@ -139,7 +174,7 @@ export class ActiveMemory {
|
|
|
139
174
|
await this.configure(body.settings);
|
|
140
175
|
}
|
|
141
176
|
else if (body.action === "write") {
|
|
142
|
-
await this.mutate({ workspaceId, conversationId: "user-management", review: false, readOnly: false }, body.operation, true);
|
|
177
|
+
await this.locked(() => this.mutate({ workspaceId, conversationId: "user-management", review: false, readOnly: false }, body.operation, true, true));
|
|
143
178
|
}
|
|
144
179
|
else if (body.action === "approve" || body.action === "discard") {
|
|
145
180
|
await this.locked(async () => {
|
|
@@ -30,6 +30,8 @@ export declare class ConversationService {
|
|
|
30
30
|
private agentsDir;
|
|
31
31
|
/** Conversations whose Pi transcript is being cut RIGHT NOW. Read by the send path, below. */
|
|
32
32
|
private readonly reverting;
|
|
33
|
+
/** The memory store, so a revert can undo what that conversation taught it. Set by `setMemory`. */
|
|
34
|
+
private memory?;
|
|
33
35
|
constructor(store: Store, runtime: AgentRuntime, subagents: SubagentRunRecorder, broadcaster: EventBroadcaster, catalogService: CatalogService, runService: RunService, extensionUiService: ExtensionUiService, agentsDir: string | string[]);
|
|
34
36
|
setAgentsDir(dir: string | string[]): void;
|
|
35
37
|
/**
|
|
@@ -72,6 +74,14 @@ export declare class ConversationService {
|
|
|
72
74
|
* Configures or clears the primary agent assigned to a conversation.
|
|
73
75
|
*/
|
|
74
76
|
setAgent(conversationId: string, agentId: string | null): Promise<void>;
|
|
77
|
+
/**
|
|
78
|
+
* Resolves the agent's model/thinking defaults against the catalog and the workspace's model rules.
|
|
79
|
+
*
|
|
80
|
+
* `workspaceId` must be passed when `conversation` is a workspace-shaped placeholder (the
|
|
81
|
+
* createConversation path passes `{ id: workspaceId, ... }`), because matching a workspace by a
|
|
82
|
+
* CONVERSATION id would never hit. Real conversations omit it: their workspace is resolved through
|
|
83
|
+
* `conversationWorkspace`, which reads `conversation.workspaceId`.
|
|
84
|
+
*/
|
|
75
85
|
private resolveAgentConfiguration;
|
|
76
86
|
/**
|
|
77
87
|
* Reverts conversation history to a designated message boundary, truncating both
|
|
@@ -81,8 +91,37 @@ export declare class ConversationService {
|
|
|
81
91
|
content: string;
|
|
82
92
|
images: import("../types.js").MessageImage[] | undefined;
|
|
83
93
|
} | undefined>;
|
|
94
|
+
/**
|
|
95
|
+
* The memory store, injected rather than constructed: `ActiveMemory` is built once in `index.ts` and
|
|
96
|
+
* handed to every holder, and this is the third of those. The rewind reaches memory through here
|
|
97
|
+
* because a revert that only rewound the TRANSCRIPT would leave the app still telling the model what
|
|
98
|
+
* the withdrawn turn said.
|
|
99
|
+
*/
|
|
100
|
+
setMemory(memory: import("../active-memory.js").ActiveMemory): void;
|
|
84
101
|
/** Whether a revert is currently cutting this conversation's history. The send path asks. */
|
|
85
102
|
isReverting(conversationId: string): boolean;
|
|
103
|
+
/**
|
|
104
|
+
* CLAIM THE CUT AT THE MOMENT THE COMMAND ARRIVES, not at the moment it runs.
|
|
105
|
+
*
|
|
106
|
+
* `revertMessage` above takes the claim itself, but it only runs when the command is EXECUTED - and a
|
|
107
|
+
* `message.send` deliberately does not wait for this socket's command queue (ws-server runs it
|
|
108
|
+
* independently, so a follow-up can be admitted while a turn is streaming). So a send arriving in the
|
|
109
|
+
* same tick as a revert used to be handled FIRST, found `isReverting` false because the cut had not
|
|
110
|
+
* started yet, and was admitted onto a transcript the cut was about to remove. The guard existed and
|
|
111
|
+
* still could not see the case it was written for.
|
|
112
|
+
*
|
|
113
|
+
* The claim therefore moves to the arrival edge, and `releaseRevert` below gives it back. A Set makes
|
|
114
|
+
* the two owners safe together: the service releases when the cut finishes, and the socket releases
|
|
115
|
+
* when the command finishes, and whichever runs first ends the claim - both are the same moment.
|
|
116
|
+
*
|
|
117
|
+
* The cost is that a revert sitting behind a long queue refuses sends from the moment it ARRIVES
|
|
118
|
+
* rather than from the moment it STARTS. That is the direction to err in: a send admitted during the
|
|
119
|
+
* gap is appended to a history the model still reads in full, and the message the person just withdrew
|
|
120
|
+
* is in its context.
|
|
121
|
+
*/
|
|
122
|
+
claimRevert(conversationId: string): void;
|
|
123
|
+
/** Give the claim back once the command that took it has finished, however it ended. */
|
|
124
|
+
releaseRevert(conversationId: string): void;
|
|
86
125
|
private cutTo;
|
|
87
126
|
/**
|
|
88
127
|
* Forks an existing conversation into a new parallel branch, cloning the Pi session.
|
|
@@ -15,6 +15,8 @@ export class ConversationService {
|
|
|
15
15
|
agentsDir;
|
|
16
16
|
/** Conversations whose Pi transcript is being cut RIGHT NOW. Read by the send path, below. */
|
|
17
17
|
reverting = new Set();
|
|
18
|
+
/** The memory store, so a revert can undo what that conversation taught it. Set by `setMemory`. */
|
|
19
|
+
memory;
|
|
18
20
|
constructor(store, runtime, subagents, broadcaster, catalogService, runService, extensionUiService, agentsDir) {
|
|
19
21
|
this.store = store;
|
|
20
22
|
this.runtime = runtime;
|
|
@@ -36,7 +38,7 @@ export class ConversationService {
|
|
|
36
38
|
if (!workspace)
|
|
37
39
|
throw new Error("Workspace not found");
|
|
38
40
|
const defaults = workspace.defaultAgentId
|
|
39
|
-
? await this.resolveAgentConfiguration({ id: workspaceId, model: workspace.defaultModel, thinkingLevel: workspace.defaultThinkingLevel }, workspace.defaultAgentId)
|
|
41
|
+
? await this.resolveAgentConfiguration({ id: workspaceId, model: workspace.defaultModel, thinkingLevel: workspace.defaultThinkingLevel }, workspace.defaultAgentId, workspaceId)
|
|
40
42
|
: undefined;
|
|
41
43
|
const created = await this.store.createConversation(workspaceId, defaults);
|
|
42
44
|
this.broadcaster.broadcastState();
|
|
@@ -146,7 +148,15 @@ export class ConversationService {
|
|
|
146
148
|
this.broadcaster.broadcastState();
|
|
147
149
|
await this.catalogService.broadcastCatalog(this.store.snapshot().conversations.find((item) => item.id === conversationId)?.model, conversationId);
|
|
148
150
|
}
|
|
149
|
-
|
|
151
|
+
/**
|
|
152
|
+
* Resolves the agent's model/thinking defaults against the catalog and the workspace's model rules.
|
|
153
|
+
*
|
|
154
|
+
* `workspaceId` must be passed when `conversation` is a workspace-shaped placeholder (the
|
|
155
|
+
* createConversation path passes `{ id: workspaceId, ... }`), because matching a workspace by a
|
|
156
|
+
* CONVERSATION id would never hit. Real conversations omit it: their workspace is resolved through
|
|
157
|
+
* `conversationWorkspace`, which reads `conversation.workspaceId`.
|
|
158
|
+
*/
|
|
159
|
+
async resolveAgentConfiguration(conversation, agentId, workspaceId) {
|
|
150
160
|
const agent = await this.runtime.agentFor?.({ id: conversation.id, agentId });
|
|
151
161
|
if (!agent) {
|
|
152
162
|
const dirsLabel = Array.isArray(this.agentsDir) ? this.agentsDir.join(", ") : this.agentsDir;
|
|
@@ -170,7 +180,11 @@ export class ConversationService {
|
|
|
170
180
|
}
|
|
171
181
|
}
|
|
172
182
|
const state = this.store.snapshot();
|
|
173
|
-
const workspace =
|
|
183
|
+
const workspace = workspaceId
|
|
184
|
+
? state.workspaces.find(item => item.id === workspaceId)
|
|
185
|
+
: conversationWorkspace(state, conversation.id);
|
|
186
|
+
if (!workspace)
|
|
187
|
+
throw new Error("Workspace not found");
|
|
174
188
|
assertModelAllowed(state.modelFilterRules, workspace, selection ?? (await this.runtime.catalog()).defaultModel);
|
|
175
189
|
return { agentId: agent.id, model: selection, thinkingLevel: agent.thinkingLevel ?? conversation.thinkingLevel };
|
|
176
190
|
}
|
|
@@ -196,10 +210,45 @@ export class ConversationService {
|
|
|
196
210
|
this.reverting.delete(conversationId);
|
|
197
211
|
}
|
|
198
212
|
}
|
|
213
|
+
/**
|
|
214
|
+
* The memory store, injected rather than constructed: `ActiveMemory` is built once in `index.ts` and
|
|
215
|
+
* handed to every holder, and this is the third of those. The rewind reaches memory through here
|
|
216
|
+
* because a revert that only rewound the TRANSCRIPT would leave the app still telling the model what
|
|
217
|
+
* the withdrawn turn said.
|
|
218
|
+
*/
|
|
219
|
+
setMemory(memory) {
|
|
220
|
+
this.memory = memory;
|
|
221
|
+
}
|
|
199
222
|
/** Whether a revert is currently cutting this conversation's history. The send path asks. */
|
|
200
223
|
isReverting(conversationId) {
|
|
201
224
|
return this.reverting.has(conversationId);
|
|
202
225
|
}
|
|
226
|
+
/**
|
|
227
|
+
* CLAIM THE CUT AT THE MOMENT THE COMMAND ARRIVES, not at the moment it runs.
|
|
228
|
+
*
|
|
229
|
+
* `revertMessage` above takes the claim itself, but it only runs when the command is EXECUTED - and a
|
|
230
|
+
* `message.send` deliberately does not wait for this socket's command queue (ws-server runs it
|
|
231
|
+
* independently, so a follow-up can be admitted while a turn is streaming). So a send arriving in the
|
|
232
|
+
* same tick as a revert used to be handled FIRST, found `isReverting` false because the cut had not
|
|
233
|
+
* started yet, and was admitted onto a transcript the cut was about to remove. The guard existed and
|
|
234
|
+
* still could not see the case it was written for.
|
|
235
|
+
*
|
|
236
|
+
* The claim therefore moves to the arrival edge, and `releaseRevert` below gives it back. A Set makes
|
|
237
|
+
* the two owners safe together: the service releases when the cut finishes, and the socket releases
|
|
238
|
+
* when the command finishes, and whichever runs first ends the claim - both are the same moment.
|
|
239
|
+
*
|
|
240
|
+
* The cost is that a revert sitting behind a long queue refuses sends from the moment it ARRIVES
|
|
241
|
+
* rather than from the moment it STARTS. That is the direction to err in: a send admitted during the
|
|
242
|
+
* gap is appended to a history the model still reads in full, and the message the person just withdrew
|
|
243
|
+
* is in its context.
|
|
244
|
+
*/
|
|
245
|
+
claimRevert(conversationId) {
|
|
246
|
+
this.reverting.add(conversationId);
|
|
247
|
+
}
|
|
248
|
+
/** Give the claim back once the command that took it has finished, however it ended. */
|
|
249
|
+
releaseRevert(conversationId) {
|
|
250
|
+
this.reverting.delete(conversationId);
|
|
251
|
+
}
|
|
203
252
|
async cutTo(conversationId, messageId, withdraw) {
|
|
204
253
|
let plan = this.store.planRevert(conversationId, messageId, withdraw);
|
|
205
254
|
let conversation = this.store.snapshot().conversations.find((item) => item.id === conversationId);
|
|
@@ -233,9 +282,21 @@ export class ConversationService {
|
|
|
233
282
|
beforeBoundary: withdraw && Boolean(conversation.messages.find(item => item.id === messageId)?.piEntryId),
|
|
234
283
|
});
|
|
235
284
|
const applied = await this.store.revertMessages(conversationId, messageId, withdraw);
|
|
285
|
+
// THE MEMORY HALF OF THE REWIND, and the half that used to be missing. Everything above removes the
|
|
286
|
+
// turn from Pi's file and from state.json; the memory store is a second durable copy of what the turn
|
|
287
|
+
// said, and it is spliced into every later prompt. So the model kept being told about a turn the person
|
|
288
|
+
// had withdrawn - measured by scripts/revert-real-pi.test.mjs, which answers a question about the
|
|
289
|
+
// withdrawn turn correctly only with `SUPER_PI_MEMORY_ENABLED=0`.
|
|
290
|
+
//
|
|
291
|
+
// The cut is the FIRST REMOVED message's timestamp, not the boundary's, because the boundary turn
|
|
292
|
+
// SURVIVES and anything it taught memory is still true. `revertMessages` has already removed the rest,
|
|
293
|
+
// so this runs on data that is settled and cannot be racing the store's own writes.
|
|
294
|
+
const firstRemoved = conversation.messages[applied.boundaryIndex + 1];
|
|
295
|
+
const forgotten = firstRemoved ? await this.memory?.forgetAfter(conversationId, firstRemoved.createdAt) ?? 0 : 0;
|
|
236
296
|
console.log(`Super Pi: reverted conversation ${conversationId} to ${applied.boundaryIndex + 1} message(s): ` +
|
|
237
297
|
`${plan.removedMessageIds.length} message(s) and ${applied.doomedRunIds.length} sub-agent run(s) dropped from state.json; ` +
|
|
238
|
-
`Pi's file ${outcome.sessionFile} kept ${outcome.linesKept} line(s) and lost ${outcome.entriesDropped}
|
|
298
|
+
`Pi's file ${outcome.sessionFile} kept ${outcome.linesKept} line(s) and lost ${outcome.entriesDropped}; ` +
|
|
299
|
+
`${forgotten} memory entr${forgotten === 1 ? "y" : "ies"} withdrawn with the turn.`);
|
|
239
300
|
this.broadcaster.broadcastState();
|
|
240
301
|
const withdrawn = conversation.messages.find(item => item.id === messageId);
|
|
241
302
|
return withdraw && withdrawn ? { content: withdrawn.content, images: withdrawn.images } : undefined;
|
|
@@ -1,3 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Safety net for questions Pi declared NO timeout for. The runtime races every blocking ask against the
|
|
3
|
+
* run's abort and exit, but the losing `ask` promise is simply abandoned there - and for a detached
|
|
4
|
+
* sub-agent run on an idle conversation nothing later cleans the entry up, so without a net it would sit
|
|
5
|
+
* in the map forever with a question card the browser never sees close. The net settles such a question
|
|
6
|
+
* as CANCELLED - never a default answer, per the design rule that a missing answer must not look like a
|
|
7
|
+
* human decision - and broadcasts `extension.ui.closed` so the card disappears with a stated reason.
|
|
8
|
+
* Generous, because a live run's question may legitimately wait on a slow human; this only bounds the
|
|
9
|
+
* case where nothing can ever answer it.
|
|
10
|
+
*/
|
|
11
|
+
const ASK_SAFETY_TIMEOUT_MS = 10 * 60 * 1000;
|
|
1
12
|
/**
|
|
2
13
|
* Service managing extension UI interactive prompts between Pi / subagents and connected clients.
|
|
3
14
|
*/
|
|
@@ -65,6 +76,11 @@ export class ExtensionUiService {
|
|
|
65
76
|
this.settleUi(key, { cancelled: true }, "timeout");
|
|
66
77
|
}, shown.timeoutMs);
|
|
67
78
|
}
|
|
79
|
+
else {
|
|
80
|
+
pending.timer = setTimeout(() => {
|
|
81
|
+
this.settleUi(key, { cancelled: true }, "expired");
|
|
82
|
+
}, ASK_SAFETY_TIMEOUT_MS);
|
|
83
|
+
}
|
|
68
84
|
this.pendingUi.set(key, pending);
|
|
69
85
|
this.broadcaster.broadcast({ type: "extension.ui", conversationId, request: shown });
|
|
70
86
|
}),
|