@teammy/server 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/main.js +346 -66
- package/dist/web/assets/Assistant-C6pKB7Ad.js +1 -0
- package/dist/web/assets/Assistant-CpCuE2gu.css +1 -0
- package/dist/web/assets/Dashboard-9YigAZz5.js +1 -0
- package/dist/web/assets/Dashboard-BOW5jKmH.css +1 -0
- package/dist/web/assets/Files-DV2qyyA7.js +1 -0
- package/dist/web/assets/{Markdown-D-FafgUB.js → Markdown-B3gyVKQQ.js} +4 -4
- package/dist/web/assets/Sessions-paWfamTw.js +1 -0
- package/dist/web/assets/WorkspaceTree-1wC3k-B-.js +1 -0
- package/dist/web/assets/{file-links-DTDtI322.js → file-links-BV_YvnFy.js} +1 -1
- package/dist/web/assets/index-COCTfq_q.js +12 -0
- package/dist/web/assets/{project-context-ClIYZ2Zu.js → project-context--9YVXMif.js} +1 -1
- package/dist/web/index.html +2 -2
- package/package.json +1 -1
- package/dist/web/assets/Assistant-B712NOqs.js +0 -1
- package/dist/web/assets/Assistant-DULVRmR1.css +0 -1
- package/dist/web/assets/Dashboard-BMek5kfz.js +0 -1
- package/dist/web/assets/Dashboard-C7EDndZA.css +0 -1
- package/dist/web/assets/Files-BQ1LdKKa.js +0 -1
- package/dist/web/assets/Sessions-11r38zLA.js +0 -1
- package/dist/web/assets/WorkspaceTree-C406dC60.js +0 -1
- package/dist/web/assets/index-B02ttZKr.js +0 -12
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{$ as e,D as t,M as n,Q as r,S as i,T as a,X as o,Y as s,at as c,b as l,c as u,ct as d,d as f,et as p,it as m,j as h,lt as g,m as _,ot as v,q as y,r as b,rt as x,st as S,tt as C,u as w,ut as T,v as E,w as D,y as O}from"./project-context--9YVXMif.js";import{c as k,l as A}from"./index-COCTfq_q.js";import{n as j,r as M,t as N}from"./Markdown-B3gyVKQQ.js";import{n as P}from"./project-links-XbF78Bal.js";import{i as F,r as I}from"./WorkspaceTree-1wC3k-B-.js";var L=g(),R=e([`overview`,`handoff`]),z=c({title:v().trim().min(1),summary:v().trim().min(1)}).strict(),B=c({markdown:v().trim().min(1)}).strict(),V=z.extend({sourceRevision:o,sourceHash:s,generatedAt:v(),stale:C()}),H=c({kind:R,status:e([`absent`,`queued`,`running`,`succeeded`,`failed`]),available:C(),currentRevision:o,sourceRevision:o.nullable(),stale:C(),result:S([z,B]).nullable(),generatedAt:v().nullable(),error:v().nullable()}),U=e([`claude-code`,`codex`,`cursor`,`pi`,`dsh`]),W=c({formatVersion:x(1),adapterVersion:x(1),agent:U,nativeId:v().min(1).max(512),cwd:v().min(1).max(4096),messages:p(c({id:v().min(1).max(1024),role:e([`user`,`assistant`]),text:v().min(1),source:v().min(1).max(1024)}).strict())}).strict().refine(e=>new Set(e.messages.map(e=>e.id)).size===e.messages.length,`Duplicate message IDs.`);c({operationId:d(),sessionKey:s,parentRevision:o,blob:y}).strict();var G=c({owner:r,sessionKey:s,agent:U,nativeId:v(),cwd:v(),title:v(),revision:o,updatedAt:v(),messageCount:m().int().nonnegative(),blob:y,overview:V.optional()}),K=c({sessions:p(G),nextCursor:o.nullable()}),q=c({totalSessions:m().int().nonnegative(),totalMessages:m().int().nonnegative(),memberCount:m().int().nonnegative(),updatedAt:v().nullable()});c({owner:r.optional(),sessionKey:s.optional()}).strict().refine(e=>!e.sessionKey||!!e.owner,`A session scope requires an owner.`);var J=c({matches:p(c({owner:r,sessionKey:s,revision:o,messageId:v(),role:e([`user`,`assistant`]),snippet:v(),title:v()})),nextCursor:o.nullable()}),Y=c({owner:r,key:s,revision:o.refine(e=>e>0).optional(),messageId:v().min(1).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`)}:{}});return n.success?{target:n.data}:{error:`对话链接不完整或已损坏。`}}var Z=D();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.displayName,t.displayName)||F(e.id,t.id)).map(e=>(0,Z.jsxs)(`div`,{role:`none`,children:[(0,Z.jsxs)(A,{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)(w,{name:`chevron`,size:`small`})}),children:[(0,Z.jsx)(w,{name:`files`}),(0,Z.jsx)(`span`,{className:`tree-name`,title:e.id,children:e.displayName})]}),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:n,onSession:r,focused:a,onFocus:o}){let{request:s,projectId:c}=b(),u=(0,L.useCallback)(t=>s(`sessions?${new URLSearchParams({owner:e,limit:`50`,order:`title`})}`,K,{signal:t}),[e,s]),d=l(u,15e3,i(c,`session-tree`,e)),[f,p]=(0,L.useState)(),[m,g]=(0,L.useState)(!1),[v,y]=(0,L.useState)(``),x=(0,L.useRef)(null);(0,L.useEffect)(()=>()=>x.current?.abort(),[]);let S=f?f.nextCursor:d.data?.nextCursor;return(0,Z.jsxs)(`div`,{role:`group`,"aria-busy":d.loading||m,children:[(0,Z.jsx)(_,{error:!0,children:d.error||v}),d.error&&(0,Z.jsx)(`button`,{onClick:()=>void d.reload(),children:`重试`}),d.loading&&!d.data&&(0,Z.jsx)(`span`,{className:`tree-status`,role:`status`,children:`正在加载…`}),[...new Map([...f?.sessions??[],...d.data?.sessions??[]].map(e=>[e.sessionKey,e])).values()].sort((e,t)=>F(e.title,t.title)||F(e.sessionKey,t.sessionKey)).map(t=>(0,Z.jsxs)(A,{type:`button`,role:`treeitem`,"aria-level":2,"aria-selected":n?.owner===e&&n.key===t.sessionKey,className:`tree-item`,style:{"--tree-level":2},tabIndex:a===`${e}/${t.sessionKey}`?0:-1,"data-testid":`session-row`,"data-owner-id":e,"data-session-key":t.sessionKey,title:h(t.title||t.nativeId),onFocus:()=>o(`${e}/${t.sessionKey}`),onClick:()=>r({owner:e,key:t.sessionKey,title:t.title||t.nativeId}),leading:(0,Z.jsx)(`span`,{className:`tree-chevron`}),children:[(0,Z.jsx)(w,{name:`sessions`}),(0,Z.jsx)(`span`,{className:`tree-name`,children:h(t.title||t.nativeId)})]},t.sessionKey)),S!=null&&(0,Z.jsx)(`button`,{className:`tree-action`,"data-testid":`session-tree-more`,disabled:m,onClick:async()=>{g(!0),y(``);let n=new AbortController;x.current=n;try{let t=await s(`sessions?${new URLSearchParams({owner:e,after:String(S),limit:`50`,order:`title`})}`,K,{signal:n.signal});p(e=>({sessions:[...e?.sessions??[],...t.sessions],nextCursor:t.nextCursor}))}catch(e){n.signal.aborted||y(t(e))}finally{n.signal.aborted||g(!1)}},children:`加载更多`})]})}function ee({info:e}){let[t,n]=(0,L.useState)(!1);return(0,Z.jsxs)(`details`,{className:`session-handoff`,onToggle:e=>n(e.currentTarget.open),children:[(0,Z.jsx)(`summary`,{children:`交接说明`}),t&&(0,Z.jsx)(te,{info:e})]})}function te({info:e}){let{request:n}=b(),r=`sessions/${encodeURIComponent(e.owner)}/${e.sessionKey}`,i=(0,L.useCallback)(e=>n(`${r}/analysis/handoff`,H,{signal:e}),[n,r]),a=l(i,5e3),o=O(),[s,c]=(0,L.useState)(!1),[u,d]=(0,L.useState)(``),f=a.data,p=s||f?.status===`queued`||f?.status===`running`,m=f?.result&&`markdown`in f.result?f.result.markdown:void 0;return(0,Z.jsxs)(`div`,{className:`stack`,"data-testid":`session-handoff`,children:[(0,Z.jsx)(_,{error:!0,children:u||a.error}),f&&(0,Z.jsxs)(`div`,{className:`inline-actions`,children:[(!m||f.stale)&&(0,Z.jsx)(`button`,{"data-testid":`session-handoff-generate`,disabled:p||!f.available,onClick:async()=>{c(!0),d(``);try{await n(`${r}/handoff`,H,{method:`POST`,signal:o}),await a.reload()}catch(e){o.aborted||d(t(e))}finally{o.aborted||c(!1)}},children:p?`正在整理…`:f.status===`failed`?`重新生成`:m?`更新交接说明`:`生成交接说明`}),!f.available&&(0,Z.jsx)(`small`,{children:`请先配置项目模型接入点`}),f.status===`failed`&&(0,Z.jsx)(`small`,{children:`整理未完成,可重试`}),f.stale&&(0,Z.jsx)(`small`,{children:`对话已有新内容`}),f.currentRevision!==e.revision&&(0,Z.jsx)(`small`,{children:`交接说明使用最新对话;当前阅读的是历史原文`})]}),m&&(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsxs)(`small`,{children:[`基于版本 `,f.sourceRevision,` · `,(0,Z.jsx)(E,{value:f.generatedAt})]}),(0,Z.jsx)(`div`,{className:`markdown`,"data-testid":`session-handoff-body`,children:(0,Z.jsx)(N,{children:m})})]})]})}function ne({members:e}){let{request:t,projectId:r}=b(),a=(0,L.useCallback)(e=>t(`sessions/stats`,q,{signal:e}),[t]),o=l(a,!0,i(r,`session-stats`)),[s,c]=(0,L.useState)(``),[d,p]=(0,L.useState)(``),[m,g]=(0,L.useState)(0),[v]=(0,L.useState)(()=>X(location.search)),[y,x]=(0,L.useState)(v.target),[S,C]=(0,L.useState)(v.target),[w,E]=(0,L.useState)(v.error??``),[D,O]=(0,L.useState)(``),A=(0,L.useRef)(null),j=y?.key?y.title?`搜索对话:${h(y.title)}`:`搜索当前对话`:y?`搜索:${e.find(e=>e.id===y.owner)?.displayName??y.owner} 的对话内容`:``,M=()=>{x(void 0),O(``),N(),A.current?.focus()};function N(){if(!S?.messageId)return;let{messageId:e,...t}=S;C(t),history.replaceState(null,``,T(P(r,t.owner,t.key,t)))}let F=(0,L.useCallback)(e=>{x(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);C(e.target),x(e.target),E(e.error??``),p(``),c(``),O(``)};return window.addEventListener(`popstate`,e),()=>window.removeEventListener(`popstate`,e)},[]);let I=(e,t=``)=>{C(e),x(e),p(``),O(t),E(``),history.replaceState(null,``,T(P(r,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":`${n.sessions}目录`,children:[(0,Z.jsx)(k,{title:n.sessions,icon:`sessions`,count:(0,Z.jsx)(`span`,{"data-testid":`session-total`,children:o.data?.totalSessions??`—`}),children:(0,Z.jsx)(f,{icon:`refresh`,label:`刷新${n.sessions}`,"data-testid":`sessions-refresh`,disabled:o.loading,onClick:()=>{o.reload(),g(e=>e+1)}})}),(0,Z.jsx)(_,{error:!0,children:o.error}),(0,Z.jsx)(Q,{members:e,refresh:m,selected:y,onOwner:e=>{x({owner:e}),C(void 0),p(``),O(``),E(``),history.replaceState(null,``,T(`/projects/${encodeURIComponent(r)}/sessions`))},onSession:I})]}),(0,Z.jsxs)(`section`,{className:`session-reader`,"aria-label":`对话内容与搜索`,children:[(0,Z.jsx)(`div`,{className:`session-reader-content`,children:w?(0,Z.jsx)(_,{error:!0,children:w}):d?(0,Z.jsx)(re,{query:d,refresh:m,scope:{...y?{owner:y.owner}:{},...y?.key?{sessionKey:y.key}:{}},onSelect:e=>I(e,d)},`${d}/${y?.owner??``}/${y?.key??``}`):S?(0,Z.jsx)(ie,{selection:S,highlight:D,onLoaded:F,onLatest:()=>I({owner:S.owner,key:S.key})},`${S.owner}/${S.key}/${S.revision}/${m}`):(0,Z.jsx)(u,{mascot:!0,title:`选择对话开始阅读`,description:`也可以在下方搜索对话内容。`})}),(0,Z.jsxs)(`form`,{className:`session-search-dock`,"data-testid":`session-search-form`,onSubmit:e=>{e.preventDefault(),p(s.trim()),O(``),E(``),g(e=>e+1)},children:[y&&(0,Z.jsxs)(`button`,{type:`button`,className:`search-scope-chip`,"data-testid":`session-search-scope`,title:`清除搜索范围`,"aria-label":`清除范围:${j}`,onClick:M,children:[(0,Z.jsx)(`span`,{className:`scope-label`,children:j}),(0,Z.jsx)(`span`,{"aria-hidden":`true`,children:`×`})]}),(0,Z.jsxs)(`div`,{className:`session-search-input-row`,children:[(0,Z.jsx)(`input`,{ref:A,"aria-label":`搜索对话`,"data-testid":`session-query`,value:s,maxLength:500,placeholder:`搜索对话内容`,onChange:e=>c(e.target.value),onKeyDown:e=>{e.key===`Backspace`&&!s&&y&&(e.preventDefault(),M())}}),(d||s||D)&&(0,Z.jsx)(f,{icon:`close`,label:`清空搜索`,"data-testid":`session-search-clear`,onClick:()=>{c(``),p(``),O(``),N(),A.current?.focus()}}),(0,Z.jsx)(f,{icon:`search`,type:`submit`,label:`搜索`,"data-testid":`session-search`,disabled:!s.trim()})]})]})]})]})}function re({query:e,refresh:t,scope:n,onSelect:r}){let{request:i}=b(),[a,o]=(0,L.useState)(0),s=(0,L.useCallback)(t=>i(`sessions/search?${new URLSearchParams({q:e,after:String(a),limit:`30`,...n.owner?{owner:n.owner}:{},...n.sessionKey?{sessionKey:n.sessionKey}:{}})}`,J,{signal:t}),[i,e,a,t,n.owner,n.sessionKey]),c=l(s);return(0,Z.jsxs)(`section`,{className:`session-results stack`,"aria-label":`搜索结果`,"aria-busy":c.loading,children:[(0,Z.jsx)(_,{error:!0,children:c.error}),c.error&&(0,Z.jsx)(`button`,{onClick:()=>void c.reload(),children:`重试`}),c.loading&&(0,Z.jsx)(`p`,{role:`status`,children:`正在搜索…`}),!c.loading&&c.data?.matches.map(t=>(0,Z.jsxs)(`button`,{className:`session-item`,"data-testid":`session-match`,"data-message-id":t.messageId,onClick:()=>r({owner:t.owner,key:t.sessionKey,revision:t.revision,messageId:t.messageId,title:t.title}),children:[(0,Z.jsx)(`strong`,{children:h(t.title)}),(0,Z.jsxs)(`small`,{children:[t.owner,` · `,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.messageId}`)),!c.loading&&c.data?.matches.length===0&&(0,Z.jsx)(`p`,{className:`empty`,children:`没有找到匹配的对话`}),c.data?.nextCursor!=null&&(0,Z.jsx)(`button`,{"data-testid":`sessions-next`,disabled:c.loading,onClick:()=>o(c.data.nextCursor),children:`下一页`}),a>0&&(0,Z.jsx)(`button`,{disabled:c.loading,onClick:()=>o(0),children:`返回第一页`})]})}function ie({selection:e,highlight:t,onLoaded:n,onLatest:r}){let{request:i}=b(),o=(0,L.useCallback)(async t=>{try{return await i(`sessions/${encodeURIComponent(e.owner)}/${e.key}${e.revision===void 0?``:`?revision=${e.revision}`}`,G,{signal:t})}catch(e){throw e instanceof a&&e.code===`SESSION_NOT_FOUND`?Error(`找不到这条对话或引用的版本,原链接可能已失效。`):e}},[i,e.owner,e.key,e.revision]),s=l(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)(_,{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,highlight:t,pinned:e.revision!==void 0,onLatest:r},s.data.blob.sha256)]})}function ae({info:e,messageId:t,highlight:n,pinned:r,onLatest:i}){let{readTextBlob:a,projectId:o}=b(),s=(0,L.useCallback)(async t=>W.parse(JSON.parse(await a(e.blob,t))),[e.blob.sha256,e.blob.size]),c=l(s),u=(0,L.useRef)(null);return(0,L.useEffect)(()=>{c.data&&t&&u.current?.scrollIntoView({block:`center`})},[c.data,t]),(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsxs)(`header`,{className:`conversation-header`,children:[(0,Z.jsx)(`h2`,{className:`session-title`,children:h(e.title||e.nativeId)}),(0,Z.jsxs)(`p`,{children:[e.owner,` · `,e.agent,` · `,e.messageCount,` 条消息`]}),(0,Z.jsxs)(`small`,{children:[(0,Z.jsx)(E,{value:e.updatedAt}),r&&(0,Z.jsxs)(Z.Fragment,{children:[` `,`· 引用版本 `,e.revision,` ·`,` `,(0,Z.jsx)(`a`,{href:T(P(o,e.owner,e.sessionKey)),onClick:e=>{e.preventDefault(),i()},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}),(0,Z.jsx)(_,{error:!0,children:c.error}),c.error&&(0,Z.jsx)(`button`,{onClick:()=>void c.reload(),children:`重新读取`}),c.loading&&(0,Z.jsx)(`p`,{role:`status`,children:`正在读取对话…`}),c.data&&(0,Z.jsxs)(Z.Fragment,{children:[t&&!c.data.messages.some(e=>e.id===t)&&(0,Z.jsx)(_,{children:`该版本中找不到引用的消息,已打开对话原文。`}),(0,Z.jsx)(`div`,{className:`session-messages`,children:c.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?u: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:n,children:e.text})})]},e.id))})]})]})}export{ne as Sessions};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{D as e,S as t,b as n,lt as r,m as i,r as a,u as o,w as s}from"./project-context--9YVXMif.js";import{l as c,o as l,s as u}from"./index-COCTfq_q.js";var d=r(),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=s();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:l,path:``,level:1,members:e,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)(c,{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)(o,{name:`chevron`,size:`small`})}),children:[(0,m.jsx)(o,{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:r,path:s,level:l,context:f,members:h=[]}){let{api:v,projectId:b}=a(),x=(0,d.useCallback)(e=>v.tree(r,s,void 0,``,e),[r,s]),S=n(x,!1,t(b,`file-tree`,r,s)),[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 t=new AbortController;k.current=t;try{let e=await v.tree(r,s,S.data.revision,j,t.signal);t.signal.aborted||w({...e,entries:[...A?.entries??[],...e.entries]})}catch(n){t.signal.aborted||O(e(n))}finally{t.signal.aborted||E(!1)}}let N=[...(S.data?.entries??[]).filter(e=>!u(e.path)),...(A?.entries??[]).filter(e=>!u(e.path))],P=f.revealed;if(P?.owner===r&&!u(P.path)&&(!s||P.path.startsWith(s+`/`))){let e=s?P.path.slice(s.length+1):P.path,t=e.indexOf(`/`),n=t<0?P.path:[s,e.slice(0,t)].filter(Boolean).join(`/`);N.some(e=>e.path===n)||N.push(t<0?{...P.file,kind:`file`}:{kind:`directory`,path:n})}let F=[...N.map(e=>({...e,owner:r})),...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(r===`_project`?`workspaces`:r,s),"aria-busy":S.loading||T,children:[S.loading&&(0,m.jsx)(`p`,{className:`tree-status`,role:`status`,children:`正在加载…`}),(0,m.jsx)(i,{error:!0,children:S.error||D}),S.error&&(0,m.jsx)(`button`,{className:`tree-action`,onClick:()=>void S.reload(),children:`重试`}),F.map(e=>e.kind===`directory`?(0,m.jsx)(y,{owner:e.owner,path:e.path,level:l,context:f},g(e.owner,e.path)):(0,m.jsxs)(c,{type:`button`,role:`treeitem`,className:`tree-item`,style:_(l),"aria-label":e.path,"aria-level":l,"aria-selected":f.selected?.kind===`file`&&f.selected.owner===r&&f.selected.path===e.path,tabIndex:f.focused===`file:${g(r,e.path)}`?0:-1,"data-testid":`file-row`,"data-owner-id":r,"data-file-path":e.path,onFocus:()=>f.onFocus(`file:${g(r,e.path)}`),onClick:()=>f.onSelect(r,e.path),leading:(0,m.jsx)(`span`,{className:`tree-chevron`}),children:[(0,m.jsx)(o,{name:`file`}),(0,m.jsx)(`span`,{className:`tree-name`,children:e.path.split(`/`).at(-1)})]},e.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};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{J as e}from"./project-context--9YVXMif.js";function t(t,n){if(!n||/^(?:[a-z][a-z0-9+.-]*:|\/)/i.test(n))return null;try{let r=n.split(/[?#]/,1)[0],i=r?t.split(`/`).slice(0,-1):t.split(`/`);for(let e of r.split(`/`)){let t=decodeURIComponent(e);if(t&&t!==`.`){if(t===`..`){if(!i.length)return null;i.pop()}else{if(t.includes(`/`)||t.includes(`\\`))return null;i.push(t)}}}return{path:i.length?e.parse(i.join(`/`)):``,directory:r.endsWith(`/`),anchor:n.includes(`#`)?decodeURIComponent(n.slice(n.indexOf(`#`)+1)):``}}catch{return null}}export{t};
|