@teammy/server 0.0.5 → 0.0.7

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.
Files changed (30) hide show
  1. package/README.md +10 -4
  2. package/dist/main.js +1866 -706
  3. package/dist/runtime/README.md +15 -0
  4. package/dist/runtime/shared/system.md +7 -0
  5. package/dist/runtime/shared/tools.json +14 -0
  6. package/dist/runtime/workflows/directory-analysis/config.json +10 -0
  7. package/dist/runtime/workflows/directory-analysis/prompt.md +3 -0
  8. package/dist/runtime/workflows/file-summary/config.json +10 -0
  9. package/dist/runtime/workflows/file-summary/prompt.md +3 -0
  10. package/dist/runtime/workflows/task-bootstrap/config.json +11 -0
  11. package/dist/runtime/workflows/task-bootstrap/prompt.md +13 -0
  12. package/dist/web/assets/Dashboard-B9jlngBF.css +1 -0
  13. package/dist/web/assets/Dashboard-DXshk6qj.js +1 -0
  14. package/dist/web/assets/Files-BiIfupOU.js +1 -0
  15. package/dist/web/assets/Markdown-DOAYIfza.js +29 -0
  16. package/dist/web/assets/Sessions-BhnUEPaJ.js +1 -0
  17. package/dist/web/assets/index-BrRuqgnh.css +1 -0
  18. package/dist/web/assets/index-DT_BrKO8.js +64 -0
  19. package/dist/web/assets/teammy-calm-DVuoOK0F.png +0 -0
  20. package/dist/web/assets/teammy-mark-CxBtF1-X.png +0 -0
  21. package/dist/web/assets/teammy-wave-CVTgecuC.png +0 -0
  22. package/dist/web/assets/teammy-wordmark-ZFwxG0yl.png +0 -0
  23. package/dist/web/index.html +4 -4
  24. package/package.json +1 -1
  25. package/dist/web/assets/Dashboard--f1vaGx8.js +0 -1
  26. package/dist/web/assets/Files-Bc00wOfT.js +0 -1
  27. package/dist/web/assets/Markdown-BrmcIotb.js +0 -29
  28. package/dist/web/assets/Sessions-Bmlb8Xay.js +0 -1
  29. package/dist/web/assets/index-CgsCXCcm.js +0 -64
  30. package/dist/web/assets/index-uXzN7fKr.css +0 -1
