@mindexec/cli 0.2.358 → 0.2.360
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/wwwroot/assets/{AdminDashboardPage-C6RNb3jX.js → AdminDashboardPage-D8CdgCG3.js} +1 -1
- package/wwwroot/assets/{AppSidebar-CYsG4slO.js → AppSidebar-CqkRTasO.js} +1 -1
- package/wwwroot/assets/AuthPages-CmAHlBT8.js +1 -0
- package/wwwroot/assets/{MindCanvas-CcfxyCL9.js → MindCanvas-DMxa5cKY.js} +2 -2
- package/wwwroot/assets/{PricingPage-C429WChq.js → PricingPage-CADslKZR.js} +1 -1
- package/wwwroot/assets/{index-BnkMdiZi.js → index-gjNKWU_x.js} +2 -2
- package/wwwroot/assets/{supabaseAuthAdapter-C3z334Qw.js → supabaseAuthAdapter-Bptc9G29.js} +13 -13
- package/wwwroot/index.html +1 -1
- package/wwwroot/assets/AuthPages-DxQDTt8X.js +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var Xu=Object.defineProperty;var Gu=(e,t,o)=>t in e?Xu(e,t,{enumerable:!0,configurable:!0,writable:!0,value:o}):e[t]=o;var id=(e,t,o)=>Gu(e,typeof t!="symbol"?t+"":t,o);import{j as n,r as g,a as Ku}from"./vendor-react-BXzpOyCS.js";import{l as qu,a as ft,s as zt,b as Ju,d as Zu,r as Qu,c as em,e as tm,i as dd}from"./storage-CWUvUZC-.js";import{r as Hr,g as fs,w as am,a as Ys,d as ld,b as nm,t as Wr,p as kl,v as om,R as sm,c as rm,u as im,e as dm,f as cd,s as bt,i as en,l as Xs,h as Gn,j as $o,k as Kn,m as qn,n as zo,o as Na,q as ud,x as lm,y as Jn,z as cm,A as um,B as mm,C as pm,D as wl,E as gm,F as hm,G as oo,H as yr,I as fm,J as bm,K as md,L as xr,M as Cr,N as vl,O as Uo,P as Qo,Q as so,S as pd,T as U,U as Gs,V as ro,W as ym,X as xm,Y as Cm,Z as gd,_ as Ks,$ as Sm,a0 as km,a1 as wm,a2 as vm,a3 as Sr,a4 as jm,a5 as Im,a6 as Nm,a7 as Am,a8 as hd}from"./canvas-runtime-hH7qY6Be.js";import{e as Mm,d as Tm}from"./vendor-msgpack-BE8aAsr3.js";import{R as f}from"./app-runtime-xD2Z3NdN.js";import{g as qs,A as fd,a as es}from"./index-BnkMdiZi.js";import{g as bs,r as jl}from"./supabaseAuthAdapter-C3z334Qw.js";import{c as Rm,a as Lm,r as bd}from"./toolHandoff-D5e5f7t5.js";import{a as yd,s as Em}from"./executionModeSettings-NJqurj-o.js";import{a as xd,p as Pm}from"./runtimeSettingsPersistenceProjection-BoNWmYjU.js";import{A as Ut,W as _m,c as Il,D as Dm,E as Vr,R as ln,J as Yr,X as yt,N as kr,O as Bm,Q as cn,w as un,I as mn,V as pn,l as ds,F as xt,Y as Om,Z as wr,_ as ls,$ as gn,a0 as Nl,a1 as Fm,a2 as Al,a3 as $m,i as co,a4 as Ml,a5 as zm,a6 as Cd,a7 as Um,a8 as ia,a9 as Sd,T as cs,aa as kd,ab as po,ac as Hm,ad as ts,ae as Tl,af as vr,ag as Wm,ah as Vm,f as Ym,ai as Xm,h as io,x as Gm,aj as Km,ak as qm,al as wd,am as vd,an as jd,g as Id,ao as Ho,H as Zn,ap as Wo,s as Js,aq as Nd,ar as Jm,as as Zs,at as Ad,au as Vo,av as Qs,aw as Md,ax as Td,ay as Rd,az as Zm,aA as Qm,aB as ep,aC as tp,n as ap,o as Qn,aD as np,aE as op,aF as sp,aG as rp,aH as ip,aI as dp,aJ as lp,aK as cp}from"./vendor-icons-D0xKCnZS.js";const up=1200,La="LocalBridgeOriginalNodeId";function Ct(e){return typeof e=="object"&&e!==null}function sa(e,t){const o=Number(e);return Number.isFinite(o)?o:t}function W(e){return typeof e=="string"?e:""}function Rl(){return typeof window<"u"?{width:window.innerWidth||1280,height:window.innerHeight||720}:{width:1280,height:720}}function jr(e,t,o){const r=Number(e),l=Number(t),m=Number(o);if(!Number.isFinite(r)||!Number.isFinite(l)||!Number.isFinite(m)||m<=0)return null;const p=1400/m,b=Rl();return{x:b.width/2-r*p,y:b.height/2-l*p,scale:p}}function mp(e){return Ct(e)?jr(e.x??e.X,e.y??e.Y,e.z??e.Z):null}function pp(e){if(!Ct(e))return null;const t=Number(e.x),o=Number(e.y),r=Number(e.scale);if(!Number.isFinite(t)||!Number.isFinite(o)||!Number.isFinite(r)||r<=0)return null;const l=Rl();return{x:(l.width/2-t)/r,y:(l.height/2-o)/r,z:1400/r}}function gp(e){const t=String(e||"").trim();if(t)try{const o=JSON.parse(t);if(!Ct(o))return;const r={};for(const[l,m]of Object.entries(o)){const p=mp(m);p&&(r[l]=p)}return Object.keys(r).length>0?r:void 0}catch{return}}function hp(e){if(!e||Object.keys(e).length===0)return null;const t={};for(const[o,r]of Object.entries(e)){const l=pp(r);l&&(t[o]=l)}return Object.keys(t).length>0?JSON.stringify(t):null}function us(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 ys(){return crypto.randomUUID()}function Xr(e){return Ct(e)?"ContentType"in e||"Prompt"in e||"Response"in e||"PositionX"in e||"PositionY"in e||"SourceFilePath"in e||"ImageStack"in e:!1}function Ld(e){const t=W(e).trim();if(!t)return null;try{return JSON.parse(t)}catch{return null}}function Ir(e){if(Array.isArray(e))return e;if(!Ct(e))return[];for(const t of["Nodes","nodes","Items","items","Content","content","Upserts","upserts"])if(t in e){const o=e[t];if(Array.isArray(o))return o;const r=Ld(o);if(r)return Ir(r)}for(const t of["ContentJson","contentJson","content_json"])if(t in e){const o=Ld(e[t]);if(o)return Ir(o)}return Xr(e)?[e]:[]}function Gr(e){return Ct(e)?"BoardId"in e&&("Upserts"in e||"upserts"in e||"Deletes"in e||"deletes"in e):!1}function Ll(e){if(!Ct(e))return 0;for(const t of["Deletes","deletes"]){const o=e[t];if(Array.isArray(o))return o.length}return 0}function ms(e){return Ir(e).filter(Xr)}function El(e){return ms(e).length}function fp(e,t){var m;const o=[...ms(e)];if(!Gr(t))return o;const r=new Set;for(const p of["Deletes","deletes"]){const b=t[p];if(Array.isArray(b))for(const c of b){const y=W(c).trim();y&&r.add(y)}}if(r.size>0)for(let p=o.length-1;p>=0;p-=1){const b=W((m=o[p])==null?void 0:m.Id).trim();b&&r.has(b)&&o.splice(p,1)}const l=new Map;o.forEach((p,b)=>{const c=W(p.Id).trim();c&&l.set(c,b)});for(const p of ms(t)){const b=W(p.Id).trim(),c=b?l.get(b):void 0;if(c!==void 0){o[c]=p;continue}b&&l.set(b,o.length),o.push(p)}return o}function Pl(e){const t=Array.isArray(e)?e.filter(Ct):[];return new Map(t.filter(o=>o.NodeId).map(o=>[String(o.NodeId),o]))}async function Nr(e,t){for(const o of e)try{const r=await Hr(o,t);return{payload:JSON.parse(r.content),path:o}}catch{}return null}async function bp(e,t){const o=`.mindexec/boards/${e}.msgpack`,r=`boards/${e}.msgpack`;for(const b of[o,r])try{const c=await nm(b,t);return{payload:Tm(c),format:b===o?"msgpack":"legacy-msgpack",path:b}}catch{}const l=`.mindexec/boards/${e}.json`,m=`boards/${e}.json`,p=await Nr([l,m],t);if(p)return{payload:p.payload,format:p.path===l?"json":"legacy-json",path:p.path};throw new Error(`LocalBridge board file not found: ${o}, ${r}, ${l}, ${m}`)}function Ar(e){const t=W(e.Id).trim()||W(e.BoardId).trim();return t?{Id:t,Title:W(e.Title)||null,Description:W(e.Description)||null,ThumbnailUrl:W(e.ThumbnailUrl)||null,CreatedAt:W(e.CreatedAt)||null,UpdatedAt:W(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:W(e.CameraBookmarks)||null}:null}function Ed(e){return!Ct(e)||Xr(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 Kr(e){if(Array.isArray(e))return e.filter(Ed).map(t=>Ar(t)).filter(t=>!!t);if(Ed(e)){const t=Ar(e);return t?[t]:[]}return[]}function yp(e){const t=e.toLowerCase();return xp(t)?"remote-control":Cp(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 xp(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 o=t.replace(/[^a-z0-9]+/g,"");return o.includes("remotecontrol")||o.includes("remotedevice")||o.includes("remotefleetdevice")}function Cp(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 o=t.replace(/[^a-z0-9]+/g,"");return o.includes("remotemonitor")||o.includes("remotehubmonitor")||o.includes("multidesktopmonitor")||o.includes("smartviewmonitor")}function Sp(e,t){const o=e.Metadata||{},r=o.ThumbnailUrl,l=o.OriginalUrl,m=o.OriginalPath;return Wr(W(r)||W(l)||W(m)||W(e.Response),t)}function kp(e,t,o){const r=e.ImageStack,l=Array.isArray(r==null?void 0:r.Variants)?r.Variants:[];if(l.length===0)return;const m=l.map((b,c)=>{const y=W(b.AssetId).trim(),w=Wr(y,o)||t;return w?{variantId:W(b.VariantId)||`variant-${W(e.Id)||c}`,imageUrl:w,assetId:y||void 0,caption:W(b.Caption)||void 0,sourceNodeId:W(e.Id)||void 0,createdAtUtc:W(b.CreatedAtUtc)||void 0}:null}).filter(b=>!!b);if(m.length===0)return;const p=W(r==null?void 0:r.ActiveVariantId);return{activeVariantId:m.some(b=>b.variantId===p)?p:m[0].variantId,variants:m,kind:W(r==null?void 0:r.Kind)||"versions",title:W(r==null?void 0:r.Title)||void 0,updatedAtUtc:W(r==null?void 0:r.UpdatedAtUtc)||void 0}}function wp(e,t){return!e||e.variants.length===0?t:(e.variants.find(r=>r.variantId===e.activeVariantId)??e.variants[0]).imageUrl||t}function vp(e,t,o){var p,b,c,y,w,L;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:go(e.imageUrl,t)||e.imageUrl,title:e.title,sourceNodeId:e.id,createdAtUtc:o}]:[];if(r.length===0)return null;const l=r.map(I=>({VariantId:I.variantId||ys(),AssetId:I.assetId||go(I.imageUrl,t)||I.imageUrl,CreatedAtUtc:I.createdAtUtc||o,Caption:I.caption||I.title||null}));return{ActiveVariantId:(c=e.imageStack)!=null&&c.activeVariantId&&l.some(I=>{var D;return I.VariantId===((D=e.imageStack)==null?void 0:D.activeVariantId)})?e.imageStack.activeVariantId:l[0].VariantId||"",Variants:l,Kind:((y=e.imageStack)==null?void 0:y.kind)||(l.length>1?"pile":"versions"),Title:((w=e.imageStack)==null?void 0:w.title)||e.title||null,UpdatedAtUtc:((L=e.imageStack)==null?void 0:L.updatedAtUtc)||o}}function jp(e,t){const o=e.Metadata||{};return Wr(W(o.OriginalUrl)||W(o.OriginalPath)||W(o.SourceFilePath)||W(e.SourceFilePath)||W(e.Response),t)}function Ip(e){const t={};for(const[o,r]of Object.entries(e??{}))typeof r=="string"?t[o]=r:r!=null&&(t[o]=String(r));return t}function Np(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 go(e,t){const o=String(e||"").trim();if(!o)return"";const r=t.replace(/\/+$/,"");return o.startsWith(`${r}/`)?o.slice(r.length+1):o.replace(/^\/+/,"")}function Ap(e,t){const o=new Map;for(const r of e){const l=t.get(r.from),m=t.get(r.to);!l||!m||o.has(m)||o.set(m,l)}return o}function Mp(e){const t=new Set;return e.map(o=>{var c,y;const r=((c=o.metadata)==null?void 0:c[La])||"",l=us(r)?r:us(o.id)?o.id:"",m=!!(l&&t.has(l)),p=l&&!m?l:ys(),b=((y=o.metadata)==null?void 0:y[La])!==p;return t.add(p),{node:b?{...o,metadata:{...o.metadata??{},[La]:p}}:o,originalId:p,assignedNodeId:!l||m,metadataStamped:b,duplicateOriginalId:m}})}function Tp(e,t,o,r,l){var y,w,L;const m=Np(e.kind),p=m==="image"||m==="mask"?go(e.imageUrl,l):"",b=["video","pdf","file","directory","embed"].includes(m)?go(e.assetUrl||e.sourceFilePath||e.body,l):"",c={...e.metadata??{},[La]:t,ReactNodeId:e.id,ReactKind:e.kind};if(e.kind==="remote-monitor"&&(c.RemoteHub??(c.RemoteHub="Gated"),c.RemoteRoute??(c.RemoteRoute="Gated"),c.RemoteConnected??(c.RemoteConnected="0"),c.RemoteTotal??(c.RemoteTotal="30"),c.RemotePage??(c.RemotePage="1/1"),c.AdapterState??(c.AdapterState="adapter-gated")),e.kind==="remote-control"&&(c.SemanticType??(c.SemanticType="RemoteFleetDevice"),c.RemoteFleetSchemaVersion??(c.RemoteFleetSchemaVersion="remote-fleet-device@1"),c.RemoteRoute??(c.RemoteRoute="Gated"),c.RemoteInput??(c.RemoteInput="Off"),c.AdapterState??(c.AdapterState="adapter-gated")),e.kind==="mask"&&(c.ImageRouterMask??(c.ImageRouterMask="true"),c.SemanticType??(c.SemanticType="ImageEditMask")),e.kind==="embed"){const I=e.assetUrl||e.body||e.sourceFilePath||"";c.source??(c.source="embed"),c.renderMode??(c.renderMode="card"),c.provider??(c.provider="web"),c.sourceUrl??(c.sourceUrl=I),c.url??(c.url=I),c.AdapterState??(c.AdapterState="local-reference")}return e.kind==="video"&&(c.assetKind??(c.assetKind="video"),c.videoMode??(c.videoMode=(y=e.assetUrl)!=null&&y.startsWith(l)?"local_bridge":"local_reference"),c.AdapterState??(c.AdapterState=((w=e.metadata)==null?void 0:w.PromptOnly)==="true"?"adapter-gated":"local-reference")),(L=e.tags)!=null&&L.length&&(c.ReactTags=JSON.stringify(e.tags)),p&&(c.OriginalUrl=p,c.ThumbnailUrl=p),b&&(c.OriginalPath=b,c.SourceFilePath=b),{Id:t,ContentType:m,Prompt:e.title||m,Response:m==="image"||m==="mask"?p||e.body||null:m==="remote-monitor"?e.body||"RemoteHub monitor node. Frames and input stay adapter-gated until LocalBridge is connected.":m==="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:o||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:c,ImageStack:m==="image"?vp(e,l,r):null}}function Rp(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 Lp(e,t,o){const r=W(e.ContentType)||"note",l=W(e.Prompt).trim(),m=W(e.Response).trim(),p=Ip(e.Metadata),b=W(e.Id).trim();b&&(p[La]??(p[La]=b));const y=["true","1","yes"].includes(String(p.ImageRouterMask||p.IsMask||"").trim().toLowerCase())?"mask":yp(r),w=y==="memo"&&["mindcanvasagent","agentcommand"].includes(String(p.SemanticType||p.semanticType||"").trim().toLowerCase()),L=y==="memo"&&["codenote","code-note"].includes(String(p.SemanticType||p.semanticType||"").trim().toLowerCase()),I=W(e.SourceFilePath)||p.OriginalPath||p.SourceFilePath||"",D=y==="video"||y==="pdf"||y==="file"||y==="directory"||y==="embed"?jp(e,o):void 0,q=l||e.SourceFilePath||r||"LocalBridge node",$=y==="image"?m||l||"Image asset":y==="mask"?m||l||"Image mask asset":y==="remote-monitor"?m||l||"RemoteHub monitor node. Frames and input stay adapter-gated until LocalBridge is connected.":y==="remote-control"?m||l||I||"Remote device control node. Frames and input stay adapter-gated until LocalBridge is connected.":y==="pdf"||y==="file"||y==="directory"||y==="embed"?m||I||l||r:m||l||I||"",O=w?500:L?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,G=w||L?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,V=y==="image"||y==="mask"?Sp(e,o):void 0,re=y==="image"?kp(e,V,o):void 0,oe=!!(e.IsChunkedText||p.IsChunkedText==="true"),Ae=sa(e.TotalLineCount??p.TotalLineCount,0),be=sa(e.ScrollOffset,0),Ue=sa(e.MaxScroll,0);return{id:String(e.Id||crypto.randomUUID()),kind:y,title:y==="remote-monitor"?l||"Multi Desktop Monitor":y==="remote-control"?l||p.RemoteFleetDeviceName||"Remote Device":y==="template-launcher"?l||"Template Launcher":q,body:$,x:sa((t==null?void 0:t.PositionX)??e.PositionX,0),y:sa((t==null?void 0:t.PositionY)??e.PositionY,0),width:Math.max(160,Math.min(900,sa((t==null?void 0:t.Width)??e.Width,O))),height:Math.max(120,Math.min(900,sa((t==null?void 0:t.Height)??e.Height,G))),status:e.IsLoading?"running":y==="ai-task"?"idle":void 0,imageUrl:wp(re,V),imageStack:re,assetUrl:D,sourceFilePath:I||void 0,isChunkedText:oe||void 0,totalLineCount:oe?Ae:void 0,scrollOffset:oe?be:void 0,maxScroll:oe?Ue:void 0,isExpanded:typeof e.IsExpanded=="boolean"?e.IsExpanded:void 0,originalHeight:sa(e.OriginalHeight,0)||void 0,tags:w?["Agent Command",p.AgentCommandRequestedRole||"Researcher",p.AgentCommandStatus||"Draft"]:L?["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"?Ep(p):y==="remote-control"?Pp(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 Ep(e){return{RemoteHub:"Gated",RemoteRoute:"Gated",RemoteConnected:"0",RemoteTotal:"30",RemotePage:"1/1",AdapterState:"adapter-gated",...e}}function Pp(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 _p(e,t){const o=[];for(const r of e){const l=String(r.Id||""),m=String(r.ParentId||"");!l||!m||!t.has(l)||!t.has(m)||o.push({id:`edge-local-${m}-${l}`,from:m,to:l,kind:"context"})}return o}async function Dp(e=fs()){const t=await Hr(".mindexec/boards/_metadata.json",e),o=JSON.parse(t.content);return(Array.isArray(o)?o.filter(Ct):[]).map(m=>Ar(m)).filter(m=>!!m).sort((m,p)=>String(p.UpdatedAt||"").localeCompare(String(m.UpdatedAt||"")))}async function Bp(e){try{const t=await Hr(".mindexec/boards/_metadata.json",e),o=JSON.parse(t.content);return Array.isArray(o)?o.filter(Ct):[]}catch{return[]}}async function Op(e,t,o,r=fs(),l=null){var lt,Me,le,Tt,me,He;if((lt=e.source)!=null&<.partialImport)throw new Error("This board was imported from a partial original payload. Export is blocked to avoid data loss.");if((Me=e.source)!=null&&Me.truncated)throw new Error("This board was truncated during import. Export is blocked to avoid data loss.");const m=(le=e.source)!=null&&le.exportedByReact?String(e.source.boardId||""):"",p=us(m),b=us(m)?m:ys(),c=new Date().toISOString(),y=Mp(e.nodes),w=y.map(ee=>ee.node),L=new Map(y.map(ee=>[ee.node.id,ee.originalId])),I=Ap(e.edges,L),D=y.map(({node:ee,originalId:ct})=>Tp(ee,ct,I.get(ct),c,r)),q=y.map(({node:ee,originalId:ct})=>Rp(ee,ct)),$=t.scale>0?t.scale:1,O=(window.innerWidth/2-t.x)/$,G=(window.innerHeight/2-t.y)/$,V=1400/$,re=Number((l==null?void 0:l.x)??((Tt=e.viewState)==null?void 0:Tt.cursorX)??0),oe=Number((l==null?void 0:l.y)??((me=e.viewState)==null?void 0:me.cursorY)??0),Ae=(He=e.nodes.find(ee=>ee.kind==="image"&&ee.imageUrl))==null?void 0:He.imageUrl,be={Id:b,UserId:"00000000-0000-0000-0000-000000000000",Title:e.name||"Untitled Board",Description:"Exported from MindExec React",ThumbnailUrl:go(Ae,r)||"",IsPublic:!1,CreatedAt:c,SyncedCloudBoardId:null,LastSyncedAt:null,LastCloudCopyStatus:null,UpdatedAt:c,LastCameraX:O,LastCameraY:G,LastCameraZ:V,LastCursorX:Number.isFinite(re)?re:0,LastCursorY:Number.isFinite(oe)?oe:0,CameraBookmarks:hp(e.settings.cameraBookmarks)},Ue=`.mindexec/boards/${b}.msgpack`,et=`.mindexec/boards/${b}.json`,tt=`.mindexec/boards/${b}.layout.json`,he=`.mindexec/boards/${b}.delta.json`,J=`boards/${b}.delta.json`,ie=await Bp(r),se=[be,...ie.filter(ee=>W(ee.Id)!==b)],St=Mm(D);await am(Ue,St,o,r),await Ys(et,JSON.stringify(D,null,2),o,r),await Ys(tt,JSON.stringify(q,null,2),o,r),await Ys(".mindexec/boards/_metadata.json",JSON.stringify(se,null,2),o,r);const F=await Promise.allSettled([ld(he,o,r),ld(J,o,r)]);return f.emit("localBridge.board.exported",{boardId:b,nodes:D.length,edges:e.edges.length,snapshotFormat:"msgpack",msgpackBytes:St.byteLength,jsonMirror:!0,deltaCleared:F.some(ee=>ee.status==="fulfilled"&&ee.value.success),reusedBoardId:p,stableNodeIds:y.length,assignedNodeIds:y.filter(ee=>ee.assignedNodeId).length,metadataStampedNodeIds:y.filter(ee=>ee.metadataStamped).length,duplicateOriginalNodeIds:y.filter(ee=>ee.duplicateOriginalId).length}),{metadata:be,source:{kind:"localBridge",boardId:b,loadedAt:c,originalNodeCount:D.length,renderedNodeCount:D.length,truncated:!1,exportedByReact:!0,snapshotFormat:"msgpack"},nodes:w,msgpackPath:Ue,boardPath:et,layoutPath:tt}}async function Fp(e,t,o=fs()){const r=await bp(e.Id,o);let l=new Map;const m=await Nr([`.mindexec/boards/${e.Id}.layout.json`,`boards/${e.Id}.layout.json`],o);m&&(l=Pl(m.payload));let p=null;const b=await Nr([`.mindexec/boards/${e.Id}.delta.json`,`boards/${e.Id}.delta.json`],o);b&&(p=b.payload);const c=p?Kr(p)[0]:null,y=!!(p&&Gr(p)),w=y?fp(r.payload,p):r.payload;return _l(w,t,{boardId:(c==null?void 0:c.Id)??e.Id,title:(c==null?void 0:c.Title)||e.Title||"LocalBridge Board",updatedAt:(c==null?void 0:c.UpdatedAt)??e.UpdatedAt,layoutPayload:Array.from(l.values()),baseUrl:o,cameraBookmarks:(c==null?void 0:c.CameraBookmarks)??e.CameraBookmarks,lastCursorX:(c==null?void 0:c.LastCursorX)??e.LastCursorX,lastCursorY:(c==null?void 0:c.LastCursorY)??e.LastCursorY,deltaApplied:y,deltaUpserts:p?El(p):0,deltaDeletes:p?Ll(p):0,snapshotFormat:r.format})}function _l(e,t,o={}){const r=ms(e),l=Gr(e),m=o.deltaUpserts??(l?r.length:0),p=o.deltaDeletes??(l?Ll(e):0),b=o.layoutPayload?Pl(o.layoutPayload):new Map,c=r.slice(0,up),y=c.map(oe=>Lp(oe,b.get(String(oe.Id||"")),o.baseUrl??fs())),w=new Set(y.map(oe=>oe.id)),L=_p(c,w),I=r.length>y.length,D=l,q=o.deltaApplied===!0,$=o.boardId||ys(),O=o.updatedAt||new Date().toISOString(),G=Number(o.lastCursorX),V=Number(o.lastCursorY),re=Number.isFinite(G)&&Number.isFinite(V);return f.emit("localBridge.board.loaded",{boardId:$,nodes:y.length,originalNodes:r.length,truncated:I,snapshotFormat:o.snapshotFormat,partialImport:D,deltaImport:l,deltaApplied:q,deltaUpserts:m,deltaDeletes:p}),{id:`localBridge:${$}`,name:o.title||"LocalBridge Board",nodes:y,edges:L,settings:{...t,cameraBookmarks:gp(o.cameraBookmarks)},viewState:re?{cursorX:G,cursorY:V}:void 0,updatedAt:O,source:{kind:"localBridge",boardId:$,loadedAt:new Date().toISOString(),snapshotFormat:o.snapshotFormat,originalNodeCount:r.length,renderedNodeCount:y.length,truncated:I,partialImport:D,deltaImport:l,deltaApplied:q}}}const qr=["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(","),$p=/^[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 zp(e){if($p.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 Dl(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 Up(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 Mr(e,t=new Date().toISOString()){return e&&!Number.isNaN(Date.parse(e))?e:t}function Jr(e){return(e==null?void 0:e.trim().slice(0,90))||"Untitled Board"}function Bl(e){const t=Dl(e.content_json),o=Mr(e.updated_at??t.updatedAt);return{id:e.id,name:Jr(e.title??t.name),updatedAt:o,createdAt:Mr(e.created_at,o),nodeCount:Array.isArray(t.nodes)?t.nodes.length:0,edgeCount:Array.isArray(t.edges)?t.edges.length:0,sourceKind:"cloud"}}function Hp(e,t){var w,L;const o=Dl(e.content_json),r=Mr(e.updated_at??o.updatedAt),l=Number((w=o.viewState)==null?void 0:w.cursorX),m=Number((L=o.viewState)==null?void 0:L.cursorY),p=Number(e.last_cursor_x),b=Number(e.last_cursor_y),c=Number.isFinite(l)&&Number.isFinite(m),y=Number.isFinite(p)&&Number.isFinite(b);return{id:e.id,name:Jr(e.title??o.name),nodes:Array.isArray(o.nodes)?o.nodes:[],edges:Array.isArray(o.edges)?o.edges:[],settings:o.settings??t,viewState:c?{cursorX:l,cursorY:m}: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(o.nodes)?o.nodes.length:0,renderedNodeCount:Array.isArray(o.nodes)?o.nodes.length:0}}}async function Zr(e){var c;const t=jl(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 o=bs(e);if(!o)return f.emit("projectStorage.cloud.provider.skipped",{mode:"config-missing"}),{userId:null,config:t,reason:"missing-client"};const{data:r,error:l}=await o.auth.getSession();if(l||!r.session)return f.emit("projectStorage.cloud.provider.sessionMissing",{message:(l==null?void 0:l.message)??"missing-session"}),{userId:null,config:t,reason:"missing-session"};const{data:m,error:p}=await o.auth.getUser(),b=((c=m.user)==null?void 0:c.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 Wp(e){const t=await Zr(e);if(!t.userId)return[];const o=bs(e);if(!o)return[];f.emit("projectStorage.cloud.list.requested");const{data:r,error:l}=await o.from("boards").select(qr).eq("user_id",t.userId).order("updated_at",{ascending:!1}).limit(50);if(l)throw f.emit("projectStorage.cloud.provider.failed",{operation:"list",message:l.message}),l;const m=(r??[]).map(Bl);return f.emit("projectStorage.cloud.list.loaded",{count:m.length}),m}async function Vp(e,t,o){const r=await Zr(e);if(!r.userId)return null;const l=bs(e);if(!l)return null;f.emit("projectStorage.cloud.load.requested",{boardId:t});const{data:m,error:p}=await l.from("boards").select(qr).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(!m)return null;const b=Hp(m,o);return f.emit("projectStorage.cloud.load.loaded",{boardId:t,nodes:b.nodes.length,edges:b.edges.length}),b}async function Yp(e,t,o,r=null){var re,oe;const l=await Zr(e);if(!l.userId)return null;const m=bs(e);if(!m)return null;const p=zp(t.id),b=new Date().toISOString(),c=Jr(t.name),y=Number((r==null?void 0:r.x)??((re=t.viewState)==null?void 0:re.cursorX)??0),w=Number((r==null?void 0:r.y)??((oe=t.viewState)==null?void 0:oe.cursorY)??0),L={...t.viewState??{},cursorX:Number.isFinite(y)?y:0,cursorY:Number.isFinite(w)?w:0},I={...t,id:p,name:c,viewState:L,updatedAt:b},D={p_board_id:p,p_title:c,p_description:null,p_thumbnail_url:null,p_is_public:!1,p_created_at:null,p_updated_at:b,p_last_camera_x:o.x,p_last_camera_y:o.y,p_last_camera_z:o.scale,p_last_cursor_x:L.cursorX,p_last_cursor_y:L.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:q}=await m.rpc("save_board_snapshot",D);if(q)throw f.emit("projectStorage.cloud.provider.failed",{operation:"save-rpc",boardId:p,message:q.message}),q;const $={content_json:Up(I),updated_at:b},{data:O,error:G}=await m.from("boards").update($).eq("id",p).eq("user_id",l.userId).select(qr).maybeSingle();if(G)throw f.emit("projectStorage.cloud.provider.failed",{operation:"save-json-mirror",boardId:p,message:G.message}),G;const V=O?Bl(O):{id:p,name:c,updatedAt:b,createdAt:b,nodeCount:t.nodes.length,edgeCount:t.edges.length,sourceKind:"cloud"};return f.emit("projectStorage.cloud.save.saved",{boardId:V.id,nodes:V.nodeCount,edges:V.edgeCount}),V}function Tr(e){return e.length===0?{minX:0,minY:0,maxX:0,maxY:0}:e.reduce((t,o)=>({minX:Math.min(t.minX,o.x),minY:Math.min(t.minY,o.y),maxX:Math.max(t.maxX,o.x+o.width),maxY:Math.max(t.maxY,o.y+o.height)}),{minX:Number.POSITIVE_INFINITY,minY:Number.POSITIVE_INFINITY,maxX:Number.NEGATIVE_INFINITY,maxY:Number.NEGATIVE_INFINITY})}function Xp(e,t={},o=Tr(e),r){if(e.length===0)return{after:new Map,boundsAfter:o};const l=cg(t.mode),m=ug(t.order),p=mg(t.anchor),b=pg(t.sizeMode),c=Math.max(0,t.gapX??24),y=Math.max(0,t.gapY??24),w=Math.max(1,t.maxColumns??12),L=Rr(t.quantile??.75,.05,.95),I=e.map(Gp),D=sg(I,m),q=D.map(be=>be.width),$=D.map(be=>be.height),O=Math.max(1,t.cellWidth??_d(q,L)),G=Math.max(1,t.cellHeight??_d($,L)),V=Math.max(1,t.targetWidth??O),re=Math.max(1,t.targetHeight??G),oe=og(p,o);if(l==="grid"){eg(D,b,V,re,O,G);const be=Pd(t.columns,w,o.maxX-o.minX,O,c);qp(D,oe.x,oe.y,be,O,G,c,y)}else if(l==="masonry"){tg(D,b==="preserve"?"uniformWidth":b,V);const Ue=Pd(t.columns,w,o.maxX-o.minX,V,c);Jp(D,oe.x,oe.y,Ue,V,c,y)}else l==="stripHorizontal"?(ag(D,b==="preserve"?"uniformHeight":b,re),Zp(D,oe.x,oe.y,c,re)):(ng(D,b==="preserve"?"uniformWidth":b,V),Qp(D,oe.x,oe.y,y,V));let Ae=new Map(D.map(be=>[be.id,Kp(be)]));return p==="selectionBoundsCenter"&&(Ae=ig(o,Ae)),t.snapToGrid&&(Ae=dg(Ae,Math.max(1,t.gridSize??8))),{after:Ae,boundsAfter:Tr(Array.from(Ae.values()))}}function Gp(e){return{...e,width:Math.max(1,e.width),height:Math.max(1,e.height)}}function Kp(e){return{x:e.x,y:e.y,width:Math.max(1,e.width),height:Math.max(1,e.height)}}function qp(e,t,o,r,l,m,p,b){e.forEach((c,y)=>{const w=Math.floor(y/r),L=y%r,I=t+L*(l+p),D=o+w*(m+b);c.x=I+(l-c.width)/2,c.y=D+(m-c.height)/2})}function Jp(e,t,o,r,l,m,p){const b=Array.from({length:r},()=>0);for(const c of e){const y=lg(b),w=t+y*(l+m);c.x=w+(l-c.width)/2,c.y=o+b[y],b[y]+=c.height+p}}function Zp(e,t,o,r,l){let m=t;for(const p of e)p.x=m,p.y=o+(l-p.height)/2,m+=p.width+r}function Qp(e,t,o,r,l){let m=o;for(const p of e)p.x=t+(l-p.width)/2,p.y=m,m+=p.height+r}function eg(e,t,o,r,l,m){if(t==="fitCellDownOnly")for(const p of e){const b=Math.min(1,l/p.width,m/p.height);p.width*=b,p.height*=b}else t==="uniformWidth"?Qr(e,o):t==="uniformHeight"&&Ol(e,r)}function tg(e,t,o){if(t==="fitCellDownOnly"){for(const r of e){const l=Math.min(1,o/r.width);r.width*=l,r.height*=l}return}Qr(e,o)}function ag(e,t,o){if(t==="fitCellDownOnly"){for(const r of e){const l=Math.min(1,o/r.height);r.width*=l,r.height*=l}return}Ol(e,o)}function ng(e,t,o){if(t==="fitCellDownOnly"){for(const r of e){const l=Math.min(1,o/r.width);r.width*=l,r.height*=l}return}Qr(e,o)}function Qr(e,t){for(const o of e){if(o.width<=0)continue;const r=t/o.width;o.width=t,o.height=Math.max(1,o.height*r)}}function Ol(e,t){for(const o of e){if(o.height<=0)continue;const r=t/o.height;o.height=t,o.width=Math.max(1,o.width*r)}}function Pd(e,t,o,r,l){if(typeof e=="number"&&e>0)return Math.round(Rr(e,1,t));if(o<=1||r<=1)return 1;const m=Math.floor((o+l)/(r+l));return!Number.isFinite(m)||m<1?1:Math.round(Rr(m,1,t))}function og(e,t,o){return{x:t.minX,y:t.minY}}function sg(e,t){return t==="selectionOrder"?[...e].sort((o,r)=>o.selectionIndex-r.selectionIndex):rg(e)}function rg(e){const t=[...e].sort((c,y)=>c.y-y.y||c.x-y.x);if(t.length<=2)return t;const o=t.map(c=>c.height).sort((c,y)=>c-y),r=o[Math.floor(o.length/2)]??1,l=Math.max(16,r*.35),m=[];let p=[],b=Number.NaN;for(const c of t)p.length===0?(p=[c],b=c.y):Math.abs(c.y-b)<=l?(p.push(c),b=(b*(p.length-1)+c.y)/p.length):(m.push([...p].sort((y,w)=>y.x-w.x)),p=[c],b=c.y);return p.length>0&&m.push([...p].sort((c,y)=>c.x-y.x)),m.flat()}function ig(e,t){if(t.size===0)return t;const o=Tr(Array.from(t.values())),r=e.minX+(e.maxX-e.minX)/2,l=e.minY+(e.maxY-e.minY)/2,m=o.minX+(o.maxX-o.minX)/2,p=o.minY+(o.maxY-o.minY)/2,b=r-m,c=l-p;return new Map(Array.from(t.entries()).map(([y,w])=>[y,{...w,x:w.x+b,y:w.y+c}]))}function dg(e,t){return new Map(Array.from(e.entries()).map(([o,r])=>[o,{...r,x:Dd(r.x,t),y:Dd(r.y,t)}]))}function _d(e,t){if(e.length===0)return 1;const o=[...e].sort((b,c)=>b-c),r=(o.length-1)*t,l=Math.floor(r),m=Math.min(o.length-1,l+1),p=r-l;return o[l]*(1-p)+o[m]*p}function lg(e){let t=0;for(let o=1;o<e.length;o+=1)e[o]<e[t]&&(t=o);return t}function Dd(e,t){return Math.round(e/t)*t}function cg(e){const t=xs(e);return t==="grid"?"grid":t==="striphorizontal"||t==="striph"?"stripHorizontal":t==="stripvertical"||t==="stripv"?"stripVertical":"masonry"}function ug(e){return xs(e)==="selectionorder"?"selectionOrder":"spatialReading"}function mg(e){const t=xs(e);return t==="selectionboundscenter"?"selectionBoundsCenter":t==="viewporttopleft"?"viewportTopLeft":"selectionBoundsTopLeft"}function pg(e){const t=xs(e);return t==="fitcelldownonly"?"fitCellDownOnly":t==="uniformwidth"?"uniformWidth":t==="uniformheight"?"uniformHeight":"preserve"}function xs(e){return String(e??"").trim().toLowerCase().replace(/[^a-z0-9]/g,"")}function Rr(e,t,o){return Math.min(o,Math.max(t,e))}const Fl=300,$l=50*1024*1024,gg=800;function ke(e){return typeof e=="string"?e.length*2:0}function hg(e){let t=256;if(t+=ke(e.id),t+=ke(e.kind),t+=ke(e.title),t+=ke(e.body),t+=ke(e.result),t+=ke(e.imageUrl),t+=ke(e.assetUrl),t+=ke(e.sourceFilePath),t+=(e.tags??[]).reduce((o,r)=>o+ke(r),0),e.metadata)for(const[o,r]of Object.entries(e.metadata))t+=ke(o)+ke(r);return e.imageStack&&(t+=128+ke(e.imageStack.title),t+=e.imageStack.variants.reduce((o,r)=>o+96+ke(r.variantId)+ke(r.imageUrl)+ke(r.assetId)+ke(r.title)+ke(r.caption),0)),t}function fg(e){let t=1024+ke(e.id)+ke(e.name)+ke(e.updatedAt);return t+=e.nodes.reduce((o,r)=>o+hg(r),0),t+=e.edges.length*128,t+=Object.entries(e.settings).reduce((o,[r,l])=>o+ke(r)+ke(typeof l=="string"?l:JSON.stringify(l)),0),t}function zl(e,t={}){var o,r;return{board:e,description:((o=t.description)==null?void 0:o.trim())||"Board change",mergeKey:((r=t.mergeKey)==null?void 0:r.trim())||null,timestampMs:t.timestampMs??Date.now(),estimatedBytes:fg(e)}}function Bd(e,t={}){const o=t.maxEntries??Fl,r=t.maxBytes??$l;let l=e.slice(Math.max(0,e.length-o)),m=l.reduce((p,b)=>p+b.estimatedBytes,0);for(;l.length>1&&m>r;){const[p,...b]=l;m-=(p==null?void 0:p.estimatedBytes)??0,l=b}return l}function Aa(e,t,o={}){const r=zl(t,o),l=o.mergeWindowMs??gg,m=e.slice(),p=m.at(-1);return p&&r.mergeKey&&p.mergeKey===r.mergeKey&&r.timestampMs-p.timestampMs<l?(m[m.length-1]={...p,description:r.description,timestampMs:r.timestampMs,estimatedBytes:Math.max(p.estimatedBytes,r.estimatedBytes)},Bd(m,o)):(m.push(r),Bd(m,o))}function bg(e,t,o={}){const r=zl(t,o),l=o.maxEntries??Fl,m=o.maxBytes??$l;let p=[r,...e].slice(0,l),b=p.reduce((c,y)=>c+y.estimatedBytes,0);for(;p.length>1&&b>m;){const c=p.at(-1);b-=(c==null?void 0:c.estimatedBytes)??0,p=p.slice(0,-1)}return p}function Cs(e,...t){const o=e==null?void 0:e.metadata;if(!o)return"";for(const r of t){const l=o[r];if(typeof l=="string"&&l.trim())return l.trim()}return""}function eo(e,t){return!!Cs(e,t)}function Ul(e){if(!e||!e.trim())return!1;const t=e.trim();return/^(https?:|blob:|data:|file:)/i.test(t)}function Hl(e){if(!e)return"";const t=Cs(e,"OriginalPath");if(t)return t;const o=String(e.body||"").trim();return Ul(o)?"":o}function Wl(e){return e?Hl(e)||String(e.sourceFilePath||"").trim()||String(e.assetUrl||"").trim()||String(e.imageUrl||"").trim()||String(e.body||"").trim():""}function Vl(e){return Cs(e,"ThumbnailUrl","thumbnailUrl")}function yg(e){if(!e||e.kind!=="image")return!1;if(eo(e,"ImageGenerationProvider")||eo(e,"GeneratedImageSourceWidth")||eo(e,"GeneratedImageSourceHeight")||eo(e,"CodexImageQuality")||eo(e,"ImageRouterRevisedPrompt"))return!0;const t=Cs(e,"RequestedMediaOperation");return["text2image","image2image","inpaint"].includes(t.toLowerCase())}function ei(e){if(!e)return"";if(e.kind==="image"||e.kind==="mask"){const t=yg(e)?Hl(e):"",o=Vl(e),r=String(e.body||"").trim();return t||o||String(e.imageUrl||"").trim()||String(e.assetUrl||"").trim()||String(e.sourceFilePath||"").trim()||(Ul(r)?r:"")}return Wl(e)||String(e.assetUrl||"").trim()||String(e.sourceFilePath||"").trim()}function Yl(e){if(!e)return"";const t=Wl(e)||e.title||e.kind;return String(t||"").replace(/\\/g,"/").replace(/\/+$/,"").split("/").filter(Boolean).pop()||e.title||e.kind}const xg=2048,Cg=16e3,er=1024,tr=64,Sg=2048,ar=3,kg=16,wg=256,vg=new Set(["text","note","memo","markdown","code","directory"]),jg=/[\p{L}\p{M}\p{N}]{2,}/gu,Od=4,Ig=8,Fd=1.35;function Ng(e){return vg.has(String(e||"").trim().toLowerCase())}function Ag(e){const t=e.map(Tg),o=new Map,r=new Map,l=new Map,m=new Map;for(const p of t){o.set(p.id,p);for(const b of p.tokens)nr(r,b,p.id);for(const b of p.prefixes)nr(l,b,p.id);for(const b of p.ngrams)nr(m,b,p.id)}return{documents:t,documentById:o,tokenIndex:r,prefixIndex:l,ngramIndex:m}}function Mg(e,t,o={}){const r=Math.max(1,Math.trunc(Number(o.limit||30))),l=sn(t),m=$d(e,0,0,o.viewport,0);if(!l)return{hits:[],profile:m};const p=Array.from(Xl(l)),b=Array.from(Gl(p)),c=ql(l),y=Array.from(Kl(c)),w=new Map;for(const $ of p)or(e.tokenIndex,$,w,8);for(const $ of b)or(e.prefixIndex,$,w,$.length<=3?4:2);for(const $ of y)or(e.ngramIndex,$,w,1.15);const L=Pg(e,w,r),I=_g(o.allowedContentTypes),D=[];for(const $ of L){const O=e.documentById.get($);if(!O||I&&!I.has(O.contentType))continue;const G=Lg(O,l,p,y);if(G<=0)continue;const V=Eg(O,o.viewport??null);D.push({nodeId:O.id,score:G+V,textScore:G,viewportBoost:V})}D.sort(($,O)=>O.score-$.score||$.nodeId.localeCompare(O.nodeId));const q=D.slice(0,r);return{hits:q,profile:$d(e,L.length,q.length,o.viewport,q.filter($=>$.viewportBoost>0).length)}}function sn(e){const t=String(e??"");if(!t.trim())return"";let o=t;try{o=t.normalize("NFKC")}catch{o=t}o=o.toLowerCase();let r="",l=!1;for(const m of o){if(/\s/u.test(m)){l||(r+=" ",l=!0);continue}Dg(m)||(r+=m,l=!1)}return r.trim()}function Xl(e){return new Set(e.match(jg)??[])}function Gl(e){const t=new Set;for(const o of e){if(!o.trim())continue;const r=Math.min(8,o.length);for(let l=2;l<=r;l+=1)t.add(o.slice(0,l))}return t}function Kl(e){const t=new Set;if(!e.trim())return t;if(e.length<=ar)return t.add(e),t;for(let o=0;o<=e.length-ar;o+=1)t.add(e.slice(o,o+ar));return t}function Tg(e){const t=String(e.kind??"").trim().toLowerCase(),o=Ta(e.prompt??e.title,xg),r=Ng(t)?Ta(e.response??e.body,Cg):"",l=Rg(e.metadata,e.tags,e.metadataText),m=Ta(e.sourceFilePath||e.assetUrl,Sg),p=sn(o),b=sn(r),c=sn(l),y=sn(m),w=sn(t),L=[p,c,y,b,w].filter(Boolean).join(" "),I=Xl(L);return{id:String(e.id),contentType:t,normalizedPrompt:p,normalizedResponse:b,normalizedMetadata:c,normalizedSourcePath:y,normalizedContentType:w,tokens:I,prefixes:Gl(I),ngrams:Kl(ql(L)),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 Rg(e,t,o){const r=[];let l=0;if(e)for(const[m,p]of Object.entries(e)){if(l>=tr)break;!String(m??"").trim()&&!String(p??"").trim()||(r.push(Ta(m,128)),String(p??"").trim()&&r.push(Ta(p,er)),l+=1)}return l<tr&&(t!=null&&t.length)&&(r.push("tags",Ta(t.join(" "),er)),l+=1),l<tr&&(o!=null&&o.trim())&&r.push("metadata",Ta(o,er)),r.join(" ")}function Lg(e,t,o,r){let l=0;e.normalizedPrompt===t?l+=120:to(e.normalizedPrompt,t)&&(l+=54),to(e.normalizedMetadata,t)&&(l+=26),to(e.normalizedSourcePath,t)&&(l+=18),to(e.normalizedResponse,t)&&(l+=14),to(e.normalizedContentType,t)&&(l+=8);for(const m of o)e.tokens.has(m)&&(l+=7),e.normalizedPrompt.startsWith(m)&&(l+=10);for(const m of r)e.ngrams.has(m)&&(l+=.85);return l}function Eg(e,t){if(!t)return 0;const o=e.x+Math.max(1,e.width)/2,r=e.y+Math.max(1,e.height)/2,l=Math.abs(o-t.centerX)/Math.max(1,t.halfWidth),m=Math.abs(r-t.centerY)/Math.max(1,t.halfHeight),p=Math.sqrt(l*l+m*m);if(p<=1)return Od+(1-p)*Ig;if(p<=Fd){const b=1-(p-1)/Math.max(.001,Fd-1);return Math.max(0,b)*(Od*.75)}return 0}function Pg(e,t,o){return t.size===0?e.documents.map(r=>r.id):Array.from(t.entries()).sort((r,l)=>l[1]-r[1]||r[0].localeCompare(l[0])).slice(0,Math.max(o*kg,wg)).map(([r])=>r)}function _g(e){if(!e)return null;const t=new Set(Array.from(e,o=>String(o||"").trim().toLowerCase()).filter(Boolean));return t.size>0?t:null}function $d(e,t,o,r,l){return{documentCount:e.documents.length,candidateCount:t,rankedCount:o,viewportBoosted:!!r,boostedCount:l,indexedTokenCount:e.tokenIndex.size,indexedPrefixCount:e.prefixIndex.size,indexedNGramCount:e.ngramIndex.size}}function nr(e,t,o){const r=e.get(t);if(r){r.add(o);return}e.set(t,new Set([o]))}function or(e,t,o,r){const l=e.get(t);if(l)for(const m of l)o.set(m,(o.get(m)??0)+r)}function ql(e){let t="";for(const o of e)/\s/u.test(o)||(t+=o);return t}function Ta(e,t){const o=String(e??"");return o.length<=t?o:o.slice(0,t)}function to(e,t){return!!(e&&t&&e.includes(t))}function Dg(e){const t=e.codePointAt(0)??0;return t<=31||t>=127&&t<=159}const Bg=2147483647,Og="LocalBridge access is enabled, but the bridge is not reachable. Restart LocalBridge, allow Chrome local-network access, then reload MindCanvas.",Fg="Local storage is unavailable in the hosted app until browser local storage or LocalBridge access is available.",$g="Local storage is unavailable. Check the browser-local storage state or LocalBridge connection.",zg="Cloud projects are unavailable until Supabase and Cloudflare R2 are configured.",Ug="Login is required before cloud projects can be used.",Hg="Cloud projects are unavailable.";function Wg(e){return e.bridgeProviderConfigured||e.browserProviderConfigured||e.embeddedProviderConfigured}function Lr(e,t=!0){const o={isAvailable:!1,bridgeReachable:!1,browserLocalAvailable:!1,embeddedLocalAvailable:!1,providerKind:"none",canBrowseWorkspace:!1};return e.bridgeProviderConfigured&&e.bridgeReachable?{...o,isAvailable:!0,bridgeReachable:!0,providerKind:"bridge",canBrowseWorkspace:!0}:e.hostedWebApp&&e.hostedLocalBridgeAccessEnabled&&e.bridgeProviderConfigured?{...o,providerKind:"bridge"}:e.browserProviderConfigured&&(e.browserLocalAvailable||t&&e.browserLocalAvailableWhenEmpty===!0)?{...o,isAvailable:!0,browserLocalAvailable:!0,providerKind:"browser"}:e.embeddedProviderConfigured&&e.supportsEmbeddedLocal?{...o,isAvailable:!0,embeddedLocalAvailable:!0,providerKind:"embedded"}:o}function Vg(e){return Lr(e,!1).isAvailable?"local":ti(e)?"cloud":Lr(e,!0).isAvailable?"local":e.cloudConfigured?"cloud":"local"}function ti(e){return e.cloudConfigured&&e.cloudSessionAvailable}function Yg(e,t){return t.providerKind==="bridge"&&!t.bridgeReachable?Og:e.hostedWebApp?Fg:$g}function Xg(e){return e.cloudConfigured?ti(e)?Hg:Ug:zg}function Gg(e){var w,L,I;const t=ti(e),o=Lr(e,!0),r=Wg(e),l=e.cloudConfigured,m=o.isAvailable,p=t;let b=e.storedMode??Vg(e);b==="cloud"&&(!l||!p&&m)?b=m?"local":"cloud":b==="local"&&(!r&&l||!m&&p)&&(b="cloud");const c=e.cloudAccess,y=((w=c==null?void 0:c.denialReason)==null?void 0:w.trim())||void 0;return{currentMode:b,showLocalTab:r,showCloudTab:l,isLocalAvailable:o.isAvailable,isCloudAvailable:t,requiresCloudSignIn:e.cloudConfigured&&!t,canUseLocalProjects:m,canBrowseLocalWorkspace:o.canBrowseWorkspace,localProviderKind:o.providerKind,canUseCloudProjects:p,canSyncLocalToCloud:m&&p,cloudPlanKey:((L=c==null?void 0:c.planKey)==null?void 0:L.trim())||"free",cloudEntitlementStatus:((I=c==null?void 0:c.entitlementStatus)==null?void 0:I.trim())||(c?"active":"inactive"),currentCloudBoardCount:(c==null?void 0:c.currentBoardCount)??0,cloudBoardLimit:(c==null?void 0:c.cloudBoardLimit)??Bg,lockedCloudBoardCount:(c==null?void 0:c.lockedBoardCount)??0,canCreateCloudBoards:(c==null?void 0:c.canCreateBoard)??p,canUseManagedAi:(c==null?void 0:c.canUseManagedAi)??!1,canGenerateImage:(c==null?void 0:c.canGenerateImage)??!1,canUseContextPack:(c==null?void 0:c.canUseContextPack)??!1,cloudLimitMessage:y,localStatusMessage:o.isAvailable?void 0:Yg(e,o),cloudStatusMessage:p?void 0:Xg(e)}}function Kg(){const e=new Error("Queued operation was cancelled before it started.");return e.name="AbortError",e}class qg{constructor(){id(this,"tails",new Map)}isBusy(t){return this.tails.has(t)}enqueue(t,o,r){if(typeof o!="function")throw new TypeError("KeyedAsyncQueue operation is required.");const l=this.tails.get(t)??Promise.resolve();let m;return m=(async()=>{try{try{await l}catch{}if(r!=null&&r.aborted)throw Kg();return await o(r)}finally{this.tails.get(t)===m&&this.tails.delete(t)}})(),this.tails.set(t,m),m}clear(t){if(typeof t>"u"){this.tails.clear();return}this.tails.delete(t)}}const Er="mindexec-local-mode-warning-dismissed-v1";function Jg(){try{return window.localStorage.getItem(Er)==="true"}catch{return!1}}function Jl(e,t){var o,r;if(e==="checking")return"Checking bridge";if(e==="connected"){const l=(r=(o=t==null?void 0:t.exec)==null?void 0:o.model)==null?void 0:r.trim();return l?`Bridge / ${l}`:"Bridge connected"}return e==="blocked"?"Bridge gated":e==="unavailable"?"Bridge unavailable":"Bridge idle"}function Zg(e,t,o){var l,m,p,b,c;if(e!=="connected")return t||Jl(e,o);const r=[o!=null&&o.version?`version ${o.version}`:null,(l=o==null?void 0:o.exec)!=null&&l.model?`model ${o.exec.model}`:null,(m=o==null?void 0:o.exec)!=null&&m.reasoningEffort?`reasoning ${o.exec.reasoningEffort}`:null,(p=o==null?void 0:o.exec)!=null&&p.serviceTier?`tier ${o.exec.serviceTier}`:null,(b=o==null?void 0:o.exec)!=null&&b.preferredProviderKind?`codex ${o.exec.preferredProviderKind}`:null,(c=o==null?void 0:o.project)!=null&&c.isOpen?"project open":null].filter(Boolean);return r.length>0?`LocalBridge connected. ${r.join(" / ")}`:"LocalBridge connected."}function Qg({state:e,message:t,status:o,hostedBridgeAccessEnabled:r,onRefresh:l,onEnableHostedBridge:m}){const p=g.useMemo(()=>e==="checking"?n.jsx(Ut,{size:14,className:"spin-icon"}):e==="connected"?n.jsx(_m,{size:14}):e==="blocked"?n.jsx(Il,{size:14}):e==="unavailable"?n.jsx(Dm,{size:14}):n.jsx(Vr,{size:14}),[e]);return n.jsxs("div",{className:`runtime-status-pill runtime-status-pill--${e}`,title:Zg(e,t,o),"data-testid":"bridge-status-pill","data-bridge-state":e,"data-bridge-access":r?"enabled":"gated",children:[n.jsx("span",{className:"runtime-status-pill__icon","aria-hidden":"true",children:p}),n.jsx("span",{children:Jl(e,o)}),e==="blocked"&&!r&&n.jsx("button",{type:"button",className:"runtime-status-pill__action",onClick:m,children:"Enable"}),n.jsx("button",{type:"button",className:"runtime-status-pill__button",title:"Refresh LocalBridge","data-testid":"bridge-status-refresh",onClick:()=>void l(),disabled:e==="checking",children:n.jsx(ln,{size:13})})]})}function eh({status:e,message:t}){const r={ready:{icon:n.jsx(kr,{size:14}),label:"Saved locally",title:"Board state is saved in this browser."},syncing:{icon:n.jsx(Ut,{size:14,className:"spin-icon"}),label:"Saving",title:"Saving board state to this browser."},error:{icon:n.jsx(Yr,{size:14}),label:"Save error",title:"Board state could not be saved locally."},offline:{icon:n.jsx(Vr,{size:14}),label:"Offline",title:"No sync adapter is connected."}}[e];return n.jsxs("div",{className:`runtime-status-pill runtime-status-pill--sync-${e}`,title:t||r.title,"data-testid":"sync-status-indicator","data-sync-status":e,children:[n.jsx("span",{className:"runtime-status-pill__icon","aria-hidden":"true",children:r.icon}),n.jsx("span",{children:r.label})]})}function th({visible:e}){const[t,o]=g.useState(Jg);if(!e||t)return null;const r=()=>{o(!0);try{window.localStorage.setItem(Er,"true")}catch{}f.emit("runtimeStatus.localMode.dismissed")};return n.jsxs("section",{className:"runtime-local-warning",role:"status","data-testid":"local-mode-warning","data-local-mode-dismissed-key":Er,children:[n.jsx("div",{className:"runtime-local-warning__icon","aria-hidden":"true",children:n.jsx(Yr,{size:16})}),n.jsxs("div",{className:"runtime-local-warning__copy",children:[n.jsx("strong",{children:"Local Mode"}),n.jsx("span",{children:"Boards are saved in this browser. LocalBridge export creates a file-backed copy."})]}),n.jsx("button",{type:"button",title:"Dismiss local mode warning","data-testid":"local-mode-dismiss",onClick:r,children:n.jsx(yt,{size:14})})]})}function ah({bridgeState:e,bridgeMessage:t,bridgeStatus:o,syncStatus:r,syncMessage:l,hostedBridgeAccessEnabled:m,onRefreshBridge:p,onEnableHostedBridge:b,showLocalModeWarning:c=!0}){return n.jsxs("aside",{className:"runtime-status-cluster","aria-label":"Runtime status","data-testid":"runtime-status-cluster","data-local-mode-visible":c?"true":"false",children:[n.jsxs("div",{className:"runtime-status-row",children:[n.jsx(Qg,{state:e,message:t,status:o,hostedBridgeAccessEnabled:m,onRefresh:p,onEnableHostedBridge:b}),n.jsx(eh,{status:r,message:l})]}),n.jsx(th,{visible:c})]})}const nh=/^data:image\//i;function oh(e){const t=String(e||"").trim();if(!t)return{src:null,reason:"empty",urlKind:"empty"};const o=t.toLowerCase();return nh.test(t)?{src:t,reason:null,urlKind:"data"}:o.startsWith("blob:")?{src:t,reason:null,urlKind:"blob"}:o.startsWith("https://")?{src:t,reason:null,urlKind:"https"}:o.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 sr({src:e,alt:t="",className:o="",testId:r="secure-image",traceId:l,kind:m="image",title:p}){const b=g.useMemo(()=>oh(e),[e]),[c,y]=g.useState(b.src?"loading":"blocked");g.useEffect(()=>{const D=b.src?"loading":"blocked";y(D),b.src||f.emit("secureImage.blocked",{id:l,kind:m,reason:b.reason,urlKind:b.urlKind})},[m,b.reason,b.src,b.urlKind,l]);const w=()=>{y("loaded"),f.emit("secureImage.loaded",{id:l,kind:m,urlKind:b.urlKind})},L=()=>{y("error"),f.emit("secureImage.error",{id:l,kind:m,urlKind:b.urlKind})},I=c==="blocked"?`Image blocked: ${b.reason||"unsupported source"}`:"Image failed to load";return n.jsxs("div",{className:`secure-image secure-image--${c} ${o}`.trim(),"data-testid":r,"data-secure-image-state":c,"data-secure-image-kind":m,title:c==="loaded"?p:I,children:[b.src&&n.jsx("img",{src:b.src,alt:t,loading:"lazy",decoding:"async",draggable:!1,onLoad:w,onError:L}),c==="loading"&&n.jsx("span",{className:"secure-image__loading","aria-hidden":"true",children:n.jsx("span",{})}),(c==="blocked"||c==="error")&&n.jsx("span",{className:"secure-image__fallback",role:"img","aria-label":I,children:c==="blocked"?n.jsx(Bm,{size:18}):n.jsx(Yr,{size:18})})]})}const sh={note:ls,text:xt,"ai-task":cn,image:mn,mask:mn,video:pn,embed:gn,code:un,markdown:xt,"csv-table":xt,memo:ls,pdf:xt,file:wr,directory:Om,"template-launcher":xt,"remote-monitor":ds,"remote-control":ds},rr=[{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."}],zd=500,rh=48,ih=new Set(["mindcanvasagent","agentcommand"]),dh=new Set(["codenote","code-note"]),lh=["multidesktopmonitor","remotehubmonitor","remotefleetmonitor","smartviewmonitor"],ch=["remotedevice","remotefleetdevice","remotecontrol"];function uh(e){const t=hn(e,"SemanticType","semanticType","RemoteFleetSemanticType").trim().toLowerCase(),o=hn(e,"RemoteFleetNodeRole","remoteFleetNodeRole").trim().toLowerCase(),r=hn(e,"RemoteFleetSchemaVersion","remoteFleetSchemaVersion").trim().toLowerCase();return e.kind==="remote-monitor"||t==="remotefleetmonitor"||o==="fleet-monitor"||r==="remote-fleet@1"||Ql(e,["RemoteFleetViewMode","RemoteFleetHubStatus","RemoteFleetDevicesJson","RemoteFleetDeviceCount","RemoteFleetConnectedDeviceCount","RemoteFleetProjectionMode","RemoteFleetCanvasPagination","RemoteHub","RemoteRoute","RemotePage","RemoteVisibleBudget"])||Zl(e,lh,["remote","monitor"])}function mh(e){const t=hn(e,"SemanticType","semanticType","RemoteFleetSemanticType").trim().toLowerCase(),o=hn(e,"RemoteFleetNodeRole","remoteFleetNodeRole").trim().toLowerCase(),r=hn(e,"RemoteFleetSchemaVersion","remoteFleetSchemaVersion").trim().toLowerCase();return e.kind==="remote-control"||t==="remotefleetdevice"||o==="fleet-device"||r==="remote-fleet-device@1"||Ql(e,["RemoteFleetDeviceId","RemoteFleetDeviceName","RemoteFleetDevicePlatform","RemoteFleetDeviceConnected","RemoteFleetDeviceCanControl","RemoteFleetSourceMonitorNodeId"])||Zl(e,ch,["remote","control"])}function Zl(e,t,o){const r=(e.tags??[]).map(b=>b.trim().toLowerCase()).filter(Boolean),l=o.every(b=>r.includes(b)),p=[e.title,e.body,e.sourceFilePath,e.assetUrl,...r].join(" ").toLowerCase().replace(/[^a-z0-9]+/g,"");return l||t.some(b=>p.includes(b))}function hn(e,...t){const o=e.metadata??{};for(const l of t){const m=o[l];if(m!=null)return String(m)}const r=new Set(t.map(l=>l.toLowerCase()));for(const[l,m]of Object.entries(o))if(r.has(l.toLowerCase())&&m!==void 0&&m!==null)return String(m);return""}function Ql(e,t){const o=e.metadata??{},r=new Set(t.map(l=>l.toLowerCase()));return Object.entries(o).some(([l,m])=>r.has(l.toLowerCase())&&m!==void 0&&m!==null&&String(m).trim()!=="")}const Pr=[{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"}],ph=g.memo(function({node:t,selected:o,pulsing:r,connectionDraft:l,onSelect:m,onDragStart:p,onResizeStart:b,onPatch:c,onDelete:y,onDuplicate:w,onRun:L,onPin:I,onOpenResult:D,onToggleAiReference:q,onCopyNode:$,onCopyEmbedReference:O,onFitNodeHeight:G,onToggleNodeExpanded:V,onToggleWordWrap:re,onStageCompany:oe,onOpenCompanyGraph:Ae,onSyncCompanyGoal:be,onRefreshCompany:Ue,onSetCompanyStatus:et,onRemoveCompany:tt,onOpenAsset:he,onOpenDirectorySettings:J,onScanDirectory:ie,onCreateRemoteControl:se,onGenerateTemplateCard:St}){var Mn,wo,rt,Bt,ya,Ha,Qt,Wa,te,Ye,Va,Tn,v,Y,ae,Xe,Rn,Ot,Ya,Xa,Ln,En,Ga,Pn,xa,_n,Ka,Ca,ea,De,Pe,qa,Dn,vo,Sa;const F=String(((Mn=t.metadata)==null?void 0:Mn.AutomationNodeKind)||((wo=t.metadata)==null?void 0:wo.AutomationTemplateKey)||((rt=t.metadata)==null?void 0:rt.AutomationInferredKind)||"").trim().toLowerCase(),lt=String(((Bt=t.metadata)==null?void 0:Bt.SemanticType)||((ya=t.metadata)==null?void 0:ya.semanticType)||"").trim().toLowerCase(),Me=t.kind==="memo"&&ih.has(lt),le=t.kind==="memo"&&dh.has(lt),Tt=String(((Ha=t.metadata)==null?void 0:Ha.AgentCommandStatus)||"Draft"),me=String(((Qt=t.metadata)==null?void 0:Qt.AgentCommandMode)||"Task"),He=String(((Wa=t.metadata)==null?void 0:Wa.AgentCommandRequestedRole)||"Researcher"),ee=String(((te=t.metadata)==null?void 0:te.CodeNoteStatus)||"Draft"),ct=String(((Ye=t.metadata)==null?void 0:Ye.CodeNoteSyncState)||"Unlinked"),Wt=String(((Va=t.metadata)==null?void 0:Va.CodeNoteKind)||"Feature"),Ea=Me?cn:le?un:F==="image-generate"?mn:F==="video-generate"?pn:sh[t.kind],xn=l&&l.from!==t.id,ho=t.kind==="ai-task",Re=t.kind==="pdf"||t.kind==="file"||t.kind==="directory",Pa=uh(t),Vt=mh(t),Oe=Pa||Vt,Te=Pa?"monitor":Vt?"control":"",ce=t.kind==="template-launcher"||String(((Tn=t.metadata)==null?void 0:Tn.semanticType)||((v=t.metadata)==null?void 0:v.SemanticType)||"").toLowerCase()==="templatelauncher",kt=t.kind==="video",we=t.kind==="embed",wt=t.kind==="mask",ye=t.kind==="memo",at=t.kind==="markdown",nt=t.kind==="csv-table",Fe=ye?kh(t):null,pe=g.useRef(null),Cn=kt?ec(t):"",qe=kt?vh(t):"",$e=we?jh(t):"",vt=we?Ih(t):"",fo=we?Nh(t,$e):"",_e=we?Ah(t):"",Le=(((Y=t.imageStack)==null?void 0:Y.variants)??[]).filter(x=>!!x.imageUrl),ut=Le.find(x=>{var P;return x.variantId===((P=t.imageStack)==null?void 0:P.activeVariantId)})??Le[0]??null,Rt=t.kind==="image"||wt?(ut==null?void 0:ut.imageUrl)||ei(t):"",la=ut?Le.findIndex(x=>x.variantId===ut.variantId):-1,_a=!Rt&&!Re&&!Oe&&!ce&&!kt&&!we,bo=_a&&!ye,Yt=t.isExpanded===!1&&Number(t.originalHeight??0)>t.height+1,Sn=!Oe&&!["image","mask","video","embed","pdf","file","directory","template-launcher","remote-monitor","remote-control"].includes(t.kind),ot=t.aiEnabled!==!1,We=wh(t),Je=!!(t.isChunkedText||((ae=t.metadata)==null?void 0:ae.IsChunkedText)==="true"),ca=Number(t.totalLineCount??((Xe=t.metadata)==null?void 0:Xe.TotalLineCount)??0),yo=t.sourceFilePath||((Rn=t.metadata)==null?void 0:Rn.FileName)||t.title,xe=Je?n.jsxs("div",{className:"node-chunked-text-state","data-testid":"node-chunked-text-state",title:yo,children:[n.jsx(xt,{size:12}),n.jsx("strong",{children:"Chunked text"}),Number.isFinite(ca)&&ca>0&&n.jsxs("span",{children:[ca.toLocaleString()," lines"]})]}):null,Xt=t.kind==="directory"?(Ot=t.metadata)==null?void 0:Ot.Include:null,Da=t.kind==="directory"?(Ya=t.metadata)==null?void 0:Ya.Exclude:null,kn=t.kind==="directory"?(Xa=t.metadata)==null?void 0:Xa.DirectoryFileCount:null,Ee=t.kind==="directory"?(Ln=t.metadata)==null?void 0:Ln.DirectoryDirCount:null,jt=t.kind==="directory"?(En=t.metadata)==null?void 0:En.DirectoryLastScanUtc:null,[Ba,Oa]=g.useState(!1),[Fa,Ve]=g.useState(null),[Ss,wn]=g.useState(((Ga=t.metadata)==null?void 0:Ga.CompanyExecutionMode)||"Auto"),[ua,$a]=g.useState(((Pn=t.metadata)==null?void 0:Pn.CompanySubAgents)!=="false"),[Gt,ma]=g.useState(!1),[It,za]=g.useState(null),pa=g.useMemo(()=>nt?bh(t.body,It):null,[It,nt,t.body]),de=g.useMemo(()=>ce?kl(t.body):null,[ce,t.body]),mt=(de==null?void 0:de.options.find(x=>x.id===de.selectedOptionId))??(de==null?void 0:de.options[0])??null,Kt=om(de),Lt=rr.find(x=>x.key===Ss)||rr[0],Et=String(((xa=t.metadata)==null?void 0:xa.CompanyStatus)||(t.companyMode?"Staged":"")).trim(),Pt=Et.toLowerCase(),qt=Pt==="paused",pt=Pt==="archived",ks=x=>{x.stopPropagation();const P=x.currentTarget.getBoundingClientRect();Ve(hh(P)),Oa(ne=>!ne)},ws=x=>{x.stopPropagation(),oe(t.id,{executionMode:Lt.key,enableSubAgents:ua}),Oa(!1)},xo=x=>{x.stopPropagation(),Ae(t.id)},ga=(x,P)=>{P.stopPropagation();const ne=Le.find(ht=>ht.variantId===x);!ne||!t.imageStack||ne.variantId===t.imageStack.activeVariantId||(f.emit("node.imageStack.variant",{nodeId:t.id,variantId:ne.variantId,variantCount:Le.length}),c(t.id,{imageUrl:ne.imageUrl,imageStack:{...t.imageStack,activeVariantId:ne.variantId,variants:Le,updatedAtUtc:new Date().toISOString()},metadata:{...t.metadata??{},ImageStackActiveVariantId:ne.variantId}}))},vs=(x,P)=>{if(P.stopPropagation(),!!ye){if((Fe==null?void 0:Fe.key)===x){ma(!1);return}f.emit("node.memoColor.changed",{id:t.id,colorKey:x}),c(t.id,{metadata:{...t.metadata??{},memoColor:x,memoColorIsCustom:"true"}}),ma(!1)}},vn=x=>{var Be,jo;if(x.stopPropagation(),!Me)return;const P=(t.body||t.title||"Agent command objective").trim(),ne=["Clarify the objective and constraints.","Collect linked canvas context or code notes.","Draft an execution plan before external adapter use."],ht=["canvas-context","agent-command-planning","adapter-gated-execution"],ze=["Canvas.ListAgentCommands","Canvas.UpdateAgentCommand","Canvas.PlanAgentCommand","Canvas.SetAgentCommandState"],Nt=["MindCanvasAgent",me,He],z=["Local React plan staged for this Agent Command.",`Role: ${He}`,`Mode: ${me}`,`Objective: ${P.slice(0,220)}`,"External execution remains adapter-gated until LocalBridge/agent runtime is available."].join(`
|
|
1
|
+
var Xu=Object.defineProperty;var Gu=(e,t,o)=>t in e?Xu(e,t,{enumerable:!0,configurable:!0,writable:!0,value:o}):e[t]=o;var id=(e,t,o)=>Gu(e,typeof t!="symbol"?t+"":t,o);import{j as n,r as g,a as Ku}from"./vendor-react-BXzpOyCS.js";import{l as qu,a as ft,s as zt,b as Ju,d as Zu,r as Qu,c as em,e as tm,i as dd}from"./storage-CWUvUZC-.js";import{r as Hr,g as fs,w as am,a as Ys,d as ld,b as nm,t as Wr,p as kl,v as om,R as sm,c as rm,u as im,e as dm,f as cd,s as bt,i as en,l as Xs,h as Gn,j as $o,k as Kn,m as qn,n as zo,o as Na,q as ud,x as lm,y as Jn,z as cm,A as um,B as mm,C as pm,D as wl,E as gm,F as hm,G as oo,H as yr,I as fm,J as bm,K as md,L as xr,M as Cr,N as vl,O as Uo,P as Qo,Q as so,S as pd,T as U,U as Gs,V as ro,W as ym,X as xm,Y as Cm,Z as gd,_ as Ks,$ as Sm,a0 as km,a1 as wm,a2 as vm,a3 as Sr,a4 as jm,a5 as Im,a6 as Nm,a7 as Am,a8 as hd}from"./canvas-runtime-hH7qY6Be.js";import{e as Mm,d as Tm}from"./vendor-msgpack-BE8aAsr3.js";import{R as f}from"./app-runtime-xD2Z3NdN.js";import{g as qs,A as fd,a as es}from"./index-gjNKWU_x.js";import{g as bs,r as jl}from"./supabaseAuthAdapter-Bptc9G29.js";import{c as Rm,a as Lm,r as bd}from"./toolHandoff-D5e5f7t5.js";import{a as yd,s as Em}from"./executionModeSettings-NJqurj-o.js";import{a as xd,p as Pm}from"./runtimeSettingsPersistenceProjection-BoNWmYjU.js";import{A as Ut,W as _m,c as Il,D as Dm,E as Vr,R as ln,J as Yr,X as yt,N as kr,O as Bm,Q as cn,w as un,I as mn,V as pn,l as ds,F as xt,Y as Om,Z as wr,_ as ls,$ as gn,a0 as Nl,a1 as Fm,a2 as Al,a3 as $m,i as co,a4 as Ml,a5 as zm,a6 as Cd,a7 as Um,a8 as ia,a9 as Sd,T as cs,aa as kd,ab as po,ac as Hm,ad as ts,ae as Tl,af as vr,ag as Wm,ah as Vm,f as Ym,ai as Xm,h as io,x as Gm,aj as Km,ak as qm,al as wd,am as vd,an as jd,g as Id,ao as Ho,H as Zn,ap as Wo,s as Js,aq as Nd,ar as Jm,as as Zs,at as Ad,au as Vo,av as Qs,aw as Md,ax as Td,ay as Rd,az as Zm,aA as Qm,aB as ep,aC as tp,n as ap,o as Qn,aD as np,aE as op,aF as sp,aG as rp,aH as ip,aI as dp,aJ as lp,aK as cp}from"./vendor-icons-D0xKCnZS.js";const up=1200,La="LocalBridgeOriginalNodeId";function Ct(e){return typeof e=="object"&&e!==null}function sa(e,t){const o=Number(e);return Number.isFinite(o)?o:t}function W(e){return typeof e=="string"?e:""}function Rl(){return typeof window<"u"?{width:window.innerWidth||1280,height:window.innerHeight||720}:{width:1280,height:720}}function jr(e,t,o){const r=Number(e),l=Number(t),m=Number(o);if(!Number.isFinite(r)||!Number.isFinite(l)||!Number.isFinite(m)||m<=0)return null;const p=1400/m,b=Rl();return{x:b.width/2-r*p,y:b.height/2-l*p,scale:p}}function mp(e){return Ct(e)?jr(e.x??e.X,e.y??e.Y,e.z??e.Z):null}function pp(e){if(!Ct(e))return null;const t=Number(e.x),o=Number(e.y),r=Number(e.scale);if(!Number.isFinite(t)||!Number.isFinite(o)||!Number.isFinite(r)||r<=0)return null;const l=Rl();return{x:(l.width/2-t)/r,y:(l.height/2-o)/r,z:1400/r}}function gp(e){const t=String(e||"").trim();if(t)try{const o=JSON.parse(t);if(!Ct(o))return;const r={};for(const[l,m]of Object.entries(o)){const p=mp(m);p&&(r[l]=p)}return Object.keys(r).length>0?r:void 0}catch{return}}function hp(e){if(!e||Object.keys(e).length===0)return null;const t={};for(const[o,r]of Object.entries(e)){const l=pp(r);l&&(t[o]=l)}return Object.keys(t).length>0?JSON.stringify(t):null}function us(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 ys(){return crypto.randomUUID()}function Xr(e){return Ct(e)?"ContentType"in e||"Prompt"in e||"Response"in e||"PositionX"in e||"PositionY"in e||"SourceFilePath"in e||"ImageStack"in e:!1}function Ld(e){const t=W(e).trim();if(!t)return null;try{return JSON.parse(t)}catch{return null}}function Ir(e){if(Array.isArray(e))return e;if(!Ct(e))return[];for(const t of["Nodes","nodes","Items","items","Content","content","Upserts","upserts"])if(t in e){const o=e[t];if(Array.isArray(o))return o;const r=Ld(o);if(r)return Ir(r)}for(const t of["ContentJson","contentJson","content_json"])if(t in e){const o=Ld(e[t]);if(o)return Ir(o)}return Xr(e)?[e]:[]}function Gr(e){return Ct(e)?"BoardId"in e&&("Upserts"in e||"upserts"in e||"Deletes"in e||"deletes"in e):!1}function Ll(e){if(!Ct(e))return 0;for(const t of["Deletes","deletes"]){const o=e[t];if(Array.isArray(o))return o.length}return 0}function ms(e){return Ir(e).filter(Xr)}function El(e){return ms(e).length}function fp(e,t){var m;const o=[...ms(e)];if(!Gr(t))return o;const r=new Set;for(const p of["Deletes","deletes"]){const b=t[p];if(Array.isArray(b))for(const c of b){const y=W(c).trim();y&&r.add(y)}}if(r.size>0)for(let p=o.length-1;p>=0;p-=1){const b=W((m=o[p])==null?void 0:m.Id).trim();b&&r.has(b)&&o.splice(p,1)}const l=new Map;o.forEach((p,b)=>{const c=W(p.Id).trim();c&&l.set(c,b)});for(const p of ms(t)){const b=W(p.Id).trim(),c=b?l.get(b):void 0;if(c!==void 0){o[c]=p;continue}b&&l.set(b,o.length),o.push(p)}return o}function Pl(e){const t=Array.isArray(e)?e.filter(Ct):[];return new Map(t.filter(o=>o.NodeId).map(o=>[String(o.NodeId),o]))}async function Nr(e,t){for(const o of e)try{const r=await Hr(o,t);return{payload:JSON.parse(r.content),path:o}}catch{}return null}async function bp(e,t){const o=`.mindexec/boards/${e}.msgpack`,r=`boards/${e}.msgpack`;for(const b of[o,r])try{const c=await nm(b,t);return{payload:Tm(c),format:b===o?"msgpack":"legacy-msgpack",path:b}}catch{}const l=`.mindexec/boards/${e}.json`,m=`boards/${e}.json`,p=await Nr([l,m],t);if(p)return{payload:p.payload,format:p.path===l?"json":"legacy-json",path:p.path};throw new Error(`LocalBridge board file not found: ${o}, ${r}, ${l}, ${m}`)}function Ar(e){const t=W(e.Id).trim()||W(e.BoardId).trim();return t?{Id:t,Title:W(e.Title)||null,Description:W(e.Description)||null,ThumbnailUrl:W(e.ThumbnailUrl)||null,CreatedAt:W(e.CreatedAt)||null,UpdatedAt:W(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:W(e.CameraBookmarks)||null}:null}function Ed(e){return!Ct(e)||Xr(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 Kr(e){if(Array.isArray(e))return e.filter(Ed).map(t=>Ar(t)).filter(t=>!!t);if(Ed(e)){const t=Ar(e);return t?[t]:[]}return[]}function yp(e){const t=e.toLowerCase();return xp(t)?"remote-control":Cp(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 xp(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 o=t.replace(/[^a-z0-9]+/g,"");return o.includes("remotecontrol")||o.includes("remotedevice")||o.includes("remotefleetdevice")}function Cp(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 o=t.replace(/[^a-z0-9]+/g,"");return o.includes("remotemonitor")||o.includes("remotehubmonitor")||o.includes("multidesktopmonitor")||o.includes("smartviewmonitor")}function Sp(e,t){const o=e.Metadata||{},r=o.ThumbnailUrl,l=o.OriginalUrl,m=o.OriginalPath;return Wr(W(r)||W(l)||W(m)||W(e.Response),t)}function kp(e,t,o){const r=e.ImageStack,l=Array.isArray(r==null?void 0:r.Variants)?r.Variants:[];if(l.length===0)return;const m=l.map((b,c)=>{const y=W(b.AssetId).trim(),w=Wr(y,o)||t;return w?{variantId:W(b.VariantId)||`variant-${W(e.Id)||c}`,imageUrl:w,assetId:y||void 0,caption:W(b.Caption)||void 0,sourceNodeId:W(e.Id)||void 0,createdAtUtc:W(b.CreatedAtUtc)||void 0}:null}).filter(b=>!!b);if(m.length===0)return;const p=W(r==null?void 0:r.ActiveVariantId);return{activeVariantId:m.some(b=>b.variantId===p)?p:m[0].variantId,variants:m,kind:W(r==null?void 0:r.Kind)||"versions",title:W(r==null?void 0:r.Title)||void 0,updatedAtUtc:W(r==null?void 0:r.UpdatedAtUtc)||void 0}}function wp(e,t){return!e||e.variants.length===0?t:(e.variants.find(r=>r.variantId===e.activeVariantId)??e.variants[0]).imageUrl||t}function vp(e,t,o){var p,b,c,y,w,L;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:go(e.imageUrl,t)||e.imageUrl,title:e.title,sourceNodeId:e.id,createdAtUtc:o}]:[];if(r.length===0)return null;const l=r.map(I=>({VariantId:I.variantId||ys(),AssetId:I.assetId||go(I.imageUrl,t)||I.imageUrl,CreatedAtUtc:I.createdAtUtc||o,Caption:I.caption||I.title||null}));return{ActiveVariantId:(c=e.imageStack)!=null&&c.activeVariantId&&l.some(I=>{var D;return I.VariantId===((D=e.imageStack)==null?void 0:D.activeVariantId)})?e.imageStack.activeVariantId:l[0].VariantId||"",Variants:l,Kind:((y=e.imageStack)==null?void 0:y.kind)||(l.length>1?"pile":"versions"),Title:((w=e.imageStack)==null?void 0:w.title)||e.title||null,UpdatedAtUtc:((L=e.imageStack)==null?void 0:L.updatedAtUtc)||o}}function jp(e,t){const o=e.Metadata||{};return Wr(W(o.OriginalUrl)||W(o.OriginalPath)||W(o.SourceFilePath)||W(e.SourceFilePath)||W(e.Response),t)}function Ip(e){const t={};for(const[o,r]of Object.entries(e??{}))typeof r=="string"?t[o]=r:r!=null&&(t[o]=String(r));return t}function Np(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 go(e,t){const o=String(e||"").trim();if(!o)return"";const r=t.replace(/\/+$/,"");return o.startsWith(`${r}/`)?o.slice(r.length+1):o.replace(/^\/+/,"")}function Ap(e,t){const o=new Map;for(const r of e){const l=t.get(r.from),m=t.get(r.to);!l||!m||o.has(m)||o.set(m,l)}return o}function Mp(e){const t=new Set;return e.map(o=>{var c,y;const r=((c=o.metadata)==null?void 0:c[La])||"",l=us(r)?r:us(o.id)?o.id:"",m=!!(l&&t.has(l)),p=l&&!m?l:ys(),b=((y=o.metadata)==null?void 0:y[La])!==p;return t.add(p),{node:b?{...o,metadata:{...o.metadata??{},[La]:p}}:o,originalId:p,assignedNodeId:!l||m,metadataStamped:b,duplicateOriginalId:m}})}function Tp(e,t,o,r,l){var y,w,L;const m=Np(e.kind),p=m==="image"||m==="mask"?go(e.imageUrl,l):"",b=["video","pdf","file","directory","embed"].includes(m)?go(e.assetUrl||e.sourceFilePath||e.body,l):"",c={...e.metadata??{},[La]:t,ReactNodeId:e.id,ReactKind:e.kind};if(e.kind==="remote-monitor"&&(c.RemoteHub??(c.RemoteHub="Gated"),c.RemoteRoute??(c.RemoteRoute="Gated"),c.RemoteConnected??(c.RemoteConnected="0"),c.RemoteTotal??(c.RemoteTotal="30"),c.RemotePage??(c.RemotePage="1/1"),c.AdapterState??(c.AdapterState="adapter-gated")),e.kind==="remote-control"&&(c.SemanticType??(c.SemanticType="RemoteFleetDevice"),c.RemoteFleetSchemaVersion??(c.RemoteFleetSchemaVersion="remote-fleet-device@1"),c.RemoteRoute??(c.RemoteRoute="Gated"),c.RemoteInput??(c.RemoteInput="Off"),c.AdapterState??(c.AdapterState="adapter-gated")),e.kind==="mask"&&(c.ImageRouterMask??(c.ImageRouterMask="true"),c.SemanticType??(c.SemanticType="ImageEditMask")),e.kind==="embed"){const I=e.assetUrl||e.body||e.sourceFilePath||"";c.source??(c.source="embed"),c.renderMode??(c.renderMode="card"),c.provider??(c.provider="web"),c.sourceUrl??(c.sourceUrl=I),c.url??(c.url=I),c.AdapterState??(c.AdapterState="local-reference")}return e.kind==="video"&&(c.assetKind??(c.assetKind="video"),c.videoMode??(c.videoMode=(y=e.assetUrl)!=null&&y.startsWith(l)?"local_bridge":"local_reference"),c.AdapterState??(c.AdapterState=((w=e.metadata)==null?void 0:w.PromptOnly)==="true"?"adapter-gated":"local-reference")),(L=e.tags)!=null&&L.length&&(c.ReactTags=JSON.stringify(e.tags)),p&&(c.OriginalUrl=p,c.ThumbnailUrl=p),b&&(c.OriginalPath=b,c.SourceFilePath=b),{Id:t,ContentType:m,Prompt:e.title||m,Response:m==="image"||m==="mask"?p||e.body||null:m==="remote-monitor"?e.body||"RemoteHub monitor node. Frames and input stay adapter-gated until LocalBridge is connected.":m==="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:o||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:c,ImageStack:m==="image"?vp(e,l,r):null}}function Rp(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 Lp(e,t,o){const r=W(e.ContentType)||"note",l=W(e.Prompt).trim(),m=W(e.Response).trim(),p=Ip(e.Metadata),b=W(e.Id).trim();b&&(p[La]??(p[La]=b));const y=["true","1","yes"].includes(String(p.ImageRouterMask||p.IsMask||"").trim().toLowerCase())?"mask":yp(r),w=y==="memo"&&["mindcanvasagent","agentcommand"].includes(String(p.SemanticType||p.semanticType||"").trim().toLowerCase()),L=y==="memo"&&["codenote","code-note"].includes(String(p.SemanticType||p.semanticType||"").trim().toLowerCase()),I=W(e.SourceFilePath)||p.OriginalPath||p.SourceFilePath||"",D=y==="video"||y==="pdf"||y==="file"||y==="directory"||y==="embed"?jp(e,o):void 0,q=l||e.SourceFilePath||r||"LocalBridge node",$=y==="image"?m||l||"Image asset":y==="mask"?m||l||"Image mask asset":y==="remote-monitor"?m||l||"RemoteHub monitor node. Frames and input stay adapter-gated until LocalBridge is connected.":y==="remote-control"?m||l||I||"Remote device control node. Frames and input stay adapter-gated until LocalBridge is connected.":y==="pdf"||y==="file"||y==="directory"||y==="embed"?m||I||l||r:m||l||I||"",O=w?500:L?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,G=w||L?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,V=y==="image"||y==="mask"?Sp(e,o):void 0,re=y==="image"?kp(e,V,o):void 0,oe=!!(e.IsChunkedText||p.IsChunkedText==="true"),Ae=sa(e.TotalLineCount??p.TotalLineCount,0),be=sa(e.ScrollOffset,0),Ue=sa(e.MaxScroll,0);return{id:String(e.Id||crypto.randomUUID()),kind:y,title:y==="remote-monitor"?l||"Multi Desktop Monitor":y==="remote-control"?l||p.RemoteFleetDeviceName||"Remote Device":y==="template-launcher"?l||"Template Launcher":q,body:$,x:sa((t==null?void 0:t.PositionX)??e.PositionX,0),y:sa((t==null?void 0:t.PositionY)??e.PositionY,0),width:Math.max(160,Math.min(900,sa((t==null?void 0:t.Width)??e.Width,O))),height:Math.max(120,Math.min(900,sa((t==null?void 0:t.Height)??e.Height,G))),status:e.IsLoading?"running":y==="ai-task"?"idle":void 0,imageUrl:wp(re,V),imageStack:re,assetUrl:D,sourceFilePath:I||void 0,isChunkedText:oe||void 0,totalLineCount:oe?Ae:void 0,scrollOffset:oe?be:void 0,maxScroll:oe?Ue:void 0,isExpanded:typeof e.IsExpanded=="boolean"?e.IsExpanded:void 0,originalHeight:sa(e.OriginalHeight,0)||void 0,tags:w?["Agent Command",p.AgentCommandRequestedRole||"Researcher",p.AgentCommandStatus||"Draft"]:L?["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"?Ep(p):y==="remote-control"?Pp(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 Ep(e){return{RemoteHub:"Gated",RemoteRoute:"Gated",RemoteConnected:"0",RemoteTotal:"30",RemotePage:"1/1",AdapterState:"adapter-gated",...e}}function Pp(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 _p(e,t){const o=[];for(const r of e){const l=String(r.Id||""),m=String(r.ParentId||"");!l||!m||!t.has(l)||!t.has(m)||o.push({id:`edge-local-${m}-${l}`,from:m,to:l,kind:"context"})}return o}async function Dp(e=fs()){const t=await Hr(".mindexec/boards/_metadata.json",e),o=JSON.parse(t.content);return(Array.isArray(o)?o.filter(Ct):[]).map(m=>Ar(m)).filter(m=>!!m).sort((m,p)=>String(p.UpdatedAt||"").localeCompare(String(m.UpdatedAt||"")))}async function Bp(e){try{const t=await Hr(".mindexec/boards/_metadata.json",e),o=JSON.parse(t.content);return Array.isArray(o)?o.filter(Ct):[]}catch{return[]}}async function Op(e,t,o,r=fs(),l=null){var lt,Me,le,Tt,me,He;if((lt=e.source)!=null&<.partialImport)throw new Error("This board was imported from a partial original payload. Export is blocked to avoid data loss.");if((Me=e.source)!=null&&Me.truncated)throw new Error("This board was truncated during import. Export is blocked to avoid data loss.");const m=(le=e.source)!=null&&le.exportedByReact?String(e.source.boardId||""):"",p=us(m),b=us(m)?m:ys(),c=new Date().toISOString(),y=Mp(e.nodes),w=y.map(ee=>ee.node),L=new Map(y.map(ee=>[ee.node.id,ee.originalId])),I=Ap(e.edges,L),D=y.map(({node:ee,originalId:ct})=>Tp(ee,ct,I.get(ct),c,r)),q=y.map(({node:ee,originalId:ct})=>Rp(ee,ct)),$=t.scale>0?t.scale:1,O=(window.innerWidth/2-t.x)/$,G=(window.innerHeight/2-t.y)/$,V=1400/$,re=Number((l==null?void 0:l.x)??((Tt=e.viewState)==null?void 0:Tt.cursorX)??0),oe=Number((l==null?void 0:l.y)??((me=e.viewState)==null?void 0:me.cursorY)??0),Ae=(He=e.nodes.find(ee=>ee.kind==="image"&&ee.imageUrl))==null?void 0:He.imageUrl,be={Id:b,UserId:"00000000-0000-0000-0000-000000000000",Title:e.name||"Untitled Board",Description:"Exported from MindExec React",ThumbnailUrl:go(Ae,r)||"",IsPublic:!1,CreatedAt:c,SyncedCloudBoardId:null,LastSyncedAt:null,LastCloudCopyStatus:null,UpdatedAt:c,LastCameraX:O,LastCameraY:G,LastCameraZ:V,LastCursorX:Number.isFinite(re)?re:0,LastCursorY:Number.isFinite(oe)?oe:0,CameraBookmarks:hp(e.settings.cameraBookmarks)},Ue=`.mindexec/boards/${b}.msgpack`,et=`.mindexec/boards/${b}.json`,tt=`.mindexec/boards/${b}.layout.json`,he=`.mindexec/boards/${b}.delta.json`,J=`boards/${b}.delta.json`,ie=await Bp(r),se=[be,...ie.filter(ee=>W(ee.Id)!==b)],St=Mm(D);await am(Ue,St,o,r),await Ys(et,JSON.stringify(D,null,2),o,r),await Ys(tt,JSON.stringify(q,null,2),o,r),await Ys(".mindexec/boards/_metadata.json",JSON.stringify(se,null,2),o,r);const F=await Promise.allSettled([ld(he,o,r),ld(J,o,r)]);return f.emit("localBridge.board.exported",{boardId:b,nodes:D.length,edges:e.edges.length,snapshotFormat:"msgpack",msgpackBytes:St.byteLength,jsonMirror:!0,deltaCleared:F.some(ee=>ee.status==="fulfilled"&&ee.value.success),reusedBoardId:p,stableNodeIds:y.length,assignedNodeIds:y.filter(ee=>ee.assignedNodeId).length,metadataStampedNodeIds:y.filter(ee=>ee.metadataStamped).length,duplicateOriginalNodeIds:y.filter(ee=>ee.duplicateOriginalId).length}),{metadata:be,source:{kind:"localBridge",boardId:b,loadedAt:c,originalNodeCount:D.length,renderedNodeCount:D.length,truncated:!1,exportedByReact:!0,snapshotFormat:"msgpack"},nodes:w,msgpackPath:Ue,boardPath:et,layoutPath:tt}}async function Fp(e,t,o=fs()){const r=await bp(e.Id,o);let l=new Map;const m=await Nr([`.mindexec/boards/${e.Id}.layout.json`,`boards/${e.Id}.layout.json`],o);m&&(l=Pl(m.payload));let p=null;const b=await Nr([`.mindexec/boards/${e.Id}.delta.json`,`boards/${e.Id}.delta.json`],o);b&&(p=b.payload);const c=p?Kr(p)[0]:null,y=!!(p&&Gr(p)),w=y?fp(r.payload,p):r.payload;return _l(w,t,{boardId:(c==null?void 0:c.Id)??e.Id,title:(c==null?void 0:c.Title)||e.Title||"LocalBridge Board",updatedAt:(c==null?void 0:c.UpdatedAt)??e.UpdatedAt,layoutPayload:Array.from(l.values()),baseUrl:o,cameraBookmarks:(c==null?void 0:c.CameraBookmarks)??e.CameraBookmarks,lastCursorX:(c==null?void 0:c.LastCursorX)??e.LastCursorX,lastCursorY:(c==null?void 0:c.LastCursorY)??e.LastCursorY,deltaApplied:y,deltaUpserts:p?El(p):0,deltaDeletes:p?Ll(p):0,snapshotFormat:r.format})}function _l(e,t,o={}){const r=ms(e),l=Gr(e),m=o.deltaUpserts??(l?r.length:0),p=o.deltaDeletes??(l?Ll(e):0),b=o.layoutPayload?Pl(o.layoutPayload):new Map,c=r.slice(0,up),y=c.map(oe=>Lp(oe,b.get(String(oe.Id||"")),o.baseUrl??fs())),w=new Set(y.map(oe=>oe.id)),L=_p(c,w),I=r.length>y.length,D=l,q=o.deltaApplied===!0,$=o.boardId||ys(),O=o.updatedAt||new Date().toISOString(),G=Number(o.lastCursorX),V=Number(o.lastCursorY),re=Number.isFinite(G)&&Number.isFinite(V);return f.emit("localBridge.board.loaded",{boardId:$,nodes:y.length,originalNodes:r.length,truncated:I,snapshotFormat:o.snapshotFormat,partialImport:D,deltaImport:l,deltaApplied:q,deltaUpserts:m,deltaDeletes:p}),{id:`localBridge:${$}`,name:o.title||"LocalBridge Board",nodes:y,edges:L,settings:{...t,cameraBookmarks:gp(o.cameraBookmarks)},viewState:re?{cursorX:G,cursorY:V}:void 0,updatedAt:O,source:{kind:"localBridge",boardId:$,loadedAt:new Date().toISOString(),snapshotFormat:o.snapshotFormat,originalNodeCount:r.length,renderedNodeCount:y.length,truncated:I,partialImport:D,deltaImport:l,deltaApplied:q}}}const qr=["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(","),$p=/^[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 zp(e){if($p.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 Dl(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 Up(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 Mr(e,t=new Date().toISOString()){return e&&!Number.isNaN(Date.parse(e))?e:t}function Jr(e){return(e==null?void 0:e.trim().slice(0,90))||"Untitled Board"}function Bl(e){const t=Dl(e.content_json),o=Mr(e.updated_at??t.updatedAt);return{id:e.id,name:Jr(e.title??t.name),updatedAt:o,createdAt:Mr(e.created_at,o),nodeCount:Array.isArray(t.nodes)?t.nodes.length:0,edgeCount:Array.isArray(t.edges)?t.edges.length:0,sourceKind:"cloud"}}function Hp(e,t){var w,L;const o=Dl(e.content_json),r=Mr(e.updated_at??o.updatedAt),l=Number((w=o.viewState)==null?void 0:w.cursorX),m=Number((L=o.viewState)==null?void 0:L.cursorY),p=Number(e.last_cursor_x),b=Number(e.last_cursor_y),c=Number.isFinite(l)&&Number.isFinite(m),y=Number.isFinite(p)&&Number.isFinite(b);return{id:e.id,name:Jr(e.title??o.name),nodes:Array.isArray(o.nodes)?o.nodes:[],edges:Array.isArray(o.edges)?o.edges:[],settings:o.settings??t,viewState:c?{cursorX:l,cursorY:m}: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(o.nodes)?o.nodes.length:0,renderedNodeCount:Array.isArray(o.nodes)?o.nodes.length:0}}}async function Zr(e){var c;const t=jl(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 o=bs(e);if(!o)return f.emit("projectStorage.cloud.provider.skipped",{mode:"config-missing"}),{userId:null,config:t,reason:"missing-client"};const{data:r,error:l}=await o.auth.getSession();if(l||!r.session)return f.emit("projectStorage.cloud.provider.sessionMissing",{message:(l==null?void 0:l.message)??"missing-session"}),{userId:null,config:t,reason:"missing-session"};const{data:m,error:p}=await o.auth.getUser(),b=((c=m.user)==null?void 0:c.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 Wp(e){const t=await Zr(e);if(!t.userId)return[];const o=bs(e);if(!o)return[];f.emit("projectStorage.cloud.list.requested");const{data:r,error:l}=await o.from("boards").select(qr).eq("user_id",t.userId).order("updated_at",{ascending:!1}).limit(50);if(l)throw f.emit("projectStorage.cloud.provider.failed",{operation:"list",message:l.message}),l;const m=(r??[]).map(Bl);return f.emit("projectStorage.cloud.list.loaded",{count:m.length}),m}async function Vp(e,t,o){const r=await Zr(e);if(!r.userId)return null;const l=bs(e);if(!l)return null;f.emit("projectStorage.cloud.load.requested",{boardId:t});const{data:m,error:p}=await l.from("boards").select(qr).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(!m)return null;const b=Hp(m,o);return f.emit("projectStorage.cloud.load.loaded",{boardId:t,nodes:b.nodes.length,edges:b.edges.length}),b}async function Yp(e,t,o,r=null){var re,oe;const l=await Zr(e);if(!l.userId)return null;const m=bs(e);if(!m)return null;const p=zp(t.id),b=new Date().toISOString(),c=Jr(t.name),y=Number((r==null?void 0:r.x)??((re=t.viewState)==null?void 0:re.cursorX)??0),w=Number((r==null?void 0:r.y)??((oe=t.viewState)==null?void 0:oe.cursorY)??0),L={...t.viewState??{},cursorX:Number.isFinite(y)?y:0,cursorY:Number.isFinite(w)?w:0},I={...t,id:p,name:c,viewState:L,updatedAt:b},D={p_board_id:p,p_title:c,p_description:null,p_thumbnail_url:null,p_is_public:!1,p_created_at:null,p_updated_at:b,p_last_camera_x:o.x,p_last_camera_y:o.y,p_last_camera_z:o.scale,p_last_cursor_x:L.cursorX,p_last_cursor_y:L.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:q}=await m.rpc("save_board_snapshot",D);if(q)throw f.emit("projectStorage.cloud.provider.failed",{operation:"save-rpc",boardId:p,message:q.message}),q;const $={content_json:Up(I),updated_at:b},{data:O,error:G}=await m.from("boards").update($).eq("id",p).eq("user_id",l.userId).select(qr).maybeSingle();if(G)throw f.emit("projectStorage.cloud.provider.failed",{operation:"save-json-mirror",boardId:p,message:G.message}),G;const V=O?Bl(O):{id:p,name:c,updatedAt:b,createdAt:b,nodeCount:t.nodes.length,edgeCount:t.edges.length,sourceKind:"cloud"};return f.emit("projectStorage.cloud.save.saved",{boardId:V.id,nodes:V.nodeCount,edges:V.edgeCount}),V}function Tr(e){return e.length===0?{minX:0,minY:0,maxX:0,maxY:0}:e.reduce((t,o)=>({minX:Math.min(t.minX,o.x),minY:Math.min(t.minY,o.y),maxX:Math.max(t.maxX,o.x+o.width),maxY:Math.max(t.maxY,o.y+o.height)}),{minX:Number.POSITIVE_INFINITY,minY:Number.POSITIVE_INFINITY,maxX:Number.NEGATIVE_INFINITY,maxY:Number.NEGATIVE_INFINITY})}function Xp(e,t={},o=Tr(e),r){if(e.length===0)return{after:new Map,boundsAfter:o};const l=cg(t.mode),m=ug(t.order),p=mg(t.anchor),b=pg(t.sizeMode),c=Math.max(0,t.gapX??24),y=Math.max(0,t.gapY??24),w=Math.max(1,t.maxColumns??12),L=Rr(t.quantile??.75,.05,.95),I=e.map(Gp),D=sg(I,m),q=D.map(be=>be.width),$=D.map(be=>be.height),O=Math.max(1,t.cellWidth??_d(q,L)),G=Math.max(1,t.cellHeight??_d($,L)),V=Math.max(1,t.targetWidth??O),re=Math.max(1,t.targetHeight??G),oe=og(p,o);if(l==="grid"){eg(D,b,V,re,O,G);const be=Pd(t.columns,w,o.maxX-o.minX,O,c);qp(D,oe.x,oe.y,be,O,G,c,y)}else if(l==="masonry"){tg(D,b==="preserve"?"uniformWidth":b,V);const Ue=Pd(t.columns,w,o.maxX-o.minX,V,c);Jp(D,oe.x,oe.y,Ue,V,c,y)}else l==="stripHorizontal"?(ag(D,b==="preserve"?"uniformHeight":b,re),Zp(D,oe.x,oe.y,c,re)):(ng(D,b==="preserve"?"uniformWidth":b,V),Qp(D,oe.x,oe.y,y,V));let Ae=new Map(D.map(be=>[be.id,Kp(be)]));return p==="selectionBoundsCenter"&&(Ae=ig(o,Ae)),t.snapToGrid&&(Ae=dg(Ae,Math.max(1,t.gridSize??8))),{after:Ae,boundsAfter:Tr(Array.from(Ae.values()))}}function Gp(e){return{...e,width:Math.max(1,e.width),height:Math.max(1,e.height)}}function Kp(e){return{x:e.x,y:e.y,width:Math.max(1,e.width),height:Math.max(1,e.height)}}function qp(e,t,o,r,l,m,p,b){e.forEach((c,y)=>{const w=Math.floor(y/r),L=y%r,I=t+L*(l+p),D=o+w*(m+b);c.x=I+(l-c.width)/2,c.y=D+(m-c.height)/2})}function Jp(e,t,o,r,l,m,p){const b=Array.from({length:r},()=>0);for(const c of e){const y=lg(b),w=t+y*(l+m);c.x=w+(l-c.width)/2,c.y=o+b[y],b[y]+=c.height+p}}function Zp(e,t,o,r,l){let m=t;for(const p of e)p.x=m,p.y=o+(l-p.height)/2,m+=p.width+r}function Qp(e,t,o,r,l){let m=o;for(const p of e)p.x=t+(l-p.width)/2,p.y=m,m+=p.height+r}function eg(e,t,o,r,l,m){if(t==="fitCellDownOnly")for(const p of e){const b=Math.min(1,l/p.width,m/p.height);p.width*=b,p.height*=b}else t==="uniformWidth"?Qr(e,o):t==="uniformHeight"&&Ol(e,r)}function tg(e,t,o){if(t==="fitCellDownOnly"){for(const r of e){const l=Math.min(1,o/r.width);r.width*=l,r.height*=l}return}Qr(e,o)}function ag(e,t,o){if(t==="fitCellDownOnly"){for(const r of e){const l=Math.min(1,o/r.height);r.width*=l,r.height*=l}return}Ol(e,o)}function ng(e,t,o){if(t==="fitCellDownOnly"){for(const r of e){const l=Math.min(1,o/r.width);r.width*=l,r.height*=l}return}Qr(e,o)}function Qr(e,t){for(const o of e){if(o.width<=0)continue;const r=t/o.width;o.width=t,o.height=Math.max(1,o.height*r)}}function Ol(e,t){for(const o of e){if(o.height<=0)continue;const r=t/o.height;o.height=t,o.width=Math.max(1,o.width*r)}}function Pd(e,t,o,r,l){if(typeof e=="number"&&e>0)return Math.round(Rr(e,1,t));if(o<=1||r<=1)return 1;const m=Math.floor((o+l)/(r+l));return!Number.isFinite(m)||m<1?1:Math.round(Rr(m,1,t))}function og(e,t,o){return{x:t.minX,y:t.minY}}function sg(e,t){return t==="selectionOrder"?[...e].sort((o,r)=>o.selectionIndex-r.selectionIndex):rg(e)}function rg(e){const t=[...e].sort((c,y)=>c.y-y.y||c.x-y.x);if(t.length<=2)return t;const o=t.map(c=>c.height).sort((c,y)=>c-y),r=o[Math.floor(o.length/2)]??1,l=Math.max(16,r*.35),m=[];let p=[],b=Number.NaN;for(const c of t)p.length===0?(p=[c],b=c.y):Math.abs(c.y-b)<=l?(p.push(c),b=(b*(p.length-1)+c.y)/p.length):(m.push([...p].sort((y,w)=>y.x-w.x)),p=[c],b=c.y);return p.length>0&&m.push([...p].sort((c,y)=>c.x-y.x)),m.flat()}function ig(e,t){if(t.size===0)return t;const o=Tr(Array.from(t.values())),r=e.minX+(e.maxX-e.minX)/2,l=e.minY+(e.maxY-e.minY)/2,m=o.minX+(o.maxX-o.minX)/2,p=o.minY+(o.maxY-o.minY)/2,b=r-m,c=l-p;return new Map(Array.from(t.entries()).map(([y,w])=>[y,{...w,x:w.x+b,y:w.y+c}]))}function dg(e,t){return new Map(Array.from(e.entries()).map(([o,r])=>[o,{...r,x:Dd(r.x,t),y:Dd(r.y,t)}]))}function _d(e,t){if(e.length===0)return 1;const o=[...e].sort((b,c)=>b-c),r=(o.length-1)*t,l=Math.floor(r),m=Math.min(o.length-1,l+1),p=r-l;return o[l]*(1-p)+o[m]*p}function lg(e){let t=0;for(let o=1;o<e.length;o+=1)e[o]<e[t]&&(t=o);return t}function Dd(e,t){return Math.round(e/t)*t}function cg(e){const t=xs(e);return t==="grid"?"grid":t==="striphorizontal"||t==="striph"?"stripHorizontal":t==="stripvertical"||t==="stripv"?"stripVertical":"masonry"}function ug(e){return xs(e)==="selectionorder"?"selectionOrder":"spatialReading"}function mg(e){const t=xs(e);return t==="selectionboundscenter"?"selectionBoundsCenter":t==="viewporttopleft"?"viewportTopLeft":"selectionBoundsTopLeft"}function pg(e){const t=xs(e);return t==="fitcelldownonly"?"fitCellDownOnly":t==="uniformwidth"?"uniformWidth":t==="uniformheight"?"uniformHeight":"preserve"}function xs(e){return String(e??"").trim().toLowerCase().replace(/[^a-z0-9]/g,"")}function Rr(e,t,o){return Math.min(o,Math.max(t,e))}const Fl=300,$l=50*1024*1024,gg=800;function ke(e){return typeof e=="string"?e.length*2:0}function hg(e){let t=256;if(t+=ke(e.id),t+=ke(e.kind),t+=ke(e.title),t+=ke(e.body),t+=ke(e.result),t+=ke(e.imageUrl),t+=ke(e.assetUrl),t+=ke(e.sourceFilePath),t+=(e.tags??[]).reduce((o,r)=>o+ke(r),0),e.metadata)for(const[o,r]of Object.entries(e.metadata))t+=ke(o)+ke(r);return e.imageStack&&(t+=128+ke(e.imageStack.title),t+=e.imageStack.variants.reduce((o,r)=>o+96+ke(r.variantId)+ke(r.imageUrl)+ke(r.assetId)+ke(r.title)+ke(r.caption),0)),t}function fg(e){let t=1024+ke(e.id)+ke(e.name)+ke(e.updatedAt);return t+=e.nodes.reduce((o,r)=>o+hg(r),0),t+=e.edges.length*128,t+=Object.entries(e.settings).reduce((o,[r,l])=>o+ke(r)+ke(typeof l=="string"?l:JSON.stringify(l)),0),t}function zl(e,t={}){var o,r;return{board:e,description:((o=t.description)==null?void 0:o.trim())||"Board change",mergeKey:((r=t.mergeKey)==null?void 0:r.trim())||null,timestampMs:t.timestampMs??Date.now(),estimatedBytes:fg(e)}}function Bd(e,t={}){const o=t.maxEntries??Fl,r=t.maxBytes??$l;let l=e.slice(Math.max(0,e.length-o)),m=l.reduce((p,b)=>p+b.estimatedBytes,0);for(;l.length>1&&m>r;){const[p,...b]=l;m-=(p==null?void 0:p.estimatedBytes)??0,l=b}return l}function Aa(e,t,o={}){const r=zl(t,o),l=o.mergeWindowMs??gg,m=e.slice(),p=m.at(-1);return p&&r.mergeKey&&p.mergeKey===r.mergeKey&&r.timestampMs-p.timestampMs<l?(m[m.length-1]={...p,description:r.description,timestampMs:r.timestampMs,estimatedBytes:Math.max(p.estimatedBytes,r.estimatedBytes)},Bd(m,o)):(m.push(r),Bd(m,o))}function bg(e,t,o={}){const r=zl(t,o),l=o.maxEntries??Fl,m=o.maxBytes??$l;let p=[r,...e].slice(0,l),b=p.reduce((c,y)=>c+y.estimatedBytes,0);for(;p.length>1&&b>m;){const c=p.at(-1);b-=(c==null?void 0:c.estimatedBytes)??0,p=p.slice(0,-1)}return p}function Cs(e,...t){const o=e==null?void 0:e.metadata;if(!o)return"";for(const r of t){const l=o[r];if(typeof l=="string"&&l.trim())return l.trim()}return""}function eo(e,t){return!!Cs(e,t)}function Ul(e){if(!e||!e.trim())return!1;const t=e.trim();return/^(https?:|blob:|data:|file:)/i.test(t)}function Hl(e){if(!e)return"";const t=Cs(e,"OriginalPath");if(t)return t;const o=String(e.body||"").trim();return Ul(o)?"":o}function Wl(e){return e?Hl(e)||String(e.sourceFilePath||"").trim()||String(e.assetUrl||"").trim()||String(e.imageUrl||"").trim()||String(e.body||"").trim():""}function Vl(e){return Cs(e,"ThumbnailUrl","thumbnailUrl")}function yg(e){if(!e||e.kind!=="image")return!1;if(eo(e,"ImageGenerationProvider")||eo(e,"GeneratedImageSourceWidth")||eo(e,"GeneratedImageSourceHeight")||eo(e,"CodexImageQuality")||eo(e,"ImageRouterRevisedPrompt"))return!0;const t=Cs(e,"RequestedMediaOperation");return["text2image","image2image","inpaint"].includes(t.toLowerCase())}function ei(e){if(!e)return"";if(e.kind==="image"||e.kind==="mask"){const t=yg(e)?Hl(e):"",o=Vl(e),r=String(e.body||"").trim();return t||o||String(e.imageUrl||"").trim()||String(e.assetUrl||"").trim()||String(e.sourceFilePath||"").trim()||(Ul(r)?r:"")}return Wl(e)||String(e.assetUrl||"").trim()||String(e.sourceFilePath||"").trim()}function Yl(e){if(!e)return"";const t=Wl(e)||e.title||e.kind;return String(t||"").replace(/\\/g,"/").replace(/\/+$/,"").split("/").filter(Boolean).pop()||e.title||e.kind}const xg=2048,Cg=16e3,er=1024,tr=64,Sg=2048,ar=3,kg=16,wg=256,vg=new Set(["text","note","memo","markdown","code","directory"]),jg=/[\p{L}\p{M}\p{N}]{2,}/gu,Od=4,Ig=8,Fd=1.35;function Ng(e){return vg.has(String(e||"").trim().toLowerCase())}function Ag(e){const t=e.map(Tg),o=new Map,r=new Map,l=new Map,m=new Map;for(const p of t){o.set(p.id,p);for(const b of p.tokens)nr(r,b,p.id);for(const b of p.prefixes)nr(l,b,p.id);for(const b of p.ngrams)nr(m,b,p.id)}return{documents:t,documentById:o,tokenIndex:r,prefixIndex:l,ngramIndex:m}}function Mg(e,t,o={}){const r=Math.max(1,Math.trunc(Number(o.limit||30))),l=sn(t),m=$d(e,0,0,o.viewport,0);if(!l)return{hits:[],profile:m};const p=Array.from(Xl(l)),b=Array.from(Gl(p)),c=ql(l),y=Array.from(Kl(c)),w=new Map;for(const $ of p)or(e.tokenIndex,$,w,8);for(const $ of b)or(e.prefixIndex,$,w,$.length<=3?4:2);for(const $ of y)or(e.ngramIndex,$,w,1.15);const L=Pg(e,w,r),I=_g(o.allowedContentTypes),D=[];for(const $ of L){const O=e.documentById.get($);if(!O||I&&!I.has(O.contentType))continue;const G=Lg(O,l,p,y);if(G<=0)continue;const V=Eg(O,o.viewport??null);D.push({nodeId:O.id,score:G+V,textScore:G,viewportBoost:V})}D.sort(($,O)=>O.score-$.score||$.nodeId.localeCompare(O.nodeId));const q=D.slice(0,r);return{hits:q,profile:$d(e,L.length,q.length,o.viewport,q.filter($=>$.viewportBoost>0).length)}}function sn(e){const t=String(e??"");if(!t.trim())return"";let o=t;try{o=t.normalize("NFKC")}catch{o=t}o=o.toLowerCase();let r="",l=!1;for(const m of o){if(/\s/u.test(m)){l||(r+=" ",l=!0);continue}Dg(m)||(r+=m,l=!1)}return r.trim()}function Xl(e){return new Set(e.match(jg)??[])}function Gl(e){const t=new Set;for(const o of e){if(!o.trim())continue;const r=Math.min(8,o.length);for(let l=2;l<=r;l+=1)t.add(o.slice(0,l))}return t}function Kl(e){const t=new Set;if(!e.trim())return t;if(e.length<=ar)return t.add(e),t;for(let o=0;o<=e.length-ar;o+=1)t.add(e.slice(o,o+ar));return t}function Tg(e){const t=String(e.kind??"").trim().toLowerCase(),o=Ta(e.prompt??e.title,xg),r=Ng(t)?Ta(e.response??e.body,Cg):"",l=Rg(e.metadata,e.tags,e.metadataText),m=Ta(e.sourceFilePath||e.assetUrl,Sg),p=sn(o),b=sn(r),c=sn(l),y=sn(m),w=sn(t),L=[p,c,y,b,w].filter(Boolean).join(" "),I=Xl(L);return{id:String(e.id),contentType:t,normalizedPrompt:p,normalizedResponse:b,normalizedMetadata:c,normalizedSourcePath:y,normalizedContentType:w,tokens:I,prefixes:Gl(I),ngrams:Kl(ql(L)),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 Rg(e,t,o){const r=[];let l=0;if(e)for(const[m,p]of Object.entries(e)){if(l>=tr)break;!String(m??"").trim()&&!String(p??"").trim()||(r.push(Ta(m,128)),String(p??"").trim()&&r.push(Ta(p,er)),l+=1)}return l<tr&&(t!=null&&t.length)&&(r.push("tags",Ta(t.join(" "),er)),l+=1),l<tr&&(o!=null&&o.trim())&&r.push("metadata",Ta(o,er)),r.join(" ")}function Lg(e,t,o,r){let l=0;e.normalizedPrompt===t?l+=120:to(e.normalizedPrompt,t)&&(l+=54),to(e.normalizedMetadata,t)&&(l+=26),to(e.normalizedSourcePath,t)&&(l+=18),to(e.normalizedResponse,t)&&(l+=14),to(e.normalizedContentType,t)&&(l+=8);for(const m of o)e.tokens.has(m)&&(l+=7),e.normalizedPrompt.startsWith(m)&&(l+=10);for(const m of r)e.ngrams.has(m)&&(l+=.85);return l}function Eg(e,t){if(!t)return 0;const o=e.x+Math.max(1,e.width)/2,r=e.y+Math.max(1,e.height)/2,l=Math.abs(o-t.centerX)/Math.max(1,t.halfWidth),m=Math.abs(r-t.centerY)/Math.max(1,t.halfHeight),p=Math.sqrt(l*l+m*m);if(p<=1)return Od+(1-p)*Ig;if(p<=Fd){const b=1-(p-1)/Math.max(.001,Fd-1);return Math.max(0,b)*(Od*.75)}return 0}function Pg(e,t,o){return t.size===0?e.documents.map(r=>r.id):Array.from(t.entries()).sort((r,l)=>l[1]-r[1]||r[0].localeCompare(l[0])).slice(0,Math.max(o*kg,wg)).map(([r])=>r)}function _g(e){if(!e)return null;const t=new Set(Array.from(e,o=>String(o||"").trim().toLowerCase()).filter(Boolean));return t.size>0?t:null}function $d(e,t,o,r,l){return{documentCount:e.documents.length,candidateCount:t,rankedCount:o,viewportBoosted:!!r,boostedCount:l,indexedTokenCount:e.tokenIndex.size,indexedPrefixCount:e.prefixIndex.size,indexedNGramCount:e.ngramIndex.size}}function nr(e,t,o){const r=e.get(t);if(r){r.add(o);return}e.set(t,new Set([o]))}function or(e,t,o,r){const l=e.get(t);if(l)for(const m of l)o.set(m,(o.get(m)??0)+r)}function ql(e){let t="";for(const o of e)/\s/u.test(o)||(t+=o);return t}function Ta(e,t){const o=String(e??"");return o.length<=t?o:o.slice(0,t)}function to(e,t){return!!(e&&t&&e.includes(t))}function Dg(e){const t=e.codePointAt(0)??0;return t<=31||t>=127&&t<=159}const Bg=2147483647,Og="LocalBridge access is enabled, but the bridge is not reachable. Restart LocalBridge, allow Chrome local-network access, then reload MindCanvas.",Fg="Local storage is unavailable in the hosted app until browser local storage or LocalBridge access is available.",$g="Local storage is unavailable. Check the browser-local storage state or LocalBridge connection.",zg="Cloud projects are unavailable until Supabase and Cloudflare R2 are configured.",Ug="Login is required before cloud projects can be used.",Hg="Cloud projects are unavailable.";function Wg(e){return e.bridgeProviderConfigured||e.browserProviderConfigured||e.embeddedProviderConfigured}function Lr(e,t=!0){const o={isAvailable:!1,bridgeReachable:!1,browserLocalAvailable:!1,embeddedLocalAvailable:!1,providerKind:"none",canBrowseWorkspace:!1};return e.bridgeProviderConfigured&&e.bridgeReachable?{...o,isAvailable:!0,bridgeReachable:!0,providerKind:"bridge",canBrowseWorkspace:!0}:e.hostedWebApp&&e.hostedLocalBridgeAccessEnabled&&e.bridgeProviderConfigured?{...o,providerKind:"bridge"}:e.browserProviderConfigured&&(e.browserLocalAvailable||t&&e.browserLocalAvailableWhenEmpty===!0)?{...o,isAvailable:!0,browserLocalAvailable:!0,providerKind:"browser"}:e.embeddedProviderConfigured&&e.supportsEmbeddedLocal?{...o,isAvailable:!0,embeddedLocalAvailable:!0,providerKind:"embedded"}:o}function Vg(e){return Lr(e,!1).isAvailable?"local":ti(e)?"cloud":Lr(e,!0).isAvailable?"local":e.cloudConfigured?"cloud":"local"}function ti(e){return e.cloudConfigured&&e.cloudSessionAvailable}function Yg(e,t){return t.providerKind==="bridge"&&!t.bridgeReachable?Og:e.hostedWebApp?Fg:$g}function Xg(e){return e.cloudConfigured?ti(e)?Hg:Ug:zg}function Gg(e){var w,L,I;const t=ti(e),o=Lr(e,!0),r=Wg(e),l=e.cloudConfigured,m=o.isAvailable,p=t;let b=e.storedMode??Vg(e);b==="cloud"&&(!l||!p&&m)?b=m?"local":"cloud":b==="local"&&(!r&&l||!m&&p)&&(b="cloud");const c=e.cloudAccess,y=((w=c==null?void 0:c.denialReason)==null?void 0:w.trim())||void 0;return{currentMode:b,showLocalTab:r,showCloudTab:l,isLocalAvailable:o.isAvailable,isCloudAvailable:t,requiresCloudSignIn:e.cloudConfigured&&!t,canUseLocalProjects:m,canBrowseLocalWorkspace:o.canBrowseWorkspace,localProviderKind:o.providerKind,canUseCloudProjects:p,canSyncLocalToCloud:m&&p,cloudPlanKey:((L=c==null?void 0:c.planKey)==null?void 0:L.trim())||"free",cloudEntitlementStatus:((I=c==null?void 0:c.entitlementStatus)==null?void 0:I.trim())||(c?"active":"inactive"),currentCloudBoardCount:(c==null?void 0:c.currentBoardCount)??0,cloudBoardLimit:(c==null?void 0:c.cloudBoardLimit)??Bg,lockedCloudBoardCount:(c==null?void 0:c.lockedBoardCount)??0,canCreateCloudBoards:(c==null?void 0:c.canCreateBoard)??p,canUseManagedAi:(c==null?void 0:c.canUseManagedAi)??!1,canGenerateImage:(c==null?void 0:c.canGenerateImage)??!1,canUseContextPack:(c==null?void 0:c.canUseContextPack)??!1,cloudLimitMessage:y,localStatusMessage:o.isAvailable?void 0:Yg(e,o),cloudStatusMessage:p?void 0:Xg(e)}}function Kg(){const e=new Error("Queued operation was cancelled before it started.");return e.name="AbortError",e}class qg{constructor(){id(this,"tails",new Map)}isBusy(t){return this.tails.has(t)}enqueue(t,o,r){if(typeof o!="function")throw new TypeError("KeyedAsyncQueue operation is required.");const l=this.tails.get(t)??Promise.resolve();let m;return m=(async()=>{try{try{await l}catch{}if(r!=null&&r.aborted)throw Kg();return await o(r)}finally{this.tails.get(t)===m&&this.tails.delete(t)}})(),this.tails.set(t,m),m}clear(t){if(typeof t>"u"){this.tails.clear();return}this.tails.delete(t)}}const Er="mindexec-local-mode-warning-dismissed-v1";function Jg(){try{return window.localStorage.getItem(Er)==="true"}catch{return!1}}function Jl(e,t){var o,r;if(e==="checking")return"Checking bridge";if(e==="connected"){const l=(r=(o=t==null?void 0:t.exec)==null?void 0:o.model)==null?void 0:r.trim();return l?`Bridge / ${l}`:"Bridge connected"}return e==="blocked"?"Bridge gated":e==="unavailable"?"Bridge unavailable":"Bridge idle"}function Zg(e,t,o){var l,m,p,b,c;if(e!=="connected")return t||Jl(e,o);const r=[o!=null&&o.version?`version ${o.version}`:null,(l=o==null?void 0:o.exec)!=null&&l.model?`model ${o.exec.model}`:null,(m=o==null?void 0:o.exec)!=null&&m.reasoningEffort?`reasoning ${o.exec.reasoningEffort}`:null,(p=o==null?void 0:o.exec)!=null&&p.serviceTier?`tier ${o.exec.serviceTier}`:null,(b=o==null?void 0:o.exec)!=null&&b.preferredProviderKind?`codex ${o.exec.preferredProviderKind}`:null,(c=o==null?void 0:o.project)!=null&&c.isOpen?"project open":null].filter(Boolean);return r.length>0?`LocalBridge connected. ${r.join(" / ")}`:"LocalBridge connected."}function Qg({state:e,message:t,status:o,hostedBridgeAccessEnabled:r,onRefresh:l,onEnableHostedBridge:m}){const p=g.useMemo(()=>e==="checking"?n.jsx(Ut,{size:14,className:"spin-icon"}):e==="connected"?n.jsx(_m,{size:14}):e==="blocked"?n.jsx(Il,{size:14}):e==="unavailable"?n.jsx(Dm,{size:14}):n.jsx(Vr,{size:14}),[e]);return n.jsxs("div",{className:`runtime-status-pill runtime-status-pill--${e}`,title:Zg(e,t,o),"data-testid":"bridge-status-pill","data-bridge-state":e,"data-bridge-access":r?"enabled":"gated",children:[n.jsx("span",{className:"runtime-status-pill__icon","aria-hidden":"true",children:p}),n.jsx("span",{children:Jl(e,o)}),e==="blocked"&&!r&&n.jsx("button",{type:"button",className:"runtime-status-pill__action",onClick:m,children:"Enable"}),n.jsx("button",{type:"button",className:"runtime-status-pill__button",title:"Refresh LocalBridge","data-testid":"bridge-status-refresh",onClick:()=>void l(),disabled:e==="checking",children:n.jsx(ln,{size:13})})]})}function eh({status:e,message:t}){const r={ready:{icon:n.jsx(kr,{size:14}),label:"Saved locally",title:"Board state is saved in this browser."},syncing:{icon:n.jsx(Ut,{size:14,className:"spin-icon"}),label:"Saving",title:"Saving board state to this browser."},error:{icon:n.jsx(Yr,{size:14}),label:"Save error",title:"Board state could not be saved locally."},offline:{icon:n.jsx(Vr,{size:14}),label:"Offline",title:"No sync adapter is connected."}}[e];return n.jsxs("div",{className:`runtime-status-pill runtime-status-pill--sync-${e}`,title:t||r.title,"data-testid":"sync-status-indicator","data-sync-status":e,children:[n.jsx("span",{className:"runtime-status-pill__icon","aria-hidden":"true",children:r.icon}),n.jsx("span",{children:r.label})]})}function th({visible:e}){const[t,o]=g.useState(Jg);if(!e||t)return null;const r=()=>{o(!0);try{window.localStorage.setItem(Er,"true")}catch{}f.emit("runtimeStatus.localMode.dismissed")};return n.jsxs("section",{className:"runtime-local-warning",role:"status","data-testid":"local-mode-warning","data-local-mode-dismissed-key":Er,children:[n.jsx("div",{className:"runtime-local-warning__icon","aria-hidden":"true",children:n.jsx(Yr,{size:16})}),n.jsxs("div",{className:"runtime-local-warning__copy",children:[n.jsx("strong",{children:"Local Mode"}),n.jsx("span",{children:"Boards are saved in this browser. LocalBridge export creates a file-backed copy."})]}),n.jsx("button",{type:"button",title:"Dismiss local mode warning","data-testid":"local-mode-dismiss",onClick:r,children:n.jsx(yt,{size:14})})]})}function ah({bridgeState:e,bridgeMessage:t,bridgeStatus:o,syncStatus:r,syncMessage:l,hostedBridgeAccessEnabled:m,onRefreshBridge:p,onEnableHostedBridge:b,showLocalModeWarning:c=!0}){return n.jsxs("aside",{className:"runtime-status-cluster","aria-label":"Runtime status","data-testid":"runtime-status-cluster","data-local-mode-visible":c?"true":"false",children:[n.jsxs("div",{className:"runtime-status-row",children:[n.jsx(Qg,{state:e,message:t,status:o,hostedBridgeAccessEnabled:m,onRefresh:p,onEnableHostedBridge:b}),n.jsx(eh,{status:r,message:l})]}),n.jsx(th,{visible:c})]})}const nh=/^data:image\//i;function oh(e){const t=String(e||"").trim();if(!t)return{src:null,reason:"empty",urlKind:"empty"};const o=t.toLowerCase();return nh.test(t)?{src:t,reason:null,urlKind:"data"}:o.startsWith("blob:")?{src:t,reason:null,urlKind:"blob"}:o.startsWith("https://")?{src:t,reason:null,urlKind:"https"}:o.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 sr({src:e,alt:t="",className:o="",testId:r="secure-image",traceId:l,kind:m="image",title:p}){const b=g.useMemo(()=>oh(e),[e]),[c,y]=g.useState(b.src?"loading":"blocked");g.useEffect(()=>{const D=b.src?"loading":"blocked";y(D),b.src||f.emit("secureImage.blocked",{id:l,kind:m,reason:b.reason,urlKind:b.urlKind})},[m,b.reason,b.src,b.urlKind,l]);const w=()=>{y("loaded"),f.emit("secureImage.loaded",{id:l,kind:m,urlKind:b.urlKind})},L=()=>{y("error"),f.emit("secureImage.error",{id:l,kind:m,urlKind:b.urlKind})},I=c==="blocked"?`Image blocked: ${b.reason||"unsupported source"}`:"Image failed to load";return n.jsxs("div",{className:`secure-image secure-image--${c} ${o}`.trim(),"data-testid":r,"data-secure-image-state":c,"data-secure-image-kind":m,title:c==="loaded"?p:I,children:[b.src&&n.jsx("img",{src:b.src,alt:t,loading:"lazy",decoding:"async",draggable:!1,onLoad:w,onError:L}),c==="loading"&&n.jsx("span",{className:"secure-image__loading","aria-hidden":"true",children:n.jsx("span",{})}),(c==="blocked"||c==="error")&&n.jsx("span",{className:"secure-image__fallback",role:"img","aria-label":I,children:c==="blocked"?n.jsx(Bm,{size:18}):n.jsx(Yr,{size:18})})]})}const sh={note:ls,text:xt,"ai-task":cn,image:mn,mask:mn,video:pn,embed:gn,code:un,markdown:xt,"csv-table":xt,memo:ls,pdf:xt,file:wr,directory:Om,"template-launcher":xt,"remote-monitor":ds,"remote-control":ds},rr=[{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."}],zd=500,rh=48,ih=new Set(["mindcanvasagent","agentcommand"]),dh=new Set(["codenote","code-note"]),lh=["multidesktopmonitor","remotehubmonitor","remotefleetmonitor","smartviewmonitor"],ch=["remotedevice","remotefleetdevice","remotecontrol"];function uh(e){const t=hn(e,"SemanticType","semanticType","RemoteFleetSemanticType").trim().toLowerCase(),o=hn(e,"RemoteFleetNodeRole","remoteFleetNodeRole").trim().toLowerCase(),r=hn(e,"RemoteFleetSchemaVersion","remoteFleetSchemaVersion").trim().toLowerCase();return e.kind==="remote-monitor"||t==="remotefleetmonitor"||o==="fleet-monitor"||r==="remote-fleet@1"||Ql(e,["RemoteFleetViewMode","RemoteFleetHubStatus","RemoteFleetDevicesJson","RemoteFleetDeviceCount","RemoteFleetConnectedDeviceCount","RemoteFleetProjectionMode","RemoteFleetCanvasPagination","RemoteHub","RemoteRoute","RemotePage","RemoteVisibleBudget"])||Zl(e,lh,["remote","monitor"])}function mh(e){const t=hn(e,"SemanticType","semanticType","RemoteFleetSemanticType").trim().toLowerCase(),o=hn(e,"RemoteFleetNodeRole","remoteFleetNodeRole").trim().toLowerCase(),r=hn(e,"RemoteFleetSchemaVersion","remoteFleetSchemaVersion").trim().toLowerCase();return e.kind==="remote-control"||t==="remotefleetdevice"||o==="fleet-device"||r==="remote-fleet-device@1"||Ql(e,["RemoteFleetDeviceId","RemoteFleetDeviceName","RemoteFleetDevicePlatform","RemoteFleetDeviceConnected","RemoteFleetDeviceCanControl","RemoteFleetSourceMonitorNodeId"])||Zl(e,ch,["remote","control"])}function Zl(e,t,o){const r=(e.tags??[]).map(b=>b.trim().toLowerCase()).filter(Boolean),l=o.every(b=>r.includes(b)),p=[e.title,e.body,e.sourceFilePath,e.assetUrl,...r].join(" ").toLowerCase().replace(/[^a-z0-9]+/g,"");return l||t.some(b=>p.includes(b))}function hn(e,...t){const o=e.metadata??{};for(const l of t){const m=o[l];if(m!=null)return String(m)}const r=new Set(t.map(l=>l.toLowerCase()));for(const[l,m]of Object.entries(o))if(r.has(l.toLowerCase())&&m!==void 0&&m!==null)return String(m);return""}function Ql(e,t){const o=e.metadata??{},r=new Set(t.map(l=>l.toLowerCase()));return Object.entries(o).some(([l,m])=>r.has(l.toLowerCase())&&m!==void 0&&m!==null&&String(m).trim()!=="")}const Pr=[{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"}],ph=g.memo(function({node:t,selected:o,pulsing:r,connectionDraft:l,onSelect:m,onDragStart:p,onResizeStart:b,onPatch:c,onDelete:y,onDuplicate:w,onRun:L,onPin:I,onOpenResult:D,onToggleAiReference:q,onCopyNode:$,onCopyEmbedReference:O,onFitNodeHeight:G,onToggleNodeExpanded:V,onToggleWordWrap:re,onStageCompany:oe,onOpenCompanyGraph:Ae,onSyncCompanyGoal:be,onRefreshCompany:Ue,onSetCompanyStatus:et,onRemoveCompany:tt,onOpenAsset:he,onOpenDirectorySettings:J,onScanDirectory:ie,onCreateRemoteControl:se,onGenerateTemplateCard:St}){var Mn,wo,rt,Bt,ya,Ha,Qt,Wa,te,Ye,Va,Tn,v,Y,ae,Xe,Rn,Ot,Ya,Xa,Ln,En,Ga,Pn,xa,_n,Ka,Ca,ea,De,Pe,qa,Dn,vo,Sa;const F=String(((Mn=t.metadata)==null?void 0:Mn.AutomationNodeKind)||((wo=t.metadata)==null?void 0:wo.AutomationTemplateKey)||((rt=t.metadata)==null?void 0:rt.AutomationInferredKind)||"").trim().toLowerCase(),lt=String(((Bt=t.metadata)==null?void 0:Bt.SemanticType)||((ya=t.metadata)==null?void 0:ya.semanticType)||"").trim().toLowerCase(),Me=t.kind==="memo"&&ih.has(lt),le=t.kind==="memo"&&dh.has(lt),Tt=String(((Ha=t.metadata)==null?void 0:Ha.AgentCommandStatus)||"Draft"),me=String(((Qt=t.metadata)==null?void 0:Qt.AgentCommandMode)||"Task"),He=String(((Wa=t.metadata)==null?void 0:Wa.AgentCommandRequestedRole)||"Researcher"),ee=String(((te=t.metadata)==null?void 0:te.CodeNoteStatus)||"Draft"),ct=String(((Ye=t.metadata)==null?void 0:Ye.CodeNoteSyncState)||"Unlinked"),Wt=String(((Va=t.metadata)==null?void 0:Va.CodeNoteKind)||"Feature"),Ea=Me?cn:le?un:F==="image-generate"?mn:F==="video-generate"?pn:sh[t.kind],xn=l&&l.from!==t.id,ho=t.kind==="ai-task",Re=t.kind==="pdf"||t.kind==="file"||t.kind==="directory",Pa=uh(t),Vt=mh(t),Oe=Pa||Vt,Te=Pa?"monitor":Vt?"control":"",ce=t.kind==="template-launcher"||String(((Tn=t.metadata)==null?void 0:Tn.semanticType)||((v=t.metadata)==null?void 0:v.SemanticType)||"").toLowerCase()==="templatelauncher",kt=t.kind==="video",we=t.kind==="embed",wt=t.kind==="mask",ye=t.kind==="memo",at=t.kind==="markdown",nt=t.kind==="csv-table",Fe=ye?kh(t):null,pe=g.useRef(null),Cn=kt?ec(t):"",qe=kt?vh(t):"",$e=we?jh(t):"",vt=we?Ih(t):"",fo=we?Nh(t,$e):"",_e=we?Ah(t):"",Le=(((Y=t.imageStack)==null?void 0:Y.variants)??[]).filter(x=>!!x.imageUrl),ut=Le.find(x=>{var P;return x.variantId===((P=t.imageStack)==null?void 0:P.activeVariantId)})??Le[0]??null,Rt=t.kind==="image"||wt?(ut==null?void 0:ut.imageUrl)||ei(t):"",la=ut?Le.findIndex(x=>x.variantId===ut.variantId):-1,_a=!Rt&&!Re&&!Oe&&!ce&&!kt&&!we,bo=_a&&!ye,Yt=t.isExpanded===!1&&Number(t.originalHeight??0)>t.height+1,Sn=!Oe&&!["image","mask","video","embed","pdf","file","directory","template-launcher","remote-monitor","remote-control"].includes(t.kind),ot=t.aiEnabled!==!1,We=wh(t),Je=!!(t.isChunkedText||((ae=t.metadata)==null?void 0:ae.IsChunkedText)==="true"),ca=Number(t.totalLineCount??((Xe=t.metadata)==null?void 0:Xe.TotalLineCount)??0),yo=t.sourceFilePath||((Rn=t.metadata)==null?void 0:Rn.FileName)||t.title,xe=Je?n.jsxs("div",{className:"node-chunked-text-state","data-testid":"node-chunked-text-state",title:yo,children:[n.jsx(xt,{size:12}),n.jsx("strong",{children:"Chunked text"}),Number.isFinite(ca)&&ca>0&&n.jsxs("span",{children:[ca.toLocaleString()," lines"]})]}):null,Xt=t.kind==="directory"?(Ot=t.metadata)==null?void 0:Ot.Include:null,Da=t.kind==="directory"?(Ya=t.metadata)==null?void 0:Ya.Exclude:null,kn=t.kind==="directory"?(Xa=t.metadata)==null?void 0:Xa.DirectoryFileCount:null,Ee=t.kind==="directory"?(Ln=t.metadata)==null?void 0:Ln.DirectoryDirCount:null,jt=t.kind==="directory"?(En=t.metadata)==null?void 0:En.DirectoryLastScanUtc:null,[Ba,Oa]=g.useState(!1),[Fa,Ve]=g.useState(null),[Ss,wn]=g.useState(((Ga=t.metadata)==null?void 0:Ga.CompanyExecutionMode)||"Auto"),[ua,$a]=g.useState(((Pn=t.metadata)==null?void 0:Pn.CompanySubAgents)!=="false"),[Gt,ma]=g.useState(!1),[It,za]=g.useState(null),pa=g.useMemo(()=>nt?bh(t.body,It):null,[It,nt,t.body]),de=g.useMemo(()=>ce?kl(t.body):null,[ce,t.body]),mt=(de==null?void 0:de.options.find(x=>x.id===de.selectedOptionId))??(de==null?void 0:de.options[0])??null,Kt=om(de),Lt=rr.find(x=>x.key===Ss)||rr[0],Et=String(((xa=t.metadata)==null?void 0:xa.CompanyStatus)||(t.companyMode?"Staged":"")).trim(),Pt=Et.toLowerCase(),qt=Pt==="paused",pt=Pt==="archived",ks=x=>{x.stopPropagation();const P=x.currentTarget.getBoundingClientRect();Ve(hh(P)),Oa(ne=>!ne)},ws=x=>{x.stopPropagation(),oe(t.id,{executionMode:Lt.key,enableSubAgents:ua}),Oa(!1)},xo=x=>{x.stopPropagation(),Ae(t.id)},ga=(x,P)=>{P.stopPropagation();const ne=Le.find(ht=>ht.variantId===x);!ne||!t.imageStack||ne.variantId===t.imageStack.activeVariantId||(f.emit("node.imageStack.variant",{nodeId:t.id,variantId:ne.variantId,variantCount:Le.length}),c(t.id,{imageUrl:ne.imageUrl,imageStack:{...t.imageStack,activeVariantId:ne.variantId,variants:Le,updatedAtUtc:new Date().toISOString()},metadata:{...t.metadata??{},ImageStackActiveVariantId:ne.variantId}}))},vs=(x,P)=>{if(P.stopPropagation(),!!ye){if((Fe==null?void 0:Fe.key)===x){ma(!1);return}f.emit("node.memoColor.changed",{id:t.id,colorKey:x}),c(t.id,{metadata:{...t.metadata??{},memoColor:x,memoColorIsCustom:"true"}}),ma(!1)}},vn=x=>{var Be,jo;if(x.stopPropagation(),!Me)return;const P=(t.body||t.title||"Agent command objective").trim(),ne=["Clarify the objective and constraints.","Collect linked canvas context or code notes.","Draft an execution plan before external adapter use."],ht=["canvas-context","agent-command-planning","adapter-gated-execution"],ze=["Canvas.ListAgentCommands","Canvas.UpdateAgentCommand","Canvas.PlanAgentCommand","Canvas.SetAgentCommandState"],Nt=["MindCanvasAgent",me,He],z=["Local React plan staged for this Agent Command.",`Role: ${He}`,`Mode: ${me}`,`Objective: ${P.slice(0,220)}`,"External execution remains adapter-gated until LocalBridge/agent runtime is available."].join(`
|
|
2
2
|
`);f.emit("mindcanvas.agentCommand.planned",{id:t.id,mode:me,requestedRole:He,adapterState:((Be=t.metadata)==null?void 0:Be.AdapterState)??"adapter-gated"}),c(t.id,{tags:["Agent Command",He,"Planned"],metadata:{...t.metadata??{},AgentCommandStatus:"Planned",AgentCommandPlannerSummary:z,AgentCommandPlanSteps:JSON.stringify(ne),AgentCommandPlannedSkills:JSON.stringify(ht),AgentCommandPlannedTools:JSON.stringify(ze),AgentCommandPlannedConcepts:JSON.stringify(Nt),AgentCommandLastExplorationPhase:"planned-local",AdapterState:((jo=t.metadata)==null?void 0:jo.AdapterState)??"adapter-gated"}})},ha=x=>{var ze,Nt;if(x.stopPropagation(),!Me)return;const P=new Date().toISOString(),ne=[`Agent Command: ${t.title||"Agent"}`,`Status: Completed locally at ${P}`,"","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(`
|
|
3
3
|
`),ht=[`${P} Local React execution staged.`,`${P} Adapter gated; no external tools invoked.`];f.emit("mindcanvas.agentCommand.executed.local",{id:t.id,mode:me,requestedRole:He,adapterState:((ze=t.metadata)==null?void 0:ze.AdapterState)??"adapter-gated"}),c(t.id,{status:"done",result:ne,tags:["Agent Command",He,"Completed"],metadata:{...t.metadata??{},AgentCommandStatus:"Completed",AgentCommandLastExecutedAtUtc:P,AgentCommandConsoleLogs:JSON.stringify(ht),AgentCommandResultLinks:JSON.stringify([]),AdapterState:((Nt=t.metadata)==null?void 0:Nt.AdapterState)??"adapter-gated"}})},fa=(x,P,ne,ht)=>{var Nt,z,Be;if(x.stopPropagation(),!le)return;const ze=P==="Implemented"?JSON.stringify([`local-code-note://${t.id}/implementation-handoff.md`]):((Nt=t.metadata)==null?void 0:Nt.CodeNoteOutputArtifacts)||"[]";f.emit("mindcanvas.codeNote.state",{id:t.id,status:P,syncState:ne,reason:ht,adapterState:((z=t.metadata)==null?void 0:z.AdapterState)??"local-canvas-only"}),c(t.id,{tags:["Code Note",P,ne],metadata:{...t.metadata??{},CodeNoteStatus:P,CodeNoteSyncState:ne,CodeNoteOutputArtifacts:ze,...P==="Implemented"||P==="Reviewed"?{CodeNoteLastAppliedAtUtc:new Date().toISOString()}:{},AdapterState:((Be=t.metadata)==null?void 0:Be.AdapterState)??"local-canvas-only"}})},_t=()=>{$a(x=>!x)},Co=async x=>{if(x.stopPropagation(),!qe||!pe.current){f.emit("node.video.unavailable",{id:t.id,reason:qe?"element-missing":"source-missing"});return}try{await pe.current.play(),f.emit("node.video.play",{id:t.id,sourceKind:Hd(qe)})}catch(P){f.emit("node.video.unavailable",{id:t.id,reason:P instanceof Error?P.message:String(P)})}},ba=x=>{if(x.stopPropagation(),!qe||!pe.current){f.emit("node.video.unavailable",{id:t.id,reason:qe?"element-missing":"source-missing"});return}pe.current.pause(),f.emit("node.video.pause",{id:t.id,sourceKind:Hd(qe)})},Jt=x=>{x.stopPropagation(),$e&&O(t.id,$e)},jn=x=>{c(t.id,{body:JSON.stringify(x),metadata:{...t.metadata??{},templateLauncherSelectedOptionId:x.selectedOptionId??""}})},st=(x,P)=>{if(P.stopPropagation(),!de)return;const ne=im(de,x);jn(ne),f.emit("templateCard.option.select",{nodeId:t.id,optionId:ne.selectedOptionId??null})},In=(x,P)=>{if(!de)return;const ne=dm(de,x,P);jn(ne),f.emit("templateCard.input.patch",{nodeId:t.id,key:x})},Dt=x=>{x.stopPropagation(),!(!de||Kt)&&St(t.id,de.selectedOptionId??null,de.inputValues)},Zt=Sn&&Ba?n.jsxs("div",{className:"node-company-launcher","data-testid":"node-company-launcher",style:Fa?{left:Fa.left,top:Fa.top}:void 0,onPointerDown:x=>x.stopPropagation(),onClick:x=>x.stopPropagation(),children:[n.jsx("div",{className:"node-company-launcher__eyebrow",children:"Run As Company"}),n.jsx("h4",{children:"Turn this note into a background AI company"}),n.jsx("p",{children:"Pick the operating mode to stage on this node. External CompanyCore execution stays adapter-gated."}),n.jsx("div",{className:"node-company-mode-list",children:rr.map(x=>n.jsxs("button",{type:"button",className:x.key===Lt.key?"is-selected":"","data-company-mode":x.key,onClick:()=>wn(x.key),children:[n.jsx("strong",{children:x.label}),n.jsx("span",{children:x.description})]},x.key))}),n.jsxs("button",{type:"button",className:"node-company-subagents","aria-pressed":ua,onClick:x=>{x.stopPropagation(),_t()},children:[n.jsx("span",{className:"node-company-toggle-indicator","aria-hidden":"true",children:ua?"On":"Off"}),n.jsxs("span",{children:[n.jsx(Nl,{size:13}),"Enable sub-agents for exploration waves and specialist handoff"]})]}),n.jsxs("div",{className:"node-company-launcher__actions",children:[n.jsx("button",{type:"button",className:"btn btn-ghost",onClick:()=>Oa(!1),children:"Cancel"}),n.jsx("button",{type:"button",className:"btn btn-primary","data-testid":"node-company-run-confirm",onClick:ws,children:"Stage Company"})]})]}):null,Nn={width:t.width,height:t.height,transform:`translate3d(${t.x}px, ${t.y}px, 0)`,...Fe?{"--memo-bg":Fe.surface,"--memo-border":Fe.border,"--memo-ink":Fe.ink,"--memo-ring":Fe.ring,"--memo-accent":Fe.swatch}:{}},gt=n.jsxs(n.Fragment,{children:[bo&&n.jsx("button",{type:"button",title:ot?"Disable AI reference":"Enable AI reference","aria-label":ot?"Disable AI reference":"Enable AI reference",className:ot?"is-active-ai":"is-inactive-ai",onPointerDown:x=>x.stopPropagation(),onClick:()=>q(t.id),children:n.jsx(Fm,{size:13})}),ye&&n.jsx("button",{type:"button",title:"Change memo color","aria-label":"Change memo color","aria-pressed":Gt,className:"is-memo-color-action","data-testid":"node-memo-color-open",onPointerDown:x=>x.stopPropagation(),onClick:x=>{x.stopPropagation(),ma(P=>!P)},children:n.jsx(Al,{size:13})}),t.kind==="code"&&n.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:()=>re(t.id),children:n.jsx($m,{size:13})}),n.jsx("button",{type:"button",title:Rt?"Copy image to clipboard":"Copy content","aria-label":Rt?"Copy image to clipboard":"Copy content",onPointerDown:x=>x.stopPropagation(),onClick:()=>$(t.id),children:n.jsx(co,{size:13})}),n.jsx("button",{type:"button",title:"Duplicate node","aria-label":"Duplicate node","data-testid":"node-duplicate",onPointerDown:x=>x.stopPropagation(),onClick:()=>w(t.id),children:n.jsx(Ml,{size:13})}),_a&&n.jsx("button",{type:"button",title:"Fit text height","aria-label":"Fit text height",onPointerDown:x=>x.stopPropagation(),onClick:()=>G(t.id),children:n.jsx(zm,{size:13})}),_a&&n.jsx("button",{type:"button",title:Yt?"Expand node":"Collapse node","aria-label":Yt?"Expand node":"Collapse node","aria-pressed":Yt,onPointerDown:x=>x.stopPropagation(),onClick:()=>V(t.id),children:Yt?n.jsx(Cd,{size:13}):n.jsx(Um,{size:13})}),ho&&n.jsx("button",{type:"button",title:"Run node",onPointerDown:x=>x.stopPropagation(),onClick:()=>L(t.id),children:n.jsx(ia,{size:13})}),Sn&&n.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?xo:ks,children:n.jsx(Sd,{size:13})}),n.jsx("button",{type:"button",title:"Delete node","aria-label":"Delete node","data-testid":"node-delete",onPointerDown:x=>x.stopPropagation(),onClick:()=>y(t.id),children:n.jsx(cs,{size:13})})]}),Ua=ho?n.jsxs("div",{className:"node-result-row","data-testid":"node-external-pins",children:[n.jsxs("button",{className:`node-pin node-pin--context ${xn?"can-receive":""}`,type:"button",title:"Context input",onPointerDown:x=>x.stopPropagation(),onClick:x=>{x.stopPropagation(),I(t.id,"context")},children:[n.jsx(kd,{size:10}),"Context"]}),n.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?D(t.id):I(t.id,"result")},children:[n.jsx(Cd,{size:11}),"Result"]})]}):n.jsxs("button",{className:`node-context-source ${l?"can-receive":""}`,type:"button",title:"Use this node as AI Task context",onPointerDown:x=>x.stopPropagation(),onClick:x=>{x.stopPropagation(),I(t.id,"context")},children:[n.jsx(kd,{size:10}),n.jsx("span",{children:"Context"})]}),je=wt||Le.length>1||we||kt?n.jsxs("div",{className:"node-surface-badges","data-testid":"node-surface-badges",children:[wt&&n.jsx("span",{className:"node-mask-badge",title:"Image edit mask reference",children:"Mask"}),Le.length>1&&n.jsxs("span",{className:"node-image-stack-badge",title:"Image stack variants",children:[Math.max(1,la+1),"/",Le.length]}),we&&n.jsx("span",{className:"node-embed-badge",children:vt==="youtube"?"YouTube":"Embed"}),kt&&n.jsx("span",{className:"node-video-badge",children:((_n=t.metadata)==null?void 0:_n.MediaModel)||((Ka=t.metadata)==null?void 0:Ka.MediaProvider)||"Video"})]}):null,fe=Le.length>1||we||kt||Re?n.jsxs("div",{className:"node-surface-actions","data-testid":"node-surface-actions",children:[Le.length>1&&n.jsx("div",{className:"node-image-stack-rail","aria-label":"Image stack variants",children:Le.map((x,P)=>n.jsx("button",{type:"button",className:x.variantId===(ut==null?void 0:ut.variantId)?"is-active":"",title:x.title||x.caption||`Variant ${P+1}`,"aria-label":`Show image variant ${P+1}`,onPointerDown:ne=>ne.stopPropagation(),onClick:ne=>ga(x.variantId,ne),children:n.jsx(sr,{src:x.imageUrl,traceId:`${t.id}:${x.variantId||P}`,kind:"image-stack-variant",testId:"node-image-stack-thumb"})},x.variantId||`${x.imageUrl}-${P}`))}),we&&n.jsxs("div",{className:"node-embed-actions",children:[n.jsxs("button",{type:"button",title:"Open embed","aria-label":"Open embed",onPointerDown:x=>x.stopPropagation(),onClick:x=>{x.stopPropagation(),$e&&he(t,"external")},children:[n.jsx(gn,{size:13}),n.jsx("span",{children:"Open"})]}),n.jsxs("button",{type:"button",title:"Copy URL","aria-label":"Copy URL",onPointerDown:x=>x.stopPropagation(),onClick:Jt,children:[n.jsx(co,{size:13}),n.jsx("span",{children:"Copy URL"})]})]}),kt&&n.jsxs("div",{className:"node-video-actions",children:[n.jsxs("button",{type:"button",title:"Play video","aria-label":"Play video","data-testid":"node-video-play",onPointerDown:x=>x.stopPropagation(),onClick:Co,children:[n.jsx(ia,{size:13}),n.jsx("span",{children:"Play"})]}),n.jsxs("button",{type:"button",title:"Pause video","aria-label":"Pause video","data-testid":"node-video-pause",onPointerDown:x=>x.stopPropagation(),onClick:ba,children:[n.jsx(po,{size:13}),n.jsx("span",{children:"Pause"})]})]}),Re&&n.jsxs("div",{className:"node-asset-actions",children:[t.kind==="pdf"&&n.jsxs("button",{type:"button",title:"Preview PDF","data-testid":"node-pdf-preview",onPointerDown:x=>x.stopPropagation(),onClick:()=>he(t,"preview"),children:[n.jsx(Hm,{size:13}),n.jsx("span",{children:"Preview"})]}),t.kind!=="directory"&&n.jsxs("button",{type:"button",title:"Open in new tab",onPointerDown:x=>x.stopPropagation(),onClick:()=>he(t,"external"),children:[n.jsx(gn,{size:13}),n.jsx("span",{children:"Open"})]}),t.kind==="directory"&&n.jsxs("button",{type:"button",title:"Scan folder","data-testid":"directory-scan",onPointerDown:x=>x.stopPropagation(),onClick:()=>ie(t.id),children:[n.jsx(ln,{size:13}),n.jsx("span",{children:"Scan"})]}),t.kind==="directory"&&n.jsxs("button",{type:"button",title:"Folder scan settings","data-testid":"directory-settings-open",onPointerDown:x=>x.stopPropagation(),onClick:()=>J(t.id),children:[n.jsx(ts,{size:13}),n.jsx("span",{children:"Settings"})]})]})]}):null,Ze=Oe?null:n.jsxs("div",{className:"node-external-action-rail","data-testid":"node-external-action-rail",onPointerDown:x=>x.stopPropagation(),onClick:x=>x.stopPropagation(),children:[fe,n.jsx("div",{className:"node-external-rail__pins",children:Ua}),n.jsx("div",{className:"node-actions","data-testid":"node-actions",children:gt}),Me&&n.jsxs("div",{className:"node-agent-command-actions","data-testid":"node-agent-command-actions",onPointerDown:x=>x.stopPropagation(),onClick:x=>x.stopPropagation(),children:[n.jsx("button",{type:"button","data-testid":"node-agent-command-plan","data-agent-command-action":"plan",onClick:vn,children:"Plan"}),n.jsx("button",{type:"button","data-testid":"node-agent-command-execute","data-agent-command-action":"execute",disabled:Tt==="Running",onClick:ha,children:"Execute"})]}),le&&n.jsxs("div",{className:"node-code-note-actions","data-testid":"node-code-note-actions",onPointerDown:x=>x.stopPropagation(),onClick:x=>x.stopPropagation(),children:[n.jsx("button",{type:"button","data-testid":"node-code-note-approve","data-code-note-action":"approve",onClick:x=>fa(x,"Approved","Planned","approve-local"),children:"Approve"}),n.jsx("button",{type:"button","data-testid":"node-code-note-review","data-code-note-action":"review",onClick:x=>fa(x,"Reviewed","InSync","review-local"),children:"Review"}),n.jsx("button",{type:"button","data-testid":"node-code-note-out-of-sync","data-code-note-action":"out-of-sync",onClick:x=>fa(x,ee,"OutOfSync","mark-out-of-sync-local"),children:"Out of sync"})]}),t.companyMode&&n.jsxs("div",{className:"node-company-quick-actions","data-testid":"node-company-quick-actions","data-company-status":Et||"Staged",onPointerDown:x=>x.stopPropagation(),onClick:x=>x.stopPropagation(),children:[n.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:pt,onClick:()=>be(t.id),children:n.jsx(Tl,{size:12})}),n.jsx("button",{type:"button",title:"Refresh Company status","aria-label":"Refresh Company status","data-testid":"node-company-refresh",onClick:()=>Ue(t.id),children:n.jsx(ln,{size:12})}),pt?n.jsx("button",{type:"button",title:"Company is archived","aria-label":"Company is archived","data-testid":"node-company-archived",disabled:!0,children:n.jsx(vr,{size:12})}):qt?n.jsx("button",{type:"button",title:"Resume Company","aria-label":"Resume Company","data-testid":"node-company-resume",onClick:()=>et(t.id,"Staged"),children:n.jsx(ia,{size:12})}):n.jsx("button",{type:"button",title:"Pause Company","aria-label":"Pause Company","data-testid":"node-company-pause",onClick:()=>et(t.id,"Paused"),children:n.jsx(po,{size:12})}),!pt&&n.jsx("button",{type:"button",title:"Archive Company","aria-label":"Archive Company","data-testid":"node-company-archive",onClick:()=>et(t.id,"Archived"),children:n.jsx(vr,{size:12})}),n.jsx("button",{type:"button",title:"Remove Company from this note","aria-label":"Remove Company from this note","data-testid":"node-company-remove",onClick:()=>tt(t.id),children:n.jsx(yt,{size:12})})]})]}),ko=Oe?null:n.jsx("div",{className:"node-external-rail","data-testid":"node-external-rail",onPointerDown:x=>x.stopPropagation(),onClick:x=>x.stopPropagation(),children:n.jsxs("div",{className:"node-external-rail__meta",children:[n.jsxs("div",{className:"node-tags","data-testid":"node-external-tags",children:[(t.tags??[t.kind]).slice(0,3).map(x=>n.jsx("span",{children:x},x)),t.status&&n.jsx("span",{className:`node-status node-status--${t.status}`,children:t.status})]}),je,xe,Me&&n.jsxs("div",{className:"node-agent-command-state","data-testid":"node-agent-command-state","data-agent-command-status":Tt,"data-agent-command-mode":me,"data-agent-command-role":He,"data-agent-command-adapter-state":((Ca=t.metadata)==null?void 0:Ca.AdapterState)||"adapter-gated",children:[n.jsx(cn,{size:12}),n.jsx("strong",{children:"AC"}),n.jsx("span",{children:Tt}),n.jsx("span",{children:me}),n.jsx("span",{children:He})]}),le&&n.jsxs("div",{className:"node-code-note-state","data-testid":"node-code-note-state","data-code-note-status":ee,"data-code-note-sync-state":ct,"data-code-note-kind":Wt,"data-code-note-adapter-state":((ea=t.metadata)==null?void 0:ea.AdapterState)||"local-canvas-only",children:[n.jsx(un,{size:12}),n.jsx("strong",{children:"CN"}),n.jsx("span",{children:ee}),n.jsx("span",{children:ct}),n.jsx("span",{children:Wt})]}),t.companyMode&&n.jsxs("div",{className:"node-company-state","data-testid":"node-company-state",children:[n.jsx(Sd,{size:12}),n.jsx("strong",{children:((De=t.metadata)==null?void 0:De.CompanyExecutionModeLabel)||"Company staged"}),n.jsx("span",{children:((Pe=t.metadata)==null?void 0:Pe.CompanySubAgents)==="false"?"single-agent":"sub-agents"})]})]})});return n.jsxs("article",{className:`canvas-node canvas-node--${t.kind} ${Oe?"canvas-node--remote-surface":""} ${Pa?"canvas-node--remote-monitor-surface":""} ${Vt?"canvas-node--remote-control-surface":""} ${F?`canvas-node--automation-${F}`:""} ${Me?"canvas-node--agent-command":""} ${le?"canvas-node--code-note":""} ${o?"is-selected":""} ${r?"is-pulsing":""} ${ot?"":"is-ai-disabled"} ${t.wordWrap===!1?"is-nowrap":""} ${Yt?"is-collapsed":""} ${t.companyMode?`is-company-${t.companyMode}`:""}`,style:Nn,"data-node-id":t.id,"data-automation-node-kind":F||void 0,"data-automation-external-policy":((qa=t.metadata)==null?void 0:qa.AutomationExternalActionPolicy)||void 0,"data-media-generation-contract":((Dn=t.metadata)==null?void 0:Dn.MediaGenerationContract)||void 0,"data-agent-command-node":Me?"true":void 0,"data-agent-command-status":Me?Tt:void 0,"data-agent-command-mode":Me?me:void 0,"data-agent-command-role":Me?He:void 0,"data-code-note-node":le?"true":void 0,"data-code-note-status":le?ee:void 0,"data-code-note-sync-state":le?ct:void 0,"data-code-note-kind":le?Wt:void 0,"data-remote-surface-chrome":Oe?"self-contained":void 0,"data-remote-surface-kind":Te||void 0,"data-remote-surface-title-owner":Oe?"inner-remote-view":void 0,"data-remote-surface-scroll-owner":Oe?"remote-page-rail":void 0,onPointerDown:x=>{m(t.id,x.shiftKey||x.metaKey||x.ctrlKey),p(t.id,x)},onDoubleClick:x=>{if(t.kind!=="directory")return;const P=x.target instanceof HTMLElement?x.target:null;P!=null&&P.closest('button,input,textarea,select,[contenteditable="true"],[contenteditable=""]')||(x.stopPropagation(),ie(t.id))},children:[!Oe&&n.jsxs("div",{className:"node-header",children:[n.jsx("span",{className:"node-kind",children:n.jsx(Ea,{size:14})}),n.jsx("input",{value:t.title,"aria-label":"Node title",readOnly:ce,onPointerDown:x=>x.stopPropagation(),onChange:x=>{ce||c(t.id,{title:x.target.value})}})]}),Zt&&typeof document<"u"?Ku.createPortal(Zt,document.body):Zt,ye&&Gt&&Fe&&n.jsx("div",{className:"node-memo-palette","data-testid":"node-memo-palette",onPointerDown:x=>x.stopPropagation(),onClick:x=>x.stopPropagation(),children:Pr.map(x=>n.jsx("button",{type:"button",className:x.key===Fe.key?"is-active":"",title:`${x.label} memo color`,"aria-label":`${x.label} memo color`,"aria-pressed":x.key===Fe.key,"data-memo-color":x.key,style:{"--memo-swatch":x.swatch,"--memo-swatch-ring":x.ring},onPointerDown:P=>P.stopPropagation(),onClick:P=>vs(x.key,P)},x.key))}),Rt?n.jsx("div",{className:`node-image-wrap ${Le.length>1?"node-image-wrap--stack":""} ${wt?"node-image-wrap--mask":""}`,"data-testid":wt?"node-mask-preview":Le.length>1?"node-image-stack":void 0,children:n.jsx(sr,{src:Rt,traceId:t.id,kind:wt?"mask":"node-image",testId:"node-secure-image"})}):Pa?n.jsx(sm,{node:t,onPatch:c,onCreateRemoteControl:se}):Vt?n.jsx(rm,{node:t,onPatch:c}):ce?n.jsx("div",{className:"node-template-card","data-testid":"node-template-card",children:de&&mt?n.jsxs(n.Fragment,{children:[n.jsxs("div",{className:"node-template-card__summary",children:[n.jsx("strong",{children:de.prompt||de.description}),n.jsx("span",{children:mt.description||de.description})]}),n.jsx("div",{className:"node-template-card__options","data-testid":"node-template-card-options",children:de.options.map(x=>n.jsxs("button",{type:"button",className:x.id===mt.id?"is-active":"","data-testid":"node-template-card-option","data-option-id":x.id,onPointerDown:P=>P.stopPropagation(),onClick:P=>st(x.id,P),children:[n.jsx("strong",{children:x.label}),n.jsx("span",{children:x.description})]},x.id||x.templateId))}),n.jsxs("div",{className:"node-template-card__inputs","data-testid":"node-template-card-inputs",children:[mt.inputs.map(x=>n.jsx(gh,{input:x,value:de.inputValues[x.key]??"",onChange:P=>In(x.key,P)},x.key)),mt.inputs.length===0&&n.jsx("p",{className:"node-template-card__empty",children:de.noInputsLabel||"No inputs needed."})]}),Kt&&n.jsx("div",{className:"node-template-card__validation",children:Kt}),n.jsxs("button",{type:"button",className:"node-template-card__generate","data-testid":"node-template-card-generate",disabled:!!Kt,onPointerDown:Dt,onClick:x=>x.stopPropagation(),children:[n.jsx(ia,{size:13}),n.jsx("span",{children:de.generateLabel||de.actionLabel||"Generate"})]})]}):n.jsx("div",{className:"node-template-card__missing",children:"Template card payload is unavailable."})}):we?n.jsxs("div",{className:`node-embed-card ${_e?"has-embed-thumbnail":"is-embed-link"}`,"data-testid":"node-embed-card",children:[n.jsx("div",{className:"node-embed-preview",children:_e?n.jsx(sr,{src:_e,traceId:t.id,kind:"embed-thumbnail",testId:"node-embed-thumbnail"}):n.jsxs("div",{className:"node-embed-placeholder",children:[n.jsx(gn,{size:24}),n.jsx("strong",{children:vt==="youtube"?"YouTube":"Web embed"}),n.jsx("span",{children:fo||$e||"External link"})]})}),n.jsx("textarea",{value:t.body,"aria-label":"Embed URL or description",spellCheck:!1,onPointerDown:x=>x.stopPropagation(),onChange:x=>{const P=x.target.value;c(t.id,{body:P,assetUrl:P,metadata:{...t.metadata??{},sourceUrl:P,url:P}})}}),$e&&n.jsx("span",{className:"node-embed-source",title:$e,children:$e})]}):kt?n.jsxs("div",{className:`node-video-card ${qe?"has-video-source":"is-video-prompt"}`,"data-testid":"node-video-card",children:[qe?n.jsx("video",{ref:pe,src:qe,className:"node-video-player","data-testid":"node-video-player",controls:!0,preload:"metadata",onPointerDown:x=>x.stopPropagation()}):n.jsxs("div",{className:"node-video-placeholder",children:[n.jsx(pn,{size:24}),n.jsx("strong",{children:"Video prompt"}),n.jsx("span",{children:((vo=t.metadata)==null?void 0:vo.MediaModel)||((Sa=t.metadata)==null?void 0:Sa.MediaProvider)||"Adapter gated"})]}),n.jsx("textarea",{value:t.body,"aria-label":"Video prompt or source",spellCheck:!1,onPointerDown:x=>x.stopPropagation(),onChange:x=>c(t.id,{body:x.target.value})}),qe&&n.jsx("span",{className:"node-video-source",title:Cn,children:Cn})]}):Re?n.jsxs("div",{className:`node-asset-card node-asset-card--${t.kind}`,"data-testid":"node-asset-card",children:[n.jsx("div",{className:"node-asset-icon",children:n.jsx(Ea,{size:28})}),n.jsxs("div",{className:"node-asset-copy",children:[n.jsx("strong",{title:We,children:We}),n.jsx("span",{children:t.kind==="directory"?"Directory reference":t.kind==="pdf"?"PDF document":"File reference"}),t.kind==="directory"&&(Xt||Da||kn||Ee||jt)&&n.jsxs("dl",{className:"node-asset-meta","data-testid":"node-directory-meta",children:[(kn||Ee)&&n.jsxs(n.Fragment,{children:[n.jsx("dt",{children:"Scanned"}),n.jsxs("dd",{children:[Number(kn??0).toLocaleString()," files / ",Number(Ee??0).toLocaleString()," folders"]})]}),Xt&&n.jsxs(n.Fragment,{children:[n.jsx("dt",{children:"Include"}),n.jsx("dd",{children:Xt})]}),Da&&n.jsxs(n.Fragment,{children:[n.jsx("dt",{children:"Exclude"}),n.jsx("dd",{children:Da})]}),jt&&n.jsxs(n.Fragment,{children:[n.jsx("dt",{children:"Updated"}),n.jsx("dd",{children:new Date(jt).toLocaleString()})]})]})]})]}):nt?n.jsxs("div",{className:"node-csv-card","data-testid":"node-csv-card",children:[n.jsx(fh,{preview:pa,sort:It,onSort:x=>{const P=(It==null?void 0:It.columnIndex)===x&&It.direction==="asc"?"desc":"asc";za({columnIndex:x,direction:P}),f.emit("node.csvTable.sort",{id:t.id,columnIndex:x,direction:P})}}),n.jsx("textarea",{value:t.body,"aria-label":"CSV source",spellCheck:!1,wrap:"off",onPointerDown:x=>x.stopPropagation(),onChange:x=>c(t.id,{body:x.target.value})})]}):at?n.jsxs("div",{className:"node-markdown-card","data-testid":"node-markdown-card",children:[n.jsx("div",{className:"node-markdown-preview mindcanvas-text-scrollable-view","data-testid":"node-markdown-preview","aria-label":"Markdown preview",children:n.jsx(Ch,{value:t.body})}),n.jsx("textarea",{value:t.body,"aria-label":"Markdown source",spellCheck:!1,wrap:t.wordWrap===!1?"off":"soft",onPointerDown:x=>x.stopPropagation(),onChange:x=>c(t.id,{body:x.target.value})})]}):n.jsx(n.Fragment,{children:n.jsx("textarea",{value:t.body,"aria-label":"Node body",spellCheck:!1,wrap:t.wordWrap===!1?"off":"soft",onPointerDown:x=>x.stopPropagation(),onChange:x=>c(t.id,{body:x.target.value})})}),ko,Ze,n.jsx("button",{type:"button",className:"node-resize-handle",title:"Resize node","aria-label":"Resize node",onPointerDown:x=>b(t.id,x)})]})});function gh({input:e,value:t,onChange:o}){return n.jsxs("label",{className:"node-template-card__field",children:[n.jsxs("span",{children:[n.jsx("strong",{children:e.label}),e.description&&n.jsx("small",{children:e.description})]}),e.type==="textarea"?n.jsx("textarea",{value:t,placeholder:e.placeholder,onPointerDown:r=>r.stopPropagation(),onChange:r=>o(r.target.value)}):e.type==="select"?n.jsx("select",{value:t,onPointerDown:r=>r.stopPropagation(),onChange:r=>o(r.target.value),children:(e.options??[]).map(r=>n.jsx("option",{value:r.value,children:r.label},r.value))}):n.jsx("input",{type:"text",value:t,placeholder:e.placeholder,onPointerDown:r=>r.stopPropagation(),onChange:r=>o(r.target.value)})]})}function hh(e){const r=Math.min(430,window.innerHeight-24),l=Math.max(12,window.innerWidth-332-12),m=Math.min(Math.max(e.right-332,12),l),p=e.bottom+8,b=e.top-r-8,c=Math.max(12,window.innerHeight-r-12),y=p<=c?p:Math.max(12,b);return{left:m,top:Math.min(y,c)}}function fh({preview:e,sort:t,onSort:o}){return!e||e.headers.length===0?n.jsx("div",{className:"csv-table-scroll mindcanvas-text-scrollable-view","data-testid":"csv-table-preview","aria-label":"CSV table preview",children:n.jsx("p",{className:"node-md-empty",children:"Paste CSV source to preview a table."})}):n.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:[n.jsxs("table",{className:"csv-table",children:[n.jsx("thead",{children:n.jsx("tr",{children:e.headers.map((r,l)=>{const m=(t==null?void 0:t.columnIndex)===l,p=m&&t.direction==="asc"?"descending":"ascending";return n.jsx("th",{"aria-sort":m?t.direction==="asc"?"ascending":"descending":"none",children:n.jsxs("button",{type:"button",className:`csv-table-header-button ${m?"is-active":""}`,"data-testid":`csv-table-sort-${l}`,"aria-label":`Sort CSV by ${r||`Column ${l+1}`} ${p}`,onClick:()=>o(l),children:[n.jsx("span",{children:r||`Column ${l+1}`}),m&&n.jsx("small",{children:t.direction==="asc"?"Asc":"Desc"})]})},`${r}-${l}`)})})}),n.jsx("tbody",{children:e.rows.map((r,l)=>n.jsx("tr",{children:e.headers.map((m,p)=>n.jsx("td",{className:"csv-table-cell",children:r[p]??""},`csv-cell-${l}-${p}`))},`csv-row-${l}`))})]}),n.jsxs("div",{className:"csv-table-status",children:[n.jsxs("span",{children:[e.totalRows.toLocaleString()," rows"]}),n.jsxs("span",{children:[e.columnCount.toLocaleString()," columns"]}),e.truncated&&n.jsxs("span",{children:["showing ",e.renderedRows.toLocaleString()]})]})]})}function bh(e,t){const o=yh(e,zd+1);if(o.length===0)return null;const r=Math.min(rh,Math.max(...o.map(c=>c.length),1)),l=Ud(o[0],r).map((c,y)=>c.trim()||`Column ${y+1}`),m=o.slice(1,zd+1).map(c=>Ud(c,r)),p=t?[...m].sort((c,y)=>xh(c[t.columnIndex]??"",y[t.columnIndex]??"",t.direction)):m,b=Math.max(0,String(e||"").split(/\r\n|\n|\r/).filter(c=>c.length>0).length-1);return{headers:l,rows:p,totalRows:b,columnCount:r,renderedRows:p.length,truncated:b>p.length}}function yh(e,t){const o=[];let r=[],l="",m=!1;const p=String(e||"").replace(/\r\n/g,`
|
|
4
4
|
`).replace(/\r/g,`
|
|
@@ -43,6 +43,6 @@ Leads,42,Validation
|
|
|
43
43
|
Trials,7,Launch
|
|
44
44
|
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
|
|
45
45
|
|
|
46
|
-
Write structured notes, docs, or prompt context here.`:"Write the thought, evidence, or reusable context here.",x:M.x,y:M.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"?Br:void 0,metadata:i?Zf(v.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"}:d?ii(v.current.settings,d):void 0};B(Z=>({...Z,nodes:[...Z.nodes,k]}),"node.add",{id:k.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:k.id,kind:i.kind,mode:i.mode,model:(A=k.metadata)==null?void 0:A.MediaModel,aspectPresetId:(_=k.metadata)==null?void 0:_.AspectPresetId,requestedSize:(E=k.metadata)==null?void 0:E.RequestedSize,adapterState:((N=k.metadata)==null?void 0:N.AdapterState)??"adapter-gated",externalActionPolicy:((T=k.metadata)==null?void 0:T.AutomationExternalActionPolicy)??"spec-only-until-review"}),a==="remote-monitor"&&f.emit("remoteMonitor.node.add",{id:k.id,surface:"mindcanvas-node",width:k.width,height:k.height,adapterState:((R=k.metadata)==null?void 0:R.AdapterState)??"adapter-gated"}),a==="mask"&&f.emit("node.mask.add",{id:k.id,hasImage:!!k.imageUrl,imageRouterMask:((Q=k.metadata)==null?void 0:Q.ImageRouterMask)??"true",semanticType:((Ne=k.metadata)==null?void 0:Ne.SemanticType)??"ImageEditMask",adapterState:((Yn=k.metadata)==null?void 0:Yn.AdapterState)??"adapter-gated"}),y([k.id]),Ce(k,"node.add")},[z,B,ve,Ce]),K=g.useCallback((a,s)=>{Ja(i=>({...i,nodes:i.nodes.map(d=>d.id===a?{...d,...s}:d)}),"node.patch",{id:a,keys:Object.keys(s)})},[Ja]),Ft=g.useCallback((a,s)=>{const i=Y.current[0],d=v.current.nodes.find(u=>u.id===i);d&&(K(i,{metadata:{...d.metadata??{},[a]:a===U.templateNodeId||a===U.inputKey?so(s):s}}),Ze(null),f.emit("templateStudio.node.metadata.patch",{id:i,key:a}))},[K]),yi=g.useCallback(a=>{var h;const s=Y.current[0],i=v.current.nodes.find(C=>C.id===s);if(!i)return;const d=((h=i.metadata)==null?void 0:h[U.templateNodeId])||so(i.title),u={...i.metadata??{},[U.studioNodeType]:a,[U.templateNodeId]:d,[U.templateRole]:a.replace(/^template\./,""),[U.compileTarget]:pd(a,i)};a==="template.input"&&(u[U.inputKey]=u[U.inputKey]||so(i.title),u[U.inputType]=u[U.inputType]||"text",u[U.inputRequired]=u[U.inputRequired]||"true"),K(s,{metadata:u}),Ze(null),f.emit("templateStudio.node.role.assign",{id:s,studioNodeType:a})},[K]),j=g.useCallback(a=>{_e(a),window.setTimeout(()=>{_e(s=>s===a?null:s)},2200)},[]),Qc=g.useCallback((a,s,i)=>{var k;const d=v.current.nodes.find(A=>A.id===a);if(!d)return;const u=kl(d.body),h=xm(d,s,i,v.current.settings);if(!h||h.nodes.length===0){j("Template card could not generate nodes."),f.emit("templateCard.generate.blocked",{nodeId:a,optionId:s});return}B(A=>({...A,nodes:[...A.nodes,...h.nodes]}),"templateCard.generate",{nodeId:a,launcherId:h.launcher.id,optionId:((k=h.option)==null?void 0:k.id)??null,templateId:h.template.id,runId:h.runId,generatedCount:h.nodes.length});const C=h.nodes.map(A=>A.id);y(C),F(C[0]??null);const S=h.nodes[h.nodes.length-1];S&&Ce(S,"templateCard.generate"),window.setTimeout(()=>F(A=>A===C[0]?null:A),1200);const M=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.`;j(M)},[B,Ce,j]),eu=g.useCallback(a=>{const s=v.current.nodes.find(A=>A.id===a.sourceNodeId),i=560,d=390,u=ve(void 0,void 0,{width:i,height:d}),h=H("node"),C=s?s.x+s.width+Ko:u.x,S=s?s.y:u.y,M={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&&(M.RemoteFleetLatestFramePath=a.framePath),a.frameUrl&&(M.RemoteFleetLatestFrameUrl=a.frameUrl),a.dataUrl&&(M.RemoteFleetLatestFrameDataUrl=a.dataUrl),a.frameSeq&&(M.RemoteFleetLatestFrameSeq=String(a.frameSeq));const k={id:h,kind:"remote-control",title:a.deviceName||"Remote Device",body:`Remote device control: ${a.deviceId}`,x:C,y:S,width:i,height:d,tags:["Remote","Control","LocalBridge"],metadata:M};B(A=>({...A,nodes:[...A.nodes,k]}),"remoteControl.node.add",{id:k.id,sourceNodeId:a.sourceNodeId,deviceId:a.deviceId}),y([k.id]),Ce(k,"remoteControl.node.add"),j(`Remote control node created for ${a.deviceName||a.deviceId}.`),f.emit("remoteControl.node.add",{nodeId:k.id,sourceNodeId:a.sourceNodeId,deviceId:a.deviceId,connected:a.connected===!0})},[B,ve,Ce,j]),ka=g.useCallback(a=>{const s=Jo(ae.current)??{...tn};Ie({cameraBookmarks:{...v.current.settings.cameraBookmarks??{},[a]:s}},"camera.bookmark.save"),f.emit("camera.bookmark.save",{slot:a,...s}),j(`Camera slot ${a} saved.`)},[Ie,j]),Fn=g.useCallback(a=>{var d;const s=Jo((d=v.current.settings.cameraBookmarks)==null?void 0:d[a]),i=s??{...tn};z(i),f.emit("camera.bookmark.goto",{slot:a,saved:!!s,...i}),j(s?`Camera slot ${a}.`:`Camera slot ${a} empty. Home view.`)},[z,j]),Rs=g.useCallback(()=>{z({...tn}),f.emit("camera.bookmark.goto",{slot:"home",saved:!1,...tn}),j("Home view.")},[z,j]),xi=g.useCallback(a=>{const s=ae.current,i=Dh,d={...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(d),f.emit("camera.keyboard.pan",{direction:a,...d})},[z]),Ci=g.useCallback(()=>{const a=Ln.current;return a?(a.focus(),a.select(),f.emit("globalInput.focus",{source:"keyboard"}),!0):!1},[]),Ls=g.useCallback((a="keyboard")=>{const s=!(v.current.settings.wheelMode??!1);Ie({wheelMode:s},`${a}.wheelMode.toggle`),f.emit("canvas.wheelMode.toggle",{source:a,wheelMode:s}),j(s?"Mouse wheel mode.":"Trackpad pan mode.")},[Ie,j]),Es=g.useCallback((a="keyboard")=>{const i=(v.current.settings.cursorDirection==="down"?"down":"right")==="down"?"right":"down";Ie({cursorDirection:i},`${a}.cursorDirection.toggle`),f.emit("canvas.cursorDirection.toggle",{source:a,cursorDirection:i}),j(i==="down"?"Cursor direction down.":"Cursor direction right.")},[Ie,j]),To=g.useCallback(async(a,s="api")=>{const i=a===!0;try{if(i){if(document.fullscreenElement)return ze(!0),f.emit("canvas.fullscreen.toggle",{source:s,active:!0,fallback:!1}),!0;if(document.documentElement.requestFullscreen){await document.documentElement.requestFullscreen();const d=!!document.fullscreenElement;return ze(d),f.emit("canvas.fullscreen.toggle",{source:s,active:d,fallback:!1}),d}return ze(!0),f.emit("canvas.fullscreen.toggle",{source:s,active:!0,fallback:!0}),!0}return document.fullscreenElement&&document.exitFullscreen&&await document.exitFullscreen(),ze(!1),f.emit("canvas.fullscreen.toggle",{source:s,active:!1,fallback:!1}),!1}catch(d){return ze(i),f.emit("canvas.fullscreen.toggle.failed",{source:s,active:i,fallback:!0,error:d instanceof Error?d.message:String(d)}),f.emit("canvas.fullscreen.toggle",{source:s,active:i,fallback:!0}),j(i?"Read mode fallback.":"Read mode off."),i}},[ze,j]),$n=g.useCallback((a="keyboard")=>To(!ht.current,a),[To]);g.useEffect(()=>{const a=window,s={getMindCanvasFullscreenState:a.getMindCanvasFullscreenState,setMindCanvasFullscreen:a.setMindCanvasFullscreen,getMindCanvasReadModeState:a.getMindCanvasReadModeState,setMindCanvasReadMode:a.setMindCanvasReadMode,toggleMindCanvasReadMode:a.toggleMindCanvasReadMode},i=()=>ht.current,d=h=>To(h,"api"),u=()=>$n("api");return a.getMindCanvasFullscreenState=i,a.setMindCanvasFullscreen=d,a.getMindCanvasReadModeState=i,a.setMindCanvasReadMode=d,a.toggleMindCanvasReadMode=u,xo(!0),f.emit("canvas.readMode.api.bound"),()=>{xo(!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")}},[To,$n]);const tu=g.useCallback(()=>{const a=v.current.settings.cameraBookmarks??{},s=ir.find(i=>!a[i])??ir[0];ka(s)},[ka]),au=g.useCallback(a=>{mr(v.current.settings.gridType)!==a&&Ie({gridType:a},`canvas.gridMode.${a}`)},[Ie]),nu=g.useCallback(()=>{Ie({gridSnap:!(v.current.settings.gridSnap??!0)},"canvas.gridSnap.toggle")},[Ie]),ou=g.useCallback(a=>{const s=v.current.nodes.find(i=>i.id===a);!s||s.kind!=="directory"||(qt(a),f.emit("node.directorySettings.open",{id:a}))},[]),su=g.useCallback(()=>{qt(a=>(a&&f.emit("node.directorySettings.close",{id:a}),null))},[]),ru=g.useCallback((a,s)=>{const i=v.current.nodes.find(h=>h.id===a);if(!i||i.kind!=="directory")return;const d=bn(s.DirectoryPath),u={...i.metadata??{},DirectoryPath:d,Include:s.Include??"",Exclude:s.Exclude??""};K(a,{sourceFilePath:d||Br,metadata:u}),qt(null),f.emit("node.directorySettings.patch",{id:a,keys:["DirectoryPath","Include","Exclude"]}),j("Folder scan settings saved.")},[K,j]),iu=g.useCallback(async a=>{const s=v.current.nodes.find(u=>u.id===a);if(!s||s.kind!=="directory")return;const i=Jh(s);if(f.emit("node.directory.scan.requested",{id:a,hasBridgePath:!!i,hasHandle:vn.current.has(a)}),i){if(!bt()){ce("blocked"),f.emit("node.directory.scan.bridge.blocked",{id:a,reason:"hosted-access-off"}),j("Hosted LocalBridge access is off.");return}try{const u=await Na();if(we(u.status??null),ce(u.state),u.state!=="connected"){f.emit("node.directory.scan.bridge.unavailable",{id:a,message:u.message||"LocalBridge is unavailable."}),j(u.message||"LocalBridge is unavailable.");return}const h=Jn(u.status);if(!h){ce("unavailable"),f.emit("node.directory.scan.bridge.failed",{id:a,reason:"missing-token"}),j("LocalBridge read token is unavailable.");return}const C=Zo(i,48);j(`Scanning ${C}...`),f.emit("node.directory.scan.bridge.requested",{id:a,path:i});const S=await Qh(i,s.metadata,h,u.baseUrl),M=new Date().toISOString();K(a,{title:s.title==="Directory"||s.title==="New Folder"?C:s.title,body:Zd(C,S),sourceFilePath:i,metadata:{...s.metadata??{},DirectoryPath:i,DirectoryName:C,DirectoryScanSource:"localbridge",DirectoryFileCount:String(S.fileCount),DirectoryDirCount:String(S.directoryCount),DirectoryLastScanUtc:M,DirectoryScanTruncated:String(S.truncated),DirectoryPreview:JSON.stringify(S.preview.slice(0,fn))}}),f.emit("node.directory.scan.bridge.completed",{id:a,path:i,fileCount:S.fileCount,directoryCount:S.directoryCount,truncated:S.truncated}),f.emit("node.directory.scan.completed",{id:a,source:"localbridge",directoryName:C,fileCount:S.fileCount,directoryCount:S.directoryCount,truncated:S.truncated}),j(`Scanned ${C}: ${S.fileCount} files, ${S.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}),j("LocalBridge folder scan failed.")}return}const d=window;if(!d.showDirectoryPicker){f.emit("node.directory.scan.unsupported",{id:a}),j("Folder scan needs a Chromium browser with File System Access enabled.");return}try{let u=vn.current.get(a);u||(u=await d.showDirectoryPicker(),vn.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}),j("Folder permission was not granted.");return}j(`Scanning ${u.name}...`);const M=await Kh(u,s.metadata),k=new Date().toISOString();K(a,{title:s.title==="Directory"||s.title==="New Folder"?u.name:s.title,body:Zd(u.name,M),sourceFilePath:u.name,metadata:{...s.metadata??{},DirectoryName:u.name,DirectoryScanSource:"browser-picker",DirectoryFileCount:String(M.fileCount),DirectoryDirCount:String(M.directoryCount),DirectoryLastScanUtc:k,DirectoryScanTruncated:String(M.truncated),DirectoryPreview:JSON.stringify(M.preview.slice(0,fn))}}),f.emit("node.directory.scan.completed",{id:a,source:"browser-picker",directoryName:u.name,fileCount:M.fileCount,directoryCount:M.directoryCount,truncated:M.truncated}),j(`Scanned ${u.name}: ${M.fileCount} files, ${M.directoryCount} folders.`)}catch(u){if((u&&typeof u=="object"&&"name"in u?String(u.name):"")==="AbortError"){f.emit("node.directory.scan.cancelled",{id:a}),j("Folder scan cancelled.");return}f.emit("node.directory.scan.failed",{id:a,message:u instanceof Error?u.message:String(u)}),j("Folder scan failed in this browser context.")}},[K,j]),Si=g.useCallback(a=>{wn(a.id),$a(Qe(a.name))},[]),Ps=g.useCallback(()=>{wn(null),$a("")},[]),_s=g.useCallback(a=>{const s=Qe(ua).slice(0,90);a===v.current.id?(As(s),j("Board renamed.")):em(a,s)?(We(ft()),j("Saved board renamed.")):(f.emit("board.rename.failed",{boardId:a,scope:"stored"}),j("Board rename failed.")),wn(null),$a("")},[As,j,ua]),du=g.useCallback((a,s)=>{s.key==="Enter"?(s.preventDefault(),_s(a)):s.key==="Escape"&&(s.preventDefault(),Ps())},[Ps,_s]),lu=g.useCallback(a=>{const s=v.current.nodes.find(d=>d.id===a);if(!ao(s))return;const i=s.aiEnabled===!1;K(a,{aiEnabled:i}),f.emit("node.aiReference.toggled",{id:a,enabled:i}),j(i?"AI reference enabled.":"AI reference disabled.")},[K,j]),Ro=g.useCallback(async(a,s,i,d,u)=>{P.current=a;try{const h=await ro(a);return ne.current=0,f.emit(s,{...i,ok:!0,method:h}),j(d),h}catch(h){return ne.current=Date.now()+15e3,f.emit(s,{...i,ok:!0,method:"react-local",clipboardUnavailable:!0,message:h instanceof Error?h.message:String(h)}),j(u),"react-local"}},[j]),cu=g.useCallback(async a=>{const s=v.current.nodes.find(d=>d.id===a);if(!s)return;const i=uf(s);if(i)try{const d=await mf(i);f.emit("node.copyImage",{id:a,ok:!0,mode:d,urlKind:i.split(":",1)[0]||"relative"}),j(d==="image"?"Image copied to clipboard.":"Image reference copied.");return}catch(d){P.current=i,ne.current=Date.now()+15e3,f.emit("node.copyImage",{id:a,ok:!0,mode:"react-local",urlKind:i.split(":",1)[0]||"relative",clipboardUnavailable:!0,message:d instanceof Error?d.message:String(d)}),j("Image reference copied inside this canvas.");return}await Ro(cf(s),"node.copy",{id:a},"Node content copied.","Node content copied inside this canvas.")},[Ro,j]),uu=g.useCallback(async(a,s)=>{await Ro(s,"node.embed.copyUrl",{id:a,sourceKind:s.split(":",1)[0]||"relative"},"Embed URL copied.","Embed URL copied inside this canvas.")},[Ro]),mu=g.useCallback(a=>{const s=v.current.nodes.find(d=>d.id===a);if(!ao(s))return;const i=ur(s);K(a,{height:i}),f.emit("node.fitHeight",{id:a,height:i}),j("Node height fitted to text.")},[K,j]),pu=g.useCallback(a=>{const s=v.current.nodes.find(C=>C.id===a);if(!ao(s))return;const i=rf(s),d=i?Math.max(120,Math.round(s.originalHeight||ur(s))):Math.max(120,Math.min(s.height,$h)),u=i?0:Math.round(s.height),h=i;B(C=>({...C,nodes:C.nodes.map(S=>S.id===a?{...S,height:d,isExpanded:h,originalHeight:u}:S)}),"node.expandCollapse",{id:a,expanded:h,height:d,originalHeight:u}),j(h?"Node expanded.":"Node collapsed.")},[B,j]),gu=g.useCallback(a=>{const s=v.current.nodes.find(d=>d.id===a);if(!s||s.kind!=="code")return;const i=s.wordWrap===!1;K(a,{wordWrap:i}),f.emit("node.wordWrap.toggled",{id:a,enabled:i}),j(i?"Word wrap enabled.":"Word wrap disabled.")},[K,j]),hu=g.useCallback((a,s)=>{const i=v.current.nodes.find(h=>h.id===a);if(!ao(i))return;const d=nf(s.executionMode),u=Array.from(new Set([...i.tags??[],"Company root",d,s.enableSubAgents?"sub-agents":"single-agent","adapter-gated"]));K(a,{companyMode:"candidate",role:"Company root",tags:u,metadata:{...i.metadata??{},CompanyExecutionMode:s.executionMode,CompanyExecutionModeLabel:d,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}),j(`Company root staged locally as ${d}. Open CompanyCore to run it with an adapter later.`)},[K,j]),fu=g.useCallback(a=>{var i;const s=v.current.nodes.find(d=>d.id===a);if(!(s!=null&&s.companyMode)){j("Stage this node as a Company root first.");return}Et(a),f.emit("companyGraph.open",{id:a,status:((i=s.metadata)==null?void 0:i.CompanyStatus)??"Staged"})},[j]),bu=g.useCallback(a=>{const s=v.current.nodes.find(i=>i.id===a);s!=null&&s.companyMode&&(K(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}),j("Company goal synced from this note locally."))},[K,j]),yu=g.useCallback(a=>{var d;const s=v.current.nodes.find(u=>u.id===a);if(!(s!=null&&s.companyMode))return;const i=((d=s.metadata)==null?void 0:d.CompanyStatus)||"Staged";K(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}),j(`Company status refreshed locally: ${i}.`)},[K,j]),xu=g.useCallback(()=>{Et(a=>(a&&f.emit("companyGraph.close",{id:a}),null))},[]),ki=g.useCallback((a,s)=>{const i=v.current.nodes.find(d=>d.id===a);i!=null&&i.companyMode&&(K(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}),j(`Company marked ${s.toLowerCase()} locally.`))},[K,j]),wi=g.useCallback(a=>{var d;const s=v.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",((d=s.metadata)==null?void 0:d.CompanyExecutionModeLabel)??""]);K(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()}}),Et(null),f.emit("companyGraph.remove",{id:a}),j("Company staging removed from this node.")},[K,j]),Cu=g.useCallback((a,s)=>{const i=v.current.nodes.find(d=>d.id===a);i!=null&&i.companyMode&&(K(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}),j(`Company approval ${s.toLowerCase()} locally.`))},[K,j]),Su=g.useCallback((a,s)=>{const i=s.trim();if(!i)return;const d=H("node"),u=H("edge");B(h=>{var M,k;const C=h.nodes.find(A=>A.id===a);if(!C)return h;const S={id:d,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",((M=C.metadata)==null?void 0:M.CompanyExecutionModeLabel)??"Company"],metadata:{CompanyRootNodeId:C.id,CompanyExecutionMode:((k=C.metadata)==null?void 0:k.CompanyExecutionMode)??"Auto",CompanyTaskStatus:"Staged",CompanyStagedAt:new Date().toISOString()}};return{...h,nodes:[...h.nodes,S],edges:[...h.edges,{id:u,from:C.id,to:d,kind:"context"}]}},"companyGraph.followUp.staged",{rootId:a,taskId:d,chars:i.length}),y([d]),F(d),window.setTimeout(()=>F(h=>h===d?null:h),1400),j("Company follow-up task staged locally.")},[B,j]),ku=g.useCallback((a,s)=>{const i=H("node"),d=H("edge");B(u=>{const h=u.nodes.find(S=>S.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:d,from:h.id,to:i,kind:"result"}]}},"companyGraph.artifact.added",{rootId:a,artifactNodeId:i,artifactType:s.type}),y([i]),F(i),window.setTimeout(()=>F(u=>u===i?null:u),1400),j("Company artifact added to the canvas.")},[B,j]),wu=g.useCallback((a,s="preview")=>{const i=df(a);if(!i){j("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"){Me({url:i,fileName:lf(a)}),f.emit("node.pdf.preview.open",{id:a.id,urlKind:i.startsWith("http")?"url":"path"});return}if(a.kind==="embed"&&!yn(i)){j("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})},[j]),vu=g.useCallback(a=>{const s=Y.current;B(i=>({...i,nodes:i.nodes.filter(d=>d.id!==a),edges:i.edges.filter(d=>d.from!==a&&d.to!==a)}),"node.delete",{id:a}),y(i=>{const d=i.filter(u=>u!==a);return f.emit("selection.repaired",{reason:"delete-node",beforeCount:s.length,afterCount:d.length,removedCount:i.length-d.length}),d}),se(i=>i===a?null:i)},[B]),Ds=g.useCallback(a=>{const s=Array.from(new Set(Y.current));if(s.length===0)return;const i=new Set(s);B(d=>({...d,nodes:d.nodes.filter(u=>!i.has(u.id)),edges:d.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}),se(d=>d&&i.has(d)?null:d),Et(d=>d&&i.has(d)?null:d),qt(d=>d&&i.has(d)?null:d),j(`Deleted ${s.length} selected node${s.length===1?"":"s"}.`)},[B,j]),Lo=g.useCallback((a,s)=>{var E;const i=Array.from(new Set(a));if(i.length===0)return;const d=v.current,u=new Set(i),h=d.nodes.filter(N=>u.has(N.id));if(h.length===0)return;const C=h.filter(Ma),S=h.filter(N=>!Ma(N));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}),S.length===0){const N=C[0]??d.nodes.find(Ma);N&&(y([N.id]),F(N.id),window.setTimeout(()=>F(T=>T===N.id?null:T),1e3)),j("Remote monitor is single-instance per board. Focused existing monitor.");return}const M=new Map(S.map(N=>[N.id,H("node")])),k=S.map(N=>({...N,id:M.get(N.id),x:N.x+50,y:N.y-50,status:N.status==="running"?"idle":N.status,metadata:N.metadata?{...N.metadata}:void 0,tags:N.tags?[...N.tags]:void 0,imageStack:$r(N.imageStack,N.id,M.get(N.id))})),A=d.edges.filter(N=>M.has(N.from)&&M.has(N.to)).map(N=>({...N,id:H("edge"),from:M.get(N.from),to:M.get(N.to)}));B(N=>({...N,nodes:[...N.nodes,...k],edges:[...N.edges,...A]}),"node.duplicate",{source:s,count:k.length,edgeCount:A.length,sourceIds:i,duplicateIds:k.map(N=>N.id),skippedRemoteMonitorCount:C.length});const _=k.map(N=>N.id);y(_),F(_[0]??null),window.setTimeout(()=>F(N=>N===_[0]?null:N),1e3),j(C.length>0?`Duplicated ${k.length} node${k.length===1?"":"s"}; remote monitor stays single-instance.`:`Duplicated ${k.length} node${k.length===1?"":"s"}.`)},[B,j]),Bs=g.useCallback(a=>{Lo(Y.current,a)},[Lo]),zn=g.useCallback((a,s)=>{const i=Array.from(new Set(Y.current));if(i.length===0)return;const d=new Set(i),u=v.current.nodes,h=u.filter(k=>d.has(k.id));if(h.length===0)return;const C=u.filter(k=>!d.has(k.id)),S=a==="front"?[...C,...h]:[...h,...C];if(!S.some((k,A)=>{var _;return k.id!==((_=u[A])==null?void 0:_.id)})){j(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}B(k=>({...k,nodes:S}),"node.layerOrder",{direction:a,source:s,count:h.length,ids:i}),j(a==="front"?`Brought ${i.length} selected node${i.length===1?"":"s"} to front.`:`Sent ${i.length} selected node${i.length===1?"":"s"} to back.`)},[B,j]),Os=g.useCallback(async()=>{const a=new Set(Y.current),s=v.current.nodes.filter(u=>a.has(u.id));if(s.length===0)return;const i=v.current.edges.filter(u=>a.has(u.from)&&a.has(u.to)),d=Sf(s,i);Sa.current=d;try{const u=await ro(JSON.stringify(d));x.current=0,f.emit("multiSelection.copy",{count:s.length,edgeCount:i.length,ok:!0,method:u}),j(`Copied ${s.length} selected node${s.length===1?"":"s"} for canvas paste.`)}catch(u){x.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)}),j(`Copied ${s.length} selected node${s.length===1?"":"s"} inside this canvas.`)}},[j]),wa=g.useCallback((a,s,i)=>{const d=v.current.nodes.find(Ma),u=[],h=[];let C=!!d;for(const R of a.nodes){if(Ma(R)){if(C){u.push(R);continue}C=!0}h.push(R)}if(u.length>0&&f.emit("remoteMonitor.node.duplicateIgnored",{action:i,skippedCount:u.length,nodeId:d==null?void 0:d.id}),h.length===0){d&&(y([d.id]),F(d.id),window.setTimeout(()=>F(R=>R===d.id?null:R),1e3)),j("Remote monitor is single-instance per board. Focused existing monitor.");return}const S=is(h);if(!S)return;const M=new Map(h.map(R=>[R.id,H("node")])),k=s.x-S.minX,A=s.y-S.minY,_=h.map(R=>({...R,id:M.get(R.id),x:R.x+k,y:R.y+A,status:R.status==="running"?"idle":R.status,tags:R.tags?[...R.tags]:void 0,metadata:R.metadata?{...R.metadata}:void 0,imageStack:$r(R.imageStack,R.id,M.get(R.id))})),E=a.edges.filter(R=>M.has(R.from)&&M.has(R.to)).map(R=>({...R,id:H("edge"),from:M.get(R.from),to:M.get(R.to)})),N=_.map(R=>R.id);B(R=>({...R,nodes:[...R.nodes,..._],edges:[...R.edges,...E]}),"clipboard.nodes.paste",{source:i,count:_.length,edgeCount:E.length,originX:Math.round(s.x),originY:Math.round(s.y),skippedRemoteMonitorCount:u.length}),y(N),se(null),F(N[0]??null);const T=_[_.length-1];T&&Ce(T,`clipboard.nodes.${i}`),window.setTimeout(()=>F(R=>R===N[0]?null:R),1200),j(u.length>0?`Pasted ${_.length} canvas node${_.length===1?"":"s"}; remote monitor stays single-instance.`:`Pasted ${_.length} canvas node${_.length===1?"":"s"}.`)},[B,Ce,j]),Un=g.useCallback((a,s,i)=>{const d=a.trim();if(!d)return;const u=rl(d,s,`${i}-url`),h=u??il(d,s,i);B(C=>({...C,nodes:[...C.nodes,h]}),u?"clipboard.url.paste":"clipboard.text.paste",{source:i,id:h.id,kind:h.kind,chars:d.length}),y([h.id]),se(null),F(h.id),Ce(h,`clipboard.${i}.${h.kind}`),window.setTimeout(()=>F(C=>C===h.id?null:C),1200),j(`${i==="drop"?"Dropped":"Pasted"} ${h.kind==="file"?"URL reference":h.kind} node.`)},[B,Ce,j]),Eo=g.useCallback(async(a,s,i)=>{const d=a.filter(h=>h.name||h.size>0);if(d.length===0)return;const u=v.current.id;try{const h=[];let C=s.x;for(const k of d){const A=await $f(k,{x:C,y:s.y},i);h.push(A),C+=A.width+Ko}if(v.current.id!==u){f.emit("async.staleIgnored",{path:"canvas.fileIngest",source:i,boardId:u,currentBoardId:v.current.id,count:d.length});return}const S=h.map(k=>k.id);B(k=>({...k,nodes:[...k.nodes,...h]}),"canvas.files.ingested",{source:i,count:h.length,kinds:h.map(k=>k.kind)}),y(S),se(null),F(S[0]??null);const M=h[h.length-1];M&&Ce(M,`canvas.files.${i}`),window.setTimeout(()=>F(k=>k===S[0]?null:k),1200),j(`${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)}),j("File ingest failed in this browser context.")}},[B,Ce,j]);g.useEffect(()=>{const a=s=>{if(s.defaultPrevented||xl(s.target))return;const i=s.clipboardData;if(!i)return;const d=ve(),u=pl(i.files,i.items);if(u.length>0){s.preventDefault(),Eo(u,d,"paste");return}const h=x.current>Date.now()?Sa.current:null;if(h){s.preventDefault(),wa(h,d,"paste"),f.emit("clipboard.nodes.pasteLocalFallback",{count:h.nodes.length});return}const C=ne.current>Date.now()?P.current:null;if(C){s.preventDefault(),Un(C,d,"paste"),f.emit("clipboard.text.pasteLocalFallback",{chars:C.length}),ne.current=0;return}const S=i.getData("text/plain"),M=sl(S);if(M){s.preventDefault(),wa(M,d,"paste");return}const k=S.trim()?S:dl(i.getData("text/html"));k.trim()&&(s.preventDefault(),Un(k,d,"paste"))};return document.addEventListener("paste",a),()=>document.removeEventListener("paste",a)},[ve,Eo,Un,wa]);const ju=g.useCallback(a=>{hr(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")},[]),Iu=g.useCallback(a=>{if(hr(a.target))return;const s=pl(a.dataTransfer.files,a.dataTransfer.items),i=a.dataTransfer.getData("text/uri-list"),d=a.dataTransfer.getData("text/plain"),u=dl(a.dataTransfer.getData("text/html")),h=ve(a.clientX,a.clientY);if(s.length>0){a.preventDefault(),Eo(s,h,"drop");return}const C=(i||d||u).trim(),S=sl(d);if(S){a.preventDefault(),wa(S,h,"drop");return}C&&(a.preventDefault(),Un(C,h,"drop"))},[ve,Eo,Un,wa]),Nu=g.useCallback(()=>{const a=new Set(Y.current),s=new Set(v.current.nodes.filter(i=>a.has(i.id)&&ao(i)).map(i=>i.id));if(s.size===0){j("No text nodes in this selection.");return}B(i=>({...i,nodes:i.nodes.map(d=>s.has(d.id)?{...d,height:ur(d)}:d)}),"multiSelection.fitHeight",{count:s.size}),f.emit("multiSelection.fitHeight",{count:s.size}),j(`Fitted ${s.size} text node${s.size===1?"":"s"}.`)},[B,j]),Fs=g.useCallback(a=>{const s=new Set(Y.current),i=v.current.nodes.filter(E=>s.has(E.id)).sort((E,N)=>Y.current.indexOf(E.id)-Y.current.indexOf(N.id));if(i.length<2)return;const d=is(i);if(!d)return;const u=a==="tidy"?Wf(i):i,h=28,C=Math.max(...u.map(E=>E.width)),S=Math.max(...u.map(E=>E.height)),M=u.map((E,N)=>({id:E.id,x:E.x,y:E.y,width:E.width,height:E.height,selectionIndex:N})),k=v.current.settings.gridSnap??!0;let A;a==="grid"?A={mode:"grid",order:"selectionOrder",columns:Math.max(2,Math.ceil(Math.sqrt(u.length))),cellWidth:C,cellHeight:S,gapX:h,gapY:h,sizeMode:"preserve",snapToGrid:k,gridSize:Ht}:a==="strip"?A={mode:"stripHorizontal",order:"selectionOrder",targetHeight:S,gapX:h,sizeMode:"preserve",snapToGrid:k,gridSize:Ht}:A={mode:"masonry",order:"spatialReading",anchor:"selectionBoundsTopLeft",maxColumns:12,gapX:24,gapY:24,quantile:.75,sizeMode:"preserve",snapToGrid:k,gridSize:Ht};const _=Xp(M,A,d);B(E=>({...E,nodes:E.nodes.map(N=>{const T=_.after.get(N.id);return T?{...N,x:T.x,y:T.y,width:T.width,height:T.height}:N})}),"multiSelection.arrange",{mode:a,count:i.length,layoutMode:A.mode,snapToGrid:k}),f.emit("multiSelection.arrange",{mode:a,count:i.length,layoutMode:A.mode,snapToGrid:k,boundsAfter:_.boundsAfter}),j(a==="tidy"?`Tidied ${i.length} selected nodes.`:`Arranged ${i.length} selected nodes as ${a}.`)},[B,j]),Au=g.useCallback(()=>{const a=Array.from(new Set(Y.current)),s=v.current,i=new Map(s.nodes.map(T=>[T.id,T])),d=a.map(T=>i.get(T)).filter(T=>!!(T&&T.kind==="image"&&lo(T).length>0));if(d.length<2){j("Select at least two image nodes to stack."),f.emit("multiSelection.mergeImageStacks.skipped",{reason:"not-enough-image-nodes",selectedCount:a.length});return}const u=d[0],h=d.slice(1),C=new Date().toISOString(),S=new Set,M=lo(u),k=[];for(const T of M)k.push(al(T,u,S,C));for(const T of h)for(const R of lo(T))k.push(al(R,T,S,C));if(k.length<2){j("No stackable image variants found."),f.emit("multiSelection.mergeImageStacks.skipped",{reason:"not-enough-variants",selectedCount:a.length});return}const A=k.some(T=>{var R;return T.variantId===((R=u.imageStack)==null?void 0:R.activeVariantId)})?u.imageStack.activeVariantId:k[0].variantId,_=k.find(T=>T.variantId===A)??k[0],E=h.map(T=>T.id),N=new Set(E);B(T=>({...T,nodes:T.nodes.filter(R=>!N.has(R.id)).map(R=>{var Q;return R.id===u.id?{...R,kind:"image",imageUrl:_.imageUrl,imageStack:{activeVariantId:A,variants:k,kind:"pile",title:((Q=R.imageStack)==null?void 0:Q.title)||R.title,updatedAtUtc:C},metadata:{...R.metadata??{},ImageStackKind:"pile",ImageStackPrimaryNodeId:u.id,ImageStackVariantCount:String(k.length),ImageStackMergedAtUtc:C,ImageStackRemovedNodeIds:E.join(","),ImageStackActiveVariantId:A},tags:Array.from(new Set([...R.tags??["image"],"Stack"])).slice(0,4)}:R}),edges:T.edges.filter(R=>!N.has(R.from)&&!N.has(R.to))}),"multiSelection.mergeImageStacks",{primaryNodeId:u.id,removedNodeIds:E,addedVariants:k.length-M.length,variantCount:k.length}),y([u.id]),se(T=>T&&N.has(T)?null:T),Et(T=>T&&N.has(T)?null:T),qt(T=>T&&N.has(T)?null:T),F(u.id),window.setTimeout(()=>F(T=>T===u.id?null:T),1200),j(`Stacked ${d.length} image nodes into ${k.length} variants.`)},[B,j]),Mu=g.useCallback(a=>{const s=Y.current.includes(a)?Y.current:[a];Lo(s,"node-action")},[Lo]),ta=g.useCallback(async(a,s)=>{const i=Pn.current.isBusy(a);return i&&f.emit("automation.run.queued",{id:a,key:a}),Pn.current.enqueue(a,async()=>{var A,_,E;const d=v.current.nodes.find(N=>N.id===a);if(!d||d.kind!=="ai-task")return;f.emit("automation.run.dequeued",{id:a,key:a,queuedBehindRunning:i});const u=(Ga.current.get(a)??0)+1;Ga.current.set(a,u);const h=xa.current,C=(s==null?void 0:s.trim())||d.body,S=ri(si(d));K(a,{status:"running",body:C,...rn(d)?{metadata:no(d,{instruction:C,runState:"running",status:"running",statusLabel:"Running",sourceMode:S?"media-prompt-only":"ai-task"})}:{}}),f.emit("automation.run",{id:a,mode:"single",seq:u,automationKind:S==null?void 0:S.kind});const M=()=>Ga.current.get(a)===u&&xa.current===h,k=N=>{if(!M()){f.emit("async.staleIgnored",{path:"automation.run",id:a,seq:u});return}f.emit("localBridge.codex.fallback",{id:a,reason:N});const T=tb(C,d);K(a,{status:"done",result:T,...rn(d)?{metadata:no(d,{instruction:C,output:T,runState:"completed",status:S?"prepared":"done",statusLabel:S?"Spec only":"Done",sourceMode:S?"media-prompt-only":"local-draft",error:S?`External ${S.mode.toLowerCase()} generation was not executed.`:"",fallback:!0,partial:!!S,toolsUsed:S?`${S.toolHint}, Deterministic.Fallback, HumanReview.Gate`:"Deterministic.Fallback",toolWarnings:S?`External ${S.mode.toLowerCase()} generator was not invoked; this run prepared a spec only.`:""})}:{}}),se(a)};if(!bt()){k("hosted-access-gated");return}try{const N=await Na();if(!M()){f.emit("async.staleIgnored",{path:"automation.run",id:a,seq:u});return}if(ce(N.state),we(N.status??null),N.state!=="connected"){ye(N.message||"LocalBridge is unavailable."),k(N.message||"LocalBridge unavailable");return}const T=Jn(N.status);if(!T){k("LocalBridge token unavailable");return}const R=bl(v.current,d,C);f.emit("localBridge.codex.run",{id:a,boardId:v.current.id});const Q=await Cm({instruction:R,workingDirectory:((_=(A=N.status)==null?void 0:A.project)==null?void 0:_.rootPath)||((E=N.status)==null?void 0:E.workspace)||void 0,sandbox:"read_only",model:oo(v.current.settings.model),reasoningEffort:Jf(v.current.settings.effort),approvalPolicy:"on-request",intent:"mindcanvas-ai-task",nodeKind:d.kind,webSearchMode:"disabled",networkAccessEnabled:!1},T,N.baseUrl);if(!M()){f.emit("async.staleIgnored",{path:"automation.run",id:a,seq:u});return}if(!Q.success||!Q.finalResponse){const Ne=Q.error||"LocalBridge Codex returned no response.";f.emit("localBridge.codex.failed",{id:a,message:Ne,status:Q.status}),K(a,{status:"blocked",result:Ne,...rn(d)?{metadata:no(d,{instruction:C,output:Ne,runState:"blocked",status:"blocked",statusLabel:"Blocked",sourceMode:S?"media-prompt-only":"ai-task",error:Ne,fallback:!1,partial:!0})}:{}}),se(a);return}K(a,{status:"done",result:Q.finalResponse,...rn(d)?{metadata:no(d,{instruction:C,output:Q.finalResponse,runState:"completed",status:S?"prepared":"done",statusLabel:S?"Spec only":"Done",sourceMode:S?"media-prompt-only":"ai-generated",error:S?`External ${S.mode.toLowerCase()} generation was not executed.`:"",fallback:!1,partial:!!S,toolsUsed:S?`AI.LLM, ${S.toolHint}, HumanReview.Gate`:"AI.LLM",toolWarnings:S?`External ${S.mode.toLowerCase()} generator was not invoked; this run prepared a spec only.`:""})}:{}}),f.emit("localBridge.codex.completed",{id:a,providerKind:Q.providerKind,threadId:Q.threadId,turnId:Q.turnId}),se(a)}catch(N){if(!M()){f.emit("async.staleIgnored",{path:"automation.run",id:a,seq:u});return}const T=N instanceof Error?N.message:String(N);f.emit("localBridge.codex.failed",{id:a,message:T}),K(a,{status:"blocked",result:T,...rn(d)?{metadata:no(d,{instruction:C,output:T,runState:"blocked",status:"blocked",statusLabel:"Blocked",sourceMode:S?"media-prompt-only":"ai-task",error:T,fallback:!1,partial:!0})}:{}}),se(a)}})},[K]),vi=g.useCallback(async()=>{const a=Y.current[0];if(!a){j("Select an AI Task to run its graph.");return}const s=Ur(v.current,a);if(s.length===0){j("Select an AI Task to run its graph.");return}const i=s.filter(d=>d.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(d=>d.id)}),i.length===0){j("The selected AI Task graph is already running.");return}j(`Running selected graph: ${i.length} AI task${i.length===1?"":"s"}.`);for(const d of i)await ta(d.id)},[ta,j]),Tu=g.useCallback(async a=>{if(a.result)try{const s=await ro(a.result);f.emit("aiTask.result.copy",{id:a.id,chars:a.result.length,ok:!0,method:s}),j("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)}),j("AI result copy unavailable in this browser context.")}},[j]),Ru=g.useCallback(a=>{if(!a.result)return;const s=ab(a,{x:a.x+a.width+78,y:a.y}),i={id:H("edge"),from:a.id,to:s.id,kind:"result"};B(d=>d.nodes.some(h=>h.id===a.id&&h.result)?{...d,nodes:[...d.nodes,s],edges:[...d.edges,i]}:d,"aiTask.result.note.create",{sourceNodeId:a.id,createdNodeId:s.id,chars:a.result.length,truncated:a.result.length>Dr}),y([s.id]),se(null),F(s.id),window.setTimeout(()=>F(d=>d===s.id?null:d),1200),j("AI result archived as a Markdown node.")},[B,j]),Lu=g.useCallback(a=>{if(!a.result)return;const s=nb(a,{x:a.x+a.width+78,y:a.y+Math.min(a.height+44,360)}),i={id:H("edge"),from:a.id,to:s.id,kind:"result"};B(d=>d.nodes.some(h=>h.id===a.id&&h.result)?{...d,nodes:[...d.nodes,s],edges:[...d.edges,i]}:d,"aiTask.result.followUp.create",{sourceNodeId:a.id,createdNodeId:s.id,chars:a.result.length}),y([s.id]),se(null),F(s.id),window.setTimeout(()=>F(d=>d===s.id?null:d),1200),j("Follow-up AI Task staged from the result.")},[B,j]),ji=g.useCallback(()=>{var Xn,oa,ad,nd,od,sd,rd;const a=w.trim(),s=v.current.settings.inputMode,i=[...Y.current],d=v.current.nodes.find(ue=>ue.id===i[0]),u=(d==null?void 0:d.kind)==="ai-task"?(a||d.body).trim():a;if(!u)return;const h=u.replace(/\s+/g," ").trim().toLowerCase(),C=window.location.pathname||"/mindcanvas",S=`${C}|${s}|${h}`,M=Date.now(),k=_n.current;if((k==null?void 0:k.signature)===S&&M-k.at<=Vd){f.emit("globalInput.duplicateIgnored",{routePath:C,inputMode:s,chars:u.length,windowMs:Vd});return}_n.current={signature:S,at:M};const A={routePath:C,inputMode:s,selectedNodeIds:i,chars:u.length};f.emit("globalInput.submit.snapshot",{...A,source:(d==null?void 0:d.kind)==="ai-task"?"selected-ai-task":"input",hasTypedPrompt:a.length>0}),(d==null?void 0:d.kind)==="ai-task"&&L(""),$(ue=>ue+1),f.emit("globalInput.submit.started",A);const _=ue=>{$(Mt=>Math.max(0,Mt-1)),f.emit("globalInput.submit.completed",{...A,status:ue})};if((d==null?void 0:d.kind)==="ai-task"){ta(d.id,a).then(()=>_("ai-task")).catch(ue=>{f.emit("globalInput.submit.completed",{...A,status:"ai-task-error",message:ue instanceof Error?ue.message:String(ue)}),$(Mt=>Math.max(0,Mt-1))});return}const E=ve(void 0,void 0,{width:360,height:196}),N=rl(u,E,"global-input-url"),T=N?null:oi(u),R=!!(T&&/^https?:\/\//i.test(T)&&!yn(T)),Q=!N&&!R&&(s==="Image"||s==="Video")?s:null,Ne=N??(R?il(u,E,"global-input-rejected-url"):null)??(Q?_f(u,E,v.current.settings,Q):Pf(u,E,v.current.settings)),Yn=ve(void 0,void 0,{width:Ne.width,height:Ne.height}),Z={...Ne,x:Yn.x,y:Yn.y},Qa=Z.kind==="ai-task",Ia=N?"globalInput.url.add":R?"globalInput.rejectedUrl.add":Q?"globalInput.media.add":"globalInput.aiTask.add",Fo={id:Z.id,kind:Z.kind,chars:u.length,inputMode:s,...Qa?{model:(Xn=Z.metadata)==null?void 0:Xn.TextModel,provider:(oa=Z.metadata)==null?void 0:oa.AiProvider,effort:(ad=Z.metadata)==null?void 0:ad.Effort}:{},...Q?{mediaMode:Q,mediaModel:(nd=Z.metadata)==null?void 0:nd.MediaModel,aspectPresetId:(od=Z.metadata)==null?void 0:od.AspectPresetId,requestedSize:(sd=Z.metadata)==null?void 0:sd.RequestedSize}:{}};if(Qa){const ue=v.current,Mt={...ue,nodes:ue.nodes.some(Vs=>Vs.id===Z.id)?ue.nodes:[...ue.nodes,Z],updatedAt:new Date().toISOString()};m(Vs=>Aa(Vs,ue,{description:Ia,mergeKey:null})),b([]),v.current=Mt,f.emit(Ia,Fo),r(Mt)}else B(ue=>({...ue,nodes:ue.nodes.some(Mt=>Mt.id===Z.id)?ue.nodes:[...ue.nodes,Z]}),Ia,Fo);if(L(""),y([Z.id]),se(null),F(Z.id),Ce(Z,Ia),window.setTimeout(()=>F(ue=>ue===Z.id?null:ue),1200),Qa){f.emit("globalInput.aiTask.runRequested",{id:Z.id,chars:u.length,model:(rd=Z.metadata)==null?void 0:rd.TextModel}),j("AI task created from input and running."),ta(Z.id,u).then(()=>_("ai-task-created")).catch(ue=>{f.emit("globalInput.submit.completed",{...A,status:"ai-task-created-error",message:ue instanceof Error?ue.message:String(ue)}),$(Mt=>Math.max(0,Mt-1))});return}j(`Added ${Z.kind==="file"?"URL reference":Z.kind} node from input.`),_(N?"url-node":R?"rejected-url-node":Q?"media-node":"text-node")},[B,ve,w,Ce,ta,j]),Ii=g.useCallback(async()=>{const a=sb(v.current),s=a.flat(),i=a.map(u=>u.filter(h=>h.status!=="running")).filter(u=>u.length>0),d=i.flat();if(f.emit("automation.run",{mode:"all",count:d.length,graphCount:i.length,skippedRunning:s.length-d.length,order:d.map(u=>u.id)}),d.length===0){j(s.length>0?"All AI task graphs are already running.":"No AI tasks on this board.");return}j(`Running ${i.length} graph${i.length===1?"":"s"} / ${d.length} AI task${d.length===1?"":"s"}.`);for(const u of i)for(const h of u)await ta(h.id)},[ta,j]),Ni=g.useCallback(()=>{const a=v.current.nodes.filter(s=>s.kind==="ai-task"&&s.status==="running");if(a.length===0){j("No running AI tasks to pause."),f.emit("automation.pause",{count:0});return}xa.current+=1,B(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}),j(`Paused ${a.length} running task${a.length===1?"":"s"}.`)},[B,j]),Ai=g.useCallback(()=>{const a=v.current.nodes.filter(s=>s.kind==="ai-task"&&(s.status==="running"||s.status==="paused"));if(a.length===0){j("No active AI tasks to stop."),f.emit("automation.stop",{count:0});return}xa.current+=1,B(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}),se(null),j(`Stopped ${a.length} active task${a.length===1?"":"s"}.`)},[B,j]),Mi=g.useCallback(()=>{const a=v.current.nodes.find(C=>C.id===Y.current[0]);if(!a)return;const s=a.x+a.width+80,i=a.y,d={id:H("node"),kind:"ai-task",title:"Research demand",body:`Find buyer pain and proof for: ${a.title}`,x:s,y:i,width:330,height:188,status:"idle",tags:["AI Task","Research"]},u={...d,id:H("node"),title:"Write offer",body:"Turn the research into a one-sentence USD offer and a first landing-page promise.",x:s+390,tags:["AI Task","Offer"]},h=[{id:H("edge"),from:a.id,to:d.id,kind:"context"},{id:H("edge"),from:d.id,to:u.id,kind:"result"}];B(C=>({...C,nodes:[...C.nodes,d,u],edges:[...C.edges,...h]}),"node.add",{reason:"generate-flow",count:2}),y([d.id,u.id])},[B]),Eu=g.useCallback((a,s)=>{if(he&&he.from!==a){const i={id:H("edge"),from:he.from,to:a,kind:he.kind==="context"?"context":s};B(d=>({...d,edges:[...d.edges,i]}),"edge.add",{...i}),J(null);return}J({from:a,kind:s})},[B,he]),Po=g.useCallback(()=>{m(a=>{const s=a.at(-1);if(!s)return a;const i=s.board,d=Y.current,u=yl(d,i);return b(h=>bg(h,v.current,{description:s.description})),r(i),y(u),f.emit("history.undo",{boardId:i.id,selectedBefore:d.length,selectedAfter:u.length,selectionRepaired:u.length!==d.length||u.some((h,C)=>h!==d[C])}),f.emit("selection.repaired",{reason:"undo",beforeCount:d.length,afterCount:u.length}),a.slice(0,-1)})},[]),_o=g.useCallback(()=>{b(a=>{const s=a[0];if(!s)return a;const i=s.board,d=Y.current,u=yl(d,i);return m(h=>Aa(h,v.current,{description:s.description})),r(i),y(u),f.emit("history.redo",{boardId:i.id,selectedBefore:d.length,selectedAfter:u.length,selectionRepaired:u.length!==d.length||u.some((h,C)=>h!==d[C])}),f.emit("selection.repaired",{reason:"redo",beforeCount:d.length,afterCount:u.length}),a.slice(1)})},[]);g.useEffect(()=>{const a=s=>{var M,k;if(!s.defaultPrevented&&s.ctrlKey&&!s.shiftKey&&!s.altKey&&!s.metaKey&&s.key.toLowerCase()==="t"&&!s.repeat){s.preventDefault(),Nt("keyboard"),f.emit("keyboard.shortcut",{action:"toggle-function-toolbar"});return}if(s.defaultPrevented||xl(s.target))return;const i=s.key.toLowerCase(),d=s.ctrlKey||s.metaKey,u=!d&&!s.altKey&&!s.shiftKey,h=db(s.target);if(s.key==="Tab"&&u&&!s.repeat&&!h){s.preventDefault(),Ls("keyboard"),f.emit("keyboard.shortcut",{action:"toggle-wheel-mode",wheelMode:!(v.current.settings.wheelMode??!1)});return}if(s.key==="Enter"&&u&&!s.repeat&&!h&&Ci()){s.preventDefault(),f.emit("keyboard.shortcut",{action:"focus-global-input"});return}if(i==="f"&&u&&!s.repeat&&!h){s.preventDefault(),$n("keyboard"),f.emit("keyboard.shortcut",{action:"toggle-fullscreen"});return}if(i==="d"&&u&&!s.repeat){s.preventDefault(),Es("keyboard"),f.emit("keyboard.shortcut",{action:"toggle-cursor-direction"});return}if(i==="h"&&u&&!s.repeat){s.preventDefault(),Rs(),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(),xi(C),f.emit("keyboard.shortcut",{action:"camera-pan",direction:C});return}if(i===ra&&!s.altKey&&!s.shiftKey){s.preventDefault(),d?(ka(ra),f.emit("keyboard.shortcut",{action:"camera-bookmark-save",slot:ra})):(Fn(ra),f.emit("keyboard.shortcut",{action:"camera-bookmark-goto",slot:ra}));return}if(/^[0-9]$/.test(s.key)&&!s.altKey){if(d&&!s.shiftKey){s.preventDefault(),ka(s.key),f.emit("keyboard.shortcut",{action:"camera-bookmark-save",slot:s.key});return}if(!d&&!s.shiftKey){s.preventDefault(),Fn(s.key),f.emit("keyboard.shortcut",{action:"camera-bookmark-goto",slot:s.key});return}}if(d&&i==="z"&&!s.shiftKey){s.preventDefault(),Po(),f.emit("keyboard.shortcut",{action:"undo"});return}if(d&&i==="y"||d&&s.shiftKey&&i==="z"){s.preventDefault(),_o(),f.emit("keyboard.shortcut",{action:"redo"});return}if(d&&i==="f"&&!s.altKey){s.preventDefault(),(M=Xa.current)==null||M.focus(),(k=Xa.current)==null||k.select(),f.emit("keyboard.shortcut",{action:"focus-search"});return}if(d&&i==="c"&&Y.current.length>0){s.preventDefault(),Os(),f.emit("keyboard.shortcut",{action:"copy",count:Y.current.length});return}if(d&&i==="v"&&Sa.current&&x.current>Date.now()){const A=Sa.current;s.preventDefault(),wa(A,ve(),"paste"),f.emit("keyboard.shortcut",{action:"paste-local",count:A.nodes.length});return}if(d&&i==="d"){s.preventDefault(),Bs("keyboard"),f.emit("keyboard.shortcut",{action:"duplicate",count:Y.current.length});return}if(d&&s.key==="]"){s.preventDefault(),zn("front","keyboard"),f.emit("keyboard.shortcut",{action:"bring-front",count:Y.current.length});return}if(d&&s.key==="["){s.preventDefault(),zn("back","keyboard"),f.emit("keyboard.shortcut",{action:"send-back",count:Y.current.length});return}if(s.key==="Delete"||s.key==="Backspace"){if(Y.current.length===0)return;s.preventDefault(),Ds("keyboard"),f.emit("keyboard.shortcut",{action:"delete",count:Y.current.length});return}if(s.key!=="Escape")return;let S=!1;mt&&(Kt(!1),S=!0),pa&&(de(!1),S=!0),fa&&(_t(!1),S=!0),Wt&&(At("keyboard"),S=!0),lt&&(Me(null),S=!0),Lt&&(Et(null),S=!0),Pt&&(qt(null),S=!0),he&&(J(null),S=!0),ie&&(se(null),S=!0),I.trim()&&(D(""),G([]),re(0),S=!0),Y.current.length>0&&(y([]),S=!0),S&&(s.preventDefault(),f.emit("keyboard.shortcut",{action:"escape"}))};return window.addEventListener("keydown",a),()=>window.removeEventListener("keydown",a)},[Lt,At,he,Os,Ds,Pt,Bs,Ci,ve,Fn,Rs,Wt,xi,wa,lt,mt,I,_o,zn,ie,ka,pa,fa,Es,Nt,$n,Ls,Po]);const Pu=g.useCallback(()=>{tm(),B(()=>({...dd,updatedAt:new Date().toISOString()}),"board.restore",{source:"fixture-reset"}),y(["node-agent-command"]),We([]),At("fixture-reset")},[At,B]),$s=g.useCallback((a,s="result-click")=>{const i=cr(a),d={...ae.current,x:window.innerWidth/2-i.x*ae.current.scale,y:window.innerHeight/2-i.y*ae.current.scale};z(d),y([a.id]),F(a.id),f.emit("search.focused",{query:I.trim(),nodeId:a.id,source:s}),window.setTimeout(()=>F(null),900)},[z,I]);g.useEffect(()=>{const a=++Ka.current,s=rb(ae.current,me);f.emit("search.started",{query:I,engine:ea.current?"worker":"local",viewportCenterX:Number(s.centerX.toFixed(2)),viewportCenterY:Number(s.centerY.toFixed(2))});const i=window.setTimeout(()=>{if(a!==Ka.current){f.emit("async.staleIgnored",{path:"search",seq:a});return}if(!I.trim()){G([]),re(0),Ae("none"),f.emit("search.completed",{query:I,count:0,engine:"none"});return}const u=Ca.current;if(u&&ea.current){u.postMessage({type:"SEARCH_QUERY",boardId:v.current.id,seq:a,query:I,limit:8,viewport:s});return}const h=performance.now(),C=ib(v.current.nodes,I,s,8);G(C),re(0),Ae("local"),f.emit("search.completed",{query:I,count:C.length,engine:"local",durationMs:Number((performance.now()-h).toFixed(2)),viewportBoosted:!0})},120);return()=>window.clearTimeout(i)},[I,me,be]);const Hn=g.useCallback(a=>{re(s=>{const i=O.length;if(i===0)return 0;const d=(s+a+i)%i;return f.emit("search.activeChanged",{query:I.trim(),index:d,count:i}),d})},[I,O.length]),zs=g.useCallback(a=>{const s=O[V];s&&$s(s,a)},[$s,V,O]),_u=g.useCallback(a=>{if(a.key==="ArrowDown"){a.preventDefault(),Hn(1);return}if(a.key==="ArrowUp"){a.preventDefault(),Hn(-1);return}if(a.key==="Enter"){a.preventDefault(),zs("keyboard-enter");return}a.key==="Escape"&&(D(""),G([]),re(0),f.emit("search.cleared"))},[zs,Hn]),Du=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},d=v.current.nodes.find(A=>A.id===a);if(!d)return;m(A=>Aa(A,v.current,{description:"Move nodes",mergeKey:null})),b([]);const u=Y.current.includes(a)?Y.current:[a],h=new Map(v.current.nodes.filter(A=>u.includes(A.id)).map(A=>[A.id,{x:A.x,y:A.y}])),C=h.get(a)??{x:d.x,y:d.y},S=v.current.settings.gridSnap??!0,M=A=>{const _=(A.clientX-i.x)/ae.current.scale,E=(A.clientY-i.y)/ae.current.scale,N=S?ol(C.x+_)-C.x:_,T=S?ol(C.y+E)-C.y:E;r(R=>({...R,nodes:R.nodes.map(Q=>{const Ne=h.get(Q.id);return Ne?{...Q,x:Ne.x+N,y:Ne.y+T}:Q}),updatedAt:new Date().toISOString()}))},k=()=>{window.removeEventListener("pointermove",M),window.removeEventListener("pointerup",k),f.emit("node.patch",{id:a,reason:"drag",gridSnap:S})};window.addEventListener("pointermove",M),window.addEventListener("pointerup",k,{once:!0})},[]),Bu=g.useCallback((a,s)=>{if(s.button!==0)return;s.preventDefault(),s.stopPropagation();const i=v.current.nodes.find(_=>_.id===a);if(!i)return;const d={x:s.clientX,y:s.clientY},u=pf(i);let h={width:i.width,height:i.height};m(_=>Aa(_,v.current,{description:"Resize node",mergeKey:null})),b([]),y(_=>_.includes(a)?_:[a]),se(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",M),window.removeEventListener("pointerup",k),window.removeEventListener("pointercancel",A)},S=_=>{const E=(_.clientX-d.x)/ae.current.scale,N=(_.clientY-d.y)/ae.current.scale;let T=i.width+E,R=i.height+N;if(_.shiftKey&&i.width>0&&i.height>0){const Q=Math.max(T/i.width,R/i.height);T=i.width*Q,R=i.height*Q}h={width:Math.round(ge(T,u.minWidth,u.maxWidth)),height:Math.round(ge(R,u.minHeight,u.maxHeight))},r(Q=>({...Q,nodes:Q.nodes.map(Ne=>Ne.id===a?{...Ne,...h}:Ne),updatedAt:new Date().toISOString()}))},M=_=>{S(_)},k=_=>{S(_),C(),f.emit("node.resize.completed",{id:a,width:h.width,height:h.height})},A=()=>{C(),f.emit("node.resize.cancelled",{id:a})};document.body.classList.add("is-resizing-node"),window.addEventListener("pointermove",M),window.addEventListener("pointerup",k,{once:!0}),window.addEventListener("pointercancel",A,{once:!0})},[]),Ou=g.useCallback(a=>{if(a.button!==0&&a.button!==1&&a.button!==2||a.target.closest(".canvas-node,.floating-panel,.canvas-toolbar,.global-input-shell,.runtime-status-cluster"))return;a.preventDefault();const s={x:a.clientX,y:a.clientY};if(a.shiftKey&&a.button===0){se(null),tt({startX:s.x,startY:s.y,currentX:s.x,currentY:s.y}),f.emit("selection.box.started",{x:Math.round(s.x),y:Math.round(s.y)});const h=()=>{document.body.classList.remove("is-selecting"),window.removeEventListener("pointermove",C),window.removeEventListener("pointerup",S),window.removeEventListener("pointercancel",M)},C=k=>{tt({startX:s.x,startY:s.y,currentX:k.clientX,currentY:k.clientY})},S=k=>{const A=hl({startX:s.x,startY:s.y,currentX:k.clientX,currentY:k.clientY});if(h(),tt(null),A.width<Wd&&A.height<Wd){f.emit("selection.box.cancelled",{reason:"too-small",width:Math.round(A.width),height:Math.round(A.height)});return}const _=Xf(A,ae.current),E=v.current.nodes.filter(N=>gl(N,_)).map(N=>N.id);y(E),f.emit("selection.box.completed",{count:E.length,width:Math.round(A.width),height:Math.round(A.height)})},M=()=>{h(),tt(null),f.emit("selection.box.cancelled",{reason:"pointer-cancelled"})};document.body.classList.add("is-selecting"),window.addEventListener("pointermove",C),window.addEventListener("pointerup",S,{once:!0}),window.addEventListener("pointercancel",M,{once:!0});return}y([]),se(null);const i={...ae.current},d=h=>{z({...i,x:i.x+h.clientX-s.x,y:i.y+h.clientY-s.y})},u=()=>{document.body.classList.remove("is-panning"),window.removeEventListener("pointermove",d),window.removeEventListener("pointerup",u)};document.body.classList.add("is-panning"),window.addEventListener("pointermove",d),window.addEventListener("pointerup",u,{once:!0})},[z]),Us=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"),d=a.ctrlKey||a.metaKey;if(i&&!d)return;const u=v.current.settings.wheelMode?d:!d;a.preventDefault();const h=ae.current;if(u){const C=Math.exp(-a.deltaY*.0012),S=ge(h.scale*C,as,ns),M=Bn(a.clientX,a.clientY);z({x:a.clientX-M.x*S,y:a.clientY-M.y*S,scale:S});return}z({...h,x:h.x-a.deltaX,y:h.y-a.deltaY})},[z,Bn]);g.useEffect(()=>{const a=Rn.current;if(a)return a.addEventListener("wheel",Us,{passive:!1}),()=>a.removeEventListener("wheel",Us)},[Us]);const X=o.nodes.find(a=>a.id===c[0]),Za=g.useMemo(()=>{const a=new Set(c);return o.nodes.filter(s=>a.has(s.id))},[o.nodes,c]),Wn=((zi=X==null?void 0:X.metadata)==null?void 0:zi[U.studioNodeType])??"",Fu=Wn?Gs(Wn):"Unassigned",$u=Wn==="template.input",Ti=g.useMemo(()=>Jd(je),[je]),Do=fe&&fe.issues.length===0?fe.template:null,Ri=g.useMemo(()=>zo(Do,Bt),[Bt,Do]),zu=g.useMemo(()=>Za.filter(a=>a.kind==="image"&&lo(a).length>0).length,[Za]),it=g.useMemo(()=>{const a=o.nodes.filter(d=>d.kind==="ai-task"),s=a.filter(d=>d.status==="running").length,i=a.filter(d=>d.status==="paused").length;return{total:a.length,runnable:a.filter(d=>d.status!=="running").length,running:s,paused:i,active:s+i}},[o.nodes]),Bo=g.useMemo(()=>{if(!X||X.kind!=="ai-task")return{size:0,runnable:0};const a=Ur(o,X.id);return{size:a.length,runnable:a.filter(s=>s.status!=="running").length}},[o,X]),va=g.useMemo(()=>{if(Za.length<2)return null;const a=is(Za);if(!a)return null;const s=Math.max(.01,le.scale),i=a.minX*s+le.x-10,d=a.minY*s+le.y-10,u=a.maxX*s+le.x+10,h=a.maxY*s+le.y+10,C=(i+u)/2,S=d>112?d-52:h+12;return{left:i,top:d,width:Math.max(0,u-i),height:Math.max(0,h-d),toolbarLeft:ge(C,168,Math.max(168,me.width-168)),toolbarTop:ge(S,42,Math.max(42,me.height-58))}},[Za,me.height,me.width,le]),aa=ie?o.nodes.find(a=>a.id===ie):null,Li=Lt?o.nodes.find(a=>a.id===Lt&&!!a.companyMode):null,Ei=Pt?o.nodes.find(a=>a.id===Pt&&a.kind==="directory"):null,Pi=g.useMemo(()=>new Set([...c,...O.map(a=>a.id),St,ie,Lt,Pt,he==null?void 0:he.from].filter(a=>!!a)),[Lt,he==null?void 0:he.from,Pt,St,ie,O,c]),ja=g.useMemo(()=>{const a=Yf(le,me);return o.nodes.filter(s=>Pi.has(s.id)||gl(s,a))},[Pi,o.nodes,me,le]),Hs=g.useMemo(()=>new Set(ja.map(a=>a.id)),[ja]);g.useEffect(()=>{f.emit("visibility.culled",{visible:ja.length,total:o.nodes.length,scale:Number(le.scale.toFixed(3))})},[o.nodes.length,le.scale,ja.length]);const Uu=g.useCallback(()=>{const a=v.current,s=Y.current.map(d=>a.nodes.find(u=>u.id===d)).find(Boolean),i=(s==null?void 0:s.kind)==="ai-task"?s:a.nodes.find(d=>Y.current.includes(d.id)&&d.kind==="ai-task")??a.nodes.find(d=>d.kind==="ai-task");return i?bl(a,i,w.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:",uo(w||(s==null?void 0:s.body)||"No prompt input.",4e3)].join(`
|
|
46
|
+
Write structured notes, docs, or prompt context here.`:"Write the thought, evidence, or reusable context here.",x:M.x,y:M.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"?Br:void 0,metadata:i?Zf(v.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"}:d?ii(v.current.settings,d):void 0};B(Z=>({...Z,nodes:[...Z.nodes,k]}),"node.add",{id:k.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:k.id,kind:i.kind,mode:i.mode,model:(A=k.metadata)==null?void 0:A.MediaModel,aspectPresetId:(_=k.metadata)==null?void 0:_.AspectPresetId,requestedSize:(E=k.metadata)==null?void 0:E.RequestedSize,adapterState:((N=k.metadata)==null?void 0:N.AdapterState)??"adapter-gated",externalActionPolicy:((T=k.metadata)==null?void 0:T.AutomationExternalActionPolicy)??"spec-only-until-review"}),a==="remote-monitor"&&f.emit("remoteMonitor.node.add",{id:k.id,surface:"mindcanvas-node",width:k.width,height:k.height,adapterState:((R=k.metadata)==null?void 0:R.AdapterState)??"adapter-gated"}),a==="mask"&&f.emit("node.mask.add",{id:k.id,hasImage:!!k.imageUrl,imageRouterMask:((Q=k.metadata)==null?void 0:Q.ImageRouterMask)??"true",semanticType:((Ne=k.metadata)==null?void 0:Ne.SemanticType)??"ImageEditMask",adapterState:((Yn=k.metadata)==null?void 0:Yn.AdapterState)??"adapter-gated"}),y([k.id]),Ce(k,"node.add")},[z,B,ve,Ce]),K=g.useCallback((a,s)=>{Ja(i=>({...i,nodes:i.nodes.map(d=>d.id===a?{...d,...s}:d)}),"node.patch",{id:a,keys:Object.keys(s)})},[Ja]),Ft=g.useCallback((a,s)=>{const i=Y.current[0],d=v.current.nodes.find(u=>u.id===i);d&&(K(i,{metadata:{...d.metadata??{},[a]:a===U.templateNodeId||a===U.inputKey?so(s):s}}),Ze(null),f.emit("templateStudio.node.metadata.patch",{id:i,key:a}))},[K]),yi=g.useCallback(a=>{var h;const s=Y.current[0],i=v.current.nodes.find(C=>C.id===s);if(!i)return;const d=((h=i.metadata)==null?void 0:h[U.templateNodeId])||so(i.title),u={...i.metadata??{},[U.studioNodeType]:a,[U.templateNodeId]:d,[U.templateRole]:a.replace(/^template\./,""),[U.compileTarget]:pd(a,i)};a==="template.input"&&(u[U.inputKey]=u[U.inputKey]||so(i.title),u[U.inputType]=u[U.inputType]||"text",u[U.inputRequired]=u[U.inputRequired]||"true"),K(s,{metadata:u}),Ze(null),f.emit("templateStudio.node.role.assign",{id:s,studioNodeType:a})},[K]),j=g.useCallback(a=>{_e(a),window.setTimeout(()=>{_e(s=>s===a?null:s)},2200)},[]),Qc=g.useCallback((a,s,i)=>{var k;const d=v.current.nodes.find(A=>A.id===a);if(!d)return;const u=kl(d.body),h=xm(d,s,i,v.current.settings);if(!h||h.nodes.length===0){j("Template card could not generate nodes."),f.emit("templateCard.generate.blocked",{nodeId:a,optionId:s});return}B(A=>({...A,nodes:[...A.nodes,...h.nodes]}),"templateCard.generate",{nodeId:a,launcherId:h.launcher.id,optionId:((k=h.option)==null?void 0:k.id)??null,templateId:h.template.id,runId:h.runId,generatedCount:h.nodes.length});const C=h.nodes.map(A=>A.id);y(C),F(C[0]??null);const S=h.nodes[h.nodes.length-1];S&&Ce(S,"templateCard.generate"),window.setTimeout(()=>F(A=>A===C[0]?null:A),1200);const M=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.`;j(M)},[B,Ce,j]),eu=g.useCallback(a=>{const s=v.current.nodes.find(A=>A.id===a.sourceNodeId),i=560,d=390,u=ve(void 0,void 0,{width:i,height:d}),h=H("node"),C=s?s.x+s.width+Ko:u.x,S=s?s.y:u.y,M={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&&(M.RemoteFleetLatestFramePath=a.framePath),a.frameUrl&&(M.RemoteFleetLatestFrameUrl=a.frameUrl),a.dataUrl&&(M.RemoteFleetLatestFrameDataUrl=a.dataUrl),a.frameSeq&&(M.RemoteFleetLatestFrameSeq=String(a.frameSeq));const k={id:h,kind:"remote-control",title:a.deviceName||"Remote Device",body:`Remote device control: ${a.deviceId}`,x:C,y:S,width:i,height:d,tags:["Remote","Control","LocalBridge"],metadata:M};B(A=>({...A,nodes:[...A.nodes,k]}),"remoteControl.node.add",{id:k.id,sourceNodeId:a.sourceNodeId,deviceId:a.deviceId}),y([k.id]),Ce(k,"remoteControl.node.add"),j(`Remote control node created for ${a.deviceName||a.deviceId}.`),f.emit("remoteControl.node.add",{nodeId:k.id,sourceNodeId:a.sourceNodeId,deviceId:a.deviceId,connected:a.connected===!0})},[B,ve,Ce,j]),ka=g.useCallback(a=>{const s=Jo(ae.current)??{...tn};Ie({cameraBookmarks:{...v.current.settings.cameraBookmarks??{},[a]:s}},"camera.bookmark.save"),f.emit("camera.bookmark.save",{slot:a,...s}),j(`Camera slot ${a} saved.`)},[Ie,j]),Fn=g.useCallback(a=>{var d;const s=Jo((d=v.current.settings.cameraBookmarks)==null?void 0:d[a]),i=s??{...tn};z(i),f.emit("camera.bookmark.goto",{slot:a,saved:!!s,...i}),j(s?`Camera slot ${a}.`:`Camera slot ${a} empty. Home view.`)},[z,j]),Rs=g.useCallback(()=>{z({...tn}),f.emit("camera.bookmark.goto",{slot:"home",saved:!1,...tn}),j("Home view.")},[z,j]),xi=g.useCallback(a=>{const s=ae.current,i=Dh,d={...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(d),f.emit("camera.keyboard.pan",{direction:a,...d})},[z]),Ci=g.useCallback(()=>{const a=Ln.current;return a?(a.focus(),a.select(),f.emit("globalInput.focus",{source:"keyboard"}),!0):!1},[]),Ls=g.useCallback((a="keyboard")=>{const s=!(v.current.settings.wheelMode??!1);Ie({wheelMode:s},`${a}.wheelMode.toggle`),f.emit("canvas.wheelMode.toggle",{source:a,wheelMode:s}),j(s?"Mouse wheel mode.":"Trackpad pan mode.")},[Ie,j]),Es=g.useCallback((a="keyboard")=>{const i=(v.current.settings.cursorDirection==="down"?"down":"right")==="down"?"right":"down";Ie({cursorDirection:i},`${a}.cursorDirection.toggle`),f.emit("canvas.cursorDirection.toggle",{source:a,cursorDirection:i}),j(i==="down"?"Cursor direction down.":"Cursor direction right.")},[Ie,j]),To=g.useCallback(async(a,s="api")=>{const i=a===!0;try{if(i){if(document.fullscreenElement)return ze(!0),f.emit("canvas.fullscreen.toggle",{source:s,active:!0,fallback:!1}),!0;if(document.documentElement.requestFullscreen){await document.documentElement.requestFullscreen();const d=!!document.fullscreenElement;return ze(d),f.emit("canvas.fullscreen.toggle",{source:s,active:d,fallback:!1}),d}return ze(!0),f.emit("canvas.fullscreen.toggle",{source:s,active:!0,fallback:!0}),!0}return document.fullscreenElement&&document.exitFullscreen&&await document.exitFullscreen(),ze(!1),f.emit("canvas.fullscreen.toggle",{source:s,active:!1,fallback:!1}),!1}catch(d){return ze(i),f.emit("canvas.fullscreen.toggle.failed",{source:s,active:i,fallback:!0,error:d instanceof Error?d.message:String(d)}),f.emit("canvas.fullscreen.toggle",{source:s,active:i,fallback:!0}),j(i?"Read mode fallback.":"Read mode off."),i}},[ze,j]),$n=g.useCallback((a="keyboard")=>To(!ht.current,a),[To]);g.useEffect(()=>{const a=window,s={getMindCanvasFullscreenState:a.getMindCanvasFullscreenState,setMindCanvasFullscreen:a.setMindCanvasFullscreen,getMindCanvasReadModeState:a.getMindCanvasReadModeState,setMindCanvasReadMode:a.setMindCanvasReadMode,toggleMindCanvasReadMode:a.toggleMindCanvasReadMode},i=()=>ht.current,d=h=>To(h,"api"),u=()=>$n("api");return a.getMindCanvasFullscreenState=i,a.setMindCanvasFullscreen=d,a.getMindCanvasReadModeState=i,a.setMindCanvasReadMode=d,a.toggleMindCanvasReadMode=u,xo(!0),f.emit("canvas.readMode.api.bound"),()=>{xo(!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")}},[To,$n]);const tu=g.useCallback(()=>{const a=v.current.settings.cameraBookmarks??{},s=ir.find(i=>!a[i])??ir[0];ka(s)},[ka]),au=g.useCallback(a=>{mr(v.current.settings.gridType)!==a&&Ie({gridType:a},`canvas.gridMode.${a}`)},[Ie]),nu=g.useCallback(()=>{Ie({gridSnap:!(v.current.settings.gridSnap??!0)},"canvas.gridSnap.toggle")},[Ie]),ou=g.useCallback(a=>{const s=v.current.nodes.find(i=>i.id===a);!s||s.kind!=="directory"||(qt(a),f.emit("node.directorySettings.open",{id:a}))},[]),su=g.useCallback(()=>{qt(a=>(a&&f.emit("node.directorySettings.close",{id:a}),null))},[]),ru=g.useCallback((a,s)=>{const i=v.current.nodes.find(h=>h.id===a);if(!i||i.kind!=="directory")return;const d=bn(s.DirectoryPath),u={...i.metadata??{},DirectoryPath:d,Include:s.Include??"",Exclude:s.Exclude??""};K(a,{sourceFilePath:d||Br,metadata:u}),qt(null),f.emit("node.directorySettings.patch",{id:a,keys:["DirectoryPath","Include","Exclude"]}),j("Folder scan settings saved.")},[K,j]),iu=g.useCallback(async a=>{const s=v.current.nodes.find(u=>u.id===a);if(!s||s.kind!=="directory")return;const i=Jh(s);if(f.emit("node.directory.scan.requested",{id:a,hasBridgePath:!!i,hasHandle:vn.current.has(a)}),i){if(!bt()){ce("blocked"),f.emit("node.directory.scan.bridge.blocked",{id:a,reason:"hosted-access-off"}),j("Hosted LocalBridge access is off.");return}try{const u=await Na();if(we(u.status??null),ce(u.state),u.state!=="connected"){f.emit("node.directory.scan.bridge.unavailable",{id:a,message:u.message||"LocalBridge is unavailable."}),j(u.message||"LocalBridge is unavailable.");return}const h=Jn(u.status);if(!h){ce("unavailable"),f.emit("node.directory.scan.bridge.failed",{id:a,reason:"missing-token"}),j("LocalBridge read token is unavailable.");return}const C=Zo(i,48);j(`Scanning ${C}...`),f.emit("node.directory.scan.bridge.requested",{id:a,path:i});const S=await Qh(i,s.metadata,h,u.baseUrl),M=new Date().toISOString();K(a,{title:s.title==="Directory"||s.title==="New Folder"?C:s.title,body:Zd(C,S),sourceFilePath:i,metadata:{...s.metadata??{},DirectoryPath:i,DirectoryName:C,DirectoryScanSource:"localbridge",DirectoryFileCount:String(S.fileCount),DirectoryDirCount:String(S.directoryCount),DirectoryLastScanUtc:M,DirectoryScanTruncated:String(S.truncated),DirectoryPreview:JSON.stringify(S.preview.slice(0,fn))}}),f.emit("node.directory.scan.bridge.completed",{id:a,path:i,fileCount:S.fileCount,directoryCount:S.directoryCount,truncated:S.truncated}),f.emit("node.directory.scan.completed",{id:a,source:"localbridge",directoryName:C,fileCount:S.fileCount,directoryCount:S.directoryCount,truncated:S.truncated}),j(`Scanned ${C}: ${S.fileCount} files, ${S.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}),j("LocalBridge folder scan failed.")}return}const d=window;if(!d.showDirectoryPicker){f.emit("node.directory.scan.unsupported",{id:a}),j("Folder scan needs a Chromium browser with File System Access enabled.");return}try{let u=vn.current.get(a);u||(u=await d.showDirectoryPicker(),vn.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}),j("Folder permission was not granted.");return}j(`Scanning ${u.name}...`);const M=await Kh(u,s.metadata),k=new Date().toISOString();K(a,{title:s.title==="Directory"||s.title==="New Folder"?u.name:s.title,body:Zd(u.name,M),sourceFilePath:u.name,metadata:{...s.metadata??{},DirectoryName:u.name,DirectoryScanSource:"browser-picker",DirectoryFileCount:String(M.fileCount),DirectoryDirCount:String(M.directoryCount),DirectoryLastScanUtc:k,DirectoryScanTruncated:String(M.truncated),DirectoryPreview:JSON.stringify(M.preview.slice(0,fn))}}),f.emit("node.directory.scan.completed",{id:a,source:"browser-picker",directoryName:u.name,fileCount:M.fileCount,directoryCount:M.directoryCount,truncated:M.truncated}),j(`Scanned ${u.name}: ${M.fileCount} files, ${M.directoryCount} folders.`)}catch(u){if((u&&typeof u=="object"&&"name"in u?String(u.name):"")==="AbortError"){f.emit("node.directory.scan.cancelled",{id:a}),j("Folder scan cancelled.");return}f.emit("node.directory.scan.failed",{id:a,message:u instanceof Error?u.message:String(u)}),j("Folder scan failed in this browser context.")}},[K,j]),Si=g.useCallback(a=>{wn(a.id),$a(Qe(a.name))},[]),Ps=g.useCallback(()=>{wn(null),$a("")},[]),_s=g.useCallback(a=>{const s=Qe(ua).slice(0,90);a===v.current.id?(As(s),j("Board renamed.")):em(a,s)?(We(ft()),j("Saved board renamed.")):(f.emit("board.rename.failed",{boardId:a,scope:"stored"}),j("Board rename failed.")),wn(null),$a("")},[As,j,ua]),du=g.useCallback((a,s)=>{s.key==="Enter"?(s.preventDefault(),_s(a)):s.key==="Escape"&&(s.preventDefault(),Ps())},[Ps,_s]),lu=g.useCallback(a=>{const s=v.current.nodes.find(d=>d.id===a);if(!ao(s))return;const i=s.aiEnabled===!1;K(a,{aiEnabled:i}),f.emit("node.aiReference.toggled",{id:a,enabled:i}),j(i?"AI reference enabled.":"AI reference disabled.")},[K,j]),Ro=g.useCallback(async(a,s,i,d,u)=>{P.current=a;try{const h=await ro(a);return ne.current=0,f.emit(s,{...i,ok:!0,method:h}),j(d),h}catch(h){return ne.current=Date.now()+15e3,f.emit(s,{...i,ok:!0,method:"react-local",clipboardUnavailable:!0,message:h instanceof Error?h.message:String(h)}),j(u),"react-local"}},[j]),cu=g.useCallback(async a=>{const s=v.current.nodes.find(d=>d.id===a);if(!s)return;const i=uf(s);if(i)try{const d=await mf(i);f.emit("node.copyImage",{id:a,ok:!0,mode:d,urlKind:i.split(":",1)[0]||"relative"}),j(d==="image"?"Image copied to clipboard.":"Image reference copied.");return}catch(d){P.current=i,ne.current=Date.now()+15e3,f.emit("node.copyImage",{id:a,ok:!0,mode:"react-local",urlKind:i.split(":",1)[0]||"relative",clipboardUnavailable:!0,message:d instanceof Error?d.message:String(d)}),j("Image reference copied inside this canvas.");return}await Ro(cf(s),"node.copy",{id:a},"Node content copied.","Node content copied inside this canvas.")},[Ro,j]),uu=g.useCallback(async(a,s)=>{await Ro(s,"node.embed.copyUrl",{id:a,sourceKind:s.split(":",1)[0]||"relative"},"Embed URL copied.","Embed URL copied inside this canvas.")},[Ro]),mu=g.useCallback(a=>{const s=v.current.nodes.find(d=>d.id===a);if(!ao(s))return;const i=ur(s);K(a,{height:i}),f.emit("node.fitHeight",{id:a,height:i}),j("Node height fitted to text.")},[K,j]),pu=g.useCallback(a=>{const s=v.current.nodes.find(C=>C.id===a);if(!ao(s))return;const i=rf(s),d=i?Math.max(120,Math.round(s.originalHeight||ur(s))):Math.max(120,Math.min(s.height,$h)),u=i?0:Math.round(s.height),h=i;B(C=>({...C,nodes:C.nodes.map(S=>S.id===a?{...S,height:d,isExpanded:h,originalHeight:u}:S)}),"node.expandCollapse",{id:a,expanded:h,height:d,originalHeight:u}),j(h?"Node expanded.":"Node collapsed.")},[B,j]),gu=g.useCallback(a=>{const s=v.current.nodes.find(d=>d.id===a);if(!s||s.kind!=="code")return;const i=s.wordWrap===!1;K(a,{wordWrap:i}),f.emit("node.wordWrap.toggled",{id:a,enabled:i}),j(i?"Word wrap enabled.":"Word wrap disabled.")},[K,j]),hu=g.useCallback((a,s)=>{const i=v.current.nodes.find(h=>h.id===a);if(!ao(i))return;const d=nf(s.executionMode),u=Array.from(new Set([...i.tags??[],"Company root",d,s.enableSubAgents?"sub-agents":"single-agent","adapter-gated"]));K(a,{companyMode:"candidate",role:"Company root",tags:u,metadata:{...i.metadata??{},CompanyExecutionMode:s.executionMode,CompanyExecutionModeLabel:d,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}),j(`Company root staged locally as ${d}. Open CompanyCore to run it with an adapter later.`)},[K,j]),fu=g.useCallback(a=>{var i;const s=v.current.nodes.find(d=>d.id===a);if(!(s!=null&&s.companyMode)){j("Stage this node as a Company root first.");return}Et(a),f.emit("companyGraph.open",{id:a,status:((i=s.metadata)==null?void 0:i.CompanyStatus)??"Staged"})},[j]),bu=g.useCallback(a=>{const s=v.current.nodes.find(i=>i.id===a);s!=null&&s.companyMode&&(K(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}),j("Company goal synced from this note locally."))},[K,j]),yu=g.useCallback(a=>{var d;const s=v.current.nodes.find(u=>u.id===a);if(!(s!=null&&s.companyMode))return;const i=((d=s.metadata)==null?void 0:d.CompanyStatus)||"Staged";K(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}),j(`Company status refreshed locally: ${i}.`)},[K,j]),xu=g.useCallback(()=>{Et(a=>(a&&f.emit("companyGraph.close",{id:a}),null))},[]),ki=g.useCallback((a,s)=>{const i=v.current.nodes.find(d=>d.id===a);i!=null&&i.companyMode&&(K(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}),j(`Company marked ${s.toLowerCase()} locally.`))},[K,j]),wi=g.useCallback(a=>{var d;const s=v.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",((d=s.metadata)==null?void 0:d.CompanyExecutionModeLabel)??""]);K(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()}}),Et(null),f.emit("companyGraph.remove",{id:a}),j("Company staging removed from this node.")},[K,j]),Cu=g.useCallback((a,s)=>{const i=v.current.nodes.find(d=>d.id===a);i!=null&&i.companyMode&&(K(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}),j(`Company approval ${s.toLowerCase()} locally.`))},[K,j]),Su=g.useCallback((a,s)=>{const i=s.trim();if(!i)return;const d=H("node"),u=H("edge");B(h=>{var M,k;const C=h.nodes.find(A=>A.id===a);if(!C)return h;const S={id:d,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",((M=C.metadata)==null?void 0:M.CompanyExecutionModeLabel)??"Company"],metadata:{CompanyRootNodeId:C.id,CompanyExecutionMode:((k=C.metadata)==null?void 0:k.CompanyExecutionMode)??"Auto",CompanyTaskStatus:"Staged",CompanyStagedAt:new Date().toISOString()}};return{...h,nodes:[...h.nodes,S],edges:[...h.edges,{id:u,from:C.id,to:d,kind:"context"}]}},"companyGraph.followUp.staged",{rootId:a,taskId:d,chars:i.length}),y([d]),F(d),window.setTimeout(()=>F(h=>h===d?null:h),1400),j("Company follow-up task staged locally.")},[B,j]),ku=g.useCallback((a,s)=>{const i=H("node"),d=H("edge");B(u=>{const h=u.nodes.find(S=>S.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:d,from:h.id,to:i,kind:"result"}]}},"companyGraph.artifact.added",{rootId:a,artifactNodeId:i,artifactType:s.type}),y([i]),F(i),window.setTimeout(()=>F(u=>u===i?null:u),1400),j("Company artifact added to the canvas.")},[B,j]),wu=g.useCallback((a,s="preview")=>{const i=df(a);if(!i){j("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"){Me({url:i,fileName:lf(a)}),f.emit("node.pdf.preview.open",{id:a.id,urlKind:i.startsWith("http")?"url":"path"});return}if(a.kind==="embed"&&!yn(i)){j("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})},[j]),vu=g.useCallback(a=>{const s=Y.current;B(i=>({...i,nodes:i.nodes.filter(d=>d.id!==a),edges:i.edges.filter(d=>d.from!==a&&d.to!==a)}),"node.delete",{id:a}),y(i=>{const d=i.filter(u=>u!==a);return f.emit("selection.repaired",{reason:"delete-node",beforeCount:s.length,afterCount:d.length,removedCount:i.length-d.length}),d}),se(i=>i===a?null:i)},[B]),Ds=g.useCallback(a=>{const s=Array.from(new Set(Y.current));if(s.length===0)return;const i=new Set(s);B(d=>({...d,nodes:d.nodes.filter(u=>!i.has(u.id)),edges:d.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}),se(d=>d&&i.has(d)?null:d),Et(d=>d&&i.has(d)?null:d),qt(d=>d&&i.has(d)?null:d),j(`Deleted ${s.length} selected node${s.length===1?"":"s"}.`)},[B,j]),Lo=g.useCallback((a,s)=>{var E;const i=Array.from(new Set(a));if(i.length===0)return;const d=v.current,u=new Set(i),h=d.nodes.filter(N=>u.has(N.id));if(h.length===0)return;const C=h.filter(Ma),S=h.filter(N=>!Ma(N));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}),S.length===0){const N=C[0]??d.nodes.find(Ma);N&&(y([N.id]),F(N.id),window.setTimeout(()=>F(T=>T===N.id?null:T),1e3)),j("Remote monitor is single-instance per board. Focused existing monitor.");return}const M=new Map(S.map(N=>[N.id,H("node")])),k=S.map(N=>({...N,id:M.get(N.id),x:N.x+50,y:N.y-50,status:N.status==="running"?"idle":N.status,metadata:N.metadata?{...N.metadata}:void 0,tags:N.tags?[...N.tags]:void 0,imageStack:$r(N.imageStack,N.id,M.get(N.id))})),A=d.edges.filter(N=>M.has(N.from)&&M.has(N.to)).map(N=>({...N,id:H("edge"),from:M.get(N.from),to:M.get(N.to)}));B(N=>({...N,nodes:[...N.nodes,...k],edges:[...N.edges,...A]}),"node.duplicate",{source:s,count:k.length,edgeCount:A.length,sourceIds:i,duplicateIds:k.map(N=>N.id),skippedRemoteMonitorCount:C.length});const _=k.map(N=>N.id);y(_),F(_[0]??null),window.setTimeout(()=>F(N=>N===_[0]?null:N),1e3),j(C.length>0?`Duplicated ${k.length} node${k.length===1?"":"s"}; remote monitor stays single-instance.`:`Duplicated ${k.length} node${k.length===1?"":"s"}.`)},[B,j]),Bs=g.useCallback(a=>{Lo(Y.current,a)},[Lo]),zn=g.useCallback((a,s)=>{const i=Array.from(new Set(Y.current));if(i.length===0)return;const d=new Set(i),u=v.current.nodes,h=u.filter(k=>d.has(k.id));if(h.length===0)return;const C=u.filter(k=>!d.has(k.id)),S=a==="front"?[...C,...h]:[...h,...C];if(!S.some((k,A)=>{var _;return k.id!==((_=u[A])==null?void 0:_.id)})){j(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}B(k=>({...k,nodes:S}),"node.layerOrder",{direction:a,source:s,count:h.length,ids:i}),j(a==="front"?`Brought ${i.length} selected node${i.length===1?"":"s"} to front.`:`Sent ${i.length} selected node${i.length===1?"":"s"} to back.`)},[B,j]),Os=g.useCallback(async()=>{const a=new Set(Y.current),s=v.current.nodes.filter(u=>a.has(u.id));if(s.length===0)return;const i=v.current.edges.filter(u=>a.has(u.from)&&a.has(u.to)),d=Sf(s,i);Sa.current=d;try{const u=await ro(JSON.stringify(d));x.current=0,f.emit("multiSelection.copy",{count:s.length,edgeCount:i.length,ok:!0,method:u}),j(`Copied ${s.length} selected node${s.length===1?"":"s"} for canvas paste.`)}catch(u){x.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)}),j(`Copied ${s.length} selected node${s.length===1?"":"s"} inside this canvas.`)}},[j]),wa=g.useCallback((a,s,i)=>{const d=v.current.nodes.find(Ma),u=[],h=[];let C=!!d;for(const R of a.nodes){if(Ma(R)){if(C){u.push(R);continue}C=!0}h.push(R)}if(u.length>0&&f.emit("remoteMonitor.node.duplicateIgnored",{action:i,skippedCount:u.length,nodeId:d==null?void 0:d.id}),h.length===0){d&&(y([d.id]),F(d.id),window.setTimeout(()=>F(R=>R===d.id?null:R),1e3)),j("Remote monitor is single-instance per board. Focused existing monitor.");return}const S=is(h);if(!S)return;const M=new Map(h.map(R=>[R.id,H("node")])),k=s.x-S.minX,A=s.y-S.minY,_=h.map(R=>({...R,id:M.get(R.id),x:R.x+k,y:R.y+A,status:R.status==="running"?"idle":R.status,tags:R.tags?[...R.tags]:void 0,metadata:R.metadata?{...R.metadata}:void 0,imageStack:$r(R.imageStack,R.id,M.get(R.id))})),E=a.edges.filter(R=>M.has(R.from)&&M.has(R.to)).map(R=>({...R,id:H("edge"),from:M.get(R.from),to:M.get(R.to)})),N=_.map(R=>R.id);B(R=>({...R,nodes:[...R.nodes,..._],edges:[...R.edges,...E]}),"clipboard.nodes.paste",{source:i,count:_.length,edgeCount:E.length,originX:Math.round(s.x),originY:Math.round(s.y),skippedRemoteMonitorCount:u.length}),y(N),se(null),F(N[0]??null);const T=_[_.length-1];T&&Ce(T,`clipboard.nodes.${i}`),window.setTimeout(()=>F(R=>R===N[0]?null:R),1200),j(u.length>0?`Pasted ${_.length} canvas node${_.length===1?"":"s"}; remote monitor stays single-instance.`:`Pasted ${_.length} canvas node${_.length===1?"":"s"}.`)},[B,Ce,j]),Un=g.useCallback((a,s,i)=>{const d=a.trim();if(!d)return;const u=rl(d,s,`${i}-url`),h=u??il(d,s,i);B(C=>({...C,nodes:[...C.nodes,h]}),u?"clipboard.url.paste":"clipboard.text.paste",{source:i,id:h.id,kind:h.kind,chars:d.length}),y([h.id]),se(null),F(h.id),Ce(h,`clipboard.${i}.${h.kind}`),window.setTimeout(()=>F(C=>C===h.id?null:C),1200),j(`${i==="drop"?"Dropped":"Pasted"} ${h.kind==="file"?"URL reference":h.kind} node.`)},[B,Ce,j]),Eo=g.useCallback(async(a,s,i)=>{const d=a.filter(h=>h.name||h.size>0);if(d.length===0)return;const u=v.current.id;try{const h=[];let C=s.x;for(const k of d){const A=await $f(k,{x:C,y:s.y},i);h.push(A),C+=A.width+Ko}if(v.current.id!==u){f.emit("async.staleIgnored",{path:"canvas.fileIngest",source:i,boardId:u,currentBoardId:v.current.id,count:d.length});return}const S=h.map(k=>k.id);B(k=>({...k,nodes:[...k.nodes,...h]}),"canvas.files.ingested",{source:i,count:h.length,kinds:h.map(k=>k.kind)}),y(S),se(null),F(S[0]??null);const M=h[h.length-1];M&&Ce(M,`canvas.files.${i}`),window.setTimeout(()=>F(k=>k===S[0]?null:k),1200),j(`${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)}),j("File ingest failed in this browser context.")}},[B,Ce,j]);g.useEffect(()=>{const a=s=>{if(s.defaultPrevented||xl(s.target))return;const i=s.clipboardData;if(!i)return;const d=ve(),u=pl(i.files,i.items);if(u.length>0){s.preventDefault(),Eo(u,d,"paste");return}const h=x.current>Date.now()?Sa.current:null;if(h){s.preventDefault(),wa(h,d,"paste"),f.emit("clipboard.nodes.pasteLocalFallback",{count:h.nodes.length});return}const C=ne.current>Date.now()?P.current:null;if(C){s.preventDefault(),Un(C,d,"paste"),f.emit("clipboard.text.pasteLocalFallback",{chars:C.length}),ne.current=0;return}const S=i.getData("text/plain"),M=sl(S);if(M){s.preventDefault(),wa(M,d,"paste");return}const k=S.trim()?S:dl(i.getData("text/html"));k.trim()&&(s.preventDefault(),Un(k,d,"paste"))};return document.addEventListener("paste",a),()=>document.removeEventListener("paste",a)},[ve,Eo,Un,wa]);const ju=g.useCallback(a=>{hr(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")},[]),Iu=g.useCallback(a=>{if(hr(a.target))return;const s=pl(a.dataTransfer.files,a.dataTransfer.items),i=a.dataTransfer.getData("text/uri-list"),d=a.dataTransfer.getData("text/plain"),u=dl(a.dataTransfer.getData("text/html")),h=ve(a.clientX,a.clientY);if(s.length>0){a.preventDefault(),Eo(s,h,"drop");return}const C=(i||d||u).trim(),S=sl(d);if(S){a.preventDefault(),wa(S,h,"drop");return}C&&(a.preventDefault(),Un(C,h,"drop"))},[ve,Eo,Un,wa]),Nu=g.useCallback(()=>{const a=new Set(Y.current),s=new Set(v.current.nodes.filter(i=>a.has(i.id)&&ao(i)).map(i=>i.id));if(s.size===0){j("No text nodes in this selection.");return}B(i=>({...i,nodes:i.nodes.map(d=>s.has(d.id)?{...d,height:ur(d)}:d)}),"multiSelection.fitHeight",{count:s.size}),f.emit("multiSelection.fitHeight",{count:s.size}),j(`Fitted ${s.size} text node${s.size===1?"":"s"}.`)},[B,j]),Fs=g.useCallback(a=>{const s=new Set(Y.current),i=v.current.nodes.filter(E=>s.has(E.id)).sort((E,N)=>Y.current.indexOf(E.id)-Y.current.indexOf(N.id));if(i.length<2)return;const d=is(i);if(!d)return;const u=a==="tidy"?Wf(i):i,h=28,C=Math.max(...u.map(E=>E.width)),S=Math.max(...u.map(E=>E.height)),M=u.map((E,N)=>({id:E.id,x:E.x,y:E.y,width:E.width,height:E.height,selectionIndex:N})),k=v.current.settings.gridSnap??!0;let A;a==="grid"?A={mode:"grid",order:"selectionOrder",columns:Math.max(2,Math.ceil(Math.sqrt(u.length))),cellWidth:C,cellHeight:S,gapX:h,gapY:h,sizeMode:"preserve",snapToGrid:k,gridSize:Ht}:a==="strip"?A={mode:"stripHorizontal",order:"selectionOrder",targetHeight:S,gapX:h,sizeMode:"preserve",snapToGrid:k,gridSize:Ht}:A={mode:"masonry",order:"spatialReading",anchor:"selectionBoundsTopLeft",maxColumns:12,gapX:24,gapY:24,quantile:.75,sizeMode:"preserve",snapToGrid:k,gridSize:Ht};const _=Xp(M,A,d);B(E=>({...E,nodes:E.nodes.map(N=>{const T=_.after.get(N.id);return T?{...N,x:T.x,y:T.y,width:T.width,height:T.height}:N})}),"multiSelection.arrange",{mode:a,count:i.length,layoutMode:A.mode,snapToGrid:k}),f.emit("multiSelection.arrange",{mode:a,count:i.length,layoutMode:A.mode,snapToGrid:k,boundsAfter:_.boundsAfter}),j(a==="tidy"?`Tidied ${i.length} selected nodes.`:`Arranged ${i.length} selected nodes as ${a}.`)},[B,j]),Au=g.useCallback(()=>{const a=Array.from(new Set(Y.current)),s=v.current,i=new Map(s.nodes.map(T=>[T.id,T])),d=a.map(T=>i.get(T)).filter(T=>!!(T&&T.kind==="image"&&lo(T).length>0));if(d.length<2){j("Select at least two image nodes to stack."),f.emit("multiSelection.mergeImageStacks.skipped",{reason:"not-enough-image-nodes",selectedCount:a.length});return}const u=d[0],h=d.slice(1),C=new Date().toISOString(),S=new Set,M=lo(u),k=[];for(const T of M)k.push(al(T,u,S,C));for(const T of h)for(const R of lo(T))k.push(al(R,T,S,C));if(k.length<2){j("No stackable image variants found."),f.emit("multiSelection.mergeImageStacks.skipped",{reason:"not-enough-variants",selectedCount:a.length});return}const A=k.some(T=>{var R;return T.variantId===((R=u.imageStack)==null?void 0:R.activeVariantId)})?u.imageStack.activeVariantId:k[0].variantId,_=k.find(T=>T.variantId===A)??k[0],E=h.map(T=>T.id),N=new Set(E);B(T=>({...T,nodes:T.nodes.filter(R=>!N.has(R.id)).map(R=>{var Q;return R.id===u.id?{...R,kind:"image",imageUrl:_.imageUrl,imageStack:{activeVariantId:A,variants:k,kind:"pile",title:((Q=R.imageStack)==null?void 0:Q.title)||R.title,updatedAtUtc:C},metadata:{...R.metadata??{},ImageStackKind:"pile",ImageStackPrimaryNodeId:u.id,ImageStackVariantCount:String(k.length),ImageStackMergedAtUtc:C,ImageStackRemovedNodeIds:E.join(","),ImageStackActiveVariantId:A},tags:Array.from(new Set([...R.tags??["image"],"Stack"])).slice(0,4)}:R}),edges:T.edges.filter(R=>!N.has(R.from)&&!N.has(R.to))}),"multiSelection.mergeImageStacks",{primaryNodeId:u.id,removedNodeIds:E,addedVariants:k.length-M.length,variantCount:k.length}),y([u.id]),se(T=>T&&N.has(T)?null:T),Et(T=>T&&N.has(T)?null:T),qt(T=>T&&N.has(T)?null:T),F(u.id),window.setTimeout(()=>F(T=>T===u.id?null:T),1200),j(`Stacked ${d.length} image nodes into ${k.length} variants.`)},[B,j]),Mu=g.useCallback(a=>{const s=Y.current.includes(a)?Y.current:[a];Lo(s,"node-action")},[Lo]),ta=g.useCallback(async(a,s)=>{const i=Pn.current.isBusy(a);return i&&f.emit("automation.run.queued",{id:a,key:a}),Pn.current.enqueue(a,async()=>{var A,_,E;const d=v.current.nodes.find(N=>N.id===a);if(!d||d.kind!=="ai-task")return;f.emit("automation.run.dequeued",{id:a,key:a,queuedBehindRunning:i});const u=(Ga.current.get(a)??0)+1;Ga.current.set(a,u);const h=xa.current,C=(s==null?void 0:s.trim())||d.body,S=ri(si(d));K(a,{status:"running",body:C,...rn(d)?{metadata:no(d,{instruction:C,runState:"running",status:"running",statusLabel:"Running",sourceMode:S?"media-prompt-only":"ai-task"})}:{}}),f.emit("automation.run",{id:a,mode:"single",seq:u,automationKind:S==null?void 0:S.kind});const M=()=>Ga.current.get(a)===u&&xa.current===h,k=N=>{if(!M()){f.emit("async.staleIgnored",{path:"automation.run",id:a,seq:u});return}f.emit("localBridge.codex.fallback",{id:a,reason:N});const T=tb(C,d);K(a,{status:"done",result:T,...rn(d)?{metadata:no(d,{instruction:C,output:T,runState:"completed",status:S?"prepared":"done",statusLabel:S?"Spec only":"Done",sourceMode:S?"media-prompt-only":"local-draft",error:S?`External ${S.mode.toLowerCase()} generation was not executed.`:"",fallback:!0,partial:!!S,toolsUsed:S?`${S.toolHint}, Deterministic.Fallback, HumanReview.Gate`:"Deterministic.Fallback",toolWarnings:S?`External ${S.mode.toLowerCase()} generator was not invoked; this run prepared a spec only.`:""})}:{}}),se(a)};if(!bt()){k("hosted-access-gated");return}try{const N=await Na();if(!M()){f.emit("async.staleIgnored",{path:"automation.run",id:a,seq:u});return}if(ce(N.state),we(N.status??null),N.state!=="connected"){ye(N.message||"LocalBridge is unavailable."),k(N.message||"LocalBridge unavailable");return}const T=Jn(N.status);if(!T){k("LocalBridge token unavailable");return}const R=bl(v.current,d,C);f.emit("localBridge.codex.run",{id:a,boardId:v.current.id});const Q=await Cm({instruction:R,workingDirectory:((_=(A=N.status)==null?void 0:A.project)==null?void 0:_.rootPath)||((E=N.status)==null?void 0:E.workspace)||void 0,sandbox:"read_only",model:oo(v.current.settings.model),reasoningEffort:Jf(v.current.settings.effort),approvalPolicy:"on-request",intent:"mindcanvas-ai-task",nodeKind:d.kind,webSearchMode:"disabled",networkAccessEnabled:!1},T,N.baseUrl);if(!M()){f.emit("async.staleIgnored",{path:"automation.run",id:a,seq:u});return}if(!Q.success||!Q.finalResponse){const Ne=Q.error||"LocalBridge Codex returned no response.";f.emit("localBridge.codex.failed",{id:a,message:Ne,status:Q.status}),K(a,{status:"blocked",result:Ne,...rn(d)?{metadata:no(d,{instruction:C,output:Ne,runState:"blocked",status:"blocked",statusLabel:"Blocked",sourceMode:S?"media-prompt-only":"ai-task",error:Ne,fallback:!1,partial:!0})}:{}}),se(a);return}K(a,{status:"done",result:Q.finalResponse,...rn(d)?{metadata:no(d,{instruction:C,output:Q.finalResponse,runState:"completed",status:S?"prepared":"done",statusLabel:S?"Spec only":"Done",sourceMode:S?"media-prompt-only":"ai-generated",error:S?`External ${S.mode.toLowerCase()} generation was not executed.`:"",fallback:!1,partial:!!S,toolsUsed:S?`AI.LLM, ${S.toolHint}, HumanReview.Gate`:"AI.LLM",toolWarnings:S?`External ${S.mode.toLowerCase()} generator was not invoked; this run prepared a spec only.`:""})}:{}}),f.emit("localBridge.codex.completed",{id:a,providerKind:Q.providerKind,threadId:Q.threadId,turnId:Q.turnId}),se(a)}catch(N){if(!M()){f.emit("async.staleIgnored",{path:"automation.run",id:a,seq:u});return}const T=N instanceof Error?N.message:String(N);f.emit("localBridge.codex.failed",{id:a,message:T}),K(a,{status:"blocked",result:T,...rn(d)?{metadata:no(d,{instruction:C,output:T,runState:"blocked",status:"blocked",statusLabel:"Blocked",sourceMode:S?"media-prompt-only":"ai-task",error:T,fallback:!1,partial:!0})}:{}}),se(a)}})},[K]),vi=g.useCallback(async()=>{const a=Y.current[0];if(!a){j("Select an AI Task to run its graph.");return}const s=Ur(v.current,a);if(s.length===0){j("Select an AI Task to run its graph.");return}const i=s.filter(d=>d.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(d=>d.id)}),i.length===0){j("The selected AI Task graph is already running.");return}j(`Running selected graph: ${i.length} AI task${i.length===1?"":"s"}.`);for(const d of i)await ta(d.id)},[ta,j]),Tu=g.useCallback(async a=>{if(a.result)try{const s=await ro(a.result);f.emit("aiTask.result.copy",{id:a.id,chars:a.result.length,ok:!0,method:s}),j("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)}),j("AI result copy unavailable in this browser context.")}},[j]),Ru=g.useCallback(a=>{if(!a.result)return;const s=ab(a,{x:a.x+a.width+78,y:a.y}),i={id:H("edge"),from:a.id,to:s.id,kind:"result"};B(d=>d.nodes.some(h=>h.id===a.id&&h.result)?{...d,nodes:[...d.nodes,s],edges:[...d.edges,i]}:d,"aiTask.result.note.create",{sourceNodeId:a.id,createdNodeId:s.id,chars:a.result.length,truncated:a.result.length>Dr}),y([s.id]),se(null),F(s.id),window.setTimeout(()=>F(d=>d===s.id?null:d),1200),j("AI result archived as a Markdown node.")},[B,j]),Lu=g.useCallback(a=>{if(!a.result)return;const s=nb(a,{x:a.x+a.width+78,y:a.y+Math.min(a.height+44,360)}),i={id:H("edge"),from:a.id,to:s.id,kind:"result"};B(d=>d.nodes.some(h=>h.id===a.id&&h.result)?{...d,nodes:[...d.nodes,s],edges:[...d.edges,i]}:d,"aiTask.result.followUp.create",{sourceNodeId:a.id,createdNodeId:s.id,chars:a.result.length}),y([s.id]),se(null),F(s.id),window.setTimeout(()=>F(d=>d===s.id?null:d),1200),j("Follow-up AI Task staged from the result.")},[B,j]),ji=g.useCallback(()=>{var Xn,oa,ad,nd,od,sd,rd;const a=w.trim(),s=v.current.settings.inputMode,i=[...Y.current],d=v.current.nodes.find(ue=>ue.id===i[0]),u=(d==null?void 0:d.kind)==="ai-task"?(a||d.body).trim():a;if(!u)return;const h=u.replace(/\s+/g," ").trim().toLowerCase(),C=window.location.pathname||"/mindcanvas",S=`${C}|${s}|${h}`,M=Date.now(),k=_n.current;if((k==null?void 0:k.signature)===S&&M-k.at<=Vd){f.emit("globalInput.duplicateIgnored",{routePath:C,inputMode:s,chars:u.length,windowMs:Vd});return}_n.current={signature:S,at:M};const A={routePath:C,inputMode:s,selectedNodeIds:i,chars:u.length};f.emit("globalInput.submit.snapshot",{...A,source:(d==null?void 0:d.kind)==="ai-task"?"selected-ai-task":"input",hasTypedPrompt:a.length>0}),(d==null?void 0:d.kind)==="ai-task"&&L(""),$(ue=>ue+1),f.emit("globalInput.submit.started",A);const _=ue=>{$(Mt=>Math.max(0,Mt-1)),f.emit("globalInput.submit.completed",{...A,status:ue})};if((d==null?void 0:d.kind)==="ai-task"){ta(d.id,a).then(()=>_("ai-task")).catch(ue=>{f.emit("globalInput.submit.completed",{...A,status:"ai-task-error",message:ue instanceof Error?ue.message:String(ue)}),$(Mt=>Math.max(0,Mt-1))});return}const E=ve(void 0,void 0,{width:360,height:196}),N=rl(u,E,"global-input-url"),T=N?null:oi(u),R=!!(T&&/^https?:\/\//i.test(T)&&!yn(T)),Q=!N&&!R&&(s==="Image"||s==="Video")?s:null,Ne=N??(R?il(u,E,"global-input-rejected-url"):null)??(Q?_f(u,E,v.current.settings,Q):Pf(u,E,v.current.settings)),Yn=ve(void 0,void 0,{width:Ne.width,height:Ne.height}),Z={...Ne,x:Yn.x,y:Yn.y},Qa=Z.kind==="ai-task",Ia=N?"globalInput.url.add":R?"globalInput.rejectedUrl.add":Q?"globalInput.media.add":"globalInput.aiTask.add",Fo={id:Z.id,kind:Z.kind,chars:u.length,inputMode:s,...Qa?{model:(Xn=Z.metadata)==null?void 0:Xn.TextModel,provider:(oa=Z.metadata)==null?void 0:oa.AiProvider,effort:(ad=Z.metadata)==null?void 0:ad.Effort}:{},...Q?{mediaMode:Q,mediaModel:(nd=Z.metadata)==null?void 0:nd.MediaModel,aspectPresetId:(od=Z.metadata)==null?void 0:od.AspectPresetId,requestedSize:(sd=Z.metadata)==null?void 0:sd.RequestedSize}:{}};if(Qa){const ue=v.current,Mt={...ue,nodes:ue.nodes.some(Vs=>Vs.id===Z.id)?ue.nodes:[...ue.nodes,Z],updatedAt:new Date().toISOString()};m(Vs=>Aa(Vs,ue,{description:Ia,mergeKey:null})),b([]),v.current=Mt,f.emit(Ia,Fo),r(Mt)}else B(ue=>({...ue,nodes:ue.nodes.some(Mt=>Mt.id===Z.id)?ue.nodes:[...ue.nodes,Z]}),Ia,Fo);if(L(""),y([Z.id]),se(null),F(Z.id),Ce(Z,Ia),window.setTimeout(()=>F(ue=>ue===Z.id?null:ue),1200),Qa){f.emit("globalInput.aiTask.runRequested",{id:Z.id,chars:u.length,model:(rd=Z.metadata)==null?void 0:rd.TextModel}),j("AI task created from input and running."),ta(Z.id,u).then(()=>_("ai-task-created")).catch(ue=>{f.emit("globalInput.submit.completed",{...A,status:"ai-task-created-error",message:ue instanceof Error?ue.message:String(ue)}),$(Mt=>Math.max(0,Mt-1))});return}j(`Added ${Z.kind==="file"?"URL reference":Z.kind} node from input.`),_(N?"url-node":R?"rejected-url-node":Q?"media-node":"text-node")},[B,ve,w,Ce,ta,j]),Ii=g.useCallback(async()=>{const a=sb(v.current),s=a.flat(),i=a.map(u=>u.filter(h=>h.status!=="running")).filter(u=>u.length>0),d=i.flat();if(f.emit("automation.run",{mode:"all",count:d.length,graphCount:i.length,skippedRunning:s.length-d.length,order:d.map(u=>u.id)}),d.length===0){j(s.length>0?"All AI task graphs are already running.":"No AI tasks on this board.");return}j(`Running ${i.length} graph${i.length===1?"":"s"} / ${d.length} AI task${d.length===1?"":"s"}.`);for(const u of i)for(const h of u)await ta(h.id)},[ta,j]),Ni=g.useCallback(()=>{const a=v.current.nodes.filter(s=>s.kind==="ai-task"&&s.status==="running");if(a.length===0){j("No running AI tasks to pause."),f.emit("automation.pause",{count:0});return}xa.current+=1,B(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}),j(`Paused ${a.length} running task${a.length===1?"":"s"}.`)},[B,j]),Ai=g.useCallback(()=>{const a=v.current.nodes.filter(s=>s.kind==="ai-task"&&(s.status==="running"||s.status==="paused"));if(a.length===0){j("No active AI tasks to stop."),f.emit("automation.stop",{count:0});return}xa.current+=1,B(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}),se(null),j(`Stopped ${a.length} active task${a.length===1?"":"s"}.`)},[B,j]),Mi=g.useCallback(()=>{const a=v.current.nodes.find(C=>C.id===Y.current[0]);if(!a)return;const s=a.x+a.width+80,i=a.y,d={id:H("node"),kind:"ai-task",title:"Research demand",body:`Find buyer pain and proof for: ${a.title}`,x:s,y:i,width:330,height:188,status:"idle",tags:["AI Task","Research"]},u={...d,id:H("node"),title:"Write offer",body:"Turn the research into a one-sentence USD offer and a first landing-page promise.",x:s+390,tags:["AI Task","Offer"]},h=[{id:H("edge"),from:a.id,to:d.id,kind:"context"},{id:H("edge"),from:d.id,to:u.id,kind:"result"}];B(C=>({...C,nodes:[...C.nodes,d,u],edges:[...C.edges,...h]}),"node.add",{reason:"generate-flow",count:2}),y([d.id,u.id])},[B]),Eu=g.useCallback((a,s)=>{if(he&&he.from!==a){const i={id:H("edge"),from:he.from,to:a,kind:he.kind==="context"?"context":s};B(d=>({...d,edges:[...d.edges,i]}),"edge.add",{...i}),J(null);return}J({from:a,kind:s})},[B,he]),Po=g.useCallback(()=>{m(a=>{const s=a.at(-1);if(!s)return a;const i=s.board,d=Y.current,u=yl(d,i);return b(h=>bg(h,v.current,{description:s.description})),r(i),y(u),f.emit("history.undo",{boardId:i.id,selectedBefore:d.length,selectedAfter:u.length,selectionRepaired:u.length!==d.length||u.some((h,C)=>h!==d[C])}),f.emit("selection.repaired",{reason:"undo",beforeCount:d.length,afterCount:u.length}),a.slice(0,-1)})},[]),_o=g.useCallback(()=>{b(a=>{const s=a[0];if(!s)return a;const i=s.board,d=Y.current,u=yl(d,i);return m(h=>Aa(h,v.current,{description:s.description})),r(i),y(u),f.emit("history.redo",{boardId:i.id,selectedBefore:d.length,selectedAfter:u.length,selectionRepaired:u.length!==d.length||u.some((h,C)=>h!==d[C])}),f.emit("selection.repaired",{reason:"redo",beforeCount:d.length,afterCount:u.length}),a.slice(1)})},[]);g.useEffect(()=>{const a=s=>{var M,k;if(!s.defaultPrevented&&s.ctrlKey&&!s.shiftKey&&!s.altKey&&!s.metaKey&&s.key==="Home"&&!s.repeat){s.preventDefault(),Nt("keyboard"),f.emit("keyboard.shortcut",{action:"toggle-function-toolbar"});return}if(s.defaultPrevented||xl(s.target))return;const i=s.key.toLowerCase(),d=s.ctrlKey||s.metaKey,u=!d&&!s.altKey&&!s.shiftKey,h=db(s.target);if(s.key==="Tab"&&u&&!s.repeat&&!h){s.preventDefault(),Ls("keyboard"),f.emit("keyboard.shortcut",{action:"toggle-wheel-mode",wheelMode:!(v.current.settings.wheelMode??!1)});return}if(s.key==="Enter"&&u&&!s.repeat&&!h&&Ci()){s.preventDefault(),f.emit("keyboard.shortcut",{action:"focus-global-input"});return}if(i==="f"&&u&&!s.repeat&&!h){s.preventDefault(),$n("keyboard"),f.emit("keyboard.shortcut",{action:"toggle-fullscreen"});return}if(i==="d"&&u&&!s.repeat){s.preventDefault(),Es("keyboard"),f.emit("keyboard.shortcut",{action:"toggle-cursor-direction"});return}if(i==="h"&&u&&!s.repeat){s.preventDefault(),Rs(),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(),xi(C),f.emit("keyboard.shortcut",{action:"camera-pan",direction:C});return}if(i===ra&&!s.altKey&&!s.shiftKey){s.preventDefault(),d?(ka(ra),f.emit("keyboard.shortcut",{action:"camera-bookmark-save",slot:ra})):(Fn(ra),f.emit("keyboard.shortcut",{action:"camera-bookmark-goto",slot:ra}));return}if(/^[0-9]$/.test(s.key)&&!s.altKey){if(d&&!s.shiftKey){s.preventDefault(),ka(s.key),f.emit("keyboard.shortcut",{action:"camera-bookmark-save",slot:s.key});return}if(!d&&!s.shiftKey){s.preventDefault(),Fn(s.key),f.emit("keyboard.shortcut",{action:"camera-bookmark-goto",slot:s.key});return}}if(d&&i==="z"&&!s.shiftKey){s.preventDefault(),Po(),f.emit("keyboard.shortcut",{action:"undo"});return}if(d&&i==="y"||d&&s.shiftKey&&i==="z"){s.preventDefault(),_o(),f.emit("keyboard.shortcut",{action:"redo"});return}if(d&&i==="f"&&!s.altKey){s.preventDefault(),(M=Xa.current)==null||M.focus(),(k=Xa.current)==null||k.select(),f.emit("keyboard.shortcut",{action:"focus-search"});return}if(d&&i==="c"&&Y.current.length>0){s.preventDefault(),Os(),f.emit("keyboard.shortcut",{action:"copy",count:Y.current.length});return}if(d&&i==="v"&&Sa.current&&x.current>Date.now()){const A=Sa.current;s.preventDefault(),wa(A,ve(),"paste"),f.emit("keyboard.shortcut",{action:"paste-local",count:A.nodes.length});return}if(d&&i==="d"){s.preventDefault(),Bs("keyboard"),f.emit("keyboard.shortcut",{action:"duplicate",count:Y.current.length});return}if(d&&s.key==="]"){s.preventDefault(),zn("front","keyboard"),f.emit("keyboard.shortcut",{action:"bring-front",count:Y.current.length});return}if(d&&s.key==="["){s.preventDefault(),zn("back","keyboard"),f.emit("keyboard.shortcut",{action:"send-back",count:Y.current.length});return}if(s.key==="Delete"||s.key==="Backspace"){if(Y.current.length===0)return;s.preventDefault(),Ds("keyboard"),f.emit("keyboard.shortcut",{action:"delete",count:Y.current.length});return}if(s.key!=="Escape")return;let S=!1;mt&&(Kt(!1),S=!0),pa&&(de(!1),S=!0),fa&&(_t(!1),S=!0),Wt&&(At("keyboard"),S=!0),lt&&(Me(null),S=!0),Lt&&(Et(null),S=!0),Pt&&(qt(null),S=!0),he&&(J(null),S=!0),ie&&(se(null),S=!0),I.trim()&&(D(""),G([]),re(0),S=!0),Y.current.length>0&&(y([]),S=!0),S&&(s.preventDefault(),f.emit("keyboard.shortcut",{action:"escape"}))};return window.addEventListener("keydown",a),()=>window.removeEventListener("keydown",a)},[Lt,At,he,Os,Ds,Pt,Bs,Ci,ve,Fn,Rs,Wt,xi,wa,lt,mt,I,_o,zn,ie,ka,pa,fa,Es,Nt,$n,Ls,Po]);const Pu=g.useCallback(()=>{tm(),B(()=>({...dd,updatedAt:new Date().toISOString()}),"board.restore",{source:"fixture-reset"}),y(["node-agent-command"]),We([]),At("fixture-reset")},[At,B]),$s=g.useCallback((a,s="result-click")=>{const i=cr(a),d={...ae.current,x:window.innerWidth/2-i.x*ae.current.scale,y:window.innerHeight/2-i.y*ae.current.scale};z(d),y([a.id]),F(a.id),f.emit("search.focused",{query:I.trim(),nodeId:a.id,source:s}),window.setTimeout(()=>F(null),900)},[z,I]);g.useEffect(()=>{const a=++Ka.current,s=rb(ae.current,me);f.emit("search.started",{query:I,engine:ea.current?"worker":"local",viewportCenterX:Number(s.centerX.toFixed(2)),viewportCenterY:Number(s.centerY.toFixed(2))});const i=window.setTimeout(()=>{if(a!==Ka.current){f.emit("async.staleIgnored",{path:"search",seq:a});return}if(!I.trim()){G([]),re(0),Ae("none"),f.emit("search.completed",{query:I,count:0,engine:"none"});return}const u=Ca.current;if(u&&ea.current){u.postMessage({type:"SEARCH_QUERY",boardId:v.current.id,seq:a,query:I,limit:8,viewport:s});return}const h=performance.now(),C=ib(v.current.nodes,I,s,8);G(C),re(0),Ae("local"),f.emit("search.completed",{query:I,count:C.length,engine:"local",durationMs:Number((performance.now()-h).toFixed(2)),viewportBoosted:!0})},120);return()=>window.clearTimeout(i)},[I,me,be]);const Hn=g.useCallback(a=>{re(s=>{const i=O.length;if(i===0)return 0;const d=(s+a+i)%i;return f.emit("search.activeChanged",{query:I.trim(),index:d,count:i}),d})},[I,O.length]),zs=g.useCallback(a=>{const s=O[V];s&&$s(s,a)},[$s,V,O]),_u=g.useCallback(a=>{if(a.key==="ArrowDown"){a.preventDefault(),Hn(1);return}if(a.key==="ArrowUp"){a.preventDefault(),Hn(-1);return}if(a.key==="Enter"){a.preventDefault(),zs("keyboard-enter");return}a.key==="Escape"&&(D(""),G([]),re(0),f.emit("search.cleared"))},[zs,Hn]),Du=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},d=v.current.nodes.find(A=>A.id===a);if(!d)return;m(A=>Aa(A,v.current,{description:"Move nodes",mergeKey:null})),b([]);const u=Y.current.includes(a)?Y.current:[a],h=new Map(v.current.nodes.filter(A=>u.includes(A.id)).map(A=>[A.id,{x:A.x,y:A.y}])),C=h.get(a)??{x:d.x,y:d.y},S=v.current.settings.gridSnap??!0,M=A=>{const _=(A.clientX-i.x)/ae.current.scale,E=(A.clientY-i.y)/ae.current.scale,N=S?ol(C.x+_)-C.x:_,T=S?ol(C.y+E)-C.y:E;r(R=>({...R,nodes:R.nodes.map(Q=>{const Ne=h.get(Q.id);return Ne?{...Q,x:Ne.x+N,y:Ne.y+T}:Q}),updatedAt:new Date().toISOString()}))},k=()=>{window.removeEventListener("pointermove",M),window.removeEventListener("pointerup",k),f.emit("node.patch",{id:a,reason:"drag",gridSnap:S})};window.addEventListener("pointermove",M),window.addEventListener("pointerup",k,{once:!0})},[]),Bu=g.useCallback((a,s)=>{if(s.button!==0)return;s.preventDefault(),s.stopPropagation();const i=v.current.nodes.find(_=>_.id===a);if(!i)return;const d={x:s.clientX,y:s.clientY},u=pf(i);let h={width:i.width,height:i.height};m(_=>Aa(_,v.current,{description:"Resize node",mergeKey:null})),b([]),y(_=>_.includes(a)?_:[a]),se(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",M),window.removeEventListener("pointerup",k),window.removeEventListener("pointercancel",A)},S=_=>{const E=(_.clientX-d.x)/ae.current.scale,N=(_.clientY-d.y)/ae.current.scale;let T=i.width+E,R=i.height+N;if(_.shiftKey&&i.width>0&&i.height>0){const Q=Math.max(T/i.width,R/i.height);T=i.width*Q,R=i.height*Q}h={width:Math.round(ge(T,u.minWidth,u.maxWidth)),height:Math.round(ge(R,u.minHeight,u.maxHeight))},r(Q=>({...Q,nodes:Q.nodes.map(Ne=>Ne.id===a?{...Ne,...h}:Ne),updatedAt:new Date().toISOString()}))},M=_=>{S(_)},k=_=>{S(_),C(),f.emit("node.resize.completed",{id:a,width:h.width,height:h.height})},A=()=>{C(),f.emit("node.resize.cancelled",{id:a})};document.body.classList.add("is-resizing-node"),window.addEventListener("pointermove",M),window.addEventListener("pointerup",k,{once:!0}),window.addEventListener("pointercancel",A,{once:!0})},[]),Ou=g.useCallback(a=>{if(a.button!==0&&a.button!==1&&a.button!==2||a.target.closest(".canvas-node,.floating-panel,.canvas-toolbar,.global-input-shell,.runtime-status-cluster"))return;a.preventDefault();const s={x:a.clientX,y:a.clientY};if(a.shiftKey&&a.button===0){se(null),tt({startX:s.x,startY:s.y,currentX:s.x,currentY:s.y}),f.emit("selection.box.started",{x:Math.round(s.x),y:Math.round(s.y)});const h=()=>{document.body.classList.remove("is-selecting"),window.removeEventListener("pointermove",C),window.removeEventListener("pointerup",S),window.removeEventListener("pointercancel",M)},C=k=>{tt({startX:s.x,startY:s.y,currentX:k.clientX,currentY:k.clientY})},S=k=>{const A=hl({startX:s.x,startY:s.y,currentX:k.clientX,currentY:k.clientY});if(h(),tt(null),A.width<Wd&&A.height<Wd){f.emit("selection.box.cancelled",{reason:"too-small",width:Math.round(A.width),height:Math.round(A.height)});return}const _=Xf(A,ae.current),E=v.current.nodes.filter(N=>gl(N,_)).map(N=>N.id);y(E),f.emit("selection.box.completed",{count:E.length,width:Math.round(A.width),height:Math.round(A.height)})},M=()=>{h(),tt(null),f.emit("selection.box.cancelled",{reason:"pointer-cancelled"})};document.body.classList.add("is-selecting"),window.addEventListener("pointermove",C),window.addEventListener("pointerup",S,{once:!0}),window.addEventListener("pointercancel",M,{once:!0});return}y([]),se(null);const i={...ae.current},d=h=>{z({...i,x:i.x+h.clientX-s.x,y:i.y+h.clientY-s.y})},u=()=>{document.body.classList.remove("is-panning"),window.removeEventListener("pointermove",d),window.removeEventListener("pointerup",u)};document.body.classList.add("is-panning"),window.addEventListener("pointermove",d),window.addEventListener("pointerup",u,{once:!0})},[z]),Us=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"),d=a.ctrlKey||a.metaKey;if(i&&!d)return;const u=v.current.settings.wheelMode?d:!d;a.preventDefault();const h=ae.current;if(u){const C=Math.exp(-a.deltaY*.0012),S=ge(h.scale*C,as,ns),M=Bn(a.clientX,a.clientY);z({x:a.clientX-M.x*S,y:a.clientY-M.y*S,scale:S});return}z({...h,x:h.x-a.deltaX,y:h.y-a.deltaY})},[z,Bn]);g.useEffect(()=>{const a=Rn.current;if(a)return a.addEventListener("wheel",Us,{passive:!1}),()=>a.removeEventListener("wheel",Us)},[Us]);const X=o.nodes.find(a=>a.id===c[0]),Za=g.useMemo(()=>{const a=new Set(c);return o.nodes.filter(s=>a.has(s.id))},[o.nodes,c]),Wn=((zi=X==null?void 0:X.metadata)==null?void 0:zi[U.studioNodeType])??"",Fu=Wn?Gs(Wn):"Unassigned",$u=Wn==="template.input",Ti=g.useMemo(()=>Jd(je),[je]),Do=fe&&fe.issues.length===0?fe.template:null,Ri=g.useMemo(()=>zo(Do,Bt),[Bt,Do]),zu=g.useMemo(()=>Za.filter(a=>a.kind==="image"&&lo(a).length>0).length,[Za]),it=g.useMemo(()=>{const a=o.nodes.filter(d=>d.kind==="ai-task"),s=a.filter(d=>d.status==="running").length,i=a.filter(d=>d.status==="paused").length;return{total:a.length,runnable:a.filter(d=>d.status!=="running").length,running:s,paused:i,active:s+i}},[o.nodes]),Bo=g.useMemo(()=>{if(!X||X.kind!=="ai-task")return{size:0,runnable:0};const a=Ur(o,X.id);return{size:a.length,runnable:a.filter(s=>s.status!=="running").length}},[o,X]),va=g.useMemo(()=>{if(Za.length<2)return null;const a=is(Za);if(!a)return null;const s=Math.max(.01,le.scale),i=a.minX*s+le.x-10,d=a.minY*s+le.y-10,u=a.maxX*s+le.x+10,h=a.maxY*s+le.y+10,C=(i+u)/2,S=d>112?d-52:h+12;return{left:i,top:d,width:Math.max(0,u-i),height:Math.max(0,h-d),toolbarLeft:ge(C,168,Math.max(168,me.width-168)),toolbarTop:ge(S,42,Math.max(42,me.height-58))}},[Za,me.height,me.width,le]),aa=ie?o.nodes.find(a=>a.id===ie):null,Li=Lt?o.nodes.find(a=>a.id===Lt&&!!a.companyMode):null,Ei=Pt?o.nodes.find(a=>a.id===Pt&&a.kind==="directory"):null,Pi=g.useMemo(()=>new Set([...c,...O.map(a=>a.id),St,ie,Lt,Pt,he==null?void 0:he.from].filter(a=>!!a)),[Lt,he==null?void 0:he.from,Pt,St,ie,O,c]),ja=g.useMemo(()=>{const a=Yf(le,me);return o.nodes.filter(s=>Pi.has(s.id)||gl(s,a))},[Pi,o.nodes,me,le]),Hs=g.useMemo(()=>new Set(ja.map(a=>a.id)),[ja]);g.useEffect(()=>{f.emit("visibility.culled",{visible:ja.length,total:o.nodes.length,scale:Number(le.scale.toFixed(3))})},[o.nodes.length,le.scale,ja.length]);const Uu=g.useCallback(()=>{const a=v.current,s=Y.current.map(d=>a.nodes.find(u=>u.id===d)).find(Boolean),i=(s==null?void 0:s.kind)==="ai-task"?s:a.nodes.find(d=>Y.current.includes(d.id)&&d.kind==="ai-task")??a.nodes.find(d=>d.kind==="ai-task");return i?bl(a,i,w.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:",uo(w||(s==null?void 0:s.body)||"No prompt input.",4e3)].join(`
|
|
47
47
|
`)},[w]),_i=g.useMemo(()=>{const a=new Map(o.nodes.map(s=>[s.id,s]));return o.edges.map(s=>{const i=a.get(s.from),d=a.get(s.to);if(!i||!d)return null;const u={x:i.x+i.width,y:i.y+i.height/2},h={x:d.x,y:d.y+d.height/2},C=Math.max(70,Math.abs(h.x-u.x)*.42);return{...s,path:`M ${u.x} ${u.y} C ${u.x+C} ${u.y}, ${h.x-C} ${h.y}, ${h.x} ${h.y}`}}).filter(Boolean)},[o.edges,o.nodes]),Di=g.useMemo(()=>_i.filter(a=>Hs.has(a.from)||Hs.has(a.to)),[_i,Hs]),dt=g.useMemo(()=>Vf(o.nodes,le,me),[o.nodes,le,me]),Hu=g.useCallback(a=>{if(!dt)return;const s=a.currentTarget.getBoundingClientRect(),i=ge(a.clientX-s.left,0,os),d=ge(a.clientY-s.top,0,ss),u=dt.bounds.minX+(i-dn)/dt.scale,h=dt.bounds.minY+(d-dn)/dt.scale;z({...ae.current,x:me.width/2-u*ae.current.scale,y:me.height/2-h*ae.current.scale}),f.emit("minimap.navigate",{worldX:Math.round(u),worldY:Math.round(h)})},[z,dt,me.height,me.width]),na=o.settings.inputMode==="Image"?"Image":o.settings.inputMode==="Video"?"Video":null,$t=na==="Image"?Ic:na==="Video"?Nc:null,Wu=w.trim().length>0||(X==null?void 0:X.kind)==="ai-task",Bi=I.trim().length>0,Oi=O[V]??null,Vu=Bi?`${O.length} result${O.length===1?"":"s"}`:`${o.nodes.length} nodes`,Vn=et?hl(et):null,Oo=mr(o.settings.gridType),Fi=o.settings.gridSnap??!0,$i=o.settings.cameraBookmarks??{},Ws=Wt,Yu=ga==="full";return n.jsxs("div",{ref:Rn,className:`mindcanvas ${pt?"mindcanvas--read-mode":""} mindcanvas--function-toolbar-${ga}`,"data-function-toolbar-mode":ga,"data-read-mode":pt?"true":"false","data-read-mode-api":ws?"bound":"unbound","data-cursor-mode":o.settings.cursorMode??"center","data-cursor-direction":o.settings.cursorDirection==="down"?"down":"right",onPointerMove:jc,onDragOver:ju,onDrop:Iu,children:[n.jsx("div",{ref:Ot,className:`canvas-plane canvas-plane--grid-${Oo}`,"data-grid-type":Oo,"data-grid-snap":o.settings.gridSnap??!0?"on":"off",onPointerDown:Ou,onContextMenu:a=>a.preventDefault(),children:n.jsxs("div",{ref:Ya,className:"canvas-world","data-visible-nodes":ja.length,"data-total-nodes":o.nodes.length,"data-visible-edges":Di.length,children:[n.jsx("svg",{className:"edge-layer",width:"4000",height:"3000",viewBox:"-1200 -900 4000 3000","aria-hidden":"true",children:Di.map(a=>n.jsx("path",{className:`edge-path edge-path--${a.kind}`,d:a.path,onClick:()=>B(s=>({...s,edges:s.edges.filter(i=>i.id!==a.id)}),"edge.delete",{id:a.id})},a.id))}),n.jsx("div",{className:"canvas-cursor-marker","data-testid":"canvas-cursor-marker","data-cursor-mode":o.settings.cursorMode??"center","data-cursor-direction":o.settings.cursorDirection==="down"?"down":"right",style:{left:`${ee.x}px`,top:`${ee.y}px`},"aria-hidden":"true"}),ja.map(a=>n.jsx(ph,{node:a,selected:c.includes(a.id),pulsing:St===a.id,connectionDraft:he,onSelect:qc,onDragStart:Du,onResizeStart:Bu,onPatch:K,onDelete:vu,onDuplicate:Mu,onRun:ta,onPin:Eu,onOpenResult:se,onToggleAiReference:lu,onCopyNode:cu,onCopyEmbedReference:uu,onFitNodeHeight:mu,onToggleNodeExpanded:pu,onToggleWordWrap:gu,onStageCompany:hu,onOpenCompanyGraph:fu,onSyncCompanyGoal:bu,onRefreshCompany:yu,onSetCompanyStatus:ki,onRemoveCompany:wi,onOpenAsset:wu,onOpenDirectorySettings:ou,onScanDirectory:iu,onCreateRemoteControl:eu,onGenerateTemplateCard:Qc},a.id))]})}),Vn?n.jsx("div",{className:"canvas-selection-box",style:{left:Vn.left,top:Vn.top,width:Vn.width,height:Vn.height}}):null,va?n.jsxs(n.Fragment,{children:[n.jsx("div",{className:"canvas-multi-selection-bounds",style:{left:va.left,top:va.top,width:va.width,height:va.height}}),n.jsxs("div",{className:"multi-selection-toolbar floating-panel",role:"toolbar","aria-label":"Multi selection actions",style:{left:va.toolbarLeft,top:va.toolbarTop},children:[n.jsx("span",{className:"multi-selection-toolbar__count",children:Za.length}),n.jsx("button",{type:"button",title:"Copy selected nodes","data-testid":"multi-selection-copy",onClick:()=>void Os(),children:n.jsx(co,{size:15})}),n.jsx("button",{type:"button",title:"Duplicate selected nodes",onClick:()=>Bs("multi-toolbar"),children:n.jsx(Ml,{size:15})}),n.jsx("button",{type:"button",title:"Bring selected nodes to front","data-testid":"multi-selection-bring-front",onClick:()=>zn("front","multi-toolbar"),children:n.jsx(Km,{size:15})}),n.jsx("button",{type:"button",title:"Send selected nodes to back","data-testid":"multi-selection-send-back",onClick:()=>zn("back","multi-toolbar"),children:n.jsx(qm,{size:15})}),n.jsx("button",{type:"button",title:"Fit selected text heights",onClick:Nu,children:n.jsx(wd,{size:15})}),n.jsx("span",{className:"multi-selection-toolbar__separator"}),n.jsx("button",{type:"button",title:"Arrange selected nodes as grid",onClick:()=>Fs("grid"),children:n.jsx(vd,{size:15})}),n.jsx("button",{type:"button",title:"Arrange selected nodes as strip",onClick:()=>Fs("strip"),children:n.jsx(jd,{size:15})}),n.jsx("button",{type:"button",title:"Tidy selected nodes","data-testid":"multi-selection-tidy",onClick:()=>Fs("tidy"),children:n.jsx(Id,{size:15})}),zu>=2&&n.jsx("button",{type:"button",title:"Stack selected image nodes","data-testid":"multi-selection-merge-images",onClick:Au,children:n.jsx(Ho,{size:15})}),n.jsx("span",{className:"multi-selection-toolbar__separator"}),n.jsx("button",{type:"button",title:"Delete selected nodes",className:"is-danger","data-testid":"multi-selection-delete",onClick:()=>Ds("multi-toolbar"),children:n.jsx(cs,{size:15})}),n.jsx("button",{type:"button",title:"Clear selection","data-testid":"multi-selection-clear",onClick:()=>{const a=Y.current.length;y([]),f.emit("selection.cleared",{source:"multi-toolbar",beforeCount:a})},children:n.jsx(yt,{size:15})})]})]}):null,fo&&n.jsx("div",{className:"node-action-toast floating-panel",role:"status",children:fo}),n.jsxs("div",{className:"top-tabbar",role:"tablist","aria-label":"MindCanvas boards",children:[Wa.map(a=>{const s=a.id===o.id,i=Qe(a.name),d=gf(a,o,s);return n.jsxs("div",{className:`tab-shell ${s?"is-active":""} ${Gt===a.id?"is-dragging":""} ${It===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":Gt===a.id?"dragging":It===a.id?"over":"idle",onDragStart:u=>{u.dataTransfer.effectAllowed="move",u.dataTransfer.setData("text/plain",a.id),ma(a.id),f.emit("board.tabs.dragStart",{boardId:a.id})},onDragOver:u=>{!Gt||Gt===a.id||(u.preventDefault(),u.dataTransfer.dropEffect="move",za(a.id))},onDragLeave:()=>{za(u=>u===a.id?null:u)},onDrop:u=>{u.preventDefault();const h=Gt||u.dataTransfer.getData("text/plain");Sc(h,a.id),ma(null),za(null)},onDragEnd:()=>{ma(null),za(null)},onMouseDown:u=>{u.button===1&&(u.preventDefault(),Ns(a.id,"middle-click"))},children:[n.jsxs("button",{type:"button",role:"tab","aria-selected":s,className:`tab-button ${s?"tab-button--current":""}`,title:s?`Boards / ${i}`:i,"aria-label":d===i?i:`${d} board, ${i}`,"data-testid":"board-tab","data-board-id":a.id,"data-board-tab-title":i,"data-board-tab-display-title":d,onClick:()=>s?jo():ui(a.id),children:[a.sourceKind==="localBridge"?n.jsx(Zn,{size:15}):n.jsx(Ho,{size:15}),n.jsx("span",{children:d})]}),!s&&n.jsx("button",{type:"button",className:"tab-close",title:"Close tab","data-testid":"board-tab-close",onClick:u=>{u.stopPropagation(),Ns(a.id,"close-button")},children:n.jsx(yt,{size:13})})]},a.id)}),n.jsx("button",{type:"button",className:"tab-button tab-button--plain",title:"New board","data-testid":"board-create",onClick:ci,children:n.jsx(io,{size:16})})]}),Wt&&n.jsxs(n.Fragment,{children:[n.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:()=>At("backdrop")}),n.jsx("div",{className:"project-gallery-shell","data-project-gallery-shell":"true",children:n.jsx("div",{className:"project-gallery-positioner","data-project-gallery-positioner":"true",children:n.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":Ve.currentMode,"data-project-storage-selected-tab":Re,"data-project-storage-local-provider":Ve.localProviderKind,"data-project-storage-cloud-available":Ve.isCloudAvailable?"true":"false","data-project-storage-can-sync-cloud":Ve.canSyncLocalToCloud?"true":"false",children:[n.jsxs("header",{className:"local-board-panel__head project-gallery-panel__head",children:[n.jsxs("div",{className:"project-gallery-title",children:[n.jsxs("span",{className:"project-gallery-title__eyebrow",children:[n.jsx(vd,{size:15}),"Project Gallery"]}),n.jsx("strong",{children:"Projects"}),n.jsx("p",{children:"Select a canvas snapshot to focus an open tab or load it in a new tab."})]}),n.jsxs("div",{className:"local-board-panel__actions project-gallery-panel__actions",children:[n.jsx("button",{type:"button",title:"New board",onClick:ci,children:n.jsx(io,{size:15})}),n.jsx("button",{type:"button",title:"Close Project Gallery",onClick:()=>At("close-button"),children:n.jsx(yt,{size:15})})]})]}),n.jsxs("div",{className:"project-gallery-body",children:[n.jsxs("aside",{className:"project-gallery-folder-rail","data-project-gallery-folder-rail":"true",children:[n.jsxs("div",{className:"project-storage-tabs",role:"tablist","aria-label":"Project storage mode","data-project-storage-show-local":Ve.showLocalTab?"true":"false","data-project-storage-show-cloud":Ve.showCloudTab?"true":"false",children:[n.jsxs("button",{type:"button",role:"tab","aria-selected":Re==="local",className:Re==="local"?"is-active":"","data-testid":"project-storage-tab-local",onClick:()=>di("local"),children:[n.jsx(Zn,{size:14}),"Local"]}),n.jsxs("button",{type:"button",role:"tab","aria-selected":Re==="cloud",className:Re==="cloud"?"is-active":"","data-testid":"project-storage-tab-cloud",onClick:()=>di("cloud"),children:[n.jsx(Wo,{size:14}),"Cloud"]})]}),n.jsxs("label",{className:"project-gallery-current-name",children:[n.jsx("span",{children:"Current canvas"}),n.jsx("input",{"aria-label":"Board name",className:"board-name-input",maxLength:90,value:o.name,onChange:a=>As(a.target.value)})]}),n.jsxs("div",{className:"project-gallery-rail-card",children:[n.jsx("span",{children:"Storage"}),n.jsx("strong",{children:Re==="local"?`${ot.length} local boards`:"Cloud gated"}),n.jsx("small",{children:Re==="local"?`${Ve.localProviderKind} provider / browser catalog and LocalBridge boards`:Ve.cloudStatusMessage??"Auth adapter required"})]}),n.jsxs("div",{className:"project-gallery-rail-card project-gallery-workspace-summary","data-testid":"project-gallery-workspace-summary",children:[n.jsx("span",{children:"Local Workspace"}),n.jsx("strong",{title:at||void 0,children:Re==="local"?at?Zo(at):Sl(Te):"Cloud gated"}),n.jsx("small",{children:Re==="local"?at||Fe||"Connect LocalBridge to choose storage.":"Workspace selection is local only."})]}),n.jsxs("label",{className:"project-gallery-startup-toggle","data-testid":"project-gallery-show-at-startup",children:[n.jsx("input",{type:"checkbox",checked:xn,onChange:a=>pc(a.target.checked)}),n.jsx("span",{children:"Show at startup"})]})]}),n.jsx("section",{className:"project-gallery-board-area",children:Re==="local"?n.jsxs(n.Fragment,{children:[n.jsxs("div",{className:"local-board-section project-gallery-board-section",children:[n.jsxs("div",{className:"local-board-section__title",children:[n.jsx("span",{children:"Workspace"}),n.jsxs("small",{children:[ot.length," saved"]})]}),n.jsxs("div",{className:"local-board-list local-board-list--stored project-gallery-board-grid","data-project-gallery-board-grid":"true",children:[ot.map(a=>{const s=Ss===a.id,i=a.id===o.id;return n.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?n.jsxs("div",{className:"stored-board-rename",children:[n.jsx("input",{"aria-label":"Rename saved board",maxLength:90,value:ua,onChange:d=>$a(d.target.value),onKeyDown:d=>du(a.id,d),onPointerDown:d=>d.stopPropagation(),autoFocus:!0}),n.jsx("button",{type:"button",title:"Save board name","data-testid":"stored-board-rename-save",onClick:()=>_s(a.id),children:n.jsx(Js,{size:13})}),n.jsx("button",{type:"button",title:"Cancel rename","data-testid":"stored-board-rename-cancel",onClick:Ps,children:n.jsx(yt,{size:13})})]}):n.jsxs(n.Fragment,{children:[n.jsxs("button",{type:"button",className:"local-board-row__main","data-testid":"stored-board-open","data-project-gallery-open-board":"true",onClick:()=>ui(a.id),onDoubleClick:d=>{d.stopPropagation(),Si(a)},children:[a.sourceKind==="localBridge"?n.jsx(Zn,{size:15}):n.jsx(xt,{size:15}),n.jsxs("span",{children:[n.jsx("strong",{children:Qe(a.name)}),n.jsx("small",{children:qf(a)}),i&&n.jsx("small",{className:"project-gallery-open-tab-badge",children:"Open tab"})]})]}),n.jsx("button",{type:"button",className:"local-board-row__action",title:"Rename board","data-testid":"stored-board-rename",onClick:()=>Si(a),children:n.jsx(Nd,{size:14})}),n.jsx("button",{type:"button",className:"local-board-row__action",title:"Delete board","data-testid":"stored-board-delete",disabled:i,onClick:()=>Ns(a.id,"project-gallery"),children:n.jsx(cs,{size:14})})]})},a.id)}),ot.length===0&&n.jsx("p",{className:"local-board-message",children:"No saved React boards yet."})]})]}),n.jsxs("div",{className:"local-board-section project-gallery-bridge-section",children:[n.jsxs("div",{className:"local-board-section__title",children:[n.jsx("span",{children:"LocalBridge"}),n.jsx("button",{type:"button",title:"Refresh local boards",onClick:Be,disabled:Te==="checking",children:Te==="checking"?n.jsx(Ut,{size:15,className:"spin-icon"}):n.jsx(ln,{size:15})})]}),n.jsxs("div",{className:`local-board-state local-board-state--${Te}`,children:[Te==="blocked"?n.jsx(Il,{size:15}):Te==="unavailable"?n.jsx(Jm,{size:15}):n.jsx(Zn,{size:15}),n.jsx("span",{children:Sl(Te)}),Te==="blocked"&&!en()&&n.jsx("button",{type:"button",onClick:li,children:"Enable"})]}),wt&&n.jsx("p",{className:"local-board-message",children:wt}),n.jsxs("div",{className:"project-gallery-workspace-panel","data-testid":"project-gallery-workspace-panel","data-project-gallery-workspace-panel":"true",children:[n.jsxs("div",{className:"project-gallery-workspace-panel__main",children:[n.jsx(Zs,{size:16}),n.jsxs("span",{children:[n.jsx("strong",{children:"Local Workspace"}),n.jsx("small",{title:at||void 0,children:at||Fe||"LocalBridge workspace not connected."})]})]}),n.jsxs("div",{className:"project-gallery-workspace-panel__actions",children:[n.jsxs("button",{type:"button","data-testid":"project-gallery-workspace-refresh",title:"Refresh workspace",disabled:$e,onClick:()=>void gc("workspace-panel"),children:[n.jsx(ln,{size:14}),n.jsx("span",{children:"Refresh"})]}),n.jsxs("button",{type:"button","data-testid":"project-gallery-workspace-browse",title:"Select Local Storage",disabled:$e||Te==="blocked"&&!en(),onClick:()=>void hc(),children:[$e?n.jsx(Ut,{size:14,className:"spin-icon"}):n.jsx(Zs,{size:14}),n.jsx("span",{children:"Select Local Storage"})]})]}),Cn.length>0&&n.jsx("div",{className:"project-gallery-workspace-history","data-testid":"project-gallery-workspace-history",children:Cn.map(a=>n.jsx("button",{type:"button",title:a,disabled:$e||a===at,onClick:()=>void Is(a,"history"),children:Zo(a,40)},a))})]}),n.jsxs("button",{type:"button",className:"local-board-export","data-testid":"localbridge-export",disabled:Rt||!!((Ui=o.source)!=null&&Ui.partialImport)||!!((Hi=o.source)!=null&&Hi.truncated)||Te==="blocked"&&!en(),title:(Wi=o.source)!=null&&Wi.partialImport?"Export blocked for partial original imports":(Vi=o.source)!=null&&Vi.truncated?"Export blocked for truncated imported boards":"Export current board to LocalBridge",onClick:()=>void fc(),children:[Rt?n.jsx(Ut,{size:15,className:"spin-icon"}):n.jsx(Ad,{size:15}),n.jsx("span",{children:Rt?"Exporting":"Export current"})]}),n.jsx("div",{className:"local-board-list project-gallery-bridge-list",children:Vt.slice(0,14).map(a=>n.jsxs("button",{type:"button","data-testid":"localbridge-board-row","data-board-id":a.Id,className:"local-board-row",disabled:!!Le,onClick:()=>void kc(a),children:[n.jsx(Zn,{size:15}),n.jsxs("span",{children:[n.jsx("strong",{children:Qe(a.Title)}),n.jsx("small",{children:Or(a.UpdatedAt)})]}),Le===a.Id&&n.jsx(Ut,{size:15,className:"spin-icon"})]},a.Id))})]})]}):n.jsxs("div",{className:"project-cloud-shell","data-testid":"project-cloud-shell","data-project-cloud-status":Ve.isCloudAvailable?"available":"gated","data-project-cloud-plan":Ve.cloudPlanKey,"data-project-cloud-entitlement":Ve.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:[n.jsx("div",{className:"project-cloud-shell__icon",children:xe?n.jsx(Wo,{size:22}):n.jsx(Vr,{size:22})}),n.jsx("strong",{children:xe?"Cloud boards are provider-ready":"Cloud projects are adapter-gated"}),n.jsx("p",{children:xe?"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."}),n.jsxs("div",{className:"project-cloud-shell__current",children:[n.jsxs("span",{children:["Current: ",xe?"Cloud ready":"Local"]}),n.jsxs("small",{children:[Qe(o.name)," / ",kn??Ve.cloudStatusMessage??"saved in this browser"]})]}),n.jsxs("button",{type:"button","data-testid":"project-cloud-new-board",disabled:!xe||jt,title:xe?"Create and save a cloud board":"Cloud board creation requires the cloud adapter",onClick:xc,children:[jt?n.jsx(Ut,{size:14,className:"spin-icon"}):n.jsx(io,{size:14}),jt?"Saving":"New cloud board"]}),n.jsxs("button",{type:"button","data-testid":"project-cloud-save-current",disabled:!xe||jt,title:xe?"Save current board to Supabase":"Cloud save requires Supabase login",onClick:yc,children:[n.jsx(Ad,{size:14}),"Save current"]}),n.jsxs("button",{type:"button","data-testid":"project-cloud-refresh",disabled:!xe||jt,title:xe?"Refresh cloud boards":"Cloud refresh requires Supabase login",onClick:()=>void js("refresh-button"),children:[jt?n.jsx(Ut,{size:14,className:"spin-icon"}):n.jsx(ln,{size:14}),"Refresh cloud"]}),n.jsxs("button",{type:"button","data-testid":"project-cloud-login-shell",onClick:()=>e("/login"),children:[n.jsx(Wo,{size:14}),"Open login shell"]}),xe&&n.jsxs("div",{className:"local-board-list project-gallery-cloud-list","data-testid":"project-cloud-board-list",children:[Xt.map(a=>n.jsxs("button",{type:"button","data-testid":"project-cloud-board-row","data-board-id":a.id,className:"local-board-row",disabled:!!Oa,onClick:()=>void bc(a),children:[n.jsx(Wo,{size:15}),n.jsxs("span",{children:[n.jsx("strong",{children:Qe(a.name)}),n.jsxs("small",{children:[Or(a.updatedAt)," / ",a.nodeCount," nodes"]})]}),Oa===a.id&&n.jsx(Ut,{size:15,className:"spin-icon"})]},a.id)),Xt.length===0&&n.jsx("p",{className:"local-board-message",children:"No cloud boards loaded."})]})]})})]})]})})})]}),!Ws&&n.jsx(ah,{bridgeState:Te,bridgeMessage:wt,bridgeStatus:kt,syncStatus:_a,syncMessage:Yt,hostedBridgeAccessEnabled:en(),onRefreshBridge:Be,onEnableHostedBridge:li}),fa&&te&&n.jsx(gd,{launchers:ha,activeLauncher:te,template:Ye,selectedOptionId:st,values:Dt,validationMessage:Nn??(Va?null:Tn),canCreate:Va||!Tn,primaryLabel:Va?"Add template card":"Create board",onLauncherSelected:_c,onOptionSelected:Oc,onInputChanged:Fc,onCreate:Cc,onClose:Bc}),Co&&n.jsx("div",{className:"template-studio-chooser-backdrop","data-testid":"template-studio-chooser",onMouseDown:hi,children:n.jsxs("section",{className:"template-studio-chooser floating-panel",onMouseDown:a=>a.stopPropagation(),children:[n.jsxs("header",{className:"template-studio-chooser__head",children:[n.jsxs("div",{children:[n.jsx("span",{children:"Template Studio"}),n.jsx("strong",{children:"Current Canvas Authoring Mode"})]}),n.jsx("button",{type:"button",title:"Close Template Studio chooser","data-testid":"template-studio-chooser-close",onClick:hi,children:n.jsx(yt,{size:15})})]}),n.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."}),n.jsxs("div",{className:"template-studio-chooser__actions",children:[n.jsxs("button",{type:"button","data-testid":"template-studio-start-new",className:"template-studio-chooser__action",onClick:zc,children:[n.jsx("span",{className:"template-studio-chooser__icon",children:n.jsx(io,{size:17})}),n.jsxs("span",{children:[n.jsx("strong",{children:"New template board"}),n.jsx("small",{children:"Start a blank Studio draft on a new local board."})]})]}),n.jsxs("button",{type:"button","data-testid":"template-studio-convert-current",className:"template-studio-chooser__action",onClick:Uc,children:[n.jsx("span",{className:"template-studio-chooser__icon",children:n.jsx(Vo,{size:17})}),n.jsxs("span",{children:[n.jsx("strong",{children:"Convert current board"}),n.jsx("small",{children:"Keep this board and assign roles to existing nodes."})]})]})]})]})}),Ua&&n.jsxs(n.Fragment,{children:[n.jsxs("section",{className:"template-studio-toolbar-stack","data-testid":"template-studio-toolbar",onMouseDown:a=>a.stopPropagation(),children:[n.jsxs("div",{className:"template-studio-toolbar floating-panel",children:[n.jsxs("div",{className:"template-studio-toolbar__badge",children:[n.jsx(Ho,{size:15}),n.jsx("span",{children:"Template Studio"})]}),n.jsxs("div",{className:"template-studio-toolbar__meta",children:["Editing ",je.templateId]}),n.jsx("button",{type:"button",title:"Compile manifest","data-testid":"template-studio-compile",onClick:Ts,children:n.jsx(un,{size:15})}),n.jsx("button",{type:"button",title:"Test create board","data-testid":"template-studio-test-create",onClick:Yc,children:n.jsx(ia,{size:15})}),n.jsx("button",{type:"button",title:"Copy manifest JSON","data-testid":"template-studio-copy",onClick:()=>void Vc(),children:n.jsx(co,{size:15})}),n.jsx("button",{type:"button",title:"Save template draft","data-testid":"template-studio-save",onClick:Hc,children:n.jsx(Js,{size:15})}),n.jsx("button",{type:"button",title:"Exit Template Studio","data-testid":"template-studio-close",onClick:bi,children:n.jsx(yt,{size:15})})]}),n.jsx("div",{className:"template-studio-toolbar template-studio-toolbar--roles floating-panel",children:Ks.filter(a=>a.studioNodeType!=="template.note").map(a=>n.jsx("button",{type:"button",title:`Add ${a.label}`,"data-testid":"template-studio-add-node","data-studio-node-type":a.studioNodeType,onClick:()=>Wc(a.studioNodeType),children:n.jsx("span",{children:a.shortLabel})},a.studioNodeType))}),X&&n.jsxs("div",{className:"template-studio-toolbar template-studio-toolbar--selected floating-panel",children:[n.jsxs("div",{className:"template-studio-toolbar__meta template-studio-toolbar__meta--selected",children:["Selected: ",X.title||X.kind]}),Ks.map(a=>n.jsx("button",{type:"button",title:a.label,className:Wn===a.studioNodeType?"is-active":"","data-testid":"template-studio-role","data-studio-node-type":a.studioNodeType,onClick:()=>yi(a.studioNodeType),children:n.jsx("span",{children:a.shortLabel})},a.studioNodeType))]})]}),n.jsxs("aside",{className:"template-studio-panel floating-panel","data-testid":"template-studio-panel",onMouseDown:a=>a.stopPropagation(),children:[n.jsxs("header",{className:"template-studio-panel__head",children:[n.jsxs("div",{children:[n.jsx("span",{children:"Template Meta"}),n.jsx("strong",{children:je.templateTitle})]}),n.jsx("button",{type:"button",title:"Close Template Studio",onClick:bi,children:n.jsx(yt,{size:15})})]}),n.jsxs("div",{className:"template-studio-panel__body",children:[n.jsxs("section",{className:"template-studio-panel__section",children:[n.jsxs("label",{className:"template-studio-panel__field",children:[n.jsx("span",{children:"Template Id"}),n.jsx("input",{type:"text","data-testid":"template-studio-template-id",value:je.templateId,onChange:a=>Mo("templateId",a.target.value)})]}),n.jsxs("label",{className:"template-studio-panel__field",children:[n.jsx("span",{children:"Template Title"}),n.jsx("input",{type:"text",value:je.templateTitle,onChange:a=>Mo("templateTitle",a.target.value)})]}),n.jsxs("label",{className:"template-studio-panel__field",children:[n.jsx("span",{children:"Category"}),n.jsx("input",{type:"text",value:je.category,onChange:a=>Mo("category",a.target.value)})]}),n.jsxs("label",{className:"template-studio-panel__field",children:[n.jsx("span",{children:"Generated Board Title"}),n.jsx("input",{type:"text",value:je.boardTitle,onChange:a=>Mo("boardTitle",a.target.value)})]})]}),X?n.jsxs("section",{className:"template-studio-panel__section","data-testid":"template-studio-selected-node",children:[n.jsxs("div",{className:"template-studio-panel__node-summary",children:[n.jsx("strong",{children:X.title||X.kind}),n.jsx("span",{children:Fu})]}),n.jsxs("label",{className:"template-studio-panel__field",children:[n.jsx("span",{children:"Template Role"}),n.jsxs("select",{value:Wn,onChange:a=>yi(a.target.value),children:[n.jsx("option",{value:"",children:"Unassigned"}),Ks.map(a=>n.jsx("option",{value:a.studioNodeType,children:a.label},a.studioNodeType))]})]}),n.jsxs("label",{className:"template-studio-panel__field",children:[n.jsx("span",{children:"Template Node Id"}),n.jsx("input",{type:"text",value:((Yi=X.metadata)==null?void 0:Yi[U.templateNodeId])??"",onChange:a=>Ft(U.templateNodeId,a.target.value)})]}),n.jsxs("label",{className:"template-studio-panel__field",children:[n.jsx("span",{children:"Compile Target"}),n.jsxs("select",{value:((Xi=X.metadata)==null?void 0:Xi[U.compileTarget])??"",onChange:a=>Ft(U.compileTarget,a.target.value),children:[n.jsx("option",{value:"",children:"Auto"}),Sm.map(a=>n.jsx("option",{value:a,children:a},a))]})]}),$u?n.jsxs(n.Fragment,{children:[n.jsxs("label",{className:"template-studio-panel__field",children:[n.jsx("span",{children:"Input Key"}),n.jsx("input",{type:"text",value:((Gi=X.metadata)==null?void 0:Gi[U.inputKey])??"",onChange:a=>Ft(U.inputKey,a.target.value)})]}),n.jsxs("label",{className:"template-studio-panel__field",children:[n.jsx("span",{children:"Input Type"}),n.jsxs("select",{value:((Ki=X.metadata)==null?void 0:Ki[U.inputType])??"text",onChange:a=>Ft(U.inputType,a.target.value),children:[n.jsx("option",{value:"text",children:"Text"}),n.jsx("option",{value:"textarea",children:"Textarea"}),n.jsx("option",{value:"select",children:"Select"})]})]}),n.jsxs("label",{className:"template-studio-panel__checkbox",children:[n.jsx("input",{type:"checkbox",checked:(((qi=X.metadata)==null?void 0:qi[U.inputRequired])??"").toLowerCase()==="true",onChange:a=>Ft(U.inputRequired,String(a.target.checked))}),n.jsx("span",{children:"Required input"})]}),n.jsxs("label",{className:"template-studio-panel__field",children:[n.jsx("span",{children:"Placeholder"}),n.jsx("input",{type:"text",value:((Ji=X.metadata)==null?void 0:Ji[U.inputPlaceholder])??"",onChange:a=>Ft(U.inputPlaceholder,a.target.value)})]}),n.jsxs("label",{className:"template-studio-panel__field",children:[n.jsx("span",{children:"Default Value"}),n.jsx("input",{type:"text",value:((Zi=X.metadata)==null?void 0:Zi[U.inputDefaultValue])??"",onChange:a=>Ft(U.inputDefaultValue,a.target.value)})]}),n.jsxs("label",{className:"template-studio-panel__field",children:[n.jsx("span",{children:"Description"}),n.jsx("textarea",{value:((Qi=X.metadata)==null?void 0:Qi[U.inputDescription])??"",onChange:a=>Ft(U.inputDescription,a.target.value)})]}),n.jsxs("label",{className:"template-studio-panel__field",children:[n.jsx("span",{children:"Select Options"}),n.jsx("textarea",{placeholder:`value|label
|
|
48
48
|
value2|label2`,value:((ed=X.metadata)==null?void 0:ed[U.inputOptions])??"",onChange:a=>Ft(U.inputOptions,a.target.value)})]})]}):n.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."})]}):n.jsx("section",{className:"template-studio-panel__section",children:n.jsx("p",{className:"template-studio-panel__hint",children:"Select a canvas node to assign a template role."})}),n.jsxs("section",{className:"template-studio-panel__section",children:[n.jsxs("div",{className:"template-studio-panel__section-head",children:[n.jsx("span",{children:"Compiled Manifest"}),ko&&n.jsx("small",{children:ko})]}),fe!=null&&fe.issues.length?n.jsx("div",{className:"template-studio-panel__issues","data-testid":"template-studio-issues",children:fe.issues.map(a=>n.jsxs("div",{className:"template-studio-panel__issue",children:[n.jsx("strong",{children:a.code}),n.jsx("span",{children:a.message})]},`${a.code}-${a.message}`))}):null,fe?n.jsx("pre",{className:"template-studio-panel__manifest","data-testid":"template-studio-manifest",children:fe.manifestJson}):n.jsx("p",{className:"template-studio-panel__hint",children:"Compile to preview the JSON manifest for the selected Studio nodes."})]})]})]})]}),wo&&Do&&n.jsx(gd,{launchers:[Ti],activeLauncher:Ti,template:Do,selectedOptionId:null,values:Bt,validationMessage:Ha??Ri,canCreate:!Ri,onLauncherSelected:()=>{},onOptionSelected:()=>{},onInputChanged:Gc,onCreate:Kc,onClose:Xc}),n.jsx("input",{ref:En,type:"file",accept:"application/json,.json",multiple:!0,hidden:!0,"data-testid":"board-import-input",onChange:a=>{vc(a.currentTarget.files),a.currentTarget.value=""}}),!Ws&&n.jsxs(n.Fragment,{children:[n.jsx("div",{className:"canvas-toolbar",role:"toolbar","aria-label":Yu?"MindCanvas all tools":"MindCanvas curated tools","data-testid":"canvas-function-toolbar","data-function-toolbar-mode":ga,children:ga==="curated"?n.jsxs(n.Fragment,{children:[n.jsx("button",{type:"button",title:"Add note","data-testid":"note-node-add",onClick:()=>Se("note"),children:n.jsx(ls,{size:17})}),n.jsx("button",{type:"button",title:"Add image","data-testid":"image-node-add",onClick:()=>Se("image"),children:n.jsx(mn,{size:17})}),n.jsx("button",{type:"button",title:"Add video","data-testid":"video-node-add",onClick:()=>Se("video"),children:n.jsx(pn,{size:17})}),n.jsx("button",{type:"button",title:"Add remote monitor","data-testid":"remote-monitor-node-add",onClick:()=>Se("remote-monitor"),children:n.jsx(ds,{size:17})}),n.jsx("button",{type:"button",title:"Add AI Task","data-testid":"ai-task-node-add",onClick:()=>Se("ai-task"),children:n.jsx(cn,{size:17})}),n.jsx("button",{type:"button",title:"Add file reference","data-testid":"file-node-add",onClick:()=>Se("file"),children:n.jsx(wr,{size:17})}),n.jsx("button",{type:"button",title:"Tools",onClick:()=>e("/tools"),children:n.jsx(ts,{size:17})}),n.jsx("span",{className:"toolbar-separator"}),n.jsx("button",{type:"button",title:"Run all graphs","data-testid":"automation-run-all","data-ai-task-total":it.total,"data-ai-task-runnable":it.runnable,"data-ai-task-running":it.running,onClick:Ii,children:n.jsx(ia,{size:17})}),n.jsx("button",{type:"button",title:"Run selected graph","data-testid":"automation-run-selected","data-selected-graph-size":Bo.size,"data-selected-graph-runnable":Bo.runnable,disabled:!X||X.kind!=="ai-task",onClick:vi,children:n.jsx(Qs,{size:17})}),n.jsx("button",{type:"button",title:"Pause running AI tasks","data-testid":"automation-pause","data-running-ai-tasks":it.running,onClick:Ni,children:n.jsx(po,{size:17})}),n.jsx("button",{type:"button",title:"Stop active AI tasks","data-testid":"automation-stop","data-active-ai-tasks":it.active,"data-paused-ai-tasks":it.paused,onClick:Ai,children:n.jsx(Md,{size:15})}),n.jsx("button",{type:"button",title:"Generate flow",disabled:!X,onClick:Mi,children:n.jsx(Vo,{size:17})}),n.jsx("span",{className:"toolbar-separator"}),n.jsx("button",{type:"button",title:"Undo","data-testid":"history-undo",disabled:l.length===0,onClick:Po,children:n.jsx(Td,{size:17})}),n.jsx("button",{type:"button",title:"Redo","data-testid":"history-redo",disabled:p.length===0,onClick:_o,children:n.jsx(Rd,{size:17})})]}):n.jsxs(n.Fragment,{children:[n.jsx("button",{type:"button",title:"Add note","data-testid":"note-node-add",onClick:()=>Se("note"),children:n.jsx(ls,{size:17})}),n.jsx("button",{type:"button",title:"Add memo","data-testid":"memo-node-add",onClick:()=>Se("memo"),children:n.jsx(Al,{size:17})}),n.jsx("button",{type:"button",title:"Add markdown","data-testid":"markdown-node-add",onClick:()=>Se("markdown"),children:n.jsx(xt,{size:17})}),n.jsx("button",{type:"button",title:"Add CSV table","data-testid":"csv-table-node-add",onClick:()=>Se("csv-table"),children:n.jsx(jd,{size:17})}),n.jsx("button",{type:"button",title:"Add code","data-testid":"code-node-add",onClick:()=>Se("code"),children:n.jsx(un,{size:17})}),n.jsx("button",{type:"button",title:"Add AI Task","data-testid":"ai-task-node-add",onClick:()=>Se("ai-task"),children:n.jsx(cn,{size:17})}),n.jsx("button",{type:"button",title:"Add Code Note","data-testid":"code-note-node-add",onClick:Zc,children:n.jsx(un,{size:17})}),n.jsx("button",{type:"button",title:"Add Agent Command","data-testid":"agent-command-node-add",onClick:Jc,children:n.jsx(Zm,{size:17})}),n.jsx("button",{type:"button",title:"Add image generation spec","data-testid":"image-generate-node-add",onClick:()=>Se("ai-task","image-generate"),children:n.jsx(mn,{size:17})}),n.jsx("button",{type:"button",title:"Add video generation spec","data-testid":"video-generate-node-add",onClick:()=>Se("ai-task","video-generate"),children:n.jsx(pn,{size:17})}),n.jsx("button",{type:"button",title:"Add image","data-testid":"image-node-add",onClick:()=>Se("image"),children:n.jsx(mn,{size:17})}),n.jsx("button",{type:"button",title:"Add image mask","data-testid":"mask-node-add",onClick:()=>Se("mask"),children:n.jsx(Qm,{size:17})}),n.jsx("button",{type:"button",title:"Add video","data-testid":"video-node-add",onClick:()=>Se("video"),children:n.jsx(pn,{size:17})}),n.jsx("button",{type:"button",title:"Add embed","data-testid":"embed-node-add",onClick:()=>Se("embed"),children:n.jsx(gn,{size:17})}),n.jsx("button",{type:"button",title:"Add remote monitor","data-testid":"remote-monitor-node-add",onClick:()=>Se("remote-monitor"),children:n.jsx(ds,{size:17})}),n.jsx("button",{type:"button",title:"Add PDF","data-testid":"pdf-node-add",onClick:()=>Se("pdf"),children:n.jsx(xt,{size:17})}),n.jsx("button",{type:"button",title:"Add file reference","data-testid":"file-node-add",onClick:()=>Se("file"),children:n.jsx(wr,{size:17})}),n.jsx("button",{type:"button",title:"Add directory reference","data-testid":"directory-node-add",onClick:()=>Se("directory"),children:n.jsx(Zs,{size:17})}),n.jsx("button",{type:"button",title:"Templates","data-testid":"template-launcher-open",onClick:Dc,children:n.jsx(Ho,{size:17})}),n.jsx("button",{type:"button",title:"Template Studio",className:Ua||Co?"is-active":"","data-testid":"template-studio-open",onClick:$c,children:n.jsx(Nd,{size:17})}),n.jsx("button",{type:"button",title:"Import board JSON","data-testid":"board-import-open",onClick:wc,children:n.jsx(ep,{size:17})}),n.jsx("button",{type:"button",title:"Tools",onClick:()=>e("/tools"),children:n.jsx(ts,{size:17})}),n.jsx("span",{className:"toolbar-separator"}),n.jsx("button",{type:"button",title:"Run all graphs","data-testid":"automation-run-all","data-ai-task-total":it.total,"data-ai-task-runnable":it.runnable,"data-ai-task-running":it.running,onClick:Ii,children:n.jsx(ia,{size:17})}),n.jsx("button",{type:"button",title:"Run selected graph","data-testid":"automation-run-selected","data-selected-graph-size":Bo.size,"data-selected-graph-runnable":Bo.runnable,disabled:!X||X.kind!=="ai-task",onClick:vi,children:n.jsx(Qs,{size:17})}),n.jsx("button",{type:"button",title:"Pause running AI tasks","data-testid":"automation-pause","data-running-ai-tasks":it.running,onClick:Ni,children:n.jsx(po,{size:17})}),n.jsx("button",{type:"button",title:"Stop active AI tasks","data-testid":"automation-stop","data-active-ai-tasks":it.active,"data-paused-ai-tasks":it.paused,onClick:Ai,children:n.jsx(Md,{size:15})}),n.jsx("button",{type:"button",title:"Generate flow",disabled:!X,onClick:Mi,children:n.jsx(Vo,{size:17})}),n.jsx("span",{className:"toolbar-separator"}),n.jsx("button",{type:"button",title:"Undo","data-testid":"history-undo",disabled:l.length===0,onClick:Po,children:n.jsx(Td,{size:17})}),n.jsx("button",{type:"button",title:"Redo","data-testid":"history-redo",disabled:p.length===0,onClick:_o,children:n.jsx(Rd,{size:17})})]})}),n.jsxs("div",{className:"search-panel floating-panel","data-testid":"mindcanvas-search-panel","data-search-engine":oe,"data-search-worker-state":be,children:[n.jsxs("div",{className:"search-input-row",children:[n.jsx(tp,{size:16}),n.jsx("input",{ref:Xa,"data-testid":"mindcanvas-search-input","aria-label":"Search text",value:I,onChange:a=>D(a.target.value),onKeyDown:_u,placeholder:"Search text ..."}),n.jsx("span",{className:"search-count","data-testid":"mindcanvas-search-count","aria-live":"polite",children:Vu}),n.jsx("button",{type:"button",title:"Previous search result","data-testid":"mindcanvas-search-prev",disabled:O.length===0,onClick:()=>Hn(-1),children:n.jsx(ap,{size:14})}),n.jsx("button",{type:"button",title:"Next search result","data-testid":"mindcanvas-search-next",disabled:O.length===0,onClick:()=>Hn(1),children:n.jsx(Qn,{size:14})})]}),Bi&&n.jsx("div",{className:"search-current","data-testid":"mindcanvas-search-current","aria-live":"polite",children:Oi?n.jsxs(n.Fragment,{children:[n.jsxs("span",{children:[V+1," / ",O.length]}),n.jsxs("button",{type:"button","data-testid":"mindcanvas-search-focus",onClick:()=>zs("current-button"),children:["Focus ",Oi.title]})]}):n.jsx("span",{children:"No matches"})}),O.length>0&&n.jsx("div",{className:"search-results","data-testid":"mindcanvas-search-results",children:O.map((a,s)=>n.jsxs("button",{type:"button","data-testid":"mindcanvas-search-result",className:s===V?"is-active":"","aria-current":s===V?"true":void 0,onMouseEnter:()=>re(s),onClick:()=>$s(a,"result-click"),children:[n.jsx("strong",{children:a.title}),n.jsx("span",{children:a.body.slice(0,84)})]},a.id))})]})]}),he&&n.jsxs("div",{className:"connection-toast floating-panel",children:[n.jsx(Js,{size:14}),"Select a compatible node pin to create a ",he.kind," line.",n.jsx("button",{type:"button",onClick:()=>J(null),children:"Cancel"})]}),(aa==null?void 0:aa.result)&&n.jsxs("section",{className:"result-popover floating-panel","data-testid":"ai-result-popover",children:[n.jsxs("div",{className:"result-popover__header",children:[n.jsxs("strong",{children:[aa.title," Result"]}),n.jsx("button",{type:"button",title:"Close",onClick:()=>se(null),children:n.jsx(yt,{size:14})})]}),n.jsxs("div",{className:"result-popover__actions","data-testid":"ai-result-popover-actions",children:[n.jsxs("button",{type:"button",title:"Copy result",onClick:()=>void Tu(aa),children:[n.jsx(co,{size:14}),n.jsx("span",{children:"Copy"})]}),n.jsxs("button",{type:"button",title:"Archive result as a Markdown node",onClick:()=>Ru(aa),children:[n.jsx(xt,{size:14}),n.jsx("span",{children:"Archive"})]}),n.jsxs("button",{type:"button",title:"Stage a follow-up AI Task from this result",onClick:()=>Lu(aa),children:[n.jsx(cn,{size:14}),n.jsx("span",{children:"Follow-up"})]})]}),n.jsx("pre",{className:"result-popover__body",children:aa.result})]}),lt&&n.jsx(_h,{url:lt.url,fileName:lt.fileName,onClose:()=>{Me(null),f.emit("node.pdf.preview.close")}}),Ei&&n.jsx(km,{node:Ei,onSave:ru,onClose:su}),pa&&n.jsx(wm,{settings:o.settings,onPatchSettings:Ie,onClose:Ec}),Li&&n.jsx(Ph,{board:o,rootNode:Li,onClose:xu,onStatus:ki,onRemove:wi,onSubmitFollowUp:Su,onApproval:Cu,onAddArtifact:ku}),mt&&n.jsx(vm,{board:o,selectedNode:X??null,selectedCount:c.length,input:w,viewport:le,viewportSize:me,localBridgeState:Te,syncStatus:_a,syncMessage:Yt,buildPrompt:Uu,navigate:e,onClose:Pc}),!Ws&&n.jsxs("div",{className:"global-input-shell","data-active-submits":q,"data-submit-state":q>0?"active":"idle",children:[n.jsx("textarea",{ref:Ln,"data-testid":"global-input-textarea",value:w,placeholder:(X==null?void 0:X.kind)==="ai-task"?"Run selected AI Task...":"Talk with AI...",onChange:a=>L(a.target.value),onKeyDown:a=>{a.repeat||a.nativeEvent.isComposing||a.keyCode===229||(a.ctrlKey||a.metaKey)&&a.key==="Enter"&&(a.preventDefault(),ji())}}),n.jsxs("div",{className:"input-controls",children:[n.jsx("button",{className:`input-settings-button ${pa?"is-active":""}`,type:"button",title:"AI Settings","aria-label":"AI Settings","aria-pressed":pa?"true":void 0,"data-testid":"ai-settings-open",onClick:Lc,children:n.jsx(ts,{size:16})}),["Text","Image","Video"].map(a=>n.jsx("button",{className:o.settings.inputMode===a?"is-active":"",type:"button","data-testid":`global-input-mode-${a.toLowerCase()}`,onClick:()=>pi("inputMode",a),children:a},a)),o.settings.inputMode==="Text"&&n.jsxs(n.Fragment,{children:[n.jsxs("label",{className:"input-select-wrap input-select-wrap--text-model",title:On?`${Sr(On.provider)}: ${On.id}`:Ms,children:[n.jsx("span",{className:"input-select-provider",children:On?Sr(On.provider):"Custom"}),n.jsx("select",{"aria-label":"Text model","data-testid":"text-model-select",value:Ms,onChange:a=>Mc(a.target.value),children:Ac.map(a=>n.jsx("option",{value:a.id,children:a.label},a.id))}),n.jsx(Qn,{size:15})]}),n.jsxs("button",{className:"select-button",type:"button",title:"Effort",onClick:()=>pi("effort",o.settings.effort==="Normal"?"Deep":"Normal"),children:[o.settings.effort,n.jsx(Qn,{size:15})]})]}),na&&$t&&n.jsxs(n.Fragment,{children:[n.jsxs("label",{className:"input-select-wrap input-select-wrap--model",title:`${$t.model.provider}: ${$t.model.id}`,children:[n.jsx("span",{className:"input-select-provider",children:$t.model.provider}),n.jsx("select",{"aria-label":`${na} model`,value:$t.model.id,onChange:a=>Tc(na,a.target.value),children:md(na).map(a=>n.jsx("option",{value:a.id,children:a.label},a.id))}),n.jsx(Qn,{size:15})]}),n.jsxs("label",{className:"input-select-wrap input-select-wrap--aspect",title:$t.aspect.note,children:[n.jsx("span",{className:`aspect-select__swatch ${jm($t.aspect.id)}`}),n.jsx("select",{"aria-label":`${na} aspect ratio`,value:$t.aspect.id,onChange:a=>Rc(na,a.target.value),children:$t.aspectOptions.map(a=>n.jsx("option",{value:a.id,children:a.label},a.id))}),n.jsx(Qn,{size:15})]})]}),n.jsx("span",{className:"global-submit-count","aria-live":"polite",children:q}),n.jsx("button",{className:"send-button",type:"button",title:"Submit","data-testid":"global-input-submit",disabled:!Wu,onClick:ji,children:n.jsx(Qs,{size:18})})]})]}),n.jsxs("div",{className:"canvas-view-control-stack","data-testid":"canvas-view-controls",children:[n.jsxs("section",{className:"canvas-view-panel floating-panel","aria-label":"Canvas grid controls","data-testid":"canvas-grid-controls",children:[tc.map(a=>n.jsx("button",{type:"button",title:`Use ${a} grid`,"aria-label":`Use ${a} grid`,"aria-pressed":Oo===a,className:Oo===a?"is-active":"","data-testid":`canvas-grid-mode-${a}`,onClick:()=>au(a),children:a==="dot"?n.jsx(np,{size:15}):a==="line"?n.jsx(op,{size:15}):a==="particles"?n.jsx(Id,{size:15}):n.jsx(Vo,{size:15})},a)),n.jsx("span",{className:"canvas-view-panel__separator"}),n.jsx("button",{type:"button",title:"Toggle grid snap","aria-label":"Toggle grid snap","aria-pressed":Fi,className:Fi?"is-active":"","data-testid":"canvas-grid-snap-toggle",onClick:nu,children:n.jsx(sp,{size:15})})]}),n.jsxs("section",{className:"canvas-bookmark-strip floating-panel","aria-label":"Camera bookmarks","data-testid":"camera-bookmark-strip",children:[n.jsx("button",{type:"button",title:"Go to home view","aria-label":"Go to home view","data-testid":"camera-bookmark-home",onClick:Rs,children:n.jsx(rp,{size:15})}),(()=>{const a=!!Jo($i[ra]);return n.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?ka(ra):Fn(ra)},children:n.jsx("span",{"aria-hidden":"true",children:"N"})})})(),ir.map(a=>{const s=!!Jo($i[a]);return n.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?ka(a):Fn(a)},children:n.jsx("span",{"aria-hidden":"true",children:a})},a)}),n.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:tu,children:n.jsx(ip,{size:15})})]})]}),n.jsxs("div",{className:"bottom-controls",children:[n.jsx("button",{type:"button",title:"Mouse wheel mode","aria-label":"Toggle mouse wheel mode","aria-pressed":o.settings.wheelMode,className:o.settings.wheelMode?"is-active":"","data-testid":"canvas-wheel-mode-toggle","data-wheel-mode":o.settings.wheelMode?"mouse":"trackpad",onClick:()=>Ls("button"),children:n.jsx(dp,{size:17})}),n.jsx("button",{type:"button",title:`Cursor direction ${o.settings.cursorDirection==="down"?"down":"right"}`,"aria-label":"Toggle cursor direction","aria-pressed":o.settings.cursorDirection==="down",className:o.settings.cursorDirection==="down"?"is-active":"","data-testid":"canvas-cursor-direction-toggle","data-cursor-direction":o.settings.cursorDirection==="down"?"down":"right",onClick:()=>Es("button"),children:n.jsx(lp,{size:17})}),n.jsx("button",{type:"button",title:"Reset fixture",onClick:Pu,children:n.jsx(cp,{size:17})}),n.jsx("button",{type:"button",title:pt?"Exit read mode":"Fullscreen","aria-label":pt?"Exit read mode":"Fullscreen","aria-pressed":pt,className:pt?"is-active":"","data-testid":"canvas-read-mode-toggle","data-read-mode":pt?"true":"false",onClick:()=>{$n("button")},children:n.jsx(wd,{size:17})})]}),o.settings.minimapEnabled&&dt&&n.jsxs("section",{className:"canvas-minimap floating-panel","aria-label":"Canvas minimap","data-testid":"canvas-minimap",children:[n.jsxs("div",{className:"canvas-minimap__head",children:[n.jsx("span",{children:"Minimap"}),n.jsx("small",{children:o.nodes.length})]}),n.jsxs("button",{type:"button",className:"canvas-minimap__stage","aria-label":"Navigate canvas minimap","data-testid":"canvas-minimap-stage",onPointerDown:Hu,children:[dt.nodes.map(a=>n.jsx("span",{className:`canvas-minimap__node canvas-minimap__node--${a.kind} ${c.includes(a.id)?"is-selected":""}`,style:{left:`${a.x}px`,top:`${a.y}px`,width:`${a.width}px`,height:`${a.height}px`}},a.id)),n.jsx("span",{className:"canvas-minimap__viewport",style:{left:`${dt.viewport.x}px`,top:`${dt.viewport.y}px`,width:`${dt.viewport.width}px`,height:`${dt.viewport.height}px`}})]})]}),n.jsxs("div",{className:"canvas-status",children:[o.nodes.length," nodes / ",ja.length," rendered / ",o.edges.length," edges / ",Math.round(le.scale*100),"%",((td=o.source)==null?void 0:td.kind)==="localBridge"&&n.jsxs(n.Fragment,{children:[" ","/ LocalBridge",o.source.partialImport?" partial":"",o.source.truncated?` ${o.source.renderedNodeCount}/${o.source.originalNodeCount}`:""]})]})]})}function Sl(e){switch(e){case"checking":return"Checking";case"connected":return"Connected";case"blocked":return"Access gated";case"unavailable":return"Unavailable";default:return"Idle"}}export{jb as MindCanvas};
|