@kanyun-ai-infra/band-cli 0.1.0 → 0.1.1
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/bundled/kernel/fixture.js +1 -1
- package/bundled/kernel/index.js +1 -1
- package/bundled/official/activity/package.json +1 -1
- package/bundled/official/approval/package.json +1 -1
- package/bundled/official/artifacts/package.json +1 -1
- package/bundled/official/chat/package.json +1 -1
- package/bundled/official/chunks/chunk-SB74RUTN.js +1 -0
- package/bundled/official/comment/dist/index.js +1 -1
- package/bundled/official/comment/package.json +2 -2
- package/bundled/official/header/package.json +1 -1
- package/bundled/official/home/package.json +1 -1
- package/bundled/official/layouts/package.json +1 -1
- package/bundled/official/library/package.json +1 -1
- package/bundled/official/members/dist/index.js +1 -1
- package/bundled/official/members/package.json +2 -2
- package/bundled/official/memory/dist/index.js +2 -2
- package/bundled/official/memory/package.json +2 -2
- package/bundled/official/native/package.json +1 -1
- package/bundled/official/params-form/package.json +1 -1
- package/bundled/official/plugins/package.json +1 -1
- package/bundled/official/project/dist/index.js +1 -1
- package/bundled/official/project/package.json +2 -2
- package/bundled/official/queue/package.json +1 -1
- package/bundled/official/settings/dist/index.js +1 -1
- package/bundled/official/settings/package.json +2 -2
- package/bundled/official/settings/plugin.yaml +7 -0
- package/bundled/official/shell/dist/index.js +1 -1
- package/bundled/official/shell/package.json +2 -2
- package/bundled/official/stages/package.json +1 -1
- package/bundled/official/threads/package.json +1 -1
- package/bundled/official/turn-bar/package.json +1 -1
- package/bundled/official/turn-trace/package.json +1 -1
- package/bundled/official/version-switch/dist/index.js +1 -1
- package/bundled/official/version-switch/package.json +1 -1
- package/bundled/official/viewer-entity/package.json +1 -1
- package/bundled/official/viewer-external/package.json +1 -1
- package/bundled/official/viewer-image/package.json +1 -1
- package/bundled/official/viewer-media/index.js +2 -2
- package/bundled/official/viewer-media/package.json +2 -2
- package/bundled/official/viewer-storyboard/index.js +2 -2
- package/bundled/official/viewer-storyboard/package.json +2 -2
- package/bundled/official/viewer-text/dist/index.js +2 -2
- package/bundled/official/viewer-text/package.json +2 -2
- package/bundled/official/viewer-tool/package.json +1 -1
- package/bundled/official/viewer-web/package.json +1 -1
- package/bundled/official/viewer-web-app/package.json +1 -1
- package/bundled/official/workshops/dist/index.js +2 -2
- package/bundled/official/workshops/package.json +2 -2
- package/bundled/skills/band-plugin/SKILL.md +20 -273
- package/bundled/skills/band-plugin/references/code.md +58 -0
- package/bundled/skills/band-plugin/references/dev.md +37 -0
- package/bundled/skills/band-plugin/references/execution.md +26 -0
- package/bundled/skills/band-plugin/references/manifest.md +65 -0
- package/bundled/skills/band-plugin/references/placement.md +34 -0
- package/bundled/skills/band-plugin/references/reuse.md +38 -0
- package/bundled/skills/band-plugin/references/rules.md +12 -0
- package/bundled/skills/band-plugin/references/shape.md +17 -0
- package/bundled/skills/band-plugin/references/testing-publish.md +35 -0
- package/bundled/skills/band-plugin/references/viewer-comments.md +25 -0
- package/bundled/skills/band-plugin/templates/dev/fixture.ts +15 -0
- package/bundled/skills/band-plugin/templates/dev/resources.ts +6 -0
- package/bundled/skills/band-plugin/templates/panel/index.ts +24 -0
- package/bundled/skills/band-plugin/templates/panel/package.json +12 -0
- package/bundled/skills/band-plugin/templates/panel/plugin.yaml +5 -0
- package/bundled/skills/band-plugin/templates/toolbar-dock/plugin.yaml +11 -0
- package/dev-host/Inspector.tsx +28 -10
- package/dev-host/app.tsx +2 -1
- package/dev-host/host.css +11 -0
- package/dev-host/main.tsx +5 -0
- package/dist/bin.js +3 -3
- package/dist/build-plugin.d.ts +1 -1
- package/dist/build-plugin.js +1 -1
- package/dist/{chunk-RAD6MMSL.js → chunk-JWZU3NOD.js} +1 -1
- package/dist/{chunk-TN7Z3OF6.js → chunk-TQHHHXXU.js} +1 -1
- package/dist/{chunk-VVJNG5GV.js → chunk-VTAJX7NN.js} +10 -10
- package/dist/{dev-server-RAZQ32W7.js → dev-server-SB5FMSVP.js} +101 -11
- package/dist/index.d.ts +2 -2
- package/dist/index.js +3 -3
- package/dist/vite.d.ts +1 -1
- package/dist/vite.js +2 -2
- package/dist/{workshop-repo-CO6YMDee.d.ts → workshop-repo-Uq6blxyt.d.ts} +10 -10
- package/package.json +5 -4
- package/src/inspector-plugins.ts +18 -0
- package/bundled/official/chunks/chunk-JI6ZNGOE.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import"../../chunks/chunk-JFPQMFKF.js";import{Avatar,ErrorNote as ErrorNote2,PaneHeader,instrumentOf,isForbidden,memberOrder,reactMount,roleLabel,useCtxData,useMembers,useRoute}from"@kanyun-ai-infra/band-plugin-react";import{projectPath}from"@kanyun-ai-infra/band-plugin-sdk";import{definePlugin}from"@kanyun-ai-infra/band-plugin-sdk";import{useEffect as useEffect3,useState as useState3}from"react";import{ErrorNote}from"@kanyun-ai-infra/band-plugin-react";import{useEffect,useId,useState}from"react";import{jsx,jsxs}from"react/jsx-runtime";import{useEffect as useEffect2,useId as useId2,useRef}from"react";import{jsx as jsx2,jsxs as jsxs2}from"react/jsx-runtime";import{Fragment,jsx as jsx3,jsxs as jsxs3}from"react/jsx-runtime";if(typeof document!=="undefined"&&document.head){const css="/* src/members.css */\n.band-members {\n list-style: none;\n margin: 0;\n padding: 0 16px 12px;\n display: grid;\n gap: 8px;\n font-size: var(--fs-ui);\n}\n.band-members-item {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n.band-members-name {\n flex: 0 0.2 auto;\n min-width: 2em;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.band-members-role {\n color: var(--muted);\n font-size: var(--fs-dense);\n}\n.band-members-cost {\n color: var(--muted);\n font-size: var(--fs-dense);\n white-space: nowrap;\n}\n.band-members-form {\n flex: 1 1 100%;\n display: grid;\n gap: 12px;\n font-size: var(--fs-row);\n}\n.band-members-form:where(fieldset) {\n margin: 0;\n padding: 0;\n border: 0;\n min-width: 0;\n}\n.band-members-form:where(.band-members-row > *) {\n padding-left: 36px;\n}\n.band-members-form p {\n margin: 0;\n}\n.band-members-field {\n position: relative;\n display: grid;\n gap: 4px;\n max-width: 360px;\n}\n.band-members-tags {\n margin: 0;\n padding: 0;\n border: 0;\n display: flex;\n flex-wrap: wrap;\n gap: 4px 16px;\n}\n.band-members-tags legend {\n padding: 0;\n margin-bottom: 4px;\n}\n.band-members-hint {\n color: var(--muted);\n font-size: var(--fs-dense);\n}\n.band-members-cands {\n position: absolute;\n top: 100%;\n left: 0;\n right: 0;\n z-index: 1;\n margin: 4px 0 0;\n padding: 4px;\n list-style: none;\n background: var(--panel);\n border-radius: var(--r);\n box-shadow: var(--shadow-pop);\n max-height: 240px;\n overflow: auto;\n overscroll-behavior: contain;\n}\n.band-members-cands button {\n display: flex;\n width: 100%;\n gap: 8px;\n align-items: baseline;\n padding: 6px 8px;\n border: 0;\n border-radius: var(--r);\n background: none;\n font: inherit;\n color: var(--ink);\n text-align: left;\n cursor: pointer;\n}\n.band-members-cands button:hover,\n.band-members-cands button:focus-visible {\n background: var(--fill);\n}\n.band-members-cands b {\n font-weight: 500;\n}\n.band-members-cands span {\n color: var(--muted);\n font-size: var(--fs-dense);\n}\n.band-members-actions {\n display: flex;\n gap: 8px;\n}\n";let el=document.head.querySelector('style[data-band-style="@kanyun-ai-infra/band-members"]');if(!el){el=document.createElement("style");el.setAttribute("data-band-style","@kanyun-ai-infra/band-members");document.head.prepend(el)}el.textContent=css}var MANAGEMENT_LABEL={owner:"\u521B\u5EFA\u4EBA",maintainer:"\u7BA1\u7406\u5458",member:"\u6210\u5458"};var RANK={member:1,maintainer:2};function grantable(self,current){const all=["member","maintainer"];if(!self)return all;const now=current===void 0?0:current==="owner"?3:RANK[current];return all.filter(r=>RANK[r]<=now)}var failed=e=>e instanceof Error?e.message:String(e);function TagChoices({options,value,onChange,disabled}){return jsxs("fieldset",{className:"band-members-tags",children:[jsxs("legend",{children:["\u89D2\u8272 ",jsx("span",{className:"band-members-hint",children:"\u5FC5\u586B\uFF0C\u81F3\u5C11\u4E00\u4E2A"})]}),options.map(o=>jsxs("label",{className:"choice sm",children:[jsx("input",{type:"checkbox",className:"checkbox",checked:value.includes(o.name),disabled,onChange:e=>onChange(e.target.checked?[...value,o.name]:value.filter(r=>r!==o.name))}),o.label??o.name]},o.name))]})}function RoleSelect({value,options,onChange,disabled,fill}){const id=useId();return jsxs("div",{className:"band-members-field",children:[jsx("label",{htmlFor:id,children:"\u7BA1\u7406\u89D2\u8272"}),jsx("select",{id,className:fill?"field fill":"field",value,disabled:disabled||options.length<2,onChange:e=>onChange(e.target.value==="maintainer"?"maintainer":"member"),children:options.map(r=>jsx("option",{value:r,children:MANAGEMENT_LABEL[r]},r))})]})}function InviteForm({api,settings,onDone,onCancel}){const[q,setQ]=useState("");const[picked,setPicked]=useState(null);const[found,setFound]=useState({q:"",users:[]});const[tags,setTags]=useState([]);const[role,setRole]=useState("member");const[busy,setBusy]=useState(false);const[error,setError]=useState(null);const inputId=useId();const listId=useId();const taken=new Set(settings.people.map(p=>p.userId));const ldap=q.trim();useEffect(()=>{if(picked||ldap===""){setFound({q:"",users:[]});return}let live=true;const t=setTimeout(()=>{api.searchUsers(ldap).then(users=>live&&setFound({q:ldap,users}),()=>live&&setFound({q:"",users:[]}))},200);return()=>{live=false;clearTimeout(t)}},[api,ldap,picked]);const userId=picked?.id??ldap;const settled=found.q===ldap;const exact=settled?found.users.find(u=>u.id===ldap):void 0;const candidates=settled?found.users.filter(u=>!taken.has(u.id)):[];async function submit(){if(userId==="")return setError("\u8FD8\u6CA1\u9009\u4EBA\uFF1A\u8F93\u5165 ldap \u6216\u59D3\u540D\u67E5\u627E");if(/\s/.test(userId))return setError("ldap \u91CC\u4E0D\u80FD\u6709\u7A7A\u683C");if(taken.has(userId))return setError(`${userId} \u5DF2\u7ECF\u662F\u6210\u5458\uFF0C\u5728\u5217\u8868\u91CC\u6539\u89D2\u8272`);if(tags.length===0)return setError("\u8FD8\u5DEE\u89D2\u8272\u6CA1\u9009\uFF1A\u81F3\u5C11\u9009\u4E00\u4E2A");setBusy(true);setError(null);try{let known=picked??void 0;if(!known){try{known=(await api.searchUsers(userId)).find(u=>u.id===userId)}catch(e){return setError(`\u67E5\u7528\u6237\u76EE\u5F55\u5931\u8D25\uFF0C\u8FD8\u6CA1\u9080\u8BF7\uFF1A${failed(e)}`)}}const next=await api.set({userId,roles:tags,role,...known?{}:{displayName:userId}});onDone(next)}catch(e){setError(`\u9080\u8BF7\u5931\u8D25\uFF1A${failed(e)}`)}finally{setBusy(false)}}return jsxs("form",{className:"band-members-form field-host","aria-label":"\u9080\u8BF7\u6210\u5458",onSubmit:e=>{e.preventDefault();void submit()},children:[jsxs("div",{className:"band-members-field",children:[jsxs("label",{htmlFor:inputId,children:["\u9080\u8BF7\u8C01 ",jsx("span",{className:"band-members-hint",children:"\u5FC5\u586B"})]}),jsx("input",{id:inputId,className:"field fill",value:picked?`${picked.displayName}\uFF08${picked.id}\uFF09`:q,placeholder:"\u8F93\u5165 ldap \u6216\u59D3\u540D\u67E5\u627E",autoComplete:"off","aria-controls":listId,disabled:busy,onChange:e=>{setPicked(null);setQ(e.target.value)}}),candidates.length>0&&jsx("ul",{className:"band-members-cands",id:listId,"aria-label":"\u5019\u9009\u7684\u4EBA",children:candidates.map(u=>jsx("li",{children:jsxs("button",{type:"button",onClick:()=>{setPicked(u);setQ(u.id)},children:[jsx("b",{children:u.displayName}),jsx("span",{children:u.id})]})},u.id))}),!picked&&ldap!==""&&settled&&!exact&&!taken.has(ldap)&&jsxs("p",{className:"band-members-hint",children:["\u76EE\u5F55\u91CC\u6CA1\u6709 ",ldap,"\uFF08\u8FD8\u6CA1\u767B\u5F55\u8FC7 Band\uFF09\uFF1A\u7167\u6837\u53EF\u4EE5\u6309\u8FD9\u4E2A ldap \u9080\u8BF7\uFF0C\u4E2D\u6587\u540D\u4E4B\u540E\u81EA\u52A8\u8865\u4E0A\u3002"]})]}),jsx(TagChoices,{options:settings.roles,value:tags,onChange:setTags,disabled:busy}),jsx(RoleSelect,{value:role,options:grantable(false,void 0),onChange:setRole,disabled:busy,fill:true}),jsx(ErrorNote,{children:error}),jsxs("div",{className:"band-members-actions",children:[jsx("button",{type:"submit",className:"btn primary sm",disabled:busy,children:busy?"\u6B63\u5728\u9080\u8BF7\u2026":"\u9080\u8BF7"}),jsx("button",{type:"button",className:"btn ghost sm",disabled:busy,onClick:onCancel,children:"\u53D6\u6D88"})]})]})}function EditPerson({api,settings,person,self,onDone,onCancel}){const known=new Set(settings.roles.map(r=>r.name));const stale=person.roles.filter(r=>!known.has(r));const[tags,setTags]=useState(person.roles.filter(r=>known.has(r)));const[role,setRole]=useState(person.role==="maintainer"?"maintainer":"member");const[busy,setBusy]=useState(false);const[error,setError]=useState(null);const owner=person.role==="owner";async function save(){if(tags.length===0)return setError("\u8FD8\u5DEE\u89D2\u8272\u6CA1\u9009\uFF1A\u81F3\u5C11\u9009\u4E00\u4E2A");setBusy(true);setError(null);try{onDone(await api.set({userId:person.userId,roles:tags,...owner?{}:{role}}))}catch(e){setError(failed(e))}finally{setBusy(false)}}return jsxs("form",{className:"band-members-form","aria-label":`\u6539 ${person.displayName} \u7684\u89D2\u8272`,onSubmit:e=>{e.preventDefault();void save()},children:[jsx(TagChoices,{options:settings.roles,value:tags,onChange:setTags,disabled:busy}),stale.length>0&&jsxs("p",{className:"band-members-hint",children:["\u5DE5\u574A\u91CC\u5DF2\u7ECF\u6CA1\u6709 ",stale.join("\u3001"),"\uFF0C\u4FDD\u5B58\u65F6\u4F1A\u53BB\u6389\u3002"]}),owner?jsx("p",{className:"band-members-hint",children:"\u521B\u5EFA\u4EBA\u7684\u7BA1\u7406\u89D2\u8272\u4E0D\u5728\u8FD9\u91CC\u6539\u3002"}):jsx(RoleSelect,{value:role,options:grantable(self,person.role),onChange:setRole,disabled:busy}),jsx(ErrorNote,{children:error}),jsxs("div",{className:"band-members-actions",children:[jsx("button",{type:"submit",className:"btn primary sm",disabled:busy,children:busy?"\u6B63\u5728\u4FDD\u5B58\u2026":"\u4FDD\u5B58"}),jsx("button",{type:"button",className:"btn ghost sm",disabled:busy,onClick:onCancel,children:"\u53D6\u6D88"})]})]})}function PageHead({title,desc,action}){return jsxs2("div",{className:"band-sf-h",children:[jsxs2("div",{children:[jsx2("h1",{children:title}),desc?jsx2("p",{children:desc}):null]}),action?jsx2("div",{className:"band-sf-h-a",children:action}):null]})}function Rows({label,children}){return jsx2("ul",{className:"band-sf-rows","aria-label":label,children})}function Row({title,tags,meta,actions,href:href2,onOpen,isNew=false}){const name=jsx2("b",{children:title});return jsxs2("li",{className:isNew?"band-sf-row is-new":"band-sf-row",children:[jsxs2("div",{className:"band-sf-row-t",children:[onOpen?jsx2("a",{className:"band-sf-row-link",href:href2??"#",onClick:e=>{if(e.metaKey||e.ctrlKey||e.shiftKey||e.altKey)return;e.preventDefault();onOpen()},children:name}):name,tags]}),jsxs2("div",{className:"band-sf-row-a",children:[actions,onOpen?jsx2("span",{className:"band-sf-chev","aria-hidden":"true",children:"\u203A"}):null]}),meta&&meta.length>0?jsx2("div",{className:"band-sf-row-m",children:meta.map((m,i)=>jsx2("span",{children:m},i))}):null]})}function Facts({items}){return jsx2("dl",{className:"band-sf-facts",children:items.map(f=>jsxs2("div",{className:"band-sf-fact",children:[jsx2("dt",{children:f.key}),jsx2("dd",{children:f.value})]},f.key))})}function Section({title,children}){return jsxs2("section",{className:"band-sf-sec","aria-label":title,children:[jsx2("h2",{children:title}),children]})}function DangerZone({children}){return jsxs2("section",{className:"band-sf-dz","aria-label":"\u5371\u9669\u64CD\u4F5C",children:[jsx2("h2",{children:"\u5371\u9669\u64CD\u4F5C"}),children]})}function DangerRow({title,note,action}){return jsxs2("div",{className:"band-sf-dz-r",children:[jsxs2("div",{children:[jsx2("b",{children:title}),jsx2("span",{children:note})]}),action]})}function Loading({text}){return jsx2("output",{className:"band-sf-load",children:jsxs2("span",{className:"tuning",children:[jsxs2("svg",{viewBox:"0 0 80 55","aria-hidden":"true",children:[jsx2("line",{x1:"0",y1:"12",x2:"80",y2:"12"}),jsx2("line",{x1:"0",y1:"22",x2:"80",y2:"22"}),jsx2("line",{x1:"0",y1:"32",x2:"80",y2:"32"}),jsx2("line",{x1:"0",y1:"42",x2:"80",y2:"42"}),jsx2("line",{x1:"0",y1:"52",x2:"80",y2:"52"}),jsx2("circle",{cx:"20",cy:"37",r:"4.6",fill:"var(--ink)"}),jsx2("circle",{cx:"40",cy:"27",r:"4.6",fill:"var(--accent)"}),jsx2("circle",{cx:"60",cy:"17",r:"4.6",fill:"var(--ink)"})]}),jsx2("span",{children:text})]})})}function Empty({children,action}){return jsxs2("div",{className:"band-sf-empty rest",children:[jsx2("i",{}),jsx2("p",{children}),action??null]})}function Dialog({title,children,actions,onClose}){const ref=useRef(null);const titleId=useId2();useEffect2(()=>{const el=ref.current;const opener=document.activeElement instanceof HTMLElement?document.activeElement:null;if(el&&!el.open){if(typeof el.showModal==="function")el.showModal();else el.setAttribute("open","")}return()=>{if(opener?.isConnected)opener.focus()}},[]);return jsxs2("dialog",{ref,className:"band-sf-dialog","aria-labelledby":titleId,onCancel:e=>{e.preventDefault();onClose()},children:[jsx2("h2",{id:titleId,children:title}),children,jsx2("div",{className:"band-sf-acts band-sf-acts-end",children:actions})]})}var PAGE="@kanyun-ai-infra/band-settings/settings";var SECTION="members";var NEW_ITEM="new";var DESC="\u4EBA\u548C Agent \u90FD\u5728\u8FD9\u91CC\u3002\u7BA1\u7406\u5458\u80FD\u52A0\u4EBA\u3001\u6539\u89D2\u8272\u3002";var DESC_READONLY="\u4EBA\u548C Agent \u90FD\u5728\u8FD9\u91CC\u3002";var src_default=definePlugin({surfaces:{members:reactMount(ctx=>jsx3(Members,{ctx})),"settings-tab":reactMount(ctx=>jsx3(MembersTab,{ctx}))}});function Members({ctx}){const members=useMembers(ctx);const order=memberOrder(members);const peers=members.filter(m=>m.actor.kind==="agent").map(m=>m.actor.id);return jsxs3("section",{"aria-label":"\u6210\u5458",children:[jsx3(PaneHeader,{title:jsxs3(Fragment,{children:["\u6210\u5458 ",members.length]})}),jsx3("ul",{className:"band-members",children:members.map(m=>jsxs3("li",{className:"band-members-item",children:[jsx3(Avatar,{id:m.actor.id,name:m.displayName,agent:m.actor.kind==="agent",...m.actor.kind==="agent"?{instrument:instrumentOf(m.actor.id,peers)}:{},order,decorative:true}),jsx3("span",{className:"band-members-name",title:m.displayName,children:m.displayName}),jsx3("span",{className:"band-members-role",children:roleLabel(members,m.actor.id)})]},m.actor.id))})]})}function params(ctx,item){return{project:ctx.project.id,...ctx.project.workshop?{workshop:ctx.project.workshop}:{},tab:SECTION,...item?{item}:{}}}function href(ctx,item){return projectPath(ctx.project,"settings",...item?[SECTION,item]:[SECTION])}var FRESH_KEY="band-members:fresh:";function markFresh(projectId,userId){try{globalThis.sessionStorage?.setItem(FRESH_KEY+projectId,userId)}catch{}}function useFresh(projectId){const[id]=useState3(()=>{try{return globalThis.sessionStorage?.getItem(FRESH_KEY+projectId)??null}catch{return null}});useEffect3(()=>{if(id===null)return;try{globalThis.sessionStorage?.removeItem(FRESH_KEY+projectId)}catch{}},[id,projectId]);return id}function MembersTab({ctx}){const api=ctx.memberSettings;const route=useRoute(ctx);const item=route.params.item;const loaded=useCtxData(ctx,async()=>{let members2;try{members2=await ctx.members.list()}catch(e){if(isForbidden(e))return{kind:"forbidden"};throw e}let settings2=null;let settingsError=null;if(api){try{settings2=await api.get()}catch(e){if(!isForbidden(e))settingsError=e instanceof Error?e.message:String(e)}}return{kind:"ok",members:members2,settings:settings2,settingsError}},[api],["member.*","run.started"]);const[fresh,setFresh]=useState3(null);const data=loaded.data;const read=data?.kind==="ok"?data:null;const members=read?.members??[];const baseSettings=read?.settings??null;const settings=fresh&&fresh.base===baseSettings?fresh.next:baseSettings;const order=memberOrder(members);const people=members.filter(m=>m.actor.kind!=="agent");const agents=members.filter(m=>m.actor.kind==="agent");const peers=agents.map(m=>m.actor.id);const manage=api&&settings?.canManage?{api,settings}:null;const settingsFailed=read?.settingsError!=null;const settingsDenied=settings!=null&&!settings.canManage;const person=id=>settings?.people.find(p=>p.userId===id);const done=next=>setFresh({base:baseSettings,next});const freshId=useFresh(ctx.project.id);const goList=()=>ctx.app.navigate({page:PAGE,params:params(ctx)});if(data===void 0){return jsxs3(Fragment,{children:[jsx3(PageHead,{title:"\u6210\u5458",desc:DESC}),loaded.error?jsxs3(ErrorNote2,{retry:loaded.reload,children:["\u6210\u5458\u6CA1\u8BFB\u51FA\u6765\uFF1A",loaded.error]}):jsx3(Loading,{text:"\u6B63\u5728\u8BFB\u53D6\u6210\u5458\u2026"})]})}if(data.kind==="forbidden"){return jsxs3(Fragment,{children:[jsx3(PageHead,{title:"\u6210\u5458",desc:DESC}),jsxs3("section",{className:"band-settings-no-access","aria-label":"\u6CA1\u6709\u6743\u9650",children:[jsx3("h2",{children:"\u6CA1\u6709\u6743\u9650\u770B\u8FD9\u4E2A\u9879\u76EE\u7684\u6210\u5458"}),jsx3("p",{children:"\u53EA\u6709\u9879\u76EE\u6210\u5458\u80FD\u770B\u3002\u8981\u770B\u7684\u8BDD\uFF0C\u8BF7\u8054\u7CFB\u9879\u76EE\u7BA1\u7406\u5458\u628A\u4F60\u52A0\u8FDB\u6765\u3002"})]})]})}if(item===NEW_ITEM){return jsxs3(Fragment,{children:[jsx3(PageHead,{title:"\u6DFB\u52A0\u6210\u5458",desc:DESC}),manage?jsx3(InviteForm,{api:manage.api,settings:manage.settings,onDone:next=>{const before=new Set(manage.settings.people.map(p=>p.userId));const added=next.people.find(p=>!before.has(p.userId));done(next);if(added)markFresh(ctx.project.id,added.userId);goList()},onCancel:goList}):settingsFailed?jsxs3(ErrorNote2,{retry:loaded.reload,children:["\u6210\u5458\u8BBE\u7F6E\u6CA1\u8BFB\u51FA\u6765\uFF1A",read?.settingsError]}):jsx3("p",{className:"band-sf-muted",children:"\u53EA\u6709\u9879\u76EE\u7BA1\u7406\u5458\u80FD\u52A0\u4EBA\u3002"})]})}if(item){const view=members.find(m=>m.actor.kind!=="agent"&&m.actor.id===item);const p=person(item);if(!view){return jsxs3(Fragment,{children:[jsx3(PageHead,{title:"\u6210\u5458"}),jsx3("p",{className:"band-sf-muted",children:"\u8FD9\u4E2A\u9879\u76EE\u91CC\u6CA1\u6709\u8FD9\u4E2A\u4EBA\uFF1B\u53EF\u80FD\u5DF2\u7ECF\u88AB\u79FB\u51FA\u3002"})]})}return jsxs3(Fragment,{children:[jsx3(PageHead,{title:view.displayName,desc:"\u7BA1\u7406\u5458\u80FD\u6539\u8FD9\u4E2A\u4EBA\u7684\u89D2\u8272\uFF1B\u521B\u5EFA\u4EBA\u7684\u7BA1\u7406\u89D2\u8272\u4E0D\u5728\u8FD9\u91CC\u6539\u3002"}),settingsFailed?jsxs3(ErrorNote2,{retry:loaded.reload,children:["\u6210\u5458\u8BBE\u7F6E\u6CA1\u8BFB\u51FA\u6765\uFF1A",read?.settingsError]}):settingsDenied?jsx3("p",{className:"band-sf-muted",children:"\u53EA\u6709\u9879\u76EE\u7BA1\u7406\u5458\u80FD\u6539\u3002"}):null,jsx3(Facts,{items:[{key:"\u540D\u5B57",value:view.displayName},{key:"\u7BA1\u7406\u89D2\u8272",value:p?MANAGEMENT_LABEL[p.role]:"\u6210\u5458"},{key:"\u4E1A\u52A1\u6807\u7B7E",value:settings&&p?tagText(settings,p):roleLabel(members,view.actor.id)||"\u6210\u5458"}]}),manage&&p?jsx3(Section,{title:"\u89D2\u8272",children:jsx3(EditPerson,{api:manage.api,settings:manage.settings,person:p,self:view.actor.id===ctx.member.id,onDone:done,onCancel:goList})}):null,manage&&p&&p.role!=="owner"?jsx3(DangerZone,{children:jsx3(DangerRow,{title:"\u79FB\u51FA\u9879\u76EE",note:`${view.displayName} \u4E0D\u518D\u80FD\u6253\u5F00\u8FD9\u4E2A\u9879\u76EE\uFF1B\u8FD9\u4E2A\u4EBA\u9009\u5230\u9879\u76EE\u4E0A\u7684\u914D\u7F6E\u81EA\u52A8\u6E05\u7A7A\uFF0C\u8BB0\u5BA1\u8BA1\u3002`,action:jsx3(RemoveButton,{ctx,api:manage.api,person:p,onDone:goList})})}):null]})}const addHref=href(ctx,NEW_ITEM);const addAction=manage||settingsFailed?jsx3("a",{className:"btn primary",href:addHref,onClick:e=>{if(e.metaKey||e.ctrlKey||e.shiftKey||e.altKey)return;e.preventDefault();ctx.app.navigate({page:PAGE,params:params(ctx,NEW_ITEM)})},children:"\u6DFB\u52A0\u6210\u5458"}):void 0;if(members.length===0){return jsxs3(Fragment,{children:[jsx3(PageHead,{title:"\u6210\u5458",desc:DESC}),settingsFailed?jsxs3(ErrorNote2,{retry:loaded.reload,children:["\u6210\u5458\u8BBE\u7F6E\u6CA1\u8BFB\u51FA\u6765\uFF1A",read?.settingsError]}):null,jsx3(Empty,{action:addAction,children:"\u8FD9\u4E2A\u9879\u76EE\u8FD8\u6CA1\u6709\u6210\u5458\u3002"})]})}return jsxs3(Fragment,{children:[jsx3(PageHead,{title:"\u6210\u5458",desc:settingsDenied?DESC_READONLY:DESC,action:addAction}),settingsDenied?jsx3("p",{className:"band-sf-muted",children:"\u53EA\u6709\u9879\u76EE\u7BA1\u7406\u5458\u80FD\u52A0\u4EBA\u3001\u6539\u89D2\u8272\u3002"}):null,jsx3(ErrorNote2,{retry:loaded.reload,children:loaded.error?`\u6210\u5458\u6CA1\u8BFB\u51FA\u6765\uFF1A${loaded.error}`:read?.settingsError?`\u6210\u5458\u8BBE\u7F6E\u6CA1\u8BFB\u51FA\u6765\uFF1A${read.settingsError}`:null}),jsxs3(Rows,{label:`\u6210\u5458 ${members.length}`,children:[people.map(m=>{const p=person(m.actor.id);return jsx3(Row,{title:m.displayName,meta:settings&&p?[`${MANAGEMENT_LABEL[p.role]} \xB7 ${tagText(settings,p)}`]:[roleLabel(members,m.actor.id)||"\u6210\u5458"],href:href(ctx,m.actor.id),isNew:m.actor.id===freshId,...settings||settingsFailed?{onOpen:()=>ctx.app.navigate({page:PAGE,params:params(ctx,m.actor.id)})}:{}},`human:${m.actor.id}`)}),agents.map(m=>jsx3(Row,{title:m.displayName,meta:[m.actor.id===ctx.project.agent?"\u9ED8\u8BA4 Agent":"Agent"]},`agent:${m.actor.id}`))]}),settingsDenied?null:jsx3(UsageNote,{ctx,members})]})}function RemoveButton({ctx,api,person,onDone}){const[open,setOpen]=useState3(false);const[busy,setBusy]=useState3(false);const[error,setError]=useState3("");const self=person.userId===ctx.member.id;const remove=async()=>{if(busy)return;setBusy(true);setError("");try{await api.remove(person.userId);onDone()}catch(e){setError(`\u6CA1\u79FB\u6210\uFF1A${e instanceof Error?e.message:String(e)}`)}finally{setBusy(false)}};return jsxs3(Fragment,{children:[jsx3("button",{type:"button",className:"btn danger",onClick:()=>setOpen(true),children:"\u79FB\u51FA\u9879\u76EE"}),open?jsxs3(Dialog,{title:`\u628A${person.displayName}\u79FB\u51FA\u9879\u76EE\uFF1F`,onClose:()=>setOpen(false),actions:jsxs3(Fragment,{children:[jsx3("button",{type:"button",className:"btn",onClick:()=>setOpen(false),children:"\u53D6\u6D88"}),jsx3("button",{type:"button",className:"btn primary",disabled:busy,onClick:()=>void remove(),children:busy?"\u6B63\u5728\u79FB\u9664\u2026":"\u79FB\u51FA\u9879\u76EE"})]}),children:[jsxs3("ul",{children:[jsx3("li",{children:self?"\u4F60\u4E0D\u518D\u80FD\u6253\u5F00\u8FD9\u4E2A\u9879\u76EE\uFF0C\u8981\u522B\u7684\u7BA1\u7406\u5458\u518D\u52A0\u56DE\u6765":`${person.displayName} \u4E0D\u518D\u80FD\u6253\u5F00\u8FD9\u4E2A\u9879\u76EE`}),jsx3("li",{children:"\u8FD9\u4E2A\u4EBA\u9009\u5230\u9879\u76EE\u4E0A\u7684\u914D\u7F6E\u81EA\u52A8\u6E05\u7A7A\uFF0C\u8BB0\u5BA1\u8BA1"}),jsx3("li",{children:"\u5DF2\u6709\u7684\u8BC4\u8BBA\u4FDD\u7559\u7F72\u540D"})]}),error?jsx3("p",{className:"band-sf-err",role:"alert",children:error}):null]}):null]})}function tagText(settings,p){const label=r=>settings.roles.find(o=>o.name===r)?.label??r;return p.roles.map(label).join("\u3001")||"\u6210\u5458"}function UsageNote({ctx,members}){const usage=useCtxData(ctx,()=>ctx.members.usage(),[],["turn.delivered","turn.failed"]);const data=usage.data;if(!data)return null;const name=actor=>members.find(m=>m.actor.kind==="human"&&m.actor.id===actor)?.displayName??"\u5DF2\u79BB\u5F00\u7684\u6210\u5458";const money=costUsd=>costUsd===void 0?"\u2014":costUsd<.01?"\u4E0D\u5230 $0.01":`$${costUsd.toFixed(2)}`;const line=(key,label,sub,u)=>jsx3(Row,{title:label,meta:[sub],actions:jsxs3("span",{className:"band-members-cost",children:[u.turns," \u4E2A\u56DE\u5408 \xB7 ",money(u.costUsd)]})},key);return jsxs3("section",{className:"band-sf-sec","aria-label":"\u7528\u91CF",children:[jsx3("h2",{children:"\u7528\u91CF"}),jsx3("p",{children:"\u53EA\u505A\u8BB0\u5F55\uFF0C\u4E0D\u8BBE\u4E0A\u9650\u3002\u4E2D\u9014\u505C\u4E0B\u7684\u4E0D\u8BA1\u8D39\u7528\uFF0C\u53EA\u8BA1\u6B21\u6570\u3002"}),jsxs3(Rows,{label:"\u7528\u91CF",children:[data.people.map(p=>line(p.actor,name(p.actor),"\u53D1\u8D77\u7684\u4FEE\u6539",p.usage)),line("auto","\u7CFB\u7EDF\u81EA\u52A8\u505A\u7684","\u7B2C\u4E00\u7248\u4EA7\u51FA\uFF0C\u6216\u4E0A\u4E00\u9636\u6BB5\u6709\u65B0\u5185\u5BB9\u65F6\u91CD\u505A",data.auto),line("totals","\u5408\u8BA1","\u5168\u90E8\u56DE\u5408",data.totals)]})]})}export{MembersTab,src_default as default};
|
|
1
|
+
import"../../chunks/chunk-JFPQMFKF.js";import{Avatar,ErrorNote as ErrorNote2,PaneHeader,SettingsNoAccess,SettingsReadError,SettingsSaveState,instrumentOf,isForbidden,memberOrder,reactMount,roleLabel,useCtxData,useMembers,useRoute}from"@kanyun-ai-infra/band-plugin-react";import{projectPath}from"@kanyun-ai-infra/band-plugin-sdk";import{definePlugin}from"@kanyun-ai-infra/band-plugin-sdk";import{useEffect as useEffect2,useState as useState2}from"react";import{ErrorNote}from"@kanyun-ai-infra/band-plugin-react";import{useEffect,useId,useState}from"react";import{jsx,jsxs}from"react/jsx-runtime";import{SettingsDanger,SettingsDangerRow,SettingsDialog,SettingsEmpty,SettingsFacts,SettingsHead,SettingsLoading,SettingsRow,SettingsRows,SettingsSection}from"@kanyun-ai-infra/band-plugin-react";import{Fragment,jsx as jsx2,jsxs as jsxs2}from"react/jsx-runtime";if(typeof document!=="undefined"&&document.head){const css="/* src/members.css */\n.band-members {\n list-style: none;\n margin: 0;\n padding: 0 16px 12px;\n display: grid;\n gap: 8px;\n font-size: var(--fs-ui);\n}\n.band-members-item {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n.band-members-name {\n flex: 0 0.2 auto;\n min-width: 2em;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.band-members-role {\n color: var(--muted);\n font-size: var(--fs-dense);\n}\n.band-members-cost {\n color: var(--muted);\n font-size: var(--fs-dense);\n white-space: nowrap;\n}\n.band-members-form {\n flex: 1 1 100%;\n display: grid;\n gap: 12px;\n font-size: var(--fs-row);\n}\n.band-members-form:where(fieldset) {\n margin: 0;\n padding: 0;\n border: 0;\n min-width: 0;\n}\n.band-members-form:where(.band-members-row > *) {\n padding-left: 36px;\n}\n.band-members-form p {\n margin: 0;\n}\n.band-members-field {\n position: relative;\n display: grid;\n gap: 4px;\n max-width: 360px;\n}\n.band-members-tags {\n margin: 0;\n padding: 0;\n border: 0;\n display: flex;\n flex-wrap: wrap;\n gap: 4px 16px;\n}\n.band-members-tags legend {\n padding: 0;\n margin-bottom: 4px;\n}\n.band-members-hint {\n color: var(--muted);\n font-size: var(--fs-dense);\n}\n.band-members-cands {\n position: absolute;\n top: 100%;\n left: 0;\n right: 0;\n z-index: 1;\n margin: 4px 0 0;\n padding: 4px;\n list-style: none;\n background: var(--panel);\n border-radius: var(--r);\n box-shadow: var(--shadow-pop);\n max-height: 240px;\n overflow: auto;\n overscroll-behavior: contain;\n}\n.band-members-cands button {\n display: flex;\n width: 100%;\n gap: 8px;\n align-items: baseline;\n padding: 6px 8px;\n border: 0;\n border-radius: var(--r);\n background: none;\n font: inherit;\n color: var(--ink);\n text-align: left;\n cursor: pointer;\n}\n.band-members-cands button:hover,\n.band-members-cands button:focus-visible {\n background: var(--fill);\n}\n.band-members-cands b {\n font-weight: 500;\n}\n.band-members-cands span {\n color: var(--muted);\n font-size: var(--fs-dense);\n}\n.band-members-actions {\n display: flex;\n gap: 8px;\n}\n";let el=document.head.querySelector('style[data-band-style="@kanyun-ai-infra/band-members"]');if(!el){el=document.createElement("style");el.setAttribute("data-band-style","@kanyun-ai-infra/band-members");document.head.prepend(el)}el.textContent=css}var MANAGEMENT_LABEL={owner:"\u521B\u5EFA\u4EBA",maintainer:"\u7BA1\u7406\u5458",member:"\u6210\u5458"};var RANK={member:1,maintainer:2};function grantable(self,current){const all=["member","maintainer"];if(!self)return all;const now=current===void 0?0:current==="owner"?3:RANK[current];return all.filter(r=>RANK[r]<=now)}var failed=e=>e instanceof Error?e.message:String(e);function TagChoices({options,value,onChange,disabled}){return jsxs("fieldset",{className:"band-members-tags",children:[jsxs("legend",{children:["\u89D2\u8272 ",jsx("span",{className:"band-members-hint",children:"\u5FC5\u586B\uFF0C\u81F3\u5C11\u4E00\u4E2A"})]}),options.map(o=>jsxs("label",{className:"choice sm",children:[jsx("input",{type:"checkbox",className:"checkbox",checked:value.includes(o.name),disabled,onChange:e=>onChange(e.target.checked?[...value,o.name]:value.filter(r=>r!==o.name))}),o.label??o.name]},o.name))]})}function RoleSelect({value,options,onChange,disabled,fill}){const id=useId();return jsxs("div",{className:"band-members-field",children:[jsx("label",{htmlFor:id,children:"\u7BA1\u7406\u89D2\u8272"}),jsx("select",{id,className:fill?"field fill":"field",value,disabled:disabled||options.length<2,onChange:e=>onChange(e.target.value==="maintainer"?"maintainer":"member"),children:options.map(r=>jsx("option",{value:r,children:MANAGEMENT_LABEL[r]},r))})]})}function InviteForm({api,settings,onDone,onCancel}){const[q,setQ]=useState("");const[picked,setPicked]=useState(null);const[found,setFound]=useState({q:"",users:[]});const[tags,setTags]=useState([]);const[role,setRole]=useState("member");const[busy,setBusy]=useState(false);const[error,setError]=useState(null);const inputId=useId();const listId=useId();const taken=new Set(settings.people.map(p=>p.userId));const ldap=q.trim();useEffect(()=>{if(picked||ldap===""){setFound({q:"",users:[]});return}let live=true;const t=setTimeout(()=>{api.searchUsers(ldap).then(users=>live&&setFound({q:ldap,users}),()=>live&&setFound({q:"",users:[]}))},200);return()=>{live=false;clearTimeout(t)}},[api,ldap,picked]);const userId=picked?.id??ldap;const settled=found.q===ldap;const exact=settled?found.users.find(u=>u.id===ldap):void 0;const candidates=settled?found.users.filter(u=>!taken.has(u.id)):[];async function submit(){if(userId==="")return setError("\u8FD8\u6CA1\u9009\u4EBA\uFF1A\u8F93\u5165 ldap \u6216\u59D3\u540D\u67E5\u627E");if(/\s/.test(userId))return setError("ldap \u91CC\u4E0D\u80FD\u6709\u7A7A\u683C");if(taken.has(userId))return setError(`${userId} \u5DF2\u7ECF\u662F\u6210\u5458\uFF0C\u5728\u5217\u8868\u91CC\u6539\u89D2\u8272`);if(tags.length===0)return setError("\u8FD8\u5DEE\u89D2\u8272\u6CA1\u9009\uFF1A\u81F3\u5C11\u9009\u4E00\u4E2A");setBusy(true);setError(null);try{let known=picked??void 0;if(!known){try{known=(await api.searchUsers(userId)).find(u=>u.id===userId)}catch(e){return setError(`\u67E5\u7528\u6237\u76EE\u5F55\u5931\u8D25\uFF0C\u8FD8\u6CA1\u9080\u8BF7\uFF1A${failed(e)}`)}}const next=await api.set({userId,roles:tags,role,...known?{}:{displayName:userId}});onDone(next)}catch(e){setError(`\u9080\u8BF7\u5931\u8D25\uFF1A${failed(e)}`)}finally{setBusy(false)}}return jsxs("form",{className:"band-members-form field-host","aria-label":"\u9080\u8BF7\u6210\u5458",onSubmit:e=>{e.preventDefault();void submit()},children:[jsxs("div",{className:"band-members-field",children:[jsxs("label",{htmlFor:inputId,children:["\u9080\u8BF7\u8C01 ",jsx("span",{className:"band-members-hint",children:"\u5FC5\u586B"})]}),jsx("input",{id:inputId,className:"field fill",value:picked?`${picked.displayName}\uFF08${picked.id}\uFF09`:q,placeholder:"\u8F93\u5165 ldap \u6216\u59D3\u540D\u67E5\u627E",autoComplete:"off","aria-controls":listId,disabled:busy,onChange:e=>{setPicked(null);setQ(e.target.value)}}),candidates.length>0&&jsx("ul",{className:"band-members-cands",id:listId,"aria-label":"\u5019\u9009\u7684\u4EBA",children:candidates.map(u=>jsx("li",{children:jsxs("button",{type:"button",onClick:()=>{setPicked(u);setQ(u.id)},children:[jsx("b",{children:u.displayName}),jsx("span",{children:u.id})]})},u.id))}),!picked&&ldap!==""&&settled&&!exact&&!taken.has(ldap)&&jsxs("p",{className:"band-members-hint",children:["\u76EE\u5F55\u91CC\u6CA1\u6709 ",ldap,"\uFF08\u8FD8\u6CA1\u767B\u5F55\u8FC7 Band\uFF09\uFF1A\u7167\u6837\u53EF\u4EE5\u6309\u8FD9\u4E2A ldap \u9080\u8BF7\uFF0C\u4E2D\u6587\u540D\u4E4B\u540E\u81EA\u52A8\u8865\u4E0A\u3002"]})]}),jsx(TagChoices,{options:settings.roles,value:tags,onChange:setTags,disabled:busy}),jsx(RoleSelect,{value:role,options:grantable(false,void 0),onChange:setRole,disabled:busy,fill:true}),jsx(ErrorNote,{children:error}),jsxs("div",{className:"band-members-actions",children:[jsx("button",{type:"submit",className:"btn primary sm",disabled:busy,children:busy?"\u6B63\u5728\u9080\u8BF7\u2026":"\u9080\u8BF7"}),jsx("button",{type:"button",className:"btn ghost sm",disabled:busy,onClick:onCancel,children:"\u53D6\u6D88"})]})]})}function EditPerson({api,settings,person,self,onDone,onCancel}){const known=new Set(settings.roles.map(r=>r.name));const stale=person.roles.filter(r=>!known.has(r));const[tags,setTags]=useState(person.roles.filter(r=>known.has(r)));const[role,setRole]=useState(person.role==="maintainer"?"maintainer":"member");const[busy,setBusy]=useState(false);const[error,setError]=useState(null);const owner=person.role==="owner";async function save(){if(tags.length===0)return setError("\u8FD8\u5DEE\u89D2\u8272\u6CA1\u9009\uFF1A\u81F3\u5C11\u9009\u4E00\u4E2A");setBusy(true);setError(null);try{onDone(await api.set({userId:person.userId,roles:tags,...owner?{}:{role}}))}catch(e){setError(failed(e))}finally{setBusy(false)}}return jsxs("form",{className:"band-members-form","aria-label":`\u6539 ${person.displayName} \u7684\u89D2\u8272`,onSubmit:e=>{e.preventDefault();void save()},children:[jsx(TagChoices,{options:settings.roles,value:tags,onChange:setTags,disabled:busy}),stale.length>0&&jsxs("p",{className:"band-members-hint",children:["\u5DE5\u574A\u91CC\u5DF2\u7ECF\u6CA1\u6709 ",stale.join("\u3001"),"\uFF0C\u4FDD\u5B58\u65F6\u4F1A\u53BB\u6389\u3002"]}),owner?jsx("p",{className:"band-members-hint",children:"\u521B\u5EFA\u4EBA\u7684\u7BA1\u7406\u89D2\u8272\u4E0D\u5728\u8FD9\u91CC\u6539\u3002"}):jsx(RoleSelect,{value:role,options:grantable(self,person.role),onChange:setRole,disabled:busy}),jsx(ErrorNote,{children:error}),jsxs("div",{className:"band-members-actions",children:[jsx("button",{type:"submit",className:"btn primary sm",disabled:busy,children:busy?"\u6B63\u5728\u4FDD\u5B58\u2026":"\u4FDD\u5B58"}),jsx("button",{type:"button",className:"btn ghost sm",disabled:busy,onClick:onCancel,children:"\u53D6\u6D88"})]})]})}var PAGE="@kanyun-ai-infra/band-settings/settings";var SECTION="members";var NEW_ITEM="new";var DESC="\u4EBA\u548C Agent \u90FD\u5728\u8FD9\u91CC\u3002\u7BA1\u7406\u5458\u80FD\u52A0\u4EBA\u3001\u6539\u89D2\u8272\u3002";var DESC_READONLY="\u4EBA\u548C Agent \u90FD\u5728\u8FD9\u91CC\u3002";var src_default=definePlugin({surfaces:{members:reactMount(ctx=>jsx2(Members,{ctx})),"settings-tab":reactMount(ctx=>jsx2(MembersTab,{ctx}))}});function Members({ctx}){const members=useMembers(ctx);const order=memberOrder(members);const peers=members.filter(m=>m.actor.kind==="agent").map(m=>m.actor.id);return jsxs2("section",{"aria-label":"\u6210\u5458",children:[jsx2(PaneHeader,{title:jsxs2(Fragment,{children:["\u6210\u5458 ",members.length]})}),jsx2("ul",{className:"band-members",children:members.map(m=>jsxs2("li",{className:"band-members-item",children:[jsx2(Avatar,{id:m.actor.id,name:m.displayName,agent:m.actor.kind==="agent",...m.actor.kind==="agent"?{instrument:instrumentOf(m.actor.id,peers)}:{},order,decorative:true}),jsx2("span",{className:"band-members-name",title:m.displayName,children:m.displayName}),jsx2("span",{className:"band-members-role",children:roleLabel(members,m.actor.id)})]},m.actor.id))})]})}function params(ctx,item){return{project:ctx.project.id,...ctx.project.workshop?{workshop:ctx.project.workshop}:{},tab:SECTION,...item?{item}:{}}}function href(ctx,item){return projectPath(ctx.project,"settings",...item?[SECTION,item]:[SECTION])}var FRESH_KEY="band-members:fresh:";function markFresh(projectId,userId){try{globalThis.sessionStorage?.setItem(FRESH_KEY+projectId,userId)}catch{}}function useFresh(projectId){const[id]=useState2(()=>{try{return globalThis.sessionStorage?.getItem(FRESH_KEY+projectId)??null}catch{return null}});useEffect2(()=>{if(id===null)return;try{globalThis.sessionStorage?.removeItem(FRESH_KEY+projectId)}catch{}},[id,projectId]);return id}function MembersTab({ctx}){const api=ctx.memberSettings;const route=useRoute(ctx);const item=route.params.item;const loaded=useCtxData(ctx,async()=>{let members2;try{members2=await ctx.members.list()}catch(e){if(isForbidden(e))return{kind:"forbidden"};throw e}let settings2=null;let settingsError=null;if(api){try{settings2=await api.get()}catch(e){if(!isForbidden(e))settingsError=e instanceof Error?e.message:String(e)}}return{kind:"ok",members:members2,settings:settings2,settingsError}},[api],["member.*","run.started"]);const[fresh,setFresh]=useState2(null);const data=loaded.data;const read=data?.kind==="ok"?data:null;const members=read?.members??[];const baseSettings=read?.settings??null;const settings=fresh&&fresh.base===baseSettings?fresh.next:baseSettings;const order=memberOrder(members);const people=members.filter(m=>m.actor.kind!=="agent");const agents=members.filter(m=>m.actor.kind==="agent");const peers=agents.map(m=>m.actor.id);const manage=api&&settings?.canManage?{api,settings}:null;const settingsFailed=read?.settingsError!=null;const settingsDenied=settings!=null&&!settings.canManage;const person=id=>settings?.people.find(p=>p.userId===id);const done=next=>setFresh({base:baseSettings,next});const freshId=useFresh(ctx.project.id);const goList=()=>ctx.app.navigate({page:PAGE,params:params(ctx)});if(data===void 0){return jsxs2(Fragment,{children:[jsx2(SettingsHead,{title:"\u6210\u5458",desc:DESC}),loaded.error?jsxs2(SettingsReadError,{retry:loaded.reload,children:["\u6210\u5458\u6CA1\u8BFB\u51FA\u6765\uFF1A",loaded.error]}):jsx2(SettingsLoading,{text:"\u6B63\u5728\u8BFB\u53D6\u6210\u5458\u2026"})]})}if(data.kind==="forbidden"){return jsxs2(Fragment,{children:[jsx2(SettingsHead,{title:"\u6210\u5458",desc:DESC}),jsx2(SettingsNoAccess,{title:"\u6CA1\u6709\u6743\u9650\u770B\u8FD9\u4E2A\u9879\u76EE\u7684\u6210\u5458",children:"\u53EA\u6709\u9879\u76EE\u6210\u5458\u80FD\u770B\u3002\u8981\u770B\u7684\u8BDD\uFF0C\u8BF7\u8054\u7CFB\u9879\u76EE\u7BA1\u7406\u5458\u628A\u4F60\u52A0\u8FDB\u6765\u3002"})]})}if(item===NEW_ITEM){return jsxs2(Fragment,{children:[jsx2(SettingsHead,{title:"\u6DFB\u52A0\u6210\u5458",desc:DESC}),manage?jsx2(InviteForm,{api:manage.api,settings:manage.settings,onDone:next=>{const before=new Set(manage.settings.people.map(p=>p.userId));const added=next.people.find(p=>!before.has(p.userId));done(next);if(added)markFresh(ctx.project.id,added.userId);goList()},onCancel:goList}):settingsFailed?jsxs2(SettingsReadError,{retry:loaded.reload,children:["\u6210\u5458\u8BBE\u7F6E\u6CA1\u8BFB\u51FA\u6765\uFF1A",read?.settingsError]}):jsx2("p",{className:"band-sf-muted",children:"\u53EA\u6709\u9879\u76EE\u7BA1\u7406\u5458\u80FD\u52A0\u4EBA\u3002"})]})}if(item){const view=members.find(m=>m.actor.kind!=="agent"&&m.actor.id===item);const p=person(item);if(!view){return jsxs2(Fragment,{children:[jsx2(SettingsHead,{title:"\u6210\u5458"}),jsx2("p",{className:"band-sf-muted",children:"\u8FD9\u4E2A\u9879\u76EE\u91CC\u6CA1\u6709\u8FD9\u4E2A\u4EBA\uFF1B\u53EF\u80FD\u5DF2\u7ECF\u88AB\u79FB\u51FA\u3002"})]})}return jsxs2(Fragment,{children:[jsx2(SettingsHead,{title:view.displayName,desc:"\u7BA1\u7406\u5458\u80FD\u6539\u8FD9\u4E2A\u4EBA\u7684\u89D2\u8272\uFF1B\u521B\u5EFA\u4EBA\u7684\u7BA1\u7406\u89D2\u8272\u4E0D\u5728\u8FD9\u91CC\u6539\u3002"}),settingsFailed?jsxs2(SettingsReadError,{retry:loaded.reload,children:["\u6210\u5458\u8BBE\u7F6E\u6CA1\u8BFB\u51FA\u6765\uFF1A",read?.settingsError]}):settingsDenied?jsx2("p",{className:"band-sf-muted",children:"\u53EA\u6709\u9879\u76EE\u7BA1\u7406\u5458\u80FD\u6539\u3002"}):null,jsx2(SettingsFacts,{items:[{key:"\u540D\u5B57",value:view.displayName},{key:"\u7BA1\u7406\u89D2\u8272",value:p?MANAGEMENT_LABEL[p.role]:"\u6210\u5458"},{key:"\u4E1A\u52A1\u6807\u7B7E",value:settings&&p?tagText(settings,p):roleLabel(members,view.actor.id)||"\u6210\u5458"}]}),manage&&p?jsx2(SettingsSection,{title:"\u89D2\u8272",children:jsx2(EditPerson,{api:manage.api,settings:manage.settings,person:p,self:view.actor.id===ctx.member.id,onDone:done,onCancel:goList})}):null,manage&&p&&p.role!=="owner"?jsx2(SettingsDanger,{children:jsx2(SettingsDangerRow,{title:"\u79FB\u51FA\u9879\u76EE",note:`${view.displayName} \u4E0D\u518D\u80FD\u6253\u5F00\u8FD9\u4E2A\u9879\u76EE\uFF1B\u8FD9\u4E2A\u4EBA\u9009\u5230\u9879\u76EE\u4E0A\u7684\u914D\u7F6E\u81EA\u52A8\u6E05\u7A7A\uFF0C\u8BB0\u5BA1\u8BA1\u3002`,action:jsx2(RemoveButton,{ctx,api:manage.api,person:p,onDone:goList})})}):null]})}const addHref=href(ctx,NEW_ITEM);const addAction=manage||settingsFailed?jsx2("a",{className:"btn primary",href:addHref,onClick:e=>{if(e.metaKey||e.ctrlKey||e.shiftKey||e.altKey)return;e.preventDefault();ctx.app.navigate({page:PAGE,params:params(ctx,NEW_ITEM)})},children:"\u6DFB\u52A0\u6210\u5458"}):void 0;if(members.length===0){return jsxs2(Fragment,{children:[jsx2(SettingsHead,{title:"\u6210\u5458",desc:DESC}),settingsFailed?jsxs2(SettingsReadError,{retry:loaded.reload,children:["\u6210\u5458\u8BBE\u7F6E\u6CA1\u8BFB\u51FA\u6765\uFF1A",read?.settingsError]}):null,jsx2(SettingsEmpty,{action:addAction,children:"\u8FD9\u4E2A\u9879\u76EE\u8FD8\u6CA1\u6709\u6210\u5458\u3002"})]})}return jsxs2(Fragment,{children:[jsx2(SettingsHead,{title:"\u6210\u5458",desc:settingsDenied?DESC_READONLY:DESC,action:addAction}),settingsDenied?jsx2("p",{className:"band-sf-muted",children:"\u53EA\u6709\u9879\u76EE\u7BA1\u7406\u5458\u80FD\u52A0\u4EBA\u3001\u6539\u89D2\u8272\u3002"}):null,jsx2(ErrorNote2,{retry:loaded.reload,children:loaded.error?`\u6210\u5458\u6CA1\u8BFB\u51FA\u6765\uFF1A${loaded.error}`:read?.settingsError?`\u6210\u5458\u8BBE\u7F6E\u6CA1\u8BFB\u51FA\u6765\uFF1A${read.settingsError}`:null}),jsxs2(SettingsRows,{label:`\u6210\u5458 ${members.length}`,children:[people.map(m=>{const p=person(m.actor.id);return jsx2(SettingsRow,{title:m.displayName,meta:settings&&p?[`${MANAGEMENT_LABEL[p.role]} \xB7 ${tagText(settings,p)}`]:[roleLabel(members,m.actor.id)||"\u6210\u5458"],href:href(ctx,m.actor.id),isNew:m.actor.id===freshId,...settings||settingsFailed?{onOpen:()=>ctx.app.navigate({page:PAGE,params:params(ctx,m.actor.id)})}:{}},`human:${m.actor.id}`)}),agents.map(m=>jsx2(SettingsRow,{title:m.displayName,meta:[m.actor.id===ctx.project.agent?"\u9ED8\u8BA4 Agent":"Agent"]},`agent:${m.actor.id}`))]}),settingsDenied?null:jsx2(UsageNote,{ctx,members})]})}function RemoveButton({ctx,api,person,onDone}){const[open,setOpen]=useState2(false);const[busy,setBusy]=useState2(false);const[error,setError]=useState2("");const self=person.userId===ctx.member.id;const remove=async()=>{if(busy)return;setBusy(true);setError("");try{await api.remove(person.userId);onDone()}catch(e){setError(`\u6CA1\u79FB\u6210\uFF1A${e instanceof Error?e.message:String(e)}`)}finally{setBusy(false)}};return jsxs2(Fragment,{children:[jsx2("button",{type:"button",className:"btn danger",onClick:()=>setOpen(true),children:"\u79FB\u51FA\u9879\u76EE"}),open?jsxs2(SettingsDialog,{title:`\u628A${person.displayName}\u79FB\u51FA\u9879\u76EE\uFF1F`,onClose:()=>setOpen(false),actions:jsxs2(Fragment,{children:[jsx2("button",{type:"button",className:"btn",onClick:()=>setOpen(false),children:"\u53D6\u6D88"}),jsx2("button",{type:"button",className:"btn primary",disabled:busy,onClick:()=>void remove(),children:busy?"\u6B63\u5728\u79FB\u9664\u2026":"\u79FB\u51FA\u9879\u76EE"})]}),children:[jsxs2("ul",{children:[jsx2("li",{children:self?"\u4F60\u4E0D\u518D\u80FD\u6253\u5F00\u8FD9\u4E2A\u9879\u76EE\uFF0C\u8981\u522B\u7684\u7BA1\u7406\u5458\u518D\u52A0\u56DE\u6765":`${person.displayName} \u4E0D\u518D\u80FD\u6253\u5F00\u8FD9\u4E2A\u9879\u76EE`}),jsx2("li",{children:"\u8FD9\u4E2A\u4EBA\u9009\u5230\u9879\u76EE\u4E0A\u7684\u914D\u7F6E\u81EA\u52A8\u6E05\u7A7A\uFF0C\u8BB0\u5BA1\u8BA1"}),jsx2("li",{children:"\u5DF2\u6709\u7684\u8BC4\u8BBA\u4FDD\u7559\u7F72\u540D"})]}),error?jsx2(SettingsSaveState,{failed:error}):null]}):null]})}function tagText(settings,p){const label=r=>settings.roles.find(o=>o.name===r)?.label??r;return p.roles.map(label).join("\u3001")||"\u6210\u5458"}function UsageNote({ctx,members}){const usage=useCtxData(ctx,()=>ctx.members.usage(),[],["turn.delivered","turn.failed"]);const data=usage.data;if(!data)return null;const name=actor=>members.find(m=>m.actor.kind==="human"&&m.actor.id===actor)?.displayName??"\u5DF2\u79BB\u5F00\u7684\u6210\u5458";const money=costUsd=>costUsd===void 0?"\u2014":costUsd<.01?"\u4E0D\u5230 $0.01":`$${costUsd.toFixed(2)}`;const line=(key,label,sub,u)=>jsx2(SettingsRow,{title:label,meta:[sub],actions:jsxs2("span",{className:"band-members-cost",children:[u.turns," \u4E2A\u56DE\u5408 \xB7 ",money(u.costUsd)]})},key);return jsx2(SettingsSection,{title:"\u7528\u91CF",desc:"\u53EA\u505A\u8BB0\u5F55\uFF0C\u4E0D\u8BBE\u4E0A\u9650\u3002\u4E2D\u9014\u505C\u4E0B\u7684\u4E0D\u8BA1\u8D39\u7528\uFF0C\u53EA\u8BA1\u6B21\u6570\u3002",children:jsxs2(SettingsRows,{label:"\u7528\u91CF",children:[data.people.map(p=>line(p.actor,name(p.actor),"\u53D1\u8D77\u7684\u4FEE\u6539",p.usage)),line("auto","\u7CFB\u7EDF\u81EA\u52A8\u505A\u7684","\u7B2C\u4E00\u7248\u4EA7\u51FA\uFF0C\u6216\u4E0A\u4E00\u9636\u6BB5\u6709\u65B0\u5185\u5BB9\u65F6\u91CD\u505A",data.auto),line("totals","\u5408\u8BA1","\u5168\u90E8\u56DE\u5408",data.totals)]})})}export{MembersTab,src_default as default};
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kanyun-ai-infra/band-members",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.4",
|
|
4
4
|
"description": "成员与角色列表,区分人和 Agent",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
7
7
|
".": "./dist/index.js"
|
|
8
8
|
},
|
|
9
9
|
"peerDependencies": {
|
|
10
|
-
"@kanyun-ai-infra/band-plugin-sdk": "^1.
|
|
10
|
+
"@kanyun-ai-infra/band-plugin-sdk": "^1.222.0",
|
|
11
11
|
"react": "^18.3.1",
|
|
12
12
|
"react-dom": "^18.3.1",
|
|
13
13
|
"@kanyun-ai-infra/band-project": "*",
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import"../../chunks/chunk-JFPQMFKF.js";import{Avatar,ErrorNote,deletedProjectText,instrumentOf,memberName,memberOrder,memoryItem,parseMemoryItem,reactMount,useCtxData,useMembers,useRoute,withImeGuard}from"@kanyun-ai-infra/band-plugin-react";import{definePlugin,projectPath}from"@kanyun-ai-infra/band-plugin-sdk";import{useEffect,useId,useMemo,useRef,useState}from"react";import{MEMORY_INDEX,MEMORY_LIMITS,memoryProblem}from"@kanyun-ai-infra/band-contracts";import{jsx,jsxs}from"react/jsx-runtime";import{Fragment,jsx as jsx2,jsxs as jsxs2}from"react/jsx-runtime";if(typeof document!=="undefined"&&document.head){const css="/* src/memory.css */\n.band-memory {\n display: grid;\n gap: 14px;\n min-width: 0;\n}\n.band-memory-grid {\n display: grid;\n grid-template-columns: 220px minmax(0, 1fr);\n gap: 14px;\n align-items: start;\n}\n.band-memory-versions {\n list-style: none;\n margin: 0;\n padding: 0;\n display: grid;\n gap: 2px;\n}\n.band-memory-version {\n display: flex;\n gap: 8px;\n align-items: flex-start;\n width: 100%;\n border: 0;\n background: none;\n padding: 7px 10px;\n border-radius: var(--r);\n text-align: left;\n color: inherit;\n font: inherit;\n font-size: var(--fs-row);\n cursor: pointer;\n transition: background var(--sixteenth) var(--ease);\n}\n:where(.band-memory-version) .av {\n margin-top: 1px;\n}\n:where(.band-memory-version):hover {\n background: var(--fill);\n}\n:where(.band-memory-version)[aria-current=true] {\n background: var(--fill-2);\n}\n:where(.band-memory-version):focus-visible {\n outline: none;\n box-shadow: 0 0 0 2px var(--accent);\n}\n.band-memory-fname {\n display: grid;\n gap: 1px;\n min-width: 0;\n}\n.band-memory-fname > span:first-child {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.band-memory-fname > span + span {\n font-size: var(--fs-meta);\n color: var(--muted);\n}\n.band-memory-link {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n justify-self: start;\n border: 0;\n background: none;\n padding: 6px 10px;\n border-radius: var(--r);\n color: var(--muted);\n font: inherit;\n font-size: var(--fs-ui);\n cursor: pointer;\n}\n:where(.band-memory-link):hover:not(:disabled) {\n background: var(--fill);\n color: var(--ink);\n}\n:where(.band-memory-link):focus-visible {\n outline: none;\n box-shadow: 0 0 0 2px var(--accent);\n}\n.band-memory-link:where(:disabled) {\n color: var(--muted);\n opacity: 0.42;\n cursor: default;\n}\n.band-memory-link {\n padding: 2px 4px;\n margin-left: -4px;\n color: var(--accent-text);\n}\n.band-memory-hint {\n display: grid;\n gap: 4px;\n padding: 8px 10px;\n font-size: var(--fs-meta);\n line-height: 1.6;\n color: var(--muted);\n}\n.band-memory-hint code,\n.band-memory-edithead code,\n.band-memory-changehead code {\n font-family: var(--mono);\n font-size: var(--fs-meta);\n}\n.band-memory-over {\n color: var(--bad);\n}\n.band-memory-newform {\n display: grid;\n max-width: 560px;\n gap: 10px;\n}\n.band-memory-newfield {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n align-items: center;\n gap: 6px;\n font-family: var(--mono);\n font-size: var(--fs-dense);\n color: var(--muted);\n}\n.band-memory-newlabel {\n grid-column: 1 / -1;\n color: var(--ink);\n font-family: var(--font);\n font-size: var(--fs-ui);\n font-weight: 500;\n}\ninput.band-memory-newinput {\n font-family: var(--mono);\n font-size: var(--fs-dense);\n padding: 6px 8px;\n}\n.band-memory-newacts {\n display: flex;\n justify-content: flex-end;\n gap: 6px;\n}\n.band-memory-edit {\n display: grid;\n gap: 8px;\n min-width: 0;\n background: var(--panel);\n border-radius: var(--r-lg);\n box-shadow: var(--shadow-card);\n padding: 12px 14px;\n}\n.band-memory-edithead {\n display: flex;\n justify-content: space-between;\n align-items: baseline;\n gap: 12px;\n flex-wrap: wrap;\n font-size: var(--fs-dense);\n color: var(--muted);\n}\n.band-memory-edithead code,\n.band-memory-edithead b {\n color: var(--ink);\n font-weight: 500;\n}\ntextarea.band-memory-text {\n font-family: var(--mono);\n font-size: var(--fs-dense);\n line-height: 1.7;\n min-height: 220px;\n max-height: 60vh;\n}\ntextarea.band-memory-text[readonly],\ntextarea.band-memory-text[readonly]:hover,\ntextarea.band-memory-text[readonly]:focus {\n background: var(--sunk);\n color: var(--muted);\n}\ntextarea.band-memory-text[readonly]:focus {\n box-shadow: inset 0 0 0 1px var(--accent), 0 0 0 3px var(--accent-soft);\n}\n.band-memory-editfoot {\n display: flex;\n align-items: center;\n gap: 6px;\n flex-wrap: wrap;\n}\n.band-memory-spacer {\n flex: 1;\n}\n.band-memory-removed {\n display: grid;\n justify-items: start;\n gap: 6px;\n padding: 18px 14px;\n border-radius: var(--r);\n background: var(--bad-soft);\n font-size: var(--fs-row);\n}\n.band-memory-removed span {\n color: var(--muted);\n}\n.band-memory-err {\n font-size: var(--fs-dense);\n color: var(--bad);\n}\n.band-memory-note,\n.band-memory-notice {\n display: block;\n font-size: var(--fs-ui);\n color: var(--muted);\n}\n.band-memory-notice:where(.ok) {\n color: var(--ok);\n}\n.band-memory-notice:where(.bad) {\n color: var(--bad);\n}\n.band-memory-stale {\n display: grid;\n gap: 4px;\n padding: 12px 14px;\n border-radius: var(--r-lg);\n background: var(--warn-soft);\n font-size: var(--fs-row);\n}\n.band-memory-stale b {\n font-weight: 500;\n}\n.band-memory-stale span {\n color: var(--muted);\n}\n.band-memory-stale-acts {\n display: flex;\n gap: 6px;\n justify-content: flex-end;\n margin-top: 4px;\n}\n.band-memory-faint {\n font-size: var(--fs-dense);\n color: var(--muted);\n}\n.band-memory-history {\n display: grid;\n gap: 12px;\n}\n.band-memory-change {\n display: grid;\n gap: 6px;\n}\n.band-memory-changehead {\n display: flex;\n gap: 8px;\n align-items: baseline;\n font-size: var(--fs-dense);\n color: var(--muted);\n}\n.band-memory-changehead code {\n color: var(--ink);\n}\n.band-memory-diff {\n font-family: var(--mono);\n font-size: var(--fs-meta);\n line-height: 1.7;\n border-radius: var(--r);\n background: var(--sunk);\n padding: 6px 0;\n overflow-x: auto;\n}\n.band-memory-line {\n display: grid;\n grid-template-columns: 22px minmax(0, 1fr);\n padding-right: 10px;\n white-space: pre-wrap;\n word-break: break-word;\n}\n.band-memory-line > span:first-child {\n text-align: center;\n color: var(--muted);\n user-select: none;\n}\n.band-memory-line:where(.add) {\n background: var(--ok-soft);\n}\n.band-memory-line:where(.del) {\n background: var(--bad-soft);\n}\n.band-memory-line:where(.del) > span:last-child {\n text-decoration: line-through;\n text-decoration-color: color-mix(in srgb, var(--bad) 50%, transparent);\n}\n.band-memory-fold {\n padding: 2px 10px 2px 22px;\n color: var(--muted);\n}\n.band-memory-state {\n display: grid;\n justify-items: center;\n gap: 10px;\n padding: 56px 16px;\n text-align: center;\n}\n@media (max-width: 720px) {\n .band-memory-grid {\n grid-template-columns: minmax(0, 1fr);\n }\n textarea.band-memory-text {\n min-height: 260px;\n }\n}\n";let el=document.head.querySelector('style[data-band-style="@kanyun-ai-infra/band-memory"]');if(!el){el=document.createElement("style");el.setAttribute("data-band-style","@kanyun-ai-infra/band-memory");document.head.prepend(el)}el.textContent=css}function sortPaths(paths){return[...new Set(paths)].sort((a,b)=>a===MEMORY_INDEX?-1:b===MEMORY_INDEX?1:a.localeCompare(b))}function visiblePaths(files,drafts){return sortPaths([...files.map(f=>f.path),...drafts.keys()])}function isDirty(path,files,drafts){const d=drafts.get(path);if(!d)return false;const now=files.find(f=>f.path===path);if(d.removed)return now!==void 0;return now===void 0||now.content!==d.content}function dirtyPaths(files,drafts){return sortPaths([...drafts.keys()].filter(p=>isDirty(p,files,drafts)))}function saveInput(files,drafts){const out=[];const removed=[];for(const path of dirtyPaths(files,drafts)){const d=drafts.get(path);if(!d)continue;if(d.removed)removed.push(path);else out.push({path,content:d.content})}return{files:out,removed}}function mergedFiles(files,drafts){const next=new Map(files.map(f=>[f.path,f.content]));for(const[path,d]of drafts){if(d.removed)next.delete(path);else next.set(path,d.content)}return sortPaths(next.keys()).map(path=>({path,content:next.get(path)??""}))}function byteSize(files){const enc=new TextEncoder;return files.reduce((n,f)=>n+enc.encode(f.content).byteLength,0)}function usageText(files){const kb=byteSize(files)/1024;const shown=kb===0?"0":kb<.1?"0.1":kb.toFixed(1).replace(/\.0$/,"");return`${files.length} \u4E2A\u6587\u4EF6 \xB7 ${shown} KB / ${MEMORY_LIMITS.maxTotalBytes/1024} KB`}function fileName(input,taken){const base=input.trim().replace(/\.md$/i,"").toLowerCase().replace(/\s+/g,"-");if(!base)return{ok:false,message:"\u5199\u4E2A\u6587\u4EF6\u540D"};const path=base==="memory"?MEMORY_INDEX:`${base}.md`;if(!/^(MEMORY|[a-z0-9-]+)\.md$/.test(path)){return{ok:false,message:"\u6587\u4EF6\u540D\u53EA\u7528\u5C0F\u5199\u5B57\u6BCD\u3001\u6570\u5B57\u548C\u8FDE\u5B57\u7B26"}}if(taken.includes(path))return{ok:false,message:`\u5DF2\u7ECF\u6709 ${path} \u4E86`};return{ok:true,path}}function lastWriters(details,paths){const out=new Map;const sorted=[...details].sort((a,b)=>b.version.version-a.version.version);for(const d of sorted){for(const p of d.changed){if(paths.includes(p)&&!out.has(p))out.set(p,d.version)}}return out}function actionText(v){switch(v.action){case"turn":return"\u5728\u56DE\u5408\u91CC\u5199\u5165";case"edit":return"\u7F16\u8F91";case"revert":return`\u64A4\u56DE\u7B2C ${v.revertsVersion} \u7248\u7684\u6539\u52A8`;case"restore":return`\u6062\u590D\u5230\u7B2C ${v.revertsVersion} \u7248`}}var DIFF_MAX_LINES=800;function lineDiff(before,after){const a=splitLines(before);const b=splitLines(after);if(a.length*b.length>DIFF_MAX_LINES*DIFF_MAX_LINES){return[...a.map(text=>({kind:"del",text})),...b.map(text=>({kind:"add",text}))]}const n=a.length;const m=b.length;const lcs=Array.from({length:n+1},()=>new Uint16Array(m+1));for(let i2=n-1;i2>=0;i2--){const row=lcs[i2];const below=lcs[i2+1];for(let j2=m-1;j2>=0;j2--){row[j2]=a[i2]===b[j2]?(below[j2+1]??0)+1:Math.max(below[j2]??0,row[j2+1]??0)}}const out=[];let i=0;let j=0;while(i<n&&j<m){if(a[i]===b[j]){out.push({kind:"same",text:a[i]});i++;j++}else if((lcs[i+1]?.[j]??0)>=(lcs[i]?.[j+1]??0)){out.push({kind:"del",text:a[i++]})}else{out.push({kind:"add",text:b[j++]})}}while(i<n)out.push({kind:"del",text:a[i++]});while(j<m)out.push({kind:"add",text:b[j++]});return out}function splitLines(s){if(s===void 0||s==="")return[];return s.replace(/\n$/,"").split("\n")}function foldDiff(lines,context=2){const keep=lines.map(()=>false);lines.forEach((l,i2)=>{if(l.kind==="same")return;for(let k=Math.max(0,i2-context);k<=Math.min(lines.length-1,i2+context);k++){keep[k]=true}});const out=[];let i=0;while(i<lines.length){if(keep[i]){const run=[];while(i<lines.length&&keep[i])run.push(lines[i++]);out.push({kind:"lines",lines:run})}else{let count=0;while(i<lines.length&&!keep[i]){count++;i++}out.push({kind:"fold",count})}}return out}function overlapping(base,files,dirty){const now=new Map(files.map(f=>[f.path,f.content]));return dirty.filter(p=>base.get(p)!==now.get(p))}var pad=n=>String(n).padStart(2,"0");function stamp(iso){const t=new Date(iso);if(Number.isNaN(t.getTime()))return"";return`${pad(t.getMonth()+1)}-${pad(t.getDate())} ${pad(t.getHours())}:${pad(t.getMinutes())}`}function PageHead({title,desc,action}){return jsxs("div",{className:"band-sf-h",children:[jsxs("div",{children:[jsx("h1",{children:title}),desc?jsx("p",{children:desc}):null]}),action?jsx("div",{className:"band-sf-h-a",children:action}):null]})}function Rows({label,children}){return jsx("ul",{className:"band-sf-rows","aria-label":label,children})}function Row({title,meta,href:href2,onOpen,mono=false}){return jsxs("li",{className:"band-sf-row",children:[jsx("div",{className:"band-sf-row-t",children:jsx("a",{className:"band-sf-row-link",href:href2??"#",onClick:e=>{if(e.metaKey||e.ctrlKey||e.shiftKey||e.altKey)return;e.preventDefault();onOpen()},children:jsx("b",{className:mono?"band-sf-mono":void 0,children:title})})}),jsx("div",{className:"band-sf-row-a",children:jsx("span",{className:"band-sf-chev","aria-hidden":"true",children:"\u203A"})}),meta&&meta.length>0?jsx("div",{className:"band-sf-row-m",children:meta.map((m,i)=>jsx("span",{children:m},i))}):null]})}function Loading({text}){return jsx("output",{className:"band-sf-load",children:jsxs("span",{className:"tuning",children:[jsxs("svg",{viewBox:"0 0 80 55","aria-hidden":"true",children:[jsx("line",{x1:"0",y1:"12",x2:"80",y2:"12"}),jsx("line",{x1:"0",y1:"22",x2:"80",y2:"22"}),jsx("line",{x1:"0",y1:"32",x2:"80",y2:"32"}),jsx("line",{x1:"0",y1:"42",x2:"80",y2:"42"}),jsx("line",{x1:"0",y1:"52",x2:"80",y2:"52"}),jsx("circle",{cx:"20",cy:"37",r:"4.6",fill:"var(--ink)"}),jsx("circle",{cx:"40",cy:"27",r:"4.6",fill:"var(--accent)"}),jsx("circle",{cx:"60",cy:"17",r:"4.6",fill:"var(--ink)"})]}),jsx("span",{children:text})]})})}function Empty({children,action}){return jsxs("div",{className:"band-sf-empty rest",children:[jsx("i",{}),jsx("p",{children}),action??null]})}var PAGE="@kanyun-ai-infra/band-settings/settings";var SECTION="memory";var DESC="Agent \u5728\u8FD9\u4E2A\u9879\u76EE\u91CC\u8BB0\u4E0B\u7684\u6587\u4EF6\u3002\u53EF\u4EE5\u6539\u3001\u770B\u5386\u53F2\u3001\u64A4\u56DE\u3002";var NEW_ITEM="new";var src_default=definePlugin({surfaces:{tab:reactMount(ctx=>jsx2(MemoryTab,{ctx}))}});function params(ctx,item){return{project:ctx.project.id,...ctx.project.workshop?{workshop:ctx.project.workshop}:{},tab:SECTION,...item?{item}:{}}}function href(ctx,item){return projectPath(ctx.project,"settings",...item?[SECTION,item]:[SECTION])}var DIR=".agent/memory/";var WRITER_LOOKBACK=30;var WRITER_BATCH=6;var UPDATED="memory.updated";function MemoryTab({ctx}){if(!ctx.memory){return jsxs2(Fragment,{children:[jsx2(PageHead,{title:"\u8BB0\u5FC6",desc:DESC}),jsxs2("section",{className:"band-settings-no-access","aria-label":"\u73AF\u5883\u6CA1\u5F00\u901A",children:[jsx2("h2",{children:"\u8FD9\u4E2A\u90E8\u7F72\u6CA1\u6709\u5F00\u9879\u76EE\u8BB0\u5FC6"}),jsx2("p",{children:"\u8981\u7528\u7684\u8BDD\uFF0C\u8BF7\u8054\u7CFB Band \u7BA1\u7406\u5458\u3002"})]})]})}if(ctx.project.deleted){return jsxs2(Fragment,{children:[jsx2(PageHead,{title:"\u8BB0\u5FC6",desc:DESC}),jsxs2("section",{className:"band-settings-no-access","aria-label":"\u9879\u76EE\u5DF2\u5220\u9664",children:[jsx2("h2",{children:deletedProjectText(ctx.project.deleted)}),jsx2("p",{children:"\u8BB0\u5FC6\u8DDF\u7740\u9879\u76EE\u4E00\u8D77\u505C\u7528\u4E86\uFF0C\u6062\u590D\u540E\u624D\u80FD\u770B\u8BB0\u5FC6\u3002"})]})]})}if(!ctx.project.canReadThreads){return jsxs2(Fragment,{children:[jsx2(PageHead,{title:"\u8BB0\u5FC6",desc:DESC}),jsxs2("section",{className:"band-settings-no-access","aria-label":"\u6CA1\u6709\u6743\u9650",children:[jsx2("h2",{children:"\u770B\u4E0D\u5230\u8FD9\u4E2A\u9879\u76EE\u7684\u8BB0\u5FC6"}),jsx2("p",{children:"\u8BB0\u5FC6\u662F\u4ECE\u610F\u89C1\u548C\u56DE\u5408\u91CC\u6512\u51FA\u6765\u7684\uFF0C\u80FD\u8BFB\u610F\u89C1\u7684\u4EBA\u624D\u80FD\u770B\u3002"})]})]})}return jsx2(Memory,{ctx,api:ctx.memory})}function Rest({title,children}){return jsxs2("div",{className:"band-memory-state rest",children:[jsx2("i",{}),jsx2("b",{children:title}),children&&jsx2("span",{children})]})}function authorName(members,v){return memberName(members,v.author.id)}var KEPT_PREFIX="band-memory:draft:";function readKept(projectId){try{const raw=globalThis.sessionStorage?.getItem(KEPT_PREFIX+projectId);if(raw){const j=JSON.parse(raw);return{drafts:new Map(j.drafts),base:j.base?{version:j.base.version,files:new Map(j.base.files)}:null}}}catch{}return{drafts:new Map,base:null}}function writeKept(projectId,k){try{if(k.drafts.size===0&&!k.base){globalThis.sessionStorage?.removeItem(KEPT_PREFIX+projectId);return}globalThis.sessionStorage?.setItem(KEPT_PREFIX+projectId,JSON.stringify({drafts:[...k.drafts],base:k.base?{version:k.base.version,files:[...k.base.files]}:null}))}catch{}}function useKept(projectId){const[k,setK]=useState(()=>readKept(projectId));const update=f=>setK(cur=>{const next=f(cur);writeKept(projectId,next);return next});return[k,update]}function Memory({ctx,api}){const members=useMembers(ctx);const route=useRoute(ctx);const item=route.params.item;const linked=parseMemoryItem(item);const creating=item===NEW_ITEM;const opened=!creating&&item!==void 0&&linked===null?item:null;const snap=useCtxData(ctx,()=>api.current(),[api],UPDATED);const versions=useCtxData(ctx,()=>api.versions(),[api],UPDATED);const[{drafts,base},updateKept]=useKept(ctx.project.id);const setDrafts=next=>updateKept(k=>({...k,drafts:typeof next==="function"?next(k.drafts):next}));const setBase=next=>updateKept(k=>({...k,base:next}));const[notice,setNotice]=useState(null);const[lockedOut,setLockedOut]=useState(false);const[busy,setBusy]=useState(false);const member=ctx.project.access==="member";const readOnly=!member||lockedOut;const files=snap.data?.files??NO_FILES;const paths=visiblePaths(files,drafts);const dirty=dirtyPaths(files,drafts);const merged=mergedFiles(files,drafts);const problem=dirty.length>0?memoryProblem(merged):null;const stale=base!==null&&dirty.length>0&&(snap.data?.version??0)>base.version;const clashes=stale&&base?overlapping(base.files,files,dirty):[];const currentPaths=files.map(f=>f.path).join("\n");const writers=useCtxData(ctx,async()=>{const list=(await api.versions()).slice(0,WRITER_LOOKBACK);const want=currentPaths?currentPaths.split("\n"):[];const found=[];const left=new Set(want);for(let i=0;i<list.length&&left.size>0;i+=WRITER_BATCH){const batch=list.slice(i,i+WRITER_BATCH);const details=await Promise.all(batch.map(v=>api.version(v.version)));details.forEach((d,j)=>{const v=batch[j];if(!v)return;const changed=d.changes.map(c=>c.path);for(const p of changed)left.delete(p);found.push({version:v,changed})})}return lastWriters(found,want)},[api,currentPaths],UPDATED,{keepPrevious:true});const hasDirty=dirty.length>0;const loaded=Boolean(snap.data);const hasBase=base!==null;useEffect(()=>{if(loaded&&!hasDirty&&hasBase)updateKept(k=>({...k,base:null}))});useEffect(()=>{if(!hasDirty)return;const warn=e=>{e.preventDefault()};window.addEventListener("beforeunload",warn);return()=>window.removeEventListener("beforeunload",warn)},[hasDirty]);useEffect(()=>{if(notice?.tone!=="ok")return;const t=setTimeout(()=>setNotice(null),4e3);return()=>clearTimeout(t)},[notice]);const startBase=()=>{if(base||!snap.data)return;setBase({version:snap.data.version,files:new Map(files.map(f=>[f.path,f.content]))})};const edit=(path,next)=>{startBase();setNotice(null);setDrafts(m=>{const out=new Map(m);if(next)out.set(path,next);else out.delete(path);return out})};const goList=()=>ctx.app.navigate({page:PAGE,params:params(ctx)});const goFile=path=>ctx.app.navigate({page:PAGE,params:params(ctx,path)});const goHistory=version=>ctx.app.navigate({page:PAGE,params:params(ctx,memoryItem(version??versions.data?.[0]?.version??1))});const newFile=path=>{edit(path,{content:`# ${path.replace(/\.md$/,"")}
|
|
1
|
+
import"../../chunks/chunk-JFPQMFKF.js";import{Avatar,ErrorNote,SettingsActions,SettingsField,SettingsForm,SettingsNoAccess,deletedProjectText,instrumentOf,memberName,memberOrder,memoryItem,parseMemoryItem,reactMount,useCtxData,useMembers,useRoute,withImeGuard}from"@kanyun-ai-infra/band-plugin-react";import{definePlugin,projectPath}from"@kanyun-ai-infra/band-plugin-sdk";import{useEffect,useId,useMemo,useRef,useState}from"react";import{MEMORY_INDEX,MEMORY_LIMITS,memoryProblem}from"@kanyun-ai-infra/band-contracts";import{SettingsEmpty,SettingsHead,SettingsLoading,SettingsRow,SettingsRows}from"@kanyun-ai-infra/band-plugin-react";import{Fragment,jsx,jsxs}from"react/jsx-runtime";if(typeof document!=="undefined"&&document.head){const css="/* src/memory.css */\n.band-memory {\n display: grid;\n gap: 14px;\n min-width: 0;\n}\n.band-memory-grid {\n display: grid;\n grid-template-columns: 220px minmax(0, 1fr);\n gap: 14px;\n align-items: start;\n}\n.band-memory-versions {\n list-style: none;\n margin: 0;\n padding: 0;\n display: grid;\n gap: 2px;\n}\n.band-memory-version {\n display: flex;\n gap: 8px;\n align-items: flex-start;\n width: 100%;\n border: 0;\n background: none;\n padding: 7px 10px;\n border-radius: var(--r);\n text-align: left;\n color: inherit;\n font: inherit;\n font-size: var(--fs-row);\n cursor: pointer;\n transition: background var(--sixteenth) var(--ease);\n}\n:where(.band-memory-version) .av {\n margin-top: 1px;\n}\n:where(.band-memory-version):hover {\n background: var(--fill);\n}\n:where(.band-memory-version)[aria-current=true] {\n background: var(--fill-2);\n}\n:where(.band-memory-version):focus-visible {\n outline: none;\n box-shadow: 0 0 0 2px var(--accent);\n}\n.band-memory-fname {\n display: grid;\n gap: 1px;\n min-width: 0;\n}\n.band-memory-fname > span:first-child {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.band-memory-fname > span + span {\n font-size: var(--fs-meta);\n color: var(--muted);\n}\n.band-memory-link {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n justify-self: start;\n border: 0;\n background: none;\n padding: 6px 10px;\n border-radius: var(--r);\n color: var(--muted);\n font: inherit;\n font-size: var(--fs-ui);\n cursor: pointer;\n}\n:where(.band-memory-link):hover:not(:disabled) {\n background: var(--fill);\n color: var(--ink);\n}\n:where(.band-memory-link):focus-visible {\n outline: none;\n box-shadow: 0 0 0 2px var(--accent);\n}\n.band-memory-link:where(:disabled) {\n color: var(--muted);\n opacity: 0.42;\n cursor: default;\n}\n.band-memory-link {\n padding: 2px 4px;\n margin-left: -4px;\n color: var(--accent-text);\n}\n.band-memory-hint {\n display: grid;\n gap: 4px;\n padding: 8px 10px;\n font-size: var(--fs-meta);\n line-height: 1.6;\n color: var(--muted);\n}\n.band-memory-hint code,\n.band-memory-edithead code,\n.band-memory-changehead code {\n font-family: var(--mono);\n font-size: var(--fs-meta);\n}\n.band-memory-over {\n color: var(--bad);\n}\ninput.band-memory-newinput {\n font-family: var(--mono);\n font-size: var(--fs-dense);\n}\n.band-memory-edit {\n display: grid;\n gap: 8px;\n min-width: 0;\n background: var(--panel);\n border-radius: var(--r-lg);\n box-shadow: var(--shadow-card);\n padding: 12px 14px;\n}\n.band-memory-edithead {\n display: flex;\n justify-content: space-between;\n align-items: baseline;\n gap: 12px;\n flex-wrap: wrap;\n font-size: var(--fs-dense);\n color: var(--muted);\n}\n.band-memory-edithead code,\n.band-memory-edithead b {\n color: var(--ink);\n font-weight: 500;\n}\ntextarea.band-memory-text {\n font-family: var(--mono);\n font-size: var(--fs-dense);\n line-height: 1.7;\n min-height: 220px;\n max-height: 60vh;\n}\ntextarea.band-memory-text[readonly],\ntextarea.band-memory-text[readonly]:hover,\ntextarea.band-memory-text[readonly]:focus {\n background: var(--sunk);\n color: var(--muted);\n}\ntextarea.band-memory-text[readonly]:focus {\n box-shadow: inset 0 0 0 1px var(--accent), 0 0 0 3px var(--accent-soft);\n}\n.band-memory-editfoot {\n display: flex;\n align-items: center;\n gap: 6px;\n flex-wrap: wrap;\n}\n.band-memory-spacer {\n flex: 1;\n}\n.band-memory-removed {\n display: grid;\n justify-items: start;\n gap: 6px;\n padding: 18px 14px;\n border-radius: var(--r);\n background: var(--bad-soft);\n font-size: var(--fs-row);\n}\n.band-memory-removed span {\n color: var(--muted);\n}\n.band-memory-err {\n font-size: var(--fs-dense);\n color: var(--bad);\n}\n.band-memory-note,\n.band-memory-notice {\n display: block;\n font-size: var(--fs-ui);\n color: var(--muted);\n}\n.band-memory-notice:where(.ok) {\n color: var(--ok);\n}\n.band-memory-notice:where(.bad) {\n color: var(--bad);\n}\n.band-memory-stale {\n display: grid;\n gap: 4px;\n padding: 12px 14px;\n border-radius: var(--r-lg);\n background: var(--warn-soft);\n font-size: var(--fs-row);\n}\n.band-memory-stale b {\n font-weight: 500;\n}\n.band-memory-stale span {\n color: var(--muted);\n}\n.band-memory-stale-acts {\n display: flex;\n gap: 6px;\n justify-content: flex-end;\n margin-top: 4px;\n}\n.band-memory-faint {\n font-size: var(--fs-dense);\n color: var(--muted);\n}\n.band-memory-history {\n display: grid;\n gap: 12px;\n}\n.band-memory-change {\n display: grid;\n gap: 6px;\n}\n.band-memory-changehead {\n display: flex;\n gap: 8px;\n align-items: baseline;\n font-size: var(--fs-dense);\n color: var(--muted);\n}\n.band-memory-changehead code {\n color: var(--ink);\n}\n.band-memory-diff {\n font-family: var(--mono);\n font-size: var(--fs-meta);\n line-height: 1.7;\n border-radius: var(--r);\n background: var(--sunk);\n padding: 6px 0;\n overflow-x: auto;\n}\n.band-memory-line {\n display: grid;\n grid-template-columns: 22px minmax(0, 1fr);\n padding-right: 10px;\n white-space: pre-wrap;\n word-break: break-word;\n}\n.band-memory-line > span:first-child {\n text-align: center;\n color: var(--muted);\n user-select: none;\n}\n.band-memory-line:where(.add) {\n background: var(--ok-soft);\n}\n.band-memory-line:where(.del) {\n background: var(--bad-soft);\n}\n.band-memory-line:where(.del) > span:last-child {\n text-decoration: line-through;\n text-decoration-color: color-mix(in srgb, var(--bad) 50%, transparent);\n}\n.band-memory-fold {\n padding: 2px 10px 2px 22px;\n color: var(--muted);\n}\n.band-memory-state {\n display: grid;\n justify-items: center;\n gap: 10px;\n padding: 56px 16px;\n text-align: center;\n}\n@media (max-width: 720px) {\n .band-memory-grid {\n grid-template-columns: minmax(0, 1fr);\n }\n textarea.band-memory-text {\n min-height: 260px;\n }\n}\n";let el=document.head.querySelector('style[data-band-style="@kanyun-ai-infra/band-memory"]');if(!el){el=document.createElement("style");el.setAttribute("data-band-style","@kanyun-ai-infra/band-memory");document.head.prepend(el)}el.textContent=css}function sortPaths(paths){return[...new Set(paths)].sort((a,b)=>a===MEMORY_INDEX?-1:b===MEMORY_INDEX?1:a.localeCompare(b))}function visiblePaths(files,drafts){return sortPaths([...files.map(f=>f.path),...drafts.keys()])}function isDirty(path,files,drafts){const d=drafts.get(path);if(!d)return false;const now=files.find(f=>f.path===path);if(d.removed)return now!==void 0;return now===void 0||now.content!==d.content}function dirtyPaths(files,drafts){return sortPaths([...drafts.keys()].filter(p=>isDirty(p,files,drafts)))}function saveInput(files,drafts){const out=[];const removed=[];for(const path of dirtyPaths(files,drafts)){const d=drafts.get(path);if(!d)continue;if(d.removed)removed.push(path);else out.push({path,content:d.content})}return{files:out,removed}}function mergedFiles(files,drafts){const next=new Map(files.map(f=>[f.path,f.content]));for(const[path,d]of drafts){if(d.removed)next.delete(path);else next.set(path,d.content)}return sortPaths(next.keys()).map(path=>({path,content:next.get(path)??""}))}function byteSize(files){const enc=new TextEncoder;return files.reduce((n,f)=>n+enc.encode(f.content).byteLength,0)}function usageText(files){const kb=byteSize(files)/1024;const shown=kb===0?"0":kb<.1?"0.1":kb.toFixed(1).replace(/\.0$/,"");return`${files.length} \u4E2A\u6587\u4EF6 \xB7 ${shown} KB / ${MEMORY_LIMITS.maxTotalBytes/1024} KB`}function fileName(input,taken){const base=input.trim().replace(/\.md$/i,"").toLowerCase().replace(/\s+/g,"-");if(!base)return{ok:false,message:"\u5199\u4E2A\u6587\u4EF6\u540D"};const path=base==="memory"?MEMORY_INDEX:`${base}.md`;if(!/^(MEMORY|[a-z0-9-]+)\.md$/.test(path)){return{ok:false,message:"\u6587\u4EF6\u540D\u53EA\u7528\u5C0F\u5199\u5B57\u6BCD\u3001\u6570\u5B57\u548C\u8FDE\u5B57\u7B26"}}if(taken.includes(path))return{ok:false,message:`\u5DF2\u7ECF\u6709 ${path} \u4E86`};return{ok:true,path}}function lastWriters(details,paths){const out=new Map;const sorted=[...details].sort((a,b)=>b.version.version-a.version.version);for(const d of sorted){for(const p of d.changed){if(paths.includes(p)&&!out.has(p))out.set(p,d.version)}}return out}function actionText(v){switch(v.action){case"turn":return"\u5728\u56DE\u5408\u91CC\u5199\u5165";case"edit":return"\u7F16\u8F91";case"revert":return`\u64A4\u56DE\u7B2C ${v.revertsVersion} \u7248\u7684\u6539\u52A8`;case"restore":return`\u6062\u590D\u5230\u7B2C ${v.revertsVersion} \u7248`}}var DIFF_MAX_LINES=800;function lineDiff(before,after){const a=splitLines(before);const b=splitLines(after);if(a.length*b.length>DIFF_MAX_LINES*DIFF_MAX_LINES){return[...a.map(text=>({kind:"del",text})),...b.map(text=>({kind:"add",text}))]}const n=a.length;const m=b.length;const lcs=Array.from({length:n+1},()=>new Uint16Array(m+1));for(let i2=n-1;i2>=0;i2--){const row=lcs[i2];const below=lcs[i2+1];for(let j2=m-1;j2>=0;j2--){row[j2]=a[i2]===b[j2]?(below[j2+1]??0)+1:Math.max(below[j2]??0,row[j2+1]??0)}}const out=[];let i=0;let j=0;while(i<n&&j<m){if(a[i]===b[j]){out.push({kind:"same",text:a[i]});i++;j++}else if((lcs[i+1]?.[j]??0)>=(lcs[i]?.[j+1]??0)){out.push({kind:"del",text:a[i++]})}else{out.push({kind:"add",text:b[j++]})}}while(i<n)out.push({kind:"del",text:a[i++]});while(j<m)out.push({kind:"add",text:b[j++]});return out}function splitLines(s){if(s===void 0||s==="")return[];return s.replace(/\n$/,"").split("\n")}function foldDiff(lines,context=2){const keep=lines.map(()=>false);lines.forEach((l,i2)=>{if(l.kind==="same")return;for(let k=Math.max(0,i2-context);k<=Math.min(lines.length-1,i2+context);k++){keep[k]=true}});const out=[];let i=0;while(i<lines.length){if(keep[i]){const run=[];while(i<lines.length&&keep[i])run.push(lines[i++]);out.push({kind:"lines",lines:run})}else{let count=0;while(i<lines.length&&!keep[i]){count++;i++}out.push({kind:"fold",count})}}return out}function overlapping(base,files,dirty){const now=new Map(files.map(f=>[f.path,f.content]));return dirty.filter(p=>base.get(p)!==now.get(p))}var pad=n=>String(n).padStart(2,"0");function stamp(iso){const t=new Date(iso);if(Number.isNaN(t.getTime()))return"";return`${pad(t.getMonth()+1)}-${pad(t.getDate())} ${pad(t.getHours())}:${pad(t.getMinutes())}`}var PAGE="@kanyun-ai-infra/band-settings/settings";var SECTION="memory";var DESC="Agent \u5728\u8FD9\u4E2A\u9879\u76EE\u91CC\u8BB0\u4E0B\u7684\u6587\u4EF6\u3002\u53EF\u4EE5\u6539\u3001\u770B\u5386\u53F2\u3001\u64A4\u56DE\u3002";var NEW_ITEM="new";var src_default=definePlugin({surfaces:{tab:reactMount(ctx=>jsx(MemoryTab,{ctx}))}});function params(ctx,item){return{project:ctx.project.id,...ctx.project.workshop?{workshop:ctx.project.workshop}:{},tab:SECTION,...item?{item}:{}}}function href(ctx,item){return projectPath(ctx.project,"settings",...item?[SECTION,item]:[SECTION])}var DIR=".agent/memory/";var WRITER_LOOKBACK=30;var WRITER_BATCH=6;var UPDATED="memory.updated";function MemoryTab({ctx}){if(!ctx.memory){return jsxs(Fragment,{children:[jsx(SettingsHead,{title:"\u8BB0\u5FC6",desc:DESC}),jsx(SettingsNoAccess,{title:"\u8FD9\u4E2A\u90E8\u7F72\u6CA1\u6709\u5F00\u9879\u76EE\u8BB0\u5FC6",children:"\u8981\u7528\u7684\u8BDD\uFF0C\u8BF7\u8054\u7CFB Band \u7BA1\u7406\u5458\u3002"})]})}if(ctx.project.deleted){return jsxs(Fragment,{children:[jsx(SettingsHead,{title:"\u8BB0\u5FC6",desc:DESC}),jsx(SettingsNoAccess,{title:deletedProjectText(ctx.project.deleted),children:"\u8BB0\u5FC6\u8DDF\u7740\u9879\u76EE\u4E00\u8D77\u505C\u7528\u4E86\uFF0C\u6062\u590D\u540E\u624D\u80FD\u770B\u8BB0\u5FC6\u3002"})]})}if(!ctx.project.canReadThreads){return jsxs(Fragment,{children:[jsx(SettingsHead,{title:"\u8BB0\u5FC6",desc:DESC}),jsx(SettingsNoAccess,{title:"\u770B\u4E0D\u5230\u8FD9\u4E2A\u9879\u76EE\u7684\u8BB0\u5FC6",children:"\u8BB0\u5FC6\u662F\u4ECE\u610F\u89C1\u548C\u56DE\u5408\u91CC\u6512\u51FA\u6765\u7684\uFF0C\u80FD\u8BFB\u610F\u89C1\u7684\u4EBA\u624D\u80FD\u770B\u3002"})]})}return jsx(Memory,{ctx,api:ctx.memory})}function Rest({title,children}){return jsxs("div",{className:"band-memory-state rest",children:[jsx("i",{}),jsx("b",{children:title}),children&&jsx("span",{children})]})}function authorName(members,v){return memberName(members,v.author.id)}var KEPT_PREFIX="band-memory:draft:";function readKept(projectId){try{const raw=globalThis.sessionStorage?.getItem(KEPT_PREFIX+projectId);if(raw){const j=JSON.parse(raw);return{drafts:new Map(j.drafts),base:j.base?{version:j.base.version,files:new Map(j.base.files)}:null}}}catch{}return{drafts:new Map,base:null}}function writeKept(projectId,k){try{if(k.drafts.size===0&&!k.base){globalThis.sessionStorage?.removeItem(KEPT_PREFIX+projectId);return}globalThis.sessionStorage?.setItem(KEPT_PREFIX+projectId,JSON.stringify({drafts:[...k.drafts],base:k.base?{version:k.base.version,files:[...k.base.files]}:null}))}catch{}}function useKept(projectId){const[k,setK]=useState(()=>readKept(projectId));const update=f=>setK(cur=>{const next=f(cur);writeKept(projectId,next);return next});return[k,update]}function Memory({ctx,api}){const members=useMembers(ctx);const route=useRoute(ctx);const item=route.params.item;const linked=parseMemoryItem(item);const creating=item===NEW_ITEM;const opened=!creating&&item!==void 0&&linked===null?item:null;const snap=useCtxData(ctx,()=>api.current(),[api],UPDATED);const versions=useCtxData(ctx,()=>api.versions(),[api],UPDATED);const[{drafts,base},updateKept]=useKept(ctx.project.id);const setDrafts=next=>updateKept(k=>({...k,drafts:typeof next==="function"?next(k.drafts):next}));const setBase=next=>updateKept(k=>({...k,base:next}));const[notice,setNotice]=useState(null);const[lockedOut,setLockedOut]=useState(false);const[busy,setBusy]=useState(false);const member=ctx.project.access==="member";const readOnly=!member||lockedOut;const files=snap.data?.files??NO_FILES;const paths=visiblePaths(files,drafts);const dirty=dirtyPaths(files,drafts);const merged=mergedFiles(files,drafts);const problem=dirty.length>0?memoryProblem(merged):null;const stale=base!==null&&dirty.length>0&&(snap.data?.version??0)>base.version;const clashes=stale&&base?overlapping(base.files,files,dirty):[];const currentPaths=files.map(f=>f.path).join("\n");const writers=useCtxData(ctx,async()=>{const list=(await api.versions()).slice(0,WRITER_LOOKBACK);const want=currentPaths?currentPaths.split("\n"):[];const found=[];const left=new Set(want);for(let i=0;i<list.length&&left.size>0;i+=WRITER_BATCH){const batch=list.slice(i,i+WRITER_BATCH);const details=await Promise.all(batch.map(v=>api.version(v.version)));details.forEach((d,j)=>{const v=batch[j];if(!v)return;const changed=d.changes.map(c=>c.path);for(const p of changed)left.delete(p);found.push({version:v,changed})})}return lastWriters(found,want)},[api,currentPaths],UPDATED,{keepPrevious:true});const hasDirty=dirty.length>0;const loaded=Boolean(snap.data);const hasBase=base!==null;useEffect(()=>{if(loaded&&!hasDirty&&hasBase)updateKept(k=>({...k,base:null}))});useEffect(()=>{if(!hasDirty)return;const warn=e=>{e.preventDefault()};window.addEventListener("beforeunload",warn);return()=>window.removeEventListener("beforeunload",warn)},[hasDirty]);useEffect(()=>{if(notice?.tone!=="ok")return;const t=setTimeout(()=>setNotice(null),4e3);return()=>clearTimeout(t)},[notice]);const startBase=()=>{if(base||!snap.data)return;setBase({version:snap.data.version,files:new Map(files.map(f=>[f.path,f.content]))})};const edit=(path,next)=>{startBase();setNotice(null);setDrafts(m=>{const out=new Map(m);if(next)out.set(path,next);else out.delete(path);return out})};const goList=()=>ctx.app.navigate({page:PAGE,params:params(ctx)});const goFile=path=>ctx.app.navigate({page:PAGE,params:params(ctx,path)});const goHistory=version=>ctx.app.navigate({page:PAGE,params:params(ctx,memoryItem(version??versions.data?.[0]?.version??1))});const newFile=path=>{edit(path,{content:`# ${path.replace(/\.md$/,"")}
|
|
2
2
|
|
|
3
|
-
`,created:true});goFile(path)};const settle=(r,ok)=>{snap.reload();versions.reload();if(r.ok){setNotice({tone:"ok",text:ok(r.version,r.unchanged)});return true}if(r.code==="CONFLICT"){setNotice({tone:"bad",text:`\u6CA1\u5B58\u4E0A\uFF1A\u8FD9\u671F\u95F4\u8BB0\u5FC6\u5DF2\u7ECF\u5230\u7B2C ${r.latestVersion} \u7248\u4E86\u3002\u4F60\u7684\u4FEE\u6539\u8FD8\u5728\uFF0C\u770B\u6E05\u4E0A\u9762\u7684\u63D0\u793A\u518D\u5B58\u3002`})}else if(r.code==="INVALID"){setNotice({tone:"bad",text:`\u6CA1\u5B58\u4E0A\uFF1A${r.message}`})}else{setLockedOut(true);setNotice({tone:"bad",text:"\u9879\u76EE\u5DF2\u5F52\u6863\u6216\u4F60\u5DF2\u4E0D\u662F\u6210\u5458\uFF0C\u8BB0\u5FC6\u73B0\u5728\u53EA\u8BFB\u3002"})}return false};const save=async path=>{if(!snap.data||busy||readOnly||dirty.length===0||problem)return;const removedNow=drafts.get(path)?.removed===true;setBusy(true);try{const r=await api.save({baseVersion:base?.version??snap.data.version,...saveInput(files,drafts)});if(settle(r,(v,unchanged)=>unchanged?"\u5185\u5BB9\u548C\u73B0\u5728\u4E00\u6837\uFF0C\u6CA1\u6709\u5B58\u65B0\u7248\u672C":`\u5DF2\u5B58\u4E3A\u7B2C ${v} \u7248`)){setDrafts(new Map);setBase(null);if(removedNow)goList()}}catch(e){setNotice({tone:"bad",text:`\u6CA1\u5B58\u4E0A\uFF1A${e instanceof Error?e.message:String(e)}`})}finally{setBusy(false)}};const act=async(kind,v)=>{if(busy||readOnly)return;setBusy(true);try{const r=kind==="revert"?await api.revert(v):await api.restore(v);settle(r,(nv,unchanged)=>unchanged?"\u5185\u5BB9\u548C\u73B0\u5728\u4E00\u6837\uFF0C\u6CA1\u6709\u5B58\u65B0\u7248\u672C":kind==="revert"?`\u5DF2\u64A4\u56DE\u7B2C ${v} \u7248\u7684\u6539\u52A8\uFF0C\u5B58\u4E3A\u7B2C ${nv} \u7248`:`\u5DF2\u6062\u590D\u5230\u7B2C ${v} \u7248\uFF0C\u5B58\u4E3A\u7B2C ${nv} \u7248`)}catch(e){setNotice({tone:"bad",text:`\u6CA1\u6210\u529F\uFF1A${e instanceof Error?e.message:String(e)}`})}finally{setBusy(false)}};const notes=jsxs2(Fragment,{children:[readOnly&&!lockedOut&&jsx2("output",{className:"band-memory-note",children:"\u8FD9\u4E2A\u9879\u76EE\u73B0\u5728\u53EA\u80FD\u67E5\u770B\uFF0C\u8BB0\u5FC6\u6539\u4E0D\u4E86\u3002"}),stale&&base&&snap.data&&jsxs2("div",{className:"band-memory-stale",role:"alert",children:[jsxs2("b",{children:["\u4F60\u6539\u7684\u65F6\u5019\uFF0C\u8BB0\u5FC6\u5B58\u5230\u4E86\u7B2C ",snap.data.version," \u7248",snap.data.latest?`\uFF08${authorName(members,snap.data.latest)}\uFF09`:"","\u3002"]}),jsx2("span",{children:clashes.length>0?`${clashes.join("\u3001")} \u5BF9\u65B9\u4E5F\u6539\u4E86\uFF0C\u5728\u6700\u65B0\u7248\u4E0A\u7EE7\u7EED\u4F1A\u7528\u4F60\u7684\u5185\u5BB9\u8986\u76D6\u5B83\u3002`:"\u4F60\u6539\u7684\u6587\u4EF6\u5BF9\u65B9\u6CA1\u52A8\uFF0C\u53EF\u4EE5\u5728\u6700\u65B0\u7248\u4E0A\u7EE7\u7EED\u3002"}),jsxs2("span",{className:"band-memory-stale-acts",children:[jsx2("button",{type:"button",className:"btn sm",onClick:()=>{setDrafts(new Map);setBase(null);setNotice(null)},children:"\u4E22\u6389\u6211\u7684\u4FEE\u6539"}),jsx2("button",{type:"button",className:"btn primary sm",onClick:()=>{setBase({version:snap.data?.version??0,files:new Map(files.map(f=>[f.path,f.content]))});setNotice(null)},children:"\u5728\u6700\u65B0\u7248\u4E0A\u7EE7\u7EED"})]})]}),notice&&jsx2("output",{className:`band-memory-notice ${notice.tone}`,"aria-live":"polite",children:notice.text})]});if(!snap.data){return jsxs2(Fragment,{children:[jsx2(PageHead,{title:"\u8BB0\u5FC6",desc:DESC}),snap.error?jsxs2(ErrorNote,{retry:snap.reload,children:["\u8BB0\u5FC6\u6CA1\u53D6\u5230\uFF1A",snap.error]}):jsx2(Loading,{text:"\u6B63\u5728\u8BFB\u53D6\u9879\u76EE\u8BB0\u5FC6\u2026"})]})}if(linked!==null){return jsxs2(Fragment,{children:[jsx2(PageHead,{title:"\u8BB0\u5FC6\u7684\u5386\u53F2",desc:"\u6BCF\u5B58\u4E00\u6B21\u662F\u4E00\u7248\uFF1B\u64A4\u56DE\u548C\u6062\u590D\u90FD\u4F1A\u5B58\u6210\u65B0\u7684\u4E00\u7248\u3002"}),notes,jsx2(History,{api,ctx,members,versions:versions.data,error:versions.error,reload:versions.reload,initial:linked,canWrite:!readOnly,busy,onAct:act})]})}if(creating){return jsxs2(Fragment,{children:[jsx2(PageHead,{title:"\u65B0\u5EFA\u6587\u4EF6",desc:"\u53EA\u586B\u540D\u5B57\uFF1B\u5EFA\u597D\u540E\u5728\u8FD9\u4E2A\u6587\u4EF6\u91CC\u5199\u5185\u5BB9\u3002"}),readOnly?jsx2("p",{className:"band-sf-muted",children:lockedOut?"\u9879\u76EE\u5DF2\u5F52\u6863\u6216\u4F60\u5DF2\u4E0D\u662F\u6210\u5458\uFF0C\u8BB0\u5FC6\u53EA\u8BFB\u3002":"\u53EA\u6709\u9879\u76EE\u6210\u5458\u80FD\u65B0\u5EFA\u8BB0\u5FC6\u6587\u4EF6\u3002"}):jsx2(NewFile,{taken:paths,onCreate:newFile,onCancel:goList})]})}if(opened!==null){const draft=drafts.get(opened);const file=files.find(f=>f.path===opened);if(!draft&&!file){return jsxs2(Fragment,{children:[jsx2(PageHead,{title:opened,desc:`\u4F4D\u7F6E ${DIR} \xB7 \u9879\u76EE\u91CC\u7684 Agent \u5171\u7528`}),jsx2("p",{className:"band-sf-muted",children:"\u8FD9\u4E2A\u6587\u4EF6\u4E0D\u5728\u4E86\uFF1B\u53EF\u80FD\u5DF2\u7ECF\u88AB\u5220\u6389\u3002\u56DE\u5230\u5217\u8868\u770B\u73B0\u5728\u7684\u6587\u4EF6\u3002"})]})}const value=draft&&!draft.removed?draft.content:file?.content??"";const writer=writers.data?.get(opened);return jsxs2(Fragment,{children:[jsx2(PageHead,{title:opened,desc:`\u4F4D\u7F6E ${DIR} \xB7 \u9879\u76EE\u91CC\u7684 Agent \u5171\u7528`}),notes,jsx2(Editor,{path:opened,value,removed:draft?.removed===true,created:draft?.created===true,dirty:isDirty(opened,files,drafts),meta:writer?`\u6700\u8FD1\u7531 ${authorName(members,writer)} \u5199\u5165 \xB7 ${stamp(writer.createdAt)}`:draft?.created?"\u65B0\u6587\u4EF6\uFF0C\u8FD8\u6CA1\u4FDD\u5B58":"",readOnly,busy,problem,dirtyCount:dirty.length,onChange:content=>edit(opened,file?.content===content&&!draft?.created?null:{...draft,content}),onDiscard:()=>edit(opened,null),onRemove:()=>edit(opened,{content:value,removed:true}),onSave:()=>void save(opened)},opened),jsx2("div",{className:"band-sf-acts",children:jsxs2("button",{type:"button",className:"btn",onClick:()=>goHistory(),disabled:(versions.data?.length??0)===0,children:["\u770B\u5386\u53F2\u4E0E\u5DEE\u5F02",versions.data?.length?` \xB7 ${versions.data.length} \u7248`:""]})})]})}const addAction=readOnly?void 0:jsx2("a",{className:"btn primary",href:href(ctx,NEW_ITEM),onClick:e=>{if(e.metaKey||e.ctrlKey||e.shiftKey||e.altKey)return;e.preventDefault();ctx.app.navigate({page:PAGE,params:params(ctx,NEW_ITEM)})},children:"\u65B0\u5EFA\u6587\u4EF6"});const versionCount=versions.data?.length??0;return jsxs2(Fragment,{children:[jsx2(PageHead,{title:"\u8BB0\u5FC6",desc:DESC,action:paths.length===0?void 0:addAction}),notes,paths.length===0?jsx2(Empty,{action:addAction,children:"\u8FD8\u6CA1\u6709\u8BB0\u5FC6\u3002\u9879\u76EE\u8DD1\u8D77\u6765\u4EE5\u540E\uFF0CAgent \u4F1A\u628A\u5927\u5BB6\u7684\u6C9F\u901A\u4E60\u60EF\u3001\u7EA6\u5B9A\u548C\u672F\u8BED\u81EA\u5DF1\u8BB0\u4E0B\u6765\uFF0C\u4E0B\u6B21\u5DE5\u4F5C\u65F6\u5148\u8BFB\u3002\u4F60\u4E0D\u7528\u505A\u4EC0\u4E48\u3002"}):jsxs2(Fragment,{children:[jsx2(Rows,{label:"\u8BB0\u5FC6\u6587\u4EF6",children:paths.map(p=>{const d=drafts.get(p);const w=writers.data?.get(p);const changed=isDirty(p,files,drafts);const state=d?.removed?"\u4FDD\u5B58\u540E\u5220\u9664":d?.created?"\u65B0\u5EFA \xB7 \u6CA1\u4FDD\u5B58":changed?"\u6539\u4E86 \xB7 \u6CA1\u4FDD\u5B58":w?`${authorName(members,w)} \xB7 ${stamp(w.createdAt)}`:"";return jsx2(Row,{title:p,mono:true,href:href(ctx,p),meta:state?[state]:void 0,onOpen:()=>goFile(p)},p)})}),jsxs2("div",{className:"band-memory-hint",children:[jsxs2("span",{children:["\u4F4D\u7F6E ",jsx2("code",{children:DIR})," \xB7 \u9879\u76EE\u91CC\u7684 Agent \u5171\u7528"]}),jsx2("span",{className:problem?"band-memory-over":void 0,children:usageText(merged)}),jsxs2("button",{type:"button",className:"band-memory-link",onClick:()=>goHistory(),disabled:versionCount===0,children:["\u5386\u53F2",versionCount?` \xB7 ${versionCount} \u7248`:""]})]}),jsx2("p",{className:"band-sf-muted",children:"\u53EA\u5C5E\u4E8E\u8FD9\u4E2A\u9879\u76EE\uFF0C\u6362\u9879\u76EE\u4E0D\u5E26\u8FC7\u53BB\uFF1B\u522B\u5199\u5BC6\u7801\u548C\u4E2A\u4EBA\u9690\u79C1\u3002"})]})]})}var NO_FILES=[];function NewFile({taken,onCreate,onCancel}){const[name,setName]=useState("");const[error,setError]=useState(null);const input=useRef(null);const errId=useId();useEffect(()=>{input.current?.focus()},[]);const submit=()=>{const r=fileName(name,taken);if(!r.ok){setError(r.message);return}onCreate(r.path)};return jsxs2("form",{className:"band-memory-newform",onSubmit:e=>{e.preventDefault();submit()},children:[jsxs2("label",{className:"band-memory-newfield",children:[jsxs2("span",{className:"band-memory-newlabel",children:["\u65B0\u6587\u4EF6\u540D",jsx2("span",{className:"band-sf-req",children:"\u5FC5\u586B"})]}),jsx2("input",{ref:input,className:"field band-memory-newinput",value:name,placeholder:"\u4F8B\u5982 conventions","aria-invalid":error?true:void 0,"aria-describedby":error?errId:void 0,onChange:e=>{setName(e.target.value);setError(null)},onKeyDown:withImeGuard(e=>{if(e.key==="Escape"){e.preventDefault();onCancel()}})}),jsx2("span",{"aria-hidden":"true",children:".md"})]}),error&&jsx2("span",{id:errId,className:"band-memory-err",children:error}),jsxs2("span",{className:"band-memory-newacts",children:[jsx2("button",{type:"button",className:"btn ghost",onClick:onCancel,children:"\u53D6\u6D88"}),jsx2("button",{type:"submit",className:"btn primary",children:"\u65B0\u5EFA"})]})]})}function Editor({path,value,removed,created,dirty,meta,readOnly,busy,problem,dirtyCount,onChange,onDiscard,onRemove,onSave}){const id=useId();const onKeyDown=withImeGuard(e=>{if((e.metaKey||e.ctrlKey)&&e.key.toLowerCase()==="s"){e.preventDefault();onSave()}});const saveLabel=dirtyCount>1?`\u4FDD\u5B58 ${dirtyCount} \u4E2A\u6587\u4EF6`:"\u4FDD\u5B58";return jsxs2("section",{className:"band-memory-edit field-host","aria-labelledby":id,children:[jsxs2("div",{className:"band-memory-edithead",children:[jsxs2("code",{id,children:[DIR,path]}),meta&&jsx2("span",{children:meta})]}),removed?jsxs2("div",{className:"band-memory-removed",children:[jsx2("b",{children:"\u4FDD\u5B58\u540E\u4F1A\u5220\u6389\u8FD9\u4E2A\u6587\u4EF6"}),jsx2("span",{children:"\u5220\u4E4B\u524D\u7684\u5185\u5BB9\u7559\u5728\u5386\u53F2\u91CC\uFF0C\u9700\u8981\u65F6\u53EF\u4EE5\u6062\u590D\u3002"}),jsx2("button",{type:"button",className:"btn sm",onClick:onDiscard,children:"\u4E0D\u5220\u4E86"})]}):jsx2("textarea",{className:"field bare band-memory-text","aria-label":`${path} \u7684\u5185\u5BB9`,spellCheck:false,value,readOnly,onChange:e=>onChange(e.target.value),onKeyDown}),problem&&jsxs2("span",{className:"band-memory-err",role:"alert",children:["\u5B58\u4E0D\u4E0B\uFF1A",problem]}),!readOnly&&jsxs2("div",{className:"band-memory-editfoot",children:[!created&&!removed&&jsx2("button",{type:"button",className:"btn ghost sm danger",onClick:onRemove,children:"\u5220\u9664\u6587\u4EF6"}),jsx2("span",{className:"band-memory-spacer"}),jsx2("button",{type:"button",className:"btn ghost sm",onClick:onDiscard,disabled:!dirty&&!created,children:created?"\u4E0D\u8981\u8FD9\u4E2A\u6587\u4EF6":"\u64A4\u9500\u4FEE\u6539"}),jsx2("button",{type:"button",className:"btn primary sm",onClick:onSave,disabled:busy||dirtyCount===0||problem!==null,title:"\u2318S / Ctrl+S",children:busy?"\u4FDD\u5B58\u4E2D\u2026":saveLabel})]})]})}function History({api,ctx,members,versions,error,reload,initial,canWrite,busy,onAct}){const[picked,setPicked]=useState(initial);const latest=versions?.[0]?.version;const shown=picked!==null&&versions?.some(v=>v.version===picked)?picked:latest;const detail=useCtxData(ctx,async()=>shown===void 0?null:api.version(shown),[api,shown],UPDATED);const order=useMemo(()=>memberOrder(members),[members]);const agents=useMemo(()=>members.filter(m=>m.actor.kind==="agent").map(m=>m.actor.id),[members]);const list=useRef(null);const onHistoryKey=withImeGuard(e=>{if(!versions?.length||shown===void 0)return;const i=versions.findIndex(v2=>v2.version===shown);const j=e.key==="ArrowDown"?Math.min(versions.length-1,i+1):e.key==="ArrowUp"?Math.max(0,i-1):e.key==="Home"?0:e.key==="End"?versions.length-1:-1;if(j<0)return;e.preventDefault();const v=versions[j]?.version;if(v===void 0)return;setPicked(v);requestAnimationFrame(()=>list.current?.querySelector(`[data-version="${v}"]`)?.focus())});return jsx2("div",{className:"band-memory-history",children:!versions?error?jsxs2(ErrorNote,{retry:reload,children:["\u5386\u53F2\u6CA1\u53D6\u5230\uFF1A",error]}):jsx2(Loading,{text:"\u6B63\u5728\u8BFB\u53D6\u5386\u53F2\u2026"}):versions.length===0?jsx2(Rest,{title:"\u8FD8\u6CA1\u6709\u5386\u53F2",children:"\u7B2C\u4E00\u6B21\u6709\u4EBA\u6216 Agent \u5199\u5165\u8BB0\u5FC6\u4EE5\u540E\uFF0C\u6BCF\u5B58\u4E00\u6B21\u662F\u4E00\u7248\u3002"}):jsxs2("div",{className:"band-memory-grid",children:[jsx2("ul",{ref:list,className:"band-memory-versions","aria-label":"\u7248\u672C",onKeyDown:onHistoryKey,children:versions.map(v=>jsx2("li",{children:jsxs2("button",{type:"button",className:"band-memory-version","data-version":v.version,"aria-current":v.version===shown,tabIndex:v.version===shown?0:-1,onClick:()=>setPicked(v.version),children:[jsx2(Avatar,{id:v.author.id,name:authorName(members,v),agent:v.author.kind==="agent",...v.author.kind==="agent"?{instrument:instrumentOf(v.author.id,agents)}:{},order,size:"xs",decorative:true}),jsxs2("span",{className:"band-memory-fname",children:[jsxs2("span",{children:["\u7B2C ",v.version," \u7248",v.version===latest?" \xB7 \u5F53\u524D":""]}),jsxs2("span",{children:[authorName(members,v)," ",actionText(v)," \xB7 ",stamp(v.createdAt)]})]})]})},v.version))}),detail.error&&(!detail.data||detail.data.version.version!==shown)?jsx2("div",{className:"band-memory-edit",children:jsxs2(ErrorNote,{retry:detail.reload,children:["\u8FD9\u4E00\u7248\u6CA1\u53D6\u5230\uFF1A",detail.error]})}):jsx2("section",{className:"band-memory-edit","aria-live":"polite",children:!detail.data||detail.data.version.version!==shown?jsx2(Loading,{text:"\u6B63\u5728\u8BFB\u53D6\u8FD9\u4E00\u7248\u2026"}):jsxs2(Fragment,{children:[jsxs2("div",{className:"band-memory-edithead",children:[jsxs2("b",{children:["\u7B2C ",detail.data.version.version," \u7248 \xB7"," ",authorName(members,detail.data.version)," ",actionText(detail.data.version)]}),jsx2("span",{children:stamp(detail.data.version.createdAt)})]}),detail.data.version.rejectedFiles&&jsxs2("output",{className:"band-memory-note",children:["\u8FD9\u6B21\u56DE\u5408\u8FD8\u6539\u4E86 ",detail.data.version.rejectedFiles.join("\u3001"),"\uFF0C\u548C\u522B\u7684\u6539\u52A8\u649E\u4E86\uFF0C\u6CA1\u91C7\u7528\uFF1B\u5B83\u4EA4\u56DE\u7684\u5185\u5BB9\u53EA\u7559\u5728\u8FD9\u4E00\u7248\u7684\u8BB0\u5F55\u91CC\u3002"]}),detail.data.changes.length===0?jsx2("span",{className:"band-memory-faint",children:"\u8FD9\u4E00\u7248\u6587\u4EF6\u5185\u5BB9\u6CA1\u6709\u53D8\u5316\u3002"}):detail.data.changes.map(c=>jsxs2("div",{className:"band-memory-change",children:[jsxs2("div",{className:"band-memory-changehead",children:[jsx2("code",{children:c.path}),jsx2("span",{children:CHANGE_TEXT[c.change]})]}),jsx2(Diff,{blocks:foldDiff(lineDiff(c.before,c.after))})]},c.path)),canWrite&&jsxs2("div",{className:"band-memory-editfoot",children:[jsx2("span",{className:"band-memory-faint",children:"\u64A4\u56DE\u548C\u6062\u590D\u90FD\u4F1A\u5B58\u6210\u65B0\u7684\u4E00\u7248\uFF0C\u539F\u6765\u7684\u7248\u672C\u8FD8\u5728\u3002"}),jsx2("span",{className:"band-memory-spacer"}),jsx2("button",{type:"button",className:"btn ghost sm",disabled:busy,onClick:()=>detail.data&&onAct("revert",detail.data.version.version),children:"\u64A4\u56DE\u8FD9\u4E00\u7248\u7684\u6539\u52A8"}),detail.data.version.version!==latest&&jsx2("button",{type:"button",className:"btn sm",disabled:busy,onClick:()=>detail.data&&onAct("restore",detail.data.version.version),children:"\u6062\u590D\u5230\u8FD9\u4E00\u7248"})]})]})})]})})}var CHANGE_TEXT={added:"\u65B0\u5EFA",modified:"\u4FEE\u6539",removed:"\u5220\u9664"};function Diff({blocks}){return jsx2("div",{className:"band-memory-diff",children:blocks.map((b,i)=>b.kind==="fold"?jsxs2("div",{className:"band-memory-fold",children:["\u2026 ",b.count," \u884C\u6CA1\u53D8"]},i):b.lines.map((l,j)=>jsxs2("div",{className:`band-memory-line ${l.kind}`,children:[jsx2("span",{"aria-hidden":"true",children:l.kind==="add"?"+":l.kind==="del"?"\u2212":" "}),jsx2("span",{className:"sr-only",children:l.kind==="add"?"\u52A0\u4E86\uFF1A":l.kind==="del"?"\u5220\u4E86\uFF1A":""}),jsx2("span",{children:l.text||" "})]},`${i}-${j}`)))})}export{MemoryTab,src_default as default};
|
|
3
|
+
`,created:true});goFile(path)};const settle=(r,ok)=>{snap.reload();versions.reload();if(r.ok){setNotice({tone:"ok",text:ok(r.version,r.unchanged)});return true}if(r.code==="CONFLICT"){setNotice({tone:"bad",text:`\u6CA1\u5B58\u4E0A\uFF1A\u8FD9\u671F\u95F4\u8BB0\u5FC6\u5DF2\u7ECF\u5230\u7B2C ${r.latestVersion} \u7248\u4E86\u3002\u4F60\u7684\u4FEE\u6539\u8FD8\u5728\uFF0C\u770B\u6E05\u4E0A\u9762\u7684\u63D0\u793A\u518D\u5B58\u3002`})}else if(r.code==="INVALID"){setNotice({tone:"bad",text:`\u6CA1\u5B58\u4E0A\uFF1A${r.message}`})}else{setLockedOut(true);setNotice({tone:"bad",text:"\u9879\u76EE\u5DF2\u5F52\u6863\u6216\u4F60\u5DF2\u4E0D\u662F\u6210\u5458\uFF0C\u8BB0\u5FC6\u73B0\u5728\u53EA\u8BFB\u3002"})}return false};const save=async path=>{if(!snap.data||busy||readOnly||dirty.length===0||problem)return;const removedNow=drafts.get(path)?.removed===true;setBusy(true);try{const r=await api.save({baseVersion:base?.version??snap.data.version,...saveInput(files,drafts)});if(settle(r,(v,unchanged)=>unchanged?"\u5185\u5BB9\u548C\u73B0\u5728\u4E00\u6837\uFF0C\u6CA1\u6709\u5B58\u65B0\u7248\u672C":`\u5DF2\u5B58\u4E3A\u7B2C ${v} \u7248`)){setDrafts(new Map);setBase(null);if(removedNow)goList()}}catch(e){setNotice({tone:"bad",text:`\u6CA1\u5B58\u4E0A\uFF1A${e instanceof Error?e.message:String(e)}`})}finally{setBusy(false)}};const act=async(kind,v)=>{if(busy||readOnly)return;setBusy(true);try{const r=kind==="revert"?await api.revert(v):await api.restore(v);settle(r,(nv,unchanged)=>unchanged?"\u5185\u5BB9\u548C\u73B0\u5728\u4E00\u6837\uFF0C\u6CA1\u6709\u5B58\u65B0\u7248\u672C":kind==="revert"?`\u5DF2\u64A4\u56DE\u7B2C ${v} \u7248\u7684\u6539\u52A8\uFF0C\u5B58\u4E3A\u7B2C ${nv} \u7248`:`\u5DF2\u6062\u590D\u5230\u7B2C ${v} \u7248\uFF0C\u5B58\u4E3A\u7B2C ${nv} \u7248`)}catch(e){setNotice({tone:"bad",text:`\u6CA1\u6210\u529F\uFF1A${e instanceof Error?e.message:String(e)}`})}finally{setBusy(false)}};const notes=jsxs(Fragment,{children:[readOnly&&!lockedOut&&jsx("output",{className:"band-memory-note",children:"\u8FD9\u4E2A\u9879\u76EE\u73B0\u5728\u53EA\u80FD\u67E5\u770B\uFF0C\u8BB0\u5FC6\u6539\u4E0D\u4E86\u3002"}),stale&&base&&snap.data&&jsxs("div",{className:"band-memory-stale",role:"alert",children:[jsxs("b",{children:["\u4F60\u6539\u7684\u65F6\u5019\uFF0C\u8BB0\u5FC6\u5B58\u5230\u4E86\u7B2C ",snap.data.version," \u7248",snap.data.latest?`\uFF08${authorName(members,snap.data.latest)}\uFF09`:"","\u3002"]}),jsx("span",{children:clashes.length>0?`${clashes.join("\u3001")} \u5BF9\u65B9\u4E5F\u6539\u4E86\uFF0C\u5728\u6700\u65B0\u7248\u4E0A\u7EE7\u7EED\u4F1A\u7528\u4F60\u7684\u5185\u5BB9\u8986\u76D6\u5B83\u3002`:"\u4F60\u6539\u7684\u6587\u4EF6\u5BF9\u65B9\u6CA1\u52A8\uFF0C\u53EF\u4EE5\u5728\u6700\u65B0\u7248\u4E0A\u7EE7\u7EED\u3002"}),jsxs("span",{className:"band-memory-stale-acts",children:[jsx("button",{type:"button",className:"btn sm",onClick:()=>{setDrafts(new Map);setBase(null);setNotice(null)},children:"\u4E22\u6389\u6211\u7684\u4FEE\u6539"}),jsx("button",{type:"button",className:"btn primary sm",onClick:()=>{setBase({version:snap.data?.version??0,files:new Map(files.map(f=>[f.path,f.content]))});setNotice(null)},children:"\u5728\u6700\u65B0\u7248\u4E0A\u7EE7\u7EED"})]})]}),notice&&jsx("output",{className:`band-memory-notice ${notice.tone}`,"aria-live":"polite",children:notice.text})]});if(!snap.data){return jsxs(Fragment,{children:[jsx(SettingsHead,{title:"\u8BB0\u5FC6",desc:DESC}),snap.error?jsxs(ErrorNote,{retry:snap.reload,children:["\u8BB0\u5FC6\u6CA1\u53D6\u5230\uFF1A",snap.error]}):jsx(SettingsLoading,{text:"\u6B63\u5728\u8BFB\u53D6\u9879\u76EE\u8BB0\u5FC6\u2026"})]})}if(linked!==null){return jsxs(Fragment,{children:[jsx(SettingsHead,{title:"\u8BB0\u5FC6\u7684\u5386\u53F2",desc:"\u6BCF\u5B58\u4E00\u6B21\u662F\u4E00\u7248\uFF1B\u64A4\u56DE\u548C\u6062\u590D\u90FD\u4F1A\u5B58\u6210\u65B0\u7684\u4E00\u7248\u3002"}),notes,jsx(History,{api,ctx,members,versions:versions.data,error:versions.error,reload:versions.reload,initial:linked,canWrite:!readOnly,busy,onAct:act})]})}if(creating){return jsxs(Fragment,{children:[jsx(SettingsHead,{title:"\u65B0\u5EFA\u6587\u4EF6",desc:"\u53EA\u586B\u540D\u5B57\uFF1B\u5EFA\u597D\u540E\u5728\u8FD9\u4E2A\u6587\u4EF6\u91CC\u5199\u5185\u5BB9\u3002"}),readOnly?jsx("p",{className:"band-sf-muted",children:lockedOut?"\u9879\u76EE\u5DF2\u5F52\u6863\u6216\u4F60\u5DF2\u4E0D\u662F\u6210\u5458\uFF0C\u8BB0\u5FC6\u53EA\u8BFB\u3002":"\u53EA\u6709\u9879\u76EE\u6210\u5458\u80FD\u65B0\u5EFA\u8BB0\u5FC6\u6587\u4EF6\u3002"}):jsx(NewFile,{taken:paths,onCreate:newFile,onCancel:goList})]})}if(opened!==null){const draft=drafts.get(opened);const file=files.find(f=>f.path===opened);if(!draft&&!file){return jsxs(Fragment,{children:[jsx(SettingsHead,{title:opened,desc:`\u4F4D\u7F6E ${DIR} \xB7 \u9879\u76EE\u91CC\u7684 Agent \u5171\u7528`}),jsx("p",{className:"band-sf-muted",children:"\u8FD9\u4E2A\u6587\u4EF6\u4E0D\u5728\u4E86\uFF1B\u53EF\u80FD\u5DF2\u7ECF\u88AB\u5220\u6389\u3002\u56DE\u5230\u5217\u8868\u770B\u73B0\u5728\u7684\u6587\u4EF6\u3002"})]})}const value=draft&&!draft.removed?draft.content:file?.content??"";const writer=writers.data?.get(opened);return jsxs(Fragment,{children:[jsx(SettingsHead,{title:opened,desc:`\u4F4D\u7F6E ${DIR} \xB7 \u9879\u76EE\u91CC\u7684 Agent \u5171\u7528`}),notes,jsx(Editor,{path:opened,value,removed:draft?.removed===true,created:draft?.created===true,dirty:isDirty(opened,files,drafts),meta:writer?`\u6700\u8FD1\u7531 ${authorName(members,writer)} \u5199\u5165 \xB7 ${stamp(writer.createdAt)}`:draft?.created?"\u65B0\u6587\u4EF6\uFF0C\u8FD8\u6CA1\u4FDD\u5B58":"",readOnly,busy,problem,dirtyCount:dirty.length,onChange:content=>edit(opened,file?.content===content&&!draft?.created?null:{...draft,content}),onDiscard:()=>edit(opened,null),onRemove:()=>edit(opened,{content:value,removed:true}),onSave:()=>void save(opened)},opened),jsx(SettingsActions,{children:jsxs("button",{type:"button",className:"btn",onClick:()=>goHistory(),disabled:(versions.data?.length??0)===0,children:["\u770B\u5386\u53F2\u4E0E\u5DEE\u5F02",versions.data?.length?` \xB7 ${versions.data.length} \u7248`:""]})})]})}const addAction=readOnly?void 0:jsx("a",{className:"btn primary",href:href(ctx,NEW_ITEM),onClick:e=>{if(e.metaKey||e.ctrlKey||e.shiftKey||e.altKey)return;e.preventDefault();ctx.app.navigate({page:PAGE,params:params(ctx,NEW_ITEM)})},children:"\u65B0\u5EFA\u6587\u4EF6"});const versionCount=versions.data?.length??0;return jsxs(Fragment,{children:[jsx(SettingsHead,{title:"\u8BB0\u5FC6",desc:DESC,action:paths.length===0?void 0:addAction}),notes,paths.length===0?jsx(SettingsEmpty,{action:addAction,children:"\u8FD8\u6CA1\u6709\u8BB0\u5FC6\u3002\u9879\u76EE\u8DD1\u8D77\u6765\u4EE5\u540E\uFF0CAgent \u4F1A\u628A\u5927\u5BB6\u7684\u6C9F\u901A\u4E60\u60EF\u3001\u7EA6\u5B9A\u548C\u672F\u8BED\u81EA\u5DF1\u8BB0\u4E0B\u6765\uFF0C\u4E0B\u6B21\u5DE5\u4F5C\u65F6\u5148\u8BFB\u3002\u4F60\u4E0D\u7528\u505A\u4EC0\u4E48\u3002"}):jsxs(Fragment,{children:[jsx(SettingsRows,{label:"\u8BB0\u5FC6\u6587\u4EF6",children:paths.map(p=>{const d=drafts.get(p);const w=writers.data?.get(p);const changed=isDirty(p,files,drafts);const state=d?.removed?"\u4FDD\u5B58\u540E\u5220\u9664":d?.created?"\u65B0\u5EFA \xB7 \u6CA1\u4FDD\u5B58":changed?"\u6539\u4E86 \xB7 \u6CA1\u4FDD\u5B58":w?`${authorName(members,w)} \xB7 ${stamp(w.createdAt)}`:"";return jsx(SettingsRow,{title:p,mono:true,href:href(ctx,p),meta:state?[state]:void 0,onOpen:()=>goFile(p)},p)})}),jsxs("div",{className:"band-memory-hint",children:[jsxs("span",{children:["\u4F4D\u7F6E ",jsx("code",{children:DIR})," \xB7 \u9879\u76EE\u91CC\u7684 Agent \u5171\u7528"]}),jsx("span",{className:problem?"band-memory-over":void 0,children:usageText(merged)}),jsxs("button",{type:"button",className:"band-memory-link",onClick:()=>goHistory(),disabled:versionCount===0,children:["\u5386\u53F2",versionCount?` \xB7 ${versionCount} \u7248`:""]})]}),jsx("p",{className:"band-sf-muted",children:"\u53EA\u5C5E\u4E8E\u8FD9\u4E2A\u9879\u76EE\uFF0C\u6362\u9879\u76EE\u4E0D\u5E26\u8FC7\u53BB\uFF1B\u522B\u5199\u5BC6\u7801\u548C\u4E2A\u4EBA\u9690\u79C1\u3002"})]})]})}var NO_FILES=[];function NewFile({taken,onCreate,onCancel}){const[name,setName]=useState("");const[error,setError]=useState(null);const input=useRef(null);useEffect(()=>{input.current?.focus()},[]);const submit=()=>{const r=fileName(name,taken);if(!r.ok){setError(r.message);return}onCreate(r.path)};return jsxs(SettingsForm,{onSubmit:submit,children:[jsx(SettingsField,{label:"\u65B0\u6587\u4EF6\u540D",required:true,error,children:field=>jsxs("span",{className:"field-group field-host",children:[jsx("input",{...field,ref:input,className:"field bare band-memory-newinput",value:name,placeholder:"\u4F8B\u5982 conventions",onChange:e=>{setName(e.target.value);setError(null)},onKeyDown:withImeGuard(e=>{if(e.key==="Escape"){e.preventDefault();onCancel()}})}),jsx("span",{className:"field-affix","aria-hidden":"true",children:".md"})]})}),jsxs(SettingsActions,{end:true,children:[jsx("button",{type:"button",className:"btn ghost",onClick:onCancel,children:"\u53D6\u6D88"}),jsx("button",{type:"submit",className:"btn primary",children:"\u65B0\u5EFA"})]})]})}function Editor({path,value,removed,created,dirty,meta,readOnly,busy,problem,dirtyCount,onChange,onDiscard,onRemove,onSave}){const id=useId();const onKeyDown=withImeGuard(e=>{if((e.metaKey||e.ctrlKey)&&e.key.toLowerCase()==="s"){e.preventDefault();onSave()}});const saveLabel=dirtyCount>1?`\u4FDD\u5B58 ${dirtyCount} \u4E2A\u6587\u4EF6`:"\u4FDD\u5B58";return jsxs("section",{className:"band-memory-edit field-host","aria-labelledby":id,children:[jsxs("div",{className:"band-memory-edithead",children:[jsxs("code",{id,children:[DIR,path]}),meta&&jsx("span",{children:meta})]}),removed?jsxs("div",{className:"band-memory-removed",children:[jsx("b",{children:"\u4FDD\u5B58\u540E\u4F1A\u5220\u6389\u8FD9\u4E2A\u6587\u4EF6"}),jsx("span",{children:"\u5220\u4E4B\u524D\u7684\u5185\u5BB9\u7559\u5728\u5386\u53F2\u91CC\uFF0C\u9700\u8981\u65F6\u53EF\u4EE5\u6062\u590D\u3002"}),jsx("button",{type:"button",className:"btn sm",onClick:onDiscard,children:"\u4E0D\u5220\u4E86"})]}):jsx("textarea",{className:"field bare band-memory-text","aria-label":`${path} \u7684\u5185\u5BB9`,spellCheck:false,value,readOnly,onChange:e=>onChange(e.target.value),onKeyDown}),problem&&jsxs("span",{className:"band-memory-err",role:"alert",children:["\u5B58\u4E0D\u4E0B\uFF1A",problem]}),!readOnly&&jsxs("div",{className:"band-memory-editfoot",children:[!created&&!removed&&jsx("button",{type:"button",className:"btn ghost sm danger",onClick:onRemove,children:"\u5220\u9664\u6587\u4EF6"}),jsx("span",{className:"band-memory-spacer"}),jsx("button",{type:"button",className:"btn ghost sm",onClick:onDiscard,disabled:!dirty&&!created,children:created?"\u4E0D\u8981\u8FD9\u4E2A\u6587\u4EF6":"\u64A4\u9500\u4FEE\u6539"}),jsx("button",{type:"button",className:"btn primary sm",onClick:onSave,disabled:busy||dirtyCount===0||problem!==null,title:"\u2318S / Ctrl+S",children:busy?"\u4FDD\u5B58\u4E2D\u2026":saveLabel})]})]})}function History({api,ctx,members,versions,error,reload,initial,canWrite,busy,onAct}){const[picked,setPicked]=useState(initial);const latest=versions?.[0]?.version;const shown=picked!==null&&versions?.some(v=>v.version===picked)?picked:latest;const detail=useCtxData(ctx,async()=>shown===void 0?null:api.version(shown),[api,shown],UPDATED);const order=useMemo(()=>memberOrder(members),[members]);const agents=useMemo(()=>members.filter(m=>m.actor.kind==="agent").map(m=>m.actor.id),[members]);const list=useRef(null);const onHistoryKey=withImeGuard(e=>{if(!versions?.length||shown===void 0)return;const i=versions.findIndex(v2=>v2.version===shown);const j=e.key==="ArrowDown"?Math.min(versions.length-1,i+1):e.key==="ArrowUp"?Math.max(0,i-1):e.key==="Home"?0:e.key==="End"?versions.length-1:-1;if(j<0)return;e.preventDefault();const v=versions[j]?.version;if(v===void 0)return;setPicked(v);requestAnimationFrame(()=>list.current?.querySelector(`[data-version="${v}"]`)?.focus())});return jsx("div",{className:"band-memory-history",children:!versions?error?jsxs(ErrorNote,{retry:reload,children:["\u5386\u53F2\u6CA1\u53D6\u5230\uFF1A",error]}):jsx(SettingsLoading,{text:"\u6B63\u5728\u8BFB\u53D6\u5386\u53F2\u2026"}):versions.length===0?jsx(Rest,{title:"\u8FD8\u6CA1\u6709\u5386\u53F2",children:"\u7B2C\u4E00\u6B21\u6709\u4EBA\u6216 Agent \u5199\u5165\u8BB0\u5FC6\u4EE5\u540E\uFF0C\u6BCF\u5B58\u4E00\u6B21\u662F\u4E00\u7248\u3002"}):jsxs("div",{className:"band-memory-grid",children:[jsx("ul",{ref:list,className:"band-memory-versions","aria-label":"\u7248\u672C",onKeyDown:onHistoryKey,children:versions.map(v=>jsx("li",{children:jsxs("button",{type:"button",className:"band-memory-version","data-version":v.version,"aria-current":v.version===shown,tabIndex:v.version===shown?0:-1,onClick:()=>setPicked(v.version),children:[jsx(Avatar,{id:v.author.id,name:authorName(members,v),agent:v.author.kind==="agent",...v.author.kind==="agent"?{instrument:instrumentOf(v.author.id,agents)}:{},order,size:"xs",decorative:true}),jsxs("span",{className:"band-memory-fname",children:[jsxs("span",{children:["\u7B2C ",v.version," \u7248",v.version===latest?" \xB7 \u5F53\u524D":""]}),jsxs("span",{children:[authorName(members,v)," ",actionText(v)," \xB7 ",stamp(v.createdAt)]})]})]})},v.version))}),detail.error&&(!detail.data||detail.data.version.version!==shown)?jsx("div",{className:"band-memory-edit",children:jsxs(ErrorNote,{retry:detail.reload,children:["\u8FD9\u4E00\u7248\u6CA1\u53D6\u5230\uFF1A",detail.error]})}):jsx("section",{className:"band-memory-edit","aria-live":"polite",children:!detail.data||detail.data.version.version!==shown?jsx(SettingsLoading,{text:"\u6B63\u5728\u8BFB\u53D6\u8FD9\u4E00\u7248\u2026"}):jsxs(Fragment,{children:[jsxs("div",{className:"band-memory-edithead",children:[jsxs("b",{children:["\u7B2C ",detail.data.version.version," \u7248 \xB7"," ",authorName(members,detail.data.version)," ",actionText(detail.data.version)]}),jsx("span",{children:stamp(detail.data.version.createdAt)})]}),detail.data.version.rejectedFiles&&jsxs("output",{className:"band-memory-note",children:["\u8FD9\u6B21\u56DE\u5408\u8FD8\u6539\u4E86 ",detail.data.version.rejectedFiles.join("\u3001"),"\uFF0C\u548C\u522B\u7684\u6539\u52A8\u649E\u4E86\uFF0C\u6CA1\u91C7\u7528\uFF1B\u5B83\u4EA4\u56DE\u7684\u5185\u5BB9\u53EA\u7559\u5728\u8FD9\u4E00\u7248\u7684\u8BB0\u5F55\u91CC\u3002"]}),detail.data.changes.length===0?jsx("span",{className:"band-memory-faint",children:"\u8FD9\u4E00\u7248\u6587\u4EF6\u5185\u5BB9\u6CA1\u6709\u53D8\u5316\u3002"}):detail.data.changes.map(c=>jsxs("div",{className:"band-memory-change",children:[jsxs("div",{className:"band-memory-changehead",children:[jsx("code",{children:c.path}),jsx("span",{children:CHANGE_TEXT[c.change]})]}),jsx(Diff,{blocks:foldDiff(lineDiff(c.before,c.after))})]},c.path)),canWrite&&jsxs("div",{className:"band-memory-editfoot",children:[jsx("span",{className:"band-memory-faint",children:"\u64A4\u56DE\u548C\u6062\u590D\u90FD\u4F1A\u5B58\u6210\u65B0\u7684\u4E00\u7248\uFF0C\u539F\u6765\u7684\u7248\u672C\u8FD8\u5728\u3002"}),jsx("span",{className:"band-memory-spacer"}),jsx("button",{type:"button",className:"btn ghost sm",disabled:busy,onClick:()=>detail.data&&onAct("revert",detail.data.version.version),children:"\u64A4\u56DE\u8FD9\u4E00\u7248\u7684\u6539\u52A8"}),detail.data.version.version!==latest&&jsx("button",{type:"button",className:"btn sm",disabled:busy,onClick:()=>detail.data&&onAct("restore",detail.data.version.version),children:"\u6062\u590D\u5230\u8FD9\u4E00\u7248"})]})]})})]})})}var CHANGE_TEXT={added:"\u65B0\u5EFA",modified:"\u4FEE\u6539",removed:"\u5220\u9664"};function Diff({blocks}){return jsx("div",{className:"band-memory-diff",children:blocks.map((b,i)=>b.kind==="fold"?jsxs("div",{className:"band-memory-fold",children:["\u2026 ",b.count," \u884C\u6CA1\u53D8"]},i):b.lines.map((l,j)=>jsxs("div",{className:`band-memory-line ${l.kind}`,children:[jsx("span",{"aria-hidden":"true",children:l.kind==="add"?"+":l.kind==="del"?"\u2212":" "}),jsx("span",{className:"sr-only",children:l.kind==="add"?"\u52A0\u4E86\uFF1A":l.kind==="del"?"\u5220\u4E86\uFF1A":""}),jsx("span",{children:l.text||" "})]},`${i}-${j}`)))})}export{MemoryTab,src_default as default};
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kanyun-ai-infra/band-memory",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.4",
|
|
4
4
|
"description": "项目记忆页:Agent 记下的约定、习惯和术语,人可以改;历史里看每一版、撤回或恢复",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
7
7
|
".": "./dist/index.js"
|
|
8
8
|
},
|
|
9
9
|
"peerDependencies": {
|
|
10
|
-
"@kanyun-ai-infra/band-plugin-sdk": "^1.
|
|
10
|
+
"@kanyun-ai-infra/band-plugin-sdk": "^1.222.0",
|
|
11
11
|
"react": "^18.3.1",
|
|
12
12
|
"react-dom": "^18.3.1",
|
|
13
13
|
"@kanyun-ai-infra/band-settings": "*"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{ARTIFACT_DIALOG,ArtifactPage,AwaitingFile,DEFAULT_LAYOUT,FirstVersion,HeaderVersion,LOCKED_REFS2,PROJECT,PROJECT_HEAD,ProjectPage,ReviewPage,SLOTS,StageReplay,activePair,approvalPlaced,artifactCaps,candidateGroup,candidateGroupLabel,candidateLabel,isLatestVersion,pickedOf,place,readStageForm,resolvePanel2,shortName,src_default,stageDoer,stageOutputs}from"../../chunks/chunk-
|
|
1
|
+
import{ARTIFACT_DIALOG,ArtifactPage,AwaitingFile,DEFAULT_LAYOUT,FirstVersion,HeaderVersion,LOCKED_REFS2,PROJECT,PROJECT_HEAD,ProjectPage,ReviewPage,SLOTS,StageReplay,activePair,approvalPlaced,artifactCaps,candidateGroup,candidateGroupLabel,candidateLabel,isLatestVersion,pickedOf,place,readStageForm,resolvePanel2,shortName,src_default,stageDoer,stageOutputs}from"../../chunks/chunk-SB74RUTN.js";import"../../chunks/chunk-N6N56MWF.js";import{DOCK_SERVICE,mountDockButtons}from"../../chunks/chunk-TWQQ2CCT.js";import"../../chunks/chunk-JFPQMFKF.js";export{ARTIFACT_DIALOG,ArtifactPage,AwaitingFile,DEFAULT_LAYOUT,DOCK_SERVICE,FirstVersion,HeaderVersion,LOCKED_REFS2 as LOCKED_REFS,PROJECT,PROJECT_HEAD,ProjectPage,ReviewPage,SLOTS,StageReplay,activePair,approvalPlaced,artifactCaps,candidateGroup,candidateGroupLabel,candidateLabel,src_default as default,isLatestVersion,mountDockButtons,pickedOf,place,readStageForm,resolvePanel2 as resolvePanel,shortName,stageDoer,stageOutputs};
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kanyun-ai-infra/band-project",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.9",
|
|
4
4
|
"description": "项目页和手机评审页的框架,把面板、查看器和阶段界面摆成一页",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
7
7
|
".": "./dist/index.js"
|
|
8
8
|
},
|
|
9
9
|
"peerDependencies": {
|
|
10
|
-
"@kanyun-ai-infra/band-plugin-sdk": "^1.
|
|
10
|
+
"@kanyun-ai-infra/band-plugin-sdk": "^1.222.0",
|
|
11
11
|
"react": "^18.3.1",
|
|
12
12
|
"react-dom": "^18.3.1",
|
|
13
13
|
"@kanyun-ai-infra/band-shell": "*"
|