@@ -0,0 +1 @@
1
+ import{A as e,B as t,C as n,D as r,F as i,I as a,L as o,M as s,N as c,R as l,_ as u,b as d,f,h as p,j as m,k as h,m as g,n as _,t as v,u as y,w as b,x,z as S}from"./index-DT_BrKO8.js";import{i as C,t as w}from"./Markdown-DOAYIfza.js";var T=t(),E=s([`claude-code`,`codex`,`cursor`,`pi`,`dsh`]),D=o({formatVersion:i(1),adapterVersion:i(1),agent:E,nativeId:l().min(1).max(512),cwd:l().min(1).max(4096),messages:c(o({id:l().min(1).max(1024),role:s([`user`,`assistant`]),text:l().min(1).max(2097152),source:l().min(1).max(1024)}).strict()).max(5e4)}).strict().refine(e=>new Set(e.messages.map(e=>e.id)).size===e.messages.length,`Duplicate message IDs.`);o({operationId:S(),sessionKey:h,parentRevision:e,blob:r}).strict();var O=o({owner:m,sessionKey:h,agent:E,nativeId:l(),cwd:l(),title:l(),revision:e,updatedAt:l(),messageCount:a().int().nonnegative(),blob:r}),k=o({sessions:c(O),nextCursor:e.nullable()}),A=o({totalSessions:a().int().nonnegative(),totalMessages:a().int().nonnegative(),memberCount:a().int().nonnegative(),updatedAt:l().nullable()});o({owner:m.optional(),sessionKey:h.optional()}).strict().refine(e=>!e.sessionKey||!!e.owner,`A session scope requires an owner.`);var j=o({matches:c(o({owner:m,sessionKey:h,revision:e,messageId:l(),role:s([`user`,`assistant`]),snippet:l(),title:l()})),nextCursor:e.nullable()}),M=x();function N({members:e,refresh:t,selected:n,onOwner:r,onSession:i}){let[a,o]=(0,T.useState)(new Set),[s,c]=(0,T.useState)(e[0]?.id??``);return(0,M.jsx)(`div`,{role:`tree`,"aria-label":`成员会话`,"data-testid":`session-tree`,onKeyDown:C,children:e.map(e=>(0,M.jsxs)(`div`,{role:`none`,children:[(0,M.jsxs)(y,{type:`button`,role:`treeitem`,"aria-level":1,"aria-expanded":a.has(e.id),"aria-selected":n?.owner===e.id&&!n.key,className:`tree-item tree-folder`,style:{"--tree-level":1},tabIndex:s===e.id?0:-1,"data-testid":`session-owner`,"data-owner-id":e.id,onFocus:()=>c(e.id),onClick:()=>{o(t=>{let n=new Set(t);return n.has(e.id)?n.delete(e.id):n.add(e.id),n}),r(e.id)},leading:(0,M.jsx)(`span`,{className:`tree-chevron ${a.has(e.id)?`expanded`:``}`,children:(0,M.jsx)(g,{name:`chevron`,size:`small`})}),children:[(0,M.jsx)(g,{name:`files`}),(0,M.jsx)(`span`,{className:`tree-name`,title:e.id,children:e.displayName})]}),a.has(e.id)&&(0,M.jsx)(P,{owner:e.id,selected:n,onSession:i,focused:s,onFocus:c},`${e.id}/${t}`)]},e.id))})}function P({owner:e,selected:t,onSession:r,focused:i,onFocus:a}){let{request:o}=_(),s=(0,T.useCallback)(t=>o(`sessions?${new URLSearchParams({owner:e,limit:`50`})}`,k,{signal:t}),[e,o]),c=n(s),[l,d]=(0,T.useState)(),[f,p]=(0,T.useState)(!1),[m,h]=(0,T.useState)(``),v=(0,T.useRef)(null);(0,T.useEffect)(()=>()=>v.current?.abort(),[]);let x=l?l.nextCursor:c.data?.nextCursor;return(0,M.jsxs)(`div`,{role:`group`,"aria-busy":c.loading||f,children:[(0,M.jsx)(u,{error:!0,children:c.error||m}),c.error&&(0,M.jsx)(`button`,{onClick:()=>void c.reload(),children:`重试`}),c.loading&&(0,M.jsx)(`span`,{className:`tree-status`,role:`status`,children:`正在加载…`}),[...c.data?.sessions??[],...l?.sessions??[]].map(n=>(0,M.jsxs)(y,{type:`button`,role:`treeitem`,"aria-level":2,"aria-selected":t?.owner===e&&t.key===n.sessionKey,className:`tree-item`,style:{"--tree-level":2},tabIndex:i===`${e}/${n.sessionKey}`?0:-1,"data-testid":`session-row`,"data-owner-id":e,"data-session-key":n.sessionKey,title:n.title||n.nativeId,onFocus:()=>a(`${e}/${n.sessionKey}`),onClick:()=>r({owner:e,key:n.sessionKey,revision:n.revision,title:n.title||n.nativeId}),leading:(0,M.jsx)(`span`,{className:`tree-chevron`}),children:[(0,M.jsx)(g,{name:`sessions`}),(0,M.jsx)(`span`,{className:`tree-name`,children:n.title||n.nativeId})]},n.sessionKey)),x!=null&&(0,M.jsx)(`button`,{className:`tree-action`,"data-testid":`session-tree-more`,disabled:f,onClick:async()=>{p(!0),h(``);let t=new AbortController;v.current=t;try{let n=await o(`sessions?${new URLSearchParams({owner:e,after:String(x),limit:`50`})}`,k,{signal:t.signal});d(e=>({sessions:[...e?.sessions??[],...n.sessions],nextCursor:n.nextCursor}))}catch(e){t.signal.aborted||h(b(e))}finally{t.signal.aborted||p(!1)}},children:`加载更多`})]})}function F({members:e}){let{request:t}=_(),r=(0,T.useCallback)(e=>t(`sessions/stats`,A,{signal:e}),[t]),i=n(r,!0),[a,o]=(0,T.useState)(``),[s,c]=(0,T.useState)(``),[l,d]=(0,T.useState)(0),[m,h]=(0,T.useState)(),[g,y]=(0,T.useState)(),b=(0,T.useRef)(null),x=m?.key?`搜索会话:${m.title}`:m?`搜索:${e.find(e=>e.id===m.owner)?.displayName??m.owner} 的会话内容`:``,S=()=>{h(void 0),b.current?.focus()},C=e=>{y(e),h(e),c(``)};return(0,M.jsxs)(`div`,{className:`split-layout file-explorer session-explorer`,children:[(0,M.jsxs)(`section`,{className:`file-tree-pane`,"aria-label":`会话目录`,children:[(0,M.jsx)(v,{title:`会话记录`,icon:`sessions`,count:(0,M.jsx)(`span`,{"data-testid":`session-total`,children:i.data?.totalSessions??`—`}),children:(0,M.jsx)(p,{icon:`refresh`,label:`刷新会话`,"data-testid":`sessions-refresh`,disabled:i.loading,onClick:()=>{i.reload(),d(e=>e+1)}})}),(0,M.jsx)(u,{error:!0,children:i.error}),(0,M.jsx)(N,{members:e,refresh:l,selected:m,onOwner:e=>{h({owner:e}),y(void 0),c(``)},onSession:C})]}),(0,M.jsxs)(`section`,{className:`session-reader`,"aria-label":`会话内容与搜索`,children:[(0,M.jsx)(`div`,{className:`session-reader-content`,children:s?(0,M.jsx)(I,{query:s,refresh:l,scope:{...m?{owner:m.owner}:{},...m?.key?{sessionKey:m.key}:{}},onSelect:C},`${s}/${m?.owner??``}/${m?.key??``}`):g?(0,M.jsx)(L,{selection:g},`${g.owner}/${g.key}/${g.revision}/${g.messageId??``}/${l}`):(0,M.jsx)(f,{mascot:!0,title:`选择会话开始阅读`,description:`也可以在下方搜索会话内容。`})}),(0,M.jsxs)(`form`,{className:`session-search-dock`,"data-testid":`session-search-form`,onSubmit:e=>{e.preventDefault(),c(a.trim()),d(e=>e+1)},children:[m&&(0,M.jsxs)(`button`,{type:`button`,className:`search-scope-chip`,"data-testid":`session-search-scope`,title:`清除搜索范围`,"aria-label":`清除范围:${x}`,onClick:S,children:[(0,M.jsx)(`span`,{className:`scope-label`,children:x}),(0,M.jsx)(`span`,{"aria-hidden":`true`,children:`×`})]}),(0,M.jsxs)(`div`,{className:`session-search-input-row`,children:[(0,M.jsx)(`input`,{ref:b,"aria-label":`搜索会话`,"data-testid":`session-query`,value:a,maxLength:500,placeholder:`搜索会话内容`,onChange:e=>o(e.target.value),onKeyDown:e=>{e.key===`Backspace`&&!a&&m&&(e.preventDefault(),S())}}),(s||a)&&(0,M.jsx)(p,{icon:`close`,label:`清空搜索`,"data-testid":`session-search-clear`,onClick:()=>{o(``),c(``),b.current?.focus()}}),(0,M.jsx)(p,{icon:`search`,type:`submit`,label:`搜索`,"data-testid":`session-search`,disabled:!a.trim()})]})]})]})]})}function I({query:e,refresh:t,scope:r,onSelect:i}){let{request:a}=_(),[o,s]=(0,T.useState)(0),c=(0,T.useCallback)(t=>a(`sessions/search?${new URLSearchParams({q:e,after:String(o),limit:`30`,...r.owner?{owner:r.owner}:{},...r.sessionKey?{sessionKey:r.sessionKey}:{}})}`,j,{signal:t}),[a,e,o,t,r.owner,r.sessionKey]),l=n(c);return(0,M.jsxs)(`section`,{className:`session-results stack`,"aria-label":`搜索结果`,"aria-busy":l.loading,children:[(0,M.jsx)(u,{error:!0,children:l.error}),l.error&&(0,M.jsx)(`button`,{onClick:()=>void l.reload(),children:`重试`}),l.loading&&(0,M.jsx)(`p`,{role:`status`,children:`正在搜索…`}),!l.loading&&l.data?.matches.map(e=>(0,M.jsxs)(`button`,{className:`session-item`,"data-testid":`session-match`,"data-message-id":e.messageId,onClick:()=>i({owner:e.owner,key:e.sessionKey,revision:e.revision,messageId:e.messageId,title:e.title}),children:[(0,M.jsx)(`strong`,{children:e.title}),(0,M.jsxs)(`small`,{children:[e.owner,` · `,e.role===`user`?`用户`:`助手`]}),(0,M.jsx)(`span`,{children:e.snippet})]},`${e.owner}:${e.sessionKey}:${e.messageId}`)),!l.loading&&l.data?.matches.length===0&&(0,M.jsx)(`p`,{className:`empty`,children:`没有找到匹配的会话`}),l.data?.nextCursor!=null&&(0,M.jsx)(`button`,{"data-testid":`sessions-next`,disabled:l.loading,onClick:()=>s(l.data.nextCursor),children:`下一页`}),o>0&&(0,M.jsx)(`button`,{disabled:l.loading,onClick:()=>s(0),children:`返回第一页`})]})}function L({selection:e}){let{request:t}=_(),r=(0,T.useCallback)(n=>t(`sessions/${encodeURIComponent(e.owner)}/${e.key}?revision=${e.revision}`,O,{signal:n}),[e.owner,e.key,e.revision]),i=n(r);return(0,M.jsxs)(`section`,{className:`session-conversation stack`,"data-testid":`session-detail`,children:[(0,M.jsx)(u,{error:!0,children:i.error}),i.error&&(0,M.jsx)(`button`,{onClick:()=>void i.reload(),children:`重试`}),i.loading&&(0,M.jsx)(`p`,{role:`status`,children:`正在读取会话…`}),i.data&&(0,M.jsx)(R,{info:i.data,messageId:e.messageId},i.data.blob.sha256)]})}function R({info:e,messageId:t}){let{readTextBlob:r}=_(),i=(0,T.useCallback)(async t=>D.parse(JSON.parse(await r(e.blob,t))),[e.blob.sha256,e.blob.size]),a=n(i),[o,s]=(0,T.useState)(0);return(0,T.useEffect)(()=>{if(a.data&&t){let e=a.data.messages.findIndex(e=>e.id===t);e>=0&&s(Math.floor(e/50)*50)}},[a.data,t]),(0,M.jsxs)(M.Fragment,{children:[(0,M.jsxs)(`header`,{className:`conversation-header`,children:[(0,M.jsx)(`h2`,{className:`session-title`,children:e.title||e.nativeId}),(0,M.jsxs)(`p`,{children:[e.owner,` · `,e.agent,` · `,e.messageCount,` 条消息`]}),(0,M.jsx)(`small`,{children:(0,M.jsx)(d,{value:e.updatedAt})})]}),(0,M.jsx)(u,{error:!0,children:a.error}),a.error&&(0,M.jsx)(`button`,{onClick:()=>void a.reload(),children:`重新读取`}),a.loading&&(0,M.jsx)(`p`,{role:`status`,children:`正在读取会话…`}),a.data&&(0,M.jsxs)(M.Fragment,{children:[(0,M.jsx)(`div`,{className:`session-messages`,children:a.data.messages.slice(o,o+50).map(e=>(0,M.jsxs)(`article`,{className:`session-message ${e.role} ${e.id===t?`matched`:``}`,"data-testid":`session-message`,"data-message-id":e.id,children:[(0,M.jsxs)(`div`,{className:`message-role`,children:[e.role===`user`?`用户`:`助手`,e.id===t?` · 搜索命中`:``]}),(0,M.jsx)(`div`,{className:`markdown`,children:(0,M.jsx)(w,{children:e.text})})]},e.id))}),(0,M.jsxs)(`div`,{className:`row wrap`,children:[(0,M.jsx)(`button`,{"data-testid":`messages-prev`,disabled:o===0,onClick:()=>s(Math.max(0,o-50)),children:`上一段`}),(0,M.jsxs)(`small`,{children:[a.data.messages.length?o+1:0,`–`,Math.min(o+50,a.data.messages.length),` /`,` `,a.data.messages.length]}),(0,M.jsx)(`button`,{"data-testid":`messages-next`,disabled:o+50>=a.data.messages.length,onClick:()=>s(o+50),children:`下一段`})]})]})]})}export{F as Sessions};
@@ -0,0 +1 @@
1
+ :root{--brand-black:#161615;--brand-orange:#fd523a;--brand-white:#fefcf5;--brand-cold-white:#fdfefe;--color-canvas:var(--brand-cold-white);--color-text:var(--brand-black);--color-muted:#747a7a;--color-surface:var(--brand-cold-white);--color-soft:#f3f5f5;--color-hover:#edf0f0;--color-line:#e0e5e5;--color-accent-soft:#fff0e8;--color-link:#ac3324;--color-danger:#a72d2d;--color-danger-soft:#fff0ec;--color-danger-line:#ebc6bd;--color-on-dark:var(--brand-cold-white);--color-rail-muted:#c6c6c0;--color-rail-hover:#30302c;--color-backdrop:#16161566;--shadow-menu:0 12px 40px #16161514;--shadow-modal:0 24px 80px #16161526;--shadow-floating:0 6px 28px #1616150a;--radius-sm:6px;--radius-md:10px;--radius-lg:16px;--font-body:-apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Microsoft YaHei", sans-serif;--font-mono:ui-monospace, "SFMono-Regular", Menlo, Monaco, Consolas, monospace;--text-xs:12px;--text-sm:13px;--text-base:15px;--text-lg:17px;--text-title:28px;--text-project:38px;--space-1:4px;--space-2:8px;--space-3:12px;--space-4:16px;--space-5:24px;--space-6:32px;--space-7:40px;--space-8:48px;--control-height:44px;--sidebar-width:116px;--page-gutter:48px;--pane-width:340px;--line:var(--color-line);--muted:var(--color-muted);font-family:var(--font-body);color:var(--color-text);background:var(--color-canvas);font-synthesis:none;font-size:var(--text-base);--lightningcss-light:initial;--lightningcss-dark: ;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;line-height:1.6}*{box-sizing:border-box}[hidden]{display:none!important}body{margin:0}button,input,textarea,select{font:inherit;color:inherit}button,.button{justify-content:center;align-items:center;gap:var(--space-2);min-height:var(--control-height);border:1px solid var(--color-line);border-radius:var(--radius-md);background:var(--color-surface);font-size:var(--text-sm);cursor:pointer;flex-shrink:0;padding:9px 16px;font-weight:550;line-height:22px;text-decoration:none;transition:background-color .12s,color .12s;display:inline-flex}button:hover,.button:hover{background:var(--color-hover)}button:disabled{opacity:.45;cursor:default}button.primary{background:var(--brand-black);border-color:var(--brand-black);color:var(--color-on-dark)}button.primary:hover{background:var(--color-rail-hover)}button.danger{background:var(--color-danger);border-color:var(--color-danger);color:var(--color-on-dark)}:focus-visible{outline:2px solid var(--brand-orange);outline-offset:3px}input,select,textarea{width:100%;min-width:0;min-height:var(--control-height);border:1px solid var(--color-line);border-radius:var(--radius-md);background:var(--color-surface);padding:10px 12px}input::placeholder,textarea::placeholder{color:var(--color-muted)}textarea{resize:vertical}input:disabled,textarea:disabled{background:var(--color-soft);color:var(--color-muted)}h1,h2,h3,p{margin:0}h1{font-size:var(--text-title);letter-spacing:-.7px;font-weight:750;line-height:1.35}h2{font-size:22px;font-weight:700;line-height:1.5}h3{font-size:var(--text-lg);font-weight:650}p{color:var(--color-muted);line-height:1.8}small,.muted{font-size:var(--text-sm);color:var(--color-muted)}a{color:var(--color-link);text-underline-offset:4px}code,pre{font-family:var(--font-mono)}fieldset{border:0;min-width:0;margin:0;padding:0}details>summary{cursor:pointer;font-size:var(--text-sm);padding:12px 0}details p{margin:8px 0}dt{color:var(--color-muted)}dd{overflow-wrap:anywhere;margin:0}.summary{font-size:var(--text-sm);grid-template-columns:auto 1fr;gap:8px 18px;margin:12px 0;display:grid}.brand{align-items:center;line-height:1;display:inline-flex}.brand img{width:176px;height:auto;display:block}.brand-compact img{object-fit:contain;width:58px;height:80px}.mascot{object-fit:contain;width:80px;height:112px;display:block}.icon{fill:none;stroke:currentColor;stroke-linejoin:round;stroke-linecap:round;flex-shrink:0}.stack{gap:var(--space-5);flex-direction:column;min-width:0;display:flex}.field{gap:var(--space-2);font-size:var(--text-sm);flex-direction:column;min-width:0;display:flex}.field>span{font-weight:600}.field small{font-weight:400;line-height:1.7}.row{align-items:center;gap:var(--space-2);display:flex}.wrap{flex-wrap:wrap}.actions{justify-content:flex-end;gap:var(--space-2);flex-wrap:wrap;display:flex}.form-grid{gap:var(--space-4);grid-template-columns:minmax(0,1fr) minmax(0,1fr);display:grid}.notice{border:1px solid var(--color-line);border-radius:var(--radius-md);background:var(--color-soft);font-size:var(--text-sm);overflow-wrap:anywhere;padding:12px 16px}.notice:empty{display:none}.notice.error{background:var(--color-danger-soft);border-color:var(--color-danger-line);color:var(--color-danger)}.error-text{color:var(--color-danger);overflow-wrap:anywhere}.badge{border:1px solid var(--color-line);background:var(--color-soft);border-radius:var(--radius-sm);font-size:var(--text-xs);color:var(--color-muted);vertical-align:middle;align-items:center;padding:2px 8px;line-height:20px;display:inline-flex}.badge.warn{background:var(--color-accent-soft);color:var(--color-link)}.panel{border:1px solid var(--color-line);border-radius:var(--radius-lg);background:var(--color-surface);padding:var(--space-5);min-width:0}.panel>h2,.panel>h3{margin-bottom:var(--space-4)}.section-heading{justify-content:space-between;align-items:center;gap:var(--space-3);margin-bottom:var(--space-5);flex-wrap:wrap;display:flex}.section-heading h2{align-items:center;gap:var(--space-3);display:flex}.stack>.section-heading{margin-bottom:0}.count{color:var(--color-muted);margin-left:var(--space-2);font-variant-numeric:tabular-nums;align-items:center;font-size:.75em;font-weight:450;display:inline-flex}.avatar{background:var(--color-soft);width:48px;height:48px;color:var(--color-muted);border-radius:50%;flex-shrink:0;place-items:center;font-size:20px;font-weight:650;display:inline-grid}.avatar.small{width:32px;height:32px;font-size:var(--text-sm)}.empty{text-align:center;color:var(--color-muted);padding:48px 24px}.empty h3{margin-bottom:var(--space-2)}.empty p{font-size:var(--text-sm)}.empty-state{justify-content:center;align-items:center;gap:var(--space-3);text-align:center;padding:var(--space-8) var(--space-5);flex-direction:column;min-width:0;margin:auto;display:flex}.empty-state .mascot{margin-bottom:var(--space-4)}.empty-state>.icon{color:var(--color-muted);margin-bottom:var(--space-2)}.empty-state h3{font-size:var(--text-base);font-weight:600}.empty-state p{max-width:320px;font-size:var(--text-sm)}.icon-button{width:var(--control-height);height:var(--control-height);min-height:var(--control-height);border-radius:var(--radius-md);color:var(--color-text);background:0 0;border:0;flex-shrink:0;justify-content:center;align-items:center;padding:10px;display:inline-flex;position:relative}.icon-button:hover{background:var(--color-hover)}[data-tooltip]:after{content:attr(data-tooltip);z-index:50;border-radius:var(--radius-sm);background:var(--brand-black);color:var(--color-on-dark);white-space:nowrap;font-size:var(--text-xs);visibility:hidden;opacity:0;pointer-events:none;padding:5px 8px;font-weight:400;line-height:1.5;position:absolute;bottom:calc(100% + 6px);right:0}[data-tooltip]:hover:after,[data-tooltip]:focus-visible:after{visibility:visible;opacity:1}.selection-item{color:inherit;background:0 0;border:0;text-decoration:none}.selection-item:hover{background:0 0}.selection-content{min-width:0;max-width:100%;padding:8px 12px;display:inline-flex;position:relative}.selection-inner{z-index:1;align-items:center;gap:12px;min-width:0;max-width:100%;display:inline-flex;position:relative}.selection-mark{pointer-events:none;fill:none;width:100%;height:100%;stroke:var(--brand-orange);stroke-linecap:round;stroke-linejoin:round;position:absolute;inset:0;overflow:visible}.selection-mark path{stroke-dasharray:1;stroke-dashoffset:0;animation:selection-draw var(--selection-duration) var(--selection-easing) both}.selection-mark .selection-mark-tail{animation-duration:var(--selection-tail-duration);animation-delay:var(--selection-tail-delay)}@keyframes selection-draw{0%{stroke-dashoffset:1px}to{stroke-dashoffset:0}}.selection-item[data-selection-variant=inverse][data-selected=true] .selection-content{background:var(--color-on-dark);color:var(--brand-black);border-radius:var(--radius-md)}.toolbar-actions{align-items:center;gap:var(--space-3);display:flex}.sr-only{clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.workspace{min-width:1100px;min-height:100dvh}.sidebar{z-index:30;width:var(--sidebar-width);background:var(--brand-black);color:var(--color-on-dark);scrollbar-width:none;flex-direction:column;align-items:center;padding:44px 20px;display:flex;position:fixed;inset:0 auto 0 0;overflow-y:auto}.sidebar nav{flex-direction:column;gap:30px;display:flex}.sidebar nav a{width:76px;height:66px;color:var(--color-rail-muted);justify-content:center;align-items:center;padding:0;display:flex;position:relative}.sidebar nav a:hover,.sidebar nav a[aria-current=page]{color:var(--color-on-dark)}.sidebar [data-tooltip]:after{bottom:-24px;left:50%;right:auto;transform:translate(-50%)}.main-shell{margin-left:var(--sidebar-width);min-width:0}.workspace-home .main-shell{margin-left:0}.dropdown{min-width:0;position:relative}.dropdown-trigger{text-align:left;background:0 0;border:0;padding:8px 0}.dropdown-trigger:hover{background:0 0}.dropdown-menu{z-index:40;width:320px;max-width:calc(100vw - 40px);max-height:min(480px,70dvh);padding:var(--space-2);border:1px solid var(--color-line);border-radius:var(--radius-lg);background:var(--color-surface);box-shadow:var(--shadow-menu);position:absolute;top:calc(100% + 12px);left:0;overflow:auto}.dropdown-menu [role=menuitem]{justify-content:flex-start;align-items:center;gap:var(--space-3);text-align:left;border:0;width:100%;padding:12px;display:flex}.dropdown-menu [role=menuitem]:hover,.dropdown-menu [role=menuitem]:focus-visible{background:var(--color-soft)}.dropdown-menu [role=menuitem]>span{overflow-wrap:anywhere;flex:1;min-width:0}.account-menu-wrap{max-width:160px;margin-left:auto}.account-menu-wrap .dropdown-trigger{max-width:100%;font-size:var(--text-lg)}.account-menu-wrap strong{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.account-menu-wrap .dropdown-menu{width:200px;left:auto;right:0}main#main{padding:48px var(--page-gutter);outline:0;min-width:0}.page-header{justify-content:space-between;align-items:center;gap:var(--space-5);margin-bottom:var(--space-6);display:flex}.page-header p{margin-top:var(--space-2);font-size:var(--text-sm)}.skip-link{z-index:100;background:var(--color-surface);padding:12px;position:fixed;top:-100px;left:12px}.skip-link:focus{top:12px}.file-explorer{height:100dvh;min-height:600px}.file-tree-pane{flex-direction:column;min-width:0;min-height:0;display:flex}.explorer-heading{justify-content:space-between;align-items:center;gap:var(--space-2);flex-shrink:0;min-height:48px;margin-bottom:32px;display:flex}.explorer-heading h1{align-items:center;gap:var(--space-3);letter-spacing:-.5px;min-width:0;font-size:26px;display:flex}[role=tree]{scrollbar-width:thin;min-height:0;padding:4px;overflow:auto}.tree-item{width:100%;min-height:52px;padding:2px 2px 2px calc((var(--tree-level) - 1) * 18px);font-size:var(--text-base);text-align:left;justify-content:flex-start;align-items:center;gap:2px;display:flex}.tree-item:focus-visible{outline-offset:-2px}.tree-chevron{width:16px;height:24px;color:var(--color-muted);flex-shrink:0;align-items:center;display:inline-flex}.tree-chevron.expanded{transform:rotate(90deg)}.tree-name{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.tree-status{color:var(--color-muted);font-size:var(--text-xs);padding:6px 24px;display:block}.tree-action{min-height:32px;font-size:var(--text-xs);background:0 0;margin:4px 16px;padding:4px 12px}.file-detail,.session-reader{min-width:0;min-height:0;padding:48px var(--page-gutter) 32px;flex-direction:column;display:flex;overflow:hidden}.file-detail-header{justify-content:space-between;align-items:center;gap:var(--space-4);flex-shrink:0;min-height:48px;margin-bottom:32px;display:flex}.file-detail-path{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:var(--text-base);overflow:hidden}.file-detail-path>span{color:var(--color-muted)}.file-detail>.preview-body{flex:1;min-height:0;overflow:auto}.preview-body{min-width:0;padding:0 8px 24px 0}.file-detail>.notice{margin-bottom:var(--space-3)}.file-entry-retry{align-self:flex-start;margin:12px 0}.raw{white-space:pre-wrap;overflow-wrap:anywhere;font-size:var(--text-sm);margin:0;line-height:1.8}.markdown{overflow-wrap:anywhere;min-width:0;font-size:16px;line-height:1.85}.markdown h1{font-size:30px}.markdown h2{font-size:23px}.markdown h3{font-size:18px}.markdown h1,.markdown h2,.markdown h3{margin:28px 0 12px}.markdown>:first-child{margin-top:0}.markdown p,.markdown ul,.markdown ol{color:var(--color-text);margin:12px 0}.markdown pre{background:var(--color-soft);border-radius:var(--radius-md);font-size:var(--text-sm);padding:18px;overflow:auto}.markdown code{background:var(--color-soft);border-radius:var(--radius-sm);padding:2px 4px}.markdown pre code{padding:0}.markdown blockquote{border-left:3px solid var(--brand-orange);margin:18px 0;padding:0 18px}.markdown table{border-collapse:collapse;max-width:100%;display:block;overflow:auto}.markdown td,.markdown th{border:1px solid var(--color-line);padding:8px 12px}.markdown input[type=checkbox]{appearance:none;vertical-align:-3px;border:2px solid var(--color-line);opacity:1;background:0 0;border-radius:50%;width:18px;height:18px;min-height:0;margin:0 8px 0 0;padding:0;position:relative}.markdown .task-list-item{list-style:none}.markdown .contains-task-list{padding-left:0}.markdown input[type=checkbox]:checked{border-color:var(--brand-orange)}.markdown input[type=checkbox]:checked:after{content:"";border:solid var(--brand-orange);border-width:0 2px 2px 0;width:5px;height:9px;position:absolute;top:1px;left:4px;transform:rotate(45deg)}.session-search-dock{border:1px solid var(--color-line);border-radius:var(--radius-lg);background:var(--color-surface);width:min(100%,760px);box-shadow:var(--shadow-floating);flex-shrink:0;align-self:center;margin:24px 0 0;padding:10px 14px}.session-search-input-row{align-items:center;gap:var(--space-2);display:flex}.session-search-input-row input{min-width:0;font-size:var(--text-base);background:0 0;border:0;flex:1;padding:8px 4px}.session-search-input-row input:focus{outline:0}.session-search-dock:focus-within{outline:2px solid var(--brand-orange);outline-offset:2px}.search-scope-chip{align-items:center;gap:var(--space-2);border-radius:var(--radius-sm);background:var(--color-hover);max-width:100%;height:22px;min-height:0;color:var(--color-muted);line-height:18px;font-size:var(--text-xs);text-align:left;border:0;padding:2px 6px;display:flex}.search-scope-chip .scope-label{text-overflow:ellipsis;white-space:nowrap;display:block;overflow:hidden}.search-scope-chip>span:last-child{flex-shrink:0;margin-left:auto}.session-reader-content{flex-direction:column;flex:1;min-height:0;padding-right:8px;display:flex;overflow:auto}.session-conversation{min-width:0}.conversation-header{padding-bottom:var(--space-5);border-bottom:1px solid var(--color-line)}.conversation-header p{font-size:var(--text-sm);margin-top:var(--space-2)}.session-title{overflow-wrap:anywhere;font-size:var(--text-title)}.session-messages{flex-direction:column;display:flex}.session-message{gap:var(--space-4);border-bottom:1px solid var(--color-line);grid-template-columns:76px minmax(0,1fr);min-width:0;padding:24px 0;display:grid}.session-message.matched{box-shadow:inset 3px 0 var(--brand-orange);padding-left:var(--space-4);background:var(--color-accent-soft)}.message-role{font-size:var(--text-sm);color:var(--color-muted);padding-top:3px}.session-item{text-align:left;align-items:flex-start;gap:var(--space-2);padding:var(--space-5) 0;border:0;border-bottom:1px solid var(--color-line);background:0 0;border-radius:0;flex-direction:column;display:flex}.session-item>*{overflow-wrap:anywhere;min-width:0;max-width:100%}.management-page{max-width:1120px;margin:0 auto}.settings-layout{min-height:100dvh}.settings-navigation .page-header{min-height:48px;margin-bottom:32px}.settings-navigation h1{font-size:26px}.settings-tabs{gap:var(--space-3);flex-direction:column;display:flex}.settings-tabs [role=tab]{font-size:var(--text-base);justify-content:flex-start;padding:2px 4px;font-weight:600}.settings-content{min-width:0;padding:48px var(--page-gutter)}.settings-content [role=tabpanel]{min-width:0}.settings-section{padding:0 0 var(--space-6)}.settings-section+.settings-section{border-top:1px solid var(--color-line);padding-top:var(--space-6)}.settings-section>h2{margin-bottom:var(--space-5)}.settings-section form,.settings-section>.stack{max-width:800px}.member-list{min-width:0}.member-card{justify-content:space-between;align-items:center;gap:var(--space-4);border-bottom:1px solid var(--color-line);min-width:0;padding:24px 0;display:flex}.member-heading{align-items:center;gap:var(--space-5);min-width:0;display:flex}.member-heading>div{min-width:0}.member-heading h3{overflow-wrap:anywhere;font-size:19px}.member-heading small{overflow-wrap:anywhere}.member-actions{gap:var(--space-1);display:flex}.form-section-title{margin-top:var(--space-4);padding-top:var(--space-5);border-top:1px solid var(--color-line)}.application-row{gap:var(--space-4);border-bottom:1px solid var(--color-line);grid-template-columns:90px minmax(0,1fr);padding:20px 0;display:grid}.application-row:last-child{border-bottom:0;padding-bottom:0}.application-row strong{font-size:var(--text-sm);overflow-wrap:anywhere;font-weight:600}.ai-model-row{grid-template-columns:minmax(0,1fr) auto;align-items:center;padding-top:0}.ai-model-row>div{min-width:0}.ai-model-row small{overflow-wrap:anywhere;display:block}.connect-panel{gap:var(--space-4);flex-direction:column;display:flex}.connect-panel>h2{margin:0}.connect-panel p{font-size:var(--text-sm)}.command{align-items:center;gap:var(--space-2);border:1px solid var(--color-line);border-radius:var(--radius-md);background:var(--color-soft);padding:12px;display:flex}.command code{font-size:var(--text-sm);overflow-wrap:anywhere;white-space:pre-wrap;flex:1;min-width:0}.command button{min-height:32px;padding:6px}.scope-path{border-top:1px solid var(--color-line);font-size:var(--text-xs);overflow-wrap:anywhere;color:var(--color-muted);margin-top:20px;padding-top:16px}.model-default-row{padding:8px 0}.model-default-controls{align-items:flex-end;gap:var(--space-3);display:flex}.model-default-controls .field{flex:1;min-width:0}.model-default-controls .icon-button{margin-bottom:2px}.settings-section-actions{margin-bottom:var(--space-4);justify-content:flex-end;display:flex}.analysis-tools{border-top:1px solid var(--color-line)}.analysis-tools>summary{align-items:center;gap:var(--space-3);font-size:var(--text-sm);padding:22px 0;font-weight:500;list-style:none;display:flex}.analysis-tools>summary::-webkit-details-marker{display:none}.analysis-tools>summary>span{flex:1}.analysis-tools>summary>.icon:last-child{color:var(--color-muted)}.analysis-tools[open]>summary>.icon:last-child{transform:rotate(180deg)}.analysis-tools .board-analysis{margin-top:var(--space-2)}.ai-grid{gap:var(--space-5);grid-template-columns:minmax(280px,.9fr) minmax(0,1.1fr);align-items:start;display:grid}.ai-grid>*,.ai-grid .panel,.ai-break{overflow-wrap:anywhere;min-width:0}.ai-grid-idle{grid-template-columns:minmax(0,1fr)}.ai-job-row{text-align:left;overflow-wrap:anywhere;padding:6px}.ai-citation{text-align:left;overflow-wrap:anywhere}.ai-events{max-height:280px;padding-left:24px;overflow:auto}.ai-result p,.ai-result li{white-space:pre-wrap;overflow-wrap:anywhere;line-height:1.7}.ai-result pre{max-height:400px;overflow:auto}.projects-home{max-width:1320px;margin:0 auto}.projects-brand-header{justify-content:space-between;align-items:center;gap:var(--space-5);margin-bottom:64px;display:flex}.projects-home .page-header{margin-bottom:28px}.projects-home .page-header h1{font-size:36px}.project-list{grid-template-columns:repeat(auto-fill,minmax(290px,1fr));gap:28px;display:grid}.project-card{text-align:left;border:1px solid var(--color-line);border-radius:var(--radius-md);background:var(--color-canvas);flex-direction:column;align-items:flex-start;gap:24px;min-height:230px;padding:30px;display:flex;position:relative}.project-card:hover{border-color:var(--brand-orange);background:var(--color-canvas)}.project-card>span{min-width:0}.project-card strong{overflow-wrap:anywhere;font-size:22px;display:block}.project-card small{overflow-wrap:anywhere;margin-top:10px;font-weight:400;display:block}.project-card>.icon:last-child{color:var(--color-muted);position:absolute;bottom:28px;right:24px}dialog{border:1px solid var(--color-line);border-radius:var(--radius-lg);background:var(--color-canvas);width:calc(100% - 32px);max-width:520px;color:var(--color-text);box-shadow:var(--shadow-modal);max-height:85dvh;padding:0;overflow:auto}dialog::backdrop{background:var(--color-backdrop)}.dialog-content{padding:var(--space-6)}.dialog-header{margin-bottom:var(--space-5);justify-content:space-between;align-items:center;gap:var(--space-3);display:flex}.dialog-header h2{font-size:22px}.boot{gap:var(--space-5);max-width:520px;margin:100px auto;padding:24px;display:grid}.access{grid-template-columns:minmax(280px,42%) minmax(0,1fr);min-height:100dvh;display:grid}.access-aside{background:var(--color-soft);flex-direction:column;padding:40px;display:flex;position:relative;overflow:hidden}.access-art{flex:1;place-items:center;padding:48px 0;display:grid}.access-art .mascot{width:min(70%,250px);height:auto;max-height:45dvh}.access-copy{padding:16px 0}.access-copy h2{margin-bottom:var(--space-2);letter-spacing:-1px;font-size:30px}.access-copy p{font-size:var(--text-base)}.access-main{justify-content:center;align-items:center;padding:56px 48px;display:flex}.access-form{gap:var(--space-5);flex-direction:column;width:100%;max-width:380px;display:flex}.access-form>p{font-size:var(--text-sm);margin-top:-10px}.wide{width:100%}.setup-form{max-width:560px}.steps{gap:var(--space-4);margin:4px 0 16px;padding:0;list-style:none;display:flex}.steps li{color:var(--color-muted);font-size:var(--text-xs);align-items:center;gap:6px;display:flex}.steps li span{border:1px solid var(--color-line);width:24px;height:24px;font-size:var(--text-xs);border-radius:50%;place-items:center;display:grid}.steps li[aria-current]{color:var(--color-text)}.steps li[aria-current] span{background:var(--brand-black);border-color:var(--brand-black);color:var(--color-on-dark)}@media (prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition:none!important;animation:none!important}}.brand-home{border-radius:var(--radius-sm);justify-content:center;margin-bottom:64px;display:inline-flex}.sidebar .selection-content{padding:12px 16px}.split-layout{grid-template-columns:var(--pane-width) minmax(0, 1fr);display:grid}.file-tree-pane,.settings-navigation{border-right:1px solid var(--color-line);padding:48px 24px 32px 28px}main#main:is([data-page=files],[data-page=sessions],[data-page=settings],[data-page=site-settings]){padding:0}.ai-job-row .selection-inner{align-items:flex-start;gap:var(--space-2);flex-direction:column}