@teammy/server 0.1.16 → 0.1.18

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.
@@ -1 +1 @@
1
- [data-testid=nav-assistant]{position:relative}.navigation-unread{background:var(--brand-orange);border-radius:50%;width:7px;height:7px;position:absolute;top:-3px;right:-4px}.project-activity{white-space:nowrap;min-width:0;max-width:100%;height:18px;line-height:18px;font-size:var(--text-xs);color:var(--color-muted);flex-shrink:0;align-items:center;gap:5px;margin-top:auto;font-weight:400;display:inline-flex;overflow:hidden}.project-activity-label{text-overflow:ellipsis;min-width:0;overflow:hidden}.project-activity-dot{background:currentColor;border-radius:50%;flex-shrink:0;width:6px;height:6px}.project-activity[data-state=running],.project-activity[data-state=queued]{color:var(--brand-orange)}.project-activity[data-state=failed]{color:var(--color-danger)}: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:80px;--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)}input[type=checkbox],input[type=radio]{width:16px;height:16px;min-height:16px;accent-color:var(--brand-black);flex:0 0 16px;margin:0;padding:0}.check-field{width:fit-content;font-size:var(--text-sm);cursor:pointer;align-items:center;gap:8px;display:inline-flex}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:42px;height:58px}.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)}.repository-status-card{border:1px solid var(--color-line);border-radius:var(--radius-md);background:var(--color-soft);font-size:var(--text-sm);align-items:flex-start;gap:12px;padding:16px;display:flex}.repository-status-card>svg{flex:none}.repository-status-card strong{display:block}.repository-status-card p{color:var(--color-muted);margin:4px 0 0}.repository-status-card.active{background:var(--color-accent-soft);border-color:var(--color-link);color:var(--color-link)}.repository-status-card.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)}:where(form,dialog,.task-card,.settings-section,.member-card) .icon-button{width:32px;height:32px;min-height:32px;padding:7px}:where(form,dialog,.task-card,.settings-section,.member-card) .icon-button>.icon{width:18px;height:18px}[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:0;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:28px 8px;display:flex;position:fixed;inset:0 auto 0 0;overflow-y:auto}.sidebar nav{flex-direction:column;gap:12px;display:flex}.sidebar nav a{width:64px;height:68px;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 .selection-inner{flex-direction:column;gap:4px}.sidebar nav .icon{width:26px;height:26px}.navigation-label{font-size:var(--text-xs);font-weight:600;line-height:16px}.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:40px;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-item .selection-content{padding-top:5px;padding-bottom:5px}.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}.preview-body-html{flex:1;display:flex}.html-preview{background:0 0;border:0;flex:1;width:100%;min-width:0;min-height:400px;display:block}.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-explorer{align-items:start;height:auto;min-height:100dvh}.session-explorer>.file-tree-pane{height:100dvh;position:sticky;top:0}.session-explorer .session-reader{min-height:100dvh;overflow:visible}.session-search-dock{z-index:2;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;position:sticky;bottom:24px}.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;display:flex;overflow:visible}.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:22px;line-height:1.5}.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%}.session-excerpt{color:var(--color-muted);font-size:var(--text-sm);white-space:normal;font-weight:400}mark.search-highlight{color:inherit;background:linear-gradient(transparent 12%, color-mix(in srgb, var(--brand-orange) 32%, transparent) 12% 90%, transparent 90%);-webkit-box-decoration-break:clone;box-decoration-break:clone;border-radius:2px;padding:0}.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[aria-orientation=horizontal]{gap:var(--space-5);flex-direction:row}.site-settings-content{padding-top:var(--space-7);margin-top:var(--space-5);border-top:1px solid var(--color-line)}.settings-tabs [role=tab]{font-size:var(--text-base);justify-content:flex-start;padding:2px 4px;font-weight:600}.settings-tabs .lucide-message-circle{transform:scale(.9)}.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}.site-page{max-width:1320px;margin:0 auto}.site-brand-header{justify-content:space-between;align-items:center;gap:var(--space-5);margin-bottom:64px;display:flex}.site-page .page-header{margin-bottom:28px}.site-page .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 8px}.access-copy h2{letter-spacing:-1px;margin:0;font-size:30px}.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%}@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:36px;display:inline-flex}.sidebar .selection-content{justify-content:center;align-items:center;width:100%;height:100%;padding:8px}.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=materials],[data-page=settings]){padding:0}.setup-runtime{color:var(--muted);flex-wrap:wrap;gap:8px 14px;font-size:12px;display:flex}
1
+ [data-testid=nav-assistant]{position:relative}.navigation-unread{background:var(--brand-orange);border-radius:50%;width:7px;height:7px;position:absolute;top:-3px;right:-4px}.project-activity{white-space:nowrap;min-width:0;max-width:100%;height:18px;line-height:18px;font-size:var(--text-xs);color:var(--color-muted);flex-shrink:0;align-items:center;gap:5px;margin-top:auto;font-weight:400;display:inline-flex;overflow:hidden}.project-activity-label{text-overflow:ellipsis;min-width:0;overflow:hidden}.project-activity-dot{background:currentColor;border-radius:50%;flex-shrink:0;width:6px;height:6px}.project-activity[data-state=running],.project-activity[data-state=queued]{color:var(--brand-orange)}.project-activity[data-state=failed]{color:var(--color-danger)}: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:80px;--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)}input[type=checkbox],input[type=radio]{width:16px;height:16px;min-height:16px;accent-color:var(--brand-black);flex:0 0 16px;margin:0;padding:0}.check-field{width:fit-content;font-size:var(--text-sm);cursor:pointer;align-items:center;gap:8px;display:inline-flex}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:42px;height:58px}.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)}.repository-status-card{border:1px solid var(--color-line);border-radius:var(--radius-md);background:var(--color-soft);font-size:var(--text-sm);align-items:flex-start;gap:12px;padding:16px;display:flex}.repository-status-card>svg{flex:none}.repository-status-card strong{display:block}.repository-status-card p{color:var(--color-muted);margin:4px 0 0}.repository-status-card.active{background:var(--color-accent-soft);border-color:var(--color-link);color:var(--color-link)}.repository-status-card.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)}:where(form,dialog,.task-card,.settings-section,.member-card) .icon-button{width:32px;height:32px;min-height:32px;padding:7px}:where(form,dialog,.task-card,.settings-section,.member-card) .icon-button>.icon{width:18px;height:18px}[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:0;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:28px 8px;display:flex;position:fixed;inset:0 auto 0 0;overflow-y:auto}.sidebar nav{flex-direction:column;gap:12px;display:flex}.sidebar nav a{width:64px;height:68px;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 .selection-inner{flex-direction:column;gap:4px}.sidebar nav .icon{width:26px;height:26px}.navigation-label{font-size:var(--text-xs);font-weight:600;line-height:16px}.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:40px;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-item .selection-content{padding-top:5px;padding-bottom:5px}.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}.preview-body-html{flex:1;display:flex}.html-preview{background:0 0;border:0;flex:1;width:100%;min-width:0;min-height:400px;display:block}.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-explorer{align-items:start;height:auto;min-height:100dvh}.session-explorer>.file-tree-pane{height:100dvh;position:sticky;top:0}.session-explorer .session-reader{min-height:100dvh;overflow:visible}.session-search-dock{z-index:2;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;position:sticky;bottom:24px}.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;display:flex;overflow:visible}.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:22px;line-height:1.5}.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%}.session-excerpt{color:var(--color-muted);font-size:var(--text-sm);white-space:normal;font-weight:400}mark.search-highlight{color:inherit;background:linear-gradient(transparent 12%, color-mix(in srgb, var(--brand-orange) 32%, transparent) 12% 90%, transparent 90%);-webkit-box-decoration-break:clone;box-decoration-break:clone;border-radius:2px;padding:0}.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[aria-orientation=horizontal]{gap:var(--space-5);flex-direction:row}.site-settings-content{padding-top:var(--space-7);margin-top:var(--space-5);border-top:1px solid var(--color-line)}.settings-tabs [role=tab]{font-size:var(--text-base);justify-content:flex-start;padding:2px 4px;font-weight:600}.settings-tabs .lucide-message-circle{transform:scale(.9)}.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}.site-page{max-width:1320px;margin:0 auto}.site-brand-header{justify-content:space-between;align-items:center;gap:var(--space-5);margin-bottom:64px;display:flex}.site-page .page-header{margin-bottom:28px}.site-page .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 8px}.access-copy h2{letter-spacing:-1px;margin:0;font-size:30px}.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%}@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:36px;display:inline-flex}.sidebar .selection-content{justify-content:center;align-items:center;width:100%;height:100%;padding:8px}.split-layout{grid-template-columns:var(--pane-width) minmax(0, 1fr);display:grid}@media (width<=680px){.file-explorer{grid-template-rows:auto minmax(320px,1fr);grid-template-columns:minmax(0,1fr);height:auto}.file-explorer>.file-tree-pane{border-right:0;border-bottom:1px solid var(--color-line);max-height:36dvh;padding:24px 16px}.file-explorer>.file-detail{min-height:60dvh;padding:24px 16px}}.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=materials],[data-page=settings]){padding:0}.setup-runtime{color:var(--muted);flex-wrap:wrap;gap:8px 14px;font-size:12px;display:flex}
Binary file
@@ -6,8 +6,8 @@
6
6
  <meta name="theme-color" content="#161615" />
7
7
  <title>Teammy 工作台</title>
8
8
  <link rel="icon" type="image/png" href="./assets/teammy-favicon-BiDvlPj2.png" />
9
- <script type="module" crossorigin src="./assets/index-RLdREQwh.js"></script>
10
- <link rel="stylesheet" crossorigin href="./assets/index-A_XSN_Cz.css">
9
+ <script type="module" crossorigin src="./assets/index-BRdnk3k3.js"></script>
10
+ <link rel="stylesheet" crossorigin href="./assets/index-Swfty9kO.css">
11
11
  </head>
12
12
  <body>
13
13
  <div id="root" data-teammy-ui-version="11"></div>
