@teammy/server 0.1.19 → 0.1.20
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/dist/main.js +394 -270
- package/dist/web/assets/Assistant-K7R3l1Y9.js +1 -0
- package/dist/web/assets/Dashboard-CrasjWgz.js +1 -0
- package/dist/web/assets/Files-DuQt5JVa.js +1 -0
- package/dist/web/assets/{HtmlPreview-C4jbdvbl.js → HtmlPreview-mlq3f457.js} +1 -1
- package/dist/web/assets/{Markdown-2LnVpzw0.js → Markdown-s6-IMB4A.js} +4 -4
- package/dist/web/assets/Materials-a3rXNw0F.js +6 -0
- package/dist/web/assets/Memory-Ciq2tU2X.js +1 -0
- package/dist/web/assets/Sessions-BlLNPG-_.js +1 -0
- package/dist/web/assets/WorkspaceTree-tH2uUcnp.js +1 -0
- package/dist/web/assets/{file-links-DhXbS2mn.js → file-links-BArHrikX.js} +1 -1
- package/dist/web/assets/{index-BRdnk3k3.js → index-CfWIg76q.js} +6 -6
- package/dist/web/downloads/teammy-skill.zip +0 -0
- package/dist/web/index.html +1 -1
- package/package.json +1 -1
- package/dist/web/assets/Assistant-C1zIXX0T.js +0 -1
- package/dist/web/assets/Dashboard-CFXVQzsu.js +0 -1
- package/dist/web/assets/Files-ZsI66NX_.js +0 -1
- package/dist/web/assets/Materials-IT4hsXHL.js +0 -6
- package/dist/web/assets/Sessions-B_9xi3yE.js +0 -1
- package/dist/web/assets/WorkspaceTree-CU784GTC.js +0 -1
- /package/dist/web/assets/{Files-C-z-5rpe.css → Memory-C-z-5rpe.css} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{A as e,K as t,M as n,N as r,P as i,S as a,X as o,Y as s,a as c,b as l,f as u,i as ee,j as d,k as f,m as p,n as m,nt as te,o as h,r as ne,t as re,tt as g,w as _,x as ie}from"./index-CfWIg76q.js";import{t as v}from"./Markdown-s6-IMB4A.js";var y=g(),b=n(),x=e=>new Date(e).toLocaleTimeString([],{hour:`2-digit`,minute:`2-digit`}),S=e=>e.replace(/[#*_`>]/g,``).replace(/\s+/g,` `).trim();function C({mine:e=!1,author:t,time:n,children:r}){return(0,b.jsx)(`div`,{className:`assistant-bubble-row ${e?`mine`:``}`,children:(0,b.jsxs)(`div`,{className:`assistant-bubble`,children:[(0,b.jsxs)(`div`,{className:`assistant-bubble-meta`,children:[(0,b.jsx)(`span`,{children:t}),(0,b.jsx)(`time`,{dateTime:n,children:x(n)})]}),r]})})}function w({me:n}){let{projectId:g,request:w}=u(),T=d(),oe=e(g,n,`assistant-selection`),E=e(g,n,`assistant-drafts`),se=(0,y.useCallback)(e=>w(`agents/outbox`,c,{signal:e}),[w]),D=f(se,3e3,e(g,n,`outbox`)),ce=(0,y.useCallback)(e=>w(`agents/chats`,re,{signal:e}),[w]),O=f(ce,3e3,e(g,n,`chats`)),[k,le]=(0,y.useState)(()=>{let e=new URLSearchParams(location.search),t=e.get(`chat`);return t?`chat:${t}`:e.get(`message`)??T?.get(oe)??``}),A=k.startsWith(`chat:`)?k.slice(5):``,j=!k||!!A,[M,N]=(0,y.useState)(()=>T?.get(e(g,n,`chat`,A))),P=M?.id===A?M:T?.get(e(g,n,`chat`,A)),ue=O.data?.chats.find(e=>e.id===A),[de,F]=(0,y.useState)(),[I,L]=(0,y.useState)(()=>T?.get(E)??{}),R=I[k]??``,z=e=>L(t=>({...t,[k]:e})),[B,V]=(0,y.useState)(!1),[H,U]=(0,y.useState)(!1),[fe,W]=(0,y.useState)(``),[pe,G]=(0,y.useState)(``),K=(0,y.useRef)(new Map),me=(0,y.useRef)(null),q=(0,y.useRef)(!0),J=(0,y.useRef)(k);J.current=k,(0,y.useEffect)(()=>{M&&T?.set(e(g,n,`chat`,M.id),M)},[T,g,n,M]),(0,y.useEffect)(()=>{T?.set(E,I)},[T,E,I]);function Y(e){J.current=e,le(e),T?.set(oe,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,y.useEffect)(()=>{!k&&O.data?.chats.length&&Y(`chat:${O.data.chats[0].id}`)},[k,O.data]);let X=(D.data?.messages??[]).filter(e=>e.box===`debug`).reverse(),Z=D.data?.messages.find(e=>e.id===(k===`debug`?de:k));(0,y.useEffect)(()=>{k!==`debug`&&Z?.conversationId&&Y(`chat:${Z.conversationId}`)},[k,Z?.conversationId]);let Q=X.filter(e=>!e.readAt).map(e=>e.id).join(`,`);(0,y.useEffect)(()=>{Z&&!Z.readAt&&k!==`debug`&&w(`agents/outbox/${Z.id}/read`,h,{method:`POST`}).then(()=>{window.dispatchEvent(new Event(`teammy:outbox`)),D.reload()}).catch(e=>W(i(e)))},[Z?.id,Z?.readAt,k,w,D.reload]),(0,y.useEffect)(()=>{k===`debug`&&Q&&Promise.all(Q.split(`,`).map(e=>w(`agents/outbox/${e}/read`,h,{method:`POST`}))).then(()=>{window.dispatchEvent(new Event(`teammy:outbox`)),D.reload()}).catch(e=>W(i(e)))},[k,Q,w,D.reload]),(0,y.useEffect)(()=>{if(G(``),!A)return;let t=!0,a=-1,c=!1,l=new AbortController,u=e=>{!t||e.id!==A||e.cursor<a||(a=e.cursor,c=!0,e.redirect?Y(`chat:${e.redirect}`):(N(e),G(``)))};w(`agents/chats/${A}`,m,{signal:l.signal}).then(u).catch(a=>{t&&!l.signal.aborted&&(a instanceof r&&[401,403,404].includes(a.status)&&(T?.delete(e(g,n,`chat`,A)),N(e=>e?.id===A?void 0:e)),c||G(i(a)))});let d=e=>{let n=Number(e.lastEventId);return!t||!Number.isSafeInteger(n)||n<=a?!1:(a=n,!0)},f=new EventSource(te(`/api/v1/projects/${encodeURIComponent(g)}/agents/chats/${encodeURIComponent(A)}/events`));f.addEventListener(`snapshot`,e=>{if(t)try{u(m.parse(JSON.parse(e.data)))}catch(e){G(i(e))}}),f.onerror=()=>{t&&G(`对话连接中断,正在重新连接…`)},f.addEventListener(`context`,e=>{if(!d(e))return;let t=m.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}`):N(e=>e?.id===A?{...e,...t,cursor:a}:e)}),f.addEventListener(`message`,e=>{if(!d(e))return;let t=ne.parse(JSON.parse(e.data));N(n=>n?.id===A?{...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(!d(e))return;let{id:t}=s({id:o()}).parse(JSON.parse(e.data));N(e=>e?.id===A?{...e,cursor:a,messages:e.messages.filter(e=>e.id!==t)}:e)}),f.addEventListener(`run`,e=>{if(!d(e))return;let t=ee.parse(JSON.parse(e.data));N(n=>n?.id===A?{...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(!d(t))return;let n=JSON.parse(t.data);N(r=>r?.id===A?{...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()=>{t=!1,l.abort(),f.close()}},[g,A,n,w,T]),(0,y.useEffect)(()=>{if(!P?.kind||P.id!==A)return;let e=()=>{document.visibilityState===`visible`&&w(`agents/chats/${A}/read`,s({ok:t()}),{method:`POST`,body:{cursor:P.readCursor}}).then(()=>{O.reload(),window.dispatchEvent(new Event(`teammy:outbox`))}).catch(e=>W(i(e)))},n=setTimeout(e,300);return document.addEventListener(`visibilitychange`,e),()=>{clearTimeout(n),document.removeEventListener(`visibilitychange`,e)}},[A,P?.readCursor,P?.kind,w]),(0,y.useEffect)(()=>{q.current&&me.current?.scrollIntoView({block:`end`})},[k,M?.messages,Z?.recipients,X.length]);function he(){window.dispatchEvent(new Event(`teammy:outbox`)),D.reload()}async function $(e){if(q.current=!0,Y(e),W(``),F(void 0),e.startsWith(`chat:`)||e===`debug`)return;let t=D.data?.messages.find(t=>t.id===e)?.conversationId;if(t)Y(`chat:${t}`);else try{await w(`agents/outbox/${e}/read`,h,{method:`POST`}),he()}catch(e){W(i(e))}}async function ge(){if(!H){U(!0),W(``);try{let e=await w(`agents/chats`,m,{method:`POST`});N(e),await $(`chat:${e.id}`),O.reload()}catch(e){W(i(e))}finally{U(!1)}}}async function _e(e){e.preventDefault();let t=R.trim();if(!t||B||H)return;V(!0),W(``);let n=K.current.get(k);n&&n.text===t||(n={text:t,id:crypto.randomUUID()},K.current.set(k,n));try{if(j){let e=n.target??A;if(!e){let r=await w(`agents/chats`,m,{method:`POST`});e=r.id,n.target=e,K.current.set(`chat:${e}`,n),L(n=>({...n,[`chat:${e}`]:t})),J.current===k&&(N(r),Y(`chat:${e}`))}let r=await w(`agents/chats/${e}`,ee.extend({conversationId:o().optional()}),{method:`POST`,body:{text:t,requestId:n.id}});r.conversationId&&r.conversationId!==e&&(J.current===k||J.current===`chat:${e}`)&&Y(`chat:${r.conversationId}`),N(t=>t?.id===e?{...t,runs:t.runs.some(e=>e.id===r.id)?t.runs:[...t.runs,r]}:t),O.reload()}else{let e=await w(`agents/outbox/${Z.id}/reply`,s({conversationId:o()}),{method:`POST`,body:{body:t,requestId:n.id}});he(),J.current===k&&Y(`chat:${e.conversationId}`),O.reload(),F(void 0)}K.current.delete(k),n.target&&K.current.delete(`chat:${n.target}`),L(e=>({...e,[k]:``,...n.target?{[`chat:${n.target}`]:``}:{}}))}catch(e){W(i(e))}finally{V(!1)}}let ve=j||!!Z&&!Z.archivedAt,ye=j&&!P&&(!!A||!O.data);return(0,b.jsxs)(`div`,{className:`split-layout assistant-layout`,"data-testid":`assistant-page`,children:[(0,b.jsxs)(`aside`,{className:`assistant-list`,"aria-label":`消息列表`,children:[(0,b.jsxs)(`header`,{className:`assistant-list-heading`,children:[(0,b.jsx)(`h1`,{children:`消息`}),(0,b.jsx)(ie,{className:`assistant-new-chat`,icon:`plus`,label:`新建对话`,disabled:H,onClick:()=>void ge(),"data-testid":`assistant-launcher`})]}),(0,b.jsxs)(`div`,{className:`assistant-message-scroll`,children:[O.loading&&!O.data&&(0,b.jsx)(`p`,{className:`assistant-list-status`,role:`status`,children:`加载中…`}),O.data?.chats.map(e=>(0,b.jsxs)(`button`,{type:`button`,"data-testid":`assistant-chat-${e.id}`,className:`assistant-message-item assistant-chat-item ${A===e.id?`selected`:``}`,"aria-pressed":A===e.id,onClick:()=>void $(`chat:${e.id}`),children:[(0,b.jsx)(`span`,{className:`assistant-message-dot ${e.unread||e.state===`running`||e.state===`queued`?`unread`:``}`}),(0,b.jsxs)(`span`,{className:`assistant-message-copy`,children:[(0,b.jsx)(p,{selected:A===e.id,children:(0,b.jsx)(`strong`,{children:e.title})}),(0,b.jsxs)(`time`,{dateTime:e.updatedAt,children:[new Date(e.updatedAt).toLocaleDateString([],{month:`numeric`,day:`numeric`}),` `,x(e.updatedAt)]})]})]},e.id)),!!X.length&&(0,b.jsxs)(`button`,{type:`button`,"data-testid":`debug-outbox`,className:`assistant-message-item ${k===`debug`?`selected`:``}`,onClick:()=>void $(`debug`),children:[(0,b.jsx)(`span`,{className:`assistant-message-dot ${Q?`unread`:``}`}),(0,b.jsxs)(`span`,{className:`assistant-message-copy`,children:[(0,b.jsx)(p,{selected:k===`debug`,children:(0,b.jsx)(`strong`,{children:`运行提醒`})}),(0,b.jsx)(`span`,{children:S(X.at(-1).body)})]})]}),D.data?.messages.filter(e=>e.box!==`debug`&&!e.conversationId).sort((e,t)=>Number(!!e.archivedAt)-Number(!!t.archivedAt)).map(e=>(0,b.jsxs)(`button`,{type:`button`,"data-testid":`outbox-${e.id}`,className:`assistant-message-item ${e.archivedAt?`archived`:``} ${k===e.id?`selected`:``}`,onClick:()=>void $(e.id),children:[(0,b.jsx)(`span`,{className:`assistant-message-dot ${e.readAt?``:`unread`}`}),(0,b.jsxs)(`span`,{className:`assistant-message-copy`,children:[(0,b.jsx)(p,{selected:k===e.id,children:(0,b.jsx)(`strong`,{children:S(e.body)})}),(0,b.jsxs)(`time`,{dateTime:e.createdAt,children:[new Date(e.createdAt).toLocaleDateString([],{month:`numeric`,day:`numeric`}),` `,x(e.createdAt)]})]})]},e.id))]}),(0,b.jsx)(_,{error:!0,children:D.error||O.error})]}),(0,b.jsxs)(`section`,{className:`assistant-thread`,"aria-label":j?`Tim对话`:`消息内容`,children:[(0,b.jsxs)(`header`,{className:`assistant-thread-heading`,children:[(0,b.jsx)(`h2`,{children:j?ue?.title??P?.title??(A?`无标题`:`Tim`):k===`debug`?`运行提醒`:`项目消息`}),P?.kind===`matter`&&(0,b.jsxs)(`span`,{className:`assistant-participants`,title:P.participants?.join(`、`),children:[P.visibility===`project`?`项目共享 · `:``,P.participants?.join(`、`)]})]}),P?.kind===`matter`&&(P.hold||P.pending||P.status===`completed`)&&(0,b.jsx)(`div`,{className:`assistant-matter-state`,role:`status`,children:P.hold?`${P.hold.scope===`all`?`已暂停`:`暂缓修改`} · ${P.hold.reason}`:P.pending?`待确认 · ${P.pending.members.join(`、`)}:${P.pending.question}`:`已完成`}),(0,b.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:[j?ye?(0,b.jsxs)(`div`,{className:`assistant-empty`,"data-testid":`assistant-loading`,children:[(0,b.jsx)(a,{}),(0,b.jsx)(`p`,{role:`status`,children:pe||O.error?`暂时无法加载对话`:`加载中…`})]}):P?.messages.length?P.messages.filter(e=>e.body||[`queued`,`running`,`failed`].includes(e.state)).map(e=>(0,b.jsx)(`div`,{className:`assistant-turn`,children:(0,b.jsxs)(C,{mine:e.role===`user`&&e.author===n,author:`${e.role===`assistant`?`Tim`:e.author}${e.source===`wecom`?` · 企业微信`:``}`,time:e.createdAt,children:[e.body&&(0,b.jsx)(`div`,{className:`markdown`,children:(0,b.jsx)(v,{children:e.body})}),e.role===`assistant`&&[`queued`,`running`].includes(e.state)&&(0,b.jsxs)(`span`,{className:`assistant-typing`,"aria-label":`正在回答`,children:[(0,b.jsx)(`i`,{}),(0,b.jsx)(`i`,{}),(0,b.jsx)(`i`,{})]}),e.state===`failed`&&(0,b.jsx)(_,{error:!0,children:P.runs.find(t=>t.id===e.runId)?.error||`本次回答未完成。`})]})},e.id)):(0,b.jsxs)(`div`,{className:`assistant-empty`,children:[(0,b.jsx)(a,{}),(0,b.jsx)(`p`,{children:`有什么项目问题想聊聊?`})]}):!D.data&&D.loading?(0,b.jsx)(`div`,{className:`assistant-empty`,children:(0,b.jsx)(`p`,{role:`status`,children:`加载中…`})}):k===`debug`?X.map(e=>(0,b.jsx)(ae,{item:e,onReply:e.archivedAt?void 0:()=>{F(e.id),z(``),W(``)}},e.id)):Z&&(0,b.jsx)(ae,{item:Z}),(0,b.jsx)(`div`,{ref:me})]}),(0,b.jsx)(_,{error:!0,children:fe||(j?pe:``)}),ve?(0,b.jsxs)(`form`,{className:`assistant-composer`,onSubmit:e=>void _e(e),children:[(0,b.jsx)(`textarea`,{value:R,disabled:H,onChange:e=>z(e.target.value),"aria-label":j?`向Tim提问`:`回复消息`,placeholder:j?`问问Tim…`:`回复…`,rows:2,onKeyDown:e=>{e.key===`Enter`&&!e.shiftKey&&!e.nativeEvent.isComposing&&(e.preventDefault(),e.currentTarget.form?.requestSubmit())}}),(0,b.jsx)(`button`,{className:`primary assistant-send`,type:`submit`,disabled:B||H||ye||!R.trim(),"aria-label":`发送`,children:(0,b.jsx)(l,{name:`send`})})]}):k!==`debug`&&Z&&(0,b.jsxs)(`div`,{className:`assistant-archived`,children:[(0,b.jsx)(l,{name:`archive`}),`已归档`]})]})]})}function ae({item:e,onReply:t}){return(0,b.jsx)(`div`,{"data-testid":`outbox-thread-${e.id}`,children:(0,b.jsxs)(C,{author:e.box===`debug`?`运行提醒`:`Tim`,time:e.createdAt,children:[(0,b.jsx)(`div`,{className:`markdown`,children:(0,b.jsx)(v,{children:e.body})}),t&&(0,b.jsx)(`button`,{type:`button`,className:`assistant-debug-reply`,onClick:t,children:`回复`})]})})}export{w as Assistant};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{A as e,C as t,D as n,M as r,O as i,P as a,T as o,_ as s,b as c,f as l,g as u,h as d,k as f,nt as p,tt as m,w as h,x as g,y as _}from"./index-CfWIg76q.js";import{t as v}from"./project-links-Dy6-B89_.js";import"./file-links-BArHrikX.js";var y=m(),b=r(),x=[{status:`planned`,label:`计划`},{status:`in_progress`,label:`进行中`},{status:`in_review`,label:`待验收`},{status:`completed`,label:`已完成`},{status:null,label:`未明确`}];function S({members:t,project:n}){let{request:r,projectId:i}=l(),a=(0,y.useCallback)(e=>r(`tasks`,d,{signal:e}),[r]),c=f(a,3e3,e(i,`tasks`)),[u,p]=(0,y.useState)(),m=c.data,g=new Map(t.map(e=>[e.id,e.displayName||e.id]));return(0,b.jsxs)(`div`,{className:`task-board`,children:[(0,b.jsx)(o,{title:n?.projectName.trim()?`${n.projectName.trim()}|工作看板`:`工作看板`,description:n?.description.trim()||``}),(0,b.jsx)(h,{error:!0,children:c.error}),(0,b.jsx)(`section`,{className:`task-board-lanes`,"aria-label":`任务进度`,"data-testid":`progress-board`,children:x.filter(e=>e.status!==null||m?.tasks.some(e=>e.status===null)).map(e=>{let t=m?.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)(s,{children:m?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:()=>p(e),onSaved:()=>void c.reload()},e.id)):(0,b.jsx)(`p`,{className:`task-lane-empty`,children:c.error&&!m?`读取失败`:m?`暂无任务`:`读取中…`})})]},e.label)})}),u&&(0,b.jsx)(T,{task:u,onClose:()=>p(void 0),onSaved:()=>{p(void 0),c.reload()}},u.id)]})}function C({task:e,names:t,onEdit:r,onSaved:o}){let{projectId:s,request:d}=l(),f=i(),[m,_]=(0,y.useState)(!1),[x,S]=(0,y.useState)(``);async function C(){if(!m){_(!0),S(``);try{await d(`tasks/${e.id}/correction`,u,{method:`PATCH`,signal:f,body:{needsConfirmation:!1,expectedRevision:e.revision}}),f.aborted||o()}catch(e){f.aborted||S(a(e))}finally{_(!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)(c,{name:`attention`,size:`small`}),`需要确认`]})]})]}),(0,b.jsx)(g,{icon:`edit`,className:`task-card-edit`,label:`纠正任务:${e.title}`,"data-testid":`task-correct`,disabled:m,onClick:r}),(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:p(t.kind===`material`?`/projects/${s}/materials?id=${t.materialId}&revision=${t.revision}`:v(s,e.owner,t.path)),children:[(0,b.jsx)(c,{name:`file`,size:`small`}),(0,b.jsx)(`span`,{children:t.path})]},t.path))}),e.syncedAt&&(0,b.jsxs)(`small`,{children:[`资料同步于 `,(0,b.jsx)(n,{value:e.syncedAt})]}),e.needsConfirmation&&(0,b.jsxs)(`div`,{className:`task-card-confirm`,children:[(0,b.jsx)(h,{error:!0,children:x}),(0,b.jsx)(`button`,{className:`primary`,"data-testid":`task-confirm-save`,disabled:m,onClick:()=>void C(),children:m?`正在保存…`:`保存`})]})]})]})}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:n,onSaved:r}){let{request:o}=l(),s=i(),[c,d]=(0,y.useState)(e.title),[f,p]=(0,y.useState)(e.status??``),[m,g]=(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},...f===(e.status??``)?{}:{status:f||null},...m===(e.goal??``)?{}:{goal:m||null},...v===e.progress?{}:{progress:v},...e.needsConfirmation?{needsConfirmation:!1}:{}};async function O(){if(!C&&Object.keys(D).length){w(!0),E(``);try{await o(`tasks/${e.id}/correction`,u,{method:`PATCH`,signal:s,body:{...D,expectedRevision:e.revision}}),s.aborted||r()}catch(e){s.aborted||E(a(e))}finally{w(!1)}}}return(0,b.jsx)(t,{id:`task-correction`,title:`纠正任务`,onClose:n,children:(0,b.jsxs)(`form`,{className:`stack`,"aria-busy":C,onSubmit:e=>{e.preventDefault(),O()},children:[(0,b.jsx)(_,{id:`task-title`,label:`标题`,children:(0,b.jsx)(`input`,{value:c,required:!0,onChange:e=>d(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:f===e.status,onChange:()=>p(e.status)}),(0,b.jsx)(`span`,{children:e.label})]},e.status))}),(0,b.jsx)(`small`,{children:`待验收:任务成果已提交,等待验收或最终确认。`})]}),(0,b.jsx)(_,{id:`task-goal`,label:`目标`,children:(0,b.jsx)(`textarea`,{value:m,onChange:e=>g(e.target.value)})}),(0,b.jsx)(_,{id:`task-progress`,label:`当前进展`,children:(0,b.jsx)(`textarea`,{value:v,onChange:e=>S(e.target.value)})}),(0,b.jsx)(h,{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};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{A as e,E as t,L as n,M as r,N as i,b as a,c as o,d as s,f as c,k as l,l as u,nt as d,s as f,tt as p,u as m,v as h,w as g,x as _,z as v}from"./index-CfWIg76q.js";import{t as y}from"./Markdown-s6-IMB4A.js";import{t as b}from"./project-links-Dy6-B89_.js";import{t as x}from"./file-links-BArHrikX.js";import{n as S,t as C}from"./WorkspaceTree-tH2uUcnp.js";import{t as w}from"./HtmlPreview-mlq3f457.js";var T=p(),E=r();function D(e,t){let n=t.split(`/`).slice(0,-1);return n.map((t,r)=>S(e,n.slice(0,r+1).join(`/`))).concat(S(e,``))}function O({members:e,me:t,onRefresh:r}){let{api:a,projectId:p}=c(),[y,w]=(0,T.useState)(()=>{let t=new URLSearchParams(location.search),n=t.get(`owner`),r=v.safeParse(t.get(`path`));return n&&(m(n)||e.some(e=>e.id===n))&&r.success&&!u(r.data)?{owner:n,path:r.data}:void 0}),[O,A]=(0,T.useState)(()=>new Set(y?D(y.owner,y.path):[S(t,``)])),[j,M]=(0,T.useState)(()=>y?{...y,kind:`file`}:void 0),[N,P]=(0,T.useState)(0),[F,I]=(0,T.useState)(()=>{let e=new URLSearchParams(location.search);return!y&&(e.has(`owner`)||e.has(`path`))?`文件链接不完整或目标已不可用。`:``}),L=(0,T.useCallback)(async e=>{if(y)try{return{owner:y.owner,...await a.file(y.owner,y.path,void 0,e)}}catch(e){throw e instanceof i&&e.code===`FILE_NOT_FOUND`?Error(`找不到这个文件,可能已被删除或移动。`):e}},[y?.owner,y?.path,N]),R=l(L),z=R.data?.owner===y?.owner&&R.data?.file.path===y?.path?R.data:void 0;function B(e,t){let n=t.split(`/`).filter(Boolean);A(t=>{let r=new Set(t);for(let t=0;t<=n.length;t++)r.add(S(e,n.slice(0,t).join(`/`)));return r})}function V(e,t){I(``),B(e,t.split(`/`).slice(0,-1).join(`/`)),w({owner:e,path:t}),M({owner:e,path:t,kind:`file`}),history.replaceState(null,``,d(b(p,e,t)))}function H(t){if(!y)return!1;let n=x(m(y.owner)?y.path:`${y.owner}/${y.path}`,t);if(!n)return!/^[a-z][a-z0-9+.-]*:/i.test(t)&&!t.startsWith(`//`)&&(I(`该链接超出工作区,请在原仓库查看。`),!0);if(u(n.path))return I(`配置文件不在文件浏览中显示。`),!0;if(o(n.path))return location.assign(d(`/projects/${p}/memory`)),!0;let[r,...i]=n.path.split(`/`),a=e.some(e=>e.id===r),s=a?r:f,c=a?i.join(`/`):n.path;return I(``),n.directory?(B(s,c),M({owner:s,path:c,kind:`directory`})):s===y.owner&&c===y.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`}):V(s,c),!0}return(0,E.jsxs)(`div`,{className:`split-layout file-explorer`,"data-testid":`file-browser`,children:[(0,E.jsxs)(`aside`,{className:`file-tree-pane`,"aria-label":`文件资源管理器`,children:[(0,E.jsx)(s,{title:`工作区`,icon:`files`,children:(0,E.jsx)(_,{icon:`refresh`,label:`刷新文件`,"data-testid":`files-refresh`,onClick:()=>{I(``),P(e=>e+1),r()}})}),(0,E.jsx)(C,{members:e,expanded:O,selected:j,revealed:!R.loading&&!R.error&&z?{owner:z.owner,path:z.file.path,file:z.file}:void 0,onSelect:V,onToggle:(e,t)=>{M({owner:e,path:t,kind:`directory`}),A(n=>{let r=new Set(n),i=S(e,t);return r.has(i)?r.delete(i):r.add(i),r})}},N)]}),(0,E.jsx)(`section`,{className:`file-detail`,"data-testid":`file-preview`,"data-owner-id":y?.owner,"data-file-path":y?.path,"aria-label":n.filePreview,children:y?(0,E.jsxs)(E.Fragment,{children:[(0,E.jsx)(g,{error:!0,children:F||!R.loading&&R.error}),R.error&&(0,E.jsx)(`button`,{className:`file-entry-retry`,"data-testid":`files-retry`,onClick:()=>void R.reload(),children:n.retry}),R.loading?(0,E.jsx)(`p`,{className:`preview-body`,role:`status`,children:n.loading}):!R.error&&z&&(0,E.jsx)(k,{owner:z.owner,file:z.file,onLink:H},`${z.owner}:${z.file.path}:${z.file.sha256}`)]}):F?(0,E.jsx)(g,{error:!0,children:F}):(0,E.jsx)(h,{mascot:!0,title:`查看工作区文件`,description:n.pickFile})})]})}function k({owner:r,file:i,onLink:o}){let{readTextBlob:s,blobUrl:u,projectId:d}=c(),[f,p]=(0,T.useState)(!1),h=i.size>524288,v=/\.(md|markdown)$/i.test(i.path),b=/\.html?$/i.test(i.path),x=(0,T.useCallback)(e=>h?Promise.resolve(void 0):s(i,e),[i.sha256,i.size,h]),S=l(x,!1,e(d,`file-body`,i.sha256));return(0,E.jsxs)(E.Fragment,{children:[(0,E.jsxs)(`header`,{className:`file-detail-header`,children:[(0,E.jsxs)(`span`,{className:`file-detail-path`,title:`${m(r)?`workspaces`:r}/${i.path}`,children:[(0,E.jsxs)(`span`,{children:[m(r)?`workspaces`:r,` / `]}),i.path]}),(0,E.jsxs)(t,{label:`文件操作`,children:[(v||b)&&(0,E.jsx)(_,{icon:f?`preview`:`code`,label:f?`切换为预览`:`切换为原文`,"data-testid":`file-toggle-raw`,"aria-pressed":f,onClick:()=>p(!f)}),(0,E.jsx)(`a`,{className:`icon-button`,"data-testid":`file-download`,"aria-label":n.download,title:n.download,href:u(i.sha256),download:i.path.split(`/`).at(-1),children:(0,E.jsx)(a,{name:`download`})})]})]}),h?(0,E.jsx)(`div`,{className:`empty`,children:(0,E.jsx)(`p`,{children:n.previewLarge})}):S.error?(0,E.jsxs)(`div`,{className:`preview-body`,children:[(0,E.jsx)(g,{error:!0,children:S.error}),(0,E.jsx)(`button`,{"data-testid":`file-preview-retry`,onClick:()=>void S.reload(),children:n.retry})]}):S.loading?(0,E.jsx)(`p`,{className:`preview-body`,role:`status`,children:n.loading}):(0,E.jsx)(`div`,{className:`preview-body${b&&!f?` preview-body-html`:``}`,children:b&&!f?(0,E.jsx)(w,{url:u(i.sha256),name:i.path.split(`/`).at(-1)}):v&&!f?(0,E.jsx)(`article`,{className:`markdown`,"data-testid":`file-content`,"data-format":`markdown`,children:(0,E.jsx)(y,{onLink:o,children:S.data??``})}):(0,E.jsx)(`pre`,{className:`raw`,"data-testid":`file-content`,"data-format":`text`,children:S.data})})]})}export{O as Files};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{M as e}from"./index-CfWIg76q.js";var t=e();function n({url:e,name:n}){return(0,t.jsx)(`iframe`,{className:`html-preview`,title:`${n} 预览`,src:`${e}${e.includes(`?`)?`&`:`?`}view=html`,sandbox:``,referrerPolicy:`no-referrer`})}export{n as t};
|