@miadi/stateloom-web 0.3.4 → 0.3.5
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/package.json +1 -1
- package/server/.next/BUILD_ID +1 -1
- package/server/.next/app-path-routes-manifest.json +1 -0
- package/server/.next/build-manifest.json +2 -2
- package/server/.next/prerender-manifest.json +3 -3
- package/server/.next/required-server-files.json +1 -1
- package/server/.next/routes-manifest.json +6 -0
- package/server/.next/server/app/_global-error.html +2 -2
- package/server/.next/server/app/_global-error.rsc +1 -1
- package/server/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/server/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/server/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/server/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/server/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/server/.next/server/app/_not-found.html +1 -1
- package/server/.next/server/app/_not-found.rsc +1 -1
- package/server/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/server/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/server/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/server/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/server/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/server/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/server/.next/server/app/api/docs/route.js.nft.json +1 -1
- package/server/.next/server/app/api/file/route.js.nft.json +1 -1
- package/server/.next/server/app/api/marks/route.js.nft.json +1 -1
- package/server/.next/server/app/api/rispec/route.js.nft.json +1 -1
- package/server/.next/server/app/api/system-of/route/app-paths-manifest.json +3 -0
- package/server/.next/server/app/api/system-of/route/build-manifest.json +11 -0
- package/server/.next/server/app/api/system-of/route/server-reference-manifest.json +4 -0
- package/server/.next/server/app/api/system-of/route.js +8 -0
- package/server/.next/server/app/api/system-of/route.js.map +5 -0
- package/server/.next/server/app/api/system-of/route.js.nft.json +1 -0
- package/server/.next/server/app/api/system-of/route_client-reference-manifest.js +2 -0
- package/server/.next/server/app/api/watch/route.js.nft.json +1 -1
- package/server/.next/server/app/index.html +1 -1
- package/server/.next/server/app/index.rsc +2 -2
- package/server/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/server/.next/server/app/index.segments/_full.segment.rsc +2 -2
- package/server/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/server/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/server/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/server/.next/server/app/page_client-reference-manifest.js +1 -1
- package/server/.next/server/app-paths-manifest.json +1 -0
- package/server/.next/server/chunks/[root-of-the-server]__13c3d2a8._.js +1 -1
- package/server/.next/server/chunks/[root-of-the-server]__2046b812._.js +2 -2
- package/server/.next/server/chunks/[root-of-the-server]__87bf4b91._.js +1 -1
- package/server/.next/server/chunks/[root-of-the-server]__95b05635._.js +1 -1
- package/server/.next/server/chunks/[root-of-the-server]__aedef6d1._.js +1 -1
- package/server/.next/server/chunks/[root-of-the-server]__d21ea469._.js +3 -0
- package/server/.next/server/chunks/bridge-protocol_dist_index_179d02a5.js +1 -1
- package/server/.next/server/chunks/ssr/[root-of-the-server]__edbb995c._.js +3 -3
- package/server/.next/server/chunks/web__next-internal_server_app_api_system-of_route_actions_1988181c.js +3 -0
- package/server/.next/server/pages/404.html +1 -1
- package/server/.next/server/pages/500.html +2 -2
- package/server/.next/server/server-reference-manifest.js +1 -1
- package/server/.next/server/server-reference-manifest.json +1 -1
- package/server/.next/static/chunks/{b0af2862e9bb3e18.js → 0fd0d2a3caf9e5c4.js} +3 -3
- package/server/package-lock.json +2 -2
- package/server/package.json +1 -1
- package/server/server.js +1 -1
- package/server/src/app/api/system-of/route.ts +22 -0
- package/server/src/app/page.tsx +4 -2
- package/server/src/lib/systemOf.ts +80 -0
- package/server/src/lib/systemParam.ts +46 -1
- package/server/stateloom-web.json +2 -2
- /package/server/.next/static/{ZoijkpoWD861NG-cIGJrO → 1YtenfowImzXV-wx5GWY1}/_buildManifest.js +0 -0
- /package/server/.next/static/{ZoijkpoWD861NG-cIGJrO → 1YtenfowImzXV-wx5GWY1}/_clientMiddlewareManifest.json +0 -0
- /package/server/.next/static/{ZoijkpoWD861NG-cIGJrO → 1YtenfowImzXV-wx5GWY1}/_ssgManifest.js +0 -0
|
@@ -8,10 +8,10 @@ ${b.error}`)}}catch(a){m(`# RISE rispec generation failed
|
|
|
8
8
|
${a}`)}l(!0)},W=async()=>{let a=f();try{let b=await fetch("/api/generate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({definition:a,language:T})});if(b.ok){let a=await b.json();m(a.code)}else{let c=await b.json().catch(()=>({error:"Unknown error"}));m(`// Code generation failed: ${c.error}
|
|
9
9
|
// Showing definition JSON as fallback:
|
|
10
10
|
${a}`)}}catch{m(`// Backend unavailable — showing definition JSON
|
|
11
|
-
${a}`)}l(!0)};return(0,h.jsxs)("div",{className:"flex flex-col gap-1.5 px-2 py-1.5 bg-gray-900 border-b border-gray-800 md:flex-row md:flex-wrap md:items-center md:px-3",children:[(0,h.jsxs)("div",{className:"toolbar-ident",children:[(0,h.jsx)("input",{ref:A,type:"file",accept:".json,.smdf.json",onChange:a=>{let b=a.target.files?.[0];if(!b)return;let c=new FileReader;c.onload=a=>{e(a.target?.result,b.name)},c.readAsText(b),a.target.value=""},className:"hidden"}),(0,h.jsxs)("span",{className:"text-xs text-gray-400 mr-1 truncate max-w-[50vw] md:max-w-none",children:[b??"untitled.smdf.json",d&&(0,h.jsx)("span",{className:"text-yellow-500 ml-0.5",children:"●"})]}),(0,h.jsx)(el,{}),"synced"===u&&(0,h.jsx)("span",{className:"text-[10px] text-emerald-500",title:"In sync with disk",children:"⌁ synced"}),"remote-changed"===u&&(0,h.jsx)("span",{className:"text-[10px] text-amber-400",title:v??"",children:"↻ remote changed"}),"error"===u&&(0,h.jsxs)("span",{className:"inline-flex items-center gap-0.5 text-[10px] text-red-400",title:v??"",children:[(0,h.jsx)(em,{size:11})," disk error"]}),"idle"===u&&(0,h.jsx)("span",{className:"text-[10px] text-gray-600",title:v??"No file bound",children:"○ no disk"}),(0,h.jsx)(en,{}),(0,h.jsx)("div",{className:"flex-1"})]}),(0,h.jsxs)("div",{className:"toolbar-strip",children:[(0,h.jsx)("button",{onClick:q,disabled:0===s.length,className:"toolbar-btn disabled:opacity-30",title:"Undo (Ctrl+Z)","aria-label":"Undo",children:(0,h.jsx)(ed,{name:"undo"})}),(0,h.jsx)("button",{onClick:r,disabled:0===t.length,className:"toolbar-btn disabled:opacity-30",title:"Redo (Ctrl+Y)","aria-label":"Redo",children:(0,h.jsx)(ed,{name:"redo"})}),(0,h.jsx)("div",{className:"w-px h-4 bg-gray-700"}),(0,h.jsxs)("button",{onClick:p,className:"toolbar-btn",title:"Arrange states into layers (auto-layout)",children:[(0,h.jsx)(ed,{name:"arrange"})," Arrange"]}),(0,h.jsx)("div",{className:"w-px h-4 bg-gray-700"}),(0,h.jsxs)("button",{onClick:()=>o("select"===n?"transition":"select"),className:`toolbar-btn ${"transition"===n?"!bg-amber-700 !text-white":""}`,title:"transition"===n?"Exit draw mode (Esc)":"Draw transition mode",children:[(0,h.jsx)(ed,{name:"draw"})," ","transition"===n?"Drawing":"Draw"]}),(0,h.jsx)("div",{className:"w-px h-4 bg-gray-700"}),(0,h.jsx)("button",{onClick:()=>A.current?.click(),className:"toolbar-btn",title:"Open local .smdf.json (browser)","aria-label":"Open a local file",children:(0,h.jsx)(ed,{name:"open"})}),(0,h.jsxs)("button",{onClick:P,disabled:F,className:"toolbar-btn disabled:opacity-40",title:"Save to disk (STATELOOM_PROJECT_FILE)",children:[(0,h.jsx)(ed,{name:"save"})," Disk"]}),(0,h.jsx)("button",{onClick:R,className:"toolbar-btn",title:"Reload from disk","aria-label":"Reload from disk",children:(0,h.jsx)(ed,{name:"reload"})}),(0,h.jsx)("button",{onClick:()=>{let a=new Blob([f()],{type:"application/json"}),c=URL.createObjectURL(a),d=document.createElement("a");d.href=c,d.download=b??"statemachine.smdf.json",d.click(),URL.revokeObjectURL(c)},className:"toolbar-btn",title:"Download as file","aria-label":"Download as file",children:(0,h.jsx)(ed,{name:"download"})}),(0,h.jsx)("select",{value:H,onChange:a=>{I(a.target.value),O(null),M(null)},className:"bg-gray-800 border border-gray-700 rounded text-xs text-gray-300 px-1 py-0.5",title:"Export format",children:d5.map(a=>(0,h.jsx)("option",{value:a,children:d6[a]},a))}),(0,h.jsx)("button",{onClick:Q,disabled:J,className:`toolbar-btn disabled:opacity-40 ${L?"!text-red-400":""}`,title:L??`Export the board as ${d6[H]}`,children:J?"…":(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(ed,{name:"image"})," Export"]})}),N&&!L&&(0,h.jsxs)("span",{className:"text-[10px] text-emerald-500 truncate max-w-[40vw] md:max-w-[16rem]",title:N,children:["⤓ ",N]}),(0,h.jsx)("div",{className:"w-px h-4 bg-gray-700"}),B?(0,h.jsxs)("div",{className:"flex items-center gap-1",children:[(0,h.jsx)("input",{autoFocus:!0,className:"bg-gray-800 border border-gray-700 rounded px-2 py-0.5 text-xs text-gray-200 w-32 md:w-24",placeholder:"State name...",value:D,onChange:a=>E(a.target.value),onKeyDown:a=>{"Enter"===a.key&&S(),"Escape"===a.key&&C(!1)}}),(0,h.jsx)("button",{onClick:S,className:"toolbar-btn-sm","aria-label":"Add the state",children:(0,h.jsx)(ed,{name:"check"})}),(0,h.jsx)("button",{onClick:()=>C(!1),className:"toolbar-btn-sm","aria-label":"Cancel",children:"✕"})]}):(0,h.jsxs)("button",{onClick:()=>C(!0),className:"toolbar-btn",children:[(0,h.jsx)(ed,{name:"plus"})," State"]}),(0,h.jsx)("div",{className:"w-px h-4 bg-gray-700"}),(0,h.jsxs)("button",{onClick:()=>j(),className:"toolbar-btn",children:[(0,h.jsx)(ed,{name:"check"})," Validate"]}),(0,h.jsxs)("select",{value:T,onChange:a=>U(a.target.value),className:"bg-gray-800 border border-gray-700 rounded text-xs text-gray-300 px-1 py-0.5",children:[(0,h.jsx)("option",{value:"python",children:"Python"}),(0,h.jsx)("option",{value:"typescript",children:"TypeScript"})]}),(0,h.jsxs)("button",{onClick:W,className:"toolbar-btn",children:[(0,h.jsx)(ed,{name:"bolt"})," Generate"]}),(0,h.jsxs)("button",{onClick:V,className:"toolbar-btn",title:"Generate RISE rispec markdown",children:[(0,h.jsx)(ed,{name:"scroll"})," RISE"]}),(0,h.jsxs)("button",{onClick:()=>l(!k),className:`toolbar-btn ${k?"text-blue-400":""}`,children:[(0,h.jsx)(ed,{name:"code"})," Code"]})]})]})}function ep(){let a=d_(a=>a.generatedCode),b=d_(a=>a.showCodePreview),c=d_(a=>a.setShowCodePreview);return b?(0,h.jsx)("div",{className:"absolute inset-0 z-50 flex items-center justify-center bg-black/60 p-2 md:p-0",children:(0,h.jsxs)("div",{className:"bg-gray-900 border border-gray-700 rounded-lg shadow-xl w-full max-h-[85dvh] md:w-[80%] md:max-w-3xl md:max-h-[80dvh] flex flex-col",children:[(0,h.jsxs)("div",{className:"flex items-center justify-between px-4 py-2 border-b border-gray-800",children:[(0,h.jsx)("h3",{className:"text-sm font-semibold text-gray-300",children:"Generated Definition (JSON)"}),(0,h.jsx)("button",{onClick:()=>c(!1),className:"text-gray-500 hover:text-gray-300 text-lg min-h-11 min-w-11 md:min-h-0 md:min-w-0","aria-label":"Close preview",children:"✕"})]}),(0,h.jsx)("pre",{className:"flex-1 overflow-auto overscroll-contain p-4 text-[11px] leading-relaxed text-green-400 font-mono md:text-sm",children:a??"No code generated yet"}),(0,h.jsx)("div",{className:"flex justify-end px-4 py-2 border-t border-gray-800",children:(0,h.jsx)("button",{onClick:()=>{a&&navigator.clipboard.writeText(a)},className:"text-xs bg-gray-700 hover:bg-gray-600 text-gray-300 px-4 py-3 rounded md:px-3 md:py-1",children:"Copy to Clipboard"})})]})}):null}function eq(){let a=d_(a=>a.applyRemote),b=d_(a=>a.setRemoteStatus),c=d_(a=>a.setRemoteMtime),d=(0,ek.useRequestedDoc)();return(0,i.useEffect)(()=>{let e=!1,f=(0,ek.docQuery)(d);async function g(){try{let a=await fetch(`/api/file${f}`,{cache:"no-store"});if(!a.ok)return null;return await a.json()}catch{return null}}(async()=>{let c=await g();e||(c?.path&&d_.getState().setDocPath(c.path),c?.exists&&c.content?a(c.content,c.mtime,c.path.split("/").pop()):b("idle",c?`No file at ${c.path}`:null))})();let h=new EventSource(`/api/watch${f}`);return h.addEventListener("hello",a=>{try{let b=JSON.parse(a.data);"number"==typeof b?.mtime&&c(b.mtime)}catch{}}),h.addEventListener("change",async d=>{let e=0;try{e=JSON.parse(d.data)?.mtime??0}catch{}if(e<=(d_.getState().remoteMtime??0))return;let f=await g();f?.exists&&f.content&&(d_.getState().dirty?(b("remote-changed",`Disk changed at ${new Date(f.mtime).toLocaleTimeString()} — local has unsaved edits`),c(f.mtime)):a(f.content,f.mtime,f.path.split("/").pop()))}),h.addEventListener("error",()=>{b("error","Watch stream disconnected")}),()=>{e=!0,h.close()}},[a,b,c,d]),null}function er({url:a}){let b=(0,ek.useRequestedDoc)();return(0,i.useEffect)(()=>{if(!a)return;let c=!1,d=null,e=null,f=null,g=null;return(async()=>{let h="";try{let a=await fetch(`/api/file${(0,ek.docQuery)(b)}`,{cache:"no-store"});a.ok&&(h=(await a.json())?.path??"")}catch{}c||(h&&d_.getState().setDocPath(h),(d=dL({url:a,role:"web",docId:h,name:"web-designer",onFull:a=>{d_.getState().applyRemote(JSON.stringify({stateMachine:a.def}),a.mtime??Date.now(),h&&h.split("/").pop()||void 0),g=a.def},onPatch:a=>{d_.getState().applyRemoteOps(a.ops,a.mtime??Date.now(),a.seq),g=d_.getState().definition},onPresence:a=>{d_.getState().setPresence(a)}})).connect(),e=d_.subscribe((a,b)=>{a.definition===b.definition||a._applyingRemote||(f&&clearTimeout(f),f=setTimeout(()=>{var a,b;let c,e;if(!d||"connected"!==d.getSnapshot().status)return;let f=d_.getState().definition;if(null===g){d.emitFull(f),g=f;return}let h=(a=g,b=f,c=a??{settings:{namespace:"",asynchronous:!1},events:[],state:{name:b.state.name,states:[]}},function(a,b,c){let d={},e=!1,f=new Set([...Object.keys(a.settings),...Object.keys(b.settings)]),g=a.settings,h=b.settings;for(let a of f)q(g[a],h[a])||void 0===h[a]||(d[a]=h[a],e=!0);void 0!==a.settings.notes&&void 0===b.settings.notes&&(d.notes="",e=!0),e&&c.push({op:"settings.update",patch:d})}(c,b,e=[]),function(a,b,c){let d=a.events,e=b.events,f=Math.min(d.length,e.length);for(let a=0;a<f;a++)!function(a,b,c,d){let e={},f=!1;for(let a of["name","file","feeder","description","timers"])q(b[a],c[a])||void 0===c[a]||(e[a]=c[a],f=!0);f&&d.push({op:"eventSource.update",index:a,patch:e});let g=b.events??[],h=c.events??[],i=new Set(h.map(a=>a.id));for(let a of g)i.has(a.id)||d.push({op:"event.remove",id:a.id});let j=g.filter(a=>i.has(a.id)),k=0;for(;k<h.length;){let b=h[k];k<j.length&&j[k].id===b.id?(function(a,b,c){let d={},e=!1;for(let c of["name","description","preAction","postAction"])q(a[c],b[c])||void 0===b[c]||(d[c]=b[c],e=!0);e&&c.push({op:"event.update",id:b.id,patch:d})}(j[k],b,d),function(a,b,c,d){let e=Math.min(b.length,c.length);for(let f=0;f<e;f++)if(!q(b[f],c[f])){let e={};b[f].name!==c[f].name&&(e.name=c[f].name),b[f].type!==c[f].type&&(e.type=c[f].type),d.push({op:"parameter.update",eventId:a,index:f,patch:e})}for(let b=e;b<c.length;b++)d.push({op:"parameter.add",eventId:a,parameter:c[b],index:b});for(let e=b.length-1;e>=c.length;e--)d.push({op:"parameter.remove",eventId:a,index:e})}(b.id,j[k].parameters??[],b.parameters??[],d)):(d.push({op:"event.add",sourceIndex:a,event:b,index:k}),j.splice(k,0,b)),k++}}(a,d[a],e[a],c);for(let a=d.length;a<e.length;a++)c.push({op:"eventSource.add",source:e[a]});for(let a=d.length-1;a>=e.length;a--)c.push({op:"eventSource.remove",index:a})}(c,b,e),function(a,b,c){let d=o(a.state),e=o(b.state),f=new Map(d.map(a=>[a.name,a])),g=new Map(e.map(a=>[a.name,a])),h=p(a.state),i=p(b.state),j=[];for(let a of e){if(f.has(a.name))continue;let b=i.get(a.name)??null,{states:d,transitions:e,...g}=a;c.push({op:"state.add",parent:b,state:{...g}}),e&&e.length>0&&j.push({state:a.name,transitions:e})}for(let a of e){if(!f.has(a.name))continue;let b=h.get(a.name)??null,d=i.get(a.name)??null;b!==d&&null!==d&&c.push({op:"state.nest",child:a.name,newParent:d})}for(let a of e){let b=f.get(a.name);if(!b)continue;let d={},e=!1;q(b.kind,a.kind)||void 0===a.kind||(d.kind=a.kind,e=!0),q(b.description,a.description)||void 0===a.description||(d.description=a.description,e=!0),q(b.notes,a.notes)||(d.notes=a.notes??"",e=!0),q(b.prompt,a.prompt)||(d.prompt=a.prompt??"",e=!0),e&&c.push({op:"state.update",name:a.name,patch:d}),r(a.name,"onEntry",b.onEntry?.actions??[],a.onEntry?.actions??[],c),r(a.name,"onExit",b.onExit?.actions??[],a.onExit?.actions??[],c)}for(let a of j)a.transitions.forEach((b,d)=>{c.push({op:"transition.add",state:a.state,transition:b,index:d})});for(let a of e){let b=f.get(a.name);b&&function(a,b,c,d){let e=Math.min(b.length,c.length);for(let f=0;f<e;f++){if(q(b[f],c[f]))continue;let e={};for(let a of["event","nextState","condition","description","actions"])q(b[f][a],c[f][a])||void 0===c[f][a]||(e[a]=c[f][a]);Object.keys(e).length>0&&d.push({op:"transition.update",state:a,index:f,patch:e})}for(let b=e;b<c.length;b++)d.push({op:"transition.add",state:a,transition:c[b],index:b});for(let e=b.length-1;e>=c.length;e--)d.push({op:"transition.remove",state:a,index:e})}(a.name,b.transitions??[],a.transitions??[],c)}for(let a=d.length-1;a>=0;a--){let b=d[a];if(g.has(b.name))continue;let e=b.transitions??[];for(let a=e.length-1;a>=0;a--)c.push({op:"transition.remove",state:b.name,index:a});c.push({op:"state.remove",name:b.name})}}(c,b,e),e);0!==h.length&&(d.emitPatch(h),g=f)},60))}))})(),()=>{c=!0,f&&clearTimeout(f),e&&e(),d&&d.disconnect()}},[a,b]),null}function es(){let a=process.env.NEXT_PUBLIC_STATELOOM_BRIDGE_URL??process.env.NEXT_PUBLIC_SMCRAFT_BRIDGE_URL;return"string"==typeof a&&a.length>0?a:void 0}let et=null;function eu(){return et||(et=(async()=>{let a=es()??null;try{let b=await fetch("/api/config",{cache:"no-store"});if(b.ok){let c=await b.json();return{bridgeUrl:c.bridgeUrl||a,projectFile:c.projectFile??null,stage:c.stage??null,companion:!0===c.companion,companionEpisode:c.companionEpisode??null}}}catch{}return{bridgeUrl:a,projectFile:null,stage:null,companion:!1,companionEpisode:null}})())}function ev(){let a=es(),[b,c]=(0,i.useState)(a);return((0,i.useEffect)(()=>{let a=!0;return eu().then(b=>{a&&b.bridgeUrl&&c(b.bridgeUrl)}),()=>{a=!1}},[]),"string"==typeof b&&b.length>0)?(0,h.jsx)(er,{url:b}):(0,h.jsx)(eq,{})}function ew(a){return Number.isFinite(a)?Math.min(1.75,Math.max(.75,a)):1}function ex(a){"u">typeof document&&(document.documentElement.style.fontSize=`${16*ew(a)}px`)}let ey=1,ez=!1,eA=new Set;function eB(){return ez||(ez=!0,ey=1),ey}function eC(){return 1}function eD(a){return eA.add(a),()=>{eA.delete(a)}}function eE(a,b){let c=ew(a);if(ex(c),b,ez=!0,c!==ey)for(let a of(ey=c,eA))a()}function eF(a,b){return Math.max(1,Math.hypot(b.clientX-a.clientX,b.clientY-a.clientY))}function eG(a,b){for(let c=0;c<a.length;c++)if(a[c].identifier===b)return a[c];return null}function eH(){let a=(0,i.useSyncExternalStore)(eD,eB,eC),b=(0,i.useRef)(null),c=(0,i.useRef)(null),d=(0,i.useRef)(null);(0,i.useEffect)(()=>{ex(a)},[a]);let e=(0,i.useCallback)(a=>{c.current=a,null===d.current&&(d.current=requestAnimationFrame(()=>{d.current=null,null!==c.current&&eE(c.current,!1)}))},[]),f=(0,i.useCallback)(()=>{c.current=null,eE(1,!0)},[]);return((0,i.useEffect)(()=>{let a=()=>{let a=b.current;if(b.current=null,!a?.engaged)return;null!==d.current&&(cancelAnimationFrame(d.current),d.current=null);let e=c.current??eB();c.current=null,eE(ew(e),!0)},f=c=>{if(2!==c.touches.length){b.current&&a();return}let[d,e]=[c.touches[0],c.touches[1]];d2(d.target)||d2(e.target)||(b.current={a:d.identifier,b:e.identifier,startScale:eB(),startDist:eF(d,e),engaged:!1})},g=a=>{let c=b.current;if(!c)return;let d=eG(a.touches,c.a),f=eG(a.touches,c.b);if(!d||!f)return;a.preventDefault();let g=eF(d,f);if(!c.engaged){if(12>Math.abs(g-c.startDist))return;c.engaged=!0,c.startDist=g;return}e(ew(c.startScale*(g/c.startDist)))},h=c=>{let d=b.current;d&&(eG(c.touches,d.a)&&eG(c.touches,d.b)||a())};return document.addEventListener("touchstart",f,{passive:!0,capture:!0}),document.addEventListener("touchmove",g,{passive:!1,capture:!0}),document.addEventListener("touchend",h,{passive:!0,capture:!0}),document.addEventListener("touchcancel",h,{passive:!0,capture:!0}),()=>{document.removeEventListener("touchstart",f,{capture:!0}),document.removeEventListener("touchmove",g,{capture:!0}),document.removeEventListener("touchend",h,{capture:!0}),document.removeEventListener("touchcancel",h,{capture:!0}),null!==d.current&&cancelAnimationFrame(d.current)}},[e]),1===a)?null:(0,h.jsxs)("div",{className:"ui-scale-pill",role:"status","aria-live":"polite",children:[(0,h.jsxs)("span",{children:["UI ",Math.round(100*a),"%"]}),(0,h.jsx)("button",{type:"button",onClick:f,"aria-label":"Reset interface size to 100 percent",children:"Reset"})]})}var eI=i;class eJ extends eI.Component{state={error:null};static getDerivedStateFromError(a){return{error:a}}componentDidCatch(a,b){console.error(`[stateloom] the ${this.props.what} could not be drawn:`,a,b.componentStack)}componentDidUpdate(a){this.state.error&&a.resetKey!==this.props.resetKey&&this.setState({error:null})}render(){let{error:a}=this.state;return a?(0,h.jsx)("div",{role:"alert",className:"flex h-full w-full items-center justify-center p-6 text-center text-sm text-amber-300",children:(0,h.jsxs)("p",{className:"max-w-md",children:["This ",this.props.what," cannot be drawn: ",a.message,". The file on disk is unchanged — correct it in the panel, in the file, or with the agent that wrote it."]})}):this.props.children}}function eK({locked:a,size:b=16}){return(0,h.jsxs)("svg",{width:b,height:b,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:[(0,h.jsx)("rect",{x:"5",y:"11",width:"14",height:"9",rx:"2"}),(0,h.jsx)("path",{d:a?"M8 11V8a4 4 0 0 1 8 0v3":"M8 11V8a4 4 0 0 1 7.5-1.9"})]})}function eL(a){let{onClose:b,restVh:c,tallVh:d}=a,[e,f]=(0,i.useState)(!1),[g,h]=(0,i.useState)(null),j=(0,i.useRef)(null),k=()=>{f(!1),b()},l=a=>{let b=j.current;if(!b||b.id!==a.pointerId)return;j.current=null;let c=a.clientY-b.y;if(h(null),6>Math.abs(c))return f(a=>!a);if(c<=-50)return f(!0);if(c>=80){if(e&&c<260)return f(!1);k()}},m=e?d:c,n=null!==g;return{zoneProps:{onPointerDown:a=>{a.target.closest("button")||(j.current={y:a.clientY,id:a.pointerId},a.currentTarget.setPointerCapture(a.pointerId),h(0))},onPointerMove:a=>{let b=j.current;b&&b.id===a.pointerId&&h(a.clientY-b.y)},onPointerUp:l,onPointerCancel:l,style:{touchAction:"none",cursor:"grab"}},sheetStyle:{"--sheet-h":n&&g<0?`min(calc(${m}dvh + ${-g}px), ${d}dvh)`:`${m}dvh`,...n?{transition:"none"}:{},...n&&g>0?{transform:`translateY(${g}px)`}:{}},close:k}}let eM="stateloom:focus-request",eN="stateloom:system-changed",eO="stateloom:strip-note";function eP(a){let[b,c]=(0,i.useState)(null);return(0,i.useEffect)(()=>{let a=()=>c(null);a();let b=["popstate",ek.DOC_CHANGE_EVENT,"stateloom:focus",eM];for(let c of b)window.addEventListener(c,a);return()=>{for(let c of b)window.removeEventListener(c,a)}},[a]),b}function eQ(a){let b=new URL(window.location.href),c=b.searchParams.get("doc")!==a.doc;b.searchParams.set("doc",a.doc);let d=void 0===a.system?b.searchParams.get("system"):a.system;d?b.searchParams.set("system",d):b.searchParams.delete("system"),a.focus?b.searchParams.set("focus",a.focus):b.searchParams.delete("focus"),c?window.history.pushState({},"",b):window.history.replaceState(window.history.state,"",b),c&&window.dispatchEvent(new Event(ek.DOC_CHANGE_EVENT)),window.dispatchEvent(new Event(eM))}function eR(a){}function eS(){let[a,b]=(0,i.useState)({focus:null,nonce:0});return(0,i.useEffect)(()=>{let a=()=>b(a=>({focus:null,nonce:a.nonce+1}));a();let c=["popstate",ek.DOC_CHANGE_EVENT,eM];for(let b of c)window.addEventListener(b,a);return()=>{for(let b of c)window.removeEventListener(b,a)}},[]),a}var eT=a.i(19933);let eU="stateloom:mark-request",eV=null,eW="/api/companion/",eX="stateloom.companion.autoplay",eY="stateloom.companion.episode",eZ=/^\d{4}-\d{2}-\d{2}-episode-\d+-[a-z0-9-]+$/;function e$(a){let b=a?.match(/(?:^|\/)(\d{4}-\d{2}-\d{2}-episode-\d+-[a-z0-9-]+)\/diagrams\/[^/]+$/);return b?b[1]:null}function e_(a){try{return window.localStorage.getItem(a)}catch{return null}}function e0(a,b){try{window.localStorage.setItem(a,b)}catch{}}let e1=a=>{let b=new Date(a);return Number.isNaN(b.getTime())?"":b.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})},e2=a=>"starting"===a||"recording"===a||"sending"===a,e3={state:"idle",seconds:0,held:0,message:"",error:!1,stored:null},e4={episode:null,items:[],presence:null,waiting:null,error:null};function e5({stage:a,defaultEpisode:b}){let[c,d]=(0,i.useState)(!1),[e,f]=(0,i.useState)(()=>"0"!==e_(eX)),[g,j]=(0,i.useState)(()=>{let a=null,c=e_(eY);return(a&&eZ.test(a)?a:null)??e$((0,ek.requestedDoc)())??(c&&eZ.test(c)?c:null)??b}),[k,l]=(0,i.useState)([]),[m,n]=(0,i.useState)(e3),[o,p]=(0,i.useState)(e4),[q,r]=(0,i.useState)(null),[s,t]=(0,i.useState)([]),[u,v]=(0,i.useState)(null),[w,x]=(0,i.useState)(null),[y,z]=(0,i.useState)(()=>Date.now()),A=(0,i.useRef)(a),B=(0,i.useRef)(g),C=(0,i.useRef)(e);(0,i.useEffect)(()=>{A.current=a,B.current=g,C.current=e});let D=(0,i.useRef)(e3),E=(0,i.useRef)(null),F=(0,i.useRef)([]),G=(0,i.useRef)(!1),H=(0,i.useRef)([]),I=(0,i.useRef)(null),J=(0,i.useRef)(null),K=(0,i.useMemo)(()=>dM({recordings:!0,speech:!1}),[]),L=a=>{E.current=a,r(a)},M=(0,i.useRef)(async()=>{}),N=(0,i.useCallback)(async(a,b=0)=>{L(a.id),t(b=>b.filter(b=>b!==a.id)),a.steps?.length&&window.matchMedia("(max-width: 767px)").matches&&d(!1);let c=F.current.length;v(c?`${c} more of Mia's replies wait after this one.`:null);let e=await A.current.present(function(a,b,c="Mia"){let d=new Date(a.at),e=Number.isNaN(d.getTime())?`${c}'s reply`:`Reply at ${d.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})}`,f=!a.unvoiced,g=(a,c)=>(function(a,b){if(!b)return;if(/^https?:\/\//.test(b))return b;let c=b.replace(/^\/?api\//,"");return`${a.endsWith("/")?a:`${a}/`}${c}`})(b,a||(f?c:null));return{settings:{namespace:"companion",name:e,author:c},steps:a.steps?.length?a.steps.map(({audio:b,...c},d)=>{let e=g(b,`api/replies/${a.id}/steps/${d}/audio`);return{...c,...e?{audio:e}:{}}}):[{say:a.text,...g(a.audio,`api/replies/${a.id}/audio`)?{audio:g(a.audio,`api/replies/${a.id}/audio`)}:{}}]}}(a,eW,"Mia"),{voice:K,origin:"Mia",from:b});if(E.current!==a.id||(L(null),G.current))return;if(!e){F.current=[];return}let f=F.current.shift();f&&!e2(D.current.state)?M.current(f):f&&F.current.unshift(f)},[K]);(0,i.useEffect)(()=>{M.current=N},[N]);let O=(0,i.useCallback)(a=>{let b=a.id;if(!C.current)return void t(a=>a.includes(b)?a:[...a,b]);if(e2(D.current.state)||E.current){t(a=>a.includes(b)?a:[...a,b]),F.current.some(a=>a.id===b)||F.current.push(a),v(e2(D.current.state)?`Mia replied at ${e1(a.at)}. Her voice waits until you have sent your take.`:`Mia replied again at ${e1(a.at)}. It plays when this one ends.`);return}M.current(a)},[]);(0,i.useEffect)(()=>{let a=function(a){let b=a.base.endsWith("/")?a.base:`${a.base}/`,c=a.fetch??((...a)=>fetch(...a)),d=a.everyMs??1e4,e=a.waitEveryMs??4e3,f=a.waitForMs??9e5,g={episode:null,items:[],presence:null,waiting:null,error:null},h=new Set,i=!1,j=null,k=null,l="",m=0,n=b=>{g={...g,...b},a.onChange?.(g)};async function o(){let d=g.episode;if(!d)return;let e=m;try{var j;let o=await c(`${b}thread?episode=${encodeURIComponent(d)}&include=marks`,{cache:"no-store"}),p=await o.json();if(e!==m)return;if(!p.success)return n({error:p.error??`HTTP ${o.status}`});let q=function(a){if(!Array.isArray(a))return[];let b=[];for(let c of a)if(c&&"object"==typeof c){if("take"===c.kind&&dN(c.take))b.push({...c,text:dN(c.text),at:dN(c.at)});else if("reply"===c.kind&&dN(c.id))b.push({...c,text:dN(c.text),at:dN(c.at)});else if("mark"===c.kind&&dN(c.id)&&dN(c.doc)){let a=c.region;b.push({kind:"mark",id:dN(c.id),doc:dN(c.doc),...dN(c.drawing)?{drawing:dN(c.drawing)}:{},...dN(c.title)?{title:dN(c.title)}:{},elements:Array.isArray(c.elements)?c.elements.filter(a=>"string"==typeof a&&!!a):[],...a&&"object"==typeof a&&"number"==typeof a.x?{region:a}:{},text:dN(c.text),author:dO(c.author),at:dN(c.at),...dN(c.lastAt)?{lastAt:dN(c.lastAt)}:{},status:"answered"===c.status||"resolved"===c.status?c.status:"open",replies:(Array.isArray(c.replies)?c.replies:[]).flatMap(a=>{let b=a&&"object"==typeof a?a:{};return dN(b.text)?[{author:dO(b.author),text:dN(b.text),at:dN(b.at)}]:[]})})}}return b}(p.items),r=(j=p.presence,q.map(a=>"reply"===a.kind?`${a.id}:${+!!a.audio}:${a.feedback??""}`:"mark"===a.kind?`m${a.id}:${a.status}:${a.replies.length}`:`${a.take}:${a.text.length}`).join(",")+`|${j?.state??""}`),s=q.filter(a=>"reply"===a.kind&&!h.has(a.id));for(let a of s)h.add(a.id);if((r!==l||g.error)&&(l=r,n({items:q,presence:p.presence??null,error:null})),i)for(let b of s)a.onReply?.(b);i=!0;let t=g.waiting;t&&(q.some(a=>"reply"===a.kind&&a.take===t.take)||Date.now()-t.since>f)&&(k&&clearInterval(k),k=null,n({waiting:null}))}catch(a){e===m&&n({error:a instanceof Error?a.message:String(a)})}}let p=()=>{"visible"===document.visibilityState&&o()};return"u">typeof document&&document.addEventListener("visibilitychange",p),{getSnapshot:()=>g,setEpisode(a){a!==g.episode&&(m+=1,h.clear(),i=!1,l="",k&&clearInterval(k),k=null,n({episode:a,items:[],presence:null,waiting:null,error:null}),a?(j&&clearInterval(j),j=setInterval(()=>{("u"<typeof document||"visible"===document.visibilityState)&&o()},d),o()):j&&(clearInterval(j),j=null))},refresh:o,waitFor(a){n({waiting:{take:a,since:Date.now()}}),k&&clearInterval(k),k=setInterval(()=>void o(),e),o()},async feedback(a,d){await c(`${b}replies/${a}/feedback`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({value:d})}),l="",await o()},destroy(){for(let a of(m+=1,[j,k]))a&&clearInterval(a);j=k=null,"u">typeof document&&document.removeEventListener("visibilitychange",p)}}}({base:eW,onChange:p,onReply:O}),b=function(a){let b=a.base.endsWith("/")?a.base:`${a.base}/`,c=a.fetch??((...a)=>fetch(...a)),d=a.partEveryMs??1e4,e=a.beatEveryMs??15e3,f=a.getUserMedia??(a=>navigator.mediaDevices.getUserMedia(a)),g=a.createRecorder??(a=>{let b,c,d,e,f,g,h,i;return c=(b=new(window.AudioContext??window.webkitAudioContext)).createMediaStreamSource(a),d=b.createScriptProcessor(4096,1,1),e=[],f=[],g=!1,h=null,i={mimeType:"audio/wav",ondataavailable:null,onstop:null,onerror:null,start(a=1e3){d.onaudioprocess=a=>{let b=a.inputBuffer.getChannelData(0),c=new Int16Array(b.length);for(let a=0;a<b.length;a++)c[a]=Math.max(-32768,Math.min(32767,Math.round(32767*b[a])));e.push(c),f.push(c)},c.connect(d),d.connect(b.destination),h=setInterval(()=>{if(!f.length)return;let a=g?[]:[dP(0x7fffffff,b.sampleRate)];g=!0,a.push(...f.map(a=>a.buffer)),f=[],i.ondataavailable?.({data:new Blob(a,{type:"audio/wav"})})},a)},stop(){h&&clearInterval(h),h=null;try{c.disconnect(),d.disconnect()}catch{}b.close().catch(()=>{}),i.whole=new Blob([dP(e.reduce((a,b)=>a+b.byteLength,0),b.sampleRate),...e.map(a=>a.buffer)],{type:"audio/wav"}),i.onstop?.()}}}),h={state:"idle",seconds:0,held:0,message:"",error:!1,stored:null,...!a.createRecorder?{unavailable:"this browser cannot record audio"}:{}},i=b=>{h={...h,...b},a.onChange?.(h)},j=null,k=null,l=[],m="",n="",o=null,p=0,q=null,r=null,s=null,t=null,u=!1,v=()=>p?Math.floor((Date.now()-p)/1e3):0,w=()=>(k?.mimeType||"audio/mp4").split(";")[0]||"audio/mp4",x=(a="")=>`episode=${encodeURIComponent(n)}${m?`&rec=${m}`:""}${o?`&context=${encodeURIComponent(o)}`:""}${a}`;function y(a){n&&c(`${b}recorder`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({episode:n,recording:a})}).catch(()=>{})}function z(a,d={}){m&&c(`${b}takes/diagnostic`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({rec:m,episode:n,kind:a,at:new Date().toISOString(),mime:k?.mimeType??null,visibility:"u">typeof document?document.visibilityState:"",agent:"u">typeof navigator?navigator.userAgent:"",source:"stateloom-canvas",...d}),keepalive:!0}).catch(()=>{})}function A(){for(let a of[r,s,t])a&&clearInterval(a);r=s=t=null}function B(){try{j?.getTracks().forEach(a=>a.stop())}catch{}j=null}async function C(){if(!m||u||!l.length)return;let a=new Blob(l,{type:w()});if(a.size<=h.held)return;u=!0;let d=m;try{let e=await c(`${b}takes/part?${x(`&offset=${h.held}`)}`,{method:"POST",headers:{"content-type":w()},body:a.slice(h.held)}),f=await e.json();d===m&&"number"==typeof f.bytes&&i({held:f.bytes})}catch{}finally{u=!1}}async function D(){let b;if("idle"!==h.state&&"retry"!==h.state)return;if(h.unavailable)return i({message:`Cannot record: ${h.unavailable}.`,error:!0});if(!(n=a.episode()??""))return i({message:"Choose the episode this take belongs to.",error:!0});let c=a.context?.()??null;o=c?JSON.stringify(c).slice(0,4e3):null,q=null,i({state:"starting",message:"",error:!1,held:0,seconds:0}),y(!0);try{b=await f({audio:!0})}catch(a){return y(!1),i({state:"idle",message:`Microphone refused: ${a instanceof Error?a.message:String(a)}`,error:!0})}if("starting"!==h.state)return void b.getTracks().forEach(a=>a.stop());j=b,l=[],m=`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,10)}`;try{k=g(b)}catch(a){return B(),y(!1),i({state:"idle",message:`This browser refused to record: ${a instanceof Error?a.message:String(a)}`,error:!0})}k.ondataavailable=a=>{a.data&&a.data.size&&l.push(a.data)},k.onerror=a=>{let b=v(),c=new Blob(l,{type:w()});if(z("recorder-error",{name:a?.error?.name??"",message:a?.error?.message??"",seconds:b,bytes:c.size,held:h.held}),A(),B(),y(!1),c.size)q=c,i({state:"retry",message:`The recorder stopped with an error after ${Math.floor(b/60)}:${String(b%60).padStart(2,"0")}. What it captured is kept: Send again.${h.held?` ${dQ(h.held)} of it is already stored.`:""}`,error:!0});else i({state:"idle",message:"The recorder stopped before it captured anything. Nothing was sent.",error:!0})},k.start(1e3),p=Date.now(),r=setInterval(()=>void C(),d),s=setInterval(()=>y(!0),e),t=setInterval(()=>i({seconds:v()}),500),i({state:"recording",seconds:0,message:""})}async function E(d){i({state:"sending",message:`Sending ${dQ(d.size)}, then transcribing and storing…`,error:!1});try{let e=await c(`${b}takes?${x()}`,{method:"POST",headers:{"content-type":(d.type||"audio/mp4").split(";")[0]},body:d}),f=await e.json();if(!f.success||!f.take)throw Error(f.error||`HTTP ${e.status}`);q=null,m="";let g=f.presence??{state:f.listening?"listening":"away"},h=f.transcriptError?` Transcription failed, so no session wakes yet: ${f.transcriptError}`:({listening:" The session listening there will hear it.",answering:" Mia is answering an earlier take; she hears this one next.",answered:" The session hears it as soon as it listens again."})[g.state]??" No session is listening yet; the take waits, and her reply comes here when one answers.";i({state:"idle",seconds:0,held:0,message:`Take ${f.take} is in the episode.${h}`,error:!!f.transcriptError,stored:{take:f.take,english:f.english??"",transcriptError:f.transcriptError,presence:g}}),f.transcriptError||a.onStored?.(f.take)}catch(a){q=d,z("send-failed",{message:a instanceof Error?a.message:String(a),bytes:d.size,held:h.held}),i({state:"retry",message:`Not stored: ${a instanceof Error?a.message:String(a)}. Your recording is kept — Send again.${h.held?` ${dQ(h.held)} of it is already stored, and becomes a take by itself if you leave.`:""}`,error:!0})}}async function F(){if("recording"!==h.state)return;let a=v();A(),y(!1),i({state:"sending",seconds:a});let b=await new Promise(a=>{let b=!1,c=()=>{b||(b=!0,a(k?.whole??new Blob(l,{type:w()})))},d=setTimeout(c,3e3);if(!k)return c();k.onstop=()=>{clearTimeout(d),c()};try{k.stop()}catch{clearTimeout(d),c()}});if(B(),!b.size)return z("empty-at-stop",{seconds:a,held:h.held}),i({state:"idle",message:h.held?`The recorder handed back nothing at Stop, but ${dQ(h.held)} is stored; it becomes a take within a few minutes.`:"Nothing was recorded. Try again.",error:!0});await E(b)}async function G(){"retry"===h.state&&q&&await E(q)}return{getSnapshot:()=>h,press:async()=>"recording"===h.state?F():"retry"===h.state&&q?G():D(),start:D,stop:F,resend:G,destroy(){A(),("recording"===h.state||"starting"===h.state)&&y(!1);try{k?.stop()}catch{}B()}}}({base:eW,episode:()=>B.current,context:()=>{let a=A.current.shown,b=a?{...a.title||a.step.title?{title:[a.title,a.step.title].filter(Boolean).join(" · ")}:{},say:a.step.say.slice(0,400),...null!==a.index&&null!==a.count?{index:a.index,count:a.count}:{},...a.origin?{by:a.origin}:{}}:null;return function(a,b={}){if(!a?.doc)return null;let c={stage:a.stage,doc:a.doc,kind:a.kind,system:a.system,focus:a.focus??void 0,visible:a.visible,tour:a.tour,who:a.who,at:new Date().toISOString(),...b};for(let a of Object.keys(c))(void 0===c[a]||null===c[a])&&delete c[a];return c}(A.current.lastReport(),{...H.current.length?{marks:H.current}:{},...a?.step.spotlight?.length?{spotlight:a.step.spotlight}:{},...b?{step:b}:{}})},onChange:a=>{let b=D.current.state;if(D.current=a,n(a),!e2(b)||e2(a.state)||(G.current=!1,!C.current||E.current))return;let c=F.current.shift();c?M.current(c):v(null)},onStored:b=>a.waitFor(b)});return J.current=a,I.current=b,D.current=b.getSnapshot(),n(b.getSnapshot()),()=>{b.destroy(),a.destroy(),J.current=null,I.current=null}},[O]),(0,i.useEffect)(()=>{J.current?.setEpisode(g)},[g]),(0,i.useEffect)(()=>{let a=!0;return fetch(`${eW}health`,{cache:"no-store"}).then(a=>a.json()).then(b=>{if(a){if(!b.success)return x(`The companion does not answer: ${b.error??"no reason given"}.`);x(null),b.defaultEpisode&&j(a=>a??b.defaultEpisode??null)}}).catch(b=>a&&x(`The companion does not answer: ${b instanceof Error?b.message:String(b)}.`)),()=>{a=!1}},[]),(0,i.useEffect)(()=>{if(!c||k.length)return;let a=!0;return fetch(`${eW}episodes`,{cache:"no-store"}).then(a=>a.json()).then(b=>{a&&b.success&&b.episodes&&l(b.episodes)}).catch(()=>{}),()=>{a=!1}},[c,k.length]);let P=(0,i.useRef)(null),Q=(0,i.useCallback)(async(a=!1)=>{let b=A.current.lastReport()?.doc??null;if(a||b!==P.current){if(P.current=b,!b){H.current=[];return}try{let a=await fetch(`/api/marks?doc=${encodeURIComponent(b)}`,{cache:"no-store"}),c=await a.json();H.current=bo(function(a,b=""){let c=a&&"object"==typeof a?a:{},d=Array.isArray(c.marks)?c.marks.map(bn).filter(a=>null!==a):[];return{doc:bk(c.doc)||b,marks:d}}(c,b).marks,"agent").map(a=>a.id)}catch{H.current=[]}}},[]);(0,i.useEffect)(()=>{Q(!0);let a=A.current.onMarks(()=>void Q(!0)),b=setInterval(()=>void Q(),3e3);return()=>{a(),clearInterval(b)}},[Q]),(0,i.useEffect)(()=>{if(!o.waiting)return;let a=setInterval(()=>z(Date.now()),1e3);return()=>clearInterval(a)},[o.waiting]);let R=(0,i.useCallback)(()=>{let a=I.current;a&&(!e2(D.current.state)&&"retry"!==D.current.state&&E.current&&(G.current=!0,A.current.stop()),a.press())},[]),S=(0,i.useCallback)((a,b)=>{let c=J.current?.getSnapshot().items.find(b=>"reply"===b.kind&&b.id===a);if(c){if(e2(D.current.state))return void v("Send your take first. Then press play to hear Mia.");F.current=[],G.current=!1,M.current(c,b)}},[]),T=(0,i.useCallback)(()=>{F.current=[],G.current=!1,A.current.stop()},[]),U=o.waiting?{take:o.waiting.take,seconds:Math.max(0,Math.floor((y-o.waiting.since)/1e3))}:null,{narrow:V,sheet:W,claimSheet:X,releaseSheet:Y}=a;(0,i.useEffect)(()=>{c?X("talk"):Y("talk")},[c,X,Y]),(0,i.useEffect)(()=>()=>Y("talk"),[Y]);let[Z,$]=(0,i.useState)(W);Z!==W&&($(W),V&&"card"===W&&d(!1));let _=(0,i.useCallback)(a=>{window.matchMedia("(max-width: 767px)").matches&&d(!1),eV={doc:a.doc,id:a.id},window.dispatchEvent(new Event(eU)),A.current.board!==a.doc&&eQ({doc:a.doc,focus:null})},[]),aa=(0,h.jsx)(cv,{open:c,onOpenChange:a=>{d(a),a&&Q(!0)},variant:V?"bar":"fab",onOpenMark:_,who:"Mia",episode:g,episodes:k,onEpisode:a=>{eZ.test(a)&&a!==g&&(F.current=[],t([]),v(null),j(a),e0(eY,a))},presence:o.presence,recorder:m,onRecord:R,items:o.items,unheard:s,playing:q,playingStep:q&&a.shown?.origin==="Mia"?a.shown.index:null,onPlay:S,onStop:T,onFeedback:(a,b)=>{J.current?.feedback(a,b).catch(a=>x(`Your thumb was not kept: ${a instanceof Error?a.message:String(a)}.`))},autoplay:e,onAutoplay:a=>{f(a),e0(eX,a?"1":"0"),a||(F.current=[])},waiting:U,notice:u,error:w??o.error});if(V){let b=c?a.sheetBody:a.sheetHandle;return b?(0,eT.createPortal)(aa,b):null}return(0,h.jsx)("div",{className:"stage-talk-host",children:aa})}let e6=(0,i.createContext)(null);function e7(){return(0,i.useContext)(e6)}function e8(a,b){try{window.localStorage.setItem(a,b)}catch{}}let e9=new Map;function fa({children:a}){var b;let c,d,e,f,g,j,k,l,[m,n]=(0,i.useState)({bridgeUrl:null,stage:bf,companion:!1,companionEpisode:null});(0,i.useEffect)(()=>{let a=!0;return eu().then(b=>{if(!a)return;let c=null,d=bh(c)?c:bh(b.stage)?b.stage:bf;n({bridgeUrl:b.bridgeUrl,stage:d,companion:b.companion,companionEpisode:b.companionEpisode})}),()=>{a=!1}},[]);let[o,p]=(0,i.useState)(()=>!1),[q,r]=(0,i.useState)(()=>""),s=(0,i.useMemo)(()=>o?dM():null,[o]),t=(0,i.useMemo)(()=>null,[]),[u,v]=(0,i.useState)(null),w=(0,i.useRef)(new Set),[x,y]=(0,i.useState)(null),[z,A]=(0,i.useState)(null),B=(0,i.useRef)(null),C=(0,i.useCallback)(a=>A({doc:a,from:B.current}),[]),D=(0,i.useCallback)(a=>{B.current=a,y(a)},[]),E=(0,i.useCallback)(a=>{var b;if(!a)return void v(null);let{step:c}=a,d=(0,ek.requestedDoc)();if(a.caught,c.doc&&c.doc!==d)C(c.doc),eQ({doc:c.doc,system:c.system??void 0,focus:c.focus??null});else if(c.focus)if(c.system&&null!==c.system&&d)eQ({doc:d,system:c.system,focus:c.focus});else{let a;b=c.focus,(a=new URL(window.location.href)).searchParams.set("focus",b),window.history.replaceState(window.history.state,"",a),window.dispatchEvent(new Event(eM))}v({doc:c.doc,focus:c.focus,spotlight:c.spotlight,region:c.region,nonce:a.nonce})},[C]),F=(b={url:m.bridgeUrl??"",stage:m.stage,name:"web-stage",voice:s,enabled:!!m.bridgeUrl,onShow:E,onMarks:a=>{for(let b of[...w.current])b(a)}},(c=(0,i.useRef)({onShow:b.onShow,onMarks:b.onMarks})).current={onShow:b.onShow,onMarks:b.onMarks},d=(0,i.useRef)(null),e=`${b.url}\u0000${b.stage??""}\u0000${b.token??""}`,f=(0,i.useRef)(e),(null===d.current||f.current!==e)&&(f.current=e,d.current=function(a){let b,c=bh(a.stage)?a.stage:bf,d=a.setTimer??((a,b)=>setTimeout(a,b)),e=a.clearTimer??(a=>clearTimeout(a)),f=a.gapMs??900,g=a.client??dJ({url:a.url,role:a.role??"web",docId:`stage:${c}`,name:a.name??"web-stage",token:a.token,autoResync:!1}),h=a.voice??null,i=a=>a&&void 0!==b?b:h,j=null,k=null,l=a=>{let b=k;k=null,b?.(a)},m=null,n=null,o=[],p=[],q=0,r=!1,s=!1,t=0,u=null,v=0,w=!1,x=!1,y=!1,z=!1,A=0,B=!1,C={status:g.status,stage:c,shown:m,tour:n,index:q,playing:r,speaking:s,ownVoice:!1},D=new Set;function E(){for(let a of(C={status:g.status,stage:c,shown:m,tour:n,index:q,playing:r,speaking:s,ownVoice:!!n&&void 0!==b},[...D]))a()}function F(){v+=1,u&&e(u),u=null,s&&j?.cancel(),s=!1,j=null}function G(a,b,c=b){F();let e=++v,g=()=>{e!==v||(s&&(s=!1,E()),b&&r&&(u=d(()=>{u=null,e===v&&r&&M()},h?f:0)))},h=i(c);if(h)s=!0,j=h,E(),h.speak(a).then(g,g);else{let c;b&&(u=d(()=>{u=null,g()},"number"==typeof(c=a.holdMs)&&Number.isFinite(c)&&a.holdMs>=0?a.holdMs:Math.min(2e4,Math.max(2500,1200+400*`${a.title??""} ${a.say??""}`.trim().split(/\s+/).filter(Boolean).length))))}}function H(b,c){t+=1,F(),m=b?{...b,nonce:t,...B?{caught:!0}:{}}:null,E(),a.onShow?.(m);let d=!!m&&null!==m.index;m&&(i(d)||c)&&G(m.step,c,d)}function I(a){if(!n)return null;let b=n.def.steps[a];if(!b)return null;let c=b.doc??o[a],d=b.system??p[a];return{step:{...b,...c?{doc:c}:{},...d?{system:d}:{}},index:a,count:n.def.steps.length,title:n.def.settings?.name,origin:n.origin,tourPath:n.path}}function J(a,c,d){var e;let f,g;l(!1),b=d;let h=Array.isArray(a.tour?.steps)?a.tour.steps:[];e=(n={def:{...a.tour,steps:h},path:a.path,origin:a.origin}).def,g=void 0,o=e.steps.map(a=>g=a.doc??g),p=h.map(a=>f=a.system??f),q=Math.min(Math.max(0,a.from??0),Math.max(0,h.length-1)),w=!1,r=c&&h.length>0,H(I(q),r)}function K(a){r=!1,H({step:a.step,index:null,count:null,title:a.title,origin:a.origin,tourPath:a.tour},!1)}function L(a){if(!n)return;let b=n.def.steps.length-1;b<0||(w=!1,H(I(q=Math.min(Math.max(0,Math.floor(a)),b)),r))}function M(){if(n){if(q>=n.def.steps.length-1){let a=r;w=r||w,r=!1,F(),E(),a&&l(!0);return}L(q+1)}}function N(){n&&q>0&&L(q-1)}function O(){n&&n.def.steps.length&&(r=!0,w&&(w=!1,q=0),m?.index!==q||m.caught?H(I(q),!0):(E(),G(m.step,!0)))}function P(){r=!1,F(),E()}function Q(){l(!1),b=void 0,w=!1,n=null,o=[],p=[],q=0,r=!1,H(null,!1)}function R(){if(z)return;z=!0;let a=++A;g.joinStage(c).then(({state:b})=>{a===A&&(z=!1,y=!0,m||n||function(a){B=!0;try{a.tour&&J(a.tour,!1),a.step&&K(a.step)}finally{B=!1}}(b),E())}).catch(()=>{a===A&&(z=!1,E())})}return g.on("stage-step",a=>{a?.stage===c&&a.step&&K(a)}),g.on("stage-load",a=>{a?.stage===c&&a.tour&&J(a,!1!==a.autoplay)}),g.on("stage-control",a=>{a?.stage===c&&function(a){switch(a.action){case"play":return O();case"pause":return P();case"next":return M();case"prev":return N();case"goto":return L(a.index??0);case"stop":return Q()}}(a)}),g.on("marks",b=>a.onMarks?.(b)),g.on("status",a=>{"disconnected"===a||"error"===a?y=!1:"connected"===a&&x&&!y&&R(),E()}),{getSnapshot:()=>C,subscribe:a=>(D.add(a),()=>{D.delete(a)}),connect(){x=!0,R()},disconnect(){x=!1,A+=1,z=!1,y=!1,F(),g.leaveStage(c),g.disconnect()},play:O,pause:P,next:M,prev:N,goto:L,stop:Q,dismiss:function(){if(m){if(null===m.index&&n)return void H(I(q),!1);null===m.index?H(null,!1):Q()}},setVoice(a){void 0===b&&F(),h=a,E()},present:(a,b={})=>Array.isArray(a?.steps)&&a.steps.length?new Promise(d=>{J({stage:c,tour:a,from:b.from??0,autoplay:!1!==b.autoplay,origin:b.origin??"page"},!1!==b.autoplay,b.voice),k=d}):Promise.resolve(!1),sendContext(a){g.emitContext({...a,stage:c,...n?{tour:{path:n.path,title:n.def.settings?.name,index:q,count:n.def.steps.length,playing:r}}:{}})},sendMarks(a){g.emitMarks({...a,stage:c}).catch(()=>{})}}}({...b,voice:b.voice??null,onShow:a=>c.current.onShow?.(a),onMarks:a=>c.current.onMarks?.(a)})),g=d.current,j=(0,i.useSyncExternalStore)(g.subscribe,g.getSnapshot,g.getSnapshot),k=!1!==b.enabled&&!!b.url,(0,i.useEffect)(()=>{if(k)return g.connect(),()=>g.disconnect()},[g,k]),l=b.voice??null,(0,i.useEffect)(()=>{g.setVoice(l)},[g,l]),{...j,play:g.play,pause:g.pause,next:g.next,prev:g.prev,goto:g.goto,stop:g.stop,dismiss:g.dismiss,sendContext:g.sendContext,sendMarks:g.sendMarks,present:g.present}),G=(0,i.useRef)(null),H=(0,i.useRef)(null),I=F.sendContext,J=(0,i.useCallback)(a=>{G.current={...a,stage:m.stage,who:q||void 0,at:new Date().toISOString()},H.current&&clearTimeout(H.current),H.current=setTimeout(()=>I({...a,who:q||void 0}),400)},[m.stage,q,I]);(0,i.useEffect)(()=>()=>{H.current&&clearTimeout(H.current)},[]),(0,i.useEffect)(()=>{G.current&&I({...G.current,who:q||void 0})},[F.index,F.playing,F.tour,I,q]);let[K,L]=(0,i.useState)(0),M=function(a="(max-width: 599px)"){let[b,c]=(0,i.useState)(()=>(function(a){try{return!1}catch{return!1}})(0));return(0,i.useEffect)(()=>{if("function"!=typeof window.matchMedia)return;let b=window.matchMedia(a),d=()=>c(b.matches);return d(),b.addEventListener("change",d),()=>b.removeEventListener("change",d)},[a]),b}(),[N,O]=(0,i.useState)(null),P=(0,i.useCallback)(a=>O(a),[]),Q=(0,i.useCallback)(a=>O(b=>b===a?null:b),[]),[R,S]=(0,i.useState)(null),[T,U]=(0,i.useState)(null),V=F.shown?.step??null,W=null,X=x??(W&&!aQ(W)?W:null),Y=z&&z.from===x?z.doc:null,Z=V?.doc&&V.doc!==X&&V.doc!==Y?V.doc:null,[$,_]=(0,i.useState)(null);(0,i.useEffect)(()=>{let a;if(!Z)return;let b=!0;return(!(a=e9.get(Z))&&(a=fetch(`/api/file?doc=${encodeURIComponent(Z)}`,{cache:"no-store"}).then(a=>a.ok?a.json():null).then(a=>{let b=a?.content?JSON.parse(a.content):null,c=(b?.settings??b?.stateMachine?.settings)?.name;return"string"==typeof c&&c?c:null}).catch(()=>null),e9.set(Z,a)),a).then(a=>b&&_({doc:Z,title:a})),()=>{b=!1}},[Z]);let aa=F.play,ab=(0,i.useMemo)(()=>{if(!Z||!V)return null;let a=($?.doc===Z?$.title:null)??(Z.split("/").pop()??Z).replace(/\.(smdf|erdf|sqdf|sysdf)\.json$/i,"").replace(/\.json$/i,""),b=F.shown?.index!==null&&F.shown?.index!==void 0;return{drawing:a,label:b?"Open and play":"Open the drawing",onOpen:()=>{C(Z),eQ({doc:Z,system:V.system??void 0,focus:V.focus??null}),b&&aa()}}},[Z,$,V,F.shown?.index,aa,C]),ac=!!F.shown&&!M;(0,i.useEffect)(()=>{let a=document.documentElement,b=ac?document.querySelector(".stage-caption-host .slc-stage-caption"):null;if(!b||"u"<typeof ResizeObserver)return void a.style.removeProperty("--stage-caption-h");let c=()=>a.style.setProperty("--stage-caption-h",`${Math.ceil(b.getBoundingClientRect().height)+12}px`),d=new ResizeObserver(c);return d.observe(b),c(),()=>{d.disconnect(),a.style.removeProperty("--stage-caption-h")}},[ac]);let ad=(0,i.useMemo)(()=>({stage:m.stage,connected:"connected"===F.status,lit:u,author:q,setAuthor:a=>{r(a),e8("stateloom.author",a)},listener:t,answerNonce:K,report:J,lastReport:()=>G.current,sendMarks:F.sendMarks,onMarks:a=>(w.current.add(a),()=>{w.current.delete(a)}),shown:F.shown,present:F.present,companion:m.companion,pause:F.pause,stop:F.stop,board:x,setBoard:D,narrow:M,sheet:N,claimSheet:P,releaseSheet:Q,sheetHandle:R,sheetBody:T}),[m.stage,m.companion,F.status,F.shown,F.sendMarks,F.present,F.pause,F.stop,u,q,t,K,J,x,D,M,N,P,Q,R,T]),ae=F.shown?(0,h.jsx)(ce,{shown:F.shown,playing:F.playing,speaking:F.speaking,voice:F.ownVoice?void 0:o,onToggleVoice:()=>{let a=!o;p(a),e8("stateloom.stage.voice",a?"1":"0")},onPlay:F.play,onPause:F.pause,onNext:F.next,onPrev:F.prev,onGoto:F.goto,onClose:F.dismiss,onAnswer:()=>L(a=>a+1),held:ab}):null;return(0,h.jsxs)(e6.Provider,{value:ad,children:[a,M?(0,h.jsxs)("div",{className:"stage-sheet",children:[(0,h.jsx)("div",{className:"stage-sheet-handle",ref:S}),(0,h.jsx)("div",{className:"stage-sheet-body",ref:U}),!N&&ae&&(0,h.jsx)("div",{className:"stage-sheet-caption",children:ae})]}):ae&&(0,h.jsx)("div",{className:"stage-caption-host",children:ae}),m.companion&&(0,h.jsx)(e5,{stage:ad,defaultEpisode:m.companionEpisode})]})}let fb="stage-quiet-btn flex h-9 min-w-9 items-center justify-center gap-1 rounded-lg border border-gray-700 bg-gray-900/90 px-2 text-sm text-gray-200 shadow-lg backdrop-blur hover:bg-gray-800";function fc(a){let b=1/0;for(let c of[".stage-sheet",".stage-caption-host .slc-stage-caption"]){let d=document.querySelector(c)?.getBoundingClientRect();d&&d.height>0&&d.top<a.bottom&&(b=Math.min(b,d.top))}return b===1/0?0:Math.max(0,a.bottom-b+8)}async function fd(a,b){let c=await fetch(`/api/marks?doc=${encodeURIComponent(a)}`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(b)}),d=await c.json().catch(()=>({}));if(!c.ok)throw Error(d?.error??`the marks could not be written (${c.status})`);return d}function fe({docPath:a,kind:b,viewport:c,setViewport:d,boxes:e,boardRef:f,focus:g=null,level:j,onReveal:k,labels:l}){let m,n=e7(),[o,p]=(0,i.useState)([]),[q,r]=(0,i.useState)(!1),[s,t]=(0,i.useState)(null),[u,v]=(0,i.useState)(null),[w,x]=(0,i.useState)(!1),[y,z]=(0,i.useState)(!1),[A,B]=(0,i.useState)(null),[C,D]=(0,i.useState)(!1),[E,F]=(0,i.useState)(null),G=(0,i.useRef)(null),H=(0,i.useRef)(null);H.current=u;let{read:I,markRead:J}=function(a){let[b,c]=(0,i.useState)(()=>({doc:a,read:a?co(a):{}}));(0,i.useEffect)(()=>{c(b=>b.doc===a?b:{doc:a,read:a?co(a):{}})},[a]);let d=(0,i.useCallback)(b=>{a&&c(c=>{let d=c.doc===a?c.read:co(a);if(d[b.id]===(b.replies?.length??0)&&c.doc===a)return c;let e={...d,[b.id]:b.replies?.length??0};try{window.localStorage.setItem(cn(a),JSON.stringify(e))}catch{}return{doc:a,read:e}})},[a]);return{read:b.doc===a?b.read:{},markRead:d}}(a),K=n?.setBoard;(0,i.useEffect)(()=>{if(K&&a)return K(a),()=>K(null)},[K,a]);let L=(0,i.useCallback)((a,b={})=>{let c=f.current?.getBoundingClientRect();if(!c?.width||!a.length)return;let e=fc(c),g=Math.max(.4*c.height,c.height-e);d(function(a,b,c,d={}){let e=d.padding??48,f=d.floor??.55,g=S(a,b,c,{padding:e,maxScale:d.maxScale??1});if(!a.length||g.scale>=f)return g;let h=1/0,i=1/0,j=-1/0,k=-1/0;for(let b of a)h=Math.min(h,b.x),i=Math.min(i,b.y),j=Math.max(j,b.x+b.width),k=Math.max(k,b.y+b.height);let l=(j-h)*f,m=(k-i)*f;return{x:l<=b-2*e?(b-l)/2-h*f:e-h*f,y:m<=c-2*e?(c-m)/2-i*f:e-i*f,scale:f}}(a,c.width,g,{padding:48,maxScale:1,floor:b.floor??.2}))},[f,d]),M=(0,i.useCallback)(()=>{a&&fetch(`/api/marks?doc=${encodeURIComponent(a)}`,{cache:"no-store"}).then(a=>a.ok?a.json():null).then(a=>a&&Array.isArray(a.marks)&&p(a.marks)).catch(()=>{})},[a]);(0,i.useEffect)(()=>(p([]),v(null),t(null),M(),window.addEventListener("focus",M),()=>window.removeEventListener("focus",M)),[M]),(0,i.useEffect)(()=>n?.onMarks(b=>{if(!a||b.docId!==a||!Array.isArray(b.marks))return;p(b.marks);let c=function(a){let b=a.change;if(!b||"reply"!==b.action&&"add"!==b.action||!Array.isArray(a.marks))return null;let c=a.marks.findIndex(a=>a&&a.id===b.id);if(c<0)return null;let d=a.marks[c];if("add"===b.action)return d.author?.role==="agent"?{action:"add",mark:d,number:c+1,name:d.author.name||"the agent"}:null;let e=d.replies?.[d.replies.length-1];return e&&e.author?.role==="agent"?{action:"reply",mark:d,number:c+1,name:e.author.name||"the agent"}:null}(b);c&&c.mark.id!==H.current&&(F({id:c.mark.id,text:"reply"===c.action?`${c.name} answered mark ${c.number}`:`${c.name} asked about mark ${c.number}`}),G.current&&clearTimeout(G.current),G.current=setTimeout(()=>F(null),7e3))}),[n,a]),(0,i.useEffect)(()=>(F(null),()=>{G.current&&clearTimeout(G.current)}),[a]);let N=async b=>{if(!a)return!1;z(!0),B(null);try{let c=await fd(a,b);return p(c.marks),n?.sendMarks({docId:a,marks:c.marks,change:c.change}),!0}catch(a){return B(a instanceof Error?a.message:String(a)),!1}finally{z(!1)}},P=n?.lit??null,Q=P&&(!P.doc||P.doc===a)?P:null,R=Q?.spotlight,T=Q?.region??null,U=(0,i.useRef)(-1),V=(0,i.useRef)(-1),W=(0,i.useRef)(null),X=(0,i.useMemo)(()=>R?.length?bt(e,R):[],[e,R]);(0,i.useEffect)(()=>{if(!Q||U.current===Q.nonce)return;let a=[...X,...T?[T]:[]];if(!a.length){R?.length&&V.current!==Q.nonce&&(V.current=Q.nonce,k?.(R));return}U.current=Q.nonce;let b=()=>L(a);b(),W.current&&clearTimeout(W.current),W.current=setTimeout(b,520)},[Q,X,T,R,L,k]),(0,i.useEffect)(()=>()=>{W.current&&clearTimeout(W.current)},[]);let Y=(0,i.useRef)(null),Z=(0,i.useRef)([]),$=(0,i.useRef)(c);$.current=c,(0,i.useEffect)(()=>{if(!a||Y.current===a)return;if(Q){Y.current=a;return}let b=o.filter(a=>"resolved"!==a.status&&(!a.level||!j||a.level===j));if(!b.length||!e.length)return;let c=b.filter(a=>a.elements?.length),d=c.filter(a=>bt(e,a.elements).length>0);if(c.length&&!d.length)return;let h=[...d,...b.filter(a=>!a.elements?.length)].map(a=>bV(a,e)).filter(a=>!!a);if(Y.current=a,!h.length)return;let i=[...h,...g?bt(e,[g]):[]],k=()=>{let a=f.current?.getBoundingClientRect();if(!a?.width)return;let b=$.current,c=O(b,{x:0,y:0}),d=O(b,{x:a.width,y:a.height-fc(a)});i.every(a=>a.x>=c.x&&a.y>=c.y&&a.x+a.width<=d.x&&a.y+a.height<=d.y)||L(i,{floor:.55})};for(let a of(k(),Z.current))clearTimeout(a);Z.current=[setTimeout(k,520),setTimeout(k,1400)]},[a,o,e,Q,j,g,L,f]),(0,i.useEffect)(()=>()=>{for(let a of Z.current)clearTimeout(a)},[]);let _=(0,i.useRef)(n?.answerNonce??0);(0,i.useEffect)(()=>{if(!n||n.answerNonce===_.current)return;_.current=n.answerNonce;let a=R?.length?[...R]:Q?.focus?[Q.focus]:g?[g]:[];x(!1),v(null),t({elements:a,region:T??void 0,listen:!!n.listener})},[n,R,Q,g,T]);let aa=n?.report;(0,i.useEffect)(()=>{if(!aa||!a)return;let d=f.current?.getBoundingClientRect(),e=O(c,{x:0,y:0}),h=d?O(c,{x:d.width,y:d.height}):e;aa({doc:a,kind:b,system:void 0,focus:g,...d?.width?{visible:{x:Math.round(e.x),y:Math.round(e.y),width:Math.round(h.x-e.x),height:Math.round(h.y-e.y)}}:{}})},[aa,a,b,g,c,f]);let ab=n?.companion?e$(a):null,ac=function(a,b){let c;if(!a||!b)return null;let d=(c=b.match(/-episode-(\d+)-/))?Number(c[1]):null,e=null===d?"this episode":`episode ${d}`;switch(a){case"listening":return`Mia is listening in ${e}: she answers here`;case"answering":return"Mia is answering";case"answered":return`Mia has answered in ${e}: your mark waits until she listens again`;case"away":return`No seat is listening in ${e}: your mark waits until one does`;default:return null}}(function(a,b){let[c,d]=(0,i.useState)(null);return(0,i.useEffect)(()=>{if(!a||!b)return;let c=!0,e=async()=>{if("u"<typeof document||"visible"===document.visibilityState)try{let b=await fetch(`/api/companion/thread?episode=${encodeURIComponent(a)}`,{cache:"no-store"}),e=await b.json();c&&d({episode:a,state:e.success?e.presence?.state??null:null})}catch{c&&d({episode:a,state:null})}};e();let f=setInterval(()=>void e(),1e4);return()=>{c=!1,clearInterval(f)}},[a,b]),c&&c.episode===a?c.state:null}(ab,!!(s||u||w)),ab),ad=(0,i.useMemo)(()=>bq(o,I).map(a=>a.id),[o,I]),ae=function(a,b={}){return{forYou:bo(a,"person").length,forAgent:bo(a,"agent").length,unread:bq(a,b).length}}(o,I),af=o.find(a=>a.id===u)??null,ag=af?.replies?.length??0;(0,i.useEffect)(()=>{af&&J(af)},[af?.id,ag,J]);let ah=(0,i.useCallback)(a=>{t(null),x(!1),r(!1),v(a),F(null)},[]);(0,i.useEffect)(()=>{let b=()=>{let b=a&&eV?.doc===a?eV.id:null,c=b?o.find(a=>a.id===b):null;if(!c)return;eV=null,ah(c.id);let d=bV(c,e);d&&setTimeout(()=>L([d],{floor:.55}),60)};return b(),window.addEventListener(eU,b),()=>window.removeEventListener(eU,b)},[a,o,e,ah,L]);let ai=!!(s||af||w),aj=n?.claimSheet,ak=n?.releaseSheet;(0,i.useEffect)(()=>{ai?aj?.("card"):ak?.("card")},[ai,aj,ak]),(0,i.useEffect)(()=>()=>ak?.("card"),[ak]);let al=!!n?.narrow,am=n?.sheet??null,[an,ao]=(0,i.useState)(am);an!==am&&(ao(am),al&&"talk"===am&&(t(null),v(null),x(!1)));let ap=(0,i.useRef)(null),[aq,ar]=(0,i.useState)(null);(0,i.useEffect)(()=>{let a=ap.current;if(!a)return;let b=()=>{let b={x:a.offsetLeft,y:a.offsetTop,width:a.offsetWidth,height:a.offsetHeight};ar(a=>a&&a.x===b.x&&a.y===b.y&&a.width===b.width&&a.height===b.height?a:b)};if(b(),window.addEventListener("resize",b),"u"<typeof ResizeObserver)return()=>window.removeEventListener("resize",b);let c=new ResizeObserver(b);return c.observe(a),()=>{c.disconnect(),window.removeEventListener("resize",b)}},[a]);let[as,at]=(0,i.useState)(null),au=n?.shown??null;(0,i.useEffect)(()=>{let a=f.current;if(!a)return;let b=()=>document.querySelector(".stage-sheet")??document.querySelector(".stage-caption-host .slc-stage-caption"),c=0,d=()=>{cancelAnimationFrame(c),c=requestAnimationFrame(()=>{let c=a.getBoundingClientRect(),d=b()?.getBoundingClientRect(),e=d&&d.height>0&&d.top<c.bottom?{x:d.left-c.left,y:d.top-c.top,width:d.width,height:Math.min(d.bottom,c.bottom)-d.top}:null;at(a=>a&&e&&a.x===e.x&&a.y===e.y&&a.width===e.width&&a.height===e.height?a:e)})};d();let e=b(),g=e&&"u">typeof ResizeObserver?new ResizeObserver(d):null;return e&&g?.observe(e),window.addEventListener("resize",d),()=>{cancelAnimationFrame(c),g?.disconnect(),window.removeEventListener("resize",d)}},[f,au,ai,am,al,a]);let av=(0,i.useMemo)(()=>[aq,as].filter(a=>!!a),[aq,as]);return a?(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(bW,{viewport:c,boxes:e,spotlight:R,region:T,marks:o,unread:ad,selectedMark:u,onSelectMark:a=>{t(null),x(!1),v(b=>b===a?null:a)},marking:q,onDraft:a=>{r(!1),v(null),x(!1),F(null),t(a)},draft:s,avoid:av}),(0,h.jsxs)("div",{className:"stage-board-controls",ref:ap,children:[E&&(0,h.jsx)(cm,{className:"stage-board-notice",onOpen:()=>ah(E.id),onDismiss:()=>F(null),children:E.text}),(0,h.jsxs)("button",{type:"button",className:`${fb} ${q?"!border-amber-400 !text-amber-300":""}`,"aria-pressed":q,onClick:()=>{t(null),r(a=>!a)},title:q?"Marking: tap an element, or drag around several. Tap ✎ again to stop.":"Mark something for the agent — tap an element or drag around several",children:[(0,h.jsx)(cc,{}),q&&(0,h.jsx)("span",{className:"text-xs",children:"marking"})]}),(0,h.jsxs)("button",{type:"button",className:fb,"aria-expanded":w,onClick:()=>{t(null),v(null),F(null),x(a=>!a)},title:`Marks on this drawing${ae.forYou?` \xb7 ${ae.forYou} for you`:""}${ae.forAgent?` \xb7 ${ae.forAgent} waiting on the agent`:""}`,"aria-label":`Marks on this drawing: ${ae.forYou} for you${ae.unread?` (${ae.unread} new)`:""}, ${ae.forAgent} waiting on the agent`,children:[(0,h.jsx)(b3,{}),ae.forYou>0&&(0,h.jsxs)("span",{className:`stage-for-you${ae.unread?" stage-for-you--new":""}`,children:[ae.forYou," for you"]}),ae.forAgent>0&&(0,h.jsx)("span",{className:"text-xs text-gray-400",children:ae.forAgent})]})]}),q&&!s&&!E&&(0,h.jsx)("div",{className:"stage-board-hint",role:"status",children:"Tap an element, or drag around several, to say something about it."}),ai&&(m=s?(0,h.jsx)(cj,{elements:s.elements,region:s.region,author:n?.author??"",onAuthorChange:n?.setAuthor,listener:n?.listener,listenAtOnce:!!s.listen,busy:y,error:A,note:ac,labels:l,onCancel:()=>{t(null),B(null)},onSubmit:async({text:a,kind:b,author:c})=>{await N({action:"add",mark:{text:a,kind:b,elements:s.elements,region:s.region,level:j,author:{name:c||"someone"}}})&&t(null)}},`${s.elements.join(",")}|${s.region?JSON.stringify(s.region):""}`):af?(0,h.jsx)(ck,{mark:af,number:o.indexOf(af)+1,listener:n?.listener,busy:y,error:A,note:ac,labels:l,onClose:()=>v(null),onReply:a=>void N({action:"reply",id:af.id,text:a,author:{name:n?.author||"someone"}}),onResolve:()=>void N({action:"resolve",id:af.id}),onReopen:()=>void N({action:"reopen",id:af.id}),onRemove:async()=>{await N({action:"remove",id:af.id})&&v(null)}}):(0,h.jsx)(cl,{marks:o,unread:ad,selected:u,onSelect:a=>{x(!1),v(a)},onCopy:()=>{var b,c;let d,e;if(!a)return;let f=(b=n?.lastReport()??null,d=(c=[{doc:a,marks:o.filter(a=>"resolved"!==a.status)}]).reduce((a,b)=>a+b.marks.length,0),e=function(a){if(!a||!a.doc)return"No canvas has said what it is showing.";let b=[`${a.who?`${a.who} is`:"The canvas is"} on ${bu(a.doc)}${a.kind?` (${a.kind})`:""}`];a.system&&b.push(`as a member of ${bu(a.system)}`),a.focus&&b.push(`with ${a.focus} in hand`);let c=b.join(", ")+".";return a.tour&&(c+=` Tour ${a.tour.title?`'${a.tour.title}' `:""}at step ${a.tour.index+1} of ${a.tour.count}, ${a.tour.playing?"playing":"paused"}.`),a.at&&(c+=` (reported ${a.at})`),c}(b),d?`${e}
|
|
11
|
+
${a}`)}l(!0)};return(0,h.jsxs)("div",{className:"flex flex-col gap-1.5 px-2 py-1.5 bg-gray-900 border-b border-gray-800 md:flex-row md:flex-wrap md:items-center md:px-3",children:[(0,h.jsxs)("div",{className:"toolbar-ident",children:[(0,h.jsx)("input",{ref:A,type:"file",accept:".json,.smdf.json",onChange:a=>{let b=a.target.files?.[0];if(!b)return;let c=new FileReader;c.onload=a=>{e(a.target?.result,b.name)},c.readAsText(b),a.target.value=""},className:"hidden"}),(0,h.jsxs)("span",{className:"text-xs text-gray-400 mr-1 truncate max-w-[50vw] md:max-w-none",children:[b??"untitled.smdf.json",d&&(0,h.jsx)("span",{className:"text-yellow-500 ml-0.5",children:"●"})]}),(0,h.jsx)(el,{}),"synced"===u&&(0,h.jsx)("span",{className:"text-[10px] text-emerald-500",title:"In sync with disk",children:"⌁ synced"}),"remote-changed"===u&&(0,h.jsx)("span",{className:"text-[10px] text-amber-400",title:v??"",children:"↻ remote changed"}),"error"===u&&(0,h.jsxs)("span",{className:"inline-flex items-center gap-0.5 text-[10px] text-red-400",title:v??"",children:[(0,h.jsx)(em,{size:11})," disk error"]}),"idle"===u&&(0,h.jsx)("span",{className:"text-[10px] text-gray-600",title:v??"No file bound",children:"○ no disk"}),(0,h.jsx)(en,{}),(0,h.jsx)("div",{className:"flex-1"})]}),(0,h.jsxs)("div",{className:"toolbar-strip",children:[(0,h.jsx)("button",{onClick:q,disabled:0===s.length,className:"toolbar-btn disabled:opacity-30",title:"Undo (Ctrl+Z)","aria-label":"Undo",children:(0,h.jsx)(ed,{name:"undo"})}),(0,h.jsx)("button",{onClick:r,disabled:0===t.length,className:"toolbar-btn disabled:opacity-30",title:"Redo (Ctrl+Y)","aria-label":"Redo",children:(0,h.jsx)(ed,{name:"redo"})}),(0,h.jsx)("div",{className:"w-px h-4 bg-gray-700"}),(0,h.jsxs)("button",{onClick:p,className:"toolbar-btn",title:"Arrange states into layers (auto-layout)",children:[(0,h.jsx)(ed,{name:"arrange"})," Arrange"]}),(0,h.jsx)("div",{className:"w-px h-4 bg-gray-700"}),(0,h.jsxs)("button",{onClick:()=>o("select"===n?"transition":"select"),className:`toolbar-btn ${"transition"===n?"!bg-amber-700 !text-white":""}`,title:"transition"===n?"Exit draw mode (Esc)":"Draw transition mode",children:[(0,h.jsx)(ed,{name:"draw"})," ","transition"===n?"Drawing":"Draw"]}),(0,h.jsx)("div",{className:"w-px h-4 bg-gray-700"}),(0,h.jsx)("button",{onClick:()=>A.current?.click(),className:"toolbar-btn",title:"Open local .smdf.json (browser)","aria-label":"Open a local file",children:(0,h.jsx)(ed,{name:"open"})}),(0,h.jsxs)("button",{onClick:P,disabled:F,className:"toolbar-btn disabled:opacity-40",title:"Save to disk (STATELOOM_PROJECT_FILE)",children:[(0,h.jsx)(ed,{name:"save"})," Disk"]}),(0,h.jsx)("button",{onClick:R,className:"toolbar-btn",title:"Reload from disk","aria-label":"Reload from disk",children:(0,h.jsx)(ed,{name:"reload"})}),(0,h.jsx)("button",{onClick:()=>{let a=new Blob([f()],{type:"application/json"}),c=URL.createObjectURL(a),d=document.createElement("a");d.href=c,d.download=b??"statemachine.smdf.json",d.click(),URL.revokeObjectURL(c)},className:"toolbar-btn",title:"Download as file","aria-label":"Download as file",children:(0,h.jsx)(ed,{name:"download"})}),(0,h.jsx)("select",{value:H,onChange:a=>{I(a.target.value),O(null),M(null)},className:"bg-gray-800 border border-gray-700 rounded text-xs text-gray-300 px-1 py-0.5",title:"Export format",children:d5.map(a=>(0,h.jsx)("option",{value:a,children:d6[a]},a))}),(0,h.jsx)("button",{onClick:Q,disabled:J,className:`toolbar-btn disabled:opacity-40 ${L?"!text-red-400":""}`,title:L??`Export the board as ${d6[H]}`,children:J?"…":(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(ed,{name:"image"})," Export"]})}),N&&!L&&(0,h.jsxs)("span",{className:"text-[10px] text-emerald-500 truncate max-w-[40vw] md:max-w-[16rem]",title:N,children:["⤓ ",N]}),(0,h.jsx)("div",{className:"w-px h-4 bg-gray-700"}),B?(0,h.jsxs)("div",{className:"flex items-center gap-1",children:[(0,h.jsx)("input",{autoFocus:!0,className:"bg-gray-800 border border-gray-700 rounded px-2 py-0.5 text-xs text-gray-200 w-32 md:w-24",placeholder:"State name...",value:D,onChange:a=>E(a.target.value),onKeyDown:a=>{"Enter"===a.key&&S(),"Escape"===a.key&&C(!1)}}),(0,h.jsx)("button",{onClick:S,className:"toolbar-btn-sm","aria-label":"Add the state",children:(0,h.jsx)(ed,{name:"check"})}),(0,h.jsx)("button",{onClick:()=>C(!1),className:"toolbar-btn-sm","aria-label":"Cancel",children:"✕"})]}):(0,h.jsxs)("button",{onClick:()=>C(!0),className:"toolbar-btn",children:[(0,h.jsx)(ed,{name:"plus"})," State"]}),(0,h.jsx)("div",{className:"w-px h-4 bg-gray-700"}),(0,h.jsxs)("button",{onClick:()=>j(),className:"toolbar-btn",children:[(0,h.jsx)(ed,{name:"check"})," Validate"]}),(0,h.jsxs)("select",{value:T,onChange:a=>U(a.target.value),className:"bg-gray-800 border border-gray-700 rounded text-xs text-gray-300 px-1 py-0.5",children:[(0,h.jsx)("option",{value:"python",children:"Python"}),(0,h.jsx)("option",{value:"typescript",children:"TypeScript"})]}),(0,h.jsxs)("button",{onClick:W,className:"toolbar-btn",children:[(0,h.jsx)(ed,{name:"bolt"})," Generate"]}),(0,h.jsxs)("button",{onClick:V,className:"toolbar-btn",title:"Generate RISE rispec markdown",children:[(0,h.jsx)(ed,{name:"scroll"})," RISE"]}),(0,h.jsxs)("button",{onClick:()=>l(!k),className:`toolbar-btn ${k?"text-blue-400":""}`,children:[(0,h.jsx)(ed,{name:"code"})," Code"]})]})]})}function ep(){let a=d_(a=>a.generatedCode),b=d_(a=>a.showCodePreview),c=d_(a=>a.setShowCodePreview);return b?(0,h.jsx)("div",{className:"absolute inset-0 z-50 flex items-center justify-center bg-black/60 p-2 md:p-0",children:(0,h.jsxs)("div",{className:"bg-gray-900 border border-gray-700 rounded-lg shadow-xl w-full max-h-[85dvh] md:w-[80%] md:max-w-3xl md:max-h-[80dvh] flex flex-col",children:[(0,h.jsxs)("div",{className:"flex items-center justify-between px-4 py-2 border-b border-gray-800",children:[(0,h.jsx)("h3",{className:"text-sm font-semibold text-gray-300",children:"Generated Definition (JSON)"}),(0,h.jsx)("button",{onClick:()=>c(!1),className:"text-gray-500 hover:text-gray-300 text-lg min-h-11 min-w-11 md:min-h-0 md:min-w-0","aria-label":"Close preview",children:"✕"})]}),(0,h.jsx)("pre",{className:"flex-1 overflow-auto overscroll-contain p-4 text-[11px] leading-relaxed text-green-400 font-mono md:text-sm",children:a??"No code generated yet"}),(0,h.jsx)("div",{className:"flex justify-end px-4 py-2 border-t border-gray-800",children:(0,h.jsx)("button",{onClick:()=>{a&&navigator.clipboard.writeText(a)},className:"text-xs bg-gray-700 hover:bg-gray-600 text-gray-300 px-4 py-3 rounded md:px-3 md:py-1",children:"Copy to Clipboard"})})]})}):null}function eq(){let a=d_(a=>a.applyRemote),b=d_(a=>a.setRemoteStatus),c=d_(a=>a.setRemoteMtime),d=(0,ek.useRequestedDoc)();return(0,i.useEffect)(()=>{let e=!1,f=(0,ek.docQuery)(d);async function g(){try{let a=await fetch(`/api/file${f}`,{cache:"no-store"});if(!a.ok)return null;return await a.json()}catch{return null}}(async()=>{let c=await g();e||(c?.path&&d_.getState().setDocPath(c.path),c?.exists&&c.content?a(c.content,c.mtime,c.path.split("/").pop()):b("idle",c?`No file at ${c.path}`:null))})();let h=new EventSource(`/api/watch${f}`);return h.addEventListener("hello",a=>{try{let b=JSON.parse(a.data);"number"==typeof b?.mtime&&c(b.mtime)}catch{}}),h.addEventListener("change",async d=>{let e=0;try{e=JSON.parse(d.data)?.mtime??0}catch{}if(e<=(d_.getState().remoteMtime??0))return;let f=await g();f?.exists&&f.content&&(d_.getState().dirty?(b("remote-changed",`Disk changed at ${new Date(f.mtime).toLocaleTimeString()} — local has unsaved edits`),c(f.mtime)):a(f.content,f.mtime,f.path.split("/").pop()))}),h.addEventListener("error",()=>{b("error","Watch stream disconnected")}),()=>{e=!0,h.close()}},[a,b,c,d]),null}function er({url:a}){let b=(0,ek.useRequestedDoc)();return(0,i.useEffect)(()=>{if(!a)return;let c=!1,d=null,e=null,f=null,g=null;return(async()=>{let h="";try{let a=await fetch(`/api/file${(0,ek.docQuery)(b)}`,{cache:"no-store"});a.ok&&(h=(await a.json())?.path??"")}catch{}c||(h&&d_.getState().setDocPath(h),(d=dL({url:a,role:"web",docId:h,name:"web-designer",onFull:a=>{d_.getState().applyRemote(JSON.stringify({stateMachine:a.def}),a.mtime??Date.now(),h&&h.split("/").pop()||void 0),g=a.def},onPatch:a=>{d_.getState().applyRemoteOps(a.ops,a.mtime??Date.now(),a.seq),g=d_.getState().definition},onPresence:a=>{d_.getState().setPresence(a)}})).connect(),e=d_.subscribe((a,b)=>{a.definition===b.definition||a._applyingRemote||(f&&clearTimeout(f),f=setTimeout(()=>{var a,b;let c,e;if(!d||"connected"!==d.getSnapshot().status)return;let f=d_.getState().definition;if(null===g){d.emitFull(f),g=f;return}let h=(a=g,b=f,c=a??{settings:{namespace:"",asynchronous:!1},events:[],state:{name:b.state.name,states:[]}},function(a,b,c){let d={},e=!1,f=new Set([...Object.keys(a.settings),...Object.keys(b.settings)]),g=a.settings,h=b.settings;for(let a of f)q(g[a],h[a])||void 0===h[a]||(d[a]=h[a],e=!0);void 0!==a.settings.notes&&void 0===b.settings.notes&&(d.notes="",e=!0),e&&c.push({op:"settings.update",patch:d})}(c,b,e=[]),function(a,b,c){let d=a.events,e=b.events,f=Math.min(d.length,e.length);for(let a=0;a<f;a++)!function(a,b,c,d){let e={},f=!1;for(let a of["name","file","feeder","description","timers"])q(b[a],c[a])||void 0===c[a]||(e[a]=c[a],f=!0);f&&d.push({op:"eventSource.update",index:a,patch:e});let g=b.events??[],h=c.events??[],i=new Set(h.map(a=>a.id));for(let a of g)i.has(a.id)||d.push({op:"event.remove",id:a.id});let j=g.filter(a=>i.has(a.id)),k=0;for(;k<h.length;){let b=h[k];k<j.length&&j[k].id===b.id?(function(a,b,c){let d={},e=!1;for(let c of["name","description","preAction","postAction"])q(a[c],b[c])||void 0===b[c]||(d[c]=b[c],e=!0);e&&c.push({op:"event.update",id:b.id,patch:d})}(j[k],b,d),function(a,b,c,d){let e=Math.min(b.length,c.length);for(let f=0;f<e;f++)if(!q(b[f],c[f])){let e={};b[f].name!==c[f].name&&(e.name=c[f].name),b[f].type!==c[f].type&&(e.type=c[f].type),d.push({op:"parameter.update",eventId:a,index:f,patch:e})}for(let b=e;b<c.length;b++)d.push({op:"parameter.add",eventId:a,parameter:c[b],index:b});for(let e=b.length-1;e>=c.length;e--)d.push({op:"parameter.remove",eventId:a,index:e})}(b.id,j[k].parameters??[],b.parameters??[],d)):(d.push({op:"event.add",sourceIndex:a,event:b,index:k}),j.splice(k,0,b)),k++}}(a,d[a],e[a],c);for(let a=d.length;a<e.length;a++)c.push({op:"eventSource.add",source:e[a]});for(let a=d.length-1;a>=e.length;a--)c.push({op:"eventSource.remove",index:a})}(c,b,e),function(a,b,c){let d=o(a.state),e=o(b.state),f=new Map(d.map(a=>[a.name,a])),g=new Map(e.map(a=>[a.name,a])),h=p(a.state),i=p(b.state),j=[];for(let a of e){if(f.has(a.name))continue;let b=i.get(a.name)??null,{states:d,transitions:e,...g}=a;c.push({op:"state.add",parent:b,state:{...g}}),e&&e.length>0&&j.push({state:a.name,transitions:e})}for(let a of e){if(!f.has(a.name))continue;let b=h.get(a.name)??null,d=i.get(a.name)??null;b!==d&&null!==d&&c.push({op:"state.nest",child:a.name,newParent:d})}for(let a of e){let b=f.get(a.name);if(!b)continue;let d={},e=!1;q(b.kind,a.kind)||void 0===a.kind||(d.kind=a.kind,e=!0),q(b.description,a.description)||void 0===a.description||(d.description=a.description,e=!0),q(b.notes,a.notes)||(d.notes=a.notes??"",e=!0),q(b.prompt,a.prompt)||(d.prompt=a.prompt??"",e=!0),e&&c.push({op:"state.update",name:a.name,patch:d}),r(a.name,"onEntry",b.onEntry?.actions??[],a.onEntry?.actions??[],c),r(a.name,"onExit",b.onExit?.actions??[],a.onExit?.actions??[],c)}for(let a of j)a.transitions.forEach((b,d)=>{c.push({op:"transition.add",state:a.state,transition:b,index:d})});for(let a of e){let b=f.get(a.name);b&&function(a,b,c,d){let e=Math.min(b.length,c.length);for(let f=0;f<e;f++){if(q(b[f],c[f]))continue;let e={};for(let a of["event","nextState","condition","description","actions"])q(b[f][a],c[f][a])||void 0===c[f][a]||(e[a]=c[f][a]);Object.keys(e).length>0&&d.push({op:"transition.update",state:a,index:f,patch:e})}for(let b=e;b<c.length;b++)d.push({op:"transition.add",state:a,transition:c[b],index:b});for(let e=b.length-1;e>=c.length;e--)d.push({op:"transition.remove",state:a,index:e})}(a.name,b.transitions??[],a.transitions??[],c)}for(let a=d.length-1;a>=0;a--){let b=d[a];if(g.has(b.name))continue;let e=b.transitions??[];for(let a=e.length-1;a>=0;a--)c.push({op:"transition.remove",state:b.name,index:a});c.push({op:"state.remove",name:b.name})}}(c,b,e),e);0!==h.length&&(d.emitPatch(h),g=f)},60))}))})(),()=>{c=!0,f&&clearTimeout(f),e&&e(),d&&d.disconnect()}},[a,b]),null}function es(){let a=process.env.NEXT_PUBLIC_STATELOOM_BRIDGE_URL??process.env.NEXT_PUBLIC_SMCRAFT_BRIDGE_URL;return"string"==typeof a&&a.length>0?a:void 0}let et=null;function eu(){return et||(et=(async()=>{let a=es()??null;try{let b=await fetch("/api/config",{cache:"no-store"});if(b.ok){let c=await b.json();return{bridgeUrl:c.bridgeUrl||a,projectFile:c.projectFile??null,stage:c.stage??null,companion:!0===c.companion,companionEpisode:c.companionEpisode??null}}}catch{}return{bridgeUrl:a,projectFile:null,stage:null,companion:!1,companionEpisode:null}})())}function ev(){let a=es(),[b,c]=(0,i.useState)(a);return((0,i.useEffect)(()=>{let a=!0;return eu().then(b=>{a&&b.bridgeUrl&&c(b.bridgeUrl)}),()=>{a=!1}},[]),"string"==typeof b&&b.length>0)?(0,h.jsx)(er,{url:b}):(0,h.jsx)(eq,{})}function ew(a){return Number.isFinite(a)?Math.min(1.75,Math.max(.75,a)):1}function ex(a){"u">typeof document&&(document.documentElement.style.fontSize=`${16*ew(a)}px`)}let ey=1,ez=!1,eA=new Set;function eB(){return ez||(ez=!0,ey=1),ey}function eC(){return 1}function eD(a){return eA.add(a),()=>{eA.delete(a)}}function eE(a,b){let c=ew(a);if(ex(c),b,ez=!0,c!==ey)for(let a of(ey=c,eA))a()}function eF(a,b){return Math.max(1,Math.hypot(b.clientX-a.clientX,b.clientY-a.clientY))}function eG(a,b){for(let c=0;c<a.length;c++)if(a[c].identifier===b)return a[c];return null}function eH(){let a=(0,i.useSyncExternalStore)(eD,eB,eC),b=(0,i.useRef)(null),c=(0,i.useRef)(null),d=(0,i.useRef)(null);(0,i.useEffect)(()=>{ex(a)},[a]);let e=(0,i.useCallback)(a=>{c.current=a,null===d.current&&(d.current=requestAnimationFrame(()=>{d.current=null,null!==c.current&&eE(c.current,!1)}))},[]),f=(0,i.useCallback)(()=>{c.current=null,eE(1,!0)},[]);return((0,i.useEffect)(()=>{let a=()=>{let a=b.current;if(b.current=null,!a?.engaged)return;null!==d.current&&(cancelAnimationFrame(d.current),d.current=null);let e=c.current??eB();c.current=null,eE(ew(e),!0)},f=c=>{if(2!==c.touches.length){b.current&&a();return}let[d,e]=[c.touches[0],c.touches[1]];d2(d.target)||d2(e.target)||(b.current={a:d.identifier,b:e.identifier,startScale:eB(),startDist:eF(d,e),engaged:!1})},g=a=>{let c=b.current;if(!c)return;let d=eG(a.touches,c.a),f=eG(a.touches,c.b);if(!d||!f)return;a.preventDefault();let g=eF(d,f);if(!c.engaged){if(12>Math.abs(g-c.startDist))return;c.engaged=!0,c.startDist=g;return}e(ew(c.startScale*(g/c.startDist)))},h=c=>{let d=b.current;d&&(eG(c.touches,d.a)&&eG(c.touches,d.b)||a())};return document.addEventListener("touchstart",f,{passive:!0,capture:!0}),document.addEventListener("touchmove",g,{passive:!1,capture:!0}),document.addEventListener("touchend",h,{passive:!0,capture:!0}),document.addEventListener("touchcancel",h,{passive:!0,capture:!0}),()=>{document.removeEventListener("touchstart",f,{capture:!0}),document.removeEventListener("touchmove",g,{capture:!0}),document.removeEventListener("touchend",h,{capture:!0}),document.removeEventListener("touchcancel",h,{capture:!0}),null!==d.current&&cancelAnimationFrame(d.current)}},[e]),1===a)?null:(0,h.jsxs)("div",{className:"ui-scale-pill",role:"status","aria-live":"polite",children:[(0,h.jsxs)("span",{children:["UI ",Math.round(100*a),"%"]}),(0,h.jsx)("button",{type:"button",onClick:f,"aria-label":"Reset interface size to 100 percent",children:"Reset"})]})}var eI=i;class eJ extends eI.Component{state={error:null};static getDerivedStateFromError(a){return{error:a}}componentDidCatch(a,b){console.error(`[stateloom] the ${this.props.what} could not be drawn:`,a,b.componentStack)}componentDidUpdate(a){this.state.error&&a.resetKey!==this.props.resetKey&&this.setState({error:null})}render(){let{error:a}=this.state;return a?(0,h.jsx)("div",{role:"alert",className:"flex h-full w-full items-center justify-center p-6 text-center text-sm text-amber-300",children:(0,h.jsxs)("p",{className:"max-w-md",children:["This ",this.props.what," cannot be drawn: ",a.message,". The file on disk is unchanged — correct it in the panel, in the file, or with the agent that wrote it."]})}):this.props.children}}function eK({locked:a,size:b=16}){return(0,h.jsxs)("svg",{width:b,height:b,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:[(0,h.jsx)("rect",{x:"5",y:"11",width:"14",height:"9",rx:"2"}),(0,h.jsx)("path",{d:a?"M8 11V8a4 4 0 0 1 8 0v3":"M8 11V8a4 4 0 0 1 7.5-1.9"})]})}function eL(a){let{onClose:b,restVh:c,tallVh:d}=a,[e,f]=(0,i.useState)(!1),[g,h]=(0,i.useState)(null),j=(0,i.useRef)(null),k=()=>{f(!1),b()},l=a=>{let b=j.current;if(!b||b.id!==a.pointerId)return;j.current=null;let c=a.clientY-b.y;if(h(null),6>Math.abs(c))return f(a=>!a);if(c<=-50)return f(!0);if(c>=80){if(e&&c<260)return f(!1);k()}},m=e?d:c,n=null!==g;return{zoneProps:{onPointerDown:a=>{a.target.closest("button")||(j.current={y:a.clientY,id:a.pointerId},a.currentTarget.setPointerCapture(a.pointerId),h(0))},onPointerMove:a=>{let b=j.current;b&&b.id===a.pointerId&&h(a.clientY-b.y)},onPointerUp:l,onPointerCancel:l,style:{touchAction:"none",cursor:"grab"}},sheetStyle:{"--sheet-h":n&&g<0?`min(calc(${m}dvh + ${-g}px), ${d}dvh)`:`${m}dvh`,...n?{transition:"none"}:{},...n&&g>0?{transform:`translateY(${g}px)`}:{}},close:k}}let eM="stateloom:focus-request",eN="stateloom:system-changed",eO="stateloom:system-found",eP="stateloom:strip-note";function eQ(a){let[b,c]=(0,i.useState)(null);return(0,i.useEffect)(()=>{let a=()=>c(null);a();let b=["popstate",ek.DOC_CHANGE_EVENT,"stateloom:focus",eM,eO];for(let c of b)window.addEventListener(c,a);return()=>{for(let c of b)window.removeEventListener(c,a)}},[a]),b}function eR(a){let b=new URL(window.location.href),c=b.searchParams.get("doc")!==a.doc;b.searchParams.set("doc",a.doc);let d=void 0===a.system?b.searchParams.get("system"):a.system;d?b.searchParams.set("system",d):b.searchParams.delete("system"),a.focus?b.searchParams.set("focus",a.focus):b.searchParams.delete("focus"),c?window.history.pushState({},"",b):window.history.replaceState(window.history.state,"",b),c&&window.dispatchEvent(new Event(ek.DOC_CHANGE_EVENT)),window.dispatchEvent(new Event(eM))}function eS(a){}function eT(){let[a,b]=(0,i.useState)({focus:null,nonce:0});return(0,i.useEffect)(()=>{let a=()=>b(a=>({focus:null,nonce:a.nonce+1}));a();let c=["popstate",ek.DOC_CHANGE_EVENT,eM];for(let b of c)window.addEventListener(b,a);return()=>{for(let b of c)window.removeEventListener(b,a)}},[]),a}var eU=a.i(19933);let eV="stateloom:mark-request",eW=null,eX="/api/companion/",eY="stateloom.companion.autoplay",eZ="stateloom.companion.episode",e$=/^\d{4}-\d{2}-\d{2}-episode-\d+-[a-z0-9-]+$/;function e_(a){let b=a?.match(/(?:^|\/)(\d{4}-\d{2}-\d{2}-episode-\d+-[a-z0-9-]+)\/diagrams\/[^/]+$/);return b?b[1]:null}function e0(a){try{return window.localStorage.getItem(a)}catch{return null}}function e1(a,b){try{window.localStorage.setItem(a,b)}catch{}}let e2=a=>{let b=new Date(a);return Number.isNaN(b.getTime())?"":b.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})},e3=a=>"starting"===a||"recording"===a||"sending"===a,e4={state:"idle",seconds:0,held:0,message:"",error:!1,stored:null},e5={episode:null,items:[],presence:null,waiting:null,error:null};function e6({stage:a,defaultEpisode:b}){let[c,d]=(0,i.useState)(!1),[e,f]=(0,i.useState)(()=>"0"!==e0(eY)),[g,j]=(0,i.useState)(()=>{let a=null,c=e0(eZ);return(a&&e$.test(a)?a:null)??e_((0,ek.requestedDoc)())??(c&&e$.test(c)?c:null)??b}),[k,l]=(0,i.useState)([]),[m,n]=(0,i.useState)(e4),[o,p]=(0,i.useState)(e5),[q,r]=(0,i.useState)(null),[s,t]=(0,i.useState)([]),[u,v]=(0,i.useState)(null),[w,x]=(0,i.useState)(null),[y,z]=(0,i.useState)(()=>Date.now()),A=(0,i.useRef)(a),B=(0,i.useRef)(g),C=(0,i.useRef)(e);(0,i.useEffect)(()=>{A.current=a,B.current=g,C.current=e});let D=(0,i.useRef)(e4),E=(0,i.useRef)(null),F=(0,i.useRef)([]),G=(0,i.useRef)(!1),H=(0,i.useRef)([]),I=(0,i.useRef)(null),J=(0,i.useRef)(null),K=(0,i.useMemo)(()=>dM({recordings:!0,speech:!1}),[]),L=a=>{E.current=a,r(a)},M=(0,i.useRef)(async()=>{}),N=(0,i.useCallback)(async(a,b=0)=>{L(a.id),t(b=>b.filter(b=>b!==a.id)),a.steps?.length&&window.matchMedia("(max-width: 767px)").matches&&d(!1);let c=F.current.length;v(c?`${c} more of Mia's replies wait after this one.`:null);let e=await A.current.present(function(a,b,c="Mia"){let d=new Date(a.at),e=Number.isNaN(d.getTime())?`${c}'s reply`:`Reply at ${d.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})}`,f=!a.unvoiced,g=(a,c)=>(function(a,b){if(!b)return;if(/^https?:\/\//.test(b))return b;let c=b.replace(/^\/?api\//,"");return`${a.endsWith("/")?a:`${a}/`}${c}`})(b,a||(f?c:null));return{settings:{namespace:"companion",name:e,author:c},steps:a.steps?.length?a.steps.map(({audio:b,...c},d)=>{let e=g(b,`api/replies/${a.id}/steps/${d}/audio`);return{...c,...e?{audio:e}:{}}}):[{say:a.text,...g(a.audio,`api/replies/${a.id}/audio`)?{audio:g(a.audio,`api/replies/${a.id}/audio`)}:{}}]}}(a,eX,"Mia"),{voice:K,origin:"Mia",from:b});if(E.current!==a.id||(L(null),G.current))return;if(!e){F.current=[];return}let f=F.current.shift();f&&!e3(D.current.state)?M.current(f):f&&F.current.unshift(f)},[K]);(0,i.useEffect)(()=>{M.current=N},[N]);let O=(0,i.useCallback)(a=>{let b=a.id;if(!C.current)return void t(a=>a.includes(b)?a:[...a,b]);if(e3(D.current.state)||E.current){t(a=>a.includes(b)?a:[...a,b]),F.current.some(a=>a.id===b)||F.current.push(a),v(e3(D.current.state)?`Mia replied at ${e2(a.at)}. Her voice waits until you have sent your take.`:`Mia replied again at ${e2(a.at)}. It plays when this one ends.`);return}M.current(a)},[]);(0,i.useEffect)(()=>{let a=function(a){let b=a.base.endsWith("/")?a.base:`${a.base}/`,c=a.fetch??((...a)=>fetch(...a)),d=a.everyMs??1e4,e=a.waitEveryMs??4e3,f=a.waitForMs??9e5,g={episode:null,items:[],presence:null,waiting:null,error:null},h=new Set,i=!1,j=null,k=null,l="",m=0,n=b=>{g={...g,...b},a.onChange?.(g)};async function o(){let d=g.episode;if(!d)return;let e=m;try{var j;let o=await c(`${b}thread?episode=${encodeURIComponent(d)}&include=marks`,{cache:"no-store"}),p=await o.json();if(e!==m)return;if(!p.success)return n({error:p.error??`HTTP ${o.status}`});let q=function(a){if(!Array.isArray(a))return[];let b=[];for(let c of a)if(c&&"object"==typeof c){if("take"===c.kind&&dN(c.take))b.push({...c,text:dN(c.text),at:dN(c.at)});else if("reply"===c.kind&&dN(c.id))b.push({...c,text:dN(c.text),at:dN(c.at)});else if("mark"===c.kind&&dN(c.id)&&dN(c.doc)){let a=c.region;b.push({kind:"mark",id:dN(c.id),doc:dN(c.doc),...dN(c.drawing)?{drawing:dN(c.drawing)}:{},...dN(c.title)?{title:dN(c.title)}:{},elements:Array.isArray(c.elements)?c.elements.filter(a=>"string"==typeof a&&!!a):[],...a&&"object"==typeof a&&"number"==typeof a.x?{region:a}:{},text:dN(c.text),author:dO(c.author),at:dN(c.at),...dN(c.lastAt)?{lastAt:dN(c.lastAt)}:{},status:"answered"===c.status||"resolved"===c.status?c.status:"open",replies:(Array.isArray(c.replies)?c.replies:[]).flatMap(a=>{let b=a&&"object"==typeof a?a:{};return dN(b.text)?[{author:dO(b.author),text:dN(b.text),at:dN(b.at)}]:[]})})}}return b}(p.items),r=(j=p.presence,q.map(a=>"reply"===a.kind?`${a.id}:${+!!a.audio}:${a.feedback??""}`:"mark"===a.kind?`m${a.id}:${a.status}:${a.replies.length}`:`${a.take}:${a.text.length}`).join(",")+`|${j?.state??""}`),s=q.filter(a=>"reply"===a.kind&&!h.has(a.id));for(let a of s)h.add(a.id);if((r!==l||g.error)&&(l=r,n({items:q,presence:p.presence??null,error:null})),i)for(let b of s)a.onReply?.(b);i=!0;let t=g.waiting;t&&(q.some(a=>"reply"===a.kind&&a.take===t.take)||Date.now()-t.since>f)&&(k&&clearInterval(k),k=null,n({waiting:null}))}catch(a){e===m&&n({error:a instanceof Error?a.message:String(a)})}}let p=()=>{"visible"===document.visibilityState&&o()};return"u">typeof document&&document.addEventListener("visibilitychange",p),{getSnapshot:()=>g,setEpisode(a){a!==g.episode&&(m+=1,h.clear(),i=!1,l="",k&&clearInterval(k),k=null,n({episode:a,items:[],presence:null,waiting:null,error:null}),a?(j&&clearInterval(j),j=setInterval(()=>{("u"<typeof document||"visible"===document.visibilityState)&&o()},d),o()):j&&(clearInterval(j),j=null))},refresh:o,waitFor(a){n({waiting:{take:a,since:Date.now()}}),k&&clearInterval(k),k=setInterval(()=>void o(),e),o()},async feedback(a,d){await c(`${b}replies/${a}/feedback`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({value:d})}),l="",await o()},destroy(){for(let a of(m+=1,[j,k]))a&&clearInterval(a);j=k=null,"u">typeof document&&document.removeEventListener("visibilitychange",p)}}}({base:eX,onChange:p,onReply:O}),b=function(a){let b=a.base.endsWith("/")?a.base:`${a.base}/`,c=a.fetch??((...a)=>fetch(...a)),d=a.partEveryMs??1e4,e=a.beatEveryMs??15e3,f=a.getUserMedia??(a=>navigator.mediaDevices.getUserMedia(a)),g=a.createRecorder??(a=>{let b,c,d,e,f,g,h,i;return c=(b=new(window.AudioContext??window.webkitAudioContext)).createMediaStreamSource(a),d=b.createScriptProcessor(4096,1,1),e=[],f=[],g=!1,h=null,i={mimeType:"audio/wav",ondataavailable:null,onstop:null,onerror:null,start(a=1e3){d.onaudioprocess=a=>{let b=a.inputBuffer.getChannelData(0),c=new Int16Array(b.length);for(let a=0;a<b.length;a++)c[a]=Math.max(-32768,Math.min(32767,Math.round(32767*b[a])));e.push(c),f.push(c)},c.connect(d),d.connect(b.destination),h=setInterval(()=>{if(!f.length)return;let a=g?[]:[dP(0x7fffffff,b.sampleRate)];g=!0,a.push(...f.map(a=>a.buffer)),f=[],i.ondataavailable?.({data:new Blob(a,{type:"audio/wav"})})},a)},stop(){h&&clearInterval(h),h=null;try{c.disconnect(),d.disconnect()}catch{}b.close().catch(()=>{}),i.whole=new Blob([dP(e.reduce((a,b)=>a+b.byteLength,0),b.sampleRate),...e.map(a=>a.buffer)],{type:"audio/wav"}),i.onstop?.()}}}),h={state:"idle",seconds:0,held:0,message:"",error:!1,stored:null,...!a.createRecorder?{unavailable:"this browser cannot record audio"}:{}},i=b=>{h={...h,...b},a.onChange?.(h)},j=null,k=null,l=[],m="",n="",o=null,p=0,q=null,r=null,s=null,t=null,u=!1,v=()=>p?Math.floor((Date.now()-p)/1e3):0,w=()=>(k?.mimeType||"audio/mp4").split(";")[0]||"audio/mp4",x=(a="")=>`episode=${encodeURIComponent(n)}${m?`&rec=${m}`:""}${o?`&context=${encodeURIComponent(o)}`:""}${a}`;function y(a){n&&c(`${b}recorder`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({episode:n,recording:a})}).catch(()=>{})}function z(a,d={}){m&&c(`${b}takes/diagnostic`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({rec:m,episode:n,kind:a,at:new Date().toISOString(),mime:k?.mimeType??null,visibility:"u">typeof document?document.visibilityState:"",agent:"u">typeof navigator?navigator.userAgent:"",source:"stateloom-canvas",...d}),keepalive:!0}).catch(()=>{})}function A(){for(let a of[r,s,t])a&&clearInterval(a);r=s=t=null}function B(){try{j?.getTracks().forEach(a=>a.stop())}catch{}j=null}async function C(){if(!m||u||!l.length)return;let a=new Blob(l,{type:w()});if(a.size<=h.held)return;u=!0;let d=m;try{let e=await c(`${b}takes/part?${x(`&offset=${h.held}`)}`,{method:"POST",headers:{"content-type":w()},body:a.slice(h.held)}),f=await e.json();d===m&&"number"==typeof f.bytes&&i({held:f.bytes})}catch{}finally{u=!1}}async function D(){let b;if("idle"!==h.state&&"retry"!==h.state)return;if(h.unavailable)return i({message:`Cannot record: ${h.unavailable}.`,error:!0});if(!(n=a.episode()??""))return i({message:"Choose the episode this take belongs to.",error:!0});let c=a.context?.()??null;o=c?JSON.stringify(c).slice(0,4e3):null,q=null,i({state:"starting",message:"",error:!1,held:0,seconds:0}),y(!0);try{b=await f({audio:!0})}catch(a){return y(!1),i({state:"idle",message:`Microphone refused: ${a instanceof Error?a.message:String(a)}`,error:!0})}if("starting"!==h.state)return void b.getTracks().forEach(a=>a.stop());j=b,l=[],m=`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,10)}`;try{k=g(b)}catch(a){return B(),y(!1),i({state:"idle",message:`This browser refused to record: ${a instanceof Error?a.message:String(a)}`,error:!0})}k.ondataavailable=a=>{a.data&&a.data.size&&l.push(a.data)},k.onerror=a=>{let b=v(),c=new Blob(l,{type:w()});if(z("recorder-error",{name:a?.error?.name??"",message:a?.error?.message??"",seconds:b,bytes:c.size,held:h.held}),A(),B(),y(!1),c.size)q=c,i({state:"retry",message:`The recorder stopped with an error after ${Math.floor(b/60)}:${String(b%60).padStart(2,"0")}. What it captured is kept: Send again.${h.held?` ${dQ(h.held)} of it is already stored.`:""}`,error:!0});else i({state:"idle",message:"The recorder stopped before it captured anything. Nothing was sent.",error:!0})},k.start(1e3),p=Date.now(),r=setInterval(()=>void C(),d),s=setInterval(()=>y(!0),e),t=setInterval(()=>i({seconds:v()}),500),i({state:"recording",seconds:0,message:""})}async function E(d){i({state:"sending",message:`Sending ${dQ(d.size)}, then transcribing and storing…`,error:!1});try{let e=await c(`${b}takes?${x()}`,{method:"POST",headers:{"content-type":(d.type||"audio/mp4").split(";")[0]},body:d}),f=await e.json();if(!f.success||!f.take)throw Error(f.error||`HTTP ${e.status}`);q=null,m="";let g=f.presence??{state:f.listening?"listening":"away"},h=f.transcriptError?` Transcription failed, so no session wakes yet: ${f.transcriptError}`:({listening:" The session listening there will hear it.",answering:" Mia is answering an earlier take; she hears this one next.",answered:" The session hears it as soon as it listens again."})[g.state]??" No session is listening yet; the take waits, and her reply comes here when one answers.";i({state:"idle",seconds:0,held:0,message:`Take ${f.take} is in the episode.${h}`,error:!!f.transcriptError,stored:{take:f.take,english:f.english??"",transcriptError:f.transcriptError,presence:g}}),f.transcriptError||a.onStored?.(f.take)}catch(a){q=d,z("send-failed",{message:a instanceof Error?a.message:String(a),bytes:d.size,held:h.held}),i({state:"retry",message:`Not stored: ${a instanceof Error?a.message:String(a)}. Your recording is kept — Send again.${h.held?` ${dQ(h.held)} of it is already stored, and becomes a take by itself if you leave.`:""}`,error:!0})}}async function F(){if("recording"!==h.state)return;let a=v();A(),y(!1),i({state:"sending",seconds:a});let b=await new Promise(a=>{let b=!1,c=()=>{b||(b=!0,a(k?.whole??new Blob(l,{type:w()})))},d=setTimeout(c,3e3);if(!k)return c();k.onstop=()=>{clearTimeout(d),c()};try{k.stop()}catch{clearTimeout(d),c()}});if(B(),!b.size)return z("empty-at-stop",{seconds:a,held:h.held}),i({state:"idle",message:h.held?`The recorder handed back nothing at Stop, but ${dQ(h.held)} is stored; it becomes a take within a few minutes.`:"Nothing was recorded. Try again.",error:!0});await E(b)}async function G(){"retry"===h.state&&q&&await E(q)}return{getSnapshot:()=>h,press:async()=>"recording"===h.state?F():"retry"===h.state&&q?G():D(),start:D,stop:F,resend:G,destroy(){A(),("recording"===h.state||"starting"===h.state)&&y(!1);try{k?.stop()}catch{}B()}}}({base:eX,episode:()=>B.current,context:()=>{let a=A.current.shown,b=a?{...a.title||a.step.title?{title:[a.title,a.step.title].filter(Boolean).join(" · ")}:{},say:a.step.say.slice(0,400),...null!==a.index&&null!==a.count?{index:a.index,count:a.count}:{},...a.origin?{by:a.origin}:{}}:null;return function(a,b={}){if(!a?.doc)return null;let c={stage:a.stage,doc:a.doc,kind:a.kind,system:a.system,focus:a.focus??void 0,visible:a.visible,tour:a.tour,who:a.who,at:new Date().toISOString(),...b};for(let a of Object.keys(c))(void 0===c[a]||null===c[a])&&delete c[a];return c}(A.current.lastReport(),{...H.current.length?{marks:H.current}:{},...a?.step.spotlight?.length?{spotlight:a.step.spotlight}:{},...b?{step:b}:{}})},onChange:a=>{let b=D.current.state;if(D.current=a,n(a),!e3(b)||e3(a.state)||(G.current=!1,!C.current||E.current))return;let c=F.current.shift();c?M.current(c):v(null)},onStored:b=>a.waitFor(b)});return J.current=a,I.current=b,D.current=b.getSnapshot(),n(b.getSnapshot()),()=>{b.destroy(),a.destroy(),J.current=null,I.current=null}},[O]),(0,i.useEffect)(()=>{J.current?.setEpisode(g)},[g]),(0,i.useEffect)(()=>{let a=!0;return fetch(`${eX}health`,{cache:"no-store"}).then(a=>a.json()).then(b=>{if(a){if(!b.success)return x(`The companion does not answer: ${b.error??"no reason given"}.`);x(null),b.defaultEpisode&&j(a=>a??b.defaultEpisode??null)}}).catch(b=>a&&x(`The companion does not answer: ${b instanceof Error?b.message:String(b)}.`)),()=>{a=!1}},[]),(0,i.useEffect)(()=>{if(!c||k.length)return;let a=!0;return fetch(`${eX}episodes`,{cache:"no-store"}).then(a=>a.json()).then(b=>{a&&b.success&&b.episodes&&l(b.episodes)}).catch(()=>{}),()=>{a=!1}},[c,k.length]);let P=(0,i.useRef)(null),Q=(0,i.useCallback)(async(a=!1)=>{let b=A.current.lastReport()?.doc??null;if(a||b!==P.current){if(P.current=b,!b){H.current=[];return}try{let a=await fetch(`/api/marks?doc=${encodeURIComponent(b)}`,{cache:"no-store"}),c=await a.json();H.current=bo(function(a,b=""){let c=a&&"object"==typeof a?a:{},d=Array.isArray(c.marks)?c.marks.map(bn).filter(a=>null!==a):[];return{doc:bk(c.doc)||b,marks:d}}(c,b).marks,"agent").map(a=>a.id)}catch{H.current=[]}}},[]);(0,i.useEffect)(()=>{Q(!0);let a=A.current.onMarks(()=>void Q(!0)),b=setInterval(()=>void Q(),3e3);return()=>{a(),clearInterval(b)}},[Q]),(0,i.useEffect)(()=>{if(!o.waiting)return;let a=setInterval(()=>z(Date.now()),1e3);return()=>clearInterval(a)},[o.waiting]);let R=(0,i.useCallback)(()=>{let a=I.current;a&&(!e3(D.current.state)&&"retry"!==D.current.state&&E.current&&(G.current=!0,A.current.stop()),a.press())},[]),S=(0,i.useCallback)((a,b)=>{let c=J.current?.getSnapshot().items.find(b=>"reply"===b.kind&&b.id===a);if(c){if(e3(D.current.state))return void v("Send your take first. Then press play to hear Mia.");F.current=[],G.current=!1,M.current(c,b)}},[]),T=(0,i.useCallback)(()=>{F.current=[],G.current=!1,A.current.stop()},[]),U=o.waiting?{take:o.waiting.take,seconds:Math.max(0,Math.floor((y-o.waiting.since)/1e3))}:null,{narrow:V,sheet:W,claimSheet:X,releaseSheet:Y}=a;(0,i.useEffect)(()=>{c?X("talk"):Y("talk")},[c,X,Y]),(0,i.useEffect)(()=>()=>Y("talk"),[Y]);let[Z,$]=(0,i.useState)(W);Z!==W&&($(W),V&&"card"===W&&d(!1));let _=(0,i.useCallback)(a=>{window.matchMedia("(max-width: 767px)").matches&&d(!1),eW={doc:a.doc,id:a.id},window.dispatchEvent(new Event(eV)),A.current.board!==a.doc&&eR({doc:a.doc,focus:null})},[]),aa=(0,h.jsx)(cv,{open:c,onOpenChange:a=>{d(a),a&&Q(!0)},variant:V?"bar":"fab",onOpenMark:_,who:"Mia",episode:g,episodes:k,onEpisode:a=>{e$.test(a)&&a!==g&&(F.current=[],t([]),v(null),j(a),e1(eZ,a))},presence:o.presence,recorder:m,onRecord:R,items:o.items,unheard:s,playing:q,playingStep:q&&a.shown?.origin==="Mia"?a.shown.index:null,onPlay:S,onStop:T,onFeedback:(a,b)=>{J.current?.feedback(a,b).catch(a=>x(`Your thumb was not kept: ${a instanceof Error?a.message:String(a)}.`))},autoplay:e,onAutoplay:a=>{f(a),e1(eY,a?"1":"0"),a||(F.current=[])},waiting:U,notice:u,error:w??o.error});if(V){let b=c?a.sheetBody:a.sheetHandle;return b?(0,eU.createPortal)(aa,b):null}return(0,h.jsx)("div",{className:"stage-talk-host",children:aa})}let e7=(0,i.createContext)(null);function e8(){return(0,i.useContext)(e7)}function e9(a,b){try{window.localStorage.setItem(a,b)}catch{}}let fa=new Map;function fb({children:a}){var b;let c,d,e,f,g,j,k,l,[m,n]=(0,i.useState)({bridgeUrl:null,stage:bf,companion:!1,companionEpisode:null});(0,i.useEffect)(()=>{let a=!0;return eu().then(b=>{if(!a)return;let c=null,d=bh(c)?c:bh(b.stage)?b.stage:bf;n({bridgeUrl:b.bridgeUrl,stage:d,companion:b.companion,companionEpisode:b.companionEpisode})}),()=>{a=!1}},[]);let[o,p]=(0,i.useState)(()=>!1),[q,r]=(0,i.useState)(()=>""),s=(0,i.useMemo)(()=>o?dM():null,[o]),t=(0,i.useMemo)(()=>null,[]),[u,v]=(0,i.useState)(null),w=(0,i.useRef)(new Set),[x,y]=(0,i.useState)(null),[z,A]=(0,i.useState)(null),B=(0,i.useRef)(null),C=(0,i.useCallback)(a=>A({doc:a,from:B.current}),[]),D=(0,i.useCallback)(a=>{B.current=a,y(a)},[]),E=(0,i.useCallback)(a=>{var b;if(!a)return void v(null);let{step:c}=a,d=(0,ek.requestedDoc)();if(a.caught,c.doc&&c.doc!==d)C(c.doc),eR({doc:c.doc,system:c.system??void 0,focus:c.focus??null});else if(c.focus)if(c.system&&null!==c.system&&d)eR({doc:d,system:c.system,focus:c.focus});else{let a;b=c.focus,(a=new URL(window.location.href)).searchParams.set("focus",b),window.history.replaceState(window.history.state,"",a),window.dispatchEvent(new Event(eM))}v({doc:c.doc,focus:c.focus,spotlight:c.spotlight,region:c.region,nonce:a.nonce})},[C]),F=(b={url:m.bridgeUrl??"",stage:m.stage,name:"web-stage",voice:s,enabled:!!m.bridgeUrl,onShow:E,onMarks:a=>{for(let b of[...w.current])b(a)}},(c=(0,i.useRef)({onShow:b.onShow,onMarks:b.onMarks})).current={onShow:b.onShow,onMarks:b.onMarks},d=(0,i.useRef)(null),e=`${b.url}\u0000${b.stage??""}\u0000${b.token??""}`,f=(0,i.useRef)(e),(null===d.current||f.current!==e)&&(f.current=e,d.current=function(a){let b,c=bh(a.stage)?a.stage:bf,d=a.setTimer??((a,b)=>setTimeout(a,b)),e=a.clearTimer??(a=>clearTimeout(a)),f=a.gapMs??900,g=a.client??dJ({url:a.url,role:a.role??"web",docId:`stage:${c}`,name:a.name??"web-stage",token:a.token,autoResync:!1}),h=a.voice??null,i=a=>a&&void 0!==b?b:h,j=null,k=null,l=a=>{let b=k;k=null,b?.(a)},m=null,n=null,o=[],p=[],q=0,r=!1,s=!1,t=0,u=null,v=0,w=!1,x=!1,y=!1,z=!1,A=0,B=!1,C={status:g.status,stage:c,shown:m,tour:n,index:q,playing:r,speaking:s,ownVoice:!1},D=new Set;function E(){for(let a of(C={status:g.status,stage:c,shown:m,tour:n,index:q,playing:r,speaking:s,ownVoice:!!n&&void 0!==b},[...D]))a()}function F(){v+=1,u&&e(u),u=null,s&&j?.cancel(),s=!1,j=null}function G(a,b,c=b){F();let e=++v,g=()=>{e!==v||(s&&(s=!1,E()),b&&r&&(u=d(()=>{u=null,e===v&&r&&M()},h?f:0)))},h=i(c);if(h)s=!0,j=h,E(),h.speak(a).then(g,g);else{let c;b&&(u=d(()=>{u=null,g()},"number"==typeof(c=a.holdMs)&&Number.isFinite(c)&&a.holdMs>=0?a.holdMs:Math.min(2e4,Math.max(2500,1200+400*`${a.title??""} ${a.say??""}`.trim().split(/\s+/).filter(Boolean).length))))}}function H(b,c){t+=1,F(),m=b?{...b,nonce:t,...B?{caught:!0}:{}}:null,E(),a.onShow?.(m);let d=!!m&&null!==m.index;m&&(i(d)||c)&&G(m.step,c,d)}function I(a){if(!n)return null;let b=n.def.steps[a];if(!b)return null;let c=b.doc??o[a],d=b.system??p[a];return{step:{...b,...c?{doc:c}:{},...d?{system:d}:{}},index:a,count:n.def.steps.length,title:n.def.settings?.name,origin:n.origin,tourPath:n.path}}function J(a,c,d){var e;let f,g;l(!1),b=d;let h=Array.isArray(a.tour?.steps)?a.tour.steps:[];e=(n={def:{...a.tour,steps:h},path:a.path,origin:a.origin}).def,g=void 0,o=e.steps.map(a=>g=a.doc??g),p=h.map(a=>f=a.system??f),q=Math.min(Math.max(0,a.from??0),Math.max(0,h.length-1)),w=!1,r=c&&h.length>0,H(I(q),r)}function K(a){r=!1,H({step:a.step,index:null,count:null,title:a.title,origin:a.origin,tourPath:a.tour},!1)}function L(a){if(!n)return;let b=n.def.steps.length-1;b<0||(w=!1,H(I(q=Math.min(Math.max(0,Math.floor(a)),b)),r))}function M(){if(n){if(q>=n.def.steps.length-1){let a=r;w=r||w,r=!1,F(),E(),a&&l(!0);return}L(q+1)}}function N(){n&&q>0&&L(q-1)}function O(){n&&n.def.steps.length&&(r=!0,w&&(w=!1,q=0),m?.index!==q||m.caught?H(I(q),!0):(E(),G(m.step,!0)))}function P(){r=!1,F(),E()}function Q(){l(!1),b=void 0,w=!1,n=null,o=[],p=[],q=0,r=!1,H(null,!1)}function R(){if(z)return;z=!0;let a=++A;g.joinStage(c).then(({state:b})=>{a===A&&(z=!1,y=!0,m||n||function(a){B=!0;try{a.tour&&J(a.tour,!1),a.step&&K(a.step)}finally{B=!1}}(b),E())}).catch(()=>{a===A&&(z=!1,E())})}return g.on("stage-step",a=>{a?.stage===c&&a.step&&K(a)}),g.on("stage-load",a=>{a?.stage===c&&a.tour&&J(a,!1!==a.autoplay)}),g.on("stage-control",a=>{a?.stage===c&&function(a){switch(a.action){case"play":return O();case"pause":return P();case"next":return M();case"prev":return N();case"goto":return L(a.index??0);case"stop":return Q()}}(a)}),g.on("marks",b=>a.onMarks?.(b)),g.on("status",a=>{"disconnected"===a||"error"===a?y=!1:"connected"===a&&x&&!y&&R(),E()}),{getSnapshot:()=>C,subscribe:a=>(D.add(a),()=>{D.delete(a)}),connect(){x=!0,R()},disconnect(){x=!1,A+=1,z=!1,y=!1,F(),g.leaveStage(c),g.disconnect()},play:O,pause:P,next:M,prev:N,goto:L,stop:Q,dismiss:function(){if(m){if(null===m.index&&n)return void H(I(q),!1);null===m.index?H(null,!1):Q()}},setVoice(a){void 0===b&&F(),h=a,E()},present:(a,b={})=>Array.isArray(a?.steps)&&a.steps.length?new Promise(d=>{J({stage:c,tour:a,from:b.from??0,autoplay:!1!==b.autoplay,origin:b.origin??"page"},!1!==b.autoplay,b.voice),k=d}):Promise.resolve(!1),sendContext(a){g.emitContext({...a,stage:c,...n?{tour:{path:n.path,title:n.def.settings?.name,index:q,count:n.def.steps.length,playing:r}}:{}})},sendMarks(a){g.emitMarks({...a,stage:c}).catch(()=>{})}}}({...b,voice:b.voice??null,onShow:a=>c.current.onShow?.(a),onMarks:a=>c.current.onMarks?.(a)})),g=d.current,j=(0,i.useSyncExternalStore)(g.subscribe,g.getSnapshot,g.getSnapshot),k=!1!==b.enabled&&!!b.url,(0,i.useEffect)(()=>{if(k)return g.connect(),()=>g.disconnect()},[g,k]),l=b.voice??null,(0,i.useEffect)(()=>{g.setVoice(l)},[g,l]),{...j,play:g.play,pause:g.pause,next:g.next,prev:g.prev,goto:g.goto,stop:g.stop,dismiss:g.dismiss,sendContext:g.sendContext,sendMarks:g.sendMarks,present:g.present}),G=(0,i.useRef)(null),H=(0,i.useRef)(null),I=F.sendContext,J=(0,i.useCallback)(a=>{G.current={...a,stage:m.stage,who:q||void 0,at:new Date().toISOString()},H.current&&clearTimeout(H.current),H.current=setTimeout(()=>I({...a,who:q||void 0}),400)},[m.stage,q,I]);(0,i.useEffect)(()=>()=>{H.current&&clearTimeout(H.current)},[]),(0,i.useEffect)(()=>{G.current&&I({...G.current,who:q||void 0})},[F.index,F.playing,F.tour,I,q]);let[K,L]=(0,i.useState)(0),M=function(a="(max-width: 599px)"){let[b,c]=(0,i.useState)(()=>(function(a){try{return!1}catch{return!1}})(0));return(0,i.useEffect)(()=>{if("function"!=typeof window.matchMedia)return;let b=window.matchMedia(a),d=()=>c(b.matches);return d(),b.addEventListener("change",d),()=>b.removeEventListener("change",d)},[a]),b}(),[N,O]=(0,i.useState)(null),P=(0,i.useCallback)(a=>O(a),[]),Q=(0,i.useCallback)(a=>O(b=>b===a?null:b),[]),[R,S]=(0,i.useState)(null),[T,U]=(0,i.useState)(null),V=F.shown?.step??null,W=null,X=x??(W&&!aQ(W)?W:null),Y=z&&z.from===x?z.doc:null,Z=V?.doc&&V.doc!==X&&V.doc!==Y?V.doc:null,[$,_]=(0,i.useState)(null);(0,i.useEffect)(()=>{let a;if(!Z)return;let b=!0;return(!(a=fa.get(Z))&&(a=fetch(`/api/file?doc=${encodeURIComponent(Z)}`,{cache:"no-store"}).then(a=>a.ok?a.json():null).then(a=>{let b=a?.content?JSON.parse(a.content):null,c=(b?.settings??b?.stateMachine?.settings)?.name;return"string"==typeof c&&c?c:null}).catch(()=>null),fa.set(Z,a)),a).then(a=>b&&_({doc:Z,title:a})),()=>{b=!1}},[Z]);let aa=F.play,ab=(0,i.useMemo)(()=>{if(!Z||!V)return null;let a=($?.doc===Z?$.title:null)??(Z.split("/").pop()??Z).replace(/\.(smdf|erdf|sqdf|sysdf)\.json$/i,"").replace(/\.json$/i,""),b=F.shown?.index!==null&&F.shown?.index!==void 0;return{drawing:a,label:b?"Open and play":"Open the drawing",onOpen:()=>{C(Z),eR({doc:Z,system:V.system??void 0,focus:V.focus??null}),b&&aa()}}},[Z,$,V,F.shown?.index,aa,C]),ac=!!F.shown&&!M;(0,i.useEffect)(()=>{let a=document.documentElement,b=ac?document.querySelector(".stage-caption-host .slc-stage-caption"):null;if(!b||"u"<typeof ResizeObserver)return void a.style.removeProperty("--stage-caption-h");let c=()=>a.style.setProperty("--stage-caption-h",`${Math.ceil(b.getBoundingClientRect().height)+12}px`),d=new ResizeObserver(c);return d.observe(b),c(),()=>{d.disconnect(),a.style.removeProperty("--stage-caption-h")}},[ac]);let ad=(0,i.useMemo)(()=>({stage:m.stage,connected:"connected"===F.status,lit:u,author:q,setAuthor:a=>{r(a),e9("stateloom.author",a)},listener:t,answerNonce:K,report:J,lastReport:()=>G.current,sendMarks:F.sendMarks,onMarks:a=>(w.current.add(a),()=>{w.current.delete(a)}),shown:F.shown,present:F.present,companion:m.companion,pause:F.pause,stop:F.stop,board:x,setBoard:D,narrow:M,sheet:N,claimSheet:P,releaseSheet:Q,sheetHandle:R,sheetBody:T}),[m.stage,m.companion,F.status,F.shown,F.sendMarks,F.present,F.pause,F.stop,u,q,t,K,J,x,D,M,N,P,Q,R,T]),ae=F.shown?(0,h.jsx)(ce,{shown:F.shown,playing:F.playing,speaking:F.speaking,voice:F.ownVoice?void 0:o,onToggleVoice:()=>{let a=!o;p(a),e9("stateloom.stage.voice",a?"1":"0")},onPlay:F.play,onPause:F.pause,onNext:F.next,onPrev:F.prev,onGoto:F.goto,onClose:F.dismiss,onAnswer:()=>L(a=>a+1),held:ab}):null;return(0,h.jsxs)(e7.Provider,{value:ad,children:[a,M?(0,h.jsxs)("div",{className:"stage-sheet",children:[(0,h.jsx)("div",{className:"stage-sheet-handle",ref:S}),(0,h.jsx)("div",{className:"stage-sheet-body",ref:U}),!N&&ae&&(0,h.jsx)("div",{className:"stage-sheet-caption",children:ae})]}):ae&&(0,h.jsx)("div",{className:"stage-caption-host",children:ae}),m.companion&&(0,h.jsx)(e6,{stage:ad,defaultEpisode:m.companionEpisode})]})}let fc="stage-quiet-btn flex h-9 min-w-9 items-center justify-center gap-1 rounded-lg border border-gray-700 bg-gray-900/90 px-2 text-sm text-gray-200 shadow-lg backdrop-blur hover:bg-gray-800";function fd(a){let b=1/0;for(let c of[".stage-sheet",".stage-caption-host .slc-stage-caption"]){let d=document.querySelector(c)?.getBoundingClientRect();d&&d.height>0&&d.top<a.bottom&&(b=Math.min(b,d.top))}return b===1/0?0:Math.max(0,a.bottom-b+8)}async function fe(a,b){let c=await fetch(`/api/marks?doc=${encodeURIComponent(a)}`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(b)}),d=await c.json().catch(()=>({}));if(!c.ok)throw Error(d?.error??`the marks could not be written (${c.status})`);return d}function ff({docPath:a,kind:b,viewport:c,setViewport:d,boxes:e,boardRef:f,focus:g=null,level:j,onReveal:k,labels:l}){let m,n=e8(),[o,p]=(0,i.useState)([]),[q,r]=(0,i.useState)(!1),[s,t]=(0,i.useState)(null),[u,v]=(0,i.useState)(null),[w,x]=(0,i.useState)(!1),[y,z]=(0,i.useState)(!1),[A,B]=(0,i.useState)(null),[C,D]=(0,i.useState)(!1),[E,F]=(0,i.useState)(null),G=(0,i.useRef)(null),H=(0,i.useRef)(null);H.current=u;let{read:I,markRead:J}=function(a){let[b,c]=(0,i.useState)(()=>({doc:a,read:a?co(a):{}}));(0,i.useEffect)(()=>{c(b=>b.doc===a?b:{doc:a,read:a?co(a):{}})},[a]);let d=(0,i.useCallback)(b=>{a&&c(c=>{let d=c.doc===a?c.read:co(a);if(d[b.id]===(b.replies?.length??0)&&c.doc===a)return c;let e={...d,[b.id]:b.replies?.length??0};try{window.localStorage.setItem(cn(a),JSON.stringify(e))}catch{}return{doc:a,read:e}})},[a]);return{read:b.doc===a?b.read:{},markRead:d}}(a),K=n?.setBoard;(0,i.useEffect)(()=>{if(K&&a)return K(a),()=>K(null)},[K,a]);let L=(0,i.useCallback)((a,b={})=>{let c=f.current?.getBoundingClientRect();if(!c?.width||!a.length)return;let e=fd(c),g=Math.max(.4*c.height,c.height-e);d(function(a,b,c,d={}){let e=d.padding??48,f=d.floor??.55,g=S(a,b,c,{padding:e,maxScale:d.maxScale??1});if(!a.length||g.scale>=f)return g;let h=1/0,i=1/0,j=-1/0,k=-1/0;for(let b of a)h=Math.min(h,b.x),i=Math.min(i,b.y),j=Math.max(j,b.x+b.width),k=Math.max(k,b.y+b.height);let l=(j-h)*f,m=(k-i)*f;return{x:l<=b-2*e?(b-l)/2-h*f:e-h*f,y:m<=c-2*e?(c-m)/2-i*f:e-i*f,scale:f}}(a,c.width,g,{padding:48,maxScale:1,floor:b.floor??.2}))},[f,d]),M=(0,i.useCallback)(()=>{a&&fetch(`/api/marks?doc=${encodeURIComponent(a)}`,{cache:"no-store"}).then(a=>a.ok?a.json():null).then(a=>a&&Array.isArray(a.marks)&&p(a.marks)).catch(()=>{})},[a]);(0,i.useEffect)(()=>(p([]),v(null),t(null),M(),window.addEventListener("focus",M),()=>window.removeEventListener("focus",M)),[M]),(0,i.useEffect)(()=>n?.onMarks(b=>{if(!a||b.docId!==a||!Array.isArray(b.marks))return;p(b.marks);let c=function(a){let b=a.change;if(!b||"reply"!==b.action&&"add"!==b.action||!Array.isArray(a.marks))return null;let c=a.marks.findIndex(a=>a&&a.id===b.id);if(c<0)return null;let d=a.marks[c];if("add"===b.action)return d.author?.role==="agent"?{action:"add",mark:d,number:c+1,name:d.author.name||"the agent"}:null;let e=d.replies?.[d.replies.length-1];return e&&e.author?.role==="agent"?{action:"reply",mark:d,number:c+1,name:e.author.name||"the agent"}:null}(b);c&&c.mark.id!==H.current&&(F({id:c.mark.id,text:"reply"===c.action?`${c.name} answered mark ${c.number}`:`${c.name} asked about mark ${c.number}`}),G.current&&clearTimeout(G.current),G.current=setTimeout(()=>F(null),7e3))}),[n,a]),(0,i.useEffect)(()=>(F(null),()=>{G.current&&clearTimeout(G.current)}),[a]);let N=async b=>{if(!a)return!1;z(!0),B(null);try{let c=await fe(a,b);return p(c.marks),n?.sendMarks({docId:a,marks:c.marks,change:c.change}),!0}catch(a){return B(a instanceof Error?a.message:String(a)),!1}finally{z(!1)}},P=n?.lit??null,Q=P&&(!P.doc||P.doc===a)?P:null,R=Q?.spotlight,T=Q?.region??null,U=(0,i.useRef)(-1),V=(0,i.useRef)(-1),W=(0,i.useRef)(null),X=(0,i.useMemo)(()=>R?.length?bt(e,R):[],[e,R]);(0,i.useEffect)(()=>{if(!Q||U.current===Q.nonce)return;let a=[...X,...T?[T]:[]];if(!a.length){R?.length&&V.current!==Q.nonce&&(V.current=Q.nonce,k?.(R));return}U.current=Q.nonce;let b=()=>L(a);b(),W.current&&clearTimeout(W.current),W.current=setTimeout(b,520)},[Q,X,T,R,L,k]),(0,i.useEffect)(()=>()=>{W.current&&clearTimeout(W.current)},[]);let Y=(0,i.useRef)(null),Z=(0,i.useRef)([]),$=(0,i.useRef)(c);$.current=c,(0,i.useEffect)(()=>{if(!a||Y.current===a)return;if(Q){Y.current=a;return}let b=o.filter(a=>"resolved"!==a.status&&(!a.level||!j||a.level===j));if(!b.length||!e.length)return;let c=b.filter(a=>a.elements?.length),d=c.filter(a=>bt(e,a.elements).length>0);if(c.length&&!d.length)return;let h=[...d,...b.filter(a=>!a.elements?.length)].map(a=>bV(a,e)).filter(a=>!!a);if(Y.current=a,!h.length)return;let i=[...h,...g?bt(e,[g]):[]],k=()=>{let a=f.current?.getBoundingClientRect();if(!a?.width)return;let b=$.current,c=O(b,{x:0,y:0}),d=O(b,{x:a.width,y:a.height-fd(a)});i.every(a=>a.x>=c.x&&a.y>=c.y&&a.x+a.width<=d.x&&a.y+a.height<=d.y)||L(i,{floor:.55})};for(let a of(k(),Z.current))clearTimeout(a);Z.current=[setTimeout(k,520),setTimeout(k,1400)]},[a,o,e,Q,j,g,L,f]),(0,i.useEffect)(()=>()=>{for(let a of Z.current)clearTimeout(a)},[]);let _=(0,i.useRef)(n?.answerNonce??0);(0,i.useEffect)(()=>{if(!n||n.answerNonce===_.current)return;_.current=n.answerNonce;let a=R?.length?[...R]:Q?.focus?[Q.focus]:g?[g]:[];x(!1),v(null),t({elements:a,region:T??void 0,listen:!!n.listener})},[n,R,Q,g,T]);let aa=n?.report;(0,i.useEffect)(()=>{if(!aa||!a)return;let d=f.current?.getBoundingClientRect(),e=O(c,{x:0,y:0}),h=d?O(c,{x:d.width,y:d.height}):e;aa({doc:a,kind:b,system:void 0,focus:g,...d?.width?{visible:{x:Math.round(e.x),y:Math.round(e.y),width:Math.round(h.x-e.x),height:Math.round(h.y-e.y)}}:{}})},[aa,a,b,g,c,f]);let ab=n?.companion?e_(a):null,ac=function(a,b){let c;if(!a||!b)return null;let d=(c=b.match(/-episode-(\d+)-/))?Number(c[1]):null,e=null===d?"this episode":`episode ${d}`;switch(a){case"listening":return`Mia is listening in ${e}: she answers here`;case"answering":return"Mia is answering";case"answered":return`Mia has answered in ${e}: your mark waits until she listens again`;case"away":return`No seat is listening in ${e}: your mark waits until one does`;default:return null}}(function(a,b){let[c,d]=(0,i.useState)(null);return(0,i.useEffect)(()=>{if(!a||!b)return;let c=!0,e=async()=>{if("u"<typeof document||"visible"===document.visibilityState)try{let b=await fetch(`/api/companion/thread?episode=${encodeURIComponent(a)}`,{cache:"no-store"}),e=await b.json();c&&d({episode:a,state:e.success?e.presence?.state??null:null})}catch{c&&d({episode:a,state:null})}};e();let f=setInterval(()=>void e(),1e4);return()=>{c=!1,clearInterval(f)}},[a,b]),c&&c.episode===a?c.state:null}(ab,!!(s||u||w)),ab),ad=(0,i.useMemo)(()=>bq(o,I).map(a=>a.id),[o,I]),ae=function(a,b={}){return{forYou:bo(a,"person").length,forAgent:bo(a,"agent").length,unread:bq(a,b).length}}(o,I),af=o.find(a=>a.id===u)??null,ag=af?.replies?.length??0;(0,i.useEffect)(()=>{af&&J(af)},[af?.id,ag,J]);let ah=(0,i.useCallback)(a=>{t(null),x(!1),r(!1),v(a),F(null)},[]);(0,i.useEffect)(()=>{let b=()=>{let b=a&&eW?.doc===a?eW.id:null,c=b?o.find(a=>a.id===b):null;if(!c)return;eW=null,ah(c.id);let d=bV(c,e);d&&setTimeout(()=>L([d],{floor:.55}),60)};return b(),window.addEventListener(eV,b),()=>window.removeEventListener(eV,b)},[a,o,e,ah,L]);let ai=!!(s||af||w),aj=n?.claimSheet,ak=n?.releaseSheet;(0,i.useEffect)(()=>{ai?aj?.("card"):ak?.("card")},[ai,aj,ak]),(0,i.useEffect)(()=>()=>ak?.("card"),[ak]);let al=!!n?.narrow,am=n?.sheet??null,[an,ao]=(0,i.useState)(am);an!==am&&(ao(am),al&&"talk"===am&&(t(null),v(null),x(!1)));let ap=(0,i.useRef)(null),[aq,ar]=(0,i.useState)(null);(0,i.useEffect)(()=>{let a=ap.current;if(!a)return;let b=()=>{let b={x:a.offsetLeft,y:a.offsetTop,width:a.offsetWidth,height:a.offsetHeight};ar(a=>a&&a.x===b.x&&a.y===b.y&&a.width===b.width&&a.height===b.height?a:b)};if(b(),window.addEventListener("resize",b),"u"<typeof ResizeObserver)return()=>window.removeEventListener("resize",b);let c=new ResizeObserver(b);return c.observe(a),()=>{c.disconnect(),window.removeEventListener("resize",b)}},[a]);let[as,at]=(0,i.useState)(null),au=n?.shown??null;(0,i.useEffect)(()=>{let a=f.current;if(!a)return;let b=()=>document.querySelector(".stage-sheet")??document.querySelector(".stage-caption-host .slc-stage-caption"),c=0,d=()=>{cancelAnimationFrame(c),c=requestAnimationFrame(()=>{let c=a.getBoundingClientRect(),d=b()?.getBoundingClientRect(),e=d&&d.height>0&&d.top<c.bottom?{x:d.left-c.left,y:d.top-c.top,width:d.width,height:Math.min(d.bottom,c.bottom)-d.top}:null;at(a=>a&&e&&a.x===e.x&&a.y===e.y&&a.width===e.width&&a.height===e.height?a:e)})};d();let e=b(),g=e&&"u">typeof ResizeObserver?new ResizeObserver(d):null;return e&&g?.observe(e),window.addEventListener("resize",d),()=>{cancelAnimationFrame(c),g?.disconnect(),window.removeEventListener("resize",d)}},[f,au,ai,am,al,a]);let av=(0,i.useMemo)(()=>[aq,as].filter(a=>!!a),[aq,as]);return a?(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(bW,{viewport:c,boxes:e,spotlight:R,region:T,marks:o,unread:ad,selectedMark:u,onSelectMark:a=>{t(null),x(!1),v(b=>b===a?null:a)},marking:q,onDraft:a=>{r(!1),v(null),x(!1),F(null),t(a)},draft:s,avoid:av}),(0,h.jsxs)("div",{className:"stage-board-controls",ref:ap,children:[E&&(0,h.jsx)(cm,{className:"stage-board-notice",onOpen:()=>ah(E.id),onDismiss:()=>F(null),children:E.text}),(0,h.jsxs)("button",{type:"button",className:`${fc} ${q?"!border-amber-400 !text-amber-300":""}`,"aria-pressed":q,onClick:()=>{t(null),r(a=>!a)},title:q?"Marking: tap an element, or drag around several. Tap ✎ again to stop.":"Mark something for the agent — tap an element or drag around several",children:[(0,h.jsx)(cc,{}),q&&(0,h.jsx)("span",{className:"text-xs",children:"marking"})]}),(0,h.jsxs)("button",{type:"button",className:fc,"aria-expanded":w,onClick:()=>{t(null),v(null),F(null),x(a=>!a)},title:`Marks on this drawing${ae.forYou?` \xb7 ${ae.forYou} for you`:""}${ae.forAgent?` \xb7 ${ae.forAgent} waiting on the agent`:""}`,"aria-label":`Marks on this drawing: ${ae.forYou} for you${ae.unread?` (${ae.unread} new)`:""}, ${ae.forAgent} waiting on the agent`,children:[(0,h.jsx)(b3,{}),ae.forYou>0&&(0,h.jsxs)("span",{className:`stage-for-you${ae.unread?" stage-for-you--new":""}`,children:[ae.forYou," for you"]}),ae.forAgent>0&&(0,h.jsx)("span",{className:"text-xs text-gray-400",children:ae.forAgent})]})]}),q&&!s&&!E&&(0,h.jsx)("div",{className:"stage-board-hint",role:"status",children:"Tap an element, or drag around several, to say something about it."}),ai&&(m=s?(0,h.jsx)(cj,{elements:s.elements,region:s.region,author:n?.author??"",onAuthorChange:n?.setAuthor,listener:n?.listener,listenAtOnce:!!s.listen,busy:y,error:A,note:ac,labels:l,onCancel:()=>{t(null),B(null)},onSubmit:async({text:a,kind:b,author:c})=>{await N({action:"add",mark:{text:a,kind:b,elements:s.elements,region:s.region,level:j,author:{name:c||"someone"}}})&&t(null)}},`${s.elements.join(",")}|${s.region?JSON.stringify(s.region):""}`):af?(0,h.jsx)(ck,{mark:af,number:o.indexOf(af)+1,listener:n?.listener,busy:y,error:A,note:ac,labels:l,onClose:()=>v(null),onReply:a=>void N({action:"reply",id:af.id,text:a,author:{name:n?.author||"someone"}}),onResolve:()=>void N({action:"resolve",id:af.id}),onReopen:()=>void N({action:"reopen",id:af.id}),onRemove:async()=>{await N({action:"remove",id:af.id})&&v(null)}}):(0,h.jsx)(cl,{marks:o,unread:ad,selected:u,onSelect:a=>{x(!1),v(a)},onCopy:()=>{var b,c;let d,e;if(!a)return;let f=(b=n?.lastReport()??null,d=(c=[{doc:a,marks:o.filter(a=>"resolved"!==a.status)}]).reduce((a,b)=>a+b.marks.length,0),e=function(a){if(!a||!a.doc)return"No canvas has said what it is showing.";let b=[`${a.who?`${a.who} is`:"The canvas is"} on ${bu(a.doc)}${a.kind?` (${a.kind})`:""}`];a.system&&b.push(`as a member of ${bu(a.system)}`),a.focus&&b.push(`with ${a.focus} in hand`);let c=b.join(", ")+".";return a.tour&&(c+=` Tour ${a.tour.title?`'${a.tour.title}' `:""}at step ${a.tour.index+1} of ${a.tour.count}, ${a.tour.playing?"playing":"paused"}.`),a.at&&(c+=` (reported ${a.at})`),c}(b),d?`${e}
|
|
12
12
|
${d} mark(s):
|
|
13
13
|
${function(a,b={}){let c=[],d=b.start??1;for(let{doc:b,marks:e}of a)for(let a of e){for(let e of(c.push(`${d}. [${a.status} \xb7 ${a.kind}] ${a.author.name}${"agent"===a.author.role?" (agent)":""} on ${function(a){let b=[];if(a.elements?.length&&b.push(a.elements.join(", ")),a.region){let c=a.region;b.push(`the area ${Math.round(c.x)},${Math.round(c.y)} ${Math.round(c.width)}\xd7${Math.round(c.height)}${a.level?` inside ${a.level}`:""}`)}return b.length?b.join(" in "):"the drawing"}(a)} (${bu(b)}) — ${a.id}`),c.push(` "${bv(a.text)}"`),a.replies??[]))c.push(` ↳ ${e.author.name}${"agent"===e.author.role?" (agent)":""}: "${bv(e.text)}"`);d++}return c.join("\n")}(c)}`:`${e}
|
|
14
|
-
No marks.`);navigator.clipboard?.writeText(f).then(()=>{D(!0),setTimeout(()=>D(!1),2e3)})},copied:C,note:ac,labels:l,onClose:()=>x(!1)}),al&&n?.sheetBody?(0,eT.createPortal)(m,n.sheetBody):(0,h.jsx)("div",{className:"stage-board-card",children:m}))]}):null}function ff({docPath:a,onReveal:b}){let c=e7(),d=c?.lit??null,e=(0,i.useRef)(-1);return(0,i.useEffect)(()=>{!d||e.current===d.nonce||d.doc&&d.doc!==a||(d.spotlight?.length||d.region)&&(e.current=d.nonce,b())},[d,a,b]),null}function fg(a,b,c){try{return a()}catch(d){let a=d instanceof Error?d.message:String(d);return console.warn("[stateloom] skipped on a malformed document:",a),c?.(a),b}}let fh=(a,b)=>"chen"===b?`stateloom:erd-layout:chen:${a}`:`stateloom:erd-layout:${a}`,fi="stateloom:erd-notation",fj="stateloom:erd-lock";function fk(a,b){try{return JSON.parse(localStorage.getItem(fh(a,b))??"{}")}catch{return{}}}async function fl(a){let b=a.slice(0,a.lastIndexOf("/")),c=((await (await fetch("/api/docs",{cache:"no-store"})).json()).docs??[]).map(a=>a.path).filter(a=>a.endsWith(".smdf.json")&&a.slice(0,a.lastIndexOf("/"))===b),d=[];for(let a of c)try{let b=await (await fetch(`/api/file${(0,ek.docQuery)(a)}`,{cache:"no-store"})).json(),c=JSON.parse(b.content??"null"),e=aq(c?.stateMachine??c?.StateMachine??c);e?.state&&d.push({path:a,def:e})}catch{}return d}let fm="w-full rounded border border-gray-700 bg-gray-950 px-2 py-1 text-xs text-gray-200 placeholder:text-gray-600",fn="rounded border border-gray-700 bg-gray-800 px-2 py-1 text-xs text-gray-200 hover:bg-gray-700",fo="mb-1 mt-3 text-[11px] font-semibold uppercase tracking-wide text-gray-500";function fp(){let a=(0,ek.useRequestedDoc)(),[b,c]=(0,i.useState)(""),[d,e]=(0,i.useState)(null),[f,g]=(0,i.useState)({}),[j,k]=(0,i.useState)("crowsfoot"),[l,m]=(0,i.useState)(!1),[n,o]=(0,i.useState)({...M}),[p,q]=(0,i.useState)(0),[r,s]=(0,i.useState)(null),[t,u]=(0,i.useState)({text:"loading…",tone:"ok"}),v=(0,i.useCallback)((a,b="ok")=>u({text:a,tone:b}),[]),[w,x]=(0,i.useState)(!1);(0,i.useEffect)(()=>{let a=setTimeout(()=>x(!0),4e3);return()=>{clearTimeout(a),x(!1)}},[t]);let[y,z]=(0,i.useState)("entities"),[A,B]=(0,i.useState)(!1),[C,D]=(0,i.useState)(!1),[E,F]=(0,i.useState)(!1),G=(0,i.useRef)(null),H=eL({onClose:()=>B(!1),restVh:62,tallVh:92}),[I,J]=(0,i.useState)(0),[K,L]=(0,i.useState)(null),N=(0,i.useRef)(null);(0,i.useEffect)(()=>{let b=!1,d=null;return(async()=>{let f=await (await fetch(`/api/file${(0,ek.docQuery)(a)}`,{cache:"no-store"})).json();if(b)return;if(f.error)return v(f.error,"warn");let h=f.path??"",i=null;try{let a=f.content?aq(JSON.parse(f.content)):null;X(a)&&(i={...a,relationships:a.relationships??[]})}catch{}if(f.exists&&!i)return v(`${h} is not a readable ERD definition`,"warn");let j=(h.split("/").pop()??"Untitled").replace(/\.erdf\.json$/i,""),l=function(){try{return"chen"===localStorage.getItem(fi)?"chen":"crowsfoot"}catch{return"crowsfoot"}}();c(h),e(i??{settings:{namespace:"Default",name:j},entities:[],relationships:[]}),k(l),m(function(){try{let a=localStorage.getItem(fj);if(null!==a)return"1"===a;return window.matchMedia("(pointer: coarse)").matches}catch{return!1}}()),g(fk(h,l)),s(null),L(null),q(a=>a+1),v(f.exists?"loaded":"new document — the first edit writes it");let{bridgeUrl:n}=await eu();!b&&n&&(N.current=d=dL({url:n,role:"web",docId:h,name:"web-designer",onFull:a=>{let b=a.def;X(b)&&(e({...b,relationships:b.relationships??[]}),v("updated live"))},onPatch:()=>{},onPresence:a=>J(a.length)}),d.connect())})().catch(a=>!b&&v(String(a),"warn")),()=>{b=!0,N.current=null,d?.disconnect()}},[a,v]);let O=(0,i.useMemo)(()=>{if(!d)return{};let a=fg(()=>(function(a,b={}){let c=b.notation??"crowsfoot",d=b.hSpacing??70,e=b.vSpacing??("chen"===c?130:90),f="chen"===c?aj:as,g=[],h=new Set;for(let b of a.entities??[])!b?.name||h.has(b.name)||(h.add(b.name),g.push(b));let i=new Map,j=(a,b,c=new Set)=>a===b||!c.has(a)&&(c.add(a),(i.get(a)??[]).some(a=>j(a,b,c)));for(let b of a.relationships??[]){if(!b||!h.has(b.from)||!h.has(b.to)||b.from===b.to)continue;let[a,c]="N:1"===b.cardinality?[b.to,b.from]:[b.from,b.to];if((i.get(a)??[]).includes(c)||j(c,a))continue;let d=i.get(a);d?d.push(c):i.set(a,[c])}let k=new Map,l=(a,b)=>{if(!((k.get(a)??-1)>=b))for(let c of(k.set(a,b),i.get(a)??[]))l(c,b+1)},m=new Set([...i.values()].flat());for(let a of g)m.has(a.name)||l(a.name,0);for(let a of g)k.has(a.name)||l(a.name,0);for(let a of[...g].sort((a,b)=>k.get(b.name)-k.get(a.name))){let b=i.get(a.name)??[];b.length&&k.set(a.name,Math.min(...b.map(a=>k.get(a)))-1)}let n=[],o=new Map,p=(a,b)=>((n[b]??=[]).push(a),o.set(a.id,a),a);for(let a of g)p({id:a.name,entity:a.name,...f(a),upper:[],lower:[],x:0},k.get(a.name)??0);let q=0;for(let[a,b]of i)for(let c of b){let b=a;for(let d=k.get(a)+1;d<k.get(c);d++){let a=p({id:`\u0000lane${q++}`,width:28,height:0,upper:[],lower:[],x:0},d);o.get(b).lower.push(a.id),a.upper.push(b),b=a.id}o.get(b).lower.push(c),o.get(c).upper.push(b)}for(let a=n.length-1;a>=0;a--)n[a]?.length||n.splice(a,1);let r=(a,b)=>a.length?a.reduce((a,c)=>a+b(o.get(c)),0)/a.length:null,s=(a,b)=>{let c=new Map;for(let a of n)a.forEach((a,b)=>c.set(a.id,b));let d=new Map(a.map((a,d)=>[a.id,r(a[b],a=>c.get(a.id))??d]));a.sort((a,b)=>d.get(a.id)-d.get(b.id))};for(let a=0;a<2;a++){for(let a=1;a<n.length;a++)s(n[a],"upper");for(let a=n.length-2;a>=0;a--)s(n[a],"lower")}let t=a=>a.x+a.width/2,u=(a,b)=>{let c=0;for(let e of a){let a=r(e[b],t);e.x=Math.max(c,null===a?c:a-e.width/2),c=e.x+e.width+d}};for(let a of n)u(a,"upper");for(let a=n.length-2;a>=0;a--)u(n[a],"lower");let v=Math.min(0,...[...o.values()].map(a=>a.x)),w={},x=40;for(let a of n){for(let b of a)b.entity&&(w[b.entity]={x:Math.round(b.x-v)+40,y:x,width:b.width,height:b.height});x+=Math.max(0,...a.map(a=>a.height))+e}return w})(d,{notation:j}),{});for(let[b,c]of Object.entries(f))a[b]&&(a[b]={...a[b],...c});return a},[d,f,j]),P=(0,i.useMemo)(()=>{if(!d)return[];let a="";return fg(()=>Y(d),null,b=>a=b)??[{ruleId:"E000",message:`The document could not be checked (${a}): a field is not the shape Spec 80 gives it`}]},[d]),R=(0,i.useMemo)(()=>P.map(a=>(a.element??"").split(/[.[]/)[0]).filter(Boolean),[P]),T=(0,i.useCallback)(async a=>{let c;if(d&&b){try{c=a(d)}catch(a){return v(a instanceof Error?a.message:String(a),"warn")}e(c),L(null);try{let a=await fetch(`/api/file${(0,ek.docQuery)(b)}`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({content:JSON.stringify(c,null,2)+"\n"})});if(!a.ok)throw Error((await a.json())?.error??`HTTP ${a.status}`);N.current?.emitFull(c),v("saved")}catch(a){v(`not saved: ${a instanceof Error?a.message:String(a)}`,"warn")}}},[d,b,v]),U=(0,i.useCallback)((a,c)=>{g(d=>{let e={...d,[a]:{x:Math.round(c.x),y:Math.round(c.y)}};try{localStorage.setItem(fh(b,j),JSON.stringify(e))}catch{}return e})},[b,j]),Z=()=>{g({});try{localStorage.removeItem(fh(b,j))}catch{}q(a=>a+1)},af=async()=>{if(!d)return;v("checking links…");let a=await fl(b);if(0===a.length)return L("none"),z("issues"),B(!0),v("no .smdf.json beside this document to check against","warn");let c=a.flatMap(a=>$(a.def,d).map(b=>({...b,message:`${a.def.settings?.name??a.path}: ${b.message}`})));c.push(..._(d,a.map(a=>a.def.settings?.name??""))),L(c),z("issues"),B(!0),F(!1),v(`checked ${a.length} machine(s): ${c.length} problem(s)`,c.length?"warn":"ok")},ag=async a=>{let c=(await fl(b)).find(b=>b.def.settings?.name===a);c?(0,ek.navigateToDoc)(c.path):v(`no .smdf.json beside this document defines '${a}'`,"warn")},ah=()=>{let a=G.current?.getBoundingClientRect();return{width:a?.width??0,height:a?.height??0}},ai=a=>{let{width:b,height:c}=ah();o(d=>Q(d,a,{x:b/2,y:c/2}))},al=a=>{let b=O[a],{width:c,height:d}=ah();b&&c&&(o(S([b],c,d,{padding:28,maxScale:1.25})),s(a),H.close())},ap=eS(),ar=eP("focus"),at=(0,i.useMemo)(()=>d?fg(()=>(function(a,b,c={}){let d=!1!==c.rows,e=[];for(let c of a?.entities??[]){let a=c?.name?b[c.name]:void 0;a&&(e.push({focus:`entity:${c.name}`,box:a}),(c.attributes??[]).filter(a=>a?.name).forEach((b,f)=>{e.push({focus:`attribute:${c.name}.${b.name}`,box:d?{x:a.x,y:a.y+30+20*f,width:a.width,height:20}:a})}))}return e})(d,O,{rows:"chen"!==j}),[]):[],[d,O,j]),au=(0,i.useRef)(-1);(0,i.useEffect)(()=>{if(!d||au.current===ap.nonce)return;au.current=ap.nonce;let a=ap.focus?a8(ap.focus):null,b=a?.kind==="entity"?a.name:a?.kind==="attribute"?a.name.split(".")[0]:null;b&&O[b]&&al(b)},[d,ap,O]),(0,i.useEffect)(()=>{r&&1&&eR(`entity:${r}`)},[r]);let av=d?.entities.find(a=>a.name===r)??null,aw=b.split("/").pop()||"…",ax=Array.isArray(K)?K:[],ay=P.length+ax.length,az=[{id:"entities",label:"Entities",icon:"▭"},{id:"relations",label:"Relations",icon:"⟷"},{id:"notes",label:"Notes",icon:"✎",badge:void 0},{id:"issues",label:"Issues",icon:(0,h.jsx)(em,{}),badge:ay||void 0}],aA=a=>y===a?"":"hidden md:block",aB=()=>{d&&navigator.clipboard?.writeText(function(a){let b=["erDiagram"],c=" ",d=new Set;for(let e of a.relationships??[]){if(!e?.from||!e?.to)continue;let a=ak[e.cardinality]??ak["1:N"];b.push(`${c}${am(e.from)} ${a} ${am(e.to)} : ${ao(e.label??"")}`),d.add(e.from),d.add(e.to)}let e=new Set;for(let f of a.entities??[]){if(!f?.name||e.has(f.name))continue;e.add(f.name);let a=(f.attributes??[]).filter(a=>a?.name);if(0===a.length){d.has(f.name)||b.push(`${c}${am(f.name)}`);continue}for(let d of(b.push(`${c}${am(f.name)} {`),a))b.push(`${c}${c}${function(a){let b=[];"pk"===a.key&&b.push("PK"),"uk"===a.key&&b.push("UK"),a.references&&b.push("FK");let c=[],d=V(a);d.length&&c.push(`stateOf ${d.join(", ")}`),a.description&&c.push(a.description);let e=[an(a.type??"","unknown"),an(a.name,"unnamed")];return b.length&&e.push(b.join(", ")),c.length&&e.push(ao(c.join(" — "))),e.join(" ")}(d)}`);b.push(`${c}}`)}return b.join("\n")}(d)).then(()=>v("mermaid copied"))};return(0,h.jsxs)("div",{className:"app-shell dock-offset flex flex-col overflow-hidden bg-gray-950 text-gray-200",onClick:()=>C&&D(!1),children:[(0,h.jsxs)("header",{className:"relative z-40 flex items-center gap-2 border-b border-gray-800 bg-gray-900 px-2 py-1.5 text-xs md:px-3 md:py-2",children:[(0,h.jsx)("span",{className:"font-semibold text-blue-300",children:"ERD"}),(0,h.jsx)(el,{}),(0,h.jsxs)("span",{className:"min-w-0 flex-1 truncate text-gray-400",title:b,children:[d?.settings.name??aw,(0,h.jsxs)("span",{className:"hidden text-gray-600 lg:inline",children:[" · ",aw]})]}),(0,h.jsx)("span",{className:"inline-flex shrink-0 overflow-hidden rounded border border-gray-700",role:"group","aria-label":"Notation",children:[["crowsfoot","▤","Crow's foot — attributes listed inside the entity box"],["chen","◇","Chen — attributes as ovals, relationships as diamonds"]].map(([a,c,d])=>(0,h.jsx)("button",{title:d,"aria-label":d,"aria-pressed":j===a,onClick:()=>(a=>{if(a!==j){try{localStorage.setItem(fi,a)}catch{}k(a),g(fk(b,a)),q(a=>a+1)}})(a),className:`px-2.5 py-1.5 text-sm leading-none md:px-2 md:py-1 ${j===a?"bg-blue-900/60 text-blue-200":"bg-gray-800 text-gray-400 hover:bg-gray-700"}`,children:c},a))}),(0,h.jsxs)("div",{className:"hidden shrink-0 items-center gap-2 md:flex",children:[(0,h.jsx)("button",{className:fn,onClick:Z,title:"Forget the dragged positions and lay the board out again",children:"⤢ Arrange"}),(0,h.jsx)("button",{className:fn,onClick:af,title:"Check the state machines beside this document against it",children:"Check links"}),(0,h.jsx)("button",{className:fn,onClick:aB,children:"Copy mermaid"}),(0,h.jsx)("button",{className:fn,onClick:()=>F(a=>!a),"aria-pressed":!E,title:E?"Show the panel":"Hide the panel — the board takes the full width",children:E?"⟨ Panel":"Panel ⟩"})]}),(0,h.jsxs)("div",{className:"relative shrink-0 md:hidden",children:[(0,h.jsx)("button",{className:"rounded border border-gray-700 bg-gray-800 px-3 py-1.5 text-sm leading-none text-gray-200","aria-label":"More actions","aria-expanded":C,onClick:a=>{a.stopPropagation(),D(a=>!a)},children:"⋯"}),C&&(0,h.jsx)("div",{className:"absolute right-0 top-full z-50 mt-1 w-56 overflow-hidden rounded-lg border border-gray-700 bg-gray-900 py-1 shadow-xl",children:[["⤢ Arrange the board",Z],["Check links to the machines",af],["Copy as mermaid",aB]].map(([a,b])=>(0,h.jsx)("button",{className:"block w-full px-4 py-3 text-left text-sm text-gray-200 hover:bg-gray-800",onClick:()=>{D(!1),b()},children:a},a))})]})]}),(0,h.jsxs)("div",{className:"relative flex min-h-0 flex-1",children:[(0,h.jsxs)("div",{ref:G,className:"relative min-w-0 flex-1 overflow-hidden",children:[d&&(0,h.jsx)(eJ,{what:"diagram",resetKey:d,children:(0,h.jsx)(bN,{definition:d,notation:j,positions:O,viewport:n,onViewportChange:o,selection:r,readOnly:l,errorElements:R,fitKey:p,onSelect:s,onClearSelection:()=>s(null),onEntityMove:U,onOpenMachine:ag,emptyHint:"No entities yet — add one in the panel, or let an agent call add_entity."})}),d&&(0,h.jsx)(fe,{docPath:b||null,kind:"erd",viewport:n,setViewport:o,boxes:at,boardRef:G,focus:ar}),(0,h.jsxs)("div",{className:`pointer-events-none absolute left-2 top-2 flex max-w-[75%] items-center gap-1.5 rounded bg-gray-950/70 px-1.5 py-0.5 text-[11px] ${"warn"===t.tone?"text-amber-300":"text-gray-500"}`,role:"status",children:[(0,h.jsx)("span",{className:`h-1.5 w-1.5 shrink-0 rounded-full ${"warn"===t.tone?"bg-amber-400":"bg-emerald-500"}`}),(0,h.jsxs)("span",{className:`truncate transition-opacity duration-500 ${w&&"ok"===t.tone?"opacity-0":"opacity-100"}`,children:[t.text,I>1?` \xb7 ${I} in the room`:""]})]}),(0,h.jsxs)("div",{className:"absolute bottom-3 right-3 flex flex-col overflow-hidden rounded-lg border border-gray-700 bg-gray-900/90 shadow-lg backdrop-blur",children:[(0,h.jsx)("button",{title:l?"Shapes are locked: dragging moves the view. Tap to unlock.":"Lock the shapes in place, so dragging only moves the view","aria-label":"Lock shapes in place","aria-pressed":l,onClick:()=>{let a=!l;m(a);try{localStorage.setItem(fj,a?"1":"0")}catch{}v(a?"shapes locked — a drag anywhere moves the view":"shapes unlocked — drag one to move it")},className:`flex h-10 w-10 items-center justify-center border-b border-gray-800 hover:bg-gray-800 md:h-8 md:w-8 ${l?"bg-blue-950/60 text-blue-300":"text-gray-400"}`,children:(0,h.jsx)(eK,{locked:l})}),[["+","Zoom in",()=>ai(1.25)],["−","Zoom out",()=>ai(.8)],["⛶","Fit the whole diagram",()=>q(a=>a+1)]].map(([a,b,c])=>(0,h.jsx)("button",{title:b,"aria-label":b,onClick:c,className:"h-10 w-10 border-b border-gray-800 text-base leading-none text-gray-200 last:border-b-0 hover:bg-gray-800 md:h-8 md:w-8 md:text-sm",children:a},b))]}),av&&!A&&(0,h.jsxs)("button",{className:"absolute bottom-3 left-1/2 max-w-[60%] -translate-x-1/2 truncate rounded-full border border-blue-500/60 bg-gray-900/95 px-4 py-2 text-sm text-blue-200 shadow-lg md:hidden",onClick:()=>{z("entities"),B(!0)},children:["✎ ",av.name]})]}),A&&(0,h.jsx)("div",{className:"fixed inset-0 z-20 bg-black/50 md:hidden",onClick:H.close,"aria-hidden":"true"}),d&&(0,h.jsxs)("aside",{style:H.sheetStyle,className:`safe-x fixed inset-x-0 bottom-0 z-30 flex h-[var(--sheet-h)] flex-col overflow-hidden rounded-t-2xl border-t border-gray-800 bg-gray-900 shadow-2xl transition-[transform,height] duration-200 ease-out ${A?"translate-y-0":"pointer-events-none translate-y-full"} md:pointer-events-auto md:static md:z-auto md:h-auto md:w-80 md:translate-y-0 md:rounded-none md:border-l md:border-t-0 md:shadow-none md:transition-none ${E?"md:hidden":""}`,children:[(0,h.jsxs)("div",{className:"md:hidden",...H.zoneProps,children:[(0,h.jsx)("div",{className:"flex justify-center pb-1 pt-2",children:(0,h.jsx)("span",{className:"h-1.5 w-12 rounded-full bg-gray-600"})}),(0,h.jsxs)("div",{className:"flex items-center justify-between border-b border-gray-800 px-4 pb-2",children:[(0,h.jsx)("h2",{className:"text-sm font-semibold text-gray-300",children:az.find(a=>a.id===y)?.label}),(0,h.jsx)("button",{onClick:H.close,className:"-mr-2 px-3 py-2 text-lg text-gray-400","aria-label":"Close panel",children:"✕"})]})]}),(0,h.jsxs)("div",{className:"touch-targets dock-offset flex-1 overflow-y-auto overscroll-contain p-3",children:[(0,h.jsxs)("section",{className:aA("entities"),children:[(0,h.jsx)("div",{className:fo,style:{marginTop:0},children:"Entities"}),(0,h.jsx)("div",{className:"flex flex-wrap gap-1",children:d.entities.map(a=>(0,h.jsx)("button",{className:`${fn} ${r===a.name?"border-blue-500 text-blue-300":""}`,onClick:()=>s(a.name),children:a.name},a.name))}),(0,h.jsx)(fr,{fields:[{name:"name",placeholder:"new entity"}],submit:"+ Entity",onSubmit:a=>{T(b=>ad(b,{name:a.name.trim()})),s(a.name.trim())}}),av&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsxs)("div",{className:`${fo} flex items-center justify-between gap-2`,children:[(0,h.jsx)("span",{className:"truncate text-sm normal-case tracking-normal text-gray-200",children:av.name}),(0,h.jsx)("button",{className:`${fn} normal-case tracking-normal`,onClick:()=>al(av.name),title:"Bring this entity to the middle of the board at a readable size",children:"◎ Show on board"})]}),(0,h.jsxs)("label",{className:"mb-1 flex items-center gap-2 text-[11px] text-gray-400",title:"Exists only through another entity (an order line, without its order). Chen draws it as a double rectangle.",children:[(0,h.jsx)("input",{type:"checkbox",checked:!!av.weak,onChange:a=>T(b=>ae(b,av.name,{weak:a.target.checked}))}),"weak entity"]}),(av.attributes??[]).map(a=>(0,h.jsxs)("div",{className:"flex items-center justify-between gap-2 py-0.5 font-mono text-[11px]",children:[(0,h.jsxs)("span",{className:a.stateOf?"text-blue-300":"text-gray-300",children:[a.name," : ",a.type,(0,h.jsxs)("span",{className:"text-gray-500",children:[a.key?` ${a.key.toUpperCase()}`:"",a.references?` → ${a.references}`:"",a.stateOf?` ◉ ${[a.stateOf].flat().join(", ")}`:""]})]}),(0,h.jsx)("button",{className:"text-gray-500 hover:text-red-400","aria-label":`Remove ${a.name}`,onClick:()=>T(b=>(function(a,b,c){let d=aa(a),e=ab(d,b),f=e.attributes?.length??0;if(e.attributes=(e.attributes??[]).filter(a=>a.name!==c),e.attributes.length===f)throw Error(`Attribute '${b}.${c}' not found.`);return d})(b,av.name,a.name)),children:"✕"})]},a.name)),(0,h.jsx)(fr,{fields:[{name:"name",placeholder:"attribute"},{name:"type",placeholder:"type",initial:"string"},{name:"key",options:["","pk","uk"]},{name:"references",placeholder:"references Entity.attr"},{name:"stateOf",placeholder:"stateOf Machine"}],submit:"+ Attribute",onSubmit:a=>T(b=>(function(a,b,c){if(!c.name?.trim())throw Error("An attribute needs a name.");let d=aa(a),e=ab(d,b);if(e.attributes??=[],e.attributes.some(a=>a.name===c.name))throw Error(`Attribute '${b}.${c.name}' already exists.`);return e.attributes.push(ac({...c})),d})(b,av.name,{name:a.name.trim(),type:a.type.trim()||"string",key:"pk"===a.key||"uk"===a.key?a.key:void 0,references:a.references.trim()||void 0,stateOf:a.stateOf.trim()||void 0}))}),(0,h.jsxs)("button",{className:`${fn} mt-2 text-red-300`,onClick:()=>{T(a=>{var b;let c;return b=av.name,ab(c=aa(a),b),c.entities=c.entities.filter(a=>a.name!==b),c.relationships=c.relationships.filter(a=>a.from!==b&&a.to!==b),c}),s(null)},children:[(0,h.jsx)(ed,{name:"trash"})," Delete ",av.name]})]})]}),(0,h.jsxs)("section",{className:aA("relations"),children:[(0,h.jsx)("div",{className:`${fo} max-md:mt-0`,children:"Relationships"}),0===d.relationships.length&&(0,h.jsx)("div",{className:"py-0.5 text-[11px] text-gray-600",children:"None yet."}),d.relationships.map((a,b)=>(0,h.jsxs)("div",{className:"flex items-center justify-between gap-2 py-0.5 text-[11px] text-gray-300",children:[(0,h.jsxs)("span",{children:[a.from," ",(0,h.jsx)("span",{className:"text-gray-500",children:a.cardinality})," ",a.to,a.label?(0,h.jsxs)("span",{className:"text-gray-500",children:[" : ",a.label]}):null]}),(0,h.jsx)("button",{className:"text-gray-500 hover:text-red-400","aria-label":"Remove relationship",onClick:()=>T(b=>(function(a,b,c,d){let e=aa(a),f=e.relationships.length;if(e.relationships=e.relationships.filter(a=>a.from!==b||a.to!==c||void 0!==d&&a.label!==d),e.relationships.length===f)throw Error(`No relationship from '${b}' to '${c}'${void 0===d?"":` labelled '${d}'`}.`);return e})(b,a.from,a.to,a.label)),children:"✕"})]},b)),d.entities.length>0&&(0,h.jsx)(fr,{fields:[{name:"from",options:d.entities.map(a=>a.name)},{name:"cardinality",options:[...W],initial:"1:N"},{name:"to",options:d.entities.map(a=>a.name)},{name:"label",placeholder:"label (a verb)"}],submit:"+ Relationship",onSubmit:a=>T(b=>(function(a,b){let c=aa(a);if(ab(c,b.from),ab(c,b.to),!W.includes(b.cardinality))throw Error(`Cardinality '${b.cardinality}' is not one of ${W.join(", ")}.`);return c.relationships.push(ac({...b})),c})(b,{from:a.from,to:a.to,cardinality:a.cardinality,label:a.label.trim()||void 0}))})]}),(0,h.jsxs)("section",{className:aA("notes"),children:[(0,h.jsx)("div",{className:`${fo} max-md:mt-0`,children:"Notes"}),(0,h.jsx)("p",{className:"mb-1 text-[11px] text-gray-600",children:"Saved in the document, for whoever opens it next — you, or an agent (it reads them with get_notes)."}),(0,h.jsx)(fq,{label:"On this diagram",value:d.settings.notes??"",placeholder:"What was discussed, what is still open…",onSave:a=>T(b=>(function(a,b){let c=aa(a);for(let a of["description","notes"]){let d=b[a];void 0!==d&&(d.trim()?c.settings[a]=d:delete c.settings[a])}return c})(b,{notes:a}))},"diagram"),av?(0,h.jsx)(fq,{label:`On ${av.name}`,value:av.notes??"",placeholder:`A question or a decision about ${av.name}…`,onSave:a=>T(b=>ae(b,av.name,{notes:a}))},`entity:${av.name}`):(0,h.jsx)("p",{className:"mt-2 text-[11px] text-gray-600",children:"Select an entity to leave a note on it."}),d.entities.some(a=>a.notes?.trim())&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("div",{className:fo,children:"Entities with notes"}),(0,h.jsx)("div",{className:"flex flex-wrap gap-1",children:d.entities.filter(a=>a.notes?.trim()).map(a=>(0,h.jsx)("button",{className:`${fn} ${r===a.name?"border-blue-500 text-blue-300":""}`,onClick:()=>s(a.name),children:a.name},a.name))})]})]}),(0,h.jsxs)("section",{className:aA("issues"),children:[(0,h.jsx)("div",{className:`${fo} max-md:mt-0 ${0===ay&&!K?"md:hidden":""}`,children:"Issues"}),P.map((a,b)=>(0,h.jsxs)("div",{className:"py-0.5 text-[11px] text-red-300",children:["[",a.ruleId,"] ",a.message]},`p${b}`)),ax.map((a,b)=>(0,h.jsxs)("div",{className:"py-0.5 text-[11px] text-amber-300",children:["[",a.ruleId,"] ",a.message]},`l${b}`)),"none"===K&&(0,h.jsx)("div",{className:"py-0.5 text-[11px] text-amber-300",children:"No state machine (.smdf.json) sits beside this document, so there was nothing to check it against."}),0===ay&&"none"!==K&&(0,h.jsx)("div",{className:`py-0.5 text-[11px] ${K?"text-green-400":"text-gray-600 md:hidden"}`,children:K?"Every name the machines use resolves.":"The document is valid. “Check links” (⋯) holds the state machines beside it against it."})]})]})]})]}),(0,h.jsx)("nav",{className:"dock-safe safe-x fixed inset-x-0 bottom-0 z-40 flex border-t border-gray-800 bg-gray-900/95 backdrop-blur-md md:hidden",children:az.map(a=>{let b=A&&y===a.id;return(0,h.jsxs)("button",{onClick:()=>{var b;return b=a.id,void(A&&y===b?H.close():B(!0),z(b))},"aria-pressed":b,className:`relative flex h-14 flex-1 flex-col items-center justify-center gap-0.5 text-[11px] transition-colors ${b?"text-blue-400":"text-gray-500"}`,children:[(0,h.jsx)("span",{className:"flex h-4 items-center text-base leading-none",children:a.icon}),(0,h.jsx)("span",{children:a.label}),void 0!==a.badge&&(0,h.jsx)("span",{className:"absolute right-1/2 top-1 min-w-[16px] translate-x-5 rounded-full border border-red-900/80 bg-red-950/80 px-1 text-[10px] leading-4 text-red-200",children:a.badge}),b&&(0,h.jsx)("span",{className:"absolute inset-x-4 top-0 h-0.5 rounded-full bg-blue-400"})]},a.id)})})]})}function fq({label:a,value:b,placeholder:c,onSave:d}){let[e,f]=(0,i.useState)(b),[g,j]=(0,i.useState)(b),[k,l]=(0,i.useState)(!1);b!==g&&(j(b),k||f(b));let m=(0,i.useRef)(null),n=a=>{m.current&&clearTimeout(m.current),m.current=null,a!==b&&d(a)};return(0,h.jsxs)("label",{className:"mt-2 block",children:[(0,h.jsx)("span",{className:"text-[11px] text-gray-500",children:a}),(0,h.jsx)("textarea",{className:`${fm} h-24 resize-y leading-snug`,placeholder:c,value:e,onChange:a=>{let b=a.target.value;f(b),m.current&&clearTimeout(m.current),m.current=setTimeout(()=>n(b),900)},onFocus:()=>l(!0),onBlur:()=>{l(!1),n(e)}})]})}function fr({fields:a,submit:b,onSubmit:c}){let d=()=>Object.fromEntries(a.map(a=>[a.name,a.initial??a.options?.[0]??""])),[e,f]=(0,i.useState)(d),g=a[0];return(0,h.jsxs)("form",{className:"mt-1 grid grid-cols-2 gap-1",onSubmit:b=>{b.preventDefault();let h={...d(),...e};h[g.name]?.trim()&&(c(h),f(b=>Object.fromEntries(a.map(a=>[a.name,a.options?b[a.name]??"":a.initial??""]))))},children:[a.map(a=>a.options?(0,h.jsx)("select",{className:fm,"aria-label":a.name,value:e[a.name]??"",onChange:b=>f(c=>({...c,[a.name]:b.target.value})),children:a.options.map(b=>(0,h.jsx)("option",{value:b,children:b||`(${a.name})`},b))},a.name):(0,h.jsx)("input",{className:fm,"aria-label":a.name,placeholder:a.placeholder,value:e[a.name]??"",onChange:b=>f(c=>({...c,[a.name]:b.target.value}))},a.name)),(0,h.jsx)("button",{type:"submit",className:`${fn} ${1===a.length?"":"col-span-2"}`,children:b})]})}let fs="w-full rounded border border-gray-700 bg-gray-950 px-2 py-1 text-xs text-gray-200 placeholder:text-gray-600",ft="rounded border border-gray-700 bg-gray-800 px-2 py-1 text-xs text-gray-200 hover:bg-gray-700",fu="mb-1 mt-3 text-[11px] font-semibold uppercase tracking-wide text-gray-500";function fv({id:a,fields:b,submit:c,onSubmit:d,reset:e=!1,required:f}){let g=()=>Object.fromEntries(b.map(a=>[a.name,a.initial??(!a.checkbox&&(a.options?a.options[0]??"":""))])),[j,k]=(0,i.useState)(g),l=(a,b)=>k(c=>({...c,[a]:b}));return(0,h.jsxs)("form",{className:"mt-1 grid grid-cols-2 gap-1",onSubmit:a=>{a.preventDefault();let c={...g(),...j};!(f??[]).some(a=>!String(c[a]??"").trim())&&(d(c),e&&k(a=>Object.fromEntries(b.map(b=>[b.name,b.options||b.checkbox?a[b.name]??"":b.initial??""]))))},children:[b.map(b=>{let c=b.label??b.name;if(b.checkbox)return(0,h.jsxs)("label",{className:"flex items-center gap-2 text-[11px] text-gray-400",children:[(0,h.jsx)("input",{type:"checkbox",checked:!!j[b.name],onChange:a=>l(b.name,a.target.checked)}),c]},b.name);if(b.options)return(0,h.jsx)("select",{className:`${fs} ${b.wide?"col-span-2":""}`,"aria-label":c,title:c,value:String(j[b.name]??""),onChange:a=>l(b.name,a.target.value),children:b.options.map(a=>(0,h.jsx)("option",{value:a,children:a||`(${c})`},a))},b.name);let d=b.suggest?.length?`${a}-${b.name}`:void 0;return(0,h.jsxs)("span",{className:b.wide?"col-span-2":"",children:[(0,h.jsx)("input",{className:fs,"aria-label":c,title:c,placeholder:b.placeholder??c,list:d,value:String(j[b.name]??""),onChange:a=>l(b.name,a.target.value)}),d&&(0,h.jsx)("datalist",{id:d,children:b.suggest.map(a=>(0,h.jsx)("option",{value:a},a))})]},b.name)}),(0,h.jsx)("button",{type:"submit",className:`${ft} col-span-2`,children:c})]})}function fw({kind:a,size:b=16}){return(0,h.jsxs)("svg",{width:b,height:b,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",className:"shrink-0",children:["erd"===a&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("rect",{x:"4",y:"4.5",width:"16",height:"15",rx:"1.5"}),(0,h.jsx)("path",{d:"M4 9h16M8 13h8M8 16.5h6"})]}),"machine"===a&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("rect",{x:"2.5",y:"4",width:"8",height:"6",rx:"2.5"}),(0,h.jsx)("rect",{x:"13.5",y:"14",width:"8",height:"6",rx:"2.5"}),(0,h.jsx)("path",{d:"M6.5 10v4.5a2.5 2.5 0 0 0 2.5 2.5h4.5"}),(0,h.jsx)("path",{d:"M11.5 15l2 2-2 2"})]}),"sequence"===a&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("path",{d:"M6 4v16M18 4v16",strokeDasharray:"2 2.2"}),(0,h.jsx)("path",{d:"M6 9h11M15 7l2 2-2 2"}),(0,h.jsx)("path",{d:"M18 15H7M9 13l-2 2 2 2"})]}),"system"===a&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("rect",{x:"3",y:"3.5",width:"7",height:"6",rx:"1.5"}),(0,h.jsx)("rect",{x:"14",y:"3.5",width:"7",height:"6",rx:"1.5"}),(0,h.jsx)("rect",{x:"8.5",y:"14.5",width:"7",height:"6",rx:"1.5"}),(0,h.jsx)("path",{d:"M10 6.5h4M7 9.5l3 5M17 9.5l-3 5"})]}),"link"===a&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("path",{d:"M10 14a4 4 0 0 0 5.7 0l3-3a4 4 0 0 0-5.7-5.7l-1.2 1.2"}),(0,h.jsx)("path",{d:"M14 10a4 4 0 0 0-5.7 0l-3 3a4 4 0 0 0 5.7 5.7l1.2-1.2"})]}),"actor"===a&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("circle",{cx:"12",cy:"7.5",r:"3.5"}),(0,h.jsx)("path",{d:"M5 20a7 7 0 0 1 14 0"})]})]})}let fx=["text-sky-300","text-emerald-300","text-amber-300","text-rose-300","text-violet-300","text-cyan-300","text-lime-300","text-orange-300"],fy=a=>`seq-read-${a.kind}-${a.id}`;function fz({definition:a,selection:b,issues:c,onSelect:d,onShowInDiagram:e}){let f=new Map(a.participants.map((a,b)=>[a.name,fx[b%fx.length]])),g=az(a),i=g.filter(a=>null===a.fragment),j=(a.fragments??[]).map((a,b)=>({f:a,fi:b,rows:g.filter(a=>a.fragment===b)})),k=(a,c)=>b?.kind===a&&b.id===c,l=a=>(0,h.jsx)("span",{className:`font-semibold ${f.get(a)??"text-gray-300"}`,children:a||"?"}),m=(a,b)=>{let f={kind:"message",id:a},g=c.get(`message:${a}`)??[],i=g.some(a=>"error"===a.severity)?"error":g.length?"warning":null,j=k("message",a);return(0,h.jsx)("li",{id:fy(f),className:"scroll-mt-16 scroll-mb-24",children:(0,h.jsxs)("div",{role:"button",tabIndex:0,"aria-pressed":j,onClick:()=>d(f),onKeyDown:a=>("Enter"===a.key||" "===a.key)&&(a.preventDefault(),d(f)),className:`flex gap-3 rounded-lg border-l-2 px-3 py-2.5 ${j?"bg-blue-950/60 ring-1 ring-blue-500/60":"hover:bg-gray-900"} ${"error"===i?"border-red-500":"warning"===i?"border-amber-400":"border-transparent"}`,children:[(0,h.jsx)("span",{className:"mt-0.5 flex h-6 min-w-6 shrink-0 items-center justify-center rounded-full border border-gray-700 bg-gray-900 px-1 font-mono text-[11px] text-gray-300",children:a}),(0,h.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,h.jsxs)("div",{className:"text-[13px] leading-5 text-gray-400",children:[l(b.from),b.from===b.to?(0,h.jsx)("span",{children:" to itself"}):(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("span",{className:"px-1.5 text-gray-500",children:b.reply?"⇠":"→"}),l(b.to)]}),b.reply&&(0,h.jsx)("span",{className:"ml-2 text-[11px] text-gray-500",children:"reply"}),b.optional&&(0,h.jsx)("span",{className:"ml-2 rounded border border-gray-700 px-1 text-[11px] text-gray-400",children:"optional"})]}),(0,h.jsx)("div",{className:`mt-0.5 break-words text-[15px] leading-6 ${b.reply?"text-gray-300":"text-gray-100"}`,children:b.label||(0,h.jsx)("span",{className:"text-gray-500",children:"no label"})}),(b.event||b.state||b.carries)&&(0,h.jsxs)("div",{className:"mt-1.5 flex flex-wrap items-center gap-x-2 gap-y-1 text-[12px] leading-5",children:[b.event&&(0,h.jsx)("span",{className:"rounded border border-blue-500/50 bg-blue-950/50 px-1.5 font-mono text-blue-200",children:b.event}),b.event&&b.machine&&(0,h.jsxs)("span",{className:"text-gray-400",children:["on ",b.machine]}),b.state&&(0,h.jsxs)("span",{className:"text-emerald-300",children:["→ ",b.state]}),b.carries&&(0,h.jsxs)("span",{className:"text-gray-400",children:["carries ",b.carries]})]}),g.map((a,b)=>(0,h.jsx)("p",{className:`mt-1.5 text-[12px] leading-5 ${"error"===a.severity?"text-red-300":"text-amber-300"}`,children:a.text},b)),j&&(0,h.jsx)("button",{className:"mt-2 rounded border border-gray-700 bg-gray-800 px-3 py-1.5 text-[12px] text-gray-200",onClick:a=>{a.stopPropagation(),e(f)},children:"Show in the diagram"})]})]})},a)};return(0,h.jsx)("div",{className:"h-full overflow-y-auto overscroll-contain",children:(0,h.jsxs)("div",{className:"mx-auto max-w-2xl px-4 pb-28 pt-10",children:[a.participants.length>0&&(0,h.jsx)("ul",{className:"mb-4 flex flex-wrap gap-2","aria-label":"Participants",children:a.participants.map(a=>{let b={kind:"participant",id:a.name},e=a.actor?"actor":a.object?"object":a.service?"service":"",f=c.get(`participant:${a.name}`)??[];return(0,h.jsx)("li",{id:fy(b),children:(0,h.jsxs)("button",{onClick:()=>d(b),"aria-pressed":k("participant",a.name),title:f.map(a=>a.text).join("\n")||void 0,className:`rounded-full border px-3 py-1 text-[13px] ${k("participant",a.name)?"border-blue-500 bg-blue-950/60":"border-gray-700 bg-gray-900"} ${f.length?"ring-1 ring-amber-400/70":""}`,children:[l(a.name),e&&(0,h.jsx)("span",{className:"ml-1.5 text-[11px] text-gray-400",children:e})]})},a.name)})}),0===g.length&&(0,h.jsx)("p",{className:"text-sm text-gray-400",children:"No messages yet — add them in the panel, or let an agent write the scenario."}),(0,h.jsx)("ol",{className:"flex flex-col gap-1",children:i.map(({ref:a,message:b})=>m(a,b))}),j.map(({f:a,fi:b,rows:c})=>(0,h.jsxs)("section",{className:"mt-5 rounded-xl border border-indigo-500/50 bg-indigo-950/20 p-1.5",children:[(0,h.jsxs)("header",{className:"px-3 pb-1.5 pt-2",children:[(0,h.jsxs)("div",{className:"text-[12px] text-indigo-200",children:[(0,h.jsx)("span",{className:"font-semibold uppercase tracking-wide",children:a.kind}),(0,h.jsxs)("span",{className:"text-indigo-300",children:[" · after ",a.after]})]}),(0,h.jsx)("div",{className:"mt-0.5 break-words text-[14px] leading-5 text-gray-100",children:a.label})]}),0===c.length?(0,h.jsx)("p",{className:"px-3 pb-2 text-[12px] text-gray-400",children:"No messages in this fragment."}):(0,h.jsx)("ol",{className:"flex flex-col gap-1",children:c.map(({ref:a,message:b})=>m(a,b))})]},b))]})})}async function fA(a){try{let b=await fetch(`/api/file${(0,ek.docQuery)(a)}`,{cache:"no-store"}),c=await b.json();if(!b.ok||c.error)return{path:a??"",content:null,exists:!1,error:c.error??`HTTP ${b.status}`};return{path:c.path??a??"",content:c.content??null,exists:!!c.exists,mtime:c.mtime}}catch(b){return{path:a??"",content:null,exists:!1,error:b instanceof Error?b.message:String(b)}}}class fB extends Error{constructor(a){super(`${a.split("/").pop()} changed on disk since it was read`)}}async function fC(a,b,c){let d=await fetch(`/api/file${(0,ek.docQuery)(a)}`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({content:JSON.stringify(b,null,2)+"\n",...void 0!==c?{mtime:c}:{}})}),e=await d.json().catch(()=>({}));if(409===d.status)throw new fB(a);if(!d.ok)throw Error(e?.error??`HTTP ${d.status}`);return e?.mtime}async function fD(a){let b=await fA(a),c={path:b.path||a,def:null,members:[],absOf:{},wrapped:{},mtimes:{}};if(b.error)return{...c,error:b.error};if(!b.exists||!b.content)return{...c,error:`${a} does not exist`};let d=null;try{let a=aq(JSON.parse(b.content));aR(a)&&(d=a)}catch{}if(!d)return{...c,error:`${b.path} is not a readable system definition`};let e={},f={},g={[b.path]:b.mtime??0},h=await Promise.all((d.members??[]).filter(a=>a?.path).map(async a=>{let c=aV(b.path,a.path);e[a.path]=c;let d=aS(a.path),h=await fA(c);if(h.error)return{path:a.path,kind:d,def:null,error:h.error};if(!h.exists||!h.content)return{path:a.path,kind:d,def:null,error:"the file does not exist"};g[a.path]=h.mtime??0;try{let b=JSON.parse(h.content);if("machine"===d&&b&&(b.stateMachine||b.StateMachine))return f[a.path]=!0,{path:a.path,kind:d,def:aq(b.stateMachine??b.StateMachine)};return{path:a.path,kind:d,def:aq(b)}}catch(b){return{path:a.path,kind:d,def:null,error:`not JSON: ${b instanceof Error?b.message:String(b)}`}}}));return{path:b.path,def:d,members:h,absOf:e,wrapped:f,mtimes:g}}function fE(){window.dispatchEvent(new Event(eN))}function fF(a){let[b,c]=(0,i.useState)(null),[d,e]=(0,i.useState)(0),f=(0,i.useCallback)(()=>e(a=>a+1),[]);return(0,i.useEffect)(()=>(window.addEventListener(eN,f),()=>window.removeEventListener(eN,f)),[f]),(0,i.useEffect)(()=>{if(!a)return;let b=!0;return fD(a).then(d=>b&&c({for:a,system:d})),()=>{b=!1}},[a,d]),{system:a&&b?.for===a?b.system:null,reload:f}}function fG(a,b){if(!a||!b)return null;for(let[c,d]of Object.entries(a.absOf))if(d===b)return c;return null}async function fH(a,b,c,d){let{bridgeUrl:e}=await eu();if(!e)return;let f=dJ({url:e,role:"web",docId:a,name:"web-reconcile",autoResync:!1});try{let a=await Promise.race([f.join(),new Promise((a,b)=>setTimeout(()=>b(Error("join timeout")),3e3))]),e=a.snapshot?.def,g=a=>(function(a){let b=JSON.stringify(a),c=0x811c9dc5;for(let a=0;a<b.length;a++)c^=b.charCodeAt(a),c=Math.imul(c,0x1000193);return(c>>>0).toString(16).padStart(8,"0")})(a);if(e&&g(e)===g(b))return;await new Promise(a=>{let h=f.on("ack",()=>{h(),a()});d&&e&&g(e)===g(d.from)?f.emitPatch(d.ops,c):f.emitFull(b,c),setTimeout(a,800)})}catch{}finally{f.disconnect()}}async function fI(a,b){let c=[],d=[],e=[],f=async(a,b)=>{try{await b(),c.push(a)}catch(b){b instanceof fB?e.push(a):d.push(`${a}: ${b instanceof Error?b.message:String(b)}`)}};for(let c of b.machines){let b=a.absOf[c.member];b&&c.ops.length&&await f(c.member,async()=>{let d=a.wrapped[c.member]?{stateMachine:c.def}:c.def,e=await fC(b,d,a.mtimes[c.member]),f=a.members.find(a=>a.path===c.member)?.def;await fH(b,c.def,e,{from:f,ops:c.ops})})}for(let c of b.erds){let b=a.absOf[c.member];b&&await f(c.member,async()=>{let d=await fC(b,c.def,a.mtimes[c.member]);await fH(b,c.def,d)})}return b.system&&await f(a.path.split("/").pop()??a.path,async()=>{let c=await fC(a.path,b.system.def,a.mtimes[a.path]);await fH(a.path,b.system.def,c)}),fE(),{written:c,failed:d,conflicts:e}}async function fJ(a){let b={result:null,written:[],failed:[],conflicts:[]};for(let c=0;c<2;c+=1){let d=await fD(a);if(!d.def)return{...b,failed:[d.error??"the system could not be read"],retried:c>0};let e=bd(d.def,d.members);if(!e.count)return{...b,result:e,conflicts:c?b.conflicts:[],retried:c>0};let f=await fI(d,e);if(b={result:e,written:[...b.written,...f.written],failed:f.failed,conflicts:f.conflicts},!f.conflicts.length)return{...b,retried:c>0}}return{...b,retried:!0}}let fK="stateloom.sequence.view",fL=["","actor","service","object"],fM=a=>"string"==typeof a?a.trim():"",fN=a=>fM(a).split(",").map(a=>a.trim()).filter(Boolean);function fO(a){return{from:fM(a.from),to:fM(a.to),label:fM(a.label),event:fM(a.event),machine:fM(a.machine),carries:fM(a.carries),state:fM(a.state),description:fM(a.description),optional:!!a.optional||void 0,reply:!!a.reply||void 0}}function fP(){let a,b,c,d=(0,ek.useRequestedDoc)(),e=eP("system"),{system:f}=fF(e),g=eS(),[j,k]=(0,i.useState)(""),[l,m]=(0,i.useState)(null),[n,o]=(0,i.useState)({...M}),[p,q]=(0,i.useState)(void 0),[r,s]=(0,i.useState)(null),[t,u]=(0,i.useState)({text:"loading…",tone:"ok"}),v=(0,i.useCallback)((a,b="ok")=>u({text:a,tone:b}),[]),[w,x]=(0,i.useState)(!1);(0,i.useEffect)(()=>{let a=setTimeout(()=>x(!0),4e3);return()=>{clearTimeout(a),x(!1)}},[t]);let[y,z]=(0,i.useState)("messages"),[A,B]=(0,i.useState)(!1),[C,D]=(0,i.useState)(!1),[E,F]=(0,i.useState)(!1),[G,H]=(0,i.useState)("diagram"),I=(0,i.useRef)("diagram");(0,i.useEffect)(()=>{let a=null;try{a=window.localStorage.getItem(fK)}catch{}let b="list"===a||"diagram"===a?a:window.matchMedia("(max-width: 767px)").matches?"list":"diagram";I.current=b,H(b)},[]);let J=(0,i.useCallback)(a=>{I.current=a,H(a);try{window.localStorage.setItem(fK,a)}catch{}},[]),K=(0,i.useRef)(null),L=eL({onClose:()=>B(!1),restVh:62,tallVh:92}),[O,P]=(0,i.useState)(0),R=(0,i.useRef)(null),T=(0,i.useRef)(!0),U=(0,i.useRef)(-1);(0,i.useEffect)(()=>{let a=!1,b=null;return(async()=>{let c=await (await fetch(`/api/file${(0,ek.docQuery)(d)}`,{cache:"no-store"})).json();if(a)return;if(c.error)return v(c.error,"warn");let e=c.path??"",f=null;try{let a=c.content?aq(JSON.parse(c.content)):null;av(a)&&(f=a)}catch{}if(c.exists&&!f)return v(`${e} is not a readable sequence definition`,"warn");let g=(e.split("/").pop()??"Untitled").replace(/\.sqdf\.json$/i,"");k(e),m(f??aw("Default",g)),v(c.exists?"loaded":"new document — the first edit writes it");let{bridgeUrl:h}=await eu();!a&&h&&(R.current=b=dL({url:h,role:"web",docId:e,name:"web-designer",onFull:a=>{let b=a.def;av(b)&&(m(b),v("updated live"))},onPatch:()=>{},onPresence:a=>P(a.length)}),b.connect())})().catch(b=>!a&&v(String(b),"warn")),()=>{a=!0,R.current=null,b?.disconnect()}},[d,v]);let V=(0,i.useMemo)(()=>l?bT(l):null,[l]),W=(0,i.useMemo)(()=>V?aL(V):null,[V]),X=(0,i.useMemo)(()=>V&&W?fg(()=>(function(a,b){let c=[];for(let a of b.participants)c.push({focus:`participant:${a.name}`,box:{x:a.left,y:a.top,width:a.width,height:Math.max(a.height,b.lifelineBottom-a.top)}});let d=new Map(az(a).map(a=>[a.ref,a.message]));for(let a of b.rows){let b=a.self?a.fromX:Math.min(a.fromX,a.toX),e=a.self?220:Math.max(40,Math.abs(a.toX-a.fromX)),f={x:b-10,y:a.y-24,width:e+20,height:40};c.push({focus:`message:${a.ref}`,box:f});let g=d.get(a.ref)?.event;g&&c.push({focus:`event:${g}`,box:f})}return c})(V,W),[]):[],[V,W]),Y=(0,i.useMemo)(()=>{let a={};for(let{ref:b,message:c}of V?fg(()=>az(V),[]):[]){let d=c?.label?`${b}. ${c.label}`:`message ${b}`;a[`message:${b}`]=d.length>48?`${d.slice(0,47)}…`:d}return a},[V]),Z=eP("focus"),$=(0,i.useMemo)(()=>{if(!l)return[];let a="";return fg(()=>aA(l),null,b=>a=b)??[{ruleId:"S000",message:`The document could not be checked (${a}): a field is not the shape Spec 81 gives it`}]},[l]),_=fG(f,j),aa=(0,i.useMemo)(()=>f?.def&&_&&l?fg(()=>a6(f.def,f.members.map(a=>a.path===_?{...a,def:l,error:void 0}:a)),null):null,[f,_,l]),ab=(0,i.useMemo)(()=>(aa?.issues??[]).filter(a=>a.member===_&&!/^S0/.test(a.ruleId)),[aa,_]),ac=aa?.replays.find(a=>a.member===_)?.report??null,ad=(0,i.useMemo)(()=>(function(a){let b={events:new Set,states:new Set,machines:new Set,objects:new Set,entities:new Set,actors:new Set};if(!a)return{events:[],states:[],machines:[],objects:[],entities:[],actors:[]};let{machines:c,erds:d}=a5(a.members);for(let{def:a}of(c.forEach(({def:a},c)=>{for(let d of(b.machines.add(a_(a,c)),a.events??[]))for(let a of[...d?.events??[],...d?.timers??[]])a?.id&&b.events.add(a.id);for(let c of a.settings?.objects??[])c?.instance&&b.objects.add(c.instance);let d=a=>{a&&(b.states.add(a.name),(a.states??[]).forEach(d),(a.parallel?.states??[]).forEach(d))};d(a.state)}),d))for(let c of a.entities??[])c?.name&&b.entities.add(c.name);for(let c of a.def?.actors??[])c?.name&&b.actors.add(c.name);let e=a=>[...a].sort((a,b)=>a.localeCompare(b));return{events:e(b.events),states:e(b.states),machines:e(b.machines),objects:e(b.objects),entities:e(b.entities),actors:e(b.actors)}})(f),[f]),ae=(0,i.useMemo)(()=>{let a=a=>a?/^(message|participant):/.test(a)?a:V?.participants.some(b=>b.name===a)?`participant:${a}`:"":"";return[...$.map(b=>a(b.element)),...ab.filter(a=>"error"===a.severity).map(b=>a(b.element))].filter(Boolean)},[$,ab,V]),af=(0,i.useMemo)(()=>ab.filter(a=>"warning"===a.severity).map(a=>a.element??""),[ab]),ag=(0,i.useMemo)(()=>{let a=new Map,b=(b,c)=>{let d=b?/^(message|participant):/.test(b)?b:V?.participants.some(a=>a.name===b)?`participant:${b}`:"":"";d&&a.set(d,[...a.get(d)??[],c])};return $.forEach(a=>b(a.element,{severity:"error",text:a.message})),ab.forEach(a=>b(a.element,{severity:"error"===a.severity?"error":"warning",text:a.message})),a},[$,ab,V]),ah=()=>{let a=K.current?.getBoundingClientRect();return{width:a?.width??0,height:a?.height??0}},ai=(0,i.useCallback)(a=>{let b=K.current?.getBoundingClientRect();if(!b?.width)return;let c=N(Math.max(S([a],b.width,b.height,{padding:24,maxScale:1.1}).scale,.7));o({scale:c,x:b.width/2-(a.x+a.width/2)*c,y:b.height/2-(a.y+a.height/2)*c})},[]),aj=(0,i.useCallback)(a=>{if(W)if("message"===a.kind){let b=W.rows.find(b=>b.ref===a.id);if(!b)return;let c=b.self?b.fromX:Math.min(b.fromX,b.toX),d=b.self?220:Math.abs(b.toX-b.fromX);ai({x:c-10,y:b.y-24,width:d+20,height:40})}else{let b=W.participants.find(b=>b.name===a.id);b&&ai({x:b.left-20,y:b.top,width:b.width+40,height:Math.min(260,W.height-b.top)})}},[W,ai]),ak=(0,i.useCallback)(a=>{if("diagram"===I.current)return aj(a);requestAnimationFrame(()=>document.getElementById(fy(a))?.scrollIntoView({block:"center",behavior:"smooth"}))},[aj]),al=(0,i.useCallback)(a=>{s(a),a&&eR(`${a.kind}:${a.id}`)},[]);(0,i.useEffect)(()=>{if(!l||!W||U.current===g.nonce)return;U.current=g.nonce;let a=g.focus?a8(g.focus):null;if(!a)return;let b=null;if("message"===a.kind&&ay(V??l,a.name)&&(b={kind:"message",id:a.name}),"participant"===a.kind&&(V??l).participants.some(b=>b.name===a.name)&&(b={kind:"participant",id:a.name}),!b)return v(`${g.focus} is not in this sequence`,"warn");T.current=!1,s(b),ak(b)},[l,V,W,g,ak,v]),(0,i.useEffect)(()=>{if(!W||!T.current||"diagram"!==G)return;let{width:a,height:b}=ah();a&&(T.current=!1,Math.min((a-32)/W.width,(b-32)/W.height)>=.5||0===W.participants.length?q(a=>(a??0)+1):o({x:8,y:8,scale:.6}))},[W,G]);let am=(0,i.useCallback)(async a=>{let b;if(l&&j){try{b=a(l)}catch(a){return v(a instanceof Error?a.message:String(a),"warn")}m(b);try{let a=await fetch(`/api/file${(0,ek.docQuery)(j)}`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({content:JSON.stringify(b,null,2)+"\n"})});if(!a.ok)throw Error((await a.json())?.error??`HTTP ${a.status}`);R.current?.emitFull(b),v("saved")}catch(a){return v(`not saved: ${a instanceof Error?a.message:String(a)}`,"warn")}if(f?.def&&_){if("auto"===aO(f.def)){let{result:a,failed:b,conflicts:d}=await fJ(f.path);if(a&&a.count>0){var c;return void(c=b.length?`auto: not written — ${b[0]}`:d.length?`auto: ${d.join(", ")} kept changing on disk; not written — save again`:be(a,"auto"),window.dispatchEvent(new CustomEvent(eO,{detail:{text:c,origin:void 0}})))}}fE()}}},[l,j,v,f,_]),an=a=>{let{width:b,height:c}=ah();o(d=>Q(d,a,{x:b/2,y:c/2}))},ao=()=>{let a,b,c,d,e,f,g,h,i;l&&navigator.clipboard?.writeText((a=["sequenceDiagram"],b=new Map,(l.participants??[]).forEach((c,d)=>{let e=`p${d+1}`;b.set(c.name,e),a.push(` ${c.actor?"actor":"participant"} ${e} as ${aM(c.name)}`)}),c=a=>b.get(a)??aM(a).replace(/\W+/g,"_"),d=(a,b,d)=>{let e=a.reply?"-->>":"->>",f=[`${b} ${aM(a.label??"")}`,a.event?aM(a.event):""].filter(Boolean).join(" · "),g=`${d}${c(a.from)}${e}${c(a.to)}: ${f}`;return a.optional?[`${d}opt optional`,` ${g}`,`${d}end`]:[g]},e=l.messages??[],f=l.fragments??[],g=a=>f.filter(b=>b?.after===a),h=(b,c)=>(b.messages??[]).forEach((e,g)=>a.push(...d(e,`f${f.indexOf(b)+1}.${g+1}`,c+" "))),(i=(b,c,f)=>{for(let j=b;j<=e.length;j++){let b=j===f?[]:g(j);for(let d of b.filter(a=>"alt"!==a.kind))a.push(`${c}${d.kind} ${aM(d.label??"")}`),h(d,c),a.push(`${c}end`);let k=b.filter(a=>"alt"===a.kind);if(k.length){k.forEach((b,d)=>{a.push(`${c}${0===d?"alt":"else"} ${aM(b.label??"")}`),h(b,c)}),j<e.length&&(a.push(`${c}else as written`),i(j,c+" ",j)),a.push(`${c}end`);return}j<e.length&&a.push(...d(e[j],String(j+1),c))}})(0," ",null),a.join("\n")+"\n")).then(()=>v("mermaid copied"))},ap=a=>{let b=a?a8(a):null;if(!b||"message"!==b.kind&&"participant"!==b.kind)return;let c={kind:b.kind,id:b.name};al(c),ak(c),L.close()},ar=V??aw("",""),as=az(ar),at=l&&r?.kind==="message"?ay(ar,r.id):null,ax=l&&r?.kind==="participant"?ar.participants.find(a=>a.name===r.id)??null:null,aK=ar.participants.map(a=>a.name),aN=j.split("/").pop()||"…",aP=$.length+ab.filter(a=>"error"===a.severity).length,aQ=ab.filter(a=>"warning"===a.severity).length,aR=[{id:"participants",label:"Participants",icon:(0,h.jsx)(fw,{kind:"actor"})},{id:"messages",label:"Messages",icon:(0,h.jsx)(fw,{kind:"sequence"})},{id:"notes",label:"Notes",icon:"✎"},{id:"issues",label:"Issues",icon:(0,h.jsx)(em,{}),badge:aP+aQ||void 0}],aS=a=>[{name:"from",label:"from",options:aK,initial:a?.from??aK[0]??""},{name:"to",label:"to",options:aK,initial:a?.to??aK[1]??aK[0]??""},{name:"label",label:"label",placeholder:"what is said or done",initial:a?.label??"",wide:!0},{name:"event",label:"event it fires",suggest:ad.events,initial:a?.event??""},{name:"state",label:"state after",suggest:ad.states,initial:a?.state??""},{name:"carries",label:"entity it carries",suggest:ad.entities,initial:a?.carries??""},{name:"machine",label:"machine",suggest:ad.machines,initial:a?.machine??""},{name:"optional",label:"optional",checkbox:!0,initial:!!a?.optional},{name:"reply",label:"reply (dashed)",checkbox:!0,initial:!!a?.reply}],aT=a=>a.actor?"actor":a.object?"object":a.service?"service":"",aU=["main: at the end",...at&&null===at.fragment?[`main: after ${at.index+1}`]:[],...(l?.fragments??[]).map((a,b)=>`fragment ${b+1}: ${a.kind} \xb7 ${a.label}`)];return(0,h.jsxs)("div",{className:"app-shell dock-offset flex flex-col overflow-hidden bg-gray-950 text-gray-200",onClick:()=>C&&D(!1),children:[(0,h.jsxs)("header",{className:"relative z-40 flex items-center gap-2 border-b border-gray-800 bg-gray-900 px-2 py-1.5 text-xs md:px-3 md:py-2",children:[(0,h.jsxs)("span",{className:"flex items-center gap-1 font-semibold text-blue-300",children:[(0,h.jsx)(fw,{kind:"sequence",size:14}),"SEQ"]}),(0,h.jsx)(el,{}),(0,h.jsxs)("span",{className:"min-w-0 flex-1 truncate text-gray-400",title:j,children:[l?.settings.name??aN,(0,h.jsxs)("span",{className:"hidden text-gray-600 lg:inline",children:[" · ",aN]})]}),(0,h.jsx)("div",{className:"flex shrink-0 overflow-hidden rounded border border-gray-700 text-[12px] leading-none",role:"group","aria-label":"View",children:[["list","List","Read the messages in order, one under the other"],["diagram","Diagram","The lifelines and arrows"]].map(([a,b,c])=>(0,h.jsx)("button",{title:c,"aria-pressed":G===a,onClick:()=>{G!==a&&(r&&(T.current=!1),J(a),r&&requestAnimationFrame(()=>ak(r)))},className:`px-2.5 py-1.5 ${G===a?"bg-gray-700 text-gray-100":"bg-gray-800 text-gray-400 hover:text-gray-200"}`,children:b},a))}),(0,h.jsxs)("div",{className:"hidden shrink-0 items-center gap-2 md:flex",children:[(0,h.jsx)("button",{className:ft,onClick:ao,children:"Copy mermaid"}),(0,h.jsx)("button",{className:ft,onClick:()=>F(a=>!a),"aria-pressed":!E,title:E?"Show the panel":"Hide the panel — the board takes the full width",children:E?"⟨ Panel":"Panel ⟩"})]}),(0,h.jsxs)("div",{className:"relative shrink-0 md:hidden",children:[(0,h.jsx)("button",{className:"rounded border border-gray-700 bg-gray-800 px-3 py-1.5 text-sm leading-none text-gray-200","aria-label":"More actions","aria-expanded":C,onClick:a=>{a.stopPropagation(),D(a=>!a)},children:"⋯"}),C&&(0,h.jsx)("div",{className:"absolute right-0 top-full z-50 mt-1 w-56 overflow-hidden rounded-lg border border-gray-700 bg-gray-900 py-1 shadow-xl",children:(0,h.jsx)("button",{className:"block w-full px-4 py-3 text-left text-sm text-gray-200 hover:bg-gray-800",onClick:()=>{D(!1),ao()},children:"Copy as mermaid"})})]})]}),(0,h.jsxs)("div",{className:"relative flex min-h-0 flex-1",children:[(0,h.jsxs)("div",{ref:K,className:"relative min-w-0 flex-1 overflow-hidden",children:[l&&W&&"list"===G&&V&&(0,h.jsx)(eJ,{what:"sequence",resetKey:l,children:(0,h.jsx)(fz,{definition:V,selection:r,issues:ag,onSelect:a=>al(a),onShowInDiagram:a=>{T.current=!1,J("diagram"),requestAnimationFrame(()=>aj(a))}})}),l&&W&&"diagram"===G&&(0,h.jsx)(eJ,{what:"sequence",resetKey:l,children:(0,h.jsx)(bU,{definition:V,layout:W,viewport:n,onViewportChange:o,selection:r,errorElements:ae,warningElements:af,fitKey:p,onSelect:(a,b)=>al({kind:a,id:b}),onClearSelection:()=>s(null),emptyHint:"No participants yet — add them in the panel, or let an agent write the scenario."})}),l&&W&&"diagram"===G&&(0,h.jsx)(fe,{docPath:j||null,kind:"sequence",viewport:n,setViewport:o,boxes:X,boardRef:K,focus:Z,labels:Y}),l&&W&&"list"===G&&(0,h.jsx)(ff,{docPath:j,onReveal:()=>J("diagram")}),(0,h.jsxs)("div",{className:`pointer-events-none absolute left-2 top-2 max-w-[75%] items-center gap-1.5 rounded bg-gray-950/70 px-1.5 py-0.5 text-[11px] ${"warn"===t.tone?"text-amber-300":"text-gray-500"} ${"list"===G&&w&&"ok"===t.tone?"hidden":"flex"}`,role:"status",children:[(0,h.jsx)("span",{className:`h-1.5 w-1.5 shrink-0 rounded-full ${"warn"===t.tone?"bg-amber-400":"bg-emerald-500"}`}),(0,h.jsxs)("span",{className:`truncate transition-opacity duration-500 ${w&&"ok"===t.tone?"opacity-0":"opacity-100"}`,children:[t.text,O>1?` \xb7 ${O} in the room`:""]})]}),(0,h.jsx)("div",{className:`absolute bottom-3 right-3 flex-col overflow-hidden rounded-lg border border-gray-700 bg-gray-900/90 shadow-lg backdrop-blur ${"diagram"===G?"flex":"hidden"}`,children:[["+","Zoom in",()=>an(1.25)],["−","Zoom out",()=>an(.8)],["⛶","Fit the whole diagram",()=>q(a=>(a??0)+1)]].map(([a,b,c])=>(0,h.jsx)("button",{title:b,"aria-label":b,onClick:c,className:"h-10 w-10 border-b border-gray-800 text-base leading-none text-gray-200 last:border-b-0 hover:bg-gray-800 md:h-8 md:w-8 md:text-sm",children:a},b))}),r&&!A&&(0,h.jsxs)("button",{className:"absolute bottom-3 left-1/2 max-w-[60%] -translate-x-1/2 truncate rounded-full border border-blue-500/60 bg-gray-900/95 px-4 py-2 text-sm text-blue-200 shadow-lg md:hidden",onClick:()=>{z("message"===r.kind?"messages":"participants"),B(!0)},children:["Edit ","message"===r.kind?`${r.id}. ${at?.message.label??""}`:r.id]})]}),A&&(0,h.jsx)("div",{className:"fixed inset-0 z-20 bg-black/50 md:hidden",onClick:L.close,"aria-hidden":"true"}),l&&(0,h.jsxs)("aside",{style:L.sheetStyle,className:`safe-x fixed inset-x-0 bottom-0 z-30 flex h-[var(--sheet-h)] flex-col overflow-hidden rounded-t-2xl border-t border-gray-800 bg-gray-900 shadow-2xl transition-[transform,height] duration-200 ease-out ${A?"translate-y-0":"pointer-events-none translate-y-full"} md:pointer-events-auto md:static md:z-auto md:h-auto md:w-80 md:translate-y-0 md:rounded-none md:border-l md:border-t-0 md:shadow-none md:transition-none ${E?"md:hidden":""}`,children:[(0,h.jsxs)("div",{className:"md:hidden",...L.zoneProps,children:[(0,h.jsx)("div",{className:"flex justify-center pb-1 pt-2",children:(0,h.jsx)("span",{className:"h-1.5 w-12 rounded-full bg-gray-600"})}),(0,h.jsxs)("div",{className:"flex items-center justify-between border-b border-gray-800 px-4 pb-2",children:[(0,h.jsx)("h2",{className:"text-sm font-semibold text-gray-300",children:aR.find(a=>a.id===y)?.label}),(0,h.jsx)("button",{onClick:L.close,className:"-mr-2 px-3 py-2 text-lg text-gray-400","aria-label":"Close panel",children:"✕"})]})]}),(0,h.jsx)("div",{className:"hidden border-b border-gray-800 md:flex",children:aR.map(a=>(0,h.jsxs)("button",{onClick:()=>z(a.id),className:`relative flex-1 px-1 py-2 text-center text-xs transition-colors ${y===a.id?"border-b-2 border-blue-400 bg-gray-800/50 text-blue-400":"text-gray-500 hover:text-gray-300"}`,children:[a.label,void 0!==a.badge&&(0,h.jsx)("span",{className:"absolute right-1 top-1 min-w-[14px] rounded-full bg-red-900 px-1 text-[9px] text-red-100",children:a.badge})]},a.id))}),(0,h.jsx)("div",{className:"touch-targets dock-offset flex-1 overflow-y-auto overscroll-contain p-3",children:(0,h.jsxs)(eJ,{what:"panel",resetKey:l,children:[(0,h.jsxs)("section",{className:"participants"===y?"":"hidden",children:[(0,h.jsx)("div",{className:fu,style:{marginTop:0},children:"Participants"}),(0,h.jsx)("div",{className:"flex flex-wrap gap-1",children:ar.participants.map(a=>(0,h.jsxs)("button",{className:`${ft} ${r?.kind==="participant"&&r.id===a.name?"border-blue-500 text-blue-300":""}`,onClick:()=>{al({kind:"participant",id:a.name}),ak({kind:"participant",id:a.name})},title:aT(a)||"participant",children:[a.name,aT(a)&&(0,h.jsxs)("span",{className:"text-gray-500",children:[" · ",aT(a)]})]},a.name))}),(0,h.jsx)(fv,{id:"add-participant",reset:!0,required:["name"],fields:[{name:"name",placeholder:"new participant"},{name:"kind",options:fL,label:"kind"},{name:"value",placeholder:"actor / service / object",suggest:[...ad.actors,...ad.objects]},{name:"holds",placeholder:"holds: Entity, Entity",suggest:ad.entities}],submit:"+ Participant",onSubmit:a=>{let b=fM(a.name),c=fM(a.kind);am(d=>(function(a,b,c){if(!b.name?.trim())throw Error("A participant needs a name.");let d=aB(a);if(d.participants.some(a=>a.name===b.name))throw Error(`Participant '${b.name}' already exists.`);let e=d.participants.length;return d.participants.splice(e,0,aC({...b})),d})(d,{name:b,...c?{[c]:fM(a.value)||b}:{},holds:fN(a.holds)})),al({kind:"participant",id:b})}}),ax&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsxs)("div",{className:`${fu} flex items-center justify-between gap-2`,children:[(0,h.jsx)("span",{className:"truncate text-sm normal-case tracking-normal text-gray-200",children:ax.name}),(0,h.jsx)("button",{className:`${ft} normal-case tracking-normal`,onClick:()=>ak({kind:"participant",id:ax.name}),children:"◎ Show on board"})]}),(a=ar.participants.findIndex(a=>a.name===ax.name),b=ar.participants.length-1,c=a=>am(b=>{var c;let d,e;return c=ax.name,e=aD(d=aB(b),c),d.participants.splice(d.participants.indexOf(e),1),d.participants.splice(Math.max(0,Math.min(a,d.participants.length)),0,e),d}),(0,h.jsxs)("div",{className:"mb-1 flex items-center gap-1 text-[11px] text-gray-400",children:[(0,h.jsx)("button",{className:`${ft} disabled:opacity-40`,disabled:a<=0,onClick:()=>c(a-1),"aria-label":"Move one column left",children:"← Left"}),(0,h.jsxs)("span",{className:"flex-1 text-center",children:["column ",a+1," of ",b+1]}),(0,h.jsx)("button",{className:`${ft} disabled:opacity-40`,disabled:a>=b,onClick:()=>c(a+1),"aria-label":"Move one column right",children:"Right →"})]})),(0,h.jsx)(fv,{id:"rename-participant",required:["to"],fields:[{name:"to",label:"new name",initial:ax.name}],submit:"Rename (every message follows)",onSubmit:a=>{let b=fM(a.to);b!==ax.name&&(am(a=>(function(a,b,c){if(!c?.trim())throw Error("A participant needs a name.");let d=aB(a),e=aD(d,b);if(c===b)return d;if(d.participants.some(a=>a.name===c))throw Error(`Participant '${c}' already exists.`);e.name=c;let f=a=>{a.from===b&&(a.from=c),a.to===b&&(a.to=c)};for(let a of(d.messages.forEach(f),d.fragments??[]))a.messages.forEach(f);return d})(a,ax.name,b)),al({kind:"participant",id:b}))}},`rename:${ax.name}`),(0,h.jsx)(fv,{id:"edit-participant",fields:[{name:"kind",options:fL,label:"kind",initial:aT(ax)},{name:"value",placeholder:"actor / service / object",suggest:[...ad.actors,...ad.objects],initial:ax.actor??ax.object??ax.service??""},{name:"holds",placeholder:"holds: Entity, Entity",suggest:ad.entities,initial:(ax.holds??[]).join(", "),wide:!0},{name:"description",placeholder:"description",initial:ax.description??"",wide:!0}],submit:"Save participant",onSubmit:a=>am(b=>{let c,d;return aG(b,ax.name,{...(c=fM(a.kind),d=fM(a.value)||ax.name,{actor:"actor"===c?d:"",service:"service"===c?d:"",object:"object"===c?d:""}),holds:fN(a.holds),description:fM(a.description)})})},`p:${JSON.stringify(ax)}`),(0,h.jsxs)("button",{className:`${ft} mt-2 text-red-300`,onClick:()=>{am(a=>{var b;let c,d;return b=ax.name,aD(c=aB(a),b),c.participants=c.participants.filter(a=>a.name!==b),d=a=>a.from!==b&&a.to!==b,c.messages=c.messages.filter(d),c.fragments&&(c.fragments=c.fragments.map(b=>{let c;return{...b,after:Math.max(0,b.after-(c=b.after,a.messages.slice(0,c).filter(a=>!d(a)).length)),messages:b.messages.filter(d)}}).filter(a=>a.messages.length>0),c.fragments.length||delete c.fragments),c}),s(null),eR(null)},title:"Also removes every message it sends or receives",children:["Delete ",ax.name," and its messages"]})]})]}),(0,h.jsxs)("section",{className:"messages"===y?"":"hidden",children:[(0,h.jsx)("div",{className:fu,style:{marginTop:0},children:"Messages"}),0===as.length&&(0,h.jsx)("div",{className:"py-0.5 text-[11px] text-gray-600",children:"None yet."}),(0,h.jsx)("div",{className:"flex flex-col",children:as.map(({ref:a,message:b,fragment:c},d)=>{let e=null!==c&&(0===d||as[d-1].fragment!==c),f=null!==c?ar.fragments?.[c]:void 0,g=r?.kind==="message"&&r.id===a;return(0,h.jsxs)("div",{children:[e&&f&&(0,h.jsxs)("div",{className:"mt-2 border-t border-gray-800 pt-1 text-[11px] text-indigo-300",children:[(0,h.jsx)("span",{className:"font-semibold",children:f.kind})," · after ",f.after," · ",f.label]}),(0,h.jsxs)("button",{className:`block w-full truncate rounded px-1 py-0.5 text-left text-[11px] ${g?"bg-blue-950/60 text-blue-200":"text-gray-300 hover:bg-gray-800"}`,onClick:()=>{al({kind:"message",id:a}),ak({kind:"message",id:a})},title:`${b.from} → ${b.to}: ${b.label}`,children:[(0,h.jsxs)("span",{className:"text-gray-500",children:[a,"."]})," ",b.from," → ",b.to,": ",b.label,b.event?(0,h.jsxs)("span",{className:"text-blue-300",children:[" [",b.event,"]"]}):null,b.state?(0,h.jsxs)("span",{className:"text-emerald-400",children:[" → ",b.state]}):null,b.optional?(0,h.jsx)("span",{className:"text-gray-500",children:" opt"}):null]})]},a)})}),at&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsxs)("div",{className:`${fu} flex items-center justify-between gap-2`,children:[(0,h.jsxs)("span",{className:"truncate text-sm normal-case tracking-normal text-gray-200",children:["Message ",r.id]}),(0,h.jsxs)("span",{className:"flex gap-1 normal-case tracking-normal",children:[null===at.fragment&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("button",{className:ft,"aria-label":"Move up",title:"Move up",disabled:0===at.index,onClick:()=>{am(a=>aJ(a,at.index,at.index-1)),al({kind:"message",id:String(at.index)})},children:"↑"}),(0,h.jsx)("button",{className:ft,"aria-label":"Move down",title:"Move down",disabled:at.index>=ar.messages.length-1,onClick:()=>{am(a=>aJ(a,at.index,at.index+1)),al({kind:"message",id:String(at.index+2)})},children:"↓"})]}),(0,h.jsx)("button",{className:ft,onClick:()=>ak(r),children:"◎ Show"})]})]}),(0,h.jsx)(fv,{id:"edit-message",required:["label"],fields:[...aS(at.message),{name:"description",placeholder:"description",initial:at.message.description??"",wide:!0}],submit:"Save message",onSubmit:a=>am(b=>aI(b,at.index,fO(a),at.fragment))},`m:${r.id}:${JSON.stringify(at.message)}`),(0,h.jsxs)("button",{className:`${ft} mt-2 text-red-300`,onClick:()=>{am(a=>(function(a,b,c=null){let d=aB(a);if(null!==c){let a=aF(d,c);if(!a.messages[b])throw Error(`Message ${b+1} not found in fragment ${c+1}.`);return a.messages.splice(b,1),d}if(!d.messages[b])throw Error(`Message ${b+1} not found. The sequence has ${d.messages.length}.`);if(d.messages.splice(b,1),d.fragments)for(let a of d.fragments)a.after>b&&(a.after-=1);return d})(a,at.index,at.fragment)),s(null),eR(null)},children:["Delete message ",r.id]})]}),(0,h.jsx)("div",{className:fu,children:"Add a message"}),(0,h.jsx)(fv,{id:"add-message",reset:!0,required:["label"],fields:[{name:"where",options:aU,label:"where",wide:!0},...aS()],submit:"+ Message",onSubmit:a=>{let b=fM(a.where),c=fO(a),d=/^fragment (\d+):/.exec(b),e=/^main: after (\d+)$/.exec(b);d?am(a=>{var b;let e,f,g;return b=Number(d[1])-1,f=aF(e=aB(a),b),aE(e,c),g=f.messages.length,f.messages.splice(g,0,aC({...c})),e}):e?am(a=>aH(a,c,Number(e[1]))):am(a=>aH(a,c))}},`add:${aU.join("|")}:${aK.join("|")}`),(0,h.jsx)("div",{className:fu,children:"Fragments"}),0===(ar.fragments??[]).length&&(0,h.jsx)("div",{className:"py-0.5 text-[11px] text-gray-600",children:"None."}),(ar.fragments??[]).map((a,b)=>(0,h.jsxs)("div",{className:"mb-2 rounded border border-gray-800 p-1.5",children:[(0,h.jsxs)("div",{className:"flex items-center justify-between text-[11px] text-indigo-300",children:[(0,h.jsxs)("span",{children:[b+1,". ",(0,h.jsx)("span",{className:"font-semibold",children:a.kind})," · after ",a.after," · ",a.messages.length," message(s)"]}),(0,h.jsx)("button",{className:"text-gray-500 hover:text-red-400","aria-label":`Remove fragment ${b+1}`,onClick:()=>am(a=>{let c;return aF(c=aB(a),b),c.fragments.splice(b,1),c.fragments.length||delete c.fragments,c}),children:"✕"})]}),(0,h.jsx)(fv,{id:`edit-fragment-${b}`,fields:[{name:"kind",options:au,initial:a.kind},{name:"after",placeholder:"after message",initial:String(a.after)},{name:"label",placeholder:"the condition, in words",initial:a.label,wide:!0}],submit:"Save fragment",onSubmit:a=>am(c=>(function(a,b,c){let d=aB(a),e=aF(d,b);if(void 0!==c.kind&&!au.includes(c.kind))throw Error(`A fragment is one of ${au.join(", ")}; got '${c.kind}'.`);if(void 0!==c.after&&(!Number.isInteger(c.after)||c.after<0||c.after>d.messages.length))throw Error(`A fragment branches after a main message, 0 to ${d.messages.length}; got ${c.after}.`);return d.fragments[b]={...aC({...e,...c,messages:void 0}),messages:e.messages??[]},d})(c,b,{kind:fM(a.kind),after:Number(fM(a.after)),label:fM(a.label)}))})]},`${b}:${JSON.stringify({...a,messages:void 0})}`)),(0,h.jsx)(fv,{id:"add-fragment",reset:!0,required:["label"],fields:[{name:"kind",options:au},{name:"after",placeholder:"after message",initial:String(at&&null===at.fragment?at.index+1:ar.messages.length)},{name:"label",placeholder:"the condition, in words",wide:!0},{name:"from",options:aK,label:"first message from"},{name:"to",options:aK,label:"to",initial:aK[1]??aK[0]??""},{name:"first",placeholder:"first message label (optional)",wide:!0}],submit:"+ Fragment",onSubmit:a=>am(b=>(function(a,b){if(!au.includes(b.kind))throw Error(`A fragment is one of ${au.join(", ")}; got '${b.kind}'.`);if(!b.label?.trim())throw Error("A fragment needs a label: the condition in words.");let c=aB(a);if(!Number.isInteger(b.after)||b.after<0||b.after>c.messages.length)throw Error(`A fragment branches after a main message, 0 to ${c.messages.length}; got ${b.after}.`);for(let a of b.messages??[])aE(c,a);return(c.fragments??=[]).push({...aC({...b,messages:void 0}),messages:(b.messages??[]).map(a=>aC({...a}))}),c})(b,{kind:fM(a.kind),after:Number(fM(a.after)),label:fM(a.label),messages:fM(a.first)?[{from:fM(a.from),to:fM(a.to),label:fM(a.first)}]:[]}))},`add-fragment:${ar.messages.length}:${at?.index??""}`)]}),(0,h.jsxs)("section",{className:"notes"===y?"":"hidden",children:[(0,h.jsx)("div",{className:fu,style:{marginTop:0},children:"Notes"}),(0,h.jsx)("p",{className:"mb-1 text-[11px] text-gray-600",children:"Saved in the document, for whoever opens it next — you, or an agent."}),(0,h.jsx)(fq,{label:"On this sequence",value:l.settings.notes??"",placeholder:"What was discussed, what is still open…",onSave:a=>am(b=>{var c;let d;return c={notes:a},(d=aB(b)).settings=aC({...d.settings,...c}),d})},"sequence"),ax&&(0,h.jsx)(fq,{label:`On ${ax.name}`,value:ax.notes??"",placeholder:`A question or a decision about ${ax.name}…`,onSave:a=>am(b=>aG(b,ax.name,{notes:a}))},`participant:${ax.name}`),at&&(0,h.jsx)(fq,{label:`On message ${r.id}`,value:at.message.notes??"",placeholder:"A question or a decision about this message…",onSave:a=>am(b=>aI(b,at.index,{notes:a},at.fragment))},`message:${r.id}`),!r&&(0,h.jsx)("p",{className:"mt-2 text-[11px] text-gray-600",children:"Select a participant or a message to leave a note on it."}),[...ar.participants.filter(a=>a.notes?.trim()),...as.filter(a=>a.message.notes?.trim())].length>0&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("div",{className:fu,children:"With notes"}),(0,h.jsxs)("div",{className:"flex flex-wrap gap-1",children:[ar.participants.filter(a=>a.notes?.trim()).map(a=>(0,h.jsx)("button",{className:ft,onClick:()=>ap(`participant:${a.name}`),children:a.name},`p${a.name}`)),as.filter(a=>a.message.notes?.trim()).map(a=>(0,h.jsxs)("button",{className:ft,onClick:()=>ap(`message:${a.ref}`),children:["message ",a.ref]},`m${a.ref}`))]})]})]}),(0,h.jsxs)("section",{className:"issues"===y?"":"hidden",children:[(0,h.jsx)("div",{className:fu,style:{marginTop:0},children:"Issues"}),$.map((a,b)=>(0,h.jsxs)("button",{className:"block w-full py-0.5 text-left text-[11px] text-red-300",onClick:()=>ap(a.element),children:["[",a.ruleId,"] ",a.message]},`p${b}`)),ab.map((a,b)=>(0,h.jsxs)("button",{className:`block w-full py-0.5 text-left text-[11px] ${"error"===a.severity?"text-red-300":"text-amber-300"}`,onClick:()=>ap(a.element),children:["[",a.ruleId,"] ",a.message]},`s${b}`)),0===$.length&&0===ab.length&&(0,h.jsx)("div",{className:"py-0.5 text-[11px] text-green-400",children:aa?"Valid, and every name it uses resolves in the system.":"The document is valid."}),!e&&(0,h.jsx)("p",{className:"mt-2 text-[11px] text-gray-600",children:"Open this sequence from its system to check it against the machines and the data."}),e&&!_&&f&&(0,h.jsx)("p",{className:"mt-2 text-[11px] text-amber-300",children:"This document is not a member of the open system."}),ac&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsxs)("div",{className:fu,children:["Replay against ",ac.machines.join(", ")||"no machine"]}),ac.paths.map(a=>(0,h.jsxs)("div",{className:"mb-2",children:[(0,h.jsxs)("div",{className:`text-[11px] font-semibold ${a.accepted?"text-green-400":"text-amber-300"}`,children:[a.name," — ",a.accepted?"accepted":"stops"]}),a.steps.filter(a=>"data"!==a.result).map(b=>(0,h.jsxs)("button",{className:`block w-full truncate py-0.5 pl-2 text-left font-mono text-[10.5px] ${"moved"===b.result||"stayed"===b.result?"text-gray-400":"text-amber-300"}`,title:b.note??b.result,onClick:()=>ap(`message:${b.ref}`),children:[b.ref,". ",b.event??""," ",b.from.join("|")||"·"," → ",b.to.join("|")||"·"," ",b.result]},`${a.name}:${b.ref}`))]},a.name))]})]})]})})]})]}),(0,h.jsx)("nav",{className:"dock-safe safe-x fixed inset-x-0 bottom-0 z-40 flex border-t border-gray-800 bg-gray-900/95 backdrop-blur-md md:hidden",children:aR.map(a=>{let b=A&&y===a.id;return(0,h.jsxs)("button",{onClick:()=>{var b;return b=a.id,void(A&&y===b?L.close():B(!0),z(b))},"aria-pressed":b,className:`relative flex h-14 flex-1 flex-col items-center justify-center gap-0.5 text-[11px] transition-colors ${b?"text-blue-400":"text-gray-500"}`,children:[(0,h.jsx)("span",{className:"flex h-4 items-center text-base leading-none",children:a.icon}),(0,h.jsx)("span",{children:a.label}),void 0!==a.badge&&(0,h.jsx)("span",{className:"absolute right-1/2 top-1 min-w-[16px] translate-x-5 rounded-full border border-red-900/80 bg-red-950/80 px-1 text-[10px] leading-4 text-red-200",children:a.badge}),b&&(0,h.jsx)("span",{className:"absolute inset-x-4 top-0 h-0.5 rounded-full bg-blue-400"})]},a.id)})})]})}function fQ(a,b){let c=a?.members.find(a=>a.path===b)?.def;return c?.settings?.name||(b.split("/").pop()??b).replace(/\.(smdf|erdf|sqdf|sysdf)\.json$|\.json$/i,"")}let fR=(a,b)=>a?.members.find(a=>a.path===b)?.kind??"machine";function fS(a){return"message"===a.kind?`message ${a.name}`:`${a.kind} ${a.name}`}function fT({systemPath:a}){let b=eP("doc"),c=eP("focus"),{system:d}=fF(a),[e,f]=(0,i.useState)(!1),[g,j]=(0,i.useState)(null),k=(0,i.useRef)(d);(0,i.useEffect)(()=>{k.current=d},[d]);let l=(0,i.useMemo)(()=>d?fg(()=>a9(d.members),[]):[],[d]),m=fG(d,b),n=!!d&&(b===d.path||b===a),o=m&&c?function(a,b,c){let d=a8(c);if(!d)return[];let e=a=>a.member===b&&a.kind===d.kind&&a.name===d.name,f=[];for(let b of a)e(b.from)?f.push({other:b.to,text:b.text,rule:b.rule}):e(b.to)&&f.push({other:b.from,text:b.back,rule:b.rule});return f}(l,m,c):[],p=function(a,b){if(!b)return[];let c=new Map;for(let d of a)for(let a of[d.from,d.to]){if(a.member!==b)continue;let d=a7(a);c.set(d,(c.get(d)??0)+1)}return[...c.entries()].sort((a,b)=>a[0].localeCompare(b[0]))}(l,m);(0,i.useEffect)(()=>{let a=a=>{let b=a.detail;b?.text&&j({...b,at:Date.now()})};return window.addEventListener(eO,a),()=>window.removeEventListener(eO,a)},[]),(0,i.useEffect)(()=>{if(!g)return;let a=setTimeout(()=>j(null),9e3);return()=>clearTimeout(a)},[g]);let q=d?.path;(0,i.useEffect)(()=>{if(!q)return;let b=!0,c=null,d=null;return(async()=>{let{bridgeUrl:e}=await eu();if(b&&e){var g;let b,h,i,l;(c=dJ({url:e,role:"web",docId:q,name:"web-system-strip"})).on("view",b=>{let c=k.current;if(!c)return;let d=b.member?void 0!==c.absOf[b.member]?b.member:Object.keys(c.absOf).find(a=>c.absOf[a]===b.member):void 0;if(b.member&&!d)return void j({text:`ignored a view of ${b.member.split("/").pop()}: it is not a member of this system`,origin:b.origin,at:Date.now()});eQ({doc:d?c.absOf[d]:q,system:a,focus:b.focus??null}),f(!1);let e=[d?fQ(c,d):"the system map",b.focus].filter(Boolean).join(" · ");j({text:b.note?b.note:`showing ${e}`,origin:b.origin,at:Date.now()})}),c.on("full",()=>fE()),g=c,b=!1,h=!1,i=()=>{g.join().then(()=>{b=!0}).catch(()=>{})},l=g.on("status",a=>{"connected"!==a?h=b:h&&(h=!1,i())}),i(),d=()=>{l()}}})(),()=>{b=!1,d?.(),c?.disconnect()}},[q,a]);let r=b=>{f(!1),d&&eQ({doc:b.member?d.absOf[b.member]??aV(d.path,b.member):d.path,system:a,focus:b.focus??null})},s=d?.def?.members?.filter(a=>a?.path).map(a=>a.path)??[],t=d?.def?.settings?.name??(a.split("/").pop()??"system").replace(/\.sysdf\.json$/i,""),u=o.length;return(0,h.jsxs)("div",{className:"system-strip relative z-50 border-b border-gray-800 bg-gray-950 text-xs text-gray-300",children:[(0,h.jsxs)("div",{className:"flex h-[var(--strip-h)] items-center gap-1 px-1.5 md:px-2",children:[(0,h.jsxs)("button",{onClick:()=>r({}),className:`flex min-w-0 max-w-[30%] shrink-0 items-center gap-1 rounded px-1.5 py-1 md:max-w-[16rem] ${n?"bg-blue-950/60 text-blue-200":"text-gray-300 hover:bg-gray-800"}`,title:`${a} — the system map`,children:[(0,h.jsx)(fw,{kind:"system",size:15}),(0,h.jsx)("span",{className:"truncate font-semibold",children:t})]}),(0,h.jsx)("span",{className:"h-4 w-px shrink-0 bg-gray-800"}),(0,h.jsxs)("nav",{className:"flex min-w-0 flex-1 items-center gap-0.5 overflow-x-auto [scrollbar-width:none]","aria-label":"Members",children:[s.map(a=>{let b=a===m,c=d?.members.find(b=>b.path===a)?.error;return(0,h.jsxs)("button",{onClick:()=>r({member:a}),"aria-current":b?"page":void 0,title:`${fQ(d,a)} — ${a}${c?` (cannot be read: ${c})`:""}`,className:`flex shrink-0 items-center gap-1 rounded px-1.5 py-1 ${b?"bg-blue-950/60 text-blue-200":c?"text-red-400 hover:bg-gray-800":"text-gray-400 hover:bg-gray-800 hover:text-gray-200"}`,children:[(0,h.jsx)(fw,{kind:fR(d,a),size:15}),(0,h.jsx)("span",{className:`max-w-[7.5rem] truncate md:max-w-[11rem] ${b?"":"hidden md:inline"}`,children:fQ(d,a)})]},a)}),!d&&(0,h.jsx)("span",{className:"px-1 text-gray-600",children:"loading…"}),d?.error&&(0,h.jsx)("span",{className:"truncate px-1 text-amber-300",children:d.error})]}),(0,h.jsxs)("button",{onClick:()=>f(a=>!a),disabled:!m,"aria-expanded":e,title:m?c?`What ${c} links to in the other drawings`:"Elements of this drawing that link to the others":"Open a member to follow its links",className:`flex shrink-0 items-center gap-1 rounded px-1.5 py-1 disabled:opacity-40 ${e?"bg-blue-950/60 text-blue-200":"text-gray-300 hover:bg-gray-800"}`,children:[(0,h.jsx)(fw,{kind:"link",size:15}),(0,h.jsx)("span",{className:"hidden sm:inline",children:"Links"}),u>0&&(0,h.jsx)("span",{className:"rounded-full border border-gray-700 px-1 text-[10px] leading-4 text-gray-300",children:u})]})]}),g&&!e&&(0,h.jsx)("div",{className:"pointer-events-none absolute inset-x-0 top-full flex justify-center px-2 pt-1",role:"status",children:(0,h.jsxs)("span",{className:"max-w-full truncate rounded border border-gray-700 bg-gray-900/95 px-2 py-0.5 text-[11px] text-gray-300 shadow",children:[g.origin?(0,h.jsxs)("span",{className:"text-blue-300",children:[g.origin,": "]}):null,g.text]})}),e&&m&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("div",{className:"fixed inset-0 z-40",onClick:()=>f(!1),"aria-hidden":"true"}),(0,h.jsxs)("div",{className:"absolute right-1 top-full z-50 mt-1 max-h-[60vh] w-[min(24rem,calc(100vw-0.5rem))] overflow-y-auto rounded-lg border border-gray-700 bg-gray-900 p-2 shadow-xl",children:[c&&a8(c)?(0,h.jsxs)(h.Fragment,{children:[(0,h.jsxs)("div",{className:"mb-1 flex items-center justify-between gap-2 text-[11px] text-gray-500",children:[(0,h.jsxs)("span",{className:"truncate",children:[(0,h.jsx)("span",{className:"text-gray-200",children:fS(a8(c))})," in ",fQ(d,m)]}),(0,h.jsx)("button",{className:"shrink-0 text-gray-500 hover:text-gray-200",onClick:()=>eQ({doc:b,focus:null}),children:"clear"})]}),0===o.length&&(0,h.jsx)("div",{className:"py-1 text-[11px] text-gray-500",children:"Nothing in the other drawings names it."}),o.map((a,b)=>(0,h.jsxs)("button",{onClick:()=>r({member:a.other.member,focus:a7(a.other)}),className:"flex w-full items-start gap-2 rounded px-1.5 py-1.5 text-left hover:bg-gray-800",children:[(0,h.jsx)("span",{className:"mt-0.5 text-gray-400",children:(0,h.jsx)(fw,{kind:fR(d,a.other.member),size:14})}),(0,h.jsxs)("span",{className:"min-w-0 flex-1",children:[(0,h.jsx)("span",{className:"block text-[12px] text-gray-200",children:a.text}),(0,h.jsxs)("span",{className:"block truncate text-[10.5px] text-gray-500",children:[fS(a.other)," · ",fQ(d,a.other.member)," · ",a.rule]})]})]},b))]}):null,(!c||!a8(c))&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsxs)("div",{className:"mb-1 text-[11px] text-gray-500",children:["Elements of ",fQ(d,m)," that the other drawings name — pick one to follow it."]}),0===p.length&&(0,h.jsx)("div",{className:"py-1 text-[11px] text-gray-500",children:"None."}),(0,h.jsx)("div",{className:"flex flex-wrap gap-1",children:p.map(([a,c])=>(0,h.jsxs)("button",{onClick:()=>{f(!0),eQ({doc:b,focus:a})},className:"rounded border border-gray-700 bg-gray-800 px-1.5 py-0.5 text-[11px] text-gray-200 hover:bg-gray-700",children:[a," ",(0,h.jsx)("span",{className:"text-gray-500",children:c})]},a))})]})]})]})]})}let fU={erd:"ERD",machine:"STATE MACHINE",sequence:"SEQUENCE",system:"SYSTEM"};function fV(a,b,c=!1){if(!b)return"";if("erd"===a)return`${b.entities?.length??0} entities \xb7 ${b.relationships?.length??0} relationships`;if("sequence"===a){let a=b.fragments?.length??0;return`${b.participants?.length??0} participants \xb7 ${b.messages?.length??0} messages${a&&!c?` \xb7 ${a} fragment${a>1?"s":""}`:""}`}let d=0,e=a=>{a&&(d+=1,(a.states??[]).forEach(e),(a.parallel?.states??[]).forEach(e))};(b.state?.states??[]).forEach(e),(b.state?.parallel?.states??[]).forEach(e);let f=(b.events??[]).reduce((a,b)=>a+(b?.events?.length??0)+(b?.timers?.length??0),0);return`${d} states \xb7 ${f} events`}let fW=(a,b)=>a<b?`${a}\u0000${b}`:`${b}\u0000${a}`;function fX(a){let b="message"===a.from.kind?`message ${a.from.name}`:`${a.from.kind} ${a.from.name}`;return`${b} ${a.text}`}function fY(){let a=(0,ek.useRequestedDoc)(),[b,c]=(0,i.useState)(a);(0,i.useEffect)(()=>{let b=!0;if(a)c(a);else fA(null).then(a=>b&&c(a.path||null));return()=>{b=!1}},[a]);let{system:d,reload:e}=fF(b),[f,g]=(0,i.useState)("members"),[j,k]=(0,i.useState)(!1),[l,m]=(0,i.useState)(!1),[n,o]=(0,i.useState)(!1),[p,q]=(0,i.useState)(null),[r,s]=(0,i.useState)(()=>new Set),[t,u]=(0,i.useState)({text:"loading…",tone:"ok"}),v=(0,i.useCallback)((a,b="ok")=>u({text:a,tone:b}),[]),[w,x]=(0,i.useState)(!1),y=eL({onClose:()=>k(!1),restVh:62,tallVh:92}),z=(0,i.useRef)(null),[A,B]=(0,i.useState)(!1);(0,i.useEffect)(()=>{let a=z.current;if(!a)return;let b=()=>{let b=a.getBoundingClientRect();b.width&&B(b.height>1.1*b.width)};b();let c=new ResizeObserver(b);return c.observe(a),()=>c.disconnect()},[]);let C=(0,i.useRef)(!1);(0,i.useEffect)(()=>{d&&(d.error?v(d.error,"warn"):C.current||v(`${d.members.length} member${1===d.members.length?"":"s"} loaded`),C.current=!0)},[d,v]);let[D,E]=(0,i.useState)(!1);(0,i.useEffect)(()=>{let a=setTimeout(()=>E(!0),4e3);return()=>{clearTimeout(a),E(!1)}},[t]);let F=(0,i.useMemo)(()=>d?.def?fg(()=>a6(d.def,d.members),null):null,[d]),G=(0,i.useMemo)(()=>d?fg(()=>a9(d.members),[]):[],[d]),H=(0,i.useMemo)(()=>d?.def?fg(()=>bd(d.def,d.members),null):null,[d]),I=aO(d?.def),J=(0,i.useMemo)(()=>{let a=new Map;for(let b of G){if(b.from.member===b.to.member)continue;let c=fW(b.from.member,b.to.member),d=a.get(c)??{a:c.split("\0")[0],b:c.split("\0")[1],links:[]};d.links.push(b),a.set(c,d)}return a},[G]),K=(F?.issues??[]).filter(a=>"error"===a.severity),L=(F?.issues??[]).filter(a=>"warning"===a.severity),M=(b,c)=>{d&&eQ({doc:d.absOf[b]??b,system:a??d.path,focus:c??null})},N=async(a,b)=>{if(d)try{await fC(d.path,a,d.mtimes[d.path]),v(b),fE()}catch(a){a instanceof fB?(v("the system changed on disk — reloaded; make the change again","warn"),fE()):v(`not saved: ${a instanceof Error?a.message:String(a)}`,"warn")}},O=async()=>{if(!d||!H||!H.count)return;x(!0);let{result:a,written:b,failed:c,conflicts:e}=await fJ(d.path);x(!1),c.length?v(`not all written: ${c.join("; ")}`,"warn"):e.length?v(`${e.join(", ")} kept changing on disk — not written; apply again`,"warn"):a?.count?v(`${be(a,"propose").replace(/ proposed/," applied")} — ${b.length} file(s) written`):v("nothing to apply: the drawings on disk already agree")},P=A?420:760,Q=A?640:520,R=d?.def?.members?.filter(a=>a?.path).map(a=>a.path)??[],S=d?.def?.actors??[],T=64*!!S.length,U=(0,i.useMemo)(()=>{let a=R.length,b=P/2,c=(Q-T)/2+6,d=Math.max(0,P/2-98-16),e=Math.max(0,(Q-T)/2-46-18),f=new Map;return R.forEach((g,h)=>{if(1===a)return f.set(g,{x:b,y:c});if(A){let b=Q-T-46-16;return f.set(g,{x:h%2?.67*P:.33*P,y:62+(b-62)*h/(a-1)})}if(2===a)return f.set(g,A?{x:b,y:h?c+e:c-e}:{x:h?b+d:b-d,y:c});let i=-Math.PI/2+2*h*Math.PI/a;f.set(g,{x:b+d*Math.cos(i),y:c+e*Math.sin(i)})}),f},[R.join("|"),P,Q,196,T,A]),V=(0,i.useMemo)(()=>{let a=new Map;for(let{member:b,def:c}of a5(d?.members??[]).sequences)for(let d of c.participants??[]){if(!d?.actor)continue;let c=a.get(d.actor)??[];c.includes(b)||c.push(b),a.set(d.actor,c)}return a},[d]),W=d?.def,X=(d?.path??b??"").split("/").pop()||"…",Y=[{id:"members",label:"Members",icon:(0,h.jsx)(fw,{kind:"system"})},{id:"checks",label:"Checks",icon:(0,h.jsx)(em,{}),badge:K.length+L.length||void 0},{id:"notes",label:"Notes",icon:"✎"}],Z=p?J.get(p):void 0,$=(0,i.useMemo)(()=>{let a=[];for(let b of["error","warning"]){let c=new Map;for(let a of F?.issues??[])a.severity===b&&c.set(a.ruleId,[...c.get(a.ruleId)??[],a]);for(let[d,e]of[...c.entries()].sort((a,b)=>a[0].localeCompare(b[0])))a.push({key:`${b}:${d}`,ruleId:d,severity:b,issues:e})}return a},[F]);return(0,h.jsxs)("div",{className:"app-shell dock-offset flex flex-col overflow-hidden bg-gray-950 text-gray-200",onClick:()=>l&&m(!1),children:[(0,h.jsxs)("header",{className:"relative z-40 flex items-center gap-2 border-b border-gray-800 bg-gray-900 px-2 py-1.5 text-xs md:px-3 md:py-2",children:[(0,h.jsxs)("span",{className:"flex items-center gap-1 font-semibold text-blue-300",children:[(0,h.jsx)(fw,{kind:"system",size:14}),"SYS"]}),(0,h.jsx)(el,{}),(0,h.jsxs)("span",{className:"min-w-0 flex-1 truncate text-gray-400",title:d?.path,children:[W?.settings?.name??X,(0,h.jsxs)("span",{className:"hidden text-gray-600 lg:inline",children:[" · ",X]})]}),(0,h.jsxs)("div",{className:"hidden shrink-0 items-center gap-2 md:flex",children:[(0,h.jsx)("button",{className:ft,onClick:e,title:"Read the system and every member again",children:"Re-check"}),(0,h.jsx)("button",{className:ft,onClick:()=>o(a=>!a),"aria-pressed":!n,children:n?"⟨ Panel":"Panel ⟩"})]}),(0,h.jsxs)("div",{className:"relative shrink-0 md:hidden",children:[(0,h.jsx)("button",{className:"rounded border border-gray-700 bg-gray-800 px-3 py-1.5 text-sm leading-none text-gray-200","aria-label":"More actions","aria-expanded":l,onClick:a=>{a.stopPropagation(),m(a=>!a)},children:"⋯"}),l&&(0,h.jsx)("div",{className:"absolute right-0 top-full z-50 mt-1 w-56 overflow-hidden rounded-lg border border-gray-700 bg-gray-900 py-1 shadow-xl",children:(0,h.jsx)("button",{className:"block w-full px-4 py-3 text-left text-sm text-gray-200 hover:bg-gray-800",onClick:()=>{m(!1),e()},children:"Re-check the system"})})]})]}),(0,h.jsxs)("div",{className:"relative flex min-h-0 flex-1",children:[(0,h.jsxs)("div",{ref:z,className:"relative min-w-0 flex-1 overflow-hidden bg-[#030712]",children:[d&&W&&(0,h.jsx)(eJ,{what:"system map",resetKey:d,children:(0,h.jsxs)("svg",{className:"h-full w-full",viewBox:`0 0 ${P} ${Q}`,preserveAspectRatio:"xMidYMid meet",role:"img","aria-label":`System map of ${W.settings?.name}`,children:[[...J.entries()].map(([a,b])=>{let c=U.get(b.a),d=U.get(b.b);if(!c||!d)return null;let e=(c.x+d.x)/2,f=(c.y+d.y)/2,i=`${b.links.length} link${1===b.links.length?"":"s"}`,j=6.4*i.length+16,l=p===a;return(0,h.jsxs)("g",{className:"cursor-pointer",onClick:()=>{q(l?null:a),g("members"),k(!0)},children:[(0,h.jsx)("line",{x1:c.x,y1:c.y,x2:d.x,y2:d.y,stroke:"transparent",strokeWidth:18}),(0,h.jsx)("line",{x1:c.x,y1:c.y,x2:d.x,y2:d.y,stroke:l?"#3b82f6":"#475569",strokeWidth:l?2.5:1.6}),(0,h.jsx)("rect",{x:e-j/2,y:f-11,width:j,height:22,rx:11,fill:"#0f172a",stroke:l?"#3b82f6":"#334155"}),(0,h.jsx)("text",{x:e,y:f+4,textAnchor:"middle",fontSize:11.5,fill:l?"#93c5fd":"#cbd5e1",children:i})]},a)}),S.map((a,b)=>{let c=(b+1)*P/(S.length+1),d=Q-30;return(0,h.jsxs)("g",{children:[(V.get(a.name)??[]).map(a=>{let b=U.get(a);return b?(0,h.jsx)("line",{x1:c,y1:d-14,x2:b.x,y2:b.y+46,stroke:"#334155",strokeDasharray:"3 4"},a):null}),(0,h.jsx)("title",{children:[`${a.kind}`,a.description??"",a.wheelNode??""].filter(Boolean).join(" — ")}),(0,h.jsx)("rect",{x:c-62,y:d-14,width:124,height:28,rx:14,fill:"#0c1020",stroke:"#6366f1"}),(0,h.jsx)("g",{transform:`translate(${c-54} ${d-8})`,color:"#a5b4fc",children:(0,h.jsx)(fw,{kind:"actor",size:16})}),(0,h.jsx)("text",{x:c-34,y:d-1,fontSize:11.5,fontWeight:600,fill:"#e2e8f0",children:a.name.length>12?`${a.name.slice(0,11)}…`:a.name}),(0,h.jsx)("text",{x:c-34,y:d+9,fontSize:8.5,fill:"#94a3b8",children:a.kind})]},a.name)}),R.map(a=>{let b=U.get(a),c=d.members.find(b=>b.path===a);if(!b||!c)return null;let e=c.kind,f=(F?.issues??[]).filter(b=>b.member===a),g=f.filter(a=>"error"===a.severity).length,i=f.filter(a=>"warning"===a.severity).length,j=b.x-98,k=b.y-46,l=fQ(d,a),m=Z&&(Z.a===a||Z.b===a);return(0,h.jsxs)("g",{className:"cursor-pointer",onClick:()=>M(a),children:[(0,h.jsx)("title",{children:`${a}${c.error?` — cannot be read: ${c.error}`:""}
|
|
15
|
-
Tap to open it inside the system.`}),(0,h.jsx)("rect",{x:j,y:k,width:196,height:92,rx:10,fill:"#0f172a",stroke:c.error?"#ef4444":m?"#3b82f6":g?"#b91c1c":"#475569",strokeWidth:m?2.2:1.5,strokeDasharray:c.error?"5 4":void 0}),(0,h.jsx)("g",{transform:`translate(${j+10} ${k+9})`,color:"#93c5fd",children:(0,h.jsx)(fw,{kind:e,size:16})}),(0,h.jsx)("text",{x:j+32,y:k+21,fontSize:9,fontWeight:700,letterSpacing:"0.06em",fill:"#64748b",children:fU[e]}),(0,h.jsx)("text",{x:j+10,y:k+43,fontSize:14,fontWeight:600,fill:"#e2e8f0",children:l.length>22?`${l.slice(0,21)}…`:l}),(0,h.jsx)("text",{x:j+10,y:k+60,fontSize:10.5,fill:"#94a3b8",children:c.error?"cannot be read":fV(e,c.def,!0)}),(0,h.jsx)("text",{x:j+10,y:k+79,fontSize:10.5,fill:g?"#fca5a5":i?"#fcd34d":"#4ade80",children:c.error?c.error.length>30?`${c.error.slice(0,29)}…`:c.error:g||i?[g?`${g} error${g>1?"s":""}`:"",i?`${i} warning${i>1?"s":""}`:""].filter(Boolean).join(" · "):"checks pass"}),(0,h.jsx)("text",{x:j+196-10,y:k+79,fontSize:10.5,textAnchor:"end",fill:"#64748b",children:"open ›"})]},a)})]})}),d&&!W&&(0,h.jsx)("div",{className:"absolute inset-0 flex items-center justify-center p-6 text-center text-sm text-amber-300",children:d.error}),(0,h.jsxs)("div",{className:`pointer-events-none absolute left-2 top-2 flex max-w-[75%] items-center gap-1.5 rounded bg-gray-950/70 px-1.5 py-0.5 text-[11px] ${"warn"===t.tone?"text-amber-300":"text-gray-500"}`,role:"status",children:[(0,h.jsx)("span",{className:`h-1.5 w-1.5 shrink-0 rounded-full ${"warn"===t.tone?"bg-amber-400":"bg-emerald-500"}`}),(0,h.jsx)("span",{className:`truncate transition-opacity duration-500 ${D&&"ok"===t.tone?"opacity-0":"opacity-100"}`,children:t.text})]})]}),j&&(0,h.jsx)("div",{className:"fixed inset-0 z-20 bg-black/50 md:hidden",onClick:y.close,"aria-hidden":"true"}),d&&W&&(0,h.jsxs)("aside",{style:y.sheetStyle,className:`safe-x fixed inset-x-0 bottom-0 z-30 flex h-[var(--sheet-h)] flex-col overflow-hidden rounded-t-2xl border-t border-gray-800 bg-gray-900 shadow-2xl transition-[transform,height] duration-200 ease-out ${j?"translate-y-0":"pointer-events-none translate-y-full"} md:pointer-events-auto md:static md:z-auto md:h-auto md:w-96 md:translate-y-0 md:rounded-none md:border-l md:border-t-0 md:shadow-none md:transition-none ${n?"md:hidden":""}`,children:[(0,h.jsxs)("div",{className:"md:hidden",...y.zoneProps,children:[(0,h.jsx)("div",{className:"flex justify-center pb-1 pt-2",children:(0,h.jsx)("span",{className:"h-1.5 w-12 rounded-full bg-gray-600"})}),(0,h.jsxs)("div",{className:"flex items-center justify-between border-b border-gray-800 px-4 pb-2",children:[(0,h.jsx)("h2",{className:"text-sm font-semibold text-gray-300",children:Y.find(a=>a.id===f)?.label}),(0,h.jsx)("button",{onClick:y.close,className:"-mr-2 px-3 py-2 text-lg text-gray-400","aria-label":"Close panel",children:"✕"})]})]}),(0,h.jsx)("div",{className:"hidden border-b border-gray-800 md:flex",children:Y.map(a=>(0,h.jsxs)("button",{onClick:()=>g(a.id),className:`relative flex-1 px-1 py-2 text-center text-xs transition-colors ${f===a.id?"border-b-2 border-blue-400 bg-gray-800/50 text-blue-400":"text-gray-500 hover:text-gray-300"}`,children:[a.label,void 0!==a.badge&&(0,h.jsx)("span",{className:"absolute right-1 top-1 min-w-[14px] rounded-full bg-red-900 px-1 text-[9px] text-red-100",children:a.badge})]},a.id))}),(0,h.jsxs)("div",{className:"touch-targets dock-offset flex-1 overflow-y-auto overscroll-contain p-3",children:[(0,h.jsxs)("section",{className:"members"===f?"":"hidden",children:[(0,h.jsx)("div",{className:fu,style:{marginTop:0},children:"Members"}),R.map(a=>{let b=d.members.find(b=>b.path===a),c=W.members.find(b=>b.path===a)?.notes;return(0,h.jsxs)("div",{className:"mb-1 rounded border border-gray-800",children:[(0,h.jsxs)("button",{onClick:()=>M(a),className:"flex w-full items-start gap-2 p-2 text-left hover:bg-gray-800",children:[(0,h.jsx)("span",{className:"mt-0.5 text-blue-300",children:(0,h.jsx)(fw,{kind:b?.kind??"machine"})}),(0,h.jsxs)("span",{className:"min-w-0 flex-1",children:[(0,h.jsx)("span",{className:"block truncate text-[12px] font-semibold text-gray-200",children:fQ(d,a)}),(0,h.jsx)("span",{className:"block truncate text-[10.5px] text-gray-500",children:a}),(0,h.jsx)("span",{className:`block text-[11px] ${b?.error?"text-red-300":"text-gray-400"}`,children:b?.error?`cannot be read: ${b.error}`:fV(b?.kind??"machine",b?.def)})]}),(0,h.jsx)("span",{className:"shrink-0 text-[11px] text-gray-500",children:"open ›"})]}),c||r.has(a)?(0,h.jsx)("div",{className:"px-2 pb-2 [&_label]:mt-0",children:(0,h.jsx)(fq,{label:"Note on this member, in the system",value:c??"",placeholder:`Why ${fQ(d,a)} is part of this system, what is open…`,onSave:b=>void N(function(a,b,c){let d=aX(a),e=d.members.findIndex(a=>a.path===b);if(e<0)throw Error(`'${b}' is not a member. Members: ${a.members.map(a=>a.path).join(", ")||"none"}.`);return d.members[e]=aY({...d.members[e],...c}),d}(W,a,{notes:b}),"saved")},`member:${a}`)}):(0,h.jsx)("button",{className:"mx-2 mb-1.5 text-[11px] text-gray-500 hover:text-gray-300",onClick:()=>s(b=>new Set(b).add(a)),children:"Add a note on this member"})]},a)}),(0,h.jsx)("div",{className:fu,children:"Links between members"}),0===J.size&&(0,h.jsx)("div",{className:"py-0.5 text-[11px] text-gray-600",children:"No name crosses between the members yet."}),[...J.entries()].map(([a,b])=>(0,h.jsxs)("div",{className:"mb-1",children:[(0,h.jsxs)("button",{className:`flex w-full items-center justify-between rounded px-1.5 py-1 text-left text-[11px] ${p===a?"bg-blue-950/60 text-blue-200":"text-gray-300 hover:bg-gray-800"}`,onClick:()=>q(p===a?null:a),children:[(0,h.jsxs)("span",{className:"truncate",children:[fQ(d,b.a)," ","↔︎"," ",fQ(d,b.b)]}),(0,h.jsx)("span",{className:"shrink-0 text-gray-500",children:b.links.length})]}),p===a&&(0,h.jsx)("div",{className:"ml-2 border-l border-gray-800 pl-2",children:b.links.map((a,b)=>(0,h.jsxs)("button",{className:"block w-full truncate py-0.5 text-left text-[11px] text-gray-400 hover:text-gray-200",title:`${fX(a)} — ${a.rule}`,onClick:()=>{let b;return M((b=a.from).member,a7(b))},children:[(0,h.jsx)("span",{className:"text-gray-600",children:a.rule})," ",fX(a)]},b))})]},a)),S.length>0&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("div",{className:fu,children:"Actors"}),S.map(a=>(0,h.jsxs)("div",{className:"py-0.5 text-[11px] text-gray-300",children:[a.name," ",(0,h.jsxs)("span",{className:"text-gray-500",children:["· ",a.kind]}),a.description?(0,h.jsxs)("span",{className:"text-gray-500",children:[" — ",a.description]}):null]},a.name))]})]}),(0,h.jsxs)("section",{className:"checks"===f?"":"hidden",children:[(0,h.jsx)("div",{className:fu,style:{marginTop:0},children:"Checks"}),(0,h.jsxs)("div",{className:`text-[11px] ${K.length?"text-red-300":L.length?"text-amber-300":"text-green-400"}`,children:[K.length," error",1===K.length?"":"s"," · ",L.length," warning",1===L.length?"":"s"]}),$.map(a=>(0,h.jsxs)("div",{className:"mt-2",children:[(0,h.jsxs)("div",{className:`text-[11px] font-semibold ${"error"===a.severity?"text-red-300":"text-amber-300"}`,children:[a.ruleId," · ",a.issues.length," ",a.severity,1===a.issues.length?"":"s"]}),a.issues.map((a,b)=>(0,h.jsxs)("button",{className:"block w-full py-0.5 pl-2 text-left text-[11px] text-gray-300 hover:text-white",onClick:()=>{a.member&&M(a.member,a.element&&/^[a-z]+:/.test(a.element)?a.element:null)},title:a.member?`Open ${a.member}${a.element?` at ${a.element}`:""}`:void 0,children:[a.message,a.member&&(0,h.jsxs)("span",{className:"text-gray-500",children:[" — ",fQ(d,a.member)]})]},b))]},a.key)),(0,h.jsx)("div",{className:fu,children:"Reconcile"}),(0,h.jsxs)("p",{className:"mb-1 text-[11px] text-gray-500",children:["What the scenarios imply for the machines and the data. ",(0,h.jsx)("b",{className:"text-gray-400",children:"propose"})," lists it here to apply by hand; ",(0,h.jsx)("b",{className:"text-gray-400",children:"auto"})," writes it each time a scenario is saved."]}),(0,h.jsx)("span",{className:"inline-flex overflow-hidden rounded border border-gray-700",role:"group","aria-label":"Reconcile mode",children:aN.map(a=>(0,h.jsx)("button",{"aria-pressed":I===a,onClick:()=>{d?.def&&a!==I&&N(function(a,b){if(!aN.includes(b))throw Error(`The reconcile mode is ${aN.join(" or ")}; got '${b}'.`);return aZ(a,{reconcile:b})}(d.def,a),`reconcile mode: ${a}`)},className:`px-3 py-1 text-xs ${I===a?"bg-blue-900/60 text-blue-200":"bg-gray-800 text-gray-400 hover:bg-gray-700"}`,children:a},a))}),(0,h.jsx)("div",{className:"mt-2 text-[11px] font-semibold text-gray-400",children:"Scenario changes"}),H&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("div",{className:"text-[11px] text-gray-500",children:be(H,"propose")}),H.machines.map(a=>(0,h.jsxs)("div",{className:"mt-1",children:[(0,h.jsxs)("div",{className:"text-[11px] text-gray-300",children:[a.machine," ",(0,h.jsxs)("span",{className:"text-gray-500",children:["· ",a.member]})]}),a.reasons.map((a,b)=>(0,h.jsxs)("div",{className:"pl-2 text-[11px] text-gray-400",children:["+ ",a]},b))]},a.member)),H.erds.map(a=>(0,h.jsxs)("div",{className:"mt-1",children:[(0,h.jsxs)("div",{className:"text-[11px] text-gray-300",children:[a.def.settings?.name??a.member," ",(0,h.jsxs)("span",{className:"text-gray-500",children:["· ",a.member]})]}),a.reasons.map((a,b)=>(0,h.jsxs)("div",{className:"pl-2 text-[11px] text-gray-400",children:["+ ",a]},b))]},a.member)),H.system&&(0,h.jsxs)("div",{className:"mt-1",children:[(0,h.jsx)("div",{className:"text-[11px] text-gray-300",children:"the system"}),H.system.reasons.map((a,b)=>(0,h.jsxs)("div",{className:"pl-2 text-[11px] text-gray-400",children:["+ ",a]},b))]}),H.unresolved.map((a,b)=>(0,h.jsxs)("div",{className:"mt-1 text-[11px] text-amber-300",children:["left open: ",a]},b)),(0,h.jsx)("button",{className:`${ft} mt-2 disabled:opacity-40`,disabled:!H.count||w,onClick:O,children:w?"Applying…":`Apply${H.count?` ${H.count} change${1===H.count?"":"s"}`:""}`})]}),(F?.replays??[]).map(({member:a,report:b})=>(0,h.jsxs)("div",{children:[(0,h.jsxs)("div",{className:fu,children:["Replay · ",fQ(d,a)]}),(0,h.jsxs)("div",{className:"mb-1 text-[11px] text-gray-500",children:["against ",b.machines.join(", ")||"no machine"]}),b.paths.map(b=>(0,h.jsxs)("div",{className:"mb-2",children:[(0,h.jsxs)("div",{className:`text-[11px] font-semibold ${b.accepted?"text-green-400":"text-amber-300"}`,children:[b.name," — ",b.accepted?"accepted":"stops"]}),b.steps.filter(a=>"data"!==a.result).map(c=>(0,h.jsxs)("button",{className:`block w-full truncate py-0.5 pl-2 text-left font-mono text-[10.5px] ${"moved"===c.result||"stayed"===c.result?"text-gray-400":"text-amber-300"}`,title:c.note??c.result,onClick:()=>M(a,`message:${c.ref}`),children:[c.ref,". ",c.event??""," ",c.from.join("|")||"·"," → ",c.to.join("|")||"·"," ",c.result]},`${b.name}:${c.ref}`))]},b.name))]},a))]}),(0,h.jsxs)("section",{className:"notes"===f?"":"hidden",children:[(0,h.jsx)("div",{className:fu,style:{marginTop:0},children:"Notes"}),(0,h.jsx)("p",{className:"mb-1 text-[11px] text-gray-600",children:"Saved in the system file, for whoever opens it next."}),(0,h.jsx)(fq,{label:"On this system",value:W.settings?.notes??"",placeholder:"What the system is for, what is still open…",onSave:a=>void N(aZ(W,{notes:a}),"saved")},"system"),W.settings?.description&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("div",{className:fu,children:"Description"}),(0,h.jsx)("p",{className:"text-[11px] text-gray-400",children:W.settings.description})]})]})]})]})]}),(0,h.jsx)("nav",{className:"dock-safe safe-x fixed inset-x-0 bottom-0 z-40 flex border-t border-gray-800 bg-gray-900/95 backdrop-blur-md md:hidden",children:Y.map(a=>{let b=j&&f===a.id;return(0,h.jsxs)("button",{onClick:()=>{var b;return b=a.id,void(j&&f===b?y.close():k(!0),g(b))},"aria-pressed":b,className:`relative flex h-14 flex-1 flex-col items-center justify-center gap-0.5 text-[11px] transition-colors ${b?"text-blue-400":"text-gray-500"}`,children:[(0,h.jsx)("span",{className:"flex h-4 items-center text-base leading-none",children:a.icon}),(0,h.jsx)("span",{children:a.label}),void 0!==a.badge&&(0,h.jsx)("span",{className:"absolute right-1/2 top-1 min-w-[16px] translate-x-5 rounded-full border border-red-900/80 bg-red-950/80 px-1 text-[10px] leading-4 text-red-200",children:a.badge}),b&&(0,h.jsx)("span",{className:"absolute inset-x-4 top-0 h-0.5 rounded-full bg-blue-400"})]},a.id)})})]})}function fZ(){let a=d_(a=>a.definition),b=d_(a=>a.layout.positions),c=d_(a=>a.navigationPath),d=d_(a=>a.viewport),e=d_(a=>a.setViewport),f=d_(a=>a.docPath),g=eP("focus"),j=(0,i.useMemo)(()=>({get current(){return document.getElementById("machine-board")}}),[]),k=c.slice(1),l=(0,i.useMemo)(()=>a?.state?function(a,b){let c=[];for(let d of a){let a=d?.name?b[d.name]:void 0;a&&c.push({focus:`state:${d.name}`,box:a})}for(let d of a){let e=d?.name?b[d.name]:void 0;if(e)for(let f of d.transitions??[]){if(!f?.event)continue;let d=f.nextState?b[f.nextState]:void 0;c.push({focus:`event:${f.event}`,box:d&&a.some(a=>a.name===f.nextState)?br([e,d]):e})}}return c}(by(a.state,k),b):[],[a,b,c]);return(0,h.jsx)(fe,{docPath:f,kind:"machine",viewport:d,setViewport:e,boxes:l,boardRef:j,focus:g,level:c[c.length-1],onReveal:a=>{let b=a.map(a8).find(a=>a?.kind==="state");if(!b)return;let c=new URL(window.location.href);c.searchParams.set("focus",`state:${b.name}`),window.history.replaceState(window.history.state,"",c),window.dispatchEvent(new Event(eM))}})}let f$=a=>a.parallel?a.parallel.states:a.states??[];function f_(a,b){if(!a)return null;if(a.name===b)return[a.name];for(let c of f$(a)){let d=f_(c,b);if(d)return[a.name,...d]}return null}function f0(){let a=(0,ek.useRequestedDoc)(),b=eP("system"),[c,d]=(0,i.useState)(null);(0,i.useEffect)(()=>{let a=!0;return eu().then(b=>{a&&d(b.projectFile?aS(b.projectFile):"machine")}),()=>{a=!1}},[]);let e=a?aS(a):c;if(null===e)return(0,h.jsx)("div",{className:"app-shell bg-gray-950"});let f=a??"default",g="erd"===e?(0,h.jsx)(fp,{},f):"sequence"===e?(0,h.jsx)(fP,{},f):"system"===e?(0,h.jsx)(fY,{},f):(0,h.jsx)(f1,{}),j=(0,h.jsx)(eJ,{what:"document",resetKey:a,children:g});return b&&aQ(b)?(0,h.jsx)(fa,{children:(0,h.jsxs)("div",{className:"system-frame",children:[(0,h.jsx)(fT,{systemPath:b}),j]})}):(0,h.jsx)(fa,{children:j})}function f1(){let a,b;a=eS(),b=(0,i.useRef)(null),(0,i.useEffect)(()=>{let c=()=>{let a=b.current;if(!a)return;let c=d_.getState(),d=null;if(d&&c.docPath!==d||a.docAt!==c.docPath&&c.definition===a.defAt)return;b.current=null;let e=a8(a.focus);if(!e)return;let f=null,g=null;if("state"===e.kind)(f=f_(c.definition.state,e.name))&&(g={kind:"state",id:e.name});else if("event"===e.kind){let a=function a(b,c){if(!b)return null;let d=(b.transitions??[]).findIndex(a=>a?.event===c);if(d>=0)return{state:b.name,index:d};for(let d of f$(b)){let b=a(d,c);if(b)return b}return null}(c.definition.state,e.name);a&&(f=f_(c.definition.state,a.state),g={kind:"transition",id:`${a.state}:${a.index}`})}if(!f||!g)return;let h=f.length>1?f.slice(0,-1):f;d_.setState({navigationPath:h,currentParent:h[h.length-1]}),c.select(g.kind,g.id);let i=()=>{let a=d_.getState().layout.positions[f[f.length-1]],b=document.getElementById(d3)?.getBoundingClientRect();if(!a||!b?.width)return;let c=S([a],b.width,b.height,{padding:60,maxScale:1});d_.getState().setViewport(c)};requestAnimationFrame(i),setTimeout(i,450)};if(a.nonce>0){let d=d_.getState();b.current=a.focus?{focus:a.focus,docAt:d.docPath,defAt:d.definition}:null,c()}return d_.subscribe(c)},[a]),(0,i.useEffect)(()=>d_.subscribe((a,b)=>{if(a.selection===b.selection||!a.selection.id)return;let{kind:c,id:d}=a.selection;if("state"===c)eR(`state:${d}`);else if("event"===c)eR(`event:${d}`);else if("transition"===c){let b=function(a,b){let c=b.lastIndexOf(":"),d=f_(a.state,b.slice(0,c));if(!d)return null;let e=a.state;for(let a of d.slice(1))e=f$(e).find(b=>b.name===a);return e?.transitions?.[Number(b.slice(c+1))]?.event??null}(a.definition,d);b&&eR(`event:${b}`)}}),[]);let[c,d]=(0,i.useState)("properties"),[e,f]=(0,i.useState)(!1),g=eL({onClose:()=>f(!1),restVh:70,tallVh:92}),j=d_(a=>a.errors),k=d_(a=>a.contextMenu),l=d_(a=>a.hideContextMenu),m=d_(a=>a.addState),n=d_(a=>a.removeState),o=d_(a=>a.setDrawMode),p=d_(a=>a.setDrawSource),q=[{id:"properties",label:"Properties",icon:(0,h.jsx)(ed,{name:"sliders",size:16})},{id:"events",label:"Events",icon:(0,h.jsx)(ed,{name:"bolt",size:16})},{id:"settings",label:"Settings",icon:(0,h.jsx)(ed,{name:"gear",size:16})},{id:"validation",label:"Errors",icon:(0,h.jsx)(em,{}),badge:j.length||void 0}],r=q.find(a=>a.id===c)?.label??"";return(0,h.jsxs)("div",{className:"app-shell dock-offset flex flex-col overflow-hidden",onClick:()=>k.visible&&l(),children:[(0,h.jsx)(ev,{}),(0,h.jsx)(eH,{}),(0,h.jsx)(eo,{}),(0,h.jsxs)("div",{className:"flex flex-1 min-h-0 overflow-hidden relative",children:[(0,h.jsxs)("div",{className:"relative flex-1 overflow-hidden",id:"machine-board",children:[(0,h.jsx)(eJ,{what:"state machine",children:(0,h.jsx)(ec,{})}),(0,h.jsx)(fZ,{})]}),e&&(0,h.jsx)("div",{className:"fixed inset-0 z-20 bg-black/50 md:hidden",onClick:g.close,"aria-hidden":"true"}),(0,h.jsxs)("aside",{style:g.sheetStyle,className:`safe-x fixed inset-x-0 bottom-0 z-30 h-[var(--sheet-h)] flex flex-col overflow-hidden rounded-t-2xl border-t border-gray-800 bg-gray-900 shadow-2xl transition-[transform,height] duration-200 ease-out ${e?"translate-y-0":"translate-y-full pointer-events-none"} md:static md:z-auto md:h-auto md:w-80 md:translate-y-0 md:pointer-events-auto md:rounded-none md:border-t-0 md:border-l md:shadow-none md:transition-none`,children:[(0,h.jsxs)("div",{className:"md:hidden",...g.zoneProps,children:[(0,h.jsx)("div",{className:"flex justify-center pt-2 pb-1",children:(0,h.jsx)("span",{className:"h-1.5 w-12 rounded-full bg-gray-600"})}),(0,h.jsxs)("div",{className:"flex items-center justify-between border-b border-gray-800 px-4 pb-2",children:[(0,h.jsx)("h2",{className:"text-sm font-semibold text-gray-300",children:r}),(0,h.jsx)("button",{onClick:g.close,className:"-mr-2 px-3 py-2 text-lg text-gray-400","aria-label":"Close panel",children:"✕"})]})]}),(0,h.jsx)("div",{className:"hidden border-b border-gray-800 md:flex",children:q.map(a=>(0,h.jsxs)("button",{onClick:()=>d(a.id),className:`flex-1 text-xs py-2 px-1 text-center transition-colors relative ${c===a.id?"text-blue-400 border-b-2 border-blue-400 bg-gray-800/50":"text-gray-500 hover:text-gray-300"}`,children:[a.label,void 0!==a.badge&&a.badge>0&&(0,h.jsx)("span",{className:"absolute top-1 right-1 bg-red-600 text-white text-[9px] rounded-full px-1 min-w-[14px]",children:a.badge})]},a.id))}),(0,h.jsxs)("div",{className:"touch-targets dock-offset flex-1 overflow-y-auto overscroll-contain",children:["properties"===c&&(0,h.jsx)(ef,{}),"events"===c&&(0,h.jsx)(eh,{}),"settings"===c&&(0,h.jsx)(ei,{}),"validation"===c&&(0,h.jsx)(ej,{})]})]}),(0,h.jsx)(ep,{})]}),(0,h.jsx)("nav",{className:"dock-safe safe-x fixed inset-x-0 bottom-0 z-40 flex border-t border-gray-800 bg-gray-900/95 backdrop-blur-md md:hidden",children:q.map(a=>{let b=e&&c===a.id;return(0,h.jsxs)("button",{onClick:()=>{var b;return b=a.id,void(e&&c===b?g.close():f(!0),d(b))},"aria-pressed":b,className:`relative flex h-14 flex-1 flex-col items-center justify-center gap-0.5 text-[11px] transition-colors ${b?"text-blue-400":"text-gray-500"}`,children:[(0,h.jsx)("span",{className:"flex h-4 items-center text-base leading-none",children:a.icon}),(0,h.jsx)("span",{children:a.label}),void 0!==a.badge&&a.badge>0&&(0,h.jsx)("span",{className:"absolute top-1 right-1/2 translate-x-4 rounded-full bg-red-600 px-1 text-[10px] leading-4 text-white min-w-[16px]",children:a.badge}),b&&(0,h.jsx)("span",{className:"absolute inset-x-4 top-0 h-0.5 rounded-full bg-blue-400"})]},a.id)})}),k.visible&&(0,h.jsx)("div",{className:"fixed z-50 bg-gray-900 border border-gray-700 rounded-lg shadow-xl py-1 min-w-[180px] md:min-w-[140px]",style:{left:k.x,top:k.y,maxWidth:"calc(100vw - 1rem)",maxHeight:"calc(100dvh - 1rem)",overflowY:"auto",transform:"translate(0, 0)"},onClick:a=>a.stopPropagation(),children:k.target?.kind==="state"?(0,h.jsxs)(h.Fragment,{children:[(0,h.jsxs)("button",{className:"block w-full text-left text-sm text-gray-300 hover:bg-gray-800 px-4 py-3 md:text-xs md:px-3 md:py-1.5",onClick:()=>{o("transition"),p(k.target.id),l()},children:[(0,h.jsx)(ed,{name:"draw"})," Draw transition from here"]}),(0,h.jsxs)("button",{className:"block w-full text-left text-sm text-red-400 hover:bg-gray-800 px-4 py-3 md:text-xs md:px-3 md:py-1.5",onClick:()=>{k.target?.id&&n(k.target.id),l()},children:[(0,h.jsx)(ed,{name:"trash"})," Delete state"]})]}):(0,h.jsx)(h.Fragment,{children:(0,h.jsxs)("button",{className:"block w-full text-left text-sm text-gray-300 hover:bg-gray-800 px-4 py-3 md:text-xs md:px-3 md:py-1.5",onClick:()=>{let a=prompt("State name:");a&&m(null,{name:a,kind:"normal"}),l()},children:[(0,h.jsx)(ed,{name:"plus"})," Add state here"]})})})]})}a.s(["default",()=>f0],95421)}];
|
|
14
|
+
No marks.`);navigator.clipboard?.writeText(f).then(()=>{D(!0),setTimeout(()=>D(!1),2e3)})},copied:C,note:ac,labels:l,onClose:()=>x(!1)}),al&&n?.sheetBody?(0,eU.createPortal)(m,n.sheetBody):(0,h.jsx)("div",{className:"stage-board-card",children:m}))]}):null}function fg({docPath:a,onReveal:b}){let c=e8(),d=c?.lit??null,e=(0,i.useRef)(-1);return(0,i.useEffect)(()=>{!d||e.current===d.nonce||d.doc&&d.doc!==a||(d.spotlight?.length||d.region)&&(e.current=d.nonce,b())},[d,a,b]),null}function fh(a,b,c){try{return a()}catch(d){let a=d instanceof Error?d.message:String(d);return console.warn("[stateloom] skipped on a malformed document:",a),c?.(a),b}}let fi=(a,b)=>"chen"===b?`stateloom:erd-layout:chen:${a}`:`stateloom:erd-layout:${a}`,fj="stateloom:erd-notation",fk="stateloom:erd-lock";function fl(a,b){try{return JSON.parse(localStorage.getItem(fi(a,b))??"{}")}catch{return{}}}async function fm(a){let b=a.slice(0,a.lastIndexOf("/")),c=((await (await fetch("/api/docs",{cache:"no-store"})).json()).docs??[]).map(a=>a.path).filter(a=>a.endsWith(".smdf.json")&&a.slice(0,a.lastIndexOf("/"))===b),d=[];for(let a of c)try{let b=await (await fetch(`/api/file${(0,ek.docQuery)(a)}`,{cache:"no-store"})).json(),c=JSON.parse(b.content??"null"),e=aq(c?.stateMachine??c?.StateMachine??c);e?.state&&d.push({path:a,def:e})}catch{}return d}let fn="w-full rounded border border-gray-700 bg-gray-950 px-2 py-1 text-xs text-gray-200 placeholder:text-gray-600",fo="rounded border border-gray-700 bg-gray-800 px-2 py-1 text-xs text-gray-200 hover:bg-gray-700",fp="mb-1 mt-3 text-[11px] font-semibold uppercase tracking-wide text-gray-500";function fq(){let a=(0,ek.useRequestedDoc)(),[b,c]=(0,i.useState)(""),[d,e]=(0,i.useState)(null),[f,g]=(0,i.useState)({}),[j,k]=(0,i.useState)("crowsfoot"),[l,m]=(0,i.useState)(!1),[n,o]=(0,i.useState)({...M}),[p,q]=(0,i.useState)(0),[r,s]=(0,i.useState)(null),[t,u]=(0,i.useState)({text:"loading…",tone:"ok"}),v=(0,i.useCallback)((a,b="ok")=>u({text:a,tone:b}),[]),[w,x]=(0,i.useState)(!1);(0,i.useEffect)(()=>{let a=setTimeout(()=>x(!0),4e3);return()=>{clearTimeout(a),x(!1)}},[t]);let[y,z]=(0,i.useState)("entities"),[A,B]=(0,i.useState)(!1),[C,D]=(0,i.useState)(!1),[E,F]=(0,i.useState)(!1),G=(0,i.useRef)(null),H=eL({onClose:()=>B(!1),restVh:62,tallVh:92}),[I,J]=(0,i.useState)(0),[K,L]=(0,i.useState)(null),N=(0,i.useRef)(null);(0,i.useEffect)(()=>{let b=!1,d=null;return(async()=>{let f=await (await fetch(`/api/file${(0,ek.docQuery)(a)}`,{cache:"no-store"})).json();if(b)return;if(f.error)return v(f.error,"warn");let h=f.path??"",i=null;try{let a=f.content?aq(JSON.parse(f.content)):null;X(a)&&(i={...a,relationships:a.relationships??[]})}catch{}if(f.exists&&!i)return v(`${h} is not a readable ERD definition`,"warn");let j=(h.split("/").pop()??"Untitled").replace(/\.erdf\.json$/i,""),l=function(){try{return"chen"===localStorage.getItem(fj)?"chen":"crowsfoot"}catch{return"crowsfoot"}}();c(h),e(i??{settings:{namespace:"Default",name:j},entities:[],relationships:[]}),k(l),m(function(){try{let a=localStorage.getItem(fk);if(null!==a)return"1"===a;return window.matchMedia("(pointer: coarse)").matches}catch{return!1}}()),g(fl(h,l)),s(null),L(null),q(a=>a+1),v(f.exists?"loaded":"new document — the first edit writes it");let{bridgeUrl:n}=await eu();!b&&n&&(N.current=d=dL({url:n,role:"web",docId:h,name:"web-designer",onFull:a=>{let b=a.def;X(b)&&(e({...b,relationships:b.relationships??[]}),v("updated live"))},onPatch:()=>{},onPresence:a=>J(a.length)}),d.connect())})().catch(a=>!b&&v(String(a),"warn")),()=>{b=!0,N.current=null,d?.disconnect()}},[a,v]);let O=(0,i.useMemo)(()=>{if(!d)return{};let a=fh(()=>(function(a,b={}){let c=b.notation??"crowsfoot",d=b.hSpacing??70,e=b.vSpacing??("chen"===c?130:90),f="chen"===c?aj:as,g=[],h=new Set;for(let b of a.entities??[])!b?.name||h.has(b.name)||(h.add(b.name),g.push(b));let i=new Map,j=(a,b,c=new Set)=>a===b||!c.has(a)&&(c.add(a),(i.get(a)??[]).some(a=>j(a,b,c)));for(let b of a.relationships??[]){if(!b||!h.has(b.from)||!h.has(b.to)||b.from===b.to)continue;let[a,c]="N:1"===b.cardinality?[b.to,b.from]:[b.from,b.to];if((i.get(a)??[]).includes(c)||j(c,a))continue;let d=i.get(a);d?d.push(c):i.set(a,[c])}let k=new Map,l=(a,b)=>{if(!((k.get(a)??-1)>=b))for(let c of(k.set(a,b),i.get(a)??[]))l(c,b+1)},m=new Set([...i.values()].flat());for(let a of g)m.has(a.name)||l(a.name,0);for(let a of g)k.has(a.name)||l(a.name,0);for(let a of[...g].sort((a,b)=>k.get(b.name)-k.get(a.name))){let b=i.get(a.name)??[];b.length&&k.set(a.name,Math.min(...b.map(a=>k.get(a)))-1)}let n=[],o=new Map,p=(a,b)=>((n[b]??=[]).push(a),o.set(a.id,a),a);for(let a of g)p({id:a.name,entity:a.name,...f(a),upper:[],lower:[],x:0},k.get(a.name)??0);let q=0;for(let[a,b]of i)for(let c of b){let b=a;for(let d=k.get(a)+1;d<k.get(c);d++){let a=p({id:`\u0000lane${q++}`,width:28,height:0,upper:[],lower:[],x:0},d);o.get(b).lower.push(a.id),a.upper.push(b),b=a.id}o.get(b).lower.push(c),o.get(c).upper.push(b)}for(let a=n.length-1;a>=0;a--)n[a]?.length||n.splice(a,1);let r=(a,b)=>a.length?a.reduce((a,c)=>a+b(o.get(c)),0)/a.length:null,s=(a,b)=>{let c=new Map;for(let a of n)a.forEach((a,b)=>c.set(a.id,b));let d=new Map(a.map((a,d)=>[a.id,r(a[b],a=>c.get(a.id))??d]));a.sort((a,b)=>d.get(a.id)-d.get(b.id))};for(let a=0;a<2;a++){for(let a=1;a<n.length;a++)s(n[a],"upper");for(let a=n.length-2;a>=0;a--)s(n[a],"lower")}let t=a=>a.x+a.width/2,u=(a,b)=>{let c=0;for(let e of a){let a=r(e[b],t);e.x=Math.max(c,null===a?c:a-e.width/2),c=e.x+e.width+d}};for(let a of n)u(a,"upper");for(let a=n.length-2;a>=0;a--)u(n[a],"lower");let v=Math.min(0,...[...o.values()].map(a=>a.x)),w={},x=40;for(let a of n){for(let b of a)b.entity&&(w[b.entity]={x:Math.round(b.x-v)+40,y:x,width:b.width,height:b.height});x+=Math.max(0,...a.map(a=>a.height))+e}return w})(d,{notation:j}),{});for(let[b,c]of Object.entries(f))a[b]&&(a[b]={...a[b],...c});return a},[d,f,j]),P=(0,i.useMemo)(()=>{if(!d)return[];let a="";return fh(()=>Y(d),null,b=>a=b)??[{ruleId:"E000",message:`The document could not be checked (${a}): a field is not the shape Spec 80 gives it`}]},[d]),R=(0,i.useMemo)(()=>P.map(a=>(a.element??"").split(/[.[]/)[0]).filter(Boolean),[P]),T=(0,i.useCallback)(async a=>{let c;if(d&&b){try{c=a(d)}catch(a){return v(a instanceof Error?a.message:String(a),"warn")}e(c),L(null);try{let a=await fetch(`/api/file${(0,ek.docQuery)(b)}`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({content:JSON.stringify(c,null,2)+"\n"})});if(!a.ok)throw Error((await a.json())?.error??`HTTP ${a.status}`);N.current?.emitFull(c),v("saved")}catch(a){v(`not saved: ${a instanceof Error?a.message:String(a)}`,"warn")}}},[d,b,v]),U=(0,i.useCallback)((a,c)=>{g(d=>{let e={...d,[a]:{x:Math.round(c.x),y:Math.round(c.y)}};try{localStorage.setItem(fi(b,j),JSON.stringify(e))}catch{}return e})},[b,j]),Z=()=>{g({});try{localStorage.removeItem(fi(b,j))}catch{}q(a=>a+1)},af=async()=>{if(!d)return;v("checking links…");let a=await fm(b);if(0===a.length)return L("none"),z("issues"),B(!0),v("no .smdf.json beside this document to check against","warn");let c=a.flatMap(a=>$(a.def,d).map(b=>({...b,message:`${a.def.settings?.name??a.path}: ${b.message}`})));c.push(..._(d,a.map(a=>a.def.settings?.name??""))),L(c),z("issues"),B(!0),F(!1),v(`checked ${a.length} machine(s): ${c.length} problem(s)`,c.length?"warn":"ok")},ag=async a=>{let c=(await fm(b)).find(b=>b.def.settings?.name===a);c?(0,ek.navigateToDoc)(c.path):v(`no .smdf.json beside this document defines '${a}'`,"warn")},ah=()=>{let a=G.current?.getBoundingClientRect();return{width:a?.width??0,height:a?.height??0}},ai=a=>{let{width:b,height:c}=ah();o(d=>Q(d,a,{x:b/2,y:c/2}))},al=a=>{let b=O[a],{width:c,height:d}=ah();b&&c&&(o(S([b],c,d,{padding:28,maxScale:1.25})),s(a),H.close())},ap=eT(),ar=eQ("focus"),at=(0,i.useMemo)(()=>d?fh(()=>(function(a,b,c={}){let d=!1!==c.rows,e=[];for(let c of a?.entities??[]){let a=c?.name?b[c.name]:void 0;a&&(e.push({focus:`entity:${c.name}`,box:a}),(c.attributes??[]).filter(a=>a?.name).forEach((b,f)=>{e.push({focus:`attribute:${c.name}.${b.name}`,box:d?{x:a.x,y:a.y+30+20*f,width:a.width,height:20}:a})}))}return e})(d,O,{rows:"chen"!==j}),[]):[],[d,O,j]),au=(0,i.useRef)(-1);(0,i.useEffect)(()=>{if(!d||au.current===ap.nonce)return;au.current=ap.nonce;let a=ap.focus?a8(ap.focus):null,b=a?.kind==="entity"?a.name:a?.kind==="attribute"?a.name.split(".")[0]:null;b&&O[b]&&al(b)},[d,ap,O]),(0,i.useEffect)(()=>{r&&1&&eS(`entity:${r}`)},[r]);let av=d?.entities.find(a=>a.name===r)??null,aw=b.split("/").pop()||"…",ax=Array.isArray(K)?K:[],ay=P.length+ax.length,az=[{id:"entities",label:"Entities",icon:"▭"},{id:"relations",label:"Relations",icon:"⟷"},{id:"notes",label:"Notes",icon:"✎",badge:void 0},{id:"issues",label:"Issues",icon:(0,h.jsx)(em,{}),badge:ay||void 0}],aA=a=>y===a?"":"hidden md:block",aB=()=>{d&&navigator.clipboard?.writeText(function(a){let b=["erDiagram"],c=" ",d=new Set;for(let e of a.relationships??[]){if(!e?.from||!e?.to)continue;let a=ak[e.cardinality]??ak["1:N"];b.push(`${c}${am(e.from)} ${a} ${am(e.to)} : ${ao(e.label??"")}`),d.add(e.from),d.add(e.to)}let e=new Set;for(let f of a.entities??[]){if(!f?.name||e.has(f.name))continue;e.add(f.name);let a=(f.attributes??[]).filter(a=>a?.name);if(0===a.length){d.has(f.name)||b.push(`${c}${am(f.name)}`);continue}for(let d of(b.push(`${c}${am(f.name)} {`),a))b.push(`${c}${c}${function(a){let b=[];"pk"===a.key&&b.push("PK"),"uk"===a.key&&b.push("UK"),a.references&&b.push("FK");let c=[],d=V(a);d.length&&c.push(`stateOf ${d.join(", ")}`),a.description&&c.push(a.description);let e=[an(a.type??"","unknown"),an(a.name,"unnamed")];return b.length&&e.push(b.join(", ")),c.length&&e.push(ao(c.join(" — "))),e.join(" ")}(d)}`);b.push(`${c}}`)}return b.join("\n")}(d)).then(()=>v("mermaid copied"))};return(0,h.jsxs)("div",{className:"app-shell dock-offset flex flex-col overflow-hidden bg-gray-950 text-gray-200",onClick:()=>C&&D(!1),children:[(0,h.jsxs)("header",{className:"relative z-40 flex items-center gap-2 border-b border-gray-800 bg-gray-900 px-2 py-1.5 text-xs md:px-3 md:py-2",children:[(0,h.jsx)("span",{className:"font-semibold text-blue-300",children:"ERD"}),(0,h.jsx)(el,{}),(0,h.jsxs)("span",{className:"min-w-0 flex-1 truncate text-gray-400",title:b,children:[d?.settings.name??aw,(0,h.jsxs)("span",{className:"hidden text-gray-600 lg:inline",children:[" · ",aw]})]}),(0,h.jsx)("span",{className:"inline-flex shrink-0 overflow-hidden rounded border border-gray-700",role:"group","aria-label":"Notation",children:[["crowsfoot","▤","Crow's foot — attributes listed inside the entity box"],["chen","◇","Chen — attributes as ovals, relationships as diamonds"]].map(([a,c,d])=>(0,h.jsx)("button",{title:d,"aria-label":d,"aria-pressed":j===a,onClick:()=>(a=>{if(a!==j){try{localStorage.setItem(fj,a)}catch{}k(a),g(fl(b,a)),q(a=>a+1)}})(a),className:`px-2.5 py-1.5 text-sm leading-none md:px-2 md:py-1 ${j===a?"bg-blue-900/60 text-blue-200":"bg-gray-800 text-gray-400 hover:bg-gray-700"}`,children:c},a))}),(0,h.jsxs)("div",{className:"hidden shrink-0 items-center gap-2 md:flex",children:[(0,h.jsx)("button",{className:fo,onClick:Z,title:"Forget the dragged positions and lay the board out again",children:"⤢ Arrange"}),(0,h.jsx)("button",{className:fo,onClick:af,title:"Check the state machines beside this document against it",children:"Check links"}),(0,h.jsx)("button",{className:fo,onClick:aB,children:"Copy mermaid"}),(0,h.jsx)("button",{className:fo,onClick:()=>F(a=>!a),"aria-pressed":!E,title:E?"Show the panel":"Hide the panel — the board takes the full width",children:E?"⟨ Panel":"Panel ⟩"})]}),(0,h.jsxs)("div",{className:"relative shrink-0 md:hidden",children:[(0,h.jsx)("button",{className:"rounded border border-gray-700 bg-gray-800 px-3 py-1.5 text-sm leading-none text-gray-200","aria-label":"More actions","aria-expanded":C,onClick:a=>{a.stopPropagation(),D(a=>!a)},children:"⋯"}),C&&(0,h.jsx)("div",{className:"absolute right-0 top-full z-50 mt-1 w-56 overflow-hidden rounded-lg border border-gray-700 bg-gray-900 py-1 shadow-xl",children:[["⤢ Arrange the board",Z],["Check links to the machines",af],["Copy as mermaid",aB]].map(([a,b])=>(0,h.jsx)("button",{className:"block w-full px-4 py-3 text-left text-sm text-gray-200 hover:bg-gray-800",onClick:()=>{D(!1),b()},children:a},a))})]})]}),(0,h.jsxs)("div",{className:"relative flex min-h-0 flex-1",children:[(0,h.jsxs)("div",{ref:G,className:"relative min-w-0 flex-1 overflow-hidden",children:[d&&(0,h.jsx)(eJ,{what:"diagram",resetKey:d,children:(0,h.jsx)(bN,{definition:d,notation:j,positions:O,viewport:n,onViewportChange:o,selection:r,readOnly:l,errorElements:R,fitKey:p,onSelect:s,onClearSelection:()=>s(null),onEntityMove:U,onOpenMachine:ag,emptyHint:"No entities yet — add one in the panel, or let an agent call add_entity."})}),d&&(0,h.jsx)(ff,{docPath:b||null,kind:"erd",viewport:n,setViewport:o,boxes:at,boardRef:G,focus:ar}),(0,h.jsxs)("div",{className:`pointer-events-none absolute left-2 top-2 flex max-w-[75%] items-center gap-1.5 rounded bg-gray-950/70 px-1.5 py-0.5 text-[11px] ${"warn"===t.tone?"text-amber-300":"text-gray-500"}`,role:"status",children:[(0,h.jsx)("span",{className:`h-1.5 w-1.5 shrink-0 rounded-full ${"warn"===t.tone?"bg-amber-400":"bg-emerald-500"}`}),(0,h.jsxs)("span",{className:`truncate transition-opacity duration-500 ${w&&"ok"===t.tone?"opacity-0":"opacity-100"}`,children:[t.text,I>1?` \xb7 ${I} in the room`:""]})]}),(0,h.jsxs)("div",{className:"absolute bottom-3 right-3 flex flex-col overflow-hidden rounded-lg border border-gray-700 bg-gray-900/90 shadow-lg backdrop-blur",children:[(0,h.jsx)("button",{title:l?"Shapes are locked: dragging moves the view. Tap to unlock.":"Lock the shapes in place, so dragging only moves the view","aria-label":"Lock shapes in place","aria-pressed":l,onClick:()=>{let a=!l;m(a);try{localStorage.setItem(fk,a?"1":"0")}catch{}v(a?"shapes locked — a drag anywhere moves the view":"shapes unlocked — drag one to move it")},className:`flex h-10 w-10 items-center justify-center border-b border-gray-800 hover:bg-gray-800 md:h-8 md:w-8 ${l?"bg-blue-950/60 text-blue-300":"text-gray-400"}`,children:(0,h.jsx)(eK,{locked:l})}),[["+","Zoom in",()=>ai(1.25)],["−","Zoom out",()=>ai(.8)],["⛶","Fit the whole diagram",()=>q(a=>a+1)]].map(([a,b,c])=>(0,h.jsx)("button",{title:b,"aria-label":b,onClick:c,className:"h-10 w-10 border-b border-gray-800 text-base leading-none text-gray-200 last:border-b-0 hover:bg-gray-800 md:h-8 md:w-8 md:text-sm",children:a},b))]}),av&&!A&&(0,h.jsxs)("button",{className:"absolute bottom-3 left-1/2 max-w-[60%] -translate-x-1/2 truncate rounded-full border border-blue-500/60 bg-gray-900/95 px-4 py-2 text-sm text-blue-200 shadow-lg md:hidden",onClick:()=>{z("entities"),B(!0)},children:["✎ ",av.name]})]}),A&&(0,h.jsx)("div",{className:"fixed inset-0 z-20 bg-black/50 md:hidden",onClick:H.close,"aria-hidden":"true"}),d&&(0,h.jsxs)("aside",{style:H.sheetStyle,className:`safe-x fixed inset-x-0 bottom-0 z-30 flex h-[var(--sheet-h)] flex-col overflow-hidden rounded-t-2xl border-t border-gray-800 bg-gray-900 shadow-2xl transition-[transform,height] duration-200 ease-out ${A?"translate-y-0":"pointer-events-none translate-y-full"} md:pointer-events-auto md:static md:z-auto md:h-auto md:w-80 md:translate-y-0 md:rounded-none md:border-l md:border-t-0 md:shadow-none md:transition-none ${E?"md:hidden":""}`,children:[(0,h.jsxs)("div",{className:"md:hidden",...H.zoneProps,children:[(0,h.jsx)("div",{className:"flex justify-center pb-1 pt-2",children:(0,h.jsx)("span",{className:"h-1.5 w-12 rounded-full bg-gray-600"})}),(0,h.jsxs)("div",{className:"flex items-center justify-between border-b border-gray-800 px-4 pb-2",children:[(0,h.jsx)("h2",{className:"text-sm font-semibold text-gray-300",children:az.find(a=>a.id===y)?.label}),(0,h.jsx)("button",{onClick:H.close,className:"-mr-2 px-3 py-2 text-lg text-gray-400","aria-label":"Close panel",children:"✕"})]})]}),(0,h.jsxs)("div",{className:"touch-targets dock-offset flex-1 overflow-y-auto overscroll-contain p-3",children:[(0,h.jsxs)("section",{className:aA("entities"),children:[(0,h.jsx)("div",{className:fp,style:{marginTop:0},children:"Entities"}),(0,h.jsx)("div",{className:"flex flex-wrap gap-1",children:d.entities.map(a=>(0,h.jsx)("button",{className:`${fo} ${r===a.name?"border-blue-500 text-blue-300":""}`,onClick:()=>s(a.name),children:a.name},a.name))}),(0,h.jsx)(fs,{fields:[{name:"name",placeholder:"new entity"}],submit:"+ Entity",onSubmit:a=>{T(b=>ad(b,{name:a.name.trim()})),s(a.name.trim())}}),av&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsxs)("div",{className:`${fp} flex items-center justify-between gap-2`,children:[(0,h.jsx)("span",{className:"truncate text-sm normal-case tracking-normal text-gray-200",children:av.name}),(0,h.jsx)("button",{className:`${fo} normal-case tracking-normal`,onClick:()=>al(av.name),title:"Bring this entity to the middle of the board at a readable size",children:"◎ Show on board"})]}),(0,h.jsxs)("label",{className:"mb-1 flex items-center gap-2 text-[11px] text-gray-400",title:"Exists only through another entity (an order line, without its order). Chen draws it as a double rectangle.",children:[(0,h.jsx)("input",{type:"checkbox",checked:!!av.weak,onChange:a=>T(b=>ae(b,av.name,{weak:a.target.checked}))}),"weak entity"]}),(av.attributes??[]).map(a=>(0,h.jsxs)("div",{className:"flex items-center justify-between gap-2 py-0.5 font-mono text-[11px]",children:[(0,h.jsxs)("span",{className:a.stateOf?"text-blue-300":"text-gray-300",children:[a.name," : ",a.type,(0,h.jsxs)("span",{className:"text-gray-500",children:[a.key?` ${a.key.toUpperCase()}`:"",a.references?` → ${a.references}`:"",a.stateOf?` ◉ ${[a.stateOf].flat().join(", ")}`:""]})]}),(0,h.jsx)("button",{className:"text-gray-500 hover:text-red-400","aria-label":`Remove ${a.name}`,onClick:()=>T(b=>(function(a,b,c){let d=aa(a),e=ab(d,b),f=e.attributes?.length??0;if(e.attributes=(e.attributes??[]).filter(a=>a.name!==c),e.attributes.length===f)throw Error(`Attribute '${b}.${c}' not found.`);return d})(b,av.name,a.name)),children:"✕"})]},a.name)),(0,h.jsx)(fs,{fields:[{name:"name",placeholder:"attribute"},{name:"type",placeholder:"type",initial:"string"},{name:"key",options:["","pk","uk"]},{name:"references",placeholder:"references Entity.attr"},{name:"stateOf",placeholder:"stateOf Machine"}],submit:"+ Attribute",onSubmit:a=>T(b=>(function(a,b,c){if(!c.name?.trim())throw Error("An attribute needs a name.");let d=aa(a),e=ab(d,b);if(e.attributes??=[],e.attributes.some(a=>a.name===c.name))throw Error(`Attribute '${b}.${c.name}' already exists.`);return e.attributes.push(ac({...c})),d})(b,av.name,{name:a.name.trim(),type:a.type.trim()||"string",key:"pk"===a.key||"uk"===a.key?a.key:void 0,references:a.references.trim()||void 0,stateOf:a.stateOf.trim()||void 0}))}),(0,h.jsxs)("button",{className:`${fo} mt-2 text-red-300`,onClick:()=>{T(a=>{var b;let c;return b=av.name,ab(c=aa(a),b),c.entities=c.entities.filter(a=>a.name!==b),c.relationships=c.relationships.filter(a=>a.from!==b&&a.to!==b),c}),s(null)},children:[(0,h.jsx)(ed,{name:"trash"})," Delete ",av.name]})]})]}),(0,h.jsxs)("section",{className:aA("relations"),children:[(0,h.jsx)("div",{className:`${fp} max-md:mt-0`,children:"Relationships"}),0===d.relationships.length&&(0,h.jsx)("div",{className:"py-0.5 text-[11px] text-gray-600",children:"None yet."}),d.relationships.map((a,b)=>(0,h.jsxs)("div",{className:"flex items-center justify-between gap-2 py-0.5 text-[11px] text-gray-300",children:[(0,h.jsxs)("span",{children:[a.from," ",(0,h.jsx)("span",{className:"text-gray-500",children:a.cardinality})," ",a.to,a.label?(0,h.jsxs)("span",{className:"text-gray-500",children:[" : ",a.label]}):null]}),(0,h.jsx)("button",{className:"text-gray-500 hover:text-red-400","aria-label":"Remove relationship",onClick:()=>T(b=>(function(a,b,c,d){let e=aa(a),f=e.relationships.length;if(e.relationships=e.relationships.filter(a=>a.from!==b||a.to!==c||void 0!==d&&a.label!==d),e.relationships.length===f)throw Error(`No relationship from '${b}' to '${c}'${void 0===d?"":` labelled '${d}'`}.`);return e})(b,a.from,a.to,a.label)),children:"✕"})]},b)),d.entities.length>0&&(0,h.jsx)(fs,{fields:[{name:"from",options:d.entities.map(a=>a.name)},{name:"cardinality",options:[...W],initial:"1:N"},{name:"to",options:d.entities.map(a=>a.name)},{name:"label",placeholder:"label (a verb)"}],submit:"+ Relationship",onSubmit:a=>T(b=>(function(a,b){let c=aa(a);if(ab(c,b.from),ab(c,b.to),!W.includes(b.cardinality))throw Error(`Cardinality '${b.cardinality}' is not one of ${W.join(", ")}.`);return c.relationships.push(ac({...b})),c})(b,{from:a.from,to:a.to,cardinality:a.cardinality,label:a.label.trim()||void 0}))})]}),(0,h.jsxs)("section",{className:aA("notes"),children:[(0,h.jsx)("div",{className:`${fp} max-md:mt-0`,children:"Notes"}),(0,h.jsx)("p",{className:"mb-1 text-[11px] text-gray-600",children:"Saved in the document, for whoever opens it next — you, or an agent (it reads them with get_notes)."}),(0,h.jsx)(fr,{label:"On this diagram",value:d.settings.notes??"",placeholder:"What was discussed, what is still open…",onSave:a=>T(b=>(function(a,b){let c=aa(a);for(let a of["description","notes"]){let d=b[a];void 0!==d&&(d.trim()?c.settings[a]=d:delete c.settings[a])}return c})(b,{notes:a}))},"diagram"),av?(0,h.jsx)(fr,{label:`On ${av.name}`,value:av.notes??"",placeholder:`A question or a decision about ${av.name}…`,onSave:a=>T(b=>ae(b,av.name,{notes:a}))},`entity:${av.name}`):(0,h.jsx)("p",{className:"mt-2 text-[11px] text-gray-600",children:"Select an entity to leave a note on it."}),d.entities.some(a=>a.notes?.trim())&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("div",{className:fp,children:"Entities with notes"}),(0,h.jsx)("div",{className:"flex flex-wrap gap-1",children:d.entities.filter(a=>a.notes?.trim()).map(a=>(0,h.jsx)("button",{className:`${fo} ${r===a.name?"border-blue-500 text-blue-300":""}`,onClick:()=>s(a.name),children:a.name},a.name))})]})]}),(0,h.jsxs)("section",{className:aA("issues"),children:[(0,h.jsx)("div",{className:`${fp} max-md:mt-0 ${0===ay&&!K?"md:hidden":""}`,children:"Issues"}),P.map((a,b)=>(0,h.jsxs)("div",{className:"py-0.5 text-[11px] text-red-300",children:["[",a.ruleId,"] ",a.message]},`p${b}`)),ax.map((a,b)=>(0,h.jsxs)("div",{className:"py-0.5 text-[11px] text-amber-300",children:["[",a.ruleId,"] ",a.message]},`l${b}`)),"none"===K&&(0,h.jsx)("div",{className:"py-0.5 text-[11px] text-amber-300",children:"No state machine (.smdf.json) sits beside this document, so there was nothing to check it against."}),0===ay&&"none"!==K&&(0,h.jsx)("div",{className:`py-0.5 text-[11px] ${K?"text-green-400":"text-gray-600 md:hidden"}`,children:K?"Every name the machines use resolves.":"The document is valid. “Check links” (⋯) holds the state machines beside it against it."})]})]})]})]}),(0,h.jsx)("nav",{className:"dock-safe safe-x fixed inset-x-0 bottom-0 z-40 flex border-t border-gray-800 bg-gray-900/95 backdrop-blur-md md:hidden",children:az.map(a=>{let b=A&&y===a.id;return(0,h.jsxs)("button",{onClick:()=>{var b;return b=a.id,void(A&&y===b?H.close():B(!0),z(b))},"aria-pressed":b,className:`relative flex h-14 flex-1 flex-col items-center justify-center gap-0.5 text-[11px] transition-colors ${b?"text-blue-400":"text-gray-500"}`,children:[(0,h.jsx)("span",{className:"flex h-4 items-center text-base leading-none",children:a.icon}),(0,h.jsx)("span",{children:a.label}),void 0!==a.badge&&(0,h.jsx)("span",{className:"absolute right-1/2 top-1 min-w-[16px] translate-x-5 rounded-full border border-red-900/80 bg-red-950/80 px-1 text-[10px] leading-4 text-red-200",children:a.badge}),b&&(0,h.jsx)("span",{className:"absolute inset-x-4 top-0 h-0.5 rounded-full bg-blue-400"})]},a.id)})})]})}function fr({label:a,value:b,placeholder:c,onSave:d}){let[e,f]=(0,i.useState)(b),[g,j]=(0,i.useState)(b),[k,l]=(0,i.useState)(!1);b!==g&&(j(b),k||f(b));let m=(0,i.useRef)(null),n=a=>{m.current&&clearTimeout(m.current),m.current=null,a!==b&&d(a)};return(0,h.jsxs)("label",{className:"mt-2 block",children:[(0,h.jsx)("span",{className:"text-[11px] text-gray-500",children:a}),(0,h.jsx)("textarea",{className:`${fn} h-24 resize-y leading-snug`,placeholder:c,value:e,onChange:a=>{let b=a.target.value;f(b),m.current&&clearTimeout(m.current),m.current=setTimeout(()=>n(b),900)},onFocus:()=>l(!0),onBlur:()=>{l(!1),n(e)}})]})}function fs({fields:a,submit:b,onSubmit:c}){let d=()=>Object.fromEntries(a.map(a=>[a.name,a.initial??a.options?.[0]??""])),[e,f]=(0,i.useState)(d),g=a[0];return(0,h.jsxs)("form",{className:"mt-1 grid grid-cols-2 gap-1",onSubmit:b=>{b.preventDefault();let h={...d(),...e};h[g.name]?.trim()&&(c(h),f(b=>Object.fromEntries(a.map(a=>[a.name,a.options?b[a.name]??"":a.initial??""]))))},children:[a.map(a=>a.options?(0,h.jsx)("select",{className:fn,"aria-label":a.name,value:e[a.name]??"",onChange:b=>f(c=>({...c,[a.name]:b.target.value})),children:a.options.map(b=>(0,h.jsx)("option",{value:b,children:b||`(${a.name})`},b))},a.name):(0,h.jsx)("input",{className:fn,"aria-label":a.name,placeholder:a.placeholder,value:e[a.name]??"",onChange:b=>f(c=>({...c,[a.name]:b.target.value}))},a.name)),(0,h.jsx)("button",{type:"submit",className:`${fo} ${1===a.length?"":"col-span-2"}`,children:b})]})}let ft="w-full rounded border border-gray-700 bg-gray-950 px-2 py-1 text-xs text-gray-200 placeholder:text-gray-600",fu="rounded border border-gray-700 bg-gray-800 px-2 py-1 text-xs text-gray-200 hover:bg-gray-700",fv="mb-1 mt-3 text-[11px] font-semibold uppercase tracking-wide text-gray-500";function fw({id:a,fields:b,submit:c,onSubmit:d,reset:e=!1,required:f}){let g=()=>Object.fromEntries(b.map(a=>[a.name,a.initial??(!a.checkbox&&(a.options?a.options[0]??"":""))])),[j,k]=(0,i.useState)(g),l=(a,b)=>k(c=>({...c,[a]:b}));return(0,h.jsxs)("form",{className:"mt-1 grid grid-cols-2 gap-1",onSubmit:a=>{a.preventDefault();let c={...g(),...j};!(f??[]).some(a=>!String(c[a]??"").trim())&&(d(c),e&&k(a=>Object.fromEntries(b.map(b=>[b.name,b.options||b.checkbox?a[b.name]??"":b.initial??""]))))},children:[b.map(b=>{let c=b.label??b.name;if(b.checkbox)return(0,h.jsxs)("label",{className:"flex items-center gap-2 text-[11px] text-gray-400",children:[(0,h.jsx)("input",{type:"checkbox",checked:!!j[b.name],onChange:a=>l(b.name,a.target.checked)}),c]},b.name);if(b.options)return(0,h.jsx)("select",{className:`${ft} ${b.wide?"col-span-2":""}`,"aria-label":c,title:c,value:String(j[b.name]??""),onChange:a=>l(b.name,a.target.value),children:b.options.map(a=>(0,h.jsx)("option",{value:a,children:a||`(${c})`},a))},b.name);let d=b.suggest?.length?`${a}-${b.name}`:void 0;return(0,h.jsxs)("span",{className:b.wide?"col-span-2":"",children:[(0,h.jsx)("input",{className:ft,"aria-label":c,title:c,placeholder:b.placeholder??c,list:d,value:String(j[b.name]??""),onChange:a=>l(b.name,a.target.value)}),d&&(0,h.jsx)("datalist",{id:d,children:b.suggest.map(a=>(0,h.jsx)("option",{value:a},a))})]},b.name)}),(0,h.jsx)("button",{type:"submit",className:`${fu} col-span-2`,children:c})]})}function fx({kind:a,size:b=16}){return(0,h.jsxs)("svg",{width:b,height:b,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",className:"shrink-0",children:["erd"===a&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("rect",{x:"4",y:"4.5",width:"16",height:"15",rx:"1.5"}),(0,h.jsx)("path",{d:"M4 9h16M8 13h8M8 16.5h6"})]}),"machine"===a&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("rect",{x:"2.5",y:"4",width:"8",height:"6",rx:"2.5"}),(0,h.jsx)("rect",{x:"13.5",y:"14",width:"8",height:"6",rx:"2.5"}),(0,h.jsx)("path",{d:"M6.5 10v4.5a2.5 2.5 0 0 0 2.5 2.5h4.5"}),(0,h.jsx)("path",{d:"M11.5 15l2 2-2 2"})]}),"sequence"===a&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("path",{d:"M6 4v16M18 4v16",strokeDasharray:"2 2.2"}),(0,h.jsx)("path",{d:"M6 9h11M15 7l2 2-2 2"}),(0,h.jsx)("path",{d:"M18 15H7M9 13l-2 2 2 2"})]}),"system"===a&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("rect",{x:"3",y:"3.5",width:"7",height:"6",rx:"1.5"}),(0,h.jsx)("rect",{x:"14",y:"3.5",width:"7",height:"6",rx:"1.5"}),(0,h.jsx)("rect",{x:"8.5",y:"14.5",width:"7",height:"6",rx:"1.5"}),(0,h.jsx)("path",{d:"M10 6.5h4M7 9.5l3 5M17 9.5l-3 5"})]}),"link"===a&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("path",{d:"M10 14a4 4 0 0 0 5.7 0l3-3a4 4 0 0 0-5.7-5.7l-1.2 1.2"}),(0,h.jsx)("path",{d:"M14 10a4 4 0 0 0-5.7 0l-3 3a4 4 0 0 0 5.7 5.7l1.2-1.2"})]}),"actor"===a&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("circle",{cx:"12",cy:"7.5",r:"3.5"}),(0,h.jsx)("path",{d:"M5 20a7 7 0 0 1 14 0"})]})]})}let fy=["text-sky-300","text-emerald-300","text-amber-300","text-rose-300","text-violet-300","text-cyan-300","text-lime-300","text-orange-300"],fz=a=>`seq-read-${a.kind}-${a.id}`;function fA({definition:a,selection:b,issues:c,onSelect:d,onShowInDiagram:e}){let f=new Map(a.participants.map((a,b)=>[a.name,fy[b%fy.length]])),g=az(a),i=g.filter(a=>null===a.fragment),j=(a.fragments??[]).map((a,b)=>({f:a,fi:b,rows:g.filter(a=>a.fragment===b)})),k=(a,c)=>b?.kind===a&&b.id===c,l=a=>(0,h.jsx)("span",{className:`font-semibold ${f.get(a)??"text-gray-300"}`,children:a||"?"}),m=(a,b)=>{let f={kind:"message",id:a},g=c.get(`message:${a}`)??[],i=g.some(a=>"error"===a.severity)?"error":g.length?"warning":null,j=k("message",a);return(0,h.jsx)("li",{id:fz(f),className:"scroll-mt-16 scroll-mb-24",children:(0,h.jsxs)("div",{role:"button",tabIndex:0,"aria-pressed":j,onClick:()=>d(f),onKeyDown:a=>("Enter"===a.key||" "===a.key)&&(a.preventDefault(),d(f)),className:`flex gap-3 rounded-lg border-l-2 px-3 py-2.5 ${j?"bg-blue-950/60 ring-1 ring-blue-500/60":"hover:bg-gray-900"} ${"error"===i?"border-red-500":"warning"===i?"border-amber-400":"border-transparent"}`,children:[(0,h.jsx)("span",{className:"mt-0.5 flex h-6 min-w-6 shrink-0 items-center justify-center rounded-full border border-gray-700 bg-gray-900 px-1 font-mono text-[11px] text-gray-300",children:a}),(0,h.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,h.jsxs)("div",{className:"text-[13px] leading-5 text-gray-400",children:[l(b.from),b.from===b.to?(0,h.jsx)("span",{children:" to itself"}):(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("span",{className:"px-1.5 text-gray-500",children:b.reply?"⇠":"→"}),l(b.to)]}),b.reply&&(0,h.jsx)("span",{className:"ml-2 text-[11px] text-gray-500",children:"reply"}),b.optional&&(0,h.jsx)("span",{className:"ml-2 rounded border border-gray-700 px-1 text-[11px] text-gray-400",children:"optional"})]}),(0,h.jsx)("div",{className:`mt-0.5 break-words text-[15px] leading-6 ${b.reply?"text-gray-300":"text-gray-100"}`,children:b.label||(0,h.jsx)("span",{className:"text-gray-500",children:"no label"})}),(b.event||b.state||b.carries)&&(0,h.jsxs)("div",{className:"mt-1.5 flex flex-wrap items-center gap-x-2 gap-y-1 text-[12px] leading-5",children:[b.event&&(0,h.jsx)("span",{className:"rounded border border-blue-500/50 bg-blue-950/50 px-1.5 font-mono text-blue-200",children:b.event}),b.event&&b.machine&&(0,h.jsxs)("span",{className:"text-gray-400",children:["on ",b.machine]}),b.state&&(0,h.jsxs)("span",{className:"text-emerald-300",children:["→ ",b.state]}),b.carries&&(0,h.jsxs)("span",{className:"text-gray-400",children:["carries ",b.carries]})]}),g.map((a,b)=>(0,h.jsx)("p",{className:`mt-1.5 text-[12px] leading-5 ${"error"===a.severity?"text-red-300":"text-amber-300"}`,children:a.text},b)),j&&(0,h.jsx)("button",{className:"mt-2 rounded border border-gray-700 bg-gray-800 px-3 py-1.5 text-[12px] text-gray-200",onClick:a=>{a.stopPropagation(),e(f)},children:"Show in the diagram"})]})]})},a)};return(0,h.jsx)("div",{className:"h-full overflow-y-auto overscroll-contain",children:(0,h.jsxs)("div",{className:"mx-auto max-w-2xl px-4 pb-28 pt-10",children:[a.participants.length>0&&(0,h.jsx)("ul",{className:"mb-4 flex flex-wrap gap-2","aria-label":"Participants",children:a.participants.map(a=>{let b={kind:"participant",id:a.name},e=a.actor?"actor":a.object?"object":a.service?"service":"",f=c.get(`participant:${a.name}`)??[];return(0,h.jsx)("li",{id:fz(b),children:(0,h.jsxs)("button",{onClick:()=>d(b),"aria-pressed":k("participant",a.name),title:f.map(a=>a.text).join("\n")||void 0,className:`rounded-full border px-3 py-1 text-[13px] ${k("participant",a.name)?"border-blue-500 bg-blue-950/60":"border-gray-700 bg-gray-900"} ${f.length?"ring-1 ring-amber-400/70":""}`,children:[l(a.name),e&&(0,h.jsx)("span",{className:"ml-1.5 text-[11px] text-gray-400",children:e})]})},a.name)})}),0===g.length&&(0,h.jsx)("p",{className:"text-sm text-gray-400",children:"No messages yet — add them in the panel, or let an agent write the scenario."}),(0,h.jsx)("ol",{className:"flex flex-col gap-1",children:i.map(({ref:a,message:b})=>m(a,b))}),j.map(({f:a,fi:b,rows:c})=>(0,h.jsxs)("section",{className:"mt-5 rounded-xl border border-indigo-500/50 bg-indigo-950/20 p-1.5",children:[(0,h.jsxs)("header",{className:"px-3 pb-1.5 pt-2",children:[(0,h.jsxs)("div",{className:"text-[12px] text-indigo-200",children:[(0,h.jsx)("span",{className:"font-semibold uppercase tracking-wide",children:a.kind}),(0,h.jsxs)("span",{className:"text-indigo-300",children:[" · after ",a.after]})]}),(0,h.jsx)("div",{className:"mt-0.5 break-words text-[14px] leading-5 text-gray-100",children:a.label})]}),0===c.length?(0,h.jsx)("p",{className:"px-3 pb-2 text-[12px] text-gray-400",children:"No messages in this fragment."}):(0,h.jsx)("ol",{className:"flex flex-col gap-1",children:c.map(({ref:a,message:b})=>m(a,b))})]},b))]})})}async function fB(a){try{let b=await fetch(`/api/file${(0,ek.docQuery)(a)}`,{cache:"no-store"}),c=await b.json();if(!b.ok||c.error)return{path:a??"",content:null,exists:!1,error:c.error??`HTTP ${b.status}`};return{path:c.path??a??"",content:c.content??null,exists:!!c.exists,mtime:c.mtime}}catch(b){return{path:a??"",content:null,exists:!1,error:b instanceof Error?b.message:String(b)}}}class fC extends Error{constructor(a){super(`${a.split("/").pop()} changed on disk since it was read`)}}async function fD(a,b,c){let d=await fetch(`/api/file${(0,ek.docQuery)(a)}`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({content:JSON.stringify(b,null,2)+"\n",...void 0!==c?{mtime:c}:{}})}),e=await d.json().catch(()=>({}));if(409===d.status)throw new fC(a);if(!d.ok)throw Error(e?.error??`HTTP ${d.status}`);return e?.mtime}async function fE(a){let b=await fB(a),c={path:b.path||a,def:null,members:[],absOf:{},wrapped:{},mtimes:{}};if(b.error)return{...c,error:b.error};if(!b.exists||!b.content)return{...c,error:`${a} does not exist`};let d=null;try{let a=aq(JSON.parse(b.content));aR(a)&&(d=a)}catch{}if(!d)return{...c,error:`${b.path} is not a readable system definition`};let e={},f={},g={[b.path]:b.mtime??0},h=await Promise.all((d.members??[]).filter(a=>a?.path).map(async a=>{let c=aV(b.path,a.path);e[a.path]=c;let d=aS(a.path),h=await fB(c);if(h.error)return{path:a.path,kind:d,def:null,error:h.error};if(!h.exists||!h.content)return{path:a.path,kind:d,def:null,error:"the file does not exist"};g[a.path]=h.mtime??0;try{let b=JSON.parse(h.content);if("machine"===d&&b&&(b.stateMachine||b.StateMachine))return f[a.path]=!0,{path:a.path,kind:d,def:aq(b.stateMachine??b.StateMachine)};return{path:a.path,kind:d,def:aq(b)}}catch(b){return{path:a.path,kind:d,def:null,error:`not JSON: ${b instanceof Error?b.message:String(b)}`}}}));return{path:b.path,def:d,members:h,absOf:e,wrapped:f,mtimes:g}}function fF(){window.dispatchEvent(new Event(eN))}function fG(a){let[b,c]=(0,i.useState)(null),[d,e]=(0,i.useState)(0),f=(0,i.useCallback)(()=>e(a=>a+1),[]);return(0,i.useEffect)(()=>(window.addEventListener(eN,f),()=>window.removeEventListener(eN,f)),[f]),(0,i.useEffect)(()=>{if(!a)return;let b=!0;return fE(a).then(d=>b&&c({for:a,system:d})),()=>{b=!1}},[a,d]),{system:a&&b?.for===a?b.system:null,reload:f}}function fH(a,b){if(!a||!b)return null;for(let[c,d]of Object.entries(a.absOf))if(d===b)return c;return null}async function fI(a,b,c,d){let{bridgeUrl:e}=await eu();if(!e)return;let f=dJ({url:e,role:"web",docId:a,name:"web-reconcile",autoResync:!1});try{let a=await Promise.race([f.join(),new Promise((a,b)=>setTimeout(()=>b(Error("join timeout")),3e3))]),e=a.snapshot?.def,g=a=>(function(a){let b=JSON.stringify(a),c=0x811c9dc5;for(let a=0;a<b.length;a++)c^=b.charCodeAt(a),c=Math.imul(c,0x1000193);return(c>>>0).toString(16).padStart(8,"0")})(a);if(e&&g(e)===g(b))return;await new Promise(a=>{let h=f.on("ack",()=>{h(),a()});d&&e&&g(e)===g(d.from)?f.emitPatch(d.ops,c):f.emitFull(b,c),setTimeout(a,800)})}catch{}finally{f.disconnect()}}async function fJ(a,b){let c=[],d=[],e=[],f=async(a,b)=>{try{await b(),c.push(a)}catch(b){b instanceof fC?e.push(a):d.push(`${a}: ${b instanceof Error?b.message:String(b)}`)}};for(let c of b.machines){let b=a.absOf[c.member];b&&c.ops.length&&await f(c.member,async()=>{let d=a.wrapped[c.member]?{stateMachine:c.def}:c.def,e=await fD(b,d,a.mtimes[c.member]),f=a.members.find(a=>a.path===c.member)?.def;await fI(b,c.def,e,{from:f,ops:c.ops})})}for(let c of b.erds){let b=a.absOf[c.member];b&&await f(c.member,async()=>{let d=await fD(b,c.def,a.mtimes[c.member]);await fI(b,c.def,d)})}return b.system&&await f(a.path.split("/").pop()??a.path,async()=>{let c=await fD(a.path,b.system.def,a.mtimes[a.path]);await fI(a.path,b.system.def,c)}),fF(),{written:c,failed:d,conflicts:e}}async function fK(a){let b={result:null,written:[],failed:[],conflicts:[]};for(let c=0;c<2;c+=1){let d=await fE(a);if(!d.def)return{...b,failed:[d.error??"the system could not be read"],retried:c>0};let e=bd(d.def,d.members);if(!e.count)return{...b,result:e,conflicts:c?b.conflicts:[],retried:c>0};let f=await fJ(d,e);if(b={result:e,written:[...b.written,...f.written],failed:f.failed,conflicts:f.conflicts},!f.conflicts.length)return{...b,retried:c>0}}return{...b,retried:!0}}let fL="stateloom.sequence.view",fM=["","actor","service","object"],fN=a=>"string"==typeof a?a.trim():"",fO=a=>fN(a).split(",").map(a=>a.trim()).filter(Boolean);function fP(a){return{from:fN(a.from),to:fN(a.to),label:fN(a.label),event:fN(a.event),machine:fN(a.machine),carries:fN(a.carries),state:fN(a.state),description:fN(a.description),optional:!!a.optional||void 0,reply:!!a.reply||void 0}}function fQ(){let a,b,c,d=(0,ek.useRequestedDoc)(),e=eQ("system"),{system:f}=fG(e),g=eT(),[j,k]=(0,i.useState)(""),[l,m]=(0,i.useState)(null),[n,o]=(0,i.useState)({...M}),[p,q]=(0,i.useState)(void 0),[r,s]=(0,i.useState)(null),[t,u]=(0,i.useState)({text:"loading…",tone:"ok"}),v=(0,i.useCallback)((a,b="ok")=>u({text:a,tone:b}),[]),[w,x]=(0,i.useState)(!1);(0,i.useEffect)(()=>{let a=setTimeout(()=>x(!0),4e3);return()=>{clearTimeout(a),x(!1)}},[t]);let[y,z]=(0,i.useState)("messages"),[A,B]=(0,i.useState)(!1),[C,D]=(0,i.useState)(!1),[E,F]=(0,i.useState)(!1),[G,H]=(0,i.useState)("diagram"),I=(0,i.useRef)("diagram");(0,i.useEffect)(()=>{let a=null;try{a=window.localStorage.getItem(fL)}catch{}let b="list"===a||"diagram"===a?a:window.matchMedia("(max-width: 767px)").matches?"list":"diagram";I.current=b,H(b)},[]);let J=(0,i.useCallback)(a=>{I.current=a,H(a);try{window.localStorage.setItem(fL,a)}catch{}},[]),K=(0,i.useRef)(null),L=eL({onClose:()=>B(!1),restVh:62,tallVh:92}),[O,P]=(0,i.useState)(0),R=(0,i.useRef)(null),T=(0,i.useRef)(!0),U=(0,i.useRef)(-1);(0,i.useEffect)(()=>{let a=!1,b=null;return(async()=>{let c=await (await fetch(`/api/file${(0,ek.docQuery)(d)}`,{cache:"no-store"})).json();if(a)return;if(c.error)return v(c.error,"warn");let e=c.path??"",f=null;try{let a=c.content?aq(JSON.parse(c.content)):null;av(a)&&(f=a)}catch{}if(c.exists&&!f)return v(`${e} is not a readable sequence definition`,"warn");let g=(e.split("/").pop()??"Untitled").replace(/\.sqdf\.json$/i,"");k(e),m(f??aw("Default",g)),v(c.exists?"loaded":"new document — the first edit writes it");let{bridgeUrl:h}=await eu();!a&&h&&(R.current=b=dL({url:h,role:"web",docId:e,name:"web-designer",onFull:a=>{let b=a.def;av(b)&&(m(b),v("updated live"))},onPatch:()=>{},onPresence:a=>P(a.length)}),b.connect())})().catch(b=>!a&&v(String(b),"warn")),()=>{a=!0,R.current=null,b?.disconnect()}},[d,v]);let V=(0,i.useMemo)(()=>l?bT(l):null,[l]),W=(0,i.useMemo)(()=>V?aL(V):null,[V]),X=(0,i.useMemo)(()=>V&&W?fh(()=>(function(a,b){let c=[];for(let a of b.participants)c.push({focus:`participant:${a.name}`,box:{x:a.left,y:a.top,width:a.width,height:Math.max(a.height,b.lifelineBottom-a.top)}});let d=new Map(az(a).map(a=>[a.ref,a.message]));for(let a of b.rows){let b=a.self?a.fromX:Math.min(a.fromX,a.toX),e=a.self?220:Math.max(40,Math.abs(a.toX-a.fromX)),f={x:b-10,y:a.y-24,width:e+20,height:40};c.push({focus:`message:${a.ref}`,box:f});let g=d.get(a.ref)?.event;g&&c.push({focus:`event:${g}`,box:f})}return c})(V,W),[]):[],[V,W]),Y=(0,i.useMemo)(()=>{let a={};for(let{ref:b,message:c}of V?fh(()=>az(V),[]):[]){let d=c?.label?`${b}. ${c.label}`:`message ${b}`;a[`message:${b}`]=d.length>48?`${d.slice(0,47)}…`:d}return a},[V]),Z=eQ("focus"),$=(0,i.useMemo)(()=>{if(!l)return[];let a="";return fh(()=>aA(l),null,b=>a=b)??[{ruleId:"S000",message:`The document could not be checked (${a}): a field is not the shape Spec 81 gives it`}]},[l]),_=fH(f,j),aa=(0,i.useMemo)(()=>f?.def&&_&&l?fh(()=>a6(f.def,f.members.map(a=>a.path===_?{...a,def:l,error:void 0}:a)),null):null,[f,_,l]),ab=(0,i.useMemo)(()=>(aa?.issues??[]).filter(a=>a.member===_&&!/^S0/.test(a.ruleId)),[aa,_]),ac=aa?.replays.find(a=>a.member===_)?.report??null,ad=(0,i.useMemo)(()=>(function(a){let b={events:new Set,states:new Set,machines:new Set,objects:new Set,entities:new Set,actors:new Set};if(!a)return{events:[],states:[],machines:[],objects:[],entities:[],actors:[]};let{machines:c,erds:d}=a5(a.members);for(let{def:a}of(c.forEach(({def:a},c)=>{for(let d of(b.machines.add(a_(a,c)),a.events??[]))for(let a of[...d?.events??[],...d?.timers??[]])a?.id&&b.events.add(a.id);for(let c of a.settings?.objects??[])c?.instance&&b.objects.add(c.instance);let d=a=>{a&&(b.states.add(a.name),(a.states??[]).forEach(d),(a.parallel?.states??[]).forEach(d))};d(a.state)}),d))for(let c of a.entities??[])c?.name&&b.entities.add(c.name);for(let c of a.def?.actors??[])c?.name&&b.actors.add(c.name);let e=a=>[...a].sort((a,b)=>a.localeCompare(b));return{events:e(b.events),states:e(b.states),machines:e(b.machines),objects:e(b.objects),entities:e(b.entities),actors:e(b.actors)}})(f),[f]),ae=(0,i.useMemo)(()=>{let a=a=>a?/^(message|participant):/.test(a)?a:V?.participants.some(b=>b.name===a)?`participant:${a}`:"":"";return[...$.map(b=>a(b.element)),...ab.filter(a=>"error"===a.severity).map(b=>a(b.element))].filter(Boolean)},[$,ab,V]),af=(0,i.useMemo)(()=>ab.filter(a=>"warning"===a.severity).map(a=>a.element??""),[ab]),ag=(0,i.useMemo)(()=>{let a=new Map,b=(b,c)=>{let d=b?/^(message|participant):/.test(b)?b:V?.participants.some(a=>a.name===b)?`participant:${b}`:"":"";d&&a.set(d,[...a.get(d)??[],c])};return $.forEach(a=>b(a.element,{severity:"error",text:a.message})),ab.forEach(a=>b(a.element,{severity:"error"===a.severity?"error":"warning",text:a.message})),a},[$,ab,V]),ah=()=>{let a=K.current?.getBoundingClientRect();return{width:a?.width??0,height:a?.height??0}},ai=(0,i.useCallback)(a=>{let b=K.current?.getBoundingClientRect();if(!b?.width)return;let c=N(Math.max(S([a],b.width,b.height,{padding:24,maxScale:1.1}).scale,.7));o({scale:c,x:b.width/2-(a.x+a.width/2)*c,y:b.height/2-(a.y+a.height/2)*c})},[]),aj=(0,i.useCallback)(a=>{if(W)if("message"===a.kind){let b=W.rows.find(b=>b.ref===a.id);if(!b)return;let c=b.self?b.fromX:Math.min(b.fromX,b.toX),d=b.self?220:Math.abs(b.toX-b.fromX);ai({x:c-10,y:b.y-24,width:d+20,height:40})}else{let b=W.participants.find(b=>b.name===a.id);b&&ai({x:b.left-20,y:b.top,width:b.width+40,height:Math.min(260,W.height-b.top)})}},[W,ai]),ak=(0,i.useCallback)(a=>{if("diagram"===I.current)return aj(a);requestAnimationFrame(()=>document.getElementById(fz(a))?.scrollIntoView({block:"center",behavior:"smooth"}))},[aj]),al=(0,i.useCallback)(a=>{s(a),a&&eS(`${a.kind}:${a.id}`)},[]);(0,i.useEffect)(()=>{if(!l||!W||U.current===g.nonce)return;U.current=g.nonce;let a=g.focus?a8(g.focus):null;if(!a)return;let b=null;if("message"===a.kind&&ay(V??l,a.name)&&(b={kind:"message",id:a.name}),"participant"===a.kind&&(V??l).participants.some(b=>b.name===a.name)&&(b={kind:"participant",id:a.name}),!b)return v(`${g.focus} is not in this sequence`,"warn");T.current=!1,s(b),ak(b)},[l,V,W,g,ak,v]),(0,i.useEffect)(()=>{if(!W||!T.current||"diagram"!==G)return;let{width:a,height:b}=ah();a&&(T.current=!1,Math.min((a-32)/W.width,(b-32)/W.height)>=.5||0===W.participants.length?q(a=>(a??0)+1):o({x:8,y:8,scale:.6}))},[W,G]);let am=(0,i.useCallback)(async a=>{let b;if(l&&j){try{b=a(l)}catch(a){return v(a instanceof Error?a.message:String(a),"warn")}m(b);try{let a=await fetch(`/api/file${(0,ek.docQuery)(j)}`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({content:JSON.stringify(b,null,2)+"\n"})});if(!a.ok)throw Error((await a.json())?.error??`HTTP ${a.status}`);R.current?.emitFull(b),v("saved")}catch(a){return v(`not saved: ${a instanceof Error?a.message:String(a)}`,"warn")}if(f?.def&&_){if("auto"===aO(f.def)){let{result:a,failed:b,conflicts:d}=await fK(f.path);if(a&&a.count>0){var c;return void(c=b.length?`auto: not written — ${b[0]}`:d.length?`auto: ${d.join(", ")} kept changing on disk; not written — save again`:be(a,"auto"),window.dispatchEvent(new CustomEvent(eP,{detail:{text:c,origin:void 0}})))}}fF()}}},[l,j,v,f,_]),an=a=>{let{width:b,height:c}=ah();o(d=>Q(d,a,{x:b/2,y:c/2}))},ao=()=>{let a,b,c,d,e,f,g,h,i;l&&navigator.clipboard?.writeText((a=["sequenceDiagram"],b=new Map,(l.participants??[]).forEach((c,d)=>{let e=`p${d+1}`;b.set(c.name,e),a.push(` ${c.actor?"actor":"participant"} ${e} as ${aM(c.name)}`)}),c=a=>b.get(a)??aM(a).replace(/\W+/g,"_"),d=(a,b,d)=>{let e=a.reply?"-->>":"->>",f=[`${b} ${aM(a.label??"")}`,a.event?aM(a.event):""].filter(Boolean).join(" · "),g=`${d}${c(a.from)}${e}${c(a.to)}: ${f}`;return a.optional?[`${d}opt optional`,` ${g}`,`${d}end`]:[g]},e=l.messages??[],f=l.fragments??[],g=a=>f.filter(b=>b?.after===a),h=(b,c)=>(b.messages??[]).forEach((e,g)=>a.push(...d(e,`f${f.indexOf(b)+1}.${g+1}`,c+" "))),(i=(b,c,f)=>{for(let j=b;j<=e.length;j++){let b=j===f?[]:g(j);for(let d of b.filter(a=>"alt"!==a.kind))a.push(`${c}${d.kind} ${aM(d.label??"")}`),h(d,c),a.push(`${c}end`);let k=b.filter(a=>"alt"===a.kind);if(k.length){k.forEach((b,d)=>{a.push(`${c}${0===d?"alt":"else"} ${aM(b.label??"")}`),h(b,c)}),j<e.length&&(a.push(`${c}else as written`),i(j,c+" ",j)),a.push(`${c}end`);return}j<e.length&&a.push(...d(e[j],String(j+1),c))}})(0," ",null),a.join("\n")+"\n")).then(()=>v("mermaid copied"))},ap=a=>{let b=a?a8(a):null;if(!b||"message"!==b.kind&&"participant"!==b.kind)return;let c={kind:b.kind,id:b.name};al(c),ak(c),L.close()},ar=V??aw("",""),as=az(ar),at=l&&r?.kind==="message"?ay(ar,r.id):null,ax=l&&r?.kind==="participant"?ar.participants.find(a=>a.name===r.id)??null:null,aK=ar.participants.map(a=>a.name),aN=j.split("/").pop()||"…",aP=$.length+ab.filter(a=>"error"===a.severity).length,aQ=ab.filter(a=>"warning"===a.severity).length,aR=[{id:"participants",label:"Participants",icon:(0,h.jsx)(fx,{kind:"actor"})},{id:"messages",label:"Messages",icon:(0,h.jsx)(fx,{kind:"sequence"})},{id:"notes",label:"Notes",icon:"✎"},{id:"issues",label:"Issues",icon:(0,h.jsx)(em,{}),badge:aP+aQ||void 0}],aS=a=>[{name:"from",label:"from",options:aK,initial:a?.from??aK[0]??""},{name:"to",label:"to",options:aK,initial:a?.to??aK[1]??aK[0]??""},{name:"label",label:"label",placeholder:"what is said or done",initial:a?.label??"",wide:!0},{name:"event",label:"event it fires",suggest:ad.events,initial:a?.event??""},{name:"state",label:"state after",suggest:ad.states,initial:a?.state??""},{name:"carries",label:"entity it carries",suggest:ad.entities,initial:a?.carries??""},{name:"machine",label:"machine",suggest:ad.machines,initial:a?.machine??""},{name:"optional",label:"optional",checkbox:!0,initial:!!a?.optional},{name:"reply",label:"reply (dashed)",checkbox:!0,initial:!!a?.reply}],aT=a=>a.actor?"actor":a.object?"object":a.service?"service":"",aU=["main: at the end",...at&&null===at.fragment?[`main: after ${at.index+1}`]:[],...(l?.fragments??[]).map((a,b)=>`fragment ${b+1}: ${a.kind} \xb7 ${a.label}`)];return(0,h.jsxs)("div",{className:"app-shell dock-offset flex flex-col overflow-hidden bg-gray-950 text-gray-200",onClick:()=>C&&D(!1),children:[(0,h.jsxs)("header",{className:"relative z-40 flex items-center gap-2 border-b border-gray-800 bg-gray-900 px-2 py-1.5 text-xs md:px-3 md:py-2",children:[(0,h.jsxs)("span",{className:"flex items-center gap-1 font-semibold text-blue-300",children:[(0,h.jsx)(fx,{kind:"sequence",size:14}),"SEQ"]}),(0,h.jsx)(el,{}),(0,h.jsxs)("span",{className:"min-w-0 flex-1 truncate text-gray-400",title:j,children:[l?.settings.name??aN,(0,h.jsxs)("span",{className:"hidden text-gray-600 lg:inline",children:[" · ",aN]})]}),(0,h.jsx)("div",{className:"flex shrink-0 overflow-hidden rounded border border-gray-700 text-[12px] leading-none",role:"group","aria-label":"View",children:[["list","List","Read the messages in order, one under the other"],["diagram","Diagram","The lifelines and arrows"]].map(([a,b,c])=>(0,h.jsx)("button",{title:c,"aria-pressed":G===a,onClick:()=>{G!==a&&(r&&(T.current=!1),J(a),r&&requestAnimationFrame(()=>ak(r)))},className:`px-2.5 py-1.5 ${G===a?"bg-gray-700 text-gray-100":"bg-gray-800 text-gray-400 hover:text-gray-200"}`,children:b},a))}),(0,h.jsxs)("div",{className:"hidden shrink-0 items-center gap-2 md:flex",children:[(0,h.jsx)("button",{className:fu,onClick:ao,children:"Copy mermaid"}),(0,h.jsx)("button",{className:fu,onClick:()=>F(a=>!a),"aria-pressed":!E,title:E?"Show the panel":"Hide the panel — the board takes the full width",children:E?"⟨ Panel":"Panel ⟩"})]}),(0,h.jsxs)("div",{className:"relative shrink-0 md:hidden",children:[(0,h.jsx)("button",{className:"rounded border border-gray-700 bg-gray-800 px-3 py-1.5 text-sm leading-none text-gray-200","aria-label":"More actions","aria-expanded":C,onClick:a=>{a.stopPropagation(),D(a=>!a)},children:"⋯"}),C&&(0,h.jsx)("div",{className:"absolute right-0 top-full z-50 mt-1 w-56 overflow-hidden rounded-lg border border-gray-700 bg-gray-900 py-1 shadow-xl",children:(0,h.jsx)("button",{className:"block w-full px-4 py-3 text-left text-sm text-gray-200 hover:bg-gray-800",onClick:()=>{D(!1),ao()},children:"Copy as mermaid"})})]})]}),(0,h.jsxs)("div",{className:"relative flex min-h-0 flex-1",children:[(0,h.jsxs)("div",{ref:K,className:"relative min-w-0 flex-1 overflow-hidden",children:[l&&W&&"list"===G&&V&&(0,h.jsx)(eJ,{what:"sequence",resetKey:l,children:(0,h.jsx)(fA,{definition:V,selection:r,issues:ag,onSelect:a=>al(a),onShowInDiagram:a=>{T.current=!1,J("diagram"),requestAnimationFrame(()=>aj(a))}})}),l&&W&&"diagram"===G&&(0,h.jsx)(eJ,{what:"sequence",resetKey:l,children:(0,h.jsx)(bU,{definition:V,layout:W,viewport:n,onViewportChange:o,selection:r,errorElements:ae,warningElements:af,fitKey:p,onSelect:(a,b)=>al({kind:a,id:b}),onClearSelection:()=>s(null),emptyHint:"No participants yet — add them in the panel, or let an agent write the scenario."})}),l&&W&&"diagram"===G&&(0,h.jsx)(ff,{docPath:j||null,kind:"sequence",viewport:n,setViewport:o,boxes:X,boardRef:K,focus:Z,labels:Y}),l&&W&&"list"===G&&(0,h.jsx)(fg,{docPath:j,onReveal:()=>J("diagram")}),(0,h.jsxs)("div",{className:`pointer-events-none absolute left-2 top-2 max-w-[75%] items-center gap-1.5 rounded bg-gray-950/70 px-1.5 py-0.5 text-[11px] ${"warn"===t.tone?"text-amber-300":"text-gray-500"} ${"list"===G&&w&&"ok"===t.tone?"hidden":"flex"}`,role:"status",children:[(0,h.jsx)("span",{className:`h-1.5 w-1.5 shrink-0 rounded-full ${"warn"===t.tone?"bg-amber-400":"bg-emerald-500"}`}),(0,h.jsxs)("span",{className:`truncate transition-opacity duration-500 ${w&&"ok"===t.tone?"opacity-0":"opacity-100"}`,children:[t.text,O>1?` \xb7 ${O} in the room`:""]})]}),(0,h.jsx)("div",{className:`absolute bottom-3 right-3 flex-col overflow-hidden rounded-lg border border-gray-700 bg-gray-900/90 shadow-lg backdrop-blur ${"diagram"===G?"flex":"hidden"}`,children:[["+","Zoom in",()=>an(1.25)],["−","Zoom out",()=>an(.8)],["⛶","Fit the whole diagram",()=>q(a=>(a??0)+1)]].map(([a,b,c])=>(0,h.jsx)("button",{title:b,"aria-label":b,onClick:c,className:"h-10 w-10 border-b border-gray-800 text-base leading-none text-gray-200 last:border-b-0 hover:bg-gray-800 md:h-8 md:w-8 md:text-sm",children:a},b))}),r&&!A&&(0,h.jsxs)("button",{className:"absolute bottom-3 left-1/2 max-w-[60%] -translate-x-1/2 truncate rounded-full border border-blue-500/60 bg-gray-900/95 px-4 py-2 text-sm text-blue-200 shadow-lg md:hidden",onClick:()=>{z("message"===r.kind?"messages":"participants"),B(!0)},children:["Edit ","message"===r.kind?`${r.id}. ${at?.message.label??""}`:r.id]})]}),A&&(0,h.jsx)("div",{className:"fixed inset-0 z-20 bg-black/50 md:hidden",onClick:L.close,"aria-hidden":"true"}),l&&(0,h.jsxs)("aside",{style:L.sheetStyle,className:`safe-x fixed inset-x-0 bottom-0 z-30 flex h-[var(--sheet-h)] flex-col overflow-hidden rounded-t-2xl border-t border-gray-800 bg-gray-900 shadow-2xl transition-[transform,height] duration-200 ease-out ${A?"translate-y-0":"pointer-events-none translate-y-full"} md:pointer-events-auto md:static md:z-auto md:h-auto md:w-80 md:translate-y-0 md:rounded-none md:border-l md:border-t-0 md:shadow-none md:transition-none ${E?"md:hidden":""}`,children:[(0,h.jsxs)("div",{className:"md:hidden",...L.zoneProps,children:[(0,h.jsx)("div",{className:"flex justify-center pb-1 pt-2",children:(0,h.jsx)("span",{className:"h-1.5 w-12 rounded-full bg-gray-600"})}),(0,h.jsxs)("div",{className:"flex items-center justify-between border-b border-gray-800 px-4 pb-2",children:[(0,h.jsx)("h2",{className:"text-sm font-semibold text-gray-300",children:aR.find(a=>a.id===y)?.label}),(0,h.jsx)("button",{onClick:L.close,className:"-mr-2 px-3 py-2 text-lg text-gray-400","aria-label":"Close panel",children:"✕"})]})]}),(0,h.jsx)("div",{className:"hidden border-b border-gray-800 md:flex",children:aR.map(a=>(0,h.jsxs)("button",{onClick:()=>z(a.id),className:`relative flex-1 px-1 py-2 text-center text-xs transition-colors ${y===a.id?"border-b-2 border-blue-400 bg-gray-800/50 text-blue-400":"text-gray-500 hover:text-gray-300"}`,children:[a.label,void 0!==a.badge&&(0,h.jsx)("span",{className:"absolute right-1 top-1 min-w-[14px] rounded-full bg-red-900 px-1 text-[9px] text-red-100",children:a.badge})]},a.id))}),(0,h.jsx)("div",{className:"touch-targets dock-offset flex-1 overflow-y-auto overscroll-contain p-3",children:(0,h.jsxs)(eJ,{what:"panel",resetKey:l,children:[(0,h.jsxs)("section",{className:"participants"===y?"":"hidden",children:[(0,h.jsx)("div",{className:fv,style:{marginTop:0},children:"Participants"}),(0,h.jsx)("div",{className:"flex flex-wrap gap-1",children:ar.participants.map(a=>(0,h.jsxs)("button",{className:`${fu} ${r?.kind==="participant"&&r.id===a.name?"border-blue-500 text-blue-300":""}`,onClick:()=>{al({kind:"participant",id:a.name}),ak({kind:"participant",id:a.name})},title:aT(a)||"participant",children:[a.name,aT(a)&&(0,h.jsxs)("span",{className:"text-gray-500",children:[" · ",aT(a)]})]},a.name))}),(0,h.jsx)(fw,{id:"add-participant",reset:!0,required:["name"],fields:[{name:"name",placeholder:"new participant"},{name:"kind",options:fM,label:"kind"},{name:"value",placeholder:"actor / service / object",suggest:[...ad.actors,...ad.objects]},{name:"holds",placeholder:"holds: Entity, Entity",suggest:ad.entities}],submit:"+ Participant",onSubmit:a=>{let b=fN(a.name),c=fN(a.kind);am(d=>(function(a,b,c){if(!b.name?.trim())throw Error("A participant needs a name.");let d=aB(a);if(d.participants.some(a=>a.name===b.name))throw Error(`Participant '${b.name}' already exists.`);let e=d.participants.length;return d.participants.splice(e,0,aC({...b})),d})(d,{name:b,...c?{[c]:fN(a.value)||b}:{},holds:fO(a.holds)})),al({kind:"participant",id:b})}}),ax&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsxs)("div",{className:`${fv} flex items-center justify-between gap-2`,children:[(0,h.jsx)("span",{className:"truncate text-sm normal-case tracking-normal text-gray-200",children:ax.name}),(0,h.jsx)("button",{className:`${fu} normal-case tracking-normal`,onClick:()=>ak({kind:"participant",id:ax.name}),children:"◎ Show on board"})]}),(a=ar.participants.findIndex(a=>a.name===ax.name),b=ar.participants.length-1,c=a=>am(b=>{var c;let d,e;return c=ax.name,e=aD(d=aB(b),c),d.participants.splice(d.participants.indexOf(e),1),d.participants.splice(Math.max(0,Math.min(a,d.participants.length)),0,e),d}),(0,h.jsxs)("div",{className:"mb-1 flex items-center gap-1 text-[11px] text-gray-400",children:[(0,h.jsx)("button",{className:`${fu} disabled:opacity-40`,disabled:a<=0,onClick:()=>c(a-1),"aria-label":"Move one column left",children:"← Left"}),(0,h.jsxs)("span",{className:"flex-1 text-center",children:["column ",a+1," of ",b+1]}),(0,h.jsx)("button",{className:`${fu} disabled:opacity-40`,disabled:a>=b,onClick:()=>c(a+1),"aria-label":"Move one column right",children:"Right →"})]})),(0,h.jsx)(fw,{id:"rename-participant",required:["to"],fields:[{name:"to",label:"new name",initial:ax.name}],submit:"Rename (every message follows)",onSubmit:a=>{let b=fN(a.to);b!==ax.name&&(am(a=>(function(a,b,c){if(!c?.trim())throw Error("A participant needs a name.");let d=aB(a),e=aD(d,b);if(c===b)return d;if(d.participants.some(a=>a.name===c))throw Error(`Participant '${c}' already exists.`);e.name=c;let f=a=>{a.from===b&&(a.from=c),a.to===b&&(a.to=c)};for(let a of(d.messages.forEach(f),d.fragments??[]))a.messages.forEach(f);return d})(a,ax.name,b)),al({kind:"participant",id:b}))}},`rename:${ax.name}`),(0,h.jsx)(fw,{id:"edit-participant",fields:[{name:"kind",options:fM,label:"kind",initial:aT(ax)},{name:"value",placeholder:"actor / service / object",suggest:[...ad.actors,...ad.objects],initial:ax.actor??ax.object??ax.service??""},{name:"holds",placeholder:"holds: Entity, Entity",suggest:ad.entities,initial:(ax.holds??[]).join(", "),wide:!0},{name:"description",placeholder:"description",initial:ax.description??"",wide:!0}],submit:"Save participant",onSubmit:a=>am(b=>{let c,d;return aG(b,ax.name,{...(c=fN(a.kind),d=fN(a.value)||ax.name,{actor:"actor"===c?d:"",service:"service"===c?d:"",object:"object"===c?d:""}),holds:fO(a.holds),description:fN(a.description)})})},`p:${JSON.stringify(ax)}`),(0,h.jsxs)("button",{className:`${fu} mt-2 text-red-300`,onClick:()=>{am(a=>{var b;let c,d;return b=ax.name,aD(c=aB(a),b),c.participants=c.participants.filter(a=>a.name!==b),d=a=>a.from!==b&&a.to!==b,c.messages=c.messages.filter(d),c.fragments&&(c.fragments=c.fragments.map(b=>{let c;return{...b,after:Math.max(0,b.after-(c=b.after,a.messages.slice(0,c).filter(a=>!d(a)).length)),messages:b.messages.filter(d)}}).filter(a=>a.messages.length>0),c.fragments.length||delete c.fragments),c}),s(null),eS(null)},title:"Also removes every message it sends or receives",children:["Delete ",ax.name," and its messages"]})]})]}),(0,h.jsxs)("section",{className:"messages"===y?"":"hidden",children:[(0,h.jsx)("div",{className:fv,style:{marginTop:0},children:"Messages"}),0===as.length&&(0,h.jsx)("div",{className:"py-0.5 text-[11px] text-gray-600",children:"None yet."}),(0,h.jsx)("div",{className:"flex flex-col",children:as.map(({ref:a,message:b,fragment:c},d)=>{let e=null!==c&&(0===d||as[d-1].fragment!==c),f=null!==c?ar.fragments?.[c]:void 0,g=r?.kind==="message"&&r.id===a;return(0,h.jsxs)("div",{children:[e&&f&&(0,h.jsxs)("div",{className:"mt-2 border-t border-gray-800 pt-1 text-[11px] text-indigo-300",children:[(0,h.jsx)("span",{className:"font-semibold",children:f.kind})," · after ",f.after," · ",f.label]}),(0,h.jsxs)("button",{className:`block w-full truncate rounded px-1 py-0.5 text-left text-[11px] ${g?"bg-blue-950/60 text-blue-200":"text-gray-300 hover:bg-gray-800"}`,onClick:()=>{al({kind:"message",id:a}),ak({kind:"message",id:a})},title:`${b.from} → ${b.to}: ${b.label}`,children:[(0,h.jsxs)("span",{className:"text-gray-500",children:[a,"."]})," ",b.from," → ",b.to,": ",b.label,b.event?(0,h.jsxs)("span",{className:"text-blue-300",children:[" [",b.event,"]"]}):null,b.state?(0,h.jsxs)("span",{className:"text-emerald-400",children:[" → ",b.state]}):null,b.optional?(0,h.jsx)("span",{className:"text-gray-500",children:" opt"}):null]})]},a)})}),at&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsxs)("div",{className:`${fv} flex items-center justify-between gap-2`,children:[(0,h.jsxs)("span",{className:"truncate text-sm normal-case tracking-normal text-gray-200",children:["Message ",r.id]}),(0,h.jsxs)("span",{className:"flex gap-1 normal-case tracking-normal",children:[null===at.fragment&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("button",{className:fu,"aria-label":"Move up",title:"Move up",disabled:0===at.index,onClick:()=>{am(a=>aJ(a,at.index,at.index-1)),al({kind:"message",id:String(at.index)})},children:"↑"}),(0,h.jsx)("button",{className:fu,"aria-label":"Move down",title:"Move down",disabled:at.index>=ar.messages.length-1,onClick:()=>{am(a=>aJ(a,at.index,at.index+1)),al({kind:"message",id:String(at.index+2)})},children:"↓"})]}),(0,h.jsx)("button",{className:fu,onClick:()=>ak(r),children:"◎ Show"})]})]}),(0,h.jsx)(fw,{id:"edit-message",required:["label"],fields:[...aS(at.message),{name:"description",placeholder:"description",initial:at.message.description??"",wide:!0}],submit:"Save message",onSubmit:a=>am(b=>aI(b,at.index,fP(a),at.fragment))},`m:${r.id}:${JSON.stringify(at.message)}`),(0,h.jsxs)("button",{className:`${fu} mt-2 text-red-300`,onClick:()=>{am(a=>(function(a,b,c=null){let d=aB(a);if(null!==c){let a=aF(d,c);if(!a.messages[b])throw Error(`Message ${b+1} not found in fragment ${c+1}.`);return a.messages.splice(b,1),d}if(!d.messages[b])throw Error(`Message ${b+1} not found. The sequence has ${d.messages.length}.`);if(d.messages.splice(b,1),d.fragments)for(let a of d.fragments)a.after>b&&(a.after-=1);return d})(a,at.index,at.fragment)),s(null),eS(null)},children:["Delete message ",r.id]})]}),(0,h.jsx)("div",{className:fv,children:"Add a message"}),(0,h.jsx)(fw,{id:"add-message",reset:!0,required:["label"],fields:[{name:"where",options:aU,label:"where",wide:!0},...aS()],submit:"+ Message",onSubmit:a=>{let b=fN(a.where),c=fP(a),d=/^fragment (\d+):/.exec(b),e=/^main: after (\d+)$/.exec(b);d?am(a=>{var b;let e,f,g;return b=Number(d[1])-1,f=aF(e=aB(a),b),aE(e,c),g=f.messages.length,f.messages.splice(g,0,aC({...c})),e}):e?am(a=>aH(a,c,Number(e[1]))):am(a=>aH(a,c))}},`add:${aU.join("|")}:${aK.join("|")}`),(0,h.jsx)("div",{className:fv,children:"Fragments"}),0===(ar.fragments??[]).length&&(0,h.jsx)("div",{className:"py-0.5 text-[11px] text-gray-600",children:"None."}),(ar.fragments??[]).map((a,b)=>(0,h.jsxs)("div",{className:"mb-2 rounded border border-gray-800 p-1.5",children:[(0,h.jsxs)("div",{className:"flex items-center justify-between text-[11px] text-indigo-300",children:[(0,h.jsxs)("span",{children:[b+1,". ",(0,h.jsx)("span",{className:"font-semibold",children:a.kind})," · after ",a.after," · ",a.messages.length," message(s)"]}),(0,h.jsx)("button",{className:"text-gray-500 hover:text-red-400","aria-label":`Remove fragment ${b+1}`,onClick:()=>am(a=>{let c;return aF(c=aB(a),b),c.fragments.splice(b,1),c.fragments.length||delete c.fragments,c}),children:"✕"})]}),(0,h.jsx)(fw,{id:`edit-fragment-${b}`,fields:[{name:"kind",options:au,initial:a.kind},{name:"after",placeholder:"after message",initial:String(a.after)},{name:"label",placeholder:"the condition, in words",initial:a.label,wide:!0}],submit:"Save fragment",onSubmit:a=>am(c=>(function(a,b,c){let d=aB(a),e=aF(d,b);if(void 0!==c.kind&&!au.includes(c.kind))throw Error(`A fragment is one of ${au.join(", ")}; got '${c.kind}'.`);if(void 0!==c.after&&(!Number.isInteger(c.after)||c.after<0||c.after>d.messages.length))throw Error(`A fragment branches after a main message, 0 to ${d.messages.length}; got ${c.after}.`);return d.fragments[b]={...aC({...e,...c,messages:void 0}),messages:e.messages??[]},d})(c,b,{kind:fN(a.kind),after:Number(fN(a.after)),label:fN(a.label)}))})]},`${b}:${JSON.stringify({...a,messages:void 0})}`)),(0,h.jsx)(fw,{id:"add-fragment",reset:!0,required:["label"],fields:[{name:"kind",options:au},{name:"after",placeholder:"after message",initial:String(at&&null===at.fragment?at.index+1:ar.messages.length)},{name:"label",placeholder:"the condition, in words",wide:!0},{name:"from",options:aK,label:"first message from"},{name:"to",options:aK,label:"to",initial:aK[1]??aK[0]??""},{name:"first",placeholder:"first message label (optional)",wide:!0}],submit:"+ Fragment",onSubmit:a=>am(b=>(function(a,b){if(!au.includes(b.kind))throw Error(`A fragment is one of ${au.join(", ")}; got '${b.kind}'.`);if(!b.label?.trim())throw Error("A fragment needs a label: the condition in words.");let c=aB(a);if(!Number.isInteger(b.after)||b.after<0||b.after>c.messages.length)throw Error(`A fragment branches after a main message, 0 to ${c.messages.length}; got ${b.after}.`);for(let a of b.messages??[])aE(c,a);return(c.fragments??=[]).push({...aC({...b,messages:void 0}),messages:(b.messages??[]).map(a=>aC({...a}))}),c})(b,{kind:fN(a.kind),after:Number(fN(a.after)),label:fN(a.label),messages:fN(a.first)?[{from:fN(a.from),to:fN(a.to),label:fN(a.first)}]:[]}))},`add-fragment:${ar.messages.length}:${at?.index??""}`)]}),(0,h.jsxs)("section",{className:"notes"===y?"":"hidden",children:[(0,h.jsx)("div",{className:fv,style:{marginTop:0},children:"Notes"}),(0,h.jsx)("p",{className:"mb-1 text-[11px] text-gray-600",children:"Saved in the document, for whoever opens it next — you, or an agent."}),(0,h.jsx)(fr,{label:"On this sequence",value:l.settings.notes??"",placeholder:"What was discussed, what is still open…",onSave:a=>am(b=>{var c;let d;return c={notes:a},(d=aB(b)).settings=aC({...d.settings,...c}),d})},"sequence"),ax&&(0,h.jsx)(fr,{label:`On ${ax.name}`,value:ax.notes??"",placeholder:`A question or a decision about ${ax.name}…`,onSave:a=>am(b=>aG(b,ax.name,{notes:a}))},`participant:${ax.name}`),at&&(0,h.jsx)(fr,{label:`On message ${r.id}`,value:at.message.notes??"",placeholder:"A question or a decision about this message…",onSave:a=>am(b=>aI(b,at.index,{notes:a},at.fragment))},`message:${r.id}`),!r&&(0,h.jsx)("p",{className:"mt-2 text-[11px] text-gray-600",children:"Select a participant or a message to leave a note on it."}),[...ar.participants.filter(a=>a.notes?.trim()),...as.filter(a=>a.message.notes?.trim())].length>0&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("div",{className:fv,children:"With notes"}),(0,h.jsxs)("div",{className:"flex flex-wrap gap-1",children:[ar.participants.filter(a=>a.notes?.trim()).map(a=>(0,h.jsx)("button",{className:fu,onClick:()=>ap(`participant:${a.name}`),children:a.name},`p${a.name}`)),as.filter(a=>a.message.notes?.trim()).map(a=>(0,h.jsxs)("button",{className:fu,onClick:()=>ap(`message:${a.ref}`),children:["message ",a.ref]},`m${a.ref}`))]})]})]}),(0,h.jsxs)("section",{className:"issues"===y?"":"hidden",children:[(0,h.jsx)("div",{className:fv,style:{marginTop:0},children:"Issues"}),$.map((a,b)=>(0,h.jsxs)("button",{className:"block w-full py-0.5 text-left text-[11px] text-red-300",onClick:()=>ap(a.element),children:["[",a.ruleId,"] ",a.message]},`p${b}`)),ab.map((a,b)=>(0,h.jsxs)("button",{className:`block w-full py-0.5 text-left text-[11px] ${"error"===a.severity?"text-red-300":"text-amber-300"}`,onClick:()=>ap(a.element),children:["[",a.ruleId,"] ",a.message]},`s${b}`)),0===$.length&&0===ab.length&&(0,h.jsx)("div",{className:"py-0.5 text-[11px] text-green-400",children:aa?"Valid, and every name it uses resolves in the system.":"The document is valid."}),!e&&(0,h.jsx)("p",{className:"mt-2 text-[11px] text-gray-600",children:"Open this sequence from its system to check it against the machines and the data."}),e&&!_&&f&&(0,h.jsx)("p",{className:"mt-2 text-[11px] text-amber-300",children:"This document is not a member of the open system."}),ac&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsxs)("div",{className:fv,children:["Replay against ",ac.machines.join(", ")||"no machine"]}),ac.paths.map(a=>(0,h.jsxs)("div",{className:"mb-2",children:[(0,h.jsxs)("div",{className:`text-[11px] font-semibold ${a.accepted?"text-green-400":"text-amber-300"}`,children:[a.name," — ",a.accepted?"accepted":"stops"]}),a.steps.filter(a=>"data"!==a.result).map(b=>(0,h.jsxs)("button",{className:`block w-full truncate py-0.5 pl-2 text-left font-mono text-[10.5px] ${"moved"===b.result||"stayed"===b.result?"text-gray-400":"text-amber-300"}`,title:b.note??b.result,onClick:()=>ap(`message:${b.ref}`),children:[b.ref,". ",b.event??""," ",b.from.join("|")||"·"," → ",b.to.join("|")||"·"," ",b.result]},`${a.name}:${b.ref}`))]},a.name))]})]})]})})]})]}),(0,h.jsx)("nav",{className:"dock-safe safe-x fixed inset-x-0 bottom-0 z-40 flex border-t border-gray-800 bg-gray-900/95 backdrop-blur-md md:hidden",children:aR.map(a=>{let b=A&&y===a.id;return(0,h.jsxs)("button",{onClick:()=>{var b;return b=a.id,void(A&&y===b?L.close():B(!0),z(b))},"aria-pressed":b,className:`relative flex h-14 flex-1 flex-col items-center justify-center gap-0.5 text-[11px] transition-colors ${b?"text-blue-400":"text-gray-500"}`,children:[(0,h.jsx)("span",{className:"flex h-4 items-center text-base leading-none",children:a.icon}),(0,h.jsx)("span",{children:a.label}),void 0!==a.badge&&(0,h.jsx)("span",{className:"absolute right-1/2 top-1 min-w-[16px] translate-x-5 rounded-full border border-red-900/80 bg-red-950/80 px-1 text-[10px] leading-4 text-red-200",children:a.badge}),b&&(0,h.jsx)("span",{className:"absolute inset-x-4 top-0 h-0.5 rounded-full bg-blue-400"})]},a.id)})})]})}function fR(a,b){let c=a?.members.find(a=>a.path===b)?.def;return c?.settings?.name||(b.split("/").pop()??b).replace(/\.(smdf|erdf|sqdf|sysdf)\.json$|\.json$/i,"")}let fS=(a,b)=>a?.members.find(a=>a.path===b)?.kind??"machine";function fT(a){return"message"===a.kind?`message ${a.name}`:`${a.kind} ${a.name}`}function fU({systemPath:a}){let b=eQ("doc"),c=eQ("focus"),{system:d}=fG(a),[e,f]=(0,i.useState)(!1),[g,j]=(0,i.useState)(null),k=(0,i.useRef)(d);(0,i.useEffect)(()=>{k.current=d},[d]);let l=(0,i.useMemo)(()=>d?fh(()=>a9(d.members),[]):[],[d]),m=fH(d,b),n=!!d&&(b===d.path||b===a),o=m&&c?function(a,b,c){let d=a8(c);if(!d)return[];let e=a=>a.member===b&&a.kind===d.kind&&a.name===d.name,f=[];for(let b of a)e(b.from)?f.push({other:b.to,text:b.text,rule:b.rule}):e(b.to)&&f.push({other:b.from,text:b.back,rule:b.rule});return f}(l,m,c):[],p=function(a,b){if(!b)return[];let c=new Map;for(let d of a)for(let a of[d.from,d.to]){if(a.member!==b)continue;let d=a7(a);c.set(d,(c.get(d)??0)+1)}return[...c.entries()].sort((a,b)=>a[0].localeCompare(b[0]))}(l,m);(0,i.useEffect)(()=>{let a=a=>{let b=a.detail;b?.text&&j({...b,at:Date.now()})};return window.addEventListener(eP,a),()=>window.removeEventListener(eP,a)},[]),(0,i.useEffect)(()=>{if(!g)return;let a=setTimeout(()=>j(null),9e3);return()=>clearTimeout(a)},[g]);let q=d?.path;(0,i.useEffect)(()=>{if(!q)return;let b=!0,c=null,d=null;return(async()=>{let{bridgeUrl:e}=await eu();if(b&&e){var g;let b,h,i,l;(c=dJ({url:e,role:"web",docId:q,name:"web-system-strip"})).on("view",b=>{let c=k.current;if(!c)return;let d=b.member?void 0!==c.absOf[b.member]?b.member:Object.keys(c.absOf).find(a=>c.absOf[a]===b.member):void 0;if(b.member&&!d)return void j({text:`ignored a view of ${b.member.split("/").pop()}: it is not a member of this system`,origin:b.origin,at:Date.now()});eR({doc:d?c.absOf[d]:q,system:a,focus:b.focus??null}),f(!1);let e=[d?fR(c,d):"the system map",b.focus].filter(Boolean).join(" · ");j({text:b.note?b.note:`showing ${e}`,origin:b.origin,at:Date.now()})}),c.on("full",()=>fF()),g=c,b=!1,h=!1,i=()=>{g.join().then(()=>{b=!0}).catch(()=>{})},l=g.on("status",a=>{"connected"!==a?h=b:h&&(h=!1,i())}),i(),d=()=>{l()}}})(),()=>{b=!1,d?.(),c?.disconnect()}},[q,a]);let r=b=>{f(!1),d&&eR({doc:b.member?d.absOf[b.member]??aV(d.path,b.member):d.path,system:a,focus:b.focus??null})},s=d?.def?.members?.filter(a=>a?.path).map(a=>a.path)??[],t=d?.def?.settings?.name??(a.split("/").pop()??"system").replace(/\.sysdf\.json$/i,""),u=o.length;return(0,h.jsxs)("div",{className:"system-strip relative z-50 border-b border-gray-800 bg-gray-950 text-xs text-gray-300",children:[(0,h.jsxs)("div",{className:"flex h-[var(--strip-h)] items-center gap-1 px-1.5 md:px-2",children:[(0,h.jsxs)("button",{onClick:()=>r({}),className:`flex min-w-0 max-w-[30%] shrink-0 items-center gap-1 rounded px-1.5 py-1 md:max-w-[16rem] ${n?"bg-blue-950/60 text-blue-200":"text-gray-300 hover:bg-gray-800"}`,title:`${a} — the system map`,children:[(0,h.jsx)(fx,{kind:"system",size:15}),(0,h.jsx)("span",{className:"truncate font-semibold",children:t})]}),(0,h.jsx)("span",{className:"h-4 w-px shrink-0 bg-gray-800"}),(0,h.jsxs)("nav",{className:"flex min-w-0 flex-1 items-center gap-0.5 overflow-x-auto [scrollbar-width:none]","aria-label":"Members",children:[s.map(a=>{let b=a===m,c=d?.members.find(b=>b.path===a)?.error;return(0,h.jsxs)("button",{onClick:()=>r({member:a}),"aria-current":b?"page":void 0,title:`${fR(d,a)} — ${a}${c?` (cannot be read: ${c})`:""}`,className:`flex shrink-0 items-center gap-1 rounded px-1.5 py-1 ${b?"bg-blue-950/60 text-blue-200":c?"text-red-400 hover:bg-gray-800":"text-gray-400 hover:bg-gray-800 hover:text-gray-200"}`,children:[(0,h.jsx)(fx,{kind:fS(d,a),size:15}),(0,h.jsx)("span",{className:`max-w-[7.5rem] truncate md:max-w-[11rem] ${b?"":"hidden md:inline"}`,children:fR(d,a)})]},a)}),!d&&(0,h.jsx)("span",{className:"px-1 text-gray-600",children:"loading…"}),d?.error&&(0,h.jsx)("span",{className:"truncate px-1 text-amber-300",children:d.error})]}),(0,h.jsxs)("button",{onClick:()=>f(a=>!a),disabled:!m,"aria-expanded":e,title:m?c?`What ${c} links to in the other drawings`:"Elements of this drawing that link to the others":"Open a member to follow its links",className:`flex shrink-0 items-center gap-1 rounded px-1.5 py-1 disabled:opacity-40 ${e?"bg-blue-950/60 text-blue-200":"text-gray-300 hover:bg-gray-800"}`,children:[(0,h.jsx)(fx,{kind:"link",size:15}),(0,h.jsx)("span",{className:"hidden sm:inline",children:"Links"}),u>0&&(0,h.jsx)("span",{className:"rounded-full border border-gray-700 px-1 text-[10px] leading-4 text-gray-300",children:u})]})]}),g&&!e&&(0,h.jsx)("div",{className:"pointer-events-none absolute inset-x-0 top-full flex justify-center px-2 pt-1",role:"status",children:(0,h.jsxs)("span",{className:"max-w-full truncate rounded border border-gray-700 bg-gray-900/95 px-2 py-0.5 text-[11px] text-gray-300 shadow",children:[g.origin?(0,h.jsxs)("span",{className:"text-blue-300",children:[g.origin,": "]}):null,g.text]})}),e&&m&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("div",{className:"fixed inset-0 z-40",onClick:()=>f(!1),"aria-hidden":"true"}),(0,h.jsxs)("div",{className:"absolute right-1 top-full z-50 mt-1 max-h-[60vh] w-[min(24rem,calc(100vw-0.5rem))] overflow-y-auto rounded-lg border border-gray-700 bg-gray-900 p-2 shadow-xl",children:[c&&a8(c)?(0,h.jsxs)(h.Fragment,{children:[(0,h.jsxs)("div",{className:"mb-1 flex items-center justify-between gap-2 text-[11px] text-gray-500",children:[(0,h.jsxs)("span",{className:"truncate",children:[(0,h.jsx)("span",{className:"text-gray-200",children:fT(a8(c))})," in ",fR(d,m)]}),(0,h.jsx)("button",{className:"shrink-0 text-gray-500 hover:text-gray-200",onClick:()=>eR({doc:b,focus:null}),children:"clear"})]}),0===o.length&&(0,h.jsx)("div",{className:"py-1 text-[11px] text-gray-500",children:"Nothing in the other drawings names it."}),o.map((a,b)=>(0,h.jsxs)("button",{onClick:()=>r({member:a.other.member,focus:a7(a.other)}),className:"flex w-full items-start gap-2 rounded px-1.5 py-1.5 text-left hover:bg-gray-800",children:[(0,h.jsx)("span",{className:"mt-0.5 text-gray-400",children:(0,h.jsx)(fx,{kind:fS(d,a.other.member),size:14})}),(0,h.jsxs)("span",{className:"min-w-0 flex-1",children:[(0,h.jsx)("span",{className:"block text-[12px] text-gray-200",children:a.text}),(0,h.jsxs)("span",{className:"block truncate text-[10.5px] text-gray-500",children:[fT(a.other)," · ",fR(d,a.other.member)," · ",a.rule]})]})]},b))]}):null,(!c||!a8(c))&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsxs)("div",{className:"mb-1 text-[11px] text-gray-500",children:["Elements of ",fR(d,m)," that the other drawings name — pick one to follow it."]}),0===p.length&&(0,h.jsx)("div",{className:"py-1 text-[11px] text-gray-500",children:"None."}),(0,h.jsx)("div",{className:"flex flex-wrap gap-1",children:p.map(([a,c])=>(0,h.jsxs)("button",{onClick:()=>{f(!0),eR({doc:b,focus:a})},className:"rounded border border-gray-700 bg-gray-800 px-1.5 py-0.5 text-[11px] text-gray-200 hover:bg-gray-700",children:[a," ",(0,h.jsx)("span",{className:"text-gray-500",children:c})]},a))})]})]})]})]})}let fV={erd:"ERD",machine:"STATE MACHINE",sequence:"SEQUENCE",system:"SYSTEM"};function fW(a,b,c=!1){if(!b)return"";if("erd"===a)return`${b.entities?.length??0} entities \xb7 ${b.relationships?.length??0} relationships`;if("sequence"===a){let a=b.fragments?.length??0;return`${b.participants?.length??0} participants \xb7 ${b.messages?.length??0} messages${a&&!c?` \xb7 ${a} fragment${a>1?"s":""}`:""}`}let d=0,e=a=>{a&&(d+=1,(a.states??[]).forEach(e),(a.parallel?.states??[]).forEach(e))};(b.state?.states??[]).forEach(e),(b.state?.parallel?.states??[]).forEach(e);let f=(b.events??[]).reduce((a,b)=>a+(b?.events?.length??0)+(b?.timers?.length??0),0);return`${d} states \xb7 ${f} events`}let fX=(a,b)=>a<b?`${a}\u0000${b}`:`${b}\u0000${a}`;function fY(a){let b="message"===a.from.kind?`message ${a.from.name}`:`${a.from.kind} ${a.from.name}`;return`${b} ${a.text}`}function fZ(){let a=(0,ek.useRequestedDoc)(),[b,c]=(0,i.useState)(a);(0,i.useEffect)(()=>{let b=!0;if(a)c(a);else fB(null).then(a=>b&&c(a.path||null));return()=>{b=!1}},[a]);let{system:d,reload:e}=fG(b),[f,g]=(0,i.useState)("members"),[j,k]=(0,i.useState)(!1),[l,m]=(0,i.useState)(!1),[n,o]=(0,i.useState)(!1),[p,q]=(0,i.useState)(null),[r,s]=(0,i.useState)(()=>new Set),[t,u]=(0,i.useState)({text:"loading…",tone:"ok"}),v=(0,i.useCallback)((a,b="ok")=>u({text:a,tone:b}),[]),[w,x]=(0,i.useState)(!1),y=eL({onClose:()=>k(!1),restVh:62,tallVh:92}),z=(0,i.useRef)(null),[A,B]=(0,i.useState)(!1);(0,i.useEffect)(()=>{let a=z.current;if(!a)return;let b=()=>{let b=a.getBoundingClientRect();b.width&&B(b.height>1.1*b.width)};b();let c=new ResizeObserver(b);return c.observe(a),()=>c.disconnect()},[]);let C=(0,i.useRef)(!1);(0,i.useEffect)(()=>{d&&(d.error?v(d.error,"warn"):C.current||v(`${d.members.length} member${1===d.members.length?"":"s"} loaded`),C.current=!0)},[d,v]);let[D,E]=(0,i.useState)(!1);(0,i.useEffect)(()=>{let a=setTimeout(()=>E(!0),4e3);return()=>{clearTimeout(a),E(!1)}},[t]);let F=(0,i.useMemo)(()=>d?.def?fh(()=>a6(d.def,d.members),null):null,[d]),G=(0,i.useMemo)(()=>d?fh(()=>a9(d.members),[]):[],[d]),H=(0,i.useMemo)(()=>d?.def?fh(()=>bd(d.def,d.members),null):null,[d]),I=aO(d?.def),J=(0,i.useMemo)(()=>{let a=new Map;for(let b of G){if(b.from.member===b.to.member)continue;let c=fX(b.from.member,b.to.member),d=a.get(c)??{a:c.split("\0")[0],b:c.split("\0")[1],links:[]};d.links.push(b),a.set(c,d)}return a},[G]),K=(F?.issues??[]).filter(a=>"error"===a.severity),L=(F?.issues??[]).filter(a=>"warning"===a.severity),M=(b,c)=>{d&&eR({doc:d.absOf[b]??b,system:a??d.path,focus:c??null})},N=async(a,b)=>{if(d)try{await fD(d.path,a,d.mtimes[d.path]),v(b),fF()}catch(a){a instanceof fC?(v("the system changed on disk — reloaded; make the change again","warn"),fF()):v(`not saved: ${a instanceof Error?a.message:String(a)}`,"warn")}},O=async()=>{if(!d||!H||!H.count)return;x(!0);let{result:a,written:b,failed:c,conflicts:e}=await fK(d.path);x(!1),c.length?v(`not all written: ${c.join("; ")}`,"warn"):e.length?v(`${e.join(", ")} kept changing on disk — not written; apply again`,"warn"):a?.count?v(`${be(a,"propose").replace(/ proposed/," applied")} — ${b.length} file(s) written`):v("nothing to apply: the drawings on disk already agree")},P=A?420:760,Q=A?640:520,R=d?.def?.members?.filter(a=>a?.path).map(a=>a.path)??[],S=d?.def?.actors??[],T=64*!!S.length,U=(0,i.useMemo)(()=>{let a=R.length,b=P/2,c=(Q-T)/2+6,d=Math.max(0,P/2-98-16),e=Math.max(0,(Q-T)/2-46-18),f=new Map;return R.forEach((g,h)=>{if(1===a)return f.set(g,{x:b,y:c});if(A){let b=Q-T-46-16;return f.set(g,{x:h%2?.67*P:.33*P,y:62+(b-62)*h/(a-1)})}if(2===a)return f.set(g,A?{x:b,y:h?c+e:c-e}:{x:h?b+d:b-d,y:c});let i=-Math.PI/2+2*h*Math.PI/a;f.set(g,{x:b+d*Math.cos(i),y:c+e*Math.sin(i)})}),f},[R.join("|"),P,Q,196,T,A]),V=(0,i.useMemo)(()=>{let a=new Map;for(let{member:b,def:c}of a5(d?.members??[]).sequences)for(let d of c.participants??[]){if(!d?.actor)continue;let c=a.get(d.actor)??[];c.includes(b)||c.push(b),a.set(d.actor,c)}return a},[d]),W=d?.def,X=(d?.path??b??"").split("/").pop()||"…",Y=[{id:"members",label:"Members",icon:(0,h.jsx)(fx,{kind:"system"})},{id:"checks",label:"Checks",icon:(0,h.jsx)(em,{}),badge:K.length+L.length||void 0},{id:"notes",label:"Notes",icon:"✎"}],Z=p?J.get(p):void 0,$=(0,i.useMemo)(()=>{let a=[];for(let b of["error","warning"]){let c=new Map;for(let a of F?.issues??[])a.severity===b&&c.set(a.ruleId,[...c.get(a.ruleId)??[],a]);for(let[d,e]of[...c.entries()].sort((a,b)=>a[0].localeCompare(b[0])))a.push({key:`${b}:${d}`,ruleId:d,severity:b,issues:e})}return a},[F]);return(0,h.jsxs)("div",{className:"app-shell dock-offset flex flex-col overflow-hidden bg-gray-950 text-gray-200",onClick:()=>l&&m(!1),children:[(0,h.jsxs)("header",{className:"relative z-40 flex items-center gap-2 border-b border-gray-800 bg-gray-900 px-2 py-1.5 text-xs md:px-3 md:py-2",children:[(0,h.jsxs)("span",{className:"flex items-center gap-1 font-semibold text-blue-300",children:[(0,h.jsx)(fx,{kind:"system",size:14}),"SYS"]}),(0,h.jsx)(el,{}),(0,h.jsxs)("span",{className:"min-w-0 flex-1 truncate text-gray-400",title:d?.path,children:[W?.settings?.name??X,(0,h.jsxs)("span",{className:"hidden text-gray-600 lg:inline",children:[" · ",X]})]}),(0,h.jsxs)("div",{className:"hidden shrink-0 items-center gap-2 md:flex",children:[(0,h.jsx)("button",{className:fu,onClick:e,title:"Read the system and every member again",children:"Re-check"}),(0,h.jsx)("button",{className:fu,onClick:()=>o(a=>!a),"aria-pressed":!n,children:n?"⟨ Panel":"Panel ⟩"})]}),(0,h.jsxs)("div",{className:"relative shrink-0 md:hidden",children:[(0,h.jsx)("button",{className:"rounded border border-gray-700 bg-gray-800 px-3 py-1.5 text-sm leading-none text-gray-200","aria-label":"More actions","aria-expanded":l,onClick:a=>{a.stopPropagation(),m(a=>!a)},children:"⋯"}),l&&(0,h.jsx)("div",{className:"absolute right-0 top-full z-50 mt-1 w-56 overflow-hidden rounded-lg border border-gray-700 bg-gray-900 py-1 shadow-xl",children:(0,h.jsx)("button",{className:"block w-full px-4 py-3 text-left text-sm text-gray-200 hover:bg-gray-800",onClick:()=>{m(!1),e()},children:"Re-check the system"})})]})]}),(0,h.jsxs)("div",{className:"relative flex min-h-0 flex-1",children:[(0,h.jsxs)("div",{ref:z,className:"relative min-w-0 flex-1 overflow-hidden bg-[#030712]",children:[d&&W&&(0,h.jsx)(eJ,{what:"system map",resetKey:d,children:(0,h.jsxs)("svg",{className:"h-full w-full",viewBox:`0 0 ${P} ${Q}`,preserveAspectRatio:"xMidYMid meet",role:"img","aria-label":`System map of ${W.settings?.name}`,children:[[...J.entries()].map(([a,b])=>{let c=U.get(b.a),d=U.get(b.b);if(!c||!d)return null;let e=(c.x+d.x)/2,f=(c.y+d.y)/2,i=`${b.links.length} link${1===b.links.length?"":"s"}`,j=6.4*i.length+16,l=p===a;return(0,h.jsxs)("g",{className:"cursor-pointer",onClick:()=>{q(l?null:a),g("members"),k(!0)},children:[(0,h.jsx)("line",{x1:c.x,y1:c.y,x2:d.x,y2:d.y,stroke:"transparent",strokeWidth:18}),(0,h.jsx)("line",{x1:c.x,y1:c.y,x2:d.x,y2:d.y,stroke:l?"#3b82f6":"#475569",strokeWidth:l?2.5:1.6}),(0,h.jsx)("rect",{x:e-j/2,y:f-11,width:j,height:22,rx:11,fill:"#0f172a",stroke:l?"#3b82f6":"#334155"}),(0,h.jsx)("text",{x:e,y:f+4,textAnchor:"middle",fontSize:11.5,fill:l?"#93c5fd":"#cbd5e1",children:i})]},a)}),S.map((a,b)=>{let c=(b+1)*P/(S.length+1),d=Q-30;return(0,h.jsxs)("g",{children:[(V.get(a.name)??[]).map(a=>{let b=U.get(a);return b?(0,h.jsx)("line",{x1:c,y1:d-14,x2:b.x,y2:b.y+46,stroke:"#334155",strokeDasharray:"3 4"},a):null}),(0,h.jsx)("title",{children:[`${a.kind}`,a.description??"",a.wheelNode??""].filter(Boolean).join(" — ")}),(0,h.jsx)("rect",{x:c-62,y:d-14,width:124,height:28,rx:14,fill:"#0c1020",stroke:"#6366f1"}),(0,h.jsx)("g",{transform:`translate(${c-54} ${d-8})`,color:"#a5b4fc",children:(0,h.jsx)(fx,{kind:"actor",size:16})}),(0,h.jsx)("text",{x:c-34,y:d-1,fontSize:11.5,fontWeight:600,fill:"#e2e8f0",children:a.name.length>12?`${a.name.slice(0,11)}…`:a.name}),(0,h.jsx)("text",{x:c-34,y:d+9,fontSize:8.5,fill:"#94a3b8",children:a.kind})]},a.name)}),R.map(a=>{let b=U.get(a),c=d.members.find(b=>b.path===a);if(!b||!c)return null;let e=c.kind,f=(F?.issues??[]).filter(b=>b.member===a),g=f.filter(a=>"error"===a.severity).length,i=f.filter(a=>"warning"===a.severity).length,j=b.x-98,k=b.y-46,l=fR(d,a),m=Z&&(Z.a===a||Z.b===a);return(0,h.jsxs)("g",{className:"cursor-pointer",onClick:()=>M(a),children:[(0,h.jsx)("title",{children:`${a}${c.error?` — cannot be read: ${c.error}`:""}
|
|
15
|
+
Tap to open it inside the system.`}),(0,h.jsx)("rect",{x:j,y:k,width:196,height:92,rx:10,fill:"#0f172a",stroke:c.error?"#ef4444":m?"#3b82f6":g?"#b91c1c":"#475569",strokeWidth:m?2.2:1.5,strokeDasharray:c.error?"5 4":void 0}),(0,h.jsx)("g",{transform:`translate(${j+10} ${k+9})`,color:"#93c5fd",children:(0,h.jsx)(fx,{kind:e,size:16})}),(0,h.jsx)("text",{x:j+32,y:k+21,fontSize:9,fontWeight:700,letterSpacing:"0.06em",fill:"#64748b",children:fV[e]}),(0,h.jsx)("text",{x:j+10,y:k+43,fontSize:14,fontWeight:600,fill:"#e2e8f0",children:l.length>22?`${l.slice(0,21)}…`:l}),(0,h.jsx)("text",{x:j+10,y:k+60,fontSize:10.5,fill:"#94a3b8",children:c.error?"cannot be read":fW(e,c.def,!0)}),(0,h.jsx)("text",{x:j+10,y:k+79,fontSize:10.5,fill:g?"#fca5a5":i?"#fcd34d":"#4ade80",children:c.error?c.error.length>30?`${c.error.slice(0,29)}…`:c.error:g||i?[g?`${g} error${g>1?"s":""}`:"",i?`${i} warning${i>1?"s":""}`:""].filter(Boolean).join(" · "):"checks pass"}),(0,h.jsx)("text",{x:j+196-10,y:k+79,fontSize:10.5,textAnchor:"end",fill:"#64748b",children:"open ›"})]},a)})]})}),d&&!W&&(0,h.jsx)("div",{className:"absolute inset-0 flex items-center justify-center p-6 text-center text-sm text-amber-300",children:d.error}),(0,h.jsxs)("div",{className:`pointer-events-none absolute left-2 top-2 flex max-w-[75%] items-center gap-1.5 rounded bg-gray-950/70 px-1.5 py-0.5 text-[11px] ${"warn"===t.tone?"text-amber-300":"text-gray-500"}`,role:"status",children:[(0,h.jsx)("span",{className:`h-1.5 w-1.5 shrink-0 rounded-full ${"warn"===t.tone?"bg-amber-400":"bg-emerald-500"}`}),(0,h.jsx)("span",{className:`truncate transition-opacity duration-500 ${D&&"ok"===t.tone?"opacity-0":"opacity-100"}`,children:t.text})]})]}),j&&(0,h.jsx)("div",{className:"fixed inset-0 z-20 bg-black/50 md:hidden",onClick:y.close,"aria-hidden":"true"}),d&&W&&(0,h.jsxs)("aside",{style:y.sheetStyle,className:`safe-x fixed inset-x-0 bottom-0 z-30 flex h-[var(--sheet-h)] flex-col overflow-hidden rounded-t-2xl border-t border-gray-800 bg-gray-900 shadow-2xl transition-[transform,height] duration-200 ease-out ${j?"translate-y-0":"pointer-events-none translate-y-full"} md:pointer-events-auto md:static md:z-auto md:h-auto md:w-96 md:translate-y-0 md:rounded-none md:border-l md:border-t-0 md:shadow-none md:transition-none ${n?"md:hidden":""}`,children:[(0,h.jsxs)("div",{className:"md:hidden",...y.zoneProps,children:[(0,h.jsx)("div",{className:"flex justify-center pb-1 pt-2",children:(0,h.jsx)("span",{className:"h-1.5 w-12 rounded-full bg-gray-600"})}),(0,h.jsxs)("div",{className:"flex items-center justify-between border-b border-gray-800 px-4 pb-2",children:[(0,h.jsx)("h2",{className:"text-sm font-semibold text-gray-300",children:Y.find(a=>a.id===f)?.label}),(0,h.jsx)("button",{onClick:y.close,className:"-mr-2 px-3 py-2 text-lg text-gray-400","aria-label":"Close panel",children:"✕"})]})]}),(0,h.jsx)("div",{className:"hidden border-b border-gray-800 md:flex",children:Y.map(a=>(0,h.jsxs)("button",{onClick:()=>g(a.id),className:`relative flex-1 px-1 py-2 text-center text-xs transition-colors ${f===a.id?"border-b-2 border-blue-400 bg-gray-800/50 text-blue-400":"text-gray-500 hover:text-gray-300"}`,children:[a.label,void 0!==a.badge&&(0,h.jsx)("span",{className:"absolute right-1 top-1 min-w-[14px] rounded-full bg-red-900 px-1 text-[9px] text-red-100",children:a.badge})]},a.id))}),(0,h.jsxs)("div",{className:"touch-targets dock-offset flex-1 overflow-y-auto overscroll-contain p-3",children:[(0,h.jsxs)("section",{className:"members"===f?"":"hidden",children:[(0,h.jsx)("div",{className:fv,style:{marginTop:0},children:"Members"}),R.map(a=>{let b=d.members.find(b=>b.path===a),c=W.members.find(b=>b.path===a)?.notes;return(0,h.jsxs)("div",{className:"mb-1 rounded border border-gray-800",children:[(0,h.jsxs)("button",{onClick:()=>M(a),className:"flex w-full items-start gap-2 p-2 text-left hover:bg-gray-800",children:[(0,h.jsx)("span",{className:"mt-0.5 text-blue-300",children:(0,h.jsx)(fx,{kind:b?.kind??"machine"})}),(0,h.jsxs)("span",{className:"min-w-0 flex-1",children:[(0,h.jsx)("span",{className:"block truncate text-[12px] font-semibold text-gray-200",children:fR(d,a)}),(0,h.jsx)("span",{className:"block truncate text-[10.5px] text-gray-500",children:a}),(0,h.jsx)("span",{className:`block text-[11px] ${b?.error?"text-red-300":"text-gray-400"}`,children:b?.error?`cannot be read: ${b.error}`:fW(b?.kind??"machine",b?.def)})]}),(0,h.jsx)("span",{className:"shrink-0 text-[11px] text-gray-500",children:"open ›"})]}),c||r.has(a)?(0,h.jsx)("div",{className:"px-2 pb-2 [&_label]:mt-0",children:(0,h.jsx)(fr,{label:"Note on this member, in the system",value:c??"",placeholder:`Why ${fR(d,a)} is part of this system, what is open…`,onSave:b=>void N(function(a,b,c){let d=aX(a),e=d.members.findIndex(a=>a.path===b);if(e<0)throw Error(`'${b}' is not a member. Members: ${a.members.map(a=>a.path).join(", ")||"none"}.`);return d.members[e]=aY({...d.members[e],...c}),d}(W,a,{notes:b}),"saved")},`member:${a}`)}):(0,h.jsx)("button",{className:"mx-2 mb-1.5 text-[11px] text-gray-500 hover:text-gray-300",onClick:()=>s(b=>new Set(b).add(a)),children:"Add a note on this member"})]},a)}),(0,h.jsx)("div",{className:fv,children:"Links between members"}),0===J.size&&(0,h.jsx)("div",{className:"py-0.5 text-[11px] text-gray-600",children:"No name crosses between the members yet."}),[...J.entries()].map(([a,b])=>(0,h.jsxs)("div",{className:"mb-1",children:[(0,h.jsxs)("button",{className:`flex w-full items-center justify-between rounded px-1.5 py-1 text-left text-[11px] ${p===a?"bg-blue-950/60 text-blue-200":"text-gray-300 hover:bg-gray-800"}`,onClick:()=>q(p===a?null:a),children:[(0,h.jsxs)("span",{className:"truncate",children:[fR(d,b.a)," ","↔︎"," ",fR(d,b.b)]}),(0,h.jsx)("span",{className:"shrink-0 text-gray-500",children:b.links.length})]}),p===a&&(0,h.jsx)("div",{className:"ml-2 border-l border-gray-800 pl-2",children:b.links.map((a,b)=>(0,h.jsxs)("button",{className:"block w-full truncate py-0.5 text-left text-[11px] text-gray-400 hover:text-gray-200",title:`${fY(a)} — ${a.rule}`,onClick:()=>{let b;return M((b=a.from).member,a7(b))},children:[(0,h.jsx)("span",{className:"text-gray-600",children:a.rule})," ",fY(a)]},b))})]},a)),S.length>0&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("div",{className:fv,children:"Actors"}),S.map(a=>(0,h.jsxs)("div",{className:"py-0.5 text-[11px] text-gray-300",children:[a.name," ",(0,h.jsxs)("span",{className:"text-gray-500",children:["· ",a.kind]}),a.description?(0,h.jsxs)("span",{className:"text-gray-500",children:[" — ",a.description]}):null]},a.name))]})]}),(0,h.jsxs)("section",{className:"checks"===f?"":"hidden",children:[(0,h.jsx)("div",{className:fv,style:{marginTop:0},children:"Checks"}),(0,h.jsxs)("div",{className:`text-[11px] ${K.length?"text-red-300":L.length?"text-amber-300":"text-green-400"}`,children:[K.length," error",1===K.length?"":"s"," · ",L.length," warning",1===L.length?"":"s"]}),$.map(a=>(0,h.jsxs)("div",{className:"mt-2",children:[(0,h.jsxs)("div",{className:`text-[11px] font-semibold ${"error"===a.severity?"text-red-300":"text-amber-300"}`,children:[a.ruleId," · ",a.issues.length," ",a.severity,1===a.issues.length?"":"s"]}),a.issues.map((a,b)=>(0,h.jsxs)("button",{className:"block w-full py-0.5 pl-2 text-left text-[11px] text-gray-300 hover:text-white",onClick:()=>{a.member&&M(a.member,a.element&&/^[a-z]+:/.test(a.element)?a.element:null)},title:a.member?`Open ${a.member}${a.element?` at ${a.element}`:""}`:void 0,children:[a.message,a.member&&(0,h.jsxs)("span",{className:"text-gray-500",children:[" — ",fR(d,a.member)]})]},b))]},a.key)),(0,h.jsx)("div",{className:fv,children:"Reconcile"}),(0,h.jsxs)("p",{className:"mb-1 text-[11px] text-gray-500",children:["What the scenarios imply for the machines and the data. ",(0,h.jsx)("b",{className:"text-gray-400",children:"propose"})," lists it here to apply by hand; ",(0,h.jsx)("b",{className:"text-gray-400",children:"auto"})," writes it each time a scenario is saved."]}),(0,h.jsx)("span",{className:"inline-flex overflow-hidden rounded border border-gray-700",role:"group","aria-label":"Reconcile mode",children:aN.map(a=>(0,h.jsx)("button",{"aria-pressed":I===a,onClick:()=>{d?.def&&a!==I&&N(function(a,b){if(!aN.includes(b))throw Error(`The reconcile mode is ${aN.join(" or ")}; got '${b}'.`);return aZ(a,{reconcile:b})}(d.def,a),`reconcile mode: ${a}`)},className:`px-3 py-1 text-xs ${I===a?"bg-blue-900/60 text-blue-200":"bg-gray-800 text-gray-400 hover:bg-gray-700"}`,children:a},a))}),(0,h.jsx)("div",{className:"mt-2 text-[11px] font-semibold text-gray-400",children:"Scenario changes"}),H&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("div",{className:"text-[11px] text-gray-500",children:be(H,"propose")}),H.machines.map(a=>(0,h.jsxs)("div",{className:"mt-1",children:[(0,h.jsxs)("div",{className:"text-[11px] text-gray-300",children:[a.machine," ",(0,h.jsxs)("span",{className:"text-gray-500",children:["· ",a.member]})]}),a.reasons.map((a,b)=>(0,h.jsxs)("div",{className:"pl-2 text-[11px] text-gray-400",children:["+ ",a]},b))]},a.member)),H.erds.map(a=>(0,h.jsxs)("div",{className:"mt-1",children:[(0,h.jsxs)("div",{className:"text-[11px] text-gray-300",children:[a.def.settings?.name??a.member," ",(0,h.jsxs)("span",{className:"text-gray-500",children:["· ",a.member]})]}),a.reasons.map((a,b)=>(0,h.jsxs)("div",{className:"pl-2 text-[11px] text-gray-400",children:["+ ",a]},b))]},a.member)),H.system&&(0,h.jsxs)("div",{className:"mt-1",children:[(0,h.jsx)("div",{className:"text-[11px] text-gray-300",children:"the system"}),H.system.reasons.map((a,b)=>(0,h.jsxs)("div",{className:"pl-2 text-[11px] text-gray-400",children:["+ ",a]},b))]}),H.unresolved.map((a,b)=>(0,h.jsxs)("div",{className:"mt-1 text-[11px] text-amber-300",children:["left open: ",a]},b)),(0,h.jsx)("button",{className:`${fu} mt-2 disabled:opacity-40`,disabled:!H.count||w,onClick:O,children:w?"Applying…":`Apply${H.count?` ${H.count} change${1===H.count?"":"s"}`:""}`})]}),(F?.replays??[]).map(({member:a,report:b})=>(0,h.jsxs)("div",{children:[(0,h.jsxs)("div",{className:fv,children:["Replay · ",fR(d,a)]}),(0,h.jsxs)("div",{className:"mb-1 text-[11px] text-gray-500",children:["against ",b.machines.join(", ")||"no machine"]}),b.paths.map(b=>(0,h.jsxs)("div",{className:"mb-2",children:[(0,h.jsxs)("div",{className:`text-[11px] font-semibold ${b.accepted?"text-green-400":"text-amber-300"}`,children:[b.name," — ",b.accepted?"accepted":"stops"]}),b.steps.filter(a=>"data"!==a.result).map(c=>(0,h.jsxs)("button",{className:`block w-full truncate py-0.5 pl-2 text-left font-mono text-[10.5px] ${"moved"===c.result||"stayed"===c.result?"text-gray-400":"text-amber-300"}`,title:c.note??c.result,onClick:()=>M(a,`message:${c.ref}`),children:[c.ref,". ",c.event??""," ",c.from.join("|")||"·"," → ",c.to.join("|")||"·"," ",c.result]},`${b.name}:${c.ref}`))]},b.name))]},a))]}),(0,h.jsxs)("section",{className:"notes"===f?"":"hidden",children:[(0,h.jsx)("div",{className:fv,style:{marginTop:0},children:"Notes"}),(0,h.jsx)("p",{className:"mb-1 text-[11px] text-gray-600",children:"Saved in the system file, for whoever opens it next."}),(0,h.jsx)(fr,{label:"On this system",value:W.settings?.notes??"",placeholder:"What the system is for, what is still open…",onSave:a=>void N(aZ(W,{notes:a}),"saved")},"system"),W.settings?.description&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("div",{className:fv,children:"Description"}),(0,h.jsx)("p",{className:"text-[11px] text-gray-400",children:W.settings.description})]})]})]})]})]}),(0,h.jsx)("nav",{className:"dock-safe safe-x fixed inset-x-0 bottom-0 z-40 flex border-t border-gray-800 bg-gray-900/95 backdrop-blur-md md:hidden",children:Y.map(a=>{let b=j&&f===a.id;return(0,h.jsxs)("button",{onClick:()=>{var b;return b=a.id,void(j&&f===b?y.close():k(!0),g(b))},"aria-pressed":b,className:`relative flex h-14 flex-1 flex-col items-center justify-center gap-0.5 text-[11px] transition-colors ${b?"text-blue-400":"text-gray-500"}`,children:[(0,h.jsx)("span",{className:"flex h-4 items-center text-base leading-none",children:a.icon}),(0,h.jsx)("span",{children:a.label}),void 0!==a.badge&&(0,h.jsx)("span",{className:"absolute right-1/2 top-1 min-w-[16px] translate-x-5 rounded-full border border-red-900/80 bg-red-950/80 px-1 text-[10px] leading-4 text-red-200",children:a.badge}),b&&(0,h.jsx)("span",{className:"absolute inset-x-4 top-0 h-0.5 rounded-full bg-blue-400"})]},a.id)})})]})}function f$(){let a=d_(a=>a.definition),b=d_(a=>a.layout.positions),c=d_(a=>a.navigationPath),d=d_(a=>a.viewport),e=d_(a=>a.setViewport),f=d_(a=>a.docPath),g=eQ("focus"),j=(0,i.useMemo)(()=>({get current(){return document.getElementById("machine-board")}}),[]),k=c.slice(1),l=(0,i.useMemo)(()=>a?.state?function(a,b){let c=[];for(let d of a){let a=d?.name?b[d.name]:void 0;a&&c.push({focus:`state:${d.name}`,box:a})}for(let d of a){let e=d?.name?b[d.name]:void 0;if(e)for(let f of d.transitions??[]){if(!f?.event)continue;let d=f.nextState?b[f.nextState]:void 0;c.push({focus:`event:${f.event}`,box:d&&a.some(a=>a.name===f.nextState)?br([e,d]):e})}}return c}(by(a.state,k),b):[],[a,b,c]);return(0,h.jsx)(ff,{docPath:f,kind:"machine",viewport:d,setViewport:e,boxes:l,boardRef:j,focus:g,level:c[c.length-1],onReveal:a=>{let b=a.map(a8).find(a=>a?.kind==="state");if(!b)return;let c=new URL(window.location.href);c.searchParams.set("focus",`state:${b.name}`),window.history.replaceState(window.history.state,"",c),window.dispatchEvent(new Event(eM))}})}let f_=a=>a.parallel?a.parallel.states:a.states??[];function f0(a,b){if(!a)return null;if(a.name===b)return[a.name];for(let c of f_(a)){let d=f0(c,b);if(d)return[a.name,...d]}return null}function f1(){let a=(0,ek.useRequestedDoc)(),b=eQ("system");(0,i.useEffect)(()=>{if(!a||aQ(a))return;let c=!0,d=new URLSearchParams({doc:a});return b&&d.set("system",b),fetch(`/api/system-of?${d.toString()}`,{cache:"no-store"}).then(a=>a.ok?a.json():null).then(d=>{let e=d?.system;if(!c||!e||e===b||null!==a||null!==b)return;let f=new URL(window.location.href);f.searchParams.set("system",e),window.history.replaceState(window.history.state,"",f),window.dispatchEvent(new Event(eO))}).catch(()=>{}),()=>{c=!1}},[a,b]);let[c,d]=(0,i.useState)(null);(0,i.useEffect)(()=>{let a=!0;return eu().then(b=>{a&&d(b.projectFile?aS(b.projectFile):"machine")}),()=>{a=!1}},[]);let e=a?aS(a):c;if(null===e)return(0,h.jsx)("div",{className:"app-shell bg-gray-950"});let f=a??"default",g="erd"===e?(0,h.jsx)(fq,{},f):"sequence"===e?(0,h.jsx)(fQ,{},f):"system"===e?(0,h.jsx)(fZ,{},f):(0,h.jsx)(f2,{}),j=(0,h.jsx)(eJ,{what:"document",resetKey:a,children:g});return b&&aQ(b)?(0,h.jsx)(fb,{children:(0,h.jsxs)("div",{className:"system-frame",children:[(0,h.jsx)(fU,{systemPath:b}),j]})}):(0,h.jsx)(fb,{children:j})}function f2(){let a,b;a=eT(),b=(0,i.useRef)(null),(0,i.useEffect)(()=>{let c=()=>{let a=b.current;if(!a)return;let c=d_.getState(),d=null;if(d&&c.docPath!==d||a.docAt!==c.docPath&&c.definition===a.defAt)return;b.current=null;let e=a8(a.focus);if(!e)return;let f=null,g=null;if("state"===e.kind)(f=f0(c.definition.state,e.name))&&(g={kind:"state",id:e.name});else if("event"===e.kind){let a=function a(b,c){if(!b)return null;let d=(b.transitions??[]).findIndex(a=>a?.event===c);if(d>=0)return{state:b.name,index:d};for(let d of f_(b)){let b=a(d,c);if(b)return b}return null}(c.definition.state,e.name);a&&(f=f0(c.definition.state,a.state),g={kind:"transition",id:`${a.state}:${a.index}`})}if(!f||!g)return;let h=f.length>1?f.slice(0,-1):f;d_.setState({navigationPath:h,currentParent:h[h.length-1]}),c.select(g.kind,g.id);let i=()=>{let a=d_.getState().layout.positions[f[f.length-1]],b=document.getElementById(d3)?.getBoundingClientRect();if(!a||!b?.width)return;let c=S([a],b.width,b.height,{padding:60,maxScale:1});d_.getState().setViewport(c)};requestAnimationFrame(i),setTimeout(i,450)};if(a.nonce>0){let d=d_.getState();b.current=a.focus?{focus:a.focus,docAt:d.docPath,defAt:d.definition}:null,c()}return d_.subscribe(c)},[a]),(0,i.useEffect)(()=>d_.subscribe((a,b)=>{if(a.selection===b.selection||!a.selection.id)return;let{kind:c,id:d}=a.selection;if("state"===c)eS(`state:${d}`);else if("event"===c)eS(`event:${d}`);else if("transition"===c){let b=function(a,b){let c=b.lastIndexOf(":"),d=f0(a.state,b.slice(0,c));if(!d)return null;let e=a.state;for(let a of d.slice(1))e=f_(e).find(b=>b.name===a);return e?.transitions?.[Number(b.slice(c+1))]?.event??null}(a.definition,d);b&&eS(`event:${b}`)}}),[]);let[c,d]=(0,i.useState)("properties"),[e,f]=(0,i.useState)(!1),g=eL({onClose:()=>f(!1),restVh:70,tallVh:92}),j=d_(a=>a.errors),k=d_(a=>a.contextMenu),l=d_(a=>a.hideContextMenu),m=d_(a=>a.addState),n=d_(a=>a.removeState),o=d_(a=>a.setDrawMode),p=d_(a=>a.setDrawSource),q=[{id:"properties",label:"Properties",icon:(0,h.jsx)(ed,{name:"sliders",size:16})},{id:"events",label:"Events",icon:(0,h.jsx)(ed,{name:"bolt",size:16})},{id:"settings",label:"Settings",icon:(0,h.jsx)(ed,{name:"gear",size:16})},{id:"validation",label:"Errors",icon:(0,h.jsx)(em,{}),badge:j.length||void 0}],r=q.find(a=>a.id===c)?.label??"";return(0,h.jsxs)("div",{className:"app-shell dock-offset flex flex-col overflow-hidden",onClick:()=>k.visible&&l(),children:[(0,h.jsx)(ev,{}),(0,h.jsx)(eH,{}),(0,h.jsx)(eo,{}),(0,h.jsxs)("div",{className:"flex flex-1 min-h-0 overflow-hidden relative",children:[(0,h.jsxs)("div",{className:"relative flex-1 overflow-hidden",id:"machine-board",children:[(0,h.jsx)(eJ,{what:"state machine",children:(0,h.jsx)(ec,{})}),(0,h.jsx)(f$,{})]}),e&&(0,h.jsx)("div",{className:"fixed inset-0 z-20 bg-black/50 md:hidden",onClick:g.close,"aria-hidden":"true"}),(0,h.jsxs)("aside",{style:g.sheetStyle,className:`safe-x fixed inset-x-0 bottom-0 z-30 h-[var(--sheet-h)] flex flex-col overflow-hidden rounded-t-2xl border-t border-gray-800 bg-gray-900 shadow-2xl transition-[transform,height] duration-200 ease-out ${e?"translate-y-0":"translate-y-full pointer-events-none"} md:static md:z-auto md:h-auto md:w-80 md:translate-y-0 md:pointer-events-auto md:rounded-none md:border-t-0 md:border-l md:shadow-none md:transition-none`,children:[(0,h.jsxs)("div",{className:"md:hidden",...g.zoneProps,children:[(0,h.jsx)("div",{className:"flex justify-center pt-2 pb-1",children:(0,h.jsx)("span",{className:"h-1.5 w-12 rounded-full bg-gray-600"})}),(0,h.jsxs)("div",{className:"flex items-center justify-between border-b border-gray-800 px-4 pb-2",children:[(0,h.jsx)("h2",{className:"text-sm font-semibold text-gray-300",children:r}),(0,h.jsx)("button",{onClick:g.close,className:"-mr-2 px-3 py-2 text-lg text-gray-400","aria-label":"Close panel",children:"✕"})]})]}),(0,h.jsx)("div",{className:"hidden border-b border-gray-800 md:flex",children:q.map(a=>(0,h.jsxs)("button",{onClick:()=>d(a.id),className:`flex-1 text-xs py-2 px-1 text-center transition-colors relative ${c===a.id?"text-blue-400 border-b-2 border-blue-400 bg-gray-800/50":"text-gray-500 hover:text-gray-300"}`,children:[a.label,void 0!==a.badge&&a.badge>0&&(0,h.jsx)("span",{className:"absolute top-1 right-1 bg-red-600 text-white text-[9px] rounded-full px-1 min-w-[14px]",children:a.badge})]},a.id))}),(0,h.jsxs)("div",{className:"touch-targets dock-offset flex-1 overflow-y-auto overscroll-contain",children:["properties"===c&&(0,h.jsx)(ef,{}),"events"===c&&(0,h.jsx)(eh,{}),"settings"===c&&(0,h.jsx)(ei,{}),"validation"===c&&(0,h.jsx)(ej,{})]})]}),(0,h.jsx)(ep,{})]}),(0,h.jsx)("nav",{className:"dock-safe safe-x fixed inset-x-0 bottom-0 z-40 flex border-t border-gray-800 bg-gray-900/95 backdrop-blur-md md:hidden",children:q.map(a=>{let b=e&&c===a.id;return(0,h.jsxs)("button",{onClick:()=>{var b;return b=a.id,void(e&&c===b?g.close():f(!0),d(b))},"aria-pressed":b,className:`relative flex h-14 flex-1 flex-col items-center justify-center gap-0.5 text-[11px] transition-colors ${b?"text-blue-400":"text-gray-500"}`,children:[(0,h.jsx)("span",{className:"flex h-4 items-center text-base leading-none",children:a.icon}),(0,h.jsx)("span",{children:a.label}),void 0!==a.badge&&a.badge>0&&(0,h.jsx)("span",{className:"absolute top-1 right-1/2 translate-x-4 rounded-full bg-red-600 px-1 text-[10px] leading-4 text-white min-w-[16px]",children:a.badge}),b&&(0,h.jsx)("span",{className:"absolute inset-x-4 top-0 h-0.5 rounded-full bg-blue-400"})]},a.id)})}),k.visible&&(0,h.jsx)("div",{className:"fixed z-50 bg-gray-900 border border-gray-700 rounded-lg shadow-xl py-1 min-w-[180px] md:min-w-[140px]",style:{left:k.x,top:k.y,maxWidth:"calc(100vw - 1rem)",maxHeight:"calc(100dvh - 1rem)",overflowY:"auto",transform:"translate(0, 0)"},onClick:a=>a.stopPropagation(),children:k.target?.kind==="state"?(0,h.jsxs)(h.Fragment,{children:[(0,h.jsxs)("button",{className:"block w-full text-left text-sm text-gray-300 hover:bg-gray-800 px-4 py-3 md:text-xs md:px-3 md:py-1.5",onClick:()=>{o("transition"),p(k.target.id),l()},children:[(0,h.jsx)(ed,{name:"draw"})," Draw transition from here"]}),(0,h.jsxs)("button",{className:"block w-full text-left text-sm text-red-400 hover:bg-gray-800 px-4 py-3 md:text-xs md:px-3 md:py-1.5",onClick:()=>{k.target?.id&&n(k.target.id),l()},children:[(0,h.jsx)(ed,{name:"trash"})," Delete state"]})]}):(0,h.jsx)(h.Fragment,{children:(0,h.jsxs)("button",{className:"block w-full text-left text-sm text-gray-300 hover:bg-gray-800 px-4 py-3 md:text-xs md:px-3 md:py-1.5",onClick:()=>{let a=prompt("State name:");a&&m(null,{name:a,kind:"normal"}),l()},children:[(0,h.jsx)(ed,{name:"plus"})," Add state here"]})})})]})}a.s(["default",()=>f1],95421)}];
|
|
16
16
|
|
|
17
17
|
//# sourceMappingURL=%5Broot-of-the-server%5D__edbb995c._.js.map
|