@@ -0,0 +1 @@
1
+ {"teammy/SKILL.md":"---\nname: teammy\ndescription: 查询已连接 Teammy 项目的任务、会话库、资料和协作消息,或向Tim提问、委托项目工作。\n---\n\n使用 Teammy MCP 查询项目资料,需要执行项目协作工作时委托Tim。首次接入或工具不可用时,阅读 [MCP 配置](references/setup.md);工具选择见 [工具说明](references/tools.md)。\n\n- 项目和用户身份来自 CLI 连接,不自行指定其他成员身份。本地代码和已同步工作区使用原生文件工具读取。\n- 任务先查 `query_tasks`,资料用 `search_resources` 定位、`read_material` 阅读;会话可先读摘要或 handoff,再按需读正文。保留结果中的来源链接与版本信息。\n- 通过 `ask_teammy` 发送问题或明确委托;第一次不填 `conversationId`,后续沿用返回的 ID。每条新消息使用新的 `requestId`,网络重试原样复用该请求的全部参数。\n- 返回 `queued` 或 `running` 时,用 `get_teammy_reply` 查询,等待期间可处理独立工作。不要重复发送问题来催促;`succeeded` 表示本轮结束,`failed` 时说明错误。\n- Tim保留完整协作能力。转达用户已有的明确授权与必要背景;需要用户决定时转述问题,收到答复后在同一对话继续,不把自己的推测说成用户确认。\n- 后台委托结果和待答问题用 `list_messages`、`read_message` 查询,按游标继续阅读。通知与事项均可多轮跟进;将用户答复通过 `ask_teammy` 发往返回的 `conversationId`,沿用它返回的实际会话 ID。只读查询不标记已读,运行成功不等于整个事项完成。\n- 发送必要信息即可,不自动上传整段本地聊天、密钥或无关项目内容。网页端可以查看并继续同一对话。\n","teammy/references/setup.md":"# 接入\n\n需要 Teammy CLI 与服务端 0.1.6 或更新版本。在运行用户 Agent 的机器上安装 `@teammy/cli`,并在项目目录完成 `teammy connect`。MCP 复用该连接,无需在 skill 或 MCP 配置中填写令牌。\n\n在 Agent 的 MCP 设置中添加一个 stdio 服务,名称为 `teammy`,命令为 `teammy`,参数为 `mcp --root /绝对项目目录/workspaces`。使用自定义状态目录时追加 `--state-dir /绝对状态目录`。\n\n支持 `mcpServers` 格式的客户端可使用以下示例;其他客户端填写同样的命令与参数:\n\n```json\n{\"mcpServers\":{\"teammy\":{\"command\":\"teammy\",\"args\":[\"mcp\",\"--root\",\"/绝对项目目录/workspaces\"]}}}\n```\n\n将 skill 文件夹放到用户 Agent 支持的 skills 目录,再启用上述 MCP。下载 skill 不会自动注册 MCP,Teammy 的会话采集也不会自动安装它。一个 MCP 配置绑定一个工作区;多个项目可分别添加配置。\n\n启动错误会写入 stderr;stdout 仅用于 MCP。连接失败先检查 `teammy status --root /绝对项目目录/workspaces`。工具参数以 MCP 返回的 schema 为准。\n","teammy/references/tools.md":"# 工具\n\n| 工具 | 用途 |\n| --- | --- |\n| query_tasks | 按关键词、成员或任务 ID 查询,可包含归档任务 |\n| search_resources | 搜索工作区和资料,可指定 scope、资料或原件 |\n| read_material | 阅读资料正文和原件信息,可指定版本 |\n| list_sessions / search_sessions | 列出或搜索会话库 |\n| read_session | 阅读指定会话及版本的正文 |\n| read_session_analysis | 读取已有 overview 或 handoff,不触发生成 |\n| get_file_link | 获取已同步文件的网页链接 |\n| list_prs / read_pr | 查询仓库 PR/MR 及详情、评论或 diff |\n| list_messages / read_message | 阅读当前用户的协作消息,不标记已读 |\n| ask_teammy | 提问或委托Tim执行工作 |\n| get_teammy_reply | 获取该轮状态和答复 |\n| read_tool_result | 按字段和位置展开已折叠的原始结果,不重跑原工具 |\n\n## 对话示例\n\n首次调用 `ask_teammy`:\n\n```json\n{\"requestId\":\"local-discussion-42-message-1\",\"text\":\"请结合我的任务和近期资料,说明这周优先处理什么。\"}\n```\n\n结果包含 `conversationId`、`run.id`、`run.state` 和网页 `url`。查询 `get_teammy_reply` 时填写该 `conversationId` 和 `runId`。继续讨论时填写同一 `conversationId`、新的 `requestId` 和新消息 `text`。\n\n如果 Tim 已委托后台,当前答复可能只是委托说明,succeeded 不代表事项已完成。用 `list_messages` 查找可参与的通知和事项,再用 `read_message({conversationId,after,limit})` 分页查看正文;查询不标记已读。继续回复时,在 `ask_teammy` 携带可访问的 conversationId 和用户实际答复。通知转入事项后沿用响应中的实际 conversationId。多个收件人的私人跟进不会自动共享。\n\n查询结果携带分页游标时按需继续。找不到资料或返回过时摘要时如实说明,不把工具调用成功等同于项目数据完整或后台工作完成。\n\n超长结果返回 `folded=true`、概览和 `id`,此时尚未读完正文。先调用 `read_tool_result({id})` 查看字段,再沿返回的 `path` 和 `nextOffset` 读取相关部分;字符串 offset 沿用返回值。不要因结果折叠而重新发送 ask_teammy。\n\nPR/MR 概要先读 details。`read_pr({number,section:\"diff\"})` 默认只返回文件清单,携带清单的 `head` 和选定的 `file` 读取该文件差异。版本变化时重新获取清单;没有读取的差异或平台未展开的部分,不能声称已完成审阅。\n"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@teammy/server",
3
- "version": "0.1.16",
3
+ "version": "0.1.18",
4
4
  "description": "The centralized Teammy collaboration hub server.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -31,6 +31,7 @@
31
31
  "diff": "8.0.4",
32
32
  "fastify": "5.12.7",
33
33
  "ignore": "^7.0.8",
34
+ "minimatch": "11.0.3",
34
35
  "ws": "8.22.0",
35
36
  "zod": "4.6.7"
36
37
  }
