@mindexec/cli 0.2.379 → 0.2.380

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.
@@ -1,49 +0,0 @@
1
- var Jm=Object.defineProperty;var Zm=(e,t,n)=>t in e?Jm(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var Pl=(e,t,n)=>Zm(e,typeof t!="symbol"?t+"":t,n);import{r as g,j as o,a as Qm}from"./vendor-react-BXzpOyCS.js";import{l as ep,a as Ct,s as Xt,b as tp,d as ap,r as np,c as op,e as sp,i as El}from"./storage-RP5Dyxmq.js";import{r as mi,g as Ds,w as rp,a as gr,d as _l,b as ip,t as pi,n as gi,c as Ur,e as lp,p as dc,v as dp,R as cp,f as up,u as mp,h as pp,i as Bl,s as et,j as lo,l as hr,k as co,m as ss,o as uo,q as mo,x as rs,y as qt,z as Dl,A as Ua,B as gp,C as Ol,D as hp,E as fp,F as bp,G as yp,H as xp,I as Cp,J as kp,K as Zt,L as cc,T as wp,M as Sp,N as Fl,O as po,P as uc,Q as Hr,S as Wr,U as mc,V as is,W as xs,X as Co,Y as $l,Z as Y,_ as fr,$ as ko,a0 as vp,a1 as jp,a2 as zl,a3 as Ul,a4 as br,a5 as Ip,a6 as Np,a7 as Ap,a8 as Mp,a9 as Tp,aa as Rp,ab as Lp,ac as Pp,ad as Ep,ae as _p,af as Bp}from"./canvas-runtime-D3amtMwe.js";import{e as Dp,d as Op}from"./vendor-msgpack-BE8aAsr3.js";import{R as f}from"./app-runtime-xD2Z3NdN.js";import{g as yr,A as Hl,a as Cs}from"./index-De6zm3_M.js";import{r as pc}from"./productionAdapterConfig-C5jfk6oG.js";import{getSupabaseBrowserClient as Os}from"./supabaseAuthAdapter-CuJuASQT.js";import{c as Fp,a as $p,r as Wl}from"./toolHandoff-D5e5f7t5.js";import{a as Vl,s as zp}from"./executionModeSettings-NJqurj-o.js";import{a as Yl,p as Up}from"./runtimeSettingsPersistenceProjection-BoNWmYjU.js";import{A as Hp,D as Wp,E as Sn,w as vn,I as jn,V as In,l as Ms,F as kt,J as Vp,N as Vr,O as Ts,Q as Nn,W as gc,Y as Yp,Z as hc,_ as Gp,i as vo,$ as fc,a0 as Kp,a1 as Gl,a2 as Xp,a3 as Ca,a4 as Kl,T as Rs,a5 as Xl,a6 as Ao,a7 as qp,R as jo,a8 as ks,a9 as bc,aa as Yr,X as Pt,o as yc,ab as Jp,ac as Zp,f as Qp,ad as ql,ae as eg,h as wo,x as tg,af as ag,ag as ng,ah as Jl,ai as Zl,aj as Ql,g as ed,ak as ls,H as go,al as ds,s as xr,am as td,an as Jt,c as og,ao as sg,ap as Cr,aq as ad,ar as rg,as as cs,at as kr,au as nd,av as od,aw as sd,ax as ig,ay as lg,az as dg,aA as cg,n as ug,aB as mg,aC as pg,aD as gg,aE as hg,aF as fg,aG as bg,aH as yg,aI as xg}from"./vendor-icons-DE3gIReG.js";const Cg=1200,Xa="LocalBridgeOriginalNodeId";function wt(e){return typeof e=="object"&&e!==null}function ya(e,t){const n=Number(e);return Number.isFinite(n)?n:t}function q(e){return typeof e=="string"?e:""}function xc(){return typeof window<"u"?{width:window.innerWidth||1280,height:window.innerHeight||720}:{width:1280,height:720}}function Gr(e,t,n){const r=Number(e),d=Number(t),c=Number(n);if(!Number.isFinite(r)||!Number.isFinite(d)||!Number.isFinite(c)||c<=0)return null;const p=1400/c,b=xc();return{x:b.width/2-r*p,y:b.height/2-d*p,scale:p}}function kg(e){return wt(e)?Gr(e.x??e.X,e.y??e.Y,e.z??e.Z):null}function wg(e){if(!wt(e))return null;const t=Number(e.x),n=Number(e.y),r=Number(e.scale);if(!Number.isFinite(t)||!Number.isFinite(n)||!Number.isFinite(r)||r<=0)return null;const d=xc();return{x:(d.width/2-t)/r,y:(d.height/2-n)/r,z:1400/r}}function Sg(e){const t=String(e||"").trim();if(t)try{const n=JSON.parse(t);if(!wt(n))return;const r={};for(const[d,c]of Object.entries(n)){const p=kg(c);p&&(r[d]=p)}return Object.keys(r).length>0?r:void 0}catch{return}}function vg(e){if(!e||Object.keys(e).length===0)return null;const t={};for(const[n,r]of Object.entries(e)){const d=wg(r);d&&(t[n]=d)}return Object.keys(t).length>0?JSON.stringify(t):null}function Ls(e){return/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(e)}function Fs(){return crypto.randomUUID()}function hi(e){return wt(e)?"ContentType"in e||"Prompt"in e||"Response"in e||"PositionX"in e||"PositionY"in e||"SourceFilePath"in e||"ImageStack"in e:!1}function rd(e){const t=q(e).trim();if(!t)return null;try{return JSON.parse(t)}catch{return null}}function Kr(e){if(Array.isArray(e))return e;if(!wt(e))return[];for(const t of["Nodes","nodes","Items","items","Content","content","Upserts","upserts"])if(t in e){const n=e[t];if(Array.isArray(n))return n;const r=rd(n);if(r)return Kr(r)}for(const t of["ContentJson","contentJson","content_json"])if(t in e){const n=rd(e[t]);if(n)return Kr(n)}return hi(e)?[e]:[]}function fi(e){return wt(e)?"BoardId"in e&&("Upserts"in e||"upserts"in e||"Deletes"in e||"deletes"in e):!1}function Cc(e){if(!wt(e))return 0;for(const t of["Deletes","deletes"]){const n=e[t];if(Array.isArray(n))return n.length}return 0}function Ps(e){return Kr(e).filter(hi)}function kc(e){return Ps(e).length}function jg(e,t){var c;const n=[...Ps(e)];if(!fi(t))return n;const r=new Set;for(const p of["Deletes","deletes"]){const b=t[p];if(Array.isArray(b))for(const m of b){const y=q(m).trim();y&&r.add(y)}}if(r.size>0)for(let p=n.length-1;p>=0;p-=1){const b=q((c=n[p])==null?void 0:c.Id).trim();b&&r.has(b)&&n.splice(p,1)}const d=new Map;n.forEach((p,b)=>{const m=q(p.Id).trim();m&&d.set(m,b)});for(const p of Ps(t)){const b=q(p.Id).trim(),m=b?d.get(b):void 0;if(m!==void 0){n[m]=p;continue}b&&d.set(b,n.length),n.push(p)}return n}function wc(e){const t=Array.isArray(e)?e.filter(wt):[];return new Map(t.filter(n=>n.NodeId).map(n=>[String(n.NodeId),n]))}async function Xr(e,t){for(const n of e)try{const r=await mi(n,t);return{payload:JSON.parse(r.content),path:n}}catch{}return null}async function Ig(e,t){const n=`.mindexec/boards/${e}.msgpack`,r=`boards/${e}.msgpack`;for(const b of[n,r])try{const m=await ip(b,t);return{payload:Op(m),format:b===n?"msgpack":"legacy-msgpack",path:b}}catch{}const d=`.mindexec/boards/${e}.json`,c=`boards/${e}.json`,p=await Xr([d,c],t);if(p)return{payload:p.payload,format:p.path===d?"json":"legacy-json",path:p.path};throw new Error(`LocalBridge board file not found: ${n}, ${r}, ${d}, ${c}`)}function qr(e){const t=q(e.Id).trim()||q(e.BoardId).trim();return t?{Id:t,Title:q(e.Title)||null,Description:q(e.Description)||null,ThumbnailUrl:q(e.ThumbnailUrl)||null,CreatedAt:q(e.CreatedAt)||null,UpdatedAt:q(e.UpdatedAt)||null,LastCameraX:Number.isFinite(Number(e.LastCameraX))?Number(e.LastCameraX):null,LastCameraY:Number.isFinite(Number(e.LastCameraY))?Number(e.LastCameraY):null,LastCameraZ:Number.isFinite(Number(e.LastCameraZ))?Number(e.LastCameraZ):null,LastCursorX:Number.isFinite(Number(e.LastCursorX))?Number(e.LastCursorX):null,LastCursorY:Number.isFinite(Number(e.LastCursorY))?Number(e.LastCursorY):null,CameraBookmarks:q(e.CameraBookmarks)||null}:null}function id(e){return!wt(e)||hi(e)?!1:"Title"in e||"Description"in e||"ThumbnailUrl"in e||"IsPublic"in e||"LastCameraX"in e||"LastCameraY"in e||"LastCameraZ"in e||"CameraBookmarks"in e||"BoardId"in e||"Upserts"in e||"upserts"in e||"Deletes"in e||"deletes"in e||"ContentJson"in e||"content_json"in e}function bi(e){if(Array.isArray(e))return e.filter(id).map(t=>qr(t)).filter(t=>!!t);if(id(e)){const t=qr(e);return t?[t]:[]}return[]}function Ng(e){const t=e.toLowerCase();return Ag(t)?"remote-control":Mg(t)?"remote-monitor":t==="templatelauncher"||t==="template-launcher"||t.includes("template launcher")?"template-launcher":t.includes("directory")?"directory":t.includes("pdf")?"pdf":t.includes("file")?"file":t.includes("mask")?"mask":t.includes("image")?"image":t.includes("video")?"video":t.includes("embed")?"embed":t==="csv-table"||t.includes("csv-table")||t.includes("csv table")?"csv-table":t.includes("markdown")?"markdown":t.includes("code")?"code":t==="text"||t==="text/plain"||t.includes("plain-text")||t.includes("plain text")?"text":t.includes("ai")||t.includes("task")?"ai-task":t.includes("memo")?"memo":"note"}function Ag(e){const t=e.trim().toLowerCase();if(!t)return!1;if(["remote-control","remote.control","remotecontrol","remote-device","remote.device","remotedevice","remote-fleet-device","remotefleet.device"].includes(t))return!0;const n=t.replace(/[^a-z0-9]+/g,"");return n.includes("remotecontrol")||n.includes("remotedevice")||n.includes("remotefleetdevice")}function Mg(e){const t=e.trim().toLowerCase();if(!t)return!1;if(["remote-monitor","remote.monitor","remotemonitor","remote-hub-monitor","remotehub.monitor","remotehub-monitor","multi-desktop-monitor","multidesktop.monitor","smartview.monitor"].includes(t))return!0;const n=t.replace(/[^a-z0-9]+/g,"");return n.includes("remotemonitor")||n.includes("remotehubmonitor")||n.includes("multidesktopmonitor")||n.includes("smartviewmonitor")}function Tg(e,t){const n=e.Metadata||{},r=n.ThumbnailUrl,d=n.OriginalUrl,c=n.OriginalPath;return pi(q(r)||q(d)||q(c)||q(e.Response),t)}function Rg(e,t,n){const r=e.ImageStack,d=Array.isArray(r==null?void 0:r.Variants)?r.Variants:[];if(d.length===0)return;const c=d.map((b,m)=>{const y=q(b.AssetId).trim(),v=pi(y,n)||t;return v?{variantId:q(b.VariantId)||`variant-${q(e.Id)||m}`,imageUrl:v,assetId:y||void 0,caption:q(b.Caption)||void 0,sourceNodeId:q(e.Id)||void 0,createdAtUtc:q(b.CreatedAtUtc)||void 0}:null}).filter(b=>!!b);if(c.length===0)return;const p=q(r==null?void 0:r.ActiveVariantId);return{activeVariantId:c.some(b=>b.variantId===p)?p:c[0].variantId,variants:c,kind:q(r==null?void 0:r.Kind)||"versions",title:q(r==null?void 0:r.Title)||void 0,updatedAtUtc:q(r==null?void 0:r.UpdatedAtUtc)||void 0}}function Lg(e,t){return!e||e.variants.length===0?t:(e.variants.find(r=>r.variantId===e.activeVariantId)??e.variants[0]).imageUrl||t}function Pg(e,t,n){var p,b,m,y,v,P;const r=(b=(p=e.imageStack)==null?void 0:p.variants)!=null&&b.length?e.imageStack.variants:e.imageUrl?[{variantId:`${e.id}:image`,imageUrl:e.imageUrl,assetId:Mo(e.imageUrl,t)||e.imageUrl,title:e.title,sourceNodeId:e.id,createdAtUtc:n}]:[];if(r.length===0)return null;const d=r.map(S=>({VariantId:S.variantId||Fs(),AssetId:S.assetId||Mo(S.imageUrl,t)||S.imageUrl,CreatedAtUtc:S.createdAtUtc||n,Caption:S.caption||S.title||null}));return{ActiveVariantId:(m=e.imageStack)!=null&&m.activeVariantId&&d.some(S=>{var D;return S.VariantId===((D=e.imageStack)==null?void 0:D.activeVariantId)})?e.imageStack.activeVariantId:d[0].VariantId||"",Variants:d,Kind:((y=e.imageStack)==null?void 0:y.kind)||(d.length>1?"pile":"versions"),Title:((v=e.imageStack)==null?void 0:v.title)||e.title||null,UpdatedAtUtc:((P=e.imageStack)==null?void 0:P.updatedAtUtc)||n}}function Eg(e,t){const n=e.Metadata||{};return pi(q(n.OriginalUrl)||q(n.OriginalPath)||q(n.SourceFilePath)||q(e.SourceFilePath)||q(e.Response),t)}function _g(e){const t={};for(const[n,r]of Object.entries(e??{}))typeof r=="string"?t[n]=r:r!=null&&(t[n]=String(r));return t}function Bg(e){switch(e){case"remote-monitor":return"remote-monitor";case"remote-control":return"remote-control";case"template-launcher":return"templateLauncher";case"directory":return"directory";case"pdf":return"pdf";case"file":return"file";case"image":return"image";case"mask":return"mask";case"video":return"video";case"embed":return"embed";case"code":return"code";case"markdown":return"markdown";case"csv-table":return"csv-table";case"memo":return"memo";case"text":return"text";case"ai-task":return"note";default:return"note"}}function Mo(e,t){const n=String(e||"").trim();if(!n)return"";const r=t.replace(/\/+$/,"");return n.startsWith(`${r}/`)?n.slice(r.length+1):n.replace(/^\/+/,"")}function Dg(e,t){const n=new Map;for(const r of e){const d=t.get(r.from),c=t.get(r.to);!d||!c||n.has(c)||n.set(c,d)}return n}function Og(e){const t=new Set;return e.map(n=>{var m,y;const r=((m=n.metadata)==null?void 0:m[Xa])||"",d=Ls(r)?r:Ls(n.id)?n.id:"",c=!!(d&&t.has(d)),p=d&&!c?d:Fs(),b=((y=n.metadata)==null?void 0:y[Xa])!==p;return t.add(p),{node:b?{...n,metadata:{...n.metadata??{},[Xa]:p}}:n,originalId:p,assignedNodeId:!d||c,metadataStamped:b,duplicateOriginalId:c}})}function Fg(e,t,n,r,d){var y,v,P;const c=Bg(e.kind),p=c==="image"||c==="mask"?Mo(e.imageUrl,d):"",b=["video","pdf","file","directory","embed"].includes(c)?Mo(e.assetUrl||e.sourceFilePath||e.body,d):"",m={...e.metadata??{},[Xa]:t,ReactNodeId:e.id,ReactKind:e.kind};if(e.kind==="remote-monitor"&&(m.RemoteHub??(m.RemoteHub="Gated"),m.RemoteRoute??(m.RemoteRoute="Gated"),m.RemoteConnected??(m.RemoteConnected="0"),m.RemoteTotal??(m.RemoteTotal="30"),m.RemotePage??(m.RemotePage="1/1"),m.AdapterState??(m.AdapterState="adapter-gated")),e.kind==="remote-control"&&(m.SemanticType??(m.SemanticType="RemoteFleetDevice"),m.RemoteFleetSchemaVersion??(m.RemoteFleetSchemaVersion="remote-fleet-device@1"),m.RemoteRoute??(m.RemoteRoute="Gated"),m.RemoteInput??(m.RemoteInput="Off"),m.AdapterState??(m.AdapterState="adapter-gated")),e.kind==="mask"&&(m.ImageRouterMask??(m.ImageRouterMask="true"),m.SemanticType??(m.SemanticType="ImageEditMask")),e.kind==="embed"){const S=e.assetUrl||e.body||e.sourceFilePath||"";m.source??(m.source="embed"),m.renderMode??(m.renderMode="card"),m.provider??(m.provider="web"),m.sourceUrl??(m.sourceUrl=S),m.url??(m.url=S),m.AdapterState??(m.AdapterState="local-reference")}return e.kind==="video"&&(m.assetKind??(m.assetKind="video"),m.videoMode??(m.videoMode=(y=e.assetUrl)!=null&&y.startsWith(d)?"local_bridge":"local_reference"),m.AdapterState??(m.AdapterState=((v=e.metadata)==null?void 0:v.PromptOnly)==="true"?"adapter-gated":"local-reference")),(P=e.tags)!=null&&P.length&&(m.ReactTags=JSON.stringify(e.tags)),p&&(m.OriginalUrl=p,m.ThumbnailUrl=p),b&&(m.OriginalPath=b,m.SourceFilePath=b),{Id:t,ContentType:c,Prompt:e.title||c,Response:c==="image"||c==="mask"?p||e.body||null:c==="remote-monitor"?e.body||"RemoteHub monitor node. Frames and input stay adapter-gated until LocalBridge is connected.":c==="remote-control"?e.body||"Remote device control node. Frames and input stay adapter-gated until LocalBridge is connected.":b||e.body||null,PositionX:e.x,PositionY:e.y,PositionZ:0,IsLoading:e.status==="running",Width:Math.round(e.width),Height:Math.round(e.height),Children:[],ParentId:n||null,IsExpanded:!!e.isExpanded,OriginalHeight:Math.round(e.originalHeight??0),IsAiEnabled:e.aiEnabled!==!1,IsChunkedText:!!e.isChunkedText,TotalLineCount:Math.round(e.totalLineCount??0),SourceFilePath:e.sourceFilePath||b||null,ScrollOffset:e.scrollOffset??0,MaxScroll:e.maxScroll??0,CreatedAt:r,UpdatedAt:r,IsWordWrap:e.wordWrap??e.kind!=="code",Metadata:m,ImageStack:c==="image"?Pg(e,d,r):null}}function $g(e,t){return{NodeId:t,PositionX:e.x,PositionY:e.y,PositionZ:0,Width:Math.round(e.width),Height:Math.round(e.height),IsExpanded:!!e.isExpanded,OriginalHeight:Math.round(e.originalHeight??0)}}function zg(e,t,n){const r=q(e.ContentType)||"note",d=q(e.Prompt).trim(),c=q(e.Response).trim(),p=_g(e.Metadata),b=q(e.Id).trim();b&&(p[Xa]??(p[Xa]=b));const y=["true","1","yes"].includes(String(p.ImageRouterMask||p.IsMask||"").trim().toLowerCase())?"mask":Ng(r),v=y==="memo"&&["mindcanvasagent","agentcommand"].includes(String(p.SemanticType||p.semanticType||"").trim().toLowerCase()),P=y==="memo"&&["codenote","code-note"].includes(String(p.SemanticType||p.semanticType||"").trim().toLowerCase()),S=q(e.SourceFilePath)||p.OriginalPath||p.SourceFilePath||"",D=y==="video"||y==="pdf"||y==="file"||y==="directory"||y==="embed"?Eg(e,n):void 0,_=d||e.SourceFilePath||r||"LocalBridge node",$=y==="image"?c||d||"Image asset":y==="mask"?c||d||"Image mask asset":y==="remote-monitor"?c||d||"RemoteHub monitor node. Frames and input stay adapter-gated until LocalBridge is connected.":y==="remote-control"?c||d||S||"Remote device control node. Frames and input stay adapter-gated until LocalBridge is connected.":y==="pdf"||y==="file"||y==="directory"||y==="embed"?c||S||d||r:c||d||S||"",O=v?500:P?400:y==="remote-monitor"?860:y==="remote-control"||y==="template-launcher"?560:y==="csv-table"?720:y==="embed"?460:y==="video"?420:y==="markdown"?380:y==="text"||y==="image"||y==="mask"?360:320,U=v||P?300:y==="remote-monitor"?640:y==="remote-control"?390:y==="template-launcher"?620:y==="csv-table"?420:y==="embed"?260:y==="video"?236:y==="markdown"?240:y==="text"?210:y==="image"||y==="mask"?260:180,W=y==="image"||y==="mask"?Tg(e,n):void 0,re=y==="image"?Rg(e,W,n):void 0,se=!!(e.IsChunkedText||p.IsChunkedText==="true"),Ne=ya(e.TotalLineCount??p.TotalLineCount,0),ge=ya(e.ScrollOffset,0),ze=ya(e.MaxScroll,0);return{id:String(e.Id||crypto.randomUUID()),kind:y,title:y==="remote-monitor"?d||"Multi Desktop Monitor":y==="remote-control"?d||p.RemoteFleetDeviceName||"Remote Device":y==="template-launcher"?d||"Template Launcher":_,body:$,x:ya((t==null?void 0:t.PositionX)??e.PositionX,0),y:ya((t==null?void 0:t.PositionY)??e.PositionY,0),width:Math.max(160,Math.min(900,ya((t==null?void 0:t.Width)??e.Width,O))),height:Math.max(120,Math.min(900,ya((t==null?void 0:t.Height)??e.Height,U))),status:e.IsLoading?"running":y==="ai-task"?"idle":void 0,imageUrl:Lg(re,W),imageStack:re,assetUrl:D,sourceFilePath:S||void 0,isChunkedText:se||void 0,totalLineCount:se?Ne:void 0,scrollOffset:se?ge:void 0,maxScroll:se?ze:void 0,isExpanded:typeof e.IsExpanded=="boolean"?e.IsExpanded:void 0,originalHeight:ya(e.OriginalHeight,0)||void 0,tags:v?["Agent Command",p.AgentCommandRequestedRole||"Researcher",p.AgentCommandStatus||"Draft"]:P?["Code Note",p.CodeNoteStatus||"Draft",p.CodeNoteSyncState||"Unlinked"]:y==="remote-monitor"?["Remote","Monitor","LocalBridge"]:y==="remote-control"?["Remote","Control","LocalBridge"]:["LocalBridge",r],metadata:y==="remote-monitor"?Ug(p):y==="remote-control"?Hg(p):p,role:e.IsAiEnabled?"ai-enabled":void 0,aiEnabled:typeof e.IsAiEnabled=="boolean"?e.IsAiEnabled:void 0,wordWrap:typeof e.IsWordWrap=="boolean"?e.IsWordWrap:void 0}}function Ug(e){return{RemoteHub:"Gated",RemoteRoute:"Gated",RemoteConnected:"0",RemoteTotal:"30",RemotePage:"1/1",AdapterState:"adapter-gated",...e}}function Hg(e){return{SemanticType:"RemoteFleetDevice",RemoteFleetSchemaVersion:"remote-fleet-device@1",RemoteFleetDeviceId:"",RemoteFleetDeviceName:"Remote Device",RemoteFleetDevicePlatform:"unknown",RemoteFleetDeviceConnected:"false",RemoteInput:"Off",RemoteHub:"Gated",RemoteRoute:"Gated",RemoteBaseUrl:"http://127.0.0.1:5147",AdapterState:"adapter-gated",...e}}function Wg(e,t){const n=[];for(const r of e){const d=String(r.Id||""),c=String(r.ParentId||"");!d||!c||!t.has(d)||!t.has(c)||n.push({id:`edge-local-${c}-${d}`,from:c,to:d,kind:"context"})}return n}async function Vg(e=Ds()){const t=await mi(".mindexec/boards/_metadata.json",e),n=JSON.parse(t.content);return(Array.isArray(n)?n.filter(wt):[]).map(c=>qr(c)).filter(c=>!!c).sort((c,p)=>String(p.UpdatedAt||"").localeCompare(String(c.UpdatedAt||"")))}async function Yg(e){try{const t=await mi(".mindexec/boards/_metadata.json",e),n=JSON.parse(t.content);return Array.isArray(n)?n.filter(wt):[]}catch{return[]}}async function Gg(e,t,n,r=Ds(),d=null){var He,jt,he,We,at,nt;if((He=e.source)!=null&&He.partialImport)throw new Error("This board was imported from a partial original payload. Export is blocked to avoid data loss.");if((jt=e.source)!=null&&jt.truncated)throw new Error("This board was truncated during import. Export is blocked to avoid data loss.");const c=(he=e.source)!=null&&he.exportedByReact?String(e.source.boardId||""):"",p=Ls(c),b=Ls(c)?c:Fs(),m=new Date().toISOString(),y=Og(e.nodes),v=y.map(z=>z.node),P=new Map(y.map(z=>[z.node.id,z.originalId])),S=Dg(e.edges,P),D=y.map(({node:z,originalId:mt})=>Fg(z,mt,S.get(mt),m,r)),_=y.map(({node:z,originalId:mt})=>$g(z,mt)),$=t.scale>0?t.scale:1,O=(window.innerWidth/2-t.x)/$,U=(window.innerHeight/2-t.y)/$,W=1400/$,re=Number((d==null?void 0:d.x)??((We=e.viewState)==null?void 0:We.cursorX)??0),se=Number((d==null?void 0:d.y)??((at=e.viewState)==null?void 0:at.cursorY)??0),Ne=(nt=e.nodes.find(z=>z.kind==="image"&&z.imageUrl))==null?void 0:nt.imageUrl,ge={Id:b,UserId:"00000000-0000-0000-0000-000000000000",Title:e.name||"Untitled Board",Description:"Exported from MindExec React",ThumbnailUrl:Mo(Ne,r)||"",IsPublic:!1,CreatedAt:m,SyncedCloudBoardId:null,LastSyncedAt:null,LastCloudCopyStatus:null,UpdatedAt:m,LastCameraX:O,LastCameraY:U,LastCameraZ:W,LastCursorX:Number.isFinite(re)?re:0,LastCursorY:Number.isFinite(se)?se:0,CameraBookmarks:vg(e.settings.cameraBookmarks)},ze=`.mindexec/boards/${b}.msgpack`,St=`.mindexec/boards/${b}.json`,Ue=`.mindexec/boards/${b}.layout.json`,G=`.mindexec/boards/${b}.delta.json`,V=`boards/${b}.delta.json`,de=await Yg(r),te=[ge,...de.filter(z=>q(z.Id)!==b)],vt=Dp(D);await rp(ze,vt,n,r),await gr(St,JSON.stringify(D,null,2),n,r),await gr(Ue,JSON.stringify(_,null,2),n,r),await gr(".mindexec/boards/_metadata.json",JSON.stringify(te,null,2),n,r);const H=await Promise.allSettled([_l(G,n,r),_l(V,n,r)]);return f.emit("localBridge.board.exported",{boardId:b,nodes:D.length,edges:e.edges.length,snapshotFormat:"msgpack",msgpackBytes:vt.byteLength,jsonMirror:!0,deltaCleared:H.some(z=>z.status==="fulfilled"&&z.value.success),reusedBoardId:p,stableNodeIds:y.length,assignedNodeIds:y.filter(z=>z.assignedNodeId).length,metadataStampedNodeIds:y.filter(z=>z.metadataStamped).length,duplicateOriginalNodeIds:y.filter(z=>z.duplicateOriginalId).length}),{metadata:ge,source:{kind:"localBridge",boardId:b,loadedAt:m,originalNodeCount:D.length,renderedNodeCount:D.length,truncated:!1,exportedByReact:!0,snapshotFormat:"msgpack"},nodes:v,msgpackPath:ze,boardPath:St,layoutPath:Ue}}async function Kg(e,t,n=Ds()){const r=await Ig(e.Id,n);let d=new Map;const c=await Xr([`.mindexec/boards/${e.Id}.layout.json`,`boards/${e.Id}.layout.json`],n);c&&(d=wc(c.payload));let p=null;const b=await Xr([`.mindexec/boards/${e.Id}.delta.json`,`boards/${e.Id}.delta.json`],n);b&&(p=b.payload);const m=p?bi(p)[0]:null,y=!!(p&&fi(p)),v=y?jg(r.payload,p):r.payload;return Sc(v,t,{boardId:(m==null?void 0:m.Id)??e.Id,title:(m==null?void 0:m.Title)||e.Title||"LocalBridge Board",updatedAt:(m==null?void 0:m.UpdatedAt)??e.UpdatedAt,layoutPayload:Array.from(d.values()),baseUrl:n,cameraBookmarks:(m==null?void 0:m.CameraBookmarks)??e.CameraBookmarks,lastCursorX:(m==null?void 0:m.LastCursorX)??e.LastCursorX,lastCursorY:(m==null?void 0:m.LastCursorY)??e.LastCursorY,deltaApplied:y,deltaUpserts:p?kc(p):0,deltaDeletes:p?Cc(p):0,snapshotFormat:r.format})}function Sc(e,t,n={}){const r=Ps(e),d=fi(e),c=n.deltaUpserts??(d?r.length:0),p=n.deltaDeletes??(d?Cc(e):0),b=n.layoutPayload?wc(n.layoutPayload):new Map,m=r.slice(0,Cg),y=m.map(se=>zg(se,b.get(String(se.Id||"")),n.baseUrl??Ds())),v=new Set(y.map(se=>se.id)),P=Wg(m,v),S=r.length>y.length,D=d,_=n.deltaApplied===!0,$=n.boardId||Fs(),O=n.updatedAt||new Date().toISOString(),U=Number(n.lastCursorX),W=Number(n.lastCursorY),re=Number.isFinite(U)&&Number.isFinite(W);return f.emit("localBridge.board.loaded",{boardId:$,nodes:y.length,originalNodes:r.length,truncated:S,snapshotFormat:n.snapshotFormat,partialImport:D,deltaImport:d,deltaApplied:_,deltaUpserts:c,deltaDeletes:p}),{id:`localBridge:${$}`,name:n.title||"LocalBridge Board",nodes:y,edges:P,settings:{...t,cameraBookmarks:Sg(n.cameraBookmarks)},viewState:re?{cursorX:U,cursorY:W}:void 0,updatedAt:O,source:{kind:"localBridge",boardId:$,loadedAt:new Date().toISOString(),snapshotFormat:n.snapshotFormat,originalNodeCount:r.length,renderedNodeCount:y.length,truncated:S,partialImport:D,deltaImport:d,deltaApplied:_}}}const vc=new Set(["research","web-search","analyze","summarize","create","decision","human-review","image-generate","video-generate","output","ai-task"]),ld={en:"AI Task",ko:"AI 작업",ja:"AIタスク",zh:"AI 任务"},dd={en:{research:"Research","web-search":"Evidence",analyze:"Analyze",summarize:"Summary",create:"Create",decision:"Decision","human-review":"Review","image-generate":"Image","video-generate":"Video",output:"Output","ai-task":"Task"},ko:{research:"조사","web-search":"근거",analyze:"분석",summarize:"요약",create:"작성",decision:"결정","human-review":"검토","image-generate":"이미지","video-generate":"비디오",output:"결과","ai-task":"작업"},ja:{research:"調査","web-search":"根拠",analyze:"分析",summarize:"要約",create:"作成",decision:"決定","human-review":"確認","image-generate":"画像","video-generate":"動画",output:"結果","ai-task":"タスク"},zh:{research:"调研","web-search":"证据",analyze:"分析",summarize:"总结",create:"创作",decision:"决策","human-review":"审核","image-generate":"图像","video-generate":"视频",output:"结果","ai-task":"任务"}};function yi(e,t){const n=gi(e);return n!=="auto"?n:Mc(t)?"ko":Tc(t)?"ja":Rc(t)?"zh":"en"}function Xg(e){return ld[e]??ld.en}function qg(e,t){var r;const n=jc(e);return((r=dd[t])==null?void 0:r[n])??dd.en[n]??"Task"}function Jg(e,t){const n=yi(t,e),r=[...vc].join(", ");return["Create a simple MindExec business execution flow for this objective:",e,"",Ur(n),`User-facing node "title" and "instruction" values MUST use ${lp(n)} unless the objective explicitly asks for another language.`,'JSON property names, internal "kind" values, and pin IDs MUST remain in English exactly as specified.',"","MindExec is not an n8n/Zapier-style automation grammar.","The user should feel they are arranging work sentences and business thinking, not triggers, apps, fields, JSON, webhooks, API steps, or low-level automation blocks.","","Most nodes will be rendered to the user as AI Task nodes.",'The "kind" field is primarily an internal execution intent hint that the user does not need to learn.',"Use image-generate or video-generate only when the graph truly needs an explicit media generation block.","",`Available internal intent hints: ${r}`,"","Return only JSON:","{",' "nodes": [',' { "kind": "research", "title": "Investigate market evidence", "instruction": "..." }'," ],",' "edges": [',' { "from": 0, "fromPin": "result", "to": 1, "toPin": "input" }'," ]","}","","Rules:","- 4 to 7 nodes.","- Use large business-language tasks, not low-level n8n/zapier steps.","- Think in this user model: AI Task = work sentence, Line = pass the previous result, Context = background thought/document.","- Do not create nodes for Trigger, Action, Webhook, HTTP request, app event, JSON parsing, iterator, filter, credential, or field mapping.","- Prefer a practical sequence for a solo global SaaS/business builder.","- Use only the available internal intent hints.","- Keep titles short and task-like, not category names such as Research, Analyze, Create, Web Search, or Output.","- Instructions should be natural-language work requests that a business owner would write.","- Preserve evidence/trust needs in the instruction when the task depends on current facts or source URLs.",'- Prefer "result" -> "input" edges unless a stronger pin contract is needed.'].join(`
2
- `)}function Zg(e){const t=th(e);if(!t)return null;let n;try{n=JSON.parse(t)}catch{return null}if(!wr(n)||!Array.isArray(n.nodes))return null;const r=n.nodes.slice(0,8).map(c=>{if(!wr(c))return null;const p=jc(ho(c.kind));if(!vc.has(p))return null;const b=ho(c.title).trim(),m=ho(c.instruction).trim();return!b||!m?null:{kind:p,title:b.slice(0,90),instruction:m}}).filter(c=>!!c);if(r.length<2)return null;const d=Array.isArray(n.edges)?n.edges.slice(0,14).map(c=>{if(!wr(c))return null;const p=ud(c.from),b=ud(c.to);return p<0||b<0||p>=r.length||b>=r.length||p===b?null:{from:p,fromPin:ho(c.fromPin).trim()||Nc(r[p].kind),to:b,toPin:ho(c.toPin).trim()||Ac(r[b].kind)}}).filter(c=>!!c):[];return{nodes:r,edges:d.length>0?d:Ic(r)}}function Qg(e,t){if(t==="en")return!0;const n=e.nodes.map(r=>`${r.title} ${r.instruction}`).join(" ");return t==="ko"?Mc(n):t==="ja"?ah(n):t==="zh"?Rc(n):!0}function cd(e,t){const n=e.trim()||"the selected note",r=eh(n,t);return{nodes:r,edges:Ic(r)}}function eh(e,t){return t==="ko"?[{kind:"research",title:"비즈니스 맥락 정리",instruction:`이 목표의 시장, 고객, 경쟁, 가격, 채널 맥락을 정리하세요: ${e}`},{kind:"web-search",title:"근거 있는 사실 수집",instruction:`이 목표에 중요한 최신 근거와 URL을 찾고, 링크와 불확실성을 함께 남기세요: ${e}`},{kind:"analyze",title:"핵심 기회 분석",instruction:`앞선 결과를 바탕으로 ${e}의 리스크, 차별점, 가장 빠른 매출 경로를 분석하세요.`},{kind:"create",title:"제안 초안 작성",instruction:`분석을 바탕으로 바로 테스트할 수 있는 오퍼, 랜딩 카피, 실험안, 실행 브리프를 작성하세요: ${e}`},{kind:"output",title:"다음 행동 정리",instruction:`${e} 실행 리포트를 정리하세요. 근거, 가정, 결정, 리스크, 다음 행동, 후속 flow 제안을 포함하세요.`}]:t==="ja"?[{kind:"research",title:"事業文脈を整理",instruction:`この目標の市場、顧客、競合、価格、チャネルを整理してください: ${e}`},{kind:"web-search",title:"根拠を集める",instruction:`この目標に重要な最新の根拠とURLを探し、リンクと不確実性を残してください: ${e}`},{kind:"analyze",title:"重要な機会を分析",instruction:`前の結果を使って、${e} のリスク、差別化、最短の収益化ルートを分析してください。`},{kind:"create",title:"提案を下書き",instruction:`分析をもとに、すぐ試せるオファー、ランディングコピー、実験案、実行ブリーフを作成してください: ${e}`},{kind:"output",title:"次の行動にまとめる",instruction:`${e} の実行レポートを作成し、根拠、仮説、判断、リスク、次の行動、後続flow案を含めてください。`}]:t==="zh"?[{kind:"research",title:"梳理业务背景",instruction:`梳理这个目标的市场、客户、竞争、价格和渠道背景: ${e}`},{kind:"web-search",title:"收集可信证据",instruction:`为这个目标寻找重要的最新证据和URL,并保留链接与不确定性: ${e}`},{kind:"analyze",title:"分析关键机会",instruction:`基于前面的结果,分析 ${e} 的风险、差异化和最快收入路径。`},{kind:"create",title:"起草商业提案",instruction:`把分析转成可以马上测试的报价、落地页文案、实验方案或执行简报: ${e}`},{kind:"output",title:"整理下一步行动",instruction:`整理 ${e} 的执行报告,包含证据、假设、决策、风险、下一步行动和后续flow建议。`}]:[{kind:"research",title:"Map the business context",instruction:`Map the market, customer, competitor, pricing, and channel context for this objective: ${e}`},{kind:"web-search",title:"Collect source-backed facts",instruction:`Find current source-backed facts and URLs that matter for this objective: ${e}. Preserve links and note uncertainty.`},{kind:"analyze",title:"Extract what matters",instruction:`Using the previous results, identify the important changes, risks, differentiation, and fastest path to revenue for: ${e}`},{kind:"create",title:"Draft the response",instruction:`Turn the analysis into a practical launch asset, offer, copy, experiment, or execution brief for: ${e}`},{kind:"output",title:"Turn it into next actions",instruction:`Compile the execution report for ${e}: source-backed evidence, assumptions, decision, risks, next actions, and a suggested follow-up flow.`}]}function jc(e){const t=e.trim().toLowerCase();return t==="websearch"||t==="search"?"web-search":t==="image"?"image-generate":t==="video"?"video-generate":t==="task"?"ai-task":t||"ai-task"}function Ic(e){return e.slice(0,-1).map((t,n)=>({from:n,fromPin:Nc(t.kind),to:n+1,toPin:Ac(e[n+1].kind)}))}function Nc(e){switch(e){case"research":return"brief";case"web-search":return"summary";case"analyze":return"analysis";case"summarize":return"summary";case"create":return"draft";case"decision":return"decision";case"image-generate":return"image";case"video-generate":return"video";case"output":return"report";default:return"result"}}function Ac(e){switch(e){case"research":return"goal";case"web-search":return"query";case"analyze":return"source";case"summarize":return"source";case"create":return"brief";case"decision":return"options";case"human-review":return"proposal";case"image-generate":return"prompt";case"video-generate":return"prompt";case"output":return"asset";default:return"input"}}function th(e){const t=e==null?void 0:e.trim();if(!t)return null;const n=t.indexOf("{"),r=t.lastIndexOf("}");return n>=0&&r>n?t.slice(n,r+1):null}function wr(e){return!!(e&&typeof e=="object"&&!Array.isArray(e))}function ho(e){return typeof e=="string"?e:""}function ud(e){if(typeof e=="number"&&Number.isInteger(e))return e;if(typeof e=="string"){const t=Number.parseInt(e,10);return Number.isInteger(t)?t:-1}return-1}function Mc(e){return!!(e&&/[\u1100-\u11ff\u3130-\u318f\uac00-\ud7af]/.test(e))}function Tc(e){return!!(e&&/[\u3040-\u30ff]/.test(e))}function ah(e){return Tc(e)||!!(e&&/[\u4e00-\u9fff]/.test(e))}function Rc(e){return!!(e&&/[\u4e00-\u9fff]/.test(e))}const xi=["id","user_id","title","description","content_json","thumbnail_url","is_public","created_at","updated_at","last_camera_x","last_camera_y","last_camera_z","last_cursor_x","last_cursor_y","camera_bookmarks"].join(","),nh=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;function oh(e){if(nh.test(e))return e;if(typeof crypto<"u"&&"randomUUID"in crypto)return crypto.randomUUID();throw new Error("A browser crypto.randomUUID implementation is required to create cloud boards.")}function Lc(e){if(!e)return{};if(Array.isArray(e))return{nodes:e};if(typeof e=="object")return e;if(typeof e!="string"||!e.trim())return{};try{const t=JSON.parse(e);if(Array.isArray(t))return{nodes:t};if(t&&typeof t=="object")return t}catch{return{}}return{}}function sh(e){return JSON.stringify({id:e.id,name:e.name,nodes:e.nodes,edges:e.edges,settings:e.settings,viewState:e.viewState,updatedAt:e.updatedAt})}function Jr(e,t=new Date().toISOString()){return e&&!Number.isNaN(Date.parse(e))?e:t}function Ci(e){return(e==null?void 0:e.trim().slice(0,90))||"Untitled Board"}function Pc(e){const t=Lc(e.content_json),n=Jr(e.updated_at??t.updatedAt);return{id:e.id,name:Ci(e.title??t.name),updatedAt:n,createdAt:Jr(e.created_at,n),nodeCount:Array.isArray(t.nodes)?t.nodes.length:0,edgeCount:Array.isArray(t.edges)?t.edges.length:0,sourceKind:"cloud"}}function rh(e,t){var v,P;const n=Lc(e.content_json),r=Jr(e.updated_at??n.updatedAt),d=Number((v=n.viewState)==null?void 0:v.cursorX),c=Number((P=n.viewState)==null?void 0:P.cursorY),p=Number(e.last_cursor_x),b=Number(e.last_cursor_y),m=Number.isFinite(d)&&Number.isFinite(c),y=Number.isFinite(p)&&Number.isFinite(b);return{id:e.id,name:Ci(e.title??n.name),nodes:Array.isArray(n.nodes)?n.nodes:[],edges:Array.isArray(n.edges)?n.edges:[],settings:n.settings??t,viewState:m?{cursorX:d,cursorY:c}:y?{cursorX:p,cursorY:b}:void 0,updatedAt:r,source:{kind:"cloud",boardId:e.id,loadedAt:new Date().toISOString(),snapshotFormat:"supabase.boards.content_json",originalNodeCount:Array.isArray(n.nodes)?n.nodes.length:0,renderedNodeCount:Array.isArray(n.nodes)?n.nodes.length:0}}}async function ki(e){var m;const t=pc(e);if(!t.cloudBoards.canAttempt)return f.emit("projectStorage.cloud.provider.skipped",{mode:t.cloudBoards.mode}),{userId:null,config:t,reason:t.cloudBoards.mode};const n=Os(e);if(!n)return f.emit("projectStorage.cloud.provider.skipped",{mode:"config-missing"}),{userId:null,config:t,reason:"missing-client"};const{data:r,error:d}=await n.auth.getSession();if(d||!r.session)return f.emit("projectStorage.cloud.provider.sessionMissing",{message:(d==null?void 0:d.message)??"missing-session"}),{userId:null,config:t,reason:"missing-session"};const{data:c,error:p}=await n.auth.getUser(),b=((m=c.user)==null?void 0:m.id)??null;return p||!b?(f.emit("projectStorage.cloud.provider.sessionMissing",{message:(p==null?void 0:p.message)??"missing-user"}),{userId:null,config:t,reason:"missing-user"}):{userId:b,config:t,reason:"provider-ready"}}async function ih(e){const t=await ki(e);if(!t.userId)return[];const n=Os(e);if(!n)return[];f.emit("projectStorage.cloud.list.requested");const{data:r,error:d}=await n.from("boards").select(xi).eq("user_id",t.userId).order("updated_at",{ascending:!1}).limit(50);if(d)throw f.emit("projectStorage.cloud.provider.failed",{operation:"list",message:d.message}),d;const c=(r??[]).map(Pc);return f.emit("projectStorage.cloud.list.loaded",{count:c.length}),c}async function lh(e,t,n){const r=await ki(e);if(!r.userId)return null;const d=Os(e);if(!d)return null;f.emit("projectStorage.cloud.load.requested",{boardId:t});const{data:c,error:p}=await d.from("boards").select(xi).eq("user_id",r.userId).eq("id",t).maybeSingle();if(p)throw f.emit("projectStorage.cloud.provider.failed",{operation:"load",boardId:t,message:p.message}),p;if(!c)return null;const b=rh(c,n);return f.emit("projectStorage.cloud.load.loaded",{boardId:t,nodes:b.nodes.length,edges:b.edges.length}),b}async function dh(e,t,n,r=null){var re,se;const d=await ki(e);if(!d.userId)return null;const c=Os(e);if(!c)return null;const p=oh(t.id),b=new Date().toISOString(),m=Ci(t.name),y=Number((r==null?void 0:r.x)??((re=t.viewState)==null?void 0:re.cursorX)??0),v=Number((r==null?void 0:r.y)??((se=t.viewState)==null?void 0:se.cursorY)??0),P={...t.viewState??{},cursorX:Number.isFinite(y)?y:0,cursorY:Number.isFinite(v)?v:0},S={...t,id:p,name:m,viewState:P,updatedAt:b},D={p_board_id:p,p_title:m,p_description:null,p_thumbnail_url:null,p_is_public:!1,p_created_at:null,p_updated_at:b,p_last_camera_x:n.x,p_last_camera_y:n.y,p_last_camera_z:n.scale,p_last_cursor_x:P.cursorX,p_last_cursor_y:P.cursorY,p_camera_bookmarks:JSON.stringify(t.settings.cameraBookmarks??{}),p_nodes:[],p_include_json_mirror:!0};f.emit("projectStorage.cloud.save.requested",{boardId:p,sourceBoardId:t.id,nodes:t.nodes.length,edges:t.edges.length});const{error:_}=await c.rpc("save_board_snapshot",D);if(_)throw f.emit("projectStorage.cloud.provider.failed",{operation:"save-rpc",boardId:p,message:_.message}),_;const $={content_json:sh(S),updated_at:b},{data:O,error:U}=await c.from("boards").update($).eq("id",p).eq("user_id",d.userId).select(xi).maybeSingle();if(U)throw f.emit("projectStorage.cloud.provider.failed",{operation:"save-json-mirror",boardId:p,message:U.message}),U;const W=O?Pc(O):{id:p,name:m,updatedAt:b,createdAt:b,nodeCount:t.nodes.length,edgeCount:t.edges.length,sourceKind:"cloud"};return f.emit("projectStorage.cloud.save.saved",{boardId:W.id,nodes:W.nodeCount,edges:W.edgeCount}),W}function Zr(e){return e.length===0?{minX:0,minY:0,maxX:0,maxY:0}:e.reduce((t,n)=>({minX:Math.min(t.minX,n.x),minY:Math.min(t.minY,n.y),maxX:Math.max(t.maxX,n.x+n.width),maxY:Math.max(t.maxY,n.y+n.height)}),{minX:Number.POSITIVE_INFINITY,minY:Number.POSITIVE_INFINITY,maxX:Number.NEGATIVE_INFINITY,maxY:Number.NEGATIVE_INFINITY})}function ch(e,t={},n=Zr(e),r){if(e.length===0)return{after:new Map,boundsAfter:n};const d=Nh(t.mode),c=Ah(t.order),p=Mh(t.anchor),b=Th(t.sizeMode),m=Math.max(0,t.gapX??24),y=Math.max(0,t.gapY??24),v=Math.max(1,t.maxColumns??12),P=Qr(t.quantile??.75,.05,.95),S=e.map(uh),D=wh(S,c),_=D.map(ge=>ge.width),$=D.map(ge=>ge.height),O=Math.max(1,t.cellWidth??pd(_,P)),U=Math.max(1,t.cellHeight??pd($,P)),W=Math.max(1,t.targetWidth??O),re=Math.max(1,t.targetHeight??U),se=kh(p,n);if(d==="grid"){bh(D,b,W,re,O,U);const ge=md(t.columns,v,n.maxX-n.minX,O,m);ph(D,se.x,se.y,ge,O,U,m,y)}else if(d==="masonry"){yh(D,b==="preserve"?"uniformWidth":b,W);const ze=md(t.columns,v,n.maxX-n.minX,W,m);gh(D,se.x,se.y,ze,W,m,y)}else d==="stripHorizontal"?(xh(D,b==="preserve"?"uniformHeight":b,re),hh(D,se.x,se.y,m,re)):(Ch(D,b==="preserve"?"uniformWidth":b,W),fh(D,se.x,se.y,y,W));let Ne=new Map(D.map(ge=>[ge.id,mh(ge)]));return p==="selectionBoundsCenter"&&(Ne=vh(n,Ne)),t.snapToGrid&&(Ne=jh(Ne,Math.max(1,t.gridSize??8))),{after:Ne,boundsAfter:Zr(Array.from(Ne.values()))}}function uh(e){return{...e,width:Math.max(1,e.width),height:Math.max(1,e.height)}}function mh(e){return{x:e.x,y:e.y,width:Math.max(1,e.width),height:Math.max(1,e.height)}}function ph(e,t,n,r,d,c,p,b){e.forEach((m,y)=>{const v=Math.floor(y/r),P=y%r,S=t+P*(d+p),D=n+v*(c+b);m.x=S+(d-m.width)/2,m.y=D+(c-m.height)/2})}function gh(e,t,n,r,d,c,p){const b=Array.from({length:r},()=>0);for(const m of e){const y=Ih(b),v=t+y*(d+c);m.x=v+(d-m.width)/2,m.y=n+b[y],b[y]+=m.height+p}}function hh(e,t,n,r,d){let c=t;for(const p of e)p.x=c,p.y=n+(d-p.height)/2,c+=p.width+r}function fh(e,t,n,r,d){let c=n;for(const p of e)p.x=t+(d-p.width)/2,p.y=c,c+=p.height+r}function bh(e,t,n,r,d,c){if(t==="fitCellDownOnly")for(const p of e){const b=Math.min(1,d/p.width,c/p.height);p.width*=b,p.height*=b}else t==="uniformWidth"?wi(e,n):t==="uniformHeight"&&Ec(e,r)}function yh(e,t,n){if(t==="fitCellDownOnly"){for(const r of e){const d=Math.min(1,n/r.width);r.width*=d,r.height*=d}return}wi(e,n)}function xh(e,t,n){if(t==="fitCellDownOnly"){for(const r of e){const d=Math.min(1,n/r.height);r.width*=d,r.height*=d}return}Ec(e,n)}function Ch(e,t,n){if(t==="fitCellDownOnly"){for(const r of e){const d=Math.min(1,n/r.width);r.width*=d,r.height*=d}return}wi(e,n)}function wi(e,t){for(const n of e){if(n.width<=0)continue;const r=t/n.width;n.width=t,n.height=Math.max(1,n.height*r)}}function Ec(e,t){for(const n of e){if(n.height<=0)continue;const r=t/n.height;n.height=t,n.width=Math.max(1,n.width*r)}}function md(e,t,n,r,d){if(typeof e=="number"&&e>0)return Math.round(Qr(e,1,t));if(n<=1||r<=1)return 1;const c=Math.floor((n+d)/(r+d));return!Number.isFinite(c)||c<1?1:Math.round(Qr(c,1,t))}function kh(e,t,n){return{x:t.minX,y:t.minY}}function wh(e,t){return t==="selectionOrder"?[...e].sort((n,r)=>n.selectionIndex-r.selectionIndex):Sh(e)}function Sh(e){const t=[...e].sort((m,y)=>m.y-y.y||m.x-y.x);if(t.length<=2)return t;const n=t.map(m=>m.height).sort((m,y)=>m-y),r=n[Math.floor(n.length/2)]??1,d=Math.max(16,r*.35),c=[];let p=[],b=Number.NaN;for(const m of t)p.length===0?(p=[m],b=m.y):Math.abs(m.y-b)<=d?(p.push(m),b=(b*(p.length-1)+m.y)/p.length):(c.push([...p].sort((y,v)=>y.x-v.x)),p=[m],b=m.y);return p.length>0&&c.push([...p].sort((m,y)=>m.x-y.x)),c.flat()}function vh(e,t){if(t.size===0)return t;const n=Zr(Array.from(t.values())),r=e.minX+(e.maxX-e.minX)/2,d=e.minY+(e.maxY-e.minY)/2,c=n.minX+(n.maxX-n.minX)/2,p=n.minY+(n.maxY-n.minY)/2,b=r-c,m=d-p;return new Map(Array.from(t.entries()).map(([y,v])=>[y,{...v,x:v.x+b,y:v.y+m}]))}function jh(e,t){return new Map(Array.from(e.entries()).map(([n,r])=>[n,{...r,x:gd(r.x,t),y:gd(r.y,t)}]))}function pd(e,t){if(e.length===0)return 1;const n=[...e].sort((b,m)=>b-m),r=(n.length-1)*t,d=Math.floor(r),c=Math.min(n.length-1,d+1),p=r-d;return n[d]*(1-p)+n[c]*p}function Ih(e){let t=0;for(let n=1;n<e.length;n+=1)e[n]<e[t]&&(t=n);return t}function gd(e,t){return Math.round(e/t)*t}function Nh(e){const t=$s(e);return t==="grid"?"grid":t==="striphorizontal"||t==="striph"?"stripHorizontal":t==="stripvertical"||t==="stripv"?"stripVertical":"masonry"}function Ah(e){return $s(e)==="selectionorder"?"selectionOrder":"spatialReading"}function Mh(e){const t=$s(e);return t==="selectionboundscenter"?"selectionBoundsCenter":t==="viewporttopleft"?"viewportTopLeft":"selectionBoundsTopLeft"}function Th(e){const t=$s(e);return t==="fitcelldownonly"?"fitCellDownOnly":t==="uniformwidth"?"uniformWidth":t==="uniformheight"?"uniformHeight":"preserve"}function $s(e){return String(e??"").trim().toLowerCase().replace(/[^a-z0-9]/g,"")}function Qr(e,t,n){return Math.min(n,Math.max(t,e))}const _c=300,Bc=50*1024*1024,Rh=800;function we(e){return typeof e=="string"?e.length*2:0}function Lh(e){let t=256;if(t+=we(e.id),t+=we(e.kind),t+=we(e.title),t+=we(e.body),t+=we(e.result),t+=we(e.imageUrl),t+=we(e.assetUrl),t+=we(e.sourceFilePath),t+=(e.tags??[]).reduce((n,r)=>n+we(r),0),e.metadata)for(const[n,r]of Object.entries(e.metadata))t+=we(n)+we(r);return e.imageStack&&(t+=128+we(e.imageStack.title),t+=e.imageStack.variants.reduce((n,r)=>n+96+we(r.variantId)+we(r.imageUrl)+we(r.assetId)+we(r.title)+we(r.caption),0)),t}function Ph(e){let t=1024+we(e.id)+we(e.name)+we(e.updatedAt);return t+=e.nodes.reduce((n,r)=>n+Lh(r),0),t+=e.edges.length*128,t+=Object.entries(e.settings).reduce((n,[r,d])=>n+we(r)+we(typeof d=="string"?d:JSON.stringify(d)),0),t}function Dc(e,t={}){var n,r;return{board:e,description:((n=t.description)==null?void 0:n.trim())||"Board change",mergeKey:((r=t.mergeKey)==null?void 0:r.trim())||null,timestampMs:t.timestampMs??Date.now(),estimatedBytes:Ph(e)}}function hd(e,t={}){const n=t.maxEntries??_c,r=t.maxBytes??Bc;let d=e.slice(Math.max(0,e.length-n)),c=d.reduce((p,b)=>p+b.estimatedBytes,0);for(;d.length>1&&c>r;){const[p,...b]=d;c-=(p==null?void 0:p.estimatedBytes)??0,d=b}return d}function Ha(e,t,n={}){const r=Dc(t,n),d=n.mergeWindowMs??Rh,c=e.slice(),p=c.at(-1);return p&&r.mergeKey&&p.mergeKey===r.mergeKey&&r.timestampMs-p.timestampMs<d?(c[c.length-1]={...p,description:r.description,timestampMs:r.timestampMs,estimatedBytes:Math.max(p.estimatedBytes,r.estimatedBytes)},hd(c,n)):(c.push(r),hd(c,n))}function Eh(e,t,n={}){const r=Dc(t,n),d=n.maxEntries??_c,c=n.maxBytes??Bc;let p=[r,...e].slice(0,d),b=p.reduce((m,y)=>m+y.estimatedBytes,0);for(;p.length>1&&b>c;){const m=p.at(-1);b-=(m==null?void 0:m.estimatedBytes)??0,p=p.slice(0,-1)}return p}function zs(e,...t){const n=e==null?void 0:e.metadata;if(!n)return"";for(const r of t){const d=n[r];if(typeof d=="string"&&d.trim())return d.trim()}return""}function fo(e,t){return!!zs(e,t)}function Oc(e){if(!e||!e.trim())return!1;const t=e.trim();return/^(https?:|blob:|data:|file:)/i.test(t)}function Fc(e){if(!e)return"";const t=zs(e,"OriginalPath");if(t)return t;const n=String(e.body||"").trim();return Oc(n)?"":n}function $c(e){return e?Fc(e)||String(e.sourceFilePath||"").trim()||String(e.assetUrl||"").trim()||String(e.imageUrl||"").trim()||String(e.body||"").trim():""}function zc(e){return zs(e,"ThumbnailUrl","thumbnailUrl")}function _h(e){if(!e||e.kind!=="image")return!1;if(fo(e,"ImageGenerationProvider")||fo(e,"GeneratedImageSourceWidth")||fo(e,"GeneratedImageSourceHeight")||fo(e,"CodexImageQuality")||fo(e,"ImageRouterRevisedPrompt"))return!0;const t=zs(e,"RequestedMediaOperation");return["text2image","image2image","inpaint"].includes(t.toLowerCase())}function Si(e){if(!e)return"";if(e.kind==="image"||e.kind==="mask"){const t=_h(e)?Fc(e):"",n=zc(e),r=String(e.body||"").trim();return t||n||String(e.imageUrl||"").trim()||String(e.assetUrl||"").trim()||String(e.sourceFilePath||"").trim()||(Oc(r)?r:"")}return $c(e)||String(e.assetUrl||"").trim()||String(e.sourceFilePath||"").trim()}function Uc(e){if(!e)return"";const t=$c(e)||e.title||e.kind;return String(t||"").replace(/\\/g,"/").replace(/\/+$/,"").split("/").filter(Boolean).pop()||e.title||e.kind}const Bh=2048,Dh=16e3,Sr=1024,vr=64,Oh=2048,jr=3,Fh=16,$h=256,zh=new Set(["text","note","memo","markdown","code","directory"]),Uh=/[\p{L}\p{M}\p{N}]{2,}/gu,fd=4,Hh=8,bd=1.35;function Wh(e){return zh.has(String(e||"").trim().toLowerCase())}function Vh(e){const t=e.map(Gh),n=new Map,r=new Map,d=new Map,c=new Map;for(const p of t){n.set(p.id,p);for(const b of p.tokens)Ir(r,b,p.id);for(const b of p.prefixes)Ir(d,b,p.id);for(const b of p.ngrams)Ir(c,b,p.id)}return{documents:t,documentById:n,tokenIndex:r,prefixIndex:d,ngramIndex:c}}function Yh(e,t,n={}){const r=Math.max(1,Math.trunc(Number(n.limit||30))),d=Cn(t),c=yd(e,0,0,n.viewport,0);if(!d)return{hits:[],profile:c};const p=Array.from(Hc(d)),b=Array.from(Wc(p)),m=Yc(d),y=Array.from(Vc(m)),v=new Map;for(const $ of p)Nr(e.tokenIndex,$,v,8);for(const $ of b)Nr(e.prefixIndex,$,v,$.length<=3?4:2);for(const $ of y)Nr(e.ngramIndex,$,v,1.15);const P=Jh(e,v,r),S=Zh(n.allowedContentTypes),D=[];for(const $ of P){const O=e.documentById.get($);if(!O||S&&!S.has(O.contentType))continue;const U=Xh(O,d,p,y);if(U<=0)continue;const W=qh(O,n.viewport??null);D.push({nodeId:O.id,score:U+W,textScore:U,viewportBoost:W})}D.sort(($,O)=>O.score-$.score||$.nodeId.localeCompare(O.nodeId));const _=D.slice(0,r);return{hits:_,profile:yd(e,P.length,_.length,n.viewport,_.filter($=>$.viewportBoost>0).length)}}function Cn(e){const t=String(e??"");if(!t.trim())return"";let n=t;try{n=t.normalize("NFKC")}catch{n=t}n=n.toLowerCase();let r="",d=!1;for(const c of n){if(/\s/u.test(c)){d||(r+=" ",d=!0);continue}Qh(c)||(r+=c,d=!1)}return r.trim()}function Hc(e){return new Set(e.match(Uh)??[])}function Wc(e){const t=new Set;for(const n of e){if(!n.trim())continue;const r=Math.min(8,n.length);for(let d=2;d<=r;d+=1)t.add(n.slice(0,d))}return t}function Vc(e){const t=new Set;if(!e.trim())return t;if(e.length<=jr)return t.add(e),t;for(let n=0;n<=e.length-jr;n+=1)t.add(e.slice(n,n+jr));return t}function Gh(e){const t=String(e.kind??"").trim().toLowerCase(),n=Ga(e.prompt??e.title,Bh),r=Wh(t)?Ga(e.response??e.body,Dh):"",d=Kh(e.metadata,e.tags,e.metadataText),c=Ga(e.sourceFilePath||e.assetUrl,Oh),p=Cn(n),b=Cn(r),m=Cn(d),y=Cn(c),v=Cn(t),P=[p,m,y,b,v].filter(Boolean).join(" "),S=Hc(P);return{id:String(e.id),contentType:t,normalizedPrompt:p,normalizedResponse:b,normalizedMetadata:m,normalizedSourcePath:y,normalizedContentType:v,tokens:S,prefixes:Wc(S),ngrams:Vc(Yc(P)),x:Number.isFinite(e.x)?e.x:0,y:Number.isFinite(e.y)?e.y:0,width:Number.isFinite(e.width)?e.width:1,height:Number.isFinite(e.height)?e.height:1}}function Kh(e,t,n){const r=[];let d=0;if(e)for(const[c,p]of Object.entries(e)){if(d>=vr)break;!String(c??"").trim()&&!String(p??"").trim()||(r.push(Ga(c,128)),String(p??"").trim()&&r.push(Ga(p,Sr)),d+=1)}return d<vr&&(t!=null&&t.length)&&(r.push("tags",Ga(t.join(" "),Sr)),d+=1),d<vr&&(n!=null&&n.trim())&&r.push("metadata",Ga(n,Sr)),r.join(" ")}function Xh(e,t,n,r){let d=0;e.normalizedPrompt===t?d+=120:bo(e.normalizedPrompt,t)&&(d+=54),bo(e.normalizedMetadata,t)&&(d+=26),bo(e.normalizedSourcePath,t)&&(d+=18),bo(e.normalizedResponse,t)&&(d+=14),bo(e.normalizedContentType,t)&&(d+=8);for(const c of n)e.tokens.has(c)&&(d+=7),e.normalizedPrompt.startsWith(c)&&(d+=10);for(const c of r)e.ngrams.has(c)&&(d+=.85);return d}function qh(e,t){if(!t)return 0;const n=e.x+Math.max(1,e.width)/2,r=e.y+Math.max(1,e.height)/2,d=Math.abs(n-t.centerX)/Math.max(1,t.halfWidth),c=Math.abs(r-t.centerY)/Math.max(1,t.halfHeight),p=Math.sqrt(d*d+c*c);if(p<=1)return fd+(1-p)*Hh;if(p<=bd){const b=1-(p-1)/Math.max(.001,bd-1);return Math.max(0,b)*(fd*.75)}return 0}function Jh(e,t,n){return t.size===0?e.documents.map(r=>r.id):Array.from(t.entries()).sort((r,d)=>d[1]-r[1]||r[0].localeCompare(d[0])).slice(0,Math.max(n*Fh,$h)).map(([r])=>r)}function Zh(e){if(!e)return null;const t=new Set(Array.from(e,n=>String(n||"").trim().toLowerCase()).filter(Boolean));return t.size>0?t:null}function yd(e,t,n,r,d){return{documentCount:e.documents.length,candidateCount:t,rankedCount:n,viewportBoosted:!!r,boostedCount:d,indexedTokenCount:e.tokenIndex.size,indexedPrefixCount:e.prefixIndex.size,indexedNGramCount:e.ngramIndex.size}}function Ir(e,t,n){const r=e.get(t);if(r){r.add(n);return}e.set(t,new Set([n]))}function Nr(e,t,n,r){const d=e.get(t);if(d)for(const c of d)n.set(c,(n.get(c)??0)+r)}function Yc(e){let t="";for(const n of e)/\s/u.test(n)||(t+=n);return t}function Ga(e,t){const n=String(e??"");return n.length<=t?n:n.slice(0,t)}function bo(e,t){return!!(e&&t&&e.includes(t))}function Qh(e){const t=e.codePointAt(0)??0;return t<=31||t>=127&&t<=159}const ef=2147483647,tf="LocalBridge access is enabled, but the bridge is not reachable. Restart LocalBridge, allow Chrome local-network access, then reload MindCanvas.",af="Local storage is unavailable in the hosted app until browser local storage or LocalBridge access is available.",nf="Local storage is unavailable. Check the browser-local storage state or LocalBridge connection.",of="Cloud projects are unavailable until Supabase and Cloudflare R2 are configured.",sf="Login is required before cloud projects can be used.",rf="Cloud projects are unavailable.";function lf(e){return e.bridgeProviderConfigured||e.browserProviderConfigured||e.embeddedProviderConfigured}function ei(e,t=!0){const n={isAvailable:!1,bridgeReachable:!1,browserLocalAvailable:!1,embeddedLocalAvailable:!1,providerKind:"none",canBrowseWorkspace:!1};return e.bridgeProviderConfigured&&e.bridgeReachable?{...n,isAvailable:!0,bridgeReachable:!0,providerKind:"bridge",canBrowseWorkspace:!0}:e.hostedWebApp&&e.hostedLocalBridgeAccessEnabled&&e.bridgeProviderConfigured?{...n,providerKind:"bridge"}:e.browserProviderConfigured&&(e.browserLocalAvailable||t&&e.browserLocalAvailableWhenEmpty===!0)?{...n,isAvailable:!0,browserLocalAvailable:!0,providerKind:"browser"}:e.embeddedProviderConfigured&&e.supportsEmbeddedLocal?{...n,isAvailable:!0,embeddedLocalAvailable:!0,providerKind:"embedded"}:n}function df(e){return ei(e,!1).isAvailable?"local":vi(e)?"cloud":ei(e,!0).isAvailable?"local":e.cloudConfigured?"cloud":"local"}function vi(e){return e.cloudConfigured&&e.cloudSessionAvailable}function cf(e,t){return t.providerKind==="bridge"&&!t.bridgeReachable?tf:e.hostedWebApp?af:nf}function uf(e){return e.cloudConfigured?vi(e)?rf:sf:of}function mf(e){var v,P,S;const t=vi(e),n=ei(e,!0),r=lf(e),d=e.cloudConfigured,c=n.isAvailable,p=t;let b=e.storedMode??df(e);b==="cloud"&&(!d||!p&&c)?b=c?"local":"cloud":b==="local"&&(!r&&d||!c&&p)&&(b="cloud");const m=e.cloudAccess,y=((v=m==null?void 0:m.denialReason)==null?void 0:v.trim())||void 0;return{currentMode:b,showLocalTab:r,showCloudTab:d,isLocalAvailable:n.isAvailable,isCloudAvailable:t,requiresCloudSignIn:e.cloudConfigured&&!t,canUseLocalProjects:c,canBrowseLocalWorkspace:n.canBrowseWorkspace,localProviderKind:n.providerKind,canUseCloudProjects:p,canSyncLocalToCloud:c&&p,cloudPlanKey:((P=m==null?void 0:m.planKey)==null?void 0:P.trim())||"free",cloudEntitlementStatus:((S=m==null?void 0:m.entitlementStatus)==null?void 0:S.trim())||(m?"active":"inactive"),currentCloudBoardCount:(m==null?void 0:m.currentBoardCount)??0,cloudBoardLimit:(m==null?void 0:m.cloudBoardLimit)??ef,lockedCloudBoardCount:(m==null?void 0:m.lockedBoardCount)??0,canCreateCloudBoards:(m==null?void 0:m.canCreateBoard)??p,canUseManagedAi:(m==null?void 0:m.canUseManagedAi)??!1,canGenerateImage:(m==null?void 0:m.canGenerateImage)??!1,canUseContextPack:(m==null?void 0:m.canUseContextPack)??!1,cloudLimitMessage:y,localStatusMessage:n.isAvailable?void 0:cf(e,n),cloudStatusMessage:p?void 0:uf(e)}}function pf(){const e=new Error("Queued operation was cancelled before it started.");return e.name="AbortError",e}class gf{constructor(){Pl(this,"tails",new Map)}isBusy(t){return this.tails.has(t)}enqueue(t,n,r){if(typeof n!="function")throw new TypeError("KeyedAsyncQueue operation is required.");const d=this.tails.get(t)??Promise.resolve();let c;return c=(async()=>{try{try{await d}catch{}if(r!=null&&r.aborted)throw pf();return await n(r)}finally{this.tails.get(t)===c&&this.tails.delete(t)}})(),this.tails.set(t,c),c}clear(t){if(typeof t>"u"){this.tails.clear();return}this.tails.delete(t)}}const hf=/^data:image\//i;function ff(e){const t=String(e||"").trim();if(!t)return{src:null,reason:"empty",urlKind:"empty"};const n=t.toLowerCase();return hf.test(t)?{src:t,reason:null,urlKind:"data"}:n.startsWith("blob:")?{src:t,reason:null,urlKind:"blob"}:n.startsWith("https://")?{src:t,reason:null,urlKind:"https"}:n.startsWith("http://")?{src:t,reason:null,urlKind:"http"}:t.startsWith("//")?{src:t,reason:null,urlKind:"protocol-relative"}:t.startsWith("/")||t.startsWith("./")||t.startsWith("../")?{src:t,reason:null,urlKind:"relative"}:/^[a-z][a-z0-9+.-]*:/i.test(t)?{src:null,reason:"unsupported-protocol",urlKind:t.split(":",1)[0].toLowerCase()}:{src:t,reason:null,urlKind:"relative"}}function Ar({src:e,alt:t="",className:n="",testId:r="secure-image",traceId:d,kind:c="image",title:p}){const b=g.useMemo(()=>ff(e),[e]),[m,y]=g.useState(b.src?"loading":"blocked");g.useEffect(()=>{const D=b.src?"loading":"blocked";y(D),b.src||f.emit("secureImage.blocked",{id:d,kind:c,reason:b.reason,urlKind:b.urlKind})},[c,b.reason,b.src,b.urlKind,d]);const v=()=>{y("loaded"),f.emit("secureImage.loaded",{id:d,kind:c,urlKind:b.urlKind})},P=()=>{y("error"),f.emit("secureImage.error",{id:d,kind:c,urlKind:b.urlKind})},S=m==="blocked"?`Image blocked: ${b.reason||"unsupported source"}`:"Image failed to load";return o.jsxs("div",{className:`secure-image secure-image--${m} ${n}`.trim(),"data-testid":r,"data-secure-image-state":m,"data-secure-image-kind":c,title:m==="loaded"?p:S,children:[b.src&&o.jsx("img",{src:b.src,alt:t,loading:"lazy",decoding:"async",draggable:!1,onLoad:v,onError:P}),m==="loading"&&o.jsx("span",{className:"secure-image__loading","aria-hidden":"true",children:o.jsx("span",{})}),(m==="blocked"||m==="error")&&o.jsx("span",{className:"secure-image__fallback",role:"img","aria-label":S,children:m==="blocked"?o.jsx(Hp,{size:18}):o.jsx(Wp,{size:18})})]})}const bf={note:Ts,text:kt,"ai-task":Sn,image:jn,mask:jn,video:In,embed:Nn,code:vn,markdown:kt,"csv-table":kt,memo:Ts,pdf:kt,file:Vr,directory:Vp,"template-launcher":kt,"remote-monitor":Ms,"remote-control":Ms},Mr=[{key:"Auto",label:"Auto Detect",description:"Infer whether this note is growth, revenue, build, or research work."},{key:"GeneralCompany",label:"General AI Company",description:"Balanced planning, practical work, and artifact production."},{key:"GrowthValidation",label:"Growth Validation",description:"Marketing loops, signals, messaging, distribution, and experiments."},{key:"RevenueAffiliate",label:"Revenue / Affiliate",description:"Affiliate discovery, keywords, content assets, and revenue experiments."},{key:"ProductBuild",label:"Product Build",description:"Specs, implementation-oriented work, artifacts, and approval gates."},{key:"ResearchOnly",label:"Research Only",description:"Evidence gathering, risks, synthesis, and recommendations."}],xd=500,yf=48,xf=new Set(["mindcanvasagent","agentcommand"]),Cf=new Set(["codenote","code-note"]),kf=["multidesktopmonitor","remotehubmonitor","remotefleetmonitor","smartviewmonitor"],wf=["remotedevice","remotefleetdevice","remotecontrol"],Sf=["top","right","bottom","left"];function vf(e){const t=An(e,"SemanticType","semanticType","RemoteFleetSemanticType").trim().toLowerCase(),n=An(e,"RemoteFleetNodeRole","remoteFleetNodeRole").trim().toLowerCase(),r=An(e,"RemoteFleetSchemaVersion","remoteFleetSchemaVersion").trim().toLowerCase();return e.kind==="remote-monitor"||t==="remotefleetmonitor"||n==="fleet-monitor"||r==="remote-fleet@1"||Kc(e,["RemoteFleetViewMode","RemoteFleetHubStatus","RemoteFleetDevicesJson","RemoteFleetDeviceCount","RemoteFleetConnectedDeviceCount","RemoteFleetProjectionMode","RemoteFleetCanvasPagination","RemoteHub","RemoteRoute","RemotePage","RemoteVisibleBudget"])||Gc(e,kf,["remote","monitor"])}function jf(e){const t=An(e,"SemanticType","semanticType","RemoteFleetSemanticType").trim().toLowerCase(),n=An(e,"RemoteFleetNodeRole","remoteFleetNodeRole").trim().toLowerCase(),r=An(e,"RemoteFleetSchemaVersion","remoteFleetSchemaVersion").trim().toLowerCase();return e.kind==="remote-control"||t==="remotefleetdevice"||n==="fleet-device"||r==="remote-fleet-device@1"||Kc(e,["RemoteFleetDeviceId","RemoteFleetDeviceName","RemoteFleetDevicePlatform","RemoteFleetDeviceConnected","RemoteFleetDeviceCanControl","RemoteFleetSourceMonitorNodeId"])||Gc(e,wf,["remote","control"])}function Gc(e,t,n){const r=(e.tags??[]).map(b=>b.trim().toLowerCase()).filter(Boolean),d=n.every(b=>r.includes(b)),p=[e.title,e.body,e.sourceFilePath,e.assetUrl,...r].join(" ").toLowerCase().replace(/[^a-z0-9]+/g,"");return d||t.some(b=>p.includes(b))}function An(e,...t){const n=e.metadata??{};for(const d of t){const c=n[d];if(c!=null)return String(c)}const r=new Set(t.map(d=>d.toLowerCase()));for(const[d,c]of Object.entries(n))if(r.has(d.toLowerCase())&&c!==void 0&&c!==null)return String(c);return""}function Kc(e,t){const n=e.metadata??{},r=new Set(t.map(d=>d.toLowerCase()));return Object.entries(n).some(([d,c])=>r.has(d.toLowerCase())&&c!==void 0&&c!==null&&String(c).trim()!=="")}const ti=[{key:"coral",label:"Coral",swatch:"#ff8052",ring:"rgba(255, 128, 82, 0.22)",surface:"#fff2eb",border:"rgba(255, 128, 82, 0.42)",ink:"#7c2d12"},{key:"amber",label:"Amber",swatch:"#f59e0b",ring:"rgba(245, 158, 11, 0.22)",surface:"#fffbeb",border:"rgba(245, 158, 11, 0.42)",ink:"#78350f"},{key:"sun",label:"Sun",swatch:"#ca8a04",ring:"rgba(202, 138, 4, 0.22)",surface:"#fef9c3",border:"rgba(202, 138, 4, 0.38)",ink:"#713f12"},{key:"sage",label:"Sage",swatch:"#65a30d",ring:"rgba(101, 163, 13, 0.22)",surface:"#f7fee7",border:"rgba(101, 163, 13, 0.38)",ink:"#365314"},{key:"mint",label:"Mint",swatch:"#10b981",ring:"rgba(16, 185, 129, 0.22)",surface:"#ecfdf5",border:"rgba(16, 185, 129, 0.36)",ink:"#064e3b"},{key:"sky",label:"Sky",swatch:"#3b82f6",ring:"rgba(59, 130, 246, 0.22)",surface:"#eff6ff",border:"rgba(59, 130, 246, 0.36)",ink:"#1e3a8a"},{key:"indigo",label:"Indigo",swatch:"#6366f1",ring:"rgba(99, 102, 241, 0.22)",surface:"#eef2ff",border:"rgba(99, 102, 241, 0.36)",ink:"#312e81"},{key:"violet",label:"Violet",swatch:"#8b5cf6",ring:"rgba(139, 92, 246, 0.22)",surface:"#f5f3ff",border:"rgba(139, 92, 246, 0.36)",ink:"#4c1d95"},{key:"rose",label:"Rose",swatch:"#f43f5e",ring:"rgba(244, 63, 94, 0.22)",surface:"#fff1f2",border:"rgba(244, 63, 94, 0.36)",ink:"#881337"},{key:"gray",label:"Gray",swatch:"#6b7280",ring:"rgba(107, 114, 128, 0.22)",surface:"#f9fafb",border:"rgba(107, 114, 128, 0.32)",ink:"#374151"},{key:"slate",label:"Slate",swatch:"#64748b",ring:"rgba(100, 116, 139, 0.22)",surface:"#f8fafc",border:"rgba(100, 116, 139, 0.32)",ink:"#334155"}],If=g.memo(function({node:t,selected:n,pulsing:r,connectionDraft:d,onSelect:c,onDragStart:p,onResizeStart:b,onPatch:m,onDelete:y,onDuplicate:v,onRun:P,onPin:S,onConnectorDragStart:D,onOpenResult:_,onToggleAiReference:$,onCopyNode:O,onCopyEmbedReference:U,onFitNodeHeight:W,onToggleNodeExpanded:re,onToggleWordWrap:se,onStageCompany:Ne,onOpenCompanyGraph:ge,onSyncCompanyGoal:ze,onRefreshCompany:St,onSetCompanyStatus:Ue,onRemoveCompany:G,onOpenAsset:V,onOpenDirectorySettings:de,onScanDirectory:te,onCreateRemoteControl:vt,onGenerateTemplateCard:H}){var Yn,Gn,Oo,it,Ut,La,sn,da,rn,ne,Ge,ln,Kn,j,K,oe,Fo,$e,Ht,Wt,dn,cn,Xn,qn,un,Jn,Pa,Zn,mn,Ea,ca,Ee,Le,_a,Ba,pn;const He=String(((Yn=t.metadata)==null?void 0:Yn.AutomationNodeKind)||((Gn=t.metadata)==null?void 0:Gn.AutomationTemplateKey)||((Oo=t.metadata)==null?void 0:Oo.AutomationInferredKind)||"").trim().toLowerCase(),jt=String(((it=t.metadata)==null?void 0:it.SemanticType)||((Ut=t.metadata)==null?void 0:Ut.semanticType)||"").trim().toLowerCase(),he=t.kind==="memo"&&xf.has(jt),We=t.kind==="memo"&&Cf.has(jt),at=String(((La=t.metadata)==null?void 0:La.AgentCommandStatus)||"Draft"),nt=String(((sn=t.metadata)==null?void 0:sn.AgentCommandMode)||"Task"),z=String(((da=t.metadata)==null?void 0:da.AgentCommandRequestedRole)||"Researcher"),mt=String(((rn=t.metadata)==null?void 0:rn.CodeNoteStatus)||"Draft"),wa=String(((ne=t.metadata)==null?void 0:ne.CodeNoteSyncState)||"Unlinked"),qa=String(((Ge=t.metadata)==null?void 0:Ge.CodeNoteKind)||"Feature"),Sa=he?Sn:We?vn:He==="image-generate"?jn:He==="video-generate"?In:bf[t.kind],Ln=d&&d.from!==t.id,va=t.kind==="ai-task",Ja=t.kind==="pdf"||t.kind==="file"||t.kind==="directory",Me=vf(t),Za=jf(t),Ve=Me||Za,ja=Me?"monitor":Za?"control":"",Ae=va?"result":"context",be=((ln=d==null?void 0:d.target)==null?void 0:ln.id)===t.id?d.target.side:null,Li=(d==null?void 0:d.from)===t.id,ve=t.kind==="template-launcher"||String(((Kn=t.metadata)==null?void 0:Kn.semanticType)||((j=t.metadata)==null?void 0:j.SemanticType)||"").toLowerCase()==="templatelauncher",_e=t.kind==="video",Te=t.kind==="embed",_t=t.kind==="mask",ye=t.kind==="memo",ot=t.kind==="markdown",st=t.kind==="csv-table",Be=ye?_f(t):null,me=g.useRef(null),Pn=_e?Xc(t):"",qe=_e?Df(t):"",De=Te?Of(t):"",It=Te?Ff(t):"",To=Te?$f(t,De):"",Pe=Te?zf(t):"",Re=(((K=t.imageStack)==null?void 0:K.variants)??[]).filter(x=>!!x.imageUrl),pt=Re.find(x=>{var B;return x.variantId===((B=t.imageStack)==null?void 0:B.activeVariantId)})??Re[0]??null,Bt=t.kind==="image"||_t?(pt==null?void 0:pt.imageUrl)||Si(t):"",Ia=pt?Re.findIndex(x=>x.variantId===pt.variantId):-1,En=!Bt&&!Ja&&!Ve&&!ve&&!_e&&!Te,Ro=En&&!ye,Na=t.isExpanded===!1&&Number(t.originalHeight??0)>t.height+1,_n=!Ve&&!["image","mask","video","embed","pdf","file","directory","template-launcher","remote-monitor","remote-control"].includes(t.kind),gt=t.aiEnabled!==!1,Bn=Bf(t),Dt=!!(t.isChunkedText||((oe=t.metadata)==null?void 0:oe.IsChunkedText)==="true"),Oe=Number(t.totalLineCount??((Fo=t.metadata)==null?void 0:Fo.TotalLineCount)??0),Je=t.sourceFilePath||(($e=t.metadata)==null?void 0:$e.FileName)||t.title,Dn=Dt?o.jsxs("div",{className:"node-chunked-text-state","data-testid":"node-chunked-text-state",title:Je,children:[o.jsx(kt,{size:12}),o.jsx("strong",{children:"Chunked text"}),Number.isFinite(Oe)&&Oe>0&&o.jsxs("span",{children:[Oe.toLocaleString()," lines"]})]}):null,Qa=t.kind==="directory"?(Ht=t.metadata)==null?void 0:Ht.Include:null,fe=t.kind==="directory"?(Wt=t.metadata)==null?void 0:Wt.Exclude:null,ea=t.kind==="directory"?(dn=t.metadata)==null?void 0:dn.DirectoryFileCount:null,en=t.kind==="directory"?(cn=t.metadata)==null?void 0:cn.DirectoryDirCount:null,On=t.kind==="directory"?(Xn=t.metadata)==null?void 0:Xn.DirectoryLastScanUtc:null,[Fe,Nt]=g.useState(!1),[ta,Lo]=g.useState(null),[Po,Ye]=g.useState(((qn=t.metadata)==null?void 0:qn.CompanyExecutionMode)||"Auto"),[Fn,$n]=g.useState(((un=t.metadata)==null?void 0:un.CompanySubAgents)!=="false"),[tn,aa]=g.useState(!1),[Ze,zn]=g.useState(null),Eo=g.useMemo(()=>st?Tf(t.body,Ze):null,[Ze,st,t.body]),ie=g.useMemo(()=>ve?dc(t.body):null,[ve,t.body]),ht=(ie==null?void 0:ie.options.find(x=>x.id===ie.selectedOptionId))??(ie==null?void 0:ie.options[0])??null,na=dp(ie),oa=Mr.find(x=>x.key===Po)||Mr[0],an=String(((Jn=t.metadata)==null?void 0:Jn.CompanyStatus)||(t.companyMode?"Staged":"")).trim(),Ot=an.toLowerCase(),sa=Ot==="paused",At=Ot==="archived",ra=x=>{x.stopPropagation();const B=x.currentTarget.getBoundingClientRect();Lo(Af(B)),Nt(le=>!le)},Ft=x=>{x.stopPropagation(),Ne(t.id,{executionMode:oa.key,enableSubAgents:Fn}),Nt(!1)},Us=x=>{x.stopPropagation(),ge(t.id)},Hs=(x,B)=>{B.stopPropagation();const le=Re.find(bt=>bt.variantId===x);!le||!t.imageStack||le.variantId===t.imageStack.activeVariantId||(f.emit("node.imageStack.variant",{nodeId:t.id,variantId:le.variantId,variantCount:Re.length}),m(t.id,{imageUrl:le.imageUrl,imageStack:{...t.imageStack,activeVariantId:le.variantId,variants:Re,updatedAtUtc:new Date().toISOString()},metadata:{...t.metadata??{},ImageStackActiveVariantId:le.variantId}}))},_o=(x,B)=>{if(B.stopPropagation(),!!ye){if((Be==null?void 0:Be.key)===x){aa(!1);return}f.emit("node.memoColor.changed",{id:t.id,colorKey:x}),m(t.id,{metadata:{...t.metadata??{},memoColor:x,memoColorIsCustom:"true"}}),aa(!1)}},Aa=x=>{var Yt,ma;if(x.stopPropagation(),!he)return;const B=(t.body||t.title||"Agent command objective").trim(),le=["Clarify the objective and constraints.","Collect linked canvas context or code notes.","Draft an execution plan before external adapter use."],bt=["canvas-context","agent-command-planning","adapter-gated-execution"],ua=["Canvas.ListAgentCommands","Canvas.UpdateAgentCommand","Canvas.PlanAgentCommand","Canvas.SetAgentCommandState"],lt=["MindCanvasAgent",nt,z],Vt=["Local React plan staged for this Agent Command.",`Role: ${z}`,`Mode: ${nt}`,`Objective: ${B.slice(0,220)}`,"External execution remains adapter-gated until LocalBridge/agent runtime is available."].join(`
3
- `);f.emit("mindcanvas.agentCommand.planned",{id:t.id,mode:nt,requestedRole:z,adapterState:((Yt=t.metadata)==null?void 0:Yt.AdapterState)??"adapter-gated"}),m(t.id,{tags:["Agent Command",z,"Planned"],metadata:{...t.metadata??{},AgentCommandStatus:"Planned",AgentCommandPlannerSummary:Vt,AgentCommandPlanSteps:JSON.stringify(le),AgentCommandPlannedSkills:JSON.stringify(bt),AgentCommandPlannedTools:JSON.stringify(ua),AgentCommandPlannedConcepts:JSON.stringify(lt),AgentCommandLastExplorationPhase:"planned-local",AdapterState:((ma=t.metadata)==null?void 0:ma.AdapterState)??"adapter-gated"}})},Ws=x=>{var ua,lt;if(x.stopPropagation(),!he)return;const B=new Date().toISOString(),le=[`Agent Command: ${t.title||"Agent"}`,`Status: Completed locally at ${B}`,"","This React MindCanvas node preserves the original Agent Command workflow shape.","No external agent runtime was invoked; execution remains adapter-gated.","","Next action:","Connect LocalBridge/agent runtime or move this command into CodeMaster for a deeper implementation run."].join(`
4
- `),bt=[`${B} Local React execution staged.`,`${B} Adapter gated; no external tools invoked.`];f.emit("mindcanvas.agentCommand.executed.local",{id:t.id,mode:nt,requestedRole:z,adapterState:((ua=t.metadata)==null?void 0:ua.AdapterState)??"adapter-gated"}),m(t.id,{status:"done",result:le,tags:["Agent Command",z,"Completed"],metadata:{...t.metadata??{},AgentCommandStatus:"Completed",AgentCommandLastExecutedAtUtc:B,AgentCommandConsoleLogs:JSON.stringify(bt),AgentCommandResultLinks:JSON.stringify([]),AdapterState:((lt=t.metadata)==null?void 0:lt.AdapterState)??"adapter-gated"}})},Ma=(x,B,le,bt)=>{var lt,Vt,Yt;if(x.stopPropagation(),!We)return;const ua=B==="Implemented"?JSON.stringify([`local-code-note://${t.id}/implementation-handoff.md`]):((lt=t.metadata)==null?void 0:lt.CodeNoteOutputArtifacts)||"[]";f.emit("mindcanvas.codeNote.state",{id:t.id,status:B,syncState:le,reason:bt,adapterState:((Vt=t.metadata)==null?void 0:Vt.AdapterState)??"local-canvas-only"}),m(t.id,{tags:["Code Note",B,le],metadata:{...t.metadata??{},CodeNoteStatus:B,CodeNoteSyncState:le,CodeNoteOutputArtifacts:ua,...B==="Implemented"||B==="Reviewed"?{CodeNoteLastAppliedAtUtc:new Date().toISOString()}:{},AdapterState:((Yt=t.metadata)==null?void 0:Yt.AdapterState)??"local-canvas-only"}})},Ta=()=>{$n(x=>!x)},Un=async x=>{if(x.stopPropagation(),!qe||!me.current){f.emit("node.video.unavailable",{id:t.id,reason:qe?"element-missing":"source-missing"});return}try{await me.current.play(),f.emit("node.video.play",{id:t.id,sourceKind:kd(qe)})}catch(B){f.emit("node.video.unavailable",{id:t.id,reason:B instanceof Error?B.message:String(B)})}},$t=x=>{if(x.stopPropagation(),!qe||!me.current){f.emit("node.video.unavailable",{id:t.id,reason:qe?"element-missing":"source-missing"});return}me.current.pause(),f.emit("node.video.pause",{id:t.id,sourceKind:kd(qe)})},Bo=x=>{x.stopPropagation(),De&&U(t.id,De)},ia=x=>{m(t.id,{body:JSON.stringify(x),metadata:{...t.metadata??{},templateLauncherSelectedOptionId:x.selectedOptionId??""}})},la=(x,B)=>{if(B.stopPropagation(),!ie)return;const le=mp(ie,x);ia(le),f.emit("templateCard.option.select",{nodeId:t.id,optionId:le.selectedOptionId??null})},Do=(x,B)=>{if(!ie)return;const le=pp(ie,x,B);ia(le),f.emit("templateCard.input.patch",{nodeId:t.id,key:x})},rt=x=>{x.stopPropagation(),!(!ie||na)&&H(t.id,ie.selectedOptionId??null,ie.inputValues)},Ra=_n&&Fe?o.jsxs("div",{className:"node-company-launcher","data-testid":"node-company-launcher",style:ta?{left:ta.left,top:ta.top}:void 0,onPointerDown:x=>x.stopPropagation(),onClick:x=>x.stopPropagation(),children:[o.jsx("div",{className:"node-company-launcher__eyebrow",children:"Run As Company"}),o.jsx("h4",{children:"Turn this note into a background AI company"}),o.jsx("p",{children:"Pick the operating mode to stage on this node. External CompanyCore execution stays adapter-gated."}),o.jsx("div",{className:"node-company-mode-list",children:Mr.map(x=>o.jsxs("button",{type:"button",className:x.key===oa.key?"is-selected":"","data-company-mode":x.key,onClick:()=>Ye(x.key),children:[o.jsx("strong",{children:x.label}),o.jsx("span",{children:x.description})]},x.key))}),o.jsxs("button",{type:"button",className:"node-company-subagents","aria-pressed":Fn,onClick:x=>{x.stopPropagation(),Ta()},children:[o.jsx("span",{className:"node-company-toggle-indicator","aria-hidden":"true",children:Fn?"On":"Off"}),o.jsxs("span",{children:[o.jsx(gc,{size:13}),"Enable sub-agents for exploration waves and specialist handoff"]})]}),o.jsxs("div",{className:"node-company-launcher__actions",children:[o.jsx("button",{type:"button",className:"btn btn-ghost",onClick:()=>Nt(!1),children:"Cancel"}),o.jsx("button",{type:"button",className:"btn btn-primary","data-testid":"node-company-run-confirm",onClick:Ft,children:"Stage Company"})]})]}):null,zt={width:t.width,height:t.height,transform:`translate3d(${t.x}px, ${t.y}px, 0)`,...Be?{"--memo-bg":Be.surface,"--memo-border":Be.border,"--memo-ink":Be.ink,"--memo-ring":Be.ring,"--memo-accent":Be.swatch}:{}},nn=o.jsxs(o.Fragment,{children:[Ro&&o.jsx("button",{type:"button",title:gt?"Disable AI reference":"Enable AI reference","aria-label":gt?"Disable AI reference":"Enable AI reference",className:gt?"is-active-ai":"is-inactive-ai",onPointerDown:x=>x.stopPropagation(),onClick:()=>$(t.id),children:o.jsx(Yp,{size:13})}),ye&&o.jsx("button",{type:"button",title:"Change memo color","aria-label":"Change memo color","aria-pressed":tn,className:"is-memo-color-action","data-testid":"node-memo-color-open",onPointerDown:x=>x.stopPropagation(),onClick:x=>{x.stopPropagation(),aa(B=>!B)},children:o.jsx(hc,{size:13})}),t.kind==="code"&&o.jsx("button",{type:"button",title:t.wordWrap===!1?"Enable word wrap":"Disable word wrap","aria-label":t.wordWrap===!1?"Enable word wrap":"Disable word wrap",onPointerDown:x=>x.stopPropagation(),onClick:()=>se(t.id),children:o.jsx(Gp,{size:13})}),o.jsx("button",{type:"button",title:Bt?"Copy image to clipboard":"Copy content","aria-label":Bt?"Copy image to clipboard":"Copy content",onPointerDown:x=>x.stopPropagation(),onClick:()=>O(t.id),children:o.jsx(vo,{size:13})}),o.jsx("button",{type:"button",title:"Duplicate node","aria-label":"Duplicate node","data-testid":"node-duplicate",onPointerDown:x=>x.stopPropagation(),onClick:()=>v(t.id),children:o.jsx(fc,{size:13})}),En&&o.jsx("button",{type:"button",title:"Fit text height","aria-label":"Fit text height",onPointerDown:x=>x.stopPropagation(),onClick:()=>W(t.id),children:o.jsx(Kp,{size:13})}),En&&o.jsx("button",{type:"button",title:Na?"Expand node":"Collapse node","aria-label":Na?"Expand node":"Collapse node","aria-pressed":Na,onPointerDown:x=>x.stopPropagation(),onClick:()=>re(t.id),children:Na?o.jsx(Gl,{size:13}):o.jsx(Xp,{size:13})}),va&&o.jsx("button",{type:"button",title:"Run node",onPointerDown:x=>x.stopPropagation(),onClick:()=>P(t.id),children:o.jsx(Ca,{size:13})}),_n&&o.jsx("button",{type:"button",title:t.companyMode?"Open Company graph":"Run this note as Company","aria-label":t.companyMode?"Open Company graph":"Run this note as Company",className:t.companyMode?"is-company-action":"","data-testid":t.companyMode?"node-company-graph-open":"node-company-run-open",onPointerDown:x=>x.stopPropagation(),onClick:t.companyMode?Us:ra,children:o.jsx(Kl,{size:13})}),o.jsx("button",{type:"button",title:"Delete node","aria-label":"Delete node","data-testid":"node-delete",onPointerDown:x=>x.stopPropagation(),onClick:()=>y(t.id),children:o.jsx(Rs,{size:13})})]}),Hn=va?o.jsxs("div",{className:"node-result-row","data-testid":"node-external-pins",children:[o.jsxs("button",{className:`node-pin node-pin--context ${Ln?"can-receive":""}`,type:"button",title:"Context input",onPointerDown:x=>x.stopPropagation(),onClick:x=>{x.stopPropagation(),S(t.id,"context","left")},children:[o.jsx(Xl,{size:10}),"Context"]}),o.jsxs("button",{className:`node-pin node-pin--result ${t.result?"has-result":""}`,type:"button",title:"Drag to connect this result to an input pin. Click to view the result.","data-testid":"node-result-open",onPointerDown:x=>x.stopPropagation(),onClick:x=>{x.stopPropagation(),t.result?_(t.id):S(t.id,"result","right")},children:[o.jsx(Gl,{size:11}),"Result"]})]}):o.jsxs("button",{className:`node-context-source ${d?"can-receive":""}`,type:"button",title:"Use this node as AI Task context",onPointerDown:x=>x.stopPropagation(),onClick:x=>{x.stopPropagation(),S(t.id,"context","right")},children:[o.jsx(Xl,{size:10}),o.jsx("span",{children:"Context"})]}),ft=Ve?null:o.jsx("div",{className:"node-connector-handles","data-testid":"node-connector-handles","aria-hidden":!1,children:Sf.map(x=>o.jsx("button",{type:"button",className:`node-connector-handle node-connector-handle--${x} ${Li&&(d==null?void 0:d.fromSide)===x?"is-source":""} ${be===x?"is-target":""}`,title:`Drag from ${x} to connect`,"aria-label":`Drag ${x} connector`,"data-testid":"node-connector-handle","data-node-connector":"true","data-connector-node-id":t.id,"data-connector-side":x,"data-connector-kind":Ae,onPointerDown:B=>D(t.id,x,Ae,B)},x))}),on=_t||Re.length>1||Te||_e?o.jsxs("div",{className:"node-surface-badges","data-testid":"node-surface-badges",children:[_t&&o.jsx("span",{className:"node-mask-badge",title:"Image edit mask reference",children:"Mask"}),Re.length>1&&o.jsxs("span",{className:"node-image-stack-badge",title:"Image stack variants",children:[Math.max(1,Ia+1),"/",Re.length]}),Te&&o.jsx("span",{className:"node-embed-badge",children:It==="youtube"?"YouTube":"Embed"}),_e&&o.jsx("span",{className:"node-video-badge",children:((Pa=t.metadata)==null?void 0:Pa.MediaModel)||((Zn=t.metadata)==null?void 0:Zn.MediaProvider)||"Video"})]}):null,Vn=Re.length>1||Te||_e||Ja?o.jsxs("div",{className:"node-surface-actions","data-testid":"node-surface-actions",children:[Re.length>1&&o.jsx("div",{className:"node-image-stack-rail","aria-label":"Image stack variants",children:Re.map((x,B)=>o.jsx("button",{type:"button",className:x.variantId===(pt==null?void 0:pt.variantId)?"is-active":"",title:x.title||x.caption||`Variant ${B+1}`,"aria-label":`Show image variant ${B+1}`,onPointerDown:le=>le.stopPropagation(),onClick:le=>Hs(x.variantId,le),children:o.jsx(Ar,{src:x.imageUrl,traceId:`${t.id}:${x.variantId||B}`,kind:"image-stack-variant",testId:"node-image-stack-thumb"})},x.variantId||`${x.imageUrl}-${B}`))}),Te&&o.jsxs("div",{className:"node-embed-actions",children:[o.jsxs("button",{type:"button",title:"Open embed","aria-label":"Open embed",onPointerDown:x=>x.stopPropagation(),onClick:x=>{x.stopPropagation(),De&&V(t,"external")},children:[o.jsx(Nn,{size:13}),o.jsx("span",{children:"Open"})]}),o.jsxs("button",{type:"button",title:"Copy URL","aria-label":"Copy URL",onPointerDown:x=>x.stopPropagation(),onClick:Bo,children:[o.jsx(vo,{size:13}),o.jsx("span",{children:"Copy URL"})]})]}),_e&&o.jsxs("div",{className:"node-video-actions",children:[o.jsxs("button",{type:"button",title:"Play video","aria-label":"Play video","data-testid":"node-video-play",onPointerDown:x=>x.stopPropagation(),onClick:Un,children:[o.jsx(Ca,{size:13}),o.jsx("span",{children:"Play"})]}),o.jsxs("button",{type:"button",title:"Pause video","aria-label":"Pause video","data-testid":"node-video-pause",onPointerDown:x=>x.stopPropagation(),onClick:$t,children:[o.jsx(Ao,{size:13}),o.jsx("span",{children:"Pause"})]})]}),Ja&&o.jsxs("div",{className:"node-asset-actions",children:[t.kind==="pdf"&&o.jsxs("button",{type:"button",title:"Preview PDF","data-testid":"node-pdf-preview",onPointerDown:x=>x.stopPropagation(),onClick:()=>V(t,"preview"),children:[o.jsx(qp,{size:13}),o.jsx("span",{children:"Preview"})]}),t.kind!=="directory"&&o.jsxs("button",{type:"button",title:"Open in new tab",onPointerDown:x=>x.stopPropagation(),onClick:()=>V(t,"external"),children:[o.jsx(Nn,{size:13}),o.jsx("span",{children:"Open"})]}),t.kind==="directory"&&o.jsxs("button",{type:"button",title:"Scan folder","data-testid":"directory-scan",onPointerDown:x=>x.stopPropagation(),onClick:()=>te(t.id),children:[o.jsx(jo,{size:13}),o.jsx("span",{children:"Scan"})]}),t.kind==="directory"&&o.jsxs("button",{type:"button",title:"Folder scan settings","data-testid":"directory-settings-open",onPointerDown:x=>x.stopPropagation(),onClick:()=>de(t.id),children:[o.jsx(ks,{size:13}),o.jsx("span",{children:"Settings"})]})]})]}):null,pe=Ve?null:o.jsxs("div",{className:"node-external-action-rail","data-testid":"node-external-action-rail",onPointerDown:x=>x.stopPropagation(),onClick:x=>x.stopPropagation(),children:[Vn,o.jsx("div",{className:"node-external-rail__pins",children:Hn}),o.jsx("div",{className:"node-actions","data-testid":"node-actions",children:nn}),he&&o.jsxs("div",{className:"node-agent-command-actions","data-testid":"node-agent-command-actions",onPointerDown:x=>x.stopPropagation(),onClick:x=>x.stopPropagation(),children:[o.jsx("button",{type:"button","data-testid":"node-agent-command-plan","data-agent-command-action":"plan",onClick:Aa,children:"Plan"}),o.jsx("button",{type:"button","data-testid":"node-agent-command-execute","data-agent-command-action":"execute",disabled:at==="Running",onClick:Ws,children:"Execute"})]}),We&&o.jsxs("div",{className:"node-code-note-actions","data-testid":"node-code-note-actions",onPointerDown:x=>x.stopPropagation(),onClick:x=>x.stopPropagation(),children:[o.jsx("button",{type:"button","data-testid":"node-code-note-approve","data-code-note-action":"approve",onClick:x=>Ma(x,"Approved","Planned","approve-local"),children:"Approve"}),o.jsx("button",{type:"button","data-testid":"node-code-note-review","data-code-note-action":"review",onClick:x=>Ma(x,"Reviewed","InSync","review-local"),children:"Review"}),o.jsx("button",{type:"button","data-testid":"node-code-note-out-of-sync","data-code-note-action":"out-of-sync",onClick:x=>Ma(x,mt,"OutOfSync","mark-out-of-sync-local"),children:"Out of sync"})]}),t.companyMode&&o.jsxs("div",{className:"node-company-quick-actions","data-testid":"node-company-quick-actions","data-company-status":an||"Staged",onPointerDown:x=>x.stopPropagation(),onClick:x=>x.stopPropagation(),children:[o.jsx("button",{type:"button",title:"Update Company goal from this note","aria-label":"Update Company goal from this note","data-testid":"node-company-sync-goal",disabled:At,onClick:()=>ze(t.id),children:o.jsx(bc,{size:12})}),o.jsx("button",{type:"button",title:"Refresh Company status","aria-label":"Refresh Company status","data-testid":"node-company-refresh",onClick:()=>St(t.id),children:o.jsx(jo,{size:12})}),At?o.jsx("button",{type:"button",title:"Company is archived","aria-label":"Company is archived","data-testid":"node-company-archived",disabled:!0,children:o.jsx(Yr,{size:12})}):sa?o.jsx("button",{type:"button",title:"Resume Company","aria-label":"Resume Company","data-testid":"node-company-resume",onClick:()=>Ue(t.id,"Staged"),children:o.jsx(Ca,{size:12})}):o.jsx("button",{type:"button",title:"Pause Company","aria-label":"Pause Company","data-testid":"node-company-pause",onClick:()=>Ue(t.id,"Paused"),children:o.jsx(Ao,{size:12})}),!At&&o.jsx("button",{type:"button",title:"Archive Company","aria-label":"Archive Company","data-testid":"node-company-archive",onClick:()=>Ue(t.id,"Archived"),children:o.jsx(Yr,{size:12})}),o.jsx("button",{type:"button",title:"Remove Company from this note","aria-label":"Remove Company from this note","data-testid":"node-company-remove",onClick:()=>G(t.id),children:o.jsx(Pt,{size:12})})]})]}),Qe=Ve?null:o.jsx("div",{className:"node-external-rail","data-testid":"node-external-rail",onPointerDown:x=>x.stopPropagation(),onClick:x=>x.stopPropagation(),children:o.jsxs("div",{className:"node-external-rail__meta",children:[o.jsxs("div",{className:"node-tags","data-testid":"node-external-tags",children:[(t.tags??[t.kind]).slice(0,3).map(x=>o.jsx("span",{children:x},x)),t.status&&o.jsx("span",{className:`node-status node-status--${t.status}`,children:t.status})]}),on,Dn,he&&o.jsxs("div",{className:"node-agent-command-state","data-testid":"node-agent-command-state","data-agent-command-status":at,"data-agent-command-mode":nt,"data-agent-command-role":z,"data-agent-command-adapter-state":((mn=t.metadata)==null?void 0:mn.AdapterState)||"adapter-gated",children:[o.jsx(Sn,{size:12}),o.jsx("strong",{children:"AC"}),o.jsx("span",{children:at}),o.jsx("span",{children:nt}),o.jsx("span",{children:z})]}),We&&o.jsxs("div",{className:"node-code-note-state","data-testid":"node-code-note-state","data-code-note-status":mt,"data-code-note-sync-state":wa,"data-code-note-kind":qa,"data-code-note-adapter-state":((Ea=t.metadata)==null?void 0:Ea.AdapterState)||"local-canvas-only",children:[o.jsx(vn,{size:12}),o.jsx("strong",{children:"CN"}),o.jsx("span",{children:mt}),o.jsx("span",{children:wa}),o.jsx("span",{children:qa})]}),t.companyMode&&o.jsxs("div",{className:"node-company-state","data-testid":"node-company-state",children:[o.jsx(Kl,{size:12}),o.jsx("strong",{children:((ca=t.metadata)==null?void 0:ca.CompanyExecutionModeLabel)||"Company staged"}),o.jsx("span",{children:((Ee=t.metadata)==null?void 0:Ee.CompanySubAgents)==="false"?"single-agent":"sub-agents"})]})]})});return o.jsxs("article",{className:`canvas-node canvas-node--${t.kind} ${Ve?"canvas-node--remote-surface":""} ${Me?"canvas-node--remote-monitor-surface":""} ${Za?"canvas-node--remote-control-surface":""} ${He?`canvas-node--automation-${He}`:""} ${he?"canvas-node--agent-command":""} ${We?"canvas-node--code-note":""} ${n?"is-selected":""} ${r?"is-pulsing":""} ${gt?"":"is-ai-disabled"} ${t.wordWrap===!1?"is-nowrap":""} ${Na?"is-collapsed":""} ${t.companyMode?`is-company-${t.companyMode}`:""}`,style:zt,"data-node-id":t.id,"data-automation-node-kind":He||void 0,"data-automation-external-policy":((Le=t.metadata)==null?void 0:Le.AutomationExternalActionPolicy)||void 0,"data-media-generation-contract":((_a=t.metadata)==null?void 0:_a.MediaGenerationContract)||void 0,"data-agent-command-node":he?"true":void 0,"data-agent-command-status":he?at:void 0,"data-agent-command-mode":he?nt:void 0,"data-agent-command-role":he?z:void 0,"data-code-note-node":We?"true":void 0,"data-code-note-status":We?mt:void 0,"data-code-note-sync-state":We?wa:void 0,"data-code-note-kind":We?qa:void 0,"data-remote-surface-chrome":Ve?"self-contained":void 0,"data-remote-surface-kind":ja||void 0,"data-remote-surface-title-owner":Ve?"inner-remote-view":void 0,"data-remote-surface-scroll-owner":Ve?"remote-page-rail":void 0,onPointerDown:x=>{c(t.id,x.shiftKey||x.metaKey||x.ctrlKey),p(t.id,x)},onDoubleClick:x=>{if(t.kind!=="directory")return;const B=x.target instanceof HTMLElement?x.target:null;B!=null&&B.closest('button,input,textarea,select,[contenteditable="true"],[contenteditable=""]')||(x.stopPropagation(),te(t.id))},children:[!Ve&&o.jsxs("div",{className:"node-header",children:[o.jsx("span",{className:"node-kind",children:o.jsx(Sa,{size:14})}),o.jsx("input",{value:t.title,"aria-label":"Node title",readOnly:ve,onPointerDown:x=>x.stopPropagation(),onChange:x=>{ve||m(t.id,{title:x.target.value})}})]}),Ra&&typeof document<"u"?Qm.createPortal(Ra,document.body):Ra,ye&&tn&&Be&&o.jsx("div",{className:"node-memo-palette","data-testid":"node-memo-palette",onPointerDown:x=>x.stopPropagation(),onClick:x=>x.stopPropagation(),children:ti.map(x=>o.jsx("button",{type:"button",className:x.key===Be.key?"is-active":"",title:`${x.label} memo color`,"aria-label":`${x.label} memo color`,"aria-pressed":x.key===Be.key,"data-memo-color":x.key,style:{"--memo-swatch":x.swatch,"--memo-swatch-ring":x.ring},onPointerDown:B=>B.stopPropagation(),onClick:B=>_o(x.key,B)},x.key))}),Bt?o.jsx("div",{className:`node-image-wrap ${Re.length>1?"node-image-wrap--stack":""} ${_t?"node-image-wrap--mask":""}`,"data-testid":_t?"node-mask-preview":Re.length>1?"node-image-stack":void 0,children:o.jsx(Ar,{src:Bt,traceId:t.id,kind:_t?"mask":"node-image",testId:"node-secure-image"})}):Me?o.jsx(cp,{node:t,onPatch:m,onCreateRemoteControl:vt}):Za?o.jsx(up,{node:t,onPatch:m}):ve?o.jsx("div",{className:"node-template-card","data-testid":"node-template-card",children:ie&&ht?o.jsxs(o.Fragment,{children:[o.jsxs("div",{className:"node-template-card__summary",children:[o.jsx("strong",{children:ie.prompt||ie.description}),o.jsx("span",{children:ht.description||ie.description})]}),o.jsx("div",{className:"node-template-card__options","data-testid":"node-template-card-options",children:ie.options.map(x=>o.jsxs("button",{type:"button",className:x.id===ht.id?"is-active":"","data-testid":"node-template-card-option","data-option-id":x.id,onPointerDown:B=>B.stopPropagation(),onClick:B=>la(x.id,B),children:[o.jsx("strong",{children:x.label}),o.jsx("span",{children:x.description})]},x.id||x.templateId))}),o.jsxs("div",{className:"node-template-card__inputs","data-testid":"node-template-card-inputs",children:[ht.inputs.map(x=>o.jsx(Nf,{input:x,value:ie.inputValues[x.key]??"",onChange:B=>Do(x.key,B)},x.key)),ht.inputs.length===0&&o.jsx("p",{className:"node-template-card__empty",children:ie.noInputsLabel||"No inputs needed."})]}),na&&o.jsx("div",{className:"node-template-card__validation",children:na}),o.jsxs("button",{type:"button",className:"node-template-card__generate","data-testid":"node-template-card-generate",disabled:!!na,onPointerDown:rt,onClick:x=>x.stopPropagation(),children:[o.jsx(Ca,{size:13}),o.jsx("span",{children:ie.generateLabel||ie.actionLabel||"Generate"})]})]}):o.jsx("div",{className:"node-template-card__missing",children:"Template card payload is unavailable."})}):Te?o.jsxs("div",{className:`node-embed-card ${Pe?"has-embed-thumbnail":"is-embed-link"}`,"data-testid":"node-embed-card",children:[o.jsx("div",{className:"node-embed-preview",children:Pe?o.jsx(Ar,{src:Pe,traceId:t.id,kind:"embed-thumbnail",testId:"node-embed-thumbnail"}):o.jsxs("div",{className:"node-embed-placeholder",children:[o.jsx(Nn,{size:24}),o.jsx("strong",{children:It==="youtube"?"YouTube":"Web embed"}),o.jsx("span",{children:To||De||"External link"})]})}),o.jsx("textarea",{value:t.body,"aria-label":"Embed URL or description",spellCheck:!1,onPointerDown:x=>x.stopPropagation(),onChange:x=>{const B=x.target.value;m(t.id,{body:B,assetUrl:B,metadata:{...t.metadata??{},sourceUrl:B,url:B}})}}),De&&o.jsx("span",{className:"node-embed-source",title:De,children:De})]}):_e?o.jsxs("div",{className:`node-video-card ${qe?"has-video-source":"is-video-prompt"}`,"data-testid":"node-video-card",children:[qe?o.jsx("video",{ref:me,src:qe,className:"node-video-player","data-testid":"node-video-player",controls:!0,preload:"metadata",onPointerDown:x=>x.stopPropagation()}):o.jsxs("div",{className:"node-video-placeholder",children:[o.jsx(In,{size:24}),o.jsx("strong",{children:"Video prompt"}),o.jsx("span",{children:((Ba=t.metadata)==null?void 0:Ba.MediaModel)||((pn=t.metadata)==null?void 0:pn.MediaProvider)||"Adapter gated"})]}),o.jsx("textarea",{value:t.body,"aria-label":"Video prompt or source",spellCheck:!1,onPointerDown:x=>x.stopPropagation(),onChange:x=>m(t.id,{body:x.target.value})}),qe&&o.jsx("span",{className:"node-video-source",title:Pn,children:Pn})]}):Ja?o.jsxs("div",{className:`node-asset-card node-asset-card--${t.kind}`,"data-testid":"node-asset-card",children:[o.jsx("div",{className:"node-asset-icon",children:o.jsx(Sa,{size:28})}),o.jsxs("div",{className:"node-asset-copy",children:[o.jsx("strong",{title:Bn,children:Bn}),o.jsx("span",{children:t.kind==="directory"?"Directory reference":t.kind==="pdf"?"PDF document":"File reference"}),t.kind==="directory"&&(Qa||fe||ea||en||On)&&o.jsxs("dl",{className:"node-asset-meta","data-testid":"node-directory-meta",children:[(ea||en)&&o.jsxs(o.Fragment,{children:[o.jsx("dt",{children:"Scanned"}),o.jsxs("dd",{children:[Number(ea??0).toLocaleString()," files / ",Number(en??0).toLocaleString()," folders"]})]}),Qa&&o.jsxs(o.Fragment,{children:[o.jsx("dt",{children:"Include"}),o.jsx("dd",{children:Qa})]}),fe&&o.jsxs(o.Fragment,{children:[o.jsx("dt",{children:"Exclude"}),o.jsx("dd",{children:fe})]}),On&&o.jsxs(o.Fragment,{children:[o.jsx("dt",{children:"Updated"}),o.jsx("dd",{children:new Date(On).toLocaleString()})]})]})]})]}):st?o.jsxs("div",{className:"node-csv-card","data-testid":"node-csv-card",children:[o.jsx(Mf,{preview:Eo,sort:Ze,onSort:x=>{const B=(Ze==null?void 0:Ze.columnIndex)===x&&Ze.direction==="asc"?"desc":"asc";zn({columnIndex:x,direction:B}),f.emit("node.csvTable.sort",{id:t.id,columnIndex:x,direction:B})}}),o.jsx("textarea",{value:t.body,"aria-label":"CSV source",spellCheck:!1,wrap:"off",onPointerDown:x=>x.stopPropagation(),onChange:x=>m(t.id,{body:x.target.value})})]}):ot?o.jsxs("div",{className:"node-markdown-card","data-testid":"node-markdown-card",children:[o.jsx("div",{className:"node-markdown-preview mindcanvas-text-scrollable-view","data-testid":"node-markdown-preview","aria-label":"Markdown preview",children:o.jsx(Pf,{value:t.body})}),o.jsx("textarea",{value:t.body,"aria-label":"Markdown source",spellCheck:!1,wrap:t.wordWrap===!1?"off":"soft",onPointerDown:x=>x.stopPropagation(),onChange:x=>m(t.id,{body:x.target.value})})]}):o.jsx(o.Fragment,{children:o.jsx("textarea",{value:t.body,"aria-label":"Node body",spellCheck:!1,wrap:t.wordWrap===!1?"off":"soft",onPointerDown:x=>x.stopPropagation(),onChange:x=>m(t.id,{body:x.target.value})})}),Qe,pe,ft,o.jsx("button",{type:"button",className:"node-resize-handle",title:"Resize node","aria-label":"Resize node",onPointerDown:x=>b(t.id,x)})]})});function Nf({input:e,value:t,onChange:n}){return o.jsxs("label",{className:"node-template-card__field",children:[o.jsxs("span",{children:[o.jsx("strong",{children:e.label}),e.description&&o.jsx("small",{children:e.description})]}),e.type==="textarea"?o.jsx("textarea",{value:t,placeholder:e.placeholder,onPointerDown:r=>r.stopPropagation(),onChange:r=>n(r.target.value)}):e.type==="select"?o.jsx("select",{value:t,onPointerDown:r=>r.stopPropagation(),onChange:r=>n(r.target.value),children:(e.options??[]).map(r=>o.jsx("option",{value:r.value,children:r.label},r.value))}):o.jsx("input",{type:"text",value:t,placeholder:e.placeholder,onPointerDown:r=>r.stopPropagation(),onChange:r=>n(r.target.value)})]})}function Af(e){const r=Math.min(430,window.innerHeight-24),d=Math.max(12,window.innerWidth-332-12),c=Math.min(Math.max(e.right-332,12),d),p=e.bottom+8,b=e.top-r-8,m=Math.max(12,window.innerHeight-r-12),y=p<=m?p:Math.max(12,b);return{left:c,top:Math.min(y,m)}}function Mf({preview:e,sort:t,onSort:n}){return!e||e.headers.length===0?o.jsx("div",{className:"csv-table-scroll mindcanvas-text-scrollable-view","data-testid":"csv-table-preview","aria-label":"CSV table preview",children:o.jsx("p",{className:"node-md-empty",children:"Paste CSV source to preview a table."})}):o.jsxs("div",{className:"csv-table-scroll mindcanvas-text-scrollable-view","data-testid":"csv-table-preview","data-sort-column":(t==null?void 0:t.columnIndex)??"","data-sort-direction":(t==null?void 0:t.direction)??"","data-total-rows":e.totalRows,"data-rendered-rows":e.renderedRows,"aria-label":"CSV table preview",onPointerDown:r=>r.stopPropagation(),children:[o.jsxs("table",{className:"csv-table",children:[o.jsx("thead",{children:o.jsx("tr",{children:e.headers.map((r,d)=>{const c=(t==null?void 0:t.columnIndex)===d,p=c&&t.direction==="asc"?"descending":"ascending";return o.jsx("th",{"aria-sort":c?t.direction==="asc"?"ascending":"descending":"none",children:o.jsxs("button",{type:"button",className:`csv-table-header-button ${c?"is-active":""}`,"data-testid":`csv-table-sort-${d}`,"aria-label":`Sort CSV by ${r||`Column ${d+1}`} ${p}`,onClick:()=>n(d),children:[o.jsx("span",{children:r||`Column ${d+1}`}),c&&o.jsx("small",{children:t.direction==="asc"?"Asc":"Desc"})]})},`${r}-${d}`)})})}),o.jsx("tbody",{children:e.rows.map((r,d)=>o.jsx("tr",{children:e.headers.map((c,p)=>o.jsx("td",{className:"csv-table-cell",children:r[p]??""},`csv-cell-${d}-${p}`))},`csv-row-${d}`))})]}),o.jsxs("div",{className:"csv-table-status",children:[o.jsxs("span",{children:[e.totalRows.toLocaleString()," rows"]}),o.jsxs("span",{children:[e.columnCount.toLocaleString()," columns"]}),e.truncated&&o.jsxs("span",{children:["showing ",e.renderedRows.toLocaleString()]})]})]})}function Tf(e,t){const n=Rf(e,xd+1);if(n.length===0)return null;const r=Math.min(yf,Math.max(...n.map(m=>m.length),1)),d=Cd(n[0],r).map((m,y)=>m.trim()||`Column ${y+1}`),c=n.slice(1,xd+1).map(m=>Cd(m,r)),p=t?[...c].sort((m,y)=>Lf(m[t.columnIndex]??"",y[t.columnIndex]??"",t.direction)):c,b=Math.max(0,String(e||"").split(/\r\n|\n|\r/).filter(m=>m.length>0).length-1);return{headers:d,rows:p,totalRows:b,columnCount:r,renderedRows:p.length,truncated:b>p.length}}function Rf(e,t){const n=[];let r=[],d="",c=!1;const p=String(e||"").replace(/\r\n/g,`
5
- `).replace(/\r/g,`
6
- `);for(let b=0;b<p.length;b+=1){const m=p[b],y=p[b+1];if(m==='"'){c&&y==='"'?(d+='"',b+=1):c=!c;continue}if(m===","&&!c){r.push(d),d="";continue}if(m===`
7
- `&&!c){if(r.push(d),r.some(v=>v.trim().length>0)&&n.push(r),r=[],d="",n.length>=t)break;continue}d+=m}return n.length<t&&(d.length>0||r.length>0)&&(r.push(d),r.some(b=>b.trim().length>0)&&n.push(r)),n}function Cd(e,t){return Array.from({length:t},(n,r)=>String(e[r]??"").trim())}function Lf(e,t,n){const r=Number(e.replace(/,/g,"")),d=Number(t.replace(/,/g,"")),p=Number.isFinite(r)&&Number.isFinite(d)&&e.trim()!==""&&t.trim()!==""?r-d:e.localeCompare(t,void 0,{numeric:!0,sensitivity:"base"});return n==="asc"?p:-p}function Pf({value:e}){const t=Ef(e);return t.length===0?o.jsx("p",{className:"node-md-empty",children:"Nothing to preview yet."}):o.jsx(o.Fragment,{children:t.map((n,r)=>{const d=`${n.kind}-${r}-${n.text}`;switch(n.kind){case"heading":return o.jsx("strong",{className:`node-md-heading node-md-heading--${n.level}`,children:n.text},d);case"quote":return o.jsx("blockquote",{className:"node-md-quote",children:n.text},d);case"list":return o.jsxs("div",{className:"node-md-list-item",children:[o.jsx("span",{"aria-hidden":"true",children:"-"}),o.jsx("p",{children:n.text})]},d);case"code":return o.jsx("code",{className:"node-md-code",children:n.text},d);case"table":return o.jsx("p",{className:"node-md-table-row",children:n.text},d);default:return o.jsx("p",{children:n.text},d)}})})}function Ef(e){const t=[];for(const n of String(e||"").replace(/\r\n/g,`
8
- `).split(`
9
- `)){const r=n.trim();if(!r)continue;const d=/^(#{1,6})\s+(.+)$/.exec(r);if(d?t.push({kind:"heading",level:d[1].length,text:us(d[2])}):/^>\s?/.test(r)?t.push({kind:"quote",text:us(r.replace(/^>\s?/,""))}):/^([-*+]|\d+\.)\s+/.test(r)?t.push({kind:"list",text:us(r.replace(/^([-*+]|\d+\.)\s+/,""))}):/^```/.test(r)||/^`[^`]+`$/.test(r)?t.push({kind:"code",text:r.replace(/^```[a-z0-9_-]*\s*/i,"").replace(/```$/,"").replace(/^`|`$/g,"")||"code block"}):/^\|.+\|$/.test(r)?t.push({kind:"table",text:r}):t.push({kind:"paragraph",text:us(r)}),t.length>=12)break}return t}function us(e){return e.replace(/!\[([^\]]*)\]\([^)]+\)/g,"$1").replace(/\[([^\]]+)\]\([^)]+\)/g,"$1").replace(/(\*\*|__)(.*?)\1/g,"$2").replace(/(\*|_)(.*?)\1/g,"$2").replace(/`([^`]+)`/g,"$1").trim()}function _f(e){var n,r;const t=String(((n=e.metadata)==null?void 0:n.memoColor)||((r=e.metadata)==null?void 0:r.MemoColor)||"coral").toLowerCase();return ti.find(d=>d.key===t)??ti[0]}function Bf(e){return Uc(e)}function Xc(e){return String(e.assetUrl||e.sourceFilePath||e.body||"").trim()}function Df(e){const t=Xc(e);if(!t)return"";const n=t.toLowerCase();return n.startsWith("blob:")||n.startsWith("data:video/")||/^https?:\/\//i.test(t)&&/\.(mp4|webm|ogg|ogv|mov|m4v)(?:[?#].*)?$/i.test(t)?t:""}function Of(e){var t,n,r,d,c,p;return String(((t=e.metadata)==null?void 0:t.sourceUrl)||((n=e.metadata)==null?void 0:n.SourceUrl)||((r=e.metadata)==null?void 0:r.url)||((d=e.metadata)==null?void 0:d.Url)||((c=e.metadata)==null?void 0:c.embedUrl)||((p=e.metadata)==null?void 0:p.EmbedUrl)||e.assetUrl||e.sourceFilePath||e.body||"").trim()}function Ff(e){var t,n;return String(((t=e.metadata)==null?void 0:t.embedType)||((n=e.metadata)==null?void 0:n.EmbedType)||"").trim().toLowerCase()}function $f(e,t){var r,d;const n=String(((r=e.metadata)==null?void 0:r.domain)||((d=e.metadata)==null?void 0:d.Domain)||"").trim();if(n)return n;try{return new URL(t).hostname.replace(/^www\./,"")}catch{return""}}function zf(e){return zc(e)}function kd(e){const t=e.indexOf(":");return t>0?e.slice(0,t):"relative"}function ms({value:e,options:t,onChange:n,ariaLabel:r,className:d="",menuClassName:c="",disabled:p=!1,emptyLabel:b="Select",testId:m}){const[y,v]=g.useState(!1),P=g.useRef(null),S=t.find(_=>_.value.toLowerCase()===e.toLowerCase()),D=(S==null?void 0:S.label)||e||b;return g.useEffect(()=>{if(!y)return;const _=O=>{var W;const U=O.target instanceof Node?O.target:null;U&&((W=P.current)!=null&&W.contains(U))||v(!1)},$=O=>{O.key==="Escape"&&v(!1)};return document.addEventListener("pointerdown",_,!0),document.addEventListener("keydown",$,!0),()=>{document.removeEventListener("pointerdown",_,!0),document.removeEventListener("keydown",$,!0)}},[y]),o.jsxs("div",{ref:P,className:`catalog-pill ${d}`,"data-open":y?"true":"false",children:[o.jsxs("button",{type:"button",className:"catalog-pill__button","aria-haspopup":"listbox","aria-expanded":y,"aria-label":r,title:(S==null?void 0:S.title)||D,disabled:p,"data-testid":m,onClick:()=>{p||v(_=>!_)},children:[o.jsxs("span",{className:"catalog-pill__content",children:[(S==null?void 0:S.groupLabel)&&o.jsx("span",{className:"catalog-pill__provider",children:S.groupLabel}),(S==null?void 0:S.showAspectIcon)&&o.jsx(wd,{option:S,compact:!0}),o.jsx("span",{className:"catalog-pill__label",children:D})]}),(S==null?void 0:S.trailingLabel)&&o.jsx("span",{className:"catalog-pill__trailing",children:S.trailingLabel}),o.jsx("span",{className:"catalog-pill__chevron",children:o.jsx(yc,{size:15})})]}),y&&!p&&o.jsx("div",{className:`catalog-pill__menu ${c}`,role:"listbox","aria-label":r,children:o.jsx("div",{className:"catalog-pill__scroll",children:t.map(_=>{var O;const $=_.value.toLowerCase()===e.toLowerCase();return o.jsxs("div",{children:[_.showGroupHeader&&o.jsxs("div",{className:`catalog-pill__group ${_.showSeparatorBefore?"catalog-pill__group--separated":""}`,children:[o.jsx("span",{children:_.groupLabel||_.groupKey||"Other"}),o.jsx("i",{})]}),o.jsxs("button",{type:"button",className:`catalog-pill__option ${$?"is-selected":""}`,role:"option","aria-selected":$,title:_.title||_.label,onClick:()=>{v(!1),_.value!==e&&n(_.value)},children:[o.jsxs("span",{className:"catalog-pill__option-main",children:[o.jsxs("span",{className:"catalog-pill__option-title",children:[_.showAspectIcon&&o.jsx(wd,{option:_}),o.jsx("span",{children:_.label})]}),(_.detail||_.badges&&_.badges.length>0)&&o.jsxs("span",{className:"catalog-pill__option-detail",children:[_.detail&&o.jsx("span",{children:_.detail}),(O=_.badges)==null?void 0:O.map(U=>o.jsx("em",{children:U},U))]})]}),_.trailingLabel&&o.jsx("span",{className:"catalog-pill__option-trailing",children:_.trailingLabel})]})]},`${_.groupKey||"group"}:${_.value}`)})})})]})}function wd({option:e,compact:t=!1}){const n=Math.max(1,e.aspectIconWidth??1),r=Math.max(1,e.aspectIconHeight??1),d=t?22:26,c=t?16:18,p=Math.min(d/n,c/r),b=Math.max(9,Math.round(n*p)),m=Math.max(9,Math.round(r*p));return o.jsx("span",{className:"catalog-pill__aspect","aria-hidden":"true",children:o.jsx("span",{style:{width:b,height:m}})})}function Uf(e){var t;return((t=e.metadata)==null?void 0:t.CompanyStatus)||e.status||(e.companyMode?"Staged":"Ready")}function Hf(e){switch(e.toLowerCase()){case"done":case"approved":case"completed":return 1;case"running":return .62;case"paused":return .38;case"archived":case"rejected":return .18;default:return .28}}function ai(e){var t;return(e.result||e.body||((t=e.metadata)==null?void 0:t.CompanyLastMessage)||"").trim()||"No local artifact content yet."}function ps(e,t){const n=t.edges.filter(c=>c.to===e.id).map(c=>{var p;return(p=t.nodes.find(b=>b.id===c.from))==null?void 0:p.title}).filter(Boolean),r=t.edges.filter(c=>c.from===e.id).map(c=>{var p;return(p=t.nodes.find(b=>b.id===c.to))==null?void 0:p.title}).filter(Boolean),d=Uf(e);return{id:e.id,title:e.title,type:e.kind,subtitle:ai(e).slice(0,160),status:d,progress:Hf(d),incoming:n,outgoing:r}}function Wf(e,t){const n=new Set(t.edges.filter(y=>y.from===e.id||y.to===e.id).flatMap(y=>[y.from,y.to]).filter(y=>y!==e.id)),r=t.nodes.filter(y=>n.has(y.id)),d=t.nodes.filter(y=>{var v;return y.id!==e.id&&(y.companyMode||((v=y.tags)==null?void 0:v.some(P=>P.toLowerCase().includes("company"))))}),c=[...r,...d].filter((y,v,P)=>P.findIndex(S=>S.id===y.id)===v),p=c.filter(y=>y.kind!=="ai-task"&&!y.result).slice(0,6),b=c.filter(y=>y.kind==="ai-task").slice(0,6),m=c.filter(y=>y.result||y.kind!=="ai-task").slice(0,6);return[{key:"root",label:"Root",nodes:[ps(e,t)]},{key:"context",label:"Context",nodes:p.map(y=>ps(y,t))},{key:"tasks",label:"Missions",nodes:b.map(y=>ps(y,t))},{key:"artifacts",label:"Artifacts",nodes:m.map(y=>ps(y,t))}].map(y=>({...y,nodes:y.nodes.length>0?y.nodes:[Vf(y.key)]}))}function Vf(e){return{id:`empty-${e}`,title:"No local nodes yet",type:"empty",subtitle:"Stage a follow-up task or connect context nodes to fill this lane.",status:"Empty",progress:0,incoming:[],outgoing:[]}}function Yf(e,t){const n=new Set(t.edges.filter(d=>d.from===e.id||d.to===e.id).flatMap(d=>[d.from,d.to]));return t.nodes.filter(d=>{var c;return d.id===e.id||n.has(d.id)||((c=d.tags)==null?void 0:c.includes("Company follow-up"))}).filter(d=>ai(d).trim().length>0).slice(0,8).map(d=>({id:`artifact-${d.id}`,type:d.kind==="ai-task"?"Mission Result":d.id===e.id?"Root Brief":"Context Artifact",title:d.title,content:ai(d),sourceNodeId:d.id}))}function Gf({board:e,rootNode:t,onClose:n,onStatus:r,onRemove:d,onSubmitFollowUp:c,onApproval:p,onAddArtifact:b}){var ge,ze,St,Ue,G;const[m,y]=g.useState(""),[v,P]=g.useState(null),S=g.useMemo(()=>Wf(t,e),[e,t]),D=g.useMemo(()=>Yf(t,e),[e,t]),_=D.find(V=>V.id===v)??D[0]??null,$=((ge=t.metadata)==null?void 0:ge.CompanyStatus)||"Staged",O=((ze=t.metadata)==null?void 0:ze.CompanyExecutionModeLabel)||"Auto / General",U=((St=t.metadata)==null?void 0:St.CompanySubAgents)==="false"?"single-agent":"sub-agents",W=((Ue=t.metadata)==null?void 0:Ue.CompanyApprovalStatus)||"Pending",re=!["Approved","Rejected"].includes(W),se=e.nodes.filter(V=>{var de;return V.kind==="ai-task"&&(((de=V.tags)==null?void 0:de.includes("Company follow-up"))||S.some(te=>te.nodes.some(vt=>vt.id===V.id)))}).length,Ne=()=>{const V=m.trim();V&&(y(""),c(t.id,V))};return o.jsx("div",{className:"company-focus-backdrop","data-testid":"company-graph-focus",onMouseDown:n,children:o.jsxs("section",{className:"company-focus-dialog","aria-label":"Company graph focus","data-disable-mindcanvas-hotkeys":"true",onMouseDown:V=>V.stopPropagation(),children:[o.jsxs("header",{className:"company-focus-head",children:[o.jsx("button",{type:"button",title:"Back to Canvas",onClick:n,children:o.jsx(Jp,{size:16})}),o.jsxs("div",{children:[o.jsx("span",{children:"Company Graph Focus"}),o.jsx("strong",{children:t.title}),o.jsx("small",{children:t.body||((G=t.metadata)==null?void 0:G.CompanyLastMessage)||"Local company root staged from MindCanvas."})]}),o.jsxs("div",{className:"company-focus-head__actions",children:[o.jsx("span",{children:$}),o.jsx("span",{children:O}),o.jsxs("span",{children:[o.jsx(gc,{size:12}),U]}),$==="Paused"?o.jsxs("button",{type:"button",onClick:()=>r(t.id,"Staged"),children:[o.jsx(Ca,{size:13}),"Resume"]}):o.jsxs("button",{type:"button",onClick:()=>r(t.id,"Paused"),children:[o.jsx(Ao,{size:13}),"Pause"]}),o.jsxs("button",{type:"button",onClick:()=>r(t.id,"Archived"),children:[o.jsx(Yr,{size:13}),"Archive"]}),o.jsxs("button",{type:"button",className:"is-danger",onClick:()=>d(t.id),children:[o.jsx(Rs,{size:13}),"Remove"]})]})]}),o.jsxs("div",{className:"company-focus-main",children:[o.jsxs("main",{children:[o.jsxs("div",{className:"company-focus-metrics",children:[o.jsx(gs,{label:"Missions",value:se||1,tone:"blue"}),o.jsx(gs,{label:"Population",value:U==="sub-agents"?4:1,tone:"slate"}),o.jsx(gs,{label:"Approvals",value:re?1:0,tone:"amber"}),o.jsx(gs,{label:"Artifacts",value:D.length,tone:"teal"})]}),o.jsxs("section",{className:"company-focus-graph",children:[o.jsxs("div",{className:"company-focus-section-head",children:[o.jsxs("div",{children:[o.jsx(Zp,{size:15}),o.jsx("strong",{children:"Virtual Flow Graph"})]}),o.jsxs("span",{children:[e.edges.length," board edges"]})]}),o.jsx("div",{className:"company-focus-lanes",children:S.map(V=>o.jsxs("section",{className:"company-focus-lane",children:[o.jsxs("header",{children:[o.jsx("strong",{children:V.label}),o.jsxs("span",{children:[V.nodes.filter(de=>de.type!=="empty").length," nodes"]})]}),o.jsx("div",{className:"company-focus-node-list",children:V.nodes.map(de=>o.jsxs("article",{className:`company-focus-node ${de.type==="empty"?"is-empty":""}`,children:[o.jsxs("div",{children:[o.jsx("span",{children:de.type}),o.jsx("b",{children:de.status})]}),o.jsx("strong",{children:de.title}),o.jsx("p",{children:de.subtitle}),o.jsx("div",{className:"company-focus-progress",children:o.jsx("i",{style:{width:`${Math.round(de.progress*100)}%`}})}),de.incoming.length>0&&o.jsxs("small",{children:["From: ",de.incoming.slice(0,2).join(", ")]}),de.outgoing.length>0&&o.jsxs("small",{children:["Next: ",de.outgoing.slice(0,2).join(", ")]})]},de.id))})]},V.key))})]})]}),o.jsxs("aside",{className:"company-focus-side",children:[o.jsxs("section",{children:[o.jsx("div",{className:"company-focus-section-head",children:o.jsxs("div",{children:[o.jsx(bc,{size:15}),o.jsx("strong",{children:"Next Task"})]})}),o.jsx("p",{children:"Stage a follow-up AI Task from this company root. It stays local until an adapter runs it."}),o.jsx("textarea",{value:m,onChange:V=>y(V.target.value),placeholder:"Generate the next practical revenue validation task."}),o.jsxs("button",{type:"button",className:"company-focus-primary",disabled:!m.trim(),onClick:Ne,children:[o.jsx(Qp,{size:13}),"Stage Task"]})]}),o.jsxs("section",{children:[o.jsxs("div",{className:"company-focus-section-head",children:[o.jsxs("div",{children:[o.jsx(ql,{size:15}),o.jsx("strong",{children:"Approvals"})]}),o.jsx("span",{children:W})]}),o.jsxs("article",{className:`company-focus-approval company-focus-approval--${W.toLowerCase()}`,children:[o.jsx("span",{children:O}),o.jsx("strong",{children:"Run staged company work locally"}),o.jsx("p",{children:"External execution, publishing, money movement, and destructive tool calls remain blocked until an adapter confirms them."}),re&&o.jsxs("div",{children:[o.jsxs("button",{type:"button",onClick:()=>p(t.id,"Approved"),children:[o.jsx(ql,{size:13}),"Approve locally"]}),o.jsxs("button",{type:"button",onClick:()=>p(t.id,"Rejected"),children:[o.jsx(eg,{size:13}),"Reject"]})]})]})]}),o.jsxs("section",{children:[o.jsxs("div",{className:"company-focus-section-head",children:[o.jsxs("div",{children:[o.jsx(kt,{size:15}),o.jsx("strong",{children:"Artifacts"})]}),o.jsx("span",{children:D.length})]}),o.jsx("div",{className:"company-focus-artifacts",children:D.map(V=>o.jsxs("button",{type:"button",className:(_==null?void 0:_.id)===V.id?"is-selected":"",onClick:()=>P(V.id),children:[o.jsx("span",{children:V.type}),o.jsx("strong",{children:V.title})]},V.id))}),_&&o.jsxs("div",{className:"company-focus-preview",children:[o.jsx("span",{children:_.type}),o.jsx("strong",{children:_.title}),o.jsx("pre",{children:_.content}),o.jsxs("button",{type:"button",onClick:()=>b(t.id,_),children:[o.jsx(wo,{size:13}),"Add to Canvas"]})]})]})]})]})]})})}function gs({label:e,value:t,tone:n}){return o.jsxs("article",{className:`company-focus-metric company-focus-metric--${n}`,children:[o.jsx("span",{children:e}),o.jsx("strong",{children:t})]})}function Kf({url:e,fileName:t,onClose:n}){return o.jsx("div",{className:"pdf-viewer-backdrop","data-testid":"pdf-viewer-dialog",onMouseDown:n,children:o.jsxs("section",{className:"pdf-viewer-dialog","aria-label":"PDF viewer",onMouseDown:r=>r.stopPropagation(),children:[o.jsxs("header",{className:"pdf-viewer-head",children:[o.jsxs("div",{children:[o.jsx("span",{children:"PDF Viewer"}),o.jsx("strong",{title:t,children:t})]}),o.jsxs("div",{className:"pdf-viewer-actions",children:[o.jsx("button",{type:"button",title:"Open PDF in new tab","data-testid":"pdf-viewer-open-external",onClick:()=>window.open(e,"_blank","noopener,noreferrer"),children:o.jsx(Nn,{size:16})}),o.jsx("button",{type:"button",title:"Close PDF viewer","data-testid":"pdf-viewer-close",onClick:n,children:o.jsx(Pt,{size:16})})]})]}),o.jsx("iframe",{src:e,title:t,className:"pdf-viewer-frame","data-testid":"pdf-viewer-frame"})]})})}const ws=.28,Ss=2.8,Xf=96,qf=140,vs=188,js=126,wn=10,Jf=720,Zf=.8,Wa={x:540,y:210,scale:1},Sd=8,qc=["dot","line","particles","spirit"],xa="n",Tr=["0","1","2","3","4","5","6","7","8","9"],Qt=24,vd=900,Qf=3e3,jd="mindexec-react-project-gallery-startup-v1",Jc="mindexec-react-function-toolbar-mode-v1",Zc="mindexec-react-project-workspace-history-v1",Qc=5,Is="__MINDEXEC_REACT_NODES__",hs=34,Id=30,bn=1280,yn=960,eb=154,ni=4e4,tb=50,Es=100,eu=50*1024,Rr=eu,Lr=12e4,Nd=64*1024,ab=5e3,ji=2500,Mn=36,oi="Select a LocalBridge directory",tu="mindexec.react.templateStudioDraft.v1.",Ii="BusinessAutomationNode",nb="MindCanvasAgent",ob="CodeNote";function sb(){return pc(Cs())}const rb=["Body:","Describe the implementation slice this note controls.","","Why:","Explain why this change should exist before writing code.","","Related files:","- src/features/canvas/MindCanvas.tsx","","Acceptance criteria:","- The intended change is visible on the canvas.","- The note can be approved, reviewed, or marked out of sync locally."].join(`
10
- `),Ni={"image-generate":{kind:"image-generate",mode:"Image",title:"Image Generation Spec",body:["Prepare an image generation prompt/spec.","","Subject:","Visual style:","Composition:","Constraints:","Business use case:"].join(`
11
- `),tag:"Image Spec",toolHint:"Media.ImagePrompt",outputType:"image-prompt",width:380,height:228},"video-generate":{kind:"video-generate",mode:"Video",title:"Video Generation Spec",body:["Prepare a video generation prompt/spec.","","Subject:","Motion:","Scene/composition:","Duration/format:","Business use case:"].join(`
12
- `),tag:"Video Spec",toolHint:"Media.VideoPrompt",outputType:"video-prompt",width:420,height:236}},ib=["Objective:","","Constraints:","","Expected output:"].join(`
13
- `),lb=new Set(["note","text","ai-task","image","mask","video","embed","code","csv-table","memo","pdf","file","directory","template-launcher","remote-monitor","remote-control","markdown"]);function Ad(e,t){try{const n=window.localStorage.getItem(`${tu}${e}`);if(!n)return xs(t);const r=JSON.parse(n);return{...xs(t),...r,templateId:Co(r.templateId||r.templateTitle||t)}}catch{return xs(t)}}function Md(e,t){window.localStorage.setItem(`${tu}${e}`,JSON.stringify(t))}function Td(e){return{id:`studio-${e.templateId||"template-studio-draft"}`,label:e.templateTitle||"Template Studio Test",description:"Template Studio test create",iconClass:"template-studio-test",prompt:"Use test inputs to create a real local board from the compiled template.",options:[]}}function _s(e){return String(e||"").split(",").map(t=>t.trim().toLowerCase()).filter(Boolean)}function au(e,t,n){const r=e.toLowerCase(),d=t.toLowerCase();return n.some(c=>r.includes(c)||d.includes(c))}function nu(e,t){if(t.length===0)return!0;const n=e.toLowerCase(),r=n.includes(".")?`.${n.split(".").pop()??""}`:"";return t.some(d=>d.startsWith(".")?d===r:n.includes(d))}async function db(e,t){const n=_s(t==null?void 0:t.Include),r=_s(t==null?void 0:t.Exclude),d=[];let c=0,p=0,b=0,m=!1;async function y(v,P=""){for await(const S of v.values()){if(b>=ji){m=!0;return}const D=P?`${P}/${S.name}`:S.name;if(!au(D,S.name,r)){if(S.kind==="file"){if(!nu(S.name,n))continue;c+=1,b+=1,d.length<Mn&&d.push({name:S.name,path:D,kind:"file"});continue}if(S.kind==="directory"&&(p+=1,b+=1,d.length<Mn&&d.push({name:S.name,path:D,kind:"directory"}),await y(S,D),m))return}}}return await y(e),{fileCount:c,directoryCount:p,preview:d,truncated:m}}function Tn(e){return typeof e=="string"?e.trim():""}function cb(e){return!e||e===oi?!1:!/^(https?:|data:|blob:|file:)/i.test(e)}function ub(e){var d;const t=Tn((d=e.metadata)==null?void 0:d.DirectoryPath),n=Tn(e.sourceFilePath),r=t||n;return cb(r)?r:""}function mb(e,t){const n=Tn(t.path);if(n)return n;const r=Tn(t.name);if(!e)return r;const d=e.includes("\\")?"\\":"/";return`${e.replace(/[\\/]+$/,"")}${d}${r}`}async function pb(e,t,n,r){const d=_s(t==null?void 0:t.Include),c=_s(t==null?void 0:t.Exclude),p=[],b=[{bridgePath:e,relativePath:""}];let m=0,y=0,v=0,P=!1;for(;b.length>0;){const S=b.shift();if(!S)break;const D=await Lp(S.bridgePath,n,r),_=Array.isArray(D.items)?D.items:[];for(const $ of _){if(v>=ji){P=!0;break}const O=Tn($.name);if(!O)continue;const U=S.relativePath?`${S.relativePath}/${O}`:O;if(au(U,O,c))continue;const W=$.isDirectory===!0,re=$.isFile===!0||$.isDirectory!==!0;if(W){y+=1,v+=1,p.length<Mn&&p.push({name:O,path:U,kind:"directory"}),b.push({bridgePath:mb(S.bridgePath,$),relativePath:U});continue}if(re){if(!nu(O,d))continue;m+=1,v+=1,p.length<Mn&&p.push({name:O,path:U,kind:"file"})}}if(P)break}return{fileCount:m,directoryCount:y,preview:p,truncated:P}}function Rd(e,t){const n=t.preview.map(r=>`${r.kind==="directory"?"dir":"file"}:${r.path}`).join(`
14
- `);return[`Directory: ${e}`,`Files: ${t.fileCount}`,`Folders: ${t.directoryCount}`,t.truncated?`Preview capped at ${ji} entries.`:"Scan completed.","",n||"(empty or filtered)"].join(`
15
- `)}const gb=new Set(["astro","bash","bat","c","cc","cpp","cs","css","fs","go","h","hpp","html","java","js","json","jsx","kt","lua","mjs","php","ps1","py","razor","rs","scss","sh","sql","svelte","swift","ts","tsx","vue","xml","yaml","yml"]),hb=new Set(["csv","log","md","markdown","rtf","text","txt"]);function Ld(e){const t=e;return Number.isFinite(t==null?void 0:t.x)&&Number.isFinite(t==null?void 0:t.y)}function si(e){return e==="top"||e==="right"||e==="bottom"||e==="left"}function fb(e){switch(e){case"top":return"bottom";case"right":return"left";case"bottom":return"top";case"left":return"right";default:return"left"}}function Pd(e){switch(e){case"top":return{x:0,y:-1};case"right":return{x:1,y:0};case"bottom":return{x:0,y:1};case"left":return{x:-1,y:0};default:return{x:1,y:0}}}function Et(e,t){switch(t){case"top":return{x:e.x+e.width/2,y:e.y};case"right":return{x:e.x+e.width,y:e.y+e.height/2};case"bottom":return{x:e.x+e.width/2,y:e.y+e.height};case"left":return{x:e.x,y:e.y+e.height/2};default:return{x:e.x+e.width,y:e.y+e.height/2}}}function bb(e,t){const n=[{side:"top",point:Et(e,"top")},{side:"right",point:Et(e,"right")},{side:"bottom",point:Et(e,"bottom")},{side:"left",point:Et(e,"left")}];let r=n[0],d=Number.POSITIVE_INFINITY;for(const c of n){const p=c.point.x-t.x,b=c.point.y-t.y,m=p*p+b*b;m<d&&(r=c,d=m)}return r.side}function yb(e,t){return e.x>=t.x&&e.x<=t.x+t.width&&e.y>=t.y&&e.y<=t.y+t.height}function Ed(e,t,n,r){const d=Math.hypot(n.x-e.x,n.y-e.y),c=ue(d*.38,54,220),p=Pd(t),b=Pd(r);return[`M ${e.x} ${e.y}`,`C ${e.x+p.x*c} ${e.y+p.y*c},`,`${n.x+b.x*c} ${n.y+b.y*c},`,`${n.x} ${n.y}`].join(" ")}function Pr(e){var r,d;const t=Number((r=e.viewState)==null?void 0:r.cursorX),n=Number((d=e.viewState)==null?void 0:d.cursorY);return Number.isFinite(t)&&Number.isFinite(n)?{x:t,y:n}:null}function Va(e,t){return{...e,viewState:{...e.viewState??{},cursorX:t.x,cursorY:t.y}}}function xb(e,t){return t?{x:Math.round(e.x/Qt)*Qt,y:Math.round(e.y/Qt)*Qt}:e}function X(e){return`${e}-${Math.random().toString(36).slice(2,9)}`}function Cb(e){switch(e){case"GeneralCompany":return"General AI Company";case"GrowthValidation":return"Growth Validation";case"RevenueAffiliate":return"Revenue / Affiliate";case"ProductBuild":return"Product Build";case"ResearchOnly":return"Research Only";default:return"Auto Detect"}}function ue(e,t,n){return Math.min(n,Math.max(t,e))}const kb=112,wb=80;function _d(e,t){const n=t/2,r=kb+e/2,d=Math.max(r,t-wb);return ue(Math.max(n,r),0,d)}function Er(e){return{x:e.x+e.width/2,y:e.y+e.height/2}}function ri(e){if(!e)return"No date";const t=new Date(e);return Number.isNaN(t.getTime())?"No date":t.toLocaleDateString(void 0,{month:"short",day:"2-digit",year:"numeric"})}function yo(e){return!!(e&&!["image","video","pdf","file","directory","remote-monitor","remote-control"].includes(e.kind))}function Ya(e){var t,n;return!!(e&&(e.kind==="remote-monitor"||((t=e.metadata)==null?void 0:t.SemanticType)==="RemoteFleetMonitor"||((n=e.metadata)==null?void 0:n.RemoteFleetNodeRole)==="fleet-monitor"))}function Sb(e){return e.isExpanded===!1&&Number(e.originalHeight??0)>e.height+1}function vb(e){return Si(e)}function jb(e){return Uc(e)}function So(e){var n;const t=(((n=e.imageStack)==null?void 0:n.variants)??[]).filter(r=>!!r.imageUrl).map((r,d)=>({...r,variantId:r.variantId||`${e.id}:variant-${d+1}`,title:r.title||e.title,sourceNodeId:r.sourceNodeId||e.id}));return t.length>0?t:e.imageUrl?[{variantId:`${e.id}:image`,imageUrl:e.imageUrl,assetId:e.assetUrl,title:e.title,sourceNodeId:e.id}]:[]}function Bd(e,t,n,r){let d=e.variantId||X("image-variant");for(;n.has(d);)d=X("image-variant");return n.add(d),{...e,variantId:d,imageUrl:e.imageUrl,assetId:e.assetId||t.assetUrl,title:e.title||t.title,sourceNodeId:e.sourceNodeId||t.id,createdAtUtc:e.createdAtUtc||r}}function Ib(e){return[e.title,"",e.result?`Result:
16
- ${e.result}`:e.body,e.imageUrl?`
17
- Image: ${e.imageUrl}`:"",e.assetUrl?`
18
- Asset: ${e.assetUrl}`:"",e.sourceFilePath?`
19
- Source: ${e.sourceFilePath}`:""].filter(Boolean).join(`
20
- `)}function Nb(e){if(e.kind!=="image")return"";const t=So(e).find(n=>{var r;return n.variantId===((r=e.imageStack)==null?void 0:r.activeVariantId)});return String((t==null?void 0:t.imageUrl)||Si(e)).trim()}async function Ab(e){const t=navigator.clipboard;if(t&&typeof ClipboardItem<"u"&&typeof t.write=="function")try{const r=await(await fetch(e)).blob();if(r.type.startsWith("image/"))return await t.write([new ClipboardItem({[r.type]:r})]),"image"}catch{}return await ko(e),"text"}function _r(e){var r;const n=(e.result||e.body||"").split(/\r?\n/).reduce((d,c)=>d+Math.max(1,Math.ceil(c.length/54)),0);return ue(112+n*21+((r=e.tags)!=null&&r.length?28:0),150,620)}function Mb(e){switch(e.kind){case"remote-monitor":return{minWidth:520,minHeight:360,maxWidth:1400,maxHeight:980};case"remote-control":return{minWidth:420,minHeight:300,maxWidth:1400,maxHeight:980};case"video":return{minWidth:300,minHeight:190,maxWidth:bn,maxHeight:yn};case"image":return{minWidth:220,minHeight:160,maxWidth:bn,maxHeight:yn};case"pdf":case"file":case"directory":return{minWidth:240,minHeight:128,maxWidth:860,maxHeight:720};case"code":return{minWidth:260,minHeight:160,maxWidth:bn,maxHeight:yn};case"csv-table":return{minWidth:320,minHeight:180,maxWidth:bn,maxHeight:yn};case"ai-task":return{minWidth:260,minHeight:154,maxWidth:bn,maxHeight:yn};default:return{minWidth:220,minHeight:132,maxWidth:bn,maxHeight:yn}}}function tt(e){return String(e||"").trim()||"Untitled"}const ou="Multi Desktop Monitor";function Dd(e){return tt(e).toLowerCase()===ou.toLowerCase()}function Tb(e,t,n){const r=tt(e.name);return!n||!Dd(r)?r:t.nodes.some(c=>Ya(c)&&Dd(c.title||ou))?"MindCanvas":r}function ka(e){return typeof e=="object"&&e!==null}function ii(e){const t=e.toLowerCase(),n=t.lastIndexOf(".");return n>=0?t.slice(n+1):""}function Rb(e){if(!ka(e))return;const t=Object.entries(e).filter(([n])=>n.trim().length>0).map(([n,r])=>[n,String(r??"")]);return t.length>0?Object.fromEntries(t):void 0}function Lb(e){if(!Array.isArray(e))return;const t=e.map(n=>String(n??"").trim()).filter(Boolean).slice(0,24);return t.length>0?t:void 0}function fs(e,t=0,n=Number.MAX_SAFE_INTEGER){const r=Number(e);if(Number.isFinite(r))return ue(r,t,n)}function Br(e){return e&&qc.includes(e)?e:"dot"}function Od(e){return Math.round(e/Qt)*Qt}function Pb(e){if(!ka(e))return null;const t=typeof e.variantId=="string"?e.variantId.trim():"",n=typeof e.imageUrl=="string"?e.imageUrl.trim():"";return!t||!n?null:{variantId:t,imageUrl:n,assetId:typeof e.assetId=="string"?e.assetId:void 0,title:typeof e.title=="string"?e.title:void 0,caption:typeof e.caption=="string"?e.caption:void 0,sourceNodeId:typeof e.sourceNodeId=="string"?e.sourceNodeId:void 0,createdAtUtc:typeof e.createdAtUtc=="string"?e.createdAtUtc:void 0}}function Eb(e){if(!ka(e)||!Array.isArray(e.variants))return;const t=e.variants.map(d=>Pb(d)).filter(d=>!!d).slice(0,128);if(t.length===0)return;const n=typeof e.activeVariantId=="string"?e.activeVariantId:"";return{activeVariantId:t.some(d=>d.variantId===n)?n:t[0].variantId,variants:t,kind:typeof e.kind=="string"&&e.kind.trim()?e.kind:"versions",title:typeof e.title=="string"?e.title:void 0,updatedAtUtc:typeof e.updatedAtUtc=="string"?e.updatedAtUtc:void 0}}function li(e,t,n){if(!(!e||e.variants.length===0))return{...e,variants:e.variants.map(r=>({...r,sourceNodeId:t&&n&&r.sourceNodeId===t?n:r.sourceNodeId}))}}function _b(e){if(!ka(e))return null;const t=e.kind,n=Number(e.x),r=Number(e.y),d=Number(e.width),c=Number(e.height);if(typeof e.id!="string"||typeof t!="string"||!lb.has(t)||typeof e.title!="string"||typeof e.body!="string"||!Number.isFinite(n)||!Number.isFinite(r)||!Number.isFinite(d)||!Number.isFinite(c))return null;const p=Eb(e.imageStack),b=(p==null?void 0:p.variants.find(m=>m.variantId===p.activeVariantId))??(p==null?void 0:p.variants[0]);return{id:e.id,kind:t,title:e.title,body:e.body,x:n,y:r,width:ue(d,120,1280),height:ue(c,96,920),status:["idle","running","paused","done","blocked"].includes(String(e.status))?e.status:void 0,result:typeof e.result=="string"?e.result:void 0,imageUrl:typeof e.imageUrl=="string"?e.imageUrl:b==null?void 0:b.imageUrl,imageStack:p,assetUrl:typeof e.assetUrl=="string"?e.assetUrl:void 0,sourceFilePath:typeof e.sourceFilePath=="string"?e.sourceFilePath:void 0,isChunkedText:typeof e.isChunkedText=="boolean"?e.isChunkedText:void 0,totalLineCount:fs(e.totalLineCount),scrollOffset:fs(e.scrollOffset),maxScroll:fs(e.maxScroll),isExpanded:typeof e.isExpanded=="boolean"?e.isExpanded:void 0,originalHeight:fs(e.originalHeight),tags:Lb(e.tags),role:typeof e.role=="string"?e.role:void 0,metadata:Rb(e.metadata),aiEnabled:typeof e.aiEnabled=="boolean"?e.aiEnabled:void 0,wordWrap:typeof e.wordWrap=="boolean"?e.wordWrap:void 0,companyMode:e.companyMode==="candidate"||e.companyMode==="bound"?e.companyMode:void 0}}function Bb(e){return!ka(e)||typeof e.id!="string"||typeof e.from!="string"||typeof e.to!="string"||e.kind!=="context"&&e.kind!=="result"?null:{id:e.id,from:e.from,to:e.to,kind:e.kind,fromSide:si(e.fromSide)?e.fromSide:void 0,toSide:si(e.toSide)?e.toSide:void 0}}function Fd(e){if(!e.includes(Is))return null;try{const t=JSON.parse(e);if(!ka(t)||t.__type!==Is||!Array.isArray(t.nodes))return null;const n=t.nodes.map(d=>_b(d)).filter(d=>!!d);if(n.length===0)return null;const r=Array.isArray(t.edges)?t.edges.map(d=>Bb(d)).filter(d=>!!d):[];return{__type:Is,source:"MindExecReact",copiedAt:typeof t.copiedAt=="string"?t.copiedAt:new Date().toISOString(),nodes:n,edges:r}}catch{return null}}function Db(e,t){return{__type:Is,source:"MindExecReact",copiedAt:new Date().toISOString(),nodes:e.map(n=>({...n,metadata:n.metadata?{...n.metadata}:void 0,tags:n.tags?[...n.tags]:void 0,imageStack:li(n.imageStack)})),edges:t.map(n=>({...n}))}}const Ob=/^\s*\[[^\]]+\]\((https?:\/\/[^)\s]+)\)\s*$/i,Fb=/<iframe[^>]+src\s*=\s*(?:"|\x27)(?<url>https?:\/\/[^"\x27]+)(?:"|\x27)/i,$b=/https?:\/\/[^\s<>()"\x27]+/i,zb=/^[A-Za-z0-9_-]{6,}$/,Ub=new Set(["avi","m4v","mov","mp4","mpeg","ogv","webm"]);function Dr(e){return e.trim().replace(/[.,;:!?\])}]+$/g,"")}function Hb(e){var c;const t=e.trim();if(!t)return"";const n=Fb.exec(t);if((c=n==null?void 0:n.groups)!=null&&c.url)return Dr(n.groups.url);const r=Ob.exec(t);if(r!=null&&r[1])return Dr(r[1]);const d=t.split(/\r?\n/).map(p=>p.trim()).filter(Boolean);if(d.length===1){const p=$b.exec(d[0]);if(p&&p[0]===d[0])return Dr(p[0])}return""}function Ai(e){const t=e.trim(),n=Hb(t);if(n)return n;if(!t||/\s/.test(t))return"";try{const r=new URL(t);return r.protocol==="data:"||r.protocol==="blob:"?t:""}catch{return""}}function Wb(e){try{const t=new URL(e);return ii(t.pathname)}catch{return ii(e)}}function Vb(e){const t=e.hostname.toLowerCase();if(!t||t==="localhost"||t.endsWith(".localhost"))return!0;const n=/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/.exec(t);if(n){const d=n.slice(1).map(Number);if(d.some(b=>!Number.isInteger(b)||b<0||b>255))return!0;const[c,p]=d;return c===0||c===10||c===127||c===169&&p===254||c===172&&p>=16&&p<=31||c===192&&p===168}const r=t.replace(/^\[|\]$/g,"").toLowerCase();return r==="::1"||r==="0:0:0:0:0:0:0:1"||r.startsWith("fc")||r.startsWith("fd")?!0:/^fe[89ab]/i.test(r.replace(/:/g,""))}function Rn(e){const t=Ai(e);if(!t)return null;try{const n=new URL(t);return n.protocol!=="http:"&&n.protocol!=="https:"||Vb(n)?null:n}catch{return null}}function Or(e){return zb.test(e)}function Yb(e){const t=Rn(e);if(!t)return"";const n=t.hostname.toLowerCase().replace(/^www\./,"");if(n==="youtu.be"){const b=t.pathname.split("/").filter(Boolean)[0]??"";return Or(b)?b:""}if(!n.endsWith("youtube.com")&&!n.endsWith("youtube-nocookie.com"))return"";const r=t.searchParams.get("v")??"";if(Or(r))return r;const d=t.pathname.split("/").filter(Boolean),c=d.findIndex(b=>["embed","shorts","live","v"].includes(b)),p=c>=0?d[c+1]??"":"";return Or(p)?p:""}function Gb(e){const t=e.toLowerCase(),n=Wb(e);return t.startsWith("data:image/")||["avif","gif","jpeg","jpg","png","svg","webp"].includes(n)?"image":Ub.has(n)?"video":n==="pdf"?"pdf":Rn(e)?"embed":"file"}function Kb(e){try{const t=new URL(e),n=t.pathname.split("/").filter(Boolean).pop();return decodeURIComponent(n||t.hostname||e).slice(0,90)}catch{return e.slice(0,90)}}function Xb(e,t,n="clipboard-url"){const r=Gb(e),d=Kb(e),c=r==="embed"?Rn(e):null,p=r==="embed"?Yb(e):"",b=p?"youtube":"webpage",m=(c==null?void 0:c.hostname.replace(/^www\./,""))??"",y=p?`https://www.youtube.com/watch?v=${p}`:e,v=p?`https://www.youtube-nocookie.com/embed/${p}`:"",P=r==="image"?`Image: ${d}`:r==="video"?`Video: ${d}`:r==="embed"?p?"YouTube Video":`Embed: ${m||d}`:r==="pdf"?`PDF: ${d}`:`URL: ${d}`;return{id:X("node"),kind:r,title:P,body:y,x:t.x,y:t.y,width:r==="embed"?460:r==="video"?420:r==="image"?360:300,height:r==="embed"?260:r==="video"?236:r==="image"?240:154,imageUrl:r==="image"?e:void 0,assetUrl:r==="image"?void 0:y,tags:r==="embed"?["Embed",p?"YouTube":"Web"]:r==="file"?["URL","File"]:[r.toUpperCase()],metadata:{Source:n,AdapterState:"local-reference",Durable:"false",...r==="embed"?{source:"embed",embedType:b,provider:p?"youtube":"web",renderMode:p?"card":"snapshot",aspectRatio:p?"16:9":"auto",sourceUrl:y,url:y,originalInputUrl:e,embedUrl:v,videoId:p,thumbnailUrl:p?`https://img.youtube.com/vi/${p}/hqdefault.jpg`:"",title:P,domain:m,faviconUrl:!p&&c?`https://www.google.com/s2/favicons?sz=64&domain_url=${encodeURIComponent(y)}`:"",description:p?"":"Capture a visual snapshot or open this page in a new tab.",iframeAllowed:"false",iframeBlockedReason:p?"react-card-shell":"unknown",captureStatus:"idle",captureProvider:p?"":"cloudflare-browser-run"}:{}}}}function $d(e,t,n="clipboard-url"){const r=Ai(e);return!r||/^https?:\/\//i.test(r)&&!Rn(r)?null:Xb(r,t,n)}function zd(e,t,n){const r=e.split(/\r?\n/).map(d=>d.trim()).find(Boolean)??"Pasted text";return{id:X("node"),kind:"note",title:r.slice(0,90),body:e.slice(0,4e4),x:t.x,y:t.y,width:340,height:ue(156+Math.ceil(Math.min(e.length,2200)/72)*20,176,540),tags:[n.startsWith("global-input")?"Input":"Pasted"],metadata:{Source:n,TextTruncated:String(e.length>4e4)}}}function qb(e,t,n){const r=e.split(/\r?\n/).map(b=>b.trim()).find(Boolean)??"AI question",d=Zt(n.model),c=cc(d),p=c?Pp(c.provider):n.aiProvider||"OpenAI Codex";return{id:X("node"),kind:"ai-task",title:r.slice(0,90),body:e.slice(0,4e4),x:t.x,y:t.y,width:360,height:ue(176+Math.ceil(Math.min(e.length,2200)/84)*18,196,520),status:"idle",tags:["AI Task","Input",p],metadata:{Source:"global-input-ai",AdapterState:"localbridge-codex",AiProvider:n.aiProvider||"OpenAI Codex",TextModel:d,TextModelProvider:p,Effort:n.effort,TextTruncated:String(e.length>4e4)}}}function Jb(e,t,n,r,d="global-input-media",c){const p=r==="Image"?"image":"video",b=e.split(/\r?\n/).map(y=>y.trim()).find(Boolean)??`${r} prompt`,m={...Ri(n,r,c)??{},Source:d,PromptOnly:"true"};return{id:X("node"),kind:p,title:`${r}: ${b.slice(0,72)}`,body:e.slice(0,4e4),x:t.x,y:t.y,width:p==="image"?360:420,height:p==="image"?240:236,tags:[r,m.MediaProvider||"Adapter gated"],metadata:m}}function Ud(e){if(!e.trim())return"";if(typeof DOMParser>"u")return e.replace(/<br\s*\/?>/gi,`
21
- `).replace(/<[^>]+>/g," ").replace(/\s+\n/g,`
22
- `).trim();const t=new DOMParser().parseFromString(e,"text/html");return(t.body.innerText||t.body.textContent||"").replace(/\n{3,}/g,`
23
-
24
- `).trim()}function Zb(e){const t=ii(e.name);return e.type.startsWith("image/")?"image":e.type.startsWith("video/")?"video":e.type==="application/pdf"||t==="pdf"?"pdf":t==="csv"||e.type==="text/csv"?"csv-table":t==="md"||t==="markdown"?"markdown":gb.has(t)?"code":e.type.startsWith("text/")||hb.has(t)?"text":"file"}function Qb(e){return typeof URL<"u"&&URL.createObjectURL?URL.createObjectURL(e):e.name}function Hd(e){return e?e.split(/\r?\n/).length:0}function Wd(e){return String(e||"").replace(/\r\n/g,`
25
- `).replace(/\r/g,`
26
- `).split(`
27
- `).slice(0,Es).join(`
28
- `).slice(0,ab)}function Vd(e){return{IsChunkedText:"true",TotalLineCount:String(e),TotalLineCountIsPreview:"true",ChunkedPreviewOnly:"true",ChunkedPreviewChars:"",ChunkedLineCount:String(Es),ChunkCacheEntryLimit:String(tb),LargeFileThresholdBytes:String(eu),OriginalIngestMode:"browser-preview",TextTruncated:"true"}}function ey(e){const t=String(e||"").replace(/\r\n/g,`
29
- `).replace(/\r/g,`
30
- `).split(`
31
- `).filter(r=>r.trim().length>0),n=t.slice(0,40).reduce((r,d)=>Math.max(r,ty(d)),0);return{rowCount:Math.max(0,t.length-1),columnCount:n}}function ty(e){let t=1,n=!1;for(let r=0;r<e.length;r+=1){const d=e[r],c=e[r+1];d==='"'?n&&c==='"'?r+=1:n=!n:d===","&&!n&&(t+=1)}return e.trim()?t:0}function Yd(e,t){const n=`
32
-
33
- ... (UI truncated; source file ${t.toLocaleString()} bytes) ...`;return e.endsWith(`
34
- `)?`${e}${n.trimStart()}`:`${e}${n}`}async function ay(e,t,n){const r=Zb(e),d=(r==="note"||r==="text"||r==="code"||r==="markdown")&&e.size<=Rr,c=r==="image"||r==="video"||r==="pdf"||r==="file"?Qb(e):void 0,p={Source:`browser-${n}`,FileName:e.name,FileType:e.type||"unknown",FileSize:String(e.size),Durable:"false"};if(r==="csv-table"){const m=e.size<=Rr,y=m?await e.text():await e.slice(0,Nd).text(),v=m?y.slice(0,Lr):Wd(y),P=ey(v),S=m?0:Hd(v);return m||f.emit("chunkedText.preview",{fileName:e.name,fileSize:e.size,kind:r,source:n,previewChars:v.length,previewLines:S,chunkLineCount:Es}),{id:X("node"),kind:"csv-table",title:e.name.slice(0,90)||"CSV table",body:m?v:Yd(v,e.size),x:t.x,y:t.y,width:720,height:420,sourceFilePath:e.name,isChunkedText:!m||void 0,totalLineCount:m?void 0:S,scrollOffset:m?void 0:0,maxScroll:m?void 0:0,tags:["CSV","Table",n],metadata:{...p,CsvRowCount:String(P.rowCount),CsvColumnCount:String(P.columnCount),IsChunkedText:String(!m),...m?{}:{...Vd(S),ChunkedPreviewChars:String(v.length)},ChunkedPreviewOnly:String(!m),OriginalIngestMode:m?"browser-inline":"browser-preview",TextTruncated:String(!m||y.length>v.length)},wordWrap:!1}}if(d){const m=(await e.text()).slice(0,Lr);return{id:X("node"),kind:r,title:e.name.slice(0,90)||(r==="code"?"Code file":r==="markdown"?"Markdown file":"Text file"),body:m,x:t.x,y:t.y,width:r==="code"?420:r==="markdown"?400:360,height:ue(168+Math.ceil(Math.min(m.length,2600)/72)*20,196,640),sourceFilePath:e.name,tags:[r==="code"?"Code":r==="markdown"?"Markdown":"Text",n],metadata:{...p,TextTruncated:String(e.size>Rr||m.length>=Lr)},wordWrap:r==="code"?!0:void 0}}if(r==="note"||r==="text"||r==="code"||r==="markdown"){const m=await e.slice(0,Nd).text(),y=Wd(m),v=Hd(y);return f.emit("chunkedText.preview",{fileName:e.name,fileSize:e.size,kind:r,source:n,previewChars:y.length,previewLines:v,chunkLineCount:Es}),{id:X("node"),kind:r,title:e.name.slice(0,90)||(r==="code"?"Code file":r==="markdown"?"Markdown file":"Text file"),body:Yd(y,e.size),x:t.x,y:t.y,width:r==="code"?480:r==="markdown"?430:390,height:540,sourceFilePath:e.name,isChunkedText:!0,totalLineCount:v,scrollOffset:0,maxScroll:0,isExpanded:!1,originalHeight:0,tags:[r==="code"?"Code":r==="markdown"?"Markdown":"Text","Chunked",n],metadata:{...p,...Vd(v),ChunkedPreviewChars:String(y.length)},wordWrap:r==="code"?!0:void 0}}const b=r;return{id:X("node"),kind:b,title:e.name.slice(0,90)||(b==="image"?"Image":b==="video"?"Video":b==="pdf"?"PDF Document":"File"),body:c||e.name,x:t.x,y:t.y,width:b==="video"?420:b==="image"?360:300,height:b==="video"?236:b==="image"?240:154,imageUrl:b==="image"?c:void 0,assetUrl:b==="image"?void 0:c,sourceFilePath:e.name,tags:[b==="file"?"File":b.toUpperCase(),n],metadata:{...p,EphemeralObjectUrl:String(!!c)}}}function Gd(e,t){const n=Array.from(e??[]),r=Array.from(t??[]).map(c=>c.kind==="file"?c.getAsFile():null).filter(c=>!!c),d=new Set;return[...n,...r].filter(c=>{const p=`${c.name}:${c.size}:${c.type}:${c.lastModified}`;return d.has(p)?!1:(d.add(p),!0)})}function Ns(e){const t=e instanceof HTMLElement?e:null;return t?!!t.closest('input,textarea,select,[contenteditable="true"],[contenteditable=""],.top-tabbar,.tab-shell,.floating-panel,.canvas-toolbar,.global-input-shell,.runtime-status-cluster'):!1}function Kd(e){const t=e instanceof HTMLElement?e:null;return t?!!(t.closest(".canvas-node,.edge-path")||Ns(e)):!1}function Fr(e){return ka(e)?typeof e.id=="string"&&Array.isArray(e.nodes)&&Array.isArray(e.edges)&&ka(e.settings):!1}function Bs(e){return e.replace(/\.layout\.json$/i,"").replace(/\.json$/i,"").trim()}function ny(e,t){var r,d;const n=new Date().toISOString();return{...e,id:X("imported-board"),name:tt(e.name||Bs(t)),updatedAt:n,source:{...e.source??{},kind:((r=e.source)==null?void 0:r.kind)??"localStorage",boardId:((d=e.source)==null?void 0:d.boardId)||e.id,loadedAt:n}}}function $r(e){return/\.layout\.json$/i.test(e.file.name)}function oy(e){return e.flatMap(t=>bi(t.payload).map(n=>({fileName:t.file.name,metadata:n})))}function sy(e,t){const n=Bs(e.file.name);return t.find(r=>r.metadata.Id===n)??bi(e.payload).map(r=>({fileName:e.file.name,metadata:r}))[0]??null}function As(e){return e.length===0?null:e.reduce((t,n)=>({minX:Math.min(t.minX,n.x),minY:Math.min(t.minY,n.y),maxX:Math.max(t.maxX,n.x+n.width),maxY:Math.max(t.maxY,n.y+n.height)}),{minX:Number.POSITIVE_INFINITY,minY:Number.POSITIVE_INFINITY,maxX:Number.NEGATIVE_INFINITY,maxY:Number.NEGATIVE_INFINITY})}function ry(e){const t=[...e].sort((m,y)=>m.y-y.y||m.x-y.x);if(t.length<=2)return t;const n=t.map(m=>m.height).sort((m,y)=>m-y),r=n[Math.floor(n.length/2)]??1,d=Math.max(16,r*.35),c=[];let p=[],b=Number.NaN;for(const m of t){if(p.length===0){p=[m],b=m.y;continue}Math.abs(m.y-b)<=d?(p.push(m),b=(b*(p.length-1)+m.y)/p.length):(c.push(p.sort((y,v)=>y.x-v.x)),p=[m],b=m.y)}return p.length>0&&c.push(p.sort((m,y)=>m.x-y.x)),c.flat()}function iy(e,t,n){const r=As(e);if(!r)return null;const d={minX:r.minX-220,minY:r.minY-180,maxX:r.maxX+220,maxY:r.maxY+180},c=Math.max(1,d.maxX-d.minX),p=Math.max(1,d.maxY-d.minY),b=Math.min((vs-wn*2)/c,(js-wn*2)/p),m=(S,D)=>({x:wn+(S-d.minX)*b,y:wn+(D-d.minY)*b}),y={left:(0-t.x)/t.scale,top:(0-t.y)/t.scale,right:(n.width-t.x)/t.scale,bottom:(n.height-t.y)/t.scale},v=m(y.left,y.top),P=m(y.right,y.bottom);return{bounds:d,scale:b,project:m,nodes:e.map(S=>{const D=m(S.x,S.y);return{id:S.id,kind:S.kind,x:D.x,y:D.y,width:Math.max(2,S.width*b),height:Math.max(2,S.height*b),selected:!1}}),viewport:{x:ue(v.x,0,vs),y:ue(v.y,0,js),width:ue(P.x-v.x,4,vs),height:ue(P.y-v.y,4,js)}}}function ly(e,t){const n=Math.max(.01,e.scale),r=t.width/n,d=t.height/n,c=Math.max(Jf,Math.max(r,d)*Zf);return{left:(0-e.x)/n-c,top:(0-e.y)/n-c,right:(t.width-e.x)/n+c,bottom:(t.height-e.y)/n+c}}function Xd(e,t){return e.x+e.width>=t.left&&e.x<=t.right&&e.y+e.height>=t.top&&e.y<=t.bottom}function qd(e){const t=Math.min(e.startX,e.currentX),n=Math.min(e.startY,e.currentY),r=Math.max(e.startX,e.currentX),d=Math.max(e.startY,e.currentY);return{left:t,top:n,right:r,bottom:d,width:r-t,height:d-n}}function dy(e,t){const n=Math.max(.01,t.scale);return{left:(e.left-t.x)/n,top:(e.top-t.y)/n,right:(e.right-t.x)/n,bottom:(e.bottom-t.y)/n}}function Jd(e){const t=new Date().toISOString(),n=X("board"),r=X("node");return{id:n,name:"Untitled Workspace",updatedAt:t,settings:e,source:{kind:"localStorage",loadedAt:t},nodes:[{id:r,kind:"note",title:"New note",body:"Start here.",x:0,y:0,width:320,height:168,tags:["Local"]}],edges:[]}}function cy(e){const t=new Date().toISOString();return{id:X("board"),name:`Template Studio ${uy(new Date)}`,updatedAt:t,settings:e,source:{kind:"localStorage",loadedAt:t},nodes:[],edges:[]}}function uy(e){const t=`${e.getMonth()+1}`.padStart(2,"0"),n=`${e.getDate()}`.padStart(2,"0"),r=`${e.getHours()}`.padStart(2,"0"),d=`${e.getMinutes()}`.padStart(2,"0");return`${t}.${n} ${r}:${d}`}function my(e){return`${e.sourceKind==="localBridge"?"LocalBridge copy":"React board"} / ${e.nodeCount} nodes / ${ri(e.updatedAt)}`}function Io(e,t){const n=e.trim();return n.length<=t?n:`${n.slice(0,t)}...`}function Zd(e){return e==="Fast"?"low":e==="Deep"?"high":"medium"}function su(e){return(e.body||e.result||e.title||"").trim()||"Selected MindCanvas node"}function Qd(e,t,n,r){const d=su(e),c=yi(n.appLanguage,d),p=e.x+e.width+80,b=e.y,m=3,y=390,v=250,P=Xg(c),S=t.nodes.map((_,$)=>{const O=$%m,U=Math.floor($/m);return{id:X("node"),kind:"ai-task",title:_.title,body:_.instruction,x:p+O*y,y:b+U*v,width:n.aiNodeDefaultWidth??340,height:Math.max(n.aiNodeDefaultHeight??196,206),tags:[P,qg(_.kind,c)],metadata:{Source:"generate-flow",SemanticType:Ii,AutomationNodeKind:_.kind,AutomationNodeLabel:_.title,AutomationPlannerSourceMode:r,AutomationPlannerLanguage:c,AutomationPlannerObjective:d.slice(0,2e3),AdapterState:r==="ai-generated"?"localbridge-ai-planned":"language-aware-fallback"}}}),D=[{id:X("edge"),from:e.id,to:S[0].id,kind:"context"},...t.edges.filter(_=>S[_.from]&&S[_.to]).map(_=>({id:X("edge"),from:S[_.from].id,to:S[_.to].id,kind:"result"}))];return{nodes:S,edges:D,language:c}}function Mi(e){var t,n,r;return String(((t=e.metadata)==null?void 0:t.AutomationNodeKind)||((n=e.metadata)==null?void 0:n.AutomationTemplateKey)||((r=e.metadata)==null?void 0:r.AutomationInferredKind)||"").trim().toLowerCase()}function Ti(e){return e==="image-generate"||e==="video-generate"?Ni[e]:null}function kn(e){var t;return String(((t=e.metadata)==null?void 0:t.SemanticType)||"").trim()===Ii}function py(e,t){const n=Ni[t],r=No(e,n.mode);return{...Ri(e,n.mode)??{},Source:"toolbar-business-automation",SemanticType:Ii,AutomationNodeKind:n.kind,AutomationNodeLabel:n.title,AutomationNodeDescription:`${n.tag} prepared as a spec-only, review-gated media automation node.`,AutomationGraphSchemaVersion:"react-media-spec@1",AutomationTemplateKey:n.kind,AutomationInferredKind:n.kind,AutomationInferredRole:"Media Spec",AutomationToolPolicy:"spec-only",AutomationToolHints:`AI.LLM, ${n.toolHint}, HumanReview.Gate`,AutomationOutputType:n.outputType,AutomationApprovalPolicy:"review-before-generate",AutomationRequiredEvidence:"false",AutomationExternalActionPolicy:"spec-only-until-review",AutomationResultPolicy:"snapshot-per-run",AutomationRunState:"idle",AutomationRunCount:"0",AutomationInstruction:n.body,AutomationLastOutput:"",AutomationLastRunError:"",AutomationLastRunStatus:"not-run",AutomationLastRunStatusLabel:"Not run",AutomationLastRunSourceMode:"",AutomationLastRunEvidenceCount:"0",AutomationLastRunIsFallback:"false",AutomationLastRunIsPartial:"false",AutomationLastRunToolsUsed:"",AutomationLastRunToolWarnings:"",MediaGenerationContract:"spec-only-until-review",MediaGenerationMedium:n.mode.toLowerCase(),MediaModel:r.model.id,MediaProvider:r.model.provider,AspectPresetId:r.aspect.id,AspectLabel:r.aspect.label,RequestedSize:r.requestedSize,AdapterState:"adapter-gated"}}function xo(e,t){var r,d,c,p,b;if(!kn(e))return;const n=t.runState==="completed"?String((Number((r=e.metadata)==null?void 0:r.AutomationRunCount)||0)+1):((d=e.metadata)==null?void 0:d.AutomationRunCount)||"0";return{...e.metadata??{},AutomationRunState:t.runState,AutomationInstruction:t.instruction,AutomationLastOutput:t.output??((c=e.metadata)==null?void 0:c.AutomationLastOutput)??"",AutomationLastRunError:t.error??"",AutomationLastRunStatus:t.status,AutomationLastRunStatusLabel:t.statusLabel,AutomationLastRunSourceMode:t.sourceMode??"",AutomationLastRunEvidenceCount:((p=e.metadata)==null?void 0:p.AutomationLastRunEvidenceCount)??"0",AutomationLastRunIsFallback:String(!!t.fallback),AutomationLastRunIsPartial:String(!!t.partial),AutomationLastRunToolsUsed:t.toolsUsed??((b=e.metadata)==null?void 0:b.AutomationToolHints)??"",AutomationLastRunToolWarnings:t.toolWarnings??"",AutomationRunCount:n,...t.runState==="completed"?{AutomationLastRunAtUtc:new Date().toISOString()}:{}}}function gy(){return{Source:"toolbar-agent-command",SemanticType:nb,AgentCommandId:X("agent-command"),AgentCommandStatus:"Draft",AgentCommandMode:"Task",AgentCommandRequestedRole:"Researcher",AgentCommandConstraints:"",AgentCommandPlannerSummary:"",AgentCommandPlanSteps:"[]",AgentCommandPlannedSkills:"[]",AgentCommandPlannedTools:"[]",AgentCommandPlannedConcepts:"[]",AgentCommandLinkedCodeNotes:"[]",AgentCommandWorkItems:"[]",AgentCommandConsoleLogs:"[]",AgentCommandResultLinks:"[]",AgentCommandContinuationPending:"false",AgentCommandTrancheIndex:"0",memoColor:"gray",memoIcon:"robot",AdapterState:"adapter-gated"}}function hy(){return{Source:"toolbar-code-note",SemanticType:ob,CodeNoteId:X("code-note"),CodeNoteKind:"Feature",CodeNoteStatus:"Draft",CodeNoteSyncState:"Unlinked",CodeNoteWhy:"Keep the reason and implementation boundary visible before code changes.",CodeNoteRelatedFiles:JSON.stringify(["src/features/canvas/MindCanvas.tsx"]),CodeNoteRelatedNamespaces:"[]",CodeNoteRelatedSymbols:"[]",CodeNoteAcceptanceCriteria:JSON.stringify(["The intended change is represented as a canvas note.","Local status actions update CodeNote metadata without external adapters."]),CodeNoteOutputArtifacts:"[]",memoColor:"sky",memoIcon:"code",AdapterState:"local-canvas-only"}}function fy(e,t){var r,d,c,p;const n=t?Ti(Mi(t)):null;if(n){const b=n.mode.toLowerCase();return[`Task: ${e}`,"",`Run Result: ${n.title}`,`Node: ${n.kind}`,"Status: Spec only","Source mode: media-prompt-only","","Generation is not executed here. External media generation stays adapter-gated until human review.","","Spec:",`- Medium: ${b}`,`- Model: ${((r=t==null?void 0:t.metadata)==null?void 0:r.MediaModel)||"adapter-gated"}`,`- Aspect: ${((d=t==null?void 0:t.metadata)==null?void 0:d.AspectLabel)||((c=t==null?void 0:t.metadata)==null?void 0:c.AspectPresetId)||"auto"}`,`- Requested size: ${((p=t==null?void 0:t.metadata)==null?void 0:p.RequestedSize)||"auto"}`,"","Prompt draft:",e].join(`
35
- `)}return[`Task: ${e}`,"","Local draft:","1. Clarify the paid offer in one sentence.","2. Pick one English-first channel and publish proof there.","3. Create a MindCanvas board that keeps source context, AI output, and next actions together.","4. Reuse the result as context for the next task."].join(`
36
- `)}function by(e,t){const n=e.result||"",r=n.slice(0,ni),d=`${e.title||"AI Task"} result`;return{id:X("node"),kind:"markdown",title:d.slice(0,90),body:r,x:t.x,y:t.y,width:440,height:ue(220+Math.ceil(Math.min(r.length,3600)/88)*20,260,680),tags:["AI Result","Markdown"],metadata:{Source:"ai-result-popover",AiResultSourceNodeId:e.id,AiResultSourceTitle:e.title,AiResultArchivedAtUtc:new Date().toISOString(),TextTruncated:String(n.length>ni),AdapterState:"local-reference"}}}function yy(e,t){const n=Io(e.result||"",900);return{id:X("node"),kind:"ai-task",title:`Follow up: ${e.title||"AI result"}`.slice(0,90),body:["Continue from the linked AI result.","","Use the result as context and propose the next concrete action.","","Result preview:",n||"(No result preview available.)"].join(`
37
- `),x:t.x,y:t.y,width:360,height:220,status:"idle",tags:["AI Task","Follow-up"],metadata:{Source:"ai-result-popover",FollowUpSourceNodeId:e.id,FollowUpSourceTitle:e.title,AdapterState:"local-draft"}}}function ec(e,t,n){var b,m,y,v,P;const r=Ti(Mi(t)),d=new Set(e.edges.filter(S=>S.to===t.id||S.from===t.id).flatMap(S=>[S.from,S.to]).filter(S=>S!==t.id)),c=e.nodes.filter(S=>d.has(S.id)).slice(0,8),p=c.length>0?c.map(S=>[`### ${S.title||S.kind}`,`Type: ${S.kind}`,Io(S.result||S.body||"",1200)].join(`
38
- `)).join(`
39
-
40
- `):"No linked context nodes.";return r?["You are running inside MindExec React MindCanvas.",`Return a concise, practical Markdown media generation spec for the selected ${r.mode.toLowerCase()} automation node.`,"Do not claim the asset was generated. This node prepares the prompt/spec only.","External media generation must remain gated until human review.",Ur(e.settings.appLanguage),"",`Board: ${e.name}`,`Task node: ${t.title}`,`Automation kind: ${r.kind}`,`External action policy: ${((b=t.metadata)==null?void 0:b.AutomationExternalActionPolicy)||"spec-only-until-review"}`,`Media model: ${((m=t.metadata)==null?void 0:m.MediaModel)||"adapter-gated"}`,`Aspect: ${((y=t.metadata)==null?void 0:y.AspectLabel)||((v=t.metadata)==null?void 0:v.AspectPresetId)||"auto"}`,`Requested size: ${((P=t.metadata)==null?void 0:P.RequestedSize)||"auto"}`,"","Instruction:",Io(n,4e3),"","Linked context:",p,"","Required sections:","- Subject","- Visual style","- Composition or scene","- Constraints","- Business use case","- Final generation prompt"].join(`
41
- `):["You are running inside MindExec React MindCanvas.","Return a concise, practical Markdown result for the selected AI Task.","Do not modify files. Do not ask follow-up questions unless the task is impossible.",Ur(e.settings.appLanguage),"",`Board: ${e.name}`,`Task node: ${t.title}`,"","Instruction:",Io(n,4e3),"","Linked context:",p].join(`
42
- `)}function ru(e,t){const n=e.x-t.x;if(Math.abs(n)>1)return n;const r=e.y-t.y;return Math.abs(r)>1?r:String(e.title||e.id).localeCompare(String(t.title||t.id))}function di(e){return[...e].sort(ru)}function xy(e,t){const n=new Map(e.nodes.filter(v=>v.kind==="ai-task").map(v=>[v.id,v])),r=new Set([...t].filter(v=>n.has(v))),d=new Map,c=new Map;for(const v of r)d.set(v,new Set),c.set(v,0);for(const v of e.edges){if(!r.has(v.from)||!r.has(v.to)||v.from===v.to)continue;const P=d.get(v.from);!P||P.has(v.to)||(P.add(v.to),c.set(v.to,(c.get(v.to)??0)+1))}const p=[],b=new Set,m=di([...r].filter(v=>(c.get(v)??0)===0).map(v=>n.get(v)));for(;m.length>0;){const v=m.shift();if(b.has(v.id))continue;b.add(v.id),p.push(v);const P=[...d.get(v.id)??[]].map(S=>n.get(S)).filter(S=>!!S);for(const S of P)c.set(S.id,Math.max(0,(c.get(S.id)??0)-1)),(c.get(S.id)??0)===0&&m.push(S);m.sort(ru)}const y=di([...r].filter(v=>!b.has(v)).map(v=>n.get(v)).filter(Boolean));return[...p,...y]}function ci(e,t){var p,b;const n=new Set(e.nodes.filter(m=>m.kind==="ai-task").map(m=>m.id));if(!n.has(t))return[];const r=new Map;for(const m of n)r.set(m,new Set);for(const m of e.edges)!n.has(m.from)||!n.has(m.to)||((p=r.get(m.from))==null||p.add(m.to),(b=r.get(m.to))==null||b.add(m.from));const d=new Set,c=[t];for(;c.length>0;){const m=c.pop();if(!d.has(m)){d.add(m);for(const y of r.get(m)??[])d.has(y)||c.push(y)}}return xy(e,d)}function Cy(e){const t=new Set(e.nodes.filter(d=>d.kind==="ai-task").map(d=>d.id)),n=new Set(t),r=[];for(const d of di(e.nodes.filter(c=>c.kind==="ai-task"))){if(!n.has(d.id))continue;const c=ci(e,d.id);for(const p of c)n.delete(p.id);r.push(c)}return r}function No(e,t,n){const r=mc(t,e,n),d=t==="Image"?e.imageRouterImageAspectPresetId:e.imageRouterVideoAspectPresetId,c=Hr(t,r,d);return{mode:t,model:r,aspect:c,aspectOptions:Tp(r,t),requestedSize:Wr(c)}}function Ri(e,t,n){const r=No(e,t,n);return{InputMode:t,AppLanguage:gi(e.appLanguage),MediaPromptLanguageInstruction:Rp(e.appLanguage),AdapterState:"adapter-gated",MediaModel:r.model.id,MediaProvider:r.model.provider,AspectPresetId:r.aspect.id,AspectLabel:r.aspect.label,RequestedSize:r.requestedSize}}function ky(e){const t=Zt(e.id);if(!t)return null;const n=wy(e.provider,t);return{id:t,label:e.displayName||e.label||t,displayName:e.displayName||e.label||t,description:e.description,provider:n,supportsReasoning:e.supportsReasoning,isFallback:e.isFallback,vendorPricing:iu(e.vendorPricing),source:e.source}}function tc(e,t){const n=uc(t,e.id);if(!n)return null;const r=Array.isArray(e.supportedSizes)&&e.supportedSizes.length>0?e.supportedSizes:t==="Image"?["custom"]:[];return{id:n,label:e.displayName||e.label||n,displayName:e.displayName||e.label||n,description:e.description,provider:Sy(e.provider,n),mode:t,supportedSizes:r,supportedSeconds:e.supportedSeconds??[],supportsReasoning:e.supportsReasoning,isFallback:e.isFallback,vendorPricing:iu(e.vendorPricing),source:e.source}}function iu(e){if(!e)return null;const t=String(e.source||"").trim()||"catalog";return{promptUsdPerToken:xn(e.promptUsdPerToken),completionUsdPerToken:xn(e.completionUsdPerToken),requestUsd:xn(e.requestUsd),minUsd:xn(e.minUsd),averageUsd:xn(e.averageUsd),maxUsd:xn(e.maxUsd),source:t}}function xn(e){const t=Number(e);return Number.isFinite(t)?t:void 0}function wy(e,t){const n=String(e||"").trim().toLowerCase();return n==="codex"?"codex":n==="ollama"?"ollama":n==="gemini-cli"||t.startsWith("gemini-")?"gemini-cli":t.startsWith("llama")?"ollama":"openrouter"}function Sy(e,t){const n=String(e||"").trim().toLowerCase();return n==="codex"||t.startsWith("codex-image:")?"OpenAI Codex":n==="openai"?"OpenAI":n==="imagerouter"?"ImageRouter":e||ui(t,"Saved")}function vy(e){return e.filter(n=>n.provider==="codex"&&!n.id.includes("/")&&!n.id.includes(":")).filter((n,r,d)=>d.findIndex(c=>c.id.toLowerCase()===n.id.toLowerCase())===r).slice(0,8).flatMap(n=>[{quality:"low",label:"Low"},{quality:"medium",label:"Mid"},{quality:"high",label:"High"}].map(({quality:r,label:d})=>({id:`codex-image:${n.id}:${r}`,label:`${n.displayName||n.label} Image - ${d}`,displayName:`${n.displayName||n.label} Image - ${d}`,provider:"OpenAI Codex",mode:"Image",supportedSizes:["1024x1024","1536x1024","1024x1536"],source:n.source||"codex"})))}function zr(e,t,n){return e.map(r=>{const d=Ay(r),c=Iy(r,t,n),p=Ty(r,d);return{value:r.id,label:p,title:r.label||r.displayName||r.id,trailingLabel:c.displayLabel}})}function ac(e){return e.map(t=>({value:t.id,label:t.label,title:t.note,detail:t.resolvedSize?`Size hint: ${t.resolvedSize}`:t.note,showAspectIcon:!!(t.width&&t.height),aspectIconWidth:t.width,aspectIconHeight:t.height}))}function jy(){return[{value:"Fast",label:"Fast",detail:"Lower reasoning effort"},{value:"Normal",label:"Normal",detail:"Balanced reasoning effort"},{value:"Deep",label:"Deep",detail:"Higher reasoning effort"}]}function Iy(e,t,n){const r=Ny(e,t,n),d=e.vendorPricing??Ep(e.id);return _p({mode:t,provider:r,modelId:e.id,reasoningEffort:n.effort,vendorPricing:d})}function Ny(e,t,n){const r=String(e.provider||"").trim().toLowerCase();return t==="Text"?r==="codex"?"openai-codex":r==="ollama"?"local-ollama":r==="gemini-cli"?"google-gemini-cli":n.aiProvider==="BYOK"?"byok":"managed-cloud":t==="Image"&&(r==="openai codex"||e.id.startsWith("codex-image:"))?"openai-codex":Bp(n)}function Ay(e){const t=String(e.provider||"").trim().toLowerCase();return t==="codex"||t==="openai codex"?"openai-codex-exec":t==="gemini-cli"?"google":t==="ollama"?"ollama":t==="openrouter"||t==="imagerouter"||t==="imagerouter"?ui(e.id,t):ui(e.id,t||"other")}function ui(e,t){const n=String(e||"").trim();if(!n)return t;if(n.startsWith("codex-image:"))return"openai";const r=n.indexOf("/");if(r>0)return n.slice(0,r).toLowerCase();const d=n.indexOf(":");return d>0?n.slice(0,d).toLowerCase():t||n.toLowerCase()}function My(e){switch(e){case"openai-codex-exec":return"OpenAI Codex";case"openai":return"OpenAI";case"google":return"Google";case"ollama":return"Ollama";case"imagerouter":return"ImageRouter";default:return e.replace(/[-_]+/g," ").replace(/\b\w/g,t=>t.toUpperCase())}}function Ty(e,t){const n=String(e.displayName||e.label||e.id||"").trim(),r=n.toLowerCase()===e.id.toLowerCase()?nc(e.id):n;return Ry(r,t)||nc(e.id)}function nc(e){const t=String(e||"").trim();if(t.startsWith("codex-image:"))return t.slice(12);const n=t.indexOf("/");return n>0&&n<t.length-1?t.slice(n+1):t}function Ry(e,t){const n=Ly(t);for(const r of n)for(const d of[" · ",": "," - "," - "," | "," / "," "]){const c=`${r}${d}`;if(e.toLowerCase().startsWith(c.toLowerCase()))return e.slice(c.length).trim()}return e}function Ly(e){switch(e){case"openai-codex-exec":return["OpenAI Codex","OpenAI"];case"openai":return["OpenAI"];case"google":return["Google"];case"anthropic":return["Anthropic"];case"runway":return["Runway"];default:return[My(e)]}}function Py(e){return{textModels:((e==null?void 0:e.textModels)??[]).map(ky).filter(t=>!!t),imageModels:((e==null?void 0:e.imageModels)??[]).map(t=>tc(t,"Image")).filter(t=>!!t),videoModels:((e==null?void 0:e.videoModels)??[]).map(t=>tc(t,"Video")).filter(t=>!!t)}}function Ey(e){var r;const t=((r=e==null?void 0:e.exec)==null?void 0:r.availableModels)??[],n=[];return t.forEach((d,c)=>{var m,y;if(typeof d=="string"){const v=Zt(d);if(!v)return;const P=oc(v);n.push({id:v,label:P,displayName:P,provider:"codex",supportsReasoning:!0,source:((m=e==null?void 0:e.exec)==null?void 0:m.modelCatalogSource)||"localbridge-status",priority:c});return}const p=Zt(d.id);if(!p)return;const b=String(d.displayName||"").trim()||oc(p);n.push({id:p,label:b,displayName:b,description:d.description,provider:"codex",supportsReasoning:!0,isFallback:!1,source:((y=e==null?void 0:e.exec)==null?void 0:y.modelCatalogSource)||"localbridge-status",priority:Number.isFinite(Number(d.priority))?Number(d.priority):c})}),n.sort((d,c)=>d.priority-c.priority||d.id.localeCompare(c.id)).map(({priority:d,...c})=>c)}function oc(e){return e.startsWith("gpt-")?`GPT-${e.slice(4).toUpperCase()}`:e}function lu(e){return e.map(t=>({id:t.id,kind:t.kind,title:t.title,body:t.body,response:t.result||t.body,tags:t.tags??[],metadata:t.metadata??{},sourceFilePath:t.sourceFilePath,assetUrl:t.assetUrl,x:t.x,y:t.y,width:t.width,height:t.height}))}function _y(e,t){const n=Math.max(.01,e.scale),r=Math.max(1,t.width/n/2),d=Math.max(1,t.height/n/2);return{centerX:(t.width/2-e.x)/n,centerY:(t.height/2-e.y)/n,halfWidth:r,halfHeight:d}}function By(e,t,n,r=8){if(!t.trim())return[];const d=Vh(lu(e)),c=new Map(e.map(p=>[p.id,p]));return Yh(d,t,{limit:r,viewport:n}).hits.map(p=>c.get(p.nodeId)).filter(p=>!!p)}function sc(e,t,n="none"){const r=new Set(t.nodes.map(c=>c.id)),d=e.filter((c,p)=>r.has(c)&&e.indexOf(c)===p);return d.length>0||n==="none"?d:t.nodes[0]?[t.nodes[0].id]:[]}function rc(e){const t=e instanceof HTMLElement?e:null;return t?!!t.closest('input,textarea,select,[contenteditable="true"],[contenteditable=""]'):!1}function Dy(e){const t=e instanceof HTMLElement?e:null;return t?!!t.closest('button,a,[role="button"],[role="tab"],summary'):!1}function bs(e){const t=e;if(!t)return null;const n=Number(t.x),r=Number(t.y),d=Number(t.scale);return!Number.isFinite(n)||!Number.isFinite(r)||!Number.isFinite(d)?null:{x:n,y:r,scale:ue(d,ws,Ss)}}function Ka(e){return typeof e=="string"?e.trim():""}function ys(e,t=34){const n=Ka(e);if(!n)return"workspace";const c=n.replace(/\\/g,"/").split("/").filter(Boolean).slice(-2).join("/")||n;return c.length<=t?c:`...${c.slice(-(t-3))}`}function Oy(){try{const e=window.localStorage.getItem(Zc),t=e?JSON.parse(e):[];return Array.isArray(t)?t.map(Ka).filter(Boolean).filter((n,r,d)=>d.findIndex(c=>c.toLowerCase()===n.toLowerCase())===r).slice(0,Qc):[]}catch{return[]}}function Fy(e){const t=e.map(Ka).filter(Boolean).filter((n,r,d)=>d.findIndex(c=>c.toLowerCase()===n.toLowerCase())===r).slice(0,Qc);try{window.localStorage.setItem(Zc,JSON.stringify(t))}catch{}return t}function $y(){try{return window.localStorage.getItem(Jc)==="full"?"full":"curated"}catch{return"curated"}}function zy(e){try{window.localStorage.setItem(Jc,e)}catch{}}function ic(e,t){return Fy([e,...t.filter(n=>n.toLowerCase()!==e.toLowerCase())])}function tx({navigate:e,onSidebarActionsChange:t}){var gl,hl,fl,bl,yl,xl,Cl,kl,wl,Sl,vl,jl,Il,Nl,Al;const[n,r]=g.useState(()=>Vl(Bl(Yl(ep(El))))),[d,c]=g.useState([]),[p,b]=g.useState([]),[m,y]=g.useState(["node-agent-command"]),[v,P]=g.useState(""),[S,D]=g.useState(""),[_,$]=g.useState(0),[O,U]=g.useState([]),[W,re]=g.useState(0),[se,Ne]=g.useState("idle"),[ge,ze]=g.useState("booting"),[St,Ue]=g.useState(null),[G,V]=g.useState(null),[de,te]=g.useState(null),[vt,H]=g.useState(null),[He,jt]=g.useState(null),[he,We]=g.useState({...Wa}),[at,nt]=g.useState({...Wa}),[z,mt]=g.useState(()=>({width:window.innerWidth,height:window.innerHeight})),[wa,qa]=g.useState(()=>Pr(n)??{x:0,y:0}),[Sa,Ln]=g.useState(!1),[va,Ja]=g.useState(()=>localStorage.getItem(jd)==="true"),[Me,Za]=g.useState("local"),[Ve,ja]=g.useState([]),[Ae,be]=g.useState(et()?"idle":"blocked"),[Li,ve]=g.useState(null),[_e,Te]=g.useState({status:"idle",textModels:[],imageModels:[],videoModels:[]}),[_t,ye]=g.useState(et()?null:"Hosted LocalBridge access is off."),[ot,st]=g.useState(null),[Be,me]=g.useState(null),[Pn,qe]=g.useState(()=>Oy()),[De,It]=g.useState(!1),[To,Pe]=g.useState(null),[Re,pt]=g.useState(null),[Bt,Ia]=g.useState(!1),[En,Ro]=g.useState("ready"),[Na,_n]=g.useState("Saved in this browser."),[gt,Bn]=g.useState(!1),[Dt,Oe]=g.useState(()=>Ct()),Je=g.useMemo(()=>sb(),[]),[Dn,Qa]=g.useState(()=>yr()),fe=Je.cloudBoards.canAttempt&&(Dn==null?void 0:Dn.source)==="supabase-provider-session",[ea,en]=g.useState([]),[On,Fe]=g.useState(null),[Nt,ta]=g.useState(!1),[Lo,Po]=g.useState(null),Ye=g.useMemo(()=>mf({storedMode:Me,cloudConfigured:!0,cloudSessionAvailable:fe,cloudAccess:fe?{planKey:"provider",entitlementStatus:"active",currentBoardCount:ea.length,cloudBoardLimit:Number.MAX_SAFE_INTEGER,lockedBoardCount:0,canCreateBoard:!0}:null,bridgeProviderConfigured:!0,bridgeReachable:Ae==="connected",hostedWebApp:!et()&&!lo(),hostedLocalBridgeAccessEnabled:lo(),browserProviderConfigured:!0,browserLocalAvailable:!0,browserLocalAvailableWhenEmpty:!0,embeddedProviderConfigured:!1,supportsEmbeddedLocal:!1}),[fe,ea.length,Ae,Me]),[Fn,$n]=g.useState(null),[tn,aa]=g.useState(""),[Ze,zn]=g.useState(null),[Eo,ie]=g.useState(null),[ht,na]=g.useState(!1),[oa,an]=g.useState(!1),[Ot,sa]=g.useState(null),[At,ra]=g.useState(null),[Ft,Us]=g.useState(!1),[Hs,_o]=g.useState(!1),[Aa,Ws]=g.useState($y),Ma=g.useRef(new Map),Ta=g.useMemo(()=>hr(n.settings.appLanguage),[n.settings.appLanguage]),[Un,$t]=g.useState(!1),[Bo,ia]=g.useState(!1),[la,Do]=g.useState("business"),[rt,Ra]=g.useState(()=>{var s;const a=co("business",n.settings.appLanguage)??hr(n.settings.appLanguage)[0];return((s=ss(a))==null?void 0:s.id)??null}),[zt,nn]=g.useState(()=>{const a=co("business",n.settings.appLanguage)??hr(n.settings.appLanguage)[0],s=ss(a);return uo(mo(a,s==null?void 0:s.id,n.settings.appLanguage))}),[Hn,ft]=g.useState(null),[Wn,on]=g.useState(!1),[je,Vn]=g.useState(()=>Ad(n.id,n.name)),[pe,Qe]=g.useState(null),[Yn,Gn]=g.useState(null),[Oo,it]=g.useState(!1),[Ut,La]=g.useState({}),[sn,da]=g.useState(null),rn=g.useMemo(()=>{var l,u;const a=Dt.find(h=>h.id===n.id),s={id:n.id,name:n.name,updatedAt:n.updatedAt,nodeCount:n.nodes.length,edgeCount:n.edges.length,sourceKind:(l=n.source)==null?void 0:l.kind,sourceBoardId:(u=n.source)==null?void 0:u.boardId,order:(a==null?void 0:a.order)??-1},i=new Map(Dt.map(h=>[h.id,h]));return i.set(n.id,{...a,...s}),Array.from(i.values()).sort((h,C)=>{const k=typeof h.order=="number"?h.order:Number.MAX_SAFE_INTEGER,I=typeof C.order=="number"?C.order:Number.MAX_SAFE_INTEGER;return k!==I?k-I:String(C.updatedAt||"").localeCompare(String(h.updatedAt||""))}).slice(0,7)},[n,Dt]),ne=g.useMemo(()=>co(la,n.settings.appLanguage)??Ta[0],[la,n.settings.appLanguage,Ta]),Ge=g.useMemo(()=>ne?mo(ne,rt,n.settings.appLanguage):null,[ne,n.settings.appLanguage,rt]),ln=!!(ne&&(ne.options.length>0||!ne.quickCreateTemplateId)),Kn=g.useMemo(()=>rs(Ge,zt),[Ge,zt]),j=g.useRef(n),K=g.useRef(m),oe=g.useRef({...Wa}),Fo=g.useRef(z),$e=g.useRef(wa),Ht=g.useRef(null),Wt=g.useRef(null),dn=g.useRef(null),cn=g.useRef(null),Xn=g.useRef(null),qn=g.useRef(null),un=g.useRef(new Map),Jn=g.useRef(new gf),Pa=g.useRef(0),Zn=g.useRef(null),mn=g.useRef(0),Ea=g.useRef(null),ca=g.useRef(!1),Ee=g.useRef(0),Le=g.useRef(0),_a=g.useRef(0),Ba=g.useRef(0),pn=g.useRef(!1),x=g.useRef(0),B=g.useRef({}),le=g.useRef(),bt=g.useRef(),ua=g.useRef(null),lt=g.useRef(null),Vt=g.useRef(0),Yt=g.useRef(null),ma=g.useRef(0),Vs=g.useRef(!1),Mt=g.useCallback(()=>{var s;const a=(s=Ht.current)==null?void 0:s.getBoundingClientRect();return{width:Math.max(1,(a==null?void 0:a.width)??window.innerWidth),height:Math.max(1,(a==null?void 0:a.height)??window.innerHeight)}},[]),pa=g.useCallback((a,s)=>{var l;const i=(l=Ht.current)==null?void 0:l.getBoundingClientRect();return i?{x:a-i.left,y:s-i.top}:{x:a,y:s}},[]),ga=g.useCallback(a=>{Vs.current=a,Us(a)},[]),Pi=g.useCallback((a="keyboard")=>{Ws(s=>{const i=s==="curated"?"full":"curated";return zy(i),f.emit("canvas.functionToolbar.toggle",{mode:i,source:a}),i})},[]);g.useEffect(()=>(f.transitionTo("board-file-loading","mindcanvas-mount"),f.transitionTo("interactive-fullres","react-board-ready"),()=>f.transitionTo("disposed","mindcanvas-unmount")),[]),g.useEffect(()=>{const a=()=>Qa(yr());return window.addEventListener(Hl,a),window.addEventListener("storage",a),window.addEventListener("focus",a),()=>{window.removeEventListener(Hl,a),window.removeEventListener("storage",a),window.removeEventListener("focus",a)}},[]),g.useEffect(()=>{const a=()=>{const s=!!document.fullscreenElement;ga(s),f.emit("canvas.fullscreen.changed",{active:s})};return document.addEventListener("fullscreenchange",a),()=>document.removeEventListener("fullscreenchange",a)},[ga]),g.useEffect(()=>{const a=new Worker(new URL("/assets/mindCanvasSearchWorker-BzPMsHOB.js",import.meta.url),{type:"module"});return Ea.current=a,a.onmessage=s=>{var h,C,k,I,w,N,R,E,M;const i=s.data;if(i.type==="READY"){ca.current=!0,ze("ready"),f.emit("search.worker.ready");return}if(i.type!=="SEARCH_RESULT")return;if(i.seq!==mn.current){f.emit("async.staleIgnored",{path:"search.worker",seq:i.seq});return}const l=new Map(j.current.nodes.map(A=>[A.id,A])),u=i.hits.map(A=>l.get(A.nodeId)).filter(A=>!!A);U(u),re(0),Ne("worker"),f.emit("search.completed",{query:i.query,count:u.length,engine:"worker",durationMs:(h=i.profile)==null?void 0:h.durationMs,documentCount:(C=i.profile)==null?void 0:C.documentCount,candidateCount:(k=i.profile)==null?void 0:k.candidateCount,rankedCount:(I=i.profile)==null?void 0:I.rankedCount,viewportBoosted:(w=i.profile)==null?void 0:w.viewportBoosted,boostedCount:(N=i.profile)==null?void 0:N.boostedCount,indexedTokenCount:(R=i.profile)==null?void 0:R.indexedTokenCount,indexedPrefixCount:(E=i.profile)==null?void 0:E.indexedPrefixCount,indexedNGramCount:(M=i.profile)==null?void 0:M.indexedNGramCount})},a.onerror=s=>{ca.current=!1,ze("failed"),f.emit("search.worker.failed",{message:s.message})},()=>{a.terminate(),Ea.current=null,ca.current=!1}},[]),g.useEffect(()=>{const a=()=>{const l=Mt();Fo.current=l,mt(u=>Math.abs(u.width-l.width)<.5&&Math.abs(u.height-l.height)<.5?u:l)};a();const s=typeof ResizeObserver>"u"?null:new ResizeObserver(a),i=Ht.current;return s&&i&&s.observe(i),window.addEventListener("resize",a),()=>{s==null||s.disconnect(),window.removeEventListener("resize",a)}},[Mt]),g.useEffect(()=>(j.current=n,Ro("syncing"),_n("Saving board state to this browser."),window.clearTimeout(le.current),le.current=window.setTimeout(()=>{const a=Xt(Va(j.current,$e.current));Oe(Ct()),Ro(a?"ready":"error"),_n(a?"Saved in this browser.":"Local browser storage failed.")},280),()=>window.clearTimeout(le.current)),[n]),g.useEffect(()=>{const a=Ea.current;if(!a)return;const s=window.setTimeout(()=>{a.postMessage({type:"REBUILD_BOARD",boardId:n.id,nodes:lu(n.nodes)}),f.emit("search.worker.synced",{boardId:n.id,count:n.nodes.length})},160);return()=>window.clearTimeout(s)},[n.id,n.nodes]),g.useEffect(()=>{K.current=m},[m]),g.useEffect(()=>{const a=Pr(j.current)??{x:0,y:0};$e.current=a,qa(a),f.emit("canvas.cursor.restore",{boardId:j.current.id,x:Math.round(a.x),y:Math.round(a.y),source:j.current.viewState?"board-view-state":"default"})},[n.id]),g.useEffect(()=>{f.emit("canvas.gridMode.applied",{boardId:n.id,gridType:Br(n.settings.gridType),gridSnap:n.settings.gridSnap??!0})},[n.id,n.settings.gridSnap,n.settings.gridType]),g.useEffect(()=>()=>{document.body.classList.remove("is-selecting"),document.body.classList.remove("is-panning"),window.clearTimeout(bt.current)},[]);const Z=g.useCallback((a,s=!0)=>{oe.current=a,We(a),dn.current&&(dn.current.style.transform=`translate3d(${a.x}px, ${a.y}px, 0) scale(${a.scale})`),Wt.current&&(Wt.current.style.setProperty("--grid-x",`${a.x}px`),Wt.current.style.setProperty("--grid-y",`${a.y}px`),Wt.current.style.setProperty("--grid-small",`${24*a.scale}px`),Wt.current.style.setProperty("--grid-large",`${144*a.scale}px`)),window.clearTimeout(bt.current),bt.current=window.setTimeout(()=>nt(a),qf),s&&f.emit("camera.patch",{...a})},[]),Gt=g.useCallback(async()=>{var i;const a=++Ee.current;if(be("checking"),ve(null),ye(null),f.emit("runtimeStatus.bridge.refresh.requested",{source:"mindcanvas"}),!et()){be("blocked"),ve(null),ja([]),ye("Hosted LocalBridge access is off."),st(null),me("Hosted LocalBridge access is off."),f.emit("projectStorage.workspace.blocked",{source:"refresh",reason:"hosted-access-off"});return}const s=await qt();if(a===Ee.current){if(ve(s.status??null),s.state!=="connected"){be(s.state),ja([]),ye(s.message||"LocalBridge is unavailable."),st(null),me(s.message||"LocalBridge is unavailable.");return}try{const[l,u]=await Promise.all([Dl(s.baseUrl),Vg(s.baseUrl)]);if(a!==Ee.current)return;const h=Ka(l.rootPath||((i=s.status)==null?void 0:i.workspace));st(h||null),me(h?null:"LocalBridge workspace path is unavailable."),h&&qe(C=>ic(h,C)),be("connected"),ja(u),ye(u.length>0?null:"No local boards found."),f.emit("projectStorage.workspace.refresh",{source:"board-list",path:h||null}),f.emit("localBridge.boards.listed",{count:u.length})}catch(l){if(a!==Ee.current)return;be("unavailable"),ja([]);const u=l instanceof Error?l.message:String(l);ye(u),me(u)}}},[]),Qn=g.useCallback(async(a="auto",s=!1)=>{var u,h,C,k;const i=Date.now();if(!s&&i-x.current<Qf)return;x.current=i;const l=++_a.current;if(!et()){Te(I=>({...I,status:"blocked",message:"Hosted LocalBridge access is off."})),f.emit("modelCatalog.refresh.blocked",{source:a,reason:"hosted-access-off"});return}Te(I=>({...I,status:"loading",message:void 0})),f.emit("modelCatalog.refresh.requested",{source:a,force:s});try{const I=await qt();if(l!==_a.current)return;if(ve(I.status??null),I.state!=="connected"){Te(A=>({...A,status:"error",message:I.message||"LocalBridge is unavailable."})),f.emit("modelCatalog.refresh.unavailable",{source:a,state:I.state,message:I.message});return}const w=Ua(I.status),N=Ey(I.status);let R=null;try{R=await gp(w,I.baseUrl)}catch(A){const L=A instanceof Error?A.message:String(A);if(N.length>0){Te({status:"ready",textModels:N,imageModels:[],videoModels:[],source:((h=(u=I.status)==null?void 0:u.exec)==null?void 0:h.modelCatalogSource)||"localbridge-status",updatedAt:(k=(C=I.status)==null?void 0:C.exec)==null?void 0:k.modelCatalogUpdatedAt,message:L}),f.emit("modelCatalog.refresh.statusFallback",{source:a,textModels:N.length,message:L});return}throw A}if(l!==_a.current)return;const E=Py(R);E.textModels=Ol(N,E.textModels);const M=R.errors&&R.errors.length>0?R.errors.join(" | "):void 0;Te({status:"ready",...E,source:R.source,updatedAt:R.updatedAt,message:M}),f.emit("modelCatalog.refresh.completed",{source:a,textModels:E.textModels.length,imageModels:E.imageModels.length,videoModels:E.videoModels.length,hasWarnings:!!M})}catch(I){if(l!==_a.current)return;const w=I instanceof Error?I.message:String(I);Te(N=>({...N,status:"error",message:w})),f.emit("modelCatalog.refresh.failed",{source:a,message:w})}},[]);g.useEffect(()=>{et()&&(Gt(),Qn("mount",!0))},[Qn,Gt]),g.useEffect(()=>{va&&(Ln(!0),f.emit("mindcanvas.projectGallery.opened",{source:"startup"}))},[va]);const du=g.useCallback(()=>{Ln(a=>{const s=!a;return s&&Ve.length===0&&Ae!=="checking"&&Gt(),f.emit(s?"mindcanvas.projectGallery.opened":"mindcanvas.projectGallery.closed",{source:"top-tab"}),s})},[Ve.length,Ae,Gt]),Tt=g.useCallback(a=>{Ln(s=>(s&&f.emit("mindcanvas.projectGallery.closed",{source:a}),!1))},[]),cu=g.useCallback(a=>{Ja(a),localStorage.setItem(jd,String(a)),f.emit("mindcanvas.projectGallery.startupPreference",{enabled:a})},[]),Ys=g.useCallback(async(a="manual")=>{if(Qa(yr()),!fe){const s=Je.cloudBoards.canAttempt?"sign-in-required":Je.cloudBoards.mode;Fe(s==="sign-in-required"?"Login with Supabase is required before cloud boards can be listed.":"Cloud board adapter is not configured."),f.emit("projectStorage.cloud.unavailable",{reason:s,source:a});return}ta(!0),Fe(null);try{const s=await ih(Cs());en(s),Fe(s.length>0?`Loaded ${s.length} cloud board${s.length===1?"":"s"}.`:"No cloud boards yet.")}catch(s){Fe(s instanceof Error?s.message:String(s))}finally{ta(!1)}},[fe,Je.cloudBoards.canAttempt,Je.cloudBoards.mode]),Ei=g.useCallback(a=>{Za(a),f.emit("projectStorage.tab",{tab:a}),a==="cloud"&&Ys("tab")},[Ys]),uu=g.useCallback(()=>{hp(!0),f.emit("runtimeStatus.bridge.hostedAccess.enabled"),Gt()},[Gt]),$o=g.useCallback(a=>{st(a),qe(s=>ic(a,s))},[]),mu=g.useCallback(async(a="manual")=>{var i;const s=++Le.current;if(me(null),f.emit("projectStorage.workspace.refresh.requested",{source:a}),!et()){st(null),me("Hosted LocalBridge access is off."),f.emit("projectStorage.workspace.blocked",{source:a,reason:"hosted-access-off"});return}try{const l=await qt();if(s!==Le.current)return;if(ve(l.status??null),l.state!=="connected"){be(l.state),st(null),me(l.message||"LocalBridge is unavailable.");return}const u=await Dl(l.baseUrl);if(s!==Le.current)return;const h=Ka(u.rootPath||((i=l.status)==null?void 0:i.workspace));me(h?null:"LocalBridge workspace path is unavailable."),h&&$o(h),f.emit("projectStorage.workspace.refresh",{source:a,path:h||null})}catch(l){if(s!==Le.current)return;me(l instanceof Error?l.message:String(l))}},[$o]),Gs=g.useCallback(async(a,s)=>{const i=Ka(a);if(!i||De)return;const l=++Le.current;if(It(!0),me("Switching LocalBridge workspace..."),f.emit("projectStorage.workspace.set.requested",{source:s,path:i}),!et()){st(null),me("Hosted LocalBridge access is off."),It(!1),f.emit("projectStorage.workspace.blocked",{source:s,reason:"hosted-access-off"});return}try{const u=await qt();if(l!==Le.current)return;if(ve(u.status??null),u.state!=="connected"){be(u.state),me(u.message||"LocalBridge is unavailable.");return}const h=Ua(u.status);if(!h){be("unavailable"),me("LocalBridge write token is unavailable.");return}const C=await fp(i,h,u.baseUrl);if(l!==Le.current)return;const k=Ka(C.workspace||i);$o(k),be("connected"),me(`Local workspace set to ${ys(k)}.`),f.emit("projectStorage.workspace.set",{source:s,path:k}),Gt()}catch(u){if(l!==Le.current)return;be("unavailable"),me(u instanceof Error?u.message:String(u))}finally{l===Le.current&&It(!1)}},[De,Gt,$o]),pu=g.useCallback(async()=>{const a=++Le.current;if(It(!0),me("Opening folder picker..."),f.emit("projectStorage.workspace.browse.requested",{path:ot||null}),!et()){st(null),me("Hosted LocalBridge access is off."),It(!1),f.emit("projectStorage.workspace.blocked",{source:"browse",reason:"hosted-access-off"});return}try{const s=await qt();if(a!==Le.current)return;if(ve(s.status??null),s.state!=="connected"){be(s.state),me(s.message||"LocalBridge is unavailable.");return}const i=Ua(s.status),l=await bp(ot,i,s.baseUrl);if(a!==Le.current)return;if(l.canceled||!l.success||!l.path){me("Workspace selection cancelled."),f.emit("projectStorage.workspace.browse.cancelled");return}f.emit("projectStorage.workspace.browse",{path:l.path}),It(!1),await Gs(l.path,"browse")}catch(s){if(a!==Le.current)return;me(s instanceof Error?s.message:String(s))}finally{a===Le.current&&It(!1)}},[Gs,ot]),gu=g.useCallback(async()=>{var s,i;const a=++Ee.current;if(Ia(!0),ye(null),(s=j.current.source)!=null&&s.partialImport){ye("This imported board came from a partial original payload, so export is blocked to avoid data loss."),Ia(!1);return}if((i=j.current.source)!=null&&i.truncated){ye("This imported board was truncated, so export is blocked to avoid data loss."),Ia(!1);return}if(!et()){be("blocked"),ve(null),ye("Hosted LocalBridge access is off."),Ia(!1);return}try{const l=await qt();if(a!==Ee.current)return;if(ve(l.status??null),l.state!=="connected"){be(l.state),ye(l.message||"LocalBridge is unavailable.");return}const u=Ua(l.status);if(!u){be("unavailable"),ye("LocalBridge write token is unavailable.");return}const h=await Gg(j.current,oe.current,u,l.baseUrl,$e.current);if(a!==Ee.current)return;const C=Va({...j.current,nodes:h.nodes,source:h.source,updatedAt:h.metadata.UpdatedAt||new Date().toISOString()},$e.current);r(C),Xt(C),Oe(Ct()),be("connected"),ja(k=>[h.metadata,...k.filter(I=>I.Id!==h.metadata.Id)]),ye(`Exported "${tt(h.metadata.Title)}" to LocalBridge.`)}catch(l){if(a!==Ee.current)return;be("unavailable"),ye(l instanceof Error?l.message:String(l))}finally{a===Ee.current&&Ia(!1)}},[]),Ke=g.useCallback((a,s,i={})=>{const l=Yl(a),u=Bl(l),h=Vl(u);c(C=>Ha(C,j.current,{description:"Activate board"})),b([]),r(h),y(h.nodes[0]?[h.nodes[0].id]:[]),te(null),jt(null),V(null),Tt("board-activate"),f.emit(s,{boardId:h.id,...i})},[Tt]),_i=g.useCallback(()=>{const a=Jd(j.current.settings);Ke(a,"board.local.create"),Z({x:540,y:210,scale:1})},[Ke,Z]),hu=g.useCallback(async a=>{if(!fe){Fe("Login with Supabase is required before cloud boards can be opened."),f.emit("projectStorage.cloud.unavailable",{reason:"sign-in-required",source:"load-board"});return}Po(a.id),Fe(null);try{const s=await lh(Cs(),a.id,j.current.settings);if(!s){Fe("Cloud board was not found or is not available to this user.");return}Ke(s,"board.cloud.switch",{sourceBoardId:a.id}),Z({x:540,y:210,scale:1})}catch(s){Fe(s instanceof Error?s.message:String(s))}finally{Po(null)}},[Ke,Z,fe]),zo=g.useCallback(async(a,s)=>{if(!fe){Fe("Login with Supabase is required before cloud boards can be saved."),f.emit("projectStorage.cloud.unavailable",{reason:"sign-in-required",source:s});return}ta(!0),Fe(null);try{const i=await dh(Cs(),a,oe.current,$e.current);if(!i){Fe("Cloud board save did not return a board.");return}const l=new Date().toISOString(),u=Va({...a,id:i.id,name:i.name,updatedAt:i.updatedAt,source:{kind:"cloud",boardId:i.id,loadedAt:l,snapshotFormat:"supabase.boards.content_json",originalNodeCount:a.nodes.length,renderedNodeCount:a.nodes.length}},$e.current);r(u),Xt(u),Oe(Ct()),en(h=>[i,...h.filter(C=>C.id!==i.id)]),Fe(`Saved "${tt(i.name)}" to cloud.`)}catch(i){Fe(i instanceof Error?i.message:String(i))}finally{ta(!1)}},[fe]),fu=g.useCallback(()=>{zo(j.current,"save-current")},[zo]),bu=g.useCallback(()=>{const a=Jd(j.current.settings);zo(a,"new-cloud-board")},[zo]),yu=g.useCallback(()=>{var l;if(!ne)return;if(ne.options.length>0||!ne.quickCreateTemplateId){const u=oe.current,h=Mt(),C={x:(h.width/2-u.x)/u.scale,y:(h.height/2-u.y)/u.scale},k=j.current.nodes,I=k.length?Math.max(...k.map(A=>A.x+A.width)):C.x-280-hs,w=k.length?Math.min(...k.map(A=>A.y)):C.y-310,N=yp(ne,rt,I+hs,w,zt,j.current.settings.appLanguage);r(A=>{var L;return c(J=>Ha(J,A,{description:"Create template card"})),b([]),f.emit("templateCard.node.create",{id:N.id,launcherId:ne.id,optionId:((L=N.metadata)==null?void 0:L.templateLauncherSelectedOptionId)??null,source:"launcher-panel"}),{...A,nodes:[...A.nodes,N],updatedAt:new Date().toISOString()}}),y([N.id]);const R=Math.min(oe.current.scale,ue((h.height-190)/N.height,.72,1)),E=Math.max(320,h.height-180);Z({...oe.current,scale:R,x:h.width/2-(N.x+N.width/2)*R,y:48+E/2-(N.y+N.height/2)*R}),H(N.id),window.setTimeout(()=>H(A=>A===N.id?null:A),1e3),$t(!1),ft(null);const M="Template card added to the current canvas.";Pe(M),window.setTimeout(()=>{Pe(A=>A===M?null:A)},2200),f.emit("templateCard.node.focus",{nodeId:N.id,launcherId:ne.id});return}const s=rs(Ge,zt);if(s){ft(s),f.emit("template.validation.failed",{launcherId:ne.id,optionId:rt,templateId:(Ge==null?void 0:Ge.id)??null,message:s});return}const i=xp(ne,rt,zt,j.current.settings);if(!i){const u="Template could not be created.";ft(u),f.emit("template.validation.failed",{launcherId:ne.id,optionId:rt,templateId:(Ge==null?void 0:Ge.id)??null,message:u});return}Ke(i.board,"template.board.create",{launcherId:i.launcher.id,optionId:((l=i.option)==null?void 0:l.id)??null,templateId:i.template.id,nodes:i.board.nodes.length}),Z({x:540,y:210,scale:1}),$t(!1),ft(null)},[Ke,Ge,ne,Z,Mt,rt,zt]),Bi=g.useCallback(a=>{if(a===j.current.id){Tt("stored-board-current");return}const s=tp(a);s&&(Ke(s,"board.local.switch"),Z({x:540,y:210,scale:1}))},[Ke,Z,Tt]),Ks=g.useCallback((a,s="unknown")=>{if(a===j.current.id){f.emit("board.tabs.closeIgnored",{boardId:a,source:s,reason:"active-board"});return}f.emit("board.tabs.close",{boardId:a,source:s}),ap(a),Oe(Ct())},[]),xu=g.useCallback((a,s)=>{if(!a||!s||a===s)return;Xt(Va(j.current,$e.current));const i=Ct(),l=rn.map(N=>N.id),u=l.indexOf(a),h=l.indexOf(s);if(u<0||h<0)return;const C=[...l],k=C.splice(u,1)[0];if(!k)return;C.splice(h,0,k);const I=i.map(N=>N.id).filter(N=>!C.includes(N)),w=np([...C,...I]);Oe(w),f.emit("board.tabs.drop",{sourceId:a,targetId:s,visibleIds:C})},[rn]),Cu=g.useCallback(async a=>{const s=++Ee.current;pt(a.Id),ye(null);try{const i=await Kg(a,j.current.settings);if(s!==Ee.current)return;Ke(i,"board.localBridge.switch",{sourceBoardId:a.Id});const l=Gr(a.LastCameraX,a.LastCameraY,a.LastCameraZ);Z(l?{...l,scale:ue(l.scale,ws,Ss)}:{x:540,y:210,scale:1})}catch(i){if(s!==Ee.current)return;ye(i instanceof Error?i.message:String(i))}finally{s===Ee.current&&pt(null)}},[Ke,Z]),ku=g.useCallback(()=>{var a;(a=qn.current)==null||a.click()},[]),wu=g.useCallback(async a=>{var i;const s=Array.from(a??[]).filter(l=>/\.json$/i.test(l.name));if(s.length===0){Pe("Choose a React or MindExec board JSON file."),window.setTimeout(()=>Pe(null),1800);return}try{const l=await Promise.all(s.map(async N=>({file:N,payload:JSON.parse(await N.text())}))),u=l.find($r),h=oy(l),C=l.find(N=>!$r(N)&&Fr(N.payload))??l.find(N=>!$r(N)&&kc(N.payload)>0);if(!C)throw new Error("No board JSON file was found.");const k=Fr(C.payload)?null:sy(C,h),I=k?Gr(k.metadata.LastCameraX,k.metadata.LastCameraY,k.metadata.LastCameraZ):null,w=Fr(C.payload)?ny(C.payload,C.file.name):Sc(C.payload,j.current.settings,{boardId:(k==null?void 0:k.metadata.Id)??Bs(C.file.name),title:(k==null?void 0:k.metadata.Title)||Bs(C.file.name),updatedAt:k==null?void 0:k.metadata.UpdatedAt,layoutPayload:u==null?void 0:u.payload,cameraBookmarks:k==null?void 0:k.metadata.CameraBookmarks,lastCursorX:k==null?void 0:k.metadata.LastCursorX,lastCursorY:k==null?void 0:k.metadata.LastCursorY});if(w.nodes.length===0)throw new Error("The selected file did not contain any importable board nodes.");Ke(w,"board.import.file",{fileName:C.file.name,layoutFileName:(u==null?void 0:u.file.name)??null,metadataFileName:(k==null?void 0:k.fileName)??null,nodes:w.nodes.length,edges:w.edges.length,sourceKind:((i=w.source)==null?void 0:i.kind)??null,originalBoardId:(k==null?void 0:k.metadata.Id)??null,cameraRestored:!!I}),Xt(w),Oe(Ct()),Z(I?{...I,scale:ue(I.scale,ws,Ss)}:{x:540,y:210,scale:1}),Pe(`Imported "${tt(w.name)}".`),window.setTimeout(()=>Pe(null),2200)}catch(l){const u=l instanceof Error?l.message:String(l);Pe(`Import failed: ${u}`),f.emit("board.import.failed",{message:u}),window.setTimeout(()=>Pe(null),3200)}},[Ke,Z]);g.useEffect(()=>{Z(oe.current,!1)},[Z]);const yt=g.useCallback((a,s)=>{const i=oe.current,l=pa(a,s);return{x:(l.x-i.x)/i.scale,y:(l.y-i.y)/i.scale}},[pa]),Uo=g.useCallback((a,s,i={})=>{if(!Ld(a))return null;const l=i.snap??j.current.settings.gridSnap??!0,u=xb(a,l);if($e.current=u,qa(u),r(h=>{const C=Pr(h);return C&&C.x===u.x&&C.y===u.y?h:{...Va(h,u),updatedAt:new Date().toISOString()}}),f.emit("canvas.cursor.update",{reason:s,x:Math.round(u.x),y:Math.round(u.y),snapped:l,cameraTraceMode:j.current.settings.cameraTraceMode??"none"}),i.moveCamera&&i.cameraTarget&&Ld(i.cameraTarget)){const h=oe.current.scale,C=Mt();Z({...oe.current,x:C.width/2-i.cameraTarget.x*h,y:C.height/2-i.cameraTarget.y*h}),f.emit("canvas.cursor.cameraTrace",{reason:s,targetX:Math.round(i.cameraTarget.x),targetY:Math.round(i.cameraTarget.y)})}return u},[Z,Mt]),Ho=g.useCallback((a,s,i)=>{const l=yt(a,s);return!!Uo(l,i,{snap:j.current.settings.gridSnap??!0})},[yt,Uo]),Se=g.useCallback((a,s,i={})=>{var N;const l=i.width??300,u=i.height??160,h=Number.isFinite(a)&&Number.isFinite(s);if(!h&&(i.preferCursor??!0)&&j.current.settings.cursorMode==="lastNode")return{...$e.current};const C=(N=Ht.current)==null?void 0:N.getBoundingClientRect(),k=C?C.left+C.width/2:window.innerWidth/2,I=i.centerClientY??(C?C.top+C.height/2:window.innerHeight/2),w=h?yt(a,s):yt(k,I);return{x:w.x-l/2,y:w.y-u/2}},[yt]),xe=g.useCallback((a,s)=>{const i=j.current.settings.cursorDirection==="down"?"down":"right",l=i==="down"?{x:a.x,y:a.y+a.height+Id}:{x:a.x+a.width+Id,y:a.y};Uo(l,s,{cameraTarget:Er(a),moveCamera:j.current.settings.cameraTraceMode==="cursor",snap:j.current.settings.gridSnap??!0}),f.emit("canvas.cursor.moveAfterNodePlacement",{reason:s,nodeId:a.id,direction:i,nextX:Math.round(l.x),nextY:Math.round(l.y)})},[Uo]),Su=g.useCallback(a=>{Ns(a.target)||(ua.current={clientX:a.clientX,clientY:a.clientY})},[]),F=g.useCallback((a,s,i={})=>{r(l=>{c(h=>Ha(h,l,{description:s,mergeKey:typeof i.mergeKey=="string"?i.mergeKey:null})),b([]);const u=a(l);return f.emit(s,i),{...u,updatedAt:new Date().toISOString()}})},[]);g.useEffect(()=>{const a=Fp();if(!a)return;const{sourceNode:s,itemNodes:i,taskNode:l,edges:u}=$p(a,{...Se(void 0,void 0,{width:780,height:290})});if(j.current.nodes.some(h=>{var C;return((C=h.metadata)==null?void 0:C.ToolHandoffId)===a.id})){Wl(a.id),f.emit("tool.handoff.duplicateIgnored",{handoffId:a.id,toolKey:a.toolKey});return}F(h=>({...h,nodes:[...h.nodes,s,...i,l],edges:[...h.edges,...u]}),"tool.handoff.consumed",{handoffId:a.id,toolKey:a.toolKey,createdNodes:2+i.length,resultItems:i.length}),Wl(a.id),y([l.id]),H(l.id),xe(l,"tool.handoff.consumed"),window.setTimeout(()=>H(h=>h===l.id?null:h),1400)},[F,Se,xe]);const gn=g.useCallback((a,s,i={})=>{r(l=>{const u=a(l);return f.emit(s,i),{...u,updatedAt:new Date().toISOString()}})},[]),Xs=g.useCallback(a=>{const s=a.slice(0,90);gn(i=>({...i,name:s}),"board.rename",{boardId:j.current.id})},[gn]),Ie=g.useCallback((a,s="inline")=>{const i=typeof a.appLanguage=="string"?{...a,appLanguage:gi(a.appLanguage)}:a;if(gn(l=>{const u={...l.settings,...i};if(typeof i.appLanguage=="string"){const h=Cp(l.nodes,u.appLanguage);return h.changed&&f.emit("template.localization.relocalized",{appLanguage:h.language,nodeCount:h.nodes.length,source:s}),{...l,settings:u,nodes:h.nodes}}return{...l,settings:u}},"settings.patch",{keys:Object.keys(i),source:s}),typeof i.appLanguage=="string"){const l=kp(i.appLanguage);f.emit("appLanguage.select",{appLanguage:l,source:s})}if(typeof i.model=="string"){const l=Zt(i.model),u=cc(l);f.emit("textModel.select",{model:l,provider:(u==null?void 0:u.provider)??"custom",source:s})}if(typeof i.executionMode=="string"||typeof i.directInstructionQueueMode=="string"){const l={...j.current.settings,...i};zp(l,s)}Up({...j.current.settings,...i})},[gn]),Di=g.useCallback((a,s)=>{Ie({[a]:s},`inline.${String(a)}`)},[Ie]),Wo=g.useMemo(()=>Ol(wp,_e.textModels),[_e.textModels]),Oi=g.useMemo(()=>Sp(n.settings,Wo),[n.settings,Wo]),Rt=g.useMemo(()=>{const a=vy(Wo);return{Image:Fl("Image",po("Image"),a,_e.imageModels),Video:Fl("Video",po("Video"),_e.videoModels)}},[_e.imageModels,_e.videoModels,Wo]);g.useEffect(()=>{B.current=Rt},[Rt]);const qs=g.useMemo(()=>No(n.settings,"Image",Rt),[n.settings,Rt]),Js=g.useMemo(()=>No(n.settings,"Video",Rt),[n.settings,Rt]),vu=Zt(n.settings.model),ju=g.useMemo(()=>zr(Oi,"Text",n.settings),[n.settings,Oi]),Iu=g.useMemo(()=>zr(po("Image",Rt),"Image",n.settings),[n.settings,Rt]),Nu=g.useMemo(()=>zr(po("Video",Rt),"Video",n.settings),[n.settings,Rt]),Au=g.useMemo(()=>ac(qs.aspectOptions),[qs.aspectOptions]),Mu=g.useMemo(()=>ac(Js.aspectOptions),[Js.aspectOptions]),Tu=g.useMemo(()=>jy(),[]),Ru=g.useCallback((a,s="bottom-input")=>{const i=Zt(a);Ie({model:i},`connection.model.${s}`)},[Ie]),Lu=g.useCallback((a,s)=>{const i=uc(a,s),l=po(a,B.current).find(I=>I.id===i);if(!l)return;const u=j.current.settings,h=a==="Image"?u.imageRouterImageAspectPresetId:u.imageRouterVideoAspectPresetId,C=Hr(a,l,h),k=a==="Image"?{imageRouterImageModel:l.id,imageRouterImageAspectPresetId:C.id}:{imageRouterVideoModel:l.id,imageRouterVideoAspectPresetId:C.id};Ie(k,`inline.${a.toLowerCase()}Model`),f.emit("media.model.select",{mode:a,model:l.id,aspectPresetId:C.id,requestedSize:Wr(C)})},[Ie]),Pu=g.useCallback((a,s)=>{const i=mc(a,j.current.settings,B.current),l=Hr(a,i,s),u=a==="Image"?{imageRouterImageAspectPresetId:l.id}:{imageRouterVideoAspectPresetId:l.id};Ie(u,`inline.${a.toLowerCase()}Aspect`),f.emit("media.aspect.select",{mode:a,model:i.id,aspectPresetId:l.id,requestedSize:Wr(l)})},[Ie]),Eu=g.useCallback(()=>{na(!0),f.emit("settings.dialog.open",{boardId:j.current.id})},[]),_u=g.useCallback(()=>{na(!1),f.emit("settings.dialog.close",{boardId:j.current.id})},[]),Fi=g.useCallback(()=>{an(!0),f.emit("promptDebug.open",{boardId:j.current.id})},[]),Bu=g.useCallback(()=>{an(!1),f.emit("promptDebug.close",{boardId:j.current.id})},[]);g.useEffect(()=>()=>{t==null||t([])},[t]),g.useEffect(()=>{t&&t([{id:"mindcanvas-prompt-debug",label:"Prompt Debugger",description:"Inspect prompt and local diagnostics",icon:tg,onClick:Fi,active:oa,testId:"prompt-debug-open"}])},[t,Fi,oa]);const Du=g.useCallback(a=>{const s=j.current.settings.appLanguage,i=co(a,s);if(!i)return;const l=ss(i),u=mo(i,l==null?void 0:l.id,s);Do(i.id),Ra((l==null?void 0:l.id)??null),nn(uo(u)),ft(null),f.emit("template.launcher.select",{launcherId:i.id,optionId:(l==null?void 0:l.id)??null,templateId:(u==null?void 0:u.id)??null})},[]),Ou=g.useCallback(()=>{const a=j.current.settings.appLanguage,s=co(la,a)??Ta[0];if(!s)return;const i=ss(s,rt),l=mo(s,i==null?void 0:i.id,a);Do(s.id),Ra((i==null?void 0:i.id)??null),nn(u=>Object.keys(u).length>0?u:uo(l)),ft(null),on(!1),it(!1),$t(!0),f.emit("template.launcher.open",{launcherId:s.id,optionId:(i==null?void 0:i.id)??null,templateId:(l==null?void 0:l.id)??null})},[la,rt,Ta]),Fu=g.useCallback(()=>{$t(!1),ft(null),f.emit("template.launcher.close",{launcherId:la})},[la]),$u=g.useCallback(a=>{if(!ne)return;const s=mo(ne,a,j.current.settings.appLanguage);Ra(a),nn(uo(s)),ft(null),f.emit("template.option.select",{launcherId:ne.id,optionId:a,templateId:(s==null?void 0:s.id)??null})},[ne]),zu=g.useCallback((a,s)=>{nn(i=>({...i,[a]:s})),Hn&&ft(null),f.emit("template.input.patch",{launcherId:ne==null?void 0:ne.id,key:a})},[ne==null?void 0:ne.id,Hn]),Xe=g.useCallback(a=>{Gn(a),window.setTimeout(()=>{Gn(s=>s===a?null:s)},2600)},[]),Uu=g.useCallback(()=>{$t(!1),it(!1),ia(a=>{const s=!a;return f.emit(s?"templateStudio.chooser.open":"templateStudio.chooser.close",{boardId:j.current.id,studioOpen:Wn}),s})},[Wn]),$i=g.useCallback(()=>{ia(!1),f.emit("templateStudio.chooser.close",{boardId:j.current.id})},[]),zi=g.useCallback(()=>{const a=j.current;$t(!1),it(!1),ia(!1),Vn(Ad(a.id,a.name)),Qe(null),on(!0),f.emit("templateStudio.open",{boardId:a.id,nodeCount:a.nodes.length})},[]),Vo=g.useCallback(a=>{const s=j.current,i=is(je,s.nodes);Qe(i),Md(s.id,je);const l=Xt(Va(s,$e.current));return Oe(Ct()),f.emit(a==="exit"?"templateStudio.draft.exitSave":"templateStudio.draft.save",{boardId:s.id,templateId:i.template.id,issues:i.issues.length,nodes:i.template.nodes.length,saved:l}),i},[je]),Ui=g.useCallback(()=>{Vo("exit"),on(!1),ia(!1),it(!1),Qe(null),f.emit("templateStudio.close",{boardId:j.current.id})},[Vo]),Hu=g.useCallback(()=>{const a=cy(j.current.settings),s=xs(a.name);ia(!1),it(!1),Vn(s),Qe(null),on(!0),Md(a.id,s),Xt(a),Oe(Ct()),Ke(a,"templateStudio.board.create",{templateId:s.templateId,source:"template-studio-chooser"}),Z({x:540,y:210,scale:1}),f.emit("templateStudio.chooser.startNew",{boardId:a.id,templateId:s.templateId}),Xe("New Template Studio draft board opened.")},[Ke,Z,Xe]),Wu=g.useCallback(()=>{zi(),f.emit("templateStudio.chooser.convertCurrent",{boardId:j.current.id,nodes:j.current.nodes.length}),Xe("Current board is now in Template Studio mode.")},[zi,Xe]),Yo=g.useCallback((a,s)=>{Vn(i=>{const l={...i,[a]:a==="templateId"?Co(s):s};return f.emit("templateStudio.draft.patch",{key:a}),l}),Qe(null)},[]),Vu=g.useCallback(()=>{const a=Vo("save");Xe(a.issues.length>0?"Template draft saved with manifest issues.":"Template draft and board saved locally.")},[Vo,Xe]),Yu=g.useCallback(a=>{const s=X("node"),i=$l(a),l=`${a.replace("template.","")}-${Date.now().toString(36)}`,u=a==="template.input",h=u?300:a==="template.prompt"?360:340,C=u?178:a==="template.prompt"?214:190,k=Se(void 0,void 0,{width:h,height:C}),I={[Y.studioNodeType]:a,[Y.templateNodeId]:l,[Y.templateRole]:a.replace(/^template\./,""),[Y.compileTarget]:i,Source:"template-studio"};u&&(I[Y.inputKey]=l,I[Y.inputType]="text",I[Y.inputRequired]="true");const w={id:s,kind:a==="template.prompt"?"ai-task":a==="template.section"?"markdown":"note",title:fr(a),body:u?"Defines a value requested before template board creation.":a==="template.prompt"?"Write the prompt instruction. Use {{input_key}} placeholders for Template Studio inputs.":"Write the reusable canvas content for this template node.",x:k.x,y:k.y,width:h,height:C,status:a==="template.prompt"?"idle":void 0,tags:["Template Studio",fr(a)],metadata:I};F(N=>({...N,nodes:[...N.nodes,w]}),"templateStudio.node.add",{id:w.id,studioNodeType:a,compileTarget:i}),y([w.id]),Qe(null),xe(w,"templateStudio.node.add")},[F,Se,xe]),Zs=g.useCallback(()=>{const a=is(je,j.current.nodes);return Qe(a),f.emit("templateStudio.compile",{templateId:a.template.id,inputs:a.template.inputs.length,nodes:a.template.nodes.length,issues:a.issues.length}),Xe(a.issues.length>0?"Template manifest has issues.":"Template manifest compiled."),a},[Xe,je]),Gu=g.useCallback(async()=>{const a=pe??is(je,j.current.nodes);pe||Qe(a);const s=await ko(a.manifestJson);f.emit("templateStudio.manifest.copy",{templateId:a.template.id,chars:a.manifestJson.length,method:s}),Xe("Template manifest copied.")},[Xe,je,pe]),Ku=g.useCallback(()=>{const a=Zs();if(a.issues.length>0){it(!1),f.emit("templateStudio.test.open.blocked",{templateId:a.template.id,issues:a.issues.length}),Xe("Fix manifest issues before test create.");return}La(uo(a.template)),da(null),it(!0),f.emit("templateStudio.test.open",{templateId:a.template.id,inputs:a.template.inputs.length,nodes:a.template.nodes.length})},[Zs,Xe]),Xu=g.useCallback(()=>{it(!1),La({}),da(null),f.emit("templateStudio.test.close",{templateId:(pe==null?void 0:pe.template.id)??null})},[pe==null?void 0:pe.template.id]),qu=g.useCallback((a,s)=>{La(i=>({...i,[a]:s})),sn&&da(null),f.emit("templateStudio.test.input.patch",{key:a})},[sn]),Ju=g.useCallback(()=>{const a=(pe==null?void 0:pe.issues.length)===0?pe:is(je,j.current.nodes);if(Qe(a),a.issues.length>0){da("Fix manifest issues before creating a test board."),f.emit("templateStudio.test.board.blocked",{templateId:a.template.id,issues:a.issues.length});return}const s=rs(a.template,Ut);if(s){da(s),f.emit("templateStudio.test.board.blocked",{templateId:a.template.id,message:s});return}const i=Td(je),l=vp(i,void 0,a.template,Ut,j.current.settings);Xt(l.board),Xt(Va(j.current,$e.current)),Oe(Ct()),it(!1),La({}),Xe(`Created test board: ${l.board.name}`),f.emit("templateStudio.test.board.create",{templateId:a.template.id,boardId:l.board.id,nodes:l.board.nodes.length})},[Xe,je,pe,Ut]),Zu=g.useCallback((a,s)=>{y(i=>s?i.includes(a)?i.filter(l=>l!==a):[...i,a]:[a]),te(null)},[]),Qu=g.useCallback(()=>{var u,h,C,k,I,w,N,R;const i=Se(void 0,void 0,{width:500,height:300,centerClientY:ue(window.innerHeight*.58,182,Math.max(182,window.innerHeight-150-96))}),l={id:X("node"),kind:"memo",title:"Agent",body:ib,x:i.x,y:i.y,width:500,height:300,tags:["Agent Command","Researcher","Draft"],metadata:gy()};F(E=>({...E,nodes:[...E.nodes,l]}),"agentCommand.node.add",{id:l.id,semanticType:(u=l.metadata)==null?void 0:u.SemanticType,status:(h=l.metadata)==null?void 0:h.AgentCommandStatus,requestedRole:(C=l.metadata)==null?void 0:C.AgentCommandRequestedRole,adapterState:(k=l.metadata)==null?void 0:k.AdapterState}),f.emit("mindcanvas.agentCommand.add",{id:l.id,semanticType:(I=l.metadata)==null?void 0:I.SemanticType,status:(w=l.metadata)==null?void 0:w.AgentCommandStatus,requestedRole:(N=l.metadata)==null?void 0:N.AgentCommandRequestedRole,adapterState:(R=l.metadata)==null?void 0:R.AdapterState}),y([l.id]),te(null),H(l.id),xe(l,"agentCommand.node.add"),window.setTimeout(()=>H(E=>E===l.id?null:E),1200)},[F,Se,xe]),em=g.useCallback(()=>{var u,h,C,k,I,w,N,R;const i=Se(void 0,void 0,{width:400,height:300,centerClientY:ue(window.innerHeight*.56,182,Math.max(182,window.innerHeight-150-96))}),l={id:X("node"),kind:"memo",title:"Code Note",body:rb,x:i.x,y:i.y,width:400,height:300,tags:["Code Note","Draft","Unlinked"],metadata:hy()};F(E=>({...E,nodes:[...E.nodes,l]}),"codeNote.node.add",{id:l.id,semanticType:(u=l.metadata)==null?void 0:u.SemanticType,status:(h=l.metadata)==null?void 0:h.CodeNoteStatus,syncState:(C=l.metadata)==null?void 0:C.CodeNoteSyncState,adapterState:(k=l.metadata)==null?void 0:k.AdapterState}),f.emit("mindcanvas.codeNote.add",{id:l.id,semanticType:(I=l.metadata)==null?void 0:I.SemanticType,status:(w=l.metadata)==null?void 0:w.CodeNoteStatus,syncState:(N=l.metadata)==null?void 0:N.CodeNoteSyncState,adapterState:(R=l.metadata)==null?void 0:R.AdapterState}),y([l.id]),te(null),H(l.id),xe(l,"codeNote.node.add"),window.setTimeout(()=>H(E=>E===l.id?null:E),1200)},[F,Se,xe]),Ce=g.useCallback((a,s)=>{var N,R,E,M,A,L,J,ke,ut;if(a==="remote-monitor"){const ae=j.current.nodes.find(Ya);if(ae){const fn=Er(ae),za=oe.current.scale,ns=Mt(),os=_d(ae.height,window.innerHeight);Z({...oe.current,x:ns.width/2-fn.x*za,y:os-fn.y*za}),y([ae.id]),H(ae.id),window.setTimeout(()=>H(ba=>ba===ae.id?null:ba),1e3);const io="Remote monitor already exists on this board. Focused existing node.";Pe(io),window.setTimeout(()=>{Pe(ba=>ba===io?null:ba)},2200),f.emit("remoteMonitor.node.duplicateIgnored",{action:"toolbar-add",nodeId:ae.id,surface:"mindcanvas-node"});return}}const i=s?Ni[s]:null,l=(i==null?void 0:i.mode)??(a==="image"?"Image":a==="video"?"Video":null),u=l?No(j.current.settings,l):null,h=i?i.width:a==="remote-monitor"?860:a==="remote-control"?560:a==="csv-table"?720:a==="embed"?460:a==="markdown"?400:a==="image"||a==="mask"?360:a==="ai-task"?340:a==="pdf"||a==="file"||a==="directory"?300:320,C=i?i.height:a==="remote-monitor"?640:a==="remote-control"?390:a==="csv-table"?420:a==="embed"||a==="markdown"||a==="image"||a==="mask"?260:a==="ai-task"?196:a==="pdf"||a==="file"||a==="directory"?154:176,k=a==="remote-monitor"?_d(C,window.innerHeight):window.innerHeight/2,I=Se(void 0,void 0,{width:h,height:C,centerClientY:k}),w={id:X("node"),kind:a,title:i?i.title:a==="ai-task"?"AI Task":a==="remote-monitor"?"Multi Desktop Monitor":a==="remote-control"?"Remote Device":a==="image"?"Image":a==="mask"?"Image Mask":a==="video"?"Video":a==="embed"?"Web Embed":a==="csv-table"?"CSV Table":a==="pdf"?"PDF Document":a==="file"?"File":a==="directory"?"Directory":a==="memo"?"Memo":a==="markdown"?"Markdown":a==="code"?"Code Note":"Note",body:i?i.body:a==="ai-task"?"Describe the work this task should perform.":a==="remote-monitor"?"RemoteHub monitor node. Frames and input stay adapter-gated until LocalBridge is connected.":a==="remote-control"?"Remote device control node. Frames and input stay adapter-gated until LocalBridge is connected.":a==="image"?"Describe the image to generate or attach the visual reference here.":a==="mask"?"Image edit mask reference. Attach or paste a mask image here.":a==="video"?"Describe the video shot, motion, and duration target here.":a==="embed"?"https://example.com/":a==="csv-table"?`Metric,Value,Stage
43
- Leads,42,Validation
44
- Trials,7,Launch
45
- Revenue,120,Learning`:a==="pdf"?"https://example.com/document.pdf":a==="file"?"https://example.com/file":a==="directory"?"LocalBridge directory reference. Include and exclude patterns are stored with this node.":a==="memo"?"Capture a quick thought, reminder, or visual note here.":a==="markdown"?`# Markdown note
46
-
47
- Write structured notes, docs, or prompt context here.`:"Write the thought, evidence, or reusable context here.",x:I.x,y:I.y,width:h,height:C,status:a==="ai-task"?"idle":void 0,tags:i?["AI Task",i.tag,"Spec only"]:a==="ai-task"?["AI Task"]:a==="remote-monitor"?["Remote","Monitor","LocalBridge"]:a==="remote-control"?["Remote","Control","LocalBridge"]:a==="mask"?["Mask","ImageRouter"]:a==="csv-table"?["CSV","Table"]:a==="embed"?["Embed","Web"]:a==="memo"?["Memo"]:a==="markdown"?["Markdown"]:a==="text"?["Text"]:[a],imageUrl:a==="image"||a==="mask"?"/assets/mindexecution-mindcanvas.png":void 0,assetUrl:a==="embed"?"https://example.com/":a==="pdf"?"https://example.com/document.pdf":a==="file"?"https://example.com/file":void 0,sourceFilePath:a==="directory"?oi:void 0,metadata:i?py(j.current.settings,i.kind):a==="csv-table"?{CsvRowCount:"3",CsvColumnCount:"3",Source:"toolbar"}:a==="memo"?{memoColor:"coral"}:a==="mask"?{ImageRouterMask:"true",SemanticType:"ImageEditMask",AdapterState:"adapter-gated",Source:"toolbar"}:a==="directory"?{Include:".cs,.js,.razor,.css,.html,.json",Exclude:"bin,obj,.git,node_modules,.vs"}:a==="remote-monitor"?{SemanticType:"RemoteFleetMonitor",RemoteFleetSchemaVersion:"remote-fleet@1",RemoteFleetNodeRole:"fleet-monitor",RemoteFleetSurface:"mindcanvas-node",RemoteFleetPrimaryRoute:"/mindcanvas",RemoteFleetViewMode:"all-devices",RemoteFleetHubStatus:"gated",RemoteFleetHubEndpoint:"127.0.0.1:5197",RemoteFleetManagerPackage:"@mindexec/cli",RemoteFleetManagerVersion:"",RemoteFleetAgentPackage:"@mindexec/remote",RemoteFleetPairTokenPreview:"<pair-token>",RemoteFleetConnectCommand:"npx @mindexec/remote connect --manager 127.0.0.1:5197 --pair <pair-token>",RemoteFleetDeviceCount:"30",RemoteFleetConnectedDeviceCount:"0",RemoteFleetCanvasPagination:"node-window:1/1",RemoteFleetHostTargetState:"inactive",RemoteFleetLastError:"Hosted LocalBridge access is gated.",RemoteHub:"Gated",RemoteRoute:"Gated",RemoteConnected:"0",RemoteTotal:"30",RemotePage:"1/1",RemotePageStart:"0",RemoteVisibleBudget:"30",RemoteSelectedDeviceId:"",RemoteInput:"Off",RemoteTasksQueued:"0",RemoteAiDevices:"0",RemoteBaseUrl:"http://127.0.0.1:5147",AdapterState:"adapter-gated"}:a==="remote-control"?{SemanticType:"RemoteFleetDevice",RemoteFleetSchemaVersion:"remote-fleet-device@1",RemoteFleetDeviceId:"",RemoteFleetDeviceName:"Remote Device",RemoteFleetDevicePlatform:"unknown",RemoteFleetDeviceConnected:"false",RemoteInput:"Off",RemoteBaseUrl:"http://127.0.0.1:5147",AdapterState:"adapter-gated"}:a==="embed"?{source:"embed",embedType:"webpage",provider:"web",renderMode:"card",aspectRatio:"auto",sourceUrl:"https://example.com/",url:"https://example.com/",iframeAllowed:"false",iframeBlockedReason:"react-card-shell",captureStatus:"idle",captureProvider:"cloudflare-browser-run",AdapterState:"local-reference"}:l?Ri(j.current.settings,l):void 0};F(ae=>({...ae,nodes:[...ae.nodes,w]}),"node.add",{id:w.id,kind:a,automationKind:i==null?void 0:i.kind,...u?{mode:u.mode,model:u.model.id,aspectPresetId:u.aspect.id,requestedSize:u.requestedSize}:{}}),i&&f.emit("automation.mediaNode.add",{id:w.id,kind:i.kind,mode:i.mode,model:(N=w.metadata)==null?void 0:N.MediaModel,aspectPresetId:(R=w.metadata)==null?void 0:R.AspectPresetId,requestedSize:(E=w.metadata)==null?void 0:E.RequestedSize,adapterState:((M=w.metadata)==null?void 0:M.AdapterState)??"adapter-gated",externalActionPolicy:((A=w.metadata)==null?void 0:A.AutomationExternalActionPolicy)??"spec-only-until-review"}),a==="remote-monitor"&&f.emit("remoteMonitor.node.add",{id:w.id,surface:"mindcanvas-node",width:w.width,height:w.height,adapterState:((L=w.metadata)==null?void 0:L.AdapterState)??"adapter-gated"}),a==="mask"&&f.emit("node.mask.add",{id:w.id,hasImage:!!w.imageUrl,imageRouterMask:((J=w.metadata)==null?void 0:J.ImageRouterMask)??"true",semanticType:((ke=w.metadata)==null?void 0:ke.SemanticType)??"ImageEditMask",adapterState:((ut=w.metadata)==null?void 0:ut.AdapterState)??"adapter-gated"}),y([w.id]),xe(w,"node.add")},[Z,F,Se,xe]),ee=g.useCallback((a,s)=>{gn(i=>({...i,nodes:i.nodes.map(l=>l.id===a?{...l,...s}:l)}),"node.patch",{id:a,keys:Object.keys(s)})},[gn]),Kt=g.useCallback((a,s)=>{const i=K.current[0],l=j.current.nodes.find(u=>u.id===i);l&&(ee(i,{metadata:{...l.metadata??{},[a]:a===Y.templateNodeId||a===Y.inputKey?Co(s):s}}),Qe(null),f.emit("templateStudio.node.metadata.patch",{id:i,key:a}))},[ee]),Hi=g.useCallback(a=>{var h;const s=K.current[0],i=j.current.nodes.find(C=>C.id===s);if(!i)return;const l=((h=i.metadata)==null?void 0:h[Y.templateNodeId])||Co(i.title),u={...i.metadata??{},[Y.studioNodeType]:a,[Y.templateNodeId]:l,[Y.templateRole]:a.replace(/^template\./,""),[Y.compileTarget]:$l(a,i)};a==="template.input"&&(u[Y.inputKey]=u[Y.inputKey]||Co(i.title),u[Y.inputType]=u[Y.inputType]||"text",u[Y.inputRequired]=u[Y.inputRequired]||"true"),ee(s,{metadata:u}),Qe(null),f.emit("templateStudio.node.role.assign",{id:s,studioNodeType:a})},[ee]),T=g.useCallback(a=>{Pe(a),window.setTimeout(()=>{Pe(s=>s===a?null:s)},2200)},[]),tm=g.useCallback((a,s,i)=>{var w;const l=j.current.nodes.find(N=>N.id===a);if(!l)return;const u=dc(l.body),h=jp(l,s,i,j.current.settings);if(!h||h.nodes.length===0){T("Template card could not generate nodes."),f.emit("templateCard.generate.blocked",{nodeId:a,optionId:s});return}F(N=>({...N,nodes:[...N.nodes,...h.nodes]}),"templateCard.generate",{nodeId:a,launcherId:h.launcher.id,optionId:((w=h.option)==null?void 0:w.id)??null,templateId:h.template.id,runId:h.runId,generatedCount:h.nodes.length});const C=h.nodes.map(N=>N.id);y(C),H(C[0]??null);const k=h.nodes[h.nodes.length-1];k&&xe(k,"templateCard.generate"),window.setTimeout(()=>H(N=>N===C[0]?null:N),1200);const I=u!=null&&u.generatedMessageFormat?u.generatedMessageFormat.replace("{0}",String(h.nodes.length)):`${h.nodes.length} template node${h.nodes.length===1?"":"s"} generated below the card.`;T(I)},[F,xe,T]),am=g.useCallback(a=>{const s=j.current.nodes.find(N=>N.id===a.sourceNodeId),i=560,l=390,u=Se(void 0,void 0,{width:i,height:l}),h=X("node"),C=s?s.x+s.width+hs:u.x,k=s?s.y:u.y,I={SemanticType:"RemoteFleetDevice",RemoteFleetSchemaVersion:"remote-fleet-device@1",RemoteFleetSourceMonitorNodeId:a.sourceNodeId,RemoteFleetDeviceId:a.deviceId,RemoteFleetDeviceName:a.deviceName,RemoteFleetDevicePlatform:a.platform||"unknown",RemoteFleetDeviceConnected:String(a.connected===!0),RemoteFleetDeviceCanControl:String(a.connected===!0),RemoteFleetDeviceCanDispatchTask:String(a.connected===!0),RemoteInput:"Off",RemoteHub:a.connected?"Online":"Preview",RemoteRoute:a.baseUrl?"Local":"Preview",RemoteBaseUrl:a.baseUrl||"http://127.0.0.1:5147",AdapterState:a.baseUrl?"localbridge-connected":"adapter-gated"};a.framePath&&(I.RemoteFleetLatestFramePath=a.framePath),a.frameUrl&&(I.RemoteFleetLatestFrameUrl=a.frameUrl),a.dataUrl&&(I.RemoteFleetLatestFrameDataUrl=a.dataUrl),a.frameSeq&&(I.RemoteFleetLatestFrameSeq=String(a.frameSeq));const w={id:h,kind:"remote-control",title:a.deviceName||"Remote Device",body:`Remote device control: ${a.deviceId}`,x:C,y:k,width:i,height:l,tags:["Remote","Control","LocalBridge"],metadata:I};F(N=>({...N,nodes:[...N.nodes,w]}),"remoteControl.node.add",{id:w.id,sourceNodeId:a.sourceNodeId,deviceId:a.deviceId}),y([w.id]),xe(w,"remoteControl.node.add"),T(`Remote control node created for ${a.deviceName||a.deviceId}.`),f.emit("remoteControl.node.add",{nodeId:w.id,sourceNodeId:a.sourceNodeId,deviceId:a.deviceId,connected:a.connected===!0})},[F,Se,xe,Mt,T]),Da=g.useCallback(a=>{const s=bs(oe.current)??{...Wa};Ie({cameraBookmarks:{...j.current.settings.cameraBookmarks??{},[a]:s}},"camera.bookmark.save"),f.emit("camera.bookmark.save",{slot:a,...s}),T(`Camera slot ${a} saved.`)},[Ie,T]),eo=g.useCallback(a=>{var l;const s=bs((l=j.current.settings.cameraBookmarks)==null?void 0:l[a]),i=s??{...Wa};Z(i),f.emit("camera.bookmark.goto",{slot:a,saved:!!s,...i}),T(s?`Camera slot ${a}.`:`Camera slot ${a} empty. Home view.`)},[Z,T]),Qs=g.useCallback(()=>{Z({...Wa}),f.emit("camera.bookmark.goto",{slot:"home",saved:!1,...Wa}),T("Home view.")},[Z,T]),Wi=g.useCallback(a=>{const s=oe.current,i=Xf,l={...s,x:a==="left"?s.x+i:a==="right"?s.x-i:s.x,y:a==="up"?s.y+i:a==="down"?s.y-i:s.y};Z(l),f.emit("camera.keyboard.pan",{direction:a,...l})},[Z]),Vi=g.useCallback(()=>{const a=Xn.current;return a?(a.focus(),a.select(),f.emit("globalInput.focus",{source:"keyboard"}),!0):!1},[]),er=g.useCallback((a="keyboard")=>{const s=!(j.current.settings.wheelMode??!1);Ie({wheelMode:s},`${a}.wheelMode.toggle`),f.emit("canvas.wheelMode.toggle",{source:a,wheelMode:s}),T(s?"Mouse wheel mode.":"Trackpad pan mode.")},[Ie,T]),tr=g.useCallback((a="keyboard")=>{const i=(j.current.settings.cursorDirection==="down"?"down":"right")==="down"?"right":"down";Ie({cursorDirection:i},`${a}.cursorDirection.toggle`),f.emit("canvas.cursorDirection.toggle",{source:a,cursorDirection:i}),T(i==="down"?"Cursor direction down.":"Cursor direction right.")},[Ie,T]),Go=g.useCallback(async(a,s="api")=>{const i=a===!0;try{if(i){if(document.fullscreenElement)return ga(!0),f.emit("canvas.fullscreen.toggle",{source:s,active:!0,fallback:!1}),!0;if(document.documentElement.requestFullscreen){await document.documentElement.requestFullscreen();const l=!!document.fullscreenElement;return ga(l),f.emit("canvas.fullscreen.toggle",{source:s,active:l,fallback:!1}),l}return ga(!0),f.emit("canvas.fullscreen.toggle",{source:s,active:!0,fallback:!0}),!0}return document.fullscreenElement&&document.exitFullscreen&&await document.exitFullscreen(),ga(!1),f.emit("canvas.fullscreen.toggle",{source:s,active:!1,fallback:!1}),!1}catch(l){return ga(i),f.emit("canvas.fullscreen.toggle.failed",{source:s,active:i,fallback:!0,error:l instanceof Error?l.message:String(l)}),f.emit("canvas.fullscreen.toggle",{source:s,active:i,fallback:!0}),T(i?"Read mode fallback.":"Read mode off."),i}},[ga,T]),to=g.useCallback((a="keyboard")=>Go(!Vs.current,a),[Go]);g.useEffect(()=>{const a=window,s={getMindCanvasFullscreenState:a.getMindCanvasFullscreenState,setMindCanvasFullscreen:a.setMindCanvasFullscreen,getMindCanvasReadModeState:a.getMindCanvasReadModeState,setMindCanvasReadMode:a.setMindCanvasReadMode,toggleMindCanvasReadMode:a.toggleMindCanvasReadMode},i=()=>Vs.current,l=h=>Go(h,"api"),u=()=>to("api");return a.getMindCanvasFullscreenState=i,a.setMindCanvasFullscreen=l,a.getMindCanvasReadModeState=i,a.setMindCanvasReadMode=l,a.toggleMindCanvasReadMode=u,_o(!0),f.emit("canvas.readMode.api.bound"),()=>{_o(!1),s.getMindCanvasFullscreenState?a.getMindCanvasFullscreenState=s.getMindCanvasFullscreenState:delete a.getMindCanvasFullscreenState,s.setMindCanvasFullscreen?a.setMindCanvasFullscreen=s.setMindCanvasFullscreen:delete a.setMindCanvasFullscreen,s.getMindCanvasReadModeState?a.getMindCanvasReadModeState=s.getMindCanvasReadModeState:delete a.getMindCanvasReadModeState,s.setMindCanvasReadMode?a.setMindCanvasReadMode=s.setMindCanvasReadMode:delete a.setMindCanvasReadMode,s.toggleMindCanvasReadMode?a.toggleMindCanvasReadMode=s.toggleMindCanvasReadMode:delete a.toggleMindCanvasReadMode,f.emit("canvas.readMode.api.unbound")}},[Go,to]);const nm=g.useCallback(()=>{const a=j.current.settings.cameraBookmarks??{},s=Tr.find(i=>!a[i])??Tr[0];Da(s)},[Da]),om=g.useCallback(a=>{Br(j.current.settings.gridType)!==a&&Ie({gridType:a},`canvas.gridMode.${a}`)},[Ie]),sm=g.useCallback(()=>{Ie({gridSnap:!(j.current.settings.gridSnap??!0)},"canvas.gridSnap.toggle")},[Ie]),rm=g.useCallback(a=>{const s=j.current.nodes.find(i=>i.id===a);!s||s.kind!=="directory"||(ra(a),f.emit("node.directorySettings.open",{id:a}))},[]),im=g.useCallback(()=>{ra(a=>(a&&f.emit("node.directorySettings.close",{id:a}),null))},[]),lm=g.useCallback((a,s)=>{const i=j.current.nodes.find(h=>h.id===a);if(!i||i.kind!=="directory")return;const l=Tn(s.DirectoryPath),u={...i.metadata??{},DirectoryPath:l,Include:s.Include??"",Exclude:s.Exclude??""};ee(a,{sourceFilePath:l||oi,metadata:u}),ra(null),f.emit("node.directorySettings.patch",{id:a,keys:["DirectoryPath","Include","Exclude"]}),T("Folder scan settings saved.")},[ee,T]),dm=g.useCallback(async a=>{const s=j.current.nodes.find(u=>u.id===a);if(!s||s.kind!=="directory")return;const i=ub(s);if(f.emit("node.directory.scan.requested",{id:a,hasBridgePath:!!i,hasHandle:Ma.current.has(a)}),i){if(!et()){be("blocked"),f.emit("node.directory.scan.bridge.blocked",{id:a,reason:"hosted-access-off"}),T("Hosted LocalBridge access is off.");return}try{const u=await qt();if(ve(u.status??null),be(u.state),u.state!=="connected"){f.emit("node.directory.scan.bridge.unavailable",{id:a,message:u.message||"LocalBridge is unavailable."}),T(u.message||"LocalBridge is unavailable.");return}const h=Ua(u.status);if(!h){be("unavailable"),f.emit("node.directory.scan.bridge.failed",{id:a,reason:"missing-token"}),T("LocalBridge read token is unavailable.");return}const C=ys(i,48);T(`Scanning ${C}...`),f.emit("node.directory.scan.bridge.requested",{id:a,path:i});const k=await pb(i,s.metadata,h,u.baseUrl),I=new Date().toISOString();ee(a,{title:s.title==="Directory"||s.title==="New Folder"?C:s.title,body:Rd(C,k),sourceFilePath:i,metadata:{...s.metadata??{},DirectoryPath:i,DirectoryName:C,DirectoryScanSource:"localbridge",DirectoryFileCount:String(k.fileCount),DirectoryDirCount:String(k.directoryCount),DirectoryLastScanUtc:I,DirectoryScanTruncated:String(k.truncated),DirectoryPreview:JSON.stringify(k.preview.slice(0,Mn))}}),f.emit("node.directory.scan.bridge.completed",{id:a,path:i,fileCount:k.fileCount,directoryCount:k.directoryCount,truncated:k.truncated}),f.emit("node.directory.scan.completed",{id:a,source:"localbridge",directoryName:C,fileCount:k.fileCount,directoryCount:k.directoryCount,truncated:k.truncated}),T(`Scanned ${C}: ${k.fileCount} files, ${k.directoryCount} folders.`)}catch(u){const h=u instanceof Error?u.message:String(u);f.emit("node.directory.scan.bridge.failed",{id:a,message:h}),f.emit("node.directory.scan.failed",{id:a,source:"localbridge",message:h}),T("LocalBridge folder scan failed.")}return}const l=window;if(!l.showDirectoryPicker){f.emit("node.directory.scan.unsupported",{id:a}),T("Folder scan needs a Chromium browser with File System Access enabled.");return}try{let u=Ma.current.get(a);u||(u=await l.showDirectoryPicker(),Ma.current.set(a,u));const h={mode:"read"},C=u.queryPermission?await u.queryPermission(h):"granted";if((C==="granted"||!u.requestPermission?C:await u.requestPermission(h))!=="granted"){f.emit("node.directory.scan.denied",{id:a,directoryName:u.name}),T("Folder permission was not granted.");return}T(`Scanning ${u.name}...`);const I=await db(u,s.metadata),w=new Date().toISOString();ee(a,{title:s.title==="Directory"||s.title==="New Folder"?u.name:s.title,body:Rd(u.name,I),sourceFilePath:u.name,metadata:{...s.metadata??{},DirectoryName:u.name,DirectoryScanSource:"browser-picker",DirectoryFileCount:String(I.fileCount),DirectoryDirCount:String(I.directoryCount),DirectoryLastScanUtc:w,DirectoryScanTruncated:String(I.truncated),DirectoryPreview:JSON.stringify(I.preview.slice(0,Mn))}}),f.emit("node.directory.scan.completed",{id:a,source:"browser-picker",directoryName:u.name,fileCount:I.fileCount,directoryCount:I.directoryCount,truncated:I.truncated}),T(`Scanned ${u.name}: ${I.fileCount} files, ${I.directoryCount} folders.`)}catch(u){if((u&&typeof u=="object"&&"name"in u?String(u.name):"")==="AbortError"){f.emit("node.directory.scan.cancelled",{id:a}),T("Folder scan cancelled.");return}f.emit("node.directory.scan.failed",{id:a,message:u instanceof Error?u.message:String(u)}),T("Folder scan failed in this browser context.")}},[ee,T]),Yi=g.useCallback(a=>{$n(a.id),aa(tt(a.name))},[]),ar=g.useCallback(()=>{$n(null),aa("")},[]),nr=g.useCallback(a=>{const s=tt(tn).slice(0,90);a===j.current.id?(Xs(s),T("Board renamed.")):op(a,s)?(Oe(Ct()),T("Saved board renamed.")):(f.emit("board.rename.failed",{boardId:a,scope:"stored"}),T("Board rename failed.")),$n(null),aa("")},[Xs,T,tn]),cm=g.useCallback((a,s)=>{s.key==="Enter"?(s.preventDefault(),nr(a)):s.key==="Escape"&&(s.preventDefault(),ar())},[ar,nr]),um=g.useCallback(a=>{const s=j.current.nodes.find(l=>l.id===a);if(!yo(s))return;const i=s.aiEnabled===!1;ee(a,{aiEnabled:i}),f.emit("node.aiReference.toggled",{id:a,enabled:i}),T(i?"AI reference enabled.":"AI reference disabled.")},[ee,T]),Ko=g.useCallback(async(a,s,i,l,u)=>{Yt.current=a;try{const h=await ko(a);return ma.current=0,f.emit(s,{...i,ok:!0,method:h}),T(l),h}catch(h){return ma.current=Date.now()+15e3,f.emit(s,{...i,ok:!0,method:"react-local",clipboardUnavailable:!0,message:h instanceof Error?h.message:String(h)}),T(u),"react-local"}},[T]),mm=g.useCallback(async a=>{const s=j.current.nodes.find(l=>l.id===a);if(!s)return;const i=Nb(s);if(i)try{const l=await Ab(i);f.emit("node.copyImage",{id:a,ok:!0,mode:l,urlKind:i.split(":",1)[0]||"relative"}),T(l==="image"?"Image copied to clipboard.":"Image reference copied.");return}catch(l){Yt.current=i,ma.current=Date.now()+15e3,f.emit("node.copyImage",{id:a,ok:!0,mode:"react-local",urlKind:i.split(":",1)[0]||"relative",clipboardUnavailable:!0,message:l instanceof Error?l.message:String(l)}),T("Image reference copied inside this canvas.");return}await Ko(Ib(s),"node.copy",{id:a},"Node content copied.","Node content copied inside this canvas.")},[Ko,T]),pm=g.useCallback(async(a,s)=>{await Ko(s,"node.embed.copyUrl",{id:a,sourceKind:s.split(":",1)[0]||"relative"},"Embed URL copied.","Embed URL copied inside this canvas.")},[Ko]),gm=g.useCallback(a=>{const s=j.current.nodes.find(l=>l.id===a);if(!yo(s))return;const i=_r(s);ee(a,{height:i}),f.emit("node.fitHeight",{id:a,height:i}),T("Node height fitted to text.")},[ee,T]),hm=g.useCallback(a=>{const s=j.current.nodes.find(C=>C.id===a);if(!yo(s))return;const i=Sb(s),l=i?Math.max(120,Math.round(s.originalHeight||_r(s))):Math.max(120,Math.min(s.height,eb)),u=i?0:Math.round(s.height),h=i;F(C=>({...C,nodes:C.nodes.map(k=>k.id===a?{...k,height:l,isExpanded:h,originalHeight:u}:k)}),"node.expandCollapse",{id:a,expanded:h,height:l,originalHeight:u}),T(h?"Node expanded.":"Node collapsed.")},[F,T]),fm=g.useCallback(a=>{const s=j.current.nodes.find(l=>l.id===a);if(!s||s.kind!=="code")return;const i=s.wordWrap===!1;ee(a,{wordWrap:i}),f.emit("node.wordWrap.toggled",{id:a,enabled:i}),T(i?"Word wrap enabled.":"Word wrap disabled.")},[ee,T]),bm=g.useCallback((a,s)=>{const i=j.current.nodes.find(h=>h.id===a);if(!yo(i))return;const l=Cb(s.executionMode),u=Array.from(new Set([...i.tags??[],"Company root",l,s.enableSubAgents?"sub-agents":"single-agent","adapter-gated"]));ee(a,{companyMode:"candidate",role:"Company root",tags:u,metadata:{...i.metadata??{},CompanyExecutionMode:s.executionMode,CompanyExecutionModeLabel:l,CompanySubAgents:String(s.enableSubAgents),CompanyStatus:"Staged",CompanyRootTitle:i.title,CompanyLastMessage:"Company staged locally. External CompanyCore execution requires an adapter.",CompanyStagedAt:new Date().toISOString()}}),f.emit("node.company.staged",{id:a,executionMode:s.executionMode,enableSubAgents:s.enableSubAgents}),T(`Company root staged locally as ${l}. Open CompanyCore to run it with an adapter later.`)},[ee,T]),ym=g.useCallback(a=>{var i;const s=j.current.nodes.find(l=>l.id===a);if(!(s!=null&&s.companyMode)){T("Stage this node as a Company root first.");return}sa(a),f.emit("companyGraph.open",{id:a,status:((i=s.metadata)==null?void 0:i.CompanyStatus)??"Staged"})},[T]),xm=g.useCallback(a=>{const s=j.current.nodes.find(i=>i.id===a);s!=null&&s.companyMode&&(ee(a,{metadata:{...s.metadata??{},CompanyRootTitle:s.title,CompanyGoalSnapshot:s.body.slice(0,4e3),CompanyLastMessage:"Company goal synced from this note locally. External execution remains adapter-gated.",CompanyUpdatedAt:new Date().toISOString()}}),f.emit("node.company.goalSynced",{id:a,titleLength:s.title.length,bodyLength:s.body.length}),T("Company goal synced from this note locally."))},[ee,T]),Cm=g.useCallback(a=>{var l;const s=j.current.nodes.find(u=>u.id===a);if(!(s!=null&&s.companyMode))return;const i=((l=s.metadata)==null?void 0:l.CompanyStatus)||"Staged";ee(a,{metadata:{...s.metadata??{},CompanyStatus:i,CompanyLastMessage:`Company status refreshed locally as ${i.toLowerCase()}. Adapter execution remains gated.`,CompanyRefreshedAt:new Date().toISOString()}}),f.emit("node.company.refreshed",{id:a,status:i}),T(`Company status refreshed locally: ${i}.`)},[ee,T]),km=g.useCallback(()=>{sa(a=>(a&&f.emit("companyGraph.close",{id:a}),null))},[]),Gi=g.useCallback((a,s)=>{const i=j.current.nodes.find(l=>l.id===a);i!=null&&i.companyMode&&(ee(a,{metadata:{...i.metadata??{},CompanyStatus:s,CompanyLastMessage:`Company marked ${s.toLowerCase()} locally. External execution remains adapter-gated.`,CompanyUpdatedAt:new Date().toISOString()}}),f.emit("companyGraph.status",{id:a,status:s}),T(`Company marked ${s.toLowerCase()} locally.`))},[ee,T]),Ki=g.useCallback(a=>{var l;const s=j.current.nodes.find(u=>u.id===a);if(!(s!=null&&s.companyMode))return;const i=new Set(["Company root","adapter-gated","sub-agents","single-agent",((l=s.metadata)==null?void 0:l.CompanyExecutionModeLabel)??""]);ee(a,{companyMode:void 0,role:void 0,tags:(s.tags??[]).filter(u=>!i.has(u)),metadata:{...s.metadata??{},CompanyStatus:"Removed",CompanyLastMessage:"Company staging removed locally.",CompanyRemovedAt:new Date().toISOString()}}),sa(null),f.emit("companyGraph.remove",{id:a}),T("Company staging removed from this node.")},[ee,T]),wm=g.useCallback((a,s)=>{const i=j.current.nodes.find(l=>l.id===a);i!=null&&i.companyMode&&(ee(a,{metadata:{...i.metadata??{},CompanyApprovalStatus:s,CompanyLastMessage:s==="Approved"?"Company work approved locally. Adapter execution is still gated.":"Company work rejected locally.",CompanyUpdatedAt:new Date().toISOString()}}),f.emit("companyGraph.approval",{id:a,status:s}),T(`Company approval ${s.toLowerCase()} locally.`))},[ee,T]),Sm=g.useCallback((a,s)=>{const i=s.trim();if(!i)return;const l=X("node"),u=X("edge");F(h=>{var I,w;const C=h.nodes.find(N=>N.id===a);if(!C)return h;const k={id:l,kind:"ai-task",title:"Company follow-up task",body:i,x:C.x+C.width+120,y:C.y+52,width:350,height:190,status:"idle",tags:["Company follow-up",((I=C.metadata)==null?void 0:I.CompanyExecutionModeLabel)??"Company"],metadata:{CompanyRootNodeId:C.id,CompanyExecutionMode:((w=C.metadata)==null?void 0:w.CompanyExecutionMode)??"Auto",CompanyTaskStatus:"Staged",CompanyStagedAt:new Date().toISOString()}};return{...h,nodes:[...h.nodes,k],edges:[...h.edges,{id:u,from:C.id,to:l,kind:"context"}]}},"companyGraph.followUp.staged",{rootId:a,taskId:l,chars:i.length}),y([l]),H(l),window.setTimeout(()=>H(h=>h===l?null:h),1400),T("Company follow-up task staged locally.")},[F,T]),vm=g.useCallback((a,s)=>{const i=X("node"),l=X("edge");F(u=>{const h=u.nodes.find(k=>k.id===a);if(!h)return u;const C={id:i,kind:"note",title:`Artifact: ${s.title}`.slice(0,90),body:s.content,x:h.x+h.width+120,y:h.y+290,width:360,height:220,tags:["Company artifact",s.type],metadata:{CompanyRootNodeId:h.id,CompanyArtifactType:s.type,CompanyArtifactSourceNodeId:s.sourceNodeId,CompanyAddedAt:new Date().toISOString()}};return{...u,nodes:[...u.nodes,C],edges:[...u.edges,{id:l,from:h.id,to:i,kind:"result"}]}},"companyGraph.artifact.added",{rootId:a,artifactNodeId:i,artifactType:s.type}),y([i]),H(i),window.setTimeout(()=>H(u=>u===i?null:u),1400),T("Company artifact added to the canvas.")},[F,T]),jm=g.useCallback((a,s="preview")=>{const i=vb(a);if(!i){T("No asset URL is available for this node."),f.emit("node.asset.open.failed",{id:a.id,kind:a.kind,reason:"missing-url"});return}if(a.kind==="pdf"&&s!=="external"){jt({url:i,fileName:jb(a)}),f.emit("node.pdf.preview.open",{id:a.id,urlKind:i.startsWith("http")?"url":"path"});return}if(a.kind==="embed"&&!Rn(i)){T("This embed URL is blocked for safety."),f.emit("node.asset.open.failed",{id:a.id,kind:a.kind,reason:"unsafe-url"});return}window.open(i,"_blank","noopener,noreferrer"),f.emit("node.asset.open",{id:a.id,kind:a.kind,mode:s})},[T]),Im=g.useCallback(a=>{const s=K.current;F(i=>({...i,nodes:i.nodes.filter(l=>l.id!==a),edges:i.edges.filter(l=>l.from!==a&&l.to!==a)}),"node.delete",{id:a}),y(i=>{const l=i.filter(u=>u!==a);return f.emit("selection.repaired",{reason:"delete-node",beforeCount:s.length,afterCount:l.length,removedCount:i.length-l.length}),l}),te(i=>i===a?null:i)},[F]),or=g.useCallback(a=>{const s=Array.from(new Set(K.current));if(s.length===0)return;const i=new Set(s);F(l=>({...l,nodes:l.nodes.filter(u=>!i.has(u.id)),edges:l.edges.filter(u=>!i.has(u.from)&&!i.has(u.to))}),"node.delete",{ids:s,count:s.length,source:a}),y([]),f.emit("selection.repaired",{reason:"delete-selected",source:a,beforeCount:s.length,afterCount:0,removedCount:s.length}),te(l=>l&&i.has(l)?null:l),sa(l=>l&&i.has(l)?null:l),ra(l=>l&&i.has(l)?null:l),T(`Deleted ${s.length} selected node${s.length===1?"":"s"}.`)},[F,T]),Xo=g.useCallback((a,s)=>{var E;const i=Array.from(new Set(a));if(i.length===0)return;const l=j.current,u=new Set(i),h=l.nodes.filter(M=>u.has(M.id));if(h.length===0)return;const C=h.filter(Ya),k=h.filter(M=>!Ya(M));if(C.length>0&&f.emit("remoteMonitor.node.duplicateIgnored",{action:"duplicate",source:s,skippedCount:C.length,nodeId:(E=C[0])==null?void 0:E.id}),k.length===0){const M=C[0]??l.nodes.find(Ya);M&&(y([M.id]),H(M.id),window.setTimeout(()=>H(A=>A===M.id?null:A),1e3)),T("Remote monitor is single-instance per board. Focused existing monitor.");return}const I=new Map(k.map(M=>[M.id,X("node")])),w=k.map(M=>({...M,id:I.get(M.id),x:M.x+50,y:M.y-50,status:M.status==="running"?"idle":M.status,metadata:M.metadata?{...M.metadata}:void 0,tags:M.tags?[...M.tags]:void 0,imageStack:li(M.imageStack,M.id,I.get(M.id))})),N=l.edges.filter(M=>I.has(M.from)&&I.has(M.to)).map(M=>({...M,id:X("edge"),from:I.get(M.from),to:I.get(M.to)}));F(M=>({...M,nodes:[...M.nodes,...w],edges:[...M.edges,...N]}),"node.duplicate",{source:s,count:w.length,edgeCount:N.length,sourceIds:i,duplicateIds:w.map(M=>M.id),skippedRemoteMonitorCount:C.length});const R=w.map(M=>M.id);y(R),H(R[0]??null),window.setTimeout(()=>H(M=>M===R[0]?null:M),1e3),T(C.length>0?`Duplicated ${w.length} node${w.length===1?"":"s"}; remote monitor stays single-instance.`:`Duplicated ${w.length} node${w.length===1?"":"s"}.`)},[F,T]),sr=g.useCallback(a=>{Xo(K.current,a)},[Xo]),ao=g.useCallback((a,s)=>{const i=Array.from(new Set(K.current));if(i.length===0)return;const l=new Set(i),u=j.current.nodes,h=u.filter(w=>l.has(w.id));if(h.length===0)return;const C=u.filter(w=>!l.has(w.id)),k=a==="front"?[...C,...h]:[...h,...C];if(!k.some((w,N)=>{var R;return w.id!==((R=u[N])==null?void 0:R.id)})){T(a==="front"?"Selected nodes are already in front.":"Selected nodes are already in back."),f.emit("node.layerOrder.noop",{direction:a,source:s,count:h.length,ids:i});return}F(w=>({...w,nodes:k}),"node.layerOrder",{direction:a,source:s,count:h.length,ids:i}),T(a==="front"?`Brought ${i.length} selected node${i.length===1?"":"s"} to front.`:`Sent ${i.length} selected node${i.length===1?"":"s"} to back.`)},[F,T]),rr=g.useCallback(async()=>{const a=new Set(K.current),s=j.current.nodes.filter(u=>a.has(u.id));if(s.length===0)return;const i=j.current.edges.filter(u=>a.has(u.from)&&a.has(u.to)),l=Db(s,i);lt.current=l;try{const u=await ko(JSON.stringify(l));Vt.current=0,f.emit("multiSelection.copy",{count:s.length,edgeCount:i.length,ok:!0,method:u}),T(`Copied ${s.length} selected node${s.length===1?"":"s"} for canvas paste.`)}catch(u){Vt.current=Date.now()+15e3,f.emit("multiSelection.copy",{count:s.length,edgeCount:i.length,ok:!0,method:"react-local",clipboardUnavailable:!0,message:u instanceof Error?u.message:String(u)}),T(`Copied ${s.length} selected node${s.length===1?"":"s"} inside this canvas.`)}},[T]),Oa=g.useCallback((a,s,i)=>{const l=j.current.nodes.find(Ya),u=[],h=[];let C=!!l;for(const L of a.nodes){if(Ya(L)){if(C){u.push(L);continue}C=!0}h.push(L)}if(u.length>0&&f.emit("remoteMonitor.node.duplicateIgnored",{action:i,skippedCount:u.length,nodeId:l==null?void 0:l.id}),h.length===0){l&&(y([l.id]),H(l.id),window.setTimeout(()=>H(L=>L===l.id?null:L),1e3)),T("Remote monitor is single-instance per board. Focused existing monitor.");return}const k=As(h);if(!k)return;const I=new Map(h.map(L=>[L.id,X("node")])),w=s.x-k.minX,N=s.y-k.minY,R=h.map(L=>({...L,id:I.get(L.id),x:L.x+w,y:L.y+N,status:L.status==="running"?"idle":L.status,tags:L.tags?[...L.tags]:void 0,metadata:L.metadata?{...L.metadata}:void 0,imageStack:li(L.imageStack,L.id,I.get(L.id))})),E=a.edges.filter(L=>I.has(L.from)&&I.has(L.to)).map(L=>({...L,id:X("edge"),from:I.get(L.from),to:I.get(L.to)})),M=R.map(L=>L.id);F(L=>({...L,nodes:[...L.nodes,...R],edges:[...L.edges,...E]}),"clipboard.nodes.paste",{source:i,count:R.length,edgeCount:E.length,originX:Math.round(s.x),originY:Math.round(s.y),skippedRemoteMonitorCount:u.length}),y(M),te(null),H(M[0]??null);const A=R[R.length-1];A&&xe(A,`clipboard.nodes.${i}`),window.setTimeout(()=>H(L=>L===M[0]?null:L),1200),T(u.length>0?`Pasted ${R.length} canvas node${R.length===1?"":"s"}; remote monitor stays single-instance.`:`Pasted ${R.length} canvas node${R.length===1?"":"s"}.`)},[F,xe,T]),no=g.useCallback((a,s,i)=>{const l=a.trim();if(!l)return;const u=$d(l,s,`${i}-url`),h=u??zd(l,s,i);F(C=>({...C,nodes:[...C.nodes,h]}),u?"clipboard.url.paste":"clipboard.text.paste",{source:i,id:h.id,kind:h.kind,chars:l.length}),y([h.id]),te(null),H(h.id),xe(h,`clipboard.${i}.${h.kind}`),window.setTimeout(()=>H(C=>C===h.id?null:C),1200),T(`${i==="drop"?"Dropped":"Pasted"} ${h.kind==="file"?"URL reference":h.kind} node.`)},[F,xe,T]),qo=g.useCallback(async(a,s,i)=>{const l=a.filter(h=>h.name||h.size>0);if(l.length===0)return;const u=j.current.id;try{const h=[];let C=s.x;for(const w of l){const N=await ay(w,{x:C,y:s.y},i);h.push(N),C+=N.width+hs}if(j.current.id!==u){f.emit("async.staleIgnored",{path:"canvas.fileIngest",source:i,boardId:u,currentBoardId:j.current.id,count:l.length});return}const k=h.map(w=>w.id);F(w=>({...w,nodes:[...w.nodes,...h]}),"canvas.files.ingested",{source:i,count:h.length,kinds:h.map(w=>w.kind)}),y(k),te(null),H(k[0]??null);const I=h[h.length-1];I&&xe(I,`canvas.files.${i}`),window.setTimeout(()=>H(w=>w===k[0]?null:w),1200),T(`${i==="drop"?"Dropped":"Pasted"} ${h.length} file node${h.length===1?"":"s"} locally.`)}catch(h){f.emit("canvas.files.ingestFailed",{source:i,message:h instanceof Error?h.message:String(h)}),T("File ingest failed in this browser context.")}},[F,xe,T]);g.useEffect(()=>{const a=s=>{if(s.defaultPrevented||rc(s.target))return;const i=s.clipboardData;if(!i)return;const l=Se(),u=Gd(i.files,i.items);if(u.length>0){s.preventDefault(),qo(u,l,"paste");return}const h=Vt.current>Date.now()?lt.current:null;if(h){s.preventDefault(),Oa(h,l,"paste"),f.emit("clipboard.nodes.pasteLocalFallback",{count:h.nodes.length});return}const C=ma.current>Date.now()?Yt.current:null;if(C){s.preventDefault(),no(C,l,"paste"),f.emit("clipboard.text.pasteLocalFallback",{chars:C.length}),ma.current=0;return}const k=i.getData("text/plain"),I=Fd(k);if(I){s.preventDefault(),Oa(I,l,"paste");return}const w=k.trim()?k:Ud(i.getData("text/html"));w.trim()&&(s.preventDefault(),no(w,l,"paste"))};return document.addEventListener("paste",a),()=>document.removeEventListener("paste",a)},[Se,qo,no,Oa]);const Nm=g.useCallback(a=>{Ns(a.target)||!Array.from(a.dataTransfer.types??[]).some(i=>["Files","text/plain","text/uri-list","text/html"].includes(i))||(a.preventDefault(),a.dataTransfer.dropEffect="copy")},[]),Am=g.useCallback(a=>{if(Ns(a.target))return;const s=Gd(a.dataTransfer.files,a.dataTransfer.items),i=a.dataTransfer.getData("text/uri-list"),l=a.dataTransfer.getData("text/plain"),u=Ud(a.dataTransfer.getData("text/html")),h=Se(a.clientX,a.clientY);if(s.length>0){a.preventDefault(),qo(s,h,"drop");return}const C=(i||l||u).trim(),k=Fd(l);if(k){a.preventDefault(),Oa(k,h,"drop");return}C&&(a.preventDefault(),no(C,h,"drop"))},[Se,qo,no,Oa]),Mm=g.useCallback(()=>{const a=new Set(K.current),s=new Set(j.current.nodes.filter(i=>a.has(i.id)&&yo(i)).map(i=>i.id));if(s.size===0){T("No text nodes in this selection.");return}F(i=>({...i,nodes:i.nodes.map(l=>s.has(l.id)?{...l,height:_r(l)}:l)}),"multiSelection.fitHeight",{count:s.size}),f.emit("multiSelection.fitHeight",{count:s.size}),T(`Fitted ${s.size} text node${s.size===1?"":"s"}.`)},[F,T]),ir=g.useCallback(a=>{const s=new Set(K.current),i=j.current.nodes.filter(E=>s.has(E.id)).sort((E,M)=>K.current.indexOf(E.id)-K.current.indexOf(M.id));if(i.length<2)return;const l=As(i);if(!l)return;const u=a==="tidy"?ry(i):i,h=28,C=Math.max(...u.map(E=>E.width)),k=Math.max(...u.map(E=>E.height)),I=u.map((E,M)=>({id:E.id,x:E.x,y:E.y,width:E.width,height:E.height,selectionIndex:M})),w=j.current.settings.gridSnap??!0;let N;a==="grid"?N={mode:"grid",order:"selectionOrder",columns:Math.max(2,Math.ceil(Math.sqrt(u.length))),cellWidth:C,cellHeight:k,gapX:h,gapY:h,sizeMode:"preserve",snapToGrid:w,gridSize:Qt}:a==="strip"?N={mode:"stripHorizontal",order:"selectionOrder",targetHeight:k,gapX:h,sizeMode:"preserve",snapToGrid:w,gridSize:Qt}:N={mode:"masonry",order:"spatialReading",anchor:"selectionBoundsTopLeft",maxColumns:12,gapX:24,gapY:24,quantile:.75,sizeMode:"preserve",snapToGrid:w,gridSize:Qt};const R=ch(I,N,l);F(E=>({...E,nodes:E.nodes.map(M=>{const A=R.after.get(M.id);return A?{...M,x:A.x,y:A.y,width:A.width,height:A.height}:M})}),"multiSelection.arrange",{mode:a,count:i.length,layoutMode:N.mode,snapToGrid:w}),f.emit("multiSelection.arrange",{mode:a,count:i.length,layoutMode:N.mode,snapToGrid:w,boundsAfter:R.boundsAfter}),T(a==="tidy"?`Tidied ${i.length} selected nodes.`:`Arranged ${i.length} selected nodes as ${a}.`)},[F,T]),Tm=g.useCallback(()=>{const a=Array.from(new Set(K.current)),s=j.current,i=new Map(s.nodes.map(A=>[A.id,A])),l=a.map(A=>i.get(A)).filter(A=>!!(A&&A.kind==="image"&&So(A).length>0));if(l.length<2){T("Select at least two image nodes to stack."),f.emit("multiSelection.mergeImageStacks.skipped",{reason:"not-enough-image-nodes",selectedCount:a.length});return}const u=l[0],h=l.slice(1),C=new Date().toISOString(),k=new Set,I=So(u),w=[];for(const A of I)w.push(Bd(A,u,k,C));for(const A of h)for(const L of So(A))w.push(Bd(L,A,k,C));if(w.length<2){T("No stackable image variants found."),f.emit("multiSelection.mergeImageStacks.skipped",{reason:"not-enough-variants",selectedCount:a.length});return}const N=w.some(A=>{var L;return A.variantId===((L=u.imageStack)==null?void 0:L.activeVariantId)})?u.imageStack.activeVariantId:w[0].variantId,R=w.find(A=>A.variantId===N)??w[0],E=h.map(A=>A.id),M=new Set(E);F(A=>({...A,nodes:A.nodes.filter(L=>!M.has(L.id)).map(L=>{var J;return L.id===u.id?{...L,kind:"image",imageUrl:R.imageUrl,imageStack:{activeVariantId:N,variants:w,kind:"pile",title:((J=L.imageStack)==null?void 0:J.title)||L.title,updatedAtUtc:C},metadata:{...L.metadata??{},ImageStackKind:"pile",ImageStackPrimaryNodeId:u.id,ImageStackVariantCount:String(w.length),ImageStackMergedAtUtc:C,ImageStackRemovedNodeIds:E.join(","),ImageStackActiveVariantId:N},tags:Array.from(new Set([...L.tags??["image"],"Stack"])).slice(0,4)}:L}),edges:A.edges.filter(L=>!M.has(L.from)&&!M.has(L.to))}),"multiSelection.mergeImageStacks",{primaryNodeId:u.id,removedNodeIds:E,addedVariants:w.length-I.length,variantCount:w.length}),y([u.id]),te(A=>A&&M.has(A)?null:A),sa(A=>A&&M.has(A)?null:A),ra(A=>A&&M.has(A)?null:A),H(u.id),window.setTimeout(()=>H(A=>A===u.id?null:A),1200),T(`Stacked ${l.length} image nodes into ${w.length} variants.`)},[F,T]),Rm=g.useCallback(a=>{const s=K.current.includes(a)?K.current:[a];Xo(s,"node-action")},[Xo]),ha=g.useCallback(async(a,s)=>{const i=Jn.current.isBusy(a);return i&&f.emit("automation.run.queued",{id:a,key:a}),Jn.current.enqueue(a,async()=>{var N,R,E;const l=j.current.nodes.find(M=>M.id===a);if(!l||l.kind!=="ai-task")return;f.emit("automation.run.dequeued",{id:a,key:a,queuedBehindRunning:i});const u=(un.current.get(a)??0)+1;un.current.set(a,u);const h=Pa.current,C=(s==null?void 0:s.trim())||l.body,k=Ti(Mi(l));ee(a,{status:"running",body:C,...kn(l)?{metadata:xo(l,{instruction:C,runState:"running",status:"running",statusLabel:"Running",sourceMode:k?"media-prompt-only":"ai-task"})}:{}}),f.emit("automation.run",{id:a,mode:"single",seq:u,automationKind:k==null?void 0:k.kind});const I=()=>un.current.get(a)===u&&Pa.current===h,w=M=>{if(!I()){f.emit("async.staleIgnored",{path:"automation.run",id:a,seq:u});return}f.emit("localBridge.codex.fallback",{id:a,reason:M});const A=fy(C,l);ee(a,{status:"done",result:A,...kn(l)?{metadata:xo(l,{instruction:C,output:A,runState:"completed",status:k?"prepared":"done",statusLabel:k?"Spec only":"Done",sourceMode:k?"media-prompt-only":"local-draft",error:k?`External ${k.mode.toLowerCase()} generation was not executed.`:"",fallback:!0,partial:!!k,toolsUsed:k?`${k.toolHint}, Deterministic.Fallback, HumanReview.Gate`:"Deterministic.Fallback",toolWarnings:k?`External ${k.mode.toLowerCase()} generator was not invoked; this run prepared a spec only.`:""})}:{}}),te(a)};if(!et()){w("hosted-access-gated");return}try{const M=await qt();if(!I()){f.emit("async.staleIgnored",{path:"automation.run",id:a,seq:u});return}if(be(M.state),ve(M.status??null),M.state!=="connected"){ye(M.message||"LocalBridge is unavailable."),w(M.message||"LocalBridge unavailable");return}const A=Ua(M.status);if(!A){w("LocalBridge token unavailable");return}const L=ec(j.current,l,C);f.emit("localBridge.codex.run",{id:a,boardId:j.current.id});const J=await zl({instruction:L,workingDirectory:((R=(N=M.status)==null?void 0:N.project)==null?void 0:R.rootPath)||((E=M.status)==null?void 0:E.workspace)||void 0,sandbox:"read_only",model:Zt(j.current.settings.model),reasoningEffort:Zd(j.current.settings.effort),approvalPolicy:"on-request",intent:"mindcanvas-ai-task",nodeKind:l.kind,webSearchMode:"disabled",networkAccessEnabled:!1},A,M.baseUrl);if(!I()){f.emit("async.staleIgnored",{path:"automation.run",id:a,seq:u});return}if(!J.success||!J.finalResponse){const ke=J.error||"LocalBridge Codex returned no response.";f.emit("localBridge.codex.failed",{id:a,message:ke,status:J.status}),ee(a,{status:"blocked",result:ke,...kn(l)?{metadata:xo(l,{instruction:C,output:ke,runState:"blocked",status:"blocked",statusLabel:"Blocked",sourceMode:k?"media-prompt-only":"ai-task",error:ke,fallback:!1,partial:!0})}:{}}),te(a);return}ee(a,{status:"done",result:J.finalResponse,...kn(l)?{metadata:xo(l,{instruction:C,output:J.finalResponse,runState:"completed",status:k?"prepared":"done",statusLabel:k?"Spec only":"Done",sourceMode:k?"media-prompt-only":"ai-generated",error:k?`External ${k.mode.toLowerCase()} generation was not executed.`:"",fallback:!1,partial:!!k,toolsUsed:k?`AI.LLM, ${k.toolHint}, HumanReview.Gate`:"AI.LLM",toolWarnings:k?`External ${k.mode.toLowerCase()} generator was not invoked; this run prepared a spec only.`:""})}:{}}),f.emit("localBridge.codex.completed",{id:a,providerKind:J.providerKind,threadId:J.threadId,turnId:J.turnId}),te(a)}catch(M){if(!I()){f.emit("async.staleIgnored",{path:"automation.run",id:a,seq:u});return}const A=M instanceof Error?M.message:String(M);f.emit("localBridge.codex.failed",{id:a,message:A}),ee(a,{status:"blocked",result:A,...kn(l)?{metadata:xo(l,{instruction:C,output:A,runState:"blocked",status:"blocked",statusLabel:"Blocked",sourceMode:k?"media-prompt-only":"ai-task",error:A,fallback:!1,partial:!0})}:{}}),te(a)}})},[ee]),Xi=g.useCallback(async()=>{const a=K.current[0];if(!a){T("Select an AI Task to run its graph.");return}const s=ci(j.current,a);if(s.length===0){T("Select an AI Task to run its graph.");return}const i=s.filter(l=>l.status!=="running");if(f.emit("automation.run",{id:a,mode:"selected-graph",count:i.length,graphSize:s.length,skippedRunning:s.length-i.length,order:s.map(l=>l.id)}),i.length===0){T("The selected AI Task graph is already running.");return}T(`Running selected graph: ${i.length} AI task${i.length===1?"":"s"}.`);for(const l of i)await ha(l.id)},[ha,T]),Lm=g.useCallback(async a=>{if(a.result)try{const s=await ko(a.result);f.emit("aiTask.result.copy",{id:a.id,chars:a.result.length,ok:!0,method:s}),T("AI result copied.")}catch(s){f.emit("aiTask.result.copy",{id:a.id,chars:a.result.length,ok:!1,message:s instanceof Error?s.message:String(s)}),T("AI result copy unavailable in this browser context.")}},[T]),Pm=g.useCallback(a=>{if(!a.result)return;const s=by(a,{x:a.x+a.width+78,y:a.y}),i={id:X("edge"),from:a.id,to:s.id,kind:"result"};F(l=>l.nodes.some(h=>h.id===a.id&&h.result)?{...l,nodes:[...l.nodes,s],edges:[...l.edges,i]}:l,"aiTask.result.note.create",{sourceNodeId:a.id,createdNodeId:s.id,chars:a.result.length,truncated:a.result.length>ni}),y([s.id]),te(null),H(s.id),window.setTimeout(()=>H(l=>l===s.id?null:l),1200),T("AI result archived as a Markdown node.")},[F,T]),Em=g.useCallback(a=>{if(!a.result)return;const s=yy(a,{x:a.x+a.width+78,y:a.y+Math.min(a.height+44,360)}),i={id:X("edge"),from:a.id,to:s.id,kind:"result"};F(l=>l.nodes.some(h=>h.id===a.id&&h.result)?{...l,nodes:[...l.nodes,s],edges:[...l.edges,i]}:l,"aiTask.result.followUp.create",{sourceNodeId:a.id,createdNodeId:s.id,chars:a.result.length}),y([s.id]),te(null),H(s.id),window.setTimeout(()=>H(l=>l===s.id?null:l),1200),T("Follow-up AI Task staged from the result.")},[F,T]),qi=g.useCallback(()=>{var os,io,ba,Ml,Tl,Rl,Ll;const a=v.trim(),s=j.current.settings.inputMode,i=[...K.current],l=j.current.nodes.find(ce=>ce.id===i[0]),u=(l==null?void 0:l.kind)==="ai-task"?(a||l.body).trim():a;if(!u)return;const h=u.replace(/\s+/g," ").trim().toLowerCase(),C=window.location.pathname||"/mindcanvas",k=`${C}|${s}|${h}`,I=Date.now(),w=Zn.current;if((w==null?void 0:w.signature)===k&&I-w.at<=vd){f.emit("globalInput.duplicateIgnored",{routePath:C,inputMode:s,chars:u.length,windowMs:vd});return}Zn.current={signature:k,at:I};const N={routePath:C,inputMode:s,selectedNodeIds:i,chars:u.length};f.emit("globalInput.submit.snapshot",{...N,source:(l==null?void 0:l.kind)==="ai-task"?"selected-ai-task":"input",hasTypedPrompt:a.length>0}),(l==null?void 0:l.kind)==="ai-task"&&P(""),$(ce=>ce+1),f.emit("globalInput.submit.started",N);const R=ce=>{$(Lt=>Math.max(0,Lt-1)),f.emit("globalInput.submit.completed",{...N,status:ce})};if((l==null?void 0:l.kind)==="ai-task"){ha(l.id,a).then(()=>R("ai-task")).catch(ce=>{f.emit("globalInput.submit.completed",{...N,status:"ai-task-error",message:ce instanceof Error?ce.message:String(ce)}),$(Lt=>Math.max(0,Lt-1))});return}const E=Se(void 0,void 0,{width:360,height:196}),M=$d(u,E,"global-input-url"),A=M?null:Ai(u),L=!!(A&&/^https?:\/\//i.test(A)&&!Rn(A)),J=!M&&!L&&(s==="Image"||s==="Video")?s:null,ke=M??(L?zd(u,E,"global-input-rejected-url"):null)??(J?Jb(u,E,j.current.settings,J,"global-input-media",B.current):qb(u,E,j.current.settings)),ut=Se(void 0,void 0,{width:ke.width,height:ke.height}),ae={...ke,x:ut.x,y:ut.y},fn=ae.kind==="ai-task",za=M?"globalInput.url.add":L?"globalInput.rejectedUrl.add":J?"globalInput.media.add":"globalInput.aiTask.add",ns={id:ae.id,kind:ae.kind,chars:u.length,inputMode:s,...fn?{model:(os=ae.metadata)==null?void 0:os.TextModel,provider:(io=ae.metadata)==null?void 0:io.AiProvider,effort:(ba=ae.metadata)==null?void 0:ba.Effort}:{},...J?{mediaMode:J,mediaModel:(Ml=ae.metadata)==null?void 0:Ml.MediaModel,aspectPresetId:(Tl=ae.metadata)==null?void 0:Tl.AspectPresetId,requestedSize:(Rl=ae.metadata)==null?void 0:Rl.RequestedSize}:{}};if(fn){const ce=j.current,Lt={...ce,nodes:ce.nodes.some(pr=>pr.id===ae.id)?ce.nodes:[...ce.nodes,ae],updatedAt:new Date().toISOString()};c(pr=>Ha(pr,ce,{description:za,mergeKey:null})),b([]),j.current=Lt,f.emit(za,ns),r(Lt)}else F(ce=>({...ce,nodes:ce.nodes.some(Lt=>Lt.id===ae.id)?ce.nodes:[...ce.nodes,ae]}),za,ns);if(P(""),y([ae.id]),te(null),H(ae.id),xe(ae,za),window.setTimeout(()=>H(ce=>ce===ae.id?null:ce),1200),fn){f.emit("globalInput.aiTask.runRequested",{id:ae.id,chars:u.length,model:(Ll=ae.metadata)==null?void 0:Ll.TextModel}),T("AI task created from input and running."),ha(ae.id,u).then(()=>R("ai-task-created")).catch(ce=>{f.emit("globalInput.submit.completed",{...N,status:"ai-task-created-error",message:ce instanceof Error?ce.message:String(ce)}),$(Lt=>Math.max(0,Lt-1))});return}T(`Added ${ae.kind==="file"?"URL reference":ae.kind} node from input.`),R(M?"url-node":L?"rejected-url-node":J?"media-node":"text-node")},[F,Se,v,xe,ha,T]),Ji=g.useCallback(async()=>{const a=Cy(j.current),s=a.flat(),i=a.map(u=>u.filter(h=>h.status!=="running")).filter(u=>u.length>0),l=i.flat();if(f.emit("automation.run",{mode:"all",count:l.length,graphCount:i.length,skippedRunning:s.length-l.length,order:l.map(u=>u.id)}),l.length===0){T(s.length>0?"All AI task graphs are already running.":"No AI tasks on this board.");return}T(`Running ${i.length} graph${i.length===1?"":"s"} / ${l.length} AI task${l.length===1?"":"s"}.`);for(const u of i)for(const h of u)await ha(h.id)},[ha,T]),Zi=g.useCallback(()=>{const a=j.current.nodes.filter(s=>s.kind==="ai-task"&&s.status==="running");if(a.length===0){T("No running AI tasks to pause."),f.emit("automation.pause",{count:0});return}Pa.current+=1,F(s=>({...s,nodes:s.nodes.map(i=>i.kind==="ai-task"&&i.status==="running"?{...i,status:"paused",result:i.result||"Paused locally. Run the task again to continue with a fresh execution."}:i)}),"automation.pause",{count:a.length}),T(`Paused ${a.length} running task${a.length===1?"":"s"}.`)},[F,T]),Qi=g.useCallback(()=>{const a=j.current.nodes.filter(s=>s.kind==="ai-task"&&(s.status==="running"||s.status==="paused"));if(a.length===0){T("No active AI tasks to stop."),f.emit("automation.stop",{count:0});return}Pa.current+=1,F(s=>({...s,nodes:s.nodes.map(i=>i.kind==="ai-task"&&(i.status==="running"||i.status==="paused")?{...i,status:"blocked",result:"Stopped locally. Any late adapter callback from the previous execution will be ignored."}:i)}),"automation.stop",{count:a.length}),te(null),T(`Stopped ${a.length} active task${a.length===1?"":"s"}.`)},[F,T]),el=g.useCallback(async()=>{var k,I,w;if(pn.current)return;const a=j.current.nodes.find(N=>N.id===K.current[0]);if(!a)return;pn.current=!0;const s=++Ba.current;Bn(!0),T("Generating flow with AI planner...");const i=su(a),l=yi(j.current.settings.appLanguage,i);let u="language-fallback",h=null,C="";try{if(!et())C="hosted-access-gated";else{const R=await qt();if(s!==Ba.current){f.emit("async.staleIgnored",{path:"automation.generateFlow",seq:s});return}if(be(R.state),ve(R.status??null),R.state!=="connected")C=R.message||"LocalBridge unavailable",ye(C);else{const E=Ua(R.status);if(!E)C="LocalBridge token unavailable";else{const M=Jg(i,j.current.settings.appLanguage);f.emit("localBridge.codex.run",{id:a.id,boardId:j.current.id,intent:"mindcanvas-generate-flow",appLanguage:l});const A=await zl({instruction:M,workingDirectory:((I=(k=R.status)==null?void 0:k.project)==null?void 0:I.rootPath)||((w=R.status)==null?void 0:w.workspace)||void 0,sandbox:"read_only",model:Zt(j.current.settings.model),reasoningEffort:Zd(j.current.settings.effort),approvalPolicy:"on-request",intent:"mindcanvas-generate-flow",nodeKind:a.kind,webSearchMode:"disabled",networkAccessEnabled:!1},E,R.baseUrl);if(s!==Ba.current){f.emit("async.staleIgnored",{path:"automation.generateFlow",seq:s});return}const L=A.success?Zg(A.finalResponse):null;L&&Qg(L,l)?(h=L,u="ai-generated",f.emit("automation.generateFlow.ai.completed",{id:a.id,count:L.nodes.length,appLanguage:l,providerKind:A.providerKind,threadId:A.threadId,turnId:A.turnId})):(C=A.success?"AI planner returned invalid or wrong-language JSON.":A.error||"LocalBridge Codex returned no flow response.",f.emit("automation.generateFlow.ai.failed",{id:a.id,appLanguage:l,reason:C,success:A.success,status:A.status}))}}}h||(h=cd(i,l),u="language-fallback",f.emit("automation.generateFlow.fallback",{id:a.id,count:h.nodes.length,appLanguage:l,reason:C||"planner-unavailable"}));const N=Qd(a,h,j.current.settings,u);F(R=>({...R,nodes:[...R.nodes,...N.nodes],edges:[...R.edges,...N.edges]}),"node.add",{reason:"generate-flow",count:N.nodes.length,sourceMode:u,appLanguage:N.language}),y(N.nodes.map(R=>R.id)),T(u==="ai-generated"?`Generated ${N.nodes.length} AI-planned flow nodes.`:`Generated ${N.nodes.length} local fallback flow nodes.`)}catch(N){const R=N instanceof Error?N.message:String(N),E=cd(i,l),M=Qd(a,E,j.current.settings,"language-fallback");f.emit("automation.generateFlow.failed",{id:a.id,appLanguage:l,message:R,fallbackCount:M.nodes.length}),F(A=>({...A,nodes:[...A.nodes,...M.nodes],edges:[...A.edges,...M.edges]}),"node.add",{reason:"generate-flow",count:M.nodes.length,sourceMode:"language-fallback",appLanguage:M.language,error:R}),y(M.nodes.map(A=>A.id)),T(`Generated ${M.nodes.length} fallback flow nodes.`)}finally{s===Ba.current&&(pn.current=!1,Bn(!1))}},[F,T]),tl=g.useCallback((a,s,i)=>{const l=typeof document<"u"?document.elementFromPoint(a,s):null,u=l instanceof HTMLElement?l.closest('[data-node-connector="true"]'):null,h=(u==null?void 0:u.dataset.connectorNodeId)??"",C=u==null?void 0:u.dataset.connectorSide;if(h&&h!==i&&si(C)&&j.current.nodes.some(w=>w.id===h))return{id:h,side:C};const k=yt(a,s),I=[...j.current.nodes].reverse().find(w=>w.id!==i&&yb(k,w));return I?{id:I.id,side:bb(I,k)}:null},[yt]),_m=g.useCallback((a,s,i,l)=>{if(l.button!==0)return;l.preventDefault(),l.stopPropagation();const u=j.current.nodes.find(M=>M.id===a);if(!u)return;const h=Et(u,s);let C=h,k=null;const I=(M,A)=>{C=yt(M,A),k=tl(M,A,a),V(L=>!L||L.from!==a?L:{...L,pointer:C,target:k,dragging:!0})},w=()=>{document.body.classList.remove("is-connecting-node"),window.removeEventListener("pointermove",N),window.removeEventListener("pointerup",R),window.removeEventListener("pointercancel",E)},N=M=>{I(M.clientX,M.clientY)},R=M=>{if(I(M.clientX,M.clientY),w(),!k||k.id===a){V(null),f.emit("edge.drag.cancelled",{from:a,fromSide:s,kind:i});return}const A={id:X("edge"),from:a,to:k.id,kind:i,fromSide:s,toSide:k.side};F(L=>({...L,edges:[...L.edges,A]}),"edge.add",{...A,source:"connector-drag"}),V(null),y([a,k.id]),te(null),f.emit("edge.drag.completed",{...A})},E=()=>{w(),V(null),f.emit("edge.drag.cancelled",{from:a,fromSide:s,kind:i,reason:"pointer-cancelled"})};y(M=>M.includes(a)?M:[a]),te(null),V({from:a,kind:i,fromSide:s,pointer:h,target:null,dragging:!0}),document.body.classList.add("is-connecting-node"),f.emit("edge.drag.started",{from:a,fromSide:s,kind:i}),window.addEventListener("pointermove",N),window.addEventListener("pointerup",R,{once:!0}),window.addEventListener("pointercancel",E,{once:!0})},[F,tl,yt]),Bm=g.useCallback((a,s,i="right")=>{if(G&&G.from!==a){const u={id:X("edge"),from:G.from,to:a,kind:G.kind==="context"?"context":s,fromSide:G.fromSide,toSide:i};F(h=>({...h,edges:[...h.edges,u]}),"edge.add",{...u}),V(null);return}const l=j.current.nodes.find(u=>u.id===a);V({from:a,kind:s,fromSide:i,pointer:l?Et(l,i):$e.current,target:null,dragging:!1})},[F,G]),Jo=g.useCallback(()=>{c(a=>{const s=a.at(-1);if(!s)return a;const i=s.board,l=K.current,u=sc(l,i);return b(h=>Eh(h,j.current,{description:s.description})),r(i),y(u),f.emit("history.undo",{boardId:i.id,selectedBefore:l.length,selectedAfter:u.length,selectionRepaired:u.length!==l.length||u.some((h,C)=>h!==l[C])}),f.emit("selection.repaired",{reason:"undo",beforeCount:l.length,afterCount:u.length}),a.slice(0,-1)})},[]),Zo=g.useCallback(()=>{b(a=>{const s=a[0];if(!s)return a;const i=s.board,l=K.current,u=sc(l,i);return c(h=>Ha(h,j.current,{description:s.description})),r(i),y(u),f.emit("history.redo",{boardId:i.id,selectedBefore:l.length,selectedAfter:u.length,selectionRepaired:u.length!==l.length||u.some((h,C)=>h!==l[C])}),f.emit("selection.repaired",{reason:"redo",beforeCount:l.length,afterCount:u.length}),a.slice(1)})},[]);g.useEffect(()=>{const a=s=>{var I,w;if(!s.defaultPrevented&&s.ctrlKey&&!s.shiftKey&&!s.altKey&&!s.metaKey&&s.key==="Home"&&!s.repeat){s.preventDefault(),Pi("keyboard"),f.emit("keyboard.shortcut",{action:"toggle-function-toolbar"});return}if(s.defaultPrevented||rc(s.target))return;const i=s.key.toLowerCase(),l=s.ctrlKey||s.metaKey,u=!l&&!s.altKey&&!s.shiftKey,h=Dy(s.target);if(s.key==="Tab"&&u&&!s.repeat&&!h){s.preventDefault(),er("keyboard"),f.emit("keyboard.shortcut",{action:"toggle-wheel-mode",wheelMode:!(j.current.settings.wheelMode??!1)});return}if(s.key==="Enter"&&u&&!s.repeat&&!h&&Vi()){s.preventDefault(),f.emit("keyboard.shortcut",{action:"focus-global-input"});return}if(i==="f"&&u&&!s.repeat&&!h){s.preventDefault(),to("keyboard"),f.emit("keyboard.shortcut",{action:"toggle-fullscreen"});return}if(i==="d"&&u&&!s.repeat){s.preventDefault(),tr("keyboard"),f.emit("keyboard.shortcut",{action:"toggle-cursor-direction"});return}if(i==="h"&&u&&!s.repeat){s.preventDefault(),Qs(),f.emit("keyboard.shortcut",{action:"camera-home"});return}const C=s.key==="ArrowUp"?"up":s.key==="ArrowDown"?"down":s.key==="ArrowLeft"?"left":s.key==="ArrowRight"?"right":null;if(C&&u){s.preventDefault(),Wi(C),f.emit("keyboard.shortcut",{action:"camera-pan",direction:C});return}if(i===xa&&!s.altKey&&!s.shiftKey){s.preventDefault(),l?(Da(xa),f.emit("keyboard.shortcut",{action:"camera-bookmark-save",slot:xa})):(eo(xa),f.emit("keyboard.shortcut",{action:"camera-bookmark-goto",slot:xa}));return}if(/^[0-9]$/.test(s.key)&&!s.altKey){if(l&&!s.shiftKey){s.preventDefault(),Da(s.key),f.emit("keyboard.shortcut",{action:"camera-bookmark-save",slot:s.key});return}if(!l&&!s.shiftKey){s.preventDefault(),eo(s.key),f.emit("keyboard.shortcut",{action:"camera-bookmark-goto",slot:s.key});return}}if(l&&i==="z"&&!s.shiftKey){s.preventDefault(),Jo(),f.emit("keyboard.shortcut",{action:"undo"});return}if(l&&i==="y"||l&&s.shiftKey&&i==="z"){s.preventDefault(),Zo(),f.emit("keyboard.shortcut",{action:"redo"});return}if(l&&i==="f"&&!s.altKey){s.preventDefault(),(I=cn.current)==null||I.focus(),(w=cn.current)==null||w.select(),f.emit("keyboard.shortcut",{action:"focus-search"});return}if(l&&i==="c"&&K.current.length>0){s.preventDefault(),rr(),f.emit("keyboard.shortcut",{action:"copy",count:K.current.length});return}if(l&&i==="v"&&lt.current&&Vt.current>Date.now()){const N=lt.current;s.preventDefault(),Oa(N,Se(),"paste"),f.emit("keyboard.shortcut",{action:"paste-local",count:N.nodes.length});return}if(l&&i==="d"){s.preventDefault(),sr("keyboard"),f.emit("keyboard.shortcut",{action:"duplicate",count:K.current.length});return}if(l&&s.key==="]"){s.preventDefault(),ao("front","keyboard"),f.emit("keyboard.shortcut",{action:"bring-front",count:K.current.length});return}if(l&&s.key==="["){s.preventDefault(),ao("back","keyboard"),f.emit("keyboard.shortcut",{action:"send-back",count:K.current.length});return}if(s.key==="Delete"||s.key==="Backspace"){if(K.current.length===0)return;s.preventDefault(),or("keyboard"),f.emit("keyboard.shortcut",{action:"delete",count:K.current.length});return}if(s.key!=="Escape")return;let k=!1;oa&&(an(!1),k=!0),ht&&(na(!1),k=!0),Un&&($t(!1),k=!0),Sa&&(Tt("keyboard"),k=!0),He&&(jt(null),k=!0),Ot&&(sa(null),k=!0),At&&(ra(null),k=!0),G&&(V(null),k=!0),de&&(te(null),k=!0),S.trim()&&(D(""),U([]),re(0),k=!0),K.current.length>0&&(y([]),k=!0),k&&(s.preventDefault(),f.emit("keyboard.shortcut",{action:"escape"}))};return window.addEventListener("keydown",a),()=>window.removeEventListener("keydown",a)},[Ot,Tt,G,rr,or,At,sr,Vi,Se,eo,Qs,Sa,Wi,Oa,He,oa,S,Zo,ao,de,Da,ht,Un,tr,Pi,to,er,Jo]);const Dm=g.useCallback(()=>{sp(),F(()=>({...El,updatedAt:new Date().toISOString()}),"board.restore",{source:"fixture-reset"}),y(["node-agent-command"]),Oe([]),Tt("fixture-reset")},[Tt,F]),lr=g.useCallback((a,s="result-click")=>{const i=Er(a),l=Mt(),u={...oe.current,x:l.width/2-i.x*oe.current.scale,y:l.height/2-i.y*oe.current.scale};Z(u),y([a.id]),H(a.id),f.emit("search.focused",{query:S.trim(),nodeId:a.id,source:s}),window.setTimeout(()=>H(null),900)},[Z,S,Mt]);g.useEffect(()=>{const a=++mn.current,s=_y(oe.current,z);f.emit("search.started",{query:S,engine:ca.current?"worker":"local",viewportCenterX:Number(s.centerX.toFixed(2)),viewportCenterY:Number(s.centerY.toFixed(2))});const i=window.setTimeout(()=>{if(a!==mn.current){f.emit("async.staleIgnored",{path:"search",seq:a});return}if(!S.trim()){U([]),re(0),Ne("none"),f.emit("search.completed",{query:S,count:0,engine:"none"});return}const u=Ea.current;if(u&&ca.current){u.postMessage({type:"SEARCH_QUERY",boardId:j.current.id,seq:a,query:S,limit:8,viewport:s});return}const h=performance.now(),C=By(j.current.nodes,S,s,8);U(C),re(0),Ne("local"),f.emit("search.completed",{query:S,count:C.length,engine:"local",durationMs:Number((performance.now()-h).toFixed(2)),viewportBoosted:!0})},120);return()=>window.clearTimeout(i)},[S,z,ge]);const oo=g.useCallback(a=>{re(s=>{const i=O.length;if(i===0)return 0;const l=(s+a+i)%i;return f.emit("search.activeChanged",{query:S.trim(),index:l,count:i}),l})},[S,O.length]),dr=g.useCallback(a=>{const s=O[W];s&&lr(s,a)},[lr,W,O]),Om=g.useCallback(a=>{if(a.key==="ArrowDown"){a.preventDefault(),oo(1);return}if(a.key==="ArrowUp"){a.preventDefault(),oo(-1);return}if(a.key==="Enter"){a.preventDefault(),dr("keyboard-enter");return}a.key==="Escape"&&(D(""),U([]),re(0),f.emit("search.cleared"))},[dr,oo]),Fm=g.useCallback((a,s)=>{if(s.target.closest("button,input,textarea,select"))return;s.preventDefault(),s.stopPropagation();const i={x:s.clientX,y:s.clientY},l=j.current.nodes.find(N=>N.id===a);if(!l)return;c(N=>Ha(N,j.current,{description:"Move nodes",mergeKey:null})),b([]);const u=K.current.includes(a)?K.current:[a],h=new Map(j.current.nodes.filter(N=>u.includes(N.id)).map(N=>[N.id,{x:N.x,y:N.y}])),C=h.get(a)??{x:l.x,y:l.y},k=j.current.settings.gridSnap??!0,I=N=>{const R=(N.clientX-i.x)/oe.current.scale,E=(N.clientY-i.y)/oe.current.scale,M=k?Od(C.x+R)-C.x:R,A=k?Od(C.y+E)-C.y:E;r(L=>({...L,nodes:L.nodes.map(J=>{const ke=h.get(J.id);return ke?{...J,x:ke.x+M,y:ke.y+A}:J}),updatedAt:new Date().toISOString()}))},w=()=>{window.removeEventListener("pointermove",I),window.removeEventListener("pointerup",w),f.emit("node.patch",{id:a,reason:"drag",gridSnap:k})};window.addEventListener("pointermove",I),window.addEventListener("pointerup",w,{once:!0})},[]),$m=g.useCallback((a,s)=>{if(s.button!==0)return;s.preventDefault(),s.stopPropagation();const i=j.current.nodes.find(R=>R.id===a);if(!i)return;const l={x:s.clientX,y:s.clientY},u=Mb(i);let h={width:i.width,height:i.height};c(R=>Ha(R,j.current,{description:"Resize node",mergeKey:null})),b([]),y(R=>R.includes(a)?R:[a]),te(null),f.emit("node.resize.started",{id:a,width:Math.round(i.width),height:Math.round(i.height)});const C=()=>{document.body.classList.remove("is-resizing-node"),window.removeEventListener("pointermove",I),window.removeEventListener("pointerup",w),window.removeEventListener("pointercancel",N)},k=R=>{const E=(R.clientX-l.x)/oe.current.scale,M=(R.clientY-l.y)/oe.current.scale;let A=i.width+E,L=i.height+M;if(R.shiftKey&&i.width>0&&i.height>0){const J=Math.max(A/i.width,L/i.height);A=i.width*J,L=i.height*J}h={width:Math.round(ue(A,u.minWidth,u.maxWidth)),height:Math.round(ue(L,u.minHeight,u.maxHeight))},r(J=>({...J,nodes:J.nodes.map(ke=>ke.id===a?{...ke,...h}:ke),updatedAt:new Date().toISOString()}))},I=R=>{k(R)},w=R=>{k(R),C(),f.emit("node.resize.completed",{id:a,width:h.width,height:h.height})},N=()=>{C(),f.emit("node.resize.cancelled",{id:a})};document.body.classList.add("is-resizing-node"),window.addEventListener("pointermove",I),window.addEventListener("pointerup",w,{once:!0}),window.addEventListener("pointercancel",N,{once:!0})},[]),zm=g.useCallback(a=>{if(a.button!==0&&a.button!==1&&a.button!==2||Kd(a.target))return;if(a.button===0&&a.ctrlKey&&!a.shiftKey){a.preventDefault(),a.stopPropagation(),Ho(a.clientX,a.clientY,"ctrl-grid-click");return}a.preventDefault();const s={x:a.clientX,y:a.clientY},i=pa(a.clientX,a.clientY),l=a.shiftKey;if(a.button===0){const k=new Set(K.current);te(null),Ue({startX:i.x,startY:i.y,currentX:i.x,currentY:i.y}),f.emit("selection.box.started",{x:Math.round(i.x),y:Math.round(i.y),additive:l});const I=()=>{document.body.classList.remove("is-selecting"),window.removeEventListener("pointermove",w),window.removeEventListener("pointerup",N),window.removeEventListener("pointercancel",R)},w=E=>{const M=pa(E.clientX,E.clientY);Ue({startX:i.x,startY:i.y,currentX:M.x,currentY:M.y})},N=E=>{const M=pa(E.clientX,E.clientY),A=qd({startX:i.x,startY:i.y,currentX:M.x,currentY:M.y});if(I(),Ue(null),A.width<Sd&&A.height<Sd){const ut=K.current.length;!l&&ut>0&&(y([]),te(null),f.emit("selection.cleared",{source:"canvas-background-click",beforeCount:ut})),f.emit("selection.box.cancelled",{reason:"too-small",width:Math.round(A.width),height:Math.round(A.height)});return}const L=dy(A,oe.current),J=j.current.nodes.filter(ut=>Xd(ut,L)).map(ut=>ut.id),ke=l?Array.from(new Set([...k,...J])):J;y(ke),f.emit("selection.box.completed",{count:ke.length,additive:l,width:Math.round(A.width),height:Math.round(A.height)})},R=()=>{I(),Ue(null),f.emit("selection.box.cancelled",{reason:"pointer-cancelled"})};document.body.classList.add("is-selecting"),window.addEventListener("pointermove",w),window.addEventListener("pointerup",N,{once:!0}),window.addEventListener("pointercancel",R,{once:!0});return}const u={...oe.current},h=k=>{Z({...u,x:u.x+k.clientX-s.x,y:u.y+k.clientY-s.y})},C=()=>{document.body.classList.remove("is-panning"),window.removeEventListener("pointermove",h),window.removeEventListener("pointerup",C)};document.body.classList.add("is-panning"),window.addEventListener("pointermove",h),window.addEventListener("pointerup",C,{once:!0})},[Z,pa,Ho]),Um=g.useCallback(a=>{a.button===0&&(Kd(a.target)||(a.preventDefault(),a.stopPropagation(),Ho(a.clientX,a.clientY,"double-click")))},[Ho]),cr=g.useCallback(a=>{const s=a.target instanceof Element?a.target:null;if(s!=null&&s.closest('[data-disable-mindcanvas-wheel="true"]'))return;const i=s==null?void 0:s.closest("textarea,.result-popover__body,.mindcanvas-text-scrollable-view"),l=a.ctrlKey||a.metaKey;if(i&&!l)return;const u=j.current.settings.wheelMode?l:!l;a.preventDefault();const h=oe.current;if(u){const C=Math.exp(-a.deltaY*.0012),k=ue(h.scale*C,ws,Ss),I=yt(a.clientX,a.clientY),w=pa(a.clientX,a.clientY);Z({x:w.x-I.x*k,y:w.y-I.y*k,scale:k});return}Z({...h,x:h.x-a.deltaX,y:h.y-a.deltaY})},[Z,pa,yt]);g.useEffect(()=>{const a=Ht.current;if(a)return a.addEventListener("wheel",cr,{passive:!1}),()=>a.removeEventListener("wheel",cr)},[cr]);const Q=n.nodes.find(a=>a.id===m[0]),hn=g.useMemo(()=>{const a=new Set(m);return n.nodes.filter(s=>a.has(s.id))},[n.nodes,m]),so=((gl=Q==null?void 0:Q.metadata)==null?void 0:gl[Y.studioNodeType])??"",Hm=so?fr(so):"Unassigned",Wm=so==="template.input",al=g.useMemo(()=>Td(je),[je]),Qo=pe&&pe.issues.length===0?pe.template:null,nl=g.useMemo(()=>rs(Qo,Ut),[Ut,Qo]),Vm=g.useMemo(()=>hn.filter(a=>a.kind==="image"&&So(a).length>0).length,[hn]),dt=g.useMemo(()=>{const a=n.nodes.filter(l=>l.kind==="ai-task"),s=a.filter(l=>l.status==="running").length,i=a.filter(l=>l.status==="paused").length;return{total:a.length,runnable:a.filter(l=>l.status!=="running").length,running:s,paused:i,active:s+i}},[n.nodes]),es=g.useMemo(()=>{if(!Q||Q.kind!=="ai-task")return{size:0,runnable:0};const a=ci(n,Q.id);return{size:a.length,runnable:a.filter(s=>s.status!=="running").length}},[n,Q]),Fa=g.useMemo(()=>{if(hn.length<2)return null;const a=As(hn);if(!a)return null;const s=Math.max(.01,he.scale),i=a.minX*s+he.x-10,l=a.minY*s+he.y-10,u=a.maxX*s+he.x+10,h=a.maxY*s+he.y+10,C=(i+u)/2,k=l>112?l-52:h+12;return{left:i,top:l,width:Math.max(0,u-i),height:Math.max(0,h-l),toolbarLeft:ue(C,168,Math.max(168,z.width-168)),toolbarTop:ue(k,42,Math.max(42,z.height-58))}},[hn,z.height,z.width,he]),fa=de?n.nodes.find(a=>a.id===de):null,ol=Ot?n.nodes.find(a=>a.id===Ot&&!!a.companyMode):null,sl=At?n.nodes.find(a=>a.id===At&&a.kind==="directory"):null,rl=g.useMemo(()=>new Set([...m,...O.map(a=>a.id),vt,de,Ot,At,G==null?void 0:G.from].filter(a=>!!a)),[Ot,G==null?void 0:G.from,At,vt,de,O,m]),$a=g.useMemo(()=>{const a=ly(at,z);return n.nodes.filter(s=>rl.has(s.id)||Xd(s,a))},[rl,n.nodes,z,at]),ur=g.useMemo(()=>new Set($a.map(a=>a.id)),[$a]);g.useEffect(()=>{f.emit("visibility.culled",{visible:$a.length,total:n.nodes.length,scale:Number(at.scale.toFixed(3))})},[n.nodes.length,at.scale,$a.length]);const Ym=g.useCallback(()=>{const a=j.current,s=K.current.map(l=>a.nodes.find(u=>u.id===l)).find(Boolean),i=(s==null?void 0:s.kind)==="ai-task"?s:a.nodes.find(l=>K.current.includes(l.id)&&l.kind==="ai-task")??a.nodes.find(l=>l.kind==="ai-task");return i?ec(a,i,v.trim()||i.body||i.title):["You are running inside MindExec React MindCanvas.","No AI Task is selected. This is a local prompt-debug preview for the current board.","",`Board: ${a.name}`,`Nodes: ${a.nodes.length}`,`Edges: ${a.edges.length}`,s?`Selected node: ${s.title} (${s.kind})`:"Selected node: none","","Draft input:",Io(v||(s==null?void 0:s.body)||"No prompt input.",4e3)].join(`
48
- `)},[v]),il=g.useMemo(()=>{const a=new Map(n.nodes.map(s=>[s.id,s]));return n.edges.map(s=>{const i=a.get(s.from),l=a.get(s.to);if(!i||!l)return null;const u=s.fromSide??"right",h=s.toSide??"left",C=Et(i,u),k=Et(l,h);return{...s,path:Ed(C,u,k,h)}}).filter(Boolean)},[n.edges,n.nodes]),ts=g.useMemo(()=>{var C,k;if(!G)return null;const a=new Map(n.nodes.map(I=>[I.id,I])),s=a.get(G.from);if(!s)return null;const i=Et(s,G.fromSide),l=G.target?a.get(G.target.id):null,u=((C=G.target)==null?void 0:C.side)??fb(G.fromSide),h=l?Et(l,u):G.pointer;return{kind:G.kind,targetId:((k=G.target)==null?void 0:k.id)??null,path:Ed(i,G.fromSide,h,u)}},[n.nodes,G]),ll=g.useMemo(()=>il.filter(a=>ur.has(a.from)||ur.has(a.to)),[il,ur]),ct=g.useMemo(()=>iy(n.nodes,he,z),[n.nodes,he,z]),Gm=g.useCallback(a=>{if(!ct)return;const s=a.currentTarget.getBoundingClientRect(),i=ue(a.clientX-s.left,0,vs),l=ue(a.clientY-s.top,0,js),u=ct.bounds.minX+(i-wn)/ct.scale,h=ct.bounds.minY+(l-wn)/ct.scale;Z({...oe.current,x:z.width/2-u*oe.current.scale,y:z.height/2-h*oe.current.scale}),f.emit("minimap.navigate",{worldX:Math.round(u),worldY:Math.round(h)})},[Z,ct,z.height,z.width]),xt=n.settings.inputMode==="Image"?"Image":n.settings.inputMode==="Video"?"Video":null,mr=xt==="Image"?qs:xt==="Video"?Js:null,Km=v.trim().length>0||(Q==null?void 0:Q.kind)==="ai-task",dl=S.trim().length>0,cl=O[W]??null,Xm=dl?`${O.length} result${O.length===1?"":"s"}`:`${n.nodes.length} nodes`,ro=St?qd(St):null,as=Br(n.settings.gridType),ul=n.settings.gridSnap??!0,ml=n.settings.cameraBookmarks??{},pl=Sa,qm=Aa==="full";return o.jsxs("div",{ref:Ht,className:`mindcanvas ${Ft?"mindcanvas--read-mode":""} mindcanvas--function-toolbar-${Aa}`,"data-function-toolbar-mode":Aa,"data-read-mode":Ft?"true":"false","data-read-mode-api":Hs?"bound":"unbound","data-cursor-mode":n.settings.cursorMode??"center","data-cursor-direction":n.settings.cursorDirection==="down"?"down":"right",onPointerMove:Su,onDragOver:Nm,onDrop:Am,children:[o.jsx("div",{ref:Wt,className:`canvas-plane canvas-plane--grid-${as}`,"data-grid-type":as,"data-grid-snap":n.settings.gridSnap??!0?"on":"off",onPointerDown:zm,onDoubleClick:Um,onContextMenu:a=>a.preventDefault(),children:o.jsxs("div",{ref:dn,className:"canvas-world","data-visible-nodes":$a.length,"data-total-nodes":n.nodes.length,"data-visible-edges":ll.length,children:[o.jsxs("svg",{className:"edge-layer",width:"4000",height:"3000",viewBox:"-1200 -900 4000 3000","aria-hidden":"true",children:[ll.map(a=>o.jsx("path",{className:`edge-path edge-path--${a.kind}`,d:a.path,onClick:()=>F(s=>({...s,edges:s.edges.filter(i=>i.id!==a.id)}),"edge.delete",{id:a.id})},a.id)),ts&&o.jsx("path",{className:`edge-path edge-path--${ts.kind} edge-path--draft ${ts.targetId?"has-target":""}`,d:ts.path,"data-testid":"edge-connection-preview"})]}),o.jsx("div",{className:"canvas-cursor-marker","data-testid":"canvas-cursor-marker","data-cursor-mode":n.settings.cursorMode??"center","data-cursor-direction":n.settings.cursorDirection==="down"?"down":"right",style:{left:`${wa.x}px`,top:`${wa.y}px`},"aria-hidden":"true"}),$a.map(a=>o.jsx(If,{node:a,selected:m.includes(a.id),pulsing:vt===a.id,connectionDraft:G,onSelect:Zu,onDragStart:Fm,onResizeStart:$m,onPatch:ee,onDelete:Im,onDuplicate:Rm,onRun:ha,onPin:Bm,onConnectorDragStart:_m,onOpenResult:te,onToggleAiReference:um,onCopyNode:mm,onCopyEmbedReference:pm,onFitNodeHeight:gm,onToggleNodeExpanded:hm,onToggleWordWrap:fm,onStageCompany:bm,onOpenCompanyGraph:ym,onSyncCompanyGoal:xm,onRefreshCompany:Cm,onSetCompanyStatus:Gi,onRemoveCompany:Ki,onOpenAsset:jm,onOpenDirectorySettings:rm,onScanDirectory:dm,onCreateRemoteControl:am,onGenerateTemplateCard:tm},a.id))]})}),ro?o.jsx("div",{className:"canvas-selection-box",style:{left:ro.left,top:ro.top,width:ro.width,height:ro.height}}):null,Fa?o.jsxs(o.Fragment,{children:[o.jsx("div",{className:"canvas-multi-selection-bounds",style:{left:Fa.left,top:Fa.top,width:Fa.width,height:Fa.height}}),o.jsxs("div",{className:"multi-selection-toolbar floating-panel",role:"toolbar","aria-label":"Multi selection actions",style:{left:Fa.toolbarLeft,top:Fa.toolbarTop},children:[o.jsx("span",{className:"multi-selection-toolbar__count",children:hn.length}),o.jsx("button",{type:"button",title:"Copy selected nodes","data-testid":"multi-selection-copy",onClick:()=>void rr(),children:o.jsx(vo,{size:15})}),o.jsx("button",{type:"button",title:"Duplicate selected nodes",onClick:()=>sr("multi-toolbar"),children:o.jsx(fc,{size:15})}),o.jsx("button",{type:"button",title:"Bring selected nodes to front","data-testid":"multi-selection-bring-front",onClick:()=>ao("front","multi-toolbar"),children:o.jsx(ag,{size:15})}),o.jsx("button",{type:"button",title:"Send selected nodes to back","data-testid":"multi-selection-send-back",onClick:()=>ao("back","multi-toolbar"),children:o.jsx(ng,{size:15})}),o.jsx("button",{type:"button",title:"Fit selected text heights",onClick:Mm,children:o.jsx(Jl,{size:15})}),o.jsx("span",{className:"multi-selection-toolbar__separator"}),o.jsx("button",{type:"button",title:"Arrange selected nodes as grid",onClick:()=>ir("grid"),children:o.jsx(Zl,{size:15})}),o.jsx("button",{type:"button",title:"Arrange selected nodes as strip",onClick:()=>ir("strip"),children:o.jsx(Ql,{size:15})}),o.jsx("button",{type:"button",title:"Tidy selected nodes","data-testid":"multi-selection-tidy",onClick:()=>ir("tidy"),children:o.jsx(ed,{size:15})}),Vm>=2&&o.jsx("button",{type:"button",title:"Stack selected image nodes","data-testid":"multi-selection-merge-images",onClick:Tm,children:o.jsx(ls,{size:15})}),o.jsx("span",{className:"multi-selection-toolbar__separator"}),o.jsx("button",{type:"button",title:"Delete selected nodes",className:"is-danger","data-testid":"multi-selection-delete",onClick:()=>or("multi-toolbar"),children:o.jsx(Rs,{size:15})}),o.jsx("button",{type:"button",title:"Clear selection","data-testid":"multi-selection-clear",onClick:()=>{const a=K.current.length;y([]),f.emit("selection.cleared",{source:"multi-toolbar",beforeCount:a})},children:o.jsx(Pt,{size:15})})]})]}):null,To&&o.jsx("div",{className:"node-action-toast floating-panel",role:"status",children:To}),o.jsxs("div",{className:"top-tabbar",role:"tablist","aria-label":"MindCanvas boards",children:[rn.map(a=>{const s=a.id===n.id,i=tt(a.name),l=Tb(a,n,s);return o.jsxs("div",{className:`tab-shell ${s?"is-active":""} ${Ze===a.id?"is-dragging":""} ${Eo===a.id?"is-drag-over":""}`,"data-testid":"board-tab-shell",draggable:!0,"data-board-id":a.id,"data-board-tab-active":s?"true":"false","data-board-tab-drag-state":Ze===a.id?"dragging":Eo===a.id?"over":"idle",onDragStart:u=>{u.dataTransfer.effectAllowed="move",u.dataTransfer.setData("text/plain",a.id),zn(a.id),f.emit("board.tabs.dragStart",{boardId:a.id})},onDragOver:u=>{!Ze||Ze===a.id||(u.preventDefault(),u.dataTransfer.dropEffect="move",ie(a.id))},onDragLeave:()=>{ie(u=>u===a.id?null:u)},onDrop:u=>{u.preventDefault();const h=Ze||u.dataTransfer.getData("text/plain");xu(h,a.id),zn(null),ie(null)},onDragEnd:()=>{zn(null),ie(null)},onMouseDown:u=>{u.button===1&&(u.preventDefault(),Ks(a.id,"middle-click"))},children:[o.jsxs("button",{type:"button",role:"tab","aria-selected":s,className:`tab-button ${s?"tab-button--current":""}`,title:s?`Boards / ${i}`:i,"aria-label":l===i?i:`${l} board, ${i}`,"data-testid":"board-tab","data-board-id":a.id,"data-board-tab-title":i,"data-board-tab-display-title":l,onClick:()=>s?du():Bi(a.id),children:[a.sourceKind==="localBridge"?o.jsx(go,{size:15}):o.jsx(ls,{size:15}),o.jsx("span",{children:l})]}),!s&&o.jsx("button",{type:"button",className:"tab-close",title:"Close tab","data-testid":"board-tab-close",onClick:u=>{u.stopPropagation(),Ks(a.id,"close-button")},children:o.jsx(Pt,{size:13})})]},a.id)}),o.jsx("button",{type:"button",className:"tab-button tab-button--plain",title:"New board","data-testid":"board-create",onClick:_i,children:o.jsx(wo,{size:16})})]}),Sa&&o.jsxs(o.Fragment,{children:[o.jsx("button",{type:"button",className:"local-board-backdrop project-gallery-backdrop","aria-label":"Close project gallery","data-testid":"project-gallery-backdrop","data-project-gallery-backdrop":"true",onClick:()=>Tt("backdrop")}),o.jsx("div",{className:"project-gallery-shell","data-project-gallery-shell":"true",children:o.jsx("div",{className:"project-gallery-positioner","data-project-gallery-positioner":"true",children:o.jsxs("section",{className:"local-board-panel project-gallery-panel floating-panel","aria-label":"Project Gallery","data-testid":"project-gallery-panel","data-project-gallery-panel":"true","data-project-storage-current-mode":Ye.currentMode,"data-project-storage-selected-tab":Me,"data-project-storage-local-provider":Ye.localProviderKind,"data-project-storage-cloud-available":Ye.isCloudAvailable?"true":"false","data-project-storage-can-sync-cloud":Ye.canSyncLocalToCloud?"true":"false",children:[o.jsxs("header",{className:"local-board-panel__head project-gallery-panel__head",children:[o.jsxs("div",{className:"project-gallery-title",children:[o.jsxs("span",{className:"project-gallery-title__eyebrow",children:[o.jsx(Zl,{size:15}),"Project Gallery"]}),o.jsx("strong",{children:"Projects"}),o.jsx("p",{children:"Select a canvas snapshot to focus an open tab or load it in a new tab."})]}),o.jsxs("div",{className:"local-board-panel__actions project-gallery-panel__actions",children:[o.jsx("button",{type:"button",title:"New board",onClick:_i,children:o.jsx(wo,{size:15})}),o.jsx("button",{type:"button",title:"Close Project Gallery",onClick:()=>Tt("close-button"),children:o.jsx(Pt,{size:15})})]})]}),o.jsxs("div",{className:"project-gallery-body",children:[o.jsxs("aside",{className:"project-gallery-folder-rail","data-project-gallery-folder-rail":"true",children:[o.jsxs("div",{className:"project-storage-tabs",role:"tablist","aria-label":"Project storage mode","data-project-storage-show-local":Ye.showLocalTab?"true":"false","data-project-storage-show-cloud":Ye.showCloudTab?"true":"false",children:[o.jsxs("button",{type:"button",role:"tab","aria-selected":Me==="local",className:Me==="local"?"is-active":"","data-testid":"project-storage-tab-local",onClick:()=>Ei("local"),children:[o.jsx(go,{size:14}),"Local"]}),o.jsxs("button",{type:"button",role:"tab","aria-selected":Me==="cloud",className:Me==="cloud"?"is-active":"","data-testid":"project-storage-tab-cloud",onClick:()=>Ei("cloud"),children:[o.jsx(ds,{size:14}),"Cloud"]})]}),o.jsxs("label",{className:"project-gallery-current-name",children:[o.jsx("span",{children:"Current canvas"}),o.jsx("input",{"aria-label":"Board name",className:"board-name-input",maxLength:90,value:n.name,onChange:a=>Xs(a.target.value)})]}),o.jsxs("div",{className:"project-gallery-rail-card",children:[o.jsx("span",{children:"Storage"}),o.jsx("strong",{children:Me==="local"?`${Dt.length} local boards`:"Cloud gated"}),o.jsx("small",{children:Me==="local"?`${Ye.localProviderKind} provider / browser catalog and LocalBridge boards`:Ye.cloudStatusMessage??"Auth adapter required"})]}),o.jsxs("div",{className:"project-gallery-rail-card project-gallery-workspace-summary","data-testid":"project-gallery-workspace-summary",children:[o.jsx("span",{children:"Local Workspace"}),o.jsx("strong",{title:ot||void 0,children:Me==="local"?ot?ys(ot):lc(Ae):"Cloud gated"}),o.jsx("small",{children:Me==="local"?ot||Be||"Connect LocalBridge to choose storage.":"Workspace selection is local only."})]}),o.jsxs("label",{className:"project-gallery-startup-toggle","data-testid":"project-gallery-show-at-startup",children:[o.jsx("input",{type:"checkbox",checked:va,onChange:a=>cu(a.target.checked)}),o.jsx("span",{children:"Show at startup"})]})]}),o.jsx("section",{className:"project-gallery-board-area",children:Me==="local"?o.jsxs(o.Fragment,{children:[o.jsxs("div",{className:"local-board-section project-gallery-board-section",children:[o.jsxs("div",{className:"local-board-section__title",children:[o.jsx("span",{children:"Workspace"}),o.jsxs("small",{children:[Dt.length," saved"]})]}),o.jsxs("div",{className:"local-board-list local-board-list--stored project-gallery-board-grid","data-project-gallery-board-grid":"true",children:[Dt.map(a=>{const s=Fn===a.id,i=a.id===n.id;return o.jsx("div",{"data-testid":"stored-board-row","data-board-id":a.id,className:`local-board-row local-board-row--compound project-gallery-board-card ${i?"is-active":""} ${s?"is-editing":""}`,children:s?o.jsxs("div",{className:"stored-board-rename",children:[o.jsx("input",{"aria-label":"Rename saved board",maxLength:90,value:tn,onChange:l=>aa(l.target.value),onKeyDown:l=>cm(a.id,l),onPointerDown:l=>l.stopPropagation(),autoFocus:!0}),o.jsx("button",{type:"button",title:"Save board name","data-testid":"stored-board-rename-save",onClick:()=>nr(a.id),children:o.jsx(xr,{size:13})}),o.jsx("button",{type:"button",title:"Cancel rename","data-testid":"stored-board-rename-cancel",onClick:ar,children:o.jsx(Pt,{size:13})})]}):o.jsxs(o.Fragment,{children:[o.jsxs("button",{type:"button",className:"local-board-row__main","data-testid":"stored-board-open","data-project-gallery-open-board":"true",onClick:()=>Bi(a.id),onDoubleClick:l=>{l.stopPropagation(),Yi(a)},children:[a.sourceKind==="localBridge"?o.jsx(go,{size:15}):o.jsx(kt,{size:15}),o.jsxs("span",{children:[o.jsx("strong",{children:tt(a.name)}),o.jsx("small",{children:my(a)}),i&&o.jsx("small",{className:"project-gallery-open-tab-badge",children:"Open tab"})]})]}),o.jsx("button",{type:"button",className:"local-board-row__action",title:"Rename board","data-testid":"stored-board-rename",onClick:()=>Yi(a),children:o.jsx(td,{size:14})}),o.jsx("button",{type:"button",className:"local-board-row__action",title:"Delete board","data-testid":"stored-board-delete",disabled:i,onClick:()=>Ks(a.id,"project-gallery"),children:o.jsx(Rs,{size:14})})]})},a.id)}),Dt.length===0&&o.jsx("p",{className:"local-board-message",children:"No saved React boards yet."})]})]}),o.jsxs("div",{className:"local-board-section project-gallery-bridge-section",children:[o.jsxs("div",{className:"local-board-section__title",children:[o.jsx("span",{children:"LocalBridge"}),o.jsx("button",{type:"button",title:"Refresh local boards",onClick:Gt,disabled:Ae==="checking",children:Ae==="checking"?o.jsx(Jt,{size:15,className:"spin-icon"}):o.jsx(jo,{size:15})})]}),o.jsxs("div",{className:`local-board-state local-board-state--${Ae}`,children:[Ae==="blocked"?o.jsx(og,{size:15}):Ae==="unavailable"?o.jsx(sg,{size:15}):o.jsx(go,{size:15}),o.jsx("span",{children:lc(Ae)}),Ae==="blocked"&&!lo()&&o.jsx("button",{type:"button",onClick:uu,children:"Enable"})]}),_t&&o.jsx("p",{className:"local-board-message",children:_t}),o.jsxs("div",{className:"project-gallery-workspace-panel","data-testid":"project-gallery-workspace-panel","data-project-gallery-workspace-panel":"true",children:[o.jsxs("div",{className:"project-gallery-workspace-panel__main",children:[o.jsx(Cr,{size:16}),o.jsxs("span",{children:[o.jsx("strong",{children:"Local Workspace"}),o.jsx("small",{title:ot||void 0,children:ot||Be||"LocalBridge workspace not connected."})]})]}),o.jsxs("div",{className:"project-gallery-workspace-panel__actions",children:[o.jsxs("button",{type:"button","data-testid":"project-gallery-workspace-refresh",title:"Refresh workspace",disabled:De,onClick:()=>void mu("workspace-panel"),children:[o.jsx(jo,{size:14}),o.jsx("span",{children:"Refresh"})]}),o.jsxs("button",{type:"button","data-testid":"project-gallery-workspace-browse",title:"Select Local Storage",disabled:De||Ae==="blocked"&&!lo(),onClick:()=>void pu(),children:[De?o.jsx(Jt,{size:14,className:"spin-icon"}):o.jsx(Cr,{size:14}),o.jsx("span",{children:"Select Local Storage"})]})]}),Pn.length>0&&o.jsx("div",{className:"project-gallery-workspace-history","data-testid":"project-gallery-workspace-history",children:Pn.map(a=>o.jsx("button",{type:"button",title:a,disabled:De||a===ot,onClick:()=>void Gs(a,"history"),children:ys(a,40)},a))})]}),o.jsxs("button",{type:"button",className:"local-board-export","data-testid":"localbridge-export",disabled:Bt||!!((hl=n.source)!=null&&hl.partialImport)||!!((fl=n.source)!=null&&fl.truncated)||Ae==="blocked"&&!lo(),title:(bl=n.source)!=null&&bl.partialImport?"Export blocked for partial original imports":(yl=n.source)!=null&&yl.truncated?"Export blocked for truncated imported boards":"Export current board to LocalBridge",onClick:()=>void gu(),children:[Bt?o.jsx(Jt,{size:15,className:"spin-icon"}):o.jsx(ad,{size:15}),o.jsx("span",{children:Bt?"Exporting":"Export current"})]}),o.jsx("div",{className:"local-board-list project-gallery-bridge-list",children:Ve.slice(0,14).map(a=>o.jsxs("button",{type:"button","data-testid":"localbridge-board-row","data-board-id":a.Id,className:"local-board-row",disabled:!!Re,onClick:()=>void Cu(a),children:[o.jsx(go,{size:15}),o.jsxs("span",{children:[o.jsx("strong",{children:tt(a.Title)}),o.jsx("small",{children:ri(a.UpdatedAt)})]}),Re===a.Id&&o.jsx(Jt,{size:15,className:"spin-icon"})]},a.Id))})]})]}):o.jsxs("div",{className:"project-cloud-shell","data-testid":"project-cloud-shell","data-project-cloud-status":Ye.isCloudAvailable?"available":"gated","data-project-cloud-plan":Ye.cloudPlanKey,"data-project-cloud-entitlement":Ye.cloudEntitlementStatus,"data-production-adapter-state":Je.overallState,"data-project-cloud-database-mode":Je.cloudBoards.mode,"data-project-cloud-database-ready":Je.cloudBoards.canAttempt?"true":"false","data-project-cloud-asset-upload-mode":Je.cloudAssetUpload.mode,"data-project-cloud-asset-upload-ready":Je.cloudAssetUpload.canAttempt?"true":"false","data-client-secret-blocked":Je.forbiddenClientSecretKeys.length>0?"true":"false",children:[o.jsx("div",{className:"project-cloud-shell__icon",children:fe?o.jsx(ds,{size:22}):o.jsx(rg,{size:22})}),o.jsx("strong",{children:fe?"Cloud boards are provider-ready":"Cloud projects are adapter-gated"}),o.jsx("p",{children:fe?"Supabase auth and board storage are connected for this browser session. Cloud actions call the provider adapter only from this tab.":"The original project popup had a Cloud tab for authenticated boards. This React port keeps that navigation habit visible, but cloud sync is disabled until auth and database adapters are connected."}),o.jsxs("div",{className:"project-cloud-shell__current",children:[o.jsxs("span",{children:["Current: ",fe?"Cloud ready":"Local"]}),o.jsxs("small",{children:[tt(n.name)," / ",On??Ye.cloudStatusMessage??"saved in this browser"]})]}),o.jsxs("button",{type:"button","data-testid":"project-cloud-new-board",disabled:!fe||Nt,title:fe?"Create and save a cloud board":"Cloud board creation requires the cloud adapter",onClick:bu,children:[Nt?o.jsx(Jt,{size:14,className:"spin-icon"}):o.jsx(wo,{size:14}),Nt?"Saving":"New cloud board"]}),o.jsxs("button",{type:"button","data-testid":"project-cloud-save-current",disabled:!fe||Nt,title:fe?"Save current board to Supabase":"Cloud save requires Supabase login",onClick:fu,children:[o.jsx(ad,{size:14}),"Save current"]}),o.jsxs("button",{type:"button","data-testid":"project-cloud-refresh",disabled:!fe||Nt,title:fe?"Refresh cloud boards":"Cloud refresh requires Supabase login",onClick:()=>void Ys("refresh-button"),children:[Nt?o.jsx(Jt,{size:14,className:"spin-icon"}):o.jsx(jo,{size:14}),"Refresh cloud"]}),o.jsxs("button",{type:"button","data-testid":"project-cloud-login-shell",onClick:()=>e("/login"),children:[o.jsx(ds,{size:14}),"Open login shell"]}),fe&&o.jsxs("div",{className:"local-board-list project-gallery-cloud-list","data-testid":"project-cloud-board-list",children:[ea.map(a=>o.jsxs("button",{type:"button","data-testid":"project-cloud-board-row","data-board-id":a.id,className:"local-board-row",disabled:!!Lo,onClick:()=>void hu(a),children:[o.jsx(ds,{size:15}),o.jsxs("span",{children:[o.jsx("strong",{children:tt(a.name)}),o.jsxs("small",{children:[ri(a.updatedAt)," / ",a.nodeCount," nodes"]})]}),Lo===a.id&&o.jsx(Jt,{size:15,className:"spin-icon"})]},a.id)),ea.length===0&&o.jsx("p",{className:"local-board-message",children:"No cloud boards loaded."})]})]})})]})]})})})]}),Un&&ne&&o.jsx(Ul,{launchers:Ta,activeLauncher:ne,template:Ge,selectedOptionId:rt,values:zt,validationMessage:Hn??(ln?null:Kn),canCreate:ln||!Kn,primaryLabel:ln?"Add template card":"Create board",onLauncherSelected:Du,onOptionSelected:$u,onInputChanged:zu,onCreate:yu,onClose:Fu}),Bo&&o.jsx("div",{className:"template-studio-chooser-backdrop","data-testid":"template-studio-chooser",onMouseDown:$i,children:o.jsxs("section",{className:"template-studio-chooser floating-panel",onMouseDown:a=>a.stopPropagation(),children:[o.jsxs("header",{className:"template-studio-chooser__head",children:[o.jsxs("div",{children:[o.jsx("span",{children:"Template Studio"}),o.jsx("strong",{children:"Current Canvas Authoring Mode"})]}),o.jsx("button",{type:"button",title:"Close Template Studio chooser","data-testid":"template-studio-chooser-close",onClick:$i,children:o.jsx(Pt,{size:15})})]}),o.jsx("p",{className:"template-studio-chooser__description",children:"Use the existing canvas and node UI, then attach template roles and input variables before compiling a manifest."}),o.jsxs("div",{className:"template-studio-chooser__actions",children:[o.jsxs("button",{type:"button","data-testid":"template-studio-start-new",className:"template-studio-chooser__action",onClick:Hu,children:[o.jsx("span",{className:"template-studio-chooser__icon",children:o.jsx(wo,{size:17})}),o.jsxs("span",{children:[o.jsx("strong",{children:"New template board"}),o.jsx("small",{children:"Start a blank Studio draft on a new local board."})]})]}),o.jsxs("button",{type:"button","data-testid":"template-studio-convert-current",className:"template-studio-chooser__action",onClick:Wu,children:[o.jsx("span",{className:"template-studio-chooser__icon",children:o.jsx(cs,{size:17})}),o.jsxs("span",{children:[o.jsx("strong",{children:"Convert current board"}),o.jsx("small",{children:"Keep this board and assign roles to existing nodes."})]})]})]})]})}),Wn&&o.jsxs(o.Fragment,{children:[o.jsxs("section",{className:"template-studio-toolbar-stack","data-testid":"template-studio-toolbar",onMouseDown:a=>a.stopPropagation(),children:[o.jsxs("div",{className:"template-studio-toolbar floating-panel",children:[o.jsxs("div",{className:"template-studio-toolbar__badge",children:[o.jsx(ls,{size:15}),o.jsx("span",{children:"Template Studio"})]}),o.jsxs("div",{className:"template-studio-toolbar__meta",children:["Editing ",je.templateId]}),o.jsx("button",{type:"button",title:"Compile manifest","data-testid":"template-studio-compile",onClick:Zs,children:o.jsx(vn,{size:15})}),o.jsx("button",{type:"button",title:"Test create board","data-testid":"template-studio-test-create",onClick:Ku,children:o.jsx(Ca,{size:15})}),o.jsx("button",{type:"button",title:"Copy manifest JSON","data-testid":"template-studio-copy",onClick:()=>void Gu(),children:o.jsx(vo,{size:15})}),o.jsx("button",{type:"button",title:"Save template draft","data-testid":"template-studio-save",onClick:Vu,children:o.jsx(xr,{size:15})}),o.jsx("button",{type:"button",title:"Exit Template Studio","data-testid":"template-studio-close",onClick:Ui,children:o.jsx(Pt,{size:15})})]}),o.jsx("div",{className:"template-studio-toolbar template-studio-toolbar--roles floating-panel",children:br.filter(a=>a.studioNodeType!=="template.note").map(a=>o.jsx("button",{type:"button",title:`Add ${a.label}`,"data-testid":"template-studio-add-node","data-studio-node-type":a.studioNodeType,onClick:()=>Yu(a.studioNodeType),children:o.jsx("span",{children:a.shortLabel})},a.studioNodeType))}),Q&&o.jsxs("div",{className:"template-studio-toolbar template-studio-toolbar--selected floating-panel",children:[o.jsxs("div",{className:"template-studio-toolbar__meta template-studio-toolbar__meta--selected",children:["Selected: ",Q.title||Q.kind]}),br.map(a=>o.jsx("button",{type:"button",title:a.label,className:so===a.studioNodeType?"is-active":"","data-testid":"template-studio-role","data-studio-node-type":a.studioNodeType,onClick:()=>Hi(a.studioNodeType),children:o.jsx("span",{children:a.shortLabel})},a.studioNodeType))]})]}),o.jsxs("aside",{className:"template-studio-panel floating-panel","data-testid":"template-studio-panel",onMouseDown:a=>a.stopPropagation(),children:[o.jsxs("header",{className:"template-studio-panel__head",children:[o.jsxs("div",{children:[o.jsx("span",{children:"Template Meta"}),o.jsx("strong",{children:je.templateTitle})]}),o.jsx("button",{type:"button",title:"Close Template Studio",onClick:Ui,children:o.jsx(Pt,{size:15})})]}),o.jsxs("div",{className:"template-studio-panel__body",children:[o.jsxs("section",{className:"template-studio-panel__section",children:[o.jsxs("label",{className:"template-studio-panel__field",children:[o.jsx("span",{children:"Template Id"}),o.jsx("input",{type:"text","data-testid":"template-studio-template-id",value:je.templateId,onChange:a=>Yo("templateId",a.target.value)})]}),o.jsxs("label",{className:"template-studio-panel__field",children:[o.jsx("span",{children:"Template Title"}),o.jsx("input",{type:"text",value:je.templateTitle,onChange:a=>Yo("templateTitle",a.target.value)})]}),o.jsxs("label",{className:"template-studio-panel__field",children:[o.jsx("span",{children:"Category"}),o.jsx("input",{type:"text",value:je.category,onChange:a=>Yo("category",a.target.value)})]}),o.jsxs("label",{className:"template-studio-panel__field",children:[o.jsx("span",{children:"Generated Board Title"}),o.jsx("input",{type:"text",value:je.boardTitle,onChange:a=>Yo("boardTitle",a.target.value)})]})]}),Q?o.jsxs("section",{className:"template-studio-panel__section","data-testid":"template-studio-selected-node",children:[o.jsxs("div",{className:"template-studio-panel__node-summary",children:[o.jsx("strong",{children:Q.title||Q.kind}),o.jsx("span",{children:Hm})]}),o.jsxs("label",{className:"template-studio-panel__field",children:[o.jsx("span",{children:"Template Role"}),o.jsxs("select",{value:so,onChange:a=>Hi(a.target.value),children:[o.jsx("option",{value:"",children:"Unassigned"}),br.map(a=>o.jsx("option",{value:a.studioNodeType,children:a.label},a.studioNodeType))]})]}),o.jsxs("label",{className:"template-studio-panel__field",children:[o.jsx("span",{children:"Template Node Id"}),o.jsx("input",{type:"text",value:((xl=Q.metadata)==null?void 0:xl[Y.templateNodeId])??"",onChange:a=>Kt(Y.templateNodeId,a.target.value)})]}),o.jsxs("label",{className:"template-studio-panel__field",children:[o.jsx("span",{children:"Compile Target"}),o.jsxs("select",{value:((Cl=Q.metadata)==null?void 0:Cl[Y.compileTarget])??"",onChange:a=>Kt(Y.compileTarget,a.target.value),children:[o.jsx("option",{value:"",children:"Auto"}),Ip.map(a=>o.jsx("option",{value:a,children:a},a))]})]}),Wm?o.jsxs(o.Fragment,{children:[o.jsxs("label",{className:"template-studio-panel__field",children:[o.jsx("span",{children:"Input Key"}),o.jsx("input",{type:"text",value:((kl=Q.metadata)==null?void 0:kl[Y.inputKey])??"",onChange:a=>Kt(Y.inputKey,a.target.value)})]}),o.jsxs("label",{className:"template-studio-panel__field",children:[o.jsx("span",{children:"Input Type"}),o.jsxs("select",{value:((wl=Q.metadata)==null?void 0:wl[Y.inputType])??"text",onChange:a=>Kt(Y.inputType,a.target.value),children:[o.jsx("option",{value:"text",children:"Text"}),o.jsx("option",{value:"textarea",children:"Textarea"}),o.jsx("option",{value:"select",children:"Select"})]})]}),o.jsxs("label",{className:"template-studio-panel__checkbox",children:[o.jsx("input",{type:"checkbox",checked:(((Sl=Q.metadata)==null?void 0:Sl[Y.inputRequired])??"").toLowerCase()==="true",onChange:a=>Kt(Y.inputRequired,String(a.target.checked))}),o.jsx("span",{children:"Required input"})]}),o.jsxs("label",{className:"template-studio-panel__field",children:[o.jsx("span",{children:"Placeholder"}),o.jsx("input",{type:"text",value:((vl=Q.metadata)==null?void 0:vl[Y.inputPlaceholder])??"",onChange:a=>Kt(Y.inputPlaceholder,a.target.value)})]}),o.jsxs("label",{className:"template-studio-panel__field",children:[o.jsx("span",{children:"Default Value"}),o.jsx("input",{type:"text",value:((jl=Q.metadata)==null?void 0:jl[Y.inputDefaultValue])??"",onChange:a=>Kt(Y.inputDefaultValue,a.target.value)})]}),o.jsxs("label",{className:"template-studio-panel__field",children:[o.jsx("span",{children:"Description"}),o.jsx("textarea",{value:((Il=Q.metadata)==null?void 0:Il[Y.inputDescription])??"",onChange:a=>Kt(Y.inputDescription,a.target.value)})]}),o.jsxs("label",{className:"template-studio-panel__field",children:[o.jsx("span",{children:"Select Options"}),o.jsx("textarea",{placeholder:`value|label
49
- value2|label2`,value:((Nl=Q.metadata)==null?void 0:Nl[Y.inputOptions])??"",onChange:a=>Kt(Y.inputOptions,a.target.value)})]})]}):o.jsx("p",{className:"template-studio-panel__hint",children:"Edit title and body directly on the canvas. This panel controls the template role and compile target."})]}):o.jsx("section",{className:"template-studio-panel__section",children:o.jsx("p",{className:"template-studio-panel__hint",children:"Select a canvas node to assign a template role."})}),o.jsxs("section",{className:"template-studio-panel__section",children:[o.jsxs("div",{className:"template-studio-panel__section-head",children:[o.jsx("span",{children:"Compiled Manifest"}),Yn&&o.jsx("small",{children:Yn})]}),pe!=null&&pe.issues.length?o.jsx("div",{className:"template-studio-panel__issues","data-testid":"template-studio-issues",children:pe.issues.map(a=>o.jsxs("div",{className:"template-studio-panel__issue",children:[o.jsx("strong",{children:a.code}),o.jsx("span",{children:a.message})]},`${a.code}-${a.message}`))}):null,pe?o.jsx("pre",{className:"template-studio-panel__manifest","data-testid":"template-studio-manifest",children:pe.manifestJson}):o.jsx("p",{className:"template-studio-panel__hint",children:"Compile to preview the JSON manifest for the selected Studio nodes."})]})]})]})]}),Oo&&Qo&&o.jsx(Ul,{launchers:[al],activeLauncher:al,template:Qo,selectedOptionId:null,values:Ut,validationMessage:sn??nl,canCreate:!nl,onLauncherSelected:()=>{},onOptionSelected:()=>{},onInputChanged:qu,onCreate:Ju,onClose:Xu}),o.jsx("input",{ref:qn,type:"file",accept:"application/json,.json",multiple:!0,hidden:!0,"data-testid":"board-import-input",onChange:a=>{wu(a.currentTarget.files),a.currentTarget.value=""}}),!pl&&o.jsxs(o.Fragment,{children:[o.jsx("div",{className:"canvas-toolbar",role:"toolbar","aria-label":qm?"MindCanvas all tools":"MindCanvas curated tools","data-testid":"canvas-function-toolbar","data-function-toolbar-mode":Aa,children:Aa==="curated"?o.jsxs(o.Fragment,{children:[o.jsx("button",{type:"button",title:"Add note","data-testid":"note-node-add",onClick:()=>Ce("note"),children:o.jsx(Ts,{size:17})}),o.jsx("button",{type:"button",title:"Add image","data-testid":"image-node-add",onClick:()=>Ce("image"),children:o.jsx(jn,{size:17})}),o.jsx("button",{type:"button",title:"Add video","data-testid":"video-node-add",onClick:()=>Ce("video"),children:o.jsx(In,{size:17})}),o.jsx("button",{type:"button",title:"Add remote monitor","data-testid":"remote-monitor-node-add",onClick:()=>Ce("remote-monitor"),children:o.jsx(Ms,{size:17})}),o.jsx("button",{type:"button",title:"Add AI Task","data-testid":"ai-task-node-add",onClick:()=>Ce("ai-task"),children:o.jsx(Sn,{size:17})}),o.jsx("button",{type:"button",title:"Add file reference","data-testid":"file-node-add",onClick:()=>Ce("file"),children:o.jsx(Vr,{size:17})}),o.jsx("button",{type:"button",title:"Tools",onClick:()=>e("/tools"),children:o.jsx(ks,{size:17})}),o.jsx("span",{className:"toolbar-separator"}),o.jsx("button",{type:"button",title:"Run all graphs","data-testid":"automation-run-all","data-ai-task-total":dt.total,"data-ai-task-runnable":dt.runnable,"data-ai-task-running":dt.running,onClick:Ji,children:o.jsx(Ca,{size:17})}),o.jsx("button",{type:"button",title:"Run selected graph","data-testid":"automation-run-selected","data-selected-graph-size":es.size,"data-selected-graph-runnable":es.runnable,disabled:!Q||Q.kind!=="ai-task",onClick:Xi,children:o.jsx(kr,{size:17})}),o.jsx("button",{type:"button",title:"Pause running AI tasks","data-testid":"automation-pause","data-running-ai-tasks":dt.running,onClick:Zi,children:o.jsx(Ao,{size:17})}),o.jsx("button",{type:"button",title:"Stop active AI tasks","data-testid":"automation-stop","data-active-ai-tasks":dt.active,"data-paused-ai-tasks":dt.paused,onClick:Qi,children:o.jsx(nd,{size:15})}),o.jsx("button",{type:"button",title:gt?"Generating flow":"Generate flow",disabled:!Q||gt,onClick:()=>void el(),children:gt?o.jsx(Jt,{size:17,className:"spin-icon"}):o.jsx(cs,{size:17})}),o.jsx("span",{className:"toolbar-separator"}),o.jsx("button",{type:"button",title:"Undo","data-testid":"history-undo",disabled:d.length===0,onClick:Jo,children:o.jsx(od,{size:17})}),o.jsx("button",{type:"button",title:"Redo","data-testid":"history-redo",disabled:p.length===0,onClick:Zo,children:o.jsx(sd,{size:17})})]}):o.jsxs(o.Fragment,{children:[o.jsx("button",{type:"button",title:"Add note","data-testid":"note-node-add",onClick:()=>Ce("note"),children:o.jsx(Ts,{size:17})}),o.jsx("button",{type:"button",title:"Add memo","data-testid":"memo-node-add",onClick:()=>Ce("memo"),children:o.jsx(hc,{size:17})}),o.jsx("button",{type:"button",title:"Add markdown","data-testid":"markdown-node-add",onClick:()=>Ce("markdown"),children:o.jsx(kt,{size:17})}),o.jsx("button",{type:"button",title:"Add CSV table","data-testid":"csv-table-node-add",onClick:()=>Ce("csv-table"),children:o.jsx(Ql,{size:17})}),o.jsx("button",{type:"button",title:"Add code","data-testid":"code-node-add",onClick:()=>Ce("code"),children:o.jsx(vn,{size:17})}),o.jsx("button",{type:"button",title:"Add AI Task","data-testid":"ai-task-node-add",onClick:()=>Ce("ai-task"),children:o.jsx(Sn,{size:17})}),o.jsx("button",{type:"button",title:"Add Code Note","data-testid":"code-note-node-add",onClick:em,children:o.jsx(vn,{size:17})}),o.jsx("button",{type:"button",title:"Add Agent Command","data-testid":"agent-command-node-add",onClick:Qu,children:o.jsx(ig,{size:17})}),o.jsx("button",{type:"button",title:"Add image generation spec","data-testid":"image-generate-node-add",onClick:()=>Ce("ai-task","image-generate"),children:o.jsx(jn,{size:17})}),o.jsx("button",{type:"button",title:"Add video generation spec","data-testid":"video-generate-node-add",onClick:()=>Ce("ai-task","video-generate"),children:o.jsx(In,{size:17})}),o.jsx("button",{type:"button",title:"Add image","data-testid":"image-node-add",onClick:()=>Ce("image"),children:o.jsx(jn,{size:17})}),o.jsx("button",{type:"button",title:"Add image mask","data-testid":"mask-node-add",onClick:()=>Ce("mask"),children:o.jsx(lg,{size:17})}),o.jsx("button",{type:"button",title:"Add video","data-testid":"video-node-add",onClick:()=>Ce("video"),children:o.jsx(In,{size:17})}),o.jsx("button",{type:"button",title:"Add embed","data-testid":"embed-node-add",onClick:()=>Ce("embed"),children:o.jsx(Nn,{size:17})}),o.jsx("button",{type:"button",title:"Add remote monitor","data-testid":"remote-monitor-node-add",onClick:()=>Ce("remote-monitor"),children:o.jsx(Ms,{size:17})}),o.jsx("button",{type:"button",title:"Add PDF","data-testid":"pdf-node-add",onClick:()=>Ce("pdf"),children:o.jsx(kt,{size:17})}),o.jsx("button",{type:"button",title:"Add file reference","data-testid":"file-node-add",onClick:()=>Ce("file"),children:o.jsx(Vr,{size:17})}),o.jsx("button",{type:"button",title:"Add directory reference","data-testid":"directory-node-add",onClick:()=>Ce("directory"),children:o.jsx(Cr,{size:17})}),o.jsx("button",{type:"button",title:"Templates","data-testid":"template-launcher-open",onClick:Ou,children:o.jsx(ls,{size:17})}),o.jsx("button",{type:"button",title:"Template Studio",className:Wn||Bo?"is-active":"","data-testid":"template-studio-open",onClick:Uu,children:o.jsx(td,{size:17})}),o.jsx("button",{type:"button",title:"Import board JSON","data-testid":"board-import-open",onClick:ku,children:o.jsx(dg,{size:17})}),o.jsx("button",{type:"button",title:"Tools",onClick:()=>e("/tools"),children:o.jsx(ks,{size:17})}),o.jsx("span",{className:"toolbar-separator"}),o.jsx("button",{type:"button",title:"Run all graphs","data-testid":"automation-run-all","data-ai-task-total":dt.total,"data-ai-task-runnable":dt.runnable,"data-ai-task-running":dt.running,onClick:Ji,children:o.jsx(Ca,{size:17})}),o.jsx("button",{type:"button",title:"Run selected graph","data-testid":"automation-run-selected","data-selected-graph-size":es.size,"data-selected-graph-runnable":es.runnable,disabled:!Q||Q.kind!=="ai-task",onClick:Xi,children:o.jsx(kr,{size:17})}),o.jsx("button",{type:"button",title:"Pause running AI tasks","data-testid":"automation-pause","data-running-ai-tasks":dt.running,onClick:Zi,children:o.jsx(Ao,{size:17})}),o.jsx("button",{type:"button",title:"Stop active AI tasks","data-testid":"automation-stop","data-active-ai-tasks":dt.active,"data-paused-ai-tasks":dt.paused,onClick:Qi,children:o.jsx(nd,{size:15})}),o.jsx("button",{type:"button",title:gt?"Generating flow":"Generate flow",disabled:!Q||gt,onClick:()=>void el(),children:gt?o.jsx(Jt,{size:17,className:"spin-icon"}):o.jsx(cs,{size:17})}),o.jsx("span",{className:"toolbar-separator"}),o.jsx("button",{type:"button",title:"Undo","data-testid":"history-undo",disabled:d.length===0,onClick:Jo,children:o.jsx(od,{size:17})}),o.jsx("button",{type:"button",title:"Redo","data-testid":"history-redo",disabled:p.length===0,onClick:Zo,children:o.jsx(sd,{size:17})})]})}),o.jsxs("div",{className:"search-panel floating-panel","data-testid":"mindcanvas-search-panel","data-search-engine":se,"data-search-worker-state":ge,children:[o.jsxs("div",{className:"search-input-row",children:[o.jsx(cg,{size:16}),o.jsx("input",{ref:cn,"data-testid":"mindcanvas-search-input","aria-label":"Search text",value:S,onChange:a=>D(a.target.value),onKeyDown:Om,placeholder:"Search text ..."}),o.jsx("span",{className:"search-count","data-testid":"mindcanvas-search-count","aria-live":"polite",children:Xm}),o.jsx("button",{type:"button",title:"Previous search result","data-testid":"mindcanvas-search-prev",disabled:O.length===0,onClick:()=>oo(-1),children:o.jsx(ug,{size:14})}),o.jsx("button",{type:"button",title:"Next search result","data-testid":"mindcanvas-search-next",disabled:O.length===0,onClick:()=>oo(1),children:o.jsx(yc,{size:14})})]}),dl&&o.jsx("div",{className:"search-current","data-testid":"mindcanvas-search-current","aria-live":"polite",children:cl?o.jsxs(o.Fragment,{children:[o.jsxs("span",{children:[W+1," / ",O.length]}),o.jsxs("button",{type:"button","data-testid":"mindcanvas-search-focus",onClick:()=>dr("current-button"),children:["Focus ",cl.title]})]}):o.jsx("span",{children:"No matches"})}),O.length>0&&o.jsx("div",{className:"search-results","data-testid":"mindcanvas-search-results",children:O.map((a,s)=>o.jsxs("button",{type:"button","data-testid":"mindcanvas-search-result",className:s===W?"is-active":"","aria-current":s===W?"true":void 0,onMouseEnter:()=>re(s),onClick:()=>lr(a,"result-click"),children:[o.jsx("strong",{children:a.title}),o.jsx("span",{children:a.body.slice(0,84)})]},a.id))})]})]}),G&&o.jsxs("div",{className:"connection-toast floating-panel",children:[o.jsx(xr,{size:14}),G.dragging?`Release over another node connector to create a ${G.kind} line.`:`Drag from a connector, or select another node connector, to create a ${G.kind} line.`,o.jsx("button",{type:"button",onClick:()=>V(null),children:"Cancel"})]}),(fa==null?void 0:fa.result)&&o.jsxs("section",{className:"result-popover floating-panel","data-testid":"ai-result-popover",children:[o.jsxs("div",{className:"result-popover__header",children:[o.jsxs("strong",{children:[fa.title," Result"]}),o.jsx("button",{type:"button",title:"Close",onClick:()=>te(null),children:o.jsx(Pt,{size:14})})]}),o.jsxs("div",{className:"result-popover__actions","data-testid":"ai-result-popover-actions",children:[o.jsxs("button",{type:"button",title:"Copy result",onClick:()=>void Lm(fa),children:[o.jsx(vo,{size:14}),o.jsx("span",{children:"Copy"})]}),o.jsxs("button",{type:"button",title:"Archive result as a Markdown node",onClick:()=>Pm(fa),children:[o.jsx(kt,{size:14}),o.jsx("span",{children:"Archive"})]}),o.jsxs("button",{type:"button",title:"Stage a follow-up AI Task from this result",onClick:()=>Em(fa),children:[o.jsx(Sn,{size:14}),o.jsx("span",{children:"Follow-up"})]})]}),o.jsx("pre",{className:"result-popover__body",children:fa.result})]}),He&&o.jsx(Kf,{url:He.url,fileName:He.fileName,onClose:()=>{jt(null),f.emit("node.pdf.preview.close")}}),sl&&o.jsx(Np,{node:sl,onSave:lm,onClose:im}),ht&&o.jsx(Ap,{settings:n.settings,onPatchSettings:Ie,onClose:_u}),ol&&o.jsx(Gf,{board:n,rootNode:ol,onClose:km,onStatus:Gi,onRemove:Ki,onSubmitFollowUp:Sm,onApproval:wm,onAddArtifact:vm}),oa&&o.jsx(Mp,{board:n,selectedNode:Q??null,selectedCount:m.length,input:v,viewport:he,viewportSize:z,localBridgeState:Ae,syncStatus:En,syncMessage:Na,buildPrompt:Ym,navigate:e,onClose:Bu}),!pl&&o.jsxs("div",{className:"global-input-shell","data-active-submits":_,"data-submit-state":_>0?"active":"idle",onFocusCapture:()=>void Qn("input-focus"),onPointerDown:()=>void Qn("input-pointer"),children:[o.jsx("textarea",{ref:Xn,"data-testid":"global-input-textarea",value:v,placeholder:(Q==null?void 0:Q.kind)==="ai-task"?"Run selected AI Task...":"Talk with AI...",onChange:a=>P(a.target.value),onKeyDown:a=>{a.repeat||a.nativeEvent.isComposing||a.keyCode===229||(a.ctrlKey||a.metaKey)&&a.key==="Enter"&&(a.preventDefault(),qi())}}),o.jsxs("div",{className:"input-controls",children:[o.jsx("button",{className:`input-settings-button ${ht?"is-active":""}`,type:"button",title:"AI Settings","aria-label":"AI Settings","aria-pressed":ht?"true":void 0,"data-testid":"ai-settings-open",onClick:Eu,children:o.jsx(ks,{size:16})}),["Text","Image","Video"].map(a=>o.jsx("button",{className:n.settings.inputMode===a?"is-active":"",type:"button","data-testid":`global-input-mode-${a.toLowerCase()}`,onClick:()=>{Di("inputMode",a),Qn(`mode-${a.toLowerCase()}`)},children:a},a)),n.settings.inputMode==="Text"&&o.jsxs(o.Fragment,{children:[o.jsx(ms,{value:vu,options:ju,onChange:a=>Ru(a),ariaLabel:"Text model",className:"catalog-pill--model",menuClassName:"catalog-pill__menu--model",testId:"text-model-select"}),o.jsx(ms,{value:n.settings.effort,options:Tu,onChange:a=>Di("effort",a),ariaLabel:"Reasoning effort",className:"catalog-pill--effort",testId:"reasoning-effort-select"})]}),xt&&mr&&o.jsxs(o.Fragment,{children:[o.jsx(ms,{value:mr.model.id,options:xt==="Image"?Iu:Nu,onChange:a=>Lu(xt,a),ariaLabel:`${xt} model`,className:"catalog-pill--model",menuClassName:"catalog-pill__menu--model",testId:`${xt.toLowerCase()}-model-select`}),o.jsx(ms,{value:mr.aspect.id,options:xt==="Image"?Au:Mu,onChange:a=>Pu(xt,a),ariaLabel:`${xt} aspect ratio`,className:"catalog-pill--aspect",testId:`${xt.toLowerCase()}-aspect-select`})]}),o.jsx("span",{className:"input-controls__spacer"}),o.jsx("span",{className:"global-submit-count","aria-live":"polite",children:_}),o.jsx("button",{className:"send-button",type:"button",title:"Submit","data-testid":"global-input-submit",disabled:!Km,onClick:qi,children:o.jsx(kr,{size:18})})]})]}),o.jsxs("div",{className:"canvas-view-control-stack","data-testid":"canvas-view-controls",children:[o.jsxs("section",{className:"canvas-view-panel floating-panel","aria-label":"Canvas grid controls","data-testid":"canvas-grid-controls",children:[qc.map(a=>o.jsx("button",{type:"button",title:`Use ${a} grid`,"aria-label":`Use ${a} grid`,"aria-pressed":as===a,className:as===a?"is-active":"","data-testid":`canvas-grid-mode-${a}`,onClick:()=>om(a),children:a==="dot"?o.jsx(mg,{size:15}):a==="line"?o.jsx(pg,{size:15}):a==="particles"?o.jsx(ed,{size:15}):o.jsx(cs,{size:15})},a)),o.jsx("span",{className:"canvas-view-panel__separator"}),o.jsx("button",{type:"button",title:"Toggle grid snap","aria-label":"Toggle grid snap","aria-pressed":ul,className:ul?"is-active":"","data-testid":"canvas-grid-snap-toggle",onClick:sm,children:o.jsx(gg,{size:15})})]}),o.jsxs("section",{className:"canvas-bookmark-strip floating-panel","aria-label":"Camera bookmarks","data-testid":"camera-bookmark-strip",children:[o.jsx("button",{type:"button",title:"Go to home view","aria-label":"Go to home view","data-testid":"camera-bookmark-home",onClick:Qs,children:o.jsx(hg,{size:15})}),(()=>{const a=!!bs(ml[xa]);return o.jsx("button",{type:"button",title:a?"Go to camera slot N. Shift-click to save.":"Slot N empty. Click for Home, shift-click to save.","aria-label":a?"Go to camera slot N":"Empty camera slot N","data-testid":"camera-bookmark-slot-n","data-slot-saved":a?"true":"false",className:`canvas-bookmark-slot ${a?"is-saved":""}`,onClick:s=>{s.shiftKey||s.altKey?Da(xa):eo(xa)},children:o.jsx("span",{"aria-hidden":"true",children:"N"})})})(),Tr.map(a=>{const s=!!bs(ml[a]);return o.jsx("button",{type:"button",title:s?`Go to camera slot ${a}. Shift-click to save.`:`Slot ${a} empty. Click for Home, shift-click to save.`,"aria-label":s?`Go to camera slot ${a}`:`Empty camera slot ${a}`,"data-testid":`camera-bookmark-slot-${a}`,"data-slot-saved":s?"true":"false",className:`canvas-bookmark-slot ${s?"is-saved":""}`,onClick:i=>{i.shiftKey||i.altKey?Da(a):eo(a)},children:o.jsx("span",{"aria-hidden":"true",children:a})},a)}),o.jsx("button",{type:"button",title:"Save current camera to the next empty slot","aria-label":"Save current camera to the next empty slot","data-testid":"camera-bookmark-save-next",onClick:nm,children:o.jsx(fg,{size:15})})]})]}),o.jsxs("div",{className:"bottom-controls",children:[o.jsx("button",{type:"button",title:"Mouse wheel mode","aria-label":"Toggle mouse wheel mode","aria-pressed":n.settings.wheelMode,className:n.settings.wheelMode?"is-active":"","data-testid":"canvas-wheel-mode-toggle","data-wheel-mode":n.settings.wheelMode?"mouse":"trackpad",onClick:()=>er("button"),children:o.jsx(bg,{size:17})}),o.jsx("button",{type:"button",title:`Cursor direction ${n.settings.cursorDirection==="down"?"down":"right"}`,"aria-label":"Toggle cursor direction","aria-pressed":n.settings.cursorDirection==="down",className:n.settings.cursorDirection==="down"?"is-active":"","data-testid":"canvas-cursor-direction-toggle","data-cursor-direction":n.settings.cursorDirection==="down"?"down":"right",onClick:()=>tr("button"),children:o.jsx(yg,{size:17})}),o.jsx("button",{type:"button",title:"Reset fixture",onClick:Dm,children:o.jsx(xg,{size:17})}),o.jsx("button",{type:"button",title:Ft?"Exit read mode":"Fullscreen","aria-label":Ft?"Exit read mode":"Fullscreen","aria-pressed":Ft,className:Ft?"is-active":"","data-testid":"canvas-read-mode-toggle","data-read-mode":Ft?"true":"false",onClick:()=>{to("button")},children:o.jsx(Jl,{size:17})})]}),n.settings.minimapEnabled&&ct&&o.jsxs("section",{className:"canvas-minimap floating-panel","aria-label":"Canvas minimap","data-testid":"canvas-minimap",children:[o.jsxs("div",{className:"canvas-minimap__head",children:[o.jsx("span",{children:"Minimap"}),o.jsx("small",{children:n.nodes.length})]}),o.jsxs("button",{type:"button",className:"canvas-minimap__stage","aria-label":"Navigate canvas minimap","data-testid":"canvas-minimap-stage",onPointerDown:Gm,children:[ct.nodes.map(a=>o.jsx("span",{className:`canvas-minimap__node canvas-minimap__node--${a.kind} ${m.includes(a.id)?"is-selected":""}`,style:{left:`${a.x}px`,top:`${a.y}px`,width:`${a.width}px`,height:`${a.height}px`}},a.id)),o.jsx("span",{className:"canvas-minimap__viewport",style:{left:`${ct.viewport.x}px`,top:`${ct.viewport.y}px`,width:`${ct.viewport.width}px`,height:`${ct.viewport.height}px`}})]})]}),o.jsxs("div",{className:"canvas-status",children:[n.nodes.length," nodes / ",$a.length," rendered / ",n.edges.length," edges / ",Math.round(he.scale*100),"%",((Al=n.source)==null?void 0:Al.kind)==="localBridge"&&o.jsxs(o.Fragment,{children:[" ","/ LocalBridge",n.source.partialImport?" partial":"",n.source.truncated?` ${n.source.renderedNodeCount}/${n.source.originalNodeCount}`:""]})]})]})}function lc(e){switch(e){case"checking":return"Checking";case"connected":return"Connected";case"blocked":return"Access gated";case"unavailable":return"Unavailable";default:return"Idle"}}export{tx as MindCanvas};