local-operator-ui 0.34.21 → 0.34.22
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/out/renderer/assets/{_basePickBy-HzexBVmi.js → _basePickBy-CnTkZKwY.js} +1 -1
- package/out/renderer/assets/{_baseUniq-BV6wVnAT.js → _baseUniq-BkUsRsD1.js} +1 -1
- package/out/renderer/assets/{agent-details-page-Bmkhrajh.js → agent-details-page-BXtHoPMZ.js} +1 -1
- package/out/renderer/assets/{agent-hub-page-CG50azio.js → agent-hub-page-C6h2RxhU.js} +1 -1
- package/out/renderer/assets/{agents-page-bSz0phbY.js → agents-page-BQCfXsiA.js} +3 -3
- package/out/renderer/assets/{arc-CRELBIUZ.js → arc-CPEnSUN6.js} +1 -1
- package/out/renderer/assets/{architectureDiagram-IEHRJDOE-BE7KiMXF.js → architectureDiagram-IEHRJDOE-BkObs0Rx.js} +1 -1
- package/out/renderer/assets/{blockDiagram-JOT3LUYC-SKreF53b.js → blockDiagram-JOT3LUYC-DH8Zx90c.js} +1 -1
- package/out/renderer/assets/{browser-page-CDMuPmtp.js → browser-page-BO84H--K.js} +1 -1
- package/out/renderer/assets/{browser-webauthn-prompt-BMj0CmWK.js → browser-webauthn-prompt-ClJwhpfX.js} +1 -1
- package/out/renderer/assets/{c4Diagram-VJAJSXHY-vjPqrVhc.js → c4Diagram-VJAJSXHY-Bnbybdd8.js} +1 -1
- package/out/renderer/assets/channel-CgxnbLqu.js +1 -0
- package/out/renderer/assets/{chunk-4BMEZGHF-sMZqyXoA.js → chunk-4BMEZGHF-D2lyv-2e.js} +1 -1
- package/out/renderer/assets/{chunk-A2AXSNBT-Dbwz2x7I.js → chunk-A2AXSNBT-DS0g6XqU.js} +1 -1
- package/out/renderer/assets/{chunk-AEK57VVT-83N8BBC2.js → chunk-AEK57VVT-CMZDt8QD.js} +1 -1
- package/out/renderer/assets/{chunk-D6G4REZN-C02Q5ZkP.js → chunk-D6G4REZN-BpPg2aP3.js} +1 -1
- package/out/renderer/assets/{chunk-RZ5BOZE2-B75Zgooq.js → chunk-RZ5BOZE2-DfZT7-YS.js} +1 -1
- package/out/renderer/assets/{chunk-XZIHB7SX-EjMPJGld.js → chunk-XZIHB7SX-3XgSzff5.js} +1 -1
- package/out/renderer/assets/classDiagram-GIVACNV2-D8BCjztU.js +1 -0
- package/out/renderer/assets/classDiagram-v2-COTLJTTW-D8BCjztU.js +1 -0
- package/out/renderer/assets/clone-jMRzT2P5.js +1 -0
- package/out/renderer/assets/{conversation-input-sync-CxBOSS3W.js → conversation-input-sync-BwB1QIO4.js} +135 -135
- package/out/renderer/assets/{dagre-OKDRZEBW-D1OscQ41.js → dagre-OKDRZEBW-UaiPHwuq.js} +1 -1
- package/out/renderer/assets/{diagram-SSKATNLV-DIr879On.js → diagram-SSKATNLV-DcxHHrwC.js} +1 -1
- package/out/renderer/assets/{diagram-VNBRO52H-C0iLKMp_.js → diagram-VNBRO52H-Da7aAAci.js} +1 -1
- package/out/renderer/assets/{erDiagram-Q7BY3M3F-aeZ61M8N.js → erDiagram-Q7BY3M3F-i6ZhWveT.js} +1 -1
- package/out/renderer/assets/{flowDiagram-4HSFHLVR-BvzDR8k3.js → flowDiagram-4HSFHLVR-G9tDYOYV.js} +1 -1
- package/out/renderer/assets/{ganttDiagram-APWFNJXF-B8y9ub6q.js → ganttDiagram-APWFNJXF-D3hZ564n.js} +1 -1
- package/out/renderer/assets/{gitGraphDiagram-7IBYFJ6S-D-AvdkZC.js → gitGraphDiagram-7IBYFJ6S-BC1W1Thg.js} +1 -1
- package/out/renderer/assets/{graph-gIg8dDU1.js → graph-uDZg-4J0.js} +1 -1
- package/out/renderer/assets/{index-DSe5woqV.js → index-CHDNwVUt.js} +1 -1
- package/out/renderer/assets/{index-BQzWOATy.js → index-D2Wfx__X.js} +3 -3
- package/out/renderer/assets/{index-CNIcizl7.js → index-Dh22Gozf.js} +1 -1
- package/out/renderer/assets/{infoDiagram-PH2N3AL5-CXM-jvrd.js → infoDiagram-PH2N3AL5-eFfs6itr.js} +1 -1
- package/out/renderer/assets/{journeyDiagram-U35MCT3I-ByTWunVo.js → journeyDiagram-U35MCT3I-B-SActec.js} +1 -1
- package/out/renderer/assets/{kanban-definition-NDS4AKOZ-Cr7ZAIa-.js → kanban-definition-NDS4AKOZ-BRqQzsBV.js} +1 -1
- package/out/renderer/assets/{layout-hnilgK9u.js → layout-SwjQ8-b9.js} +1 -1
- package/out/renderer/assets/{legacy-agents-page-j2SlLhnl.js → legacy-agents-page-BEc7gHdW.js} +1 -1
- package/out/renderer/assets/{mermaid.core-gzl7cOWn.js → mermaid.core-CvedZQbG.js} +5 -5
- package/out/renderer/assets/{mesh-page-DZ-DI9XK.js → mesh-page-Boa8i9Wy.js} +1 -1
- package/out/renderer/assets/{mindmap-definition-ALO5MXBD-BqMJbthq.js → mindmap-definition-ALO5MXBD-CLTgXaYg.js} +1 -1
- package/out/renderer/assets/{mini-QOOKmpJM.js → mini-siPvcUAa.js} +1 -1
- package/out/renderer/assets/{org-surface-gate-BVz7wHhQ.js → org-surface-gate-B3QdT7op.js} +1 -1
- package/out/renderer/assets/{pieDiagram-IB7DONF6-CzWk2CV9.js → pieDiagram-IB7DONF6-CSF1msPw.js} +1 -1
- package/out/renderer/assets/{projects-page-D0uS1Oz8.js → projects-page-Hp3-mqiC.js} +1 -1
- package/out/renderer/assets/{quadrantDiagram-7GDLP6J5-YzsmEbVW.js → quadrantDiagram-7GDLP6J5-CCAr99Ql.js} +1 -1
- package/out/renderer/assets/{radar-MK3ICKWK-B92thJkJ.js → radar-MK3ICKWK-Dj0VFGGy.js} +1 -1
- package/out/renderer/assets/{radient-auth-buttons-BbjlHG9X.js → radient-auth-buttons-BlBIU0uN.js} +1 -1
- package/out/renderer/assets/{requirementDiagram-KVF5MWMF-Dhf-hdyY.js → requirementDiagram-KVF5MWMF-B1i_L7uJ.js} +1 -1
- package/out/renderer/assets/{sankeyDiagram-QLVOVGJD-DhetpVqP.js → sankeyDiagram-QLVOVGJD-eWwrW9l0.js} +1 -1
- package/out/renderer/assets/{schedules-page-D1Y0YYaE.js → schedules-page-Xa7_0VSg.js} +1 -1
- package/out/renderer/assets/{sequenceDiagram-X6HHIX6F-eL2hZflk.js → sequenceDiagram-X6HHIX6F-BTDgWcUu.js} +1 -1
- package/out/renderer/assets/{settings-page-C5ReI3WY.js → settings-page-C_Fi2MVI.js} +1 -1
- package/out/renderer/assets/{stateDiagram-DGXRK772-C1OLDW5O.js → stateDiagram-DGXRK772-UETbc7lU.js} +1 -1
- package/out/renderer/assets/{stateDiagram-v2-YXO3MK2T-CpuK1Jgz.js → stateDiagram-v2-YXO3MK2T-CGwyp6is.js} +1 -1
- package/out/renderer/assets/{timeline-definition-BDJGKUSR-BizfG1dk.js → timeline-definition-BDJGKUSR-8SitQ_CA.js} +1 -1
- package/out/renderer/assets/{use-download-agent-mutation-Br_2uzSx.js → use-download-agent-mutation-CRNm4zq3.js} +1 -1
- package/out/renderer/assets/{use-memberships-query-BcvNy1ge.js → use-memberships-query-jSUoQba_.js} +1 -1
- package/out/renderer/assets/{use-session-snapshot-T9_9guUv.js → use-session-snapshot-DH5Ntw9i.js} +1 -1
- package/out/renderer/assets/{xychartDiagram-VJFVF3MP-CDfwkIwi.js → xychartDiagram-VJFVF3MP-CaRz60-j.js} +1 -1
- package/out/renderer/index.html +2 -2
- package/out/renderer/mini.html +3 -3
- package/package.json +2 -2
- package/out/renderer/assets/channel-BdGZe8_G.js +0 -1
- package/out/renderer/assets/classDiagram-GIVACNV2-DdIoP3K2.js +0 -1
- package/out/renderer/assets/classDiagram-v2-COTLJTTW-DdIoP3K2.js +0 -1
- package/out/renderer/assets/clone-ohm3n9_F.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as x,j as t,c as R}from"./index-S51O3g2W.js";import{aX as ze,aY as je,aZ as Je,a_ as He,a as Qe,a$ as be,ah as Ce,b0 as et}from"./conversation-input-sync-CxBOSS3W.js";import{P as tt}from"./page-header-DswfuZnq.js";import{B as q,j as st,A as he,k as nt,a as ae,D as at,l as it,m as rt,n as lt,o as Se,p as Me,e as De}from"./error-boundary-2xFIZZKb.js";import{i as pe,d as ot,e as dt,f as ct,g as ut,h as mt,j as ht,k as pt,l as xt,m as ft,n as bt,o as gt,p as vt,N as kt,q as ye,r as wt,s as oe,D as jt,t as yt,u as Nt,v as Ne,w as we,R as It,x as de,y as Be,z as Fe,C as Ct,E as me,F as ge,G as St,H as Mt,I as xe,J as Ae,K as Dt,L as At,M as ve,O as Et,Q as Ye,T as _t,U as qe,V as Rt,W as $t,X as Lt,Y as Pt,Z as Tt,_ as Ot,$ as Wt,a0 as zt,a1 as Ht,a2 as Bt,a3 as Ft,a4 as Yt,a5 as qt,a6 as Ut,a7 as Gt,a8 as Vt,a9 as Kt,aa as Xt,ab as Zt,ac as le,ad as Jt}from"./index-BQzWOATy.js";import"./ui-preferences-store-CagOssaI.js";import"./console-mirror-YquW6t3z.js";function Qt(e){return e==="requested"?"attention":e==="failed"?"danger":e==="connected"?"success":"neutral"}function es(e){return e==="failed"?"Abandon":"Stop"}function ts(e){switch(e){case"requested":return[{term:"Signing",text:"Approving signs with this machine's operator key; the system may ask for it."}];case"approved":return[{term:"Next",text:"An agent runs the install and connect."},{term:"Stop",text:"Stopping now denies the request; nothing has run yet."}];case"connecting":return[{term:"Stop",text:"Stopping now denies the request; the runner stops at its next step."}];case"failed":return[{term:"After a stop",text:"The runner stopped before it finished. Abandoning denies the request; a retry re-enters the same record instead."}];default:return[]}}const ss=({rows:e,error:s,pending:i,refusal:a,onDecide:d,onRetry:u,nowSeconds:p,networkNames:r})=>{const f=i!==null,v=x.useMemo(()=>e.filter(o=>pe(o.state)),[e]),j=x.useMemo(()=>e.filter(o=>!pe(o.state)),[e]),[N,y]=x.useState(null),l=N??j.some(o=>o.state==="failed"),c=a!==null&&e.some(o=>o.approvalId===a.approvalId&&(pe(o.state)||l));return v.length===0&&j.length===0&&!s&&!a?null:t.jsxs("section",{"aria-label":"Approvals","data-tour-tag":"mesh-approvals-tray",className:"flex flex-col gap-3 rounded-lg border border-hairline bg-surface p-3",children:[t.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[t.jsx(ot,{"aria-hidden":"true",className:"size-4 text-ink-muted"}),t.jsx("h2",{className:"text-body-sm text-ink",children:"Approvals"}),v.length>0&&t.jsx("span",{className:"text-meta text-ink-dim",children:v.length===1?"1 waiting":`${v.length} waiting`})]}),s&&t.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[t.jsx("p",{className:"min-w-0 flex-1 text-meta text-ink-muted",children:s}),t.jsx(q,{variant:"secondary",size:"sm",onClick:u,children:"Ask again"})]}),v.length>0&&t.jsx("ul",{className:"flex flex-col divide-y divide-hairline",children:v.map(o=>t.jsx(Ee,{row:o,pending:i?.approvalId===o.approvalId?i:null,busy:f,refusal:a?.approvalId===o.approvalId?a:null,onDecide:d,nowSeconds:p,networkNames:r},o.approvalId))}),a&&!c&&t.jsx(Ue,{refusal:a}),j.length>0&&t.jsx(ze,{open:l,onOpenChange:y,chevronClassName:"text-ink-dim",summary:t.jsxs("span",{className:"text-meta",children:["Records (",j.length,")"]}),children:t.jsx("ul",{className:"flex flex-col divide-y divide-hairline","data-tour-tag":"mesh-approvals-records",children:j.map(o=>t.jsx(Ee,{row:o,pending:i?.approvalId===o.approvalId?i:null,busy:f,refusal:a?.approvalId===o.approvalId?a:null,onDecide:d,nowSeconds:p,networkNames:r},o.approvalId))})})]})},Ee=({row:e,pending:s,busy:i,refusal:a,onDecide:d,nowSeconds:u,networkNames:p})=>{const r=pe(e.state),f=dt(e),v=ct(e,p),j=ut(e,p),N=mt(e),y=ht(e),l=pt(e),c=xt(e.expiresAt,u),o=ts(e.state),I=ft(e.state),k=bt(e.state);return t.jsxs("li",{className:"flex flex-col gap-2 py-3 first:pt-0 last:pb-0","data-tour-tag":"mesh-approval-card",children:[t.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[t.jsx(st,{variant:Qt(e.state),children:gt(e.state)}),t.jsx("div",{className:"grow"}),r&&c&&t.jsx("span",{className:"text-meta text-ink-dim",children:c})]}),t.jsx("p",{className:"text-body-sm text-ink","data-tour-tag":"mesh-approval-summary",children:r?v:f}),e.state==="failed"&&t.jsx("p",{className:"text-meta text-ink-muted","data-tour-tag":"mesh-approval-stopped-note",children:"The runner stopped before it finished. It stays retryable until its window closes; Abandon denies the request."}),(I||k)&&t.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[I&&t.jsx(q,{variant:"primary",size:"sm",disabled:i,onClick:()=>d(e.approvalId,"approve"),"data-tour-tag":"mesh-approval-approve",children:"Approve"}),k&&t.jsx(q,{variant:"ghost",size:"sm",disabled:i,onClick:()=>d(e.approvalId,"deny"),"data-tour-tag":r?"mesh-approval-deny":"mesh-approval-stop",children:r?"Deny":es(e.state)}),s&&t.jsx("span",{className:"text-meta text-ink-dim",children:s.decision==="approve"?"Waiting for the signing prompt…":"Writing the decision…"})]}),t.jsxs(ze,{chevronClassName:"text-ink-dim",summary:t.jsx("span",{className:"text-meta",children:"Details"}),children:[j.length>0&&t.jsx("dl",{className:"grid grid-cols-[max-content_1fr] gap-x-4 gap-y-0.5 text-meta text-ink-dim","data-tour-tag":"mesh-approval-consequences",children:j.map(h=>t.jsxs(x.Fragment,{children:[t.jsx("dt",{className:"text-ink-muted",children:h.term}),t.jsx("dd",{children:h.consequence})]},h.term))}),(N||y)&&t.jsxs("p",{className:"text-meta text-ink-muted",children:[N&&t.jsx("span",{children:N}),N&&y&&t.jsx("span",{children:" · "}),y&&t.jsx("span",{className:"font-mono",children:y})]}),l&&t.jsx("p",{className:"text-meta text-ink-dim",children:l}),o.length>0&&t.jsx("dl",{className:"grid grid-cols-[max-content_1fr] gap-x-4 gap-y-0.5 text-meta","data-tour-tag":"mesh-approval-consequence",children:o.map(h=>t.jsxs(x.Fragment,{children:[t.jsx("dt",{className:"text-ink-muted",children:h.term}),t.jsx("dd",{className:"text-ink-muted",children:h.text})]},h.term))})]}),a&&t.jsx(Ue,{refusal:a})]})},Ue=({refusal:e})=>t.jsx(he,{variant:"warning",className:"text-meta","data-tour-tag":"mesh-approval-refusal",children:t.jsxs("span",{className:"flex min-w-0 flex-wrap items-center gap-2",children:[t.jsx("span",{className:"min-w-0 flex-1",children:e.sentence}),t.jsx("span",{className:"shrink-0 font-mono text-ink-dim",children:e.code})]})}),ns=4,fe={kind:"idle"};function as(e){switch(e.kind){case"dragging":case"settling":return e.payload.session.id;case"pressing":return null;default:return null}}function Q(e,s){switch(s.kind){case"press":return e.kind!=="idle"?e:{kind:"pressing",payload:s.payload,originX:s.x,originY:s.y,pointerId:s.pointerId};case"move":return e.kind==="pressing"?Math.max(Math.abs(s.x-e.originX),Math.abs(s.y-e.originY))<ns?e:{kind:"dragging",payload:e.payload,x:s.x,y:s.y,target:s.target,pointerId:e.pointerId}:e.kind==="dragging"?{...e,x:s.x,y:s.y,target:s.target}:e;case"release":return e.kind==="dragging"?{kind:"settling",payload:e.payload,target:e.target}:e.kind==="pressing"?fe:e;case"cancel":case"settled":return fe;default:return e}}const is=({edges:e,geometry:s,selectedDeviceId:i})=>t.jsx("svg",{"aria-hidden":"true",className:"pointer-events-none absolute top-0 left-0 overflow-visible",width:s.bounds.width,height:s.bounds.height,children:e.map(a=>{const d=s.networks.get(a.networkId),u=s.devices.get(a.deviceId);if(!d||!u)return null;const p=i!==null&&a.deviceId===i;return t.jsx("path",{"data-mesh-edge":a.key,d:vt(d,u),fill:"none",strokeWidth:p?2:1.5,strokeDasharray:a.active?void 0:"4 4",className:p?"stroke-ink":"stroke-ink-dim"},a.key)})}),rs={self:"border-l-hairline",reached:"border-l-hairline",unanswered:"border-l-warning","not-attempted":"border-l-hairline",unknown:"border-l-hairline"};function ls(e){return e.suspect?"border-l-danger":rs[oe(e)]}const os={self:"ring-2 ring-accent",reachable:null,unreachable:null,suspect:null},ds={accept:"border-accent bg-accent-wash",refuse:"border-warning"};function cs(e,s,i){return[e.label,Fe(e,s),i].filter(Boolean).join(", ")}function ee(e){return e.name.trim()||e.id.slice(-6)}function Ge(e,s,i){if(i!=="reached"&&i!=="self"){const a=de(i);return e.unreachable_reason?`${a} (${e.unreachable_reason})`:a}return e.live_state.trim()?e.live_state.trim():e.locality==="local"?"on this device":`on ${s}`}const us={resting:"border-l-2 border-l-hairline",attention:"border-l-2 border-l-warning"},ms=({network:e,x:s,y:i,refused:a})=>t.jsxs("li",{"data-mesh-network":e.id,"data-mesh-network-refused":a?"true":void 0,className:R("absolute flex items-center gap-2 rounded-md border bg-elevated px-3",a?"border-warning":"border-hairline"),style:{left:s,top:i,width:ye,height:kt},children:[t.jsx(je,{"aria-hidden":"true",className:"size-4 shrink-0 text-ink-muted"}),t.jsxs("span",{className:"min-w-0 flex-1",children:[t.jsx("span",{className:"block truncate text-body-sm text-ink",children:e.label}),t.jsxs("span",{title:`epoch ${e.epoch}`,className:"block truncate text-meta text-ink-dim",children:[e.memberCount," ",e.memberCount===1?"device":"devices",e.revokedCount>0?` · ${e.revokedCount} revoked`:""]})]})]}),hs=({device:e,x:s,y:i,nowSeconds:a,selected:d,sessions:u,sessionTotal:p,dropState:r,movingSessionId:f,draggedSessionId:v,onOpen:j,onChipPointerDown:N,onChipClick:y,onShowAllSessions:l})=>{const{activity:c}=wt(e,u.rows),o=c==="working",I=cs(e,a,o?"working":null),k=oe(e);return t.jsxs("li",{"data-mesh-device":e.id,"data-mesh-state":e.state,"data-mesh-drop":r??void 0,"aria-current":d?"true":void 0,className:R("absolute flex flex-col rounded-md border border-l-4 border-control bg-elevated","hover:bg-row-hover",d&&"border-y-ink border-r-ink bg-row-selected",ls(e),os[e.state],r&&ds[r]),style:{left:s,top:i,width:ye,height:jt},children:[t.jsxs("button",{type:"button","data-mesh-device-open":e.id,"data-mesh-reach":k,"aria-label":I,title:Nt(e),onClick:()=>j(e.id),className:R("flex w-full flex-col justify-between rounded-t-[5px] px-3 pt-2 pb-2 text-left","cursor-pointer","focus-visible:outline focus-visible:outline-2 focus-visible:outline-accent focus-visible:outline-offset-[-2px]"),style:{height:yt},children:[t.jsxs("span",{className:"flex w-full min-w-0 items-center gap-2",children:[t.jsx(Je,{"aria-hidden":"true",className:"size-4 shrink-0 text-ink-muted"}),t.jsx("span",{className:"min-w-0 flex-1 truncate text-body-sm text-ink",children:e.label}),e.suspect&&t.jsx(Ne,{"aria-hidden":"true",className:"size-3.5 shrink-0 text-danger"})]}),t.jsxs("span",{className:"flex w-full min-w-0 items-baseline gap-1",children:[t.jsx("span",{className:"w-3 shrink-0 font-mono text-body-sm text-ink tabular-nums",children:e.sessionCount??"–"}),t.jsx("span",{className:R("min-w-0 truncate text-meta",e.sessionCount===null?"text-ink-dim":"text-ink-muted"),children:we(e.sessionCount)})]}),t.jsxs("span",{"data-mesh-state-line":"",className:"flex w-full min-w-0 items-baseline gap-1.5 text-meta",children:[t.jsx("span",{"aria-hidden":"true",className:"shrink-0 text-ink-dim",children:It[k]}),t.jsx("span",{className:R("shrink-0",Be[k]),children:de(k)}),o&&t.jsx("span",{"data-mesh-working":"",className:"shrink-0 text-info",children:"working"}),e.memberships.length>1&&t.jsxs("span",{className:"min-w-0 truncate text-ink-dim",children:["· ",e.memberships.length," networks"]})]})]}),t.jsxs("ul",{"aria-label":`Conversations on ${e.label}`,className:R("m-0 flex h-6 list-none items-center gap-1 overflow-hidden px-3",r==="accept"&&"opacity-40"),children:[u.shown.map(h=>t.jsx(ps,{session:h,ownerLabel:e.label,ownerReach:k,ownerReachable:e.reachable,moving:f===h.id,dragging:v===h.id,onPointerDown:N,onClick:()=>y(h)},h.id)),u.hidden>0&&t.jsx("li",{className:"shrink-0",children:t.jsxs("button",{type:"button","data-mesh-more":e.id,onClick:()=>l(e.id),className:R("flex min-h-6 items-center rounded-sm px-1.5 text-meta text-ink-dim","hover:bg-row-hover hover:text-ink","focus-visible:outline focus-visible:outline-2 focus-visible:outline-accent focus-visible:outline-offset-2"),title:`Showing ${u.shown.length} of ${p} conversations`,"aria-label":`Show all ${p} conversations`,children:["+",u.hidden]})})]})]})},ps=({session:e,ownerLabel:s,ownerReach:i,ownerReachable:a,moving:d,dragging:u,onPointerDown:p,onClick:r})=>{const f=Ge(e,s,i);return d?t.jsx("li",{role:"status","data-mesh-session":e.id,"data-mesh-moving":"true",children:t.jsx("span",{className:"flex min-h-6 items-center rounded-sm bg-sunken px-1.5 text-meta text-ink-muted",children:"moving…"})}):t.jsx("li",{className:"min-w-0 flex-1","data-mesh-session-item":e.id,"data-mesh-dragging":u?"true":void 0,children:t.jsx("button",{type:"button","data-mesh-session":e.id,style:{touchAction:"none"},title:`${ee(e)} · ${f}`,"aria-label":`${ee(e)}, ${f}. Opens ${s}.`,onPointerDown:v=>p(v,e),onClick:()=>r(e),className:R("flex min-h-6 w-full max-w-32 items-center rounded-sm border border-hairline bg-surface px-1.5 text-left text-meta text-ink-muted","cursor-grab active:cursor-grabbing","hover:text-ink",us[Ct(e,a)],u&&"opacity-60","focus-visible:outline focus-visible:outline-2 focus-visible:outline-accent focus-visible:outline-offset-2"),children:t.jsx("span",{className:"min-w-0 flex-1 truncate",children:ee(e)})})})};function _e(e){const s=e.trim();if(!s)return null;if(s.startsWith("[")){const a=s.indexOf("]");if(a<=1)return null;const d=s.slice(1,a),u=s.slice(a+1);if(!u)return{host:d,port:null};if(!u.startsWith(":"))return null;const p=Number(u.slice(1));return{host:d,port:Number.isInteger(p)?p:null}}const i=s.lastIndexOf(":");if(i>0){const a=s.slice(i+1);if(/^\d+$/.test(a))return{host:s.slice(0,i),port:Number(a)}}return{host:s,port:null}}function Re(e){const s=e.trim().split(".");if(s.length!==4)return null;for(const i of s)if(!/^\d{1,3}$/.test(i)||Number(i)>255)return null;return`${s[0]}.${s[1]}.${s[2]}`}function xs(e){return`${e}.x`}function fs(e){const s=new Map;for(const a of e.values())for(const d of a)s.set(d,(s.get(d)??0)+1);const i=new Set;for(const[a,d]of s)d>1&&i.add(a);return i}function ke(e){return new Set(e.endpoints.map(s=>s.trim()).filter(Boolean))}function bs(e,s){const i=e.filter(l=>l.id!==s),a=e.find(l=>l.id===s)??null,d=new Map;for(const l of e)d.set(l.id,ke(l));const u=fs(d),p=new Set;for(const l of a?ke(a):[]){if(u.has(l))continue;const c=_e(l),o=c?Re(c.host):null;o&&p.add(o)}const r=l=>{const c=new Set;for(const o of ke(l)){if(u.has(o))continue;const I=_e(o),k=I?Re(I.host):null;k&&c.add(k)}return c},f=new Map,v=new Map;for(const l of i){const c=gs(l);if(c){f.set(c,[...f.get(c)??[],l.id]);continue}for(const o of r(l))v.set(o,[...v.get(o)??[],l.id])}const j=new Map(e.map((l,c)=>[l.id,c])),N=l=>[...l].sort((c,o)=>(j.get(c)??0)-(j.get(o)??0)),y=[];for(const[l,c]of f)y.push({prefix:l,tier:"declared",deviceIds:N(c),words:"declared"});for(const[l,c]of v)p.has(l)?y.push({prefix:l,tier:"shared",deviceIds:N(c),words:"shared with this device"}):c.length>1&&y.push({prefix:l,tier:"probable",deviceIds:N(c),words:"same prefix"});return y.sort((l,c)=>l.tier.localeCompare(c.tier)||l.prefix.localeCompare(c.prefix))}function gs(e){for(const s of e.memberships){const i=s.scope.trim();if(i)return i}return""}const $e={declared:0,shared:1,probable:2};function vs(e,s){const i=new Map;for(const d of e){let u=null;for(const r of d.deviceIds){const f=s.get(r);f!==void 0&&(u===null||f<u.slot)&&(u={id:r,slot:f})}if(u===null)continue;const p=i.get(u.id);p===void 0?i.set(u.id,{slot:u.slot,groups:[d]}):p.groups.push(d)}const a=d=>{let u=-1;for(const p of d.deviceIds){const r=s.get(p);r!==void 0&&r>u&&(u=r)}return u};return[...i.entries()].sort((d,u)=>d[1].slot-u[1].slot).map(([d,u])=>({deviceId:d,groups:u.groups.sort((p,r)=>a(r)-a(p)||$e[p.tier]-$e[r.tier]||p.prefix.localeCompare(r.prefix))}))}function ks(e){return new Map(e.map(s=>[s.deviceId,s.groups.length]))}function ws(e){return`${e.tier==="declared"?e.prefix:xs(e.prefix)} · ${e.words}`}const Le=(e,s)=>e.deviceIds.map(i=>s.devices.get(i)).filter(i=>i!==void 0),js=({stacks:e,geometry:s})=>t.jsx("div",{"aria-hidden":"true",className:"pointer-events-none absolute top-0 left-0",children:e.map(i=>{const a=i.groups.length,d=new Array(a).fill(0);let u=null;for(let r=a-1;r>=0;r-=1){const f=Le(i.groups[r],s),v=(f.length===0?0:Math.max(...f.map(j=>j.y+j.height)))+me;u=u===null?v:Math.max(v,u+ge),d[r]=u}const p=s.devices.get(i.deviceId);return i.groups.map((r,f)=>{const v=Le(r,s);if(v.length===0)return null;const j=a-1-f,N=Math.min(...v.map(k=>k.x)),y=Math.max(...v.map(k=>k.x)),c=(p?.y??Math.min(...v.map(k=>k.y)))-me-St*j,o=r.tier==="declared",I=ws(r);return t.jsx("div",{"data-mesh-scope":`${r.tier}:${r.prefix}`,"data-mesh-scope-level":f,className:R("absolute rounded-lg",r.tier==="probable"?"border border-dashed border-hairline-strong":"border border-control"),style:{left:N-me-ge*j,top:c,width:y+ye-N+(me+ge*j)*2,height:d[f]-c},children:t.jsx("span",{"data-mesh-scope-label":"",className:R("absolute bottom-full left-1 mb-0.5 whitespace-nowrap text-meta",r.tier==="probable"?"text-ink-dim":"text-ink-muted",o&&"font-medium"),children:I})},`${r.tier}:${r.prefix}`)})})}),Pe=48,Te=1.25,ys=.0015,Ns=({graph:e,slots:s,nowSeconds:i,selectedDeviceId:a,sessions:d,sessionTotals:u,movingSessionId:p,canMove:r,onOpenDevice:f,onAskMove:v,onDropRefused:j,onShowAllSessions:N,summaryId:y})=>{const l=x.useRef(null),[c,o]=x.useState({width:0,height:0,clipWidth:0,clipHeight:0,left:0,top:0}),[I,k]=x.useState({k:1,tx:0,ty:0}),h=x.useRef(!1),S=x.useRef(!1),D=x.useRef(null),P=x.useMemo(()=>bs(e.devices,e.selfDeviceId),[e.devices,e.selfDeviceId]),C=x.useMemo(()=>vs(P,s.devices),[P,s]),M=x.useMemo(()=>Mt(s,ks(C)),[s,C]),B=x.useMemo(()=>({selfDeviceId:e.selfDeviceId,devices:new Map(e.devices.map(n=>[n.id,n])),networks:new Map(e.networks.map(n=>[n.id,n]))}),[e]),[w,W]=x.useState(fe),te=x.useRef({kind:"ground"}),z=x.useCallback((n,m)=>{const b=document.elementFromPoint(n,m),E=b?.closest("[data-mesh-device]");if(E){const G=E.getAttribute("data-mesh-device");if(G)return{kind:"device",deviceId:G}}const O=b?.closest("[data-mesh-network]");if(O){const G=O.getAttribute("data-mesh-network");if(G)return{kind:"network",networkId:G}}return{kind:"ground"}},[]),L=x.useMemo(()=>w.kind!=="dragging"&&w.kind!=="settling"?null:xe(w.payload,w.target,B),[w,B]),se=x.useCallback(n=>{if(!L)return null;if(L.kind==="plan"){const m=w.kind==="dragging"||w.kind==="settling"?w.target:null;return m&&m.kind==="device"&&m.deviceId===n?"accept":null}if(L.kind==="refused"){const m=w.kind==="dragging"||w.kind==="settling"?w.target:null;return m&&m.kind==="device"&&m.deviceId===n?"refuse":null}return null},[L,w]),ne=x.useCallback((n,m)=>{if(!r||n.button!==0)return;S.current=!1;const b=m.locality==="local"?e.selfDeviceId??"":m.owner_device,E=B.devices.get(b),O={session:m,ownerDeviceId:b,ownerLabel:E?.label??m.owner_device_name};try{n.currentTarget.setPointerCapture(n.pointerId)}catch{}W(G=>Q(G,{kind:"press",payload:O,x:n.clientX,y:n.clientY,pointerId:n.pointerId}))},[r,B,e.selfDeviceId]),ie=n=>{if(w.kind==="pressing"||w.kind==="dragging"){const m=z(n.clientX,n.clientY);te.current=m,W(b=>Q(b,{kind:"move",x:n.clientX,y:n.clientY,target:m}));return}ce(n)},re=n=>{if(J(n),w.kind!=="pressing"&&w.kind!=="dragging")return;if(w.kind==="pressing"){W(b=>Q(b,{kind:"cancel"}));return}const m=xe(w.payload,w.target,B);S.current=!0,W(b=>Q(b,{kind:"release"})),m.kind==="plan"?v({plan:m.plan,alternatives:m.alternatives,risky:m.risky}):m.kind==="refused"&&j({code:m.code,sentence:m.sentence,remedy:m.remedy,plan:m.plan??null}),W(b=>Q(b,{kind:"settled"}))};x.useEffect(()=>()=>W(fe),[]);const Z=x.useCallback(()=>{k(Ae(M.bounds,c))},[M.bounds,c]);x.useEffect(()=>{const n=l.current;if(!n)return;const m=()=>{const E=n.getBoundingClientRect();o({width:E.width,height:E.height,clipWidth:n.clientWidth,clipHeight:n.clientHeight,left:E.left,top:E.top})};m();const b=new ResizeObserver(m);return b.observe(n),()=>b.disconnect()},[]),x.useEffect(()=>{h.current||c.width<=0||c.height<=0||(h.current=!0,k(Ae(M.bounds,c)))},[c,M.bounds]),x.useEffect(()=>{const n=D.current;if(D.current={width:c.width,height:c.height},!n||!h.current||c.width<=0||c.height<=0||c.width>=n.width&&c.height>=n.height||!a)return;const m=M.devices.get(a);m&&k(b=>{const E={width:c.clipWidth,height:c.clipHeight},O=Math.max(0,Math.min(E.width-M.bounds.width*b.k,E.height-M.bounds.height*b.k));return Dt(b,m,E,Math.min(Et,O))})},[c,a,M]);const F=w.kind==="dragging"?{x:w.x-c.left+12,y:w.y-c.top+12}:{x:0,y:0},K=L?At(L):null,g=x.useRef(null),A=x.useRef(null),$=x.useRef(null),T=x.useRef(null),_=x.useCallback(()=>{$.current=null;const n=g.current,m=A.current;if(g.current=null,A.current=null,n){const b=T.current;if(!b)return;k({k:b.transform.k,tx:b.transform.tx+(n.x-b.x),ty:b.transform.ty+(n.y-b.y)});return}m&&k(b=>ve(b,{x:m.x,y:m.y},b.k*Math.exp(-m.deltaY*ys)))},[]),Y=x.useCallback(()=>{$.current===null&&($.current=requestAnimationFrame(_))},[_]);x.useEffect(()=>()=>{$.current!==null&&cancelAnimationFrame($.current)},[]);const U=n=>{!(n.target===n.currentTarget)&&n.button!==1||n.button!==0&&n.button!==1||(T.current={x:n.clientX,y:n.clientY,transform:I},n.currentTarget.setPointerCapture(n.pointerId),n.preventDefault())},ce=n=>{T.current&&(g.current={x:n.clientX,y:n.clientY},Y())},J=n=>{T.current&&(T.current=null,g.current=null,n.currentTarget.hasPointerCapture(n.pointerId)&&n.currentTarget.releasePointerCapture(n.pointerId))},X=x.useCallback(n=>{if(n.deltaY===0)return;n.preventDefault();const m=n.currentTarget.getBoundingClientRect();A.current={x:n.clientX-m.left,y:n.clientY-m.top,deltaY:n.deltaY},Y()},[Y]);x.useEffect(()=>{const n=l.current;if(n)return n.addEventListener("wheel",X,{passive:!1}),()=>n.removeEventListener("wheel",X)},[X]);const ue=n=>{const m=n.shiftKey?Pe*4:Pe;switch(n.key){case"Escape":if(w.kind!=="pressing"&&w.kind!=="dragging")return;n.preventDefault(),w.kind==="dragging"&&(S.current=!0),W(b=>Q(b,{kind:"cancel"}));return;case"0":n.preventDefault(),Z();return;case"+":case"=":n.preventDefault(),k(b=>ve(b,{x:c.width/2,y:c.height/2},b.k*Te));return;case"-":case"_":n.preventDefault(),k(b=>ve(b,{x:c.width/2,y:c.height/2},b.k/Te));return;case"ArrowLeft":case"ArrowRight":case"ArrowUp":case"ArrowDown":{n.preventDefault();const b=n.key==="ArrowLeft"?m:n.key==="ArrowRight"?-m:0,E=n.key==="ArrowUp"?m:n.key==="ArrowDown"?-m:0;k(O=>({...O,tx:O.tx+b,ty:O.ty+E}));return}}};return t.jsxs("div",{ref:l,"data-mesh-canvas":"",role:"group","aria-labelledby":y,tabIndex:0,onPointerDown:U,onPointerMove:ie,onPointerUp:re,onPointerCancel:n=>{w.kind==="dragging"&&(S.current=!0),W(m=>Q(m,{kind:"cancel"})),J(n)},"data-mesh-gesture":w.kind,onKeyDown:ue,onDoubleClick:n=>{n.target===n.currentTarget&&Z()},className:R("relative min-h-0 flex-1 overflow-hidden rounded-lg border border-hairline bg-sunken","[touch-action:none]","cursor-grab active:cursor-grabbing","focus-visible:outline focus-visible:outline-2 focus-visible:outline-accent focus-visible:outline-offset-[-2px]"),children:[t.jsx("div",{"data-mesh-ground":"","aria-hidden":"true",className:"mesh-ground pointer-events-none absolute inset-0",style:{backgroundPosition:`${I.tx}px ${I.ty}px`}}),t.jsxs("div",{"data-mesh-world":"",className:"absolute top-0 left-0",style:{transform:`translate3d(${I.tx}px, ${I.ty}px, 0) scale(${I.k})`,transformOrigin:"0 0",width:M.bounds.width,height:M.bounds.height},children:[t.jsx(js,{stacks:C,geometry:M}),t.jsx(is,{edges:e.edges,geometry:M,selectedDeviceId:a}),t.jsx("ul",{"aria-label":"Networks",className:"m-0 list-none p-0",children:e.networks.map(n=>{const m=M.networks.get(n.id);return m?t.jsx(ms,{network:n,x:m.x,y:m.y,refused:L?.kind==="refused"&&w.kind==="dragging"&&w.target.kind==="network"&&w.target.networkId===n.id},n.id):null})}),t.jsx("ul",{"aria-label":"Devices",className:"m-0 list-none p-0",children:e.devices.map(n=>{const m=M.devices.get(n.id);return m?t.jsx(hs,{device:n,x:m.x,y:m.y,nowSeconds:i,selected:n.id===a,sessions:d.get(n.id)??{rows:[],shown:[],hidden:0},sessionTotal:u.get(n.id)??n.sessionCount??0,dropState:se(n.id),movingSessionId:p,draggedSessionId:as(w),onOpen:f,onChipPointerDown:ne,onChipClick:()=>{if(S.current){S.current=!1;return}f(n.id)},onShowAllSessions:N},n.id):null})})]}),w.kind==="dragging"&&t.jsx("div",{"data-mesh-ghost":"","aria-hidden":"true",className:"pointer-events-none absolute z-10 max-w-40 truncate rounded-sm border border-ink-dim bg-surface px-1.5 py-0.5 text-meta text-ink",style:{left:F.x,top:F.y},children:w.payload.session.name||"untitled"}),w.kind==="dragging"&&K&&t.jsx("div",{"data-mesh-indicator":"",className:R("pointer-events-none absolute z-10 rounded-sm border bg-surface px-2 py-1 text-meta",L?.kind==="refused"?"border-warning text-warning":"border-control text-ink"),style:{left:F.x,maxWidth:Math.max(160,c.width-F.x-12),...F.y>c.height*.6?{bottom:Math.max(12,c.height-F.y+8)}:{top:F.y+24}},children:K})]})};function Is(e,s,i,a){const d=i.locality==="local"?s:i.owner_device,u=[];for(const p of e)if(p.id!==d){if(p.id===s){u.push({deviceId:p.id,label:a,verb:"Recall to this device",keepVerb:"Copy here, leave it there"});continue}u.push({deviceId:p.id,label:p.label,verb:`Move to ${p.label}`,keepVerb:`Copy to ${p.label}`})}return u}function Cs(e,s,i){return Is(e.devices,e.selfDeviceId,s,i)}function Ve(e,s,i){const a=Cs(e,s,i),d={selfDeviceId:e.selfDeviceId,devices:new Map(e.devices.map(r=>[r.id,r])),networks:new Map(e.networks.map(r=>[r.id,r]))},u=s.locality==="local"?e.selfDeviceId??"":s.owner_device,p=d.devices.get(u);return a.map(r=>{const f=xe({session:s,ownerDeviceId:u,ownerLabel:p?.label??s.owner_device_name},{kind:"device",deviceId:r.deviceId},d);return{...r,refused:f.kind==="refused"&&f.code!=="busy"?f.sentence:null}})}const Ke=({session:e,destinations:s,disabled:i,onChoose:a,onOpenChange:d,trigger:u,triggerLabel:p})=>t.jsxs(at,{onOpenChange:d,children:[t.jsx(it,{asChild:!0,children:t.jsx("button",{type:"button","aria-label":p,"data-mesh-session-menu":e.id,disabled:i||s.length===0,className:"rounded-sm focus-visible:outline focus-visible:outline-2 focus-visible:outline-accent focus-visible:outline-offset-2 disabled:text-ink-disabled",children:u})}),t.jsxs(rt,{align:"start",className:"min-w-56",children:[t.jsx(lt,{children:ee(e)}),t.jsx(Se,{}),s.map(r=>t.jsx(Me,{"data-mesh-move-to":r.deviceId,disabled:!!r.refused,title:r.refused??void 0,onSelect:()=>a(r,!1),children:r.verb},r.deviceId)),t.jsx(Se,{}),s.map(r=>t.jsx(Me,{"data-mesh-copy-to":r.deviceId,disabled:!!r.refused,title:r.refused??void 0,onSelect:()=>a(r,!0),children:r.keepVerb},`keep-${r.deviceId}`))]})]}),Ss=({device:e,sessions:s,sessionTotal:i,nowSeconds:a,destinationsFor:d,movingSessionId:u,canMove:p,canInvite:r,onClose:f,onMove:v,onShowInList:j,onInvite:N,onRemoveMember:y})=>{const l=oe(e);x.useEffect(()=>{const h=S=>{S.key!=="Escape"||S.defaultPrevented||S.target?.closest('[role="menu"],[role="dialog"]')||(document.querySelector(`[data-mesh-device-open="${e.id}"]`)?.focus(),f())};return window.addEventListener("keydown",h),()=>window.removeEventListener("keydown",h)},[e.id,f]);const c=e.memberships.every(h=>!h.active),o=e.sessionCount===null?we(null):`${e.sessionCount} ${we(e.sessionCount)}`,I=e.suspect?Ye:[c?"revoked membership":o,de(l)].filter(Boolean).join(" · "),k=i>s.rows.length?`${s.rows.length} of ${i}`:`${s.rows.length}`;return t.jsxs("aside",{"aria-label":`${e.label} details`,"data-mesh-panel":e.id,className:"flex w-80 shrink-0 flex-col gap-3 overflow-y-auto rounded-md border border-hairline bg-surface p-4",children:[t.jsxs("header",{className:"flex flex-col gap-1",children:[t.jsx(q,{size:"sm",variant:"ghost",className:"w-fit self-end","data-mesh-panel-close":"",onClick:f,children:"Close"}),t.jsx("h2",{className:"text-body-sm text-ink",children:e.label}),t.jsxs("p",{className:"flex items-center gap-1.5 text-meta text-ink-muted",children:[e.suspect&&t.jsx(Ne,{"aria-hidden":"true",className:"size-3.5 text-danger"}),!e.suspect&&l==="unanswered"&&t.jsx(nt,{"aria-hidden":"true",className:"size-3.5 text-warning"}),I]})]}),t.jsx(ae,{}),t.jsxs("section",{className:"flex flex-col gap-2",children:[t.jsx("h3",{className:"text-meta text-ink-dim",children:"Memberships"}),t.jsx("ul",{className:"m-0 flex list-none flex-col gap-2 p-0",children:e.memberships.map(h=>t.jsxs("li",{className:"flex flex-col gap-1",children:[t.jsxs("span",{className:"flex items-center gap-2 text-body-sm text-ink",children:[t.jsx(je,{"aria-hidden":"true",className:"size-3.5 text-ink-muted"}),h.networkName]}),t.jsxs("span",{className:"text-meta text-ink-dim",children:[h.role||"member",h.capabilities.length>0?` · ${h.capabilities.join(", ")}`:"",h.active?"":" · revoked"]}),r&&h.active&&t.jsxs(q,{size:"sm",variant:"ghost",className:"w-fit","data-mesh-remove-member":`${h.networkId}:${e.id}`,onClick:()=>y(e,h.networkId),children:["Remove from ",h.networkName,"…"]})]},h.networkId))}),r&&t.jsx(q,{size:"sm",variant:"secondary",className:"w-fit","data-mesh-invite":e.id,onClick:()=>N(e),children:"Invite to a network…"})]}),t.jsx(ae,{}),t.jsxs("section",{className:"flex shrink-0 flex-col gap-2",children:[t.jsxs("h3",{className:"text-meta text-ink-dim",children:["Conversations ",t.jsxs("span",{className:"text-ink-disabled",children:["(",k,")"]})]}),s.rows.length===0?t.jsx("p",{className:"text-meta text-ink-dim",children:e.sessionCount===null?"This device did not report its conversations.":"No conversations here."}):t.jsx("ul",{className:"m-0 flex list-none flex-col gap-1 p-0",children:s.rows.map(h=>t.jsxs("li",{"data-mesh-panel-session":h.id,className:R("flex items-center gap-2 rounded-sm px-2 py-1","border border-hairline bg-elevated",u===h.id&&"border-control"),children:[t.jsx("span",{className:"min-w-0 flex-1 truncate text-body-sm text-ink",title:ee(h),children:ee(h)}),t.jsx("span",{className:"shrink-0 text-meta text-ink-dim",children:Ge(h,e.label,oe(e))}),u===h.id?t.jsx("span",{className:"shrink-0 text-meta text-ink-muted",children:"moving…"}):t.jsx(Ke,{session:h,destinations:d(h),disabled:!p,onChoose:(S,D)=>v(h,S,D),trigger:t.jsx(He,{"aria-hidden":"true",className:"size-4"}),triggerLabel:`Move ${ee(h)}`})]},h.id))})]}),t.jsx(ae,{}),t.jsxs("section",{className:"flex flex-col gap-2",children:[t.jsx("h3",{className:"text-meta text-ink-dim",children:"Network addresses"}),e.endpoints.length===0?t.jsx("p",{className:"text-meta text-ink-dim",children:"No address published."}):t.jsx("ul",{className:"m-0 flex list-none flex-col gap-1 p-0",children:e.endpoints.map(h=>t.jsxs("li",{className:"flex items-baseline justify-between gap-2",children:[t.jsx("span",{className:"min-w-0 truncate font-mono text-body-sm text-ink",children:h}),t.jsx("span",{className:"shrink-0 text-meta text-ink-dim",children:"advertised"})]},h))})]}),t.jsx(ae,{}),t.jsxs("section",{className:"flex flex-col gap-2",children:[t.jsx("h3",{className:"text-meta text-ink-dim",children:"Status"}),t.jsxs("dl",{className:"m-0 flex flex-col gap-1",children:[t.jsxs("div",{className:"flex items-baseline justify-between gap-2",children:[t.jsx("dt",{className:"text-meta text-ink-dim",children:"Reach"}),t.jsx("dd",{className:"m-0 text-body-sm text-ink",children:de(l)})]}),t.jsxs("div",{className:"flex items-baseline justify-between gap-2",children:[t.jsx("dt",{className:"text-meta text-ink-dim",children:"Last status frame"}),t.jsx("dd",{className:"m-0 text-body-sm text-ink",children:e.lastSeenAt===null?"never":_t(a-e.lastSeenAt)})]})]}),e.reason&&t.jsx("p",{className:"text-meta text-warning",children:e.reason})]}),t.jsx(ae,{}),t.jsx(q,{size:"sm",variant:"ghost",className:"w-fit","data-mesh-show-in-list":e.id,onClick:()=>j(e.id),children:"Show in list"})]})},Ms=["name","chats","state"],Ds={name:"Name",chats:"Conversations",state:"State"},Oe={suspect:0,unreachable:1,self:2,reachable:3};function As(e,s){const i=[...e];switch(s){case"chats":return i.sort((a,d)=>(d.sessionCount??-1)-(a.sessionCount??-1)||a.label.localeCompare(d.label)),i;case"state":return i.sort((a,d)=>Oe[a.state]-Oe[d.state]||a.label.localeCompare(d.label)),i;default:return i.sort((a,d)=>a.label.localeCompare(d.label))}}const We=8;function Es(e,s){if(e.locality==="local")return e.live_state||"here";const i=e.owner_device_name||s,a=e.live_state?` · ${e.live_state}`:"";return e.reachable?`on ${i}${a}`:`on ${i} (not answering)`}const _s=({graph:e,nowSeconds:s,selectedDeviceId:i,sessions:a,selfLabel:d,canMove:u,onSelect:p,onMove:r,onInvite:f,onRemove:v})=>{const[j,N]=x.useState("name"),y=x.useMemo(()=>e.networks.map(l=>({network:l,members:As(e.devices.filter(c=>c.memberships.some(o=>o.networkId===l.id)),j)})),[e,j]);return t.jsxs("div",{className:"flex min-h-0 flex-1 flex-col gap-4 overflow-y-auto pr-1",children:[t.jsxs("fieldset",{className:"m-0 w-fit border-0 p-0",children:[t.jsx("legend",{className:"sr-only",children:"Sort devices by"}),t.jsx("div",{className:"flex gap-0.5 rounded-md bg-sunken p-0.5",children:Ms.map(l=>t.jsx("button",{type:"button","aria-pressed":j===l,onClick:()=>N(l),className:R("h-6 rounded-sm px-3 text-body-sm text-ink-muted transition-colors duration-fast ease-out-quart","hover:text-ink","focus-visible:outline focus-visible:outline-2 focus-visible:outline-accent focus-visible:outline-offset-2",j===l&&"bg-surface text-ink"),children:Ds[l]},l))})]}),y.map(({network:l,members:c})=>t.jsxs("section",{"data-mesh-network-group":l.id,className:"flex flex-col gap-2",children:[t.jsxs("h2",{className:"flex flex-wrap items-baseline gap-2 text-body-sm text-ink",title:`epoch ${l.epoch}`,children:[l.label,t.jsxs("span",{className:"text-meta text-ink-dim",children:[l.trust," · ",l.memberCount," ",l.memberCount===1?"device":"devices",l.revokedCount>0?` · ${l.revokedCount} revoked`:""]})]}),t.jsx("ul",{className:"m-0 flex list-none flex-col gap-1 p-0",children:c.map(o=>{const I=o.memberships.find(C=>C.networkId===l.id),k=o.id===i,h=a.get(o.id),S=h?.rows??[],D=h?qe(h,o.sessionCount):o.sessionCount??0,P=oe(o);return t.jsxs("li",{"data-mesh-device-row":o.id,"data-mesh-state":o.state,"aria-current":k?"true":void 0,className:R("flex flex-col gap-1 rounded-md px-3 py-2","border border-hairline bg-surface",k&&"border-ink bg-row-selected"),children:[t.jsxs("div",{className:"flex flex-wrap items-baseline gap-x-3 gap-y-1",children:[t.jsx("button",{type:"button","data-mesh-device-open":o.id,onClick:()=>p(o.id),className:R("min-w-0 flex-1 truncate text-left text-body-sm text-ink","hover:text-ink-muted","focus-visible:outline focus-visible:outline-2 focus-visible:outline-accent focus-visible:outline-offset-2"),children:o.label}),t.jsxs("span",{className:R("flex shrink-0 items-center gap-1 text-meta",Be[P]),"data-mesh-reach":P,children:[o.suspect&&t.jsx(Ne,{"aria-hidden":"true",className:"size-3.5 shrink-0 text-danger"}),o.suspect?de(P):Fe(o,s),o.suspect&&t.jsx("span",{className:"shrink-0 rounded-sm border border-danger px-1 text-danger",children:Ye})]}),t.jsxs("span",{className:"shrink-0 text-meta text-ink-dim",children:[I?.role?`${I.role} · `:"",I&&!I.active?"revoked":"member"]})]}),S.length>0?t.jsxs(t.Fragment,{children:[t.jsx(ae,{className:"my-1"}),t.jsx("ul",{className:"m-0 flex list-none flex-col gap-0.5 p-0",children:S.slice(0,We).map(C=>t.jsxs("li",{"data-mesh-row-session":C.id,className:"flex items-center gap-2 py-0.5",children:[t.jsx("span",{className:"min-w-0 flex-1 truncate text-meta text-ink-muted",children:C.name||C.id}),t.jsx("span",{className:"shrink-0 text-meta text-ink-dim",children:Es(C,d)}),t.jsx(Ke,{session:C,destinations:Ve(e,C,d),disabled:!u,onChoose:(M,B)=>r(C,M,B),trigger:t.jsx(He,{"aria-hidden":"true",className:"size-3.5"}),triggerLabel:`Move ${C.name||C.id}`})]},C.id))}),D>S.slice(0,We).length&&t.jsx("button",{type:"button",onClick:()=>p(o.id),className:"w-fit text-meta text-ink-dim hover:text-ink",children:`show all ${D} in the panel`})]}):t.jsx("span",{className:"text-meta text-ink-dim",children:D===0?"no conversations":D===1?"1 conversation":`${D} conversations`}),(I?.active||o.state!=="self")&&t.jsxs("div",{className:"flex flex-wrap items-center gap-1",children:[t.jsx(q,{size:"sm",variant:"ghost","data-mesh-invite":o.id,onClick:()=>f({deviceId:o.id,deviceLabel:o.label}),children:"Invite to a network…"}),I?.active&&t.jsxs(q,{size:"sm",variant:"ghost","data-mesh-remove-member":`${l.id}:${o.id}`,onClick:()=>v({networkId:l.id,networkLabel:l.label,deviceId:o.id,deviceLabel:o.label}),children:["Remove from ",l.label,"…"]})]})]},o.id)})})]},l.id)),e.unmatchedPeers.length>0&&t.jsxs("p",{className:"text-meta text-warning",children:[e.unmatchedPeers.length," ",e.unmatchedPeers.length===1?"device":"devices"," answered the peer read but is in no network this app can name."]})]})},Rs=["canvas","list"],$s={canvas:"Canvas",list:"List"},Ls=({state:e,graph:s,nowSeconds:i,checking:a,staleError:d,onRetry:u,approvals:p,sessions:r,sessionError:f,selfLabel:v,movingSessionId:j,canMove:N,pendingMove:y,onAskMove:l,onDropRefused:c,onChooseMove:o,onCancelMove:I,moveBusy:k,moveReport:h,onDismissReport:S,onWaitForIdle:D,onUndoCopy:P,invite:C,onOpenInvite:M,onInvite:B,onCloseInvite:w,inviteBusy:W,inviteReceipt:te,inviteRefusal:z,remove:L,onOpenRemove:se,onRemove:ne,onCloseRemove:ie,removeBusy:re,removeRefusal:Z,removed:F})=>{const[K,g]=x.useState("canvas"),[A,$]=x.useState(null),T=s?Rt(s):"",_="mesh-summary",Y=$t(s),U=Lt(s,r,s?.selfDeviceId??null),ce=x.useMemo(()=>{const n=new Map;for(const m of s?.devices??[]){const b=U.byDevice.get(m.id);n.set(m.id,b?qe(b,m.sessionCount):m.sessionCount??0)}return n},[s,U]),J=x.useCallback(n=>{$(n)},[]),X=s?s.devices.find(n=>n.id===A)??null:null,ue=x.useCallback((n,m,b)=>{if(!s)return null;const E={selfDeviceId:s.selfDeviceId,devices:new Map(s.devices.map(V=>[V.id,V])),networks:new Map(s.networks.map(V=>[V.id,V]))},O=n.locality==="local"?s.selfDeviceId??"":n.owner_device,G=E.devices.get(O),H=xe({session:n,ownerDeviceId:O,ownerLabel:G?.label??n.owner_device_name},{kind:"device",deviceId:m.deviceId},E);if(H.kind==="refused")return c({code:H.code,sentence:H.sentence,remedy:H.remedy,plan:H.plan??null}),null;if(H.kind==="none")return null;const Ie=b?H.alternatives.find(V=>V.keep)??H.plan:H.plan,Xe=[H.plan,...H.alternatives].filter(V=>V.keep!==Ie.keep),Ze={plan:Ie,alternatives:Xe,risky:H.risky};l(Ze)},[s,l,c]);return t.jsxs("div",{className:"flex h-full min-h-0 flex-col gap-6 overflow-y-auto p-6",children:[t.jsx(tt,{title:"Mesh",icon:je,subtitle:"Devices this app is paired with, and the networks that hold them.",children:t.jsxs("div",{className:"flex items-center gap-4",children:[a&&t.jsx("output",{className:"text-meta text-ink-dim",children:"checking…"}),(e.kind==="ready"||e.kind==="loading")&&t.jsxs("fieldset",{className:"m-0 w-fit border-0 p-0",children:[t.jsx("legend",{className:"sr-only",children:"Presentation"}),t.jsx("div",{className:"flex gap-0.5 rounded-md bg-sunken p-0.5",children:Rs.map(n=>t.jsx("button",{type:"button","aria-pressed":K===n,disabled:e.kind!=="ready",onClick:()=>g(n),className:R("h-6 rounded-sm px-3 text-body-sm text-ink-muted transition-colors duration-fast ease-out-quart","hover:text-ink","focus-visible:outline focus-visible:outline-2 focus-visible:outline-accent focus-visible:outline-offset-2","disabled:text-ink-dim disabled:hover:text-ink-dim",K===n&&"bg-surface text-ink"),children:$s[n]},n))})]})]})}),t.jsx(ss,{rows:p.rows,error:p.error,pending:p.pending,refusal:p.decisionRefusal,onDecide:p.onDecide,onRetry:p.onRetry,nowSeconds:p.nowSeconds,networkNames:new Map((s?.networks??[]).map(n=>[n.id,n.label]))}),e.kind==="loading"&&t.jsxs("div",{className:"flex min-h-0 flex-1 flex-col gap-3",children:[t.jsx(De,{className:"h-4 w-64"}),t.jsx(De,{className:"min-h-40 w-full flex-1"})]}),e.kind==="error"&&t.jsxs(he,{variant:"warning",className:"flex-col items-start gap-2",children:[t.jsx("p",{children:e.message}),t.jsx(q,{variant:"secondary",size:"sm",onClick:u,className:"w-fit",children:"Ask again"})]}),e.kind==="empty"&&t.jsx("div",{className:"flex min-h-0 flex-1 items-center justify-center rounded-lg border border-hairline bg-surface p-6",children:t.jsxs("div",{className:"flex flex-col items-start gap-3",children:[t.jsx("h2",{className:"text-heading text-ink",children:"No network on this device"}),t.jsx("p",{className:"max-w-140 text-body-sm text-ink-muted",children:"This device is not in any network, so there is no mesh to draw. Create one on this machine:"}),t.jsx("code",{className:"rounded-sm bg-sunken px-2 py-1 font-mono text-meta text-ink",children:"lop network init <name>"}),t.jsx("p",{className:"text-meta text-ink-dim",children:"A network appears here once this device has joined one."})]})}),e.kind==="ready"&&s&&t.jsx(t.Fragment,{children:t.jsxs("div",{className:"flex min-h-[22rem] flex-1 gap-4",children:[t.jsxs("div",{className:"flex min-h-0 min-w-0 flex-1 flex-col gap-3",children:[t.jsx("p",{id:_,className:"text-meta text-ink-muted","data-mesh-summary":"",children:T}),d&&t.jsx(he,{variant:"warning",children:t.jsx("p",{children:d})}),f&&t.jsx(he,{variant:"warning",children:t.jsx("p",{children:f})}),h&&t.jsx(Pt,{receipt:h.kind==="moved"?{verb:h.verb,detail:h.detail,undo:h.undo}:null,refusal:h.kind==="refused"?h.refusal:null,canWait:h.kind==="refused"&&h.plan!==null,onWait:D,onRecheck:u,onUndo:P,onDismiss:S,pending:k}),K==="canvas"?t.jsx(Ns,{graph:s,slots:Y,nowSeconds:i,selectedDeviceId:A,sessions:U.byDevice,sessionTotals:ce,movingSessionId:j,canMove:N,onOpenDevice:J,onAskMove:l,onDropRefused:c,onShowAllSessions:J,summaryId:_}):t.jsx(_s,{graph:s,nowSeconds:i,selectedDeviceId:A,sessions:U.byDevice,selfLabel:v,canMove:N,onSelect:J,onMove:ue,onInvite:M,onRemove:se})]}),X&&t.jsx(Ss,{device:X,sessions:U.byDevice.get(X.id)??{rows:[],shown:[],hidden:0},sessionTotal:ce.get(X.id)??0,nowSeconds:i,canMove:N,canInvite:e.kind==="ready",movingSessionId:j,destinationsFor:n=>Ve(s,n,v),onClose:()=>$(null),onMove:ue,onInvite:n=>M({deviceId:n.id,deviceLabel:n.label}),onRemoveMember:(n,m)=>{const b=s.networks.find(E=>E.id===m);se({networkId:m,networkLabel:b?.label??m,deviceId:n.id,deviceLabel:n.label})},onShowInList:n=>{J(n),g("list")}})]})}),t.jsx(Tt,{open:y!==null,plan:y?.plan??Ps,alternatives:y?.alternatives??[],risky:y?.risky??!1,busy:k,onCancel:I,onChoose:o}),C&&t.jsx(Ot,{open:C.open,options:C.options,deviceId:C.deviceId,deviceLabel:C.deviceLabel,onClose:w,onInvite:B,pending:W,receipt:te,refusal:z}),L&&t.jsx(Wt,{open:L.open,networkLabel:L.networkLabel,deviceLabel:L.deviceLabel,onClose:ie,onConfirm:ne,pending:re,refusal:Z,removed:F})]})},Ps={sessionId:"",to:"",keep:!1,verb:"",waitS:0,lost:null},qs=()=>{const e=Qe(),s=be(e.data,"peers")==="enabled",i=be(e.data,"session_transfer")==="enabled",a=zt(s),d=Ht(s),u=Bt(s,{poll:!1,stamp:()=>Ce.getState().beginAnswer()}),p=x.useMemo(()=>({peers:a,networks:d}),[a,d]),r=Ft(p),f=Yt(p),v=qt(),j=be(e.data,"approvals")==="enabled",N=Ut(s&&j,{poll:!1}),y=Gt(),l=y.isError?{approvalId:y.variables?.approvalId??null,...Vt(y.error)}:null,c=x.useMemo(()=>Math.floor((N.dataUpdatedAt||Date.now())/1e3),[N.dataUpdatedAt]),o=Ce(g=>g.settlePlacement),I=Kt(),k=Xt(),[h,S]=x.useState(null),[D,P]=x.useState(null),[C,M]=x.useState(null),[B,w]=x.useState(null),[W,te]=x.useState(null),[z,L]=x.useState(null),[se,ne]=x.useState(null),ie=x.useMemo(()=>{const g=Math.max(a.dataUpdatedAt,d.dataUpdatedAt);return Math.floor((g||Date.now())/1e3)},[a.dataUpdatedAt,d.dataUpdatedAt]),re=x.useCallback(()=>{a.refetch(),d.refetch(),u.refetch()},[a,d,u]),Z=x.useCallback((g,A)=>{S(null);const $={sessionId:g.sessionId,to:g.to,keep:g.keep,waitS:A??g.waitS};v.mutate($,{onSuccess:T=>{if(T.kind==="moved"){const{receipt:_}=T;o(g.sessionId,_);const Y=_.locality==="local"?"this device":f?.devices.find(U=>U.id===_.owner_device)?.label??_.owner_device;P({kind:"moved",verb:_.mode==="keep"?"Copied":"Moved",detail:_.mode==="keep"?`${Y} holds a copy as ${_.new_session_id.slice(-6)}; the original is still here.`:`${Y} holds it now${_.source_retired?"; the copy here is gone":""}.`,undo:_.mode==="keep"?{sessionId:_.new_session_id,to:"local",keep:!1,verb:`Bring the copy back from ${Y}`,waitS:0,lost:Zt(Y,"this device")}:null});return}P({kind:"refused",refusal:T.refusal,plan:g})},onError:()=>{P({kind:"refused",refusal:{code:"move_failed",sentence:"The move could not be sent. Nothing here changed; the list has been read again.",status:null,unconfirmed:!1},plan:g})}})},[f,v,o]),F=x.useMemo(()=>{if(!f)return[];const g=C?.deviceId,A=g?f.devices.find($=>$.id===g):void 0;return f.networks.filter($=>{if(!A)return!0;const T=A.memberships.find(_=>_.networkId===$.id);return!T||!T.active}).map($=>({id:$.id,label:$.label}))},[f,C]);if(!s)return t.jsx(et,{to:"/chat",replace:!0});const K=r.kind==="ready"?a.error?le(a.error):d.error?le(d.error):null:null;return t.jsx(Ls,{state:r,graph:f,nowSeconds:ie,checking:a.isFetching||d.isFetching,staleError:K,onRetry:re,approvals:{rows:N.data??[],error:N.isError?Jt(N.error):null,pending:y.isPending?y.variables??null:null,decisionRefusal:l,onDecide:(g,A)=>y.mutate({approvalId:g,decision:A}),onRetry:()=>void N.refetch(),nowSeconds:c},sessions:u.data?.rows??[],movingSessionId:v.isPending?v.variables?.sessionId??null:null,sessionError:u.isError?le(u.error):null,selfLabel:f?.devices.find(g=>g.state==="self")?.label??"this device",canMove:i,pendingMove:h,onAskMove:S,onDropRefused:g=>P({kind:"refused",refusal:{code:g.code,sentence:g.sentence,status:null,unconfirmed:!1},plan:g.plan}),onChooseMove:g=>Z(g),onCancelMove:()=>S(null),moveBusy:v.isPending,moveReport:D,onDismissReport:()=>P(null),onWaitForIdle:()=>{D?.kind!=="refused"||!D.plan||Z(D.plan,Ts)},onUndoCopy:()=>{D?.kind!=="moved"||!D.undo||S({plan:D.undo,alternatives:[],risky:!1})},invite:C===null?null:{open:!0,deviceId:C.deviceId,deviceLabel:C.deviceLabel,options:F},onOpenInvite:g=>{w(null),te(null),M(g)},onInvite:g=>{I.mutate(g,{onSuccess:A=>w(A),onError:A=>te({code:"invite_refused",sentence:le(A),status:null,unconfirmed:!1})})},onCloseInvite:()=>M(null),inviteBusy:I.isPending,inviteReceipt:B,inviteRefusal:W,remove:z===null?null:{open:!0,networkId:z.networkId,networkLabel:z.networkLabel,deviceId:z.deviceId,deviceLabel:z.deviceLabel},onOpenRemove:g=>{ne(null),L(g)},onRemove:g=>{z&&k.mutate({networkId:z.networkId,deviceId:z.deviceId,confirm:g},{onSuccess:A=>ne(A)})},onCloseRemove:()=>L(null),removeBusy:k.isPending,removeRefusal:k.isError?{code:"remove_refused",sentence:le(k.error),status:null,unconfirmed:!1}:null,removed:se})},Ts=300;export{qs as MeshPage,Ls as MeshSurface,qs as default};
|
|
1
|
+
import{r as x,j as t,c as R}from"./index-S51O3g2W.js";import{aX as ze,aY as je,aZ as Je,a_ as He,a as Qe,a$ as be,ah as Ce,b0 as et}from"./conversation-input-sync-BwB1QIO4.js";import{P as tt}from"./page-header-DswfuZnq.js";import{B as q,j as st,A as he,k as nt,a as ae,D as at,l as it,m as rt,n as lt,o as Se,p as Me,e as De}from"./error-boundary-2xFIZZKb.js";import{i as pe,d as ot,e as dt,f as ct,g as ut,h as mt,j as ht,k as pt,l as xt,m as ft,n as bt,o as gt,p as vt,N as kt,q as ye,r as wt,s as oe,D as jt,t as yt,u as Nt,v as Ne,w as we,R as It,x as de,y as Be,z as Fe,C as Ct,E as me,F as ge,G as St,H as Mt,I as xe,J as Ae,K as Dt,L as At,M as ve,O as Et,Q as Ye,T as _t,U as qe,V as Rt,W as $t,X as Lt,Y as Pt,Z as Tt,_ as Ot,$ as Wt,a0 as zt,a1 as Ht,a2 as Bt,a3 as Ft,a4 as Yt,a5 as qt,a6 as Ut,a7 as Gt,a8 as Vt,a9 as Kt,aa as Xt,ab as Zt,ac as le,ad as Jt}from"./index-D2Wfx__X.js";import"./ui-preferences-store-CagOssaI.js";import"./console-mirror-YquW6t3z.js";function Qt(e){return e==="requested"?"attention":e==="failed"?"danger":e==="connected"?"success":"neutral"}function es(e){return e==="failed"?"Abandon":"Stop"}function ts(e){switch(e){case"requested":return[{term:"Signing",text:"Approving signs with this machine's operator key; the system may ask for it."}];case"approved":return[{term:"Next",text:"An agent runs the install and connect."},{term:"Stop",text:"Stopping now denies the request; nothing has run yet."}];case"connecting":return[{term:"Stop",text:"Stopping now denies the request; the runner stops at its next step."}];case"failed":return[{term:"After a stop",text:"The runner stopped before it finished. Abandoning denies the request; a retry re-enters the same record instead."}];default:return[]}}const ss=({rows:e,error:s,pending:i,refusal:a,onDecide:d,onRetry:u,nowSeconds:p,networkNames:r})=>{const f=i!==null,v=x.useMemo(()=>e.filter(o=>pe(o.state)),[e]),j=x.useMemo(()=>e.filter(o=>!pe(o.state)),[e]),[N,y]=x.useState(null),l=N??j.some(o=>o.state==="failed"),c=a!==null&&e.some(o=>o.approvalId===a.approvalId&&(pe(o.state)||l));return v.length===0&&j.length===0&&!s&&!a?null:t.jsxs("section",{"aria-label":"Approvals","data-tour-tag":"mesh-approvals-tray",className:"flex flex-col gap-3 rounded-lg border border-hairline bg-surface p-3",children:[t.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[t.jsx(ot,{"aria-hidden":"true",className:"size-4 text-ink-muted"}),t.jsx("h2",{className:"text-body-sm text-ink",children:"Approvals"}),v.length>0&&t.jsx("span",{className:"text-meta text-ink-dim",children:v.length===1?"1 waiting":`${v.length} waiting`})]}),s&&t.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[t.jsx("p",{className:"min-w-0 flex-1 text-meta text-ink-muted",children:s}),t.jsx(q,{variant:"secondary",size:"sm",onClick:u,children:"Ask again"})]}),v.length>0&&t.jsx("ul",{className:"flex flex-col divide-y divide-hairline",children:v.map(o=>t.jsx(Ee,{row:o,pending:i?.approvalId===o.approvalId?i:null,busy:f,refusal:a?.approvalId===o.approvalId?a:null,onDecide:d,nowSeconds:p,networkNames:r},o.approvalId))}),a&&!c&&t.jsx(Ue,{refusal:a}),j.length>0&&t.jsx(ze,{open:l,onOpenChange:y,chevronClassName:"text-ink-dim",summary:t.jsxs("span",{className:"text-meta",children:["Records (",j.length,")"]}),children:t.jsx("ul",{className:"flex flex-col divide-y divide-hairline","data-tour-tag":"mesh-approvals-records",children:j.map(o=>t.jsx(Ee,{row:o,pending:i?.approvalId===o.approvalId?i:null,busy:f,refusal:a?.approvalId===o.approvalId?a:null,onDecide:d,nowSeconds:p,networkNames:r},o.approvalId))})})]})},Ee=({row:e,pending:s,busy:i,refusal:a,onDecide:d,nowSeconds:u,networkNames:p})=>{const r=pe(e.state),f=dt(e),v=ct(e,p),j=ut(e,p),N=mt(e),y=ht(e),l=pt(e),c=xt(e.expiresAt,u),o=ts(e.state),I=ft(e.state),k=bt(e.state);return t.jsxs("li",{className:"flex flex-col gap-2 py-3 first:pt-0 last:pb-0","data-tour-tag":"mesh-approval-card",children:[t.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[t.jsx(st,{variant:Qt(e.state),children:gt(e.state)}),t.jsx("div",{className:"grow"}),r&&c&&t.jsx("span",{className:"text-meta text-ink-dim",children:c})]}),t.jsx("p",{className:"text-body-sm text-ink","data-tour-tag":"mesh-approval-summary",children:r?v:f}),e.state==="failed"&&t.jsx("p",{className:"text-meta text-ink-muted","data-tour-tag":"mesh-approval-stopped-note",children:"The runner stopped before it finished. It stays retryable until its window closes; Abandon denies the request."}),(I||k)&&t.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[I&&t.jsx(q,{variant:"primary",size:"sm",disabled:i,onClick:()=>d(e.approvalId,"approve"),"data-tour-tag":"mesh-approval-approve",children:"Approve"}),k&&t.jsx(q,{variant:"ghost",size:"sm",disabled:i,onClick:()=>d(e.approvalId,"deny"),"data-tour-tag":r?"mesh-approval-deny":"mesh-approval-stop",children:r?"Deny":es(e.state)}),s&&t.jsx("span",{className:"text-meta text-ink-dim",children:s.decision==="approve"?"Waiting for the signing prompt…":"Writing the decision…"})]}),t.jsxs(ze,{chevronClassName:"text-ink-dim",summary:t.jsx("span",{className:"text-meta",children:"Details"}),children:[j.length>0&&t.jsx("dl",{className:"grid grid-cols-[max-content_1fr] gap-x-4 gap-y-0.5 text-meta text-ink-dim","data-tour-tag":"mesh-approval-consequences",children:j.map(h=>t.jsxs(x.Fragment,{children:[t.jsx("dt",{className:"text-ink-muted",children:h.term}),t.jsx("dd",{children:h.consequence})]},h.term))}),(N||y)&&t.jsxs("p",{className:"text-meta text-ink-muted",children:[N&&t.jsx("span",{children:N}),N&&y&&t.jsx("span",{children:" · "}),y&&t.jsx("span",{className:"font-mono",children:y})]}),l&&t.jsx("p",{className:"text-meta text-ink-dim",children:l}),o.length>0&&t.jsx("dl",{className:"grid grid-cols-[max-content_1fr] gap-x-4 gap-y-0.5 text-meta","data-tour-tag":"mesh-approval-consequence",children:o.map(h=>t.jsxs(x.Fragment,{children:[t.jsx("dt",{className:"text-ink-muted",children:h.term}),t.jsx("dd",{className:"text-ink-muted",children:h.text})]},h.term))})]}),a&&t.jsx(Ue,{refusal:a})]})},Ue=({refusal:e})=>t.jsx(he,{variant:"warning",className:"text-meta","data-tour-tag":"mesh-approval-refusal",children:t.jsxs("span",{className:"flex min-w-0 flex-wrap items-center gap-2",children:[t.jsx("span",{className:"min-w-0 flex-1",children:e.sentence}),t.jsx("span",{className:"shrink-0 font-mono text-ink-dim",children:e.code})]})}),ns=4,fe={kind:"idle"};function as(e){switch(e.kind){case"dragging":case"settling":return e.payload.session.id;case"pressing":return null;default:return null}}function Q(e,s){switch(s.kind){case"press":return e.kind!=="idle"?e:{kind:"pressing",payload:s.payload,originX:s.x,originY:s.y,pointerId:s.pointerId};case"move":return e.kind==="pressing"?Math.max(Math.abs(s.x-e.originX),Math.abs(s.y-e.originY))<ns?e:{kind:"dragging",payload:e.payload,x:s.x,y:s.y,target:s.target,pointerId:e.pointerId}:e.kind==="dragging"?{...e,x:s.x,y:s.y,target:s.target}:e;case"release":return e.kind==="dragging"?{kind:"settling",payload:e.payload,target:e.target}:e.kind==="pressing"?fe:e;case"cancel":case"settled":return fe;default:return e}}const is=({edges:e,geometry:s,selectedDeviceId:i})=>t.jsx("svg",{"aria-hidden":"true",className:"pointer-events-none absolute top-0 left-0 overflow-visible",width:s.bounds.width,height:s.bounds.height,children:e.map(a=>{const d=s.networks.get(a.networkId),u=s.devices.get(a.deviceId);if(!d||!u)return null;const p=i!==null&&a.deviceId===i;return t.jsx("path",{"data-mesh-edge":a.key,d:vt(d,u),fill:"none",strokeWidth:p?2:1.5,strokeDasharray:a.active?void 0:"4 4",className:p?"stroke-ink":"stroke-ink-dim"},a.key)})}),rs={self:"border-l-hairline",reached:"border-l-hairline",unanswered:"border-l-warning","not-attempted":"border-l-hairline",unknown:"border-l-hairline"};function ls(e){return e.suspect?"border-l-danger":rs[oe(e)]}const os={self:"ring-2 ring-accent",reachable:null,unreachable:null,suspect:null},ds={accept:"border-accent bg-accent-wash",refuse:"border-warning"};function cs(e,s,i){return[e.label,Fe(e,s),i].filter(Boolean).join(", ")}function ee(e){return e.name.trim()||e.id.slice(-6)}function Ge(e,s,i){if(i!=="reached"&&i!=="self"){const a=de(i);return e.unreachable_reason?`${a} (${e.unreachable_reason})`:a}return e.live_state.trim()?e.live_state.trim():e.locality==="local"?"on this device":`on ${s}`}const us={resting:"border-l-2 border-l-hairline",attention:"border-l-2 border-l-warning"},ms=({network:e,x:s,y:i,refused:a})=>t.jsxs("li",{"data-mesh-network":e.id,"data-mesh-network-refused":a?"true":void 0,className:R("absolute flex items-center gap-2 rounded-md border bg-elevated px-3",a?"border-warning":"border-hairline"),style:{left:s,top:i,width:ye,height:kt},children:[t.jsx(je,{"aria-hidden":"true",className:"size-4 shrink-0 text-ink-muted"}),t.jsxs("span",{className:"min-w-0 flex-1",children:[t.jsx("span",{className:"block truncate text-body-sm text-ink",children:e.label}),t.jsxs("span",{title:`epoch ${e.epoch}`,className:"block truncate text-meta text-ink-dim",children:[e.memberCount," ",e.memberCount===1?"device":"devices",e.revokedCount>0?` · ${e.revokedCount} revoked`:""]})]})]}),hs=({device:e,x:s,y:i,nowSeconds:a,selected:d,sessions:u,sessionTotal:p,dropState:r,movingSessionId:f,draggedSessionId:v,onOpen:j,onChipPointerDown:N,onChipClick:y,onShowAllSessions:l})=>{const{activity:c}=wt(e,u.rows),o=c==="working",I=cs(e,a,o?"working":null),k=oe(e);return t.jsxs("li",{"data-mesh-device":e.id,"data-mesh-state":e.state,"data-mesh-drop":r??void 0,"aria-current":d?"true":void 0,className:R("absolute flex flex-col rounded-md border border-l-4 border-control bg-elevated","hover:bg-row-hover",d&&"border-y-ink border-r-ink bg-row-selected",ls(e),os[e.state],r&&ds[r]),style:{left:s,top:i,width:ye,height:jt},children:[t.jsxs("button",{type:"button","data-mesh-device-open":e.id,"data-mesh-reach":k,"aria-label":I,title:Nt(e),onClick:()=>j(e.id),className:R("flex w-full flex-col justify-between rounded-t-[5px] px-3 pt-2 pb-2 text-left","cursor-pointer","focus-visible:outline focus-visible:outline-2 focus-visible:outline-accent focus-visible:outline-offset-[-2px]"),style:{height:yt},children:[t.jsxs("span",{className:"flex w-full min-w-0 items-center gap-2",children:[t.jsx(Je,{"aria-hidden":"true",className:"size-4 shrink-0 text-ink-muted"}),t.jsx("span",{className:"min-w-0 flex-1 truncate text-body-sm text-ink",children:e.label}),e.suspect&&t.jsx(Ne,{"aria-hidden":"true",className:"size-3.5 shrink-0 text-danger"})]}),t.jsxs("span",{className:"flex w-full min-w-0 items-baseline gap-1",children:[t.jsx("span",{className:"w-3 shrink-0 font-mono text-body-sm text-ink tabular-nums",children:e.sessionCount??"–"}),t.jsx("span",{className:R("min-w-0 truncate text-meta",e.sessionCount===null?"text-ink-dim":"text-ink-muted"),children:we(e.sessionCount)})]}),t.jsxs("span",{"data-mesh-state-line":"",className:"flex w-full min-w-0 items-baseline gap-1.5 text-meta",children:[t.jsx("span",{"aria-hidden":"true",className:"shrink-0 text-ink-dim",children:It[k]}),t.jsx("span",{className:R("shrink-0",Be[k]),children:de(k)}),o&&t.jsx("span",{"data-mesh-working":"",className:"shrink-0 text-info",children:"working"}),e.memberships.length>1&&t.jsxs("span",{className:"min-w-0 truncate text-ink-dim",children:["· ",e.memberships.length," networks"]})]})]}),t.jsxs("ul",{"aria-label":`Conversations on ${e.label}`,className:R("m-0 flex h-6 list-none items-center gap-1 overflow-hidden px-3",r==="accept"&&"opacity-40"),children:[u.shown.map(h=>t.jsx(ps,{session:h,ownerLabel:e.label,ownerReach:k,ownerReachable:e.reachable,moving:f===h.id,dragging:v===h.id,onPointerDown:N,onClick:()=>y(h)},h.id)),u.hidden>0&&t.jsx("li",{className:"shrink-0",children:t.jsxs("button",{type:"button","data-mesh-more":e.id,onClick:()=>l(e.id),className:R("flex min-h-6 items-center rounded-sm px-1.5 text-meta text-ink-dim","hover:bg-row-hover hover:text-ink","focus-visible:outline focus-visible:outline-2 focus-visible:outline-accent focus-visible:outline-offset-2"),title:`Showing ${u.shown.length} of ${p} conversations`,"aria-label":`Show all ${p} conversations`,children:["+",u.hidden]})})]})]})},ps=({session:e,ownerLabel:s,ownerReach:i,ownerReachable:a,moving:d,dragging:u,onPointerDown:p,onClick:r})=>{const f=Ge(e,s,i);return d?t.jsx("li",{role:"status","data-mesh-session":e.id,"data-mesh-moving":"true",children:t.jsx("span",{className:"flex min-h-6 items-center rounded-sm bg-sunken px-1.5 text-meta text-ink-muted",children:"moving…"})}):t.jsx("li",{className:"min-w-0 flex-1","data-mesh-session-item":e.id,"data-mesh-dragging":u?"true":void 0,children:t.jsx("button",{type:"button","data-mesh-session":e.id,style:{touchAction:"none"},title:`${ee(e)} · ${f}`,"aria-label":`${ee(e)}, ${f}. Opens ${s}.`,onPointerDown:v=>p(v,e),onClick:()=>r(e),className:R("flex min-h-6 w-full max-w-32 items-center rounded-sm border border-hairline bg-surface px-1.5 text-left text-meta text-ink-muted","cursor-grab active:cursor-grabbing","hover:text-ink",us[Ct(e,a)],u&&"opacity-60","focus-visible:outline focus-visible:outline-2 focus-visible:outline-accent focus-visible:outline-offset-2"),children:t.jsx("span",{className:"min-w-0 flex-1 truncate",children:ee(e)})})})};function _e(e){const s=e.trim();if(!s)return null;if(s.startsWith("[")){const a=s.indexOf("]");if(a<=1)return null;const d=s.slice(1,a),u=s.slice(a+1);if(!u)return{host:d,port:null};if(!u.startsWith(":"))return null;const p=Number(u.slice(1));return{host:d,port:Number.isInteger(p)?p:null}}const i=s.lastIndexOf(":");if(i>0){const a=s.slice(i+1);if(/^\d+$/.test(a))return{host:s.slice(0,i),port:Number(a)}}return{host:s,port:null}}function Re(e){const s=e.trim().split(".");if(s.length!==4)return null;for(const i of s)if(!/^\d{1,3}$/.test(i)||Number(i)>255)return null;return`${s[0]}.${s[1]}.${s[2]}`}function xs(e){return`${e}.x`}function fs(e){const s=new Map;for(const a of e.values())for(const d of a)s.set(d,(s.get(d)??0)+1);const i=new Set;for(const[a,d]of s)d>1&&i.add(a);return i}function ke(e){return new Set(e.endpoints.map(s=>s.trim()).filter(Boolean))}function bs(e,s){const i=e.filter(l=>l.id!==s),a=e.find(l=>l.id===s)??null,d=new Map;for(const l of e)d.set(l.id,ke(l));const u=fs(d),p=new Set;for(const l of a?ke(a):[]){if(u.has(l))continue;const c=_e(l),o=c?Re(c.host):null;o&&p.add(o)}const r=l=>{const c=new Set;for(const o of ke(l)){if(u.has(o))continue;const I=_e(o),k=I?Re(I.host):null;k&&c.add(k)}return c},f=new Map,v=new Map;for(const l of i){const c=gs(l);if(c){f.set(c,[...f.get(c)??[],l.id]);continue}for(const o of r(l))v.set(o,[...v.get(o)??[],l.id])}const j=new Map(e.map((l,c)=>[l.id,c])),N=l=>[...l].sort((c,o)=>(j.get(c)??0)-(j.get(o)??0)),y=[];for(const[l,c]of f)y.push({prefix:l,tier:"declared",deviceIds:N(c),words:"declared"});for(const[l,c]of v)p.has(l)?y.push({prefix:l,tier:"shared",deviceIds:N(c),words:"shared with this device"}):c.length>1&&y.push({prefix:l,tier:"probable",deviceIds:N(c),words:"same prefix"});return y.sort((l,c)=>l.tier.localeCompare(c.tier)||l.prefix.localeCompare(c.prefix))}function gs(e){for(const s of e.memberships){const i=s.scope.trim();if(i)return i}return""}const $e={declared:0,shared:1,probable:2};function vs(e,s){const i=new Map;for(const d of e){let u=null;for(const r of d.deviceIds){const f=s.get(r);f!==void 0&&(u===null||f<u.slot)&&(u={id:r,slot:f})}if(u===null)continue;const p=i.get(u.id);p===void 0?i.set(u.id,{slot:u.slot,groups:[d]}):p.groups.push(d)}const a=d=>{let u=-1;for(const p of d.deviceIds){const r=s.get(p);r!==void 0&&r>u&&(u=r)}return u};return[...i.entries()].sort((d,u)=>d[1].slot-u[1].slot).map(([d,u])=>({deviceId:d,groups:u.groups.sort((p,r)=>a(r)-a(p)||$e[p.tier]-$e[r.tier]||p.prefix.localeCompare(r.prefix))}))}function ks(e){return new Map(e.map(s=>[s.deviceId,s.groups.length]))}function ws(e){return`${e.tier==="declared"?e.prefix:xs(e.prefix)} · ${e.words}`}const Le=(e,s)=>e.deviceIds.map(i=>s.devices.get(i)).filter(i=>i!==void 0),js=({stacks:e,geometry:s})=>t.jsx("div",{"aria-hidden":"true",className:"pointer-events-none absolute top-0 left-0",children:e.map(i=>{const a=i.groups.length,d=new Array(a).fill(0);let u=null;for(let r=a-1;r>=0;r-=1){const f=Le(i.groups[r],s),v=(f.length===0?0:Math.max(...f.map(j=>j.y+j.height)))+me;u=u===null?v:Math.max(v,u+ge),d[r]=u}const p=s.devices.get(i.deviceId);return i.groups.map((r,f)=>{const v=Le(r,s);if(v.length===0)return null;const j=a-1-f,N=Math.min(...v.map(k=>k.x)),y=Math.max(...v.map(k=>k.x)),c=(p?.y??Math.min(...v.map(k=>k.y)))-me-St*j,o=r.tier==="declared",I=ws(r);return t.jsx("div",{"data-mesh-scope":`${r.tier}:${r.prefix}`,"data-mesh-scope-level":f,className:R("absolute rounded-lg",r.tier==="probable"?"border border-dashed border-hairline-strong":"border border-control"),style:{left:N-me-ge*j,top:c,width:y+ye-N+(me+ge*j)*2,height:d[f]-c},children:t.jsx("span",{"data-mesh-scope-label":"",className:R("absolute bottom-full left-1 mb-0.5 whitespace-nowrap text-meta",r.tier==="probable"?"text-ink-dim":"text-ink-muted",o&&"font-medium"),children:I})},`${r.tier}:${r.prefix}`)})})}),Pe=48,Te=1.25,ys=.0015,Ns=({graph:e,slots:s,nowSeconds:i,selectedDeviceId:a,sessions:d,sessionTotals:u,movingSessionId:p,canMove:r,onOpenDevice:f,onAskMove:v,onDropRefused:j,onShowAllSessions:N,summaryId:y})=>{const l=x.useRef(null),[c,o]=x.useState({width:0,height:0,clipWidth:0,clipHeight:0,left:0,top:0}),[I,k]=x.useState({k:1,tx:0,ty:0}),h=x.useRef(!1),S=x.useRef(!1),D=x.useRef(null),P=x.useMemo(()=>bs(e.devices,e.selfDeviceId),[e.devices,e.selfDeviceId]),C=x.useMemo(()=>vs(P,s.devices),[P,s]),M=x.useMemo(()=>Mt(s,ks(C)),[s,C]),B=x.useMemo(()=>({selfDeviceId:e.selfDeviceId,devices:new Map(e.devices.map(n=>[n.id,n])),networks:new Map(e.networks.map(n=>[n.id,n]))}),[e]),[w,W]=x.useState(fe),te=x.useRef({kind:"ground"}),z=x.useCallback((n,m)=>{const b=document.elementFromPoint(n,m),E=b?.closest("[data-mesh-device]");if(E){const G=E.getAttribute("data-mesh-device");if(G)return{kind:"device",deviceId:G}}const O=b?.closest("[data-mesh-network]");if(O){const G=O.getAttribute("data-mesh-network");if(G)return{kind:"network",networkId:G}}return{kind:"ground"}},[]),L=x.useMemo(()=>w.kind!=="dragging"&&w.kind!=="settling"?null:xe(w.payload,w.target,B),[w,B]),se=x.useCallback(n=>{if(!L)return null;if(L.kind==="plan"){const m=w.kind==="dragging"||w.kind==="settling"?w.target:null;return m&&m.kind==="device"&&m.deviceId===n?"accept":null}if(L.kind==="refused"){const m=w.kind==="dragging"||w.kind==="settling"?w.target:null;return m&&m.kind==="device"&&m.deviceId===n?"refuse":null}return null},[L,w]),ne=x.useCallback((n,m)=>{if(!r||n.button!==0)return;S.current=!1;const b=m.locality==="local"?e.selfDeviceId??"":m.owner_device,E=B.devices.get(b),O={session:m,ownerDeviceId:b,ownerLabel:E?.label??m.owner_device_name};try{n.currentTarget.setPointerCapture(n.pointerId)}catch{}W(G=>Q(G,{kind:"press",payload:O,x:n.clientX,y:n.clientY,pointerId:n.pointerId}))},[r,B,e.selfDeviceId]),ie=n=>{if(w.kind==="pressing"||w.kind==="dragging"){const m=z(n.clientX,n.clientY);te.current=m,W(b=>Q(b,{kind:"move",x:n.clientX,y:n.clientY,target:m}));return}ce(n)},re=n=>{if(J(n),w.kind!=="pressing"&&w.kind!=="dragging")return;if(w.kind==="pressing"){W(b=>Q(b,{kind:"cancel"}));return}const m=xe(w.payload,w.target,B);S.current=!0,W(b=>Q(b,{kind:"release"})),m.kind==="plan"?v({plan:m.plan,alternatives:m.alternatives,risky:m.risky}):m.kind==="refused"&&j({code:m.code,sentence:m.sentence,remedy:m.remedy,plan:m.plan??null}),W(b=>Q(b,{kind:"settled"}))};x.useEffect(()=>()=>W(fe),[]);const Z=x.useCallback(()=>{k(Ae(M.bounds,c))},[M.bounds,c]);x.useEffect(()=>{const n=l.current;if(!n)return;const m=()=>{const E=n.getBoundingClientRect();o({width:E.width,height:E.height,clipWidth:n.clientWidth,clipHeight:n.clientHeight,left:E.left,top:E.top})};m();const b=new ResizeObserver(m);return b.observe(n),()=>b.disconnect()},[]),x.useEffect(()=>{h.current||c.width<=0||c.height<=0||(h.current=!0,k(Ae(M.bounds,c)))},[c,M.bounds]),x.useEffect(()=>{const n=D.current;if(D.current={width:c.width,height:c.height},!n||!h.current||c.width<=0||c.height<=0||c.width>=n.width&&c.height>=n.height||!a)return;const m=M.devices.get(a);m&&k(b=>{const E={width:c.clipWidth,height:c.clipHeight},O=Math.max(0,Math.min(E.width-M.bounds.width*b.k,E.height-M.bounds.height*b.k));return Dt(b,m,E,Math.min(Et,O))})},[c,a,M]);const F=w.kind==="dragging"?{x:w.x-c.left+12,y:w.y-c.top+12}:{x:0,y:0},K=L?At(L):null,g=x.useRef(null),A=x.useRef(null),$=x.useRef(null),T=x.useRef(null),_=x.useCallback(()=>{$.current=null;const n=g.current,m=A.current;if(g.current=null,A.current=null,n){const b=T.current;if(!b)return;k({k:b.transform.k,tx:b.transform.tx+(n.x-b.x),ty:b.transform.ty+(n.y-b.y)});return}m&&k(b=>ve(b,{x:m.x,y:m.y},b.k*Math.exp(-m.deltaY*ys)))},[]),Y=x.useCallback(()=>{$.current===null&&($.current=requestAnimationFrame(_))},[_]);x.useEffect(()=>()=>{$.current!==null&&cancelAnimationFrame($.current)},[]);const U=n=>{!(n.target===n.currentTarget)&&n.button!==1||n.button!==0&&n.button!==1||(T.current={x:n.clientX,y:n.clientY,transform:I},n.currentTarget.setPointerCapture(n.pointerId),n.preventDefault())},ce=n=>{T.current&&(g.current={x:n.clientX,y:n.clientY},Y())},J=n=>{T.current&&(T.current=null,g.current=null,n.currentTarget.hasPointerCapture(n.pointerId)&&n.currentTarget.releasePointerCapture(n.pointerId))},X=x.useCallback(n=>{if(n.deltaY===0)return;n.preventDefault();const m=n.currentTarget.getBoundingClientRect();A.current={x:n.clientX-m.left,y:n.clientY-m.top,deltaY:n.deltaY},Y()},[Y]);x.useEffect(()=>{const n=l.current;if(n)return n.addEventListener("wheel",X,{passive:!1}),()=>n.removeEventListener("wheel",X)},[X]);const ue=n=>{const m=n.shiftKey?Pe*4:Pe;switch(n.key){case"Escape":if(w.kind!=="pressing"&&w.kind!=="dragging")return;n.preventDefault(),w.kind==="dragging"&&(S.current=!0),W(b=>Q(b,{kind:"cancel"}));return;case"0":n.preventDefault(),Z();return;case"+":case"=":n.preventDefault(),k(b=>ve(b,{x:c.width/2,y:c.height/2},b.k*Te));return;case"-":case"_":n.preventDefault(),k(b=>ve(b,{x:c.width/2,y:c.height/2},b.k/Te));return;case"ArrowLeft":case"ArrowRight":case"ArrowUp":case"ArrowDown":{n.preventDefault();const b=n.key==="ArrowLeft"?m:n.key==="ArrowRight"?-m:0,E=n.key==="ArrowUp"?m:n.key==="ArrowDown"?-m:0;k(O=>({...O,tx:O.tx+b,ty:O.ty+E}));return}}};return t.jsxs("div",{ref:l,"data-mesh-canvas":"",role:"group","aria-labelledby":y,tabIndex:0,onPointerDown:U,onPointerMove:ie,onPointerUp:re,onPointerCancel:n=>{w.kind==="dragging"&&(S.current=!0),W(m=>Q(m,{kind:"cancel"})),J(n)},"data-mesh-gesture":w.kind,onKeyDown:ue,onDoubleClick:n=>{n.target===n.currentTarget&&Z()},className:R("relative min-h-0 flex-1 overflow-hidden rounded-lg border border-hairline bg-sunken","[touch-action:none]","cursor-grab active:cursor-grabbing","focus-visible:outline focus-visible:outline-2 focus-visible:outline-accent focus-visible:outline-offset-[-2px]"),children:[t.jsx("div",{"data-mesh-ground":"","aria-hidden":"true",className:"mesh-ground pointer-events-none absolute inset-0",style:{backgroundPosition:`${I.tx}px ${I.ty}px`}}),t.jsxs("div",{"data-mesh-world":"",className:"absolute top-0 left-0",style:{transform:`translate3d(${I.tx}px, ${I.ty}px, 0) scale(${I.k})`,transformOrigin:"0 0",width:M.bounds.width,height:M.bounds.height},children:[t.jsx(js,{stacks:C,geometry:M}),t.jsx(is,{edges:e.edges,geometry:M,selectedDeviceId:a}),t.jsx("ul",{"aria-label":"Networks",className:"m-0 list-none p-0",children:e.networks.map(n=>{const m=M.networks.get(n.id);return m?t.jsx(ms,{network:n,x:m.x,y:m.y,refused:L?.kind==="refused"&&w.kind==="dragging"&&w.target.kind==="network"&&w.target.networkId===n.id},n.id):null})}),t.jsx("ul",{"aria-label":"Devices",className:"m-0 list-none p-0",children:e.devices.map(n=>{const m=M.devices.get(n.id);return m?t.jsx(hs,{device:n,x:m.x,y:m.y,nowSeconds:i,selected:n.id===a,sessions:d.get(n.id)??{rows:[],shown:[],hidden:0},sessionTotal:u.get(n.id)??n.sessionCount??0,dropState:se(n.id),movingSessionId:p,draggedSessionId:as(w),onOpen:f,onChipPointerDown:ne,onChipClick:()=>{if(S.current){S.current=!1;return}f(n.id)},onShowAllSessions:N},n.id):null})})]}),w.kind==="dragging"&&t.jsx("div",{"data-mesh-ghost":"","aria-hidden":"true",className:"pointer-events-none absolute z-10 max-w-40 truncate rounded-sm border border-ink-dim bg-surface px-1.5 py-0.5 text-meta text-ink",style:{left:F.x,top:F.y},children:w.payload.session.name||"untitled"}),w.kind==="dragging"&&K&&t.jsx("div",{"data-mesh-indicator":"",className:R("pointer-events-none absolute z-10 rounded-sm border bg-surface px-2 py-1 text-meta",L?.kind==="refused"?"border-warning text-warning":"border-control text-ink"),style:{left:F.x,maxWidth:Math.max(160,c.width-F.x-12),...F.y>c.height*.6?{bottom:Math.max(12,c.height-F.y+8)}:{top:F.y+24}},children:K})]})};function Is(e,s,i,a){const d=i.locality==="local"?s:i.owner_device,u=[];for(const p of e)if(p.id!==d){if(p.id===s){u.push({deviceId:p.id,label:a,verb:"Recall to this device",keepVerb:"Copy here, leave it there"});continue}u.push({deviceId:p.id,label:p.label,verb:`Move to ${p.label}`,keepVerb:`Copy to ${p.label}`})}return u}function Cs(e,s,i){return Is(e.devices,e.selfDeviceId,s,i)}function Ve(e,s,i){const a=Cs(e,s,i),d={selfDeviceId:e.selfDeviceId,devices:new Map(e.devices.map(r=>[r.id,r])),networks:new Map(e.networks.map(r=>[r.id,r]))},u=s.locality==="local"?e.selfDeviceId??"":s.owner_device,p=d.devices.get(u);return a.map(r=>{const f=xe({session:s,ownerDeviceId:u,ownerLabel:p?.label??s.owner_device_name},{kind:"device",deviceId:r.deviceId},d);return{...r,refused:f.kind==="refused"&&f.code!=="busy"?f.sentence:null}})}const Ke=({session:e,destinations:s,disabled:i,onChoose:a,onOpenChange:d,trigger:u,triggerLabel:p})=>t.jsxs(at,{onOpenChange:d,children:[t.jsx(it,{asChild:!0,children:t.jsx("button",{type:"button","aria-label":p,"data-mesh-session-menu":e.id,disabled:i||s.length===0,className:"rounded-sm focus-visible:outline focus-visible:outline-2 focus-visible:outline-accent focus-visible:outline-offset-2 disabled:text-ink-disabled",children:u})}),t.jsxs(rt,{align:"start",className:"min-w-56",children:[t.jsx(lt,{children:ee(e)}),t.jsx(Se,{}),s.map(r=>t.jsx(Me,{"data-mesh-move-to":r.deviceId,disabled:!!r.refused,title:r.refused??void 0,onSelect:()=>a(r,!1),children:r.verb},r.deviceId)),t.jsx(Se,{}),s.map(r=>t.jsx(Me,{"data-mesh-copy-to":r.deviceId,disabled:!!r.refused,title:r.refused??void 0,onSelect:()=>a(r,!0),children:r.keepVerb},`keep-${r.deviceId}`))]})]}),Ss=({device:e,sessions:s,sessionTotal:i,nowSeconds:a,destinationsFor:d,movingSessionId:u,canMove:p,canInvite:r,onClose:f,onMove:v,onShowInList:j,onInvite:N,onRemoveMember:y})=>{const l=oe(e);x.useEffect(()=>{const h=S=>{S.key!=="Escape"||S.defaultPrevented||S.target?.closest('[role="menu"],[role="dialog"]')||(document.querySelector(`[data-mesh-device-open="${e.id}"]`)?.focus(),f())};return window.addEventListener("keydown",h),()=>window.removeEventListener("keydown",h)},[e.id,f]);const c=e.memberships.every(h=>!h.active),o=e.sessionCount===null?we(null):`${e.sessionCount} ${we(e.sessionCount)}`,I=e.suspect?Ye:[c?"revoked membership":o,de(l)].filter(Boolean).join(" · "),k=i>s.rows.length?`${s.rows.length} of ${i}`:`${s.rows.length}`;return t.jsxs("aside",{"aria-label":`${e.label} details`,"data-mesh-panel":e.id,className:"flex w-80 shrink-0 flex-col gap-3 overflow-y-auto rounded-md border border-hairline bg-surface p-4",children:[t.jsxs("header",{className:"flex flex-col gap-1",children:[t.jsx(q,{size:"sm",variant:"ghost",className:"w-fit self-end","data-mesh-panel-close":"",onClick:f,children:"Close"}),t.jsx("h2",{className:"text-body-sm text-ink",children:e.label}),t.jsxs("p",{className:"flex items-center gap-1.5 text-meta text-ink-muted",children:[e.suspect&&t.jsx(Ne,{"aria-hidden":"true",className:"size-3.5 text-danger"}),!e.suspect&&l==="unanswered"&&t.jsx(nt,{"aria-hidden":"true",className:"size-3.5 text-warning"}),I]})]}),t.jsx(ae,{}),t.jsxs("section",{className:"flex flex-col gap-2",children:[t.jsx("h3",{className:"text-meta text-ink-dim",children:"Memberships"}),t.jsx("ul",{className:"m-0 flex list-none flex-col gap-2 p-0",children:e.memberships.map(h=>t.jsxs("li",{className:"flex flex-col gap-1",children:[t.jsxs("span",{className:"flex items-center gap-2 text-body-sm text-ink",children:[t.jsx(je,{"aria-hidden":"true",className:"size-3.5 text-ink-muted"}),h.networkName]}),t.jsxs("span",{className:"text-meta text-ink-dim",children:[h.role||"member",h.capabilities.length>0?` · ${h.capabilities.join(", ")}`:"",h.active?"":" · revoked"]}),r&&h.active&&t.jsxs(q,{size:"sm",variant:"ghost",className:"w-fit","data-mesh-remove-member":`${h.networkId}:${e.id}`,onClick:()=>y(e,h.networkId),children:["Remove from ",h.networkName,"…"]})]},h.networkId))}),r&&t.jsx(q,{size:"sm",variant:"secondary",className:"w-fit","data-mesh-invite":e.id,onClick:()=>N(e),children:"Invite to a network…"})]}),t.jsx(ae,{}),t.jsxs("section",{className:"flex shrink-0 flex-col gap-2",children:[t.jsxs("h3",{className:"text-meta text-ink-dim",children:["Conversations ",t.jsxs("span",{className:"text-ink-disabled",children:["(",k,")"]})]}),s.rows.length===0?t.jsx("p",{className:"text-meta text-ink-dim",children:e.sessionCount===null?"This device did not report its conversations.":"No conversations here."}):t.jsx("ul",{className:"m-0 flex list-none flex-col gap-1 p-0",children:s.rows.map(h=>t.jsxs("li",{"data-mesh-panel-session":h.id,className:R("flex items-center gap-2 rounded-sm px-2 py-1","border border-hairline bg-elevated",u===h.id&&"border-control"),children:[t.jsx("span",{className:"min-w-0 flex-1 truncate text-body-sm text-ink",title:ee(h),children:ee(h)}),t.jsx("span",{className:"shrink-0 text-meta text-ink-dim",children:Ge(h,e.label,oe(e))}),u===h.id?t.jsx("span",{className:"shrink-0 text-meta text-ink-muted",children:"moving…"}):t.jsx(Ke,{session:h,destinations:d(h),disabled:!p,onChoose:(S,D)=>v(h,S,D),trigger:t.jsx(He,{"aria-hidden":"true",className:"size-4"}),triggerLabel:`Move ${ee(h)}`})]},h.id))})]}),t.jsx(ae,{}),t.jsxs("section",{className:"flex flex-col gap-2",children:[t.jsx("h3",{className:"text-meta text-ink-dim",children:"Network addresses"}),e.endpoints.length===0?t.jsx("p",{className:"text-meta text-ink-dim",children:"No address published."}):t.jsx("ul",{className:"m-0 flex list-none flex-col gap-1 p-0",children:e.endpoints.map(h=>t.jsxs("li",{className:"flex items-baseline justify-between gap-2",children:[t.jsx("span",{className:"min-w-0 truncate font-mono text-body-sm text-ink",children:h}),t.jsx("span",{className:"shrink-0 text-meta text-ink-dim",children:"advertised"})]},h))})]}),t.jsx(ae,{}),t.jsxs("section",{className:"flex flex-col gap-2",children:[t.jsx("h3",{className:"text-meta text-ink-dim",children:"Status"}),t.jsxs("dl",{className:"m-0 flex flex-col gap-1",children:[t.jsxs("div",{className:"flex items-baseline justify-between gap-2",children:[t.jsx("dt",{className:"text-meta text-ink-dim",children:"Reach"}),t.jsx("dd",{className:"m-0 text-body-sm text-ink",children:de(l)})]}),t.jsxs("div",{className:"flex items-baseline justify-between gap-2",children:[t.jsx("dt",{className:"text-meta text-ink-dim",children:"Last status frame"}),t.jsx("dd",{className:"m-0 text-body-sm text-ink",children:e.lastSeenAt===null?"never":_t(a-e.lastSeenAt)})]})]}),e.reason&&t.jsx("p",{className:"text-meta text-warning",children:e.reason})]}),t.jsx(ae,{}),t.jsx(q,{size:"sm",variant:"ghost",className:"w-fit","data-mesh-show-in-list":e.id,onClick:()=>j(e.id),children:"Show in list"})]})},Ms=["name","chats","state"],Ds={name:"Name",chats:"Conversations",state:"State"},Oe={suspect:0,unreachable:1,self:2,reachable:3};function As(e,s){const i=[...e];switch(s){case"chats":return i.sort((a,d)=>(d.sessionCount??-1)-(a.sessionCount??-1)||a.label.localeCompare(d.label)),i;case"state":return i.sort((a,d)=>Oe[a.state]-Oe[d.state]||a.label.localeCompare(d.label)),i;default:return i.sort((a,d)=>a.label.localeCompare(d.label))}}const We=8;function Es(e,s){if(e.locality==="local")return e.live_state||"here";const i=e.owner_device_name||s,a=e.live_state?` · ${e.live_state}`:"";return e.reachable?`on ${i}${a}`:`on ${i} (not answering)`}const _s=({graph:e,nowSeconds:s,selectedDeviceId:i,sessions:a,selfLabel:d,canMove:u,onSelect:p,onMove:r,onInvite:f,onRemove:v})=>{const[j,N]=x.useState("name"),y=x.useMemo(()=>e.networks.map(l=>({network:l,members:As(e.devices.filter(c=>c.memberships.some(o=>o.networkId===l.id)),j)})),[e,j]);return t.jsxs("div",{className:"flex min-h-0 flex-1 flex-col gap-4 overflow-y-auto pr-1",children:[t.jsxs("fieldset",{className:"m-0 w-fit border-0 p-0",children:[t.jsx("legend",{className:"sr-only",children:"Sort devices by"}),t.jsx("div",{className:"flex gap-0.5 rounded-md bg-sunken p-0.5",children:Ms.map(l=>t.jsx("button",{type:"button","aria-pressed":j===l,onClick:()=>N(l),className:R("h-6 rounded-sm px-3 text-body-sm text-ink-muted transition-colors duration-fast ease-out-quart","hover:text-ink","focus-visible:outline focus-visible:outline-2 focus-visible:outline-accent focus-visible:outline-offset-2",j===l&&"bg-surface text-ink"),children:Ds[l]},l))})]}),y.map(({network:l,members:c})=>t.jsxs("section",{"data-mesh-network-group":l.id,className:"flex flex-col gap-2",children:[t.jsxs("h2",{className:"flex flex-wrap items-baseline gap-2 text-body-sm text-ink",title:`epoch ${l.epoch}`,children:[l.label,t.jsxs("span",{className:"text-meta text-ink-dim",children:[l.trust," · ",l.memberCount," ",l.memberCount===1?"device":"devices",l.revokedCount>0?` · ${l.revokedCount} revoked`:""]})]}),t.jsx("ul",{className:"m-0 flex list-none flex-col gap-1 p-0",children:c.map(o=>{const I=o.memberships.find(C=>C.networkId===l.id),k=o.id===i,h=a.get(o.id),S=h?.rows??[],D=h?qe(h,o.sessionCount):o.sessionCount??0,P=oe(o);return t.jsxs("li",{"data-mesh-device-row":o.id,"data-mesh-state":o.state,"aria-current":k?"true":void 0,className:R("flex flex-col gap-1 rounded-md px-3 py-2","border border-hairline bg-surface",k&&"border-ink bg-row-selected"),children:[t.jsxs("div",{className:"flex flex-wrap items-baseline gap-x-3 gap-y-1",children:[t.jsx("button",{type:"button","data-mesh-device-open":o.id,onClick:()=>p(o.id),className:R("min-w-0 flex-1 truncate text-left text-body-sm text-ink","hover:text-ink-muted","focus-visible:outline focus-visible:outline-2 focus-visible:outline-accent focus-visible:outline-offset-2"),children:o.label}),t.jsxs("span",{className:R("flex shrink-0 items-center gap-1 text-meta",Be[P]),"data-mesh-reach":P,children:[o.suspect&&t.jsx(Ne,{"aria-hidden":"true",className:"size-3.5 shrink-0 text-danger"}),o.suspect?de(P):Fe(o,s),o.suspect&&t.jsx("span",{className:"shrink-0 rounded-sm border border-danger px-1 text-danger",children:Ye})]}),t.jsxs("span",{className:"shrink-0 text-meta text-ink-dim",children:[I?.role?`${I.role} · `:"",I&&!I.active?"revoked":"member"]})]}),S.length>0?t.jsxs(t.Fragment,{children:[t.jsx(ae,{className:"my-1"}),t.jsx("ul",{className:"m-0 flex list-none flex-col gap-0.5 p-0",children:S.slice(0,We).map(C=>t.jsxs("li",{"data-mesh-row-session":C.id,className:"flex items-center gap-2 py-0.5",children:[t.jsx("span",{className:"min-w-0 flex-1 truncate text-meta text-ink-muted",children:C.name||C.id}),t.jsx("span",{className:"shrink-0 text-meta text-ink-dim",children:Es(C,d)}),t.jsx(Ke,{session:C,destinations:Ve(e,C,d),disabled:!u,onChoose:(M,B)=>r(C,M,B),trigger:t.jsx(He,{"aria-hidden":"true",className:"size-3.5"}),triggerLabel:`Move ${C.name||C.id}`})]},C.id))}),D>S.slice(0,We).length&&t.jsx("button",{type:"button",onClick:()=>p(o.id),className:"w-fit text-meta text-ink-dim hover:text-ink",children:`show all ${D} in the panel`})]}):t.jsx("span",{className:"text-meta text-ink-dim",children:D===0?"no conversations":D===1?"1 conversation":`${D} conversations`}),(I?.active||o.state!=="self")&&t.jsxs("div",{className:"flex flex-wrap items-center gap-1",children:[t.jsx(q,{size:"sm",variant:"ghost","data-mesh-invite":o.id,onClick:()=>f({deviceId:o.id,deviceLabel:o.label}),children:"Invite to a network…"}),I?.active&&t.jsxs(q,{size:"sm",variant:"ghost","data-mesh-remove-member":`${l.id}:${o.id}`,onClick:()=>v({networkId:l.id,networkLabel:l.label,deviceId:o.id,deviceLabel:o.label}),children:["Remove from ",l.label,"…"]})]})]},o.id)})})]},l.id)),e.unmatchedPeers.length>0&&t.jsxs("p",{className:"text-meta text-warning",children:[e.unmatchedPeers.length," ",e.unmatchedPeers.length===1?"device":"devices"," answered the peer read but is in no network this app can name."]})]})},Rs=["canvas","list"],$s={canvas:"Canvas",list:"List"},Ls=({state:e,graph:s,nowSeconds:i,checking:a,staleError:d,onRetry:u,approvals:p,sessions:r,sessionError:f,selfLabel:v,movingSessionId:j,canMove:N,pendingMove:y,onAskMove:l,onDropRefused:c,onChooseMove:o,onCancelMove:I,moveBusy:k,moveReport:h,onDismissReport:S,onWaitForIdle:D,onUndoCopy:P,invite:C,onOpenInvite:M,onInvite:B,onCloseInvite:w,inviteBusy:W,inviteReceipt:te,inviteRefusal:z,remove:L,onOpenRemove:se,onRemove:ne,onCloseRemove:ie,removeBusy:re,removeRefusal:Z,removed:F})=>{const[K,g]=x.useState("canvas"),[A,$]=x.useState(null),T=s?Rt(s):"",_="mesh-summary",Y=$t(s),U=Lt(s,r,s?.selfDeviceId??null),ce=x.useMemo(()=>{const n=new Map;for(const m of s?.devices??[]){const b=U.byDevice.get(m.id);n.set(m.id,b?qe(b,m.sessionCount):m.sessionCount??0)}return n},[s,U]),J=x.useCallback(n=>{$(n)},[]),X=s?s.devices.find(n=>n.id===A)??null:null,ue=x.useCallback((n,m,b)=>{if(!s)return null;const E={selfDeviceId:s.selfDeviceId,devices:new Map(s.devices.map(V=>[V.id,V])),networks:new Map(s.networks.map(V=>[V.id,V]))},O=n.locality==="local"?s.selfDeviceId??"":n.owner_device,G=E.devices.get(O),H=xe({session:n,ownerDeviceId:O,ownerLabel:G?.label??n.owner_device_name},{kind:"device",deviceId:m.deviceId},E);if(H.kind==="refused")return c({code:H.code,sentence:H.sentence,remedy:H.remedy,plan:H.plan??null}),null;if(H.kind==="none")return null;const Ie=b?H.alternatives.find(V=>V.keep)??H.plan:H.plan,Xe=[H.plan,...H.alternatives].filter(V=>V.keep!==Ie.keep),Ze={plan:Ie,alternatives:Xe,risky:H.risky};l(Ze)},[s,l,c]);return t.jsxs("div",{className:"flex h-full min-h-0 flex-col gap-6 overflow-y-auto p-6",children:[t.jsx(tt,{title:"Mesh",icon:je,subtitle:"Devices this app is paired with, and the networks that hold them.",children:t.jsxs("div",{className:"flex items-center gap-4",children:[a&&t.jsx("output",{className:"text-meta text-ink-dim",children:"checking…"}),(e.kind==="ready"||e.kind==="loading")&&t.jsxs("fieldset",{className:"m-0 w-fit border-0 p-0",children:[t.jsx("legend",{className:"sr-only",children:"Presentation"}),t.jsx("div",{className:"flex gap-0.5 rounded-md bg-sunken p-0.5",children:Rs.map(n=>t.jsx("button",{type:"button","aria-pressed":K===n,disabled:e.kind!=="ready",onClick:()=>g(n),className:R("h-6 rounded-sm px-3 text-body-sm text-ink-muted transition-colors duration-fast ease-out-quart","hover:text-ink","focus-visible:outline focus-visible:outline-2 focus-visible:outline-accent focus-visible:outline-offset-2","disabled:text-ink-dim disabled:hover:text-ink-dim",K===n&&"bg-surface text-ink"),children:$s[n]},n))})]})]})}),t.jsx(ss,{rows:p.rows,error:p.error,pending:p.pending,refusal:p.decisionRefusal,onDecide:p.onDecide,onRetry:p.onRetry,nowSeconds:p.nowSeconds,networkNames:new Map((s?.networks??[]).map(n=>[n.id,n.label]))}),e.kind==="loading"&&t.jsxs("div",{className:"flex min-h-0 flex-1 flex-col gap-3",children:[t.jsx(De,{className:"h-4 w-64"}),t.jsx(De,{className:"min-h-40 w-full flex-1"})]}),e.kind==="error"&&t.jsxs(he,{variant:"warning",className:"flex-col items-start gap-2",children:[t.jsx("p",{children:e.message}),t.jsx(q,{variant:"secondary",size:"sm",onClick:u,className:"w-fit",children:"Ask again"})]}),e.kind==="empty"&&t.jsx("div",{className:"flex min-h-0 flex-1 items-center justify-center rounded-lg border border-hairline bg-surface p-6",children:t.jsxs("div",{className:"flex flex-col items-start gap-3",children:[t.jsx("h2",{className:"text-heading text-ink",children:"No network on this device"}),t.jsx("p",{className:"max-w-140 text-body-sm text-ink-muted",children:"This device is not in any network, so there is no mesh to draw. Create one on this machine:"}),t.jsx("code",{className:"rounded-sm bg-sunken px-2 py-1 font-mono text-meta text-ink",children:"lop network init <name>"}),t.jsx("p",{className:"text-meta text-ink-dim",children:"A network appears here once this device has joined one."})]})}),e.kind==="ready"&&s&&t.jsx(t.Fragment,{children:t.jsxs("div",{className:"flex min-h-[22rem] flex-1 gap-4",children:[t.jsxs("div",{className:"flex min-h-0 min-w-0 flex-1 flex-col gap-3",children:[t.jsx("p",{id:_,className:"text-meta text-ink-muted","data-mesh-summary":"",children:T}),d&&t.jsx(he,{variant:"warning",children:t.jsx("p",{children:d})}),f&&t.jsx(he,{variant:"warning",children:t.jsx("p",{children:f})}),h&&t.jsx(Pt,{receipt:h.kind==="moved"?{verb:h.verb,detail:h.detail,undo:h.undo}:null,refusal:h.kind==="refused"?h.refusal:null,canWait:h.kind==="refused"&&h.plan!==null,onWait:D,onRecheck:u,onUndo:P,onDismiss:S,pending:k}),K==="canvas"?t.jsx(Ns,{graph:s,slots:Y,nowSeconds:i,selectedDeviceId:A,sessions:U.byDevice,sessionTotals:ce,movingSessionId:j,canMove:N,onOpenDevice:J,onAskMove:l,onDropRefused:c,onShowAllSessions:J,summaryId:_}):t.jsx(_s,{graph:s,nowSeconds:i,selectedDeviceId:A,sessions:U.byDevice,selfLabel:v,canMove:N,onSelect:J,onMove:ue,onInvite:M,onRemove:se})]}),X&&t.jsx(Ss,{device:X,sessions:U.byDevice.get(X.id)??{rows:[],shown:[],hidden:0},sessionTotal:ce.get(X.id)??0,nowSeconds:i,canMove:N,canInvite:e.kind==="ready",movingSessionId:j,destinationsFor:n=>Ve(s,n,v),onClose:()=>$(null),onMove:ue,onInvite:n=>M({deviceId:n.id,deviceLabel:n.label}),onRemoveMember:(n,m)=>{const b=s.networks.find(E=>E.id===m);se({networkId:m,networkLabel:b?.label??m,deviceId:n.id,deviceLabel:n.label})},onShowInList:n=>{J(n),g("list")}})]})}),t.jsx(Tt,{open:y!==null,plan:y?.plan??Ps,alternatives:y?.alternatives??[],risky:y?.risky??!1,busy:k,onCancel:I,onChoose:o}),C&&t.jsx(Ot,{open:C.open,options:C.options,deviceId:C.deviceId,deviceLabel:C.deviceLabel,onClose:w,onInvite:B,pending:W,receipt:te,refusal:z}),L&&t.jsx(Wt,{open:L.open,networkLabel:L.networkLabel,deviceLabel:L.deviceLabel,onClose:ie,onConfirm:ne,pending:re,refusal:Z,removed:F})]})},Ps={sessionId:"",to:"",keep:!1,verb:"",waitS:0,lost:null},qs=()=>{const e=Qe(),s=be(e.data,"peers")==="enabled",i=be(e.data,"session_transfer")==="enabled",a=zt(s),d=Ht(s),u=Bt(s,{poll:!1,stamp:()=>Ce.getState().beginAnswer()}),p=x.useMemo(()=>({peers:a,networks:d}),[a,d]),r=Ft(p),f=Yt(p),v=qt(),j=be(e.data,"approvals")==="enabled",N=Ut(s&&j,{poll:!1}),y=Gt(),l=y.isError?{approvalId:y.variables?.approvalId??null,...Vt(y.error)}:null,c=x.useMemo(()=>Math.floor((N.dataUpdatedAt||Date.now())/1e3),[N.dataUpdatedAt]),o=Ce(g=>g.settlePlacement),I=Kt(),k=Xt(),[h,S]=x.useState(null),[D,P]=x.useState(null),[C,M]=x.useState(null),[B,w]=x.useState(null),[W,te]=x.useState(null),[z,L]=x.useState(null),[se,ne]=x.useState(null),ie=x.useMemo(()=>{const g=Math.max(a.dataUpdatedAt,d.dataUpdatedAt);return Math.floor((g||Date.now())/1e3)},[a.dataUpdatedAt,d.dataUpdatedAt]),re=x.useCallback(()=>{a.refetch(),d.refetch(),u.refetch()},[a,d,u]),Z=x.useCallback((g,A)=>{S(null);const $={sessionId:g.sessionId,to:g.to,keep:g.keep,waitS:A??g.waitS};v.mutate($,{onSuccess:T=>{if(T.kind==="moved"){const{receipt:_}=T;o(g.sessionId,_);const Y=_.locality==="local"?"this device":f?.devices.find(U=>U.id===_.owner_device)?.label??_.owner_device;P({kind:"moved",verb:_.mode==="keep"?"Copied":"Moved",detail:_.mode==="keep"?`${Y} holds a copy as ${_.new_session_id.slice(-6)}; the original is still here.`:`${Y} holds it now${_.source_retired?"; the copy here is gone":""}.`,undo:_.mode==="keep"?{sessionId:_.new_session_id,to:"local",keep:!1,verb:`Bring the copy back from ${Y}`,waitS:0,lost:Zt(Y,"this device")}:null});return}P({kind:"refused",refusal:T.refusal,plan:g})},onError:()=>{P({kind:"refused",refusal:{code:"move_failed",sentence:"The move could not be sent. Nothing here changed; the list has been read again.",status:null,unconfirmed:!1},plan:g})}})},[f,v,o]),F=x.useMemo(()=>{if(!f)return[];const g=C?.deviceId,A=g?f.devices.find($=>$.id===g):void 0;return f.networks.filter($=>{if(!A)return!0;const T=A.memberships.find(_=>_.networkId===$.id);return!T||!T.active}).map($=>({id:$.id,label:$.label}))},[f,C]);if(!s)return t.jsx(et,{to:"/chat",replace:!0});const K=r.kind==="ready"?a.error?le(a.error):d.error?le(d.error):null:null;return t.jsx(Ls,{state:r,graph:f,nowSeconds:ie,checking:a.isFetching||d.isFetching,staleError:K,onRetry:re,approvals:{rows:N.data??[],error:N.isError?Jt(N.error):null,pending:y.isPending?y.variables??null:null,decisionRefusal:l,onDecide:(g,A)=>y.mutate({approvalId:g,decision:A}),onRetry:()=>void N.refetch(),nowSeconds:c},sessions:u.data?.rows??[],movingSessionId:v.isPending?v.variables?.sessionId??null:null,sessionError:u.isError?le(u.error):null,selfLabel:f?.devices.find(g=>g.state==="self")?.label??"this device",canMove:i,pendingMove:h,onAskMove:S,onDropRefused:g=>P({kind:"refused",refusal:{code:g.code,sentence:g.sentence,status:null,unconfirmed:!1},plan:g.plan}),onChooseMove:g=>Z(g),onCancelMove:()=>S(null),moveBusy:v.isPending,moveReport:D,onDismissReport:()=>P(null),onWaitForIdle:()=>{D?.kind!=="refused"||!D.plan||Z(D.plan,Ts)},onUndoCopy:()=>{D?.kind!=="moved"||!D.undo||S({plan:D.undo,alternatives:[],risky:!1})},invite:C===null?null:{open:!0,deviceId:C.deviceId,deviceLabel:C.deviceLabel,options:F},onOpenInvite:g=>{w(null),te(null),M(g)},onInvite:g=>{I.mutate(g,{onSuccess:A=>w(A),onError:A=>te({code:"invite_refused",sentence:le(A),status:null,unconfirmed:!1})})},onCloseInvite:()=>M(null),inviteBusy:I.isPending,inviteReceipt:B,inviteRefusal:W,remove:z===null?null:{open:!0,networkId:z.networkId,networkLabel:z.networkLabel,deviceId:z.deviceId,deviceLabel:z.deviceLabel},onOpenRemove:g=>{ne(null),L(g)},onRemove:g=>{z&&k.mutate({networkId:z.networkId,deviceId:z.deviceId,confirm:g},{onSuccess:A=>ne(A)})},onCloseRemove:()=>L(null),removeBusy:k.isPending,removeRefusal:k.isError?{code:"remove_refused",sentence:le(k.error),status:null,unconfirmed:!1}:null,removed:se})},Ts=300;export{qs as MeshPage,Ls as MeshSurface,qs as default};
|