@@ -1 +0,0 @@
1
- import{$ as e,A as t,D as n,J as r,M as i,O as a,S as o,W as s,a as c,b as l,et as ee,f as u,i as d,j as te,k as f,n as p,o as m,q as h,r as ne,t as re,u as ie,v as ae,y as oe}from"./index-RLdREQwh.js";import{t as se}from"./Markdown-CL1rUtDC.js";var g=e(),_=t(),v=e=>new Date(e).toLocaleTimeString([],{hour:`2-digit`,minute:`2-digit`}),y=e=>e.replace(/[#*_`>]/g,``).replace(/\s+/g,` `).trim();function b({mine:e=!1,author:t,time:n,children:r}){return(0,_.jsx)(`div`,{className:`assistant-bubble-row ${e?`mine`:``}`,children:(0,_.jsxs)(`div`,{className:`assistant-bubble`,children:[(0,_.jsxs)(`div`,{className:`assistant-bubble-meta`,children:[(0,_.jsx)(`span`,{children:t}),(0,_.jsx)(`time`,{dateTime:n,children:v(n)})]}),r]})})}function x({me:e}){let{projectId:t,request:x}=ie(),C=f(),w=a(t,e,`assistant-selection`),T=a(t,e,`assistant-drafts`),ce=(0,g.useCallback)(e=>x(`agents/outbox`,c,{signal:e}),[x]),E=n(ce,3e3,a(t,e,`outbox`)),le=(0,g.useCallback)(e=>x(`agents/chats`,re,{signal:e}),[x]),D=n(le,3e3,a(t,e,`chats`)),[O,ue]=(0,g.useState)(()=>{let e=new URLSearchParams(location.search),t=e.get(`chat`);return t?`chat:${t}`:e.get(`message`)??C?.get(w)??``}),k=O.startsWith(`chat:`)?O.slice(5):``,A=!O||!!k,[j,M]=(0,g.useState)(()=>C?.get(a(t,e,`chat`,k))),N=j?.id===k?j:C?.get(a(t,e,`chat`,k)),de=D.data?.chats.find(e=>e.id===k),[fe,P]=(0,g.useState)(),[F,I]=(0,g.useState)(()=>C?.get(T)??{}),L=F[O]??``,R=e=>I(t=>({...t,[O]:e})),[z,B]=(0,g.useState)(!1),[V,H]=(0,g.useState)(!1),[pe,U]=(0,g.useState)(``),[W,G]=(0,g.useState)(``),K=(0,g.useRef)(new Map),me=(0,g.useRef)(null),q=(0,g.useRef)(!0),J=(0,g.useRef)(O);J.current=O,(0,g.useEffect)(()=>{j&&C?.set(a(t,e,`chat`,j.id),j)},[C,t,e,j]),(0,g.useEffect)(()=>{C?.set(T,F)},[C,T,F]);function Y(e){J.current=e,ue(e),C?.set(w,e);let t=new URL(location.href);e.startsWith(`chat:`)?t.searchParams.set(`chat`,e.slice(5)):t.searchParams.delete(`chat`),e&&!e.startsWith(`chat:`)&&e!==`debug`?t.searchParams.set(`message`,e):t.searchParams.delete(`message`),history.replaceState(history.state,``,t)}(0,g.useEffect)(()=>{!O&&D.data?.chats.length&&Y(`chat:${D.data.chats[0].id}`)},[O,D.data]);let X=(E.data?.messages??[]).filter(e=>e.box===`debug`).reverse(),Z=E.data?.messages.find(e=>e.id===(O===`debug`?fe:O));(0,g.useEffect)(()=>{O!==`debug`&&Z?.conversationId&&Y(`chat:${Z.conversationId}`)},[O,Z?.conversationId]);let Q=X.filter(e=>!e.readAt).map(e=>e.id).join(`,`);(0,g.useEffect)(()=>{Z&&!Z.readAt&&O!==`debug`&&x(`agents/outbox/${Z.id}/read`,m,{method:`POST`}).then(()=>{window.dispatchEvent(new Event(`teammy:outbox`)),E.reload()}).catch(e=>U(i(e)))},[Z?.id,Z?.readAt,O,x,E.reload]),(0,g.useEffect)(()=>{O===`debug`&&Q&&Promise.all(Q.split(`,`).map(e=>x(`agents/outbox/${e}/read`,m,{method:`POST`}))).then(()=>{window.dispatchEvent(new Event(`teammy:outbox`)),E.reload()}).catch(e=>U(i(e)))},[O,Q,x,E.reload]),(0,g.useEffect)(()=>{if(G(``),!k)return;let n=!0,o=-1,s=!1,c=new AbortController,l=e=>{!n||e.id!==k||e.cursor<o||(o=e.cursor,s=!0,e.redirect?Y(`chat:${e.redirect}`):(M(e),G(``)))};x(`agents/chats/${k}`,p,{signal:c.signal}).then(l).catch(r=>{n&&!c.signal.aborted&&(r instanceof te&&[401,403,404].includes(r.status)&&(C?.delete(a(t,e,`chat`,k)),M(e=>e?.id===k?void 0:e)),s||G(i(r)))});let u=e=>{let t=Number(e.lastEventId);return!n||!Number.isSafeInteger(t)||t<=o?!1:(o=t,!0)},f=new EventSource(ee(`/api/v1/projects/${encodeURIComponent(t)}/agents/chats/${encodeURIComponent(k)}/events`));f.addEventListener(`snapshot`,e=>{if(n)try{l(p.parse(JSON.parse(e.data)))}catch(e){G(i(e))}}),f.onerror=()=>{n&&G(`对话连接中断,正在重新连接…`)},f.addEventListener(`context`,e=>{if(!u(e))return;let t=p.pick({kind:!0,title:!0,status:!0,visibility:!0,participants:!0,pending:!0,hold:!0,redirect:!0}).parse(JSON.parse(e.data));t.redirect?Y(`chat:${t.redirect}`):M(e=>e?.id===k?{...e,...t,cursor:o}:e)}),f.addEventListener(`message`,e=>{if(!u(e))return;let t=ne.parse(JSON.parse(e.data));M(n=>n?.id===k?{...n,readCursor:Math.max(n.readCursor,t.seq),cursor:Math.max(n.cursor,Number(e.lastEventId)||0),messages:[...n.messages.filter(e=>e.id!==t.id),t].sort((e,t)=>e.seq-t.seq)}:n)}),f.addEventListener(`message_removed`,e=>{if(!u(e))return;let{id:t}=h({id:r()}).parse(JSON.parse(e.data));M(e=>e?.id===k?{...e,cursor:o,messages:e.messages.filter(e=>e.id!==t)}:e)}),f.addEventListener(`run`,e=>{if(!u(e))return;let t=d.parse(JSON.parse(e.data));M(n=>n?.id===k?{...n,cursor:Math.max(n.cursor,Number(e.lastEventId)||0),runs:n.runs.some(e=>e.id===t.id)?n.runs:[...n.runs,t]}:n)});for(let e of[`delta`,`reset`,`state`])f.addEventListener(e,t=>{if(!u(t))return;let n=JSON.parse(t.data);M(r=>r?.id===k?{...r,cursor:Math.max(r.cursor,Number(t.lastEventId)||0),messages:r.messages.map(t=>t.runId!==n.id||t.role!==`assistant`?t:{...t,body:e===`delta`?t.body+(n.text??``):e===`reset`?``:n.answer??t.body,state:n.state??t.state}),runs:r.runs.map(t=>t.id===n.id?{...t,answer:e===`delta`?t.answer+(n.text??``):e===`reset`?``:n.answer??t.answer,state:n.state??t.state,error:n.error===void 0?t.error:n.error}:t)}:r)});return()=>{n=!1,c.abort(),f.close()}},[t,k,e,x,C]),(0,g.useEffect)(()=>{if(!N?.kind||N.id!==k)return;let e=()=>{document.visibilityState===`visible`&&x(`agents/chats/${k}/read`,h({ok:s()}),{method:`POST`,body:{cursor:N.readCursor}}).then(()=>{D.reload(),window.dispatchEvent(new Event(`teammy:outbox`))}).catch(e=>U(i(e)))},t=setTimeout(e,300);return document.addEventListener(`visibilitychange`,e),()=>{clearTimeout(t),document.removeEventListener(`visibilitychange`,e)}},[k,N?.readCursor,N?.kind,x]),(0,g.useEffect)(()=>{q.current&&me.current?.scrollIntoView({block:`end`})},[O,j?.messages,Z?.recipients,X.length]);function he(){window.dispatchEvent(new Event(`teammy:outbox`)),E.reload()}async function $(e){if(q.current=!0,Y(e),U(``),P(void 0),e.startsWith(`chat:`)||e===`debug`)return;let t=E.data?.messages.find(t=>t.id===e)?.conversationId;if(t)Y(`chat:${t}`);else try{await x(`agents/outbox/${e}/read`,m,{method:`POST`}),he()}catch(e){U(i(e))}}async function ge(){if(!V){H(!0),U(``);try{let e=await x(`agents/chats`,p,{method:`POST`});M(e),await $(`chat:${e.id}`),D.reload()}catch(e){U(i(e))}finally{H(!1)}}}async function _e(e){e.preventDefault();let t=L.trim();if(!t||z||V)return;B(!0),U(``);let n=K.current.get(O);n&&n.text===t||(n={text:t,id:crypto.randomUUID()},K.current.set(O,n));try{if(A){let e=n.target??k;if(!e){let r=await x(`agents/chats`,p,{method:`POST`});e=r.id,n.target=e,K.current.set(`chat:${e}`,n),I(n=>({...n,[`chat:${e}`]:t})),J.current===O&&(M(r),Y(`chat:${e}`))}let i=await x(`agents/chats/${e}`,d.extend({conversationId:r().optional()}),{method:`POST`,body:{text:t,requestId:n.id}});i.conversationId&&i.conversationId!==e&&(J.current===O||J.current===`chat:${e}`)&&Y(`chat:${i.conversationId}`),M(t=>t?.id===e?{...t,runs:t.runs.some(e=>e.id===i.id)?t.runs:[...t.runs,i]}:t),D.reload()}else{let e=await x(`agents/outbox/${Z.id}/reply`,h({conversationId:r()}),{method:`POST`,body:{body:t,requestId:n.id}});he(),J.current===O&&Y(`chat:${e.conversationId}`),D.reload(),P(void 0)}K.current.delete(O),n.target&&K.current.delete(`chat:${n.target}`),I(e=>({...e,[O]:``,...n.target?{[`chat:${n.target}`]:``}:{}}))}catch(e){U(i(e))}finally{B(!1)}}let ve=A||!!Z&&!Z.archivedAt,ye=A&&!N&&(!!k||!D.data);return(0,_.jsxs)(`div`,{className:`split-layout assistant-layout`,"data-testid":`assistant-page`,children:[(0,_.jsxs)(`aside`,{className:`assistant-list`,"aria-label":`消息列表`,children:[(0,_.jsxs)(`header`,{className:`assistant-list-heading`,children:[(0,_.jsx)(`h1`,{children:`消息`}),(0,_.jsx)(oe,{className:`assistant-new-chat`,icon:`plus`,label:`新建对话`,disabled:V,onClick:()=>void ge(),"data-testid":`assistant-launcher`})]}),(0,_.jsxs)(`div`,{className:`assistant-message-scroll`,children:[D.loading&&!D.data&&(0,_.jsx)(`p`,{className:`assistant-list-status`,role:`status`,children:`加载中…`}),D.data?.chats.map(e=>(0,_.jsxs)(`button`,{type:`button`,"data-testid":`assistant-chat-${e.id}`,className:`assistant-message-item assistant-chat-item ${k===e.id?`selected`:``}`,"aria-pressed":k===e.id,onClick:()=>void $(`chat:${e.id}`),children:[(0,_.jsx)(`span`,{className:`assistant-message-dot ${e.unread||e.state===`running`||e.state===`queued`?`unread`:``}`}),(0,_.jsxs)(`span`,{className:`assistant-message-copy`,children:[(0,_.jsx)(u,{selected:k===e.id,children:(0,_.jsx)(`strong`,{children:e.title})}),(0,_.jsxs)(`time`,{dateTime:e.updatedAt,children:[new Date(e.updatedAt).toLocaleDateString([],{month:`numeric`,day:`numeric`}),` `,v(e.updatedAt)]})]})]},e.id)),!!X.length&&(0,_.jsxs)(`button`,{type:`button`,"data-testid":`debug-outbox`,className:`assistant-message-item ${O===`debug`?`selected`:``}`,onClick:()=>void $(`debug`),children:[(0,_.jsx)(`span`,{className:`assistant-message-dot ${Q?`unread`:``}`}),(0,_.jsxs)(`span`,{className:`assistant-message-copy`,children:[(0,_.jsx)(u,{selected:O===`debug`,children:(0,_.jsx)(`strong`,{children:`运行提醒`})}),(0,_.jsx)(`span`,{children:y(X.at(-1).body)})]})]}),E.data?.messages.filter(e=>e.box!==`debug`&&!e.conversationId).sort((e,t)=>Number(!!e.archivedAt)-Number(!!t.archivedAt)).map(e=>(0,_.jsxs)(`button`,{type:`button`,"data-testid":`outbox-${e.id}`,className:`assistant-message-item ${e.archivedAt?`archived`:``} ${O===e.id?`selected`:``}`,onClick:()=>void $(e.id),children:[(0,_.jsx)(`span`,{className:`assistant-message-dot ${e.readAt?``:`unread`}`}),(0,_.jsxs)(`span`,{className:`assistant-message-copy`,children:[(0,_.jsx)(u,{selected:O===e.id,children:(0,_.jsx)(`strong`,{children:y(e.body)})}),(0,_.jsxs)(`time`,{dateTime:e.createdAt,children:[new Date(e.createdAt).toLocaleDateString([],{month:`numeric`,day:`numeric`}),` `,v(e.createdAt)]})]})]},e.id))]}),(0,_.jsx)(o,{error:!0,children:E.error||D.error})]}),(0,_.jsxs)(`section`,{className:`assistant-thread`,"aria-label":A?`Tim对话`:`消息内容`,children:[(0,_.jsxs)(`header`,{className:`assistant-thread-heading`,children:[(0,_.jsx)(`h2`,{children:A?de?.title??N?.title??(k?`无标题`:`Tim`):O===`debug`?`运行提醒`:`项目消息`}),N?.kind===`matter`&&(0,_.jsxs)(`span`,{className:`assistant-participants`,title:N.participants?.join(`、`),children:[N.visibility===`project`?`项目共享 · `:``,N.participants?.join(`、`)]})]}),N?.kind===`matter`&&(N.hold||N.pending||N.status===`completed`)&&(0,_.jsx)(`div`,{className:`assistant-matter-state`,role:`status`,children:N.hold?`${N.hold.scope===`all`?`已暂停`:`暂缓修改`} · ${N.hold.reason}`:N.pending?`待确认 · ${N.pending.members.join(`、`)}:${N.pending.question}`:`已完成`}),(0,_.jsxs)(`div`,{className:`assistant-transcript`,role:`log`,"aria-live":`polite`,"data-testid":`assistant-transcript`,onScroll:e=>{let t=e.currentTarget;q.current=t.scrollHeight-t.scrollTop-t.clientHeight<100},children:[A?ye?(0,_.jsxs)(`div`,{className:`assistant-empty`,"data-testid":`assistant-loading`,children:[(0,_.jsx)(l,{}),(0,_.jsx)(`p`,{role:`status`,children:W||D.error?`暂时无法加载对话`:`加载中…`})]}):N?.messages.length?N.messages.filter(e=>e.body||[`queued`,`running`,`failed`].includes(e.state)).map(t=>(0,_.jsx)(`div`,{className:`assistant-turn`,children:(0,_.jsxs)(b,{mine:t.role===`user`&&t.author===e,author:`${t.role===`assistant`?`Tim`:t.author}${t.source===`wecom`?` · 企业微信`:``}`,time:t.createdAt,children:[t.body&&(0,_.jsx)(`div`,{className:`markdown`,children:(0,_.jsx)(se,{children:t.body})}),t.role===`assistant`&&[`queued`,`running`].includes(t.state)&&(0,_.jsxs)(`span`,{className:`assistant-typing`,"aria-label":`正在回答`,children:[(0,_.jsx)(`i`,{}),(0,_.jsx)(`i`,{}),(0,_.jsx)(`i`,{})]}),t.state===`failed`&&(0,_.jsx)(o,{error:!0,children:N.runs.find(e=>e.id===t.runId)?.error||`本次回答未完成。`})]})},t.id)):(0,_.jsxs)(`div`,{className:`assistant-empty`,children:[(0,_.jsx)(l,{}),(0,_.jsx)(`p`,{children:`有什么项目问题想聊聊?`})]}):!E.data&&E.loading?(0,_.jsx)(`div`,{className:`assistant-empty`,children:(0,_.jsx)(`p`,{role:`status`,children:`加载中…`})}):O===`debug`?X.map(e=>(0,_.jsx)(S,{item:e,onReply:e.archivedAt?void 0:()=>{P(e.id),R(``),U(``)}},e.id)):Z&&(0,_.jsx)(S,{item:Z}),(0,_.jsx)(`div`,{ref:me})]}),(0,_.jsx)(o,{error:!0,children:pe||(A?W:``)}),ve?(0,_.jsxs)(`form`,{className:`assistant-composer`,onSubmit:e=>void _e(e),children:[(0,_.jsx)(`textarea`,{value:L,disabled:V,onChange:e=>R(e.target.value),"aria-label":A?`向Tim提问`:`回复消息`,placeholder:A?`问问Tim…`:`回复…`,rows:2,onKeyDown:e=>{e.key===`Enter`&&!e.shiftKey&&!e.nativeEvent.isComposing&&(e.preventDefault(),e.currentTarget.form?.requestSubmit())}}),(0,_.jsx)(`button`,{className:`primary assistant-send`,type:`submit`,disabled:z||V||ye||!L.trim(),"aria-label":`发送`,children:(0,_.jsx)(ae,{name:`send`})})]}):O!==`debug`&&Z&&(0,_.jsxs)(`div`,{className:`assistant-archived`,children:[(0,_.jsx)(ae,{name:`archive`}),`已归档`]})]})]})}function S({item:e,onReply:t}){return(0,_.jsx)(`div`,{"data-testid":`outbox-thread-${e.id}`,children:(0,_.jsxs)(b,{author:e.box===`debug`?`运行提醒`:`Tim`,time:e.createdAt,children:[(0,_.jsx)(`div`,{className:`markdown`,children:(0,_.jsx)(se,{children:e.body})}),t&&(0,_.jsx)(`button`,{type:`button`,className:`assistant-debug-reply`,onClick:t,children:`回复`})]})})}export{x as Assistant};
@@ -1 +0,0 @@
1
- import{$ as e,A as t,C as n,D as r,E as i,M as a,O as o,S as s,T as c,_ as l,et as u,h as d,m as f,p,u as m,v as h,x as g,y as _}from"./index-RLdREQwh.js";import{t as v}from"./project-links-Dy6-B89_.js";import"./file-links-DRYT4k5s.js";var y=e(),b=t(),x=[{status:`planned`,label:`计划`},{status:`in_progress`,label:`进行中`},{status:`in_review`,label:`待验收`},{status:`completed`,label:`已完成`},{status:null,label:`未明确`}];function S({members:e,project:t}){let{request:i,projectId:a}=m(),c=(0,y.useCallback)(e=>i(`tasks`,p,{signal:e}),[i]),l=r(c,3e3,o(a,`tasks`)),[u,f]=(0,y.useState)(),h=l.data,g=new Map(e.map(e=>[e.id,e.displayName||e.id]));return(0,b.jsxs)(`div`,{className:`task-board`,children:[(0,b.jsx)(n,{title:t?.projectName.trim()?`${t.projectName.trim()}|工作看板`:`工作看板`,description:t?.description.trim()||``}),(0,b.jsx)(s,{error:!0,children:l.error}),(0,b.jsx)(`section`,{className:`task-board-lanes`,"aria-label":`任务进度`,"data-testid":`progress-board`,children:x.filter(e=>e.status!==null||h?.tasks.some(e=>e.status===null)).map(e=>{let t=h?.tasks.filter(t=>t.status===e.status)??[];return(0,b.jsxs)(`section`,{className:`task-lane`,"aria-label":e.label,"data-stage":e.status??`unknown`,children:[(0,b.jsxs)(`h2`,{children:[(0,b.jsx)(`span`,{className:`lane-dot`}),e.label,(0,b.jsx)(d,{children:h?t.length:`—`})]}),(0,b.jsx)(`div`,{className:`task-lane-content`,children:t.length?t.map(e=>(0,b.jsx)(C,{task:e,names:g,onEdit:()=>f(e),onSaved:()=>void l.reload()},e.id)):(0,b.jsx)(`p`,{className:`task-lane-empty`,children:l.error&&!h?`读取失败`:h?`暂无任务`:`读取中…`})})]},e.label)})}),u&&(0,b.jsx)(T,{task:u,onClose:()=>f(void 0),onSaved:()=>{f(void 0),l.reload()}},u.id)]})}function C({task:e,names:t,onEdit:n,onSaved:r}){let{projectId:o,request:l}=m(),d=i(),[p,g]=(0,y.useState)(!1),[x,S]=(0,y.useState)(``);async function C(){if(!p){g(!0),S(``);try{await l(`tasks/${e.id}/correction`,f,{method:`PATCH`,signal:d,body:{needsConfirmation:!1,expectedRevision:e.revision}}),d.aborted||r()}catch(e){d.aborted||S(a(e))}finally{g(!1)}}}return(0,b.jsxs)(`details`,{className:`task-card`,"data-testid":`task-card`,"data-task-id":e.id,"data-owner":e.owner,"data-status":e.status??`unknown`,children:[(0,b.jsxs)(`summary`,{className:`task-card-heading`,"data-testid":`task-toggle`,children:[(0,b.jsx)(`h3`,{children:e.title}),(0,b.jsxs)(`span`,{className:`task-card-meta`,children:[(0,b.jsx)(`small`,{children:t.get(e.owner)??e.owner}),e.needsConfirmation&&(0,b.jsxs)(`span`,{className:`task-confirmation`,"data-testid":`task-confirmation`,children:[(0,b.jsx)(h,{name:`attention`,size:`small`}),`需要确认`]})]})]}),(0,b.jsx)(_,{icon:`edit`,className:`task-card-edit`,label:`纠正任务:${e.title}`,"data-testid":`task-correct`,disabled:p,onClick:n}),(0,b.jsxs)(`div`,{className:`task-card-details`,children:[(0,b.jsx)(`h4`,{children:`目标`}),(0,b.jsx)(`p`,{children:e.goal?(0,b.jsx)(w,{value:e.goal,names:t}):`目标未明确`}),(0,b.jsx)(`h4`,{children:`当前进展`}),(0,b.jsx)(`p`,{className:`task-progress`,children:(0,b.jsx)(w,{value:e.progress,names:t})}),(0,b.jsx)(`div`,{className:`task-card-sources`,children:e.sources.map(t=>(0,b.jsxs)(`a`,{"data-testid":`task-source`,href:u(t.kind===`material`?`/projects/${o}/materials?id=${t.materialId}&revision=${t.revision}`:v(o,e.owner,t.path)),children:[(0,b.jsx)(h,{name:`file`,size:`small`}),(0,b.jsx)(`span`,{children:t.path})]},t.path))}),e.syncedAt&&(0,b.jsxs)(`small`,{children:[`资料同步于 `,(0,b.jsx)(c,{value:e.syncedAt})]}),e.needsConfirmation&&(0,b.jsxs)(`div`,{className:`task-card-confirm`,children:[(0,b.jsx)(s,{error:!0,children:x}),(0,b.jsx)(`button`,{className:`primary`,"data-testid":`task-confirm-save`,disabled:p,onClick:()=>void C(),children:p?`正在保存…`:`保存`})]})]})]})}function w({value:e,names:t}){return e.split(/(@[a-z][a-z0-9_-]*)/gi).map((e,n)=>e.startsWith(`@`)&&t.has(e.slice(1))?(0,b.jsx)(`mark`,{className:`task-mention`,children:e},n):e)}function T({task:e,onClose:t,onSaved:n}){let{request:r}=m(),o=i(),[c,u]=(0,y.useState)(e.title),[d,p]=(0,y.useState)(e.status??``),[h,_]=(0,y.useState)(e.goal??``),[v,S]=(0,y.useState)(e.progress),[C,w]=(0,y.useState)(!1),[T,E]=(0,y.useState)(``),D={...c===e.title?{}:{title:c},...d===(e.status??``)?{}:{status:d||null},...h===(e.goal??``)?{}:{goal:h||null},...v===e.progress?{}:{progress:v},...e.needsConfirmation?{needsConfirmation:!1}:{}};async function O(){if(!C&&Object.keys(D).length){w(!0),E(``);try{await r(`tasks/${e.id}/correction`,f,{method:`PATCH`,signal:o,body:{...D,expectedRevision:e.revision}}),o.aborted||n()}catch(e){o.aborted||E(a(e))}finally{w(!1)}}}return(0,b.jsx)(g,{id:`task-correction`,title:`纠正任务`,onClose:t,children:(0,b.jsxs)(`form`,{className:`stack`,"aria-busy":C,onSubmit:e=>{e.preventDefault(),O()},children:[(0,b.jsx)(l,{id:`task-title`,label:`标题`,children:(0,b.jsx)(`input`,{value:c,required:!0,onChange:e=>u(e.target.value)})}),(0,b.jsxs)(`fieldset`,{className:`task-status-field`,disabled:C,children:[(0,b.jsx)(`legend`,{children:`状态`}),(0,b.jsx)(`div`,{className:`task-status-options`,"data-testid":`task-status`,children:x.filter(e=>e.status!==null).map(e=>(0,b.jsxs)(`label`,{className:`task-status-choice`,children:[(0,b.jsx)(`input`,{type:`radio`,name:`task-status`,value:e.status,checked:d===e.status,onChange:()=>p(e.status)}),(0,b.jsx)(`span`,{children:e.label})]},e.status))}),(0,b.jsx)(`small`,{children:`待验收:任务成果已提交,等待验收或最终确认。`})]}),(0,b.jsx)(l,{id:`task-goal`,label:`目标`,children:(0,b.jsx)(`textarea`,{value:h,onChange:e=>_(e.target.value)})}),(0,b.jsx)(l,{id:`task-progress`,label:`当前进展`,children:(0,b.jsx)(`textarea`,{value:v,onChange:e=>S(e.target.value)})}),(0,b.jsx)(s,{error:!0,children:T}),(0,b.jsx)(`div`,{className:`row wrap`,children:(0,b.jsx)(`button`,{type:`submit`,className:`primary`,disabled:C||!Object.keys(D).length,"data-testid":`task-correction-save`,children:`保存`})})]})})}function E({members:e,config:t}){return(0,b.jsx)(S,{members:e,project:t})}export{E as Dashboard};
@@ -1 +0,0 @@
1
- import{$ as e,A as t,D as n,F as r,L as i,O as a,S as o,c as s,et as c,g as l,j as u,l as d,s as f,u as p,v as m,w as h,y as g}from"./index-RLdREQwh.js";import{t as _}from"./Markdown-CL1rUtDC.js";import{t as v}from"./project-links-Dy6-B89_.js";import{t as y}from"./file-links-DRYT4k5s.js";import{n as b,t as x}from"./WorkspaceTree-Dd_I-GBi.js";import{t as S}from"./HtmlPreview-DVdKncKP.js";var C=e(),w=t();function T(e,t){let n=t.split(`/`).slice(0,-1);return n.map((t,r)=>b(e,n.slice(0,r+1).join(`/`))).concat(b(e,``))}function E({members:e,me:t,onRefresh:a}){let{api:m,projectId:h}=p(),[_,S]=(0,C.useState)(()=>{let t=new URLSearchParams(location.search),n=t.get(`owner`),r=i.safeParse(t.get(`path`));return n&&(n===`_project`||e.some(e=>e.id===n))&&r.success&&!s(r.data)?{owner:n,path:r.data}:void 0}),[E,O]=(0,C.useState)(()=>new Set(_?T(_.owner,_.path):[b(t,``)])),[k,A]=(0,C.useState)(()=>_?{..._,kind:`file`}:void 0),[j,M]=(0,C.useState)(0),[N,P]=(0,C.useState)(()=>{let e=new URLSearchParams(location.search);return!_&&(e.has(`owner`)||e.has(`path`))?`文件链接不完整或目标已不可用。`:``}),F=(0,C.useCallback)(async e=>{if(_)try{return{owner:_.owner,...await m.file(_.owner,_.path,void 0,e)}}catch(e){throw e instanceof u&&e.code===`FILE_NOT_FOUND`?Error(`找不到这个文件,可能已被删除或移动。`):e}},[_?.owner,_?.path,j]),I=n(F),L=I.data?.owner===_?.owner&&I.data?.file.path===_?.path?I.data:void 0;function R(e,t){let n=t.split(`/`).filter(Boolean);O(t=>{let r=new Set(t);for(let t=0;t<=n.length;t++)r.add(b(e,n.slice(0,t).join(`/`)));return r})}function z(e,t){P(``),R(e,t.split(`/`).slice(0,-1).join(`/`)),S({owner:e,path:t}),A({owner:e,path:t,kind:`file`}),history.replaceState(null,``,c(v(h,e,t)))}function B(t){if(!_)return!1;let n=y(_.owner===`_project`?_.path:`${_.owner}/${_.path}`,t);if(!n)return!/^[a-z][a-z0-9+.-]*:/i.test(t)&&!t.startsWith(`//`)&&(P(`该链接超出工作区,请在原仓库查看。`),!0);if(s(n.path))return P(`配置文件不在文件浏览中显示。`),!0;let[r,...i]=n.path.split(`/`),a=e.some(e=>e.id===r),o=a?r:f,c=a?i.join(`/`):n.path;return P(``),n.directory?(R(o,c),A({owner:o,path:c,kind:`directory`})):o===_.owner&&c===_.path?n.anchor&&[...document.querySelectorAll(`.markdown h1,.markdown h2,.markdown h3,.markdown h4`)].find(e=>e.textContent?.trim().toLowerCase().replace(/\s+/g,`-`)===n.anchor.toLowerCase())?.scrollIntoView({block:`center`}):z(o,c),!0}return(0,w.jsxs)(`div`,{className:`split-layout file-explorer`,"data-testid":`file-browser`,children:[(0,w.jsxs)(`aside`,{className:`file-tree-pane`,"aria-label":`文件资源管理器`,children:[(0,w.jsx)(d,{title:`工作区`,icon:`files`,children:(0,w.jsx)(g,{icon:`refresh`,label:`刷新文件`,"data-testid":`files-refresh`,onClick:()=>{P(``),M(e=>e+1),a()}})}),(0,w.jsx)(x,{members:e,expanded:E,selected:k,revealed:!I.loading&&!I.error&&L?{owner:L.owner,path:L.file.path,file:L.file}:void 0,onSelect:z,onToggle:(e,t)=>{A({owner:e,path:t,kind:`directory`}),O(n=>{let r=new Set(n),i=b(e,t);return r.has(i)?r.delete(i):r.add(i),r})}},j)]}),(0,w.jsx)(`section`,{className:`file-detail`,"data-testid":`file-preview`,"data-owner-id":_?.owner,"data-file-path":_?.path,"aria-label":r.filePreview,children:_?(0,w.jsxs)(w.Fragment,{children:[(0,w.jsx)(o,{error:!0,children:N||!I.loading&&I.error}),I.error&&(0,w.jsx)(`button`,{className:`file-entry-retry`,"data-testid":`files-retry`,onClick:()=>void I.reload(),children:r.retry}),I.loading?(0,w.jsx)(`p`,{className:`preview-body`,role:`status`,children:r.loading}):!I.error&&L&&(0,w.jsx)(D,{owner:L.owner,file:L.file,onLink:B},`${L.owner}:${L.file.path}:${L.file.sha256}`)]}):N?(0,w.jsx)(o,{error:!0,children:N}):(0,w.jsx)(l,{mascot:!0,title:`查看工作区文件`,description:r.pickFile})})]})}function D({owner:e,file:t,onLink:i}){let{readTextBlob:s,blobUrl:c,projectId:l}=p(),[u,d]=(0,C.useState)(!1),f=t.size>524288,v=/\.(md|markdown)$/i.test(t.path),y=/\.html?$/i.test(t.path),b=(0,C.useCallback)(e=>f?Promise.resolve(void 0):s(t,e),[t.sha256,t.size,f]),x=n(b,!1,a(l,`file-body`,t.sha256));return(0,w.jsxs)(w.Fragment,{children:[(0,w.jsxs)(`header`,{className:`file-detail-header`,children:[(0,w.jsxs)(`span`,{className:`file-detail-path`,title:`${e===`_project`?`workspaces`:e}/${t.path}`,children:[(0,w.jsxs)(`span`,{children:[e===`_project`?`workspaces`:e,` / `]}),t.path]}),(0,w.jsxs)(h,{label:`文件操作`,children:[(v||y)&&(0,w.jsx)(g,{icon:u?`preview`:`code`,label:u?`切换为预览`:`切换为原文`,"data-testid":`file-toggle-raw`,"aria-pressed":u,onClick:()=>d(!u)}),(0,w.jsx)(`a`,{className:`icon-button`,"data-testid":`file-download`,"aria-label":r.download,title:r.download,href:c(t.sha256),download:t.path.split(`/`).at(-1),children:(0,w.jsx)(m,{name:`download`})})]})]}),f?(0,w.jsx)(`div`,{className:`empty`,children:(0,w.jsx)(`p`,{children:r.previewLarge})}):x.error?(0,w.jsxs)(`div`,{className:`preview-body`,children:[(0,w.jsx)(o,{error:!0,children:x.error}),(0,w.jsx)(`button`,{"data-testid":`file-preview-retry`,onClick:()=>void x.reload(),children:r.retry})]}):x.loading?(0,w.jsx)(`p`,{className:`preview-body`,role:`status`,children:r.loading}):(0,w.jsx)(`div`,{className:`preview-body${y&&!u?` preview-body-html`:``}`,children:y&&!u?(0,w.jsx)(S,{url:c(t.sha256),name:t.path.split(`/`).at(-1)}):v&&!u?(0,w.jsx)(`article`,{className:`markdown`,"data-testid":`file-content`,"data-format":`markdown`,children:(0,w.jsx)(_,{onLink:i,children:x.data??``})}):(0,w.jsx)(`pre`,{className:`raw`,"data-testid":`file-content`,"data-format":`text`,children:x.data})})]})}export{E as Files};
@@ -1,6 +0,0 @@
1
- import{$ as e,A as t,D as n,H as r,J as i,K as a,M as o,N as s,O as c,Q as l,R as u,S as d,U as f,V as p,X as m,Z as h,_ as g,d as _,et as v,g as y,l as b,q as x,u as S,v as C,x as w,y as T,z as E}from"./index-RLdREQwh.js";import{n as D,r as O,t as k}from"./Markdown-CL1rUtDC.js";import{i as A,r as ee}from"./WorkspaceTree-Dd_I-GBi.js";import{t as j}from"./HtmlPreview-DVdKncKP.js";function M(e){return l(p,e)}var N=e(),P=i().regex(/^R\d{6,}$/),F=x({name:i().min(1),sha256:u,size:a().int().nonnegative()}),I=m().refine(e=>/^https?:\/\//i.test(e),`Use an HTTP or HTTPS URL.`);x({operationId:h(),title:i().trim().default(``),text:i().optional(),url:I.optional(),originals:f(F).default([])}).strict().refine(e=>!!e.text?.trim()||!!e.url||e.originals.length>0,`Provide text, a link or a file.`),x({expectedRevision:E,title:i().trim().min(1).optional(),url:I.nullable().optional(),content:i().optional(),summary:i().optional(),sourceVersion:i().optional(),contentDate:i().optional(),originals:f(F).optional()}).strict();var L=x({id:P,projectId:i(),title:i(),submittedBy:i(),createdAt:i(),revision:E,source:x({kind:r([`web`,`chat`,`group`]),url:i().nullable(),groupId:i().optional(),messageId:i().optional(),sourceVersion:i().optional(),contentDate:i().optional()}),originals:f(F),content:i().nullable(),summary:i().nullable(),state:r([`waiting`,`running`,`ready`,`failed`]),error:i().nullable(),url:i()}),R=x({materials:f(L),nextCursor:a().nullable()});x({query:i().trim().min(1),scope:r([`all`,`workspace`,`materials`]).default(`all`),materialId:P.optional(),originalHash:u.optional(),after:i().default(``),limit:M().int().min(1).max(200).default(30)}).strict();var z=x({items:f(x({key:i(),kind:r([`workspace`,`materials`]),title:i(),snippet:i(),url:i(),path:i()})),nextCursor:i().nullable()}),B=t();function te(e){let t=(e.content??``).trimStart().split(`
2
- `);return t[0]?.replace(/^#\s+/,``).trim()===e.title.trim()&&t[0].startsWith(`# `)&&t.shift(),t.join(`
3
- `).trimStart()}function V(){let e=new URLSearchParams(location.search),t=e.get(`id`);return t?{id:t,...e.get(`original`)?{original:e.get(`original`)}:{},...e.get(`revision`)?{revision:e.get(`revision`)}:{}}:void 0}function H(){let{request:e,projectId:t}=S(),[r,i]=(0,N.useState)(V),[a,s]=(0,N.useState)(r),[l,u]=(0,N.useState)(()=>new Set(r?[r.id]:[])),[f,p]=(0,N.useState)(!1),[m,h]=(0,N.useState)(``),[g,x]=(0,N.useState)(``),[w,E]=(0,N.useState)(``),[D,O]=(0,N.useState)([]),[j,M]=(0,N.useState)(),[P,F]=(0,N.useState)(!1),[I,z]=(0,N.useState)(``),H=(0,N.useRef)(null),U=(0,N.useCallback)(t=>e(`materials`,R,{signal:t}),[e]),W=n(U,5e3,c(t,`materials`)),G=(0,N.useCallback)(t=>r?e(`materials/${encodeURIComponent(r.id)}${r.revision?`?revision=${encodeURIComponent(r.revision)}`:``}`,L,{signal:t}):Promise.resolve(null),[e,r?.id,r?.revision]),K=n(G,5e3),q=K.data?.id===r?.id?K.data:null,J=[...new Map([...D,...W.data?.materials??[],...q?[q]:[]].map(e=>[e.id,e])).values()].sort((e,t)=>t.createdAt.localeCompare(e.createdAt)||t.id.localeCompare(e.id)),Y=j===void 0?W.data?.nextCursor:j;function X(e,n=``){i(e),s(e),x(``),E(n),p(!1),u(t=>new Set([...t,e.id])),history.replaceState(null,``,v(`/projects/${t}/materials?${new URLSearchParams({...e})}`))}(0,N.useEffect)(()=>{let e=()=>{let e=V();i(e),s(e),x(``),h(``),E(``),p(!1),e&&u(t=>new Set([...t,e.id]))};return window.addEventListener(`popstate`,e),()=>window.removeEventListener(`popstate`,e)},[]);async function ae(){if(Y&&!P){F(!0),z(``);try{let t=await e(`materials?before=${Y}`,R);O(e=>[...e,...t.materials]),M(t.nextCursor)}catch(e){z(o(e))}finally{F(!1)}}}let Z=J.find(e=>e.id===a?.id),Q=Z?.originals.find(e=>e.sha256===a?.original)?.name??Z?.title??`当前资料`;function $(){s(void 0),E(``),H.current?.focus()}return(0,B.jsxs)(`div`,{className:`split-layout file-explorer session-explorer`,"data-testid":`materials-page`,children:[(0,B.jsxs)(`aside`,{className:`file-tree-pane`,"aria-label":`资料目录`,children:[(0,B.jsx)(b,{title:`资料`,icon:`materials`,children:(0,B.jsx)(T,{icon:`plus`,label:`新增资料`,onClick:()=>{p(!0),z(``)}})}),(0,B.jsx)(d,{error:!0,children:W.error||I}),W.data?J.length===0?(0,B.jsx)(`p`,{className:`tree-status`,children:`暂无资料`}):(0,B.jsx)(`div`,{role:`tree`,"aria-label":`项目资料`,onKeyDown:ee,children:J.map(e=>(0,B.jsxs)(`div`,{role:`none`,children:[(0,B.jsxs)(_,{role:`treeitem`,"aria-level":1,"aria-expanded":l.has(e.id),"aria-selected":!f&&r?.id===e.id&&!r.original,className:`tree-item tree-folder`,style:{"--tree-level":1},"data-testid":`material-folder`,title:e.title,onClick:()=>{let t=l.has(e.id);X({id:e.id}),t&&u(t=>{let n=new Set(t);return n.delete(e.id),n})},leading:(0,B.jsx)(`span`,{className:`tree-chevron ${l.has(e.id)?`expanded`:``}`,children:(0,B.jsx)(C,{name:`chevron`,size:`small`})}),children:[(0,B.jsx)(C,{name:`files`}),(0,B.jsx)(`span`,{className:`tree-name`,children:e.title})]}),l.has(e.id)&&(0,B.jsx)(`div`,{role:`group`,children:[...e.originals].sort((e,t)=>A(e.name,t.name)).map((t,n)=>(0,B.jsxs)(_,{role:`treeitem`,"aria-level":2,"aria-selected":!f&&r?.id===e.id&&r.original===t.sha256,className:`tree-item`,style:{"--tree-level":2},"data-testid":`material-original`,title:t.name,onClick:()=>X({id:e.id,original:t.sha256,...e.id===r?.id&&r.revision?{revision:r.revision}:{}}),leading:(0,B.jsx)(`span`,{className:`tree-chevron`}),children:[(0,B.jsx)(C,{name:`file`}),(0,B.jsx)(`span`,{className:`tree-name`,children:t.name})]},`${t.sha256}:${n}`))})]},e.id))}):(0,B.jsx)(`p`,{className:`tree-status`,children:`加载中…`}),Y&&(0,B.jsx)(`button`,{className:`tree-action`,disabled:P,onClick:()=>void ae(),children:P?`加载中…`:`加载更多`})]}),(0,B.jsxs)(`section`,{className:`session-reader`,"aria-label":`资料内容与搜索`,children:[(0,B.jsx)(`div`,{className:`session-reader-content`,children:f?(0,B.jsx)(ie,{onCancel:()=>p(!1),onSaved:e=>{X({id:e}),W.reload()}}):g?(0,B.jsx)(ne,{query:g,scope:a,onSelect:e=>X(e,g)},`${g}/${a?.id}/${a?.original}`):r?(0,B.jsxs)(B.Fragment,{children:[(0,B.jsx)(d,{error:!0,children:K.error}),q?r.original?(0,B.jsx)(re,{material:q,hash:r.original,highlight:w},`${q.id}:${r.original}`):(0,B.jsxs)(`article`,{className:`material-body`,children:[(0,B.jsx)(`h1`,{children:q.title}),r.revision&&(0,B.jsx)(`button`,{className:`material-link`,onClick:()=>X({id:r.id}),children:`查看最新内容`}),!r.revision&&(q.state===`waiting`||q.state===`running`)?(0,B.jsx)(`p`,{className:`muted`,role:`status`,children:`正在整理…`}):null,(0,B.jsx)(d,{error:!0,children:q.error??``}),!r.revision&&q.state===`failed`&&(0,B.jsx)(`button`,{onClick:()=>void e(`materials/${r.id}/retry`,L,{method:`POST`}).then(()=>K.reload()).catch(e=>z(o(e))),children:`重试整理`}),q.content?(0,B.jsx)(`div`,{className:`markdown`,children:(0,B.jsx)(k,{highlight:w,children:te(q)})}):(0,B.jsx)(`p`,{className:`muted`,children:`正文尚未整理,可以先查看左侧原件。`})]}):(0,B.jsx)(`p`,{role:`status`,children:`加载中…`})]}):(0,B.jsx)(y,{mascot:!0,title:`选择资料开始阅读`,description:`也可以在下方搜索资料内容。`})}),!f&&(0,B.jsxs)(`form`,{className:`session-search-dock`,"data-testid":`material-search-form`,onSubmit:e=>{e.preventDefault(),x(m.trim()),E(``)},children:[a&&(0,B.jsxs)(`button`,{type:`button`,className:`search-scope-chip`,title:`清除搜索范围`,"aria-label":`清除范围:${Q}`,onClick:$,children:[(0,B.jsxs)(`span`,{className:`scope-label`,children:[`搜索:`,Q]}),(0,B.jsx)(`span`,{"aria-hidden":`true`,children:`×`})]}),(0,B.jsxs)(`div`,{className:`session-search-input-row`,children:[(0,B.jsx)(`input`,{ref:H,"aria-label":`搜索资料`,placeholder:`搜索资料内容`,value:m,onChange:e=>h(e.target.value),onKeyDown:e=>{e.key===`Backspace`&&!m&&a&&(e.preventDefault(),$())}}),(g||m||w)&&(0,B.jsx)(T,{icon:`close`,label:`清空搜索`,onClick:()=>{h(``),x(``),E(``),H.current?.focus()}}),(0,B.jsx)(T,{icon:`search`,type:`submit`,label:`搜索`,disabled:!m.trim()})]})]})]})]})}function ne({query:e,scope:t,onSelect:r}){let{request:i}=S(),[a,o]=(0,N.useState)(``),s=(0,N.useCallback)(n=>i(`resources/search?${new URLSearchParams({query:e,scope:`materials`,after:a,...t?{materialId:t.id}:{},...t?.original?{originalHash:t.original}:{}})}`,z,{signal:n}),[i,e,t?.id,t?.original,a]),c=n(s);return(0,B.jsxs)(`section`,{className:`session-results stack`,"aria-label":`搜索结果`,children:[(0,B.jsx)(d,{error:!0,children:c.error}),c.loading?(0,B.jsx)(`p`,{role:`status`,children:`正在搜索…`}):c.data?.items.length===0?(0,B.jsx)(`p`,{className:`empty`,children:`没有找到匹配的资料`}):c.data?.items.map(t=>(0,B.jsxs)(`button`,{className:`session-item`,"data-testid":`material-match`,onClick:()=>{let e=new URL(t.url,location.origin).searchParams;r({id:e.get(`id`),...e.get(`original`)?{original:e.get(`original`)}:{},...e.get(`revision`)?{revision:e.get(`revision`)}:{}})},children:[(0,B.jsx)(`strong`,{children:t.title.replace(/^R\d+ · /,``)}),(0,B.jsx)(`span`,{className:`session-excerpt`,children:(0,B.jsx)(D,{value:O(t.snippet,e),query:e})})]},t.key)),c.data?.nextCursor&&(0,B.jsx)(`button`,{disabled:c.loading,onClick:()=>o(c.data.nextCursor),children:`下一页`})]})}function re({material:e,hash:t,highlight:r}){let{projectId:i}=S(),a=e.originals.find(e=>e.sha256===t),o=v(`/api/v1/projects/${i}/materials/${e.id}/originals/${t}?revision=${e.revision}`),[s,l]=(0,N.useState)(!1),u=(0,N.useCallback)(async e=>{let t=await fetch(o,{signal:e});if(!t.ok)throw Error(`原件暂时无法读取。`);let n=await t.arrayBuffer();try{let e=new TextDecoder(`utf8`,{fatal:!0}).decode(n);return e.includes(`\0`)?null:e}catch{return null}},[o]),f=n(u,!1,c(i,`material-original`,t));if(!a)return(0,B.jsx)(d,{error:!0,children:`找不到此原件。`});let p=/\.(md|markdown)$/i.test(a.name),m=/\.html?$/i.test(a.name);return(0,B.jsxs)(B.Fragment,{children:[(0,B.jsxs)(`header`,{className:`file-detail-header`,children:[(0,B.jsx)(`span`,{className:`file-detail-path`,children:a.name}),(0,B.jsxs)(`div`,{className:`toolbar-actions`,children:[(p||m)&&(0,B.jsx)(T,{icon:s?`preview`:`code`,label:s?`切换为预览`:`切换为原文`,"aria-pressed":s,onClick:()=>l(!s)}),(0,B.jsx)(`a`,{className:`icon-button`,"aria-label":`下载原件`,title:`下载原件`,href:o,download:a.name,children:(0,B.jsx)(C,{name:`download`})})]})]}),(0,B.jsx)(d,{error:!0,children:f.error}),f.loading?(0,B.jsx)(`p`,{role:`status`,children:`加载中…`}):f.data===null?(0,B.jsx)(`p`,{className:`muted`,children:`此格式请下载后查看。`}):f.data!==void 0&&(0,B.jsx)(`div`,{className:`preview-body${m&&!s?` preview-body-html`:``}`,"data-testid":`material-original-content`,children:m&&!s?(0,B.jsx)(j,{url:o,name:a.name}):p&&!s?(0,B.jsx)(`article`,{className:`markdown`,children:(0,B.jsx)(k,{highlight:r,children:f.data})}):(0,B.jsx)(`pre`,{className:`raw`,children:(0,B.jsx)(D,{value:f.data,query:r})})})]})}function U(e){if(e.kind===`text`){try{if([`http:`,`https:`].includes(new URL(e.text.trim()).protocol))return`link`}catch{}return`text`}let{name:t,type:n}=e.file;return n.startsWith(`image/`)||/\.(png|jpe?g|gif|webp|svg|heic|avif)$/i.test(t)?`imageFile`:/\.(csv|tsv|xlsx?|ods)$/i.test(t)?`spreadsheetFile`:/\.(json|ya?ml|xml|html?|css|[cm]?[jt]sx?|py|go|rs|sh|sql)$/i.test(t)?`codeFile`:n.startsWith(`text/`)||/\.(pdf|docx?|odt|rtf|md|txt)$/i.test(t)?`file`:`attachment`}function W(e){try{return new URL(e.trim()).hostname}catch{return e.trim().split(`
4
- `)[0]?.slice(0,80)||`文本`}}function G(e){try{return new URL(e.trim()).href}catch{return e.trim().split(`
5
- `).slice(1).join(`
6
- `)}}function ie({onSaved:e,onCancel:t}){let{request:n,projectId:r}=S(),[i,a]=(0,N.useState)([]),[c,l]=(0,N.useState)(),[u,f]=(0,N.useState)(!1),[p,m]=(0,N.useState)(``),h=(0,N.useRef)(null),_=(0,N.useRef)(s()),y=(0,N.useRef)(new Map);function b(e){a(e),_.current=s(),m(``)}async function x(){f(!0),m(``);try{let t=[];for(let[e,n]of i.entries()){let i=y.current.get(n.id);if(!i){let t=n.kind===`file`?n.file.name:`${W(n.text)}.txt`,a=await fetch(v(`/api/v1/projects/${r}/materials/uploads`),{method:`POST`,headers:{"content-type":`application/octet-stream`,"x-teammy-web":`1`},body:n.kind===`file`?n.file:new Blob([n.text],{type:`text/plain`})}),o=await a.json();if(!a.ok)throw Error(o.error?.message??`第 ${e+1} 项上传失败。`);i={name:t,sha256:o.sha256,size:o.size},y.current.set(n.id,i)}t.push(i)}let a=i.length===1&&i[0]?.kind===`text`?i[0].text.trim():``,o;try{let e=new URL(a);[`http:`,`https:`].includes(e.protocol)&&(o=e.href)}catch{}e((await n(`materials`,L,{method:`POST`,body:{operationId:_.current,originals:t,...o?{url:o}:{}}})).id)}catch(e){m(o(e))}finally{f(!1)}}return(0,B.jsxs)(B.Fragment,{children:[(0,B.jsxs)(`form`,{className:`material-form`,onSubmit:e=>{e.preventDefault(),x()},children:[(0,B.jsx)(`h1`,{children:`新增资料`}),(0,B.jsx)(`p`,{className:`muted`,children:`上传附件到项目,以便于Tim进行理解`}),(0,B.jsx)(d,{error:!0,children:p}),(0,B.jsxs)(`fieldset`,{disabled:u,children:[(0,B.jsxs)(`div`,{className:`attachment-grid`,children:[i.map(e=>(0,B.jsxs)(`article`,{className:`attachment-card`,"data-testid":`attachment-card`,children:[e.kind===`text`?(0,B.jsxs)(`button`,{type:`button`,className:`attachment-content`,"aria-label":`编辑:${W(e.text)}`,onClick:()=>l({id:e.id,text:e.text}),children:[(0,B.jsx)(C,{name:U(e)}),(0,B.jsx)(`span`,{className:`attachment-name`,children:W(e.text)}),G(e.text)&&(0,B.jsx)(`span`,{className:`attachment-excerpt`,children:G(e.text)})]}):(0,B.jsxs)(`div`,{className:`attachment-content`,children:[(0,B.jsx)(C,{name:U(e)}),(0,B.jsx)(`span`,{className:`attachment-name`,children:e.file.name})]}),(0,B.jsx)(T,{className:`attachment-remove`,icon:`close`,label:`移除:${e.kind===`file`?e.file.name:W(e.text)}`,onClick:()=>{y.current.delete(e.id),b(i.filter(t=>t.id!==e.id))}})]},e.id)),(0,B.jsxs)(`button`,{type:`button`,className:`attachment-add`,onClick:()=>l({text:``}),children:[(0,B.jsx)(C,{name:`addText`}),(0,B.jsx)(`span`,{children:`添加文本/链接`})]}),(0,B.jsxs)(`button`,{type:`button`,className:`attachment-add`,onClick:()=>h.current?.click(),children:[(0,B.jsx)(C,{name:`addFile`}),(0,B.jsx)(`span`,{children:`添加文件`})]})]}),(0,B.jsx)(`input`,{ref:h,type:`file`,multiple:!0,hidden:!0,"aria-label":`原始文件`,onChange:e=>{b([...i,...[...e.target.files??[]].map(e=>({id:s(),kind:`file`,file:e}))]),e.target.value=``}}),(0,B.jsxs)(`div`,{className:`actions attachment-actions`,children:[(0,B.jsx)(`button`,{type:`button`,onClick:t,children:`取消`}),(0,B.jsx)(`button`,{type:`submit`,className:`primary`,disabled:!i.length,children:u?`上传中…`:`提交资料`})]})]})]}),c&&(0,B.jsx)(w,{id:`material-text-editor`,title:`添加文本/链接`,onClose:()=>l(void 0),children:(0,B.jsxs)(`form`,{className:`stack`,onSubmit:e=>{if(e.preventDefault(),!c.text.trim())return;let t={id:c.id??s(),kind:`text`,text:c.text};y.current.delete(t.id),b(c.id?i.map(e=>e.id===c.id?t:e):[...i,t]),l(void 0)},children:[(0,B.jsx)(g,{id:`material-attachment-text`,label:`文本或链接`,children:(0,B.jsx)(`textarea`,{autoFocus:!0,rows:8,value:c.text,onChange:e=>l({...c,text:e.target.value}),placeholder:`粘贴文本或网页链接`})}),(0,B.jsx)(`div`,{className:`actions`,children:(0,B.jsx)(`button`,{type:`submit`,className:`primary`,disabled:!c.text.trim(),children:c.id?`保存`:`添加`})})]})})]})}export{H as Materials};
@@ -1 +0,0 @@
1
- import{$ as e,A as t,B as n,D as r,E as i,F as a,G as o,H as s,I as c,J as l,K as u,M as d,O as f,P as p,R as m,S as h,T as g,U as _,W as v,Y as y,Z as b,d as x,et as S,g as C,j as w,l as T,q as E,u as D,v as O,y as k,z as A}from"./index-RLdREQwh.js";import{n as j,r as M,t as N}from"./Markdown-CL1rUtDC.js";import{n as P}from"./project-links-Dy6-B89_.js";import{i as F,r as I}from"./WorkspaceTree-Dd_I-GBi.js";var L=e(),R=s([`overview`,`handoff`]),z=E({title:l().trim().min(1),summary:l().trim().min(1)}).strict(),B=E({markdown:l().trim().min(1)}).strict(),V=z.extend({sourceRevision:A,sourceHash:m,generatedAt:l(),stale:v()}),H=E({kind:R,status:s([`absent`,`queued`,`running`,`succeeded`,`failed`]),available:v(),currentRevision:A,sourceRevision:A.nullable(),stale:v(),result:y([z,B]).nullable(),generatedAt:l().nullable(),error:l().nullable()}),U=s([`claude-code`,`codex`,`cursor`,`pi`,`dsh`]),W=E({formatVersion:o(1),adapterVersion:o(1),agent:U,nativeId:l().min(1).max(512),cwd:l().min(1).max(4096),messages:_(E({id:l().min(1).max(1024),role:s([`user`,`assistant`]),text:l().min(1),source:l().min(1).max(1024)}).strict())}).strict().refine(e=>new Set(e.messages.map(e=>e.id)).size===e.messages.length,`Duplicate message IDs.`);E({operationId:b(),sessionKey:m,parentRevision:A,blob:c}).strict(),E({revision:A,hash:m.nullable(),cleared:v()});var G=E({owner:n,sessionKey:m,agent:U,nativeId:l(),cwd:l(),title:l(),revision:A,updatedAt:l(),messageCount:u().int().nonnegative(),blob:c,overview:V.optional()}),K=E({sessions:_(G),nextCursor:A.nullable()}),q=E({totalSessions:u().int().nonnegative(),totalMessages:u().int().nonnegative(),memberCount:u().int().nonnegative(),updatedAt:l().nullable()});E({owner:n.optional(),sessionKey:m.optional()}).strict().refine(e=>!e.sessionKey||!!e.owner,`A session scope requires an owner.`);var J=E({matches:_(E({owner:n,sessionKey:m,revision:A,messageId:l(),source:s([`message`,`handoff`]).default(`message`),role:s([`user`,`assistant`]),snippet:l(),title:l()})),nextCursor:A.nullable()}),Y=E({owner:n,key:m,revision:A.refine(e=>e>0).optional(),messageId:l().min(1).optional(),source:s([`message`,`handoff`]).optional()});function X(e){let t=new URLSearchParams(e);if(![`owner`,`sessionKey`,`revision`,`messageId`].some(e=>t.has(e)))return{};let n=Y.safeParse({owner:t.get(`owner`),key:t.get(`sessionKey`),...t.has(`revision`)?{revision:Number(t.get(`revision`))}:{},...t.has(`messageId`)?{messageId:t.get(`messageId`)}:{},...t.has(`source`)?{source:t.get(`source`)}:{}});return n.success?{target:n.data}:{error:`对话链接不完整或已损坏。`}}var Z=t();function Q({members:e,refresh:t,selected:n,onOwner:r,onSession:i}){let[a,o]=(0,L.useState)(()=>new Set(n?.key?[n.owner]:[])),[s,c]=(0,L.useState)(e[0]?.id??``);return(0,Z.jsx)(`div`,{role:`tree`,"aria-label":`成员对话`,"data-testid":`session-tree`,onKeyDown:I,children:[...e].sort((e,t)=>F(e.id,t.id)).map(e=>(0,Z.jsxs)(`div`,{role:`none`,children:[(0,Z.jsxs)(x,{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,Z.jsx)(`span`,{className:`tree-chevron ${a.has(e.id)?`expanded`:``}`,children:(0,Z.jsx)(O,{name:`chevron`,size:`small`})}),children:[(0,Z.jsx)(O,{name:`files`}),(0,Z.jsx)(`span`,{className:`tree-name`,title:e.id,children:e.id})]}),a.has(e.id)&&(0,Z.jsx)($,{owner:e.id,selected:n,onSession:i,focused:s,onFocus:c},`${e.id}/${t}`)]},e.id))})}function $({owner:e,selected:t,onSession:n,focused:i,onFocus:a}){let{request:o,projectId:s}=D(),c=(0,L.useCallback)(t=>o(`sessions?${new URLSearchParams({owner:e,limit:`50`,order:`updated`})}`,K,{signal:t}),[e,o]),l=r(c,15e3,f(s,`session-tree`,e)),[u,m]=(0,L.useState)(),[g,_]=(0,L.useState)(!1),[v,y]=(0,L.useState)(``),b=(0,L.useRef)(null);(0,L.useEffect)(()=>()=>b.current?.abort(),[]);let S=u?u.nextCursor:l.data?.nextCursor;return(0,Z.jsxs)(`div`,{role:`group`,"aria-busy":l.loading||g,children:[(0,Z.jsx)(h,{error:!0,children:l.error||v}),l.error&&(0,Z.jsx)(`button`,{onClick:()=>void l.reload(),children:`重试`}),l.loading&&!l.data&&(0,Z.jsx)(`span`,{className:`tree-status`,role:`status`,children:`正在加载…`}),[...new Map([...u?.sessions??[],...l.data?.sessions??[]].map(e=>[e.sessionKey,e])).values()].sort((e,t)=>t.updatedAt.localeCompare(e.updatedAt)||e.sessionKey.localeCompare(t.sessionKey)).map(r=>(0,Z.jsxs)(x,{type:`button`,role:`treeitem`,"aria-level":2,"aria-selected":t?.owner===e&&t.key===r.sessionKey,className:`tree-item`,style:{"--tree-level":2},tabIndex:i===`${e}/${r.sessionKey}`?0:-1,"data-testid":`session-row`,"data-owner-id":e,"data-session-key":r.sessionKey,title:p(r.title||r.nativeId),onFocus:()=>a(`${e}/${r.sessionKey}`),onClick:()=>n({owner:e,key:r.sessionKey,title:r.title||r.nativeId}),leading:(0,Z.jsx)(`span`,{className:`tree-chevron`}),children:[(0,Z.jsx)(O,{name:`sessions`}),(0,Z.jsx)(`span`,{className:`tree-name`,children:p(r.title||r.nativeId)})]},r.sessionKey)),S!=null&&(0,Z.jsx)(`button`,{className:`tree-action`,"data-testid":`session-tree-more`,disabled:g,onClick:async()=>{_(!0),y(``);let t=new AbortController;b.current=t;try{let n=await o(`sessions?${new URLSearchParams({owner:e,after:String(S),limit:`50`,order:`updated`})}`,K,{signal:t.signal});m(e=>({sessions:[...e?.sessions??[],...n.sessions],nextCursor:n.nextCursor}))}catch(e){t.signal.aborted||y(d(e))}finally{t.signal.aborted||_(!1)}},children:`加载更多`})]})}function ee({info:e,targeted:t=!1,highlight:n=``}){let[r,i]=(0,L.useState)(t),a=(0,L.useRef)(null);return(0,L.useEffect)(()=>{t&&a.current?.scrollIntoView({block:`center`})},[t]),(0,Z.jsxs)(`details`,{ref:a,open:r,className:`session-handoff`,onToggle:e=>i(e.currentTarget.open),children:[(0,Z.jsx)(`summary`,{children:`交接说明`}),r&&(0,Z.jsx)(te,{info:e,revision:t?e.revision:void 0,highlight:n})]})}function te({info:e,revision:t,highlight:n}){let{request:a}=D(),o=`sessions/${encodeURIComponent(e.owner)}/${e.sessionKey}`,s=(0,L.useCallback)(e=>a(`${o}/analysis/handoff${t===void 0?``:`?revision=${t}`}`,H,{signal:e}),[a,o,t]),c=r(s,5e3),l=i(),[u,f]=(0,L.useState)(!1),[p,m]=(0,L.useState)(``),_=c.data,v=u||_?.status===`queued`||_?.status===`running`,y=_?.result&&`markdown`in _.result?_.result.markdown:void 0;return(0,Z.jsxs)(`div`,{className:`stack`,"data-testid":`session-handoff`,children:[(0,Z.jsx)(h,{error:!0,children:p||c.error}),c.loading&&!_&&(0,Z.jsx)(`small`,{role:`status`,children:`正在加载…`}),_&&(0,Z.jsxs)(`div`,{className:`inline-actions`,children:[_.status===`failed`&&t===void 0&&(0,Z.jsx)(`button`,{"data-testid":`session-handoff-generate`,disabled:v||!_.available,onClick:async()=>{f(!0),m(``);try{await a(`${o}/handoff`,H,{method:`POST`,signal:l}),await c.reload()}catch(e){l.aborted||m(d(e))}finally{l.aborted||f(!1)}},children:v?`正在整理…`:`重试`}),!_.available&&(0,Z.jsx)(`small`,{children:`请先配置项目模型接入点`}),_.status===`failed`&&(0,Z.jsx)(`small`,{children:`整理未完成,可重试`}),_.available&&_.status!==`failed`&&(!y||_.stale||v)&&(0,Z.jsx)(`small`,{role:`status`,children:_.status===`running`||u?`正在整理…`:y?`对话已有新内容,等待自动更新…`:`等待自动整理…`}),_.currentRevision!==e.revision&&(0,Z.jsx)(`small`,{children:`交接说明使用最新对话;当前阅读的是历史原文`})]}),y&&(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsxs)(`small`,{children:[`基于版本 `,_.sourceRevision,` · `,(0,Z.jsx)(g,{value:_.generatedAt})]}),(0,Z.jsx)(`div`,{className:`markdown`,"data-testid":`session-handoff-body`,children:(0,Z.jsx)(N,{highlight:n,children:y})})]})]})}function ne({members:e}){let{request:t,projectId:n,api:i}=D(),o=(0,L.useCallback)(async e=>{let[n,r]=await Promise.all([t(`sessions/stats`,q,{signal:e}),i.members(e)]);return{...n,members:r.members}},[t,i]),s=r(o,!0,f(n,`session-stats`)),[c,l]=(0,L.useState)(``),[u,d]=(0,L.useState)(``),[m,g]=(0,L.useState)(0),[_]=(0,L.useState)(()=>X(location.search)),[v,y]=(0,L.useState)(_.target),[b,x]=(0,L.useState)(_.target),[w,E]=(0,L.useState)(_.error??``),[O,A]=(0,L.useState)(``),j=(0,L.useRef)(null),M=v?.key?v.title?`搜索对话:${p(v.title)}`:`搜索当前对话`:v?`搜索:${v.owner} 的对话内容`:``,N=()=>{y(void 0),A(``),F(),j.current?.focus()};function F(){if(!b?.messageId)return;let{messageId:e,...t}=b;x(t),history.replaceState(null,``,S(P(n,t.owner,t.key,t)))}let I=(0,L.useCallback)(e=>{y(t=>t?.owner===e.owner&&t.key===e.sessionKey&&t.title!==e.title?{...t,title:e.title}:t)},[]);(0,L.useEffect)(()=>{let e=()=>{let e=X(location.search);x(e.target),y(e.target),E(e.error??``),d(``),l(``),A(``)};return window.addEventListener(`popstate`,e),()=>window.removeEventListener(`popstate`,e)},[]);let R=(e,t=``)=>{x(e),y(e),d(``),A(t),E(``),history.replaceState(null,``,S(P(n,e.owner,e.key,e)))};return(0,Z.jsxs)(`div`,{className:`split-layout file-explorer session-explorer`,children:[(0,Z.jsxs)(`section`,{className:`file-tree-pane`,"aria-label":`${a.sessions}目录`,children:[(0,Z.jsx)(T,{title:a.sessions,icon:`sessions`,count:(0,Z.jsx)(`span`,{"data-testid":`session-total`,children:s.data?.totalSessions??`—`}),children:(0,Z.jsx)(k,{icon:`refresh`,label:`刷新${a.sessions}`,"data-testid":`sessions-refresh`,disabled:s.loading,onClick:()=>{s.reload(),g(e=>e+1)}})}),(0,Z.jsx)(h,{error:!0,children:s.error}),(0,Z.jsx)(Q,{members:(s.data?.members??e).filter(e=>e.hasSessions),refresh:m,selected:v,onOwner:e=>{y({owner:e}),x(void 0),d(``),A(``),E(``),history.replaceState(null,``,S(`/projects/${encodeURIComponent(n)}/sessions`))},onSession:R})]}),(0,Z.jsxs)(`section`,{className:`session-reader`,"aria-label":`对话内容与搜索`,children:[(0,Z.jsx)(`div`,{className:`session-reader-content`,children:w?(0,Z.jsx)(h,{error:!0,children:w}):u?(0,Z.jsx)(re,{query:u,refresh:m,scope:{...v?{owner:v.owner}:{},...v?.key?{sessionKey:v.key}:{}},onSelect:e=>R(e,u)},`${u}/${v?.owner??``}/${v?.key??``}`):b?(0,Z.jsx)(ie,{selection:b,highlight:O,onLoaded:I,onLatest:()=>R({owner:b.owner,key:b.key})},`${b.owner}/${b.key}/${b.revision}/${b.source}/${m}`):(0,Z.jsx)(C,{mascot:!0,title:`选择对话开始阅读`,description:`也可以在下方搜索会话库内容。`})}),(0,Z.jsxs)(`form`,{className:`session-search-dock`,"data-testid":`session-search-form`,onSubmit:e=>{e.preventDefault(),d(c.trim()),A(``),E(``),g(e=>e+1)},children:[v&&(0,Z.jsxs)(`button`,{type:`button`,className:`search-scope-chip`,"data-testid":`session-search-scope`,title:`清除搜索范围`,"aria-label":`清除范围:${M}`,onClick:N,children:[(0,Z.jsx)(`span`,{className:`scope-label`,children:M}),(0,Z.jsx)(`span`,{"aria-hidden":`true`,children:`×`})]}),(0,Z.jsxs)(`div`,{className:`session-search-input-row`,children:[(0,Z.jsx)(`input`,{ref:j,"aria-label":`搜索对话`,"data-testid":`session-query`,value:c,maxLength:500,placeholder:`搜索会话库内容`,onChange:e=>l(e.target.value),onKeyDown:e=>{e.key===`Backspace`&&!c&&v&&(e.preventDefault(),N())}}),(u||c||O)&&(0,Z.jsx)(k,{icon:`close`,label:`清空搜索`,"data-testid":`session-search-clear`,onClick:()=>{l(``),d(``),A(``),F(),j.current?.focus()}}),(0,Z.jsx)(k,{icon:`search`,type:`submit`,label:`搜索`,"data-testid":`session-search`,disabled:!c.trim()})]})]})]})]})}function re({query:e,refresh:t,scope:n,onSelect:i}){let{request:a}=D(),[o,s]=(0,L.useState)(0),c=(0,L.useCallback)(t=>a(`sessions/search?${new URLSearchParams({q:e,after:String(o),limit:`30`,order:`updated`,...n.owner?{owner:n.owner}:{},...n.sessionKey?{sessionKey:n.sessionKey}:{}})}`,J,{signal:t}),[a,e,o,t,n.owner,n.sessionKey]),l=r(c);return(0,Z.jsxs)(`section`,{className:`session-results stack`,"aria-label":`搜索结果`,"aria-busy":l.loading,children:[(0,Z.jsx)(h,{error:!0,children:l.error}),l.error&&(0,Z.jsx)(`button`,{onClick:()=>void l.reload(),children:`重试`}),l.loading&&(0,Z.jsx)(`p`,{role:`status`,children:`正在搜索…`}),!l.loading&&l.data?.matches.map(t=>(0,Z.jsxs)(`button`,{className:`session-item`,"data-testid":`session-match`,"data-message-id":t.messageId,onClick:()=>i({owner:t.owner,key:t.sessionKey,revision:t.revision,messageId:t.messageId||void 0,source:t.source,title:t.title}),children:[(0,Z.jsx)(`strong`,{children:p(t.title)}),(0,Z.jsxs)(`small`,{children:[t.owner,` ·`,` `,t.source===`handoff`?`交接说明`:t.role===`user`?`用户`:`助手`]}),(0,Z.jsx)(`span`,{className:`session-excerpt`,children:(0,Z.jsx)(j,{value:M(t.snippet,e),query:e})})]},`${t.owner}:${t.sessionKey}:${t.revision}:${t.source}:${t.messageId}`)),!l.loading&&l.data?.matches.length===0&&(0,Z.jsx)(`p`,{className:`empty`,children:`没有找到匹配的对话`}),l.data?.nextCursor!=null&&(0,Z.jsx)(`button`,{"data-testid":`sessions-next`,disabled:l.loading,onClick:()=>s(l.data.nextCursor),children:`下一页`}),o>0&&(0,Z.jsx)(`button`,{disabled:l.loading,onClick:()=>s(0),children:`返回第一页`})]})}function ie({selection:e,highlight:t,onLoaded:n,onLatest:i}){let{request:a}=D(),o=(0,L.useCallback)(async t=>{try{return await a(`sessions/${encodeURIComponent(e.owner)}/${e.key}${e.revision===void 0?``:`?revision=${e.revision}`}`,G,{signal:t})}catch(e){throw e instanceof w&&e.code===`SESSION_NOT_FOUND`?Error(`找不到这条对话或引用的版本,原链接可能已失效。`):e}},[a,e.owner,e.key,e.revision]),s=r(o,5e3);return(0,L.useEffect)(()=>{s.data&&n(s.data)},[s.data,n]),(0,Z.jsxs)(`section`,{className:`session-conversation stack`,"data-testid":`session-detail`,children:[(0,Z.jsx)(h,{error:!0,children:s.error}),s.error&&(0,Z.jsx)(`button`,{onClick:()=>void s.reload(),children:`重试`}),s.loading&&!s.data&&(0,Z.jsx)(`p`,{role:`status`,children:`正在读取对话…`}),s.data&&(0,Z.jsx)(ae,{info:s.data,messageId:e.messageId,handoff:e.source===`handoff`,highlight:t,pinned:e.revision!==void 0,onLatest:i},s.data.blob.sha256)]})}function ae({info:e,messageId:t,handoff:n,highlight:i,pinned:a,onLatest:o}){let{readTextBlob:s,projectId:c}=D(),l=(0,L.useCallback)(async t=>W.parse(JSON.parse(await s(e.blob,t))),[e.blob.sha256,e.blob.size]),u=r(l),d=(0,L.useRef)(null);return(0,L.useEffect)(()=>{u.data&&t&&d.current?.scrollIntoView({block:`center`})},[u.data,t]),(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsxs)(`header`,{className:`conversation-header`,children:[(0,Z.jsx)(`h2`,{className:`session-title`,children:p(e.title||e.nativeId)}),(0,Z.jsxs)(`p`,{children:[e.owner,` · `,e.agent,` · `,e.messageCount,` 条消息`]}),(0,Z.jsxs)(`small`,{children:[(0,Z.jsx)(g,{value:e.updatedAt}),a&&(0,Z.jsxs)(Z.Fragment,{children:[` `,`· 引用版本 `,e.revision,` ·`,` `,(0,Z.jsx)(`a`,{href:S(P(c,e.owner,e.sessionKey)),onClick:e=>{e.preventDefault(),o()},children:`查看最新`})]})]}),e.overview&&(0,Z.jsx)(`p`,{"data-testid":`session-summary`,children:e.overview.summary}),e.overview?.stale&&(0,Z.jsx)(`small`,{children:`摘要待更新`})]}),(0,Z.jsx)(ee,{info:e,targeted:n,highlight:n?i:``}),(0,Z.jsx)(h,{error:!0,children:u.error}),u.error&&(0,Z.jsx)(`button`,{onClick:()=>void u.reload(),children:`重新读取`}),u.loading&&(0,Z.jsx)(`p`,{role:`status`,children:`正在读取对话…`}),u.data&&(0,Z.jsxs)(Z.Fragment,{children:[t&&!u.data.messages.some(e=>e.id===t)&&(0,Z.jsx)(h,{children:`该版本中找不到引用的消息,已打开对话原文。`}),(0,Z.jsx)(`div`,{className:`session-messages`,children:u.data.messages.map(e=>(0,Z.jsxs)(`article`,{className:`session-message ${e.role} ${e.id===t?`matched`:``}`,"data-testid":`session-message`,"data-message-id":e.id,ref:e.id===t?d:void 0,children:[(0,Z.jsx)(`div`,{className:`message-role`,children:e.role===`user`?`用户`:`助手`}),(0,Z.jsx)(`div`,{className:`markdown`,children:(0,Z.jsx)(N,{highlight:i,children:e.text})})]},e.id))})]})]})}export{ne as Sessions};
@@ -1 +0,0 @@
1
- import{$ as e,A as t,D as n,M as r,O as i,S as a,c as o,d as s,s as c,u as l,v as u}from"./index-RLdREQwh.js";var d=e(),f=new Intl.Collator(`zh-CN`,{numeric:!0,sensitivity:`base`});function p(e,t){return f.compare(e,t)||(e<t?-1:+(e>t))}var m=t();function h(e){let t=e.target.closest(`[role="treeitem"]`);if(!t)return;let n=[...e.currentTarget.querySelectorAll(`[role="treeitem"]`)],r=n.indexOf(t),i=Number(t.getAttribute(`aria-level`)),a;switch(e.key){case`ArrowDown`:a=n[r+1];break;case`ArrowUp`:a=n[r-1];break;case`Home`:a=n[0];break;case`End`:a=n.at(-1);break;case`ArrowRight`:t.getAttribute(`aria-expanded`)===`false`?t.click():Number(n[r+1]?.getAttribute(`aria-level`))>i&&(a=n[r+1]);break;case`ArrowLeft`:t.getAttribute(`aria-expanded`)===`true`?t.click():a=n.slice(0,r).reverse().find(e=>Number(e.getAttribute(`aria-level`))<i);break;default:return}e.preventDefault(),a?.focus()}var g=(e,t)=>`${e}/${t}`,_=e=>({"--tree-level":e});function v({members:e,...t}){let[n,r]=(0,d.useState)(`folder:${g(e[0]?.id??``,``)}`);return(0,m.jsx)(`div`,{role:`tree`,"aria-label":`工作区文件`,"data-testid":`workspace-tree`,onKeyDown:h,children:(0,m.jsx)(b,{owner:c,path:``,level:1,members:e.filter(e=>e.hasFiles),context:{...t,focused:n,onFocus:r}})})}function y({owner:e,path:t,level:n,context:r}){let i=r.expanded.has(g(e,t)),a=`folder:${g(e,t)}`;return(0,m.jsxs)(`div`,{role:`none`,children:[(0,m.jsxs)(s,{type:`button`,role:`treeitem`,className:`tree-item tree-folder`,style:_(n),"aria-label":t||e,"aria-level":n,"aria-expanded":i,"aria-selected":r.selected?.kind===`directory`&&r.selected.owner===e&&r.selected.path===t,tabIndex:r.focused===a?0:-1,"data-testid":`directory-row`,"data-owner-id":e,"data-directory-path":t,onFocus:()=>r.onFocus(a),onClick:()=>r.onToggle(e,t),leading:(0,m.jsx)(`span`,{className:`tree-chevron ${i?`expanded`:``}`,children:(0,m.jsx)(u,{name:`chevron`,size:`small`})}),children:[(0,m.jsx)(u,{name:`files`}),(0,m.jsx)(`span`,{className:`tree-name`,children:t.split(`/`).at(-1)||e})]}),i&&(0,m.jsx)(b,{owner:e,path:t,level:n+1,context:r})]})}function b({owner:e,path:t,level:c,context:f,members:h=[]}){let{api:v,projectId:b}=l(),x=(0,d.useCallback)(n=>v.tree(e,t,void 0,``,n),[e,t]),S=n(x,!1,i(b,`file-tree`,e,t)),[C,w]=(0,d.useState)(),[T,E]=(0,d.useState)(!1),[D,O]=(0,d.useState)(``),k=(0,d.useRef)(null);(0,d.useEffect)(()=>()=>k.current?.abort(),[]);let A=C?.revision===S.data?.revision?C:void 0,j=A?A.nextCursor:S.data?.nextCursor;async function M(){if(!j||!S.data||T)return;E(!0),O(``);let n=new AbortController;k.current=n;try{let r=await v.tree(e,t,S.data.revision,j,n.signal);n.signal.aborted||w({...r,entries:[...A?.entries??[],...r.entries]})}catch(e){n.signal.aborted||O(r(e))}finally{n.signal.aborted||E(!1)}}let N=[...(S.data?.entries??[]).filter(e=>!o(e.path)),...(A?.entries??[]).filter(e=>!o(e.path))],P=f.revealed;if(P?.owner===e&&!o(P.path)&&(!t||P.path.startsWith(t+`/`))){let e=t?P.path.slice(t.length+1):P.path,n=e.indexOf(`/`),r=n<0?P.path:[t,e.slice(0,n)].filter(Boolean).join(`/`);N.some(e=>e.path===r)||N.push(n<0?{...P.file,kind:`file`}:{kind:`directory`,path:r})}let F=[...N.map(t=>({...t,owner:e})),...h.map(e=>({kind:`directory`,path:``,owner:e.id}))].sort((e,t)=>e.kind===t.kind?p(e.path.split(`/`).at(-1)||e.owner,t.path.split(`/`).at(-1)||t.owner):e.kind===`directory`?-1:1);return(0,m.jsxs)(`div`,{role:`group`,"aria-label":g(e===`_project`?`workspaces`:e,t),"aria-busy":S.loading||T,children:[S.loading&&(0,m.jsx)(`p`,{className:`tree-status`,role:`status`,children:`正在加载…`}),(0,m.jsx)(a,{error:!0,children:S.error||D}),S.error&&(0,m.jsx)(`button`,{className:`tree-action`,onClick:()=>void S.reload(),children:`重试`}),F.map(t=>t.kind===`directory`?(0,m.jsx)(y,{owner:t.owner,path:t.path,level:c,context:f},g(t.owner,t.path)):(0,m.jsxs)(s,{type:`button`,role:`treeitem`,className:`tree-item`,style:_(c),"aria-label":t.path,"aria-level":c,"aria-selected":f.selected?.kind===`file`&&f.selected.owner===e&&f.selected.path===t.path,tabIndex:f.focused===`file:${g(e,t.path)}`?0:-1,"data-testid":`file-row`,"data-owner-id":e,"data-file-path":t.path,onFocus:()=>f.onFocus(`file:${g(e,t.path)}`),onClick:()=>f.onSelect(e,t.path),leading:(0,m.jsx)(`span`,{className:`tree-chevron`}),children:[(0,m.jsx)(u,{name:`file`}),(0,m.jsx)(`span`,{className:`tree-name`,children:t.path.split(`/`).at(-1)})]},t.path)),j&&(0,m.jsx)(`button`,{className:`tree-action`,"data-testid":`files-load-more`,disabled:T,onClick:()=>void M(),children:T?`正在加载…`:`加载更多`})]})}export{p as i,g as n,h as r,v as t};