mindexec-ai 0.2.385
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +354 -0
- package/codex-runtime.js +1339 -0
- package/launch-bridge.cjs +236 -0
- package/package.json +77 -0
- package/port-guard.cjs +232 -0
- package/remote-fast/osx-arm64/mindexec-remote-fast +0 -0
- package/remote-fast/osx-arm64/mindexec-remote-fast.deps.json +24 -0
- package/remote-fast/osx-arm64/mindexec-remote-fast.dll +0 -0
- package/remote-fast/osx-arm64/mindexec-remote-fast.runtimeconfig.json +13 -0
- package/remote-fast/osx-x64/mindexec-remote-fast +0 -0
- package/remote-fast/osx-x64/mindexec-remote-fast.deps.json +24 -0
- package/remote-fast/osx-x64/mindexec-remote-fast.dll +0 -0
- package/remote-fast/osx-x64/mindexec-remote-fast.runtimeconfig.json +13 -0
- package/remote-fast/win-x64/mindexec-remote-fast.deps.json +24 -0
- package/remote-fast/win-x64/mindexec-remote-fast.dll +0 -0
- package/remote-fast/win-x64/mindexec-remote-fast.exe +0 -0
- package/remote-fast/win-x64/mindexec-remote-fast.runtimeconfig.json +20 -0
- package/remote-hub.js +3106 -0
- package/scripts/auth-session-smoke.mjs +262 -0
- package/scripts/remote-agent-managed-smoke.mjs +291 -0
- package/scripts/remote-agent-package-smoke.mjs +64 -0
- package/scripts/remote-agent-ws-smoke.mjs +202 -0
- package/scripts/remote-fast-live-rate-smoke.mjs +355 -0
- package/scripts/remote-fast-mdm-browser-smoke.mjs +476 -0
- package/scripts/remote-fleet-render-smoke.mjs +1491 -0
- package/scripts/remote-frame-ws-smoke.mjs +234 -0
- package/scripts/remote-http-smoke.mjs +592 -0
- package/scripts/remote-hub-identity-smoke.mjs +146 -0
- package/scripts/remote-hub-scale-smoke.mjs +124 -0
- package/scripts/remote-hub-smoke.mjs +631 -0
- package/scripts/remote-input-ws-smoke.mjs +263 -0
- package/scripts/remote-registry-follower-smoke.mjs +752 -0
- package/scripts/setup-tree-sitter-grammars.mjs +80 -0
- package/server.js +15709 -0
- package/start-bridge.bat +32 -0
- package/start-bridge.sh +81 -0
- package/tree-sitter-grammars/README.md +18 -0
- package/tree-sitter-grammars/tree-sitter-c_sharp.wasm +0 -0
- package/tree-sitter-grammars/tree-sitter-go.wasm +0 -0
- package/tree-sitter-grammars/tree-sitter-java.wasm +0 -0
- package/tree-sitter-grammars/tree-sitter-javascript.wasm +0 -0
- package/tree-sitter-grammars/tree-sitter-python.wasm +0 -0
- package/tree-sitter-grammars/tree-sitter-rust.wasm +0 -0
- package/tree-sitter-grammars/tree-sitter-tsx.wasm +0 -0
- package/tree-sitter-grammars/tree-sitter-typescript.wasm +0 -0
- package/wwwroot/_headers +73 -0
- package/wwwroot/_redirects +1 -0
- package/wwwroot/appsettings.json +83 -0
- package/wwwroot/assets/AdminDashboardPage-B2vz2Px9.css +1 -0
- package/wwwroot/assets/AdminDashboardPage-DnuCHywn.js +1 -0
- package/wwwroot/assets/AppSidebar-DU2OgSiv.js +2 -0
- package/wwwroot/assets/AuthPages-BrH6kRcv.css +1 -0
- package/wwwroot/assets/AuthPages-Dgezl7Vj.js +1 -0
- package/wwwroot/assets/CodePage-7kgZlB3O.js +87 -0
- package/wwwroot/assets/CodePage-Bncc352E.css +1 -0
- package/wwwroot/assets/CompanyCorePage-ChBnq1ve.css +1 -0
- package/wwwroot/assets/CompanyCorePage-CzIZIIU_.js +13 -0
- package/wwwroot/assets/ExecutionModePage-B-etp_mc.js +18 -0
- package/wwwroot/assets/ExecutionModePage-TLuld9l3.css +1 -0
- package/wwwroot/assets/LaunchLeadCapture-Bx9LM0IX.js +1 -0
- package/wwwroot/assets/LaunchLeadCapture-CiRI1shz.css +1 -0
- package/wwwroot/assets/MarketingHome-BsyerRpe.js +1 -0
- package/wwwroot/assets/MarketingHome-DPzaYzA_.css +1 -0
- package/wwwroot/assets/MindCanvas-DtqOZnoW.css +1 -0
- package/wwwroot/assets/MindCanvas-zEDXzaxW.js +49 -0
- package/wwwroot/assets/PlanMasterPage-CJ36rep-.css +1 -0
- package/wwwroot/assets/PlanMasterPage-NZ_mPvaE.js +4 -0
- package/wwwroot/assets/PricingPage-Cg_0i_ZR.css +1 -0
- package/wwwroot/assets/PricingPage-Ylrn8l2g.js +1 -0
- package/wwwroot/assets/ToolPages-3M2KqA9k.js +28 -0
- package/wwwroot/assets/ToolPages-DIB187pZ.css +1 -0
- package/wwwroot/assets/YouTubeSearchPage-COv1oAA7.js +4 -0
- package/wwwroot/assets/YouTubeSearchPage-IPPa_BIH.css +1 -0
- package/wwwroot/assets/app-runtime-xD2Z3NdN.js +1 -0
- package/wwwroot/assets/canvas-runtime-BbicBcOj.js +44 -0
- package/wwwroot/assets/code-agent-runtime-B5PPZd1t.js +74 -0
- package/wwwroot/assets/executionModeSettings-NJqurj-o.js +1 -0
- package/wwwroot/assets/index-CQMKCp-t.js +2 -0
- package/wwwroot/assets/index-yNpEK-gp.css +1 -0
- package/wwwroot/assets/marketingTools-DN_rnHeB.js +4 -0
- package/wwwroot/assets/mindCanvasSearchWorker-BzPMsHOB.js +1 -0
- package/wwwroot/assets/mindexecution-mindcanvas.png +0 -0
- package/wwwroot/assets/mindexecution-prod-home-current.png +0 -0
- package/wwwroot/assets/mindexecution-prod-pricing-current.png +0 -0
- package/wwwroot/assets/pricingCheckoutShell-O-DnwmbU.js +1 -0
- package/wwwroot/assets/productionAdapterConfig-C5jfk6oG.js +1 -0
- package/wwwroot/assets/runtimeSettingsPersistenceProjection-BoNWmYjU.js +1 -0
- package/wwwroot/assets/storage-TM3YrWaj.js +1 -0
- package/wwwroot/assets/supabaseAuthAdapter-DA43DeSY.js +44 -0
- package/wwwroot/assets/toolHandoff-D5e5f7t5.js +4 -0
- package/wwwroot/assets/vendor-icons-DE3gIReG.js +681 -0
- package/wwwroot/assets/vendor-msgpack-BE8aAsr3.js +1 -0
- package/wwwroot/assets/vendor-react-BXzpOyCS.js +40 -0
- package/wwwroot/favicon.svg +7 -0
- package/wwwroot/index.html +22 -0
- package/wwwroot/manifest.webmanifest +19 -0
- package/wwwroot/robots.txt +4 -0
- package/wwwroot/service-worker.js +7 -0
- package/wwwroot/sitemap.xml +39 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
var Jm=Object.defineProperty;var Zm=(e,t,n)=>t in e?Jm(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var _l=(e,t,n)=>Zm(e,typeof t!="symbol"?t+"":t,n);import{r as g,j as o,a as Qm}from"./vendor-react-BXzpOyCS.js";import{l as ep,a as kt,s as ea,b as tp,d as ap,r as np,c as op,e as sp,i as Bl}from"./storage-TM3YrWaj.js";import{r as pi,g as $s,w as rp,a as hr,d as Dl,b as ip,t as gi,n as hi,c as Hr,e as lp,p as dc,v as dp,R as cp,f as up,l as fi,u as mp,h as pp,i as Ol,s as tt,j as ro,k as fr,m as io,o as is,q as lo,x as co,y as ls,z as ta,A as $l,B as Oa,C as gp,D as Fl,E as hp,F as fp,G as bp,H as yp,I as xp,J as Cp,K as kp,L as na,M as cc,T as Sp,N as wp,O as Ul,P as uo,Q as uc,S as Wr,U as Vr,V as mc,W as ds,X as ks,Y as yo,Z as zl,_ as K,$ as br,a0 as xo,a1 as vp,a2 as jp,a3 as Hl,a4 as Wl,a5 as yr,a6 as Ip,a7 as Np,a8 as Ap,a9 as Mp,aa as Tp,ab as Rp,ac as Lp,ad as Pp,ae as Ep,af as _p,ag as Bp}from"./canvas-runtime-BbicBcOj.js";import{e as Dp,d as Op}from"./vendor-msgpack-BE8aAsr3.js";import{R as f}from"./app-runtime-xD2Z3NdN.js";import{g as xr,A as Vl,a as Ss}from"./index-CQMKCp-t.js";import{r as pc}from"./productionAdapterConfig-C5jfk6oG.js";import{getSupabaseBrowserClient as Fs}from"./supabaseAuthAdapter-DA43DeSY.js";import{c as $p,a as Fp,r as Yl}from"./toolHandoff-D5e5f7t5.js";import{a as Gl,s as Up}from"./executionModeSettings-NJqurj-o.js";import{a as Kl,p as zp}from"./runtimeSettingsPersistenceProjection-BoNWmYjU.js";import{A as Hp,D as Wp,E as Cn,w as kn,I as Sn,V as wn,l as Rs,F as St,J as Vp,N as Yr,O as Ls,Q as vn,W as gc,Y as Yp,Z as hc,_ as Gp,i as So,$ as fc,a0 as Kp,a1 as Xl,a2 as Xp,a3 as ya,a4 as ql,T as Ps,a5 as Jl,a6 as jo,a7 as qp,R as jn,a8 as ws,a9 as bc,aa as Gr,X as Ot,o as yc,ab as Jp,ac as Zp,f as Qp,ad as Zl,ae as eg,h as Co,x as tg,af as ag,ag as ng,ah as Ql,ai as ed,aj as td,g as ad,ak as cs,H as mo,al as us,s as Cr,am as nd,an as aa,c as og,ao as sg,ap as kr,aq as od,ar as rg,as as ms,at as Sr,au as sd,av as rd,aw as id,ax as ig,ay as lg,az as dg,aA as cg,n as ug,aB as mg,aC as pg,aD as gg,aE as hg,aF as fg,aG as bg,aH as yg,aI as xg}from"./vendor-icons-DE3gIReG.js";const Cg=1200,Va="LocalBridgeOriginalNodeId";function wt(e){return typeof e=="object"&&e!==null}function fa(e,t){const n=Number(e);return Number.isFinite(n)?n:t}function ee(e){return typeof e=="string"?e:""}function xc(){return typeof window<"u"?{width:window.innerWidth||1280,height:window.innerHeight||720}:{width:1280,height:720}}function Kr(e,t,n){const r=Number(e),d=Number(t),c=Number(n);if(!Number.isFinite(r)||!Number.isFinite(d)||!Number.isFinite(c)||c<=0)return null;const m=1400/c,y=xc();return{x:y.width/2-r*m,y:y.height/2-d*m,scale:m}}function kg(e){return wt(e)?Kr(e.x??e.X,e.y??e.Y,e.z??e.Z):null}function Sg(e){if(!wt(e))return null;const t=Number(e.x),n=Number(e.y),r=Number(e.scale);if(!Number.isFinite(t)||!Number.isFinite(n)||!Number.isFinite(r)||r<=0)return null;const d=xc();return{x:(d.width/2-t)/r,y:(d.height/2-n)/r,z:1400/r}}function wg(e){const t=String(e||"").trim();if(t)try{const n=JSON.parse(t);if(!wt(n))return;const r={};for(const[d,c]of Object.entries(n)){const m=kg(c);m&&(r[d]=m)}return Object.keys(r).length>0?r:void 0}catch{return}}function vg(e){if(!e||Object.keys(e).length===0)return null;const t={};for(const[n,r]of Object.entries(e)){const d=Sg(r);d&&(t[n]=d)}return Object.keys(t).length>0?JSON.stringify(t):null}function Es(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 Us(){return crypto.randomUUID()}function bi(e){return wt(e)?"ContentType"in e||"Prompt"in e||"Response"in e||"PositionX"in e||"PositionY"in e||"SourceFilePath"in e||"ImageStack"in e:!1}function ld(e){const t=ee(e).trim();if(!t)return null;try{return JSON.parse(t)}catch{return null}}function Xr(e){if(Array.isArray(e))return e;if(!wt(e))return[];for(const t of["Nodes","nodes","Items","items","Content","content","Upserts","upserts"])if(t in e){const n=e[t];if(Array.isArray(n))return n;const r=ld(n);if(r)return Xr(r)}for(const t of["ContentJson","contentJson","content_json"])if(t in e){const n=ld(e[t]);if(n)return Xr(n)}return bi(e)?[e]:[]}function yi(e){return wt(e)?"BoardId"in e&&("Upserts"in e||"upserts"in e||"Deletes"in e||"deletes"in e):!1}function Cc(e){if(!wt(e))return 0;for(const t of["Deletes","deletes"]){const n=e[t];if(Array.isArray(n))return n.length}return 0}function _s(e){return Xr(e).filter(bi)}function kc(e){return _s(e).length}function jg(e,t){var c;const n=[..._s(e)];if(!yi(t))return n;const r=new Set;for(const m of["Deletes","deletes"]){const y=t[m];if(Array.isArray(y))for(const p of y){const b=ee(p).trim();b&&r.add(b)}}if(r.size>0)for(let m=n.length-1;m>=0;m-=1){const y=ee((c=n[m])==null?void 0:c.Id).trim();y&&r.has(y)&&n.splice(m,1)}const d=new Map;n.forEach((m,y)=>{const p=ee(m.Id).trim();p&&d.set(p,y)});for(const m of _s(t)){const y=ee(m.Id).trim(),p=y?d.get(y):void 0;if(p!==void 0){n[p]=m;continue}y&&d.set(y,n.length),n.push(m)}return n}function Sc(e){const t=Array.isArray(e)?e.filter(wt):[];return new Map(t.filter(n=>n.NodeId).map(n=>[String(n.NodeId),n]))}async function qr(e,t){for(const n of e)try{const r=await pi(n,t);return{payload:JSON.parse(r.content),path:n}}catch{}return null}async function Ig(e,t){const n=`.mindexec/boards/${e}.msgpack`,r=`boards/${e}.msgpack`;for(const y of[n,r])try{const p=await ip(y,t);return{payload:Op(p),format:y===n?"msgpack":"legacy-msgpack",path:y}}catch{}const d=`.mindexec/boards/${e}.json`,c=`boards/${e}.json`,m=await qr([d,c],t);if(m)return{payload:m.payload,format:m.path===d?"json":"legacy-json",path:m.path};throw new Error(`LocalBridge board file not found: ${n}, ${r}, ${d}, ${c}`)}function Jr(e){const t=ee(e.Id).trim()||ee(e.BoardId).trim();return t?{Id:t,Title:ee(e.Title)||null,Description:ee(e.Description)||null,ThumbnailUrl:ee(e.ThumbnailUrl)||null,CreatedAt:ee(e.CreatedAt)||null,UpdatedAt:ee(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:ee(e.CameraBookmarks)||null}:null}function dd(e){return!wt(e)||bi(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 xi(e){if(Array.isArray(e))return e.filter(dd).map(t=>Jr(t)).filter(t=>!!t);if(dd(e)){const t=Jr(e);return t?[t]:[]}return[]}function Ng(e){const t=e.toLowerCase();return Ag(t)?"remote-control":Mg(t)?"remote-monitor":t==="templatelauncher"||t==="template-launcher"||t.includes("template launcher")?"template-launcher":t.includes("directory")?"directory":t.includes("pdf")?"pdf":t.includes("file")?"file":t.includes("mask")?"mask":t.includes("image")?"image":t.includes("video")?"video":t.includes("embed")?"embed":t==="csv-table"||t.includes("csv-table")||t.includes("csv table")?"csv-table":t.includes("markdown")?"markdown":t.includes("code")?"code":t==="text"||t==="text/plain"||t.includes("plain-text")||t.includes("plain text")?"text":t.includes("ai")||t.includes("task")?"ai-task":t.includes("memo")?"memo":"note"}function Ag(e){const t=e.trim().toLowerCase();if(!t)return!1;if(["remote-control","remote.control","remotecontrol","remote-device","remote.device","remotedevice","remote-fleet-device","remotefleet.device"].includes(t))return!0;const n=t.replace(/[^a-z0-9]+/g,"");return n.includes("remotecontrol")||n.includes("remotedevice")||n.includes("remotefleetdevice")}function Mg(e){const t=e.trim().toLowerCase();if(!t)return!1;if(["remote-monitor","remote.monitor","remotemonitor","remote-hub-monitor","remotehub.monitor","remotehub-monitor","multi-desktop-monitor","multidesktop.monitor","smartview.monitor"].includes(t))return!0;const n=t.replace(/[^a-z0-9]+/g,"");return n.includes("remotemonitor")||n.includes("remotehubmonitor")||n.includes("multidesktopmonitor")||n.includes("smartviewmonitor")}function Tg(e,t){const n=e.Metadata||{},r=n.ThumbnailUrl,d=n.OriginalUrl,c=n.OriginalPath;return gi(ee(r)||ee(d)||ee(c)||ee(e.Response),t)}function Rg(e,t,n){const r=e.ImageStack,d=Array.isArray(r==null?void 0:r.Variants)?r.Variants:[];if(d.length===0)return;const c=d.map((y,p)=>{const b=ee(y.AssetId).trim(),w=gi(b,n)||t;return w?{variantId:ee(y.VariantId)||`variant-${ee(e.Id)||p}`,imageUrl:w,assetId:b||void 0,caption:ee(y.Caption)||void 0,sourceNodeId:ee(e.Id)||void 0,createdAtUtc:ee(y.CreatedAtUtc)||void 0}:null}).filter(y=>!!y);if(c.length===0)return;const m=ee(r==null?void 0:r.ActiveVariantId);return{activeVariantId:c.some(y=>y.variantId===m)?m:c[0].variantId,variants:c,kind:ee(r==null?void 0:r.Kind)||"versions",title:ee(r==null?void 0:r.Title)||void 0,updatedAtUtc:ee(r==null?void 0:r.UpdatedAtUtc)||void 0}}function Lg(e,t){return!e||e.variants.length===0?t:(e.variants.find(r=>r.variantId===e.activeVariantId)??e.variants[0]).imageUrl||t}function Pg(e,t,n){var m,y,p,b,w,_;const r=(y=(m=e.imageStack)==null?void 0:m.variants)!=null&&y.length?e.imageStack.variants:e.imageUrl?[{variantId:`${e.id}:image`,imageUrl:e.imageUrl,assetId:Io(e.imageUrl,t)||e.imageUrl,title:e.title,sourceNodeId:e.id,createdAtUtc:n}]:[];if(r.length===0)return null;const d=r.map(N=>({VariantId:N.variantId||Us(),AssetId:N.assetId||Io(N.imageUrl,t)||N.imageUrl,CreatedAtUtc:N.createdAtUtc||n,Caption:N.caption||N.title||null}));return{ActiveVariantId:(p=e.imageStack)!=null&&p.activeVariantId&&d.some(N=>{var D;return N.VariantId===((D=e.imageStack)==null?void 0:D.activeVariantId)})?e.imageStack.activeVariantId:d[0].VariantId||"",Variants:d,Kind:((b=e.imageStack)==null?void 0:b.kind)||(d.length>1?"pile":"versions"),Title:((w=e.imageStack)==null?void 0:w.title)||e.title||null,UpdatedAtUtc:((_=e.imageStack)==null?void 0:_.updatedAtUtc)||n}}function Eg(e,t){const n=e.Metadata||{};return gi(ee(n.OriginalUrl)||ee(n.OriginalPath)||ee(n.SourceFilePath)||ee(e.SourceFilePath)||ee(e.Response),t)}function _g(e){const t={};for(const[n,r]of Object.entries(e??{}))typeof r=="string"?t[n]=r:r!=null&&(t[n]=String(r));return t}function Bg(e){switch(e){case"remote-monitor":return"remote-monitor";case"remote-control":return"remote-control";case"template-launcher":return"templateLauncher";case"directory":return"directory";case"pdf":return"pdf";case"file":return"file";case"image":return"image";case"mask":return"mask";case"video":return"video";case"embed":return"embed";case"code":return"code";case"markdown":return"markdown";case"csv-table":return"csv-table";case"memo":return"memo";case"text":return"text";case"ai-task":return"note";default:return"note"}}function Io(e,t){const n=String(e||"").trim();if(!n)return"";const r=t.replace(/\/+$/,"");return n.startsWith(`${r}/`)?n.slice(r.length+1):n.replace(/^\/+/,"")}function Dg(e,t){const n=new Map;for(const r of e){const d=t.get(r.from),c=t.get(r.to);!d||!c||n.has(c)||n.set(c,d)}return n}function Og(e){const t=new Set;return e.map(n=>{var p,b;const r=((p=n.metadata)==null?void 0:p[Va])||"",d=Es(r)?r:Es(n.id)?n.id:"",c=!!(d&&t.has(d)),m=d&&!c?d:Us(),y=((b=n.metadata)==null?void 0:b[Va])!==m;return t.add(m),{node:y?{...n,metadata:{...n.metadata??{},[Va]:m}}:n,originalId:m,assignedNodeId:!d||c,metadataStamped:y,duplicateOriginalId:c}})}function $g(e,t,n,r,d){var b,w,_;const c=Bg(e.kind),m=c==="image"||c==="mask"?Io(e.imageUrl,d):"",y=["video","pdf","file","directory","embed"].includes(c)?Io(e.assetUrl||e.sourceFilePath||e.body,d):"",p={...e.metadata??{},[Va]:t,ReactNodeId:e.id,ReactKind:e.kind};if(e.kind==="remote-monitor"&&(p.RemoteHub??(p.RemoteHub="Gated"),p.RemoteRoute??(p.RemoteRoute="Gated"),p.RemoteConnected??(p.RemoteConnected="0"),p.RemoteTotal??(p.RemoteTotal="30"),p.RemotePage??(p.RemotePage="1/1"),p.AdapterState??(p.AdapterState="adapter-gated")),e.kind==="remote-control"&&(p.SemanticType??(p.SemanticType="RemoteFleetDevice"),p.RemoteFleetSchemaVersion??(p.RemoteFleetSchemaVersion="remote-fleet-device@1"),p.RemoteRoute??(p.RemoteRoute="Gated"),p.RemoteInput??(p.RemoteInput="Off"),p.AdapterState??(p.AdapterState="adapter-gated")),e.kind==="mask"&&(p.ImageRouterMask??(p.ImageRouterMask="true"),p.SemanticType??(p.SemanticType="ImageEditMask")),e.kind==="embed"){const N=e.assetUrl||e.body||e.sourceFilePath||"";p.source??(p.source="embed"),p.renderMode??(p.renderMode="card"),p.provider??(p.provider="web"),p.sourceUrl??(p.sourceUrl=N),p.url??(p.url=N),p.AdapterState??(p.AdapterState="local-reference")}return e.kind==="video"&&(p.assetKind??(p.assetKind="video"),p.videoMode??(p.videoMode=(b=e.assetUrl)!=null&&b.startsWith(d)?"local_bridge":"local_reference"),p.AdapterState??(p.AdapterState=((w=e.metadata)==null?void 0:w.PromptOnly)==="true"?"adapter-gated":"local-reference")),(_=e.tags)!=null&&_.length&&(p.ReactTags=JSON.stringify(e.tags)),m&&(p.OriginalUrl=m,p.ThumbnailUrl=m),y&&(p.OriginalPath=y,p.SourceFilePath=y),{Id:t,ContentType:c,Prompt:e.title||c,Response:c==="image"||c==="mask"?m||e.body||null:c==="remote-monitor"?e.body||"RemoteHub monitor node. Frames and input stay adapter-gated until LocalBridge is connected.":c==="remote-control"?e.body||"Remote device control node. Frames and input stay adapter-gated until LocalBridge is connected.":y||e.body||null,PositionX:e.x,PositionY:e.y,PositionZ:0,IsLoading:e.status==="running",Width:Math.round(e.width),Height:Math.round(e.height),Children:[],ParentId:n||null,IsExpanded:!!e.isExpanded,OriginalHeight:Math.round(e.originalHeight??0),IsAiEnabled:e.aiEnabled!==!1,IsChunkedText:!!e.isChunkedText,TotalLineCount:Math.round(e.totalLineCount??0),SourceFilePath:e.sourceFilePath||y||null,ScrollOffset:e.scrollOffset??0,MaxScroll:e.maxScroll??0,CreatedAt:r,UpdatedAt:r,IsWordWrap:e.wordWrap??e.kind!=="code",Metadata:p,ImageStack:c==="image"?Pg(e,d,r):null}}function Fg(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 Ug(e,t,n){const r=ee(e.ContentType)||"note",d=ee(e.Prompt).trim(),c=ee(e.Response).trim(),m=_g(e.Metadata),y=ee(e.Id).trim();y&&(m[Va]??(m[Va]=y));const b=["true","1","yes"].includes(String(m.ImageRouterMask||m.IsMask||"").trim().toLowerCase())?"mask":Ng(r),w=b==="memo"&&["mindcanvasagent","agentcommand"].includes(String(m.SemanticType||m.semanticType||"").trim().toLowerCase()),_=b==="memo"&&["codenote","code-note"].includes(String(m.SemanticType||m.semanticType||"").trim().toLowerCase()),N=ee(e.SourceFilePath)||m.OriginalPath||m.SourceFilePath||"",D=b==="video"||b==="pdf"||b==="file"||b==="directory"||b==="embed"?Eg(e,n):void 0,O=d||e.SourceFilePath||r||"LocalBridge node",z=b==="image"?c||d||"Image asset":b==="mask"?c||d||"Image mask asset":b==="remote-monitor"?c||d||"RemoteHub monitor node. Frames and input stay adapter-gated until LocalBridge is connected.":b==="remote-control"?c||d||N||"Remote device control node. Frames and input stay adapter-gated until LocalBridge is connected.":b==="pdf"||b==="file"||b==="directory"||b==="embed"?c||N||d||r:c||d||N||"",U=w?500:_?400:b==="remote-monitor"?860:b==="remote-control"||b==="template-launcher"?560:b==="csv-table"?720:b==="embed"?460:b==="video"?420:b==="markdown"?380:b==="text"||b==="image"||b==="mask"?360:320,V=w||_?300:b==="remote-monitor"?640:b==="remote-control"?390:b==="template-launcher"?620:b==="csv-table"?420:b==="embed"?260:b==="video"?236:b==="markdown"?240:b==="text"?210:b==="image"||b==="mask"?260:180,Y=b==="image"||b==="mask"?Tg(e,n):void 0,ce=b==="image"?Rg(e,Y,n):void 0,le=!!(e.IsChunkedText||m.IsChunkedText==="true"),Pe=fa(e.TotalLineCount??m.TotalLineCount,0),ye=fa(e.ScrollOffset,0),We=fa(e.MaxScroll,0);return{id:String(e.Id||crypto.randomUUID()),kind:b,title:b==="remote-monitor"?d||"Multi Desktop Monitor":b==="remote-control"?d||m.RemoteFleetDeviceName||"Remote Device":b==="template-launcher"?d||"Template Launcher":O,body:z,x:fa((t==null?void 0:t.PositionX)??e.PositionX,0),y:fa((t==null?void 0:t.PositionY)??e.PositionY,0),width:Math.max(160,Math.min(900,fa((t==null?void 0:t.Width)??e.Width,U))),height:Math.max(120,Math.min(900,fa((t==null?void 0:t.Height)??e.Height,V))),status:e.IsLoading?"running":b==="ai-task"?"idle":void 0,imageUrl:Lg(ce,Y),imageStack:ce,assetUrl:D,sourceFilePath:N||void 0,isChunkedText:le||void 0,totalLineCount:le?Pe:void 0,scrollOffset:le?ye:void 0,maxScroll:le?We:void 0,isExpanded:typeof e.IsExpanded=="boolean"?e.IsExpanded:void 0,originalHeight:fa(e.OriginalHeight,0)||void 0,tags:w?["Agent Command",m.AgentCommandRequestedRole||"Researcher",m.AgentCommandStatus||"Draft"]:_?["Code Note",m.CodeNoteStatus||"Draft",m.CodeNoteSyncState||"Unlinked"]:b==="remote-monitor"?["Remote","Monitor","LocalBridge"]:b==="remote-control"?["Remote","Control","LocalBridge"]:["LocalBridge",r],metadata:b==="remote-monitor"?zg(m):b==="remote-control"?Hg(m):m,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 zg(e){return{RemoteHub:"Gated",RemoteRoute:"Gated",RemoteConnected:"0",RemoteTotal:"30",RemotePage:"1/1",AdapterState:"adapter-gated",...e}}function Hg(e){return{SemanticType:"RemoteFleetDevice",RemoteFleetSchemaVersion:"remote-fleet-device@1",RemoteFleetDeviceId:"",RemoteFleetDeviceName:"Remote Device",RemoteFleetDevicePlatform:"unknown",RemoteFleetDeviceConnected:"false",RemoteInput:"Off",RemoteHub:"Gated",RemoteRoute:"Gated",RemoteBaseUrl:"http://127.0.0.1:5147",AdapterState:"adapter-gated",...e}}function Wg(e,t){const n=[];for(const r of e){const d=String(r.Id||""),c=String(r.ParentId||"");!d||!c||!t.has(d)||!t.has(c)||n.push({id:`edge-local-${c}-${d}`,from:c,to:d,kind:"context"})}return n}async function Vg(e=$s()){const t=await pi(".mindexec/boards/_metadata.json",e),n=JSON.parse(t.content);return(Array.isArray(n)?n.filter(wt):[]).map(c=>Jr(c)).filter(c=>!!c).sort((c,m)=>String(m.UpdatedAt||"").localeCompare(String(c.UpdatedAt||"")))}async function Yg(e){try{const t=await pi(".mindexec/boards/_metadata.json",e),n=JSON.parse(t.content);return Array.isArray(n)?n.filter(wt):[]}catch{return[]}}async function Gg(e,t,n,r=$s(),d=null){var jt,It,P,Nt,At,ze;if((jt=e.source)!=null&&jt.partialImport)throw new Error("This board was imported from a partial original payload. Export is blocked to avoid data loss.");if((It=e.source)!=null&&It.truncated)throw new Error("This board was truncated during import. Export is blocked to avoid data loss.");const c=(P=e.source)!=null&&P.exportedByReact?String(e.source.boardId||""):"",m=Es(c),y=Es(c)?c:Us(),p=new Date().toISOString(),b=Og(e.nodes),w=b.map(H=>H.node),_=new Map(b.map(H=>[H.node.id,H.originalId])),N=Dg(e.edges,_),D=b.map(({node:H,originalId:pt})=>$g(H,pt,N.get(pt),p,r)),O=b.map(({node:H,originalId:pt})=>Fg(H,pt)),z=t.scale>0?t.scale:1,U=(window.innerWidth/2-t.x)/z,V=(window.innerHeight/2-t.y)/z,Y=1400/z,ce=Number((d==null?void 0:d.x)??((Nt=e.viewState)==null?void 0:Nt.cursorX)??0),le=Number((d==null?void 0:d.y)??((At=e.viewState)==null?void 0:At.cursorY)??0),Pe=(ze=e.nodes.find(H=>H.kind==="image"&&H.imageUrl))==null?void 0:ze.imageUrl,ye={Id:y,UserId:"00000000-0000-0000-0000-000000000000",Title:e.name||"Untitled Board",Description:"Exported from MindExec React",ThumbnailUrl:Io(Pe,r)||"",IsPublic:!1,CreatedAt:p,SyncedCloudBoardId:null,LastSyncedAt:null,LastCloudCopyStatus:null,UpdatedAt:p,LastCameraX:U,LastCameraY:V,LastCameraZ:Y,LastCursorX:Number.isFinite(ce)?ce:0,LastCursorY:Number.isFinite(le)?le:0,CameraBookmarks:vg(e.settings.cameraBookmarks)},We=`.mindexec/boards/${y}.msgpack`,vt=`.mindexec/boards/${y}.json`,nt=`.mindexec/boards/${y}.layout.json`,G=`.mindexec/boards/${y}.delta.json`,X=`boards/${y}.delta.json`,ue=await Yg(r),oe=[ye,...ue.filter(H=>ee(H.Id)!==y)],mt=Dp(D);await rp(We,mt,n,r),await hr(vt,JSON.stringify(D,null,2),n,r),await hr(nt,JSON.stringify(O,null,2),n,r),await hr(".mindexec/boards/_metadata.json",JSON.stringify(oe,null,2),n,r);const W=await Promise.allSettled([Dl(G,n,r),Dl(X,n,r)]);return f.emit("localBridge.board.exported",{boardId:y,nodes:D.length,edges:e.edges.length,snapshotFormat:"msgpack",msgpackBytes:mt.byteLength,jsonMirror:!0,deltaCleared:W.some(H=>H.status==="fulfilled"&&H.value.success),reusedBoardId:m,stableNodeIds:b.length,assignedNodeIds:b.filter(H=>H.assignedNodeId).length,metadataStampedNodeIds:b.filter(H=>H.metadataStamped).length,duplicateOriginalNodeIds:b.filter(H=>H.duplicateOriginalId).length}),{metadata:ye,source:{kind:"localBridge",boardId:y,loadedAt:p,originalNodeCount:D.length,renderedNodeCount:D.length,truncated:!1,exportedByReact:!0,snapshotFormat:"msgpack"},nodes:w,msgpackPath:We,boardPath:vt,layoutPath:nt}}async function Kg(e,t,n=$s()){const r=await Ig(e.Id,n);let d=new Map;const c=await qr([`.mindexec/boards/${e.Id}.layout.json`,`boards/${e.Id}.layout.json`],n);c&&(d=Sc(c.payload));let m=null;const y=await qr([`.mindexec/boards/${e.Id}.delta.json`,`boards/${e.Id}.delta.json`],n);y&&(m=y.payload);const p=m?xi(m)[0]:null,b=!!(m&&yi(m)),w=b?jg(r.payload,m):r.payload;return wc(w,t,{boardId:(p==null?void 0:p.Id)??e.Id,title:(p==null?void 0:p.Title)||e.Title||"LocalBridge Board",updatedAt:(p==null?void 0:p.UpdatedAt)??e.UpdatedAt,layoutPayload:Array.from(d.values()),baseUrl:n,cameraBookmarks:(p==null?void 0:p.CameraBookmarks)??e.CameraBookmarks,lastCursorX:(p==null?void 0:p.LastCursorX)??e.LastCursorX,lastCursorY:(p==null?void 0:p.LastCursorY)??e.LastCursorY,deltaApplied:b,deltaUpserts:m?kc(m):0,deltaDeletes:m?Cc(m):0,snapshotFormat:r.format})}function wc(e,t,n={}){const r=_s(e),d=yi(e),c=n.deltaUpserts??(d?r.length:0),m=n.deltaDeletes??(d?Cc(e):0),y=n.layoutPayload?Sc(n.layoutPayload):new Map,p=r.slice(0,Cg),b=p.map(le=>Ug(le,y.get(String(le.Id||"")),n.baseUrl??$s())),w=new Set(b.map(le=>le.id)),_=Wg(p,w),N=r.length>b.length,D=d,O=n.deltaApplied===!0,z=n.boardId||Us(),U=n.updatedAt||new Date().toISOString(),V=Number(n.lastCursorX),Y=Number(n.lastCursorY),ce=Number.isFinite(V)&&Number.isFinite(Y);return f.emit("localBridge.board.loaded",{boardId:z,nodes:b.length,originalNodes:r.length,truncated:N,snapshotFormat:n.snapshotFormat,partialImport:D,deltaImport:d,deltaApplied:O,deltaUpserts:c,deltaDeletes:m}),{id:`localBridge:${z}`,name:n.title||"LocalBridge Board",nodes:b,edges:_,settings:{...t,cameraBookmarks:wg(n.cameraBookmarks)},viewState:ce?{cursorX:V,cursorY:Y}:void 0,updatedAt:U,source:{kind:"localBridge",boardId:z,loadedAt:new Date().toISOString(),snapshotFormat:n.snapshotFormat,originalNodeCount:r.length,renderedNodeCount:b.length,truncated:N,partialImport:D,deltaImport:d,deltaApplied:O}}}const vc=new Set(["research","web-search","analyze","summarize","create","decision","human-review","image-generate","video-generate","output","ai-task"]);function Ci(e,t){const n=hi(e);return n!=="auto"?n:Ac(t)?"ko":Mc(t)?"ja":Tc(t)?"zh":"en"}function Xg(e,t){const n=Ci(t,e),r=[...vc].join(", ");return["Create a simple MindExec business execution flow for this objective:",e,"",Hr(n),`User-facing node "title" and "instruction" values MUST use ${lp(n)} unless the objective explicitly asks for another language.`,'JSON property names, internal "kind" values, and pin IDs MUST remain in English exactly as specified.',"","MindExec is not an n8n/Zapier-style automation grammar.","The user should feel they are arranging work sentences and business thinking, not triggers, apps, fields, JSON, webhooks, API steps, or low-level automation blocks.","","Most nodes will be rendered to the user as AI Task nodes.",'The "kind" field is primarily an internal execution intent hint that the user does not need to learn.',"Use image-generate or video-generate only when the graph truly needs an explicit media generation block.","",`Available internal intent hints: ${r}`,"","Return only JSON:","{",' "nodes": [',' { "kind": "research", "title": "Investigate market evidence", "instruction": "..." }'," ],",' "edges": [',' { "from": 0, "fromPin": "result", "to": 1, "toPin": "input" }'," ]","}","","Rules:","- 4 to 7 nodes.","- Use large business-language tasks, not low-level n8n/zapier steps.","- Think in this user model: AI Task = work sentence, Line = pass the previous result, Context = background thought/document.","- Do not create nodes for Trigger, Action, Webhook, HTTP request, app event, JSON parsing, iterator, filter, credential, or field mapping.","- Prefer a practical sequence for a solo global SaaS/business builder.","- Use only the available internal intent hints.","- Keep titles short and task-like, not category names such as Research, Analyze, Create, Web Search, or Output.","- Instructions should be natural-language work requests that a business owner would write.","- Preserve evidence/trust needs in the instruction when the task depends on current facts or source URLs.",'- Prefer "result" -> "input" edges unless a stronger pin contract is needed.'].join(`
|
|
2
|
+
`)}function qg(e){const t=eh(e);if(!t)return null;let n;try{n=JSON.parse(t)}catch{return null}if(!wr(n)||!Array.isArray(n.nodes))return null;const r=n.nodes.slice(0,8).map(c=>{if(!wr(c))return null;const m=Qg(po(c.kind));if(!vc.has(m))return null;const y=po(c.title).trim(),p=po(c.instruction).trim();return!y||!p?null:{kind:m,title:y.slice(0,90),instruction:p}}).filter(c=>!!c);if(r.length<2)return null;const d=Array.isArray(n.edges)?n.edges.slice(0,14).map(c=>{if(!wr(c))return null;const m=ud(c.from),y=ud(c.to);return m<0||y<0||m>=r.length||y>=r.length||m===y?null:{from:m,fromPin:po(c.fromPin).trim()||Ic(r[m].kind),to:y,toPin:po(c.toPin).trim()||Nc(r[y].kind)}}).filter(c=>!!c):[];return{nodes:r,edges:d.length>0?d:jc(r)}}function Jg(e,t){if(t==="en")return!0;const n=e.nodes.map(r=>`${r.title} ${r.instruction}`).join(" ");return t==="ko"?Ac(n):t==="ja"?th(n):t==="zh"?Tc(n):!0}function cd(e,t){const n=e.trim()||"the selected note",r=Zg(n,t);return{nodes:r,edges:jc(r)}}function Zg(e,t){return t==="ko"?[{kind:"research",title:"비즈니스 맥락 정리",instruction:`이 목표의 시장, 고객, 경쟁, 가격, 채널 맥락을 정리하세요: ${e}`},{kind:"web-search",title:"근거 있는 사실 수집",instruction:`이 목표에 중요한 최신 근거와 URL을 찾고, 링크와 불확실성을 함께 남기세요: ${e}`},{kind:"analyze",title:"핵심 기회 분석",instruction:`앞선 결과를 바탕으로 ${e}의 리스크, 차별점, 가장 빠른 매출 경로를 분석하세요.`},{kind:"create",title:"제안 초안 작성",instruction:`분석을 바탕으로 바로 테스트할 수 있는 오퍼, 랜딩 카피, 실험안, 실행 브리프를 작성하세요: ${e}`},{kind:"output",title:"다음 행동 정리",instruction:`${e} 실행 리포트를 정리하세요. 근거, 가정, 결정, 리스크, 다음 행동, 후속 flow 제안을 포함하세요.`}]:t==="ja"?[{kind:"research",title:"事業文脈を整理",instruction:`この目標の市場、顧客、競合、価格、チャネルを整理してください: ${e}`},{kind:"web-search",title:"根拠を集める",instruction:`この目標に重要な最新の根拠とURLを探し、リンクと不確実性を残してください: ${e}`},{kind:"analyze",title:"重要な機会を分析",instruction:`前の結果を使って、${e} のリスク、差別化、最短の収益化ルートを分析してください。`},{kind:"create",title:"提案を下書き",instruction:`分析をもとに、すぐ試せるオファー、ランディングコピー、実験案、実行ブリーフを作成してください: ${e}`},{kind:"output",title:"次の行動にまとめる",instruction:`${e} の実行レポートを作成し、根拠、仮説、判断、リスク、次の行動、後続flow案を含めてください。`}]:t==="zh"?[{kind:"research",title:"梳理业务背景",instruction:`梳理这个目标的市场、客户、竞争、价格和渠道背景: ${e}`},{kind:"web-search",title:"收集可信证据",instruction:`为这个目标寻找重要的最新证据和URL,并保留链接与不确定性: ${e}`},{kind:"analyze",title:"分析关键机会",instruction:`基于前面的结果,分析 ${e} 的风险、差异化和最快收入路径。`},{kind:"create",title:"起草商业提案",instruction:`把分析转成可以马上测试的报价、落地页文案、实验方案或执行简报: ${e}`},{kind:"output",title:"整理下一步行动",instruction:`整理 ${e} 的执行报告,包含证据、假设、决策、风险、下一步行动和后续flow建议。`}]:[{kind:"research",title:"Map the business context",instruction:`Map the market, customer, competitor, pricing, and channel context for this objective: ${e}`},{kind:"web-search",title:"Collect source-backed facts",instruction:`Find current source-backed facts and URLs that matter for this objective: ${e}. Preserve links and note uncertainty.`},{kind:"analyze",title:"Extract what matters",instruction:`Using the previous results, identify the important changes, risks, differentiation, and fastest path to revenue for: ${e}`},{kind:"create",title:"Draft the response",instruction:`Turn the analysis into a practical launch asset, offer, copy, experiment, or execution brief for: ${e}`},{kind:"output",title:"Turn it into next actions",instruction:`Compile the execution report for ${e}: source-backed evidence, assumptions, decision, risks, next actions, and a suggested follow-up flow.`}]}function Qg(e){const t=e.trim().toLowerCase();return t==="websearch"||t==="search"?"web-search":t==="image"?"image-generate":t==="video"?"video-generate":t==="task"?"ai-task":t||"ai-task"}function jc(e){return e.slice(0,-1).map((t,n)=>({from:n,fromPin:Ic(t.kind),to:n+1,toPin:Nc(e[n+1].kind)}))}function Ic(e){switch(e){case"research":return"brief";case"web-search":return"summary";case"analyze":return"analysis";case"summarize":return"summary";case"create":return"draft";case"decision":return"decision";case"image-generate":return"image";case"video-generate":return"video";case"output":return"report";default:return"result"}}function Nc(e){switch(e){case"research":return"goal";case"web-search":return"query";case"analyze":return"source";case"summarize":return"source";case"create":return"brief";case"decision":return"options";case"human-review":return"proposal";case"image-generate":return"prompt";case"video-generate":return"prompt";case"output":return"asset";default:return"input"}}function eh(e){const t=e==null?void 0:e.trim();if(!t)return null;const n=t.indexOf("{"),r=t.lastIndexOf("}");return n>=0&&r>n?t.slice(n,r+1):null}function wr(e){return!!(e&&typeof e=="object"&&!Array.isArray(e))}function po(e){return typeof e=="string"?e:""}function ud(e){if(typeof e=="number"&&Number.isInteger(e))return e;if(typeof e=="string"){const t=Number.parseInt(e,10);return Number.isInteger(t)?t:-1}return-1}function Ac(e){return!!(e&&/[\u1100-\u11ff\u3130-\u318f\uac00-\ud7af]/.test(e))}function Mc(e){return!!(e&&/[\u3040-\u30ff]/.test(e))}function th(e){return Mc(e)||!!(e&&/[\u4e00-\u9fff]/.test(e))}function Tc(e){return!!(e&&/[\u4e00-\u9fff]/.test(e))}const ki=["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(","),ah=/^[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 nh(e){if(ah.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 Rc(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 oh(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 Zr(e,t=new Date().toISOString()){return e&&!Number.isNaN(Date.parse(e))?e:t}function Si(e){return(e==null?void 0:e.trim().slice(0,90))||"Untitled Board"}function Lc(e){const t=Rc(e.content_json),n=Zr(e.updated_at??t.updatedAt);return{id:e.id,name:Si(e.title??t.name),updatedAt:n,createdAt:Zr(e.created_at,n),nodeCount:Array.isArray(t.nodes)?t.nodes.length:0,edgeCount:Array.isArray(t.edges)?t.edges.length:0,sourceKind:"cloud"}}function sh(e,t){var w,_;const n=Rc(e.content_json),r=Zr(e.updated_at??n.updatedAt),d=Number((w=n.viewState)==null?void 0:w.cursorX),c=Number((_=n.viewState)==null?void 0:_.cursorY),m=Number(e.last_cursor_x),y=Number(e.last_cursor_y),p=Number.isFinite(d)&&Number.isFinite(c),b=Number.isFinite(m)&&Number.isFinite(y);return{id:e.id,name:Si(e.title??n.name),nodes:Array.isArray(n.nodes)?n.nodes:[],edges:Array.isArray(n.edges)?n.edges:[],settings:n.settings??t,viewState:p?{cursorX:d,cursorY:c}:b?{cursorX:m,cursorY:y}:void 0,updatedAt:r,source:{kind:"cloud",boardId:e.id,loadedAt:new Date().toISOString(),snapshotFormat:"supabase.boards.content_json",originalNodeCount:Array.isArray(n.nodes)?n.nodes.length:0,renderedNodeCount:Array.isArray(n.nodes)?n.nodes.length:0}}}async function wi(e){var p;const t=pc(e);if(!t.cloudBoards.canAttempt)return f.emit("projectStorage.cloud.provider.skipped",{mode:t.cloudBoards.mode}),{userId:null,config:t,reason:t.cloudBoards.mode};const n=Fs(e);if(!n)return f.emit("projectStorage.cloud.provider.skipped",{mode:"config-missing"}),{userId:null,config:t,reason:"missing-client"};const{data:r,error:d}=await n.auth.getSession();if(d||!r.session)return f.emit("projectStorage.cloud.provider.sessionMissing",{message:(d==null?void 0:d.message)??"missing-session"}),{userId:null,config:t,reason:"missing-session"};const{data:c,error:m}=await n.auth.getUser(),y=((p=c.user)==null?void 0:p.id)??null;return m||!y?(f.emit("projectStorage.cloud.provider.sessionMissing",{message:(m==null?void 0:m.message)??"missing-user"}),{userId:null,config:t,reason:"missing-user"}):{userId:y,config:t,reason:"provider-ready"}}async function rh(e){const t=await wi(e);if(!t.userId)return[];const n=Fs(e);if(!n)return[];f.emit("projectStorage.cloud.list.requested");const{data:r,error:d}=await n.from("boards").select(ki).eq("user_id",t.userId).order("updated_at",{ascending:!1}).limit(50);if(d)throw f.emit("projectStorage.cloud.provider.failed",{operation:"list",message:d.message}),d;const c=(r??[]).map(Lc);return f.emit("projectStorage.cloud.list.loaded",{count:c.length}),c}async function ih(e,t,n){const r=await wi(e);if(!r.userId)return null;const d=Fs(e);if(!d)return null;f.emit("projectStorage.cloud.load.requested",{boardId:t});const{data:c,error:m}=await d.from("boards").select(ki).eq("user_id",r.userId).eq("id",t).maybeSingle();if(m)throw f.emit("projectStorage.cloud.provider.failed",{operation:"load",boardId:t,message:m.message}),m;if(!c)return null;const y=sh(c,n);return f.emit("projectStorage.cloud.load.loaded",{boardId:t,nodes:y.nodes.length,edges:y.edges.length}),y}async function lh(e,t,n,r=null){var ce,le;const d=await wi(e);if(!d.userId)return null;const c=Fs(e);if(!c)return null;const m=nh(t.id),y=new Date().toISOString(),p=Si(t.name),b=Number((r==null?void 0:r.x)??((ce=t.viewState)==null?void 0:ce.cursorX)??0),w=Number((r==null?void 0:r.y)??((le=t.viewState)==null?void 0:le.cursorY)??0),_={...t.viewState??{},cursorX:Number.isFinite(b)?b:0,cursorY:Number.isFinite(w)?w:0},N={...t,id:m,name:p,viewState:_,updatedAt:y},D={p_board_id:m,p_title:p,p_description:null,p_thumbnail_url:null,p_is_public:!1,p_created_at:null,p_updated_at:y,p_last_camera_x:n.x,p_last_camera_y:n.y,p_last_camera_z:n.scale,p_last_cursor_x:_.cursorX,p_last_cursor_y:_.cursorY,p_camera_bookmarks:JSON.stringify(t.settings.cameraBookmarks??{}),p_nodes:[],p_include_json_mirror:!0};f.emit("projectStorage.cloud.save.requested",{boardId:m,sourceBoardId:t.id,nodes:t.nodes.length,edges:t.edges.length});const{error:O}=await c.rpc("save_board_snapshot",D);if(O)throw f.emit("projectStorage.cloud.provider.failed",{operation:"save-rpc",boardId:m,message:O.message}),O;const z={content_json:oh(N),updated_at:y},{data:U,error:V}=await c.from("boards").update(z).eq("id",m).eq("user_id",d.userId).select(ki).maybeSingle();if(V)throw f.emit("projectStorage.cloud.provider.failed",{operation:"save-json-mirror",boardId:m,message:V.message}),V;const Y=U?Lc(U):{id:m,name:p,updatedAt:y,createdAt:y,nodeCount:t.nodes.length,edgeCount:t.edges.length,sourceKind:"cloud"};return f.emit("projectStorage.cloud.save.saved",{boardId:Y.id,nodes:Y.nodeCount,edges:Y.edgeCount}),Y}function Qr(e){return e.length===0?{minX:0,minY:0,maxX:0,maxY:0}:e.reduce((t,n)=>({minX:Math.min(t.minX,n.x),minY:Math.min(t.minY,n.y),maxX:Math.max(t.maxX,n.x+n.width),maxY:Math.max(t.maxY,n.y+n.height)}),{minX:Number.POSITIVE_INFINITY,minY:Number.POSITIVE_INFINITY,maxX:Number.NEGATIVE_INFINITY,maxY:Number.NEGATIVE_INFINITY})}function dh(e,t={},n=Qr(e),r){if(e.length===0)return{after:new Map,boundsAfter:n};const d=Ih(t.mode),c=Nh(t.order),m=Ah(t.anchor),y=Mh(t.sizeMode),p=Math.max(0,t.gapX??24),b=Math.max(0,t.gapY??24),w=Math.max(1,t.maxColumns??12),_=ei(t.quantile??.75,.05,.95),N=e.map(ch),D=kh(N,c),O=D.map(ye=>ye.width),z=D.map(ye=>ye.height),U=Math.max(1,t.cellWidth??pd(O,_)),V=Math.max(1,t.cellHeight??pd(z,_)),Y=Math.max(1,t.targetWidth??U),ce=Math.max(1,t.targetHeight??V),le=Ch(m,n);if(d==="grid"){fh(D,y,Y,ce,U,V);const ye=md(t.columns,w,n.maxX-n.minX,U,p);mh(D,le.x,le.y,ye,U,V,p,b)}else if(d==="masonry"){bh(D,y==="preserve"?"uniformWidth":y,Y);const We=md(t.columns,w,n.maxX-n.minX,Y,p);ph(D,le.x,le.y,We,Y,p,b)}else d==="stripHorizontal"?(yh(D,y==="preserve"?"uniformHeight":y,ce),gh(D,le.x,le.y,p,ce)):(xh(D,y==="preserve"?"uniformWidth":y,Y),hh(D,le.x,le.y,b,Y));let Pe=new Map(D.map(ye=>[ye.id,uh(ye)]));return m==="selectionBoundsCenter"&&(Pe=wh(n,Pe)),t.snapToGrid&&(Pe=vh(Pe,Math.max(1,t.gridSize??8))),{after:Pe,boundsAfter:Qr(Array.from(Pe.values()))}}function ch(e){return{...e,width:Math.max(1,e.width),height:Math.max(1,e.height)}}function uh(e){return{x:e.x,y:e.y,width:Math.max(1,e.width),height:Math.max(1,e.height)}}function mh(e,t,n,r,d,c,m,y){e.forEach((p,b)=>{const w=Math.floor(b/r),_=b%r,N=t+_*(d+m),D=n+w*(c+y);p.x=N+(d-p.width)/2,p.y=D+(c-p.height)/2})}function ph(e,t,n,r,d,c,m){const y=Array.from({length:r},()=>0);for(const p of e){const b=jh(y),w=t+b*(d+c);p.x=w+(d-p.width)/2,p.y=n+y[b],y[b]+=p.height+m}}function gh(e,t,n,r,d){let c=t;for(const m of e)m.x=c,m.y=n+(d-m.height)/2,c+=m.width+r}function hh(e,t,n,r,d){let c=n;for(const m of e)m.x=t+(d-m.width)/2,m.y=c,c+=m.height+r}function fh(e,t,n,r,d,c){if(t==="fitCellDownOnly")for(const m of e){const y=Math.min(1,d/m.width,c/m.height);m.width*=y,m.height*=y}else t==="uniformWidth"?vi(e,n):t==="uniformHeight"&&Pc(e,r)}function bh(e,t,n){if(t==="fitCellDownOnly"){for(const r of e){const d=Math.min(1,n/r.width);r.width*=d,r.height*=d}return}vi(e,n)}function yh(e,t,n){if(t==="fitCellDownOnly"){for(const r of e){const d=Math.min(1,n/r.height);r.width*=d,r.height*=d}return}Pc(e,n)}function xh(e,t,n){if(t==="fitCellDownOnly"){for(const r of e){const d=Math.min(1,n/r.width);r.width*=d,r.height*=d}return}vi(e,n)}function vi(e,t){for(const n of e){if(n.width<=0)continue;const r=t/n.width;n.width=t,n.height=Math.max(1,n.height*r)}}function Pc(e,t){for(const n of e){if(n.height<=0)continue;const r=t/n.height;n.height=t,n.width=Math.max(1,n.width*r)}}function md(e,t,n,r,d){if(typeof e=="number"&&e>0)return Math.round(ei(e,1,t));if(n<=1||r<=1)return 1;const c=Math.floor((n+d)/(r+d));return!Number.isFinite(c)||c<1?1:Math.round(ei(c,1,t))}function Ch(e,t,n){return{x:t.minX,y:t.minY}}function kh(e,t){return t==="selectionOrder"?[...e].sort((n,r)=>n.selectionIndex-r.selectionIndex):Sh(e)}function Sh(e){const t=[...e].sort((p,b)=>p.y-b.y||p.x-b.x);if(t.length<=2)return t;const n=t.map(p=>p.height).sort((p,b)=>p-b),r=n[Math.floor(n.length/2)]??1,d=Math.max(16,r*.35),c=[];let m=[],y=Number.NaN;for(const p of t)m.length===0?(m=[p],y=p.y):Math.abs(p.y-y)<=d?(m.push(p),y=(y*(m.length-1)+p.y)/m.length):(c.push([...m].sort((b,w)=>b.x-w.x)),m=[p],y=p.y);return m.length>0&&c.push([...m].sort((p,b)=>p.x-b.x)),c.flat()}function wh(e,t){if(t.size===0)return t;const n=Qr(Array.from(t.values())),r=e.minX+(e.maxX-e.minX)/2,d=e.minY+(e.maxY-e.minY)/2,c=n.minX+(n.maxX-n.minX)/2,m=n.minY+(n.maxY-n.minY)/2,y=r-c,p=d-m;return new Map(Array.from(t.entries()).map(([b,w])=>[b,{...w,x:w.x+y,y:w.y+p}]))}function vh(e,t){return new Map(Array.from(e.entries()).map(([n,r])=>[n,{...r,x:gd(r.x,t),y:gd(r.y,t)}]))}function pd(e,t){if(e.length===0)return 1;const n=[...e].sort((y,p)=>y-p),r=(n.length-1)*t,d=Math.floor(r),c=Math.min(n.length-1,d+1),m=r-d;return n[d]*(1-m)+n[c]*m}function jh(e){let t=0;for(let n=1;n<e.length;n+=1)e[n]<e[t]&&(t=n);return t}function gd(e,t){return Math.round(e/t)*t}function Ih(e){const t=zs(e);return t==="grid"?"grid":t==="striphorizontal"||t==="striph"?"stripHorizontal":t==="stripvertical"||t==="stripv"?"stripVertical":"masonry"}function Nh(e){return zs(e)==="selectionorder"?"selectionOrder":"spatialReading"}function Ah(e){const t=zs(e);return t==="selectionboundscenter"?"selectionBoundsCenter":t==="viewporttopleft"?"viewportTopLeft":"selectionBoundsTopLeft"}function Mh(e){const t=zs(e);return t==="fitcelldownonly"?"fitCellDownOnly":t==="uniformwidth"?"uniformWidth":t==="uniformheight"?"uniformHeight":"preserve"}function zs(e){return String(e??"").trim().toLowerCase().replace(/[^a-z0-9]/g,"")}function ei(e,t,n){return Math.min(n,Math.max(t,e))}const Ec=300,_c=50*1024*1024,Th=800;function ve(e){return typeof e=="string"?e.length*2:0}function Rh(e){let t=256;if(t+=ve(e.id),t+=ve(e.kind),t+=ve(e.title),t+=ve(e.body),t+=ve(e.result),t+=ve(e.imageUrl),t+=ve(e.assetUrl),t+=ve(e.sourceFilePath),t+=(e.tags??[]).reduce((n,r)=>n+ve(r),0),e.metadata)for(const[n,r]of Object.entries(e.metadata))t+=ve(n)+ve(r);return e.imageStack&&(t+=128+ve(e.imageStack.title),t+=e.imageStack.variants.reduce((n,r)=>n+96+ve(r.variantId)+ve(r.imageUrl)+ve(r.assetId)+ve(r.title)+ve(r.caption),0)),t}function Lh(e){let t=1024+ve(e.id)+ve(e.name)+ve(e.updatedAt);return t+=e.nodes.reduce((n,r)=>n+Rh(r),0),t+=e.edges.length*128,t+=Object.entries(e.settings).reduce((n,[r,d])=>n+ve(r)+ve(typeof d=="string"?d:JSON.stringify(d)),0),t}function Bc(e,t={}){var n,r;return{board:e,description:((n=t.description)==null?void 0:n.trim())||"Board change",mergeKey:((r=t.mergeKey)==null?void 0:r.trim())||null,timestampMs:t.timestampMs??Date.now(),estimatedBytes:Lh(e)}}function hd(e,t={}){const n=t.maxEntries??Ec,r=t.maxBytes??_c;let d=e.slice(Math.max(0,e.length-n)),c=d.reduce((m,y)=>m+y.estimatedBytes,0);for(;d.length>1&&c>r;){const[m,...y]=d;c-=(m==null?void 0:m.estimatedBytes)??0,d=y}return d}function $a(e,t,n={}){const r=Bc(t,n),d=n.mergeWindowMs??Th,c=e.slice(),m=c.at(-1);return m&&r.mergeKey&&m.mergeKey===r.mergeKey&&r.timestampMs-m.timestampMs<d?(c[c.length-1]={...m,description:r.description,timestampMs:r.timestampMs,estimatedBytes:Math.max(m.estimatedBytes,r.estimatedBytes)},hd(c,n)):(c.push(r),hd(c,n))}function Ph(e,t,n={}){const r=Bc(t,n),d=n.maxEntries??Ec,c=n.maxBytes??_c;let m=[r,...e].slice(0,d),y=m.reduce((p,b)=>p+b.estimatedBytes,0);for(;m.length>1&&y>c;){const p=m.at(-1);y-=(p==null?void 0:p.estimatedBytes)??0,m=m.slice(0,-1)}return m}function Hs(e,...t){const n=e==null?void 0:e.metadata;if(!n)return"";for(const r of t){const d=n[r];if(typeof d=="string"&&d.trim())return d.trim()}return""}function go(e,t){return!!Hs(e,t)}function Dc(e){if(!e||!e.trim())return!1;const t=e.trim();return/^(https?:|blob:|data:|file:)/i.test(t)}function Oc(e){if(!e)return"";const t=Hs(e,"OriginalPath");if(t)return t;const n=String(e.body||"").trim();return Dc(n)?"":n}function $c(e){return e?Oc(e)||String(e.sourceFilePath||"").trim()||String(e.assetUrl||"").trim()||String(e.imageUrl||"").trim()||String(e.body||"").trim():""}function Fc(e){return Hs(e,"ThumbnailUrl","thumbnailUrl")}function Eh(e){if(!e||e.kind!=="image")return!1;if(go(e,"ImageGenerationProvider")||go(e,"GeneratedImageSourceWidth")||go(e,"GeneratedImageSourceHeight")||go(e,"CodexImageQuality")||go(e,"ImageRouterRevisedPrompt"))return!0;const t=Hs(e,"RequestedMediaOperation");return["text2image","image2image","inpaint"].includes(t.toLowerCase())}function ji(e){if(!e)return"";if(e.kind==="image"||e.kind==="mask"){const t=Eh(e)?Oc(e):"",n=Fc(e),r=String(e.body||"").trim();return t||n||String(e.imageUrl||"").trim()||String(e.assetUrl||"").trim()||String(e.sourceFilePath||"").trim()||(Dc(r)?r:"")}return $c(e)||String(e.assetUrl||"").trim()||String(e.sourceFilePath||"").trim()}function Uc(e){if(!e)return"";const t=$c(e)||e.title||e.kind;return String(t||"").replace(/\\/g,"/").replace(/\/+$/,"").split("/").filter(Boolean).pop()||e.title||e.kind}const _h=2048,Bh=16e3,vr=1024,jr=64,Dh=2048,Ir=3,Oh=16,$h=256,Fh=new Set(["text","note","memo","markdown","code","directory"]),Uh=/[\p{L}\p{M}\p{N}]{2,}/gu,fd=4,zh=8,bd=1.35;function Hh(e){return Fh.has(String(e||"").trim().toLowerCase())}function Wh(e){const t=e.map(Yh),n=new Map,r=new Map,d=new Map,c=new Map;for(const m of t){n.set(m.id,m);for(const y of m.tokens)Nr(r,y,m.id);for(const y of m.prefixes)Nr(d,y,m.id);for(const y of m.ngrams)Nr(c,y,m.id)}return{documents:t,documentById:n,tokenIndex:r,prefixIndex:d,ngramIndex:c}}function Vh(e,t,n={}){const r=Math.max(1,Math.trunc(Number(n.limit||30))),d=yn(t),c=yd(e,0,0,n.viewport,0);if(!d)return{hits:[],profile:c};const m=Array.from(zc(d)),y=Array.from(Hc(m)),p=Vc(d),b=Array.from(Wc(p)),w=new Map;for(const z of m)Ar(e.tokenIndex,z,w,8);for(const z of y)Ar(e.prefixIndex,z,w,z.length<=3?4:2);for(const z of b)Ar(e.ngramIndex,z,w,1.15);const _=qh(e,w,r),N=Jh(n.allowedContentTypes),D=[];for(const z of _){const U=e.documentById.get(z);if(!U||N&&!N.has(U.contentType))continue;const V=Kh(U,d,m,b);if(V<=0)continue;const Y=Xh(U,n.viewport??null);D.push({nodeId:U.id,score:V+Y,textScore:V,viewportBoost:Y})}D.sort((z,U)=>U.score-z.score||z.nodeId.localeCompare(U.nodeId));const O=D.slice(0,r);return{hits:O,profile:yd(e,_.length,O.length,n.viewport,O.filter(z=>z.viewportBoost>0).length)}}function yn(e){const t=String(e??"");if(!t.trim())return"";let n=t;try{n=t.normalize("NFKC")}catch{n=t}n=n.toLowerCase();let r="",d=!1;for(const c of n){if(/\s/u.test(c)){d||(r+=" ",d=!0);continue}Zh(c)||(r+=c,d=!1)}return r.trim()}function zc(e){return new Set(e.match(Uh)??[])}function Hc(e){const t=new Set;for(const n of e){if(!n.trim())continue;const r=Math.min(8,n.length);for(let d=2;d<=r;d+=1)t.add(n.slice(0,d))}return t}function Wc(e){const t=new Set;if(!e.trim())return t;if(e.length<=Ir)return t.add(e),t;for(let n=0;n<=e.length-Ir;n+=1)t.add(e.slice(n,n+Ir));return t}function Yh(e){const t=String(e.kind??"").trim().toLowerCase(),n=Ha(e.prompt??e.title,_h),r=Hh(t)?Ha(e.response??e.body,Bh):"",d=Gh(e.metadata,e.tags,e.metadataText),c=Ha(e.sourceFilePath||e.assetUrl,Dh),m=yn(n),y=yn(r),p=yn(d),b=yn(c),w=yn(t),_=[m,p,b,y,w].filter(Boolean).join(" "),N=zc(_);return{id:String(e.id),contentType:t,normalizedPrompt:m,normalizedResponse:y,normalizedMetadata:p,normalizedSourcePath:b,normalizedContentType:w,tokens:N,prefixes:Hc(N),ngrams:Wc(Vc(_)),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 Gh(e,t,n){const r=[];let d=0;if(e)for(const[c,m]of Object.entries(e)){if(d>=jr)break;!String(c??"").trim()&&!String(m??"").trim()||(r.push(Ha(c,128)),String(m??"").trim()&&r.push(Ha(m,vr)),d+=1)}return d<jr&&(t!=null&&t.length)&&(r.push("tags",Ha(t.join(" "),vr)),d+=1),d<jr&&(n!=null&&n.trim())&&r.push("metadata",Ha(n,vr)),r.join(" ")}function Kh(e,t,n,r){let d=0;e.normalizedPrompt===t?d+=120:ho(e.normalizedPrompt,t)&&(d+=54),ho(e.normalizedMetadata,t)&&(d+=26),ho(e.normalizedSourcePath,t)&&(d+=18),ho(e.normalizedResponse,t)&&(d+=14),ho(e.normalizedContentType,t)&&(d+=8);for(const c of n)e.tokens.has(c)&&(d+=7),e.normalizedPrompt.startsWith(c)&&(d+=10);for(const c of r)e.ngrams.has(c)&&(d+=.85);return d}function Xh(e,t){if(!t)return 0;const n=e.x+Math.max(1,e.width)/2,r=e.y+Math.max(1,e.height)/2,d=Math.abs(n-t.centerX)/Math.max(1,t.halfWidth),c=Math.abs(r-t.centerY)/Math.max(1,t.halfHeight),m=Math.sqrt(d*d+c*c);if(m<=1)return fd+(1-m)*zh;if(m<=bd){const y=1-(m-1)/Math.max(.001,bd-1);return Math.max(0,y)*(fd*.75)}return 0}function qh(e,t,n){return t.size===0?e.documents.map(r=>r.id):Array.from(t.entries()).sort((r,d)=>d[1]-r[1]||r[0].localeCompare(d[0])).slice(0,Math.max(n*Oh,$h)).map(([r])=>r)}function Jh(e){if(!e)return null;const t=new Set(Array.from(e,n=>String(n||"").trim().toLowerCase()).filter(Boolean));return t.size>0?t:null}function yd(e,t,n,r,d){return{documentCount:e.documents.length,candidateCount:t,rankedCount:n,viewportBoosted:!!r,boostedCount:d,indexedTokenCount:e.tokenIndex.size,indexedPrefixCount:e.prefixIndex.size,indexedNGramCount:e.ngramIndex.size}}function Nr(e,t,n){const r=e.get(t);if(r){r.add(n);return}e.set(t,new Set([n]))}function Ar(e,t,n,r){const d=e.get(t);if(d)for(const c of d)n.set(c,(n.get(c)??0)+r)}function Vc(e){let t="";for(const n of e)/\s/u.test(n)||(t+=n);return t}function Ha(e,t){const n=String(e??"");return n.length<=t?n:n.slice(0,t)}function ho(e,t){return!!(e&&t&&e.includes(t))}function Zh(e){const t=e.codePointAt(0)??0;return t<=31||t>=127&&t<=159}const Qh=2147483647,ef="LocalBridge access is enabled, but the bridge is not reachable. Restart LocalBridge, allow Chrome local-network access, then reload MindCanvas.",tf="Local storage is unavailable in the hosted app until browser local storage or LocalBridge access is available.",af="Local storage is unavailable. Check the browser-local storage state or LocalBridge connection.",nf="Cloud projects are unavailable until Supabase and Cloudflare R2 are configured.",of="Login is required before cloud projects can be used.",sf="Cloud projects are unavailable.";function rf(e){return e.bridgeProviderConfigured||e.browserProviderConfigured||e.embeddedProviderConfigured}function ti(e,t=!0){const n={isAvailable:!1,bridgeReachable:!1,browserLocalAvailable:!1,embeddedLocalAvailable:!1,providerKind:"none",canBrowseWorkspace:!1};return e.bridgeProviderConfigured&&e.bridgeReachable?{...n,isAvailable:!0,bridgeReachable:!0,providerKind:"bridge",canBrowseWorkspace:!0}:e.hostedWebApp&&e.hostedLocalBridgeAccessEnabled&&e.bridgeProviderConfigured?{...n,providerKind:"bridge"}:e.browserProviderConfigured&&(e.browserLocalAvailable||t&&e.browserLocalAvailableWhenEmpty===!0)?{...n,isAvailable:!0,browserLocalAvailable:!0,providerKind:"browser"}:e.embeddedProviderConfigured&&e.supportsEmbeddedLocal?{...n,isAvailable:!0,embeddedLocalAvailable:!0,providerKind:"embedded"}:n}function lf(e){return ti(e,!1).isAvailable?"local":Ii(e)?"cloud":ti(e,!0).isAvailable?"local":e.cloudConfigured?"cloud":"local"}function Ii(e){return e.cloudConfigured&&e.cloudSessionAvailable}function df(e,t){return t.providerKind==="bridge"&&!t.bridgeReachable?ef:e.hostedWebApp?tf:af}function cf(e){return e.cloudConfigured?Ii(e)?sf:of:nf}function uf(e){var w,_,N;const t=Ii(e),n=ti(e,!0),r=rf(e),d=e.cloudConfigured,c=n.isAvailable,m=t;let y=e.storedMode??lf(e);y==="cloud"&&(!d||!m&&c)?y=c?"local":"cloud":y==="local"&&(!r&&d||!c&&m)&&(y="cloud");const p=e.cloudAccess,b=((w=p==null?void 0:p.denialReason)==null?void 0:w.trim())||void 0;return{currentMode:y,showLocalTab:r,showCloudTab:d,isLocalAvailable:n.isAvailable,isCloudAvailable:t,requiresCloudSignIn:e.cloudConfigured&&!t,canUseLocalProjects:c,canBrowseLocalWorkspace:n.canBrowseWorkspace,localProviderKind:n.providerKind,canUseCloudProjects:m,canSyncLocalToCloud:c&&m,cloudPlanKey:((_=p==null?void 0:p.planKey)==null?void 0:_.trim())||"free",cloudEntitlementStatus:((N=p==null?void 0:p.entitlementStatus)==null?void 0:N.trim())||(p?"active":"inactive"),currentCloudBoardCount:(p==null?void 0:p.currentBoardCount)??0,cloudBoardLimit:(p==null?void 0:p.cloudBoardLimit)??Qh,lockedCloudBoardCount:(p==null?void 0:p.lockedBoardCount)??0,canCreateCloudBoards:(p==null?void 0:p.canCreateBoard)??m,canUseManagedAi:(p==null?void 0:p.canUseManagedAi)??!1,canGenerateImage:(p==null?void 0:p.canGenerateImage)??!1,canUseContextPack:(p==null?void 0:p.canUseContextPack)??!1,cloudLimitMessage:b,localStatusMessage:n.isAvailable?void 0:df(e,n),cloudStatusMessage:m?void 0:cf(e)}}function mf(){const e=new Error("Queued operation was cancelled before it started.");return e.name="AbortError",e}class pf{constructor(){_l(this,"tails",new Map)}isBusy(t){return this.tails.has(t)}enqueue(t,n,r){if(typeof n!="function")throw new TypeError("KeyedAsyncQueue operation is required.");const d=this.tails.get(t)??Promise.resolve();let c;return c=(async()=>{try{try{await d}catch{}if(r!=null&&r.aborted)throw mf();return await n(r)}finally{this.tails.get(t)===c&&this.tails.delete(t)}})(),this.tails.set(t,c),c}clear(t){if(typeof t>"u"){this.tails.clear();return}this.tails.delete(t)}}const gf=/^data:image\//i;function hf(e){const t=String(e||"").trim();if(!t)return{src:null,reason:"empty",urlKind:"empty"};const n=t.toLowerCase();return gf.test(t)?{src:t,reason:null,urlKind:"data"}:n.startsWith("blob:")?{src:t,reason:null,urlKind:"blob"}:n.startsWith("https://")?{src:t,reason:null,urlKind:"https"}:n.startsWith("http://")?{src:t,reason:null,urlKind:"http"}:t.startsWith("//")?{src:t,reason:null,urlKind:"protocol-relative"}:t.startsWith("/")||t.startsWith("./")||t.startsWith("../")?{src:t,reason:null,urlKind:"relative"}:/^[a-z][a-z0-9+.-]*:/i.test(t)?{src:null,reason:"unsupported-protocol",urlKind:t.split(":",1)[0].toLowerCase()}:{src:t,reason:null,urlKind:"relative"}}function Mr({src:e,alt:t="",className:n="",testId:r="secure-image",traceId:d,kind:c="image",title:m}){const y=g.useMemo(()=>hf(e),[e]),[p,b]=g.useState(y.src?"loading":"blocked");g.useEffect(()=>{const D=y.src?"loading":"blocked";b(D),y.src||f.emit("secureImage.blocked",{id:d,kind:c,reason:y.reason,urlKind:y.urlKind})},[c,y.reason,y.src,y.urlKind,d]);const w=()=>{b("loaded"),f.emit("secureImage.loaded",{id:d,kind:c,urlKind:y.urlKind})},_=()=>{b("error"),f.emit("secureImage.error",{id:d,kind:c,urlKind:y.urlKind})},N=p==="blocked"?`Image blocked: ${y.reason||"unsupported source"}`:"Image failed to load";return o.jsxs("div",{className:`secure-image secure-image--${p} ${n}`.trim(),"data-testid":r,"data-secure-image-state":p,"data-secure-image-kind":c,title:p==="loaded"?m:N,children:[y.src&&o.jsx("img",{src:y.src,alt:t,loading:"lazy",decoding:"async",draggable:!1,onLoad:w,onError:_}),p==="loading"&&o.jsx("span",{className:"secure-image__loading","aria-hidden":"true",children:o.jsx("span",{})}),(p==="blocked"||p==="error")&&o.jsx("span",{className:"secure-image__fallback",role:"img","aria-label":N,children:p==="blocked"?o.jsx(Hp,{size:18}):o.jsx(Wp,{size:18})})]})}const ff={note:Ls,text:St,"ai-task":Cn,image:Sn,mask:Sn,video:wn,embed:vn,code:kn,markdown:St,"csv-table":St,memo:Ls,pdf:St,file:Yr,directory:Vp,"template-launcher":St,"remote-monitor":Rs,"remote-control":Rs},Tr=[{key:"Auto",label:"Auto Detect",description:"Infer whether this note is growth, revenue, build, or research work."},{key:"GeneralCompany",label:"General AI Company",description:"Balanced planning, practical work, and artifact production."},{key:"GrowthValidation",label:"Growth Validation",description:"Marketing loops, signals, messaging, distribution, and experiments."},{key:"RevenueAffiliate",label:"Revenue / Affiliate",description:"Affiliate discovery, keywords, content assets, and revenue experiments."},{key:"ProductBuild",label:"Product Build",description:"Specs, implementation-oriented work, artifacts, and approval gates."},{key:"ResearchOnly",label:"Research Only",description:"Evidence gathering, risks, synthesis, and recommendations."}],xd=500,bf=48,yf=new Set(["mindcanvasagent","agentcommand"]),xf=new Set(["codenote","code-note"]),Cf=["multidesktopmonitor","remotehubmonitor","remotefleetmonitor","smartviewmonitor"],kf=["remotedevice","remotefleetdevice","remotecontrol"],Sf=["top","right","bottom","left"];function wf(e){const t=In(e,"SemanticType","semanticType","RemoteFleetSemanticType").trim().toLowerCase(),n=In(e,"RemoteFleetNodeRole","remoteFleetNodeRole").trim().toLowerCase(),r=In(e,"RemoteFleetSchemaVersion","remoteFleetSchemaVersion").trim().toLowerCase();return e.kind==="remote-monitor"||t==="remotefleetmonitor"||n==="fleet-monitor"||r==="remote-fleet@1"||Gc(e,["RemoteFleetViewMode","RemoteFleetHubStatus","RemoteFleetDevicesJson","RemoteFleetDeviceCount","RemoteFleetConnectedDeviceCount","RemoteFleetProjectionMode","RemoteFleetCanvasPagination","RemoteHub","RemoteRoute","RemotePage","RemoteVisibleBudget"])||Yc(e,Cf,["remote","monitor"])}function vf(e){const t=In(e,"SemanticType","semanticType","RemoteFleetSemanticType").trim().toLowerCase(),n=In(e,"RemoteFleetNodeRole","remoteFleetNodeRole").trim().toLowerCase(),r=In(e,"RemoteFleetSchemaVersion","remoteFleetSchemaVersion").trim().toLowerCase();return e.kind==="remote-control"||t==="remotefleetdevice"||n==="fleet-device"||r==="remote-fleet-device@1"||Gc(e,["RemoteFleetDeviceId","RemoteFleetDeviceName","RemoteFleetDevicePlatform","RemoteFleetDeviceConnected","RemoteFleetDeviceCanControl","RemoteFleetSourceMonitorNodeId"])||Yc(e,kf,["remote","control"])}function Yc(e,t,n){const r=(e.tags??[]).map(y=>y.trim().toLowerCase()).filter(Boolean),d=n.every(y=>r.includes(y)),m=[e.title,e.body,e.sourceFilePath,e.assetUrl,...r].join(" ").toLowerCase().replace(/[^a-z0-9]+/g,"");return d||t.some(y=>m.includes(y))}function In(e,...t){const n=e.metadata??{};for(const d of t){const c=n[d];if(c!=null)return String(c)}const r=new Set(t.map(d=>d.toLowerCase()));for(const[d,c]of Object.entries(n))if(r.has(d.toLowerCase())&&c!==void 0&&c!==null)return String(c);return""}function Gc(e,t){const n=e.metadata??{},r=new Set(t.map(d=>d.toLowerCase()));return Object.entries(n).some(([d,c])=>r.has(d.toLowerCase())&&c!==void 0&&c!==null&&String(c).trim()!=="")}const ai=[{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"}],jf=g.memo(function({node:t,selected:n,selectionCount:r,pulsing:d,connectionDraft:c,onSelect:m,onDragStart:y,onResizeStart:p,onPatch:b,onDelete:w,onDuplicate:_,onRun:N,onPin:D,onConnectorDragStart:O,onOpenResult:z,onToggleAiReference:U,onCopyNode:V,onCopyEmbedReference:Y,onFitNodeHeight:ce,onToggleNodeExpanded:le,onToggleWordWrap:Pe,onStageCompany:ye,onOpenCompanyGraph:We,onSyncCompanyGoal:vt,onRefreshCompany:nt,onSetCompanyStatus:G,onRemoveCompany:X,onOpenAsset:ue,onOpenDirectorySettings:oe,onScanDirectory:mt,onCreateRemoteControl:W,onGenerateTemplateCard:jt,appLanguage:It}){var lt,Xt,Na,an,ca,nn,re,Ge,on,Vn,v,q,ie,Fo,He,qt,Jt,sn,rn,Yn,Gn,ln,Kn,Aa,Xn,dn,Ma,ua,Fe,_e,Ta,Ra,cn,qn,La,un;const P=x=>fi(It,x),Nt=String(((lt=t.metadata)==null?void 0:lt.AutomationNodeKind)||((Xt=t.metadata)==null?void 0:Xt.AutomationTemplateKey)||((Na=t.metadata)==null?void 0:Na.AutomationInferredKind)||"").trim().toLowerCase(),At=String(((an=t.metadata)==null?void 0:an.SemanticType)||((ca=t.metadata)==null?void 0:ca.semanticType)||"").trim().toLowerCase(),ze=t.kind==="memo"&&yf.has(At),H=t.kind==="memo"&&xf.has(At),pt=String(((nn=t.metadata)==null?void 0:nn.AgentCommandStatus)||"Draft"),gt=String(((re=t.metadata)==null?void 0:re.AgentCommandMode)||"Task"),ot=String(((Ge=t.metadata)==null?void 0:Ge.AgentCommandRequestedRole)||"Researcher"),Ft=String(((on=t.metadata)==null?void 0:on.CodeNoteStatus)||"Draft"),Ca=String(((Vn=t.metadata)==null?void 0:Vn.CodeNoteSyncState)||"Unlinked"),ka=String(((v=t.metadata)==null?void 0:v.CodeNoteKind)||"Feature"),No=ze?Cn:H?kn:Nt==="image-generate"?Sn:Nt==="video-generate"?wn:ff[t.kind],Ve=c&&c.from!==t.id,Tn=t.kind==="ai-task",sa=t.kind==="pdf"||t.kind==="file"||t.kind==="directory",Mt=wf(t),Ie=vf(t),se=Mt||Ie,Ei=Mt?"monitor":Ie?"control":"",Be=r>1,Ut=Tn?"result":"context",ra=((q=c==null?void 0:c.target)==null?void 0:q.id)===t.id?c.target.side:null,Ao=(c==null?void 0:c.from)===t.id,xe=t.kind==="template-launcher"||String(((ie=t.metadata)==null?void 0:ie.semanticType)||((Fo=t.metadata)==null?void 0:Fo.SemanticType)||"").toLowerCase()==="templatelauncher",Ae=t.kind==="video",Me=t.kind==="embed",zt=t.kind==="mask",he=t.kind==="memo",Mo=t.kind==="markdown",Ya=t.kind==="csv-table",Te=he?Ef(t):null,qe=g.useRef(null),Rn=Ae?Kc(t):"",ke=Ae?Bf(t):"",ht=Me?Df(t):"",Ln=Me?Of(t):"",Pn=Me?$f(t,ht):"",Ht=Me?Ff(t):"",De=(((He=t.imageStack)==null?void 0:He.variants)??[]).filter(x=>!!x.imageUrl),ft=De.find(x=>{var $;return x.variantId===(($=t.imageStack)==null?void 0:$.activeVariantId)})??De[0]??null,Sa=t.kind==="image"||zt?(ft==null?void 0:ft.imageUrl)||ji(t):"",To=ft?De.findIndex(x=>x.variantId===ft.variantId):-1,Tt=!Sa&&!sa&&!se&&!xe&&!Ae&&!Me,Ro=Tt&&!he,Je=t.isExpanded===!1&&Number(t.originalHeight??0)>t.height+1,Ye=!se&&!["image","mask","video","embed","pdf","file","directory","template-launcher","remote-monitor","remote-control"].includes(t.kind),Oe=t.aiEnabled!==!1,Ga=_f(t),Lo=!!(t.isChunkedText||((qt=t.metadata)==null?void 0:qt.IsChunkedText)==="true"),Ce=Number(t.totalLineCount??((Jt=t.metadata)==null?void 0:Jt.TotalLineCount)??0),Ka=t.sourceFilePath||((sn=t.metadata)==null?void 0:sn.FileName)||t.title,Po=Lo?o.jsxs("div",{className:"node-chunked-text-state","data-testid":"node-chunked-text-state",title:Ka,children:[o.jsx(St,{size:12}),o.jsx("strong",{children:"Chunked text"}),Number.isFinite(Ce)&&Ce>0&&o.jsxs("span",{children:[Ce.toLocaleString()," lines"]})]}):null,En=t.kind==="directory"?(rn=t.metadata)==null?void 0:rn.Include:null,Ee=t.kind==="directory"?(Yn=t.metadata)==null?void 0:Yn.Exclude:null,Rt=t.kind==="directory"?(Gn=t.metadata)==null?void 0:Gn.DirectoryFileCount:null,ia=t.kind==="directory"?(ln=t.metadata)==null?void 0:ln.DirectoryDirCount:null,Xa=t.kind==="directory"?(Kn=t.metadata)==null?void 0:Kn.DirectoryLastScanUtc:null,[Eo,$e]=g.useState(!1),[_n,Bn]=g.useState(null),[Dn,qa]=g.useState(((Aa=t.metadata)==null?void 0:Aa.CompanyExecutionMode)||"Auto"),[Wt,On]=g.useState(((Xn=t.metadata)==null?void 0:Xn.CompanySubAgents)!=="false"),[$n,la]=g.useState(!1),[Ze,Fn]=g.useState(null),wa=g.useMemo(()=>Ya?Mf(t.body,Ze):null,[Ze,Ya,t.body]),me=g.useMemo(()=>xe?dc(t.body):null,[xe,t.body]),st=(me==null?void 0:me.options.find(x=>x.id===me.selectedOptionId))??(me==null?void 0:me.options[0])??null,bt=dp(me),Vt=Tr.find(x=>x.key===Dn)||Tr[0],Yt=String(((dn=t.metadata)==null?void 0:dn.CompanyStatus)||(t.companyMode?"Staged":"")).trim(),Lt=Yt.toLowerCase(),Ws=Lt==="paused",Un=Lt==="archived",_o=x=>{x.stopPropagation();const $=x.currentTarget.getBoundingClientRect();Bn(Nf($)),$e(de=>!de)},va=x=>{x.stopPropagation(),ye(t.id,{executionMode:Vt.key,enableSubAgents:Wt}),$e(!1)},Vs=x=>{x.stopPropagation(),We(t.id)},zn=(x,$)=>{$.stopPropagation();const de=De.find(dt=>dt.variantId===x);!de||!t.imageStack||de.variantId===t.imageStack.activeVariantId||(f.emit("node.imageStack.variant",{nodeId:t.id,variantId:de.variantId,variantCount:De.length}),b(t.id,{imageUrl:de.imageUrl,imageStack:{...t.imageStack,activeVariantId:de.variantId,variants:De,updatedAtUtc:new Date().toISOString()},metadata:{...t.metadata??{},ImageStackActiveVariantId:de.variantId}}))},ja=(x,$)=>{if($.stopPropagation(),!!he){if((Te==null?void 0:Te.key)===x){la(!1);return}f.emit("node.memoColor.changed",{id:t.id,colorKey:x}),b(t.id,{metadata:{...t.metadata??{},memoColor:x,memoColorIsCustom:"true"}}),la(!1)}},Hn=x=>{var Ue,yt;if(x.stopPropagation(),!ze)return;const $=(t.body||t.title||"Agent command objective").trim(),de=["Clarify the objective and constraints.","Collect linked canvas context or code notes.","Draft an execution plan before external adapter use."],dt=["canvas-context","agent-command-planning","adapter-gated-execution"],Pt=["Canvas.ListAgentCommands","Canvas.UpdateAgentCommand","Canvas.PlanAgentCommand","Canvas.SetAgentCommandState"],et=["MindCanvasAgent",gt,ot],ma=["Local React plan staged for this Agent Command.",`Role: ${ot}`,`Mode: ${gt}`,`Objective: ${$.slice(0,220)}`,"External execution remains adapter-gated until LocalBridge/agent runtime is available."].join(`
|
|
3
|
+
`);f.emit("mindcanvas.agentCommand.planned",{id:t.id,mode:gt,requestedRole:ot,adapterState:((Ue=t.metadata)==null?void 0:Ue.AdapterState)??"adapter-gated"}),b(t.id,{tags:["Agent Command",ot,"Planned"],metadata:{...t.metadata??{},AgentCommandStatus:"Planned",AgentCommandPlannerSummary:ma,AgentCommandPlanSteps:JSON.stringify(de),AgentCommandPlannedSkills:JSON.stringify(dt),AgentCommandPlannedTools:JSON.stringify(Pt),AgentCommandPlannedConcepts:JSON.stringify(et),AgentCommandLastExplorationPhase:"planned-local",AdapterState:((yt=t.metadata)==null?void 0:yt.AdapterState)??"adapter-gated"}})},Gt=x=>{var Pt,et;if(x.stopPropagation(),!ze)return;const $=new Date().toISOString(),de=[`Agent Command: ${t.title||"Agent"}`,`Status: Completed locally at ${$}`,"","This React MindCanvas node preserves the original Agent Command workflow shape.","No external agent runtime was invoked; execution remains adapter-gated.","","Next action:","Connect LocalBridge/agent runtime or move this command into CodeMaster for a deeper implementation run."].join(`
|
|
4
|
+
`),dt=[`${$} Local React execution staged.`,`${$} Adapter gated; no external tools invoked.`];f.emit("mindcanvas.agentCommand.executed.local",{id:t.id,mode:gt,requestedRole:ot,adapterState:((Pt=t.metadata)==null?void 0:Pt.AdapterState)??"adapter-gated"}),b(t.id,{status:"done",result:de,tags:["Agent Command",ot,"Completed"],metadata:{...t.metadata??{},AgentCommandStatus:"Completed",AgentCommandLastExecutedAtUtc:$,AgentCommandConsoleLogs:JSON.stringify(dt),AgentCommandResultLinks:JSON.stringify([]),AdapterState:((et=t.metadata)==null?void 0:et.AdapterState)??"adapter-gated"}})},Ja=(x,$,de,dt)=>{var et,ma,Ue;if(x.stopPropagation(),!H)return;const Pt=$==="Implemented"?JSON.stringify([`local-code-note://${t.id}/implementation-handoff.md`]):((et=t.metadata)==null?void 0:et.CodeNoteOutputArtifacts)||"[]";f.emit("mindcanvas.codeNote.state",{id:t.id,status:$,syncState:de,reason:dt,adapterState:((ma=t.metadata)==null?void 0:ma.AdapterState)??"local-canvas-only"}),b(t.id,{tags:["Code Note",$,de],metadata:{...t.metadata??{},CodeNoteStatus:$,CodeNoteSyncState:de,CodeNoteOutputArtifacts:Pt,...$==="Implemented"||$==="Reviewed"?{CodeNoteLastAppliedAtUtc:new Date().toISOString()}:{},AdapterState:((Ue=t.metadata)==null?void 0:Ue.AdapterState)??"local-canvas-only"}})},Ia=()=>{On(x=>!x)},da=async x=>{if(x.stopPropagation(),!ke||!qe.current){f.emit("node.video.unavailable",{id:t.id,reason:ke?"element-missing":"source-missing"});return}try{await qe.current.play(),f.emit("node.video.play",{id:t.id,sourceKind:kd(ke)})}catch($){f.emit("node.video.unavailable",{id:t.id,reason:$ instanceof Error?$.message:String($)})}},Bo=x=>{if(x.stopPropagation(),!ke||!qe.current){f.emit("node.video.unavailable",{id:t.id,reason:ke?"element-missing":"source-missing"});return}qe.current.pause(),f.emit("node.video.pause",{id:t.id,sourceKind:kd(ke)})},rt=x=>{x.stopPropagation(),ht&&Y(t.id,ht)},Za=x=>{b(t.id,{body:JSON.stringify(x),metadata:{...t.metadata??{},templateLauncherSelectedOptionId:x.selectedOptionId??""}})},Kt=(x,$)=>{if($.stopPropagation(),!me)return;const de=mp(me,x);Za(de),f.emit("templateCard.option.select",{nodeId:t.id,optionId:de.selectedOptionId??null})},Qa=(x,$)=>{if(!me)return;const de=pp(me,x,$);Za(de),f.emit("templateCard.input.patch",{nodeId:t.id,key:x})},Wn=x=>{x.stopPropagation(),!(!me||bt)&&jt(t.id,me.selectedOptionId??null,me.inputValues)},Qe=Ye&&Eo?o.jsxs("div",{className:"node-company-launcher","data-testid":"node-company-launcher",style:_n?{left:_n.left,top:_n.top}:void 0,onPointerDown:x=>x.stopPropagation(),onClick:x=>x.stopPropagation(),children:[o.jsx("div",{className:"node-company-launcher__eyebrow",children:"Run As Company"}),o.jsx("h4",{children:"Turn this note into a background AI company"}),o.jsx("p",{children:"Pick the operating mode to stage on this node. External CompanyCore execution stays adapter-gated."}),o.jsx("div",{className:"node-company-mode-list",children:Tr.map(x=>o.jsxs("button",{type:"button",className:x.key===Vt.key?"is-selected":"","data-company-mode":x.key,onClick:()=>qa(x.key),children:[o.jsx("strong",{children:x.label}),o.jsx("span",{children:x.description})]},x.key))}),o.jsxs("button",{type:"button",className:"node-company-subagents","aria-pressed":Wt,onClick:x=>{x.stopPropagation(),Ia()},children:[o.jsx("span",{className:"node-company-toggle-indicator","aria-hidden":"true",children:Wt?"On":"Off"}),o.jsxs("span",{children:[o.jsx(gc,{size:13}),"Enable sub-agents for exploration waves and specialist handoff"]})]}),o.jsxs("div",{className:"node-company-launcher__actions",children:[o.jsx("button",{type:"button",className:"btn btn-ghost",onClick:()=>$e(!1),children:"Cancel"}),o.jsx("button",{type:"button",className:"btn btn-primary","data-testid":"node-company-run-confirm",onClick:va,children:"Stage Company"})]})]}):null,en={width:t.width,height:t.height,transform:`translate3d(${t.x}px, ${t.y}px, 0)`,...Te?{"--memo-bg":Te.surface,"--memo-border":Te.border,"--memo-ink":Te.ink,"--memo-ring":Te.ring,"--memo-accent":Te.swatch}:{}},tn=o.jsxs(o.Fragment,{children:[Ro&&o.jsx("button",{type:"button",title:P(Oe?"Disable AI reference":"Enable AI reference"),"aria-label":P(Oe?"Disable AI reference":"Enable AI reference"),className:Oe?"is-active-ai":"is-inactive-ai",onPointerDown:x=>x.stopPropagation(),onClick:()=>U(t.id),children:o.jsx(Yp,{size:13})}),he&&o.jsx("button",{type:"button",title:P("Change memo color"),"aria-label":P("Change memo color"),"aria-pressed":$n,className:"is-memo-color-action","data-testid":"node-memo-color-open",onPointerDown:x=>x.stopPropagation(),onClick:x=>{x.stopPropagation(),la($=>!$)},children:o.jsx(hc,{size:13})}),t.kind==="code"&&o.jsx("button",{type:"button",title:t.wordWrap===!1?P("Enable word wrap"):P("Disable word wrap"),"aria-label":t.wordWrap===!1?P("Enable word wrap"):P("Disable word wrap"),onPointerDown:x=>x.stopPropagation(),onClick:()=>Pe(t.id),children:o.jsx(Gp,{size:13})}),o.jsx("button",{type:"button",title:P(Sa?"Copy image to clipboard":"Copy content"),"aria-label":P(Sa?"Copy image to clipboard":"Copy content"),onPointerDown:x=>x.stopPropagation(),onClick:()=>V(t.id),children:o.jsx(So,{size:13})}),o.jsx("button",{type:"button",title:P("Duplicate node"),"aria-label":P("Duplicate node"),"data-testid":"node-duplicate",onPointerDown:x=>x.stopPropagation(),onClick:()=>_(t.id),children:o.jsx(fc,{size:13})}),Tt&&o.jsx("button",{type:"button",title:P("Fit text height"),"aria-label":P("Fit text height"),onPointerDown:x=>x.stopPropagation(),onClick:()=>ce(t.id),children:o.jsx(Kp,{size:13})}),Tt&&o.jsx("button",{type:"button",title:P(Je?"Expand node":"Collapse node"),"aria-label":P(Je?"Expand node":"Collapse node"),"aria-pressed":Je,onPointerDown:x=>x.stopPropagation(),onClick:()=>le(t.id),children:Je?o.jsx(Xl,{size:13}):o.jsx(Xp,{size:13})}),Tn&&o.jsx("button",{type:"button",title:P("Run node"),onPointerDown:x=>x.stopPropagation(),onClick:()=>N(t.id),children:o.jsx(ya,{size:13})}),Ye&&o.jsx("button",{type:"button",title:t.companyMode?P("Open Company graph"):P("Run this note as Company"),"aria-label":t.companyMode?P("Open Company graph"):P("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?Vs:_o,children:o.jsx(ql,{size:13})}),o.jsx("button",{type:"button",title:P("Delete node"),"aria-label":P("Delete node"),"data-testid":"node-delete",onPointerDown:x=>x.stopPropagation(),onClick:()=>w(t.id),children:o.jsx(Ps,{size:13})})]});Tn?(P("Context input"),Jl,P("Context"),t.result,P("Drag to connect this result to an input pin. Click to view the result."),Xl,P("Result")):(P("Use this node as AI Task context"),Jl,P("Context"));const Ne=se?null:o.jsx("div",{className:"node-connector-handles","data-testid":"node-connector-handles","aria-hidden":!1,children:Sf.map(x=>o.jsx("button",{type:"button",className:`node-connector-handle node-connector-handle--${x} ${Ao&&(c==null?void 0:c.fromSide)===x?"is-source":""} ${ra===x?"is-target":""}`,title:P(`Drag from ${x} to connect`),"aria-label":P(`Drag ${x} connector`),"data-testid":"node-connector-handle","data-node-connector":"true","data-connector-node-id":t.id,"data-connector-side":x,"data-connector-kind":Ut,onPointerDown:$=>O(t.id,x,Ut,$)},x))}),fe=zt||De.length>1||Me||Ae?o.jsxs("div",{className:"node-surface-badges","data-testid":"node-surface-badges",children:[zt&&o.jsx("span",{className:"node-mask-badge",title:P("Image edit mask reference"),children:"Mask"}),De.length>1&&o.jsxs("span",{className:"node-image-stack-badge",title:P("Image stack variants"),children:[Math.max(1,To+1),"/",De.length]}),Me&&o.jsx("span",{className:"node-embed-badge",children:Ln==="youtube"?"YouTube":"Embed"}),Ae&&o.jsx("span",{className:"node-video-badge",children:((Ma=t.metadata)==null?void 0:Ma.MediaModel)||((ua=t.metadata)==null?void 0:ua.MediaProvider)||"Video"})]}):null,Oo=De.length>1||Me||Ae||sa?o.jsxs("div",{className:"node-surface-actions","data-testid":"node-surface-actions",children:[De.length>1&&o.jsx("div",{className:"node-image-stack-rail","aria-label":P("Image stack variants"),children:De.map((x,$)=>o.jsx("button",{type:"button",className:x.variantId===(ft==null?void 0:ft.variantId)?"is-active":"",title:x.title||x.caption||P(`Variant ${$+1}`),"aria-label":P(`Show image variant ${$+1}`),onPointerDown:de=>de.stopPropagation(),onClick:de=>zn(x.variantId,de),children:o.jsx(Mr,{src:x.imageUrl,traceId:`${t.id}:${x.variantId||$}`,kind:"image-stack-variant",testId:"node-image-stack-thumb"})},x.variantId||`${x.imageUrl}-${$}`))}),Me&&o.jsxs("div",{className:"node-embed-actions",children:[o.jsxs("button",{type:"button",title:P("Open embed"),"aria-label":P("Open embed"),onPointerDown:x=>x.stopPropagation(),onClick:x=>{x.stopPropagation(),ht&&ue(t,"external")},children:[o.jsx(vn,{size:13}),o.jsx("span",{children:P("Open")})]}),o.jsxs("button",{type:"button",title:P("Copy URL"),"aria-label":P("Copy URL"),onPointerDown:x=>x.stopPropagation(),onClick:rt,children:[o.jsx(So,{size:13}),o.jsx("span",{children:P("Copy URL")})]})]}),Ae&&o.jsxs("div",{className:"node-video-actions",children:[o.jsxs("button",{type:"button",title:P("Play video"),"aria-label":P("Play video"),"data-testid":"node-video-play",onPointerDown:x=>x.stopPropagation(),onClick:da,children:[o.jsx(ya,{size:13}),o.jsx("span",{children:P("Play")})]}),o.jsxs("button",{type:"button",title:P("Pause video"),"aria-label":P("Pause video"),"data-testid":"node-video-pause",onPointerDown:x=>x.stopPropagation(),onClick:Bo,children:[o.jsx(jo,{size:13}),o.jsx("span",{children:P("Pause")})]})]}),sa&&o.jsxs("div",{className:"node-asset-actions",children:[t.kind==="pdf"&&o.jsxs("button",{type:"button",title:P("Preview PDF"),"data-testid":"node-pdf-preview",onPointerDown:x=>x.stopPropagation(),onClick:()=>ue(t,"preview"),children:[o.jsx(qp,{size:13}),o.jsx("span",{children:P("Preview")})]}),t.kind!=="directory"&&o.jsxs("button",{type:"button",title:P("Open in new tab"),onPointerDown:x=>x.stopPropagation(),onClick:()=>ue(t,"external"),children:[o.jsx(vn,{size:13}),o.jsx("span",{children:P("Open")})]}),t.kind==="directory"&&o.jsxs("button",{type:"button",title:P("Scan folder"),"data-testid":"directory-scan",onPointerDown:x=>x.stopPropagation(),onClick:()=>mt(t.id),children:[o.jsx(jn,{size:13}),o.jsx("span",{children:P("Scan")})]}),t.kind==="directory"&&o.jsxs("button",{type:"button",title:P("Folder scan settings"),"data-testid":"directory-settings-open",onPointerDown:x=>x.stopPropagation(),onClick:()=>oe(t.id),children:[o.jsx(ws,{size:13}),o.jsx("span",{children:P("Settings")})]})]})]}):null,$o=!se&&!Be?o.jsxs("div",{className:"node-external-action-rail","data-testid":"node-external-action-rail",onPointerDown:x=>x.stopPropagation(),onClick:x=>x.stopPropagation(),children:[Oo,o.jsx("div",{className:"node-external-rail__pins",children:null}),o.jsx("div",{className:"node-actions","data-testid":"node-actions",children:tn}),ze&&o.jsxs("div",{className:"node-agent-command-actions","data-testid":"node-agent-command-actions",onPointerDown:x=>x.stopPropagation(),onClick:x=>x.stopPropagation(),children:[o.jsx("button",{type:"button","data-testid":"node-agent-command-plan","data-agent-command-action":"plan",onClick:Hn,children:P("Plan")}),o.jsx("button",{type:"button","data-testid":"node-agent-command-execute","data-agent-command-action":"execute",disabled:pt==="Running",onClick:Gt,children:P("Execute")})]}),H&&o.jsxs("div",{className:"node-code-note-actions","data-testid":"node-code-note-actions",onPointerDown:x=>x.stopPropagation(),onClick:x=>x.stopPropagation(),children:[o.jsx("button",{type:"button","data-testid":"node-code-note-approve","data-code-note-action":"approve",onClick:x=>Ja(x,"Approved","Planned","approve-local"),children:P("Approve")}),o.jsx("button",{type:"button","data-testid":"node-code-note-review","data-code-note-action":"review",onClick:x=>Ja(x,"Reviewed","InSync","review-local"),children:P("Review")}),o.jsx("button",{type:"button","data-testid":"node-code-note-out-of-sync","data-code-note-action":"out-of-sync",onClick:x=>Ja(x,Ft,"OutOfSync","mark-out-of-sync-local"),children:P("Out of sync")})]}),t.companyMode&&o.jsxs("div",{className:"node-company-quick-actions","data-testid":"node-company-quick-actions","data-company-status":Yt||"Staged",onPointerDown:x=>x.stopPropagation(),onClick:x=>x.stopPropagation(),children:[o.jsx("button",{type:"button",title:P("Update Company goal from this note"),"aria-label":P("Update Company goal from this note"),"data-testid":"node-company-sync-goal",disabled:Un,onClick:()=>vt(t.id),children:o.jsx(bc,{size:12})}),o.jsx("button",{type:"button",title:P("Refresh Company status"),"aria-label":P("Refresh Company status"),"data-testid":"node-company-refresh",onClick:()=>nt(t.id),children:o.jsx(jn,{size:12})}),Un?o.jsx("button",{type:"button",title:P("Company is archived"),"aria-label":P("Company is archived"),"data-testid":"node-company-archived",disabled:!0,children:o.jsx(Gr,{size:12})}):Ws?o.jsx("button",{type:"button",title:P("Resume Company"),"aria-label":P("Resume Company"),"data-testid":"node-company-resume",onClick:()=>G(t.id,"Staged"),children:o.jsx(ya,{size:12})}):o.jsx("button",{type:"button",title:P("Pause Company"),"aria-label":P("Pause Company"),"data-testid":"node-company-pause",onClick:()=>G(t.id,"Paused"),children:o.jsx(jo,{size:12})}),!Un&&o.jsx("button",{type:"button",title:P("Archive Company"),"aria-label":P("Archive Company"),"data-testid":"node-company-archive",onClick:()=>G(t.id,"Archived"),children:o.jsx(Gr,{size:12})}),o.jsx("button",{type:"button",title:P("Remove Company from this note"),"aria-label":P("Remove Company from this note"),"data-testid":"node-company-remove",onClick:()=>X(t.id),children:o.jsx(Ot,{size:12})})]})]}):null,Ys=!se&&!Be?o.jsx("div",{className:"node-external-rail","data-testid":"node-external-rail",onPointerDown:x=>x.stopPropagation(),onClick:x=>x.stopPropagation(),children:o.jsxs("div",{className:"node-external-rail__meta",children:[o.jsxs("div",{className:"node-tags","data-testid":"node-external-tags",children:[(t.tags??[t.kind]).slice(0,3).map(x=>o.jsx("span",{children:x},x)),t.status&&o.jsx("span",{className:`node-status node-status--${t.status}`,children:t.status})]}),fe,Po,ze&&o.jsxs("div",{className:"node-agent-command-state","data-testid":"node-agent-command-state","data-agent-command-status":pt,"data-agent-command-mode":gt,"data-agent-command-role":ot,"data-agent-command-adapter-state":((Fe=t.metadata)==null?void 0:Fe.AdapterState)||"adapter-gated",children:[o.jsx(Cn,{size:12}),o.jsx("strong",{children:"AC"}),o.jsx("span",{children:pt}),o.jsx("span",{children:gt}),o.jsx("span",{children:ot})]}),H&&o.jsxs("div",{className:"node-code-note-state","data-testid":"node-code-note-state","data-code-note-status":Ft,"data-code-note-sync-state":Ca,"data-code-note-kind":ka,"data-code-note-adapter-state":((_e=t.metadata)==null?void 0:_e.AdapterState)||"local-canvas-only",children:[o.jsx(kn,{size:12}),o.jsx("strong",{children:"CN"}),o.jsx("span",{children:Ft}),o.jsx("span",{children:Ca}),o.jsx("span",{children:ka})]}),t.companyMode&&o.jsxs("div",{className:"node-company-state","data-testid":"node-company-state",children:[o.jsx(ql,{size:12}),o.jsx("strong",{children:((Ta=t.metadata)==null?void 0:Ta.CompanyExecutionModeLabel)||"Company staged"}),o.jsx("span",{children:((Ra=t.metadata)==null?void 0:Ra.CompanySubAgents)==="false"?"single-agent":"sub-agents"})]})]})}):null;return o.jsxs("article",{className:`canvas-node canvas-node--${t.kind} ${se?"canvas-node--remote-surface":""} ${Mt?"canvas-node--remote-monitor-surface":""} ${Ie?"canvas-node--remote-control-surface":""} ${Nt?`canvas-node--automation-${Nt}`:""} ${ze?"canvas-node--agent-command":""} ${H?"canvas-node--code-note":""} ${n?"is-selected":""} ${d?"is-pulsing":""} ${Oe?"":"is-ai-disabled"} ${t.wordWrap===!1?"is-nowrap":""} ${Je?"is-collapsed":""} ${t.companyMode?`is-company-${t.companyMode}`:""}`,style:en,"data-node-id":t.id,"data-automation-node-kind":Nt||void 0,"data-automation-external-policy":((cn=t.metadata)==null?void 0:cn.AutomationExternalActionPolicy)||void 0,"data-media-generation-contract":((qn=t.metadata)==null?void 0:qn.MediaGenerationContract)||void 0,"data-agent-command-node":ze?"true":void 0,"data-agent-command-status":ze?pt:void 0,"data-agent-command-mode":ze?gt:void 0,"data-agent-command-role":ze?ot:void 0,"data-code-note-node":H?"true":void 0,"data-code-note-status":H?Ft:void 0,"data-code-note-sync-state":H?Ca:void 0,"data-code-note-kind":H?ka:void 0,"data-node-status":t.status||void 0,"data-selection-count":r,"data-node-chrome-suppressed":Be?"multi-selection":void 0,"data-remote-surface-chrome":se?"self-contained":void 0,"data-remote-surface-kind":Ei||void 0,"data-remote-surface-title-owner":se?"inner-remote-view":void 0,"data-remote-surface-scroll-owner":se?"remote-page-rail":void 0,onPointerDown:x=>{m(t.id,x.shiftKey||x.metaKey||x.ctrlKey),y(t.id,x)},onDoubleClick:x=>{if(t.kind!=="directory")return;const $=x.target instanceof HTMLElement?x.target:null;$!=null&&$.closest('button,input,textarea,select,[contenteditable="true"],[contenteditable=""]')||(x.stopPropagation(),mt(t.id))},children:[!se&&o.jsxs("div",{className:"node-header",children:[o.jsx("span",{className:"node-kind",children:o.jsx(No,{size:14})}),o.jsx("input",{value:t.title,"aria-label":P("Node title"),readOnly:xe,onPointerDown:x=>x.stopPropagation(),onChange:x=>{xe||b(t.id,{title:x.target.value})}}),t.status==="running"&&o.jsxs("span",{className:"node-run-state node-run-state--running","data-testid":"node-running-state",children:[o.jsx(jn,{size:12}),o.jsx("span",{children:"Running"})]})]}),Qe&&typeof document<"u"?Qm.createPortal(Qe,document.body):Qe,he&&$n&&Te&&o.jsx("div",{className:"node-memo-palette","data-testid":"node-memo-palette",onPointerDown:x=>x.stopPropagation(),onClick:x=>x.stopPropagation(),children:ai.map(x=>o.jsx("button",{type:"button",className:x.key===Te.key?"is-active":"",title:P(`${x.label} memo color`),"aria-label":P(`${x.label} memo color`),"aria-pressed":x.key===Te.key,"data-memo-color":x.key,style:{"--memo-swatch":x.swatch,"--memo-swatch-ring":x.ring},onPointerDown:$=>$.stopPropagation(),onClick:$=>ja(x.key,$)},x.key))}),Sa?o.jsx("div",{className:`node-image-wrap ${De.length>1?"node-image-wrap--stack":""} ${zt?"node-image-wrap--mask":""}`,"data-testid":zt?"node-mask-preview":De.length>1?"node-image-stack":void 0,children:o.jsx(Mr,{src:Sa,traceId:t.id,kind:zt?"mask":"node-image",testId:"node-secure-image"})}):Mt?o.jsx(cp,{node:t,onPatch:b,onCreateRemoteControl:W}):Ie?o.jsx(up,{node:t,onPatch:b}):xe?o.jsx("div",{className:"node-template-card","data-testid":"node-template-card",children:me&&st?o.jsxs(o.Fragment,{children:[o.jsxs("div",{className:"node-template-card__summary",children:[o.jsx("strong",{children:me.prompt||me.description}),o.jsx("span",{children:st.description||me.description})]}),o.jsx("div",{className:"node-template-card__options","data-testid":"node-template-card-options",children:me.options.map(x=>o.jsxs("button",{type:"button",className:x.id===st.id?"is-active":"","data-testid":"node-template-card-option","data-option-id":x.id,onPointerDown:$=>$.stopPropagation(),onClick:$=>Kt(x.id,$),children:[o.jsx("strong",{children:x.label}),o.jsx("span",{children:x.description})]},x.id||x.templateId))}),o.jsxs("div",{className:"node-template-card__inputs","data-testid":"node-template-card-inputs",children:[st.inputs.map(x=>o.jsx(If,{input:x,value:me.inputValues[x.key]??"",onChange:$=>Qa(x.key,$)},x.key)),st.inputs.length===0&&o.jsx("p",{className:"node-template-card__empty",children:me.noInputsLabel||"No inputs needed."})]}),bt&&o.jsx("div",{className:"node-template-card__validation",children:bt}),o.jsxs("button",{type:"button",className:"node-template-card__generate","data-testid":"node-template-card-generate",disabled:!!bt,onPointerDown:Wn,onClick:x=>x.stopPropagation(),children:[o.jsx(ya,{size:13}),o.jsx("span",{children:me.generateLabel||me.actionLabel||"Generate"})]})]}):o.jsx("div",{className:"node-template-card__missing",children:"Template card payload is unavailable."})}):Me?o.jsxs("div",{className:`node-embed-card ${Ht?"has-embed-thumbnail":"is-embed-link"}`,"data-testid":"node-embed-card",children:[o.jsx("div",{className:"node-embed-preview",children:Ht?o.jsx(Mr,{src:Ht,traceId:t.id,kind:"embed-thumbnail",testId:"node-embed-thumbnail"}):o.jsxs("div",{className:"node-embed-placeholder",children:[o.jsx(vn,{size:24}),o.jsx("strong",{children:Ln==="youtube"?"YouTube":"Web embed"}),o.jsx("span",{children:Pn||ht||"External link"})]})}),o.jsx("textarea",{value:t.body,"aria-label":P("Embed URL or description"),spellCheck:!1,onPointerDown:x=>x.stopPropagation(),onChange:x=>{const $=x.target.value;b(t.id,{body:$,assetUrl:$,metadata:{...t.metadata??{},sourceUrl:$,url:$}})}}),ht&&o.jsx("span",{className:"node-embed-source",title:ht,children:ht})]}):Ae?o.jsxs("div",{className:`node-video-card ${ke?"has-video-source":"is-video-prompt"}`,"data-testid":"node-video-card",children:[ke?o.jsx("video",{ref:qe,src:ke,className:"node-video-player","data-testid":"node-video-player",controls:!0,preload:"metadata",onPointerDown:x=>x.stopPropagation()}):o.jsxs("div",{className:"node-video-placeholder",children:[o.jsx(wn,{size:24}),o.jsx("strong",{children:"Video prompt"}),o.jsx("span",{children:((La=t.metadata)==null?void 0:La.MediaModel)||((un=t.metadata)==null?void 0:un.MediaProvider)||"Adapter gated"})]}),o.jsx("textarea",{value:t.body,"aria-label":P("Video prompt or source"),spellCheck:!1,onPointerDown:x=>x.stopPropagation(),onChange:x=>b(t.id,{body:x.target.value})}),ke&&o.jsx("span",{className:"node-video-source",title:Rn,children:Rn})]}):sa?o.jsxs("div",{className:`node-asset-card node-asset-card--${t.kind}`,"data-testid":"node-asset-card",children:[o.jsx("div",{className:"node-asset-icon",children:o.jsx(No,{size:28})}),o.jsxs("div",{className:"node-asset-copy",children:[o.jsx("strong",{title:Ga,children:Ga}),o.jsx("span",{children:t.kind==="directory"?"Directory reference":t.kind==="pdf"?"PDF document":"File reference"}),t.kind==="directory"&&(En||Ee||Rt||ia||Xa)&&o.jsxs("dl",{className:"node-asset-meta","data-testid":"node-directory-meta",children:[(Rt||ia)&&o.jsxs(o.Fragment,{children:[o.jsx("dt",{children:"Scanned"}),o.jsxs("dd",{children:[Number(Rt??0).toLocaleString()," files / ",Number(ia??0).toLocaleString()," folders"]})]}),En&&o.jsxs(o.Fragment,{children:[o.jsx("dt",{children:"Include"}),o.jsx("dd",{children:En})]}),Ee&&o.jsxs(o.Fragment,{children:[o.jsx("dt",{children:"Exclude"}),o.jsx("dd",{children:Ee})]}),Xa&&o.jsxs(o.Fragment,{children:[o.jsx("dt",{children:"Updated"}),o.jsx("dd",{children:new Date(Xa).toLocaleString()})]})]})]})]}):Ya?o.jsxs("div",{className:"node-csv-card","data-testid":"node-csv-card",children:[o.jsx(Af,{preview:wa,sort:Ze,appLanguage:It,onSort:x=>{const $=(Ze==null?void 0:Ze.columnIndex)===x&&Ze.direction==="asc"?"desc":"asc";Fn({columnIndex:x,direction:$}),f.emit("node.csvTable.sort",{id:t.id,columnIndex:x,direction:$})}}),o.jsx("textarea",{value:t.body,"aria-label":P("CSV source"),spellCheck:!1,wrap:"off",onPointerDown:x=>x.stopPropagation(),onChange:x=>b(t.id,{body:x.target.value})})]}):Mo?o.jsxs("div",{className:"node-markdown-card","data-testid":"node-markdown-card",children:[o.jsx("div",{className:"node-markdown-preview mindcanvas-text-scrollable-view","data-testid":"node-markdown-preview","aria-label":P("Markdown preview"),children:o.jsx(Lf,{value:t.body})}),o.jsx("textarea",{value:t.body,"aria-label":P("Markdown source"),spellCheck:!1,wrap:t.wordWrap===!1?"off":"soft",onPointerDown:x=>x.stopPropagation(),onChange:x=>b(t.id,{body:x.target.value})})]}):o.jsx(o.Fragment,{children:o.jsx("textarea",{value:t.body,"aria-label":P("Node body"),spellCheck:!1,wrap:t.wordWrap===!1?"off":"soft",onPointerDown:x=>x.stopPropagation(),onChange:x=>b(t.id,{body:x.target.value})})}),Ys,$o,Ne,o.jsx("button",{type:"button",className:"node-resize-handle",title:P("Resize node"),"aria-label":P("Resize node"),onPointerDown:x=>p(t.id,x)})]})});function If({input:e,value:t,onChange:n}){return o.jsxs("label",{className:"node-template-card__field",children:[o.jsxs("span",{children:[o.jsx("strong",{children:e.label}),e.description&&o.jsx("small",{children:e.description})]}),e.type==="textarea"?o.jsx("textarea",{value:t,placeholder:e.placeholder,onPointerDown:r=>r.stopPropagation(),onChange:r=>n(r.target.value)}):e.type==="select"?o.jsx("select",{value:t,onPointerDown:r=>r.stopPropagation(),onChange:r=>n(r.target.value),children:(e.options??[]).map(r=>o.jsx("option",{value:r.value,children:r.label},r.value))}):o.jsx("input",{type:"text",value:t,placeholder:e.placeholder,onPointerDown:r=>r.stopPropagation(),onChange:r=>n(r.target.value)})]})}function Nf(e){const r=Math.min(430,window.innerHeight-24),d=Math.max(12,window.innerWidth-332-12),c=Math.min(Math.max(e.right-332,12),d),m=e.bottom+8,y=e.top-r-8,p=Math.max(12,window.innerHeight-r-12),b=m<=p?m:Math.max(12,y);return{left:c,top:Math.min(b,p)}}function Af({preview:e,sort:t,appLanguage:n,onSort:r}){const d=c=>fi(n,c);return!e||e.headers.length===0?o.jsx("div",{className:"csv-table-scroll mindcanvas-text-scrollable-view","data-testid":"csv-table-preview","aria-label":d("CSV table preview"),children:o.jsx("p",{className:"node-md-empty",children:"Paste CSV source to preview a table."})}):o.jsxs("div",{className:"csv-table-scroll mindcanvas-text-scrollable-view","data-testid":"csv-table-preview","data-sort-column":(t==null?void 0:t.columnIndex)??"","data-sort-direction":(t==null?void 0:t.direction)??"","data-total-rows":e.totalRows,"data-rendered-rows":e.renderedRows,"aria-label":d("CSV table preview"),onPointerDown:c=>c.stopPropagation(),children:[o.jsxs("table",{className:"csv-table",children:[o.jsx("thead",{children:o.jsx("tr",{children:e.headers.map((c,m)=>{const y=(t==null?void 0:t.columnIndex)===m,p=y&&t.direction==="asc"?"descending":"ascending";return o.jsx("th",{"aria-sort":y?t.direction==="asc"?"ascending":"descending":"none",children:o.jsxs("button",{type:"button",className:`csv-table-header-button ${y?"is-active":""}`,"data-testid":`csv-table-sort-${m}`,"aria-label":`Sort CSV by ${c||`Column ${m+1}`} ${p}`,onClick:()=>r(m),children:[o.jsx("span",{children:c||`Column ${m+1}`}),y&&o.jsx("small",{children:t.direction==="asc"?"Asc":"Desc"})]})},`${c}-${m}`)})})}),o.jsx("tbody",{children:e.rows.map((c,m)=>o.jsx("tr",{children:e.headers.map((y,p)=>o.jsx("td",{className:"csv-table-cell",children:c[p]??""},`csv-cell-${m}-${p}`))},`csv-row-${m}`))})]}),o.jsxs("div",{className:"csv-table-status",children:[o.jsxs("span",{children:[e.totalRows.toLocaleString()," rows"]}),o.jsxs("span",{children:[e.columnCount.toLocaleString()," columns"]}),e.truncated&&o.jsxs("span",{children:["showing ",e.renderedRows.toLocaleString()]})]})]})}function Mf(e,t){const n=Tf(e,xd+1);if(n.length===0)return null;const r=Math.min(bf,Math.max(...n.map(p=>p.length),1)),d=Cd(n[0],r).map((p,b)=>p.trim()||`Column ${b+1}`),c=n.slice(1,xd+1).map(p=>Cd(p,r)),m=t?[...c].sort((p,b)=>Rf(p[t.columnIndex]??"",b[t.columnIndex]??"",t.direction)):c,y=Math.max(0,String(e||"").split(/\r\n|\n|\r/).filter(p=>p.length>0).length-1);return{headers:d,rows:m,totalRows:y,columnCount:r,renderedRows:m.length,truncated:y>m.length}}function Tf(e,t){const n=[];let r=[],d="",c=!1;const m=String(e||"").replace(/\r\n/g,`
|
|
5
|
+
`).replace(/\r/g,`
|
|
6
|
+
`);for(let y=0;y<m.length;y+=1){const p=m[y],b=m[y+1];if(p==='"'){c&&b==='"'?(d+='"',y+=1):c=!c;continue}if(p===","&&!c){r.push(d),d="";continue}if(p===`
|
|
7
|
+
`&&!c){if(r.push(d),r.some(w=>w.trim().length>0)&&n.push(r),r=[],d="",n.length>=t)break;continue}d+=p}return n.length<t&&(d.length>0||r.length>0)&&(r.push(d),r.some(y=>y.trim().length>0)&&n.push(r)),n}function Cd(e,t){return Array.from({length:t},(n,r)=>String(e[r]??"").trim())}function Rf(e,t,n){const r=Number(e.replace(/,/g,"")),d=Number(t.replace(/,/g,"")),m=Number.isFinite(r)&&Number.isFinite(d)&&e.trim()!==""&&t.trim()!==""?r-d:e.localeCompare(t,void 0,{numeric:!0,sensitivity:"base"});return n==="asc"?m:-m}function Lf({value:e}){const t=Pf(e);return t.length===0?o.jsx("p",{className:"node-md-empty",children:"Nothing to preview yet."}):o.jsx(o.Fragment,{children:t.map((n,r)=>{const d=`${n.kind}-${r}-${n.text}`;switch(n.kind){case"heading":return o.jsx("strong",{className:`node-md-heading node-md-heading--${n.level}`,children:n.text},d);case"quote":return o.jsx("blockquote",{className:"node-md-quote",children:n.text},d);case"list":return o.jsxs("div",{className:"node-md-list-item",children:[o.jsx("span",{"aria-hidden":"true",children:"-"}),o.jsx("p",{children:n.text})]},d);case"code":return o.jsx("code",{className:"node-md-code",children:n.text},d);case"table":return o.jsx("p",{className:"node-md-table-row",children:n.text},d);default:return o.jsx("p",{children:n.text},d)}})})}function Pf(e){const t=[];for(const n of String(e||"").replace(/\r\n/g,`
|
|
8
|
+
`).split(`
|
|
9
|
+
`)){const r=n.trim();if(!r)continue;const d=/^(#{1,6})\s+(.+)$/.exec(r);if(d?t.push({kind:"heading",level:d[1].length,text:ps(d[2])}):/^>\s?/.test(r)?t.push({kind:"quote",text:ps(r.replace(/^>\s?/,""))}):/^([-*+]|\d+\.)\s+/.test(r)?t.push({kind:"list",text:ps(r.replace(/^([-*+]|\d+\.)\s+/,""))}):/^```/.test(r)||/^`[^`]+`$/.test(r)?t.push({kind:"code",text:r.replace(/^```[a-z0-9_-]*\s*/i,"").replace(/```$/,"").replace(/^`|`$/g,"")||"code block"}):/^\|.+\|$/.test(r)?t.push({kind:"table",text:r}):t.push({kind:"paragraph",text:ps(r)}),t.length>=12)break}return t}function ps(e){return e.replace(/!\[([^\]]*)\]\([^)]+\)/g,"$1").replace(/\[([^\]]+)\]\([^)]+\)/g,"$1").replace(/(\*\*|__)(.*?)\1/g,"$2").replace(/(\*|_)(.*?)\1/g,"$2").replace(/`([^`]+)`/g,"$1").trim()}function Ef(e){var n,r;const t=String(((n=e.metadata)==null?void 0:n.memoColor)||((r=e.metadata)==null?void 0:r.MemoColor)||"coral").toLowerCase();return ai.find(d=>d.key===t)??ai[0]}function _f(e){return Uc(e)}function Kc(e){return String(e.assetUrl||e.sourceFilePath||e.body||"").trim()}function Bf(e){const t=Kc(e);if(!t)return"";const n=t.toLowerCase();return n.startsWith("blob:")||n.startsWith("data:video/")||/^https?:\/\//i.test(t)&&/\.(mp4|webm|ogg|ogv|mov|m4v)(?:[?#].*)?$/i.test(t)?t:""}function Df(e){var t,n,r,d,c,m;return String(((t=e.metadata)==null?void 0:t.sourceUrl)||((n=e.metadata)==null?void 0:n.SourceUrl)||((r=e.metadata)==null?void 0:r.url)||((d=e.metadata)==null?void 0:d.Url)||((c=e.metadata)==null?void 0:c.embedUrl)||((m=e.metadata)==null?void 0:m.EmbedUrl)||e.assetUrl||e.sourceFilePath||e.body||"").trim()}function Of(e){var t,n;return String(((t=e.metadata)==null?void 0:t.embedType)||((n=e.metadata)==null?void 0:n.EmbedType)||"").trim().toLowerCase()}function $f(e,t){var r,d;const n=String(((r=e.metadata)==null?void 0:r.domain)||((d=e.metadata)==null?void 0:d.Domain)||"").trim();if(n)return n;try{return new URL(t).hostname.replace(/^www\./,"")}catch{return""}}function Ff(e){return Fc(e)}function kd(e){const t=e.indexOf(":");return t>0?e.slice(0,t):"relative"}function gs({value:e,options:t,onChange:n,ariaLabel:r,className:d="",menuClassName:c="",disabled:m=!1,emptyLabel:y="Select",testId:p}){const[b,w]=g.useState(!1),_=g.useRef(null),N=t.find(O=>O.value.toLowerCase()===e.toLowerCase()),D=(N==null?void 0:N.label)||e||y;return g.useEffect(()=>{if(!b)return;const O=U=>{var Y;const V=U.target instanceof Node?U.target:null;V&&((Y=_.current)!=null&&Y.contains(V))||w(!1)},z=U=>{U.key==="Escape"&&w(!1)};return document.addEventListener("pointerdown",O,!0),document.addEventListener("keydown",z,!0),()=>{document.removeEventListener("pointerdown",O,!0),document.removeEventListener("keydown",z,!0)}},[b]),o.jsxs("div",{ref:_,className:`catalog-pill ${d}`,"data-open":b?"true":"false",children:[o.jsxs("button",{type:"button",className:"catalog-pill__button","aria-haspopup":"listbox","aria-expanded":b,"aria-label":r,title:(N==null?void 0:N.title)||D,disabled:m,"data-testid":p,onClick:()=>{m||w(O=>!O)},children:[o.jsxs("span",{className:"catalog-pill__content",children:[(N==null?void 0:N.groupLabel)&&o.jsx("span",{className:"catalog-pill__provider",children:N.groupLabel}),(N==null?void 0:N.showAspectIcon)&&o.jsx(Sd,{option:N,compact:!0}),o.jsx("span",{className:"catalog-pill__label",children:D})]}),(N==null?void 0:N.trailingLabel)&&o.jsx("span",{className:"catalog-pill__trailing",children:N.trailingLabel}),o.jsx("span",{className:"catalog-pill__chevron",children:o.jsx(yc,{size:15})})]}),b&&!m&&o.jsx("div",{className:`catalog-pill__menu ${c}`,role:"listbox","aria-label":r,children:o.jsx("div",{className:"catalog-pill__scroll",children:t.map(O=>{var U;const z=O.value.toLowerCase()===e.toLowerCase();return o.jsxs("div",{children:[O.showGroupHeader&&o.jsxs("div",{className:`catalog-pill__group ${O.showSeparatorBefore?"catalog-pill__group--separated":""}`,children:[o.jsx("span",{children:O.groupLabel||O.groupKey||"Other"}),o.jsx("i",{})]}),o.jsxs("button",{type:"button",className:`catalog-pill__option ${z?"is-selected":""}`,role:"option","aria-selected":z,title:O.title||O.label,onClick:()=>{w(!1),O.value!==e&&n(O.value)},children:[o.jsxs("span",{className:"catalog-pill__option-main",children:[o.jsxs("span",{className:"catalog-pill__option-title",children:[O.showAspectIcon&&o.jsx(Sd,{option:O}),o.jsx("span",{children:O.label})]}),(O.detail||O.badges&&O.badges.length>0)&&o.jsxs("span",{className:"catalog-pill__option-detail",children:[O.detail&&o.jsx("span",{children:O.detail}),(U=O.badges)==null?void 0:U.map(V=>o.jsx("em",{children:V},V))]})]}),O.trailingLabel&&o.jsx("span",{className:"catalog-pill__option-trailing",children:O.trailingLabel})]})]},`${O.groupKey||"group"}:${O.value}`)})})})]})}function Sd({option:e,compact:t=!1}){const n=Math.max(1,e.aspectIconWidth??1),r=Math.max(1,e.aspectIconHeight??1),d=t?22:26,c=t?16:18,m=Math.min(d/n,c/r),y=Math.max(9,Math.round(n*m)),p=Math.max(9,Math.round(r*m));return o.jsx("span",{className:"catalog-pill__aspect","aria-hidden":"true",children:o.jsx("span",{style:{width:y,height:p}})})}function Uf(e){var t;return((t=e.metadata)==null?void 0:t.CompanyStatus)||e.status||(e.companyMode?"Staged":"Ready")}function zf(e){switch(e.toLowerCase()){case"done":case"approved":case"completed":return 1;case"running":return .62;case"paused":return .38;case"archived":case"rejected":return .18;default:return .28}}function ni(e){var t;return(e.result||e.body||((t=e.metadata)==null?void 0:t.CompanyLastMessage)||"").trim()||"No local artifact content yet."}function hs(e,t){const n=t.edges.filter(c=>c.to===e.id).map(c=>{var m;return(m=t.nodes.find(y=>y.id===c.from))==null?void 0:m.title}).filter(Boolean),r=t.edges.filter(c=>c.from===e.id).map(c=>{var m;return(m=t.nodes.find(y=>y.id===c.to))==null?void 0:m.title}).filter(Boolean),d=Uf(e);return{id:e.id,title:e.title,type:e.kind,subtitle:ni(e).slice(0,160),status:d,progress:zf(d),incoming:n,outgoing:r}}function Hf(e,t){const n=new Set(t.edges.filter(b=>b.from===e.id||b.to===e.id).flatMap(b=>[b.from,b.to]).filter(b=>b!==e.id)),r=t.nodes.filter(b=>n.has(b.id)),d=t.nodes.filter(b=>{var w;return b.id!==e.id&&(b.companyMode||((w=b.tags)==null?void 0:w.some(_=>_.toLowerCase().includes("company"))))}),c=[...r,...d].filter((b,w,_)=>_.findIndex(N=>N.id===b.id)===w),m=c.filter(b=>b.kind!=="ai-task"&&!b.result).slice(0,6),y=c.filter(b=>b.kind==="ai-task").slice(0,6),p=c.filter(b=>b.result||b.kind!=="ai-task").slice(0,6);return[{key:"root",label:"Root",nodes:[hs(e,t)]},{key:"context",label:"Context",nodes:m.map(b=>hs(b,t))},{key:"tasks",label:"Missions",nodes:y.map(b=>hs(b,t))},{key:"artifacts",label:"Artifacts",nodes:p.map(b=>hs(b,t))}].map(b=>({...b,nodes:b.nodes.length>0?b.nodes:[Wf(b.key)]}))}function Wf(e){return{id:`empty-${e}`,title:"No local nodes yet",type:"empty",subtitle:"Stage a follow-up task or connect context nodes to fill this lane.",status:"Empty",progress:0,incoming:[],outgoing:[]}}function Vf(e,t){const n=new Set(t.edges.filter(d=>d.from===e.id||d.to===e.id).flatMap(d=>[d.from,d.to]));return t.nodes.filter(d=>{var c;return d.id===e.id||n.has(d.id)||((c=d.tags)==null?void 0:c.includes("Company follow-up"))}).filter(d=>ni(d).trim().length>0).slice(0,8).map(d=>({id:`artifact-${d.id}`,type:d.kind==="ai-task"?"Mission Result":d.id===e.id?"Root Brief":"Context Artifact",title:d.title,content:ni(d),sourceNodeId:d.id}))}function Yf({board:e,rootNode:t,onClose:n,onStatus:r,onRemove:d,onSubmitFollowUp:c,onApproval:m,onAddArtifact:y}){var ye,We,vt,nt,G;const[p,b]=g.useState(""),[w,_]=g.useState(null),N=g.useMemo(()=>Hf(t,e),[e,t]),D=g.useMemo(()=>Vf(t,e),[e,t]),O=D.find(X=>X.id===w)??D[0]??null,z=((ye=t.metadata)==null?void 0:ye.CompanyStatus)||"Staged",U=((We=t.metadata)==null?void 0:We.CompanyExecutionModeLabel)||"Auto / General",V=((vt=t.metadata)==null?void 0:vt.CompanySubAgents)==="false"?"single-agent":"sub-agents",Y=((nt=t.metadata)==null?void 0:nt.CompanyApprovalStatus)||"Pending",ce=!["Approved","Rejected"].includes(Y),le=e.nodes.filter(X=>{var ue;return X.kind==="ai-task"&&(((ue=X.tags)==null?void 0:ue.includes("Company follow-up"))||N.some(oe=>oe.nodes.some(mt=>mt.id===X.id)))}).length,Pe=()=>{const X=p.trim();X&&(b(""),c(t.id,X))};return o.jsx("div",{className:"company-focus-backdrop","data-testid":"company-graph-focus",onMouseDown:n,children:o.jsxs("section",{className:"company-focus-dialog","aria-label":"Company graph focus","data-disable-mindcanvas-hotkeys":"true",onMouseDown:X=>X.stopPropagation(),children:[o.jsxs("header",{className:"company-focus-head",children:[o.jsx("button",{type:"button",title:"Back to Canvas",onClick:n,children:o.jsx(Jp,{size:16})}),o.jsxs("div",{children:[o.jsx("span",{children:"Company Graph Focus"}),o.jsx("strong",{children:t.title}),o.jsx("small",{children:t.body||((G=t.metadata)==null?void 0:G.CompanyLastMessage)||"Local company root staged from MindCanvas."})]}),o.jsxs("div",{className:"company-focus-head__actions",children:[o.jsx("span",{children:z}),o.jsx("span",{children:U}),o.jsxs("span",{children:[o.jsx(gc,{size:12}),V]}),z==="Paused"?o.jsxs("button",{type:"button",onClick:()=>r(t.id,"Staged"),children:[o.jsx(ya,{size:13}),"Resume"]}):o.jsxs("button",{type:"button",onClick:()=>r(t.id,"Paused"),children:[o.jsx(jo,{size:13}),"Pause"]}),o.jsxs("button",{type:"button",onClick:()=>r(t.id,"Archived"),children:[o.jsx(Gr,{size:13}),"Archive"]}),o.jsxs("button",{type:"button",className:"is-danger",onClick:()=>d(t.id),children:[o.jsx(Ps,{size:13}),"Remove"]})]})]}),o.jsxs("div",{className:"company-focus-main",children:[o.jsxs("main",{children:[o.jsxs("div",{className:"company-focus-metrics",children:[o.jsx(fs,{label:"Missions",value:le||1,tone:"blue"}),o.jsx(fs,{label:"Population",value:V==="sub-agents"?4:1,tone:"slate"}),o.jsx(fs,{label:"Approvals",value:ce?1:0,tone:"amber"}),o.jsx(fs,{label:"Artifacts",value:D.length,tone:"teal"})]}),o.jsxs("section",{className:"company-focus-graph",children:[o.jsxs("div",{className:"company-focus-section-head",children:[o.jsxs("div",{children:[o.jsx(Zp,{size:15}),o.jsx("strong",{children:"Virtual Flow Graph"})]}),o.jsxs("span",{children:[e.edges.length," board edges"]})]}),o.jsx("div",{className:"company-focus-lanes",children:N.map(X=>o.jsxs("section",{className:"company-focus-lane",children:[o.jsxs("header",{children:[o.jsx("strong",{children:X.label}),o.jsxs("span",{children:[X.nodes.filter(ue=>ue.type!=="empty").length," nodes"]})]}),o.jsx("div",{className:"company-focus-node-list",children:X.nodes.map(ue=>o.jsxs("article",{className:`company-focus-node ${ue.type==="empty"?"is-empty":""}`,children:[o.jsxs("div",{children:[o.jsx("span",{children:ue.type}),o.jsx("b",{children:ue.status})]}),o.jsx("strong",{children:ue.title}),o.jsx("p",{children:ue.subtitle}),o.jsx("div",{className:"company-focus-progress",children:o.jsx("i",{style:{width:`${Math.round(ue.progress*100)}%`}})}),ue.incoming.length>0&&o.jsxs("small",{children:["From: ",ue.incoming.slice(0,2).join(", ")]}),ue.outgoing.length>0&&o.jsxs("small",{children:["Next: ",ue.outgoing.slice(0,2).join(", ")]})]},ue.id))})]},X.key))})]})]}),o.jsxs("aside",{className:"company-focus-side",children:[o.jsxs("section",{children:[o.jsx("div",{className:"company-focus-section-head",children:o.jsxs("div",{children:[o.jsx(bc,{size:15}),o.jsx("strong",{children:"Next Task"})]})}),o.jsx("p",{children:"Stage a follow-up AI Task from this company root. It stays local until an adapter runs it."}),o.jsx("textarea",{value:p,onChange:X=>b(X.target.value),placeholder:"Generate the next practical revenue validation task."}),o.jsxs("button",{type:"button",className:"company-focus-primary",disabled:!p.trim(),onClick:Pe,children:[o.jsx(Qp,{size:13}),"Stage Task"]})]}),o.jsxs("section",{children:[o.jsxs("div",{className:"company-focus-section-head",children:[o.jsxs("div",{children:[o.jsx(Zl,{size:15}),o.jsx("strong",{children:"Approvals"})]}),o.jsx("span",{children:Y})]}),o.jsxs("article",{className:`company-focus-approval company-focus-approval--${Y.toLowerCase()}`,children:[o.jsx("span",{children:U}),o.jsx("strong",{children:"Run staged company work locally"}),o.jsx("p",{children:"External execution, publishing, money movement, and destructive tool calls remain blocked until an adapter confirms them."}),ce&&o.jsxs("div",{children:[o.jsxs("button",{type:"button",onClick:()=>m(t.id,"Approved"),children:[o.jsx(Zl,{size:13}),"Approve locally"]}),o.jsxs("button",{type:"button",onClick:()=>m(t.id,"Rejected"),children:[o.jsx(eg,{size:13}),"Reject"]})]})]})]}),o.jsxs("section",{children:[o.jsxs("div",{className:"company-focus-section-head",children:[o.jsxs("div",{children:[o.jsx(St,{size:15}),o.jsx("strong",{children:"Artifacts"})]}),o.jsx("span",{children:D.length})]}),o.jsx("div",{className:"company-focus-artifacts",children:D.map(X=>o.jsxs("button",{type:"button",className:(O==null?void 0:O.id)===X.id?"is-selected":"",onClick:()=>_(X.id),children:[o.jsx("span",{children:X.type}),o.jsx("strong",{children:X.title})]},X.id))}),O&&o.jsxs("div",{className:"company-focus-preview",children:[o.jsx("span",{children:O.type}),o.jsx("strong",{children:O.title}),o.jsx("pre",{children:O.content}),o.jsxs("button",{type:"button",onClick:()=>y(t.id,O),children:[o.jsx(Co,{size:13}),"Add to Canvas"]})]})]})]})]})]})})}function fs({label:e,value:t,tone:n}){return o.jsxs("article",{className:`company-focus-metric company-focus-metric--${n}`,children:[o.jsx("span",{children:e}),o.jsx("strong",{children:t})]})}function Gf({url:e,fileName:t,onClose:n}){return o.jsx("div",{className:"pdf-viewer-backdrop","data-testid":"pdf-viewer-dialog",onMouseDown:n,children:o.jsxs("section",{className:"pdf-viewer-dialog","aria-label":"PDF viewer",onMouseDown:r=>r.stopPropagation(),children:[o.jsxs("header",{className:"pdf-viewer-head",children:[o.jsxs("div",{children:[o.jsx("span",{children:"PDF Viewer"}),o.jsx("strong",{title:t,children:t})]}),o.jsxs("div",{className:"pdf-viewer-actions",children:[o.jsx("button",{type:"button",title:"Open PDF in new tab","data-testid":"pdf-viewer-open-external",onClick:()=>window.open(e,"_blank","noopener,noreferrer"),children:o.jsx(vn,{size:16})}),o.jsx("button",{type:"button",title:"Close PDF viewer","data-testid":"pdf-viewer-close",onClick:n,children:o.jsx(Ot,{size:16})})]})]}),o.jsx("iframe",{src:e,title:t,className:"pdf-viewer-frame","data-testid":"pdf-viewer-frame"})]})})}const vs=.28,js=2.8,Kf=96,Xf=140,Is=188,Ns=126,xn=10,qf=720,Jf=.8,Fa={x:540,y:210,scale:1},wd=8,Xc=["dot","line","particles","spirit"],ba="n",Rr=["0","1","2","3","4","5","6","7","8","9"],oa=24,vd=900,Zf=3e3,jd="mindexec-react-project-gallery-startup-v1",qc="mindexec-react-function-toolbar-mode-v1",Jc="mindexec-react-project-workspace-history-v1",Zc=5,As="__MINDEXEC_REACT_NODES__",bs=34,Id=30,hn=1280,fn=960,Qf=154,oi=4e4,eb=50,Bs=100,Qc=50*1024,Lr=Qc,Pr=12e4,Nd=64*1024,tb=5e3,Ni=2500,Nn=36,si="Select a LocalBridge directory",eu="mindexec.react.templateStudioDraft.v1.",Ai="BusinessAutomationNode",ab="MindCanvasAgent",nb="CodeNote";function ob(){return pc(Ss())}const sb=["Body:","Describe the implementation slice this note controls.","","Why:","Explain why this change should exist before writing code.","","Related files:","- src/features/canvas/MindCanvas.tsx","","Acceptance criteria:","- The intended change is visible on the canvas.","- The note can be approved, reviewed, or marked out of sync locally."].join(`
|
|
10
|
+
`),Mi={"image-generate":{kind:"image-generate",mode:"Image",title:"Image Generation Spec",body:["Prepare an image generation prompt/spec.","","Subject:","Visual style:","Composition:","Constraints:","Business use case:"].join(`
|
|
11
|
+
`),tag:"Image Spec",toolHint:"Media.ImagePrompt",outputType:"image-prompt",width:380,height:228},"video-generate":{kind:"video-generate",mode:"Video",title:"Video Generation Spec",body:["Prepare a video generation prompt/spec.","","Subject:","Motion:","Scene/composition:","Duration/format:","Business use case:"].join(`
|
|
12
|
+
`),tag:"Video Spec",toolHint:"Media.VideoPrompt",outputType:"video-prompt",width:420,height:236}},rb=["Objective:","","Constraints:","","Expected output:"].join(`
|
|
13
|
+
`),ib=new Set(["note","text","ai-task","image","mask","video","embed","code","csv-table","memo","pdf","file","directory","template-launcher","remote-monitor","remote-control","markdown"]);function Ad(e,t){try{const n=window.localStorage.getItem(`${eu}${e}`);if(!n)return ks(t);const r=JSON.parse(n);return{...ks(t),...r,templateId:yo(r.templateId||r.templateTitle||t)}}catch{return ks(t)}}function Md(e,t){window.localStorage.setItem(`${eu}${e}`,JSON.stringify(t))}function Td(e){return{id:`studio-${e.templateId||"template-studio-draft"}`,label:e.templateTitle||"Template Studio Test",description:"Template Studio test create",iconClass:"template-studio-test",prompt:"Use test inputs to create a real local board from the compiled template.",options:[]}}function Ds(e){return String(e||"").split(",").map(t=>t.trim().toLowerCase()).filter(Boolean)}function tu(e,t,n){const r=e.toLowerCase(),d=t.toLowerCase();return n.some(c=>r.includes(c)||d.includes(c))}function au(e,t){if(t.length===0)return!0;const n=e.toLowerCase(),r=n.includes(".")?`.${n.split(".").pop()??""}`:"";return t.some(d=>d.startsWith(".")?d===r:n.includes(d))}async function lb(e,t){const n=Ds(t==null?void 0:t.Include),r=Ds(t==null?void 0:t.Exclude),d=[];let c=0,m=0,y=0,p=!1;async function b(w,_=""){for await(const N of w.values()){if(y>=Ni){p=!0;return}const D=_?`${_}/${N.name}`:N.name;if(!tu(D,N.name,r)){if(N.kind==="file"){if(!au(N.name,n))continue;c+=1,y+=1,d.length<Nn&&d.push({name:N.name,path:D,kind:"file"});continue}if(N.kind==="directory"&&(m+=1,y+=1,d.length<Nn&&d.push({name:N.name,path:D,kind:"directory"}),await b(N,D),p))return}}}return await b(e),{fileCount:c,directoryCount:m,preview:d,truncated:p}}function An(e){return typeof e=="string"?e.trim():""}function db(e){return!e||e===si?!1:!/^(https?:|data:|blob:|file:)/i.test(e)}function cb(e){var d;const t=An((d=e.metadata)==null?void 0:d.DirectoryPath),n=An(e.sourceFilePath),r=t||n;return db(r)?r:""}function ub(e,t){const n=An(t.path);if(n)return n;const r=An(t.name);if(!e)return r;const d=e.includes("\\")?"\\":"/";return`${e.replace(/[\\/]+$/,"")}${d}${r}`}async function mb(e,t,n,r){const d=Ds(t==null?void 0:t.Include),c=Ds(t==null?void 0:t.Exclude),m=[],y=[{bridgePath:e,relativePath:""}];let p=0,b=0,w=0,_=!1;for(;y.length>0;){const N=y.shift();if(!N)break;const D=await Lp(N.bridgePath,n,r),O=Array.isArray(D.items)?D.items:[];for(const z of O){if(w>=Ni){_=!0;break}const U=An(z.name);if(!U)continue;const V=N.relativePath?`${N.relativePath}/${U}`:U;if(tu(V,U,c))continue;const Y=z.isDirectory===!0,ce=z.isFile===!0||z.isDirectory!==!0;if(Y){b+=1,w+=1,m.length<Nn&&m.push({name:U,path:V,kind:"directory"}),y.push({bridgePath:ub(N.bridgePath,z),relativePath:V});continue}if(ce){if(!au(U,d))continue;p+=1,w+=1,m.length<Nn&&m.push({name:U,path:V,kind:"file"})}}if(_)break}return{fileCount:p,directoryCount:b,preview:m,truncated:_}}function Rd(e,t){const n=t.preview.map(r=>`${r.kind==="directory"?"dir":"file"}:${r.path}`).join(`
|
|
14
|
+
`);return[`Directory: ${e}`,`Files: ${t.fileCount}`,`Folders: ${t.directoryCount}`,t.truncated?`Preview capped at ${Ni} entries.`:"Scan completed.","",n||"(empty or filtered)"].join(`
|
|
15
|
+
`)}const pb=new Set(["astro","bash","bat","c","cc","cpp","cs","css","fs","go","h","hpp","html","java","js","json","jsx","kt","lua","mjs","php","ps1","py","razor","rs","scss","sh","sql","svelte","swift","ts","tsx","vue","xml","yaml","yml"]),gb=new Set(["csv","log","md","markdown","rtf","text","txt"]);function Ld(e){const t=e;return Number.isFinite(t==null?void 0:t.x)&&Number.isFinite(t==null?void 0:t.y)}function ri(e){return e==="top"||e==="right"||e==="bottom"||e==="left"}function hb(e){switch(e){case"top":return"bottom";case"right":return"left";case"bottom":return"top";case"left":return"right";default:return"left"}}function Pd(e){switch(e){case"top":return{x:0,y:-1};case"right":return{x:1,y:0};case"bottom":return{x:0,y:1};case"left":return{x:-1,y:0};default:return{x:1,y:0}}}function $t(e,t){switch(t){case"top":return{x:e.x+e.width/2,y:e.y};case"right":return{x:e.x+e.width,y:e.y+e.height/2};case"bottom":return{x:e.x+e.width/2,y:e.y+e.height};case"left":return{x:e.x,y:e.y+e.height/2};default:return{x:e.x+e.width,y:e.y+e.height/2}}}function fb(e,t){const n=[{side:"top",point:$t(e,"top")},{side:"right",point:$t(e,"right")},{side:"bottom",point:$t(e,"bottom")},{side:"left",point:$t(e,"left")}];let r=n[0],d=Number.POSITIVE_INFINITY;for(const c of n){const m=c.point.x-t.x,y=c.point.y-t.y,p=m*m+y*y;p<d&&(r=c,d=p)}return r.side}function bb(e,t){return e.x>=t.x&&e.x<=t.x+t.width&&e.y>=t.y&&e.y<=t.y+t.height}function Ed(e,t,n,r){const d=Math.hypot(n.x-e.x,n.y-e.y),c=ge(d*.38,54,220),m=Pd(t),y=Pd(r);return[`M ${e.x} ${e.y}`,`C ${e.x+m.x*c} ${e.y+m.y*c},`,`${n.x+y.x*c} ${n.y+y.y*c},`,`${n.x} ${n.y}`].join(" ")}function Er(e){var r,d;const t=Number((r=e.viewState)==null?void 0:r.cursorX),n=Number((d=e.viewState)==null?void 0:d.cursorY);return Number.isFinite(t)&&Number.isFinite(n)?{x:t,y:n}:null}function Ua(e,t){return{...e,viewState:{...e.viewState??{},cursorX:t.x,cursorY:t.y}}}function yb(e,t){return t?{x:Math.round(e.x/oa)*oa,y:Math.round(e.y/oa)*oa}:e}function Q(e){return`${e}-${Math.random().toString(36).slice(2,9)}`}function xb(e){switch(e){case"GeneralCompany":return"General AI Company";case"GrowthValidation":return"Growth Validation";case"RevenueAffiliate":return"Revenue / Affiliate";case"ProductBuild":return"Product Build";case"ResearchOnly":return"Research Only";default:return"Auto Detect"}}function ge(e,t,n){return Math.min(n,Math.max(t,e))}const Cb=112,kb=80;function _d(e,t){const n=t/2,r=Cb+e/2,d=Math.max(r,t-kb);return ge(Math.max(n,r),0,d)}function _r(e){return{x:e.x+e.width/2,y:e.y+e.height/2}}function ii(e){if(!e)return"No date";const t=new Date(e);return Number.isNaN(t.getTime())?"No date":t.toLocaleDateString(void 0,{month:"short",day:"2-digit",year:"numeric"})}function fo(e){return!!(e&&!["image","video","pdf","file","directory","remote-monitor","remote-control"].includes(e.kind))}function za(e){var t,n;return!!(e&&(e.kind==="remote-monitor"||((t=e.metadata)==null?void 0:t.SemanticType)==="RemoteFleetMonitor"||((n=e.metadata)==null?void 0:n.RemoteFleetNodeRole)==="fleet-monitor"))}function Sb(e){return e.isExpanded===!1&&Number(e.originalHeight??0)>e.height+1}function wb(e){return ji(e)}function vb(e){return Uc(e)}function ko(e){var n;const t=(((n=e.imageStack)==null?void 0:n.variants)??[]).filter(r=>!!r.imageUrl).map((r,d)=>({...r,variantId:r.variantId||`${e.id}:variant-${d+1}`,title:r.title||e.title,sourceNodeId:r.sourceNodeId||e.id}));return t.length>0?t:e.imageUrl?[{variantId:`${e.id}:image`,imageUrl:e.imageUrl,assetId:e.assetUrl,title:e.title,sourceNodeId:e.id}]:[]}function Bd(e,t,n,r){let d=e.variantId||Q("image-variant");for(;n.has(d);)d=Q("image-variant");return n.add(d),{...e,variantId:d,imageUrl:e.imageUrl,assetId:e.assetId||t.assetUrl,title:e.title||t.title,sourceNodeId:e.sourceNodeId||t.id,createdAtUtc:e.createdAtUtc||r}}function jb(e){return[e.title,"",e.result?`Result:
|
|
16
|
+
${e.result}`:e.body,e.imageUrl?`
|
|
17
|
+
Image: ${e.imageUrl}`:"",e.assetUrl?`
|
|
18
|
+
Asset: ${e.assetUrl}`:"",e.sourceFilePath?`
|
|
19
|
+
Source: ${e.sourceFilePath}`:""].filter(Boolean).join(`
|
|
20
|
+
`)}function Ib(e){if(e.kind!=="image")return"";const t=ko(e).find(n=>{var r;return n.variantId===((r=e.imageStack)==null?void 0:r.activeVariantId)});return String((t==null?void 0:t.imageUrl)||ji(e)).trim()}async function Nb(e){const t=navigator.clipboard;if(t&&typeof ClipboardItem<"u"&&typeof t.write=="function")try{const r=await(await fetch(e)).blob();if(r.type.startsWith("image/"))return await t.write([new ClipboardItem({[r.type]:r})]),"image"}catch{}return await xo(e),"text"}function Br(e){var r;const n=(e.result||e.body||"").split(/\r?\n/).reduce((d,c)=>d+Math.max(1,Math.ceil(c.length/54)),0);return ge(112+n*21+((r=e.tags)!=null&&r.length?28:0),150,620)}function Ab(e){switch(e.kind){case"remote-monitor":return{minWidth:520,minHeight:360,maxWidth:1400,maxHeight:980};case"remote-control":return{minWidth:420,minHeight:300,maxWidth:1400,maxHeight:980};case"video":return{minWidth:300,minHeight:190,maxWidth:hn,maxHeight:fn};case"image":return{minWidth:220,minHeight:160,maxWidth:hn,maxHeight:fn};case"pdf":case"file":case"directory":return{minWidth:240,minHeight:128,maxWidth:860,maxHeight:720};case"code":return{minWidth:260,minHeight:160,maxWidth:hn,maxHeight:fn};case"csv-table":return{minWidth:320,minHeight:180,maxWidth:hn,maxHeight:fn};case"ai-task":return{minWidth:260,minHeight:154,maxWidth:hn,maxHeight:fn};default:return{minWidth:220,minHeight:132,maxWidth:hn,maxHeight:fn}}}function at(e){return String(e||"").trim()||"Untitled"}const nu="Multi Desktop Monitor";function Dd(e){return at(e).toLowerCase()===nu.toLowerCase()}function Mb(e,t,n){const r=at(e.name);return!n||!Dd(r)?r:t.nodes.some(c=>za(c)&&Dd(c.title||nu))?"MindCanvas":r}function xa(e){return typeof e=="object"&&e!==null}function li(e){const t=e.toLowerCase(),n=t.lastIndexOf(".");return n>=0?t.slice(n+1):""}function Tb(e){if(!xa(e))return;const t=Object.entries(e).filter(([n])=>n.trim().length>0).map(([n,r])=>[n,String(r??"")]);return t.length>0?Object.fromEntries(t):void 0}function Rb(e){if(!Array.isArray(e))return;const t=e.map(n=>String(n??"").trim()).filter(Boolean).slice(0,24);return t.length>0?t:void 0}function ys(e,t=0,n=Number.MAX_SAFE_INTEGER){const r=Number(e);if(Number.isFinite(r))return ge(r,t,n)}function Dr(e){return e&&Xc.includes(e)?e:"dot"}function Od(e){return Math.round(e/oa)*oa}function Lb(e){if(!xa(e))return null;const t=typeof e.variantId=="string"?e.variantId.trim():"",n=typeof e.imageUrl=="string"?e.imageUrl.trim():"";return!t||!n?null:{variantId:t,imageUrl:n,assetId:typeof e.assetId=="string"?e.assetId:void 0,title:typeof e.title=="string"?e.title:void 0,caption:typeof e.caption=="string"?e.caption:void 0,sourceNodeId:typeof e.sourceNodeId=="string"?e.sourceNodeId:void 0,createdAtUtc:typeof e.createdAtUtc=="string"?e.createdAtUtc:void 0}}function Pb(e){if(!xa(e)||!Array.isArray(e.variants))return;const t=e.variants.map(d=>Lb(d)).filter(d=>!!d).slice(0,128);if(t.length===0)return;const n=typeof e.activeVariantId=="string"?e.activeVariantId:"";return{activeVariantId:t.some(d=>d.variantId===n)?n:t[0].variantId,variants:t,kind:typeof e.kind=="string"&&e.kind.trim()?e.kind:"versions",title:typeof e.title=="string"?e.title:void 0,updatedAtUtc:typeof e.updatedAtUtc=="string"?e.updatedAtUtc:void 0}}function di(e,t,n){if(!(!e||e.variants.length===0))return{...e,variants:e.variants.map(r=>({...r,sourceNodeId:t&&n&&r.sourceNodeId===t?n:r.sourceNodeId}))}}function Eb(e){if(!xa(e))return null;const t=e.kind,n=Number(e.x),r=Number(e.y),d=Number(e.width),c=Number(e.height);if(typeof e.id!="string"||typeof t!="string"||!ib.has(t)||typeof e.title!="string"||typeof e.body!="string"||!Number.isFinite(n)||!Number.isFinite(r)||!Number.isFinite(d)||!Number.isFinite(c))return null;const m=Pb(e.imageStack),y=(m==null?void 0:m.variants.find(p=>p.variantId===m.activeVariantId))??(m==null?void 0:m.variants[0]);return{id:e.id,kind:t,title:e.title,body:e.body,x:n,y:r,width:ge(d,120,1280),height:ge(c,96,920),status:["idle","running","paused","done","blocked"].includes(String(e.status))?e.status:void 0,result:typeof e.result=="string"?e.result:void 0,imageUrl:typeof e.imageUrl=="string"?e.imageUrl:y==null?void 0:y.imageUrl,imageStack:m,assetUrl:typeof e.assetUrl=="string"?e.assetUrl:void 0,sourceFilePath:typeof e.sourceFilePath=="string"?e.sourceFilePath:void 0,isChunkedText:typeof e.isChunkedText=="boolean"?e.isChunkedText:void 0,totalLineCount:ys(e.totalLineCount),scrollOffset:ys(e.scrollOffset),maxScroll:ys(e.maxScroll),isExpanded:typeof e.isExpanded=="boolean"?e.isExpanded:void 0,originalHeight:ys(e.originalHeight),tags:Rb(e.tags),role:typeof e.role=="string"?e.role:void 0,metadata:Tb(e.metadata),aiEnabled:typeof e.aiEnabled=="boolean"?e.aiEnabled:void 0,wordWrap:typeof e.wordWrap=="boolean"?e.wordWrap:void 0,companyMode:e.companyMode==="candidate"||e.companyMode==="bound"?e.companyMode:void 0}}function _b(e){return!xa(e)||typeof e.id!="string"||typeof e.from!="string"||typeof e.to!="string"||e.kind!=="context"&&e.kind!=="result"?null:{id:e.id,from:e.from,to:e.to,kind:e.kind,fromSide:ri(e.fromSide)?e.fromSide:void 0,toSide:ri(e.toSide)?e.toSide:void 0}}function $d(e){if(!e.includes(As))return null;try{const t=JSON.parse(e);if(!xa(t)||t.__type!==As||!Array.isArray(t.nodes))return null;const n=t.nodes.map(d=>Eb(d)).filter(d=>!!d);if(n.length===0)return null;const r=Array.isArray(t.edges)?t.edges.map(d=>_b(d)).filter(d=>!!d):[];return{__type:As,source:"MindExecReact",copiedAt:typeof t.copiedAt=="string"?t.copiedAt:new Date().toISOString(),nodes:n,edges:r}}catch{return null}}function Bb(e,t){return{__type:As,source:"MindExecReact",copiedAt:new Date().toISOString(),nodes:e.map(n=>({...n,metadata:n.metadata?{...n.metadata}:void 0,tags:n.tags?[...n.tags]:void 0,imageStack:di(n.imageStack)})),edges:t.map(n=>({...n}))}}const Db=/^\s*\[[^\]]+\]\((https?:\/\/[^)\s]+)\)\s*$/i,Ob=/<iframe[^>]+src\s*=\s*(?:"|\x27)(?<url>https?:\/\/[^"\x27]+)(?:"|\x27)/i,$b=/https?:\/\/[^\s<>()"\x27]+/i,Fb=/^[A-Za-z0-9_-]{6,}$/,Ub=new Set(["avi","m4v","mov","mp4","mpeg","ogv","webm"]);function Or(e){return e.trim().replace(/[.,;:!?\])}]+$/g,"")}function zb(e){var c;const t=e.trim();if(!t)return"";const n=Ob.exec(t);if((c=n==null?void 0:n.groups)!=null&&c.url)return Or(n.groups.url);const r=Db.exec(t);if(r!=null&&r[1])return Or(r[1]);const d=t.split(/\r?\n/).map(m=>m.trim()).filter(Boolean);if(d.length===1){const m=$b.exec(d[0]);if(m&&m[0]===d[0])return Or(m[0])}return""}function Ti(e){const t=e.trim(),n=zb(t);if(n)return n;if(!t||/\s/.test(t))return"";try{const r=new URL(t);return r.protocol==="data:"||r.protocol==="blob:"?t:""}catch{return""}}function Hb(e){try{const t=new URL(e);return li(t.pathname)}catch{return li(e)}}function Wb(e){const t=e.hostname.toLowerCase();if(!t||t==="localhost"||t.endsWith(".localhost"))return!0;const n=/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/.exec(t);if(n){const d=n.slice(1).map(Number);if(d.some(y=>!Number.isInteger(y)||y<0||y>255))return!0;const[c,m]=d;return c===0||c===10||c===127||c===169&&m===254||c===172&&m>=16&&m<=31||c===192&&m===168}const r=t.replace(/^\[|\]$/g,"").toLowerCase();return r==="::1"||r==="0:0:0:0:0:0:0:1"||r.startsWith("fc")||r.startsWith("fd")?!0:/^fe[89ab]/i.test(r.replace(/:/g,""))}function Mn(e){const t=Ti(e);if(!t)return null;try{const n=new URL(t);return n.protocol!=="http:"&&n.protocol!=="https:"||Wb(n)?null:n}catch{return null}}function $r(e){return Fb.test(e)}function Vb(e){const t=Mn(e);if(!t)return"";const n=t.hostname.toLowerCase().replace(/^www\./,"");if(n==="youtu.be"){const y=t.pathname.split("/").filter(Boolean)[0]??"";return $r(y)?y:""}if(!n.endsWith("youtube.com")&&!n.endsWith("youtube-nocookie.com"))return"";const r=t.searchParams.get("v")??"";if($r(r))return r;const d=t.pathname.split("/").filter(Boolean),c=d.findIndex(y=>["embed","shorts","live","v"].includes(y)),m=c>=0?d[c+1]??"":"";return $r(m)?m:""}function Yb(e){const t=e.toLowerCase(),n=Hb(e);return t.startsWith("data:image/")||["avif","gif","jpeg","jpg","png","svg","webp"].includes(n)?"image":Ub.has(n)?"video":n==="pdf"?"pdf":Mn(e)?"embed":"file"}function Gb(e){try{const t=new URL(e),n=t.pathname.split("/").filter(Boolean).pop();return decodeURIComponent(n||t.hostname||e).slice(0,90)}catch{return e.slice(0,90)}}function Kb(e,t,n="clipboard-url"){const r=Yb(e),d=Gb(e),c=r==="embed"?Mn(e):null,m=r==="embed"?Vb(e):"",y=m?"youtube":"webpage",p=(c==null?void 0:c.hostname.replace(/^www\./,""))??"",b=m?`https://www.youtube.com/watch?v=${m}`:e,w=m?`https://www.youtube-nocookie.com/embed/${m}`:"",_=r==="image"?`Image: ${d}`:r==="video"?`Video: ${d}`:r==="embed"?m?"YouTube Video":`Embed: ${p||d}`:r==="pdf"?`PDF: ${d}`:`URL: ${d}`;return{id:Q("node"),kind:r,title:_,body:b,x:t.x,y:t.y,width:r==="embed"?460:r==="video"?420:r==="image"?360:300,height:r==="embed"?260:r==="video"?236:r==="image"?240:154,imageUrl:r==="image"?e:void 0,assetUrl:r==="image"?void 0:b,tags:r==="embed"?["Embed",m?"YouTube":"Web"]:r==="file"?["URL","File"]:[r.toUpperCase()],metadata:{Source:n,AdapterState:"local-reference",Durable:"false",...r==="embed"?{source:"embed",embedType:y,provider:m?"youtube":"web",renderMode:m?"card":"snapshot",aspectRatio:m?"16:9":"auto",sourceUrl:b,url:b,originalInputUrl:e,embedUrl:w,videoId:m,thumbnailUrl:m?`https://img.youtube.com/vi/${m}/hqdefault.jpg`:"",title:_,domain:p,faviconUrl:!m&&c?`https://www.google.com/s2/favicons?sz=64&domain_url=${encodeURIComponent(b)}`:"",description:m?"":"Capture a visual snapshot or open this page in a new tab.",iframeAllowed:"false",iframeBlockedReason:m?"react-card-shell":"unknown",captureStatus:"idle",captureProvider:m?"":"cloudflare-browser-run"}:{}}}}function Fd(e,t,n="clipboard-url"){const r=Ti(e);return!r||/^https?:\/\//i.test(r)&&!Mn(r)?null:Kb(r,t,n)}function Ud(e,t,n){const r=e.split(/\r?\n/).map(d=>d.trim()).find(Boolean)??"Pasted text";return{id:Q("node"),kind:"note",title:r.slice(0,90),body:e.slice(0,4e4),x:t.x,y:t.y,width:340,height:ge(156+Math.ceil(Math.min(e.length,2200)/72)*20,176,540),tags:[n.startsWith("global-input")?"Input":"Pasted"],metadata:{Source:n,TextTruncated:String(e.length>4e4)}}}function Xb(e,t,n){const r=e.split(/\r?\n/).map(y=>y.trim()).find(Boolean)??"AI question",d=na(n.model),c=cc(d),m=c?Pp(c.provider):n.aiProvider||"OpenAI Codex";return{id:Q("node"),kind:"ai-task",title:r.slice(0,90),body:e.slice(0,4e4),x:t.x,y:t.y,width:360,height:ge(176+Math.ceil(Math.min(e.length,2200)/84)*18,196,520),status:"idle",tags:["AI Task","Input",m],metadata:{Source:"global-input-ai",AdapterState:"localbridge-codex",AiProvider:n.aiProvider||"OpenAI Codex",TextModel:d,TextModelProvider:m,Effort:n.effort,TextTruncated:String(e.length>4e4)}}}function qb(e,t,n,r,d="global-input-media",c){const m=r==="Image"?"image":"video",y=e.split(/\r?\n/).map(b=>b.trim()).find(Boolean)??`${r} prompt`,p={...Pi(n,r,c)??{},Source:d,PromptOnly:"true"};return{id:Q("node"),kind:m,title:`${r}: ${y.slice(0,72)}`,body:e.slice(0,4e4),x:t.x,y:t.y,width:m==="image"?360:420,height:m==="image"?240:236,tags:[r,p.MediaProvider||"Adapter gated"],metadata:p}}function zd(e){if(!e.trim())return"";if(typeof DOMParser>"u")return e.replace(/<br\s*\/?>/gi,`
|
|
21
|
+
`).replace(/<[^>]+>/g," ").replace(/\s+\n/g,`
|
|
22
|
+
`).trim();const t=new DOMParser().parseFromString(e,"text/html");return(t.body.innerText||t.body.textContent||"").replace(/\n{3,}/g,`
|
|
23
|
+
|
|
24
|
+
`).trim()}function Jb(e){const t=li(e.name);return e.type.startsWith("image/")?"image":e.type.startsWith("video/")?"video":e.type==="application/pdf"||t==="pdf"?"pdf":t==="csv"||e.type==="text/csv"?"csv-table":t==="md"||t==="markdown"?"markdown":pb.has(t)?"code":e.type.startsWith("text/")||gb.has(t)?"text":"file"}function Zb(e){return typeof URL<"u"&&URL.createObjectURL?URL.createObjectURL(e):e.name}function Hd(e){return e?e.split(/\r?\n/).length:0}function Wd(e){return String(e||"").replace(/\r\n/g,`
|
|
25
|
+
`).replace(/\r/g,`
|
|
26
|
+
`).split(`
|
|
27
|
+
`).slice(0,Bs).join(`
|
|
28
|
+
`).slice(0,tb)}function Vd(e){return{IsChunkedText:"true",TotalLineCount:String(e),TotalLineCountIsPreview:"true",ChunkedPreviewOnly:"true",ChunkedPreviewChars:"",ChunkedLineCount:String(Bs),ChunkCacheEntryLimit:String(eb),LargeFileThresholdBytes:String(Qc),OriginalIngestMode:"browser-preview",TextTruncated:"true"}}function Qb(e){const t=String(e||"").replace(/\r\n/g,`
|
|
29
|
+
`).replace(/\r/g,`
|
|
30
|
+
`).split(`
|
|
31
|
+
`).filter(r=>r.trim().length>0),n=t.slice(0,40).reduce((r,d)=>Math.max(r,ey(d)),0);return{rowCount:Math.max(0,t.length-1),columnCount:n}}function ey(e){let t=1,n=!1;for(let r=0;r<e.length;r+=1){const d=e[r],c=e[r+1];d==='"'?n&&c==='"'?r+=1:n=!n:d===","&&!n&&(t+=1)}return e.trim()?t:0}function Yd(e,t){const n=`
|
|
32
|
+
|
|
33
|
+
... (UI truncated; source file ${t.toLocaleString()} bytes) ...`;return e.endsWith(`
|
|
34
|
+
`)?`${e}${n.trimStart()}`:`${e}${n}`}async function ty(e,t,n){const r=Jb(e),d=(r==="note"||r==="text"||r==="code"||r==="markdown")&&e.size<=Lr,c=r==="image"||r==="video"||r==="pdf"||r==="file"?Zb(e):void 0,m={Source:`browser-${n}`,FileName:e.name,FileType:e.type||"unknown",FileSize:String(e.size),Durable:"false"};if(r==="csv-table"){const p=e.size<=Lr,b=p?await e.text():await e.slice(0,Nd).text(),w=p?b.slice(0,Pr):Wd(b),_=Qb(w),N=p?0:Hd(w);return p||f.emit("chunkedText.preview",{fileName:e.name,fileSize:e.size,kind:r,source:n,previewChars:w.length,previewLines:N,chunkLineCount:Bs}),{id:Q("node"),kind:"csv-table",title:e.name.slice(0,90)||"CSV table",body:p?w:Yd(w,e.size),x:t.x,y:t.y,width:720,height:420,sourceFilePath:e.name,isChunkedText:!p||void 0,totalLineCount:p?void 0:N,scrollOffset:p?void 0:0,maxScroll:p?void 0:0,tags:["CSV","Table",n],metadata:{...m,CsvRowCount:String(_.rowCount),CsvColumnCount:String(_.columnCount),IsChunkedText:String(!p),...p?{}:{...Vd(N),ChunkedPreviewChars:String(w.length)},ChunkedPreviewOnly:String(!p),OriginalIngestMode:p?"browser-inline":"browser-preview",TextTruncated:String(!p||b.length>w.length)},wordWrap:!1}}if(d){const p=(await e.text()).slice(0,Pr);return{id:Q("node"),kind:r,title:e.name.slice(0,90)||(r==="code"?"Code file":r==="markdown"?"Markdown file":"Text file"),body:p,x:t.x,y:t.y,width:r==="code"?420:r==="markdown"?400:360,height:ge(168+Math.ceil(Math.min(p.length,2600)/72)*20,196,640),sourceFilePath:e.name,tags:[r==="code"?"Code":r==="markdown"?"Markdown":"Text",n],metadata:{...m,TextTruncated:String(e.size>Lr||p.length>=Pr)},wordWrap:r==="code"?!0:void 0}}if(r==="note"||r==="text"||r==="code"||r==="markdown"){const p=await e.slice(0,Nd).text(),b=Wd(p),w=Hd(b);return f.emit("chunkedText.preview",{fileName:e.name,fileSize:e.size,kind:r,source:n,previewChars:b.length,previewLines:w,chunkLineCount:Bs}),{id:Q("node"),kind:r,title:e.name.slice(0,90)||(r==="code"?"Code file":r==="markdown"?"Markdown file":"Text file"),body:Yd(b,e.size),x:t.x,y:t.y,width:r==="code"?480:r==="markdown"?430:390,height:540,sourceFilePath:e.name,isChunkedText:!0,totalLineCount:w,scrollOffset:0,maxScroll:0,isExpanded:!1,originalHeight:0,tags:[r==="code"?"Code":r==="markdown"?"Markdown":"Text","Chunked",n],metadata:{...m,...Vd(w),ChunkedPreviewChars:String(b.length)},wordWrap:r==="code"?!0:void 0}}const y=r;return{id:Q("node"),kind:y,title:e.name.slice(0,90)||(y==="image"?"Image":y==="video"?"Video":y==="pdf"?"PDF Document":"File"),body:c||e.name,x:t.x,y:t.y,width:y==="video"?420:y==="image"?360:300,height:y==="video"?236:y==="image"?240:154,imageUrl:y==="image"?c:void 0,assetUrl:y==="image"?void 0:c,sourceFilePath:e.name,tags:[y==="file"?"File":y.toUpperCase(),n],metadata:{...m,EphemeralObjectUrl:String(!!c)}}}function Gd(e,t){const n=Array.from(e??[]),r=Array.from(t??[]).map(c=>c.kind==="file"?c.getAsFile():null).filter(c=>!!c),d=new Set;return[...n,...r].filter(c=>{const m=`${c.name}:${c.size}:${c.type}:${c.lastModified}`;return d.has(m)?!1:(d.add(m),!0)})}function Ms(e){const t=e instanceof HTMLElement?e:null;return t?!!t.closest('input,textarea,select,[contenteditable="true"],[contenteditable=""],.top-tabbar,.tab-shell,.floating-panel,.canvas-toolbar,.global-input-shell,.runtime-status-cluster'):!1}function Kd(e){const t=e instanceof HTMLElement?e:null;return t?!!(t.closest(".canvas-node,.edge-path")||Ms(e)):!1}function Fr(e){return xa(e)?typeof e.id=="string"&&Array.isArray(e.nodes)&&Array.isArray(e.edges)&&xa(e.settings):!1}function Os(e){return e.replace(/\.layout\.json$/i,"").replace(/\.json$/i,"").trim()}function ay(e,t){var r,d;const n=new Date().toISOString();return{...e,id:Q("imported-board"),name:at(e.name||Os(t)),updatedAt:n,source:{...e.source??{},kind:((r=e.source)==null?void 0:r.kind)??"localStorage",boardId:((d=e.source)==null?void 0:d.boardId)||e.id,loadedAt:n}}}function Ur(e){return/\.layout\.json$/i.test(e.file.name)}function ny(e){return e.flatMap(t=>xi(t.payload).map(n=>({fileName:t.file.name,metadata:n})))}function oy(e,t){const n=Os(e.file.name);return t.find(r=>r.metadata.Id===n)??xi(e.payload).map(r=>({fileName:e.file.name,metadata:r}))[0]??null}function Ts(e){return e.length===0?null:e.reduce((t,n)=>({minX:Math.min(t.minX,n.x),minY:Math.min(t.minY,n.y),maxX:Math.max(t.maxX,n.x+n.width),maxY:Math.max(t.maxY,n.y+n.height)}),{minX:Number.POSITIVE_INFINITY,minY:Number.POSITIVE_INFINITY,maxX:Number.NEGATIVE_INFINITY,maxY:Number.NEGATIVE_INFINITY})}function sy(e){const t=[...e].sort((p,b)=>p.y-b.y||p.x-b.x);if(t.length<=2)return t;const n=t.map(p=>p.height).sort((p,b)=>p-b),r=n[Math.floor(n.length/2)]??1,d=Math.max(16,r*.35),c=[];let m=[],y=Number.NaN;for(const p of t){if(m.length===0){m=[p],y=p.y;continue}Math.abs(p.y-y)<=d?(m.push(p),y=(y*(m.length-1)+p.y)/m.length):(c.push(m.sort((b,w)=>b.x-w.x)),m=[p],y=p.y)}return m.length>0&&c.push(m.sort((p,b)=>p.x-b.x)),c.flat()}function ry(e,t,n){const r=Ts(e);if(!r)return null;const d={minX:r.minX-220,minY:r.minY-180,maxX:r.maxX+220,maxY:r.maxY+180},c=Math.max(1,d.maxX-d.minX),m=Math.max(1,d.maxY-d.minY),y=Math.min((Is-xn*2)/c,(Ns-xn*2)/m),p=(N,D)=>({x:xn+(N-d.minX)*y,y:xn+(D-d.minY)*y}),b={left:(0-t.x)/t.scale,top:(0-t.y)/t.scale,right:(n.width-t.x)/t.scale,bottom:(n.height-t.y)/t.scale},w=p(b.left,b.top),_=p(b.right,b.bottom);return{bounds:d,scale:y,project:p,nodes:e.map(N=>{const D=p(N.x,N.y);return{id:N.id,kind:N.kind,x:D.x,y:D.y,width:Math.max(2,N.width*y),height:Math.max(2,N.height*y),selected:!1}}),viewport:{x:ge(w.x,0,Is),y:ge(w.y,0,Ns),width:ge(_.x-w.x,4,Is),height:ge(_.y-w.y,4,Ns)}}}function iy(e,t){const n=Math.max(.01,e.scale),r=t.width/n,d=t.height/n,c=Math.max(qf,Math.max(r,d)*Jf);return{left:(0-e.x)/n-c,top:(0-e.y)/n-c,right:(t.width-e.x)/n+c,bottom:(t.height-e.y)/n+c}}function Xd(e,t){return e.x+e.width>=t.left&&e.x<=t.right&&e.y+e.height>=t.top&&e.y<=t.bottom}function qd(e){const t=Math.min(e.startX,e.currentX),n=Math.min(e.startY,e.currentY),r=Math.max(e.startX,e.currentX),d=Math.max(e.startY,e.currentY);return{left:t,top:n,right:r,bottom:d,width:r-t,height:d-n}}function ly(e,t){const n=Math.max(.01,t.scale);return{left:(e.left-t.x)/n,top:(e.top-t.y)/n,right:(e.right-t.x)/n,bottom:(e.bottom-t.y)/n}}function Jd(e){const t=new Date().toISOString(),n=Q("board"),r=Q("node");return{id:n,name:"Untitled Workspace",updatedAt:t,settings:e,source:{kind:"localStorage",loadedAt:t},nodes:[{id:r,kind:"note",title:"New note",body:"Start here.",x:0,y:0,width:320,height:168,tags:["Local"]}],edges:[]}}function dy(e){const t=new Date().toISOString();return{id:Q("board"),name:`Template Studio ${cy(new Date)}`,updatedAt:t,settings:e,source:{kind:"localStorage",loadedAt:t},nodes:[],edges:[]}}function cy(e){const t=`${e.getMonth()+1}`.padStart(2,"0"),n=`${e.getDate()}`.padStart(2,"0"),r=`${e.getHours()}`.padStart(2,"0"),d=`${e.getMinutes()}`.padStart(2,"0");return`${t}.${n} ${r}:${d}`}function uy(e){return`${e.sourceKind==="localBridge"?"LocalBridge copy":"React board"} / ${e.nodeCount} nodes / ${ii(e.updatedAt)}`}function wo(e,t){const n=e.trim();return n.length<=t?n:`${n.slice(0,t)}...`}function Zd(e){return e==="Fast"?"low":e==="Deep"?"high":"medium"}function ou(e){return(e.body||e.result||e.title||"").trim()||"Selected MindCanvas node"}function Qd(e,t,n,r){const d=ou(e),c=Ci(n.appLanguage,d),m=n.aiNodeDefaultWidth??340,y=Math.max(n.aiNodeDefaultHeight??196,206),p=e.x+e.width+160,b=e.y,w=96,_=t.nodes.map((D,O)=>({id:Q("node"),kind:"ai-task",title:D.title,body:D.instruction,x:p+O*(m+w),y:b,width:m,height:y,tags:[],metadata:{Source:"generate-flow",SemanticType:Ai,AutomationNodeKind:D.kind,AutomationNodeLabel:D.title,AutomationPlannerSourceMode:r,AutomationPlannerLanguage:c,AutomationPlannerObjective:d.slice(0,2e3),AdapterState:r==="ai-generated"?"localbridge-ai-planned":"language-aware-fallback"}})),N=[{id:Q("edge"),from:e.id,to:_[0].id,kind:"context"},...t.edges.filter(D=>_[D.from]&&_[D.to]).map(D=>({id:Q("edge"),from:_[D.from].id,to:_[D.to].id,kind:"result"}))];return{nodes:_,edges:N,language:c}}function Ri(e){var t,n,r;return String(((t=e.metadata)==null?void 0:t.AutomationNodeKind)||((n=e.metadata)==null?void 0:n.AutomationTemplateKey)||((r=e.metadata)==null?void 0:r.AutomationInferredKind)||"").trim().toLowerCase()}function Li(e){return e==="image-generate"||e==="video-generate"?Mi[e]:null}function su(e){var t;return String(((t=e.metadata)==null?void 0:t.SemanticType)||"").trim()===Ai}function my(e,t){const n=Mi[t],r=vo(e,n.mode);return{...Pi(e,n.mode)??{},Source:"toolbar-business-automation",SemanticType:Ai,AutomationNodeKind:n.kind,AutomationNodeLabel:n.title,AutomationNodeDescription:`${n.tag} prepared as a spec-only, review-gated media automation node.`,AutomationGraphSchemaVersion:"react-media-spec@1",AutomationTemplateKey:n.kind,AutomationInferredKind:n.kind,AutomationInferredRole:"Media Spec",AutomationToolPolicy:"spec-only",AutomationToolHints:`AI.LLM, ${n.toolHint}, HumanReview.Gate`,AutomationOutputType:n.outputType,AutomationApprovalPolicy:"review-before-generate",AutomationRequiredEvidence:"false",AutomationExternalActionPolicy:"spec-only-until-review",AutomationResultPolicy:"snapshot-per-run",AutomationRunState:"idle",AutomationRunCount:"0",AutomationInstruction:n.body,AutomationLastOutput:"",AutomationLastRunError:"",AutomationLastRunStatus:"not-run",AutomationLastRunStatusLabel:"Not run",AutomationLastRunSourceMode:"",AutomationLastRunEvidenceCount:"0",AutomationLastRunIsFallback:"false",AutomationLastRunIsPartial:"false",AutomationLastRunToolsUsed:"",AutomationLastRunToolWarnings:"",MediaGenerationContract:"spec-only-until-review",MediaGenerationMedium:n.mode.toLowerCase(),MediaModel:r.model.id,MediaProvider:r.model.provider,AspectPresetId:r.aspect.id,AspectLabel:r.aspect.label,RequestedSize:r.requestedSize,AdapterState:"adapter-gated"}}function py(e,t){var r,d,c,m,y;if(!su(e))return;const n=t.runState==="completed"?String((Number((r=e.metadata)==null?void 0:r.AutomationRunCount)||0)+1):((d=e.metadata)==null?void 0:d.AutomationRunCount)||"0";return{...e.metadata??{},AutomationRunState:t.runState,AutomationInstruction:t.instruction,AutomationLastOutput:t.output??((c=e.metadata)==null?void 0:c.AutomationLastOutput)??"",AutomationLastRunError:t.error??"",AutomationLastRunStatus:t.status,AutomationLastRunStatusLabel:t.statusLabel,AutomationLastRunSourceMode:t.sourceMode??"",AutomationLastRunEvidenceCount:((m=e.metadata)==null?void 0:m.AutomationLastRunEvidenceCount)??"0",AutomationLastRunIsFallback:String(!!t.fallback),AutomationLastRunIsPartial:String(!!t.partial),AutomationLastRunToolsUsed:t.toolsUsed??((y=e.metadata)==null?void 0:y.AutomationToolHints)??"",AutomationLastRunToolWarnings:t.toolWarnings??"",AutomationRunCount:n,...t.runState==="completed"?{AutomationLastRunAtUtc:new Date().toISOString()}:{}}}function gy(){return{Source:"toolbar-agent-command",SemanticType:ab,AgentCommandId:Q("agent-command"),AgentCommandStatus:"Draft",AgentCommandMode:"Task",AgentCommandRequestedRole:"Researcher",AgentCommandConstraints:"",AgentCommandPlannerSummary:"",AgentCommandPlanSteps:"[]",AgentCommandPlannedSkills:"[]",AgentCommandPlannedTools:"[]",AgentCommandPlannedConcepts:"[]",AgentCommandLinkedCodeNotes:"[]",AgentCommandWorkItems:"[]",AgentCommandConsoleLogs:"[]",AgentCommandResultLinks:"[]",AgentCommandContinuationPending:"false",AgentCommandTrancheIndex:"0",memoColor:"gray",memoIcon:"robot",AdapterState:"adapter-gated"}}function hy(){return{Source:"toolbar-code-note",SemanticType:nb,CodeNoteId:Q("code-note"),CodeNoteKind:"Feature",CodeNoteStatus:"Draft",CodeNoteSyncState:"Unlinked",CodeNoteWhy:"Keep the reason and implementation boundary visible before code changes.",CodeNoteRelatedFiles:JSON.stringify(["src/features/canvas/MindCanvas.tsx"]),CodeNoteRelatedNamespaces:"[]",CodeNoteRelatedSymbols:"[]",CodeNoteAcceptanceCriteria:JSON.stringify(["The intended change is represented as a canvas note.","Local status actions update CodeNote metadata without external adapters."]),CodeNoteOutputArtifacts:"[]",memoColor:"sky",memoIcon:"code",AdapterState:"local-canvas-only"}}function fy(e,t,n="LocalBridge AI path was unavailable"){var d,c,m,y;const r=t?Li(Ri(t)):null;if(r){const p=r.mode.toLowerCase();return[`Task: ${e}`,"",`Run Result: ${r.title}`,`Node: ${r.kind}`,"Status: Spec only","Source mode: media-prompt-only","AI used: no",`Fallback reason: ${n}`,"","Generation is not executed here. External media generation stays adapter-gated until human review.","","Spec:",`- Medium: ${p}`,`- Model: ${((d=t==null?void 0:t.metadata)==null?void 0:d.MediaModel)||"adapter-gated"}`,`- Aspect: ${((c=t==null?void 0:t.metadata)==null?void 0:c.AspectLabel)||((m=t==null?void 0:t.metadata)==null?void 0:m.AspectPresetId)||"auto"}`,`- Requested size: ${((y=t==null?void 0:t.metadata)==null?void 0:y.RequestedSize)||"auto"}`,"","Prompt draft:",e].join(`
|
|
35
|
+
`)}return[`Task: ${e}`,"","Source: Local fallback","AI used: no",`Fallback reason: ${n}`,"","Local draft:","1. Clarify the paid offer in one sentence.","2. Pick one English-first channel and publish proof there.","3. Create a MindCanvas board that keeps source context, AI output, and next actions together.","4. Reuse the result as context for the next task."].join(`
|
|
36
|
+
`)}function bo(e,t){return{...su(e)?py(e,t):e.metadata??{},AiTaskLastRunState:t.runState,AiTaskLastRunStatus:t.status,AiTaskLastRunStatusLabel:t.statusLabel,AiTaskLastRunSourceMode:t.sourceMode??"",AiTaskLastRunIsFallback:String(!!t.fallback),AiTaskLastRunIsPartial:String(!!t.partial),AiTaskLastRunToolsUsed:t.toolsUsed??"",AiTaskLastRunToolWarnings:t.toolWarnings??"",AiTaskLastRunModel:t.model??"",AiTaskLastRunReasoningEffort:t.reasoningEffort??"",AiTaskLastRunProviderKind:t.providerKind??"",AiTaskLastRunThreadId:t.threadId??"",AiTaskLastRunTurnId:t.turnId??"",AiTaskLastRunError:t.error??"",...t.runState!=="running"?{AiTaskLastRunAtUtc:new Date().toISOString()}:{}}}function by(e){var w;const t=e.metadata??{},n=t.AiTaskLastRunSourceMode||t.AutomationLastRunSourceMode||"",r=t.AiTaskLastRunStatusLabel||t.AutomationLastRunStatusLabel||e.status||"",d=t.AiTaskLastRunIsFallback==="true"||t.AutomationLastRunIsFallback==="true"||n==="local-draft"||((w=e.result)==null?void 0:w.includes("Source: Local fallback")),c=t.AiTaskLastRunModel||"",m=t.AiTaskLastRunReasoningEffort||"",y=t.AiTaskLastRunProviderKind||"",p=t.AiTaskLastRunThreadId||"",b=t.AiTaskLastRunError||t.AutomationLastRunError||"";return n==="media-prompt-only"?{tone:"fallback",label:"Spec only",detail:"External media generation was not executed."}:d?{tone:"fallback",label:"Local fallback",detail:b?`AI not used. ${b}`:"AI not used."}:e.status==="running"?{tone:"running",label:"Running",detail:[c||"Codex",m].filter(Boolean).join(" · ")||"AI request in progress."}:n==="ai-generated"||y||p?{tone:"ai",label:"AI result",detail:[y||"LocalBridge Codex",c,m,p?`thread ${p.slice(0,8)}`:""].filter(Boolean).join(" · ")}:{tone:e.status==="blocked"?"fallback":"neutral",label:r||"Result",detail:n||"Run metadata unavailable."}}function yy(e,t){const n=e.result||"",r=n.slice(0,oi),d=`${e.title||"AI Task"} result`;return{id:Q("node"),kind:"markdown",title:d.slice(0,90),body:r,x:t.x,y:t.y,width:440,height:ge(220+Math.ceil(Math.min(r.length,3600)/88)*20,260,680),tags:["AI Result","Markdown"],metadata:{Source:"ai-result-popover",AiResultSourceNodeId:e.id,AiResultSourceTitle:e.title,AiResultArchivedAtUtc:new Date().toISOString(),TextTruncated:String(n.length>oi),AdapterState:"local-reference"}}}function xy(e,t){const n=wo(e.result||"",900);return{id:Q("node"),kind:"ai-task",title:`Follow up: ${e.title||"AI result"}`.slice(0,90),body:["Continue from the linked AI result.","","Use the result as context and propose the next concrete action.","","Result preview:",n||"(No result preview available.)"].join(`
|
|
37
|
+
`),x:t.x,y:t.y,width:360,height:220,status:"idle",tags:["AI Task","Follow-up"],metadata:{Source:"ai-result-popover",FollowUpSourceNodeId:e.id,FollowUpSourceTitle:e.title,AdapterState:"local-draft"}}}function ec(e,t,n){var y,p,b,w,_;const r=Li(Ri(t)),d=new Set(e.edges.filter(N=>N.to===t.id||N.from===t.id).flatMap(N=>[N.from,N.to]).filter(N=>N!==t.id)),c=e.nodes.filter(N=>d.has(N.id)).slice(0,8),m=c.length>0?c.map(N=>[`### ${N.title||N.kind}`,`Type: ${N.kind}`,wo(N.result||N.body||"",1200)].join(`
|
|
38
|
+
`)).join(`
|
|
39
|
+
|
|
40
|
+
`):"No linked context nodes.";return r?["You are running inside MindExec React MindCanvas.",`Return a concise, practical Markdown media generation spec for the selected ${r.mode.toLowerCase()} automation node.`,"Do not claim the asset was generated. This node prepares the prompt/spec only.","External media generation must remain gated until human review.",Hr(e.settings.appLanguage),"",`Board: ${e.name}`,`Task node: ${t.title}`,`Automation kind: ${r.kind}`,`External action policy: ${((y=t.metadata)==null?void 0:y.AutomationExternalActionPolicy)||"spec-only-until-review"}`,`Media model: ${((p=t.metadata)==null?void 0:p.MediaModel)||"adapter-gated"}`,`Aspect: ${((b=t.metadata)==null?void 0:b.AspectLabel)||((w=t.metadata)==null?void 0:w.AspectPresetId)||"auto"}`,`Requested size: ${((_=t.metadata)==null?void 0:_.RequestedSize)||"auto"}`,"","Instruction:",wo(n,4e3),"","Linked context:",m,"","Required sections:","- Subject","- Visual style","- Composition or scene","- Constraints","- Business use case","- Final generation prompt"].join(`
|
|
41
|
+
`):["You are running inside MindExec React MindCanvas.","Return a concise, practical Markdown result for the selected AI Task.","Do not modify files. Do not ask follow-up questions unless the task is impossible.",Hr(e.settings.appLanguage),"",`Board: ${e.name}`,`Task node: ${t.title}`,"","Instruction:",wo(n,4e3),"","Linked context:",m].join(`
|
|
42
|
+
`)}function ru(e,t){const n=e.x-t.x;if(Math.abs(n)>1)return n;const r=e.y-t.y;return Math.abs(r)>1?r:String(e.title||e.id).localeCompare(String(t.title||t.id))}function ci(e){return[...e].sort(ru)}function Cy(e,t){const n=new Map(e.nodes.filter(w=>w.kind==="ai-task").map(w=>[w.id,w])),r=new Set([...t].filter(w=>n.has(w))),d=new Map,c=new Map;for(const w of r)d.set(w,new Set),c.set(w,0);for(const w of e.edges){if(!r.has(w.from)||!r.has(w.to)||w.from===w.to)continue;const _=d.get(w.from);!_||_.has(w.to)||(_.add(w.to),c.set(w.to,(c.get(w.to)??0)+1))}const m=[],y=new Set,p=ci([...r].filter(w=>(c.get(w)??0)===0).map(w=>n.get(w)));for(;p.length>0;){const w=p.shift();if(y.has(w.id))continue;y.add(w.id),m.push(w);const _=[...d.get(w.id)??[]].map(N=>n.get(N)).filter(N=>!!N);for(const N of _)c.set(N.id,Math.max(0,(c.get(N.id)??0)-1)),(c.get(N.id)??0)===0&&p.push(N);p.sort(ru)}const b=ci([...r].filter(w=>!y.has(w)).map(w=>n.get(w)).filter(Boolean));return[...m,...b]}function ui(e,t){var m,y;const n=new Set(e.nodes.filter(p=>p.kind==="ai-task").map(p=>p.id));if(!n.has(t))return[];const r=new Map;for(const p of n)r.set(p,new Set);for(const p of e.edges)!n.has(p.from)||!n.has(p.to)||((m=r.get(p.from))==null||m.add(p.to),(y=r.get(p.to))==null||y.add(p.from));const d=new Set,c=[t];for(;c.length>0;){const p=c.pop();if(!d.has(p)){d.add(p);for(const b of r.get(p)??[])d.has(b)||c.push(b)}}return Cy(e,d)}function ky(e){const t=new Set(e.nodes.filter(d=>d.kind==="ai-task").map(d=>d.id)),n=new Set(t),r=[];for(const d of ci(e.nodes.filter(c=>c.kind==="ai-task"))){if(!n.has(d.id))continue;const c=ui(e,d.id);for(const m of c)n.delete(m.id);r.push(c)}return r}function vo(e,t,n){const r=mc(t,e,n),d=t==="Image"?e.imageRouterImageAspectPresetId:e.imageRouterVideoAspectPresetId,c=Wr(t,r,d);return{mode:t,model:r,aspect:c,aspectOptions:Tp(r,t),requestedSize:Vr(c)}}function Pi(e,t,n){const r=vo(e,t,n);return{InputMode:t,AppLanguage:hi(e.appLanguage),MediaPromptLanguageInstruction:Rp(e.appLanguage),AdapterState:"adapter-gated",MediaModel:r.model.id,MediaProvider:r.model.provider,AspectPresetId:r.aspect.id,AspectLabel:r.aspect.label,RequestedSize:r.requestedSize}}function Sy(e){const t=na(e.id);if(!t)return null;const n=wy(e.provider,t);return{id:t,label:e.displayName||e.label||t,displayName:e.displayName||e.label||t,description:e.description,provider:n,supportsReasoning:e.supportsReasoning,isFallback:e.isFallback,vendorPricing:iu(e.vendorPricing),source:e.source}}function tc(e,t){const n=uc(t,e.id);if(!n)return null;const r=Array.isArray(e.supportedSizes)&&e.supportedSizes.length>0?e.supportedSizes:t==="Image"?["custom"]:[];return{id:n,label:e.displayName||e.label||n,displayName:e.displayName||e.label||n,description:e.description,provider:vy(e.provider,n),mode:t,supportedSizes:r,supportedSeconds:e.supportedSeconds??[],supportsReasoning:e.supportsReasoning,isFallback:e.isFallback,vendorPricing:iu(e.vendorPricing),source:e.source}}function iu(e){if(!e)return null;const t=String(e.source||"").trim()||"catalog";return{promptUsdPerToken:bn(e.promptUsdPerToken),completionUsdPerToken:bn(e.completionUsdPerToken),requestUsd:bn(e.requestUsd),minUsd:bn(e.minUsd),averageUsd:bn(e.averageUsd),maxUsd:bn(e.maxUsd),source:t}}function bn(e){const t=Number(e);return Number.isFinite(t)?t:void 0}function wy(e,t){const n=String(e||"").trim().toLowerCase();return n==="codex"?"codex":n==="ollama"?"ollama":n==="gemini-cli"||t.startsWith("gemini-")?"gemini-cli":t.startsWith("llama")?"ollama":"openrouter"}function vy(e,t){const n=String(e||"").trim().toLowerCase();return n==="codex"||t.startsWith("codex-image:")?"OpenAI Codex":n==="openai"?"OpenAI":n==="imagerouter"?"ImageRouter":e||mi(t,"Saved")}function jy(e){return e.filter(n=>n.provider==="codex"&&!n.id.includes("/")&&!n.id.includes(":")).filter((n,r,d)=>d.findIndex(c=>c.id.toLowerCase()===n.id.toLowerCase())===r).slice(0,8).flatMap(n=>[{quality:"low",label:"Low"},{quality:"medium",label:"Mid"},{quality:"high",label:"High"}].map(({quality:r,label:d})=>({id:`codex-image:${n.id}:${r}`,label:`${n.displayName||n.label} Image - ${d}`,displayName:`${n.displayName||n.label} Image - ${d}`,provider:"OpenAI Codex",mode:"Image",supportedSizes:["1024x1024","1536x1024","1024x1536"],source:n.source||"codex"})))}function zr(e,t,n){return e.map(r=>{const d=My(r),c=Ny(r,t,n),m=Ry(r,d);return{value:r.id,label:m,title:r.label||r.displayName||r.id,trailingLabel:c.displayLabel}})}function ac(e){return e.map(t=>({value:t.id,label:t.label,title:t.note,detail:t.resolvedSize?`Size hint: ${t.resolvedSize}`:t.note,showAspectIcon:!!(t.width&&t.height),aspectIconWidth:t.width,aspectIconHeight:t.height}))}function Iy(){return[{value:"Fast",label:"Fast",detail:"Lower reasoning effort"},{value:"Normal",label:"Normal",detail:"Balanced reasoning effort"},{value:"Deep",label:"Deep",detail:"Higher reasoning effort"}]}function Ny(e,t,n){const r=Ay(e,t,n),d=e.vendorPricing??Ep(e.id);return _p({mode:t,provider:r,modelId:e.id,reasoningEffort:n.effort,vendorPricing:d})}function Ay(e,t,n){const r=String(e.provider||"").trim().toLowerCase();return t==="Text"?r==="codex"?"openai-codex":r==="ollama"?"local-ollama":r==="gemini-cli"?"google-gemini-cli":n.aiProvider==="BYOK"?"byok":"managed-cloud":t==="Image"&&(r==="openai codex"||e.id.startsWith("codex-image:"))?"openai-codex":Bp(n)}function My(e){const t=String(e.provider||"").trim().toLowerCase();return t==="codex"||t==="openai codex"?"openai-codex-exec":t==="gemini-cli"?"google":t==="ollama"?"ollama":t==="openrouter"||t==="imagerouter"||t==="imagerouter"?mi(e.id,t):mi(e.id,t||"other")}function mi(e,t){const n=String(e||"").trim();if(!n)return t;if(n.startsWith("codex-image:"))return"openai";const r=n.indexOf("/");if(r>0)return n.slice(0,r).toLowerCase();const d=n.indexOf(":");return d>0?n.slice(0,d).toLowerCase():t||n.toLowerCase()}function Ty(e){switch(e){case"openai-codex-exec":return"OpenAI Codex";case"openai":return"OpenAI";case"google":return"Google";case"ollama":return"Ollama";case"imagerouter":return"ImageRouter";default:return e.replace(/[-_]+/g," ").replace(/\b\w/g,t=>t.toUpperCase())}}function Ry(e,t){const n=String(e.displayName||e.label||e.id||"").trim(),r=n.toLowerCase()===e.id.toLowerCase()?nc(e.id):n;return Ly(r,t)||nc(e.id)}function nc(e){const t=String(e||"").trim();if(t.startsWith("codex-image:"))return t.slice(12);const n=t.indexOf("/");return n>0&&n<t.length-1?t.slice(n+1):t}function Ly(e,t){const n=Py(t);for(const r of n)for(const d of[" · ",": "," - "," - "," | "," / "," "]){const c=`${r}${d}`;if(e.toLowerCase().startsWith(c.toLowerCase()))return e.slice(c.length).trim()}return e}function Py(e){switch(e){case"openai-codex-exec":return["OpenAI Codex","OpenAI"];case"openai":return["OpenAI"];case"google":return["Google"];case"anthropic":return["Anthropic"];case"runway":return["Runway"];default:return[Ty(e)]}}function Ey(e){return{textModels:((e==null?void 0:e.textModels)??[]).map(Sy).filter(t=>!!t),imageModels:((e==null?void 0:e.imageModels)??[]).map(t=>tc(t,"Image")).filter(t=>!!t),videoModels:((e==null?void 0:e.videoModels)??[]).map(t=>tc(t,"Video")).filter(t=>!!t)}}function _y(e){var r;const t=((r=e==null?void 0:e.exec)==null?void 0:r.availableModels)??[],n=[];return t.forEach((d,c)=>{var p,b;if(typeof d=="string"){const w=na(d);if(!w)return;const _=oc(w);n.push({id:w,label:_,displayName:_,provider:"codex",supportsReasoning:!0,source:((p=e==null?void 0:e.exec)==null?void 0:p.modelCatalogSource)||"localbridge-status",priority:c});return}const m=na(d.id);if(!m)return;const y=String(d.displayName||"").trim()||oc(m);n.push({id:m,label:y,displayName:y,description:d.description,provider:"codex",supportsReasoning:!0,isFallback:!1,source:((b=e==null?void 0:e.exec)==null?void 0:b.modelCatalogSource)||"localbridge-status",priority:Number.isFinite(Number(d.priority))?Number(d.priority):c})}),n.sort((d,c)=>d.priority-c.priority||d.id.localeCompare(c.id)).map(({priority:d,...c})=>c)}function oc(e){return e.startsWith("gpt-")?`GPT-${e.slice(4).toUpperCase()}`:e}function lu(e){return e.map(t=>({id:t.id,kind:t.kind,title:t.title,body:t.body,response:t.result||t.body,tags:t.tags??[],metadata:t.metadata??{},sourceFilePath:t.sourceFilePath,assetUrl:t.assetUrl,x:t.x,y:t.y,width:t.width,height:t.height}))}function By(e,t){const n=Math.max(.01,e.scale),r=Math.max(1,t.width/n/2),d=Math.max(1,t.height/n/2);return{centerX:(t.width/2-e.x)/n,centerY:(t.height/2-e.y)/n,halfWidth:r,halfHeight:d}}function Dy(e,t,n,r=8){if(!t.trim())return[];const d=Wh(lu(e)),c=new Map(e.map(m=>[m.id,m]));return Vh(d,t,{limit:r,viewport:n}).hits.map(m=>c.get(m.nodeId)).filter(m=>!!m)}function sc(e,t,n="none"){const r=new Set(t.nodes.map(c=>c.id)),d=e.filter((c,m)=>r.has(c)&&e.indexOf(c)===m);return d.length>0||n==="none"?d:t.nodes[0]?[t.nodes[0].id]:[]}function rc(e){const t=e instanceof HTMLElement?e:null;return t?!!t.closest('input,textarea,select,[contenteditable="true"],[contenteditable=""]'):!1}function Oy(e){const t=e instanceof HTMLElement?e:null;return t?!!t.closest('button,a,[role="button"],[role="tab"],summary'):!1}function xs(e){const t=e;if(!t)return null;const n=Number(t.x),r=Number(t.y),d=Number(t.scale);return!Number.isFinite(n)||!Number.isFinite(r)||!Number.isFinite(d)?null:{x:n,y:r,scale:ge(d,vs,js)}}function Wa(e){return typeof e=="string"?e.trim():""}function Cs(e,t=34){const n=Wa(e);if(!n)return"workspace";const c=n.replace(/\\/g,"/").split("/").filter(Boolean).slice(-2).join("/")||n;return c.length<=t?c:`...${c.slice(-(t-3))}`}function $y(){try{const e=window.localStorage.getItem(Jc),t=e?JSON.parse(e):[];return Array.isArray(t)?t.map(Wa).filter(Boolean).filter((n,r,d)=>d.findIndex(c=>c.toLowerCase()===n.toLowerCase())===r).slice(0,Zc):[]}catch{return[]}}function Fy(e){const t=e.map(Wa).filter(Boolean).filter((n,r,d)=>d.findIndex(c=>c.toLowerCase()===n.toLowerCase())===r).slice(0,Zc);try{window.localStorage.setItem(Jc,JSON.stringify(t))}catch{}return t}function Uy(){try{return window.localStorage.getItem(qc)==="full"?"full":"curated"}catch{return"curated"}}function zy(e){try{window.localStorage.setItem(qc,e)}catch{}}function ic(e,t){return Fy([e,...t.filter(n=>n.toLowerCase()!==e.toLowerCase())])}function ax({navigate:e,onSidebarActionsChange:t}){var fl,bl,yl,xl,Cl,kl,Sl,wl,vl,jl,Il,Nl,Al,Ml,Tl;const[n,r]=g.useState(()=>Gl(Ol(Kl(ep(Bl))))),[d,c]=g.useState([]),[m,y]=g.useState([]),[p,b]=g.useState(["node-agent-command"]),[w,_]=g.useState(""),[N,D]=g.useState(""),[O,z]=g.useState(0),[U,V]=g.useState([]),[Y,ce]=g.useState(0),[le,Pe]=g.useState("idle"),[ye,We]=g.useState("booting"),[vt,nt]=g.useState(null),[G,X]=g.useState(null),[ue,oe]=g.useState(null),[mt,W]=g.useState(null),[jt,It]=g.useState(null),[P,Nt]=g.useState({...Fa}),[At,ze]=g.useState({...Fa}),[H,pt]=g.useState(()=>({width:window.innerWidth,height:window.innerHeight})),[gt,ot]=g.useState(()=>Er(n)??{x:0,y:0}),[Ft,Ca]=g.useState(!1),[ka,No]=g.useState(()=>localStorage.getItem(jd)==="true"),[Ve,Tn]=g.useState("local"),[sa,Mt]=g.useState([]),[Ie,se]=g.useState(tt()?"idle":"blocked"),[Ei,Be]=g.useState(null),[Ut,ra]=g.useState({status:"idle",textModels:[],imageModels:[],videoModels:[]}),[Ao,xe]=g.useState(tt()?null:"Hosted LocalBridge access is off."),[Ae,Me]=g.useState(null),[zt,he]=g.useState(null),[Mo,Ya]=g.useState(()=>$y()),[Te,qe]=g.useState(!1),[Rn,ke]=g.useState(null),[ht,Ln]=g.useState(null),[Pn,Ht]=g.useState(!1),[De,ft]=g.useState("ready"),[Sa,To]=g.useState("Saved in this browser."),[Tt,Ro]=g.useState(!1),[Je,Ye]=g.useState(()=>kt()),Oe=g.useMemo(()=>ob(),[]),[Ga,Lo]=g.useState(()=>xr()),Ce=Oe.cloudBoards.canAttempt&&(Ga==null?void 0:Ga.source)==="supabase-provider-session",[Ka,Po]=g.useState([]),[En,Ee]=g.useState(null),[Rt,ia]=g.useState(!1),[Xa,Eo]=g.useState(null),$e=g.useMemo(()=>uf({storedMode:Ve,cloudConfigured:!0,cloudSessionAvailable:Ce,cloudAccess:Ce?{planKey:"provider",entitlementStatus:"active",currentBoardCount:Ka.length,cloudBoardLimit:Number.MAX_SAFE_INTEGER,lockedBoardCount:0,canCreateBoard:!0}:null,bridgeProviderConfigured:!0,bridgeReachable:Ie==="connected",hostedWebApp:!tt()&&!ro(),hostedLocalBridgeAccessEnabled:ro(),browserProviderConfigured:!0,browserLocalAvailable:!0,browserLocalAvailableWhenEmpty:!0,embeddedProviderConfigured:!1,supportsEmbeddedLocal:!1}),[Ce,Ka.length,Ie,Ve]),[_n,Bn]=g.useState(null),[Dn,qa]=g.useState(""),[Wt,On]=g.useState(null),[$n,la]=g.useState(null),[Ze,Fn]=g.useState(!1),[wa,me]=g.useState(!1),[st,bt]=g.useState(null),[Vt,Yt]=g.useState(null),[Lt,Ws]=g.useState(!1),[Un,_o]=g.useState(!1),[va,Vs]=g.useState(Uy),zn=g.useRef(new Map),ja=g.useMemo(()=>fr(n.settings.appLanguage),[n.settings.appLanguage]),[Hn,Gt]=g.useState(!1),[Ja,Ia]=g.useState(!1),[da,Bo]=g.useState("business"),[rt,Za]=g.useState(()=>{var s;const a=io("business",n.settings.appLanguage)??fr(n.settings.appLanguage)[0];return((s=is(a))==null?void 0:s.id)??null}),[Kt,Qa]=g.useState(()=>{const a=io("business",n.settings.appLanguage)??fr(n.settings.appLanguage)[0],s=is(a);return lo(co(a,s==null?void 0:s.id,n.settings.appLanguage))}),[Wn,Qe]=g.useState(null),[en,tn]=g.useState(!1),[Ne,Do]=g.useState(()=>Ad(n.id,n.name)),[fe,it]=g.useState(null),[Oo,$o]=g.useState(null),[Ys,lt]=g.useState(!1),[Xt,Na]=g.useState({}),[an,ca]=g.useState(null),nn=g.useMemo(()=>{var l,u;const a=Je.find(h=>h.id===n.id),s={id:n.id,name:n.name,updatedAt:n.updatedAt,nodeCount:n.nodes.length,edgeCount:n.edges.length,sourceKind:(l=n.source)==null?void 0:l.kind,sourceBoardId:(u=n.source)==null?void 0:u.boardId,order:(a==null?void 0:a.order)??-1},i=new Map(Je.map(h=>[h.id,h]));return i.set(n.id,{...a,...s}),Array.from(i.values()).sort((h,k)=>{const C=typeof h.order=="number"?h.order:Number.MAX_SAFE_INTEGER,j=typeof k.order=="number"?k.order:Number.MAX_SAFE_INTEGER;return C!==j?C-j:String(k.updatedAt||"").localeCompare(String(h.updatedAt||""))}).slice(0,7)},[n,Je]),re=g.useMemo(()=>io(da,n.settings.appLanguage)??ja[0],[da,n.settings.appLanguage,ja]),Ge=g.useMemo(()=>re?co(re,rt,n.settings.appLanguage):null,[re,n.settings.appLanguage,rt]),on=!!(re&&(re.options.length>0||!re.quickCreateTemplateId)),Vn=g.useMemo(()=>ls(Ge,Kt),[Ge,Kt]),v=g.useRef(n),q=g.useRef(p),ie=g.useRef({...Fa}),Fo=g.useRef(H),He=g.useRef(gt),qt=g.useRef(null),Jt=g.useRef(null),sn=g.useRef(null),rn=g.useRef(null),Yn=g.useRef(null),Gn=g.useRef(null),ln=g.useRef(new Map),Kn=g.useRef(new pf),Aa=g.useRef(0),Xn=g.useRef(null),dn=g.useRef(0),Ma=g.useRef(null),ua=g.useRef(!1),Fe=g.useRef(0),_e=g.useRef(0),Ta=g.useRef(0),Ra=g.useRef(0),cn=g.useRef(!1),qn=g.useRef(0),La=g.useRef({}),un=g.useRef(),x=g.useRef(),$=g.useRef(null),de=g.useRef(null),dt=g.useRef(0),Pt=g.useRef(null),et=g.useRef(0),ma=g.useRef(!1),Ue=g.useCallback(()=>{var s;const a=(s=qt.current)==null?void 0:s.getBoundingClientRect();return{width:Math.max(1,(a==null?void 0:a.width)??window.innerWidth),height:Math.max(1,(a==null?void 0:a.height)??window.innerHeight)}},[]),yt=g.useCallback((a,s)=>{var l;const i=(l=qt.current)==null?void 0:l.getBoundingClientRect();return i?{x:a-i.left,y:s-i.top}:{x:a,y:s}},[]),pa=g.useCallback(a=>{ma.current=a,Ws(a)},[]),_i=g.useCallback((a="keyboard")=>{Vs(s=>{const i=s==="curated"?"full":"curated";return zy(i),f.emit("canvas.functionToolbar.toggle",{mode:i,source:a}),i})},[]);g.useEffect(()=>(f.transitionTo("board-file-loading","mindcanvas-mount"),f.transitionTo("interactive-fullres","react-board-ready"),()=>f.transitionTo("disposed","mindcanvas-unmount")),[]),g.useEffect(()=>{const a=()=>Lo(xr());return window.addEventListener(Vl,a),window.addEventListener("storage",a),window.addEventListener("focus",a),()=>{window.removeEventListener(Vl,a),window.removeEventListener("storage",a),window.removeEventListener("focus",a)}},[]),g.useEffect(()=>{const a=()=>{const s=!!document.fullscreenElement;pa(s),f.emit("canvas.fullscreen.changed",{active:s})};return document.addEventListener("fullscreenchange",a),()=>document.removeEventListener("fullscreenchange",a)},[pa]),g.useEffect(()=>{const a=new Worker(new URL("/assets/mindCanvasSearchWorker-BzPMsHOB.js",import.meta.url),{type:"module"});return Ma.current=a,a.onmessage=s=>{var h,k,C,j,S,I,E,B,T;const i=s.data;if(i.type==="READY"){ua.current=!0,We("ready"),f.emit("search.worker.ready");return}if(i.type!=="SEARCH_RESULT")return;if(i.seq!==dn.current){f.emit("async.staleIgnored",{path:"search.worker",seq:i.seq});return}const l=new Map(v.current.nodes.map(M=>[M.id,M])),u=i.hits.map(M=>l.get(M.nodeId)).filter(M=>!!M);V(u),ce(0),Pe("worker"),f.emit("search.completed",{query:i.query,count:u.length,engine:"worker",durationMs:(h=i.profile)==null?void 0:h.durationMs,documentCount:(k=i.profile)==null?void 0:k.documentCount,candidateCount:(C=i.profile)==null?void 0:C.candidateCount,rankedCount:(j=i.profile)==null?void 0:j.rankedCount,viewportBoosted:(S=i.profile)==null?void 0:S.viewportBoosted,boostedCount:(I=i.profile)==null?void 0:I.boostedCount,indexedTokenCount:(E=i.profile)==null?void 0:E.indexedTokenCount,indexedPrefixCount:(B=i.profile)==null?void 0:B.indexedPrefixCount,indexedNGramCount:(T=i.profile)==null?void 0:T.indexedNGramCount})},a.onerror=s=>{ua.current=!1,We("failed"),f.emit("search.worker.failed",{message:s.message})},()=>{a.terminate(),Ma.current=null,ua.current=!1}},[]),g.useEffect(()=>{const a=()=>{const l=Ue();Fo.current=l,pt(u=>Math.abs(u.width-l.width)<.5&&Math.abs(u.height-l.height)<.5?u:l)};a();const s=typeof ResizeObserver>"u"?null:new ResizeObserver(a),i=qt.current;return s&&i&&s.observe(i),window.addEventListener("resize",a),()=>{s==null||s.disconnect(),window.removeEventListener("resize",a)}},[Ue]),g.useEffect(()=>(v.current=n,ft("syncing"),To("Saving board state to this browser."),window.clearTimeout(un.current),un.current=window.setTimeout(()=>{const a=ea(Ua(v.current,He.current));Ye(kt()),ft(a?"ready":"error"),To(a?"Saved in this browser.":"Local browser storage failed.")},280),()=>window.clearTimeout(un.current)),[n]),g.useEffect(()=>{const a=Ma.current;if(!a)return;const s=window.setTimeout(()=>{a.postMessage({type:"REBUILD_BOARD",boardId:n.id,nodes:lu(n.nodes)}),f.emit("search.worker.synced",{boardId:n.id,count:n.nodes.length})},160);return()=>window.clearTimeout(s)},[n.id,n.nodes]),g.useEffect(()=>{q.current=p},[p]),g.useEffect(()=>{const a=Er(v.current)??{x:0,y:0};He.current=a,ot(a),f.emit("canvas.cursor.restore",{boardId:v.current.id,x:Math.round(a.x),y:Math.round(a.y),source:v.current.viewState?"board-view-state":"default"})},[n.id]),g.useEffect(()=>{f.emit("canvas.gridMode.applied",{boardId:n.id,gridType:Dr(n.settings.gridType),gridSnap:n.settings.gridSnap??!0})},[n.id,n.settings.gridSnap,n.settings.gridType]),g.useEffect(()=>()=>{document.body.classList.remove("is-selecting"),document.body.classList.remove("is-panning"),window.clearTimeout(x.current)},[]);const te=g.useCallback((a,s=!0)=>{ie.current=a,Nt(a),sn.current&&(sn.current.style.transform=`translate3d(${a.x}px, ${a.y}px, 0) scale(${a.scale})`),Jt.current&&(Jt.current.style.setProperty("--grid-x",`${a.x}px`),Jt.current.style.setProperty("--grid-y",`${a.y}px`),Jt.current.style.setProperty("--grid-small",`${24*a.scale}px`),Jt.current.style.setProperty("--grid-large",`${144*a.scale}px`)),window.clearTimeout(x.current),x.current=window.setTimeout(()=>ze(a),Xf),s&&f.emit("camera.patch",{...a})},[]),Zt=g.useCallback(async()=>{var i;const a=++Fe.current;if(se("checking"),Be(null),xe(null),f.emit("runtimeStatus.bridge.refresh.requested",{source:"mindcanvas"}),!tt()){se("blocked"),Be(null),Mt([]),xe("Hosted LocalBridge access is off."),Me(null),he("Hosted LocalBridge access is off."),f.emit("projectStorage.workspace.blocked",{source:"refresh",reason:"hosted-access-off"});return}const s=await ta();if(a===Fe.current){if(Be(s.status??null),s.state!=="connected"){se(s.state),Mt([]),xe(s.message||"LocalBridge is unavailable."),Me(null),he(s.message||"LocalBridge is unavailable.");return}try{const[l,u]=await Promise.all([$l(s.baseUrl),Vg(s.baseUrl)]);if(a!==Fe.current)return;const h=Wa(l.rootPath||((i=s.status)==null?void 0:i.workspace));Me(h||null),he(h?null:"LocalBridge workspace path is unavailable."),h&&Ya(k=>ic(h,k)),se("connected"),Mt(u),xe(u.length>0?null:"No local boards found."),f.emit("projectStorage.workspace.refresh",{source:"board-list",path:h||null}),f.emit("localBridge.boards.listed",{count:u.length})}catch(l){if(a!==Fe.current)return;se("unavailable"),Mt([]);const u=l instanceof Error?l.message:String(l);xe(u),he(u)}}},[]),Jn=g.useCallback(async(a="auto",s=!1)=>{var u,h,k,C;const i=Date.now();if(!s&&i-qn.current<Zf)return;qn.current=i;const l=++Ta.current;if(!tt()){ra(j=>({...j,status:"blocked",message:"Hosted LocalBridge access is off."})),f.emit("modelCatalog.refresh.blocked",{source:a,reason:"hosted-access-off"});return}ra(j=>({...j,status:"loading",message:void 0})),f.emit("modelCatalog.refresh.requested",{source:a,force:s});try{const j=await ta();if(l!==Ta.current)return;if(Be(j.status??null),j.state!=="connected"){ra(M=>({...M,status:"error",message:j.message||"LocalBridge is unavailable."})),f.emit("modelCatalog.refresh.unavailable",{source:a,state:j.state,message:j.message});return}const S=Oa(j.status),I=_y(j.status);let E=null;try{E=await gp(S,j.baseUrl)}catch(M){const L=M instanceof Error?M.message:String(M);if(I.length>0){ra({status:"ready",textModels:I,imageModels:[],videoModels:[],source:((h=(u=j.status)==null?void 0:u.exec)==null?void 0:h.modelCatalogSource)||"localbridge-status",updatedAt:(C=(k=j.status)==null?void 0:k.exec)==null?void 0:C.modelCatalogUpdatedAt,message:L}),f.emit("modelCatalog.refresh.statusFallback",{source:a,textModels:I.length,message:L});return}throw M}if(l!==Ta.current)return;const B=Ey(E);B.textModels=Fl(I,B.textModels);const T=E.errors&&E.errors.length>0?E.errors.join(" | "):void 0;ra({status:"ready",...B,source:E.source,updatedAt:E.updatedAt,message:T}),f.emit("modelCatalog.refresh.completed",{source:a,textModels:B.textModels.length,imageModels:B.imageModels.length,videoModels:B.videoModels.length,hasWarnings:!!T})}catch(j){if(l!==Ta.current)return;const S=j instanceof Error?j.message:String(j);ra(I=>({...I,status:"error",message:S})),f.emit("modelCatalog.refresh.failed",{source:a,message:S})}},[]);g.useEffect(()=>{tt()&&(Zt(),Jn("mount",!0))},[Jn,Zt]),g.useEffect(()=>{ka&&(Ca(!0),f.emit("mindcanvas.projectGallery.opened",{source:"startup"}))},[ka]);const du=g.useCallback(()=>{Ca(a=>{const s=!a;return s&&sa.length===0&&Ie!=="checking"&&Zt(),f.emit(s?"mindcanvas.projectGallery.opened":"mindcanvas.projectGallery.closed",{source:"top-tab"}),s})},[sa.length,Ie,Zt]),Et=g.useCallback(a=>{Ca(s=>(s&&f.emit("mindcanvas.projectGallery.closed",{source:a}),!1))},[]),cu=g.useCallback(a=>{No(a),localStorage.setItem(jd,String(a)),f.emit("mindcanvas.projectGallery.startupPreference",{enabled:a})},[]),Gs=g.useCallback(async(a="manual")=>{if(Lo(xr()),!Ce){const s=Oe.cloudBoards.canAttempt?"sign-in-required":Oe.cloudBoards.mode;Ee(s==="sign-in-required"?"Login with Supabase is required before cloud boards can be listed.":"Cloud board adapter is not configured."),f.emit("projectStorage.cloud.unavailable",{reason:s,source:a});return}ia(!0),Ee(null);try{const s=await rh(Ss());Po(s),Ee(s.length>0?`Loaded ${s.length} cloud board${s.length===1?"":"s"}.`:"No cloud boards yet.")}catch(s){Ee(s instanceof Error?s.message:String(s))}finally{ia(!1)}},[Ce,Oe.cloudBoards.canAttempt,Oe.cloudBoards.mode]),Bi=g.useCallback(a=>{Tn(a),f.emit("projectStorage.tab",{tab:a}),a==="cloud"&&Gs("tab")},[Gs]),uu=g.useCallback(()=>{hp(!0),f.emit("runtimeStatus.bridge.hostedAccess.enabled"),Zt()},[Zt]),Uo=g.useCallback(a=>{Me(a),Ya(s=>ic(a,s))},[]),mu=g.useCallback(async(a="manual")=>{var i;const s=++_e.current;if(he(null),f.emit("projectStorage.workspace.refresh.requested",{source:a}),!tt()){Me(null),he("Hosted LocalBridge access is off."),f.emit("projectStorage.workspace.blocked",{source:a,reason:"hosted-access-off"});return}try{const l=await ta();if(s!==_e.current)return;if(Be(l.status??null),l.state!=="connected"){se(l.state),Me(null),he(l.message||"LocalBridge is unavailable.");return}const u=await $l(l.baseUrl);if(s!==_e.current)return;const h=Wa(u.rootPath||((i=l.status)==null?void 0:i.workspace));he(h?null:"LocalBridge workspace path is unavailable."),h&&Uo(h),f.emit("projectStorage.workspace.refresh",{source:a,path:h||null})}catch(l){if(s!==_e.current)return;he(l instanceof Error?l.message:String(l))}},[Uo]),Ks=g.useCallback(async(a,s)=>{const i=Wa(a);if(!i||Te)return;const l=++_e.current;if(qe(!0),he("Switching LocalBridge workspace..."),f.emit("projectStorage.workspace.set.requested",{source:s,path:i}),!tt()){Me(null),he("Hosted LocalBridge access is off."),qe(!1),f.emit("projectStorage.workspace.blocked",{source:s,reason:"hosted-access-off"});return}try{const u=await ta();if(l!==_e.current)return;if(Be(u.status??null),u.state!=="connected"){se(u.state),he(u.message||"LocalBridge is unavailable.");return}const h=Oa(u.status);if(!h){se("unavailable"),he("LocalBridge write token is unavailable.");return}const k=await fp(i,h,u.baseUrl);if(l!==_e.current)return;const C=Wa(k.workspace||i);Uo(C),se("connected"),he(`Local workspace set to ${Cs(C)}.`),f.emit("projectStorage.workspace.set",{source:s,path:C}),Zt()}catch(u){if(l!==_e.current)return;se("unavailable"),he(u instanceof Error?u.message:String(u))}finally{l===_e.current&&qe(!1)}},[Te,Zt,Uo]),pu=g.useCallback(async()=>{const a=++_e.current;if(qe(!0),he("Opening folder picker..."),f.emit("projectStorage.workspace.browse.requested",{path:Ae||null}),!tt()){Me(null),he("Hosted LocalBridge access is off."),qe(!1),f.emit("projectStorage.workspace.blocked",{source:"browse",reason:"hosted-access-off"});return}try{const s=await ta();if(a!==_e.current)return;if(Be(s.status??null),s.state!=="connected"){se(s.state),he(s.message||"LocalBridge is unavailable.");return}const i=Oa(s.status),l=await bp(Ae,i,s.baseUrl);if(a!==_e.current)return;if(l.canceled||!l.success||!l.path){he("Workspace selection cancelled."),f.emit("projectStorage.workspace.browse.cancelled");return}f.emit("projectStorage.workspace.browse",{path:l.path}),qe(!1),await Ks(l.path,"browse")}catch(s){if(a!==_e.current)return;he(s instanceof Error?s.message:String(s))}finally{a===_e.current&&qe(!1)}},[Ks,Ae]),gu=g.useCallback(async()=>{var s,i;const a=++Fe.current;if(Ht(!0),xe(null),(s=v.current.source)!=null&&s.partialImport){xe("This imported board came from a partial original payload, so export is blocked to avoid data loss."),Ht(!1);return}if((i=v.current.source)!=null&&i.truncated){xe("This imported board was truncated, so export is blocked to avoid data loss."),Ht(!1);return}if(!tt()){se("blocked"),Be(null),xe("Hosted LocalBridge access is off."),Ht(!1);return}try{const l=await ta();if(a!==Fe.current)return;if(Be(l.status??null),l.state!=="connected"){se(l.state),xe(l.message||"LocalBridge is unavailable.");return}const u=Oa(l.status);if(!u){se("unavailable"),xe("LocalBridge write token is unavailable.");return}const h=await Gg(v.current,ie.current,u,l.baseUrl,He.current);if(a!==Fe.current)return;const k=Ua({...v.current,nodes:h.nodes,source:h.source,updatedAt:h.metadata.UpdatedAt||new Date().toISOString()},He.current);r(k),ea(k),Ye(kt()),se("connected"),Mt(C=>[h.metadata,...C.filter(j=>j.Id!==h.metadata.Id)]),xe(`Exported "${at(h.metadata.Title)}" to LocalBridge.`)}catch(l){if(a!==Fe.current)return;se("unavailable"),xe(l instanceof Error?l.message:String(l))}finally{a===Fe.current&&Ht(!1)}},[]),Ke=g.useCallback((a,s,i={})=>{const l=Kl(a),u=Ol(l),h=Gl(u);c(k=>$a(k,v.current,{description:"Activate board"})),y([]),r(h),b(h.nodes[0]?[h.nodes[0].id]:[]),oe(null),It(null),X(null),Et("board-activate"),f.emit(s,{boardId:h.id,...i})},[Et]),Di=g.useCallback(()=>{const a=Jd(v.current.settings);Ke(a,"board.local.create"),te({x:540,y:210,scale:1})},[Ke,te]),hu=g.useCallback(async a=>{if(!Ce){Ee("Login with Supabase is required before cloud boards can be opened."),f.emit("projectStorage.cloud.unavailable",{reason:"sign-in-required",source:"load-board"});return}Eo(a.id),Ee(null);try{const s=await ih(Ss(),a.id,v.current.settings);if(!s){Ee("Cloud board was not found or is not available to this user.");return}Ke(s,"board.cloud.switch",{sourceBoardId:a.id}),te({x:540,y:210,scale:1})}catch(s){Ee(s instanceof Error?s.message:String(s))}finally{Eo(null)}},[Ke,te,Ce]),zo=g.useCallback(async(a,s)=>{if(!Ce){Ee("Login with Supabase is required before cloud boards can be saved."),f.emit("projectStorage.cloud.unavailable",{reason:"sign-in-required",source:s});return}ia(!0),Ee(null);try{const i=await lh(Ss(),a,ie.current,He.current);if(!i){Ee("Cloud board save did not return a board.");return}const l=new Date().toISOString(),u=Ua({...a,id:i.id,name:i.name,updatedAt:i.updatedAt,source:{kind:"cloud",boardId:i.id,loadedAt:l,snapshotFormat:"supabase.boards.content_json",originalNodeCount:a.nodes.length,renderedNodeCount:a.nodes.length}},He.current);r(u),ea(u),Ye(kt()),Po(h=>[i,...h.filter(k=>k.id!==i.id)]),Ee(`Saved "${at(i.name)}" to cloud.`)}catch(i){Ee(i instanceof Error?i.message:String(i))}finally{ia(!1)}},[Ce]),fu=g.useCallback(()=>{zo(v.current,"save-current")},[zo]),bu=g.useCallback(()=>{const a=Jd(v.current.settings);zo(a,"new-cloud-board")},[zo]),yu=g.useCallback(()=>{var l;if(!re)return;if(re.options.length>0||!re.quickCreateTemplateId){const u=ie.current,h=Ue(),k={x:(h.width/2-u.x)/u.scale,y:(h.height/2-u.y)/u.scale},C=v.current.nodes,j=C.length?Math.max(...C.map(M=>M.x+M.width)):k.x-280-bs,S=C.length?Math.min(...C.map(M=>M.y)):k.y-310,I=yp(re,rt,j+bs,S,Kt,v.current.settings.appLanguage);r(M=>{var L;return c(J=>$a(J,M,{description:"Create template card"})),y([]),f.emit("templateCard.node.create",{id:I.id,launcherId:re.id,optionId:((L=I.metadata)==null?void 0:L.templateLauncherSelectedOptionId)??null,source:"launcher-panel"}),{...M,nodes:[...M.nodes,I],updatedAt:new Date().toISOString()}}),b([I.id]);const E=Math.min(ie.current.scale,ge((h.height-190)/I.height,.72,1)),B=Math.max(320,h.height-180);te({...ie.current,scale:E,x:h.width/2-(I.x+I.width/2)*E,y:48+B/2-(I.y+I.height/2)*E}),W(I.id),window.setTimeout(()=>W(M=>M===I.id?null:M),1e3),Gt(!1),Qe(null);const T="Template card added to the current canvas.";ke(T),window.setTimeout(()=>{ke(M=>M===T?null:M)},2200),f.emit("templateCard.node.focus",{nodeId:I.id,launcherId:re.id});return}const s=ls(Ge,Kt);if(s){Qe(s),f.emit("template.validation.failed",{launcherId:re.id,optionId:rt,templateId:(Ge==null?void 0:Ge.id)??null,message:s});return}const i=xp(re,rt,Kt,v.current.settings);if(!i){const u="Template could not be created.";Qe(u),f.emit("template.validation.failed",{launcherId:re.id,optionId:rt,templateId:(Ge==null?void 0:Ge.id)??null,message:u});return}Ke(i.board,"template.board.create",{launcherId:i.launcher.id,optionId:((l=i.option)==null?void 0:l.id)??null,templateId:i.template.id,nodes:i.board.nodes.length}),te({x:540,y:210,scale:1}),Gt(!1),Qe(null)},[Ke,Ge,re,te,Ue,rt,Kt]),Oi=g.useCallback(a=>{if(a===v.current.id){Et("stored-board-current");return}const s=tp(a);s&&(Ke(s,"board.local.switch"),te({x:540,y:210,scale:1}))},[Ke,te,Et]),Xs=g.useCallback((a,s="unknown")=>{if(a===v.current.id){f.emit("board.tabs.closeIgnored",{boardId:a,source:s,reason:"active-board"});return}f.emit("board.tabs.close",{boardId:a,source:s}),ap(a),Ye(kt())},[]),xu=g.useCallback((a,s)=>{if(!a||!s||a===s)return;ea(Ua(v.current,He.current));const i=kt(),l=nn.map(I=>I.id),u=l.indexOf(a),h=l.indexOf(s);if(u<0||h<0)return;const k=[...l],C=k.splice(u,1)[0];if(!C)return;k.splice(h,0,C);const j=i.map(I=>I.id).filter(I=>!k.includes(I)),S=np([...k,...j]);Ye(S),f.emit("board.tabs.drop",{sourceId:a,targetId:s,visibleIds:k})},[nn]),Cu=g.useCallback(async a=>{const s=++Fe.current;Ln(a.Id),xe(null);try{const i=await Kg(a,v.current.settings);if(s!==Fe.current)return;Ke(i,"board.localBridge.switch",{sourceBoardId:a.Id});const l=Kr(a.LastCameraX,a.LastCameraY,a.LastCameraZ);te(l?{...l,scale:ge(l.scale,vs,js)}:{x:540,y:210,scale:1})}catch(i){if(s!==Fe.current)return;xe(i instanceof Error?i.message:String(i))}finally{s===Fe.current&&Ln(null)}},[Ke,te]),ku=g.useCallback(()=>{var a;(a=Gn.current)==null||a.click()},[]),Su=g.useCallback(async a=>{var i;const s=Array.from(a??[]).filter(l=>/\.json$/i.test(l.name));if(s.length===0){ke("Choose a React or MindExec board JSON file."),window.setTimeout(()=>ke(null),1800);return}try{const l=await Promise.all(s.map(async I=>({file:I,payload:JSON.parse(await I.text())}))),u=l.find(Ur),h=ny(l),k=l.find(I=>!Ur(I)&&Fr(I.payload))??l.find(I=>!Ur(I)&&kc(I.payload)>0);if(!k)throw new Error("No board JSON file was found.");const C=Fr(k.payload)?null:oy(k,h),j=C?Kr(C.metadata.LastCameraX,C.metadata.LastCameraY,C.metadata.LastCameraZ):null,S=Fr(k.payload)?ay(k.payload,k.file.name):wc(k.payload,v.current.settings,{boardId:(C==null?void 0:C.metadata.Id)??Os(k.file.name),title:(C==null?void 0:C.metadata.Title)||Os(k.file.name),updatedAt:C==null?void 0:C.metadata.UpdatedAt,layoutPayload:u==null?void 0:u.payload,cameraBookmarks:C==null?void 0:C.metadata.CameraBookmarks,lastCursorX:C==null?void 0:C.metadata.LastCursorX,lastCursorY:C==null?void 0:C.metadata.LastCursorY});if(S.nodes.length===0)throw new Error("The selected file did not contain any importable board nodes.");Ke(S,"board.import.file",{fileName:k.file.name,layoutFileName:(u==null?void 0:u.file.name)??null,metadataFileName:(C==null?void 0:C.fileName)??null,nodes:S.nodes.length,edges:S.edges.length,sourceKind:((i=S.source)==null?void 0:i.kind)??null,originalBoardId:(C==null?void 0:C.metadata.Id)??null,cameraRestored:!!j}),ea(S),Ye(kt()),te(j?{...j,scale:ge(j.scale,vs,js)}:{x:540,y:210,scale:1}),ke(`Imported "${at(S.name)}".`),window.setTimeout(()=>ke(null),2200)}catch(l){const u=l instanceof Error?l.message:String(l);ke(`Import failed: ${u}`),f.emit("board.import.failed",{message:u}),window.setTimeout(()=>ke(null),3200)}},[Ke,te]);g.useEffect(()=>{te(ie.current,!1)},[te]);const xt=g.useCallback((a,s)=>{const i=ie.current,l=yt(a,s);return{x:(l.x-i.x)/i.scale,y:(l.y-i.y)/i.scale}},[yt]),Ho=g.useCallback((a,s,i={})=>{if(!Ld(a))return null;const l=i.snap??v.current.settings.gridSnap??!0,u=yb(a,l);if(He.current=u,ot(u),r(h=>{const k=Er(h);return k&&k.x===u.x&&k.y===u.y?h:{...Ua(h,u),updatedAt:new Date().toISOString()}}),f.emit("canvas.cursor.update",{reason:s,x:Math.round(u.x),y:Math.round(u.y),snapped:l,cameraTraceMode:v.current.settings.cameraTraceMode??"none"}),i.moveCamera&&i.cameraTarget&&Ld(i.cameraTarget)){const h=ie.current.scale,k=Ue();te({...ie.current,x:k.width/2-i.cameraTarget.x*h,y:k.height/2-i.cameraTarget.y*h}),f.emit("canvas.cursor.cameraTrace",{reason:s,targetX:Math.round(i.cameraTarget.x),targetY:Math.round(i.cameraTarget.y)})}return u},[te,Ue]),Wo=g.useCallback((a,s,i)=>{const l=xt(a,s);return!!Ho(l,i,{snap:v.current.settings.gridSnap??!0})},[xt,Ho]),je=g.useCallback((a,s,i={})=>{var I;const l=i.width??300,u=i.height??160,h=Number.isFinite(a)&&Number.isFinite(s);if(!h&&(i.preferCursor??!0)&&v.current.settings.cursorMode==="lastNode")return{...He.current};const k=(I=qt.current)==null?void 0:I.getBoundingClientRect(),C=k?k.left+k.width/2:window.innerWidth/2,j=i.centerClientY??(k?k.top+k.height/2:window.innerHeight/2),S=h?xt(a,s):xt(C,j);return{x:S.x-l/2,y:S.y-u/2}},[xt]),Se=g.useCallback((a,s)=>{const i=v.current.settings.cursorDirection==="down"?"down":"right",l=i==="down"?{x:a.x,y:a.y+a.height+Id}:{x:a.x+a.width+Id,y:a.y};Ho(l,s,{cameraTarget:_r(a),moveCamera:v.current.settings.cameraTraceMode==="cursor",snap:v.current.settings.gridSnap??!0}),f.emit("canvas.cursor.moveAfterNodePlacement",{reason:s,nodeId:a.id,direction:i,nextX:Math.round(l.x),nextY:Math.round(l.y)})},[Ho]),wu=g.useCallback(a=>{Ms(a.target)||($.current={clientX:a.clientX,clientY:a.clientY})},[]),F=g.useCallback((a,s,i={})=>{r(l=>{c(h=>$a(h,l,{description:s,mergeKey:typeof i.mergeKey=="string"?i.mergeKey:null})),y([]);const u=a(l);return f.emit(s,i),{...u,updatedAt:new Date().toISOString()}})},[]);g.useEffect(()=>{const a=$p();if(!a)return;const{sourceNode:s,itemNodes:i,taskNode:l,edges:u}=Fp(a,{...je(void 0,void 0,{width:780,height:290})});if(v.current.nodes.some(h=>{var k;return((k=h.metadata)==null?void 0:k.ToolHandoffId)===a.id})){Yl(a.id),f.emit("tool.handoff.duplicateIgnored",{handoffId:a.id,toolKey:a.toolKey});return}F(h=>({...h,nodes:[...h.nodes,s,...i,l],edges:[...h.edges,...u]}),"tool.handoff.consumed",{handoffId:a.id,toolKey:a.toolKey,createdNodes:2+i.length,resultItems:i.length}),Yl(a.id),b([l.id]),W(l.id),Se(l,"tool.handoff.consumed"),window.setTimeout(()=>W(h=>h===l.id?null:h),1400)},[F,je,Se]);const mn=g.useCallback((a,s,i={})=>{r(l=>{const u=a(l);return f.emit(s,i),{...u,updatedAt:new Date().toISOString()}})},[]),qs=g.useCallback(a=>{const s=a.slice(0,90);mn(i=>({...i,name:s}),"board.rename",{boardId:v.current.id})},[mn]),Re=g.useCallback((a,s="inline")=>{const i=typeof a.appLanguage=="string"?{...a,appLanguage:hi(a.appLanguage)}:a;if(mn(l=>{const u={...l.settings,...i};if(typeof i.appLanguage=="string"){const h=Cp(l.nodes,u.appLanguage);return h.changed&&f.emit("template.localization.relocalized",{appLanguage:h.language,nodeCount:h.nodes.length,source:s}),{...l,settings:u,nodes:h.nodes}}return{...l,settings:u}},"settings.patch",{keys:Object.keys(i),source:s}),typeof i.appLanguage=="string"){const l=kp(i.appLanguage);f.emit("appLanguage.select",{appLanguage:l,source:s})}if(typeof i.model=="string"){const l=na(i.model),u=cc(l);f.emit("textModel.select",{model:l,provider:(u==null?void 0:u.provider)??"custom",source:s})}if(typeof i.executionMode=="string"||typeof i.directInstructionQueueMode=="string"){const l={...v.current.settings,...i};Up(l,s)}zp({...v.current.settings,...i})},[mn]),$i=g.useCallback((a,s)=>{Re({[a]:s},`inline.${String(a)}`)},[Re]),Vo=g.useMemo(()=>Fl(Sp,Ut.textModels),[Ut.textModels]),Fi=g.useMemo(()=>wp(n.settings,Vo),[n.settings,Vo]),_t=g.useMemo(()=>{const a=jy(Vo);return{Image:Ul("Image",uo("Image"),a,Ut.imageModels),Video:Ul("Video",uo("Video"),Ut.videoModels)}},[Ut.imageModels,Ut.videoModels,Vo]);g.useEffect(()=>{La.current=_t},[_t]);const Js=g.useMemo(()=>vo(n.settings,"Image",_t),[n.settings,_t]),Zs=g.useMemo(()=>vo(n.settings,"Video",_t),[n.settings,_t]),vu=na(n.settings.model),ju=g.useMemo(()=>zr(Fi,"Text",n.settings),[n.settings,Fi]),Iu=g.useMemo(()=>zr(uo("Image",_t),"Image",n.settings),[n.settings,_t]),Nu=g.useMemo(()=>zr(uo("Video",_t),"Video",n.settings),[n.settings,_t]),Au=g.useMemo(()=>ac(Js.aspectOptions),[Js.aspectOptions]),Mu=g.useMemo(()=>ac(Zs.aspectOptions),[Zs.aspectOptions]),Tu=g.useMemo(()=>Iy(),[]),Ru=g.useCallback((a,s="bottom-input")=>{const i=na(a);Re({model:i},`connection.model.${s}`)},[Re]),Lu=g.useCallback((a,s)=>{const i=uc(a,s),l=uo(a,La.current).find(j=>j.id===i);if(!l)return;const u=v.current.settings,h=a==="Image"?u.imageRouterImageAspectPresetId:u.imageRouterVideoAspectPresetId,k=Wr(a,l,h),C=a==="Image"?{imageRouterImageModel:l.id,imageRouterImageAspectPresetId:k.id}:{imageRouterVideoModel:l.id,imageRouterVideoAspectPresetId:k.id};Re(C,`inline.${a.toLowerCase()}Model`),f.emit("media.model.select",{mode:a,model:l.id,aspectPresetId:k.id,requestedSize:Vr(k)})},[Re]),Pu=g.useCallback((a,s)=>{const i=mc(a,v.current.settings,La.current),l=Wr(a,i,s),u=a==="Image"?{imageRouterImageAspectPresetId:l.id}:{imageRouterVideoAspectPresetId:l.id};Re(u,`inline.${a.toLowerCase()}Aspect`),f.emit("media.aspect.select",{mode:a,model:i.id,aspectPresetId:l.id,requestedSize:Vr(l)})},[Re]),Eu=g.useCallback(()=>{Fn(!0),f.emit("settings.dialog.open",{boardId:v.current.id})},[]),_u=g.useCallback(()=>{Fn(!1),f.emit("settings.dialog.close",{boardId:v.current.id})},[]),Ui=g.useCallback(()=>{me(!0),f.emit("promptDebug.open",{boardId:v.current.id})},[]),Bu=g.useCallback(()=>{me(!1),f.emit("promptDebug.close",{boardId:v.current.id})},[]);g.useEffect(()=>()=>{t==null||t([])},[t]),g.useEffect(()=>{t&&t([{id:"mindcanvas-prompt-debug",label:"Prompt Debugger",description:"Inspect prompt and local diagnostics",icon:tg,onClick:Ui,active:wa,testId:"prompt-debug-open"}])},[t,Ui,wa]);const Du=g.useCallback(a=>{const s=v.current.settings.appLanguage,i=io(a,s);if(!i)return;const l=is(i),u=co(i,l==null?void 0:l.id,s);Bo(i.id),Za((l==null?void 0:l.id)??null),Qa(lo(u)),Qe(null),f.emit("template.launcher.select",{launcherId:i.id,optionId:(l==null?void 0:l.id)??null,templateId:(u==null?void 0:u.id)??null})},[]),Ou=g.useCallback(()=>{const a=v.current.settings.appLanguage,s=io(da,a)??ja[0];if(!s)return;const i=is(s,rt),l=co(s,i==null?void 0:i.id,a);Bo(s.id),Za((i==null?void 0:i.id)??null),Qa(u=>Object.keys(u).length>0?u:lo(l)),Qe(null),tn(!1),lt(!1),Gt(!0),f.emit("template.launcher.open",{launcherId:s.id,optionId:(i==null?void 0:i.id)??null,templateId:(l==null?void 0:l.id)??null})},[da,rt,ja]),$u=g.useCallback(()=>{Gt(!1),Qe(null),f.emit("template.launcher.close",{launcherId:da})},[da]),Fu=g.useCallback(a=>{if(!re)return;const s=co(re,a,v.current.settings.appLanguage);Za(a),Qa(lo(s)),Qe(null),f.emit("template.option.select",{launcherId:re.id,optionId:a,templateId:(s==null?void 0:s.id)??null})},[re]),Uu=g.useCallback((a,s)=>{Qa(i=>({...i,[a]:s})),Wn&&Qe(null),f.emit("template.input.patch",{launcherId:re==null?void 0:re.id,key:a})},[re==null?void 0:re.id,Wn]),Xe=g.useCallback(a=>{$o(a),window.setTimeout(()=>{$o(s=>s===a?null:s)},2600)},[]),zu=g.useCallback(()=>{Gt(!1),lt(!1),Ia(a=>{const s=!a;return f.emit(s?"templateStudio.chooser.open":"templateStudio.chooser.close",{boardId:v.current.id,studioOpen:en}),s})},[en]),zi=g.useCallback(()=>{Ia(!1),f.emit("templateStudio.chooser.close",{boardId:v.current.id})},[]),Hi=g.useCallback(()=>{const a=v.current;Gt(!1),lt(!1),Ia(!1),Do(Ad(a.id,a.name)),it(null),tn(!0),f.emit("templateStudio.open",{boardId:a.id,nodeCount:a.nodes.length})},[]),Yo=g.useCallback(a=>{const s=v.current,i=ds(Ne,s.nodes);it(i),Md(s.id,Ne);const l=ea(Ua(s,He.current));return Ye(kt()),f.emit(a==="exit"?"templateStudio.draft.exitSave":"templateStudio.draft.save",{boardId:s.id,templateId:i.template.id,issues:i.issues.length,nodes:i.template.nodes.length,saved:l}),i},[Ne]),Wi=g.useCallback(()=>{Yo("exit"),tn(!1),Ia(!1),lt(!1),it(null),f.emit("templateStudio.close",{boardId:v.current.id})},[Yo]),Hu=g.useCallback(()=>{const a=dy(v.current.settings),s=ks(a.name);Ia(!1),lt(!1),Do(s),it(null),tn(!0),Md(a.id,s),ea(a),Ye(kt()),Ke(a,"templateStudio.board.create",{templateId:s.templateId,source:"template-studio-chooser"}),te({x:540,y:210,scale:1}),f.emit("templateStudio.chooser.startNew",{boardId:a.id,templateId:s.templateId}),Xe("New Template Studio draft board opened.")},[Ke,te,Xe]),Wu=g.useCallback(()=>{Hi(),f.emit("templateStudio.chooser.convertCurrent",{boardId:v.current.id,nodes:v.current.nodes.length}),Xe("Current board is now in Template Studio mode.")},[Hi,Xe]),Go=g.useCallback((a,s)=>{Do(i=>{const l={...i,[a]:a==="templateId"?yo(s):s};return f.emit("templateStudio.draft.patch",{key:a}),l}),it(null)},[]),Vu=g.useCallback(()=>{const a=Yo("save");Xe(a.issues.length>0?"Template draft saved with manifest issues.":"Template draft and board saved locally.")},[Yo,Xe]),Yu=g.useCallback(a=>{const s=Q("node"),i=zl(a),l=`${a.replace("template.","")}-${Date.now().toString(36)}`,u=a==="template.input",h=u?300:a==="template.prompt"?360:340,k=u?178:a==="template.prompt"?214:190,C=je(void 0,void 0,{width:h,height:k}),j={[K.studioNodeType]:a,[K.templateNodeId]:l,[K.templateRole]:a.replace(/^template\./,""),[K.compileTarget]:i,Source:"template-studio"};u&&(j[K.inputKey]=l,j[K.inputType]="text",j[K.inputRequired]="true");const S={id:s,kind:a==="template.prompt"?"ai-task":a==="template.section"?"markdown":"note",title:br(a),body:u?"Defines a value requested before template board creation.":a==="template.prompt"?"Write the prompt instruction. Use {{input_key}} placeholders for Template Studio inputs.":"Write the reusable canvas content for this template node.",x:C.x,y:C.y,width:h,height:k,status:a==="template.prompt"?"idle":void 0,tags:["Template Studio",br(a)],metadata:j};F(I=>({...I,nodes:[...I.nodes,S]}),"templateStudio.node.add",{id:S.id,studioNodeType:a,compileTarget:i}),b([S.id]),it(null),Se(S,"templateStudio.node.add")},[F,je,Se]),Qs=g.useCallback(()=>{const a=ds(Ne,v.current.nodes);return it(a),f.emit("templateStudio.compile",{templateId:a.template.id,inputs:a.template.inputs.length,nodes:a.template.nodes.length,issues:a.issues.length}),Xe(a.issues.length>0?"Template manifest has issues.":"Template manifest compiled."),a},[Xe,Ne]),Gu=g.useCallback(async()=>{const a=fe??ds(Ne,v.current.nodes);fe||it(a);const s=await xo(a.manifestJson);f.emit("templateStudio.manifest.copy",{templateId:a.template.id,chars:a.manifestJson.length,method:s}),Xe("Template manifest copied.")},[Xe,Ne,fe]),Ku=g.useCallback(()=>{const a=Qs();if(a.issues.length>0){lt(!1),f.emit("templateStudio.test.open.blocked",{templateId:a.template.id,issues:a.issues.length}),Xe("Fix manifest issues before test create.");return}Na(lo(a.template)),ca(null),lt(!0),f.emit("templateStudio.test.open",{templateId:a.template.id,inputs:a.template.inputs.length,nodes:a.template.nodes.length})},[Qs,Xe]),Xu=g.useCallback(()=>{lt(!1),Na({}),ca(null),f.emit("templateStudio.test.close",{templateId:(fe==null?void 0:fe.template.id)??null})},[fe==null?void 0:fe.template.id]),qu=g.useCallback((a,s)=>{Na(i=>({...i,[a]:s})),an&&ca(null),f.emit("templateStudio.test.input.patch",{key:a})},[an]),Ju=g.useCallback(()=>{const a=(fe==null?void 0:fe.issues.length)===0?fe:ds(Ne,v.current.nodes);if(it(a),a.issues.length>0){ca("Fix manifest issues before creating a test board."),f.emit("templateStudio.test.board.blocked",{templateId:a.template.id,issues:a.issues.length});return}const s=ls(a.template,Xt);if(s){ca(s),f.emit("templateStudio.test.board.blocked",{templateId:a.template.id,message:s});return}const i=Td(Ne),l=vp(i,void 0,a.template,Xt,v.current.settings);ea(l.board),ea(Ua(v.current,He.current)),Ye(kt()),lt(!1),Na({}),Xe(`Created test board: ${l.board.name}`),f.emit("templateStudio.test.board.create",{templateId:a.template.id,boardId:l.board.id,nodes:l.board.nodes.length})},[Xe,Ne,fe,Xt]),Zu=g.useCallback((a,s)=>{b(i=>s?i.includes(a)?i.filter(l=>l!==a):[...i,a]:[a]),oe(null)},[]),Qu=g.useCallback(()=>{var u,h,k,C,j,S,I,E;const i=je(void 0,void 0,{width:500,height:300,centerClientY:ge(window.innerHeight*.58,182,Math.max(182,window.innerHeight-150-96))}),l={id:Q("node"),kind:"memo",title:"Agent",body:rb,x:i.x,y:i.y,width:500,height:300,tags:["Agent Command","Researcher","Draft"],metadata:gy()};F(B=>({...B,nodes:[...B.nodes,l]}),"agentCommand.node.add",{id:l.id,semanticType:(u=l.metadata)==null?void 0:u.SemanticType,status:(h=l.metadata)==null?void 0:h.AgentCommandStatus,requestedRole:(k=l.metadata)==null?void 0:k.AgentCommandRequestedRole,adapterState:(C=l.metadata)==null?void 0:C.AdapterState}),f.emit("mindcanvas.agentCommand.add",{id:l.id,semanticType:(j=l.metadata)==null?void 0:j.SemanticType,status:(S=l.metadata)==null?void 0:S.AgentCommandStatus,requestedRole:(I=l.metadata)==null?void 0:I.AgentCommandRequestedRole,adapterState:(E=l.metadata)==null?void 0:E.AdapterState}),b([l.id]),oe(null),W(l.id),Se(l,"agentCommand.node.add"),window.setTimeout(()=>W(B=>B===l.id?null:B),1200)},[F,je,Se]),em=g.useCallback(()=>{var u,h,k,C,j,S,I,E;const i=je(void 0,void 0,{width:400,height:300,centerClientY:ge(window.innerHeight*.56,182,Math.max(182,window.innerHeight-150-96))}),l={id:Q("node"),kind:"memo",title:"Code Note",body:sb,x:i.x,y:i.y,width:400,height:300,tags:["Code Note","Draft","Unlinked"],metadata:hy()};F(B=>({...B,nodes:[...B.nodes,l]}),"codeNote.node.add",{id:l.id,semanticType:(u=l.metadata)==null?void 0:u.SemanticType,status:(h=l.metadata)==null?void 0:h.CodeNoteStatus,syncState:(k=l.metadata)==null?void 0:k.CodeNoteSyncState,adapterState:(C=l.metadata)==null?void 0:C.AdapterState}),f.emit("mindcanvas.codeNote.add",{id:l.id,semanticType:(j=l.metadata)==null?void 0:j.SemanticType,status:(S=l.metadata)==null?void 0:S.CodeNoteStatus,syncState:(I=l.metadata)==null?void 0:I.CodeNoteSyncState,adapterState:(E=l.metadata)==null?void 0:E.AdapterState}),b([l.id]),oe(null),W(l.id),Se(l,"codeNote.node.add"),window.setTimeout(()=>W(B=>B===l.id?null:B),1200)},[F,je,Se]),we=g.useCallback((a,s)=>{var I,E,B,T,M,L,J,Le,be;if(a==="remote-monitor"){const Z=v.current.nodes.find(za);if(Z){const gn=_r(Z),Da=ie.current.scale,ss=Ue(),rs=_d(Z.height,window.innerHeight);te({...ie.current,x:ss.width/2-gn.x*Da,y:rs-gn.y*Da}),b([Z.id]),W(Z.id),window.setTimeout(()=>W(ha=>ha===Z.id?null:ha),1e3);const so="Remote monitor already exists on this board. Focused existing node.";ke(so),window.setTimeout(()=>{ke(ha=>ha===so?null:ha)},2200),f.emit("remoteMonitor.node.duplicateIgnored",{action:"toolbar-add",nodeId:Z.id,surface:"mindcanvas-node"});return}}const i=s?Mi[s]:null,l=(i==null?void 0:i.mode)??(a==="image"?"Image":a==="video"?"Video":null),u=l?vo(v.current.settings,l):null,h=i?i.width:a==="remote-monitor"?860:a==="remote-control"?560:a==="csv-table"?720:a==="embed"?460:a==="markdown"?400:a==="image"||a==="mask"?360:a==="ai-task"?340:a==="pdf"||a==="file"||a==="directory"?300:320,k=i?i.height:a==="remote-monitor"?640:a==="remote-control"?390:a==="csv-table"?420:a==="embed"||a==="markdown"||a==="image"||a==="mask"?260:a==="ai-task"?196:a==="pdf"||a==="file"||a==="directory"?154:176,C=a==="remote-monitor"?_d(k,window.innerHeight):window.innerHeight/2,j=je(void 0,void 0,{width:h,height:k,centerClientY:C}),S={id:Q("node"),kind:a,title:i?i.title:a==="ai-task"?"AI Task":a==="remote-monitor"?"Multi Desktop Monitor":a==="remote-control"?"Remote Device":a==="image"?"Image":a==="mask"?"Image Mask":a==="video"?"Video":a==="embed"?"Web Embed":a==="csv-table"?"CSV Table":a==="pdf"?"PDF Document":a==="file"?"File":a==="directory"?"Directory":a==="memo"?"Memo":a==="markdown"?"Markdown":a==="code"?"Code Note":"Note",body:i?i.body:a==="ai-task"?"Describe the work this task should perform.":a==="remote-monitor"?"RemoteHub monitor node. Frames and input stay adapter-gated until LocalBridge is connected.":a==="remote-control"?"Remote device control node. Frames and input stay adapter-gated until LocalBridge is connected.":a==="image"?"Describe the image to generate or attach the visual reference here.":a==="mask"?"Image edit mask reference. Attach or paste a mask image here.":a==="video"?"Describe the video shot, motion, and duration target here.":a==="embed"?"https://example.com/":a==="csv-table"?`Metric,Value,Stage
|
|
43
|
+
Leads,42,Validation
|
|
44
|
+
Trials,7,Launch
|
|
45
|
+
Revenue,120,Learning`:a==="pdf"?"https://example.com/document.pdf":a==="file"?"https://example.com/file":a==="directory"?"LocalBridge directory reference. Include and exclude patterns are stored with this node.":a==="memo"?"Capture a quick thought, reminder, or visual note here.":a==="markdown"?`# Markdown note
|
|
46
|
+
|
|
47
|
+
Write structured notes, docs, or prompt context here.`:"Write the thought, evidence, or reusable context here.",x:j.x,y:j.y,width:h,height:k,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"?si:void 0,metadata:i?my(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-ai",RemoteFleetManagerVersion:"",RemoteFleetAgentPackage:"@mindexec/remote",RemoteFleetPairTokenPreview:"<pair-token>",RemoteFleetConnectCommand:"npx @mindexec/remote connect --manager 127.0.0.1:5197 --pair <pair-token>",RemoteFleetDeviceCount:"30",RemoteFleetConnectedDeviceCount:"0",RemoteFleetCanvasPagination:"node-window:1/1",RemoteFleetHostTargetState:"inactive",RemoteFleetLastError:"Hosted LocalBridge access is gated.",RemoteHub:"Gated",RemoteRoute:"Gated",RemoteConnected:"0",RemoteTotal:"30",RemotePage:"1/1",RemotePageStart:"0",RemoteVisibleBudget:"30",RemoteSelectedDeviceId:"",RemoteInput:"Off",RemoteTasksQueued:"0",RemoteAiDevices:"0",RemoteBaseUrl:"http://127.0.0.1:5147",AdapterState:"adapter-gated"}:a==="remote-control"?{SemanticType:"RemoteFleetDevice",RemoteFleetSchemaVersion:"remote-fleet-device@1",RemoteFleetDeviceId:"",RemoteFleetDeviceName:"Remote Device",RemoteFleetDevicePlatform:"unknown",RemoteFleetDeviceConnected:"false",RemoteInput:"Off",RemoteBaseUrl:"http://127.0.0.1:5147",AdapterState:"adapter-gated"}:a==="embed"?{source:"embed",embedType:"webpage",provider:"web",renderMode:"card",aspectRatio:"auto",sourceUrl:"https://example.com/",url:"https://example.com/",iframeAllowed:"false",iframeBlockedReason:"react-card-shell",captureStatus:"idle",captureProvider:"cloudflare-browser-run",AdapterState:"local-reference"}:l?Pi(v.current.settings,l):void 0};F(Z=>({...Z,nodes:[...Z.nodes,S]}),"node.add",{id:S.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:S.id,kind:i.kind,mode:i.mode,model:(I=S.metadata)==null?void 0:I.MediaModel,aspectPresetId:(E=S.metadata)==null?void 0:E.AspectPresetId,requestedSize:(B=S.metadata)==null?void 0:B.RequestedSize,adapterState:((T=S.metadata)==null?void 0:T.AdapterState)??"adapter-gated",externalActionPolicy:((M=S.metadata)==null?void 0:M.AutomationExternalActionPolicy)??"spec-only-until-review"}),a==="remote-monitor"&&f.emit("remoteMonitor.node.add",{id:S.id,surface:"mindcanvas-node",width:S.width,height:S.height,adapterState:((L=S.metadata)==null?void 0:L.AdapterState)??"adapter-gated"}),a==="mask"&&f.emit("node.mask.add",{id:S.id,hasImage:!!S.imageUrl,imageRouterMask:((J=S.metadata)==null?void 0:J.ImageRouterMask)??"true",semanticType:((Le=S.metadata)==null?void 0:Le.SemanticType)??"ImageEditMask",adapterState:((be=S.metadata)==null?void 0:be.AdapterState)??"adapter-gated"}),b([S.id]),Se(S,"node.add")},[te,F,je,Se]),ne=g.useCallback((a,s)=>{mn(i=>({...i,nodes:i.nodes.map(l=>l.id===a?{...l,...s}:l)}),"node.patch",{id:a,keys:Object.keys(s)})},[mn]),Qt=g.useCallback((a,s)=>{const i=q.current[0],l=v.current.nodes.find(u=>u.id===i);l&&(ne(i,{metadata:{...l.metadata??{},[a]:a===K.templateNodeId||a===K.inputKey?yo(s):s}}),it(null),f.emit("templateStudio.node.metadata.patch",{id:i,key:a}))},[ne]),Vi=g.useCallback(a=>{var h;const s=q.current[0],i=v.current.nodes.find(k=>k.id===s);if(!i)return;const l=((h=i.metadata)==null?void 0:h[K.templateNodeId])||yo(i.title),u={...i.metadata??{},[K.studioNodeType]:a,[K.templateNodeId]:l,[K.templateRole]:a.replace(/^template\./,""),[K.compileTarget]:zl(a,i)};a==="template.input"&&(u[K.inputKey]=u[K.inputKey]||yo(i.title),u[K.inputType]=u[K.inputType]||"text",u[K.inputRequired]=u[K.inputRequired]||"true"),ne(s,{metadata:u}),it(null),f.emit("templateStudio.node.role.assign",{id:s,studioNodeType:a})},[ne]),A=g.useCallback(a=>{ke(a),window.setTimeout(()=>{ke(s=>s===a?null:s)},2200)},[]),tm=g.useCallback((a,s,i)=>{var S;const l=v.current.nodes.find(I=>I.id===a);if(!l)return;const u=dc(l.body),h=jp(l,s,i,v.current.settings);if(!h||h.nodes.length===0){A("Template card could not generate nodes."),f.emit("templateCard.generate.blocked",{nodeId:a,optionId:s});return}F(I=>({...I,nodes:[...I.nodes,...h.nodes]}),"templateCard.generate",{nodeId:a,launcherId:h.launcher.id,optionId:((S=h.option)==null?void 0:S.id)??null,templateId:h.template.id,runId:h.runId,generatedCount:h.nodes.length});const k=h.nodes.map(I=>I.id);b(k),W(k[0]??null);const C=h.nodes[h.nodes.length-1];C&&Se(C,"templateCard.generate"),window.setTimeout(()=>W(I=>I===k[0]?null:I),1200);const j=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.`;A(j)},[F,Se,A]),am=g.useCallback(a=>{const s=v.current.nodes.find(I=>I.id===a.sourceNodeId),i=560,l=390,u=je(void 0,void 0,{width:i,height:l}),h=Q("node"),k=s?s.x+s.width+bs:u.x,C=s?s.y:u.y,j={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&&(j.RemoteFleetLatestFramePath=a.framePath),a.frameUrl&&(j.RemoteFleetLatestFrameUrl=a.frameUrl),a.dataUrl&&(j.RemoteFleetLatestFrameDataUrl=a.dataUrl),a.frameSeq&&(j.RemoteFleetLatestFrameSeq=String(a.frameSeq));const S={id:h,kind:"remote-control",title:a.deviceName||"Remote Device",body:`Remote device control: ${a.deviceId}`,x:k,y:C,width:i,height:l,tags:["Remote","Control","LocalBridge"],metadata:j};F(I=>({...I,nodes:[...I.nodes,S]}),"remoteControl.node.add",{id:S.id,sourceNodeId:a.sourceNodeId,deviceId:a.deviceId}),b([S.id]),Se(S,"remoteControl.node.add"),A(`Remote control node created for ${a.deviceName||a.deviceId}.`),f.emit("remoteControl.node.add",{nodeId:S.id,sourceNodeId:a.sourceNodeId,deviceId:a.deviceId,connected:a.connected===!0})},[F,je,Se,Ue,A]),Pa=g.useCallback(a=>{const s=xs(ie.current)??{...Fa};Re({cameraBookmarks:{...v.current.settings.cameraBookmarks??{},[a]:s}},"camera.bookmark.save"),f.emit("camera.bookmark.save",{slot:a,...s}),A(`Camera slot ${a} saved.`)},[Re,A]),Zn=g.useCallback(a=>{var l;const s=xs((l=v.current.settings.cameraBookmarks)==null?void 0:l[a]),i=s??{...Fa};te(i),f.emit("camera.bookmark.goto",{slot:a,saved:!!s,...i}),A(s?`Camera slot ${a}.`:`Camera slot ${a} empty. Home view.`)},[te,A]),er=g.useCallback(()=>{te({...Fa}),f.emit("camera.bookmark.goto",{slot:"home",saved:!1,...Fa}),A("Home view.")},[te,A]),Yi=g.useCallback(a=>{const s=ie.current,i=Kf,l={...s,x:a==="left"?s.x+i:a==="right"?s.x-i:s.x,y:a==="up"?s.y+i:a==="down"?s.y-i:s.y};te(l),f.emit("camera.keyboard.pan",{direction:a,...l})},[te]),Gi=g.useCallback(()=>{const a=Yn.current;return a?(a.focus(),a.select(),f.emit("globalInput.focus",{source:"keyboard"}),!0):!1},[]),tr=g.useCallback((a="keyboard")=>{const s=!(v.current.settings.wheelMode??!1);Re({wheelMode:s},`${a}.wheelMode.toggle`),f.emit("canvas.wheelMode.toggle",{source:a,wheelMode:s}),A(s?"Mouse wheel mode.":"Trackpad pan mode.")},[Re,A]),ar=g.useCallback((a="keyboard")=>{const i=(v.current.settings.cursorDirection==="down"?"down":"right")==="down"?"right":"down";Re({cursorDirection:i},`${a}.cursorDirection.toggle`),f.emit("canvas.cursorDirection.toggle",{source:a,cursorDirection:i}),A(i==="down"?"Cursor direction down.":"Cursor direction right.")},[Re,A]),Ko=g.useCallback(async(a,s="api")=>{const i=a===!0;try{if(i){if(document.fullscreenElement)return pa(!0),f.emit("canvas.fullscreen.toggle",{source:s,active:!0,fallback:!1}),!0;if(document.documentElement.requestFullscreen){await document.documentElement.requestFullscreen();const l=!!document.fullscreenElement;return pa(l),f.emit("canvas.fullscreen.toggle",{source:s,active:l,fallback:!1}),l}return pa(!0),f.emit("canvas.fullscreen.toggle",{source:s,active:!0,fallback:!0}),!0}return document.fullscreenElement&&document.exitFullscreen&&await document.exitFullscreen(),pa(!1),f.emit("canvas.fullscreen.toggle",{source:s,active:!1,fallback:!1}),!1}catch(l){return pa(i),f.emit("canvas.fullscreen.toggle.failed",{source:s,active:i,fallback:!0,error:l instanceof Error?l.message:String(l)}),f.emit("canvas.fullscreen.toggle",{source:s,active:i,fallback:!0}),A(i?"Read mode fallback.":"Read mode off."),i}},[pa,A]),Qn=g.useCallback((a="keyboard")=>Ko(!ma.current,a),[Ko]);g.useEffect(()=>{const a=window,s={getMindCanvasFullscreenState:a.getMindCanvasFullscreenState,setMindCanvasFullscreen:a.setMindCanvasFullscreen,getMindCanvasReadModeState:a.getMindCanvasReadModeState,setMindCanvasReadMode:a.setMindCanvasReadMode,toggleMindCanvasReadMode:a.toggleMindCanvasReadMode},i=()=>ma.current,l=h=>Ko(h,"api"),u=()=>Qn("api");return a.getMindCanvasFullscreenState=i,a.setMindCanvasFullscreen=l,a.getMindCanvasReadModeState=i,a.setMindCanvasReadMode=l,a.toggleMindCanvasReadMode=u,_o(!0),f.emit("canvas.readMode.api.bound"),()=>{_o(!1),s.getMindCanvasFullscreenState?a.getMindCanvasFullscreenState=s.getMindCanvasFullscreenState:delete a.getMindCanvasFullscreenState,s.setMindCanvasFullscreen?a.setMindCanvasFullscreen=s.setMindCanvasFullscreen:delete a.setMindCanvasFullscreen,s.getMindCanvasReadModeState?a.getMindCanvasReadModeState=s.getMindCanvasReadModeState:delete a.getMindCanvasReadModeState,s.setMindCanvasReadMode?a.setMindCanvasReadMode=s.setMindCanvasReadMode:delete a.setMindCanvasReadMode,s.toggleMindCanvasReadMode?a.toggleMindCanvasReadMode=s.toggleMindCanvasReadMode:delete a.toggleMindCanvasReadMode,f.emit("canvas.readMode.api.unbound")}},[Ko,Qn]);const nm=g.useCallback(()=>{const a=v.current.settings.cameraBookmarks??{},s=Rr.find(i=>!a[i])??Rr[0];Pa(s)},[Pa]),om=g.useCallback(a=>{Dr(v.current.settings.gridType)!==a&&Re({gridType:a},`canvas.gridMode.${a}`)},[Re]),sm=g.useCallback(()=>{Re({gridSnap:!(v.current.settings.gridSnap??!0)},"canvas.gridSnap.toggle")},[Re]),rm=g.useCallback(a=>{const s=v.current.nodes.find(i=>i.id===a);!s||s.kind!=="directory"||(Yt(a),f.emit("node.directorySettings.open",{id:a}))},[]),im=g.useCallback(()=>{Yt(a=>(a&&f.emit("node.directorySettings.close",{id:a}),null))},[]),lm=g.useCallback((a,s)=>{const i=v.current.nodes.find(h=>h.id===a);if(!i||i.kind!=="directory")return;const l=An(s.DirectoryPath),u={...i.metadata??{},DirectoryPath:l,Include:s.Include??"",Exclude:s.Exclude??""};ne(a,{sourceFilePath:l||si,metadata:u}),Yt(null),f.emit("node.directorySettings.patch",{id:a,keys:["DirectoryPath","Include","Exclude"]}),A("Folder scan settings saved.")},[ne,A]),dm=g.useCallback(async a=>{const s=v.current.nodes.find(u=>u.id===a);if(!s||s.kind!=="directory")return;const i=cb(s);if(f.emit("node.directory.scan.requested",{id:a,hasBridgePath:!!i,hasHandle:zn.current.has(a)}),i){if(!tt()){se("blocked"),f.emit("node.directory.scan.bridge.blocked",{id:a,reason:"hosted-access-off"}),A("Hosted LocalBridge access is off.");return}try{const u=await ta();if(Be(u.status??null),se(u.state),u.state!=="connected"){f.emit("node.directory.scan.bridge.unavailable",{id:a,message:u.message||"LocalBridge is unavailable."}),A(u.message||"LocalBridge is unavailable.");return}const h=Oa(u.status);if(!h){se("unavailable"),f.emit("node.directory.scan.bridge.failed",{id:a,reason:"missing-token"}),A("LocalBridge read token is unavailable.");return}const k=Cs(i,48);A(`Scanning ${k}...`),f.emit("node.directory.scan.bridge.requested",{id:a,path:i});const C=await mb(i,s.metadata,h,u.baseUrl),j=new Date().toISOString();ne(a,{title:s.title==="Directory"||s.title==="New Folder"?k:s.title,body:Rd(k,C),sourceFilePath:i,metadata:{...s.metadata??{},DirectoryPath:i,DirectoryName:k,DirectoryScanSource:"localbridge",DirectoryFileCount:String(C.fileCount),DirectoryDirCount:String(C.directoryCount),DirectoryLastScanUtc:j,DirectoryScanTruncated:String(C.truncated),DirectoryPreview:JSON.stringify(C.preview.slice(0,Nn))}}),f.emit("node.directory.scan.bridge.completed",{id:a,path:i,fileCount:C.fileCount,directoryCount:C.directoryCount,truncated:C.truncated}),f.emit("node.directory.scan.completed",{id:a,source:"localbridge",directoryName:k,fileCount:C.fileCount,directoryCount:C.directoryCount,truncated:C.truncated}),A(`Scanned ${k}: ${C.fileCount} files, ${C.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}),A("LocalBridge folder scan failed.")}return}const l=window;if(!l.showDirectoryPicker){f.emit("node.directory.scan.unsupported",{id:a}),A("Folder scan needs a Chromium browser with File System Access enabled.");return}try{let u=zn.current.get(a);u||(u=await l.showDirectoryPicker(),zn.current.set(a,u));const h={mode:"read"},k=u.queryPermission?await u.queryPermission(h):"granted";if((k==="granted"||!u.requestPermission?k:await u.requestPermission(h))!=="granted"){f.emit("node.directory.scan.denied",{id:a,directoryName:u.name}),A("Folder permission was not granted.");return}A(`Scanning ${u.name}...`);const j=await lb(u,s.metadata),S=new Date().toISOString();ne(a,{title:s.title==="Directory"||s.title==="New Folder"?u.name:s.title,body:Rd(u.name,j),sourceFilePath:u.name,metadata:{...s.metadata??{},DirectoryName:u.name,DirectoryScanSource:"browser-picker",DirectoryFileCount:String(j.fileCount),DirectoryDirCount:String(j.directoryCount),DirectoryLastScanUtc:S,DirectoryScanTruncated:String(j.truncated),DirectoryPreview:JSON.stringify(j.preview.slice(0,Nn))}}),f.emit("node.directory.scan.completed",{id:a,source:"browser-picker",directoryName:u.name,fileCount:j.fileCount,directoryCount:j.directoryCount,truncated:j.truncated}),A(`Scanned ${u.name}: ${j.fileCount} files, ${j.directoryCount} folders.`)}catch(u){if((u&&typeof u=="object"&&"name"in u?String(u.name):"")==="AbortError"){f.emit("node.directory.scan.cancelled",{id:a}),A("Folder scan cancelled.");return}f.emit("node.directory.scan.failed",{id:a,message:u instanceof Error?u.message:String(u)}),A("Folder scan failed in this browser context.")}},[ne,A]),Ki=g.useCallback(a=>{Bn(a.id),qa(at(a.name))},[]),nr=g.useCallback(()=>{Bn(null),qa("")},[]),or=g.useCallback(a=>{const s=at(Dn).slice(0,90);a===v.current.id?(qs(s),A("Board renamed.")):op(a,s)?(Ye(kt()),A("Saved board renamed.")):(f.emit("board.rename.failed",{boardId:a,scope:"stored"}),A("Board rename failed.")),Bn(null),qa("")},[qs,A,Dn]),cm=g.useCallback((a,s)=>{s.key==="Enter"?(s.preventDefault(),or(a)):s.key==="Escape"&&(s.preventDefault(),nr())},[nr,or]),um=g.useCallback(a=>{const s=v.current.nodes.find(l=>l.id===a);if(!fo(s))return;const i=s.aiEnabled===!1;ne(a,{aiEnabled:i}),f.emit("node.aiReference.toggled",{id:a,enabled:i}),A(i?"AI reference enabled.":"AI reference disabled.")},[ne,A]),Xo=g.useCallback(async(a,s,i,l,u)=>{Pt.current=a;try{const h=await xo(a);return et.current=0,f.emit(s,{...i,ok:!0,method:h}),A(l),h}catch(h){return et.current=Date.now()+15e3,f.emit(s,{...i,ok:!0,method:"react-local",clipboardUnavailable:!0,message:h instanceof Error?h.message:String(h)}),A(u),"react-local"}},[A]),mm=g.useCallback(async a=>{const s=v.current.nodes.find(l=>l.id===a);if(!s)return;const i=Ib(s);if(i)try{const l=await Nb(i);f.emit("node.copyImage",{id:a,ok:!0,mode:l,urlKind:i.split(":",1)[0]||"relative"}),A(l==="image"?"Image copied to clipboard.":"Image reference copied.");return}catch(l){Pt.current=i,et.current=Date.now()+15e3,f.emit("node.copyImage",{id:a,ok:!0,mode:"react-local",urlKind:i.split(":",1)[0]||"relative",clipboardUnavailable:!0,message:l instanceof Error?l.message:String(l)}),A("Image reference copied inside this canvas.");return}await Xo(jb(s),"node.copy",{id:a},"Node content copied.","Node content copied inside this canvas.")},[Xo,A]),pm=g.useCallback(async(a,s)=>{await Xo(s,"node.embed.copyUrl",{id:a,sourceKind:s.split(":",1)[0]||"relative"},"Embed URL copied.","Embed URL copied inside this canvas.")},[Xo]),gm=g.useCallback(a=>{const s=v.current.nodes.find(l=>l.id===a);if(!fo(s))return;const i=Br(s);ne(a,{height:i}),f.emit("node.fitHeight",{id:a,height:i}),A("Node height fitted to text.")},[ne,A]),hm=g.useCallback(a=>{const s=v.current.nodes.find(k=>k.id===a);if(!fo(s))return;const i=Sb(s),l=i?Math.max(120,Math.round(s.originalHeight||Br(s))):Math.max(120,Math.min(s.height,Qf)),u=i?0:Math.round(s.height),h=i;F(k=>({...k,nodes:k.nodes.map(C=>C.id===a?{...C,height:l,isExpanded:h,originalHeight:u}:C)}),"node.expandCollapse",{id:a,expanded:h,height:l,originalHeight:u}),A(h?"Node expanded.":"Node collapsed.")},[F,A]),fm=g.useCallback(a=>{const s=v.current.nodes.find(l=>l.id===a);if(!s||s.kind!=="code")return;const i=s.wordWrap===!1;ne(a,{wordWrap:i}),f.emit("node.wordWrap.toggled",{id:a,enabled:i}),A(i?"Word wrap enabled.":"Word wrap disabled.")},[ne,A]),bm=g.useCallback((a,s)=>{const i=v.current.nodes.find(h=>h.id===a);if(!fo(i))return;const l=xb(s.executionMode),u=Array.from(new Set([...i.tags??[],"Company root",l,s.enableSubAgents?"sub-agents":"single-agent","adapter-gated"]));ne(a,{companyMode:"candidate",role:"Company root",tags:u,metadata:{...i.metadata??{},CompanyExecutionMode:s.executionMode,CompanyExecutionModeLabel:l,CompanySubAgents:String(s.enableSubAgents),CompanyStatus:"Staged",CompanyRootTitle:i.title,CompanyLastMessage:"Company staged locally. External CompanyCore execution requires an adapter.",CompanyStagedAt:new Date().toISOString()}}),f.emit("node.company.staged",{id:a,executionMode:s.executionMode,enableSubAgents:s.enableSubAgents}),A(`Company root staged locally as ${l}. Open CompanyCore to run it with an adapter later.`)},[ne,A]),ym=g.useCallback(a=>{var i;const s=v.current.nodes.find(l=>l.id===a);if(!(s!=null&&s.companyMode)){A("Stage this node as a Company root first.");return}bt(a),f.emit("companyGraph.open",{id:a,status:((i=s.metadata)==null?void 0:i.CompanyStatus)??"Staged"})},[A]),xm=g.useCallback(a=>{const s=v.current.nodes.find(i=>i.id===a);s!=null&&s.companyMode&&(ne(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}),A("Company goal synced from this note locally."))},[ne,A]),Cm=g.useCallback(a=>{var l;const s=v.current.nodes.find(u=>u.id===a);if(!(s!=null&&s.companyMode))return;const i=((l=s.metadata)==null?void 0:l.CompanyStatus)||"Staged";ne(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}),A(`Company status refreshed locally: ${i}.`)},[ne,A]),km=g.useCallback(()=>{bt(a=>(a&&f.emit("companyGraph.close",{id:a}),null))},[]),Xi=g.useCallback((a,s)=>{const i=v.current.nodes.find(l=>l.id===a);i!=null&&i.companyMode&&(ne(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}),A(`Company marked ${s.toLowerCase()} locally.`))},[ne,A]),qi=g.useCallback(a=>{var l;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",((l=s.metadata)==null?void 0:l.CompanyExecutionModeLabel)??""]);ne(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()}}),bt(null),f.emit("companyGraph.remove",{id:a}),A("Company staging removed from this node.")},[ne,A]),Sm=g.useCallback((a,s)=>{const i=v.current.nodes.find(l=>l.id===a);i!=null&&i.companyMode&&(ne(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}),A(`Company approval ${s.toLowerCase()} locally.`))},[ne,A]),wm=g.useCallback((a,s)=>{const i=s.trim();if(!i)return;const l=Q("node"),u=Q("edge");F(h=>{var j,S;const k=h.nodes.find(I=>I.id===a);if(!k)return h;const C={id:l,kind:"ai-task",title:"Company follow-up task",body:i,x:k.x+k.width+120,y:k.y+52,width:350,height:190,status:"idle",tags:["Company follow-up",((j=k.metadata)==null?void 0:j.CompanyExecutionModeLabel)??"Company"],metadata:{CompanyRootNodeId:k.id,CompanyExecutionMode:((S=k.metadata)==null?void 0:S.CompanyExecutionMode)??"Auto",CompanyTaskStatus:"Staged",CompanyStagedAt:new Date().toISOString()}};return{...h,nodes:[...h.nodes,C],edges:[...h.edges,{id:u,from:k.id,to:l,kind:"context"}]}},"companyGraph.followUp.staged",{rootId:a,taskId:l,chars:i.length}),b([l]),W(l),window.setTimeout(()=>W(h=>h===l?null:h),1400),A("Company follow-up task staged locally.")},[F,A]),vm=g.useCallback((a,s)=>{const i=Q("node"),l=Q("edge");F(u=>{const h=u.nodes.find(C=>C.id===a);if(!h)return u;const k={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,k],edges:[...u.edges,{id:l,from:h.id,to:i,kind:"result"}]}},"companyGraph.artifact.added",{rootId:a,artifactNodeId:i,artifactType:s.type}),b([i]),W(i),window.setTimeout(()=>W(u=>u===i?null:u),1400),A("Company artifact added to the canvas.")},[F,A]),jm=g.useCallback((a,s="preview")=>{const i=wb(a);if(!i){A("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"){It({url:i,fileName:vb(a)}),f.emit("node.pdf.preview.open",{id:a.id,urlKind:i.startsWith("http")?"url":"path"});return}if(a.kind==="embed"&&!Mn(i)){A("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})},[A]),Im=g.useCallback(a=>{const s=q.current;F(i=>({...i,nodes:i.nodes.filter(l=>l.id!==a),edges:i.edges.filter(l=>l.from!==a&&l.to!==a)}),"node.delete",{id:a}),b(i=>{const l=i.filter(u=>u!==a);return f.emit("selection.repaired",{reason:"delete-node",beforeCount:s.length,afterCount:l.length,removedCount:i.length-l.length}),l}),oe(i=>i===a?null:i)},[F]),sr=g.useCallback(a=>{const s=Array.from(new Set(q.current));if(s.length===0)return;const i=new Set(s);F(l=>({...l,nodes:l.nodes.filter(u=>!i.has(u.id)),edges:l.edges.filter(u=>!i.has(u.from)&&!i.has(u.to))}),"node.delete",{ids:s,count:s.length,source:a}),b([]),f.emit("selection.repaired",{reason:"delete-selected",source:a,beforeCount:s.length,afterCount:0,removedCount:s.length}),oe(l=>l&&i.has(l)?null:l),bt(l=>l&&i.has(l)?null:l),Yt(l=>l&&i.has(l)?null:l),A(`Deleted ${s.length} selected node${s.length===1?"":"s"}.`)},[F,A]),qo=g.useCallback((a,s)=>{var B;const i=Array.from(new Set(a));if(i.length===0)return;const l=v.current,u=new Set(i),h=l.nodes.filter(T=>u.has(T.id));if(h.length===0)return;const k=h.filter(za),C=h.filter(T=>!za(T));if(k.length>0&&f.emit("remoteMonitor.node.duplicateIgnored",{action:"duplicate",source:s,skippedCount:k.length,nodeId:(B=k[0])==null?void 0:B.id}),C.length===0){const T=k[0]??l.nodes.find(za);T&&(b([T.id]),W(T.id),window.setTimeout(()=>W(M=>M===T.id?null:M),1e3)),A("Remote monitor is single-instance per board. Focused existing monitor.");return}const j=new Map(C.map(T=>[T.id,Q("node")])),S=C.map(T=>({...T,id:j.get(T.id),x:T.x+50,y:T.y-50,status:T.status==="running"?"idle":T.status,metadata:T.metadata?{...T.metadata}:void 0,tags:T.tags?[...T.tags]:void 0,imageStack:di(T.imageStack,T.id,j.get(T.id))})),I=l.edges.filter(T=>j.has(T.from)&&j.has(T.to)).map(T=>({...T,id:Q("edge"),from:j.get(T.from),to:j.get(T.to)}));F(T=>({...T,nodes:[...T.nodes,...S],edges:[...T.edges,...I]}),"node.duplicate",{source:s,count:S.length,edgeCount:I.length,sourceIds:i,duplicateIds:S.map(T=>T.id),skippedRemoteMonitorCount:k.length});const E=S.map(T=>T.id);b(E),W(E[0]??null),window.setTimeout(()=>W(T=>T===E[0]?null:T),1e3),A(k.length>0?`Duplicated ${S.length} node${S.length===1?"":"s"}; remote monitor stays single-instance.`:`Duplicated ${S.length} node${S.length===1?"":"s"}.`)},[F,A]),rr=g.useCallback(a=>{qo(q.current,a)},[qo]),eo=g.useCallback((a,s)=>{const i=Array.from(new Set(q.current));if(i.length===0)return;const l=new Set(i),u=v.current.nodes,h=u.filter(S=>l.has(S.id));if(h.length===0)return;const k=u.filter(S=>!l.has(S.id)),C=a==="front"?[...k,...h]:[...h,...k];if(!C.some((S,I)=>{var E;return S.id!==((E=u[I])==null?void 0:E.id)})){A(a==="front"?"Selected nodes are already in front.":"Selected nodes are already in back."),f.emit("node.layerOrder.noop",{direction:a,source:s,count:h.length,ids:i});return}F(S=>({...S,nodes:C}),"node.layerOrder",{direction:a,source:s,count:h.length,ids:i}),A(a==="front"?`Brought ${i.length} selected node${i.length===1?"":"s"} to front.`:`Sent ${i.length} selected node${i.length===1?"":"s"} to back.`)},[F,A]),ir=g.useCallback(async()=>{const a=new Set(q.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)),l=Bb(s,i);de.current=l;try{const u=await xo(JSON.stringify(l));dt.current=0,f.emit("multiSelection.copy",{count:s.length,edgeCount:i.length,ok:!0,method:u}),A(`Copied ${s.length} selected node${s.length===1?"":"s"} for canvas paste.`)}catch(u){dt.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)}),A(`Copied ${s.length} selected node${s.length===1?"":"s"} inside this canvas.`)}},[A]),Ea=g.useCallback((a,s,i)=>{const l=v.current.nodes.find(za),u=[],h=[];let k=!!l;for(const L of a.nodes){if(za(L)){if(k){u.push(L);continue}k=!0}h.push(L)}if(u.length>0&&f.emit("remoteMonitor.node.duplicateIgnored",{action:i,skippedCount:u.length,nodeId:l==null?void 0:l.id}),h.length===0){l&&(b([l.id]),W(l.id),window.setTimeout(()=>W(L=>L===l.id?null:L),1e3)),A("Remote monitor is single-instance per board. Focused existing monitor.");return}const C=Ts(h);if(!C)return;const j=new Map(h.map(L=>[L.id,Q("node")])),S=s.x-C.minX,I=s.y-C.minY,E=h.map(L=>({...L,id:j.get(L.id),x:L.x+S,y:L.y+I,status:L.status==="running"?"idle":L.status,tags:L.tags?[...L.tags]:void 0,metadata:L.metadata?{...L.metadata}:void 0,imageStack:di(L.imageStack,L.id,j.get(L.id))})),B=a.edges.filter(L=>j.has(L.from)&&j.has(L.to)).map(L=>({...L,id:Q("edge"),from:j.get(L.from),to:j.get(L.to)})),T=E.map(L=>L.id);F(L=>({...L,nodes:[...L.nodes,...E],edges:[...L.edges,...B]}),"clipboard.nodes.paste",{source:i,count:E.length,edgeCount:B.length,originX:Math.round(s.x),originY:Math.round(s.y),skippedRemoteMonitorCount:u.length}),b(T),oe(null),W(T[0]??null);const M=E[E.length-1];M&&Se(M,`clipboard.nodes.${i}`),window.setTimeout(()=>W(L=>L===T[0]?null:L),1200),A(u.length>0?`Pasted ${E.length} canvas node${E.length===1?"":"s"}; remote monitor stays single-instance.`:`Pasted ${E.length} canvas node${E.length===1?"":"s"}.`)},[F,Se,A]),to=g.useCallback((a,s,i)=>{const l=a.trim();if(!l)return;const u=Fd(l,s,`${i}-url`),h=u??Ud(l,s,i);F(k=>({...k,nodes:[...k.nodes,h]}),u?"clipboard.url.paste":"clipboard.text.paste",{source:i,id:h.id,kind:h.kind,chars:l.length}),b([h.id]),oe(null),W(h.id),Se(h,`clipboard.${i}.${h.kind}`),window.setTimeout(()=>W(k=>k===h.id?null:k),1200),A(`${i==="drop"?"Dropped":"Pasted"} ${h.kind==="file"?"URL reference":h.kind} node.`)},[F,Se,A]),Jo=g.useCallback(async(a,s,i)=>{const l=a.filter(h=>h.name||h.size>0);if(l.length===0)return;const u=v.current.id;try{const h=[];let k=s.x;for(const S of l){const I=await ty(S,{x:k,y:s.y},i);h.push(I),k+=I.width+bs}if(v.current.id!==u){f.emit("async.staleIgnored",{path:"canvas.fileIngest",source:i,boardId:u,currentBoardId:v.current.id,count:l.length});return}const C=h.map(S=>S.id);F(S=>({...S,nodes:[...S.nodes,...h]}),"canvas.files.ingested",{source:i,count:h.length,kinds:h.map(S=>S.kind)}),b(C),oe(null),W(C[0]??null);const j=h[h.length-1];j&&Se(j,`canvas.files.${i}`),window.setTimeout(()=>W(S=>S===C[0]?null:S),1200),A(`${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)}),A("File ingest failed in this browser context.")}},[F,Se,A]);g.useEffect(()=>{const a=s=>{if(s.defaultPrevented||rc(s.target))return;const i=s.clipboardData;if(!i)return;const l=je(),u=Gd(i.files,i.items);if(u.length>0){s.preventDefault(),Jo(u,l,"paste");return}const h=dt.current>Date.now()?de.current:null;if(h){s.preventDefault(),Ea(h,l,"paste"),f.emit("clipboard.nodes.pasteLocalFallback",{count:h.nodes.length});return}const k=et.current>Date.now()?Pt.current:null;if(k){s.preventDefault(),to(k,l,"paste"),f.emit("clipboard.text.pasteLocalFallback",{chars:k.length}),et.current=0;return}const C=i.getData("text/plain"),j=$d(C);if(j){s.preventDefault(),Ea(j,l,"paste");return}const S=C.trim()?C:zd(i.getData("text/html"));S.trim()&&(s.preventDefault(),to(S,l,"paste"))};return document.addEventListener("paste",a),()=>document.removeEventListener("paste",a)},[je,Jo,to,Ea]);const Nm=g.useCallback(a=>{Ms(a.target)||!Array.from(a.dataTransfer.types??[]).some(i=>["Files","text/plain","text/uri-list","text/html"].includes(i))||(a.preventDefault(),a.dataTransfer.dropEffect="copy")},[]),Am=g.useCallback(a=>{if(Ms(a.target))return;const s=Gd(a.dataTransfer.files,a.dataTransfer.items),i=a.dataTransfer.getData("text/uri-list"),l=a.dataTransfer.getData("text/plain"),u=zd(a.dataTransfer.getData("text/html")),h=je(a.clientX,a.clientY);if(s.length>0){a.preventDefault(),Jo(s,h,"drop");return}const k=(i||l||u).trim(),C=$d(l);if(C){a.preventDefault(),Ea(C,h,"drop");return}k&&(a.preventDefault(),to(k,h,"drop"))},[je,Jo,to,Ea]),Mm=g.useCallback(()=>{const a=new Set(q.current),s=new Set(v.current.nodes.filter(i=>a.has(i.id)&&fo(i)).map(i=>i.id));if(s.size===0){A("No text nodes in this selection.");return}F(i=>({...i,nodes:i.nodes.map(l=>s.has(l.id)?{...l,height:Br(l)}:l)}),"multiSelection.fitHeight",{count:s.size}),f.emit("multiSelection.fitHeight",{count:s.size}),A(`Fitted ${s.size} text node${s.size===1?"":"s"}.`)},[F,A]),lr=g.useCallback(a=>{const s=new Set(q.current),i=v.current.nodes.filter(B=>s.has(B.id)).sort((B,T)=>q.current.indexOf(B.id)-q.current.indexOf(T.id));if(i.length<2)return;const l=Ts(i);if(!l)return;const u=a==="tidy"?sy(i):i,h=28,k=Math.max(...u.map(B=>B.width)),C=Math.max(...u.map(B=>B.height)),j=u.map((B,T)=>({id:B.id,x:B.x,y:B.y,width:B.width,height:B.height,selectionIndex:T})),S=v.current.settings.gridSnap??!0;let I;a==="grid"?I={mode:"grid",order:"selectionOrder",columns:Math.max(2,Math.ceil(Math.sqrt(u.length))),cellWidth:k,cellHeight:C,gapX:h,gapY:h,sizeMode:"preserve",snapToGrid:S,gridSize:oa}:a==="strip"?I={mode:"stripHorizontal",order:"selectionOrder",targetHeight:C,gapX:h,sizeMode:"preserve",snapToGrid:S,gridSize:oa}:I={mode:"masonry",order:"spatialReading",anchor:"selectionBoundsTopLeft",maxColumns:12,gapX:24,gapY:24,quantile:.75,sizeMode:"preserve",snapToGrid:S,gridSize:oa};const E=dh(j,I,l);F(B=>({...B,nodes:B.nodes.map(T=>{const M=E.after.get(T.id);return M?{...T,x:M.x,y:M.y,width:M.width,height:M.height}:T})}),"multiSelection.arrange",{mode:a,count:i.length,layoutMode:I.mode,snapToGrid:S}),f.emit("multiSelection.arrange",{mode:a,count:i.length,layoutMode:I.mode,snapToGrid:S,boundsAfter:E.boundsAfter}),A(a==="tidy"?`Tidied ${i.length} selected nodes.`:`Arranged ${i.length} selected nodes as ${a}.`)},[F,A]),Tm=g.useCallback(()=>{const a=Array.from(new Set(q.current)),s=v.current,i=new Map(s.nodes.map(M=>[M.id,M])),l=a.map(M=>i.get(M)).filter(M=>!!(M&&M.kind==="image"&&ko(M).length>0));if(l.length<2){A("Select at least two image nodes to stack."),f.emit("multiSelection.mergeImageStacks.skipped",{reason:"not-enough-image-nodes",selectedCount:a.length});return}const u=l[0],h=l.slice(1),k=new Date().toISOString(),C=new Set,j=ko(u),S=[];for(const M of j)S.push(Bd(M,u,C,k));for(const M of h)for(const L of ko(M))S.push(Bd(L,M,C,k));if(S.length<2){A("No stackable image variants found."),f.emit("multiSelection.mergeImageStacks.skipped",{reason:"not-enough-variants",selectedCount:a.length});return}const I=S.some(M=>{var L;return M.variantId===((L=u.imageStack)==null?void 0:L.activeVariantId)})?u.imageStack.activeVariantId:S[0].variantId,E=S.find(M=>M.variantId===I)??S[0],B=h.map(M=>M.id),T=new Set(B);F(M=>({...M,nodes:M.nodes.filter(L=>!T.has(L.id)).map(L=>{var J;return L.id===u.id?{...L,kind:"image",imageUrl:E.imageUrl,imageStack:{activeVariantId:I,variants:S,kind:"pile",title:((J=L.imageStack)==null?void 0:J.title)||L.title,updatedAtUtc:k},metadata:{...L.metadata??{},ImageStackKind:"pile",ImageStackPrimaryNodeId:u.id,ImageStackVariantCount:String(S.length),ImageStackMergedAtUtc:k,ImageStackRemovedNodeIds:B.join(","),ImageStackActiveVariantId:I},tags:Array.from(new Set([...L.tags??["image"],"Stack"])).slice(0,4)}:L}),edges:M.edges.filter(L=>!T.has(L.from)&&!T.has(L.to))}),"multiSelection.mergeImageStacks",{primaryNodeId:u.id,removedNodeIds:B,addedVariants:S.length-j.length,variantCount:S.length}),b([u.id]),oe(M=>M&&T.has(M)?null:M),bt(M=>M&&T.has(M)?null:M),Yt(M=>M&&T.has(M)?null:M),W(u.id),window.setTimeout(()=>W(M=>M===u.id?null:M),1200),A(`Stacked ${l.length} image nodes into ${S.length} variants.`)},[F,A]),Rm=g.useCallback(a=>{const s=q.current.includes(a)?q.current:[a];qo(s,"node-action")},[qo]),ga=g.useCallback(async(a,s)=>{const i=Kn.current.isBusy(a);return i&&f.emit("automation.run.queued",{id:a,key:a}),Kn.current.enqueue(a,async()=>{var B,T,M;const l=v.current.nodes.find(L=>L.id===a);if(!l||l.kind!=="ai-task")return;f.emit("automation.run.dequeued",{id:a,key:a,queuedBehindRunning:i});const u=(ln.current.get(a)??0)+1;ln.current.set(a,u);const h=Aa.current,k=(s==null?void 0:s.trim())||l.body,C=Li(Ri(l)),j=na(v.current.settings.model),S=Zd(v.current.settings.effort);ne(a,{status:"running",body:k,metadata:bo(l,{instruction:k,runState:"running",status:"running",statusLabel:"Running",sourceMode:C?"media-prompt-only":"ai-task",model:j,reasoningEffort:S})}),f.emit("automation.run",{id:a,mode:"single",seq:u,automationKind:C==null?void 0:C.kind});const I=()=>ln.current.get(a)===u&&Aa.current===h,E=L=>{if(!I()){f.emit("async.staleIgnored",{path:"automation.run",id:a,seq:u});return}f.emit("localBridge.codex.fallback",{id:a,reason:L});const J=fy(k,l,L);ne(a,{status:"done",result:J,metadata:bo(l,{instruction:k,output:J,runState:"completed",status:C?"prepared":"done",statusLabel:C?"Spec only":"Done",sourceMode:C?"media-prompt-only":"local-draft",error:C?`External ${C.mode.toLowerCase()} generation was not executed.`:L,fallback:!0,partial:!!C,toolsUsed:C?`${C.toolHint}, Deterministic.Fallback, HumanReview.Gate`:"Deterministic.Fallback",toolWarnings:C?`External ${C.mode.toLowerCase()} generator was not invoked; this run prepared a spec only.`:"Local deterministic fallback was used; AI was not called.",model:j,reasoningEffort:S})}),oe(a)};if(!tt()){E("hosted-access-gated");return}try{const L=await ta();if(!I()){f.emit("async.staleIgnored",{path:"automation.run",id:a,seq:u});return}if(se(L.state),Be(L.status??null),L.state!=="connected"){xe(L.message||"LocalBridge is unavailable."),E(L.message||"LocalBridge unavailable");return}const J=Oa(L.status);if(!J){E("LocalBridge token unavailable");return}const Le=ec(v.current,l,k);f.emit("localBridge.codex.run",{id:a,boardId:v.current.id});const be=await Hl({instruction:Le,workingDirectory:((T=(B=L.status)==null?void 0:B.project)==null?void 0:T.rootPath)||((M=L.status)==null?void 0:M.workspace)||void 0,sandbox:"read_only",model:j,reasoningEffort:S,approvalPolicy:"on-request",intent:"mindcanvas-ai-task",nodeKind:l.kind,webSearchMode:"disabled",networkAccessEnabled:!1},J,L.baseUrl);if(!I()){f.emit("async.staleIgnored",{path:"automation.run",id:a,seq:u});return}if(!be.success||!be.finalResponse){const Z=be.error||"LocalBridge Codex returned no response.";f.emit("localBridge.codex.failed",{id:a,message:Z,status:be.status}),ne(a,{status:"blocked",result:Z,metadata:bo(l,{instruction:k,output:Z,runState:"blocked",status:"blocked",statusLabel:"Blocked",sourceMode:C?"media-prompt-only":"ai-task",error:Z,fallback:!1,partial:!0,model:j,reasoningEffort:S})}),oe(a);return}ne(a,{status:"done",result:be.finalResponse,metadata:bo(l,{instruction:k,output:be.finalResponse,runState:"completed",status:C?"prepared":"done",statusLabel:C?"Spec only":"Done",sourceMode:C?"media-prompt-only":"ai-generated",error:C?`External ${C.mode.toLowerCase()} generation was not executed.`:"",fallback:!1,partial:!!C,toolsUsed:C?`AI.LLM, ${C.toolHint}, HumanReview.Gate`:"AI.LLM",toolWarnings:C?`External ${C.mode.toLowerCase()} generator was not invoked; this run prepared a spec only.`:"",model:j,reasoningEffort:S,providerKind:be.providerKind,threadId:be.threadId,turnId:be.turnId})}),f.emit("localBridge.codex.completed",{id:a,providerKind:be.providerKind,threadId:be.threadId,turnId:be.turnId}),oe(a)}catch(L){if(!I()){f.emit("async.staleIgnored",{path:"automation.run",id:a,seq:u});return}const J=L instanceof Error?L.message:String(L);f.emit("localBridge.codex.failed",{id:a,message:J}),ne(a,{status:"blocked",result:J,metadata:bo(l,{instruction:k,output:J,runState:"blocked",status:"blocked",statusLabel:"Blocked",sourceMode:C?"media-prompt-only":"ai-task",error:J,fallback:!1,partial:!0,model:j,reasoningEffort:S})}),oe(a)}})},[ne]),Ji=g.useCallback(async()=>{const a=q.current[0];if(!a){A("Select an AI Task to run its graph.");return}const s=ui(v.current,a);if(s.length===0){A("Select an AI Task to run its graph.");return}const i=s.filter(l=>l.status!=="running");if(f.emit("automation.run",{id:a,mode:"selected-graph",count:i.length,graphSize:s.length,skippedRunning:s.length-i.length,order:s.map(l=>l.id)}),i.length===0){A("The selected AI Task graph is already running.");return}A(`Running selected graph: ${i.length} AI task${i.length===1?"":"s"}.`);for(const[l,u]of i.entries())W(u.id),f.emit("automation.graph.currentNode",{id:u.id,title:u.title,index:l+1,count:i.length}),A(`Running ${l+1}/${i.length}: ${u.title}`),await ga(u.id);W(null),A(`Graph run complete: ${i.length} AI task${i.length===1?"":"s"}.`)},[ga,A]),Lm=g.useCallback(async a=>{if(a.result)try{const s=await xo(a.result);f.emit("aiTask.result.copy",{id:a.id,chars:a.result.length,ok:!0,method:s}),A("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)}),A("AI result copy unavailable in this browser context.")}},[A]),Pm=g.useCallback(a=>{if(!a.result)return;const s=yy(a,{x:a.x+a.width+78,y:a.y}),i={id:Q("edge"),from:a.id,to:s.id,kind:"result"};F(l=>l.nodes.some(h=>h.id===a.id&&h.result)?{...l,nodes:[...l.nodes,s],edges:[...l.edges,i]}:l,"aiTask.result.note.create",{sourceNodeId:a.id,createdNodeId:s.id,chars:a.result.length,truncated:a.result.length>oi}),b([s.id]),oe(null),W(s.id),window.setTimeout(()=>W(l=>l===s.id?null:l),1200),A("AI result archived as a Markdown node.")},[F,A]),Em=g.useCallback(a=>{if(!a.result)return;const s=xy(a,{x:a.x+a.width+78,y:a.y+Math.min(a.height+44,360)}),i={id:Q("edge"),from:a.id,to:s.id,kind:"result"};F(l=>l.nodes.some(h=>h.id===a.id&&h.result)?{...l,nodes:[...l.nodes,s],edges:[...l.edges,i]}:l,"aiTask.result.followUp.create",{sourceNodeId:a.id,createdNodeId:s.id,chars:a.result.length}),b([s.id]),oe(null),W(s.id),window.setTimeout(()=>W(l=>l===s.id?null:l),1200),A("Follow-up AI Task staged from the result.")},[F,A]),Zi=g.useCallback(()=>{var rs,so,ha,Rl,Ll,Pl,El;const a=w.trim(),s=v.current.settings.inputMode,i=[...q.current],l=v.current.nodes.find(pe=>pe.id===i[0]),u=(l==null?void 0:l.kind)==="ai-task"?(a||l.body).trim():a;if(!u)return;const h=u.replace(/\s+/g," ").trim().toLowerCase(),k=window.location.pathname||"/mindcanvas",C=`${k}|${s}|${h}`,j=Date.now(),S=Xn.current;if((S==null?void 0:S.signature)===C&&j-S.at<=vd){f.emit("globalInput.duplicateIgnored",{routePath:k,inputMode:s,chars:u.length,windowMs:vd});return}Xn.current={signature:C,at:j};const I={routePath:k,inputMode:s,selectedNodeIds:i,chars:u.length};f.emit("globalInput.submit.snapshot",{...I,source:(l==null?void 0:l.kind)==="ai-task"?"selected-ai-task":"input",hasTypedPrompt:a.length>0}),(l==null?void 0:l.kind)==="ai-task"&&_(""),z(pe=>pe+1),f.emit("globalInput.submit.started",I);const E=pe=>{z(Dt=>Math.max(0,Dt-1)),f.emit("globalInput.submit.completed",{...I,status:pe})};if((l==null?void 0:l.kind)==="ai-task"){ga(l.id,a).then(()=>E("ai-task")).catch(pe=>{f.emit("globalInput.submit.completed",{...I,status:"ai-task-error",message:pe instanceof Error?pe.message:String(pe)}),z(Dt=>Math.max(0,Dt-1))});return}const B=je(void 0,void 0,{width:360,height:196}),T=Fd(u,B,"global-input-url"),M=T?null:Ti(u),L=!!(M&&/^https?:\/\//i.test(M)&&!Mn(M)),J=!T&&!L&&(s==="Image"||s==="Video")?s:null,Le=T??(L?Ud(u,B,"global-input-rejected-url"):null)??(J?qb(u,B,v.current.settings,J,"global-input-media",La.current):Xb(u,B,v.current.settings)),be=je(void 0,void 0,{width:Le.width,height:Le.height}),Z={...Le,x:be.x,y:be.y},gn=Z.kind==="ai-task",Da=T?"globalInput.url.add":L?"globalInput.rejectedUrl.add":J?"globalInput.media.add":"globalInput.aiTask.add",ss={id:Z.id,kind:Z.kind,chars:u.length,inputMode:s,...gn?{model:(rs=Z.metadata)==null?void 0:rs.TextModel,provider:(so=Z.metadata)==null?void 0:so.AiProvider,effort:(ha=Z.metadata)==null?void 0:ha.Effort}:{},...J?{mediaMode:J,mediaModel:(Rl=Z.metadata)==null?void 0:Rl.MediaModel,aspectPresetId:(Ll=Z.metadata)==null?void 0:Ll.AspectPresetId,requestedSize:(Pl=Z.metadata)==null?void 0:Pl.RequestedSize}:{}};if(gn){const pe=v.current,Dt={...pe,nodes:pe.nodes.some(gr=>gr.id===Z.id)?pe.nodes:[...pe.nodes,Z],updatedAt:new Date().toISOString()};c(gr=>$a(gr,pe,{description:Da,mergeKey:null})),y([]),v.current=Dt,f.emit(Da,ss),r(Dt)}else F(pe=>({...pe,nodes:pe.nodes.some(Dt=>Dt.id===Z.id)?pe.nodes:[...pe.nodes,Z]}),Da,ss);if(_(""),b([Z.id]),oe(null),W(Z.id),Se(Z,Da),window.setTimeout(()=>W(pe=>pe===Z.id?null:pe),1200),gn){f.emit("globalInput.aiTask.runRequested",{id:Z.id,chars:u.length,model:(El=Z.metadata)==null?void 0:El.TextModel}),A("AI task created from input and running."),ga(Z.id,u).then(()=>E("ai-task-created")).catch(pe=>{f.emit("globalInput.submit.completed",{...I,status:"ai-task-created-error",message:pe instanceof Error?pe.message:String(pe)}),z(Dt=>Math.max(0,Dt-1))});return}A(`Added ${Z.kind==="file"?"URL reference":Z.kind} node from input.`),E(T?"url-node":L?"rejected-url-node":J?"media-node":"text-node")},[F,je,w,Se,ga,A]),Qi=g.useCallback(async()=>{const a=ky(v.current),s=a.flat(),i=a.map(h=>h.filter(k=>k.status!=="running")).filter(h=>h.length>0),l=i.flat();if(f.emit("automation.run",{mode:"all",count:l.length,graphCount:i.length,skippedRunning:s.length-l.length,order:l.map(h=>h.id)}),l.length===0){A(s.length>0?"All AI task graphs are already running.":"No AI tasks on this board.");return}A(`Running ${i.length} graph${i.length===1?"":"s"} / ${l.length} AI task${l.length===1?"":"s"}.`);let u=0;for(const[h,k]of i.entries())for(const C of k)u+=1,W(C.id),f.emit("automation.graph.currentNode",{id:C.id,title:C.title,index:u,count:l.length,graphIndex:h+1,graphCount:i.length}),A(`Running ${u}/${l.length}: ${C.title}`),await ga(C.id);W(null),A(`All graphs complete: ${l.length} AI task${l.length===1?"":"s"}.`)},[ga,A]),el=g.useCallback(()=>{const a=v.current.nodes.filter(s=>s.kind==="ai-task"&&s.status==="running");if(a.length===0){A("No running AI tasks to pause."),f.emit("automation.pause",{count:0});return}Aa.current+=1,F(s=>({...s,nodes:s.nodes.map(i=>i.kind==="ai-task"&&i.status==="running"?{...i,status:"paused",result:i.result||"Paused locally. Run the task again to continue with a fresh execution."}:i)}),"automation.pause",{count:a.length}),A(`Paused ${a.length} running task${a.length===1?"":"s"}.`)},[F,A]),tl=g.useCallback(()=>{const a=v.current.nodes.filter(s=>s.kind==="ai-task"&&(s.status==="running"||s.status==="paused"));if(a.length===0){A("No active AI tasks to stop."),f.emit("automation.stop",{count:0});return}Aa.current+=1,F(s=>({...s,nodes:s.nodes.map(i=>i.kind==="ai-task"&&(i.status==="running"||i.status==="paused")?{...i,status:"blocked",result:"Stopped locally. Any late adapter callback from the previous execution will be ignored."}:i)}),"automation.stop",{count:a.length}),oe(null),A(`Stopped ${a.length} active task${a.length===1?"":"s"}.`)},[F,A]),al=g.useCallback(async()=>{var C,j,S;if(cn.current)return;const a=v.current.nodes.find(I=>I.id===q.current[0]);if(!a)return;cn.current=!0;const s=++Ra.current;Ro(!0),A("Generating flow with AI planner...");const i=ou(a),l=Ci(v.current.settings.appLanguage,i);let u="language-fallback",h=null,k="";try{if(!tt())k="hosted-access-gated";else{const E=await ta();if(s!==Ra.current){f.emit("async.staleIgnored",{path:"automation.generateFlow",seq:s});return}if(se(E.state),Be(E.status??null),E.state!=="connected")k=E.message||"LocalBridge unavailable",xe(k);else{const B=Oa(E.status);if(!B)k="LocalBridge token unavailable";else{const T=Xg(i,v.current.settings.appLanguage);f.emit("localBridge.codex.run",{id:a.id,boardId:v.current.id,intent:"mindcanvas-generate-flow",appLanguage:l});const M=await Hl({instruction:T,workingDirectory:((j=(C=E.status)==null?void 0:C.project)==null?void 0:j.rootPath)||((S=E.status)==null?void 0:S.workspace)||void 0,sandbox:"read_only",model:na(v.current.settings.model),reasoningEffort:Zd(v.current.settings.effort),approvalPolicy:"on-request",intent:"mindcanvas-generate-flow",nodeKind:a.kind,webSearchMode:"disabled",networkAccessEnabled:!1},B,E.baseUrl);if(s!==Ra.current){f.emit("async.staleIgnored",{path:"automation.generateFlow",seq:s});return}const L=M.success?qg(M.finalResponse):null;L&&Jg(L,l)?(h=L,u="ai-generated",f.emit("automation.generateFlow.ai.completed",{id:a.id,count:L.nodes.length,appLanguage:l,providerKind:M.providerKind,threadId:M.threadId,turnId:M.turnId})):(k=M.success?"AI planner returned invalid or wrong-language JSON.":M.error||"LocalBridge Codex returned no flow response.",f.emit("automation.generateFlow.ai.failed",{id:a.id,appLanguage:l,reason:k,success:M.success,status:M.status}))}}}h||(h=cd(i,l),u="language-fallback",f.emit("automation.generateFlow.fallback",{id:a.id,count:h.nodes.length,appLanguage:l,reason:k||"planner-unavailable"}));const I=Qd(a,h,v.current.settings,u);F(E=>({...E,nodes:[...E.nodes,...I.nodes],edges:[...E.edges,...I.edges]}),"node.add",{reason:"generate-flow",count:I.nodes.length,sourceMode:u,appLanguage:I.language}),b(I.nodes.map(E=>E.id)),A(u==="ai-generated"?`Generated ${I.nodes.length} AI-planned flow nodes.`:`Generated ${I.nodes.length} local fallback flow nodes.`)}catch(I){const E=I instanceof Error?I.message:String(I),B=cd(i,l),T=Qd(a,B,v.current.settings,"language-fallback");f.emit("automation.generateFlow.failed",{id:a.id,appLanguage:l,message:E,fallbackCount:T.nodes.length}),F(M=>({...M,nodes:[...M.nodes,...T.nodes],edges:[...M.edges,...T.edges]}),"node.add",{reason:"generate-flow",count:T.nodes.length,sourceMode:"language-fallback",appLanguage:T.language,error:E}),b(T.nodes.map(M=>M.id)),A(`Generated ${T.nodes.length} fallback flow nodes.`)}finally{s===Ra.current&&(cn.current=!1,Ro(!1))}},[F,A]),nl=g.useCallback((a,s,i)=>{const l=typeof document<"u"?document.elementFromPoint(a,s):null,u=l instanceof HTMLElement?l.closest('[data-node-connector="true"]'):null,h=(u==null?void 0:u.dataset.connectorNodeId)??"",k=u==null?void 0:u.dataset.connectorSide;if(h&&h!==i&&ri(k)&&v.current.nodes.some(S=>S.id===h))return{id:h,side:k};const C=xt(a,s),j=[...v.current.nodes].reverse().find(S=>S.id!==i&&bb(C,S));return j?{id:j.id,side:fb(j,C)}:null},[xt]),_m=g.useCallback((a,s,i,l)=>{if(l.button!==0)return;l.preventDefault(),l.stopPropagation();const u=v.current.nodes.find(T=>T.id===a);if(!u)return;const h=$t(u,s);let k=h,C=null;const j=(T,M)=>{k=xt(T,M),C=nl(T,M,a),X(L=>!L||L.from!==a?L:{...L,pointer:k,target:C,dragging:!0})},S=()=>{document.body.classList.remove("is-connecting-node"),window.removeEventListener("pointermove",I),window.removeEventListener("pointerup",E),window.removeEventListener("pointercancel",B)},I=T=>{j(T.clientX,T.clientY)},E=T=>{if(j(T.clientX,T.clientY),S(),!C||C.id===a){X(null),f.emit("edge.drag.cancelled",{from:a,fromSide:s,kind:i});return}const M={id:Q("edge"),from:a,to:C.id,kind:i,fromSide:s,toSide:C.side};F(L=>({...L,edges:[...L.edges,M]}),"edge.add",{...M,source:"connector-drag"}),X(null),b([a,C.id]),oe(null),f.emit("edge.drag.completed",{...M})},B=()=>{S(),X(null),f.emit("edge.drag.cancelled",{from:a,fromSide:s,kind:i,reason:"pointer-cancelled"})};b(T=>T.includes(a)?T:[a]),oe(null),X({from:a,kind:i,fromSide:s,pointer:h,target:null,dragging:!0}),document.body.classList.add("is-connecting-node"),f.emit("edge.drag.started",{from:a,fromSide:s,kind:i}),window.addEventListener("pointermove",I),window.addEventListener("pointerup",E,{once:!0}),window.addEventListener("pointercancel",B,{once:!0})},[F,nl,xt]),Bm=g.useCallback((a,s,i="right")=>{if(G&&G.from!==a){const u={id:Q("edge"),from:G.from,to:a,kind:G.kind==="context"?"context":s,fromSide:G.fromSide,toSide:i};F(h=>({...h,edges:[...h.edges,u]}),"edge.add",{...u}),X(null);return}const l=v.current.nodes.find(u=>u.id===a);X({from:a,kind:s,fromSide:i,pointer:l?$t(l,i):He.current,target:null,dragging:!1})},[F,G]),Zo=g.useCallback(()=>{c(a=>{const s=a.at(-1);if(!s)return a;const i=s.board,l=q.current,u=sc(l,i);return y(h=>Ph(h,v.current,{description:s.description})),r(i),b(u),f.emit("history.undo",{boardId:i.id,selectedBefore:l.length,selectedAfter:u.length,selectionRepaired:u.length!==l.length||u.some((h,k)=>h!==l[k])}),f.emit("selection.repaired",{reason:"undo",beforeCount:l.length,afterCount:u.length}),a.slice(0,-1)})},[]),Qo=g.useCallback(()=>{y(a=>{const s=a[0];if(!s)return a;const i=s.board,l=q.current,u=sc(l,i);return c(h=>$a(h,v.current,{description:s.description})),r(i),b(u),f.emit("history.redo",{boardId:i.id,selectedBefore:l.length,selectedAfter:u.length,selectionRepaired:u.length!==l.length||u.some((h,k)=>h!==l[k])}),f.emit("selection.repaired",{reason:"redo",beforeCount:l.length,afterCount:u.length}),a.slice(1)})},[]);g.useEffect(()=>{const a=s=>{var j,S;if(!s.defaultPrevented&&s.ctrlKey&&!s.shiftKey&&!s.altKey&&!s.metaKey&&s.key==="Home"&&!s.repeat){s.preventDefault(),_i("keyboard"),f.emit("keyboard.shortcut",{action:"toggle-function-toolbar"});return}if(s.defaultPrevented||rc(s.target))return;const i=s.key.toLowerCase(),l=s.ctrlKey||s.metaKey,u=!l&&!s.altKey&&!s.shiftKey,h=Oy(s.target);if(s.key==="Tab"&&u&&!s.repeat&&!h){s.preventDefault(),tr("keyboard"),f.emit("keyboard.shortcut",{action:"toggle-wheel-mode",wheelMode:!(v.current.settings.wheelMode??!1)});return}if(s.key==="Enter"&&u&&!s.repeat&&!h&&Gi()){s.preventDefault(),f.emit("keyboard.shortcut",{action:"focus-global-input"});return}if(i==="f"&&u&&!s.repeat&&!h){s.preventDefault(),Qn("keyboard"),f.emit("keyboard.shortcut",{action:"toggle-fullscreen"});return}if(i==="d"&&u&&!s.repeat){s.preventDefault(),ar("keyboard"),f.emit("keyboard.shortcut",{action:"toggle-cursor-direction"});return}if(i==="h"&&u&&!s.repeat){s.preventDefault(),er(),f.emit("keyboard.shortcut",{action:"camera-home"});return}const k=s.key==="ArrowUp"?"up":s.key==="ArrowDown"?"down":s.key==="ArrowLeft"?"left":s.key==="ArrowRight"?"right":null;if(k&&u){s.preventDefault(),Yi(k),f.emit("keyboard.shortcut",{action:"camera-pan",direction:k});return}if(i===ba&&!s.altKey&&!s.shiftKey){s.preventDefault(),l?(Pa(ba),f.emit("keyboard.shortcut",{action:"camera-bookmark-save",slot:ba})):(Zn(ba),f.emit("keyboard.shortcut",{action:"camera-bookmark-goto",slot:ba}));return}if(/^[0-9]$/.test(s.key)&&!s.altKey){if(l&&!s.shiftKey){s.preventDefault(),Pa(s.key),f.emit("keyboard.shortcut",{action:"camera-bookmark-save",slot:s.key});return}if(!l&&!s.shiftKey){s.preventDefault(),Zn(s.key),f.emit("keyboard.shortcut",{action:"camera-bookmark-goto",slot:s.key});return}}if(l&&i==="z"&&!s.shiftKey){s.preventDefault(),Zo(),f.emit("keyboard.shortcut",{action:"undo"});return}if(l&&i==="y"||l&&s.shiftKey&&i==="z"){s.preventDefault(),Qo(),f.emit("keyboard.shortcut",{action:"redo"});return}if(l&&i==="f"&&!s.altKey){s.preventDefault(),(j=rn.current)==null||j.focus(),(S=rn.current)==null||S.select(),f.emit("keyboard.shortcut",{action:"focus-search"});return}if(l&&i==="c"&&q.current.length>0){s.preventDefault(),ir(),f.emit("keyboard.shortcut",{action:"copy",count:q.current.length});return}if(l&&i==="v"&&de.current&&dt.current>Date.now()){const I=de.current;s.preventDefault(),Ea(I,je(),"paste"),f.emit("keyboard.shortcut",{action:"paste-local",count:I.nodes.length});return}if(l&&i==="d"){s.preventDefault(),rr("keyboard"),f.emit("keyboard.shortcut",{action:"duplicate",count:q.current.length});return}if(l&&s.key==="]"){s.preventDefault(),eo("front","keyboard"),f.emit("keyboard.shortcut",{action:"bring-front",count:q.current.length});return}if(l&&s.key==="["){s.preventDefault(),eo("back","keyboard"),f.emit("keyboard.shortcut",{action:"send-back",count:q.current.length});return}if(s.key==="Delete"||s.key==="Backspace"){if(q.current.length===0)return;s.preventDefault(),sr("keyboard"),f.emit("keyboard.shortcut",{action:"delete",count:q.current.length});return}if(s.key!=="Escape")return;let C=!1;wa&&(me(!1),C=!0),Ze&&(Fn(!1),C=!0),Hn&&(Gt(!1),C=!0),Ft&&(Et("keyboard"),C=!0),jt&&(It(null),C=!0),st&&(bt(null),C=!0),Vt&&(Yt(null),C=!0),G&&(X(null),C=!0),ue&&(oe(null),C=!0),N.trim()&&(D(""),V([]),ce(0),C=!0),q.current.length>0&&(b([]),C=!0),C&&(s.preventDefault(),f.emit("keyboard.shortcut",{action:"escape"}))};return window.addEventListener("keydown",a),()=>window.removeEventListener("keydown",a)},[st,Et,G,ir,sr,Vt,rr,Gi,je,Zn,er,Ft,Yi,Ea,jt,wa,N,Qo,eo,ue,Pa,Ze,Hn,ar,_i,Qn,tr,Zo]);const Dm=g.useCallback(()=>{sp(),F(()=>({...Bl,updatedAt:new Date().toISOString()}),"board.restore",{source:"fixture-reset"}),b(["node-agent-command"]),Ye([]),Et("fixture-reset")},[Et,F]),dr=g.useCallback((a,s="result-click")=>{const i=_r(a),l=Ue(),u={...ie.current,x:l.width/2-i.x*ie.current.scale,y:l.height/2-i.y*ie.current.scale};te(u),b([a.id]),W(a.id),f.emit("search.focused",{query:N.trim(),nodeId:a.id,source:s}),window.setTimeout(()=>W(null),900)},[te,N,Ue]);g.useEffect(()=>{const a=++dn.current,s=By(ie.current,H);f.emit("search.started",{query:N,engine:ua.current?"worker":"local",viewportCenterX:Number(s.centerX.toFixed(2)),viewportCenterY:Number(s.centerY.toFixed(2))});const i=window.setTimeout(()=>{if(a!==dn.current){f.emit("async.staleIgnored",{path:"search",seq:a});return}if(!N.trim()){V([]),ce(0),Pe("none"),f.emit("search.completed",{query:N,count:0,engine:"none"});return}const u=Ma.current;if(u&&ua.current){u.postMessage({type:"SEARCH_QUERY",boardId:v.current.id,seq:a,query:N,limit:8,viewport:s});return}const h=performance.now(),k=Dy(v.current.nodes,N,s,8);V(k),ce(0),Pe("local"),f.emit("search.completed",{query:N,count:k.length,engine:"local",durationMs:Number((performance.now()-h).toFixed(2)),viewportBoosted:!0})},120);return()=>window.clearTimeout(i)},[N,H,ye]);const ao=g.useCallback(a=>{ce(s=>{const i=U.length;if(i===0)return 0;const l=(s+a+i)%i;return f.emit("search.activeChanged",{query:N.trim(),index:l,count:i}),l})},[N,U.length]),cr=g.useCallback(a=>{const s=U[Y];s&&dr(s,a)},[dr,Y,U]),Om=g.useCallback(a=>{if(a.key==="ArrowDown"){a.preventDefault(),ao(1);return}if(a.key==="ArrowUp"){a.preventDefault(),ao(-1);return}if(a.key==="Enter"){a.preventDefault(),cr("keyboard-enter");return}a.key==="Escape"&&(D(""),V([]),ce(0),f.emit("search.cleared"))},[cr,ao]),$m=g.useCallback((a,s)=>{if(s.target.closest("button,input,textarea,select"))return;s.preventDefault(),s.stopPropagation();const i={x:s.clientX,y:s.clientY},l=v.current.nodes.find(I=>I.id===a);if(!l)return;c(I=>$a(I,v.current,{description:"Move nodes",mergeKey:null})),y([]);const u=q.current.includes(a)?q.current:[a],h=new Map(v.current.nodes.filter(I=>u.includes(I.id)).map(I=>[I.id,{x:I.x,y:I.y}])),k=h.get(a)??{x:l.x,y:l.y},C=v.current.settings.gridSnap??!0,j=I=>{const E=(I.clientX-i.x)/ie.current.scale,B=(I.clientY-i.y)/ie.current.scale,T=C?Od(k.x+E)-k.x:E,M=C?Od(k.y+B)-k.y:B;r(L=>({...L,nodes:L.nodes.map(J=>{const Le=h.get(J.id);return Le?{...J,x:Le.x+T,y:Le.y+M}:J}),updatedAt:new Date().toISOString()}))},S=()=>{window.removeEventListener("pointermove",j),window.removeEventListener("pointerup",S),f.emit("node.patch",{id:a,reason:"drag",gridSnap:C})};window.addEventListener("pointermove",j),window.addEventListener("pointerup",S,{once:!0})},[]),Fm=g.useCallback((a,s)=>{if(s.button!==0)return;s.preventDefault(),s.stopPropagation();const i=v.current.nodes.find(E=>E.id===a);if(!i)return;const l={x:s.clientX,y:s.clientY},u=Ab(i);let h={width:i.width,height:i.height};c(E=>$a(E,v.current,{description:"Resize node",mergeKey:null})),y([]),b(E=>E.includes(a)?E:[a]),oe(null),f.emit("node.resize.started",{id:a,width:Math.round(i.width),height:Math.round(i.height)});const k=()=>{document.body.classList.remove("is-resizing-node"),window.removeEventListener("pointermove",j),window.removeEventListener("pointerup",S),window.removeEventListener("pointercancel",I)},C=E=>{const B=(E.clientX-l.x)/ie.current.scale,T=(E.clientY-l.y)/ie.current.scale;let M=i.width+B,L=i.height+T;if(E.shiftKey&&i.width>0&&i.height>0){const J=Math.max(M/i.width,L/i.height);M=i.width*J,L=i.height*J}h={width:Math.round(ge(M,u.minWidth,u.maxWidth)),height:Math.round(ge(L,u.minHeight,u.maxHeight))},r(J=>({...J,nodes:J.nodes.map(Le=>Le.id===a?{...Le,...h}:Le),updatedAt:new Date().toISOString()}))},j=E=>{C(E)},S=E=>{C(E),k(),f.emit("node.resize.completed",{id:a,width:h.width,height:h.height})},I=()=>{k(),f.emit("node.resize.cancelled",{id:a})};document.body.classList.add("is-resizing-node"),window.addEventListener("pointermove",j),window.addEventListener("pointerup",S,{once:!0}),window.addEventListener("pointercancel",I,{once:!0})},[]),Um=g.useCallback(a=>{if(a.button!==0&&a.button!==1&&a.button!==2||Kd(a.target))return;if(a.button===0&&a.ctrlKey&&!a.shiftKey){a.preventDefault(),a.stopPropagation(),Wo(a.clientX,a.clientY,"ctrl-grid-click");return}a.preventDefault();const s={x:a.clientX,y:a.clientY},i=yt(a.clientX,a.clientY),l=a.shiftKey;if(a.button===0){const C=new Set(q.current);oe(null),nt({startX:i.x,startY:i.y,currentX:i.x,currentY:i.y}),f.emit("selection.box.started",{x:Math.round(i.x),y:Math.round(i.y),additive:l});const j=()=>{document.body.classList.remove("is-selecting"),window.removeEventListener("pointermove",S),window.removeEventListener("pointerup",I),window.removeEventListener("pointercancel",E)},S=B=>{const T=yt(B.clientX,B.clientY);nt({startX:i.x,startY:i.y,currentX:T.x,currentY:T.y})},I=B=>{const T=yt(B.clientX,B.clientY),M=qd({startX:i.x,startY:i.y,currentX:T.x,currentY:T.y});if(j(),nt(null),M.width<wd&&M.height<wd){const be=q.current.length;!l&&be>0&&(b([]),oe(null),f.emit("selection.cleared",{source:"canvas-background-click",beforeCount:be})),f.emit("selection.box.cancelled",{reason:"too-small",width:Math.round(M.width),height:Math.round(M.height)});return}const L=ly(M,ie.current),J=v.current.nodes.filter(be=>Xd(be,L)).map(be=>be.id),Le=l?Array.from(new Set([...C,...J])):J;b(Le),f.emit("selection.box.completed",{count:Le.length,additive:l,width:Math.round(M.width),height:Math.round(M.height)})},E=()=>{j(),nt(null),f.emit("selection.box.cancelled",{reason:"pointer-cancelled"})};document.body.classList.add("is-selecting"),window.addEventListener("pointermove",S),window.addEventListener("pointerup",I,{once:!0}),window.addEventListener("pointercancel",E,{once:!0});return}const u={...ie.current},h=C=>{te({...u,x:u.x+C.clientX-s.x,y:u.y+C.clientY-s.y})},k=()=>{document.body.classList.remove("is-panning"),window.removeEventListener("pointermove",h),window.removeEventListener("pointerup",k)};document.body.classList.add("is-panning"),window.addEventListener("pointermove",h),window.addEventListener("pointerup",k,{once:!0})},[te,yt,Wo]),zm=g.useCallback(a=>{a.button===0&&(Kd(a.target)||(a.preventDefault(),a.stopPropagation(),Wo(a.clientX,a.clientY,"double-click")))},[Wo]),ur=g.useCallback(a=>{const s=a.target instanceof Element?a.target:null;if(s!=null&&s.closest('[data-disable-mindcanvas-wheel="true"]'))return;const i=s==null?void 0:s.closest("textarea,.result-popover__body,.mindcanvas-text-scrollable-view"),l=a.ctrlKey||a.metaKey;if(i&&!l)return;const u=v.current.settings.wheelMode?l:!l;a.preventDefault();const h=ie.current;if(u){const k=Math.exp(-a.deltaY*.0012),C=ge(h.scale*k,vs,js),j=xt(a.clientX,a.clientY),S=yt(a.clientX,a.clientY);te({x:S.x-j.x*C,y:S.y-j.y*C,scale:C});return}te({...h,x:h.x-a.deltaX,y:h.y-a.deltaY})},[te,yt,xt]);g.useEffect(()=>{const a=qt.current;if(a)return a.addEventListener("wheel",ur,{passive:!1}),()=>a.removeEventListener("wheel",ur)},[ur]);const ae=n.nodes.find(a=>a.id===p[0]),pn=g.useMemo(()=>{const a=new Set(p);return n.nodes.filter(s=>a.has(s.id))},[n.nodes,p]),no=((fl=ae==null?void 0:ae.metadata)==null?void 0:fl[K.studioNodeType])??"",Hm=no?br(no):"Unassigned",Wm=no==="template.input",ol=g.useMemo(()=>Td(Ne),[Ne]),es=fe&&fe.issues.length===0?fe.template:null,sl=g.useMemo(()=>ls(es,Xt),[Xt,es]),Vm=g.useMemo(()=>pn.filter(a=>a.kind==="image"&&ko(a).length>0).length,[pn]),ct=g.useMemo(()=>{const a=n.nodes.filter(l=>l.kind==="ai-task"),s=a.filter(l=>l.status==="running").length,i=a.filter(l=>l.status==="paused").length;return{total:a.length,runnable:a.filter(l=>l.status!=="running").length,running:s,paused:i,active:s+i}},[n.nodes]),ts=g.useMemo(()=>{if(!ae||ae.kind!=="ai-task")return{size:0,runnable:0};const a=ui(n,ae.id);return{size:a.length,runnable:a.filter(s=>s.status!=="running").length}},[n,ae]),_a=g.useMemo(()=>{if(pn.length<2)return null;const a=Ts(pn);if(!a)return null;const s=Math.max(.01,P.scale),i=a.minX*s+P.x-10,l=a.minY*s+P.y-10,u=a.maxX*s+P.x+10,h=a.maxY*s+P.y+10,k=(i+u)/2,C=l>112?l-52:h+12;return{left:i,top:l,width:Math.max(0,u-i),height:Math.max(0,h-l),toolbarLeft:ge(k,168,Math.max(168,H.width-168)),toolbarTop:ge(C,42,Math.max(42,H.height-58))}},[pn,H.height,H.width,P]),Bt=ue?n.nodes.find(a=>a.id===ue):null,as=Bt?by(Bt):null,rl=st?n.nodes.find(a=>a.id===st&&!!a.companyMode):null,il=Vt?n.nodes.find(a=>a.id===Vt&&a.kind==="directory"):null,ll=g.useMemo(()=>new Set([...p,...U.map(a=>a.id),mt,ue,st,Vt,G==null?void 0:G.from].filter(a=>!!a)),[st,G==null?void 0:G.from,Vt,mt,ue,U,p]),Ba=g.useMemo(()=>{const a=iy(At,H);return n.nodes.filter(s=>ll.has(s.id)||Xd(s,a))},[ll,n.nodes,H,At]),mr=g.useMemo(()=>new Set(Ba.map(a=>a.id)),[Ba]);g.useEffect(()=>{f.emit("visibility.culled",{visible:Ba.length,total:n.nodes.length,scale:Number(At.scale.toFixed(3))})},[n.nodes.length,At.scale,Ba.length]);const Ym=g.useCallback(()=>{const a=v.current,s=q.current.map(l=>a.nodes.find(u=>u.id===l)).find(Boolean),i=(s==null?void 0:s.kind)==="ai-task"?s:a.nodes.find(l=>q.current.includes(l.id)&&l.kind==="ai-task")??a.nodes.find(l=>l.kind==="ai-task");return i?ec(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:",wo(w||(s==null?void 0:s.body)||"No prompt input.",4e3)].join(`
|
|
48
|
+
`)},[w]),dl=g.useMemo(()=>{const a=new Map(n.nodes.map(s=>[s.id,s]));return n.edges.map(s=>{const i=a.get(s.from),l=a.get(s.to);if(!i||!l)return null;const u=s.fromSide??"right",h=s.toSide??"left",k=$t(i,u),C=$t(l,h);return{...s,path:Ed(k,u,C,h)}}).filter(Boolean)},[n.edges,n.nodes]),ns=g.useMemo(()=>{var k,C;if(!G)return null;const a=new Map(n.nodes.map(j=>[j.id,j])),s=a.get(G.from);if(!s)return null;const i=$t(s,G.fromSide),l=G.target?a.get(G.target.id):null,u=((k=G.target)==null?void 0:k.side)??hb(G.fromSide),h=l?$t(l,u):G.pointer;return{kind:G.kind,targetId:((C=G.target)==null?void 0:C.id)??null,path:Ed(i,G.fromSide,h,u)}},[n.nodes,G]),cl=g.useMemo(()=>dl.filter(a=>mr.has(a.from)||mr.has(a.to)),[dl,mr]),ut=g.useMemo(()=>ry(n.nodes,P,H),[n.nodes,P,H]),Gm=g.useCallback(a=>{if(!ut)return;const s=a.currentTarget.getBoundingClientRect(),i=ge(a.clientX-s.left,0,Is),l=ge(a.clientY-s.top,0,Ns),u=ut.bounds.minX+(i-xn)/ut.scale,h=ut.bounds.minY+(l-xn)/ut.scale;te({...ie.current,x:H.width/2-u*ie.current.scale,y:H.height/2-h*ie.current.scale}),f.emit("minimap.navigate",{worldX:Math.round(u),worldY:Math.round(h)})},[te,ut,H.height,H.width]),Ct=n.settings.inputMode==="Image"?"Image":n.settings.inputMode==="Video"?"Video":null,pr=Ct==="Image"?Js:Ct==="Video"?Zs:null,Km=w.trim().length>0||(ae==null?void 0:ae.kind)==="ai-task",ul=N.trim().length>0,ml=U[Y]??null,Xm=ul?`${U.length} result${U.length===1?"":"s"}`:`${n.nodes.length} nodes`,oo=vt?qd(vt):null,os=Dr(n.settings.gridType),pl=n.settings.gridSnap??!0,gl=n.settings.cameraBookmarks??{},hl=Ft,qm=va==="full",R=a=>fi(n.settings.appLanguage,a);return o.jsxs("div",{ref:qt,className:`mindcanvas ${Lt?"mindcanvas--read-mode":""} mindcanvas--function-toolbar-${va}`,"data-function-toolbar-mode":va,"data-read-mode":Lt?"true":"false","data-read-mode-api":Un?"bound":"unbound","data-cursor-mode":n.settings.cursorMode??"center","data-cursor-direction":n.settings.cursorDirection==="down"?"down":"right",onPointerMove:wu,onDragOver:Nm,onDrop:Am,children:[o.jsx("div",{ref:Jt,className:`canvas-plane canvas-plane--grid-${os}`,"data-grid-type":os,"data-grid-snap":n.settings.gridSnap??!0?"on":"off",onPointerDown:Um,onDoubleClick:zm,onContextMenu:a=>a.preventDefault(),children:o.jsxs("div",{ref:sn,className:"canvas-world","data-visible-nodes":Ba.length,"data-total-nodes":n.nodes.length,"data-visible-edges":cl.length,children:[o.jsxs("svg",{className:"edge-layer",width:"4000",height:"3000",viewBox:"-1200 -900 4000 3000","aria-hidden":"true",children:[cl.map(a=>o.jsx("path",{className:`edge-path edge-path--${a.kind}`,d:a.path,onClick:()=>F(s=>({...s,edges:s.edges.filter(i=>i.id!==a.id)}),"edge.delete",{id:a.id})},a.id)),ns&&o.jsx("path",{className:`edge-path edge-path--${ns.kind} edge-path--draft ${ns.targetId?"has-target":""}`,d:ns.path,"data-testid":"edge-connection-preview"})]}),o.jsx("div",{className:"canvas-cursor-marker","data-testid":"canvas-cursor-marker","data-cursor-mode":n.settings.cursorMode??"center","data-cursor-direction":n.settings.cursorDirection==="down"?"down":"right",style:{left:`${gt.x}px`,top:`${gt.y}px`},"aria-hidden":"true"}),Ba.map(a=>o.jsx(jf,{node:a,selected:p.includes(a.id),selectionCount:p.length,pulsing:mt===a.id,connectionDraft:G,onSelect:Zu,onDragStart:$m,onResizeStart:Fm,onPatch:ne,onDelete:Im,onDuplicate:Rm,onRun:ga,onPin:Bm,onConnectorDragStart:_m,onOpenResult:oe,onToggleAiReference:um,onCopyNode:mm,onCopyEmbedReference:pm,onFitNodeHeight:gm,onToggleNodeExpanded:hm,onToggleWordWrap:fm,onStageCompany:bm,onOpenCompanyGraph:ym,onSyncCompanyGoal:xm,onRefreshCompany:Cm,onSetCompanyStatus:Xi,onRemoveCompany:qi,onOpenAsset:jm,onOpenDirectorySettings:rm,onScanDirectory:dm,onCreateRemoteControl:am,onGenerateTemplateCard:tm,appLanguage:n.settings.appLanguage},a.id))]})}),oo?o.jsx("div",{className:"canvas-selection-box",style:{left:oo.left,top:oo.top,width:oo.width,height:oo.height}}):null,_a?o.jsxs(o.Fragment,{children:[o.jsx("div",{className:"canvas-multi-selection-bounds",style:{left:_a.left,top:_a.top,width:_a.width,height:_a.height}}),o.jsxs("div",{className:"multi-selection-toolbar floating-panel",role:"toolbar","aria-label":R("Multi selection actions"),style:{left:_a.toolbarLeft,top:_a.toolbarTop},children:[o.jsx("span",{className:"multi-selection-toolbar__count",children:pn.length}),o.jsx("button",{type:"button",title:R("Copy selected nodes"),"data-testid":"multi-selection-copy",onClick:()=>void ir(),children:o.jsx(So,{size:15})}),o.jsx("button",{type:"button",title:R("Duplicate selected nodes"),onClick:()=>rr("multi-toolbar"),children:o.jsx(fc,{size:15})}),o.jsx("button",{type:"button",title:R("Bring selected nodes to front"),"data-testid":"multi-selection-bring-front",onClick:()=>eo("front","multi-toolbar"),children:o.jsx(ag,{size:15})}),o.jsx("button",{type:"button",title:R("Send selected nodes to back"),"data-testid":"multi-selection-send-back",onClick:()=>eo("back","multi-toolbar"),children:o.jsx(ng,{size:15})}),o.jsx("button",{type:"button",title:R("Fit selected text heights"),onClick:Mm,children:o.jsx(Ql,{size:15})}),o.jsx("span",{className:"multi-selection-toolbar__separator"}),o.jsx("button",{type:"button",title:R("Arrange selected nodes as grid"),onClick:()=>lr("grid"),children:o.jsx(ed,{size:15})}),o.jsx("button",{type:"button",title:R("Arrange selected nodes as strip"),onClick:()=>lr("strip"),children:o.jsx(td,{size:15})}),o.jsx("button",{type:"button",title:R("Tidy selected nodes"),"data-testid":"multi-selection-tidy",onClick:()=>lr("tidy"),children:o.jsx(ad,{size:15})}),Vm>=2&&o.jsx("button",{type:"button",title:R("Stack selected image nodes"),"data-testid":"multi-selection-merge-images",onClick:Tm,children:o.jsx(cs,{size:15})}),o.jsx("span",{className:"multi-selection-toolbar__separator"}),o.jsx("button",{type:"button",title:R("Delete selected nodes"),className:"is-danger","data-testid":"multi-selection-delete",onClick:()=>sr("multi-toolbar"),children:o.jsx(Ps,{size:15})}),o.jsx("button",{type:"button",title:R("Clear selection"),"data-testid":"multi-selection-clear",onClick:()=>{const a=q.current.length;b([]),f.emit("selection.cleared",{source:"multi-toolbar",beforeCount:a})},children:o.jsx(Ot,{size:15})})]})]}):null,Rn&&o.jsx("div",{className:"node-action-toast floating-panel",role:"status",children:Rn}),o.jsxs("div",{className:"top-tabbar",role:"tablist","aria-label":"MindCanvas boards",children:[nn.map(a=>{const s=a.id===n.id,i=at(a.name),l=Mb(a,n,s);return o.jsxs("div",{className:`tab-shell ${s?"is-active":""} ${Wt===a.id?"is-dragging":""} ${$n===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":Wt===a.id?"dragging":$n===a.id?"over":"idle",onDragStart:u=>{u.dataTransfer.effectAllowed="move",u.dataTransfer.setData("text/plain",a.id),On(a.id),f.emit("board.tabs.dragStart",{boardId:a.id})},onDragOver:u=>{!Wt||Wt===a.id||(u.preventDefault(),u.dataTransfer.dropEffect="move",la(a.id))},onDragLeave:()=>{la(u=>u===a.id?null:u)},onDrop:u=>{u.preventDefault();const h=Wt||u.dataTransfer.getData("text/plain");xu(h,a.id),On(null),la(null)},onDragEnd:()=>{On(null),la(null)},onMouseDown:u=>{u.button===1&&(u.preventDefault(),Xs(a.id,"middle-click"))},children:[o.jsxs("button",{type:"button",role:"tab","aria-selected":s,className:`tab-button ${s?"tab-button--current":""}`,title:s?`Boards / ${i}`:i,"aria-label":l===i?i:`${l} board, ${i}`,"data-testid":"board-tab","data-board-id":a.id,"data-board-tab-title":i,"data-board-tab-display-title":l,onClick:()=>s?du():Oi(a.id),children:[a.sourceKind==="localBridge"?o.jsx(mo,{size:15}):o.jsx(cs,{size:15}),o.jsx("span",{children:l})]}),!s&&o.jsx("button",{type:"button",className:"tab-close",title:R("Close tab"),"data-testid":"board-tab-close",onClick:u=>{u.stopPropagation(),Xs(a.id,"close-button")},children:o.jsx(Ot,{size:13})})]},a.id)}),o.jsx("button",{type:"button",className:"tab-button tab-button--plain",title:R("New board"),"data-testid":"board-create",onClick:Di,children:o.jsx(Co,{size:16})})]}),Ft&&o.jsxs(o.Fragment,{children:[o.jsx("button",{type:"button",className:"local-board-backdrop project-gallery-backdrop","aria-label":"Close project gallery","data-testid":"project-gallery-backdrop","data-project-gallery-backdrop":"true",onClick:()=>Et("backdrop")}),o.jsx("div",{className:"project-gallery-shell","data-project-gallery-shell":"true",children:o.jsx("div",{className:"project-gallery-positioner","data-project-gallery-positioner":"true",children:o.jsxs("section",{className:"local-board-panel project-gallery-panel floating-panel","aria-label":"Project Gallery","data-testid":"project-gallery-panel","data-project-gallery-panel":"true","data-project-storage-current-mode":$e.currentMode,"data-project-storage-selected-tab":Ve,"data-project-storage-local-provider":$e.localProviderKind,"data-project-storage-cloud-available":$e.isCloudAvailable?"true":"false","data-project-storage-can-sync-cloud":$e.canSyncLocalToCloud?"true":"false",children:[o.jsxs("header",{className:"local-board-panel__head project-gallery-panel__head",children:[o.jsxs("div",{className:"project-gallery-title",children:[o.jsxs("span",{className:"project-gallery-title__eyebrow",children:[o.jsx(ed,{size:15}),"Project Gallery"]}),o.jsx("strong",{children:"Projects"}),o.jsx("p",{children:"Select a canvas snapshot to focus an open tab or load it in a new tab."})]}),o.jsxs("div",{className:"local-board-panel__actions project-gallery-panel__actions",children:[o.jsx("button",{type:"button",title:"New board",onClick:Di,children:o.jsx(Co,{size:15})}),o.jsx("button",{type:"button",title:"Close Project Gallery",onClick:()=>Et("close-button"),children:o.jsx(Ot,{size:15})})]})]}),o.jsxs("div",{className:"project-gallery-body",children:[o.jsxs("aside",{className:"project-gallery-folder-rail","data-project-gallery-folder-rail":"true",children:[o.jsxs("div",{className:"project-storage-tabs",role:"tablist","aria-label":"Project storage mode","data-project-storage-show-local":$e.showLocalTab?"true":"false","data-project-storage-show-cloud":$e.showCloudTab?"true":"false",children:[o.jsxs("button",{type:"button",role:"tab","aria-selected":Ve==="local",className:Ve==="local"?"is-active":"","data-testid":"project-storage-tab-local",onClick:()=>Bi("local"),children:[o.jsx(mo,{size:14}),"Local"]}),o.jsxs("button",{type:"button",role:"tab","aria-selected":Ve==="cloud",className:Ve==="cloud"?"is-active":"","data-testid":"project-storage-tab-cloud",onClick:()=>Bi("cloud"),children:[o.jsx(us,{size:14}),"Cloud"]})]}),o.jsxs("label",{className:"project-gallery-current-name",children:[o.jsx("span",{children:"Current canvas"}),o.jsx("input",{"aria-label":"Board name",className:"board-name-input",maxLength:90,value:n.name,onChange:a=>qs(a.target.value)})]}),o.jsxs("div",{className:"project-gallery-rail-card",children:[o.jsx("span",{children:"Storage"}),o.jsx("strong",{children:Ve==="local"?`${Je.length} local boards`:"Cloud gated"}),o.jsx("small",{children:Ve==="local"?`${$e.localProviderKind} provider / browser catalog and LocalBridge boards`:$e.cloudStatusMessage??"Auth adapter required"})]}),o.jsxs("div",{className:"project-gallery-rail-card project-gallery-workspace-summary","data-testid":"project-gallery-workspace-summary",children:[o.jsx("span",{children:"Local Workspace"}),o.jsx("strong",{title:Ae||void 0,children:Ve==="local"?Ae?Cs(Ae):lc(Ie):"Cloud gated"}),o.jsx("small",{children:Ve==="local"?Ae||zt||"Connect LocalBridge to choose storage.":"Workspace selection is local only."})]}),o.jsxs("label",{className:"project-gallery-startup-toggle","data-testid":"project-gallery-show-at-startup",children:[o.jsx("input",{type:"checkbox",checked:ka,onChange:a=>cu(a.target.checked)}),o.jsx("span",{children:"Show at startup"})]})]}),o.jsx("section",{className:"project-gallery-board-area",children:Ve==="local"?o.jsxs(o.Fragment,{children:[o.jsxs("div",{className:"local-board-section project-gallery-board-section",children:[o.jsxs("div",{className:"local-board-section__title",children:[o.jsx("span",{children:"Workspace"}),o.jsxs("small",{children:[Je.length," saved"]})]}),o.jsxs("div",{className:"local-board-list local-board-list--stored project-gallery-board-grid","data-project-gallery-board-grid":"true",children:[Je.map(a=>{const s=_n===a.id,i=a.id===n.id;return o.jsx("div",{"data-testid":"stored-board-row","data-board-id":a.id,className:`local-board-row local-board-row--compound project-gallery-board-card ${i?"is-active":""} ${s?"is-editing":""}`,children:s?o.jsxs("div",{className:"stored-board-rename",children:[o.jsx("input",{"aria-label":"Rename saved board",maxLength:90,value:Dn,onChange:l=>qa(l.target.value),onKeyDown:l=>cm(a.id,l),onPointerDown:l=>l.stopPropagation(),autoFocus:!0}),o.jsx("button",{type:"button",title:"Save board name","data-testid":"stored-board-rename-save",onClick:()=>or(a.id),children:o.jsx(Cr,{size:13})}),o.jsx("button",{type:"button",title:"Cancel rename","data-testid":"stored-board-rename-cancel",onClick:nr,children:o.jsx(Ot,{size:13})})]}):o.jsxs(o.Fragment,{children:[o.jsxs("button",{type:"button",className:"local-board-row__main","data-testid":"stored-board-open","data-project-gallery-open-board":"true",onClick:()=>Oi(a.id),onDoubleClick:l=>{l.stopPropagation(),Ki(a)},children:[a.sourceKind==="localBridge"?o.jsx(mo,{size:15}):o.jsx(St,{size:15}),o.jsxs("span",{children:[o.jsx("strong",{children:at(a.name)}),o.jsx("small",{children:uy(a)}),i&&o.jsx("small",{className:"project-gallery-open-tab-badge",children:"Open tab"})]})]}),o.jsx("button",{type:"button",className:"local-board-row__action",title:"Rename board","data-testid":"stored-board-rename",onClick:()=>Ki(a),children:o.jsx(nd,{size:14})}),o.jsx("button",{type:"button",className:"local-board-row__action",title:"Delete board","data-testid":"stored-board-delete",disabled:i,onClick:()=>Xs(a.id,"project-gallery"),children:o.jsx(Ps,{size:14})})]})},a.id)}),Je.length===0&&o.jsx("p",{className:"local-board-message",children:"No saved React boards yet."})]})]}),o.jsxs("div",{className:"local-board-section project-gallery-bridge-section",children:[o.jsxs("div",{className:"local-board-section__title",children:[o.jsx("span",{children:"LocalBridge"}),o.jsx("button",{type:"button",title:"Refresh local boards",onClick:Zt,disabled:Ie==="checking",children:Ie==="checking"?o.jsx(aa,{size:15,className:"spin-icon"}):o.jsx(jn,{size:15})})]}),o.jsxs("div",{className:`local-board-state local-board-state--${Ie}`,children:[Ie==="blocked"?o.jsx(og,{size:15}):Ie==="unavailable"?o.jsx(sg,{size:15}):o.jsx(mo,{size:15}),o.jsx("span",{children:lc(Ie)}),Ie==="blocked"&&!ro()&&o.jsx("button",{type:"button",onClick:uu,children:"Enable"})]}),Ao&&o.jsx("p",{className:"local-board-message",children:Ao}),o.jsxs("div",{className:"project-gallery-workspace-panel","data-testid":"project-gallery-workspace-panel","data-project-gallery-workspace-panel":"true",children:[o.jsxs("div",{className:"project-gallery-workspace-panel__main",children:[o.jsx(kr,{size:16}),o.jsxs("span",{children:[o.jsx("strong",{children:"Local Workspace"}),o.jsx("small",{title:Ae||void 0,children:Ae||zt||"LocalBridge workspace not connected."})]})]}),o.jsxs("div",{className:"project-gallery-workspace-panel__actions",children:[o.jsxs("button",{type:"button","data-testid":"project-gallery-workspace-refresh",title:"Refresh workspace",disabled:Te,onClick:()=>void mu("workspace-panel"),children:[o.jsx(jn,{size:14}),o.jsx("span",{children:"Refresh"})]}),o.jsxs("button",{type:"button","data-testid":"project-gallery-workspace-browse",title:"Select Local Storage",disabled:Te||Ie==="blocked"&&!ro(),onClick:()=>void pu(),children:[Te?o.jsx(aa,{size:14,className:"spin-icon"}):o.jsx(kr,{size:14}),o.jsx("span",{children:"Select Local Storage"})]})]}),Mo.length>0&&o.jsx("div",{className:"project-gallery-workspace-history","data-testid":"project-gallery-workspace-history",children:Mo.map(a=>o.jsx("button",{type:"button",title:a,disabled:Te||a===Ae,onClick:()=>void Ks(a,"history"),children:Cs(a,40)},a))})]}),o.jsxs("button",{type:"button",className:"local-board-export","data-testid":"localbridge-export",disabled:Pn||!!((bl=n.source)!=null&&bl.partialImport)||!!((yl=n.source)!=null&&yl.truncated)||Ie==="blocked"&&!ro(),title:(xl=n.source)!=null&&xl.partialImport?"Export blocked for partial original imports":(Cl=n.source)!=null&&Cl.truncated?"Export blocked for truncated imported boards":"Export current board to LocalBridge",onClick:()=>void gu(),children:[Pn?o.jsx(aa,{size:15,className:"spin-icon"}):o.jsx(od,{size:15}),o.jsx("span",{children:Pn?"Exporting":"Export current"})]}),o.jsx("div",{className:"local-board-list project-gallery-bridge-list",children:sa.slice(0,14).map(a=>o.jsxs("button",{type:"button","data-testid":"localbridge-board-row","data-board-id":a.Id,className:"local-board-row",disabled:!!ht,onClick:()=>void Cu(a),children:[o.jsx(mo,{size:15}),o.jsxs("span",{children:[o.jsx("strong",{children:at(a.Title)}),o.jsx("small",{children:ii(a.UpdatedAt)})]}),ht===a.Id&&o.jsx(aa,{size:15,className:"spin-icon"})]},a.Id))})]})]}):o.jsxs("div",{className:"project-cloud-shell","data-testid":"project-cloud-shell","data-project-cloud-status":$e.isCloudAvailable?"available":"gated","data-project-cloud-plan":$e.cloudPlanKey,"data-project-cloud-entitlement":$e.cloudEntitlementStatus,"data-production-adapter-state":Oe.overallState,"data-project-cloud-database-mode":Oe.cloudBoards.mode,"data-project-cloud-database-ready":Oe.cloudBoards.canAttempt?"true":"false","data-project-cloud-asset-upload-mode":Oe.cloudAssetUpload.mode,"data-project-cloud-asset-upload-ready":Oe.cloudAssetUpload.canAttempt?"true":"false","data-client-secret-blocked":Oe.forbiddenClientSecretKeys.length>0?"true":"false",children:[o.jsx("div",{className:"project-cloud-shell__icon",children:Ce?o.jsx(us,{size:22}):o.jsx(rg,{size:22})}),o.jsx("strong",{children:Ce?"Cloud boards are provider-ready":"Cloud projects are adapter-gated"}),o.jsx("p",{children:Ce?"Supabase auth and board storage are connected for this browser session. Cloud actions call the provider adapter only from this tab.":"The original project popup had a Cloud tab for authenticated boards. This React port keeps that navigation habit visible, but cloud sync is disabled until auth and database adapters are connected."}),o.jsxs("div",{className:"project-cloud-shell__current",children:[o.jsxs("span",{children:["Current: ",Ce?"Cloud ready":"Local"]}),o.jsxs("small",{children:[at(n.name)," / ",En??$e.cloudStatusMessage??"saved in this browser"]})]}),o.jsxs("button",{type:"button","data-testid":"project-cloud-new-board",disabled:!Ce||Rt,title:Ce?"Create and save a cloud board":"Cloud board creation requires the cloud adapter",onClick:bu,children:[Rt?o.jsx(aa,{size:14,className:"spin-icon"}):o.jsx(Co,{size:14}),Rt?"Saving":"New cloud board"]}),o.jsxs("button",{type:"button","data-testid":"project-cloud-save-current",disabled:!Ce||Rt,title:Ce?"Save current board to Supabase":"Cloud save requires Supabase login",onClick:fu,children:[o.jsx(od,{size:14}),"Save current"]}),o.jsxs("button",{type:"button","data-testid":"project-cloud-refresh",disabled:!Ce||Rt,title:Ce?"Refresh cloud boards":"Cloud refresh requires Supabase login",onClick:()=>void Gs("refresh-button"),children:[Rt?o.jsx(aa,{size:14,className:"spin-icon"}):o.jsx(jn,{size:14}),"Refresh cloud"]}),o.jsxs("button",{type:"button","data-testid":"project-cloud-login-shell",onClick:()=>e("/login"),children:[o.jsx(us,{size:14}),"Open login shell"]}),Ce&&o.jsxs("div",{className:"local-board-list project-gallery-cloud-list","data-testid":"project-cloud-board-list",children:[Ka.map(a=>o.jsxs("button",{type:"button","data-testid":"project-cloud-board-row","data-board-id":a.id,className:"local-board-row",disabled:!!Xa,onClick:()=>void hu(a),children:[o.jsx(us,{size:15}),o.jsxs("span",{children:[o.jsx("strong",{children:at(a.name)}),o.jsxs("small",{children:[ii(a.updatedAt)," / ",a.nodeCount," nodes"]})]}),Xa===a.id&&o.jsx(aa,{size:15,className:"spin-icon"})]},a.id)),Ka.length===0&&o.jsx("p",{className:"local-board-message",children:"No cloud boards loaded."})]})]})})]})]})})})]}),Hn&&re&&o.jsx(Wl,{launchers:ja,activeLauncher:re,template:Ge,selectedOptionId:rt,values:Kt,validationMessage:Wn??(on?null:Vn),canCreate:on||!Vn,primaryLabel:on?"Add template card":"Create board",onLauncherSelected:Du,onOptionSelected:Fu,onInputChanged:Uu,onCreate:yu,onClose:$u}),Ja&&o.jsx("div",{className:"template-studio-chooser-backdrop","data-testid":"template-studio-chooser",onMouseDown:zi,children:o.jsxs("section",{className:"template-studio-chooser floating-panel",onMouseDown:a=>a.stopPropagation(),children:[o.jsxs("header",{className:"template-studio-chooser__head",children:[o.jsxs("div",{children:[o.jsx("span",{children:"Template Studio"}),o.jsx("strong",{children:"Current Canvas Authoring Mode"})]}),o.jsx("button",{type:"button",title:"Close Template Studio chooser","data-testid":"template-studio-chooser-close",onClick:zi,children:o.jsx(Ot,{size:15})})]}),o.jsx("p",{className:"template-studio-chooser__description",children:"Use the existing canvas and node UI, then attach template roles and input variables before compiling a manifest."}),o.jsxs("div",{className:"template-studio-chooser__actions",children:[o.jsxs("button",{type:"button","data-testid":"template-studio-start-new",className:"template-studio-chooser__action",onClick:Hu,children:[o.jsx("span",{className:"template-studio-chooser__icon",children:o.jsx(Co,{size:17})}),o.jsxs("span",{children:[o.jsx("strong",{children:"New template board"}),o.jsx("small",{children:"Start a blank Studio draft on a new local board."})]})]}),o.jsxs("button",{type:"button","data-testid":"template-studio-convert-current",className:"template-studio-chooser__action",onClick:Wu,children:[o.jsx("span",{className:"template-studio-chooser__icon",children:o.jsx(ms,{size:17})}),o.jsxs("span",{children:[o.jsx("strong",{children:"Convert current board"}),o.jsx("small",{children:"Keep this board and assign roles to existing nodes."})]})]})]})]})}),en&&o.jsxs(o.Fragment,{children:[o.jsxs("section",{className:"template-studio-toolbar-stack","data-testid":"template-studio-toolbar",onMouseDown:a=>a.stopPropagation(),children:[o.jsxs("div",{className:"template-studio-toolbar floating-panel",children:[o.jsxs("div",{className:"template-studio-toolbar__badge",children:[o.jsx(cs,{size:15}),o.jsx("span",{children:"Template Studio"})]}),o.jsxs("div",{className:"template-studio-toolbar__meta",children:["Editing ",Ne.templateId]}),o.jsx("button",{type:"button",title:"Compile manifest","data-testid":"template-studio-compile",onClick:Qs,children:o.jsx(kn,{size:15})}),o.jsx("button",{type:"button",title:"Test create board","data-testid":"template-studio-test-create",onClick:Ku,children:o.jsx(ya,{size:15})}),o.jsx("button",{type:"button",title:"Copy manifest JSON","data-testid":"template-studio-copy",onClick:()=>void Gu(),children:o.jsx(So,{size:15})}),o.jsx("button",{type:"button",title:"Save template draft","data-testid":"template-studio-save",onClick:Vu,children:o.jsx(Cr,{size:15})}),o.jsx("button",{type:"button",title:"Exit Template Studio","data-testid":"template-studio-close",onClick:Wi,children:o.jsx(Ot,{size:15})})]}),o.jsx("div",{className:"template-studio-toolbar template-studio-toolbar--roles floating-panel",children:yr.filter(a=>a.studioNodeType!=="template.note").map(a=>o.jsx("button",{type:"button",title:`Add ${a.label}`,"data-testid":"template-studio-add-node","data-studio-node-type":a.studioNodeType,onClick:()=>Yu(a.studioNodeType),children:o.jsx("span",{children:a.shortLabel})},a.studioNodeType))}),ae&&o.jsxs("div",{className:"template-studio-toolbar template-studio-toolbar--selected floating-panel",children:[o.jsxs("div",{className:"template-studio-toolbar__meta template-studio-toolbar__meta--selected",children:["Selected: ",ae.title||ae.kind]}),yr.map(a=>o.jsx("button",{type:"button",title:a.label,className:no===a.studioNodeType?"is-active":"","data-testid":"template-studio-role","data-studio-node-type":a.studioNodeType,onClick:()=>Vi(a.studioNodeType),children:o.jsx("span",{children:a.shortLabel})},a.studioNodeType))]})]}),o.jsxs("aside",{className:"template-studio-panel floating-panel","data-testid":"template-studio-panel",onMouseDown:a=>a.stopPropagation(),children:[o.jsxs("header",{className:"template-studio-panel__head",children:[o.jsxs("div",{children:[o.jsx("span",{children:"Template Meta"}),o.jsx("strong",{children:Ne.templateTitle})]}),o.jsx("button",{type:"button",title:"Close Template Studio",onClick:Wi,children:o.jsx(Ot,{size:15})})]}),o.jsxs("div",{className:"template-studio-panel__body",children:[o.jsxs("section",{className:"template-studio-panel__section",children:[o.jsxs("label",{className:"template-studio-panel__field",children:[o.jsx("span",{children:"Template Id"}),o.jsx("input",{type:"text","data-testid":"template-studio-template-id",value:Ne.templateId,onChange:a=>Go("templateId",a.target.value)})]}),o.jsxs("label",{className:"template-studio-panel__field",children:[o.jsx("span",{children:"Template Title"}),o.jsx("input",{type:"text",value:Ne.templateTitle,onChange:a=>Go("templateTitle",a.target.value)})]}),o.jsxs("label",{className:"template-studio-panel__field",children:[o.jsx("span",{children:"Category"}),o.jsx("input",{type:"text",value:Ne.category,onChange:a=>Go("category",a.target.value)})]}),o.jsxs("label",{className:"template-studio-panel__field",children:[o.jsx("span",{children:"Generated Board Title"}),o.jsx("input",{type:"text",value:Ne.boardTitle,onChange:a=>Go("boardTitle",a.target.value)})]})]}),ae?o.jsxs("section",{className:"template-studio-panel__section","data-testid":"template-studio-selected-node",children:[o.jsxs("div",{className:"template-studio-panel__node-summary",children:[o.jsx("strong",{children:ae.title||ae.kind}),o.jsx("span",{children:Hm})]}),o.jsxs("label",{className:"template-studio-panel__field",children:[o.jsx("span",{children:"Template Role"}),o.jsxs("select",{value:no,onChange:a=>Vi(a.target.value),children:[o.jsx("option",{value:"",children:"Unassigned"}),yr.map(a=>o.jsx("option",{value:a.studioNodeType,children:a.label},a.studioNodeType))]})]}),o.jsxs("label",{className:"template-studio-panel__field",children:[o.jsx("span",{children:"Template Node Id"}),o.jsx("input",{type:"text",value:((kl=ae.metadata)==null?void 0:kl[K.templateNodeId])??"",onChange:a=>Qt(K.templateNodeId,a.target.value)})]}),o.jsxs("label",{className:"template-studio-panel__field",children:[o.jsx("span",{children:"Compile Target"}),o.jsxs("select",{value:((Sl=ae.metadata)==null?void 0:Sl[K.compileTarget])??"",onChange:a=>Qt(K.compileTarget,a.target.value),children:[o.jsx("option",{value:"",children:"Auto"}),Ip.map(a=>o.jsx("option",{value:a,children:a},a))]})]}),Wm?o.jsxs(o.Fragment,{children:[o.jsxs("label",{className:"template-studio-panel__field",children:[o.jsx("span",{children:"Input Key"}),o.jsx("input",{type:"text",value:((wl=ae.metadata)==null?void 0:wl[K.inputKey])??"",onChange:a=>Qt(K.inputKey,a.target.value)})]}),o.jsxs("label",{className:"template-studio-panel__field",children:[o.jsx("span",{children:"Input Type"}),o.jsxs("select",{value:((vl=ae.metadata)==null?void 0:vl[K.inputType])??"text",onChange:a=>Qt(K.inputType,a.target.value),children:[o.jsx("option",{value:"text",children:"Text"}),o.jsx("option",{value:"textarea",children:"Textarea"}),o.jsx("option",{value:"select",children:"Select"})]})]}),o.jsxs("label",{className:"template-studio-panel__checkbox",children:[o.jsx("input",{type:"checkbox",checked:(((jl=ae.metadata)==null?void 0:jl[K.inputRequired])??"").toLowerCase()==="true",onChange:a=>Qt(K.inputRequired,String(a.target.checked))}),o.jsx("span",{children:"Required input"})]}),o.jsxs("label",{className:"template-studio-panel__field",children:[o.jsx("span",{children:"Placeholder"}),o.jsx("input",{type:"text",value:((Il=ae.metadata)==null?void 0:Il[K.inputPlaceholder])??"",onChange:a=>Qt(K.inputPlaceholder,a.target.value)})]}),o.jsxs("label",{className:"template-studio-panel__field",children:[o.jsx("span",{children:"Default Value"}),o.jsx("input",{type:"text",value:((Nl=ae.metadata)==null?void 0:Nl[K.inputDefaultValue])??"",onChange:a=>Qt(K.inputDefaultValue,a.target.value)})]}),o.jsxs("label",{className:"template-studio-panel__field",children:[o.jsx("span",{children:"Description"}),o.jsx("textarea",{value:((Al=ae.metadata)==null?void 0:Al[K.inputDescription])??"",onChange:a=>Qt(K.inputDescription,a.target.value)})]}),o.jsxs("label",{className:"template-studio-panel__field",children:[o.jsx("span",{children:"Select Options"}),o.jsx("textarea",{placeholder:`value|label
|
|
49
|
+
value2|label2`,value:((Ml=ae.metadata)==null?void 0:Ml[K.inputOptions])??"",onChange:a=>Qt(K.inputOptions,a.target.value)})]})]}):o.jsx("p",{className:"template-studio-panel__hint",children:"Edit title and body directly on the canvas. This panel controls the template role and compile target."})]}):o.jsx("section",{className:"template-studio-panel__section",children:o.jsx("p",{className:"template-studio-panel__hint",children:"Select a canvas node to assign a template role."})}),o.jsxs("section",{className:"template-studio-panel__section",children:[o.jsxs("div",{className:"template-studio-panel__section-head",children:[o.jsx("span",{children:"Compiled Manifest"}),Oo&&o.jsx("small",{children:Oo})]}),fe!=null&&fe.issues.length?o.jsx("div",{className:"template-studio-panel__issues","data-testid":"template-studio-issues",children:fe.issues.map(a=>o.jsxs("div",{className:"template-studio-panel__issue",children:[o.jsx("strong",{children:a.code}),o.jsx("span",{children:a.message})]},`${a.code}-${a.message}`))}):null,fe?o.jsx("pre",{className:"template-studio-panel__manifest","data-testid":"template-studio-manifest",children:fe.manifestJson}):o.jsx("p",{className:"template-studio-panel__hint",children:"Compile to preview the JSON manifest for the selected Studio nodes."})]})]})]})]}),Ys&&es&&o.jsx(Wl,{launchers:[ol],activeLauncher:ol,template:es,selectedOptionId:null,values:Xt,validationMessage:an??sl,canCreate:!sl,onLauncherSelected:()=>{},onOptionSelected:()=>{},onInputChanged:qu,onCreate:Ju,onClose:Xu}),o.jsx("input",{ref:Gn,type:"file",accept:"application/json,.json",multiple:!0,hidden:!0,"data-testid":"board-import-input",onChange:a=>{Su(a.currentTarget.files),a.currentTarget.value=""}}),!hl&&o.jsxs(o.Fragment,{children:[o.jsx("div",{className:"canvas-toolbar",role:"toolbar","aria-label":R(qm?"MindCanvas all tools":"MindCanvas curated tools"),"data-testid":"canvas-function-toolbar","data-function-toolbar-mode":va,children:va==="curated"?o.jsxs(o.Fragment,{children:[o.jsx("button",{type:"button",title:R("Add note"),"data-testid":"note-node-add",onClick:()=>we("note"),children:o.jsx(Ls,{size:17})}),o.jsx("button",{type:"button",title:R("Add image"),"data-testid":"image-node-add",onClick:()=>we("image"),children:o.jsx(Sn,{size:17})}),o.jsx("button",{type:"button",title:R("Add video"),"data-testid":"video-node-add",onClick:()=>we("video"),children:o.jsx(wn,{size:17})}),o.jsx("button",{type:"button",title:R("Add remote monitor"),"data-testid":"remote-monitor-node-add",onClick:()=>we("remote-monitor"),children:o.jsx(Rs,{size:17})}),o.jsx("button",{type:"button",title:R("Add AI Task"),"data-testid":"ai-task-node-add",onClick:()=>we("ai-task"),children:o.jsx(Cn,{size:17})}),o.jsx("button",{type:"button",title:R("Add file reference"),"data-testid":"file-node-add",onClick:()=>we("file"),children:o.jsx(Yr,{size:17})}),o.jsx("button",{type:"button",title:R("Tools"),onClick:()=>e("/tools"),children:o.jsx(ws,{size:17})}),o.jsx("span",{className:"toolbar-separator"}),o.jsx("button",{type:"button",title:R("Run all graphs"),"data-testid":"automation-run-all","data-ai-task-total":ct.total,"data-ai-task-runnable":ct.runnable,"data-ai-task-running":ct.running,onClick:Qi,children:o.jsx(ya,{size:17})}),o.jsx("button",{type:"button",title:R("Run selected graph"),"data-testid":"automation-run-selected","data-selected-graph-size":ts.size,"data-selected-graph-runnable":ts.runnable,disabled:!ae||ae.kind!=="ai-task",onClick:Ji,children:o.jsx(Sr,{size:17})}),o.jsx("button",{type:"button",title:R("Pause running AI tasks"),"data-testid":"automation-pause","data-running-ai-tasks":ct.running,onClick:el,children:o.jsx(jo,{size:17})}),o.jsx("button",{type:"button",title:R("Stop active AI tasks"),"data-testid":"automation-stop","data-active-ai-tasks":ct.active,"data-paused-ai-tasks":ct.paused,onClick:tl,children:o.jsx(sd,{size:15})}),o.jsx("button",{type:"button",title:R(Tt?"Generating flow":"Generate flow"),disabled:!ae||Tt,onClick:()=>void al(),children:Tt?o.jsx(aa,{size:17,className:"spin-icon"}):o.jsx(ms,{size:17})}),o.jsx("span",{className:"toolbar-separator"}),o.jsx("button",{type:"button",title:R("Undo"),"data-testid":"history-undo",disabled:d.length===0,onClick:Zo,children:o.jsx(rd,{size:17})}),o.jsx("button",{type:"button",title:R("Redo"),"data-testid":"history-redo",disabled:m.length===0,onClick:Qo,children:o.jsx(id,{size:17})})]}):o.jsxs(o.Fragment,{children:[o.jsx("button",{type:"button",title:R("Add note"),"data-testid":"note-node-add",onClick:()=>we("note"),children:o.jsx(Ls,{size:17})}),o.jsx("button",{type:"button",title:R("Add memo"),"data-testid":"memo-node-add",onClick:()=>we("memo"),children:o.jsx(hc,{size:17})}),o.jsx("button",{type:"button",title:R("Add markdown"),"data-testid":"markdown-node-add",onClick:()=>we("markdown"),children:o.jsx(St,{size:17})}),o.jsx("button",{type:"button",title:R("Add CSV table"),"data-testid":"csv-table-node-add",onClick:()=>we("csv-table"),children:o.jsx(td,{size:17})}),o.jsx("button",{type:"button",title:R("Add code"),"data-testid":"code-node-add",onClick:()=>we("code"),children:o.jsx(kn,{size:17})}),o.jsx("button",{type:"button",title:R("Add AI Task"),"data-testid":"ai-task-node-add",onClick:()=>we("ai-task"),children:o.jsx(Cn,{size:17})}),o.jsx("button",{type:"button",title:R("Add Code Note"),"data-testid":"code-note-node-add",onClick:em,children:o.jsx(kn,{size:17})}),o.jsx("button",{type:"button",title:R("Add Agent Command"),"data-testid":"agent-command-node-add",onClick:Qu,children:o.jsx(ig,{size:17})}),o.jsx("button",{type:"button",title:R("Add image generation spec"),"data-testid":"image-generate-node-add",onClick:()=>we("ai-task","image-generate"),children:o.jsx(Sn,{size:17})}),o.jsx("button",{type:"button",title:R("Add video generation spec"),"data-testid":"video-generate-node-add",onClick:()=>we("ai-task","video-generate"),children:o.jsx(wn,{size:17})}),o.jsx("button",{type:"button",title:R("Add image"),"data-testid":"image-node-add",onClick:()=>we("image"),children:o.jsx(Sn,{size:17})}),o.jsx("button",{type:"button",title:R("Add image mask"),"data-testid":"mask-node-add",onClick:()=>we("mask"),children:o.jsx(lg,{size:17})}),o.jsx("button",{type:"button",title:R("Add video"),"data-testid":"video-node-add",onClick:()=>we("video"),children:o.jsx(wn,{size:17})}),o.jsx("button",{type:"button",title:R("Add embed"),"data-testid":"embed-node-add",onClick:()=>we("embed"),children:o.jsx(vn,{size:17})}),o.jsx("button",{type:"button",title:R("Add remote monitor"),"data-testid":"remote-monitor-node-add",onClick:()=>we("remote-monitor"),children:o.jsx(Rs,{size:17})}),o.jsx("button",{type:"button",title:R("Add PDF"),"data-testid":"pdf-node-add",onClick:()=>we("pdf"),children:o.jsx(St,{size:17})}),o.jsx("button",{type:"button",title:R("Add file reference"),"data-testid":"file-node-add",onClick:()=>we("file"),children:o.jsx(Yr,{size:17})}),o.jsx("button",{type:"button",title:R("Add directory reference"),"data-testid":"directory-node-add",onClick:()=>we("directory"),children:o.jsx(kr,{size:17})}),o.jsx("button",{type:"button",title:R("Templates"),"data-testid":"template-launcher-open",onClick:Ou,children:o.jsx(cs,{size:17})}),o.jsx("button",{type:"button",title:R("Template Studio"),className:en||Ja?"is-active":"","data-testid":"template-studio-open",onClick:zu,children:o.jsx(nd,{size:17})}),o.jsx("button",{type:"button",title:R("Import board JSON"),"data-testid":"board-import-open",onClick:ku,children:o.jsx(dg,{size:17})}),o.jsx("button",{type:"button",title:R("Tools"),onClick:()=>e("/tools"),children:o.jsx(ws,{size:17})}),o.jsx("span",{className:"toolbar-separator"}),o.jsx("button",{type:"button",title:R("Run all graphs"),"data-testid":"automation-run-all","data-ai-task-total":ct.total,"data-ai-task-runnable":ct.runnable,"data-ai-task-running":ct.running,onClick:Qi,children:o.jsx(ya,{size:17})}),o.jsx("button",{type:"button",title:R("Run selected graph"),"data-testid":"automation-run-selected","data-selected-graph-size":ts.size,"data-selected-graph-runnable":ts.runnable,disabled:!ae||ae.kind!=="ai-task",onClick:Ji,children:o.jsx(Sr,{size:17})}),o.jsx("button",{type:"button",title:R("Pause running AI tasks"),"data-testid":"automation-pause","data-running-ai-tasks":ct.running,onClick:el,children:o.jsx(jo,{size:17})}),o.jsx("button",{type:"button",title:R("Stop active AI tasks"),"data-testid":"automation-stop","data-active-ai-tasks":ct.active,"data-paused-ai-tasks":ct.paused,onClick:tl,children:o.jsx(sd,{size:15})}),o.jsx("button",{type:"button",title:R(Tt?"Generating flow":"Generate flow"),disabled:!ae||Tt,onClick:()=>void al(),children:Tt?o.jsx(aa,{size:17,className:"spin-icon"}):o.jsx(ms,{size:17})}),o.jsx("span",{className:"toolbar-separator"}),o.jsx("button",{type:"button",title:R("Undo"),"data-testid":"history-undo",disabled:d.length===0,onClick:Zo,children:o.jsx(rd,{size:17})}),o.jsx("button",{type:"button",title:R("Redo"),"data-testid":"history-redo",disabled:m.length===0,onClick:Qo,children:o.jsx(id,{size:17})})]})}),o.jsxs("div",{className:"search-panel floating-panel","data-testid":"mindcanvas-search-panel","data-search-engine":le,"data-search-worker-state":ye,children:[o.jsxs("div",{className:"search-input-row",children:[o.jsx(cg,{size:16}),o.jsx("input",{ref:rn,"data-testid":"mindcanvas-search-input","aria-label":R("Search text"),value:N,onChange:a=>D(a.target.value),onKeyDown:Om,placeholder:R("Search text ...")}),o.jsx("span",{className:"search-count","data-testid":"mindcanvas-search-count","aria-live":"polite",children:Xm}),o.jsx("button",{type:"button",title:R("Previous search result"),"data-testid":"mindcanvas-search-prev",disabled:U.length===0,onClick:()=>ao(-1),children:o.jsx(ug,{size:14})}),o.jsx("button",{type:"button",title:R("Next search result"),"data-testid":"mindcanvas-search-next",disabled:U.length===0,onClick:()=>ao(1),children:o.jsx(yc,{size:14})})]}),ul&&o.jsx("div",{className:"search-current","data-testid":"mindcanvas-search-current","aria-live":"polite",children:ml?o.jsxs(o.Fragment,{children:[o.jsxs("span",{children:[Y+1," / ",U.length]}),o.jsxs("button",{type:"button","data-testid":"mindcanvas-search-focus",onClick:()=>cr("current-button"),children:[R("Focus")," ",ml.title]})]}):o.jsx("span",{children:R("No matches")})}),U.length>0&&o.jsx("div",{className:"search-results","data-testid":"mindcanvas-search-results",children:U.map((a,s)=>o.jsxs("button",{type:"button","data-testid":"mindcanvas-search-result",className:s===Y?"is-active":"","aria-current":s===Y?"true":void 0,onMouseEnter:()=>ce(s),onClick:()=>dr(a,"result-click"),children:[o.jsx("strong",{children:a.title}),o.jsx("span",{children:a.body.slice(0,84)})]},a.id))})]})]}),G&&o.jsxs("div",{className:"connection-toast floating-panel",children:[o.jsx(Cr,{size:14}),G.dragging?`Release over another node connector to create a ${G.kind} line.`:`Drag from a connector, or select another node connector, to create a ${G.kind} line.`,o.jsx("button",{type:"button",onClick:()=>X(null),children:"Cancel"})]}),(Bt==null?void 0:Bt.result)&&o.jsxs("section",{className:"result-popover floating-panel","data-testid":"ai-result-popover",children:[o.jsxs("div",{className:"result-popover__header",children:[o.jsxs("strong",{children:[Bt.title," Result"]}),o.jsx("button",{type:"button",title:R("Close"),onClick:()=>oe(null),children:o.jsx(Ot,{size:14})})]}),as&&o.jsxs("div",{className:"result-popover__meta","data-result-source-tone":as.tone,"data-testid":"ai-result-source",children:[o.jsx("span",{children:as.label}),o.jsx("small",{children:as.detail})]}),o.jsxs("div",{className:"result-popover__actions","data-testid":"ai-result-popover-actions",children:[o.jsxs("button",{type:"button",title:R("Copy result"),onClick:()=>void Lm(Bt),children:[o.jsx(So,{size:14}),o.jsx("span",{children:R("Copy")})]}),o.jsxs("button",{type:"button",title:R("Archive result as a Markdown node"),onClick:()=>Pm(Bt),children:[o.jsx(St,{size:14}),o.jsx("span",{children:R("Archive")})]}),o.jsxs("button",{type:"button",title:R("Stage a follow-up AI Task from this result"),onClick:()=>Em(Bt),children:[o.jsx(Cn,{size:14}),o.jsx("span",{children:R("Follow-up")})]})]}),o.jsx("pre",{className:"result-popover__body",children:Bt.result})]}),jt&&o.jsx(Gf,{url:jt.url,fileName:jt.fileName,onClose:()=>{It(null),f.emit("node.pdf.preview.close")}}),il&&o.jsx(Np,{node:il,onSave:lm,onClose:im}),Ze&&o.jsx(Ap,{settings:n.settings,onPatchSettings:Re,onClose:_u}),rl&&o.jsx(Yf,{board:n,rootNode:rl,onClose:km,onStatus:Xi,onRemove:qi,onSubmitFollowUp:wm,onApproval:Sm,onAddArtifact:vm}),wa&&o.jsx(Mp,{board:n,selectedNode:ae??null,selectedCount:p.length,input:w,viewport:P,viewportSize:H,localBridgeState:Ie,syncStatus:De,syncMessage:Sa,buildPrompt:Ym,navigate:e,onClose:Bu}),!hl&&o.jsxs("div",{className:"global-input-shell","data-active-submits":O,"data-submit-state":O>0?"active":"idle",onFocusCapture:()=>void Jn("input-focus"),onPointerDown:()=>void Jn("input-pointer"),children:[o.jsx("textarea",{ref:Yn,"data-testid":"global-input-textarea",value:w,placeholder:(ae==null?void 0:ae.kind)==="ai-task"?R("Run selected AI Task..."):R("Talk with AI..."),onChange:a=>_(a.target.value),onKeyDown:a=>{a.repeat||a.nativeEvent.isComposing||a.keyCode===229||(a.ctrlKey||a.metaKey)&&a.key==="Enter"&&(a.preventDefault(),Zi())}}),o.jsxs("div",{className:"input-controls",children:[o.jsx("button",{className:`input-settings-button ${Ze?"is-active":""}`,type:"button",title:R("AI Settings"),"aria-label":R("AI Settings"),"aria-pressed":Ze?"true":void 0,"data-testid":"ai-settings-open",onClick:Eu,children:o.jsx(ws,{size:16})}),["Text","Image","Video"].map(a=>o.jsx("button",{className:n.settings.inputMode===a?"is-active":"",type:"button","data-testid":`global-input-mode-${a.toLowerCase()}`,onClick:()=>{$i("inputMode",a),Jn(`mode-${a.toLowerCase()}`)},children:R(a)},a)),n.settings.inputMode==="Text"&&o.jsxs(o.Fragment,{children:[o.jsx(gs,{value:vu,options:ju,onChange:a=>Ru(a),ariaLabel:R("Text model"),className:"catalog-pill--model",menuClassName:"catalog-pill__menu--model",testId:"text-model-select"}),o.jsx(gs,{value:n.settings.effort,options:Tu,onChange:a=>$i("effort",a),ariaLabel:R("Reasoning effort"),className:"catalog-pill--effort",testId:"reasoning-effort-select"})]}),Ct&&pr&&o.jsxs(o.Fragment,{children:[o.jsx(gs,{value:pr.model.id,options:Ct==="Image"?Iu:Nu,onChange:a=>Lu(Ct,a),ariaLabel:R(`${Ct} model`),className:"catalog-pill--model",menuClassName:"catalog-pill__menu--model",testId:`${Ct.toLowerCase()}-model-select`}),o.jsx(gs,{value:pr.aspect.id,options:Ct==="Image"?Au:Mu,onChange:a=>Pu(Ct,a),ariaLabel:R(`${Ct} aspect ratio`),className:"catalog-pill--aspect",testId:`${Ct.toLowerCase()}-aspect-select`})]}),o.jsx("span",{className:"input-controls__spacer"}),o.jsx("span",{className:"global-submit-count","aria-live":"polite",children:O}),o.jsx("button",{className:"send-button",type:"button",title:R("Submit"),"data-testid":"global-input-submit",disabled:!Km,onClick:Zi,children:o.jsx(Sr,{size:18})})]})]}),o.jsxs("div",{className:"canvas-view-control-stack","data-testid":"canvas-view-controls",children:[o.jsxs("section",{className:"canvas-view-panel floating-panel","aria-label":R("Canvas grid controls"),"data-testid":"canvas-grid-controls",children:[Xc.map(a=>o.jsx("button",{type:"button",title:R(`Use ${a} grid`),"aria-label":R(`Use ${a} grid`),"aria-pressed":os===a,className:os===a?"is-active":"","data-testid":`canvas-grid-mode-${a}`,onClick:()=>om(a),children:a==="dot"?o.jsx(mg,{size:15}):a==="line"?o.jsx(pg,{size:15}):a==="particles"?o.jsx(ad,{size:15}):o.jsx(ms,{size:15})},a)),o.jsx("span",{className:"canvas-view-panel__separator"}),o.jsx("button",{type:"button",title:R("Toggle grid snap"),"aria-label":R("Toggle grid snap"),"aria-pressed":pl,className:pl?"is-active":"","data-testid":"canvas-grid-snap-toggle",onClick:sm,children:o.jsx(gg,{size:15})})]}),o.jsxs("section",{className:"canvas-bookmark-strip floating-panel","aria-label":R("Camera bookmarks"),"data-testid":"camera-bookmark-strip",children:[o.jsx("button",{type:"button",title:R("Go to home view"),"aria-label":R("Go to home view"),"data-testid":"camera-bookmark-home",onClick:er,children:o.jsx(hg,{size:15})}),(()=>{const a=!!xs(gl[ba]);return o.jsx("button",{type:"button",title:R(a?"Go to camera slot N. Shift-click to save.":"Slot N empty. Click for Home, shift-click to save."),"aria-label":R(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?Pa(ba):Zn(ba)},children:o.jsx("span",{"aria-hidden":"true",children:"N"})})})(),Rr.map(a=>{const s=!!xs(gl[a]);return o.jsx("button",{type:"button",title:R(s?`Go to camera slot ${a}. Shift-click to save.`:`Slot ${a} empty. Click for Home, shift-click to save.`),"aria-label":R(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?Pa(a):Zn(a)},children:o.jsx("span",{"aria-hidden":"true",children:a})},a)}),o.jsx("button",{type:"button",title:R("Save current camera to the next empty slot"),"aria-label":R("Save current camera to the next empty slot"),"data-testid":"camera-bookmark-save-next",onClick:nm,children:o.jsx(fg,{size:15})})]})]}),o.jsxs("div",{className:"bottom-controls",children:[o.jsx("button",{type:"button",title:R("Mouse wheel mode"),"aria-label":R("Toggle mouse wheel mode"),"aria-pressed":n.settings.wheelMode,className:n.settings.wheelMode?"is-active":"","data-testid":"canvas-wheel-mode-toggle","data-wheel-mode":n.settings.wheelMode?"mouse":"trackpad",onClick:()=>tr("button"),children:o.jsx(bg,{size:17})}),o.jsx("button",{type:"button",title:R(`Cursor direction ${n.settings.cursorDirection==="down"?"down":"right"}`),"aria-label":R("Toggle cursor direction"),"aria-pressed":n.settings.cursorDirection==="down",className:n.settings.cursorDirection==="down"?"is-active":"","data-testid":"canvas-cursor-direction-toggle","data-cursor-direction":n.settings.cursorDirection==="down"?"down":"right",onClick:()=>ar("button"),children:o.jsx(yg,{size:17})}),o.jsx("button",{type:"button",title:R("Reset fixture"),onClick:Dm,children:o.jsx(xg,{size:17})}),o.jsx("button",{type:"button",title:R(Lt?"Exit read mode":"Fullscreen"),"aria-label":R(Lt?"Exit read mode":"Fullscreen"),"aria-pressed":Lt,className:Lt?"is-active":"","data-testid":"canvas-read-mode-toggle","data-read-mode":Lt?"true":"false",onClick:()=>{Qn("button")},children:o.jsx(Ql,{size:17})})]}),n.settings.minimapEnabled&&ut&&o.jsxs("section",{className:"canvas-minimap floating-panel","aria-label":R("Canvas minimap"),"data-testid":"canvas-minimap",children:[o.jsxs("div",{className:"canvas-minimap__head",children:[o.jsx("span",{children:R("Minimap")}),o.jsx("small",{children:n.nodes.length})]}),o.jsxs("button",{type:"button",className:"canvas-minimap__stage","aria-label":R("Navigate canvas minimap"),"data-testid":"canvas-minimap-stage",onPointerDown:Gm,children:[ut.nodes.map(a=>o.jsx("span",{className:`canvas-minimap__node canvas-minimap__node--${a.kind} ${p.includes(a.id)?"is-selected":""}`,style:{left:`${a.x}px`,top:`${a.y}px`,width:`${a.width}px`,height:`${a.height}px`}},a.id)),o.jsx("span",{className:"canvas-minimap__viewport",style:{left:`${ut.viewport.x}px`,top:`${ut.viewport.y}px`,width:`${ut.viewport.width}px`,height:`${ut.viewport.height}px`}})]})]}),o.jsxs("div",{className:"canvas-status",children:[n.nodes.length," nodes / ",Ba.length," rendered / ",n.edges.length," edges / ",Math.round(P.scale*100),"%",((Tl=n.source)==null?void 0:Tl.kind)==="localBridge"&&o.jsxs(o.Fragment,{children:[" ","/ LocalBridge",n.source.partialImport?" partial":"",n.source.truncated?` ${n.source.renderedNodeCount}/${n.source.originalNodeCount}`:""]})]})]})}function lc(e){switch(e){case"checking":return"Checking";case"connected":return"Connected";case"blocked":return"Access gated";case"unavailable":return"Unavailable";default:return"Idle"}}export{ax as MindCanvas};
|