@nelsonlongxiang/dsh-open-a2a-net 0.6.28 → 0.6.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +87 -14
- package/README_zh.md +83 -7
- package/assets/nexusDist/assets/index-C_x3iAth.js +9 -0
- package/assets/nexusDist/assets/index-Dz8N80tI.css +1 -0
- package/assets/nexusDist/index.html +2 -2
- package/cli/a2a.mjs +0 -0
- package/cordis.patch.yml +21 -21
- package/lib/canvas-store.js +21 -1
- package/lib/client.js +64 -64
- package/lib/client.js.map +1 -1
- package/lib/faces/admin.js +755 -0
- package/lib/faces/canvas-notify.js +138 -0
- package/lib/faces/wire.js +669 -0
- package/lib/flood-guard.js +106 -0
- package/lib/index.js +200 -1392
- package/lib/recursion-guard.js +78 -0
- package/lib/runtime.js +1 -0
- package/lib/skill/SKILL.md +35 -9
- package/lib/skill/references/cli.md +24 -7
- package/lib/skill/references/collaboration.md +355 -0
- package/lib/skill/references/discovery.md +5 -2
- package/lib/skill/references/pitfalls.md +2 -1
- package/lib/skill/references/routing.md +18 -8
- package/lib/skill/references/setup.md +152 -0
- package/lib/task-ledger.js +40 -4
- package/lib/types/canvas-store.d.ts +10 -1
- package/lib/types/faces/admin.d.ts +133 -0
- package/lib/types/faces/canvas-notify.d.ts +74 -0
- package/lib/types/faces/wire.d.ts +171 -0
- package/lib/types/flood-guard.d.ts +29 -0
- package/lib/types/index.d.ts +11 -3
- package/lib/types/recursion-guard.d.ts +56 -0
- package/lib/types/runtime.d.ts +35 -0
- package/lib/types/task-ledger.d.ts +15 -1
- package/nexus-stage/package-lock.json +2262 -2262
- package/nexus-stage/src/canvas-ops.ts +175 -175
- package/nexus-stage/src/canvas-wire.ts +156 -156
- package/nexus-stage/src/edges.ts +72 -72
- package/nexus-stage/src/federation-overlay.ts +103 -103
- package/nexus-stage/src/federation.ts +240 -240
- package/nexus-stage/src/layout-doc.ts +143 -143
- package/nexus-stage/src/layout-wire.ts +158 -158
- package/nexus-stage/src/main.ts +5 -1
- package/nexus-stage/src/planning-card-text.ts +73 -0
- package/nexus-stage/src/planning-edges.ts +26 -0
- package/nexus-stage/src/planning-fit.ts +45 -0
- package/nexus-stage/src/planning-legend.ts +38 -0
- package/nexus-stage/src/planning-mirror.ts +31 -0
- package/nexus-stage/src/planning-overlap.ts +159 -0
- package/nexus-stage/src/planning-relayout.ts +121 -0
- package/nexus-stage/src/planning-search.ts +168 -0
- package/nexus-stage/src/planning-types.ts +1 -0
- package/nexus-stage/src/planning-undo.ts +68 -0
- package/nexus-stage/src/planning-view.ts +120 -121
- package/nexus-stage/src/planning.css +41 -8
- package/nexus-stage/src/seat.ts +35 -35
- package/nexus-stage/src/stage-name.ts +13 -13
- package/nexus-stage/src/tokens.ts +31 -31
- package/nexus-stage/src/viewport.ts +24 -1
- package/nexus-stage/src/wb-chat.ts +20 -6
- package/nexus-stage/src/wb-ledger.ts +20 -7
- package/nexus-stage/src/wb-names.ts +43 -0
- package/nexus-stage/src/workbench.css +8 -2
- package/nexus-stage/src/workbench.ts +55 -17
- package/nexus-stage/src/world.ts +13 -21
- package/package.json +216 -214
- package/assets/nexusDist/assets/index-1niOBYxp.js +0 -5
- package/assets/nexusDist/assets/index-uQf7NwjF.css +0 -1
- package/nexus-stage/scripts/__pycache__/mockhost.cpython-312.pyc +0 -0
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
var Wn=Object.defineProperty;var Xn=(t,e,o)=>e in t?Wn(t,e,{enumerable:!0,configurable:!0,writable:!0,value:o}):t[e]=o;var vt=(t,e,o)=>Xn(t,typeof e!="symbol"?e+"":e,o);(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const n of document.querySelectorAll('link[rel="modulepreload"]'))s(n);new MutationObserver(n=>{for(const r of n)if(r.type==="childList")for(const a of r.addedNodes)a.tagName==="LINK"&&a.rel==="modulepreload"&&s(a)}).observe(document,{childList:!0,subtree:!0});function o(n){const r={};return n.integrity&&(r.integrity=n.integrity),n.referrerPolicy&&(r.referrerPolicy=n.referrerPolicy),n.crossOrigin==="use-credentials"?r.credentials="include":n.crossOrigin==="anonymous"?r.credentials="omit":r.credentials="same-origin",r}function s(n){if(n.ep)return;n.ep=!0;const r=o(n);fetch(n.href,r)}})();const Yt=6e4;function Kn(t,e,o=Date.now){let s=-Yt;return{fault(n){const r=o();r-s>=Yt&&(e(`[nexus] ${n}`),s=r),t.show(n)},clear(){t.hide(),s=-Yt}}}const Un=60*6e4;function wt(t){var e;return t.direction==="inbound"||t.direction===void 0&&((e=t.peer)==null?void 0:e.startsWith("local:"))===!0}function dn(t){var e;return((e=t.peer)==null?void 0:e.startsWith("local:"))===!0?t.peer.slice(6):void 0}function Ft(t,e){return t.settleable!==void 0?t.settleable===!1:e-t.startedAt>=Un}function zt(t,e){const o=(t.tasks??[]).filter(a=>a.receiptExpected!==!1),s=o.filter(a=>!wt(a)&&Ft(a,e)),n=o.filter(a=>wt(a)&&Ft(a,e)),r=t.tasksDead??[];return{stale:s,owedOverdue:n,deadLetters:r.filter(a=>a.reason!=="fire-forget"),expired:r.filter(a=>a.reason==="fire-forget")}}function xe(t,e){const o=document.createElement(t);return e!==void 0&&(o.className=e),o}function mn(t,e){const o=Math.max(0,Math.round((e-t)/1e3));if(o<90)return`${o}s`;const s=Math.round(o/60);if(s<90)return`${s}m`;const n=Math.round(s/60);return n<48?`${n}h`:`${Math.round(n/24)}d`}function Lt(t,e,o,s,n){const r=xe("div",`wb-led-tile${n!==void 0?` is-${n}`:""}`);r.title=s,r.appendChild(xe("span","wb-led-tile-v")).textContent=String(o),r.appendChild(xe("span","wb-led-tile-k")).textContent=e,t.appendChild(r)}const Gt=[{key:"completed",label:"完成",tone:"completed"},{key:"sync_completed",label:"同步完成",tone:"completed"},{key:"rejected",label:"拒绝",tone:"rejected"},{key:"failed",label:"失败",tone:"failed"},{key:"expired",label:"过期",tone:"abandoned"},{key:"abandoned",label:"放弃",tone:"abandoned"},{key:"unknown",label:"结论不明",tone:"unclassified"},{key:"unclassified",label:"未分类",tone:"unclassified"}];function Jn(t,e,o){const s=xe("div","wb-led-split"),n=xe("div","wb-led-split-bar");n.setAttribute("role","img");const r=xe("div","wb-led-split-legend"),a=new Set(Gt.map(d=>d.key)),m=Gt.map(d=>[d.tone,d.label,e[d.key]??0]);for(const[d,y]of Object.entries(e))a.has(d)||m.push(["other",d,y]);const x=[];for(const[d,y,_]of m){if(_<=0)continue;const D=xe("span",`wb-led-seg is-${d}`);D.style.width=`${Math.max(2,_/o*100)}%`,n.appendChild(D);const j=xe("span","wb-led-split-item");j.appendChild(xe("i",`wb-led-swatch is-${d}`)),j.appendChild(document.createTextNode(`${y} ${_}`)),r.appendChild(j),x.push(`${y} ${_}`)}n.setAttribute("aria-label",`归档结局:${x.join(",")}`),s.append(n,r),t.appendChild(s)}function zn(t,e){var Me;t.replaceChildren();const{state:o,now:s}=e,n=o.tasks??[],r=o.tasksDead??[],a=o.archivedCount??0,m=zt(o,s),x=n.filter($=>$.receiptExpected===!1),d=n.filter($=>$.receiptExpected!==!1),y=d.filter($=>wt($)),_=d.filter($=>!wt($)),D=m.stale,j=_.filter($=>!Ft($,s)),V=m.stale.length,Ce=xe("div","wb-led-tiles");Lt(Ce,"待回执",n.length,"等待回执的任务(pending),含陈旧与免回执行"),Lt(Ce,"陈旧",V,"我方派发、要回执、已等待 ≥1h 仍未回执(可催办);本机欠对方的入站行在「待本机回执」组另计,免回执行不算陈旧",V>0?"warn":void 0),Lt(Ce,"死信",m.deadLetters.length,"超过 24h TTL 仍未结算(unconsumed);需清账(abandon)才能移出。免回执到期另列,不算死信",m.deadLetters.length>0?"danger":void 0),Lt(Ce,"已归档",a,"已离开台账并留档的任务(结算、拒绝或放弃),用于审计"),t.appendChild(Ce),a>0&&o.archivedSplit!==void 0&&Jn(t,o.archivedSplit,a);const re=($,z)=>{const ae=xe("div",`wb-led-card is-${z.tone}`),fe=xe("div","wb-led-card-head");fe.appendChild(xe("span",`wb-led-dir${z.inbound?" is-in":""}`)).textContent=z.inbound?"↙":"↗";const ee=xe("span","wb-led-brief");ee.textContent=z.brief!==void 0&&z.brief!==""?z.brief:"(无摘要——派发未带 brief)",(z.brief===void 0||z.brief==="")&&ee.classList.add("is-missing"),fe.appendChild(ee),ae.appendChild(fe);const K=xe("div","wb-led-meta");K.appendChild(xe("span","wb-led-team")).textContent=z.inbound?`来自 ${z.sender??"对端"}`:`发往 ${z.team}`,z.inbound&&(K.appendChild(xe("span","wb-led-to")).textContent=`至 ${z.team}`),K.appendChild(xe("span")).textContent=z.atText,K.appendChild(xe("span","wb-led-task")).textContent=z.taskId;for(const ue of z.chips)K.appendChild(xe("span","wb-led-chip")).textContent=ue;if(ae.appendChild(K),ae.title=`${z.taskId}
|
|
2
|
-
${z.team}`,z.dead!==void 0){const ue=z.dead,se=xe("button","wb-btn wb-led-abandon");se.type="button",se.textContent="清账",se.title="从台账移出这条死信(abandon)",se.addEventListener("click",Oe=>{Oe.stopPropagation(),se.disabled=!0,e.abandon(ue.taskId,"workbench dead-letter cleanup").then(Pe=>{se.disabled=!1,se.textContent=Pe?"已清":"失败"})}),ae.appendChild(se)}if(e.canOpenTeam(z.team)){ae.classList.add("is-link"),ae.setAttribute("role","button"),ae.tabIndex=0,ae.setAttribute("aria-label",`${ee.textContent},打开 ${z.team} 的对话`);const ue=()=>{e.openTeam(z.team)};ae.addEventListener("click",ue),ae.addEventListener("keydown",se=>{(se.key==="Enter"||se.key===" ")&&(se.preventDefault(),ue())})}$.appendChild(ae)},C=($,z,ae,fe)=>{if(z===0)return null;const ee=xe("div",`wb-led-group is-${ae}`),K=xe("div","wb-led-group-head");return K.appendChild(xe("span")).textContent=`${$} · ${z}`,K.appendChild(xe("span","wb-led-group-hint")).textContent=fe,ee.appendChild(K),t.appendChild(ee),ee},E=($,z)=>{const ae=wt($);return{brief:$.brief,team:$.team,sender:dn($),taskId:$.taskId,atText:`${mn($.startedAt,s)} 前${ae?"收到":"派发"}`,inbound:ae,tone:z,chips:[...$.settleable===!0?["可结算"]:[],...$.receiptExpected===!1?["无回执债"]:[],...ae?["入站"]:[],...$.status!=="pending"?[$.status]:[]]}},H=($,z,ae)=>({brief:$.brief,team:$.team,sender:dn($),taskId:$.taskId,atText:`${mn($.deadAt,s)} 前${ae}`,inbound:wt($),tone:z,dead:$,chips:$.reason!==void 0&&$.reason!==""&&$.reason!=="unspecified"&&$.reason!=="fire-forget"?[$.reason]:[]}),b=C("死信",m.deadLetters.length,"danger","需清账");if(b!==null)for(const $ of[...m.deadLetters].sort((z,ae)=>ae.deadAt-z.deadAt))re(b,H($,"danger","死信"));const f=C("陈旧",D.length,"warn","我方派发 ≥1 小时仍无回执,可催办");if(f!==null)for(const $ of[...D].sort((z,ae)=>z.startedAt-ae.startedAt))re(f,E($,"warn"));const N=m.owedOverdue.length,v=C("待本机回执",y.length,N>0?"warn":"quiet",N>0?`对方在等本机回执 · ${N} 条超过 1 小时`:"对方在等本机回执");if(v!==null)for(const $ of[...y].sort((z,ae)=>z.startedAt-ae.startedAt))re(v,E($,Ft($,s)?"warn":"quiet"));const A=C("等待回执",j.length,"quiet","1 小时内");if(A!==null)for(const $ of[...j].sort((z,ae)=>ae.startedAt-z.startedAt))re(A,E($,"quiet"));const h=C("免回执",x.length,"muted","不等回执,24h 后自动归档");if(h!==null)for(const $ of x)re(h,E($,"muted"));const R=C("已过期(免回执)",m.expired.length,"muted","正常记账,不是失败");if(R!==null)for(const $ of[...m.expired].sort((z,ae)=>ae.deadAt-z.deadAt))re(R,H($,"muted","过期"));n.length+r.length===0&&(t.appendChild(xe("div","wb-led-empty")).textContent="台账为空——没有待回执的任务");const P=o.idempotency,me=(Me=o.reconcile)==null?void 0:Me.state;if(P!==void 0||me!==void 0){const $=xe("details","wb-led-forensics wb-forensics");$.appendChild(xe("summary")).textContent="取证";const z=xe("div","wb-led-forensics-body");P!==void 0&&(z.appendChild(xe("div")).textContent=`幂等 claims ${P.claimsFresh??0} · replays ${P.replays??0} · conflicts ${P.conflicts??0}`),me!==void 0&&(z.appendChild(xe("div")).textContent=`reconcile ${me}`),$.appendChild(z),t.appendChild($)}const Ne=d.length+m.deadLetters.length;return{badge:Ne>0?String(Ne):"",tone:m.deadLetters.length>0?"danger":V>0||N>0?"warn":void 0}}function mt(t){return t.name??t.team??t.label??""}const Nt=4e3,Gn=60*60*1e3,Vn=32;function be(t,e){const o=document.createElement(t);return e!==void 0&&(o.className=e),o}function It(t,e,o=""){const s=be("button",`wb-icon-btn wb-chat-act ${o}`.trim());return s.type="button",s.setAttribute("aria-label",t),s.title=t,s.textContent=e,s}function Wt(t,e){const o=Math.max(0,Math.round((e-t)/1e3));if(o<60)return"刚刚";const s=Math.round(o/60);if(s<60)return`${s} 分钟前`;const n=Math.round(s/60);return n<48?`${n} 小时前`:`${Math.round(n/24)} 天前`}function qn(t){return t>=1e6?`${(t/1e6).toFixed(1)} MB`:t>=1e3?`${Math.round(t/1e3)} KB`:`${t} B`}function Xt(t){const e=t.kind==="session"||t.kind==="remote"?t.team:void 0;return e!==void 0&&e!==""?e:void 0}function un(t){return t.kind==="remote"?`remote:${t.team}`:`${t.kind}:${t.id}`}function Qn(t){let e=null,o=null,s=!1,n=!1;const r=new Map,a=new Map,m=new Map,x=new Map,d=new Set,y=new Map,_=new Map,D=be("aside","wb-chat");D.setAttribute("aria-label","对话");const j=be("div","wb-chat-head"),V=It("返回会话列表","‹","wb-chat-back"),Ce=be("span","wb-chat-dot"),re=be("div","wb-chat-titles"),C=be("span","wb-chat-title"),E=be("span","wb-chat-sub");re.append(C,E);const H=It("刷新对话","↻","wb-chat-refresh"),b=It("会话详情","ⓘ","wb-chat-info-btn");b.setAttribute("aria-expanded","false");const f=It("关闭对话","✕","wb-chat-close");j.append(V,Ce,re,H,b,f);const N=be("div","wb-chat-info");N.hidden=!0;const v=be("div","wb-chat-thread");v.setAttribute("role","log"),v.setAttribute("aria-live","polite"),v.tabIndex=0;const A=be("div","wb-chat-notice"),h=be("div","wb-chat-log"),R=be("div","wb-chat-sent");v.append(A,h,R);const P=be("div","wb-chat-foot");D.append(j,N,v,P),V.addEventListener("click",()=>{(e==null?void 0:e.kind)==="peer"&&(e.picked=void 0,ot())}),H.addEventListener("click",()=>{if(e===null)return;const l=me(e);l!==void 0&&r.delete(l),e.kind==="peer"&&e.picked===void 0&&e.url!==void 0&&m.delete(`peer:${e.url}`),Pe(!0)}),b.addEventListener("click",()=>{n=!n,N.hidden=!n,b.setAttribute("aria-expanded",String(n))}),f.addEventListener("click",()=>Ue()),v.addEventListener("scroll",()=>{const l=e!==null?me(e):void 0;l!==void 0&&a.set(l,v.scrollTop)}),document.addEventListener("keydown",l=>{if(l.key!=="Escape"||!D.classList.contains("is-open"))return;const L=l.target;if(L instanceof HTMLElement){if(!D.contains(L)){const S=L instanceof HTMLTextAreaElement||L instanceof HTMLInputElement||L.isContentEditable,q=L.closest(".wb-stage-board")!==null;if(S||q)return}Ue()}});function me(l){if(l.kind==="session"||l.kind==="log")return t.sessionLog!==void 0?`local:${l.id}`:void 0;if(l.kind==="remote")return t.remoteSessionLog!==void 0?`remote:${l.team}`:void 0;if(l.picked!==void 0&&l.url!==void 0&&t.remoteSessionLog!==void 0)return`peer:${l.url}:${l.picked}`}function Ne(l){var L,S,q;return l.kind==="session"||l.kind==="log"?((L=t.sessionLog)==null?void 0:L.call(t,l.id))??Promise.resolve({ok:!1,error:"sessionLog unavailable"}):l.kind==="remote"?((S=t.remoteSessionLog)==null?void 0:S.call(t,{team:l.team}))??Promise.resolve({ok:!1,error:"remoteSessionLog unavailable"}):((q=t.remoteSessionLog)==null?void 0:q.call(t,{peer:l.url,id:l.picked}))??Promise.resolve({ok:!1,error:"remoteSessionLog unavailable"})}function Me(){const l=e;if(l===null)return;const L=l.kind==="log"||l.kind==="remote"||l.kind==="session"&&l.live===!1;Ce.className=`wb-chat-dot ${l.kind==="peer"?"is-peer":L?"is-cold":"is-live"}`,Ce.title=l.kind==="peer"?"对端主机":l.kind==="log"?"只读日志":l.kind==="remote"?"远端会话":l.live===!1?"冷会话":"在线",C.textContent=l.kind==="peer"&&l.picked!==void 0?`…${l.picked.slice(-12)}`:l.title,E.textContent=l.kind==="peer"&&l.picked!==void 0?l.title:l.sub,V.hidden=!(l.kind==="peer"&&l.picked!==void 0)}function $(l,L){const S=be("div","wb-kv");S.appendChild(be("span","wb-kv-k")).textContent=l,S.appendChild(be("span","wb-kv-v")).textContent=L,N.appendChild(S)}function z(){var L,S,q;N.replaceChildren();const l=e;l!==null&&(l.kind==="session"?($("会话",l.id),l.team!==void 0&&$("路由",l.team),$("来源","本机会话日志")):l.kind==="log"?($("会话",l.id),$("来源","本机会话日志(不在网络目录)")):l.kind==="remote"?($("路由",l.team),((L=l.row)==null?void 0:L.origin)!==void 0&&$("来源",l.row.origin),((S=l.row)==null?void 0:S.via)!==void 0&&$("经",l.row.via),((q=l.row)==null?void 0:q.workspace)!==void 0&&$("工作区",l.row.workspace)):($("对端",l.url??l.sub),l.picked!==void 0&&$("会话",l.picked),$("来源","经本机代理读取对端 /a2a/log")))}function ae(l){return l.kind==="log"?"只读日志 —— 此会话当前不在网络目录(可能已归档或未入网)。":l.kind==="remote"?t.remoteSessionLog!==void 0?"远端会话 —— 经本机代理从对端 /a2a/log 读取最近对话。":"远端节点的对话记录在对端机器上;本页的代理读取面未启用。":l.kind==="peer"?l.url===void 0||t.remoteSessionLog===void 0?`对端主机节点(${l.sub})—— 会话记录存放在对端机器上,本页只读本机会话日志。`:l.picked===void 0?"对端主机 —— 选择一个会话阅读(经本机代理读取对端 /a2a/log)。":"":t.sessionLog===void 0?"本页未接入会话日志读取,只显示从这里发出的消息。":""}function fe(){return v.scrollHeight-v.scrollTop-v.clientHeight<=Vn}function ee(l){const L=()=>{v.scrollTop=v.scrollHeight};L(),requestAnimationFrame(L)}function K(l,L){const S=be("div",`wb-chat-empty${L==="error"?" is-error":""}`);return S.textContent=l,S}function ue(l,L){const S=l==="user",q=be("div",`wb-msg ${S?"wb-msg-user":"wb-msg-assistant"}`),Y=be("span","wb-msg-who");Y.textContent=S?"问":"答";const Q=be("div","wb-msg-text");return Q.textContent=L,q.append(Y,Q),q}function se(l){if(h.replaceChildren(),l===void 0){h.appendChild(K("读取中…"));return}if(l.ok!==!0||l.messages===void 0){h.appendChild(K(`无法读取(${l.error??"未知错误"})`,"error"));return}if(l.messages.length===0){h.appendChild(K("暂无对话记录"));return}for(const L of l.messages)h.appendChild(ue(L.role,L.text))}function Oe(l,L){if(h.replaceChildren(),L===void 0){h.appendChild(K("读取中…"));return}if(L.ok!==!0||L.sessions===void 0){h.appendChild(K(`无法读取(${L.error??"未知错误"})`,"error"));return}if(L.sessions.length===0){h.appendChild(K("对端没有可读会话"));return}const S=be("div","wb-chat-sessions"),q=t.now();for(const Y of L.sessions){const Q=be("button","wb-chat-session");Q.type="button",Q.appendChild(be("span","wb-chat-session-id")).textContent=`…${Y.id.slice(-12)}`;const pe=[Y.mtimeMs!==void 0?Wt(Y.mtimeMs,q):"",qn(Y.sizeBytes)].filter(Boolean).join(" · ");Q.appendChild(be("span","wb-chat-session-meta")).textContent=pe,Q.title=Y.id,Q.addEventListener("click",()=>{(e==null?void 0:e.kind)!=="peer"||e.url!==l||(e.picked=Y.id,ot())}),S.appendChild(Q)}h.appendChild(S)}function Pe(l=!1){const L=e;if(L===null)return;if(A.textContent=ae(L),A.hidden=A.textContent==="",L.kind==="peer"&&L.picked===void 0){if(L.url===void 0||t.remoteSessionLog===void 0){h.replaceChildren();return}const Y=L.url,Q=`peer:${Y}`;if(!l&&m.has(Q)){Oe(Y,m.get(Q));return}m.set(Q,void 0),Oe(Y,void 0),t.remoteSessionLog({peer:Y}).then(pe=>{m.set(Q,pe),(e==null?void 0:e.kind)==="peer"&&e.url===Y&&e.picked===void 0&&Oe(Y,pe)},pe=>{const he={ok:!1,error:pe instanceof Error?pe.message:String(pe)};m.set(Q,he),(e==null?void 0:e.kind)==="peer"&&e.url===Y&&e.picked===void 0&&Oe(Y,he)});return}const S=me(L);if(S===void 0){h.replaceChildren(),Te(!0);return}const q=()=>{const Y=a.get(S);Y===void 0||l?ee():(v.scrollTop=Y,requestAnimationFrame(()=>{e!==null&&me(e)===S&&(v.scrollTop=Y)}))};if(!l&&r.has(S)&&r.get(S)!==void 0){se(r.get(S)),Te(!0),q();return}l&&a.delete(S),r.set(S,void 0),se(void 0),Te(!0),Ne(L).then(Y=>{var Q;r.set(S,Y),(Y==null?void 0:Y.ok)===!0&&Y.messages!==void 0&&((Q=t.onTranscript)==null||Q.call(t,L,Y.messages)),!(e===null||me(e)!==S)&&(se(Y),Te(),q())},Y=>{const Q={ok:!1,error:Y instanceof Error?Y.message:String(Y)};r.set(S,Q),e!==null&&me(e)===S&&se(Q)})}function Ye(l){return((o==null?void 0:o.tasks)??[]).filter(L=>L.team===l)}function _e(l){return((o==null?void 0:o.tasksDead)??[]).filter(L=>L.team===l)}let De="";function pt(l){return l.reason==="fire-forget"?{text:"已过期(免回执)",tone:"muted",hint:"免回执消息到 24h TTL 归档,属正常记账"}:{text:"死信",tone:"danger",hint:l.reason!==void 0&&l.reason!=="unspecified"?`${l.reason}:超过 24h TTL 仍未结算,需在台账清账`:"超过 24h TTL 仍未结算,需在台账清账"}}function We(l,L){const S=l.direction==="inbound";if(l.receiptExpected===!1)return{text:S?"来信 · 无需回执":"已送达 · 无回执",tone:"muted",hint:"免回执消息:不等回执,24h 后自动归档"};const q=L-l.startedAt>Gn;return{text:`${q?"陈旧":S?"待本机回执":"待回执"} · ${l.status}`,tone:q?"warn":"wait",hint:`${S?"对方等待本机回执;":""}派发于 ${Wt(l.startedAt,L)}`}}function Je(l,L){const S=`结算于 ${Wt(l.resolvedAt,L)}`;if(l.endedBy==="abandoned"||l.endedBy==="cancelled"){const pe=l.endedBy==="cancelled"?"撤回":"放弃";return l.late===!0?{text:`已${pe} · 回执迟到`,tone:"warn",hint:`${S};本机${pe}之后对方回执才到,结局不改写`}:{text:`已${pe}`,tone:"muted",hint:`${S};本机${pe},未等到回执`}}if(l.endedBy==="echo")return{text:"已结算 · 内容回显",tone:"ok",hint:`${S};对方回了内容但未带正式回执,按内容回显结算`};if(l.endedBy===void 0&&l.outcome==="abandoned")return{text:"已放弃(本机或对方)",tone:"muted",hint:`${S};本机放弃或撤回,或对方回执报告放弃`};const q=l.summary!==void 0&&l.summary!==""?` · ${l.summary}`:"";if(l.outcome==="abandoned")return{text:"已回执 · 对方放弃",tone:"warn",hint:`${S};对方回执报告放弃${q}`};const Y=Gt.find(pe=>pe.key===l.outcome),Q=(Y==null?void 0:Y.tone)==="completed"?"ok":(Y==null?void 0:Y.tone)==="failed"?"danger":(Y==null?void 0:Y.tone)==="rejected"?"warn":"muted";return l.outcome==="unclassified"?{text:"已回执",tone:"ok",hint:`${S};回执未带结论${q}`}:{text:`已回执 · ${(Y==null?void 0:Y.label)??l.outcome}`,tone:Q,hint:`${S}${q}`}}function kt(l,L,S){const q=_e(L).find(pe=>pe.taskId===l);if(q!==void 0)return pt(q);const Y=Ye(L).find(pe=>pe.taskId===l);if(Y!==void 0)return We(Y,S);const Q=((o==null?void 0:o.archived)??[]).find(pe=>pe.taskId===l&&pe.team===L);return Q!==void 0?Je(Q,S):d.has(l)?{text:"已离开台账",tone:"muted",hint:"已结算、放弃或撤回之一;主机未给出这条的结局(旧主机,或已超出最近 64 条归档)"}:{text:"已派发",tone:"muted",hint:"异步送达;回执到达后进台账"}}function Ie(l){const L=t.now(),S=x.get(l)??[],q=new Set(S.map(Z=>Z.taskId).filter(Z=>Z!==void 0)),Y=Z=>Z!==void 0&&Z!==""?Z:"(无摘要)",Q=Ye(l).filter(Z=>!q.has(Z.taskId)).map(Z=>({at:Z.startedAt,side:Z.direction==="inbound"?"theirs":"mine",text:Y(Z.brief),status:We(Z,L),taskId:Z.taskId})),pe=_e(l).filter(Z=>!q.has(Z.taskId)).map(Z=>{var w;const $e=Z.direction??y.get(Z.taskId)??(((w=Z.peer)==null?void 0:w.startsWith("local:"))===!0?"inbound":void 0);return{at:Z.startedAt,side:$e==="inbound"?"theirs":$e==="outbound"?"mine":"system",text:Y(Z.brief),status:pt(Z),taskId:Z.taskId}}),he=S.map(Z=>({at:Z.at,side:"mine",text:Z.text,status:Z.state==="sending"?{text:"发送中…",tone:"muted"}:Z.state==="failed"?{text:`失败:${Z.error??"未知原因"}`,tone:"danger"}:Z.taskId!==void 0?kt(Z.taskId,l,L):{text:"已派发",tone:"muted"},taskId:Z.taskId}));return[...Q,...pe,...he].sort((Z,$e)=>Z.at-$e.at)}function Te(l=!1){const L=e,S=L!==null?Xt(L):void 0,q=S!==void 0?Ie(S):[],Y=JSON.stringify([S??"",...q.map(he=>[he.taskId??"",he.side,he.text,he.status.text])]);if(!l&&Y===De)return;De=Y;const Q=fe();if(R.replaceChildren(),q.length===0)return;const pe=be("div","wb-chat-divider");pe.textContent="台账往来 · 异步送达,回执进台账",R.appendChild(pe);for(const he of q){const Z=he.side==="mine"?"wb-msg wb-msg-user wb-msg-out":he.side==="theirs"?"wb-msg wb-msg-assistant wb-msg-in":"wb-msg wb-msg-ledger",$e=be("div",Z);$e.appendChild(be("span","wb-msg-who")).textContent=he.side==="mine"?"我":he.side==="theirs"?"对方":"台账记录",$e.appendChild(be("div","wb-msg-text")).textContent=he.text;const w=be("div","wb-msg-meta");he.taskId!==void 0&&(w.appendChild(be("span","wb-msg-task")).textContent=he.taskId);const u=be("span",`wb-msg-status is-${he.status.tone}`);u.textContent=he.status.text,he.status.hint!==void 0&&(u.title=he.status.hint),w.appendChild(u),$e.appendChild(w),R.appendChild($e)}Q&&ee()}function et(l){const L=l.text.value.length;l.note.classList.remove("is-error"),l.note.textContent=L>Nt*.9?`${L}/${Nt}`:"Enter 发送 · Shift+Enter 换行",L>Nt&&l.note.classList.add("is-error"),l.submit.disabled=l.text.value.trim()===""||L>Nt}function nt(l){l.style.height="auto",l.style.height=`${Math.min(l.scrollHeight,160)}px`}function Ge(l){const L=be("form","wb-dispatch-form wb-chat-composer"),S=document.createElement("textarea");S.className="wb-dispatch-text",S.rows=1,S.placeholder="发一句话任务给这个节点…",S.setAttribute("aria-label","发送消息");const q=be("button","wb-dispatch-submit");q.type="submit",q.textContent="发送",q.setAttribute("aria-label","发送");const Y=be("div","wb-dispatch-note");Y.setAttribute("aria-live","polite");const Q=be("div","wb-chat-composer-row");Q.append(S,q),L.append(Q,Y);const pe={team:l,form:L,text:S,note:Y,submit:q};return S.addEventListener("input",()=>{nt(S),et(pe)}),S.addEventListener("keydown",he=>{he.key!=="Enter"||he.shiftKey||he.ctrlKey||he.altKey||he.metaKey||he.isComposing||(he.preventDefault(),L.requestSubmit())}),L.addEventListener("submit",he=>{he.preventDefault();const Z=S.value.trim();if(Z===""||Z.length>Nt||t.dispatchQuick===void 0)return;const $e={text:Z,at:t.now(),state:"sending"},w=x.get(l)??[];w.push($e),x.set(l,w),S.value="",nt(S),et(pe),S.focus({preventScroll:!0}),Te(),ee(),t.dispatchQuick(l,Z).then(u=>u,u=>({ok:!1,error:u instanceof Error?u.message:String(u)})).then(u=>{u.ok===!0?($e.state="sent",$e.taskId=u.task_id,Y.classList.remove("is-error"),Y.textContent=`已派发${u.task_id!==void 0?` · ${u.task_id}`:""} · 回执将入台账`):($e.state="failed",$e.error=u.error??"未知原因",S.value===""&&(S.value=Z,nt(S)),Y.classList.add("is-error"),Y.textContent=`失败:${$e.error}`,q.disabled=S.value.trim()===""),e!==null&&Xt(e)===l&&Te()})}),et(pe),pe}function it(){const l=e;if(P.replaceChildren(),l===null)return;const L=Xt(l);if(L!==void 0&&t.dispatchQuick!==void 0){let q=_.get(L);q===void 0&&(q=Ge(L),_.set(L,q)),P.appendChild(q.form),s&&(s=!1,q.text.focus({preventScroll:!0}));return}s=!1;const S=be("div","wb-chat-readonly");S.textContent=l.kind==="log"?"只读日志:此会话不在网络目录,不能从这里派发。":l.kind==="peer"?"对端主机:选择会话阅读;要派发请打开它的远端会话节点。":"此节点没有可派发的路由。",P.appendChild(S)}function ot(){Me(),z(),Pe(),it()}function Et(l){const L=e!==null&&un(e)===un(l);e=l,L||(s=!0),ot(),D.classList.add("is-open")}function Ue(){e=null,D.classList.remove("is-open")}function Ve(l){o=l;for(const S of(l==null?void 0:l.tasks)??[])d.add(S.taskId),y.set(S.taskId,S.direction==="inbound"?"inbound":"outbound");const L=e;if(L!==null){if(L.kind==="session"&&l!==null){const S=(l.sessions??[]).find(q=>q.id===L.id);S!==void 0&&(L.title=mt(S),L.live=S.live)}Me(),Te()}}return{root:D,open:Et,close:Ue,isOpen:()=>e!==null,update:Ve}}const Sn="dsh-a2a.rail.tab";function Zn(){try{return window.localStorage.getItem(Sn)}catch{return null}}function eo(t){try{window.localStorage.setItem(Sn,t)}catch{}}function to(t,e={}){var re;const o=document.createElement("aside");o.className="wb-rail";const s=document.createElement("div");s.className="wb-tabs",s.setAttribute("role","tablist"),s.setAttribute("aria-label","工作台侧栏");const n=document.createElement("div");n.className="wb-tabpanels",o.append(s,n);const r=new Map,a=new Map,m=new Map,x=new Set;for(const C of t){const E=document.createElement("button");E.type="button",E.className="wb-tab",E.id=`wb-tab-${C.key}`,E.dataset.sec=C.key,E.setAttribute("role","tab"),E.setAttribute("aria-controls",`wb-panel-${C.key}`);const H=document.createElement("span");H.className="wb-tab-label",H.textContent=C.label;const b=document.createElement("span");b.className="wb-tab-badge",E.append(H,b),E.addEventListener("click",()=>j(C.key)),s.appendChild(E);const f=document.createElement("section");f.className="wb-tabpanel",f.id=`wb-panel-${C.key}`,f.dataset.sec=C.key,f.setAttribute("role","tabpanel"),f.setAttribute("aria-labelledby",E.id),f.tabIndex=-1,n.appendChild(f),r.set(C.key,E),a.set(C.key,f),m.set(C.key,b)}const d=()=>t.map(C=>C.key).filter(C=>!x.has(C)),y=Zn();let _=((re=t.find(C=>C.key===y))==null?void 0:re.key)??t[0].key;s.addEventListener("keydown",C=>{const E=d(),H=E.indexOf(_);let b;C.key==="ArrowRight"?b=E[(H+1)%E.length]:C.key==="ArrowLeft"?b=E[(H-1+E.length)%E.length]:C.key==="Home"?b=E[0]:C.key==="End"&&(b=E[E.length-1]),b!==void 0&&(C.preventDefault(),j(b,{focus:!0}))});function D(){for(const C of t){const E=C.key===_,H=r.get(C.key);H.setAttribute("aria-selected",String(E)),H.tabIndex=E?0:-1,H.classList.toggle("is-active",E),H.hidden=x.has(C.key),a.get(C.key).hidden=!E}}function j(C,E={}){var b;if(x.has(C))return;const H=C!==_;_=C,eo(C),D(),E.focus===!0&&r.get(C).focus(),H&&((b=e.onChange)==null||b.call(e,C))}function V(C,E,H){const b=m.get(C);b.textContent=E,b.className=`wb-tab-badge${H!==void 0?` is-${H}`:""}`}function Ce(C,E){E?x.add(C):x.delete(C),x.has(_)&&(_=d()[0]??t[0].key),D()}return D(),{root:o,panel:C=>a.get(C),select:j,selected:()=>_,setBadge:V,setHidden:Ce}}const no=[{key:"all",label:"全部",hint:"不过滤:目录全部条目"},{key:"local",label:"本机",hint:"本机会话节点(现场 + 冷启动)"},{key:"canvas",label:"队",hint:"画布队(人类手工分配的组队)"},{key:"remote",label:"远端",hint:"远端会话队(来自对端卡片)"},{key:"logs",label:"日志",hint:"本机日志:不在网络目录里的会话档案"}];function qe(t,e){const o=document.createElement(t);return e!==void 0&&(o.className=e),o}function Tt(...t){const e=[];for(const o of t)o!==void 0&&(typeof o=="string"?e.push(o):e.push(...o));return e.join(" ").toLowerCase()}function oo(t,e){const o=Math.max(0,Math.round((e-t)/1e3));if(o<60)return"刚刚";const s=Math.round(o/60);if(s<60)return`${s} 分钟前`;const n=Math.round(s/60);return n<48?`${n} 小时前`:`${Math.round(n/24)} 天前`}function fn(t){return t>=1e6?`${(t/1e6).toFixed(1)} MB`:t>=1e3?`${Math.round(t/1e3)} KB`:`${t} B`}function so(t,e){const o=new Date(e);o.setHours(0,0,0,0);const s=o.getTime();return t>=s?"今天":t>=s-864e5?"昨天":"更早"}function io(t,e){var H;t.replaceChildren();const{state:o,search:s,filter:n}=e,r=s!==""||n!=="all",a=(b,f)=>(n==="all"||n===b)&&(s===""||f.includes(s)),m=(b,f,N)=>{const v=qe("div","wb-dir-group"),A=qe("div","wb-dir-head");return A.appendChild(qe("span","wb-dir-head-label")).textContent=`${b} · ${f}`,N!==void 0&&(A.appendChild(qe("span","wb-dir-head-note")).textContent=N),v.appendChild(A),t.appendChild(v),v},x=(b,f,N,v,A,h,R)=>{const P=qe("button","wb-item");P.type="button",P.appendChild(qe("span",`wb-dot ${f}`)).textContent=N;const me=qe("span","wb-item-text");return me.appendChild(qe("span","wb-item-label")).textContent=v,A!==""&&(me.appendChild(qe("span","wb-item-sub")).textContent=A),P.appendChild(me),R!==void 0&&(P.title=R),P.addEventListener("click",h),b.appendChild(P),P},d=(b,f)=>{if(f===void 0||f.length===0)return;const N=qe("span","wb-item-badge"),v=f.map(A=>A.slice(A.lastIndexOf("/")+1));N.textContent=`▤ ${v.slice(0,2).join(" ")}${v.length>2?` +${v.length-2}`:""}`,N.title=`画布队:${f.join(" · ")}`,b.appendChild(N)},y=(o.sessions??[]).filter(b=>a("local",Tt(mt(b),b.team,b.label,b.id,b.canvasTeams))),_=y.filter(b=>b.live===!0),D=y.filter(b=>b.live!==!0);if(y.length>0){const b=m("本机会话",y.length,D.length>0?`${_.length} 在线 · ${D.length} 冷`:void 0);for(const f of[..._,...D]){const N=f.live===!0,v=x(b,N?"wb-dot-live":"wb-dot-cold",N?"●":"○",mt(f),N?f.team:`冷 · ${f.team}`,()=>e.openChat({kind:"session",id:f.id,title:mt(f),sub:f.team,team:f.team,live:f.live}),f.id);d(v,f.canvasTeams)}}const j=(((H=o.canvas)==null?void 0:H.teams)??[]).filter(b=>a("canvas",Tt(b.name,b.team,b.members.map(f=>f.team??f.id))));if(j.length>0){const b=m("画布队",j.length);for(const f of j){const N=f.members.filter(v=>v.remote===!0).length;x(b,"wb-dot-canvas","▤",f.name,`${f.members.length} 成员${N>0?` · ${N} 远端`:""}`,()=>e.selectCanvas(f),f.team)}}const V=(o.remote??[]).filter(b=>a("remote",Tt(mt(b),b.team,b.origin,b.workspace,b.canvasTeams)));if(V.length>0){const b=m("远端节点",V.length);for(const f of V){const N=x(b,"wb-dot-remote","◇",mt(f),f.origin!==void 0&&f.origin!==""?f.origin:f.team,()=>e.openChat({kind:"remote",team:f.team,title:mt(f),sub:f.team,row:f}),f.team);d(N,f.canvasTeams)}}const Ce=new Set((o.sessions??[]).map(b=>b.id)),re=e.logs.filter(b=>!Ce.has(b.id)&&a("logs",Tt(b.id,e.titles.get(b.id))));if(re.length>0){const b=e.logTotal!==void 0&&e.logTotal>e.logs.length,f=m("本机日志",re.length,b?`显示 ${e.logs.length} / 共 ${e.logTotal}`:void 0);let N="";for(const v of[...re].sort((A,h)=>h.mtimeMs-A.mtimeMs)){const A=so(v.mtimeMs,e.now);A!==N&&(N=A,f.appendChild(qe("div","wb-dir-day")).textContent=A);const h=e.titles.get(v.id),R=x(f,"wb-dot-log","❐",h??`会话 …${v.id.slice(-12)}`,`${oo(v.mtimeMs,e.now)} · ${fn(v.sizeBytes)}`,()=>e.openChat({kind:"log",id:v.id,title:h??`…${v.id.slice(-12)}`,sub:"本机日志"}),`${v.id}
|
|
3
|
-
${new Date(v.mtimeMs).toLocaleString()} · ${fn(v.sizeBytes)}`);h===void 0&&R.classList.add("is-untitled")}}y.length+j.length+V.length+re.length===0&&(t.appendChild(qe("div","wb-dir-empty")).textContent=r?"无匹配条目":"目录为空");const C=o.sessions??[];return`${C.filter(b=>b.live===!0).length}/${C.length}`}const An="dsh-a2a.logtitles",ao=300,pn=60;function ro(){try{const t=window.localStorage.getItem(An),e=t===null?null:JSON.parse(t);if(e!==null&&typeof e=="object")return new Map(Object.entries(e).filter(o=>typeof o[1]=="string"))}catch{}return new Map}function lo(t,e,o){const s=o.find(a=>a.role==="user"&&a.text.trim()!=="")??o.find(a=>a.text.trim()!=="");if(s===void 0)return!1;const n=s.text.trim().split(`
|
|
4
|
-
`)[0].trim(),r=n.length>pn?`${n.slice(0,pn-1)}…`:n;if(t.get(e)===r)return!1;for(t.delete(e),t.set(e,r);t.size>ao;)t.delete(t.keys().next().value);try{window.localStorage.setItem(An,JSON.stringify(Object.fromEntries(t)))}catch{}return!0}function rt(t){return t.name??t.team??t.label??""}function Mt(t,e){const o=Math.max(0,Math.round((e-t)/1e3));if(o<90)return`${o}s`;const s=Math.round(o/60);if(s<90)return`${s}m`;const n=Math.round(s/60);return n<48?`${n}h`:`${Math.round(n/24)}d`}function M(t,e){const o=document.createElement(t);return e!==void 0&&(o.className=e),o}function hn(t,e,o){const s=M("div","wb-kv");s.appendChild(M("span","wb-kv-k")).textContent=e,s.appendChild(M("span","wb-kv-v")).textContent=o,t.appendChild(s)}function co(t){try{return new URL(t).host}catch{return t}}const mo=[{key:"directory",label:"目录"},{key:"hosts",label:"主机"},{key:"ledger",label:"台账"},{key:"activity",label:"活动"},{key:"plan",label:"规划"}];function uo(t){const e=t.board;let o="data",s,n=null,r="",a="all",m=null,x=null,d=[],y;const _=ro();let D=!1;const j=M("div","wb");j.setAttribute("data-testid","wb-root");const V=M("header","wb-header"),Ce=M("button","wb-icon-btn wb-menu");Ce.type="button",Ce.dataset.testid="wb-menu",Ce.setAttribute("aria-label","打开目录抽屉"),Ce.textContent="☰",Ce.addEventListener("click",()=>j.classList.toggle("is-rail-open")),V.appendChild(Ce);const re=M("div","wb-title");re.appendChild(M("span","wb-title-main")).textContent="A2A 工作台";const C=M("span","wb-badge");re.appendChild(C),V.appendChild(re);const E=M("button","wb-icon-btn wb-owner-btn");E.type="button",E.dataset.testid="wb-owner-btn",E.setAttribute("aria-label","主人设置(三键面板)"),E.title="主人设置:入网白名单 / 可见性 / 发布",E.textContent="⚙",E.addEventListener("click",()=>{Ue=!Ue,l()}),V.appendChild(E);const H=M("div","wb-header-stats");V.appendChild(H);const b=M("button","wb-icon-btn wb-rail-toggle");b.type="button",b.dataset.testid="wb-rail-toggle",b.setAttribute("aria-label","折叠/展开侧栏"),b.textContent="◧",b.addEventListener("click",()=>{j.classList.toggle("is-rail-collapsed"),o==="canvas"&&e!==void 0&&e.activate()}),V.appendChild(b);const f=M("div","wb-body"),N=to(mo),v=N.root,A=M("div","wb-directory"),h=M("div","wb-dir-tools"),R=document.createElement("input");R.className="wb-search",R.type="search",R.placeholder="搜索:名称 / 队 / 会话 / 节点",R.setAttribute("aria-label","统一搜索目录"),R.addEventListener("input",()=>{r=R.value.trim().toLowerCase(),We()}),h.appendChild(R);const P=M("div","wb-filters");for(const w of no){const u=M("button","wb-filter");u.type="button",u.textContent=w.label,u.dataset.filter=w.key,u.title=w.hint,u.addEventListener("click",()=>{a=w.key,We()}),P.appendChild(u)}h.appendChild(P),N.panel("directory").appendChild(h),N.panel("directory").appendChild(A);const me=M("section","wb-pane"),Ne=M("section","wb-pane"),Me=M("section","wb-pane"),$=M("section","wb-pane"),z=[["ledger",me],["activity",Ne],["plan",Me],["hosts",$]],ae=M("main","wb-stage"),fe=M("section","wb-stage-board");e!==void 0&&(fe.appendChild(e.root),ae.appendChild(fe));const ee=M("div","wb-data"),K=M("aside","wb-inspector"),ue=M("div","wb-inspector-head");ue.appendChild(M("span","wb-inspector-title")).textContent="详情";const se=M("button","wb-icon-btn");se.type="button",se.setAttribute("aria-label","关闭详情"),se.textContent="✕",se.addEventListener("click",()=>pt(void 0)),ue.appendChild(se),K.appendChild(ue);const Oe=M("div","wb-inspector-body");K.appendChild(Oe);const Pe=Qn({now:t.now,sessionLog:t.sessionLog,remoteSessionLog:t.remoteSessionLog,dispatchQuick:t.dispatchQuick,onTranscript:(w,u)=>{w.kind!=="log"&&w.kind!=="session"||lo(_,w.id,u)&&We()}});ae.appendChild(ee),f.appendChild(v),f.appendChild(ae),f.appendChild(K),f.appendChild(Pe.root),j.appendChild(V),j.appendChild(f);function Ye(w){for(const[u,B]of z){const T=w==="canvas"?N.panel(u):ee;N.setHidden(u,w!=="canvas"),B.parentElement!==T&&T.appendChild(B)}}function _e(){const u=e!==void 0&&e.available()?"canvas":"data";j.dataset.mode=u,fe.classList.toggle("is-hidden",u!=="canvas"),ee.classList.toggle("is-hidden",u==="canvas"),Ye(u),u!==o&&(e!==void 0&&(u==="canvas"?e.activate():e.deactivate()),o=u)}function De(w){for(;w.firstChild!==null;)w.removeChild(w.firstChild);return w}function pt(w){s=w,((w==null?void 0:w.kind)!=="canvas"||(m==null?void 0:m.name)!==w.row.name)&&(m=null),(w==null?void 0:w.kind)!=="canvas"&&(x=null),S(),j.classList.remove("is-rail-open")}function We(){for(let u=0;u<P.children.length;u++){const B=P.children[u];B.classList.toggle("is-active",B.dataset.filter===a)}if(n===null){A.replaceChildren(M("div","wb-muted")),A.firstElementChild.textContent="载入中…",N.setBadge("directory","");return}const w=io(A,{state:n,logs:d,logTotal:y,titles:_,search:r,filter:a,now:t.now(),openChat:Q,selectCanvas:u=>pt({kind:"canvas",row:u})});N.setBadge("directory",w)}function Je(){const w=De($);if(n===null){N.setBadge("hosts","");return}const u=t.now(),B=[...n.peers??[]].sort((T,O)=>{const W=te=>te.link==="linked"?0:1;return W(T)-W(O)||(O.score??0)-(T.score??0)});if(N.setBadge("hosts",B.length>0?`${B.filter(T=>T.link==="linked").length}/${B.length}`:""),B.length===0){w.appendChild(M("div","wb-nodelist-empty")).textContent="暂无 tracked peer——配 peers 种子或等 referral 到达";return}for(const T of B){const O=co(T.url),W=M("div","wb-host-row"),te=M("span","wb-host-lamp"),U=T.lastContactAt,ge=U===void 0?void 0:u-U,ke=T.lastContactOk;ge===void 0?te.classList.add("is-unknown"):ke===!1&&ge<=5*6e4?te.classList.add("is-fail"):ge<=6e4?te.classList.add("is-live"):ge<=5*6e4?te.classList.add("is-warm"):te.classList.add("is-cold"),te.title=U===void 0?"尚无接触记录":`最近接触 ${Mt(U,u)}${ke===!1?"(失败)":ke===!0?"(成功)":""}`,W.appendChild(te),W.appendChild(M("span","wb-host-name")).textContent=T.name!==void 0&&T.name!==""?T.name:O;const Fe=M("span",`wb-host-badge ${T.link==="linked"?"is-linked":"is-stranger"}`);Fe.textContent=`${T.link==="linked"?"linked":"stranger"} ${T.verified===!0?"✓":"✗"}`,Fe.title=T.link==="linked"?`已建立运营者链接(互种或 canvas 引用);${T.verified===!0?"验签有效":"尚未持有验签通过的卡片"}`:"无运营者关系(验签 ≠ 关系)",W.appendChild(Fe),T.version!==void 0&&T.version!==""&&(W.appendChild(M("span","wb-host-ver")).textContent=T.version),W.appendChild(M("span","wb-host-url mono")).textContent=O,W.setAttribute("role","button"),W.tabIndex=0,W.title=`${T.url} · score ${String(T.score??0)}`;const oe=()=>{Q({kind:"peer",id:`peer-${O}`,title:T.name!==void 0&&T.name!==""?T.name:O,sub:O,url:T.url})};W.addEventListener("click",oe),W.addEventListener("keydown",Ae=>{(Ae.key==="Enter"||Ae.key===" ")&&(Ae.preventDefault(),oe())}),w.appendChild(W)}}function kt(){if(n===null){me.replaceChildren(),N.setBadge("ledger","");return}const w=n,u=T=>{const O=(w.sessions??[]).find(te=>te.team===T);if(O!==void 0)return{kind:"session",id:O.id,title:rt(O),sub:O.team,team:O.team,live:O.live};const W=(w.remote??[]).find(te=>te.team===T);if(W!==void 0)return{kind:"remote",team:W.team,title:rt(W),sub:W.team,row:W}},B=zn(me,{state:w,now:t.now(),abandon:(T,O)=>t.abandon(T,O),canOpenTeam:T=>u(T)!==void 0,openTeam:T=>{const O=u(T);return O===void 0?!1:(Q(O),!0)}});N.setBadge("ledger",B.badge,B.tone)}function Ie(){var te;const w=De(Ne);if(n===null)return;const u=t.now(),B=n.inFlight??[];N.setBadge("activity",B.length>0?String(B.length):"",B.length>0?"accent":void 0);const T=M("div","wb-pane-head");if(T.textContent=`在途 ${B.length} · 活动 ${((te=n.activity)==null?void 0:te.length)??0}`,w.appendChild(T),B.length>0){const U=M("div","wb-pane-subhead");U.textContent="在途路由",w.appendChild(U);for(const ge of B){const ke=M("div","wb-row");ke.appendChild(M("span","wb-row-dir")).textContent="→",ke.appendChild(M("span","wb-row-team")).textContent=ge.team,ke.appendChild(M("span","wb-row-meta")).textContent=`${ge.peer} · ${Mt(ge.startedAt,u)}`,w.appendChild(ke)}}const O=M("div","wb-pane-subhead");O.textContent="活动环(最新在前)",w.appendChild(O);const W=n.activity??[];if(W.length===0){w.appendChild(M("div","wb-muted")).textContent="暂无活动";return}for(const U of W){const ge=M("div","wb-row"),ke=M("span","wb-row-dir");ke.textContent=U.dir==="out"?"→":"←",U.ok!==!0&&ke.classList.add("is-fail"),ge.appendChild(ke),ge.appendChild(M("span","wb-row-team")).textContent=U.team,ge.appendChild(M("span","wb-row-meta")).textContent=`${U.peer} · ${Mt(U.ts,u)}`,ge.appendChild(M("span","wb-row-badges")).textContent=U.ok===!0?"":"失败",w.appendChild(ge)}}function Te(w){var W,te;const u=t.now(),B=[],T=zt(w,u);T.deadLetters.length>0&&B.push({severity:"high",text:`清账 ${T.deadLetters.length} 条死信(目标早已离开或死信化,无回执可期)`});for(const U of T.stale){const ge=U.brief===void 0||U.brief===""?"":`「${U.brief}」`;B.push({severity:"normal",text:`催办 ${U.taskId} → ${U.team}(等待 ${Mt(U.startedAt,u)} 无回执)${ge}`,brief:`a2a_route 催收回执:task ${U.taskId}(team ${U.team})${ge===""?"":`原任务「${U.brief}」`}已派发 ${Mt(U.startedAt,u)},请回报结果或回执。`})}for(const U of w.sessions??[])U.live!==!0&&B.push({severity:"normal",text:`冷会话 ${rt(U)}:在 GUI 打开该会话即可唤醒加入面`});for(const U of((W=w.reconcile)==null?void 0:W.rows)??[])U.needsRepair===!0&&B.push({severity:"high",text:`reconcile 需修复:${U.id} ${U.error}`});const O=((te=w.idempotency)==null?void 0:te.conflicts)??0;return O>0&&B.push({severity:"high",text:`幂等冲突 ${O} 例:人工核查 UNIQUE-ization 流量`}),B}function et(){const w=De(Me);if(n===null)return;const u=Te(n);N.setBadge("plan",u.length>0?String(u.length):"",u.some(O=>O.severity==="high")?"danger":void 0);const B=M("div","wb-pane-head");B.textContent=u.length===0?"网络健康——无待办行动":`待办行动 ${u.length}`,w.appendChild(B);for(const O of u){const W=M("div",`wb-action${O.severity==="high"?" wb-action-high":""}`);if(W.appendChild(M("span","wb-action-text")).textContent=O.text,O.brief!==void 0){const te=M("button","wb-btn");te.type="button",te.textContent="复制催办",te.addEventListener("click",()=>t.copy(O.brief??"")),W.appendChild(te)}w.appendChild(W)}const T=M("div","wb-pane-subhead");T.textContent="派单起草(复制后在任一会话粘贴执行)",w.appendChild(T),w.appendChild(nt)}const nt=M("div","wb-draft"),Ge=document.createElement("select");Ge.className="wb-select";const it=document.createElement("textarea");it.className="wb-textarea",it.rows=3,it.placeholder="任务正文:目标、验收、期限…";const ot=M("button","wb-btn wb-btn-primary");ot.type="button",ot.textContent="复制任务书",ot.addEventListener("click",()=>{const w=Ge.value,u=it.value.trim();w===""||u===""||t.copy(`a2a_route 派单 → ${w}:
|
|
5
|
-
${u}`)}),nt.appendChild(Ge),nt.appendChild(it),nt.appendChild(ot);function Et(){var O;const w=Ge.value;De(Ge);const u=document.createElement("option");if(u.value="",u.textContent="选择目标队…",Ge.appendChild(u),n===null)return;const B=n,T=new Map;for(const W of B.sessions??[])W.team!==void 0&&W.team!==""&&T.set(W.team,`${rt(W)}(会话队)`);for(const W of((O=B.canvas)==null?void 0:O.teams)??[])T.set(W.team,`${W.name}(canvas 队)`);for(const W of B.remote??[])T.set(W.team,`${rt(W)}(远端)`);for(const[W,te]of T){const U=document.createElement("option");U.value=W,U.textContent=`${te} · ${W}`,Ge.appendChild(U)}w!==""&&T.has(w)&&(Ge.value=w)}let Ue=!1,Ve=null;function l(){var w;S(),Ue&&((w=t.ownerSettingsRead)==null||w.call(t).then(u=>{if(Ue){if(u.ok!==!0){Ve=null,S();return}Ve={teamJoinAllowlist:u.teamJoinAllowlist??[],teamScopeInfo:u.teamScopeInfo!==!1,announce:u.announce===!0,announceRestartPending:u.announceRestartPending===!0},S()}}))}function L(w){const u=M("div","wb-card"),B=M("div","wb-inspector-head");B.appendChild(M("span","wb-inspector-title")).textContent="主人设置";const T=M("button","wb-icon-btn");if(T.type="button",T.setAttribute("aria-label","关闭主人设置"),T.textContent="✕",T.addEventListener("click",()=>{Ue=!1,S()}),B.appendChild(T),u.appendChild(B),t.ownerSettingsRead===void 0){const we=M("div","wb-hint");we.textContent="此宿主未提供主人设置面(旧版本)——升级后可用。",u.appendChild(we),w.appendChild(u);return}if(Ve===null){const we=M("div","wb-hint");we.textContent="读取中…",u.appendChild(we),w.appendChild(u);return}const O=Ve,W=M("div","wb-side-head");W.textContent="入网白名单(精确团队名)",u.appendChild(W);for(const we of O.teamJoinAllowlist){const ze=M("div","wb-member-row");ze.appendChild(M("span","wb-member-label")).textContent=we;const bt=M("button","wb-member-remove");bt.type="button",bt.textContent="移除",bt.addEventListener("click",()=>{var $t;($t=t.ownerSettingsWrite)==null||$t.call(t,{teamJoinAllowlist:O.teamJoinAllowlist.filter(Ht=>Ht!==we)}).then(()=>l())}),ze.appendChild(bt),u.appendChild(ze)}const te=M("div","wb-member-add"),U=M("input","wb-member-manual");U.type="text",U.placeholder="dsh/团队名(精确,无通配)",U.setAttribute("aria-label","新增白名单团队名");const ge=M("button","wb-member-submit");ge.type="button",ge.textContent="加入";const ke=()=>{var ze;const we=U.value.trim();we===""||O.teamJoinAllowlist.includes(we)||(ze=t.ownerSettingsWrite)==null||ze.call(t,{teamJoinAllowlist:[...O.teamJoinAllowlist,we]}).then(()=>l())};ge.addEventListener("click",ke),U.addEventListener("keydown",we=>{we.key==="Enter"&&ke()}),te.append(U,ge),u.appendChild(te);const Fe=M("div","wb-side-head");Fe.textContent="目录可见性(teamScopeInfo)",u.appendChild(Fe);const oe=M("div","wb-member-row"),Ae=M("button","wb-member-submit");Ae.type="button",Ae.textContent=O.teamScopeInfo?"已开:仅显示已加入团队(点击放开为全舰队可见)":"已关:全舰队可见(点击收窄为已加入团队)",Ae.addEventListener("click",()=>{var we;(we=t.ownerSettingsWrite)==null||we.call(t,{teamScopeInfo:!O.teamScopeInfo}).then(()=>l())}),oe.appendChild(Ae),u.appendChild(oe);const Re=M("div","wb-hint");Re.textContent="精度说明:teamScopeInfo 只管「目录显示范围」。关上它不会解锁任何通信准入——会话入网(S3)与目标级路由(F5)规则原样生效。",u.appendChild(Re);const Xe=M("div","wb-side-head");Xe.textContent="节点发布(announce)",u.appendChild(Xe);const at=M("div","wb-member-row"),je=M("button","wb-member-submit");if(je.type="button",je.textContent=O.announce?"已开:本节点发布签名卡(点击关闭)":"已关:本节点不发布(点击开启——重启宿主后生效)",je.addEventListener("click",()=>{var we;(we=t.ownerSettingsWrite)==null||we.call(t,{announce:!O.announce}).then(()=>l())}),at.appendChild(je),u.appendChild(at),O.announceRestartPending){const we=M("div","wb-hint");we.textContent="有 announce 变更待生效:重启宿主后按新配置发布。",u.appendChild(we)}w.appendChild(u)}function S(){var T;const w=De(Oe);if(Ue){K.classList.add("is-open"),L(w);return}if(K.classList.toggle("is-open",s!==void 0),s===void 0)return;const u=s,B=M("div","wb-card");if(u.kind==="canvas"){const O=(((T=n==null?void 0:n.canvas)==null?void 0:T.teams)??[]).find(oe=>oe.name===u.row.name)??u.row;hn(B,"Canvas 队",O.name),hn(B,"路由队",O.team);const W=M("div","wb-side-head");if(W.textContent=`成员 · ${O.members.length}`,B.appendChild(W),O.members.length===0){const oe=M("div","wb-muted");oe.textContent="空队——用下方表单添加成员",B.appendChild(oe)}for(const oe of O.members){const Ae=M("div","wb-member-row"),Re=oe.remote===!0?"◇ 远端":oe.live===!0?"● 现场":oe.joined===!0?"○ 冷启":"· 未入网";Ae.appendChild(M("span","wb-member-dot")).textContent=Re;const Xe=M("span","wb-member-label"),at=((n==null?void 0:n.sessions)??[]).find(we=>we.id===oe.id);Xe.textContent=oe.remote===!0?oe.id:at!==void 0?rt(at):oe.id,Xe.title=oe.team??oe.id,Ae.appendChild(Xe);const je=M("button","wb-member-remove");je.type="button",je.textContent="移除",je.addEventListener("click",async()=>{je.disabled=!0,await t.canvasOp("remove-member",O.name,oe.id)||(je.disabled=!1)}),Ae.appendChild(je),B.appendChild(Ae)}if((m==null?void 0:m.name)!==O.name){const oe=M("form","wb-member-add"),Ae=document.createElement("select");Ae.className="wb-member-pick",Ae.setAttribute("aria-label","选择成员");const Re=document.createElement("input");Re.type="text",Re.className="wb-member-manual",Re.placeholder="或输入远端句柄 zone/id8",Re.setAttribute("aria-label","远端成员句柄");const Xe=M("button","wb-member-submit");Xe.type="submit",Xe.textContent="添加",oe.appendChild(Ae),oe.appendChild(Re),oe.appendChild(Xe),oe.addEventListener("submit",async at=>{at.preventDefault();const je=Re.value.trim(),we=je!==""?je:Ae.value;if(we==="")return;Xe.disabled=!0;const ze=await t.canvasOp("add-member",O.name,we);Xe.disabled=!1,ze&&(Re.value="")}),m={name:O.name,form:oe,pick:Ae,manual:Re}}const te=m.pick,U=te.value;De(te),te.appendChild(new Option("本机会话(现场/冷启动)…","",!0,!0));const ge=new Set(O.members.map(oe=>oe.id));for(const oe of(n==null?void 0:n.sessions)??[])ge.has(oe.id)||te.appendChild(new Option(`${rt(oe)} — 本机`,oe.id));let ke=!1;for(const oe of(n==null?void 0:n.remote)??[])oe.team.includes("/")&&(ge.has(oe.team)||(ke||(te.appendChild(new Option("远端会话队(目录卡片)…","",!0,!1)),ke=!0),te.appendChild(new Option(`${rt(oe)} — 远端`,oe.team))));ke||te.appendChild(new Option("(暂无可拉入的远端会话队——见下方说明)","",!0,!1)),U!==""&&Array.from(te.options).some(oe=>oe.value===U)&&(te.value=U),B.appendChild(m.form);const Fe=M("div","wb-hint");Fe.textContent="成员由人类在此手工分配(agent 不可自组队)。远端成员走对端目录路由,不做本机冷唤醒;地址由目录在派发时重解析。远端下拉只列 zone/id8 会话句柄——若为空,说明目录里还没有已链接对端的会话队(未链接的对端只给最小卡);此时可在输入框手输句柄(如 dsh/xxxxxxxx)先把人拉进来,句柄本身即链接手势。",B.appendChild(Fe),t.dispatchQuick!==void 0&&B.appendChild(Y(O.team))}w.appendChild(B)}function q(w){const u=M("form","wb-dispatch-form"),B=document.createElement("textarea");B.className="wb-dispatch-text",B.placeholder="一句话任务…(≤4000 字符,异步送达,回执进台账)",B.setAttribute("aria-label","快派消息");const T=M("button","wb-dispatch-submit");T.type="submit",T.textContent="发送";const O=M("div","wb-dispatch-note");return u.appendChild(B),u.appendChild(T),u.appendChild(O),B.addEventListener("keydown",W=>{W.key!=="Enter"||W.shiftKey||W.ctrlKey||W.altKey||W.metaKey||W.isComposing||(W.preventDefault(),T.disabled||u.requestSubmit())}),u.addEventListener("submit",async W=>{var ge;W.preventDefault();const te=B.value.trim();if(te===""||T.disabled)return;T.disabled=!0,O.textContent="派发中…";let U;try{U=await(((ge=t.dispatchQuick)==null?void 0:ge.call(t,w,te))??Promise.resolve({ok:!1,error:"dispatch unavailable"}))}catch(ke){U={ok:!1,error:ke instanceof Error?ke.message:String(ke)}}T.disabled=!1,U.ok===!0&&(B.value=""),B.focus({preventScroll:!0}),O.textContent=U.ok===!0?`已派发${U.task_id!==void 0?` · ${U.task_id}`:""} · 回执将入台账(待回执)`:`失败:${U.error??"未知原因"}`}),{form:u,text:B,note:O}}function Y(w){const u=M("div","wb-dispatch"),B=M("div","wb-side-head");return B.textContent="快派",u.appendChild(B),(x==null?void 0:x.team)!==w&&(x={team:w,...q(w)}),u.appendChild(x.form),u}function Q(w){Pe.open(w),j.classList.remove("is-rail-open")}function pe(w){if(n===null)return;const u=(n.sessions??[]).find(T=>T.id===w);if(u!==void 0){Q({kind:"session",id:w,title:rt(u),sub:u.team,team:u.team,live:u.live});return}if(w.startsWith("peer-")){const T=w.slice(5),O=(n.peers??[]).find(W=>W.url.includes(T));Q({kind:"peer",id:w,title:O!==void 0?O.url:T,sub:T,url:O==null?void 0:O.url});return}d.find(T=>T.id===w)!==void 0&&Q({kind:"log",id:w,title:`…${w.slice(-12)}`,sub:"档案"})}function he(){var ge,ke;C.textContent=(n==null?void 0:n.version)!==void 0?`v${n.version}`:"v?";const w=De(H);if(n===null)return;const u=[],B=zt(n,t.now()),T=B.deadLetters.length;T>0&&u.push({text:`死信 ${T}`,tone:"danger",title:"超过 24h TTL 仍未结算的任务(unconsumed),需在台账清账"});const O=B.stale.length;O>0&&u.push({text:`陈旧 ${O}`,tone:"warn",title:"我方派发、要回执、已等待 ≥1h 仍未回执(可催办;免回执行不算)"});const W=B.owedOverdue.length;W>0&&u.push({text:`欠回执 ${W}`,tone:"warn",title:"对方投递给本机、已等待本机回执超过 1 小时"});const te=((ge=n.idempotency)==null?void 0:ge.conflicts)??0;te>0&&u.push({text:`幂等冲突 ${te}`,tone:"danger",title:"同一幂等键对应了不同载荷,需人工核查"});const U=(((ke=n.reconcile)==null?void 0:ke.rows)??[]).filter(Fe=>Fe.needsRepair===!0).length;if(U>0&&u.push({text:`需修复 ${U}`,tone:"danger",title:"reconcile 无法自动恢复的会话,见行动计划"}),u.length===0){w.appendChild(M("span","wb-header-ok")).textContent="● 无异常";return}for(const Fe of u){const oe=M("span",`wb-alert wb-alert-${Fe.tone}`);oe.textContent=Fe.text,oe.title=Fe.title,w.appendChild(oe)}}function Z(w){n=w,t.sessionLogList!==void 0&&!D&&(D=!0,t.sessionLogList().then(u=>{d=u.ok&&u.sessions!==void 0?u.sessions:[],y=u.ok?u.count:void 0}).catch(()=>{}).finally(()=>{D=!1,We()})),he(),We(),Et(),Je(),kt(),Pe.update(w),Ie(),et(),S(),_e()}function $e(w){if(w==="board"){_e();return}N.select(w)}return Z(null),{root:j,update:Z,mode:()=>o,selectTab:$e,openNodeChat:pe}}const ut=1e6,en=.25,tn=3,Ln=256,In=96;function Ct(t){const e=typeof t=="number"?t:Number.NaN;if(Number.isFinite(e))return Math.max(-ut,Math.min(ut,Math.round(e)))}function Tn(t){if(t===null||typeof t!="object")return;const e=t,o=Ct(e.x),s=Ct(e.y);return o===void 0||s===void 0?void 0:{x:o,y:s}}function fo(t){const e=Tn(t);if(e===void 0)return;const o=t,s=Ct(o.w),n=Ct(o.h);if(!(s===void 0||n===void 0||s<=0||n<=0))return{...e,w:Math.min(s,ut),h:Math.min(n,ut)}}function _n(t){if(t===null||typeof t!="object")return;const e=t;if(e.version!==1)return;const o=e.viewport;if(o===null||typeof o!="object")return;const s=o,n=Ct(s.x),r=Ct(s.y),a=s.scale,m=typeof a=="number"?a:Number.NaN;if(n===void 0||r===void 0||!Number.isFinite(m))return;const x=Math.max(en,Math.min(tn,m)),d={};if(e.nodes!==null&&typeof e.nodes=="object")for(const[_,D]of Object.entries(e.nodes)){if(typeof _!="string"||_===""||_.length>128)continue;const j=Tn(D);if(j!==void 0&&(d[_]=j),Object.keys(d).length>=Ln)break}const y={};if(e.frames!==null&&typeof e.frames=="object")for(const[_,D]of Object.entries(e.frames)){if(typeof _!="string"||_===""||_.includes("/")||_.length>40)continue;const j=fo(D);if(j!==void 0&&(y[_]=j),Object.keys(y).length>=In)break}return{version:1,viewport:{x:n,y:r,scale:x},nodes:d,frames:y}}function po(t,e,o){const s=a=>Math.max(-ut,Math.min(ut,Math.round(a))),n={};for(const[a,m]of e)if(!(typeof a!="string"||a===""||a.length>128)&&(n[a]={x:s(m.x),y:s(m.y)},Object.keys(n).length>=Ln))break;const r={};for(const[a,m]of o){if(typeof a!="string"||a===""||a.includes("/")||a.length>40)continue;const x=s(m.w),d=s(m.h);if(!(x<=0||d<=0)&&(r[a]={x:s(m.x),y:s(m.y),w:Math.min(x,ut),h:Math.min(d,ut)},Object.keys(r).length>=In))break}return{version:1,viewport:{x:s(t.x),y:s(t.y),scale:Math.max(en,Math.min(tn,t.scale))},nodes:n,frames:r}}function On(t){let e=2166136261;for(let o=0;o<t.length;o++)e^=t.charCodeAt(o),e=Math.imul(e,16777619)>>>0;return e>>>0}const st=172,Ze=56,ht=[150,290,430],Qe=16;function ho(t){const e=On(t),o=Math.floor(e/Qe)%ht.length,n=e%Qe/Qe*Math.PI*2+o*(Math.PI/Qe),r=ht[o];return{x:Math.round(Math.cos(n)*r),y:Math.round(Math.sin(n)*r*.6)}}function Pn(t){const e=new Map;for(const o of t)for(const s of o.members)e.has(s.id)||e.set(s.id,o.name);return e}const bn=64,gn=24,vn=20,bo=4,yn=24,wn=44,go=24;function vo(t,e,o=Number.POSITIVE_INFINITY){const s=new Set(e),n=Pn(t),r=t.map(_=>[...new Set(_.members.map(D=>D.id))].filter(D=>s.has(D)&&n.get(D)===_.name));r.push(e.filter(_=>!n.has(_)));const a=new Map;let m=0,x=0,d=0,y=0;for(const _ of r){if(_.length===0)continue;const D=Math.min(3,Math.max(_.length>1?2:1,Math.ceil(Math.sqrt(_.length)))),j=Math.ceil(_.length/D),V=Math.max(260,D*st+(D-1)*gn+yn*2),Ce=Math.max(160,j*Ze+(j-1)*vn+wn+go);y>0&&(y%bo===0||m+V>o)&&(m=0,x+=d+bn,d=0),_.forEach((re,C)=>{const E=C%D,H=Math.floor(C/D);a.set(re,{x:m+yn+st/2+E*(st+gn),y:x+wn+Ze/2+H*(Ze+vn)})}),m+=V+bn,d=Math.max(d,Ce),y+=1}return a}const _t=12;function Fn(t,e){const o=x=>e.every(d=>Math.abs(d.x-x.x)>=st+_t||Math.abs(d.y-x.y)>=Ze+_t),s=ho(t);if(o(s))return s;const n=On(t),r=Qe*ht.length,a=Math.floor(n/Qe)%ht.length*Qe+n%Qe;for(let x=1;x<r;x++){const d=(a+x)%r,y=Math.floor(d/Qe),_=d%Qe/Qe*Math.PI*2+y*(Math.PI/Qe),D=ht[y],j={x:Math.round(Math.cos(_)*D),y:Math.round(Math.sin(_)*D*.6)};if(o(j))return j}const m=ht[ht.length-1];for(let x=0;;x++)for(let d=0;d<6;d++){const y={x:Math.round(-m+d*(st+_t)),y:Math.round(m*.6+Ze*2+x*(Ze+_t))};if(o(y))return y}}function ft(t){return{x:t.x-st/2,y:t.y-Ze/2,w:st,h:Ze}}function nn(t){if(t.length===0)return{x:0,y:0,w:260,h:160};let e=Number.POSITIVE_INFINITY,o=Number.POSITIVE_INFINITY,s=Number.NEGATIVE_INFINITY,n=Number.NEGATIVE_INFINITY;for(const y of t)e=Math.min(e,y.x),o=Math.min(o,y.y),s=Math.max(s,y.x+y.w),n=Math.max(n,y.y+y.h);const r=24,a=44,m=24,x=Math.max(260,Math.round(s-e+r*2)),d=Math.max(160,Math.round(n-o+a+m));return{x:Math.round(e-r),y:Math.round(o-a),w:x,h:d}}class on{constructor(){vt(this,"revisionCounter",0);vt(this,"nodes",new Map);vt(this,"frames",new Map);vt(this,"selection",new Set);vt(this,"viewport",{x:0,y:0,scale:1})}get revision(){return this.revisionCounter}getNode(e){return this.nodes.get(e)}allNodes(){return[...this.nodes.values()]}nodeIds(){return[...this.nodes.keys()]}getFrame(e){return this.frames.get(e)}allFrames(){return[...this.frames.entries()]}isSelected(e){return this.selection.has(e)}selectedIds(){return[...this.selection]}bump(){this.revisionCounter+=1}dragNodes(e,o,s){let n=!1;for(const r of e){const a=this.nodes.get(r);a!==void 0&&(a.x+=o,a.y+=s,n=!0)}n&&this.bump()}beginFrameDrag(e){const o=this.frames.get(e);if(o===void 0)return;const s=[];for(const n of this.nodes.values())for(const r of n.memberships)if(r.team===e){s.push([n.id,n.x,n.y]);break}return{name:e,rect:{...o},centers:s}}applyFrameDrag(e,o,s){const n=this.frames.get(e.name);if(n!==void 0){n.x=e.rect.x+o,n.y=e.rect.y+s;for(const[r,a,m]of e.centers){const x=this.nodes.get(r);x!==void 0&&(x.x=a+o,x.y=m+s)}this.bump()}}nudge(e,o,s){this.dragNodes(e,o,s)}marqueeSelect(e,o){o||this.selection.clear();for(const s of this.nodes.values()){const n=ft(s);n.x<e.x+e.w&&n.x+n.w>e.x&&n.y<e.y+e.h&&n.y+n.h>e.y&&this.selection.add(s.id)}this.bump()}setSelection(e){this.selection=new Set(e),this.bump()}upsertNode(e){const o=this.nodes.get(e.id);if(o===void 0){this.nodes.set(e.id,e),this.bump();return}o.label=e.label,o.name=e.name,o.live=e.live,o.memberships=e.memberships,this.bump()}removeNode(e){this.nodes.delete(e)&&(this.selection.delete(e),this.bump())}setFrame(e,o){this.frames.set(e,o),this.bump()}removeFrame(e){this.frames.delete(e)&&this.bump()}upsertScore(e,o){const s=this.nodes.get(e);s===void 0||s.score===o||(s.score=o,this.bump())}positions(){const e=new Map;for(const[o,s]of this.nodes)e.set(o,{x:s.x,y:s.y});return e}frameRects(){const e=new Map;for(const[o,s]of this.frames)e.set(o,{...s});return e}teamMemberIds(e){const o=[];for(const s of this.nodes.values()){const n=s.memberships.find(r=>r.team===e);n!==void 0&&o.push({id:s.id,index:n.index})}return o.sort((s,n)=>s.index-n.index).map(s=>s.id)}setTeamMembers(e,o){for(const s of this.nodes.values()){const n=s.memberships.filter(a=>a.team!==e),r=o.indexOf(s.id);r>=0&&n.push({team:e,index:r}),s.memberships=n}this.bump()}contentBounds(){let e=Number.POSITIVE_INFINITY,o=Number.POSITIVE_INFINITY,s=Number.NEGATIVE_INFINITY,n=Number.NEGATIVE_INFINITY;const r=a=>{e=Math.min(e,a.x),o=Math.min(o,a.y),s=Math.max(s,a.x+a.w),n=Math.max(n,a.y+a.h)};for(const a of this.nodes.values())a.remote!==!0&&r(ft(a));for(const a of this.frames.values())r(a);return e===Number.POSITIVE_INFINITY?null:{minX:e,minY:o,maxX:s,maxY:n}}static fromState(e){const o=new on,s=_n(e.layout),n=new Map;for(const r of e.teams)for(let a=0;a<r.members.length;a++){const m=r.members[a].id,x=n.get(m)??[];x.push({team:r.name,index:a}),n.set(m,x)}for(const r of e.sessions){if(r.joined!==!0)continue;const a=s==null?void 0:s.nodes[r.id];let m,x;if(a!==void 0&&typeof a.x=="number"&&typeof a.y=="number")m=a.x,x=a.y;else{const d=Fn(r.id,[...o.nodes.values()]);m=d.x,x=d.y}o.nodes.set(r.id,{id:r.id,x:m,y:x,label:r.label,team:r.team,name:r.name,live:r.live!==!1,memberships:n.get(r.id)??[]})}for(const r of e.teams){const a=s==null?void 0:s.frames[r.name];if(a!==void 0){o.frames.set(r.name,{x:a.x,y:a.y,w:a.w,h:a.h});continue}const m=[];for(const x of r.members){const d=o.nodes.get(x.id);d!==void 0&&m.push(ft(d))}m.length>0&&o.frames.set(r.name,nn(m))}return o.viewport=s!==void 0?{...s.viewport}:{x:0,y:0,scale:1},o}}const yo=24,wo=-13,xo=wo+yo;function Co(t,e,o){const s=[],n=new Set;for(const r of t){const a=e.get(r.name);if(a===void 0)continue;const m=a.x+a.w/2,x=a.y+xo;for(const d of r.members){const y=o.get(d.id);if(y===void 0)continue;const _=n.has(d.id);n.add(d.id),s.push({x1:m,y1:x,x2:y.x,y2:y.y-Ze/2,dashed:_,team:r.name,id:d.id})}}return s}function ko(t){return`peer-${xt(t).replace(/[^A-Za-z0-9.:\[\]-]/g,"-")}`}function xt(t){try{return new URL(t).host}catch{return t}}function Eo(t){const e=new Map;for(const o of t){const s=o.via!==void 0&&o.via!==""?xt(o.via):"",n=e.get(s)??[];n.push(o),e.set(s,n)}return e}const $o=140,No=200,Mo=90,So=20,Ot=60;function Ao(t,e){const o=e!==null?e.maxX+$o:No,s=e!==null?e.minY:0;return t.map((n,r)=>({url:n.url,score:n.score,x:o,y:s+r*Mo}))}function Lo(t,e,o,s){const n=new Map;for(const a of t){if(!e.has(a.team))continue;const m=`${a.team}\0${a.peer}`,x=n.get(m);x===void 0?n.set(m,{team:a.team,peer:a.peer,startedAt:a.startedAt,count:1}):(x.startedAt=Math.min(x.startedAt,a.startedAt),x.count+=1)}const r=[];for(const a of n.values()){const m=e.get(a.team);if(m===void 0)continue;const x=o.find(y=>{try{return new URL(y.url).host===a.peer}catch{return!1}});if(x===void 0)continue;const d=Math.max(0,Math.round((s-a.startedAt)/1e3));r.push({x1:m.x,y1:m.y,x2:x.x,y2:x.y,label:`a2a_route · ${a.peer} · ${d}s`+(a.count>1?` ×${a.count}`:"")})}return r}function Io(t,e){const o=e!==null?{x:e.maxX+So,y:t.length>0?(t[0].y+t[t.length-1].y)/2:(e.minY+e.maxY)/2}:{x:-80,y:0};return t.map((s,n)=>({x1:o.x,y1:o.y,x2:s.x,y2:s.y,label:n===0?"gns referral":""}))}function To(t,e){if(t===null&&e.length===0)return null;let o=t!==null?t.minX:Number.POSITIVE_INFINITY,s=t!==null?t.minY:Number.POSITIVE_INFINITY,n=t!==null?t.maxX:Number.NEGATIVE_INFINITY,r=t!==null?t.maxY:Number.NEGATIVE_INFINITY;for(const a of e)o=Math.min(o,a.x-Ot),s=Math.min(s,a.y-Ot),n=Math.max(n,a.x+Ot),r=Math.max(r,a.y+Ot);return{minX:o,minY:s,maxX:n,maxY:r}}const _o=11;function Oo(t,e){let o=[],s=[],n=[];function r(m){for(const y of o)y.remove();o=[];const x=e.allNodes().filter(y=>y.remote===!0).map(y=>({url:y.peerUrl??y.id.slice(5),score:y.score,x:y.x,y:y.y}));s=x;const d=e.contentBounds();if(d!==null){const y=new Map;for(const[_,D]of e.allFrames())y.set(_,{name:_,x:D.x+D.w/2,y:D.y+_o});for(const _ of Lo(n,y,x,m))o.push(...a(_,"e-activity",_.label));for(const _ of Io(x,d))o.push(...a(_,"e-federal",_.label))}}function a(m,x,d){const y=document.createElementNS("http://www.w3.org/2000/svg","line");y.setAttribute("class",x),y.setAttribute("x1",String(m.x1)),y.setAttribute("y1",String(m.y1)),y.setAttribute("x2",String(m.x2)),y.setAttribute("y2",String(m.y2)),t.appendChild(y);const _=[y];if(d!==""){const D=document.createElementNS("http://www.w3.org/2000/svg","text");D.setAttribute("class","edge-label mono"),D.setAttribute("x",String((m.x1+m.x2)/2+14)),D.setAttribute("y",String((m.y1+m.y2)/2+18)),D.textContent=d,t.appendChild(D),_.push(D)}return _}return{render:r,flyTo(m){return m(),s},placements:()=>s,setInFlight:m=>{n=m}}}const xn={x:0,y:0,scale:1};function sn(t){return Math.max(en,Math.min(tn,t))}function yt(t){const e=Number.isFinite(t.scale)?t.scale:1,o=Number.isFinite(t.x)?t.x:0,s=Number.isFinite(t.y)?t.y:0;return{x:o,y:s,scale:sn(e)}}function lt(t,e,o){return{x:t.x+e/t.scale,y:t.y+o/t.scale}}function Kt(t,e,o){return{x:t.x+e/t.scale,y:t.y+o/t.scale,scale:t.scale}}function Cn(t,e,o,s){const n=sn(t.scale*e);return n===t.scale?t:{x:t.x+o/t.scale-o/n,y:t.y+s/t.scale-s/n,scale:n}}function Ut(t,e,o,s=Number.POSITIVE_INFINITY){if(t===null||e<=0||o<=0)return xn;const n=t.maxX-t.minX,r=t.maxY-t.minY;if(!(n>0)||!(r>0))return xn;const a=sn(Math.min(s,.9*Math.min(e/n,o/r)));return{x:(t.minX+t.maxX)/2-e/(2*a),y:(t.minY+t.maxY)/2-o/(2*a),scale:a}}function Po(t){return`translate(${-t.x*t.scale}px, ${-t.y*t.scale}px) scale(${t.scale})`}function Fo(t){return t.type==="join-network"||t.type==="leave-network"?"$network":t.type==="create-team"||t.type==="remove-team"?t.name:t.team}function Do(t,e){if(e.type==="create-team"){const n=e.ids.map(r=>t.getNode(r)).filter(r=>r!==void 0).map(r=>ft(r));return n.length>0&&t.setFrame(e.name,nn(n)),t.setTeamMembers(e.name,e.ids),()=>{t.setTeamMembers(e.name,t.teamMemberIds(e.name).filter(r=>!e.ids.includes(r))),t.removeFrame(e.name)}}if(e.type==="add-member"){const n=t.teamMemberIds(e.team),r=e.ids.filter(a=>!n.includes(a));return t.setTeamMembers(e.team,[...n,...r]),()=>{t.setTeamMembers(e.team,t.teamMemberIds(e.team).filter(a=>!r.includes(a)))}}if(e.type==="remove-member"){const n=t.teamMemberIds(e.team);return t.setTeamMembers(e.team,n.filter(r=>!e.ids.includes(r))),()=>{const r=t.teamMemberIds(e.team);t.setTeamMembers(e.team,[...r,...e.ids.filter(a=>!r.includes(a))])}}if(e.type==="remove-team"){const n=t.teamMemberIds(e.name),r=t.getFrame(e.name),a=r!==void 0?{...r}:void 0;return t.setTeamMembers(e.name,[]),t.removeFrame(e.name),()=>{a!==void 0&&t.setFrame(e.name,a),t.setTeamMembers(e.name,n)}}if(e.type==="join-network"||e.type==="leave-network")return()=>{};const o=t.teamMemberIds(e.team);let s=[...o];for(const n of e.ops)n.op==="remove"?s=s.filter(r=>r!==n.id):s.push(n.id);return t.setTeamMembers(e.team,s),()=>{let n=t.teamMemberIds(e.team);for(let r=0;r<o.length;r++){const a=o[r];n[r]!==a&&n.includes(a)&&(n=n.filter(m=>m!==a),n.push(a))}t.setTeamMembers(e.team,n)}}function Vt(t,e){const o=[...t],s=[];for(let n=0;n<e.length;n++){const r=e[n];o[n]!==r&&o.includes(r)&&(s.push({op:"remove",id:r}),s.push({op:"add",id:r}),o.splice(o.indexOf(r),1),o.push(r))}return s}function Ro(t,e){return t.teamMemberIds(e).map(o=>{var s;return{id:o,y:((s=t.getNode(o))==null?void 0:s.y)??0}}).sort((o,s)=>o.y-s.y).map(o=>o.id)}function kn(t,e){let o,s=Number.POSITIVE_INFINITY;for(const[n,r]of t){if(e.x<r.x||e.x>r.x+r.w||e.y<r.y||e.y>r.y+r.h)continue;const a=r.w*r.h;a<s&&(o=n,s=a)}return o}const En=[9133302,3900150,1357990,16096779,15485081,8702998];function jo(t){const{root:e,netBtn:o,signal:s,model:n}=t;function r(){return n.selectedIds().map(f=>{var N;return{id:f,y:((N=n.getNode(f))==null?void 0:N.y)??0}}).sort((f,N)=>f.y-N.y).map(f=>f.id)}function a(){if(m!==null)return;const f=r().filter(N=>{const v=n.getNode(N);return v===void 0?!1:v.remote!==!0||v.remoteHandle!==void 0&&v.remoteHandle!==""});if(f.length<2){t.notice("info","框选至少 2 个会话节点");return}x(f)}let m=null;function x(f){const N=document.createElement("div");N.className="p-dialog";const v=document.createElement("div");v.className="p-dialog-panel",v.setAttribute("role","dialog"),v.setAttribute("aria-modal","true"),v.setAttribute("aria-labelledby","p-dialog-title");const A=document.createElement("div");A.id="p-dialog-title",A.className="p-dialog-title",A.textContent=`组建团队(${f.length} 个节点,自上而下即优先级)`;const h=document.createElement("input");h.className="p-dialog-input",h.maxLength=40,h.setAttribute("aria-label","团队名");const R=document.createElement("div");R.className="p-dialog-err",R.setAttribute("aria-live","polite");const P=document.createElement("div");P.className="p-dialog-row";const me=document.createElement("button");me.type="button",me.textContent="组建";const Ne=document.createElement("button");Ne.type="button",Ne.textContent="取消",P.append(me,Ne),v.append(A,h,R,P),N.appendChild(v),e.appendChild(N);const Me=document.activeElement,$=()=>{N.remove(),m=null,Me==null||Me.focus()},z=()=>{const fe=h.value.trim();return fe===""||fe.length>40||fe.includes("/")||/^\d+$/.test(fe)?"队名需 1..40 字,不含“/”,不为纯数字":null},ae=()=>{const fe=z();if(fe!==null){R.textContent=fe,h.focus();return}const ee=h.value.trim();if($(),n.getFrame(ee)!==void 0){t.notice("info",`已加入现有团队「${ee}」`),t.emit({type:"add-member",team:ee,ids:f});return}t.emit({type:"create-team",name:ee,ids:f,created:!0})};me.addEventListener("click",ae),Ne.addEventListener("click",$),h.addEventListener("keydown",fe=>{const ee=fe;ee.key==="Enter"&&(ee.preventDefault(),ae()),ee.key==="Escape"&&(ee.preventDefault(),$())}),N.addEventListener("keydown",fe=>{const ee=fe;if(ee.key==="Escape"){ee.preventDefault(),ee.stopPropagation(),$();return}if(ee.key!=="Tab")return;ee.preventDefault();const K=Array.from(v.querySelectorAll("input, button")),ue=K.indexOf(document.activeElement),se=ee.shiftKey?K[(ue-1+K.length)%K.length]:K[(ue+1)%K.length];se==null||se.focus()},s),m={wrap:N,restoreFocus:Me},h.focus()}let d=null,y="root",_=null,D=null,j=[];function V(){D==null||D.remove(),D=null}function Ce(){var v;if(D!==null){V();return}if(j.length===0)return;const f=document.createElement("div");f.className="p-menu p-netmenu",f.setAttribute("role","menu"),f.setAttribute("aria-label","未入网会话");for(const A of j)f.appendChild(C(`${A.name!==void 0&&A.name!==""?A.name:A.label} — 入网`,!0,()=>{V(),t.emit({type:"join-network",id:A.id})}));D=f,e.appendChild(f);const N=o.getBoundingClientRect();f.style.left=`${String(Math.min(N.left,window.innerWidth-220))}px`,f.style.top=`${String(Math.max(8,N.top-(j.length*30+10)))}px`,f.addEventListener("keydown",A=>{A.key==="Escape"&&(A.stopPropagation(),V(),o.focus())}),(v=f.querySelector("button"))==null||v.focus(),document.addEventListener("pointerdown",A=>{if(D===null)return;const h=A.target;h!==null&&(h.closest(".p-netmenu")!==null||h===o||o.contains(h))||V()},s)}function re(){d==null||d.remove(),d=null,y="root",_!==null&&_.isConnected?_.focus():e.focus(),_=null}function C(f,N,v){const A=document.createElement("button");return A.type="button",A.setAttribute("role","menuitem"),A.textContent=f,N?A.addEventListener("click",()=>{re(),v()}):(A.disabled=!0,A.setAttribute("aria-disabled","true")),A}function E(f,N,v,A="root",h){var Ne,Me,$,z,ae,fe;h!==void 0&&(_=h),_===null&&(_=t.anchorFor(v)),d==null||d.remove(),y=A;const R=document.createElement("div");R.className="p-menu",R.setAttribute("role","menu"),R.setAttribute("aria-label","团队操作");let P=[];if(v.kind==="frame")P=[C(`解散团队「${v.name}」`,!0,()=>t.emit({type:"remove-team",name:v.name}))];else{const ee=v.id;if(A==="root"){const K=C("组成团队…",n.selectedIds().length>=2,()=>x(r()));K.title="先框选或 Shift 加选至少 2 个节点",P.push(K),t.teams().length>0&&(P.push(C("加入团队 ▸",!0,()=>E(f,N,v,"join"))),(((Ne=n.getNode(ee))==null?void 0:Ne.memberships.map(se=>se.team))??[]).length>0&&(P.push(C("置顶路由 ▸",!0,()=>E(f,N,v,"promote"))),P.push(C("离队 ▸",!0,()=>E(f,N,v,"leave"))))),((Me=n.getNode(ee))==null?void 0:Me.remote)!==!0&&P.push(C("退网",!0,()=>t.emit({type:"leave-network",id:ee})))}else{P.push(C("‹ 返回",!0,()=>E(f,N,v,"root")));for(const K of t.teams())if(A==="join"){const ue=(($=n.getNode(ee))==null?void 0:$.memberships.some(se=>se.team===K.name))??!0;P.push(C(ue?`${K.name}(已加入)`:K.name,!ue,()=>t.emit({type:"add-member",team:K.name,ids:[ee]})))}else if(A==="leave"){const ue=((z=n.getNode(ee))==null?void 0:z.memberships.some(se=>se.team===K.name))??!1;P.push(C(K.name,ue,()=>t.emit({type:"remove-member",team:K.name,ids:[ee]})))}else{const ue=((ae=n.getNode(ee))==null?void 0:ae.memberships.some(se=>se.team===K.name))??!1;P.push(C(K.name,ue,()=>{const se=n.teamMemberIds(K.name),Oe=[ee,...se.filter(Pe=>Pe!==ee)];t.emit({type:"reorder",team:K.name,ops:Vt(se,Oe)})}))}}}R.append(...P),R.style.left=`${Math.min(f,window.innerWidth-200)}px`;const me=P.length*30+8;R.style.top=`${Math.max(8,Math.min(N,window.innerHeight-me-8))}px`,R.addEventListener("keydown",ee=>{var Oe,Pe,Ye,_e;const K=ee,ue=Array.from(R.querySelectorAll("[role=menuitem]")),se=ue.indexOf(document.activeElement);K.key==="ArrowDown"?(K.preventDefault(),(Oe=ue[(se+1+ue.length)%ue.length])==null||Oe.focus()):K.key==="ArrowUp"?(K.preventDefault(),(Pe=ue[(se-1+ue.length)%ue.length])==null||Pe.focus()):K.key==="Home"?(K.preventDefault(),(Ye=ue[0])==null||Ye.focus()):K.key==="End"?(K.preventDefault(),(_e=ue[ue.length-1])==null||_e.focus()):K.key==="Escape"&&(K.preventDefault(),K.stopPropagation(),y!=="root"?E(f,N,v,"root"):re())}),e.appendChild(R),d=R,(fe=P[0])==null||fe.focus()}function H(f,N,v){if(m!==null)return;const A=(v==null?void 0:v.closest(".p-node"))??null;if(A!==null){const P=n.getNode(A.dataset.id??"");if((P==null?void 0:P.remote)===!0&&(P.remoteHandle===void 0||P.remoteHandle===""))return}const h=A,R=(v==null?void 0:v.closest(".p-frame-head"))??null;if(h!==null){const P=h.dataset.id??"";n.isSelected(P)||n.setSelection([P]),_=h,E(f,N,{kind:"node",id:P})}else R!==null&&(_=R,E(f,N,{kind:"frame",name:R.dataset.frame??""}))}function b(f){j=f,o.textContent=`未入网${j.length>0?`(${String(j.length)})`:""}`,o.disabled=j.length===0,o.setAttribute("aria-disabled",String(j.length===0)),j.length===0&&V()}return{menuItem:C,isMenuOpen:()=>d!==null,isDialogOpen:()=>m!==null,closeMenu:re,openMenu:E,contextMenuAt:H,openNameDialog:x,startCreateFromSelection:a,toggleNetMenu:Ce,setUnjoined:b}}function Bo(t){const{root:e,trigger:o,signal:s,model:n}=t;let r=null,a="",m=null;function x(){m==null||m.remove(),m=null}function d(){x(),r==null||r.remove(),r=null}function y(){if(r!==null){d();return}const E=document.createElement("div");E.className="p-menu p-nodelist",E.setAttribute("role","dialog"),E.setAttribute("aria-label","节点清单"),r=E,e.appendChild(E);const H=o.getBoundingClientRect();E.style.left=`${String(Math.min(H.left,window.innerWidth-340))}px`,E.style.top=`${String(Math.max(8,H.top-320))}px`,E.addEventListener("keydown",b=>{b.key==="Escape"&&(b.stopPropagation(),d(),o.focus())}),_()}function _(){var A;const E=r;if(E===null)return;x(),E.textContent="";const H=document.createElement("div");H.className="p-nodelist-head";const b=document.createElement("span");b.className="p-nodelist-title",b.textContent="节点";const f=document.createElement("select");f.className="p-nodesel",f.setAttribute("aria-label","选择 host 或对等节点");const N=document.createElement("option");N.value="",N.textContent="本机",f.appendChild(N);for(const[h,R]of t.facts().remoteTeams){if(h==="")continue;const P=document.createElement("option");P.value=h,P.textContent=((A=R[0])==null?void 0:A.origin)!==void 0&&R[0].origin!==""?`${R[0].origin}(${h})`:h,f.appendChild(P)}a!==""&&!t.facts().remoteTeams.has(a)&&(a=""),f.value=a,f.addEventListener("change",()=>{a=f.value,_()}),H.append(b,f);const v=document.createElement("div");v.className="p-nodelist-body",E.append(H,v),a===""?re(v):C(v,t.facts().remoteTeams.get(a)??[])}function D(E,H){const b=document.createElement("span");return b.className="p-nodedot"+(H!==!0?" off":E===!1?" cold":""),b}function j(E,H){const b=document.createElement("button");return b.type="button",b.className="p-listbtn",b.textContent=E,b.addEventListener("click",f=>{f.stopPropagation(),H()}),b}function V(E,H){const b=document.createElement("div");if(b.className="p-nodelist-group",b.textContent=E,H!==void 0){const f=document.createElement("span");f.className="p-nodelist-note",f.textContent=H,b.appendChild(f)}return b}function Ce(E,H){var N,v;x();const b=document.createElement("div");b.className="p-menu",b.setAttribute("role","menu"),b.setAttribute("aria-label","加入团队");for(const A of t.facts().teams){const h=((N=n.getNode(H))==null?void 0:N.memberships.some(R=>R.team===A.name))??!1;b.appendChild(t.menuItem(h?`${A.name}(已加入)`:A.name,!h,()=>{d(),t.emit({type:"add-member",team:A.name,ids:[H]})}))}b.appendChild(t.menuItem("新团队…",!0,()=>{d(),t.openNameDialog([H])})),m=b,e.appendChild(b);const f=E.getBoundingClientRect();b.style.left=`${String(Math.min(f.right+4,window.innerWidth-180))}px`,b.style.top=`${String(Math.max(8,f.top-60))}px`,b.addEventListener("keydown",A=>{A.key==="Escape"&&(A.stopPropagation(),x(),E.focus())}),(v=b.querySelector("button"))==null||v.focus()}function re(E){var v,A;const H=new Set(t.facts().canvasMemberIds);for(const h of t.facts().sessions)h.teams!==void 0&&h.teams.length>0&&H.add(h.id);const b=t.facts().sessions.filter(h=>h.joined===!0&&!H.has(h.id)),f=t.facts().sessions.filter(h=>h.joined!==!0),N=t.facts().sessions.filter(h=>h.joined===!0&&H.has(h.id));E.appendChild(V(`未组队 (${String(b.length)})`,"无网络能力"));for(const h of b){const R=document.createElement("div");R.className="p-noderow";const P=document.createElement("span");P.className="p-nodename",P.textContent=h.name!==void 0&&h.name!==""?h.name:h.label,P.title=h.team;const me=document.createElement("span");me.className="p-nonet",me.textContent="无网络能力";const Ne=j("入队▸",()=>Ce(Ne,h.id));R.append(D(h.live,!0),P,me,Ne,j("退网",()=>{d(),t.emit({type:"leave-network",id:h.id})})),E.appendChild(R)}E.appendChild(V(`未入网 (${String(f.length)})`));for(const h of f){const R=document.createElement("div");R.className="p-noderow";const P=document.createElement("span");P.className="p-nodename",P.textContent=h.name!==void 0&&h.name!==""?h.name:h.label,P.title=h.id,R.append(D(h.live,!1),P,j("入网",()=>{d(),t.emit({type:"join-network",id:h.id})})),E.appendChild(R)}E.appendChild(V(`已组队 (${String(N.length)})`,"画布展示"));for(const h of N){const R=document.createElement("div");R.className="p-noderow";const P=document.createElement("span");P.className="p-nodename",P.textContent=h.name!==void 0&&h.name!==""?h.name:h.label,P.title=h.team;const me=((v=n.getNode(h.id))==null?void 0:v.memberships.length)??0,Ne=((A=h.teams)==null?void 0:A.length)??0,Me=document.createElement("span");Me.className="p-teamcount",Me.textContent=`队×${String(Math.max(me,0)+Ne)}`,R.append(D(h.live,!0),P,Me,j("定位",()=>{t.locate(h.id)})),E.appendChild(R)}if(t.facts().sessions.length===0){const h=document.createElement("div");h.className="p-nodelist-empty",h.textContent="无会话节点",E.appendChild(h)}}function C(E,H){var N;const b=H.filter(v=>v.teams===void 0||v.teams.length===0),f=H.filter(v=>v.teams!==void 0&&v.teams.length>0);E.appendChild(V(`未组队 (${String(b.length)})`,"无网络能力 · 只读"));for(const v of b){const A=document.createElement("div");A.className="p-noderow";const h=document.createElement("span");h.className="p-nodename",h.textContent=v.name!==void 0&&v.name!==""?v.name:v.team,h.title=v.team;const R=document.createElement("span");R.className="p-nonet",R.textContent="无网络能力",A.append(D(!0,!0),h,R),E.appendChild(A)}E.appendChild(V(`已组队 (${String(f.length)})`,"只读"));for(const v of f){const A=document.createElement("div");A.className="p-noderow";const h=document.createElement("span");h.className="p-nodename",h.textContent=v.name!==void 0&&v.name!==""?v.name:v.team,h.title=v.team;const R=document.createElement("span");R.className="p-teamcount",R.textContent=`队×${String(((N=v.teams)==null?void 0:N.length)??0)}`,A.append(D(!0,!0),h,R),E.appendChild(A)}if(H.length===0){const v=document.createElement("div");v.className="p-nodelist-empty",v.textContent="该节点未发布会话",E.appendChild(v)}}return document.addEventListener("pointerdown",E=>{if(r===null)return;const H=E.target;if(H===null){d();return}H.closest(".p-nodelist")!==null||H.closest(".p-menu")!==null||H===o||o.contains(H)||d()},s),{toggle:y,close:d,refresh:()=>{r!==null&&_()}}}function Ho(t){return t<680?"narrow":t<1024?"medium":"wide"}function Yo(t){let e=0;for(let m=0;m<t.length;m++)e=(e*31+t.charCodeAt(m)&268435455)>>>0;const o=En[e%En.length],s="#"+o.toString(16).padStart(6,"0"),n=o>>16&255,r=o>>8&255,a=o&255;return{line:s,bg:`rgba(${n},${r},${a},0.05)`}}function Wo(t){const e=new on;let o,s={...e.viewport},n={kind:"none"},r=!1,a=-1,m=!0,x=!1;const d=()=>Ho(globalThis.innerWidth||_e),y=()=>{var i;(i=t.viewportStore)==null||i.set(d(),s),t.onDirty()},_=t.now??Date.now,D=new AbortController,j=[];let V=null,Ce=!1;const re={signal:D.signal},C=document.createElement("section");C.id="dsh-plan",C.setAttribute("role","tabpanel"),C.setAttribute("aria-label","A2A 规划画布"),C.tabIndex=0,C.style.display="none";const E=document.createElement("div");E.className="p-grid";const H=document.createElement("div");H.className="p-world";const b=document.createElementNS("http://www.w3.org/2000/svg","svg");b.setAttribute("class","p-edges");const f=document.createElement("div");f.className="p-layer p-frames";let N;const v=i=>{var c,p;N!==void 0&&((c=Te.get(N))==null||c.classList.remove("selected")),N=i,i!==void 0&&((p=Te.get(i))==null||p.classList.add("selected"))},A=document.createElement("div");A.className="p-layer p-nodes",A.setAttribute("role","listbox"),A.setAttribute("aria-multiselectable","true"),A.setAttribute("aria-label","会话节点"),H.append(b,f,A);const h=document.createElement("div");h.className="p-marquee";const R=document.createElement("div");R.className="p-toolbar";const P=document.createElement("span");P.className="p-zoom mono",P.textContent="100%";const me=(i,c,p)=>{const k=document.createElement("button");return k.type="button",k.textContent=i,k.title=c,k.addEventListener("click",p,re),k};R.append(me("适配","适配视图(快捷键 0)",()=>Re()),me("-","缩小",()=>Ae(1/1.2)),P,me("+","放大",()=>Ae(1.2)),me("建队","组成团队(G):先框选至少 2 个节点",()=>u.startCreateFromSelection()),me("整理成员","每队框内仅属一队的成员自动排齐(多队成员不动)",()=>kt()));const Ne=me("未入网","未入网会话(点击选择入网)",()=>u.toggleNetMenu());Ne.className="p-netbtn",Ne.setAttribute("aria-haspopup","menu"),R.appendChild(Ne);const Me=me("节点","节点清单:本机与对等节点(未组队/未入网在此管理)",()=>O.toggle());Me.className="p-nodebtn",Me.setAttribute("aria-haspopup","dialog"),R.appendChild(Me);const $=document.createElement("span");$.setAttribute("aria-live","polite"),$.className="p-lamp";const z=document.createElement("i"),ae=document.createElement("span");ae.textContent="布局",$.append(z,ae),$.addEventListener("click",()=>{$.classList.contains("error")&&t.onLampClick()},re),$.addEventListener("keydown",i=>{const c=i;(c.key==="Enter"||c.key===" ")&&$.classList.contains("error")&&(c.preventDefault(),t.onLampClick())},re),R.appendChild($);const fe=document.createElement("div");fe.className="p-status";const ee=document.createElement("span"),K=document.createElement("span"),ue=document.createElement("span");ue.className="mut";const se=document.createElement("span");se.className="mut",fe.append(ee,K,ue,se),fe.tabIndex=0,fe.setAttribute("role","button"),fe.setAttribute("aria-label","定位在途路由与联邦对端"),fe.title="定位在途与联邦(回车)",fe.addEventListener("click",()=>q(),re),fe.addEventListener("keydown",i=>{const c=i;(c.key==="Enter"||c.key===" ")&&(c.preventDefault(),q())},re);const Oe=document.createElement("div");Oe.className="p-legend";const Pe=(i,c,p)=>{const k=document.createElement("span"),I=document.createElement("i");i&&(I.className="dashed"),p!==void 0&&(I.style.borderTopColor=p),k.append(I,document.createTextNode(c)),Oe.appendChild(k)};Pe(!1,"成员边(星形,框→成员)"),Pe(!0,"跨队多属(虚线)"),Pe(!1,"活动边(inFlight 路由,瞬时)","var(--accent)"),Pe(!0,"联邦线(→peer)","var(--federal)");const Ye=document.createElement("div");Ye.className="p-notice-stack",Ye.setAttribute("role","log"),Ye.setAttribute("aria-live","polite"),C.append(E,H,h,R,fe,Oe,Ye);let _e=0,De=0;const pt=()=>t.viewSize?t.viewSize():{w:C.clientWidth,h:C.clientHeight},We=()=>{const i=pt();_e=i.w,De=i.h};function Je(){H.style.transform=Po(s);const i=24*s.scale;E.style.backgroundSize=`${i}px ${i}px`,E.style.backgroundPosition=`${-s.x*s.scale}px ${-s.y*s.scale}px`,P.textContent=`${Math.round(s.scale*100)}%`}function kt(){for(const[k,I]of e.allFrames()){const F=e.teamMemberIds(k).map(ve=>e.getNode(ve)).filter(ve=>ve!==void 0).filter(ve=>ve.memberships.length===1);if(F.length===0)continue;const X=Math.max(1,Math.floor((I.w-2*28+16)/(st+16))),ne=Math.ceil(F.length/X),ce=28*2+ne*Ze+(ne-1)*14;ce>I.h&&e.setFrame(k,{...I,h:Math.min(ce,I.h+400)});const ie=I.x+28+st/2;let le=I.y+28+Ze/2;F.forEach((ve,Be)=>{const He=Be%X;Be>0&&He===0&&(le+=Ze+14);const g=ie+He*(st+16);e.dragNodes([ve.id],g-ve.x,le-ve.y)})}y(),Ie()}function Ie(){Je(),e.revision!==a&&(a=e.revision,nt(),ot(),Et()),S()}const Te=new Map,et=new Map;function nt(){const i=new Set;for(const[c,p]of e.allFrames()){i.add(c);let k=Te.get(c);if(k===void 0){k=document.createElement("div"),k.className="p-frame",k.dataset.name=c;const ve=document.createElement("div");ve.className="p-frame-head",ve.dataset.frame=c,ve.tabIndex=0,ve.setAttribute("role","button"),ve.setAttribute("aria-haspopup","menu"),ve.setAttribute("aria-label",`团队框 ${c}(拖动整组,回车菜单)`);const Be=document.createElement("span");Be.className="ttl";const He=document.createElement("span");He.className="cnt mono";const g=document.createElement("span");g.className="route mono",ve.append(Be,He,g),k.appendChild(ve);for(const de of["n","s","e","w","ne","nw","se","sw"]){const G=document.createElement("div");G.className=`p-frame-handle p-h-${de}`,G.dataset.frame=c,G.dataset.dir=de,k.appendChild(G)}f.appendChild(k),Te.set(c,k)}const I=Yo(c);k.style.setProperty("--frame-line",I.line),k.style.setProperty("--frame-bg",I.bg),k.style.left=`${p.x}px`,k.style.top=`${p.y}px`,k.style.width=`${p.w}px`,k.style.height=`${p.h}px`;const J=k.querySelector(".ttl"),F=k.querySelector(".cnt"),X=k.querySelector(".route");J.textContent!==c&&(J.textContent=c);let ne=0,ce=0;for(const ve of e.allNodes())ve.memberships.find(He=>He.team===c)!==void 0&&(ne+=1,ve.memberships.length>1&&(ce+=1));const ie=`${ne} 成员`+(ce>0?` +${ce} 跨队`:"");F.textContent!==ie&&(F.textContent=ie);const le=it(c);X.textContent!==le&&(X.textContent=le)}for(const[c,p]of[...Te])i.has(c)||(p.remove(),Te.delete(c))}function Ge(i){const c=Ve.get(i)??[],p=c.map(F=>F.name!==void 0&&F.name!==""?F.name:F.team),k=p.slice(0,2).join("、"),I=p.length>2?` +${p.length-2}`:"",J=l.get(i);return(J!==void 0?`score ${J} · `:"")+`${c.length} 远端团队`+(k!==""?`:${k}${I}`:"")}function it(i){const c=ze.find(p=>p.name===i);return(c==null?void 0:c.team)??i}function ot(){const i=new Set;for(const c of e.allNodes()){i.add(c.id);let p=et.get(c.id);if(p===void 0){p=document.createElement("div"),p.className="p-node",p.dataset.id=c.id,p.tabIndex=0;const le=document.createElement("div");le.className="nm";const ve=document.createElement("span");ve.className="dot";const Be=document.createElement("span");Be.className="nm-text",le.append(ve,Be);const He=document.createElement("div");He.className="sub mono";const g=document.createElement("span");g.className="prio mono",p.append(le,He,g),A.appendChild(p),et.set(c.id,p)}const k=ft(c);p.style.left=`${k.x}px`,p.style.top=`${k.y}px`,p.classList.toggle("cold",!c.live),p.classList.toggle("remote",c.remote===!0),p.classList.toggle("selected",e.isSelected(c.id)),p.setAttribute("aria-selected",String(e.isSelected(c.id)));const I=c.id.slice(5),J=c.id.startsWith("member-")?c.name!==void 0&&c.name!==""?c.name:c.team:c.remote===!0?I:mt(c),F=p.querySelector(".nm-text");F.textContent!==J&&(F.textContent=J);const X=p.querySelector(".sub"),ne=c.team+(c.name!==void 0&&c.name!==""?" · "+c.name:""),ce=c.id.startsWith("member-")?c.team:c.remote===!0?Ge(I):(ne===J?"":ne)+(c.memberships.length>1?` · 跨队×${c.memberships.length}`:"")+(c.teams!==void 0&&c.teams.length>0?` · 网络队×${c.teams.length}`:"");X.textContent!==ce&&(X.textContent=ce);const ie=p.querySelector(".prio");if(c.remote===!0){const le=L.get(I),ve=(le==null?void 0:le.link)==="linked"?"lnk-linked":(le==null?void 0:le.link)==="stranger"?"lnk-stranger":"";ie.className!==`prio mono ${ve}`.trim()&&(ie.className=`prio mono ${ve}`.trim());const Be=le===void 0?"":le.verified===!0?"✓":"✗",He=((le==null?void 0:le.link)??"peer")+Be;ie.textContent!==He&&(ie.textContent=He)}else{ie.className!=="prio mono"&&(ie.className="prio mono");const le=c.memberships[0]!==void 0?`P${c.memberships[0].index}`:"";ie.textContent!==le&&(ie.textContent=le)}}for(const[c,p]of[...et])i.has(c)||(p.remove(),et.delete(c))}function Et(){for(;b.firstChild!==null;)b.firstChild.remove();const i=e.allFrames().map(([c])=>({name:c,members:e.teamMemberIds(c).map(p=>({id:p}))}));for(const c of Co(i,new Map(e.allFrames()),e.positions())){const p=document.createElementNS("http://www.w3.org/2000/svg","line");p.setAttribute("class","e-member"+(c.dashed?" dashed":"")),p.setAttribute("x1",String(c.x1)),p.setAttribute("y1",String(c.y1)),p.setAttribute("x2",String(c.x2)),p.setAttribute("y2",String(c.y2)),b.appendChild(p)}}const Ue=Oo(b,e);let Ve=new Map;const l=new Map,L=new Map;function S(){Ue.render(_())}function q(){s=Ut(To(e.contentBounds(),Ue.placements()),C.clientWidth||_e,C.clientHeight||De),Je(),y()}function Y(i){var J;const c=i.sessions.filter(F=>F.live!==!1).length,p=i.sessions.length-c;ee.textContent="";const k=document.createElement("b");k.className="ok",k.textContent=`● ${c} live`,ee.appendChild(k),K.textContent="";const I=document.createElement("b");I.className="warn",I.textContent=`● ${p} cold`,K.appendChild(I),ue.textContent=`${((J=i.inFlight)==null?void 0:J.length)??0} inFlight`,se.className="mut",se.textContent=`${i.teams.length} 队 · ${i.peerCount} peer`}const Q=new Map,pe=i=>{Q.set(i,(Q.get(i)??0)+1)},he=i=>{const c=(Q.get(i)??0)-1;c<=0?Q.delete(i):Q.set(i,c)};let Z=new Map;function $e(i){function c(I){const J=F=>{var ne;const X=[];for(const ce of F){if(!ce.startsWith("peer-")&&!ce.startsWith("member-")){X.push(ce);continue}const ie=(ne=e.getNode(ce))==null?void 0:ne.remoteHandle;ie!==void 0&&ie!==""&&X.push(ie)}return X};if(I.type==="add-member"||I.type==="remove-member"||I.type==="create-team"){const F=J(I.ids),X=I.type!=="create-team"?Z.get(I.team):void 0;return F.length>0||X!==void 0?{...I,ids:F,...X!==void 0?{fleetPeer:X}:{}}:I}return I}if(i.type==="add-member"||i.type==="remove-member"||i.type==="reorder"||i.type==="create-team"){const I=i.type==="reorder"?i.ops.map(J=>J.id):[...i.ids];for(const J of I){if(J===""||J.startsWith("peer-")||J.startsWith("member-")||e.getNode(J)!==void 0)continue;const F=B.find(ce=>ce.id===J);if(F===void 0)continue;const X=o==null?void 0:o.nodes[J],ne=X!==void 0?{x:X.x,y:X.y}:$t(J);e.upsertNode({id:J,x:ne.x,y:ne.y,label:F.label,team:F.team,name:F.name,live:F.live!==!1,memberships:[],...F.teams!==void 0&&F.teams.length>0?{teams:F.teams}:{}})}}const p=Do(e,i),k=Fo(i);pe(k),Ie(),t.onCanvasAction(c(i)).then(I=>{he(k),I||p(),Ie()},()=>{he(k),p(),w("error","操作通道异常,已回滚"),Ie()})}function w(i,c){var k;for(;Ye.childElementCount>=3;)(k=Ye.firstElementChild)==null||k.remove();const p=document.createElement("div");p.className="p-notice"+(i==="error"?" error":""),p.setAttribute("role",i==="error"?"alert":"status"),p.textContent=c,Ye.appendChild(p),j.push(setTimeout(()=>p.remove(),4e3))}const u=jo({root:C,netBtn:Ne,signal:re,model:e,teams:()=>ze,anchorFor:i=>(i.kind==="node"?et.get(i.id):Te.get(i.name))??null,emit:$e,notice:w});let B=[],T=new Set;const O=Bo({root:C,trigger:Me,signal:re,model:e,facts:()=>({sessions:B,canvasMemberIds:T,remoteTeams:Ve,teams:ze}),menuItem:u.menuItem,emit:$e,openNameDialog:u.openNameDialog,locate:W});function W(i){var k;const c=e.getNode(i);if(c===void 0)return;O.close();const p=((k=t.viewSize)==null?void 0:k.call(t))??{w:C.clientWidth>0?C.clientWidth:800,h:C.clientHeight>0?C.clientHeight:600};s=yt({scale:s.scale,x:c.x-p.w/(2*s.scale),y:c.y-p.h/(2*s.scale)}),Je(),a=-1,Ie()}function te(i){const c=C.getBoundingClientRect();return{x:i.clientX-c.left,y:i.clientY-c.top}}function U(i,c){var F;const p=te(c),k=lt(s,p.x,p.y),I=kn(new Map(e.allFrames()),k),J=i.ids.filter(X=>{const ne=e.getNode(X);return ne===void 0?!1:ne.remote!==!0?!0:ne.remoteHandle!==void 0&&ne.remoteHandle!==""});if(I!==void 0){const X=J.filter(ne=>{var ce;return!((ce=e.getNode(ne))!=null&&ce.memberships.some(ie=>ie.team===I))});if(X.length>0){$e({type:"add-member",team:I,ids:X});return}if(i.ids.length===1&&((F=e.getNode(i.clicked))==null?void 0:F.remote)!==!0){const ne=e.teamMemberIds(I),ce=Ro(e,I);ce.join("\0")!==ne.join("\0")&&$e({type:"reorder",team:I,ops:Vt(ne,ce)})}}}function ge(i){if(_e===0&&We(),u.isDialogOpen()){i.preventDefault();return}const c=i.target;if(u.isMenuOpen()){if(c!==null&&c.closest(".p-menu")!==null)return;u.closeMenu(),i.preventDefault();return}const p=te(i);if(i.button===2){V={x:p.x,y:p.y,target:i.target,moved:!1},i.preventDefault();try{C.setPointerCapture(i.pointerId??0)}catch{}return}if(c!==null&&(c.closest("button")!==null||c.closest(".p-lamp")!==null||c.closest(".p-status")!==null))return;const k=c!==null?c.closest(".p-node"):null,I=c!==null?c.closest(".p-frame-head"):null;if((k!==null||I!==null)&&i.button===1){n={kind:"pan",last:p,moved:!1},i.preventDefault();try{C.setPointerCapture(i.pointerId??0)}catch{}return}const J=c!==null?c.closest(".p-frame-handle"):null;if(N!==void 0){const F=Te.get(N),X=c!==null&&F!==void 0&&(F.contains(c)||F===c),ne=I!==null&&I.dataset.frame===N;!X&&!ne&&v(void 0)}if(J!==null&&i.button===0){const F=J.dataset.frame??"";v(F);const X=e.getFrame(F);if(X===void 0)return;n={kind:"frame-resize",name:F,dir:J.dataset.dir??"se",startRect:{...X},origin:lt(s,p.x,p.y),moved:!1},i.preventDefault();try{C.setPointerCapture(i.pointerId??0)}catch{}return}if(k!==null){if(i.button!==0)return;const F=k.dataset.id??"",X=e.isSelected(F);!X&&!i.shiftKey&&e.setSelection([F]);const ne=i.shiftKey||X?e.isSelected(F)?e.selectedIds():[...e.selectedIds(),F]:[F];n={kind:"node",clicked:F,ids:ne,last:lt(s,p.x,p.y),moved:!1,el:k},k.classList.add("dragging")}else if(I!==null){if(i.button!==0)return;const F=I.dataset.frame??"";v(F);const X=e.beginFrameDrag(F);if(X===void 0)return;n={kind:"frame",name:F,snap:X,origin:lt(s,p.x,p.y),moved:!1}}else if(i.button===1||i.button===0&&r)n={kind:"pan",last:p,moved:!1};else if(i.button===0)n={kind:"marquee",origin:p,last:p,additive:i.shiftKey},h.style.display="block",h.style.left=`${p.x}px`,h.style.top=`${p.y}px`,h.style.width="0px",h.style.height="0px";else return;i.preventDefault();try{C.setPointerCapture(i.pointerId??0)}catch{}}function ke(i){const c=te(i);if(V!==null){const p=c.x-V.x,k=c.y-V.y;Math.hypot(p,k)>4&&(V.moved=!0,s=yt(Kt(s,-p,-k)),V.x=c.x,V.y=c.y,Je());return}if(n.kind==="node"){const p=lt(s,c.x,c.y),k=p.x-n.last.x,I=p.y-n.last.y;if(k===0&&I===0)return;n.moved=!0,n.last=p,e.dragNodes(n.ids,k,I);const J=kn(new Map(e.allFrames()),p),F=n.ids.filter(ne=>{const ce=e.getNode(ne);return ce===void 0?!1:ce.remote!==!0||ce.remoteHandle!==void 0&&ce.remoteHandle!==""}),X=J!==void 0&&F.length>0;for(const[ne,ce]of Te)ce.classList.toggle("drop-target",X&&ne===J);Ie()}else if(n.kind==="frame"){const p=lt(s,c.x,c.y),k=p.x-n.origin.x,I=p.y-n.origin.y;if(!n.moved&&k===0&&I===0)return;n.moved=!0,e.applyFrameDrag(n.snap,k,I),Ie()}else if(n.kind==="frame-resize"){const p=lt(s,c.x,c.y),k=p.x-n.origin.x,I=p.y-n.origin.y;if(!n.moved&&k===0&&I===0)return;n.moved=!0;const J=220,F=120,X={...n.startRect};let{x:ne,y:ce,w:ie,h:le}=X;n.dir.includes("e")&&(ie=Math.max(J,X.w+k)),n.dir.includes("s")&&(le=Math.max(F,X.h+I)),n.dir.includes("w")&&(ie=Math.max(J,X.w-k),ne=X.x+(X.w-ie)),n.dir.includes("n")&&(le=Math.max(F,X.h-I),ce=X.y+(X.h-le)),e.setFrame(n.name,{x:Math.round(ne),y:Math.round(ce),w:Math.round(ie),h:Math.round(le)}),Ie()}else if(n.kind==="pan")s=Kt(s,c.x-n.last.x,c.y-n.last.y),n.last=c,n.moved=!0,Je();else if(n.kind==="marquee"){const p=Math.min(n.origin.x,c.x),k=Math.min(n.origin.y,c.y);h.style.left=`${p}px`,h.style.top=`${k}px`,h.style.width=`${Math.abs(c.x-n.origin.x)}px`,h.style.height=`${Math.abs(c.y-n.origin.y)}px`,n.last=c}}function Fe(i){var c,p;if(V!==null){const k=V.moved,I=V.target,J=V.x,F=V.y;V=null,k?(Ce=!0,y()):I!==null&&u.contextMenuAt(J,F,I);return}if(n.kind==="node"){const k=n.clicked;if(n.moved)U(n,i),y();else if(i.shiftKey){const I=e.selectedIds();e.setSelection(I.includes(k)?I.filter(J=>J!==k):[...I,k])}else e.setSelection([k]),(c=t.onNodePick)==null||c.call(t,k);for(const I of Te.values())I.classList.remove("drop-target");(p=n.el)==null||p.classList.remove("dragging"),Ie()}else if(n.kind==="frame")n.moved&&y();else if(n.kind==="frame-resize")n.moved&&y();else if(n.kind==="pan")n.moved&&y();else if(n.kind==="marquee"){const k=n.last,I=lt(s,Math.min(n.origin.x,k.x),Math.min(n.origin.y,k.y)),J=lt(s,Math.max(n.origin.x,k.x),Math.max(n.origin.y,k.y));e.marqueeSelect({x:I.x,y:I.y,w:J.x-I.x,h:J.y-I.y},n.additive),h.style.display="none",Ie()}n={kind:"none"};try{C.releasePointerCapture(i.pointerId??0)}catch{}}function oe(i){u.isMenuOpen()&&u.closeMenu();const c=te(i);if(i.shiftKey&&!i.ctrlKey){const p=i.deltaMode===1?16:1;s=yt(Kt(s,(i.deltaX??0)*p,(i.deltaY??0)*p))}else{const p=i.deltaMode===1?16:1,k=Math.exp(-((i.deltaY??0)*p)*.0015);s=Cn(s,k,c.x,c.y)}i.preventDefault(),Je(),y()}function Ae(i){We(),s=Cn(s,i,_e/2,De/2),Je(),y()}function Re(){We(),s=Ut(e.contentBounds(),_e,De),Je(),y()}function Xe(i){var J,F,X,ne,ce;if(u.isDialogOpen()||i.ctrlKey||i.metaKey)return;if(u.isMenuOpen()){i.key==="Escape"&&(u.closeMenu(),i.preventDefault());return}if(i.key===" "&&i.target===C){r=!0,i.preventDefault();return}const c=((F=(J=i.target)==null?void 0:J.closest)==null?void 0:F.call(J,".p-frame-head"))??null;if((i.key==="Enter"||i.key===" ")&&c!==null){i.preventDefault();const ie=c.getBoundingClientRect();u.contextMenuAt(ie.left+ie.width/2,ie.top+ie.height/2,c);return}if(i.key===" "&&((ne=(X=i.target)==null?void 0:X.classList)!=null&&ne.contains("p-node"))){const le=i.target.dataset.id??"",ve=e.selectedIds();e.setSelection(ve.includes(le)?ve.filter(Be=>Be!==le):[...ve,le]),Ie(),i.preventDefault();return}if(i.key==="F10"&&i.shiftKey||i.key==="ContextMenu"){i.preventDefault();const ie=document.activeElement??null,le=((ce=ie==null?void 0:ie.getBoundingClientRect)==null?void 0:ce.call(ie))??{left:0,top:0,width:0,height:0};u.contextMenuAt(le.left+le.width/2,le.top+le.height/2,ie);return}if(i.key==="Delete"||i.key==="Backspace"){i.preventDefault(),at();return}if(i.altKey&&(i.key==="ArrowUp"||i.key==="ArrowDown")){i.preventDefault(),je(i.key==="ArrowUp");return}if(i.key==="g"||i.key==="G"){u.startCreateFromSelection();return}if(i.key==="0"){Re();return}if(i.key==="="||i.key==="+"){Ae(1.2);return}if(i.key==="-"){Ae(1/1.2);return}if(i.key==="Escape"){if(u.isMenuOpen()){u.closeMenu(),Ie();return}e.setSelection([]),Ie();return}const p=i.shiftKey?40:8,I={ArrowLeft:[-p,0],ArrowRight:[p,0],ArrowUp:[0,-p],ArrowDown:[0,p]}[i.key];if(I!==void 0){i.preventDefault();const ie=e.selectedIds();ie.length>0&&(e.nudge(ie,I[0],I[1]),Ie(),y())}}function at(){var k,I,J;const i=document.activeElement,c=((k=i==null?void 0:i.closest)==null?void 0:k.call(i,".p-frame-head"))??null,p=((I=i==null?void 0:i.closest)==null?void 0:I.call(i,".p-node"))??null;if(c!==null){$e({type:"remove-team",name:c.dataset.frame??""});return}if(p!==null){const F=p.dataset.id??"",X=((J=e.getNode(F))==null?void 0:J.memberships.map(ne=>ne.team))??[];if(X.length===0){w("info","该节点未加入任何团队");return}if(X.length===1){$e({type:"remove-member",team:X[0],ids:[F]});return}u.openMenu(window.innerWidth/2,window.innerHeight/2,{kind:"node",id:F},"leave",p);return}w("info","焦点不在节点或团队框上")}function je(i){var ie,le;const c=document.activeElement,p=((ie=c==null?void 0:c.closest)==null?void 0:ie.call(c,".p-node"))??null;if(p===null)return;const k=p.dataset.id??"",I=((le=e.getNode(k))==null?void 0:le.memberships)??[];if(I.length!==1)return;const J=I[0].team,F=e.teamMemberIds(J),X=F.indexOf(k),ne=i?Math.max(0,X-1):Math.min(F.length-1,X+1);if(ne===X)return;const ce=[...F];ce.splice(X,1),ce.splice(ne,0,k),$e({type:"reorder",team:J,ops:Vt(F,ce)})}function we(i){i.key===" "&&(r=!1)}C.addEventListener("pointerdown",i=>ge(i),re),C.addEventListener("pointermove",i=>ke(i),re),C.addEventListener("pointerup",i=>Fe(i),re),C.addEventListener("wheel",i=>oe(i),{...re,passive:!1}),C.addEventListener("keydown",i=>Xe(i),re),C.addEventListener("keyup",i=>we(i),re),C.addEventListener("contextmenu",i=>{const c=i;if(c.preventDefault(),c.preventDefault(),Ce){Ce=!1;return}u.contextMenuAt(c.clientX,c.clientY,c.target)},re);let ze=[];function bt(i){var ve,Be,He;ze=i.teams,i.peers,Ue.setInFlight(i.inFlight??[]),B=i.sessions,u.setUnjoined(i.sessions.filter(g=>g.joined!==!0&&!g.id.startsWith("peer-")));const c=new Map;for(const g of i.teams)for(let de=0;de<g.members.length;de++){const G=g.members[de].id,Le=c.get(G)??[];Le.push({team:g.name,index:de}),c.set(G,Le)}T=new Set(c.keys());const p=new Set,k=g=>{const de=c.get(g)??[];if(Q.size===0)return de;const G=de.filter(Se=>!Q.has(Se.team)),Le=[];for(const[Se]of Q){const ye=e.teamMemberIds(Se).indexOf(g);ye>=0&&Le.push({team:Se,index:ye})}return[...G,...Le]};let I;if(o===void 0&&!e.allNodes().some(g=>g.remote!==!0)){const g=i.sessions.filter(de=>{var G;return de.joined===!0&&(k(de.id).length>0||(((G=de.teams)==null?void 0:G.length)??0)>0)}).map(de=>de.id);We(),I=vo(i.teams,g,_e>0?_e:void 0)}for(const g of i.sessions){if(g.joined!==!0)continue;const de=k(g.id);if(!(de.length===0&&(g.teams===void 0||g.teams.length===0)))if(p.add(g.id),e.getNode(g.id)!==void 0)e.upsertNode({id:g.id,x:e.getNode(g.id).x,y:e.getNode(g.id).y,label:g.label,team:g.team,name:g.name,live:g.live!==!1,memberships:de,...g.teams!==void 0&&g.teams.length>0?{teams:g.teams}:{}});else{const G=o==null?void 0:o.nodes[g.id];let Le,Se;if(G!==void 0)Le=G.x,Se=G.y;else{const Ee=(I==null?void 0:I.get(g.id))??$t(g.id);Le=Ee.x,Se=Ee.y}e.upsertNode({id:g.id,x:Le,y:Se,label:g.label,team:g.team,name:g.name,live:g.live!==!1,memberships:de,...g.teams!==void 0&&g.teams.length>0?{teams:g.teams}:{}})}}for(const g of e.nodeIds())!p.has(g)&&!g.startsWith("peer-")&&!g.startsWith("member-")&&e.removeNode(g);const J=new Set;Ve=Eo(i.remoteTeams??[]),l.clear();for(const g of i.peers??[])l.set(xt(g.url),g.score),L.set(xt(g.url),{link:g.link,verified:g.verified});if(i.peers!==void 0){const g=e.contentBounds(),de=Ao(i.peers,g);i.peers.forEach((G,Le)=>{var an,rn,ln,cn;const Se=ko(G.url);J.add(Se);const Ee=o==null?void 0:o.nodes[Se],ye=e.getNode(Se),dt=ye!==void 0?{x:ye.x,y:ye.y}:Ee!==void 0?{x:Ee.x,y:Ee.y}:{x:((an=de[Le])==null?void 0:an.x)??200,y:((rn=de[Le])==null?void 0:rn.y)??0},tt=xt(G.url),gt=(cn=(ln=Ve.get(tt))==null?void 0:ln[0])==null?void 0:cn.team;e.upsertNode({id:Se,x:dt.x,y:dt.y,label:G.url,team:"",name:G.url,peerUrl:G.url,remoteHandle:gt,live:!0,remote:!0,memberships:[]}),e.upsertScore(Se,G.score)})}for(const g of e.nodeIds())g.startsWith("peer-")&&!J.has(g)&&e.removeNode(g);const F=new Set;for(const[g,de]of Ve){const G=e.allNodes().find(Ee=>Ee.remote===!0&&xt(Ee.peerUrl??"")===g&&!Ee.id.startsWith("member-")),Le=((G==null?void 0:G.x)??400)+190;let Se=(G==null?void 0:G.y)??0;for(const Ee of de){if(!Ee.team.includes("/"))continue;const ye=`member-${Ee.team.replace(/[^a-z0-9-]/gi,"-")}`;if(F.has(ye))continue;F.add(ye);const dt=o==null?void 0:o.nodes[ye],tt=e.getNode(ye),gt=tt!==void 0?{x:tt.x,y:tt.y}:dt!==void 0?{x:dt.x,y:dt.y}:{x:Le,y:Se};Se+=92,e.upsertNode({id:ye,x:gt.x,y:gt.y,label:Ee.team,team:Ee.team,name:Ee.name!==void 0&&Ee.name!==""?Ee.name:Ee.team,remoteHandle:Ee.team,live:!0,remote:!0,memberships:[]})}}for(const g of e.nodeIds())g.startsWith("member-")&&!F.has(g)&&e.removeNode(g);const X=new Map;for(const g of e.allNodes())g.remote!==!0||g.remoteHandle===void 0||g.remoteHandle===""||(!X.has(g.remoteHandle)||g.id.startsWith("member-"))&&X.set(g.remoteHandle,g.id);for(const g of i.teams){if(Q.has(g.name))continue;const de=[];for(const Se of g.members){const Ee=X.get(Se.id)??Se.id;e.getNode(Ee)!==void 0&&de.push(Ee)}const G=[...e.teamMemberIds(g.name)].sort().join("|"),Le=[...de].sort().join("|");G!==Le&&e.setTeamMembers(g.name,de)}const ne=new Map,ce=Z;if(Z=ne,i.peerOrg!==void 0){let g=0;const de=new Set(i.teams.map(G=>G.name));for(const G of i.peerOrg){const Le=((Be=(ve=i.remoteTeams)==null?void 0:ve.find(ye=>ye.via===G.url))==null?void 0:Be.team.split("/")[0])??"dsh",Se=ye=>ye.replace(/^session-/,"").slice(0,8),Ee=ye=>ye.includes("/")?`member-${ye.replace(/[^a-z0-9-]/gi,"-")}`:`member-${Le}-${Se(ye)}`;for(const ye of G.org){if(ye.name===""||de.has(ye.name))continue;const dt=ye.members.map(Ee).filter(gt=>e.getNode(gt)!==void 0),tt=(He=o==null?void 0:o.frames)==null?void 0:He[ye.name];e.getFrame(ye.name)===void 0&&e.setFrame(ye.name,tt!==void 0?{x:tt.x,y:tt.y,w:tt.w,h:tt.h}:{x:200+g%4*280,y:940+Math.floor(g/4)*160,w:250,h:130}),e.setTeamMembers(ye.name,dt),ne.set(ye.name,G.url),g+=1}}}for(const[g,de]of ce)ne.has(g)||e.removeFrame(g);const ie=new Map;for(const g of e.allNodes())g.remote===!0&&g.remoteHandle!==void 0&&g.remoteHandle!==""&&ie.set(g.remoteHandle,g.id);const le=Pn(i.teams);for(const g of i.teams){if(e.getFrame(g.name)!==void 0||Q.has(g.name))continue;const de=o==null?void 0:o.frames[g.name];if(de!==void 0){e.setFrame(g.name,{...de});continue}const G=[],Le=[];for(const Ee of g.members){const ye=e.getNode(ie.get(Ee.id)??Ee.id);ye!==void 0&&(Le.push(ft(ye)),le.get(ye.id)===g.name&&G.push(ft(ye)))}const Se=G.length>0?G:Le;Se.length>0&&e.setFrame(g.name,nn(Se))}for(const[g]of e.allFrames())Q.has(g)||!i.teams.some(de=>de.name===g)&&!ne.has(g)&&e.removeFrame(g);if(O.refresh(),Y(i),m&&n.kind==="none"&&e.nodeIds().length>0&&(We(),_e>0&&De>0)){m=!1;let g=e.contentBounds();for(const de of e.allNodes()){if(de.remote!==!0)continue;const G=ft(de);g=g===null?{minX:G.x,minY:G.y,maxX:G.x+G.w,maxY:G.y+G.h}:{minX:Math.min(g.minX,G.x),minY:Math.min(g.minY,G.y),maxX:Math.max(g.maxX,G.x+G.w),maxY:Math.max(g.maxY,G.y+G.h)}}s=Ut(g,_e,De,1)}Ie()}function $t(i){return Fn(i,e.allNodes().filter(c=>c.remote!==!0))}function Ht(i){const c=_n(i);if(c===void 0)return;o=c;const p=t.viewportStore;if(p===void 0)m=!1,n.kind==="none"&&(s=yt({...c.viewport}));else if(!x&&n.kind==="none"){x=!0;const k=p.get(d());k!=null&&Number.isFinite(k.x)&&Number.isFinite(k.y)&&Number.isFinite(k.scale)?(s=yt({x:k.x,y:k.y,scale:k.scale}),m=!1):d()==="wide"&&(s=yt({...c.viewport}),m=!1)}a=-1,Ie()}function Rn(){return po(s,e.positions(),e.frameRects())}function jn(i,c){$.classList.remove("pending","saved","error"),i==="pending"&&$.classList.add("pending"),i==="saved"&&$.classList.add("saved"),i==="error"&&$.classList.add("error"),i==="error"?($.tabIndex=0,$.setAttribute("role","button"),$.setAttribute("aria-label","布局保存失败,按回车重试")):($.removeAttribute("tabindex"),$.removeAttribute("role"),$.removeAttribute("aria-label"));const p=i==="pending"?"布局待保存…":i==="saved"?`布局已保存 ${c??""}`.trimEnd():i==="error"?"保存失败 · 回车重试":"布局";ae.textContent=p}function Bn(){C.style.display="block",We(),Je(),C.focus()}function Hn(){C.style.display="none"}function Yn(){D.abort();for(const i of j)clearTimeout(i)}return{root:C,reconcile:bt,activate:Bn,deactivate:Hn,adoptExternalLayout:Ht,snapshotDoc:Rn,setLamp:jn,notice:w,destroy:Yn,seam:{pointerDown:ge,pointerMove:ke,pointerUp:Fe,wheel:oe,key:Xe,keyUp:we,contextMenu(i){i.preventDefault(),u.contextMenuAt(i.clientX,i.clientY,i.target)}}}}const Xo=800;function Ko(t){let e,o=!1,s=!1,n=!1,r="idle";function a(y){y!==r&&(r=y,t.onLamp(y))}function m(){e!==void 0&&(e(),e=void 0)}function x(){m(),e=t.schedule(()=>{e=void 0,d(!1)},Xo)}async function d(y){if(o){s=!0;return}o=!0,m();const _=t.snapshot();let D;try{D=JSON.stringify(_)}catch{o=!1,a("error"),t.onHttpError("layout document is not JSON-serializable");return}try{const j=await t.send(_,{keepalive:y});if(j===null||typeof j!="object"||j.ok!==!0){a("error");const V=j!==null&&typeof j=="object"&&typeof j.error=="string"?j.error:"layout save refused";t.onHttpError(`layout save: ${V}`)}else JSON.stringify(t.snapshot())===D&&(t.onAdopt(j.layout),a("saved"))}catch(j){a("error"),t.onHttpError(`layout save unreachable: ${String((j==null?void 0:j.message)??j).slice(0,80)}`)}if(o=!1,r==="error"){n=!1;return}if(n){n=!1,d(!0);return}s&&(s=!1,a("pending"),x())}return{markDirty(){if(s=!1,a("pending"),o){s=!0;return}x()},retry(){r!=="error"||o||(a("pending"),d(!1))},flush(){if(o){n=!0,s=!0;return}m(),d(!0)},isBusy(){return o},dispose(){m()}}}function $n(t){return typeof t.error=="string"?t.error:void 0}function Uo(t){const e=new Map;let o=0;function s(a,m){o+=1;const x=e.get(a)??Promise.resolve(),d=async()=>{try{return await m()}finally{o-=1}},y=x.then(d,d);return e.set(a,y.then(()=>{},()=>{})),y}async function n(a){let m;try{m=await t.send(a)}catch(d){const y=String((d==null?void 0:d.message)??d).slice(0,80);return t.onNotice("error",`画布不可达:${y}`),!1}if(m.status>=400)return t.onNotice("error",$n(m.body)??`HTTP ${m.status}`),!1;if(m.body.ok===!0)return!0;const x=$n(m.body);return x!==void 0?(t.onNotice("error",x),!1):!0}async function r(a,m){for(const x of m)if(!await n({...a,id:x}))return!1;return!0}return{createTeam(a,m,x=!1){return s(a,async()=>{if(!await n({action:"create",name:a}))return!1;for(let d=0;d<m.length;d++)if(!await n({action:"add-member",name:a,id:m[d]}))return x&&d===0&&await n({action:"remove",name:a}),!1;return!0})},addMembers(a,m){return s(a,()=>r({action:"add-member",name:a},m))},removeMembers(a,m){return s(a,()=>r({action:"remove-member",name:a},m))},runRosterOps(a,m){return s(a,async()=>{for(const x of m){const d=x.op==="remove"?{action:"remove-member",name:a,id:x.id}:{action:"add-member",name:a,id:x.id};if(!await n(d))return!1}return!0})},removeTeam(a){return s(a,()=>n({action:"remove",name:a}))},hasPending(){return o>0}}}const Dn=document.getElementById("app"),Jo=(()=>{try{return window.sessionStorage.getItem("dsh_a2a_key")??""}catch{return""}})(),qt=window.__DSH_A2A_KEY__??Jo,Ke=(t,e={})=>fetch(t,{...e,headers:{...e.headers??{},...qt!==""?{"X-API-Key":qt}:{}}});qt===""&&Ke("/__dsh_a2a/owner-settings").then(t=>{if(t.status!==401)return;const e=document.createElement("div");e.className="nexus-keygate",e.style.cssText="position:fixed;inset:0;display:flex;align-items:center;justify-content:center;flex-direction:column;gap:10px;background:#fff;z-index:9999;font:14px/1.5 system-ui,sans-serif;color:#000";const o=document.createElement("div");o.textContent="此面板经远程面打开(密钥不随页面下发)——输入控制密钥";const s=document.createElement("input");s.type="password",s.placeholder="X-API-Key",s.setAttribute("aria-label","控制密钥");const n=document.createElement("button");n.type="button",n.textContent="进入面板";const r=document.createElement("div");r.style.color="#b00";const a=()=>{const m=s.value.trim();m!==""&&fetch("/__dsh_a2a/owner-settings",{headers:{"X-API-Key":m}}).then(x=>{if(x.status===401){r.textContent="密钥不对,再试一次";return}try{window.sessionStorage.setItem("dsh_a2a_key",m)}catch{}window.location.reload()})};n.addEventListener("click",a),s.addEventListener("keydown",m=>{m.key==="Enter"&&a()}),e.append(o,s,n,r),document.body.appendChild(e)});const At=document.createElement("div");At.className="nexus-fault";Dn.appendChild(At);const{fault:Qt,clear:zo}=Kn({show(t){At.textContent=t,At.style.display="block"},hide(){At.style.display="none"}},t=>console.error(t));let Pt;const Nn="dsh-a2a.viewport.",Go={get(t){try{const e=window.localStorage.getItem(Nn+t);return e===null?void 0:JSON.parse(e)}catch{return}},set(t,e){try{window.localStorage.setItem(Nn+t,JSON.stringify({x:e.x,y:e.y,scale:e.scale}))}catch{}}},ct=Wo({viewportStore:Go,onDirty:()=>Dt.markDirty(),onLampClick:()=>Dt.retry(),onNodePick:t=>{Pt==null||Pt(t)},onCanvasAction:async t=>{const e=await Vo(t);return Bt(),e}}),Dt=Ko({snapshot:()=>ct.snapshotDoc(),send:(t,e)=>Ke("/__dsh_a2a/canvas-layout",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"save",layout:t}),cache:"no-store",keepalive:e.keepalive}).then(async o=>await o.json()),schedule:(t,e)=>{const o=setTimeout(t,e);return()=>{clearTimeout(o)}},now:Date.now,onLamp:t=>{Zt=t;const e=new Date,o=String(e.getHours()).padStart(2,"0")+":"+String(e.getMinutes()).padStart(2,"0");ct.setLamp(t,o)},onAdopt:t=>{ct.adoptExternalLayout(t)},onHttpError:t=>Qt(t)});window.addEventListener("pagehide",()=>Dt.flush());const St=Uo({send:async t=>{const e=await Ke("/__dsh_a2a/canvas",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t),cache:"no-store"});return{status:e.status,body:await e.json()}},onNotice:(t,e)=>ct.notice(t,e)});function Vo(t){if((t.type==="add-member"||t.type==="remove-member")&&t.fleetPeer!==void 0)return(async()=>{for(const e of t.ids){const o=await Ke("/__dsh_a2a/fleet-canvas-op",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({peer:t.fleetPeer,op:t.type==="add-member"?"add-member":"remove-member",name:t.team,id:e}),cache:"no-store"}).catch(()=>{}),s=o!==void 0?await o.json().catch(()=>{}):void 0;if((s==null?void 0:s.ok)!==!0)return!1}return!0})();switch(t.type){case"create-team":return St.createTeam(t.name,t.ids,t.created);case"add-member":return St.addMembers(t.team,t.ids);case"remove-member":return St.removeMembers(t.team,t.ids);case"remove-team":return St.removeTeam(t.name);case"reorder":return St.runRosterOps(t.team,t.ops);case"join-network":case"leave-network":return qo(t.type==="join-network"?"join":"leave",t.id)}}async function qo(t,e){const o=await Ke(`/__dsh_a2a/${t}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({id:e}),cache:"no-store"}).catch(()=>{});return o!==void 0&&o.ok}let Zt="idle",Rt=!1,Mn,Jt=!1;async function Qo(){const t=await Ke("/__dsh_a2a/canvas-layout",{cache:"no-store"});if(!t.ok)throw new Error(`/__dsh_a2a/canvas-layout ${t.status}`);return(await t.json()).layout??null}const jt=uo({now:()=>Date.now(),async ownerSettingsRead(){try{return await(await Ke("/__dsh_a2a/owner-settings")).json()}catch{return{ok:!1,error:"unreachable"}}},async ownerSettingsWrite(t){try{return await(await Ke("/__dsh_a2a/owner-settings",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(t)})).json()}catch{return{ok:!1,error:"unreachable"}}},async abandon(t,e){try{return(await Ke("/__dsh_a2a/tasks/abandon",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({task_id:t,reason:e})})).ok}catch{return!1}},copy(t){var e;(e=navigator.clipboard)==null||e.writeText(t).catch(()=>{})},async canvasOp(t,e,o){try{const s=await Ke("/__dsh_a2a/canvas",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({action:t,name:e,id:o})}),n=await s.json().catch(()=>({}));return s.ok&&n.ok!==!1?!0:(console.warn(`canvas ${t} ${e}: ${n.error??`HTTP ${s.status}`}`),!1)}catch{return!1}},async dispatchQuick(t,e){try{const o=await Ke("/__dsh_a2a/dispatch",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({team:t,message:e})}),s=await o.json().catch(()=>({}));return{ok:o.ok&&s.ok===!0,task_id:s.task_id,reply:s.reply,error:s.error??`HTTP ${o.status}`}}catch(o){return{ok:!1,error:o instanceof Error?o.message:String(o)}}},async sessionLog(t){try{const e=await Ke(`/__dsh_a2a/session-log?id=${encodeURIComponent(t)}`),o=await e.json().catch(()=>({}));return{ok:e.ok&&o.ok===!0,messages:o.messages,error:o.error??(e.ok?void 0:`HTTP ${e.status}`)}}catch(e){return{ok:!1,error:e instanceof Error?e.message:String(e)}}},async sessionLogList(){try{const t=await Ke("/__dsh_a2a/session-log"),e=await t.json().catch(()=>({}));return{ok:t.ok&&e.ok===!0,sessions:e.sessions,count:typeof e.count=="number"?e.count:void 0,error:e.error??(t.ok?void 0:`HTTP ${t.status}`)}}catch(t){return{ok:!1,error:t instanceof Error?t.message:String(t)}}},async remoteSessionLog(t){try{const e=new URLSearchParams;t.team!==void 0&&e.set("team",t.team),t.peer!==void 0&&e.set("peer",t.peer),t.id!==void 0&&e.set("id",t.id),t.limit!==void 0&&e.set("limit",String(t.limit));const o=await Ke(`/__dsh_a2a/remote-session-log?${e.toString()}`),s=await o.json().catch(()=>({}));return{ok:o.ok&&s.ok===!0,messages:s.messages,sessions:s.sessions,error:s.error??(o.ok?void 0:`HTTP ${o.status}`),via:s.via}}catch(e){return{ok:!1,error:e instanceof Error?e.message:String(e)}}},board:{root:ct.root,activate:()=>ct.activate(),deactivate:()=>ct.deactivate(),available:()=>Rt}});Dn.appendChild(jt.root);Pt=t=>{jt.openNodeChat(t)};if(new URLSearchParams(window.location.search).get("mode")==="plan"){const t=window.setInterval(()=>{Rt&&(jt.selectTab("board"),window.clearInterval(t))},300);window.setTimeout(()=>window.clearInterval(t),3e4)}async function Bt(){var t;try{const e=await Ke("/__dsh_a2a/state",{cache:"no-store"});if(!e.ok)throw new Error(`/__dsh_a2a/state ${e.status}`);const o=await e.json();if(zo(),Rt=o.canvas!==void 0,jt.update(o),Rt)try{const d=await Qo(),y=JSON.stringify(d??null);y!==Mn&&(Mn=y,(Zt==="idle"||Zt==="saved")&&!Dt.isBusy()&&ct.adoptExternalLayout(d)),Jt=!0}catch(d){if(!Jt){Qt(`canvas layout 获取失败:${String(d)}`);return}}else Jt=!0;const s=(o.sessions??[]).map(d=>({...d,joined:d.joined===!0})),n=((t=o.canvas)==null?void 0:t.teams)??[],r=(o.peers??[]).filter(d=>d!==null&&typeof d=="object"&&typeof d.url=="string"),a=(o.inFlight??[]).filter(d=>d!==null&&typeof d=="object"&&typeof d.team=="string"&&typeof d.peer=="string"&&Number.isFinite(d.startedAt)),m=(o.remote??[]).filter(d=>d!==null&&typeof d=="object"&&typeof d.team=="string"&&typeof d.via=="string").map(d=>({team:d.team,name:d.name,via:d.via,workspace:d.workspace,...typeof d.origin=="string"&&d.origin!==""?{origin:d.origin}:{},...Array.isArray(d.teams)&&d.teams.length>0?{teams:d.teams.filter(y=>typeof y=="string"&&y!=="")}:{}})),x=(o.peerOrg??[]).filter(d=>d!==null&&typeof d=="object").filter(d=>typeof d.url=="string"&&Array.isArray(d.org)).map(d=>({url:d.url,org:d.org.filter(y=>y!==null&&typeof y=="object").filter(y=>typeof y.team=="string"&&y.team!=="").map(y=>({name:typeof y.name=="string"?y.name:"",team:y.team,members:Array.isArray(y.members)?y.members.filter(_=>typeof _=="string"):[]}))}));ct.reconcile({sessions:s,teams:n,peerCount:r.length,peers:r,inFlight:a,remoteTeams:m,peerOrg:x})}catch(e){Qt(`state 轮询失败:${String(e)}`)}}Bt();window.setInterval(()=>{document.hidden||Bt()},3e3);document.addEventListener("visibilitychange",()=>{document.hidden||Bt()});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
#dsh-plan *,#dsh-plan *:before,#dsh-plan *:after{box-sizing:border-box}#dsh-plan{--uupm-ink-0:var(--n-ink,#dde3f0);--uupm-ink-1:var(--n-ink-muted,#7a86a0);--uupm-bg-0:var(--n-bg,#060a12);--uupm-bg-1:var(--n-panel,#0d1322);--uupm-bg-2:var(--n-raised,#131b2e);--uupm-accent:var(--n-accent,#9673f7);--uupm-live:var(--n-live,#4ade80);--uupm-cold:var(--n-cold,#7a86a0);--uupm-edge-member:var(--n-canvas,#22d3ee);--uupm-warn:var(--n-act,#f59e0b);--uupm-error:var(--n-danger,#f87171);--uupm-indigo:var(--n-federal,#6366f1);--uupm-wash-5:color-mix(in srgb,var(--uupm-accent) 5%,transparent);--uupm-wash-8:color-mix(in srgb,var(--uupm-accent) 8%,transparent);--uupm-wash-12:color-mix(in srgb,var(--uupm-accent) 12%,transparent);--uupm-wash-15:color-mix(in srgb,var(--uupm-accent) 15%,transparent);--uupm-wash-18:color-mix(in srgb,var(--uupm-accent) 18%,transparent);--surface:var(--uupm-bg-1);--ink:var(--uupm-ink-0);--ink-muted:var(--uupm-ink-1);--accent:var(--uupm-accent);--edge-live:var(--uupm-live);--edge-cold:var(--uupm-cold);--federal:var(--uupm-indigo);--card-bg:var(--surface);--card-line:var(--n-card-line,#5c6680);--card-line-hover:var(--uupm-ink-1);--toolbar-bg:color-mix(in srgb,var(--uupm-bg-1) 92%,transparent);--grid-dot:color-mix(in srgb,var(--uupm-ink-1) 22%,transparent);--scrim:color-mix(in srgb,var(--uupm-bg-0) 60%,transparent);--error-ink:var(--n-error-ink,#fecaca);--error-panel:var(--n-error-panel,#2a0d10f2)}#dsh-plan{position:absolute;top:0;right:0;bottom:0;left:0;overflow:hidden;background:var(--uupm-bg-0);color:var(--ink);font-size:13px;line-height:1.5;outline:none}#dsh-plan .mono{font-family:ui-monospace,Cascadia,Consolas,monospace}#dsh-plan:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}#dsh-plan .p-grid{position:absolute;top:0;right:0;bottom:0;left:0;z-index:0;pointer-events:none;background-image:radial-gradient(circle,var(--grid-dot) 1px,transparent 1px);background-size:24px 24px;background-position:0 0}#dsh-plan .p-world{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;transform-origin:0 0}#dsh-plan .p-layer{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none}#dsh-plan .p-edges{position:absolute;overflow:visible;width:100%;height:100%;pointer-events:none}#dsh-plan .p-frame{pointer-events:none}#dsh-plan .p-frame-head,#dsh-plan .p-node{pointer-events:auto}#dsh-plan .e-member{stroke:var(--uupm-edge-member);stroke-opacity:.38;stroke-width:1.5}#dsh-plan .e-member.dashed{stroke-dasharray:3 4}#dsh-plan .p-frame{--frame-ink:var(--frame-line,#8B5CF6)}@media (prefers-color-scheme: light){#dsh-plan .p-frame{--frame-ink:color-mix(in srgb,var(--frame-line,#8B5CF6) 72%,black)}}#dsh-plan .p-frame{position:absolute;border:1px solid var(--frame-ink);border-radius:10px;background:var(--frame-bg,var(--uupm-wash-5));min-width:120px;min-height:60px}#dsh-plan .p-frame-head{position:absolute;top:-13px;left:50%;transform:translate(-50%);height:24px;padding:0 10px;border-radius:6px;display:flex;gap:8px;align-items:center;background:var(--uupm-bg-2);border:1px solid var(--frame-ink);font-size:12px;font-weight:600;letter-spacing:.02em;white-space:nowrap;cursor:grab}#dsh-plan .p-frame-head:active{cursor:grabbing}#dsh-plan .p-frame-head:hover{border-color:var(--card-line-hover)}#dsh-plan .p-frame-head .cnt{color:var(--ink-muted);font-weight:400}#dsh-plan .p-frame-head .route{font-size:10.5px;color:var(--ink-muted)}#dsh-plan .p-node{position:absolute;width:172px;height:56px;padding:8px 26px 8px 14px;background:var(--card-bg);border:1px solid var(--card-line);border-left:3px solid var(--edge-live);border-radius:8px;cursor:grab;-webkit-user-select:none;user-select:none;transition:border-color .12s cubic-bezier(.2,0,0,1),transform .12s cubic-bezier(.2,0,0,1)}#dsh-plan .p-node:hover{border-color:var(--card-line-hover)}#dsh-plan .p-node:active{cursor:grabbing}#dsh-plan .p-node:focus-visible{outline:2px solid var(--accent);outline-offset:2px}#dsh-plan .p-node.selected{outline:2px solid var(--accent);outline-offset:1px}#dsh-plan .p-node.dragging{transform:scale(1.02);border-color:var(--accent)}#dsh-plan .p-node.cold{border-left-color:var(--edge-cold)}#dsh-plan .p-node .nm{font-weight:600;display:flex;align-items:center;gap:7px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#dsh-plan .p-node .nm-text{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#dsh-plan .p-node .dot{width:8px;height:8px;border-radius:50%;background:var(--edge-live);flex:none}#dsh-plan .p-node.cold .dot{background:transparent;border:1.5px solid var(--edge-cold)}#dsh-plan .p-node .sub{font-size:11px;color:var(--ink-muted);margin-top:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#dsh-plan .p-node .prio{position:absolute;top:6px;right:8px;font-size:10px;color:var(--ink-muted);border:1px solid var(--card-line);border-radius:4px;padding:0 5px}#dsh-plan .p-marquee{position:absolute;z-index:2;display:none;pointer-events:none;border:1px solid var(--accent);background:var(--uupm-wash-8)}#dsh-plan .p-toolbar{position:absolute;top:16px;left:16px;z-index:3;display:flex;gap:6px;align-items:center;background:var(--toolbar-bg);border:1px solid var(--card-line);border-radius:8px;padding:6px 8px}#dsh-plan .p-tabs{position:absolute;top:16px;left:50%;transform:translate(-50%);z-index:3;display:flex;gap:4px;background:var(--toolbar-bg);border:1px solid var(--card-line);border-radius:8px;padding:4px}#dsh-plan .p-tabs [role=tab]{background:transparent;color:var(--ink-muted);border:1px solid transparent;border-radius:6px;padding:4px 12px;font:inherit;cursor:pointer}#dsh-plan .p-tabs [role=tab]:hover{color:var(--ink);border-color:var(--card-line)}#dsh-plan .p-tabs [role=tab][aria-selected=true]{color:var(--ink);border-color:var(--accent);background:var(--uupm-wash-12)}#dsh-plan .p-tabs [role=tab]:focus-visible{outline:2px solid var(--accent);outline-offset:1px}#dsh-plan .p-toolbar button{background:transparent;color:var(--ink);border:1px solid var(--card-line);border-radius:6px;padding:4px 10px;font:inherit;cursor:pointer;white-space:nowrap}#dsh-plan .p-toolbar button:hover{border-color:var(--accent)}#dsh-plan .p-toolbar button:active{background:var(--uupm-wash-15)}#dsh-plan .p-toolbar button:focus-visible{outline:2px solid var(--accent);outline-offset:1px}#dsh-plan .p-zoom{min-width:44px;text-align:center;font-size:11px;color:var(--ink-muted)}#dsh-plan .p-lamp{display:flex;align-items:center;gap:6px;font-size:11px;color:var(--ink-muted);padding:0 6px}#dsh-plan .p-lamp i{width:7px;height:7px;border-radius:50%;background:var(--ink-muted);transition:background .14s ease}#dsh-plan .p-lamp.saved i{background:var(--edge-live)}#dsh-plan .p-lamp.pending i{background:var(--uupm-warn)}#dsh-plan .p-lamp.error{color:var(--uupm-error);cursor:pointer}#dsh-plan .p-lamp.error i{background:var(--uupm-error)}#dsh-plan .p-lamp.error:hover{border:1px solid var(--uupm-error);border-radius:4px}#dsh-plan .p-status{position:absolute;top:16px;right:16px;z-index:3;display:flex;gap:14px;background:var(--toolbar-bg);border:1px solid var(--card-line);border-radius:8px;padding:8px 14px;font-size:12px}#dsh-plan .p-status b{font-weight:600}#dsh-plan .ok{color:var(--edge-live)}#dsh-plan .warn{color:var(--uupm-warn)}#dsh-plan .mut{color:var(--ink-muted)}#dsh-plan .p-legend{position:absolute;bottom:16px;left:16px;z-index:3;font-size:11px;color:var(--ink-muted);background:var(--toolbar-bg);border:1px solid var(--card-line);border-radius:8px;padding:8px 12px;display:grid;gap:4px}#dsh-plan .p-legend i{display:inline-block;width:18px;border-top:2px solid var(--uupm-edge-member);vertical-align:middle;margin-right:6px}#dsh-plan .p-legend i.dashed{border-top-style:dashed}@media (max-width:680px){#dsh-plan .p-toolbar{left:8px;right:8px;top:8px;overflow-x:auto;scrollbar-width:none}#dsh-plan .p-toolbar>*{flex:none}#dsh-plan .p-status{left:8px;right:auto;top:58px;padding:6px 10px;gap:10px;flex-wrap:wrap}#dsh-plan .p-legend{display:none}}@media (pointer:coarse){#dsh-plan .p-toolbar button{min-height:36px;min-width:36px}}@media (prefers-reduced-motion: reduce){#dsh-plan *{transition:none!important;animation:none!important}}#dsh-plan .p-frame.drop-target{border-color:var(--accent);border-width:2px;background:var(--uupm-wash-12)}#dsh-plan .p-frame-head:focus-visible{outline:2px solid var(--accent);outline-offset:1px}#dsh-plan .p-node.remote{border-left-color:var(--federal);padding-right:46px}#dsh-plan .p-node.remote .dot{background:var(--federal)}#dsh-plan .p-node.remote .prio{color:var(--ink)}#dsh-plan .p-node .prio.lnk-linked{color:var(--live, #2e9e5b);border-color:var(--live, #2e9e5b)}#dsh-plan .p-node .prio.lnk-stranger{color:var(--ink-muted);border-color:var(--card-line)}#dsh-plan .e-activity{stroke:var(--accent);stroke-width:2;stroke-dasharray:8 6;stroke-opacity:.9}#dsh-plan .e-federal{stroke:var(--federal);stroke-width:1.5;stroke-dasharray:6 5;stroke-opacity:.5}#dsh-plan .edge-label{font-size:10.5px;fill:var(--ink-muted)}@media (prefers-reduced-motion: no-preference){#dsh-plan .e-activity{animation:p-activity-flow 1.1s linear infinite}}@keyframes p-activity-flow{to{stroke-dashoffset:-28}}#dsh-plan .p-status{cursor:pointer}#dsh-plan .p-status:hover{border-color:var(--accent)}#dsh-plan .p-status:active{background:var(--uupm-wash-12)}#dsh-plan .p-status:focus-visible{outline:2px solid var(--accent);outline-offset:2px}#dsh-plan .p-menu{position:fixed;z-index:5;min-width:170px;display:grid;padding:4px;gap:2px;background:var(--toolbar-bg);border:1px solid var(--card-line);border-radius:8px}#dsh-plan .p-menu [role=menuitem]{background:transparent;color:var(--ink);border:1px solid transparent;border-radius:6px;padding:6px 10px;font:inherit;text-align:left;cursor:pointer;white-space:nowrap}#dsh-plan .p-menu [role=menuitem]:hover{border-color:var(--card-line);background:var(--uupm-wash-8)}#dsh-plan .p-menu [role=menuitem]:active{background:var(--uupm-wash-18)}#dsh-plan .p-menu [role=menuitem]:focus-visible{outline:2px solid var(--accent);outline-offset:1px}#dsh-plan .p-menu [role=menuitem][aria-disabled=true]{color:var(--ink-muted);cursor:not-allowed}#dsh-plan .p-dialog{position:absolute;top:0;right:0;bottom:0;left:0;z-index:6;display:grid;place-items:center;background:var(--scrim)}#dsh-plan .p-dialog-panel{min-width:300px;padding:14px 16px;display:grid;gap:10px;background:var(--uupm-bg-2);border:1px solid var(--card-line);border-radius:10px}#dsh-plan .p-dialog-title{font-weight:600;font-size:12.5px;color:var(--ink)}#dsh-plan .p-dialog-input{font:inherit;color:var(--ink);background:var(--uupm-bg-0);border:1px solid var(--card-line);border-radius:6px;padding:7px 10px}#dsh-plan .p-dialog-input:hover{border-color:color-mix(in srgb,var(--uupm-ink-1) 55%,transparent)}#dsh-plan .p-dialog-input:focus-visible{outline:2px solid var(--accent);outline-offset:1px;border-color:var(--accent)}#dsh-plan .p-dialog-err{min-height:1.2em;font-size:11px;color:var(--uupm-error)}#dsh-plan .p-dialog-row{display:flex;gap:8px;justify-content:flex-end}#dsh-plan .p-dialog-row button{background:transparent;color:var(--ink);border:1px solid var(--card-line);border-radius:6px;padding:5px 12px;font:inherit;cursor:pointer}#dsh-plan .p-dialog-row button:hover{border-color:var(--accent)}#dsh-plan .p-dialog-row button:active{background:var(--uupm-wash-15)}#dsh-plan .p-dialog-row button:focus-visible{outline:2px solid var(--accent);outline-offset:1px}#dsh-plan .p-notice-stack{position:absolute;bottom:52px;left:50%;transform:translate(-50%);z-index:5;display:grid;gap:6px;justify-items:center;pointer-events:none}#dsh-plan .p-notice{max-width:60ch;padding:7px 12px;font-size:12px;color:var(--ink);background:var(--toolbar-bg);border:1px solid var(--card-line);border-radius:8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}#dsh-plan .p-notice.error{color:var(--error-ink);border-color:var(--uupm-error);background:var(--error-panel)}#dsh-plan .p-netbtn{color:var(--ink-muted)}#dsh-plan .p-netbtn:not([disabled]){color:var(--ink)}#dsh-plan .p-netmenu{max-height:240px;overflow:auto}#dsh-plan .p-nodebtn{color:var(--ink)}#dsh-plan .p-nodelist{min-width:300px;max-width:340px;max-height:420px;overflow:auto;padding:6px}#dsh-plan .p-nodelist-head{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:2px 4px 6px;border-bottom:1px solid var(--card-line)}#dsh-plan .p-nodelist-title{font-size:12px;font-weight:600;color:var(--ink)}#dsh-plan .p-nodesel{font:inherit;font-size:11.5px;color:var(--ink);background:var(--uupm-bg-0);border:1px solid var(--card-line);border-radius:6px;padding:2px 6px;max-width:220px}#dsh-plan .p-nodesel:focus-visible{outline:2px solid var(--accent);outline-offset:1px}#dsh-plan .p-nodelist-group{font-size:11px;color:var(--ink-muted);padding:8px 4px 3px;display:flex;align-items:baseline;gap:8px}#dsh-plan .p-nodelist-note{font-size:10px;color:var(--ink-muted);opacity:.8}#dsh-plan .p-noderow{display:flex;align-items:center;gap:6px;padding:3px 4px;border-radius:6px;font-size:12px;color:var(--ink)}#dsh-plan .p-noderow:hover{background:var(--uupm-wash-8)}#dsh-plan .p-nodedot{flex:none;width:7px;height:7px;border-radius:50%;background:var(--edge-live)}#dsh-plan .p-nodedot.cold{background:var(--ink-muted)}#dsh-plan .p-nodedot.off{background:transparent;border:1px solid var(--ink-muted)}#dsh-plan .p-nodename{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#dsh-plan .p-nonet{flex:none;font-size:10px;color:var(--uupm-warn);border:1px solid var(--uupm-warn);border-radius:4px;padding:0 4px}#dsh-plan .p-teamcount{flex:none;font-size:10px;color:var(--ink-muted);border:1px solid var(--card-line);border-radius:4px;padding:0 4px}#dsh-plan .p-listbtn{flex:none;background:transparent;color:var(--ink);border:1px solid var(--card-line);border-radius:5px;padding:1px 7px;font:inherit;font-size:11px;cursor:pointer}#dsh-plan .p-listbtn:hover{border-color:var(--card-line-hover);background:var(--uupm-wash-8)}#dsh-plan .p-listbtn:focus-visible{outline:2px solid var(--accent);outline-offset:1px}#dsh-plan .p-nodelist-empty{padding:10px 4px;font-size:11.5px;color:var(--ink-muted)}#dsh-plan .p-frame{position:absolute}#dsh-plan .p-frame-handle{position:absolute;pointer-events:auto;width:10px;height:10px;z-index:2;opacity:0;transition:opacity .12s ease}#dsh-plan .p-frame:hover .p-frame-handle{opacity:1}#dsh-plan .p-frame-handle:after{content:"";position:absolute;top:2px;right:2px;bottom:2px;left:2px;background:var(--frame-ink);border-radius:2px}#dsh-plan .p-h-n{top:-5px;left:calc(50% - 12px);width:24px;height:8px;cursor:ns-resize}#dsh-plan .p-h-s{bottom:-5px;left:calc(50% - 12px);width:24px;height:8px;cursor:ns-resize}#dsh-plan .p-h-e{right:-5px;top:calc(50% - 12px);width:8px;height:24px;cursor:ew-resize}#dsh-plan .p-h-w{left:-5px;top:calc(50% - 12px);width:8px;height:24px;cursor:ew-resize}#dsh-plan .p-h-ne{top:-5px;right:-5px;cursor:nesw-resize}#dsh-plan .p-h-nw{top:-5px;left:-5px;cursor:nwse-resize}#dsh-plan .p-h-se{bottom:-5px;right:-5px;cursor:nwse-resize}#dsh-plan .p-h-sw{bottom:-5px;left:-5px;cursor:nesw-resize}#dsh-plan .p-h-ne:after,#dsh-plan .p-h-sw:after{transform:rotate(45deg)}#dsh-plan .p-h-nw:after,#dsh-plan .p-h-se:after{transform:rotate(-45deg)}#dsh-plan .p-frame.selected .p-frame-handle{opacity:1}#dsh-plan .p-frame.selected{outline:1px solid var(--frame-ink)}:root{color-scheme:dark;--n-bg:#060a12;--n-ink:#dde3f0;--n-ink-muted:#7a86a0;--n-panel:#0d1322;--n-live:#4ade80;--n-cold:#7a86a0;--n-border:#223052;--n-act:#f59e0b;--n-danger:#f87171;--n-accent:#9673f7;--n-rail-w:300px;--n-canvas:#22d3ee;--n-line:var(--n-border);--n-raised:#131b2e;--n-federal:#6366f1;--n-card-line:#5c6680;--n-error-ink:#fecaca;--n-error-panel:#2a0d10f2;--n-shadow:rgba(0,0,0,.35)}@media (prefers-color-scheme: light){:root{--n-bg:#eef2fa;--n-ink:#1a2438;--n-ink-muted:#5a6580;--n-panel:#ffffff;--n-live:#157a37;--n-border:#c6d0e6;--n-act:#a84d08;--n-danger:#b91c1c;--n-accent:#6d28d9;--n-cold:#636c81;--n-canvas:#0e7490;--n-raised:#ffffff;--n-federal:#4f46e5;--n-card-line:#8a95ae;--n-error-ink:#b91c1c;--n-error-panel:#fef2f2f2;--n-shadow:rgba(26,36,56,.16)}}@media (min-width:1440px){:root{--n-rail-w:340px }}html,body,#app{height:100%;margin:0}body{background:var(--n-bg);color:var(--n-ink);font:13px/1.45 system-ui,Segoe UI,Roboto,PingFang SC,Microsoft YaHei,sans-serif}.wb{display:flex;flex-direction:column;height:100%}.wb-header{display:flex;align-items:center;gap:12px;padding:8px 14px;border-bottom:1px solid var(--n-border);background:var(--n-panel)}.wb-title{display:flex;align-items:center;gap:10px;font-weight:600;font-size:14px;white-space:nowrap}.wb-badge{font-size:11px;font-weight:400;color:var(--n-ink-muted);border:1px solid var(--n-border);border-radius:99px;padding:1px 8px}.wb-header-stats{display:flex;gap:16px;font-size:12px;color:var(--n-ink-muted);flex-wrap:wrap;min-width:0}.wb-header-stats .wb-kv{display:flex;gap:6px}.wb-header-stats .wb-kv-k{color:var(--n-ink-muted)}.wb-header-stats .wb-kv-v{color:var(--n-ink)}.wb-header-ok{color:var(--n-ink-muted)}.wb-alert{border:1px solid currentColor;border-radius:99px;padding:0 9px;line-height:20px;white-space:nowrap;cursor:help}.wb-alert-danger{color:var(--n-danger)}.wb-alert-warn{color:var(--n-act)}.wb-forensics{font-family:ui-monospace,Consolas,monospace;font-size:11px}.wb-icon-btn{background:none;border:1px solid var(--n-border);color:var(--n-ink);border-radius:8px;width:30px;height:30px;display:none;align-items:center;justify-content:center;font:inherit;font-size:14px;cursor:pointer;flex:none}.wb-icon-btn:hover{border-color:var(--n-accent)}.wb-menu{margin-left:0}.wb-rail-toggle{margin-left:auto}.wb.is-rail-collapsed .wb-rail{display:none}.wb-body{position:relative;display:grid;grid-template-columns:minmax(0,var(--n-rail-w)) minmax(0,1fr);flex:1;min-height:0}.wb-rail{border-right:1px solid var(--n-border);min-width:0;min-height:0;display:flex;flex-direction:column;overflow:hidden;background:color-mix(in srgb,var(--n-panel) 60%,var(--n-bg))}.wb-side-head{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--n-ink-muted);margin:10px 2px 4px}.wb-item{display:flex;gap:7px;align-items:center;width:100%;text-align:left;background:none;border:none;color:var(--n-ink);font:inherit;padding:3px 6px;border-radius:6px;cursor:pointer}.wb-item:hover{background:color-mix(in srgb,var(--n-accent) 14%,transparent)}.wb-dot{font-size:10px}.wb-dot-live{color:var(--n-live)}.wb-dot-cold{color:var(--n-cold)}.wb-dot-canvas{color:var(--n-canvas)}.wb-dot-remote{color:var(--n-act)}.wb-dir-tools{display:flex;flex-direction:column;gap:6px;padding:8px 6px 4px}.wb-search{background:var(--n-panel);border:1px solid var(--n-border);color:var(--n-ink);border-radius:6px;padding:4px 8px;font:inherit;font-size:12.5px;min-width:0}.wb-search:focus{outline:1px solid var(--n-accent)}.wb-filters{display:flex;flex-wrap:wrap;gap:4px}.wb-filter{background:none;border:1px solid var(--n-border);color:var(--n-ink-muted);border-radius:99px;padding:1px 9px;font:inherit;font-size:11.5px;cursor:pointer}.wb-filter:hover{border-color:var(--n-accent);color:var(--n-ink)}.wb-filter.is-active{border-color:var(--n-accent);color:var(--n-ink);background:color-mix(in srgb,var(--n-accent) 16%,transparent)}.wb-item-badge{flex:none;font-size:10.5px;color:var(--n-canvas);border:1px solid color-mix(in srgb,var(--n-canvas) 45%,transparent);border-radius:99px;padding:0 6px;line-height:17px;white-space:nowrap}.wb-item-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wb-member-row{display:flex;align-items:center;gap:8px;padding:3px 2px;border-radius:6px}.wb-member-row:hover{background:color-mix(in srgb,var(--n-accent) 10%,transparent)}.wb-member-dot{flex:none;font-size:11px;color:var(--n-ink-muted);min-width:44px}.wb-member-label{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wb-member-remove,.wb-member-submit{background:none;border:1px solid var(--n-border);color:var(--n-ink);border-radius:6px;padding:1px 8px;font:inherit;font-size:11.5px;cursor:pointer;flex:none}.wb-member-remove:hover:not(:disabled),.wb-member-submit:hover:not(:disabled){border-color:var(--n-danger)}.wb-member-submit:hover:not(:disabled){border-color:var(--n-accent)}.wb-member-add{display:flex;flex-wrap:wrap;gap:6px;margin-top:6px}.wb-member-pick,.wb-member-manual{background:var(--n-panel);border:1px solid var(--n-border);color:var(--n-ink);border-radius:6px;padding:3px 8px;font:inherit;font-size:12px;min-width:0}.wb-member-pick{flex:1 1 150px}.wb-member-manual{flex:1 1 130px}.wb-member-pick:focus,.wb-member-manual:focus{outline:1px solid var(--n-accent)}.wb-hint{margin-top:10px;font-size:11px;color:var(--n-ink-muted);line-height:1.5}.wb-dispatch{margin-top:12px;border-top:1px dashed var(--n-border);padding-top:8px}.wb-dispatch-form{display:flex;flex-direction:column;gap:6px;margin-top:6px}.wb-dispatch-text{background:var(--n-panel);border:1px solid var(--n-border);color:var(--n-ink);border-radius:6px;padding:5px 8px;font:inherit;font-size:12px;min-height:52px;resize:vertical}.wb-dispatch-text:focus{outline:1px solid var(--n-accent)}.wb-dispatch-submit{align-self:flex-end;background:none;border:1px solid var(--n-border);color:var(--n-ink);border-radius:6px;padding:2px 14px;font:inherit;font-size:11.5px;cursor:pointer}.wb-dispatch-submit:hover:not(:disabled){border-color:var(--n-accent)}.wb-dispatch-note{font-size:11px;color:var(--n-ink-muted);line-height:1.4;min-height:0}.wb-stage{position:relative;min-width:0;min-height:0;display:flex;flex-direction:column}.wb-stage-board{position:absolute;top:0;right:0;bottom:0;left:0;overflow:hidden}.wb-stage-board.is-hidden{display:none}.wb-data{display:flex;flex-direction:column;gap:14px;padding:10px 14px;overflow-y:auto;min-height:0}.wb-data.is-hidden{display:none}.wb-pane-head{font-size:12px;color:var(--n-ink-muted);margin:4px 0 8px}.wb-pane-subhead{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--n-ink-muted);margin:12px 0 6px}.wb-table,.wb-row{display:flex;gap:10px;align-items:baseline}.wb-row{font-family:ui-monospace,Consolas,monospace;font-size:12px;background:color-mix(in srgb,var(--n-panel) 55%,transparent);border:1px solid var(--n-border);border-radius:6px;padding:3px 8px;flex-wrap:wrap}.wb-row-team{color:var(--n-accent);min-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wb-row-meta{color:var(--n-ink-muted)}.wb-row-badges{color:var(--n-live)}.wb-row-dir{min-width:16px}.wb-row-dir.is-fail{color:var(--n-danger)}.wb-btn{background:none;border:1px solid var(--n-border);color:var(--n-ink);border-radius:6px;padding:2px 10px;font:inherit;font-size:12px;cursor:pointer;margin-left:auto}.wb-btn:hover:not(:disabled){border-color:var(--n-accent)}.wb-btn:disabled{opacity:.5;cursor:default}.wb-btn-primary{border-color:var(--n-accent);color:var(--n-ink)}.wb-action{display:flex;gap:10px;align-items:baseline;font-size:12.5px;padding:5px 8px;border-radius:6px;border:1px solid var(--n-border);margin-bottom:4px}.wb-action-high{border-color:var(--n-danger)}.wb-action-text{flex:1}.wb-draft{display:flex;flex-direction:column;gap:8px;max-width:560px;margin-top:6px}.wb-select,.wb-textarea{background:var(--n-panel);border:1px solid var(--n-border);color:var(--n-ink);border-radius:8px;padding:6px 9px;font:inherit}.wb-textarea{resize:vertical}.wb-select:focus,.wb-textarea:focus{outline:1px solid var(--n-accent)}.wb-inspector{position:absolute;top:8px;right:8px;width:280px;max-height:calc(100% - 16px);overflow-y:auto;background:var(--n-panel);border:1px solid var(--n-border);border-radius:10px;padding:10px;z-index:20;box-shadow:0 8px 24px var(--n-shadow);display:none}.wb-inspector.is-open{display:block}.wb-inspector-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px}.wb-inspector-title{font-weight:600;font-size:12.5px}.wb-inspector .wb-icon-btn{display:inline-flex;width:24px;height:24px;font-size:12px}.wb-card{display:flex;flex-direction:column;gap:6px}.wb-kv{display:flex;gap:8px;font-size:12px}.wb-kv-k{color:var(--n-ink-muted);min-width:58px;flex:none}.wb-kv-v{word-break:break-all}.wb-muted{color:var(--n-ink-muted)}.wb-chat{position:absolute;top:8px;right:8px;bottom:8px;width:400px;max-width:calc(100% - 16px);display:flex;flex-direction:column;background:var(--n-panel);border:1px solid var(--n-border);border-radius:12px;z-index:22;box-shadow:0 8px 24px var(--n-shadow);overflow:hidden;transform:translate(calc(100% + 12px));transition:transform .18s ease;pointer-events:none}.wb-chat.is-open{transform:translate(0);pointer-events:auto}.wb-chat-head{display:flex;align-items:center;gap:8px;padding:10px 10px 10px 12px;border-bottom:1px solid var(--n-border);flex:none}.wb-chat-dot{flex:none;width:8px;height:8px;border-radius:50%;background:var(--n-ink-muted)}.wb-chat-dot.is-live{background:var(--n-live)}.wb-chat-dot.is-cold{background:transparent;border:1.5px solid var(--n-ink-muted)}.wb-chat-dot.is-peer{background:var(--n-federal)}.wb-chat-titles{display:flex;flex-direction:column;flex:1 1 auto;min-width:0;line-height:1.3}.wb-chat-title{font-weight:600;font-size:13.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wb-chat-sub{font:11px/1.4 ui-monospace,Consolas,monospace;color:var(--n-ink-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wb-chat .wb-icon-btn{display:inline-flex;width:28px;height:28px;font-size:13px;flex:none;border-color:transparent}.wb-chat .wb-icon-btn:hover{border-color:var(--n-border)}.wb-chat .wb-icon-btn:focus-visible{outline:2px solid var(--n-accent);outline-offset:1px}.wb-chat .wb-chat-back[hidden]{display:none}.wb-chat-info-btn[aria-expanded=true]{border-color:var(--n-accent);color:var(--n-accent)}.wb-chat-info{flex:none;display:flex;flex-direction:column;gap:4px;padding:8px 12px;font-size:12px;border-bottom:1px solid var(--n-border);background:color-mix(in srgb,var(--n-bg) 55%,var(--n-panel))}.wb-chat-info[hidden]{display:none}.wb-chat-info .wb-kv-v{font-family:ui-monospace,Consolas,monospace;font-size:11.5px}.wb-chat-thread{flex:1 1 auto;min-height:0;overflow-y:auto;overscroll-behavior:contain;display:flex;flex-direction:column;gap:10px;padding:12px}.wb-chat-thread:focus-visible{outline:2px solid var(--n-accent);outline-offset:-2px}.wb-chat-log,.wb-chat-sent{display:flex;flex-direction:column;gap:10px}.wb-chat-notice{align-self:center;max-width:92%;text-align:center;font-size:11.5px;line-height:1.5;color:var(--n-ink-muted);border:1px dashed var(--n-border);border-radius:8px;padding:6px 10px}.wb-chat-notice[hidden]{display:none}.wb-chat-empty{align-self:center;padding:24px 8px;font-size:12px;color:var(--n-ink-muted);text-align:center}.wb-chat-empty.is-error{color:var(--n-danger)}.wb-msg{display:flex;flex-direction:column;gap:4px;max-width:86%;padding:8px 11px;border-radius:12px;font-size:13px;line-height:1.55}.wb-msg-assistant{align-self:flex-start;background:var(--n-raised);border:1px solid var(--n-border);border-bottom-left-radius:4px}.wb-msg-user{align-self:flex-end;background:color-mix(in srgb,var(--n-accent) 16%,var(--n-panel));border:1px solid color-mix(in srgb,var(--n-accent) 35%,transparent);border-bottom-right-radius:4px}.wb-msg-ledger{align-self:center;max-width:92%;background:transparent;border:1px dashed var(--n-border);font-size:12px}.wb-msg-ledger .wb-msg-text{color:var(--n-ink-muted)}.wb-msg-ledger .wb-msg-meta{justify-content:center}.wb-msg-in .wb-msg-meta{justify-content:flex-start}.wb-msg-who{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}.wb-msg-text{color:var(--n-ink);white-space:pre-wrap;word-break:break-word;overflow-wrap:anywhere}.wb-msg-meta{display:flex;flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:6px;font-size:11px}.wb-msg-task{font-family:ui-monospace,Consolas,monospace;color:var(--n-ink-muted)}.wb-msg-status{border:1px solid currentColor;border-radius:99px;padding:0 7px;line-height:18px;white-space:nowrap}.wb-msg-status.is-wait,.wb-msg-status.is-muted{color:var(--n-ink-muted)}.wb-msg-status.is-ok{color:var(--n-live)}.wb-msg-status.is-warn{color:var(--n-act)}.wb-msg-status.is-danger{color:var(--n-danger)}.wb-chat-divider{display:flex;align-items:center;gap:8px;font-size:11px;color:var(--n-ink-muted);margin-top:4px}.wb-chat-divider:before,.wb-chat-divider:after{content:"";flex:1;border-top:1px solid var(--n-border)}.wb-chat-sessions{display:flex;flex-direction:column;gap:6px}.wb-chat-session{display:flex;flex-direction:column;align-items:flex-start;gap:2px;width:100%;text-align:left;background:var(--n-raised);border:1px solid var(--n-border);border-radius:8px;padding:7px 10px;color:var(--n-ink);font:inherit;cursor:pointer}.wb-chat-session:hover{border-color:var(--n-accent)}.wb-chat-session:focus-visible{outline:2px solid var(--n-accent);outline-offset:1px}.wb-chat-session-id{font:12px ui-monospace,Consolas,monospace}.wb-chat-session-meta{font-size:11px;color:var(--n-ink-muted)}.wb-chat-foot{flex:none;border-top:1px solid var(--n-border);padding:8px 10px 10px;background:var(--n-panel)}.wb-chat-composer{display:flex;flex-direction:column;gap:4px}.wb-chat-composer-row{display:flex;align-items:flex-end;gap:8px}.wb-chat-composer .wb-dispatch-text{flex:1 1 auto;min-height:38px;max-height:160px;resize:none;border-radius:10px;padding:8px 10px;font-size:13px;line-height:1.5}.wb-chat-composer .wb-dispatch-submit{align-self:auto;height:38px;padding:0 16px;border-radius:10px;background:var(--n-accent);border-color:var(--n-accent);color:var(--n-bg);font-size:13px;font-weight:600}.wb-chat-composer .wb-dispatch-submit:hover:not(:disabled){border-color:var(--n-accent);filter:brightness(1.08)}.wb-chat-composer .wb-dispatch-submit:disabled{opacity:.45;cursor:default}.wb-chat-composer .wb-dispatch-note{font-size:11px;padding-left:2px}.wb-chat-composer .wb-dispatch-note.is-error{color:var(--n-danger)}.wb-chat-readonly{font-size:12px;color:var(--n-ink-muted);text-align:center;padding:4px 0}.nexus-fault{display:none;position:fixed;top:10px;right:12px;z-index:50;max-width:420px;font:12px/1.5 ui-monospace,Consolas,monospace;color:var(--n-error-ink);background:var(--n-error-panel);border:1px solid var(--n-danger);border-radius:8px;padding:6px 10px;pointer-events:none}@media (max-width:1023px){.wb-menu{display:inline-flex}.wb-rail-toggle{display:none}.wb-body{grid-template-columns:minmax(0,1fr)}.wb-rail{position:fixed;left:0;top:0;bottom:0;width:min(86vw,320px);z-index:40;background:var(--n-panel);border-right:1px solid var(--n-border);transform:translate(-102%);transition:transform .18s ease;box-shadow:8px 0 24px var(--n-shadow)}.wb.is-rail-open .wb-rail{transform:translate(0)}.wb-inspector{left:8px;right:8px;width:auto;top:auto;bottom:8px;max-height:45%}.wb-chat{left:8px;right:8px;width:auto;top:auto;bottom:8px;height:85%;max-height:85%;transform:translateY(102%)}.wb-chat.is-open{transform:translateY(0)}}@media (pointer:coarse){.wb-filter,.wb-item,.wb-tab{min-height:36px}.wb-icon-btn,.wb-inspector .wb-icon-btn,.wb-chat .wb-icon-btn{width:36px;height:36px}}@media (max-width:680px){.wb-header{flex-wrap:wrap;row-gap:4px}.wb-header-stats{order:3;width:100%}.wb-row-team{min-width:0;flex:1 1 auto}.wb-data{padding:8px}}.wb-host-row{display:flex;align-items:center;gap:7px;padding:4px 6px;border:1px solid var(--n-border);border-radius:7px;margin-bottom:4px;cursor:pointer;font-size:12px}.wb-host-row:hover{border-color:var(--n-accent);background:color-mix(in srgb,var(--n-accent) 8%,transparent)}.wb-host-row:focus-visible{outline:2px solid var(--n-accent);outline-offset:1px}.wb-host-lamp{flex:none;width:8px;height:8px;border-radius:50%;background:var(--n-ink-muted)}.wb-host-lamp.is-live{background:var(--n-live)}.wb-host-lamp.is-warm{background:var(--n-act)}.wb-host-lamp.is-cold{background:var(--n-ink-muted)}.wb-host-lamp.is-fail{background:var(--n-danger)}.wb-host-lamp.is-unknown{background:transparent;border:1px solid var(--n-ink-muted)}.wb-host-name{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--n-ink)}.wb-host-badge{flex:none;font-size:10.5px;border-radius:99px;padding:0 7px;line-height:17px;border:1px solid var(--n-border)}.wb-host-badge.is-linked{color:var(--n-live);border-color:var(--n-live)}.wb-host-badge.is-stranger{color:var(--n-ink-muted);border-color:var(--n-border)}.wb-host-ver{flex:none;font-size:10px;color:var(--n-ink-muted);border:1px solid var(--n-border);border-radius:4px;padding:0 4px}.wb-host-url{flex:none;max-width:40%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--n-ink-muted);font-size:10.5px}.wb-tabs{flex:none;display:flex;gap:2px;padding:6px 6px 0;border-bottom:1px solid var(--n-border);overflow-x:auto;scrollbar-width:none}.wb-tab{flex:1 1 auto;display:inline-flex;align-items:center;justify-content:center;gap:5px;min-width:0;background:none;border:none;border-bottom:2px solid transparent;color:var(--n-ink-muted);font:inherit;font-size:12.5px;padding:6px 6px 7px;cursor:pointer;white-space:nowrap}.wb-tab:hover{color:var(--n-ink)}.wb-tab.is-active{color:var(--n-ink);border-bottom-color:var(--n-accent);font-weight:600}.wb-tab:focus-visible{outline:2px solid var(--n-accent);outline-offset:-2px;border-radius:6px 6px 0 0}.wb-tab[hidden]{display:none}.wb-tab-badge{font:10.5px/16px ui-monospace,Consolas,monospace;color:var(--n-ink-muted);font-weight:400}.wb-tab-badge:empty{display:none}.wb-tab-badge.is-danger,.wb-tab-badge.is-warn,.wb-tab-badge.is-accent{padding:0 6px;border-radius:99px;border:1px solid currentColor}.wb-tab-badge.is-danger{color:var(--n-danger)}.wb-tab-badge.is-warn{color:var(--n-act)}.wb-tab-badge.is-accent{color:var(--n-accent)}.wb-tabpanels{flex:1 1 auto;min-height:0;display:flex;flex-direction:column}.wb-tabpanel{flex:1 1 auto;min-height:0;overflow-y:auto;overscroll-behavior:contain;padding:8px 10px 16px}.wb-tabpanel[hidden]{display:none}.wb-tabpanel:focus-visible{outline:2px solid var(--n-accent);outline-offset:-2px}.wb-tabpanel .wb-pane{display:flex;flex-direction:column;gap:8px}.wb-tabpanel .wb-dir-tools{padding:0 0 6px}.wb-dir-group{display:flex;flex-direction:column;gap:1px;margin-top:10px}.wb-dir-group:first-child{margin-top:2px}.wb-dir-head{display:flex;align-items:baseline;justify-content:space-between;gap:8px;padding:0 6px 4px;font-size:11px;letter-spacing:.04em;color:var(--n-ink-muted)}.wb-dir-head-label{font-weight:600;color:var(--n-ink)}.wb-dir-head-note{font-size:10.5px}.wb-dir-day{padding:6px 6px 2px;font-size:10.5px;color:var(--n-ink-muted)}.wb-dir-empty{padding:24px 8px;text-align:center;font-size:12px;color:var(--n-ink-muted)}.wb-directory .wb-item{gap:9px;padding:5px 6px;border-radius:8px}.wb-directory .wb-item:focus-visible{outline:2px solid var(--n-accent);outline-offset:-2px}.wb-item-text{display:flex;flex-direction:column;flex:1 1 auto;min-width:0;line-height:1.35}.wb-item-sub{font:11px/1.35 ui-monospace,Consolas,monospace;color:var(--n-ink-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wb-item.is-untitled .wb-item-label{color:var(--n-ink-muted);font-family:ui-monospace,Consolas,monospace;font-size:12px}.wb-dot-log{color:var(--n-ink-muted)}.wb-led-tiles{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:6px}.wb-led-tile{display:flex;flex-direction:column;align-items:flex-start;gap:1px;padding:7px 8px;border-radius:8px;border:1px solid var(--n-border);background:var(--n-raised);cursor:help;min-width:0}.wb-led-tile-v{font:600 17px/1.15 ui-monospace,Consolas,monospace;color:var(--n-ink)}.wb-led-tile-k{font-size:11px;color:var(--n-ink-muted)}.wb-led-tile.is-warn{border-color:var(--n-act)}.wb-led-tile.is-warn .wb-led-tile-v{color:var(--n-act)}.wb-led-tile.is-danger{border-color:var(--n-danger)}.wb-led-tile.is-danger .wb-led-tile-v{color:var(--n-danger)}.wb-led-split{display:flex;flex-direction:column;gap:4px}.wb-led-split-bar{display:flex;height:6px;border-radius:99px;overflow:hidden;background:var(--n-border)}.wb-led-seg{display:block;height:100%}.wb-led-split-legend{display:flex;flex-wrap:wrap;gap:4px 10px;font-size:11px;color:var(--n-ink-muted)}.wb-led-split-item{display:inline-flex;align-items:center;gap:4px}.wb-led-swatch{display:inline-block;width:8px;height:8px;border-radius:2px}.wb-led-seg.is-completed,.wb-led-swatch.is-completed{background:var(--n-live)}.wb-led-seg.is-rejected,.wb-led-swatch.is-rejected{background:var(--n-act)}.wb-led-seg.is-failed,.wb-led-swatch.is-failed{background:var(--n-danger)}.wb-led-seg.is-abandoned,.wb-led-swatch.is-abandoned{background:var(--n-ink-muted)}.wb-led-seg.is-unclassified,.wb-led-swatch.is-unclassified,.wb-led-seg.is-other,.wb-led-swatch.is-other{background:color-mix(in srgb,var(--n-ink-muted) 45%,var(--n-border))}.wb-led-group{display:flex;flex-direction:column;gap:6px;margin-top:4px}.wb-led-group-head{display:flex;align-items:baseline;justify-content:space-between;gap:8px;font-size:11.5px;font-weight:600;color:var(--n-ink)}.wb-led-group-hint{font-size:10.5px;font-weight:400;color:var(--n-ink-muted)}.wb-led-group.is-danger .wb-led-group-head{color:var(--n-danger)}.wb-led-group.is-warn .wb-led-group-head{color:var(--n-act)}.wb-led-card{position:relative;display:flex;flex-direction:column;gap:3px;padding:7px 9px;border-radius:8px;border:1px solid var(--n-border);background:var(--n-raised);min-width:0}.wb-led-card.is-danger{border-color:var(--n-danger)}.wb-led-card.is-warn{border-left:3px solid var(--n-act)}.wb-led-card.is-muted,.wb-led-card.is-quiet{background:transparent}.wb-led-card.is-link{cursor:pointer}.wb-led-card.is-link:hover{border-color:var(--n-accent)}.wb-led-card.is-link:focus-visible{outline:2px solid var(--n-accent);outline-offset:1px}.wb-led-card-head{display:flex;align-items:flex-start;gap:6px;min-width:0}.wb-led-dir{flex:none;font-size:12px;color:var(--n-ink-muted);line-height:1.45}.wb-led-dir.is-in{color:var(--n-federal)}.wb-led-brief{flex:1 1 auto;min-width:0;font-size:12.5px;line-height:1.45;color:var(--n-ink);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;overflow-wrap:anywhere}.wb-led-card.is-muted .wb-led-brief,.wb-led-card.is-quiet .wb-led-brief{color:var(--n-ink-muted)}.wb-led-card.is-danger .wb-led-brief{color:var(--n-danger)}.wb-led-brief.is-missing{font-style:italic}.wb-led-meta{display:flex;flex-wrap:wrap;gap:2px 8px;font:11px/1.45 ui-monospace,Consolas,monospace;color:var(--n-ink-muted);min-width:0}.wb-led-meta>span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}.wb-led-chip{border:1px solid var(--n-border);border-radius:99px;padding:0 6px;font-family:inherit}.wb-led-abandon{position:absolute;top:6px;right:6px;margin-left:0;padding:1px 9px;font-size:11.5px}.wb-led-card:has(.wb-led-abandon) .wb-led-card-head{padding-right:52px}.wb-led-empty{padding:24px 8px;text-align:center;font-size:12px;color:var(--n-ink-muted)}.wb-led-forensics{font-size:11px;color:var(--n-ink-muted);border-top:1px dashed var(--n-border);padding-top:6px;margin-top:4px}.wb-led-forensics summary{cursor:pointer}.wb-led-forensics summary:focus-visible{outline:2px solid var(--n-accent);outline-offset:1px}.wb-led-forensics-body{display:flex;flex-direction:column;gap:2px;padding:4px 0 0 12px;font-family:ui-monospace,Consolas,monospace}
|
|
Binary file
|