@weppy/roblox-mcp 2.14.4 → 2.14.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -38,6 +38,13 @@ All notable changes to this project will be documented in this file.
38
38
 
39
39
 
40
40
 
41
+
42
+
43
+ ## [2.14.5] - 2026-08-22
44
+
45
+ ### Stability
46
+
47
+ - **Keep npm releases available without expiring publisher tokens** — npm packages are now published through a short-lived GitHub identity tied to the protected release workflow. If npm publishing needs to be retried, the release can reuse the exact verified package archive without rebuilding the Studio Plugin or other release files. No installation or configuration change is required.
41
48
 
42
49
  ## [2.14.4] - 2026-08-22
43
50
 
package/dist/index.js CHANGED
@@ -936,7 +936,7 @@ ${_9}
936
936
  `)}
937
937
  `,"utf8")>Abe;)n.shift();let r=`${t}.${process.pid}.tmp`;Vn.writeFileSync(r,n.length>0?`${n.join(`
938
938
  `)}
939
- `:"","utf8"),Vn.renameSync(r,t)}function T9(t){try{return Vn.readdirSync(t,{withFileTypes:!0}).filter(e=>e.isFile()&&e.name.endsWith(".jsonl")).map(e=>{let n=XA.join(t,e.name);return{filePath:n,modifiedAtMs:Vn.statSync(n).mtimeMs}}).sort((e,n)=>e.modifiedAtMs-n.modifiedAtMs)}catch{return[]}}async function A9(t,e=20){return!Number.isInteger(e)||e<=0?[]:T9(eA(t)).slice(-e).map(r=>r.filePath)}function O9(t){let e=eA(t.appDataDir),n=XA.join(e,Nbe(t.instanceId));return{filePath:n,record(i,a,o={},s){try{let l={...YA(o),schemaVersion:1,timestamp:$be(s),source:i,event:a,pid:t.pid,instanceId:t.instanceId,sessionId:t.sessionId};Vn.mkdirSync(e,{recursive:!0}),Mbe(n,JSON.stringify(l))}catch{}},pruneOldInstanceFiles(){try{let i=T9(e);for(let a of i.slice(0,-20))Vn.rmSync(a.filePath,{force:!0})}catch{}}}}vt();function D9(t,e){let n=Lbe(),r=n.replace(/-/g,"").substring(0,8).toUpperCase(),i=`${r.substring(0,4)}-${r.substring(4,8)}`,a=O9({appDataDir:t.appDataDir??Ke(),pid:process.pid,instanceId:n,sessionId:i});return{config:t,app:e,instanceId:n,sessionId:i,startTime:Date.now(),runtimeDiagnostics:a,baseUrl:`http://${t.httpHost}:${t.httpPort}`,commandQueue:new Map,pendingCommands:new Map,globalPendingCommands:[],totalCommandsProcessed:0,pluginClients:new Map,pluginCommandSessionsByClientId:new Map,pluginCommandClientIdsByProcessToken:new Map,mcpInstances:new Map,cachedSelectionMap:new Map,studioRoutingMode:"recentPriority",pinnedTargetClientId:null,isClientMode:!1,clientModeHealthTimer:null,clientModeConsecutiveHealthFailures:0,clientModeUpstreamReachable:!0,clientModeUpstreamContextCaptureEnabled:!0,clientModeLastHealthSuccessAt:null,clientModeLastHealthFailureAt:null,clientModeLastHealthError:null,shuttingDown:!1,onUpstreamPermanentlyDown:null,clientModeIdleTimeoutMs:t.clientModeIdleTimeoutMs??36e5,clientModeIdleWatchdogTimer:null,shutdownFn:null,historyManager:null,analyticsManager:null,executionContextManager:null,licenseState:null,syncController:null,internalCommandExecutor:null,dashboardFolderPicker:null,assetLibraryOpenCloudServiceFactory:null,projectChangesCleanupScheduler:null,activeSyncOwnerInstanceId:null,activeProjectRoot:null,pendingDashboardSyncRootPin:null,playtestControlCommand:null,dashboardSyncRootSwitchInFlight:!1,uiStudioRecorders:new Map,uiStudioDesignContracts:E9(),aiClientName:"",pluginVersion:"",syncedSessionToken:null,serverLastCommandAt:null}}var $9=Ft(bo(),1);le();function N9(t){let e=$9.default.json({limit:"5mb"});t.app.use((n,r,i)=>{if(n.path.startsWith("/sync/")){i();return}e(n,r,i)}),t.app.use((n,r,i)=>{r.setHeader("Access-Control-Allow-Origin","http://localhost:3002"),r.setHeader("Access-Control-Allow-Methods","GET, POST, OPTIONS"),r.setHeader("Access-Control-Allow-Headers","Content-Type"),i()}),t.app.use((n,r,i)=>{h.debug(`${n.method} ${n.path}`,{ip:n.ip}),i()})}co();import{randomUUID as jS}from"crypto";co();le();function zbe(){let t=process.env.WEPPY_ROBLOX_MCP_VERSION?.trim();return t||null}var Ye=zbe()??"2.14.4";ca();nr();km();Ro();gu();co();Ro();var F9="studio-",Fbe=/^studio-[1-9]\d*$/;function iS(t){return Fbe.test(t)}function q9(t,e){let n=new Set;for(let r of t)e!==void 0&&r.clientId===e||r.targetAlias&&iS(r.targetAlias)&&n.add(r.targetAlias);return n}function qbe(t,e){let n=q9(t,e),r=1;for(;n.has(`${F9}${r}`);)r+=1;return`${F9}${r}`}function aS(t,e){let n=q9(t,e.clientId);return e.targetAlias&&iS(e.targetAlias)&&!n.has(e.targetAlias)||(e.targetAlias=qbe(t,e.clientId)),e.targetAlias}gu();function oS(t){for(let e of t)aS(t,e)}function sS(t){let e={clientId:t.clientId,targetAlias:t.targetAlias??t.clientId.slice(0,8),lastSeen:t.lastSeen,connectedAt:t.connectedAt,transport:"websocket",connectionState:t.commandSessionState??Be.CONNECTED};return t.placeId!==void 0&&(e.placeId=t.placeId),t.placeName!==void 0&&(e.placeName=t.placeName),t.pluginVersion!==void 0&&(e.pluginVersion=t.pluginVersion),t.studioVersion!==void 0&&(e.studioVersion=t.studioVersion),t.lastRoutedAt!==void 0&&(e.lastRoutedAt=t.lastRoutedAt),t.processToken!==void 0&&(e.processToken=t.processToken),t.inFlightRequestId!==void 0&&(e.inFlightRequestId=t.inFlightRequestId),t.studioState!==void 0&&(e.studioState=t.studioState),t.studioStateSource!==void 0&&(e.studioStateSource=t.studioStateSource),t.studioStateUpdatedAt!==void 0&&(e.studioStateUpdatedAt=t.studioStateUpdatedAt),t.playtestMode!==void 0&&(e.playtestMode=t.playtestMode),e}function aO(t){let e=Un(t);return oS(e),pm(e.map(sS),null)}function cS(t){let e=new Set;t.aiClientName&&e.add(t.aiClientName);for(let n of t.mcpInstances.values())n.aiClientName&&e.add(n.aiClientName);return Array.from(e)}function B9(t){let n=Date.now();for(let[r,i]of t.mcpInstances)i.lastSeen&&n-i.lastSeen>15e3&&(t.mcpInstances.delete(r),i.sessionId&&t.executionContextManager?.endSession(i.sessionId),h.debug("Removed stale MCP instance",{instanceId:r,lastSeen:i.lastSeen}))}function V9(t,e,n){let r=e.query.clientId;if(r&&t.pluginClients.has(r)){let i=t.pluginClients.get(r);i.lastSeen=Date.now()}try{let i=e.body;if(!i||!Array.isArray(i.selection)||typeof i.count!="number"){h.warn("Invalid selection update request",{body:i}),n.status(400).json({error:"Invalid request body"});return}let a=r||"unknown",o=Date.now();t.cachedSelectionMap.set(a,{selection:i.selection,count:i.count,timestamp:o,clientId:a}),h.debug("Selection cache updated",{count:i.count,clientId:a,timestamp:o}),n.json({status:"ok",timestamp:o})}catch(i){h.error("Error handling selection update",i),n.status(500).json({error:"Internal server error"})}}function W9(t,e,n){let r=parseInt(e.query.maxAge)||3e4,i=Rm(t,r);i?n.json({cached:!0,...i}):n.json({cached:!1,message:"No cached selection available"})}function Rm(t,e=3e4,n){if(t.cachedSelectionMap.size===0)return null;let r;if(n)r=t.cachedSelectionMap.get(n);else for(let a of t.cachedSelectionMap.values())(!r||a.timestamp>r.timestamp)&&(r=a);if(!r)return null;let i=Date.now()-r.timestamp;return e===0||i<=e?r:null}function oO(t,e){let n=t.pluginClients.get(e.clientId),r=Date.now(),i=[...t.pluginClients.values()].filter(c=>c.clientId===e.clientId||c.commandSessionState!==Be.DISCONNECTED),a=n??{clientId:e.clientId,connectedAt:r,lastSeen:r,commandsProcessed:0,connectionType:"polling"},o=aS(i,a),s={clientId:e.clientId,targetAlias:o,projectName:e.projectName??n?.projectName,placeName:e.placeName??n?.placeName,placeId:e.placeId??n?.placeId,pluginVersion:e.pluginVersion??n?.pluginVersion,studioVersion:e.studioVersion??n?.studioVersion,connectedAt:n?.connectedAt||r,lastSeen:r,commandsProcessed:n?.commandsProcessed||0,connectionType:n?.connectionType||"polling",inFlightRequestId:n?.inFlightRequestId,studioState:n?.studioState,studioStateSource:n?.studioStateSource,studioStateUpdatedAt:n?.studioStateUpdatedAt,playtestMode:n?.playtestMode,...n?.commandSessionState?{commandSessionState:n.commandSessionState}:{},...n?.processToken?{processToken:n.processToken}:{}};return t.pluginClients.set(e.clientId,s),t.syncController&&typeof t.syncController.setCurrentConnectedPlace=="function"&&typeof e.placeId=="number"&&Number.isFinite(e.placeId)&&t.syncController.setCurrentConnectedPlace(e.placeId,e.placeName??null),t.pendingCommands.has(e.clientId)||t.pendingCommands.set(e.clientId,[]),e.pluginVersion&&(t.pluginVersion=e.pluginVersion),typeof s.placeId=="number"&&Number.isFinite(s.placeId)&&Dx(t,s.placeId,s.placeName??null),t.analyticsManager&&(e.pluginVersion&&t.analyticsManager.setPluginVersion(e.pluginVersion),t.analyticsManager.trackPluginConnected()),h.info("Plugin client registered",{clientId:e.clientId,targetAlias:o,projectName:e.projectName,placeName:e.placeName,isReconnect:!!n}),{clientInfo:s,sessionId:t.sessionId,mcpVersion:Ye,mcpInstanceCount:t.mcpInstances.size+1,aiClientNames:cS(t)}}function sO(t,e){let n=t.pluginClients.get(e),r=t.pluginClients.has(e),i=n?.commandSessionState===Be.CONNECTED;if(t.pluginClients.delete(e),t.pendingCommands.delete(e),r&&mu(t,e),r&&t.syncController&&typeof t.syncController.clearCurrentConnectedPlaceIfMatch=="function"&&typeof n?.placeId=="number"&&Number.isFinite(n.placeId)){let a=[...t.pluginClients.values()].filter(o=>typeof o.placeId=="number"&&Number.isFinite(o.placeId)).sort((o,s)=>s.lastSeen-o.lastSeen)[0];a?t.syncController.setCurrentConnectedPlace?.(a.placeId??null,a.placeName??null):t.syncController.clearCurrentConnectedPlaceIfMatch(n.placeId)}return i&&fm(t,e,"disconnected",n),h.info("Plugin client unregistered",{clientId:e,existed:r}),r}function lS(t,e,n){try{let r=e.body;if(!r.clientId){n.status(400).json({error:"Missing clientId"});return}let i=oO(t,{clientId:r.clientId,projectName:r.projectName,placeName:r.placeName,placeId:r.placeId,pluginVersion:r.pluginVersion,studioVersion:r.studioVersion});n.json({status:"ok",clientId:r.clientId,targetAlias:i.clientInfo.targetAlias,serverInstanceId:t.instanceId,sessionId:i.sessionId,mcpVersion:i.mcpVersion,connectedAt:i.clientInfo.connectedAt,aiClientNames:i.aiClientNames,serverStartTime:t.startTime,mcpInstanceCount:i.mcpInstanceCount})}catch(r){h.error("Error registering plugin client",r),n.status(500).json({error:"Internal server error"})}}function uS(t,e,n){let r=e.body?.clientId;if(!r){n.status(400).json({error:"Missing clientId"});return}let i=sO(t,r);n.json({status:"ok",existed:i})}function H9(t,e,n){try{let r=e.body;if(!r.instanceId){n.status(400).json({error:"Missing instanceId"});return}let i=Date.now(),a={instanceId:r.instanceId,...typeof r.sessionId=="string"?{sessionId:r.sessionId}:{},pid:r.pid,connectedAt:i,isServer:!1,lastSeen:i};r.aiClientName&&(a.aiClientName=r.aiClientName),r.cwd&&(a.cwd=r.cwd),"projectRoot"in r&&(a.projectRoot=r.projectRoot),t.mcpInstances.set(r.instanceId,a),pt(t,"mcp_status",{aiClientName:a.aiClientName??"Unknown",instanceId:r.instanceId,status:"registered"}),bu(t,{timestamp:new Date().toISOString(),type:"mcp",status:"registered",instanceId:r.instanceId,message:`MCP registered \u2014 ${a.aiClientName??r.instanceId}`,...a.aiClientName?{aiClientName:a.aiClientName}:{}}),h.info("MCP instance registered (client mode)",{instanceId:r.instanceId,pid:r.pid,cwd:r.cwd}),n.json({status:"ok",instanceId:r.instanceId,serverInstanceId:t.instanceId,sessionId:t.sessionId,mcpVersion:Ye,mcpInstanceCount:t.mcpInstances.size+1})}catch(r){h.error("Error registering MCP instance",r),n.status(500).json({error:"Internal server error"})}}function Z9(t,e,n){let r=e.body?.instanceId;if(!r){n.status(400).json({error:"Missing instanceId"});return}let i=t.mcpInstances.get(r),a=!!i;t.mcpInstances.delete(r),i?.sessionId&&t.executionContextManager?.endSession(i.sessionId),a&&(pt(t,"mcp_status",{aiClientName:i?.aiClientName??"Unknown",instanceId:r,status:"unregistered"}),bu(t,{timestamp:new Date().toISOString(),type:"mcp",status:"unregistered",instanceId:r,message:`MCP unregistered \u2014 ${i?.aiClientName??r}`,...i?.aiClientName?{aiClientName:i.aiClientName}:{}})),h.info("MCP instance unregistered",{instanceId:r,existed:a}),n.json({status:"ok",existed:a})}function G9(t,e,n){let{instanceId:r,aiClientName:i}=e.body;if(r&&i){let a=t.mcpInstances.get(r);a&&(a.aiClientName=i)}n.json({status:"ok"})}function K9(t){let e=3e4,n=Date.now(),r=Zr({appDataDir:t.config.appDataDir});for(let[a,o]of t.pluginClients)n-o.lastSeen>e&&(t.pluginClients.delete(a),t.pendingCommands.delete(a),mu(t,a));B9(t);let i=Un(t);return oS(i),{serverInstanceId:t.instanceId,sessionId:t.sessionId,mcpVersion:Ye,uptime:n-t.startTime,serverStartTime:t.startTime,serverExecutable:process.execPath,serverHost:t.config.httpHost,serverPort:t.config.httpPort,serverPid:process.pid,pluginClients:i.map(sS),studioRoutingMode:t.studioRoutingMode,pinnedTargetClientId:t.pinnedTargetClientId,mcpInstances:[{instanceId:t.instanceId,pid:process.pid,connectedAt:t.startTime,isServer:!0,cwd:process.cwd(),projectRoot:r,lastSeen:n,...t.aiClientName?{aiClientName:t.aiClientName}:{}},...Array.from(t.mcpInstances.values())],mcpInstanceCount:t.mcpInstances.size+1}}function dS(t,e){e.json(K9(t))}function pS(t,e,n){let r=e.query.instanceId;r&&t.mcpInstances.has(r)&&(t.mcpInstances.get(r).lastSeen=Date.now()),B9(t);let i=Un(t);oS(i);let s={...{status:"online",connectedClients:i.length,queuedCommands:b5(t),uptime:Date.now()-t.startTime,version:Ye,enableContextCapture:t.executionContextManager?.isEnabled()??t.config.enableContextCapture??!0,isClientMode:t.isClientMode,shuttingDown:t.shuttingDown,pid:process.pid,sessionId:t.sessionId,nodeVersion:process.version,studioRoutingMode:t.studioRoutingMode,pinnedTargetClientId:t.pinnedTargetClientId},instanceId:t.instanceId,mcpInstanceCount:t.mcpInstances.size+1,aiClientNames:cS(t),pluginVersion:t.pluginVersion||void 0,dashboardSseClients:t.dashboardSseClients?.size??0,websocketClients:i.length,pluginClients:i.map(sS),...t.isClientMode?{upstream:{reachable:t.clientModeUpstreamReachable,consecutiveFailures:t.clientModeConsecutiveHealthFailures,lastSuccessAt:t.clientModeLastHealthSuccessAt,lastFailureAt:t.clientModeLastHealthFailureAt,lastError:t.clientModeLastHealthError,baseUrl:t.baseUrl}}:{}};n.json(s)}function J9(t,e,n,r){let i=e.ip||e.socket.remoteAddress||"";if(!(i==="127.0.0.1"||i==="::1"||i==="::ffff:127.0.0.1"||i==="localhost")){h.warn("Shutdown request rejected from non-localhost",{ip:i}),n.status(403).json({error:"Forbidden: localhost only"});return}h.info("Shutdown request received, initiating graceful shutdown",{requestedBy:i,uptime:Date.now()-t.startTime}),n.json({status:"shutting_down",message:"Server will shutdown gracefully",pid:process.pid}),setTimeout(async()=>{try{await r(),h.info("Graceful shutdown completed"),process.exit(0)}catch(o){h.error("Error during graceful shutdown",o),process.exit(1)}},100)}async function fS(t){if(t.isClientMode)try{let e=await fetch(`${t.baseUrl}/connection-info`);if(e.ok)return await e.json()}catch(e){h.warn("Failed to fetch connection info from server",{error:e})}return K9(t)}Ro();var _t={bridgeRunTest:"manage_studio_run_test_bridge",placeInfo:"system_info_place_info",clearLogs:"manage_logs_clear",createScript:"manage_scripts_create",getLogs:"manage_logs_get",deleteScript:"manage_scripts_delete",canonical:{playStart:"manage_studio_play_start",playStop:"manage_studio_play_stop",playPause:"manage_studio_play_pause",playResume:"manage_studio_play_resume",playStatus:"manage_studio_play_status",runTest:"manage_studio_run_test"}},Vbe=new Set([_t.canonical.runTest]),Wbe=new Set([_t.canonical.playStop]),A8e=new Set([_t.canonical.playStart,_t.canonical.playStop,_t.canonical.playPause,_t.canonical.playResume,_t.canonical.playStatus]);function Di(t){return Vbe.has(t)}function Em(t){return Wbe.has(t)}var N8e=_t.canonical.playStop,Y9=[5e3,15e3];gu();var Hbe=new Set(["manage_assets_export_selection_rbxm","manage_assets_export_path_rbxm","manage_assets_review_model","manage_assets_generate_model","manage_assets_import_rbxm","manage_assets_generate_thumbnail"]),_n=class t extends Error{code;routing;constructor(e,n,r){super(n),this.name="CommandTargetSelectionError",this.code=e,this.routing=r,Object.setPrototypeOf(this,t.prototype)}};function Zbe(t={},e){let n={},r=t.clientId,i=t.targetAlias,a=t.placeId;if(r!==void 0){if(typeof r!="string"||r.trim().length===0)throw new _n("invalid_target_selector","clientId target selector must be a non-empty string",{selectionMode:"clientId",...typeof r=="string"?{requestedClientId:r.trim()}:{}});n.requestedClientId=r.trim()}if(i!==void 0){if(typeof i!="string"||i.trim().length===0)throw new _n("invalid_target_selector","targetAlias target selector must be a non-empty string",{selectionMode:"targetAlias",...typeof i=="string"?{requestedTargetAlias:i.trim()}:{}});n.requestedTargetAlias=i.trim()}if(a!==void 0&&Gbe(e,t)){if(typeof a!="number"||!Number.isFinite(a))throw new _n("invalid_target_selector","placeId target selector must be a finite number",{selectionMode:"placeId"});n.requestedPlaceId=a}return n}function mS(t,e,n={},r){let i=Zbe(n,r),a=V8(e,t.studioRoutingMode==="pinned"?t.pinnedTargetClientId:null);if(i.requestedClientId!==void 0)return Kbe(a,i);if(i.requestedTargetAlias!==void 0)return Jbe(a,i);if(i.requestedPlaceId!==void 0)return Ybe(a,i);if(t.studioRoutingMode==="pinned"&&t.pinnedTargetClientId!==null){let s=a.find(c=>c.clientId===t.pinnedTargetClientId);if(s)return{targetClientId:s.clientId,routing:ni("pinnedTarget",i,s)}}let o=a[0];return o?{targetClientId:o.clientId,routing:ni("recentPriority",i,o)}:{routing:{selectionMode:"globalQueue"}}}function Gbe(t,e){return!t||!Hbe.has(t)?!0:e.scope==="shared"}function Kbe(t,e){let n=t.find(r=>r.clientId===e.requestedClientId);if(!n)throw new _n("target_client_not_found",`Target client not found: ${e.requestedClientId}`,ni("clientId",e));if(e.requestedTargetAlias!==void 0&&n.targetAlias!==e.requestedTargetAlias)throw new _n("target_selector_mismatch",`Target client ${n.clientId} does not match targetAlias ${e.requestedTargetAlias}`,ni("clientId",e,n));return X9("clientId",e,n),{targetClientId:n.clientId,routing:ni("clientId",e,n)}}function Jbe(t,e){let n=t.find(r=>r.targetAlias!==void 0&&iS(r.targetAlias)&&r.targetAlias===e.requestedTargetAlias);if(!n)throw new _n("target_alias_not_found",`Target alias not found: ${e.requestedTargetAlias}`,ni("targetAlias",e));return X9("targetAlias",e,n),{targetClientId:n.clientId,routing:ni("targetAlias",e,n)}}function Ybe(t,e){let n=t.filter(i=>i.placeId===e.requestedPlaceId);if(n.length===0)throw new _n("target_place_not_found",`Target place not found: ${e.requestedPlaceId}`,ni("placeId",e));if(n.length>1)throw new _n("target_place_ambiguous",`Target place is ambiguous: ${e.requestedPlaceId}`,ni("placeId",e));let r=n[0];return{targetClientId:r.clientId,routing:ni("placeId",e,r)}}function X9(t,e,n){if(e.requestedPlaceId!==void 0&&n.placeId!==e.requestedPlaceId)throw new _n("target_selector_mismatch",`Target client ${n.clientId} is not connected to placeId ${e.requestedPlaceId}`,ni(t,e,n))}function ni(t,e,n){let r={selectionMode:t};return e.requestedClientId!==void 0&&(r.requestedClientId=e.requestedClientId),e.requestedTargetAlias!==void 0&&(r.requestedTargetAlias=e.requestedTargetAlias),e.requestedPlaceId!==void 0&&(r.requestedPlaceId=e.requestedPlaceId),n!==void 0&&(r.actualClientId=n.clientId,n.targetAlias!==void 0&&(r.actualTargetAlias=n.targetAlias),n.placeId!==void 0&&(r.actualPlaceId=n.placeId),n.placeName!==void 0&&(r.actualPlaceName=n.placeName)),r}iA();le();Im();var ic={query_instances:{discriminator:"action",validActions:new Set(["get","children","find_child","find_descendant","wait_for_child","class_info","search_name","search_class","search_property","search_tag","file_tree","project_structure","descendants","ancestors"]),allowedParams:{query_instances_get:new Set(["path","sessionDebugId","siblingIndex","placeId","clientId","targetAlias"]),query_instances_children:new Set(["path","sessionDebugId","siblingIndex","recursive","maxDepth","placeId","clientId","targetAlias"]),query_instances_find_child:new Set(["path","childName","placeId","clientId","targetAlias"]),query_instances_find_descendant:new Set(["path","descendantName","placeId","clientId","targetAlias"]),query_instances_wait_for_child:new Set(["path","childName","timeout","placeId","clientId","targetAlias"]),query_instances_class_info:new Set(["className","placeId","clientId","targetAlias"]),query_instances_search_name:new Set(["root","query","caseSensitive","maxResults","placeId","clientId","targetAlias"]),query_instances_search_class:new Set(["className","root","includeSubclasses","maxResults","placeId","clientId","targetAlias"]),query_instances_search_property:new Set(["root","propertyName","propertyValue","maxResults","placeId","clientId","targetAlias"]),query_instances_search_tag:new Set(["root","tag","maxResults","placeId","clientId","targetAlias"]),query_instances_file_tree:new Set(["maxDepth","root","includeServices","placeId","clientId","targetAlias"]),query_instances_project_structure:new Set(["root","depth","placeId","clientId","targetAlias"]),query_instances_descendants:new Set(["path","sessionDebugId","siblingIndex","maxResults","placeId","clientId","targetAlias"]),query_instances_ancestors:new Set(["path","sessionDebugId","siblingIndex","placeId","clientId","targetAlias"])},paramAliases:{query_instances_search_name:{query:"pattern"},query_instances_search_property:{root:"rootPath"},query_instances_search_tag:{root:"rootPath"},query_instances_project_structure:{root:"rootPath"}}},mutate_instances:{discriminator:"action",validActions:new Set(["create","create_with_props","delete","clone","move","rename","pivot","create_tree","mass_create","mass_delete","mass_duplicate","smart_duplicate","scatter"]),allowedParams:{mutate_instances_create:new Set(["className","parent","name","properties","placeId","clientId","targetAlias"]),mutate_instances_create_with_props:new Set(["className","parent","name","properties","placeId","clientId","targetAlias"]),mutate_instances_delete:new Set(["path","sessionDebugId","siblingIndex","placeId","clientId","targetAlias"]),mutate_instances_clone:new Set(["path","sourcePath","sessionDebugId","siblingIndex","targetParent","newName","placeId","clientId","targetAlias"]),mutate_instances_move:new Set(["path","sessionDebugId","siblingIndex","newParent","placeId","clientId","targetAlias"]),mutate_instances_rename:new Set(["path","sessionDebugId","siblingIndex","newName","placeId","clientId","targetAlias"]),mutate_instances_pivot:new Set(["path","sessionDebugId","siblingIndex","position","cframe","offset","placeId","clientId","targetAlias"]),mutate_instances_create_tree:new Set(["parent","tree","placeId","clientId","targetAlias"]),mutate_instances_mass_create:new Set(["instances","placeId","clientId","targetAlias"]),mutate_instances_mass_delete:new Set(["paths","placeId","clientId","targetAlias"]),mutate_instances_mass_duplicate:new Set(["targetParent","paths","placeId","clientId","targetAlias"]),mutate_instances_smart_duplicate:new Set(["path","sessionDebugId","siblingIndex","targetParent","offset","count","placeId","clientId","targetAlias"]),mutate_instances_scatter:new Set(["templatePaths","region","count","seed","maxSlope","avoidWater","alignToNormal","scaleJitter","minSpacing","parentName","placeId","clientId","targetAlias"])},paramAliases:{mutate_instances_clone:{path:"sourcePath"},mutate_instances_smart_duplicate:{spacing:"offset"}}},manage_properties:{discriminator:"action",validActions:new Set(["get","set","get_all","set_multiple","get_attr","set_attr","get_all_attrs","delete_attr","add_tag","remove_tag","check_tag","get_tags","get_tagged","set_calculated","set_relative","mass_set","mass_get","modify_children"]),allowedParams:{manage_properties_get:new Set(["path","property","placeId","clientId","targetAlias"]),manage_properties_set:new Set(["path","property","value","placeId","clientId","targetAlias"]),manage_properties_get_all:new Set(["path","includeReadOnly","placeId","clientId","targetAlias"]),manage_properties_set_multiple:new Set(["path","properties","placeId","clientId","targetAlias"]),manage_properties_get_attr:new Set(["path","attribute","placeId","clientId","targetAlias"]),manage_properties_set_attr:new Set(["path","value","attribute","placeId","clientId","targetAlias"]),manage_properties_get_all_attrs:new Set(["path","placeId","clientId","targetAlias"]),manage_properties_delete_attr:new Set(["path","attribute","placeId","clientId","targetAlias"]),manage_properties_add_tag:new Set(["path","tag","placeId","clientId","targetAlias"]),manage_properties_remove_tag:new Set(["path","tag","placeId","clientId","targetAlias"]),manage_properties_check_tag:new Set(["path","tag","placeId","clientId","targetAlias"]),manage_properties_get_tags:new Set(["path","placeId","clientId","targetAlias"]),manage_properties_get_tagged:new Set(["tagName","root","maxResults","placeId","clientId","targetAlias"]),manage_properties_set_calculated:new Set(["path","expression","variables","propertyName","placeId","clientId","targetAlias"]),manage_properties_set_relative:new Set(["path","value","operation","amount","propertyName","placeId","clientId","targetAlias"]),manage_properties_mass_set:new Set(["paths","propertyName","propertyValue","placeId","clientId","targetAlias"]),manage_properties_mass_get:new Set(["paths","propertyName","placeId","clientId","targetAlias"]),manage_properties_modify_children:new Set(["parentPath","modifications","propertyName","propertyValue","filter","recursive","placeId","clientId","targetAlias"])},paramAliases:{manage_properties_get_tagged:{tagName:"tag",root:"rootPath"},manage_properties_set_relative:{amount:"value"}}},manage_scripts:{discriminator:"action",validActions:new Set(["get_source","set_source","create","delete","edit_replace","edit_insert","edit_delete","search","replace","get_dependencies","validate"]),allowedParams:{manage_scripts_get_source:new Set(["path","startLine","endLine","placeId","clientId","targetAlias"]),manage_scripts_set_source:new Set(["path","source","validate","placeId","clientId","targetAlias"]),manage_scripts_create:new Set(["source","scriptType","parent","name","placeId","clientId","targetAlias"]),manage_scripts_delete:new Set(["path","placeId","clientId","targetAlias"]),manage_scripts_edit_replace:new Set(["path","startLine","endLine","newLines","validate","placeId","clientId","targetAlias"]),manage_scripts_edit_insert:new Set(["path","lines","afterLine","content","validate","placeId","clientId","targetAlias"]),manage_scripts_edit_delete:new Set(["path","startLine","endLine","validate","placeId","clientId","targetAlias"]),manage_scripts_search:new Set(["path","pattern","caseSensitive","wholeWord","usePattern","maxResults","placeId","clientId","targetAlias"]),manage_scripts_replace:new Set(["path","pattern","replacement","usePattern","dryRun","placeId","clientId","targetAlias"]),manage_scripts_get_dependencies:new Set(["path","placeId","clientId","targetAlias"]),manage_scripts_validate:new Set(["source","path","placeId","clientId","targetAlias"])},paramAliases:{manage_scripts_edit_replace:{newLines:"newContent"},manage_scripts_edit_insert:{lines:"content"},manage_scripts_replace:{pattern:"searchPattern"}}},manage_ui:{discriminator:"action",validActions:new Set(["design_brief","create_tree","update","delete","preview","check"]),allowedParams:{manage_ui_design_brief:new Set(["brief","projectContext","agentCapabilities","placeId","clientId","targetAlias"]),manage_ui_create_tree:new Set(["briefId","tree","placeId","clientId","targetAlias"]),manage_ui_update:new Set(["targetPath","changes","briefId","placeId","clientId","targetAlias"]),manage_ui_delete:new Set(["targetPath","placeId","clientId","targetAlias"]),manage_ui_preview:new Set(["targetPath","briefId","viewportMode","profileIds","placeId","clientId","targetAlias"]),manage_ui_check:new Set(["targetPath","briefId","visualReview","viewportMode","profileIds","placeId","clientId","targetAlias"])}},manage_lighting:{discriminator:"action",validActions:new Set(["lighting","atmosphere","sky","terrain_props","time","mood"]),allowedParams:{manage_lighting_lighting:new Set(["properties","placeId","clientId","targetAlias"]),manage_lighting_atmosphere:new Set(["properties","createIfMissing","placeId","clientId","targetAlias"]),manage_lighting_sky:new Set(["properties","createIfMissing","placeId","clientId","targetAlias"]),manage_lighting_terrain_props:new Set(["properties","placeId","clientId","targetAlias"]),manage_lighting_time:new Set(["time","clockTime","placeId","clientId","targetAlias"]),manage_lighting_mood:new Set(["preset","overrides","placeId","clientId","targetAlias"])}},manage_selection:{discriminator:"action",validActions:new Set(["get","set","clear","cached","context","details","add","remove","watch"]),allowedParams:{manage_selection_get:new Set(["placeId","clientId","targetAlias"]),manage_selection_set:new Set(["paths","placeId","clientId","targetAlias"]),manage_selection_clear:new Set(["placeId","clientId","targetAlias"]),manage_selection_cached:new Set(["maxAge"]),manage_selection_context:new Set(["includeSource","includeProperties","includeChildren","placeId","clientId","targetAlias"]),manage_selection_details:new Set(["maxDepth","includeAncestors","placeId","clientId","targetAlias"]),manage_selection_add:new Set(["paths","placeId","clientId","targetAlias"]),manage_selection_remove:new Set(["paths","placeId","clientId","targetAlias"]),manage_selection_watch:new Set(["placeId","clientId","targetAlias"])}},manage_camera:{discriminator:"action",validActions:new Set(["info","focus_path","focus_position","suggest","screenshot"]),allowedParams:{manage_camera_info:new Set(["placeId","clientId","targetAlias"]),manage_camera_focus_path:new Set(["path","distance","duration","offset","respectAutoFocusSetting","placeId","clientId","targetAlias"]),manage_camera_focus_position:new Set(["position","distance","duration","offset","lookAt","respectAutoFocusSetting","placeId","clientId","targetAlias"]),manage_camera_suggest:new Set(["path","placeId","clientId","targetAlias"]),manage_camera_screenshot:new Set(["placeId","clientId","targetAlias"])},paramAliases:{manage_camera_suggest:{path:"targetPath"}}},manage_tween:{discriminator:"action",validActions:new Set(["create","play","pause","cancel"]),allowedParams:{manage_tween_create:new Set(["path","tweenInfo","properties","placeId","clientId","targetAlias"]),manage_tween_play:new Set(["tweenId","placeId","clientId","targetAlias"]),manage_tween_pause:new Set(["tweenId","placeId","clientId","targetAlias"]),manage_tween_cancel:new Set(["tweenId","placeId","clientId","targetAlias"])}},manage_audio:{discriminator:"action",validActions:new Set(["play","stop","pause","resume","set_listener"]),allowedParams:{manage_audio_play:new Set(["path","soundId","volume","looped","playbackSpeed","placeId","clientId","targetAlias"]),manage_audio_stop:new Set(["path","placeId","clientId","targetAlias"]),manage_audio_pause:new Set(["path","placeId","clientId","targetAlias"]),manage_audio_resume:new Set(["path","placeId","clientId","targetAlias"]),manage_audio_set_listener:new Set(["listenerType","listenerPath","placeId","clientId","targetAlias"])}},manage_animation:{discriminator:"action",validActions:new Set(["load","play","stop","get_tracks"]),allowedParams:{manage_animation_load:new Set(["path","animationId","placeId","clientId","targetAlias"]),manage_animation_play:new Set(["path","trackId","speed","fadeTime","weight","priority","placeId","clientId","targetAlias"]),manage_animation_stop:new Set(["path","trackId","fadeTime","placeId","clientId","targetAlias"]),manage_animation_get_tracks:new Set(["path","placeId","clientId","targetAlias"])}},manage_physics:{discriminator:"action",validActions:new Set(["register_group","set_collidable","get_groups"]),allowedParams:{manage_physics_register_group:new Set(["groupName","placeId","clientId","targetAlias"]),manage_physics_set_collidable:new Set(["group1","group2","collidable","placeId","clientId","targetAlias"]),manage_physics_get_groups:new Set(["placeId","clientId","targetAlias"])}},manage_effects:{discriminator:"action",validActions:new Set(["emit","clear","toggle"]),allowedParams:{manage_effects_emit:new Set(["path","count","placeId","clientId","targetAlias"]),manage_effects_clear:new Set(["path","placeId","clientId","targetAlias"]),manage_effects_toggle:new Set(["path","enabled","placeId","clientId","targetAlias"])}},manage_terrain:{discriminator:"action",validActions:new Set(["fill_block","fill_ball","fill_cylinder","fill_wedge","clear_region","clear_bounds","replace_material","colors_get","colors_set","read_voxel","read_voxels","write_voxels","generate","smooth"]),allowedParams:{manage_terrain_fill_block:new Set(["cframe","size","placeId","clientId","targetAlias"]),manage_terrain_fill_ball:new Set(["center","radius","placeId","clientId","targetAlias"]),manage_terrain_fill_cylinder:new Set(["cframe","radius","height","placeId","clientId","targetAlias"]),manage_terrain_fill_wedge:new Set(["cframe","size","placeId","clientId","targetAlias"]),manage_terrain_clear_region:new Set(["region","placeId","clientId","targetAlias"]),manage_terrain_clear_bounds:new Set(["min","max","placeId","clientId","targetAlias"]),manage_terrain_replace_material:new Set(["material","region","sourceMaterial","targetMaterial","placeId","clientId","targetAlias"]),manage_terrain_colors_get:new Set(["material","placeId","clientId","targetAlias"]),manage_terrain_colors_set:new Set(["material","color","placeId","clientId","targetAlias"]),manage_terrain_read_voxel:new Set(["position","placeId","clientId","targetAlias"]),manage_terrain_read_voxels:new Set(["region","resolution","placeId","clientId","targetAlias"]),manage_terrain_write_voxels:new Set(["region","resolution","materials","occupancy","placeId","clientId","targetAlias"]),manage_terrain_generate:new Set(["region","preset","seed","baseHeight","amplitude","frequency","octaves","persistence","waterLevel","edgeBlend","materialPalette","layers","placeId","clientId","targetAlias"]),manage_terrain_smooth:new Set(["region","intensity","placeId","clientId","targetAlias"])}},spatial_query:{discriminator:"action",validActions:new Set(["raycast","find_ground","check_placement","multi_raycast","scan_area","find_flat","find_spawn","analyze_walkable","spatial_map","find_space","bounds","snap_grid","collision"]),allowedParams:{spatial_query_raycast:new Set(["origin","direction","filterType","filterList","filterInstances","ignoreWater","placeId","clientId","targetAlias"]),spatial_query_find_ground:new Set(["maxDistance","position","filterList","filterInstances","offset","placeId","clientId","targetAlias"]),spatial_query_check_placement:new Set(["position","size","filterList","filterInstances","rotation","checkGround","placeId","clientId","targetAlias"]),spatial_query_multi_raycast:new Set(["filterType","filterList","filterInstances","ignoreWater","rays","placeId","clientId","targetAlias"]),spatial_query_scan_area:new Set(["size","filterList","filterInstances","center","resolution","maxResults","placeId","clientId","targetAlias"]),spatial_query_find_flat:new Set(["searchArea","minSize","maxSlope","tolerance","maxResults","placeId","clientId","targetAlias"]),spatial_query_find_spawn:new Set(["searchArea","spawnSize","minSpacing","preferOutdoor","count","placeId","clientId","targetAlias"]),spatial_query_analyze_walkable:new Set(["area","maxSlope","resolution","characterHeight","maxStepHeight","placeId","clientId","targetAlias"]),spatial_query_spatial_map:new Set(["path","rootPath","includeModels","maxResults","placeId","clientId","targetAlias"]),spatial_query_find_space:new Set(["size","searchArea","gridSize","gridSnap","padding","placeId","clientId","targetAlias"]),spatial_query_bounds:new Set(["path","paths","placeId","clientId","targetAlias"]),spatial_query_snap_grid:new Set(["gridSize","path","gridSnap","axes","placeId","clientId","targetAlias"]),spatial_query_collision:new Set(["position","path","ignorePaths","placeId","clientId","targetAlias"])},paramAliases:{spatial_query_spatial_map:{path:"rootPath"}}},manage_assets:{discriminator:"action",validActions:new Set(["insert","info","search","search_insert","insert_free","insert_package","export_selection_json","export_selection_rbxm","export_path_rbxm","review_model","generate_model","upload_asset","import_rbxm","generate_thumbnail"]),allowedParams:{manage_assets_insert:new Set(["assetId","parent","name","position","placeId","clientId","targetAlias"]),manage_assets_info:new Set(["assetId","placeId","clientId","targetAlias"]),manage_assets_search:new Set(["query","maxResults","category","sortType","placeId","clientId","targetAlias"]),manage_assets_search_insert:new Set(["parent","name","query","placeId","clientId","targetAlias"]),manage_assets_insert_free:new Set(["assetId","parent","name","position","placeId","clientId","targetAlias"]),manage_assets_insert_package:new Set(["assetId","parent","name","placeId","clientId","targetAlias"]),manage_assets_export_selection_json:new Set(["format","includeProperties","includeChildren","maxDepth","placeId","clientId","targetAlias"]),manage_assets_export_selection_rbxm:new Set(["contextId","contextSummary","replayMetadata","scope","placeId","category","displayName","description","thumbnailMode","uploadMode","uploadTemporaryAssets","creatorType","creatorId","clientId","targetAlias"]),manage_assets_export_path_rbxm:new Set(["contextId","contextSummary","replayMetadata","scope","placeId","category","sourcePath","displayName","description","thumbnailMode","uploadMode","uploadTemporaryAssets","creatorType","creatorId","clientId","targetAlias"]),manage_assets_review_model:new Set(["contextId","contextSummary","replayMetadata","scope","placeId","category","sourcePath","displayName","description","thumbnailMode","uploadMode","uploadTemporaryAssets","creatorType","creatorId","exportToLibrary","expectedUse","expectedGroups","maxDescendants","maxDepth","readiness","clientId","targetAlias"]),manage_assets_generate_model:new Set(["contextId","contextSummary","replayMetadata","placeId","category","prompt","schemaMode","predefinedSchema","schemaGroups","size","maxTriangles","generateTextures","review","targetParent","name","displayName","expectedUse","expectedGroups","maxDescendants","maxDepth","readiness","anchorMode","clientId","targetAlias"]),manage_assets_upload_asset:new Set(["contextId","contextSummary","replayMetadata","placeId","category","assetType","sourcePath","displayName","description","creatorType","creatorId","clientId","targetAlias"]),manage_assets_import_rbxm:new Set(["contextId","contextSummary","replayMetadata","scope","placeId","category","assetLibraryAssetId","targetParent","name","clientId","targetAlias"]),manage_assets_generate_thumbnail:new Set(["contextId","contextSummary","replayMetadata","scope","placeId","category","assetLibraryAssetId","clientId","targetAlias"])},paramAliases:{manage_assets_search:{maxResults:"limit"}}},manage_open_cloud_assets:{discriminator:"action",validActions:new Set(["preflight","credential_status","capabilities","upload","link","update","info","operation_status"]),allowedParams:{manage_open_cloud_assets_preflight:new Set(["filePath","category","creatorType","creatorId"]),manage_open_cloud_assets_credential_status:new Set([]),manage_open_cloud_assets_capabilities:new Set([]),manage_open_cloud_assets_upload:new Set(["contextId","contextSummary","replayMetadata","filePath","category","scope","placeId","displayName","description","creatorType","creatorId","expectedPrice","waitForOperation","operationPollTimeoutMs","operationPollIntervalMs"]),manage_open_cloud_assets_link:new Set(["contextId","contextSummary","replayMetadata","assetId","filePath","category","scope","placeId","displayName","description"]),manage_open_cloud_assets_update:new Set(["contextId","contextSummary","replayMetadata","assetId","filePath","category","displayName","description","creatorType","creatorId","expectedPrice","updateMask","waitForOperation","operationPollTimeoutMs","operationPollIntervalMs"]),manage_open_cloud_assets_info:new Set(["assetId","readMask"]),manage_open_cloud_assets_operation_status:new Set(["operationId"])}},manage_sync:{discriminator:"action",validActions:new Set(["status_current_place","history","directions","read_file","write_file","progress"]),allowedParams:{manage_sync_status_current_place:new Set([]),manage_sync_history:new Set(["placeId","query"]),manage_sync_directions:new Set(["placeId"]),manage_sync_read_file:new Set(["placeId","instancePath"]),manage_sync_write_file:new Set(["placeId","instancePath","content"]),manage_sync_progress:new Set([])}},workspace_state:{discriminator:"action",validActions:new Set(["sync","snapshot","changes","viewport","clear_history","metadata","scripts","selection_info","clear_cache"]),allowedParams:{workspace_state_sync:new Set(["includeMetadata","placeId","clientId","targetAlias"]),workspace_state_snapshot:new Set(["placeId","clientId","targetAlias"]),workspace_state_changes:new Set(["limit","placeId","clientId","targetAlias"]),workspace_state_viewport:new Set(["includeCameraInfo","includeSelectionBounds","placeId","clientId","targetAlias"]),workspace_state_clear_history:new Set(["placeId","clientId","targetAlias"]),workspace_state_metadata:new Set(["placeId","clientId","targetAlias"]),workspace_state_scripts:new Set(["placeId","clientId","targetAlias"]),workspace_state_selection_info:new Set(["placeId","clientId","targetAlias"]),workspace_state_clear_cache:new Set(["placeId","clientId","targetAlias"])}},manage_logs:{discriminator:"action",validActions:new Set(["get","clear","errors"]),allowedParams:{manage_logs_get:new Set(["level","limit","pattern","since","sinceSeq","placeId","clientId","targetAlias"]),manage_logs_clear:new Set(["placeId","clientId","targetAlias"]),manage_logs_errors:new Set(["limit","placeId","clientId","targetAlias"])},paramAliases:{manage_logs_get:{level:"type"}}},system_info:{discriminator:"action",validActions:new Set(["ping","connection","usage","place_info","services","preflight"]),allowedParams:{system_info_ping:new Set(["message","placeId","clientId","targetAlias"]),system_info_connection:new Set([]),system_info_usage:new Set(["placeId","clientId","targetAlias"]),system_info_place_info:new Set(["placeId","clientId","targetAlias"]),system_info_services:new Set(["placeId","clientId","targetAlias"]),system_info_preflight:new Set(["placeId","clientId","targetAlias"])}},manage_studio:{discriminator:"action",validActions:new Set(["toggle_ui_preview","test_profile_get","test_profile_set","test_profile_reset","experience_language_get","experience_language_set","play_start","play_stop","play_pause","play_resume","play_status","run_test"]),allowedParams:{manage_studio_toggle_ui_preview:new Set(["enabled","placeId","clientId","targetAlias"]),manage_studio_test_profile_get:new Set(["placeId","clientId","targetAlias"]),manage_studio_test_profile_set:new Set(["testProfile","placeId","clientId","targetAlias"]),manage_studio_test_profile_reset:new Set(["placeId","clientId","targetAlias"]),manage_studio_experience_language_get:new Set(["placeId","clientId","targetAlias"]),manage_studio_experience_language_set:new Set(["locale","placeId","clientId","targetAlias"]),manage_studio_play_start:new Set(["mode","testProfile","restoreAfterTest","placeId","clientId","targetAlias"]),manage_studio_play_stop:new Set(["placeId","clientId","targetAlias"]),manage_studio_play_pause:new Set(["placeId","clientId","targetAlias"]),manage_studio_play_resume:new Set(["placeId","clientId","targetAlias"]),manage_studio_play_status:new Set(["placeId","clientId","targetAlias"]),manage_studio_run_test:new Set(["mode","script","test_name","timeout","testProfile","restoreAfterTest","placeId","clientId","targetAlias","contextId","contextSummary","replayMetadata"])}}};var Xbe={manage_scripts_validate:"internal",manage_selection_cached:"internal",manage_open_cloud_assets_preflight:"internal",manage_open_cloud_assets_credential_status:"internal",manage_open_cloud_assets_capabilities:"internal",manage_open_cloud_assets_upload:"internal",manage_open_cloud_assets_link:"internal",manage_open_cloud_assets_update:"internal",manage_open_cloud_assets_info:"internal",manage_open_cloud_assets_operation_status:"internal",manage_sync_status_current_place:"internal",manage_sync_history:"internal",manage_sync_directions:"internal",manage_sync_read_file:"internal",manage_sync_write_file:"internal",manage_sync_progress:"internal",system_info_connection:"internal",system_info_preflight:"internal",manage_studio_experience_language_set:"internal",manage_studio_run_test:"internal"};function gS(t){return Xbe[t]||"plugin"}var Q9=new Set(["batch_execute","execute_luau","extended_call_method","extended_call_methods","extended_get_properties","extended_get_property","extended_set_properties","extended_set_property","manage_animation_get_tracks","manage_animation_load","manage_animation_play","manage_animation_stop","manage_assets_export_path_rbxm","manage_assets_export_selection_json","manage_assets_export_selection_rbxm","manage_assets_generate_model","manage_assets_generate_thumbnail","manage_assets_import_rbxm","manage_assets_info","manage_assets_insert","manage_assets_insert_free","manage_assets_insert_package","manage_assets_review_model","manage_assets_search","manage_assets_search_insert","manage_assets_upload_asset","manage_audio_pause","manage_audio_play","manage_audio_resume","manage_audio_set_listener","manage_audio_stop","manage_camera_screenshot","manage_effects_clear","manage_effects_emit","manage_effects_toggle","manage_lighting_atmosphere","manage_lighting_lighting","manage_lighting_mood","manage_lighting_sky","manage_lighting_terrain_props","manage_lighting_time","manage_open_cloud_assets_capabilities","manage_open_cloud_assets_credential_status","manage_open_cloud_assets_info","manage_open_cloud_assets_link","manage_open_cloud_assets_operation_status","manage_open_cloud_assets_preflight","manage_open_cloud_assets_update","manage_open_cloud_assets_upload","manage_physics_get_groups","manage_physics_register_group","manage_physics_set_collidable","manage_properties_mass_get","manage_properties_mass_set","manage_properties_modify_children","manage_properties_set_calculated","manage_properties_set_relative","manage_scripts_replace","manage_selection_add","manage_selection_context","manage_selection_details","manage_selection_remove","manage_selection_watch","manage_studio_experience_language_get","manage_studio_experience_language_set","manage_studio_play_pause","manage_studio_play_resume","manage_studio_play_start","manage_studio_play_status","manage_studio_play_stop","manage_studio_run_test","manage_studio_test_profile_get","manage_studio_test_profile_reset","manage_studio_test_profile_set","manage_studio_toggle_ui_preview","manage_sync_directions","manage_sync_history","manage_sync_progress","manage_sync_read_file","manage_sync_status_current_place","manage_sync_write_file","manage_terrain_clear_bounds","manage_terrain_clear_region","manage_terrain_colors_get","manage_terrain_colors_set","manage_terrain_fill_ball","manage_terrain_fill_block","manage_terrain_fill_cylinder","manage_terrain_fill_wedge","manage_terrain_generate","manage_terrain_read_voxel","manage_terrain_read_voxels","manage_terrain_replace_material","manage_terrain_smooth","manage_terrain_write_voxels","manage_tween_cancel","manage_tween_create","manage_tween_pause","manage_tween_play","manage_ui_check","manage_ui_create_tree","manage_ui_delete","manage_ui_design_brief","manage_ui_preview","manage_ui_update","mutate_instances_create_tree","mutate_instances_mass_create","mutate_instances_mass_delete","mutate_instances_mass_duplicate","mutate_instances_scatter","mutate_instances_smart_duplicate","query_instances_ancestors","query_instances_descendants","query_instances_file_tree","query_instances_project_structure","query_instances_search_property","query_instances_search_tag","spatial_query_analyze_walkable","spatial_query_bounds","spatial_query_check_placement","spatial_query_collision","spatial_query_find_flat","spatial_query_find_ground","spatial_query_find_space","spatial_query_find_spawn","spatial_query_multi_raycast","spatial_query_raycast","spatial_query_scan_area","spatial_query_snap_grid","spatial_query_spatial_map","system_info_place_info","system_info_services","workspace_state_changes","workspace_state_clear_cache","workspace_state_clear_history","workspace_state_metadata","workspace_state_scripts","workspace_state_selection_info","workspace_state_snapshot","workspace_state_sync","workspace_state_viewport"]),cO=new Set(["system_info_connection","system_info_ping","system_info_preflight","system_info_usage"]);function ar(t){return Q9.has(t)?"pro":"basic"}Ir();hS();import{readFile as __e}from"node:fs/promises";import x_e from"node:path";import{createHash as f_e,randomUUID as fO}from"node:crypto";import{mkdir as Nm,readFile as sV,readdir as cV,rename as lV,rm as m_e,stat as g_e,writeFile as wS}from"node:fs/promises";import Mt from"node:path";import{extname as n_e}from"node:path";import{constants as r_e}from"node:fs";import{access as i_e,stat as a_e}from"node:fs/promises";var Am=20*1024*1024,_S=[{category:"image",assetType:"Image",folder:"images",extensions:[".png",".jpeg",".jpg",".bmp",".tga"],supportsContentUpdate:!1,contentTypes:{".png":"image/png",".jpeg":"image/jpeg",".jpg":"image/jpeg",".bmp":"image/bmp",".tga":"image/tga"}},{category:"decal",assetType:"Decal",folder:"decals",extensions:[".png",".jpeg",".jpg",".bmp",".tga"],supportsContentUpdate:!1,contentTypes:{".png":"image/png",".jpeg":"image/jpeg",".jpg":"image/jpeg",".bmp":"image/bmp",".tga":"image/tga"}},{category:"audio",assetType:"Audio",folder:"audio",extensions:[".mp3",".ogg",".wav",".flac"],supportsContentUpdate:!1,contentTypes:{".mp3":"audio/mpeg",".ogg":"audio/ogg",".wav":"audio/wav",".flac":"audio/flac"}},{category:"mesh",assetType:"Mesh",folder:"meshes",extensions:[".mesh"],supportsContentUpdate:!1,contentTypes:{".mesh":"application/octet-stream"}},{category:"model",assetType:"Model",folder:"models",extensions:[".fbx",".gltf",".glb",".rbxm",".rbxmx"],supportsContentUpdate:!0,contentTypes:{".fbx":"model/fbx",".gltf":"model/gltf+json",".glb":"model/gltf-binary",".rbxm":"model/x-rbxm",".rbxmx":"model/x-rbxm"}},{category:"video",assetType:"Video",folder:"videos",extensions:[".mp4",".mov"],supportsContentUpdate:!1,contentTypes:{".mp4":"video/mp4",".mov":"video/quicktime"}},{category:"animation",assetType:"Animation",folder:"animations",extensions:[".rbxm",".rbxmx"],supportsContentUpdate:!0,contentTypes:{".rbxm":"model/x-rbxm",".rbxmx":"model/x-rbxm"}}],o_e=new Map(_S.map(t=>[t.category,t]));function vS(t){if(!t)throw new Error("Open Cloud asset upload is disabled in WEPPY Dashboard settings.")}function yS(t,e){return t.split(e.apiKey).join("[redacted]")}function bS(t){let e=o_e.get(t);if(!e)throw new Error(`Unsupported asset category: ${t}`);return e}function Nu(t){return bS(t)}async function uO(t,e,n=Am){let r=bS(t),i=n_e(e).toLowerCase(),a=r.contentTypes[i]??null,o=await a_e(e),s=!0;try{await i_e(e,r_e.R_OK)}catch{s=!1}return{category:t,extension:i,contentType:a,formatValid:a!==null,sizeBytes:o.size,sizeValid:o.size<=n,maxFileSizeBytes:n,regularFile:o.isFile(),readable:s}}function nV(t,e){let n=t.creatorType??e.creatorType,r=t.creatorId??e.creatorId;if(!n||!r)throw new Error("creatorType and creatorId are required for Roblox Open Cloud asset upload/update.");return{...t,creatorType:n,creatorId:r}}async function rV(t,e,n){let r=await uO(t.category,e,n);if(!r.formatValid||!r.contentType)throw new Error(`Unsupported file extension ${r.extension||"(none)"} for ${t.category}.`);if(!r.regularFile)throw new Error("Asset path must reference a regular file.");if(!r.readable)throw new Error("Asset file is not readable.");if(!r.sizeValid)throw new Error(`Asset file is too large. Maximum size is ${n} bytes.`);return r.contentType}function iV(t){return typeof t.path=="string"&&t.path.startsWith("operations/")?t.path:null}function aV(t,e,n,r){let i={apiKey:t.apiKey,operationId:e};return n!==void 0&&(i.intervalMs=n),r!==void 0&&(i.timeoutMs=r),i}var $u=class{client;credentialStore;isOpenCloudUploadEnabled;maxFileSizeBytes;constructor(e){this.client=e.client,this.credentialStore=e.credentialStore,this.isOpenCloudUploadEnabled=e.isOpenCloudUploadEnabled,this.maxFileSizeBytes=e.maxFileSizeBytes??Am}getCapabilities(){return _S.map(({contentTypes:e,...n})=>n)}async uploadAsset(e){vS(this.isOpenCloudUploadEnabled());let n=await this.getRequiredCredential(),r=nV(e,n),i=bS(r.category),a=await rV(i,r.filePath,this.maxFileSizeBytes);try{let o={apiKey:n.apiKey,assetType:i.assetType,displayName:r.displayName,description:r.description??"",creatorType:r.creatorType,creatorId:r.creatorId,filePath:r.filePath,contentType:a};r.expectedPrice!==void 0&&(o.expectedPrice=r.expectedPrice);let s=await this.client.createAsset(o);if(r.waitForOperation){let c=iV(s);return c?await this.client.pollOperation(aV(n,c,r.operationPollIntervalMs,r.operationPollTimeoutMs)):s}return s}catch(o){throw new Error(yS(o instanceof Error?o.message:String(o),n))}}async updateAsset(e){vS(this.isOpenCloudUploadEnabled());let n=await this.getRequiredCredential(),r=nV(e,n),i=bS(r.category),a;if(r.filePath){if(!i.supportsContentUpdate)throw new Error(`${i.category} assets do not support content updates.`);a=await rV(i,r.filePath,this.maxFileSizeBytes)}try{let o={apiKey:n.apiKey,assetId:r.assetId,assetType:i.assetType,creatorType:r.creatorType,creatorId:r.creatorId};r.filePath&&(o.filePath=r.filePath),a!==void 0&&(o.contentType=a),r.displayName!==void 0&&(o.displayName=r.displayName),r.description!==void 0&&(o.description=r.description),r.updateMask!==void 0&&(o.updateMask=r.updateMask),r.expectedPrice!==void 0&&(o.expectedPrice=r.expectedPrice);let s=await this.client.updateAsset(o);if(r.waitForOperation){let c=iV(s);return c?await this.client.pollOperation(aV(n,c,r.operationPollIntervalMs,r.operationPollTimeoutMs)):s}return s}catch(o){throw new Error(yS(o instanceof Error?o.message:String(o),n))}}async getAsset(e){let n=await this.getRequiredCredential();try{let r={apiKey:n.apiKey,assetId:e.assetId};return e.readMask!==void 0&&(r.readMask=e.readMask),await this.client.getAsset(r)}catch(r){throw new Error(yS(r instanceof Error?r.message:String(r),n))}}async getOperation(e){let n=await this.getRequiredCredential();try{return await this.client.getOperation({apiKey:n.apiKey,operationId:e.operationId})}catch(r){throw new Error(yS(r instanceof Error?r.message:String(r),n))}}async getRequiredCredential(){let e=await this.credentialStore.getCredentialForUse();if(!e)throw new Error("Configure a Roblox Open Cloud API key in WEPPY Dashboard before using Open Cloud asset upload.");return e}};import oV from"node:fs";import un from"node:path";ox();var s_e=/^asset_(image|decal|audio|mesh|model|video|animation)_\d+_[a-z0-9]+$/;function c_e(t){if(!Number.isInteger(t)||t<0)throw new Error(`Invalid place ID: ${t}`)}function l_e(t,e){try{return oV.statSync(un.join(t,e,".sync-meta.json")).isFile()}catch{return!1}}function u_e(t,e){c_e(e.placeId);let n=`place_${e.placeId}`,r=e.placeName?du(e.placeName):"",i=r?`${n}_${r}`:n,a=[];try{let o=new RegExp(`^place_${e.placeId}(?:_.*)?$`);a=oV.readdirSync(t,{withFileTypes:!0}).filter(s=>s.isDirectory()&&o.test(s.name)).map(s=>s.name).sort()}catch{return i}return r&&a.includes(i)?i:a.find(o=>l_e(t,o))??(a.includes(i)?i:null)??a[0]??i}function dO(t){let e=un.resolve(t.projectSyncRoot),n=Nu(t.category).folder,r=t.scope.kind==="place"?un.join(e,u_e(e,t.scope),"assets",n):un.join(e,"shared-assets",n);return{root:r,inbox:un.join(r,"inbox"),index:un.join(r,".asset-library-index.json")}}function d_e(t){let e=s_e.exec(t);return e?.[1]?e[1]:null}function Om(t,e){let n=d_e(t);return n?e?n===e:!0:!1}function xS(t,e){if(!Om(t,e))throw new Error(`Invalid asset ID: ${t}`)}function $i(t,e){let n=un.relative(un.resolve(t),un.resolve(e));return n===""||!n.startsWith("..")&&!un.isAbsolute(n)}function p_e(t){xS(t.assetId,t.category);let e=dO(t),n=un.resolve(e.root,t.assetId);if(!$i(e.root,n))throw new Error(`Invalid asset path for ${t.assetId}`);return n}function SS(t){let e=p_e(t),n=un.resolve(e,t.relativeFileName);if(!$i(e,n))throw new Error(`Invalid asset file path for ${t.assetId}`);return n}function Dm(t,e){return un.relative(un.resolve(t),un.resolve(e)).split(un.sep).join("/")}var uV=20*1024*1024,h_e=200,pO=8,y_e=512,v_e=120;function dV(t,e){return t.kind!==e.kind?!1:t.kind==="shared"&&e.kind==="shared"?!0:t.kind==="place"&&e.kind==="place"&&t.placeId===e.placeId}function pV(t,e){let n=Mt.extname(t).toLowerCase(),r=Nu(e);if(!r.extensions.includes(n))return null;let i=r.contentTypes[n];return i?{canonicalExt:n,mimeType:i}:null}function mO(t,e,n){if(e!=="image"&&e!=="decal")return!0;let r=Mt.extname(t).toLowerCase();return r===".png"?n.length>=8&&n[0]===137&&n[1]===80&&n[2]===78&&n[3]===71&&n[4]===13&&n[5]===10&&n[6]===26&&n[7]===10:r===".jpg"||r===".jpeg"?n.length>=3&&n[0]===255&&n[1]===216&&n[2]===255:r===".bmp"?n.length>=2&&n[0]===66&&n[1]===77:r===".tga"?n.length>0:!1}function fV(t){return f_e("sha256").update(t).digest("hex")}function gO(t){if(t===void 0||t==="")return"";if(t.length>y_e||t.includes("\0")||t.includes("\\")||Mt.isAbsolute(t))throw new Error(`Invalid Asset Library folder path: ${t}`);let e=t.split("/");if(e.length>pO||e.some(n=>n.length===0||n.length>v_e||n==="."||n===".."))throw new Error(`Invalid Asset Library folder path: ${t}`);return e.join("/")}function IS(t){return t.now?.()??Date.now()}function b_e(t){return(t.randomId?.()??fO().replace(/-/g,"").slice(0,6)).toLowerCase().replace(/[^a-z0-9]/g,"").slice(0,12)||"asset"}function mV(t,e){let n=Math.floor(IS(t)/1e3);for(let r=0;r<20;r++){let i=b_e(t),a=r===0?`asset_${t.category}_${n}_${i}`:`asset_${t.category}_${n}_${i}${r}`;if(!e.has(a))return a}return`asset_${t.category}_${n}_${fO().replace(/-/g,"").slice(0,10)}`}function gV(t){let e=Mt.parse(t).name.trim();return e.length>0?e:t}function hV(t){if(t.mimeType!=="image/png")throw new Error("Asset Library preview must be an image/png thumbnail");if(Mt.basename(t.fileName).toLowerCase()!=="thumbnail.png")throw new Error("Asset Library preview file must be thumbnail.png");if(!mO("thumbnail.png","image",t.content))throw new Error("Asset Library preview is not a valid PNG file");return{fileName:"thumbnail.png",content:t.content}}async function hO(t,e){let n=`${t}.tmp.${fO().slice(0,8)}`;await wS(n,JSON.stringify(e,null,2),"utf8"),await lV(n,t)}async function yV(t,e){try{let n=await sV(Mt.join(e,"asset.json"),"utf8"),r=JSON.parse(n);return!Om(r.id,t.category)||r.category!==t.category||!dV(r.scope,t.scope)?null:(gO(r.folderPath),r)}catch{return null}}async function $m(t,e){let n;try{n=await cV(e.root,{withFileTypes:!0})}catch(i){if(i?.code==="ENOENT")return[];throw i}let r=[];for(let i of n.sort((a,o)=>a.name.localeCompare(o.name))){if(!i.isDirectory()||!Om(i.name,t.category))continue;let a=Mt.join(e.root,i.name),o=await yV(t,a);o&&r.push(o)}return r.sort((i,a)=>a.createdAt.localeCompare(i.createdAt)||a.id.localeCompare(i.id))}async function ju(t,e,n){if(xS(n.id,t.category),n.category!==t.category||!dV(n.scope,t.scope))throw new Error(`Asset metadata does not match library scope/category: ${n.id}`);gO(n.folderPath);let r=Mt.join(e.root,n.id);if(!$i(e.root,r))throw new Error(`Invalid asset path for ${n.id}`);await Nm(r,{recursive:!0}),await hO(Mt.join(r,"asset.json"),n)}async function vV(t,e){await Nm(t.root,{recursive:!0});let n={version:1,generatedAt:new Date().toISOString(),assets:e.map(r=>r.id)};await hO(t.index,n)}function ri(t,e,n){return{fileName:t,reason:e,message:n}}async function bV(t,e=t,n=[]){let r;try{r=await cV(e,{withFileTypes:!0})}catch(a){if(a?.code==="ENOENT")return[];throw a}let i=[];for(let a of r.sort((o,s)=>o.name.localeCompare(s.name))){let o=[...n,a.name],s=Mt.join(e,a.name);if(a.isDirectory()&&!a.isSymbolicLink()&&!a.name.startsWith(".")){let c=o.join("/");if(o.length>pO){i.push({entry:a,sourcePath:s,relativePath:c,folderPath:n.join("/"),skipReason:"maxDepth",skipMessage:`folder depth exceeds ${pO}`});continue}try{gO(c)}catch{i.push({entry:a,sourcePath:s,relativePath:c,folderPath:n.join("/"),skipReason:"unsupportedType",skipMessage:"invalid Asset Library folder path"});continue}i.push(...await bV(t,s,o));continue}i.push({entry:a,sourcePath:s,relativePath:o.join("/"),folderPath:n.join("/")})}return i}async function Ni(t){let e=dO(t);return await Nm(e.inbox,{recursive:!0}),e}async function CS(t){let e=await Ni(t),n=await $m(t,e);return await vV(e,n),n}async function Xt(t,e){xS(e,t.category);let n=await Ni(t),r=Mt.join(n.root,e);if(!$i(n.root,r))throw new Error(`Invalid asset path for ${e}`);let i=await yV(t,r);if(!i)throw new Error(`Asset not found: ${e}`);return i}async function Mu(t){let e=await Ni(t),n=await $m(t,e),r={version:1,generatedAt:new Date().toISOString(),assets:n.map(i=>i.id)};return await hO(e.index,r),r}async function _V(t){let e=await Ni(t),n=await $m(t,e),r=new Set(n.map(p=>p.id)),i=new Set(n.map(p=>p.file.sha256)),a=[],o=[],s=t.maxFileSizeBytes??uV,c=t.maxFilesPerRescan??h_e,l=await bV(e.inbox),u=0;for(let p of l){let{entry:f,sourcePath:m}=p;if(p.skipReason){o.push(ri(p.relativePath,p.skipReason,p.skipMessage??"inbox entry skipped"));continue}if(f.name.startsWith(".")&&!f.isFile()){o.push(ri(p.relativePath,"hidden","hidden or system file"));continue}if(f.isSymbolicLink()){o.push(ri(p.relativePath,"symlink","symlink files are not followed"));continue}if(f.isDirectory()){o.push(ri(p.relativePath,"nestedDirectory","nested directories are not scanned"));continue}if(!f.isFile()){o.push(ri(p.relativePath,"unsupportedType","unsupported inbox entry type"));continue}if(u+=1,u>c){o.push(ri(p.relativePath,"maxFileCount","rescan file count limit exceeded"));continue}if(f.name.startsWith(".")){o.push(ri(p.relativePath,"hidden","hidden or system file"));continue}let g=pV(f.name,t.category);if(!g){o.push(ri(f.name,"unsupportedType",`unsupported ${t.category} extension`));continue}let y=await g_e(m);if(y.size>s){o.push(ri(f.name,"oversized","asset file is larger than the configured limit"));continue}let v=await sV(m);if(!mO(f.name,t.category,v)){o.push(ri(f.name,"invalidSignature","file signature does not match the extension"));continue}let b=fV(v);if(i.has(b)){o.push(ri(f.name,"duplicate","asset content already exists in Asset Library"));continue}let x=mV(t,r);r.add(x),i.add(b);let I=Mt.join(e.root,x),w=`original${g.canonicalExt}`;await Nm(I,{recursive:!0}),await lV(m,Mt.join(I,w));let N=new Date(IS(t)).toISOString(),k={version:1,id:x,category:t.category,scope:t.scope,...p.folderPath?{folderPath:p.folderPath}:{},status:"localOnly",displayName:gV(f.name),description:"",source:{kind:"generated",originalPath:Dm(t.projectSyncRoot,m)},file:{original:w,preview:null,mimeType:g.mimeType,sha256:b,sizeBytes:y.size,width:null,height:null,durationMs:null},roblox:{uploaded:!1},usage:{lastScannedAt:null,scanSource:null,references:[]},createdAt:N,updatedAt:N};await ju(t,e,k),a.push(k)}let d=await $m(t,e);return await vV(e,d),{assets:d,adopted:a,skipped:o,adoptedCount:a.length,skippedCount:o.length}}async function jm(t){let e=await Ni(t),n=pV(t.originalFileName,t.category);if(!n)throw new Error(`Unsupported ${t.category} extension for Asset Library export`);let r=t.maxFileSizeBytes??uV;if(t.content.length>r)throw new Error("asset file is larger than the configured limit");if(!mO(t.originalFileName,t.category,t.content))throw new Error("file signature does not match the extension");let i=await $m(t,e),a=fV(t.content),o=i.find(y=>y.file.sha256===a);if(o)return{asset:o,deduplicated:!0};let s=new Set(i.map(y=>y.id)),c=mV(t,s),l=Mt.join(e.root,c);if(!$i(e.root,l))throw new Error(`Invalid asset path for ${c}`);let u=`original${n.canonicalExt}`;await Nm(l,{recursive:!0}),await wS(Mt.join(l,u),t.content);let d=null;if(t.preview){let y=hV(t.preview);d=y.fileName,await wS(Mt.join(l,y.fileName),y.content)}let p=new Date(IS(t)).toISOString(),f=t.roblox??{uploaded:!1},m=f.uploaded&&f.assetId?"uploaded":"localOnly",g={version:1,id:c,category:t.category,scope:t.scope,status:m,displayName:t.displayName?.trim()||gV(t.originalFileName),description:t.description??"",source:{...t.source,originalPath:Dm(t.projectSyncRoot,Mt.join(l,u))},file:{original:u,preview:d,mimeType:n.mimeType,sha256:a,sizeBytes:t.content.length,width:null,height:null,durationMs:null},roblox:f,usage:{lastScannedAt:null,scanSource:null,references:[]},...t.rbxm?{rbxm:t.rbxm}:{},createdAt:p,updatedAt:p};return await ju(t,e,g),await Mu(t),{asset:g,deduplicated:!1}}async function xV(t){let e=await Ni(t),n=await Xt(t,t.assetId),r=hV(t.preview),i=SS({...t,relativeFileName:r.fileName});await wS(i,r.content);let a={...n,file:{...n.file,preview:r.fileName},...n.rbxm&&t.rbxmThumbnail?{rbxm:{...n.rbxm,thumbnail:t.rbxmThumbnail}}:{},updatedAt:new Date(IS(t)).toISOString()};return await ju(t,e,a),await Mu(t),{asset:a}}async function SV(t,e,n){let r=await Ni(t),i=await Xt(t,e),a={...i,displayName:typeof n.displayName=="string"?n.displayName:i.displayName,description:typeof n.description=="string"?n.description:i.description,source:{...i.source,...n.source?.agent!==void 0?{agent:n.source.agent}:{},...n.source?.contextId!==void 0?{contextId:n.source.contextId}:{},...n.source?.prompt!==void 0?{prompt:n.source.prompt}:{}},updatedAt:new Date().toISOString()};return await ju(t,r,a),await Mu(t),a}async function wV(t,e,n){let r=await Ni(t),a={...await Xt(t,e),usage:n,updatedAt:new Date().toISOString()};return await ju(t,r,a),await Mu(t),a}async function IV(t,e){let n=await Ni(t);await Xt(t,e);let r=Mt.join(n.root,e);if(!$i(n.root,r))throw new Error(`Invalid asset path for ${e}`);return await m_e(r,{recursive:!0}),await Mu(t),{assetId:e,removed:1}}async function ji(t){let e=await Ni(t);return await ju(t,e,t.asset),await Mu(t),t.asset}async function Lu(t){let e=await Xt(t,t.assetId);return SS({...t,relativeFileName:e.file.original})}async function CV(t){let e=await Xt(t,t.assetId);return SS({...t,relativeFileName:e.file.preview??e.file.original})}var S_e="https://create.roblox.com/dashboard/creations/store",w_e="manage_assets_import_rbxm",vO="manage_assets_generate_thumbnail",I_e="manage_assets_review_model";var bO=new Set([w_e,vO]),_O=new Set(["manage_assets_export_selection_rbxm","manage_assets_export_path_rbxm",I_e]),C_e=new Set(["model","animation"]);function st(t){return t&&typeof t=="object"?t:null}function P_e(t){if(typeof t!="string"||!C_e.has(t))throw new Error(`Unsupported Asset Library .rbxm round-trip category: ${String(t??"(missing)")}`);return t}function k_e(t){if(typeof t=="number"&&Number.isInteger(t)&&t>=0)return t;if(typeof t=="string"&&t.trim().length>0){let e=Number.parseInt(t,10);if(Number.isInteger(e)&&e>=0)return e}return null}function PV(t,e){for(let n of t.pluginClients.values())if(!(typeof n.placeId!="number"||!Number.isFinite(n.placeId))&&!(e!==void 0&&n.placeId!==e))return{placeId:n.placeId,...n.placeName?{placeName:n.placeName}:{}};return null}function xO(t,e){let n=ft(t.config.dataDir),r=P_e(e.category),i=typeof e.scope=="string"?e.scope:"place",a=typeof e.assetLibraryAssetId=="string"&&e.assetLibraryAssetId.length>0?e.assetLibraryAssetId:void 0;if(i==="shared")return{projectSyncRoot:n,scope:{kind:"shared"},category:r,...a?{assetId:a}:{}};if(i!=="place")throw new Error(`Invalid Asset Library scope: ${i}`);let o=k_e(e.placeId),s=t.syncController?.getDefaultRuntimePlaceId()??null,c=o??s??PV(t)?.placeId??null;if(c===null)throw new Error("No placeId is available for Asset Library .rbxm round-trip.");let l=PV(t,c);return{projectSyncRoot:n,scope:{kind:"place",placeId:c,...l?.placeName?{placeName:l.placeName}:{}},category:r,...a?{assetId:a}:{}}}function R_e(t){if(x_e.extname(t.file.original).toLowerCase()!==".rbxm")throw new Error(`Asset Library Studio round-trip supports original.rbxm only. Unsupported original file: ${t.file.original}`)}function E_e(t,e){if(typeof t!="string"||t.trim().length===0)throw new Error(`${e} is missing`);return Buffer.from(t,"base64")}function T_e(t,e){let n=st(e),i={kind:n?.kind==="generation"||typeof t.prompt=="string"?"generated":"studioExport",originalPath:"studio:selection"};if(n){let a=typeof n.path=="string"?n.path:typeof n.kind=="string"?n.kind:void 0;a&&(i.originalPath=`studio:${a}`);let o=ye(n.prompt,1e3);o&&(i.prompt=o)}if(!i.prompt){let a=ye(t.prompt,1e3);a&&(i.prompt=a)}return typeof t.contextId=="string"&&(i.contextId=t.contextId),i}function TV(t){let e=st(t);if(!e)return;let n={};typeof e.width=="number"&&(n.width=e.width),typeof e.height=="number"&&(n.height=e.height),typeof e.source=="string"&&(n.source=e.source),typeof e.error=="string"&&(n.error=e.error);let r=Mm(e.attempts);return r.length>0&&(n.attempts=r),Object.keys(n).length>0?n:void 0}function ye(t,e){return typeof t!="string"?null:t.slice(0,e)}function A_e(t){if(typeof t!="string")return null;let e=t.trim();return/^\d+$/.test(e)?e:null}function kV(t){return`rbxassetid://${t}`}function RV(t){return`${S_e}/${t}/configure`}function EV(t){return`assets/${t}`}function Pr(t){return typeof t=="number"&&Number.isFinite(t)?t:void 0}function AV(t){return Array.isArray(t)?t.slice(0,100).flatMap(e=>{let n=st(e);if(!n)return[];let r=ye(n.name,256),i=ye(n.className,128),a=ye(n.path,512);return r===null||i===null||a===null?[]:[{name:r,className:i,path:a}]}):[]}function O_e(t){let e=st(t);if(!e)return{};let n={};for(let[r,i]of Object.entries(e).slice(0,100))typeof i!="number"||!Number.isFinite(i)||i<0||(n[r.slice(0,128)]=Math.floor(i));return n}function D_e(t){return Array.isArray(t)?t.slice(0,200).flatMap(e=>{let n=st(e);if(!n)return[];let r=ye(n.path,512),i=ye(n.property,128),a=ye(n.value,1024);if(r===null||i===null||a===null)return[];let o=ye(n.assetId,64);return[{path:r,property:i,value:a,...o?{assetId:o}:{}}]}):[]}function Mm(t){return Array.isArray(t)?t.slice(0,8).flatMap(e=>{let n=st(e);if(!n)return[];let r=ye(n.method,80),i=n.status==="success"||n.status==="failed"||n.status==="skipped"?n.status:null;if(r===null||i===null)return[];let a=ye(n.message,512);return[{method:r,status:i,...a?{message:a}:{}}]}):[]}function $_e(t,e){let n=t.thumbnailMode==="auto"?"auto":"none";if(n==="none")return{mode:n,status:"skipped",message:"Thumbnail generation disabled"};let r=TV(e),i=st(e),a=typeof i?.pngBase64=="string"&&i.pngBase64.length>0,o=typeof i?.base64Rgba=="string"&&i.base64Rgba.length>0&&i.format==="rgba8"&&typeof i.width=="number"&&typeof i.height=="number";if(r&&(a||o)){let s=Pr(r.width),c=Pr(r.height),l=Mm(i?.attempts);return{mode:n,status:"generated",...s!==void 0?{width:s}:{},...c!==void 0?{height:c}:{},...typeof r.source=="string"?{source:r.source.slice(0,128)}:{},...l.length>0?{attempts:l}:{}}}if(r&&typeof r.error=="string"){let s=Mm(st(e)?.attempts);return{mode:n,status:"failed",message:r.error.slice(0,512),...s.length>0?{attempts:s}:{}}}return{mode:n,status:"skipped",message:"Thumbnail was not returned"}}function N_e(t,e){let n=st(t);if(!n)return e;let r=n.mode==="auto"||n.mode==="none"?n.mode:e.mode,i=n.status==="generated"||n.status==="skipped"||n.status==="failed"?n.status:e.status,a=ye(n.message,512),o=Pr(n.width),s=Pr(n.height),c=ye(n.source,128),l=Mm(n.attempts);return{mode:r,status:i,...a?{message:a}:{},...o!==void 0?{width:o}:{},...s!==void 0?{height:s}:{},...c?{source:c}:{},...l.length>0?{attempts:l}:{}}}function yO(t,e=0){if(e>3)return;if(typeof t=="string")return t.slice(0,512);if(typeof t=="boolean")return t;if(typeof t=="number")return Number.isFinite(t)?t:void 0;if(Array.isArray(t))return t.slice(0,50).flatMap(i=>{let a=yO(i,e+1);return a===void 0?[]:[a]});let n=st(t);if(!n)return;let r={};for(let[i,a]of Object.entries(n).slice(0,50)){let o=yO(a,e+1);o!==void 0&&(r[i.slice(0,128)]=o)}return r}function j_e(t){let e=st(t),n=Pr(e?.x),r=Pr(e?.y),i=Pr(e?.z);if(!(n===void 0||r===void 0||i===void 0))return{x:n,y:r,z:i}}function M_e(t){return Array.isArray(t)?t.slice(0,100).flatMap(e=>{let n=st(e);if(!n)return[];let r=n.severity==="info"||n.severity==="warning"||n.severity==="error"?n.severity:null,i=ye(n.category,80),a=ye(n.code,120),o=ye(n.path,512),s=ye(n.message,512);if(!r||i===null||a===null||o===null||s===null)return[];let c=ye(n.suggestion,512);return[{severity:r,category:i,code:a,path:o,message:s,...c?{suggestion:c}:{}}]}):[]}function L_e(t){let e=st(t);if(!e)return;let n=e.readiness==="ready"||e.readiness==="review"||e.readiness==="blocked"?e.readiness:null;if(!n)return;let r=yO(e.summary),i=ye(e.reviewedAt,64),a=AV(e.roots);return{readiness:n,...i?{reviewedAt:i}:{},...a.length>0?{roots:a}:{},summary:st(r)??{},findings:M_e(e.findings)}}function z_e(t){let e=st(t);if(!e)return;let n={};for(let[r,i]of Object.entries(e).slice(0,16))typeof i=="string"&&(n[r.slice(0,128)]=i.slice(0,256)),typeof i=="number"&&Number.isFinite(i)&&(n[r.slice(0,128)]=i),typeof i=="boolean"&&(n[r.slice(0,128)]=i);return Object.keys(n).length>0?n:void 0}function U_e(t){let e=st(t);if(!e)return;let n=ye(e.provider,120);if(!n)return;let r=ye(e.generatedAt,64),i=ye(e.prompt,1e3),a=e.schemaMode==="predefined"||e.schemaMode==="custom"?e.schemaMode:void 0,o=e.predefinedSchema==="Body1"||e.predefinedSchema==="Car5"?e.predefinedSchema:void 0,s=Array.isArray(e.schemaGroups)?e.schemaGroups.slice(0,50).flatMap(f=>{let m=ye(f,120);return m?[m]:[]}):void 0,c=j_e(e.requestedSize),l=Pr(e.maxTriangles),u=ye(e.targetParent,512),d=ye(e.path,512),p=z_e(e.metadata);return{provider:n,...r?{generatedAt:r}:{},...i?{prompt:i}:{},...a?{schemaMode:a}:{},...o?{predefinedSchema:o}:{},...s&&s.length>0?{schemaGroups:s}:{},...c?{requestedSize:c}:{},...l!==void 0?{maxTriangles:Math.floor(l)}:{},...typeof e.generateTextures=="boolean"?{generateTextures:e.generateTextures}:{},...u?{targetParent:u}:{},...d?{path:d}:{},...p?{metadata:p}:{}}}function F_e(t){return Array.isArray(t)?t.slice(0,100).flatMap(e=>{let n=st(e);if(!n)return[];let r=ye(n.path,512),i=n.assetType==="Mesh"||n.assetType==="Image"||n.assetType==="Model"?n.assetType:null,a=n.status==="uploaded"||n.status==="failed"?n.status:null;if(r===null||i===null||a===null)return[];let o=ye(n.assetId,64),s=ye(n.assetUri,128),c=n.creatorType==="user"||n.creatorType==="group"?n.creatorType:void 0,l=ye(n.creatorId,64),u=ye(n.sourceProperty,128),d=ye(n.uploadedAt,64),p=ye(n.message,512);return[{path:r,assetType:i,status:a,...o?{assetId:o}:{},...s?{assetUri:s}:{},...c?{creatorType:c}:{},...l?{creatorId:l}:{},...u?{sourceProperty:u}:{},...d?{uploadedAt:d}:{},...p?{message:p}:{}}]}):[]}function q_e(t){let e=st(t);if(!e||e.uploaded!==!0)return;let n=A_e(e.assetId);if(!n)return;let r=ye(e.uploadedAt,64)??new Date().toISOString(),i=e.creatorType==="user"||e.creatorType==="group"?e.creatorType:void 0,a=ye(e.creatorId,64);return{uploaded:!0,assetId:n,assetUri:kV(n),assetWebUrl:RV(n),remotePath:EV(n),uploadedAt:r,uploadAttempts:[{startedAt:r,finishedAt:r,status:"uploaded",assetRole:"primary",...i?{creatorType:i}:{},...a?{creatorId:a}:{},assetId:n,assetUri:kV(n),assetWebUrl:RV(n),remotePath:EV(n)}]}}function B_e(t){let e=st(t.value),n=AV(e?.roots),r=O_e(e?.classCounts),i=D_e(e?.resourceReferences),a=L_e(e?.review),o=U_e(e?.generation),s=F_e(e?.studioUploads),c=Pr(e?.exportedCount)??Pr(t.exportedCount)??n.length;return{exportedCount:Math.max(0,Math.floor(c)),roots:n,classCounts:r,resourceReferences:i,thumbnail:N_e(e?.thumbnail,t.fallbackThumbnail),...a?{review:a}:{},...o?{generation:o}:{},...s.length>0?{studioUploads:s}:{}}}function V_e(t){return t.length>=8&&t[0]===137&&t[1]===80&&t[2]===78&&t[3]===71&&t[4]===13&&t[5]===10&&t[6]===26&&t[7]===10}function OV(t){let e=st(t);if(!e)return;let n=null;if(typeof e.pngBase64=="string"&&e.pngBase64.length>0?n=Buffer.from(e.pngBase64,"base64"):typeof e.base64Rgba=="string"&&e.base64Rgba.length>0&&e.format==="rgba8"&&typeof e.width=="number"&&typeof e.height=="number"&&(n=Buffer.from(tV(e.base64Rgba,e.width,e.height),"base64")),!!n){if(!V_e(n))throw new Error("Thumbnail payload is not a valid PNG image.");return{fileName:"thumbnail.png",content:n,mimeType:"image/png"}}}function W_e(t,e){let n=e instanceof Error?e.message:String(e);return t.thumbnail.status!=="generated"?t:{...t,thumbnail:{...t.thumbnail,status:"failed",message:`Thumbnail payload could not be stored: ${n}`.slice(0,512)}}}async function DV(t){if(!bO.has(t.command))return t.params;let e=xO(t.ctx,t.params);if(!e.assetId)throw new Error("assetLibraryAssetId is required for Asset Library .rbxm round-trip.");let n=await Xt(e,e.assetId);R_e(n);let r=await Lu({...e,assetId:n.id}),i=await __e(r);return{...t.params,__assetLibraryRbxmBase64:i.toString("base64"),__assetLibraryOriginalFile:n.file.original}}async function $V(t){if(!_O.has(t.command)||!t.result.success)return t.result;let e=st(t.result.data);if(!e||typeof e.rbxmBase64!="string"||e.rbxmBase64.trim().length===0)return t.result;let n=xO(t.ctx,t.params),r=E_e(e.rbxmBase64,"Asset Library .rbxm export payload"),i=typeof t.params.displayName=="string"?t.params.displayName:void 0,a=typeof t.params.description=="string"?t.params.description:void 0,o=`${i?.trim()||"studio-export"}.rbxm`,s,c=null;try{s=OV(e.thumbnail)}catch(f){c=f,s=void 0}let l=B_e({value:e.rbxm,exportedCount:e.exportedCount,fallbackThumbnail:$_e(t.params,e.thumbnail)});c&&(l=W_e(l,c));let u=q_e(e.roblox),d=await jm({projectSyncRoot:n.projectSyncRoot,scope:n.scope,category:n.category,originalFileName:o,content:r,...i!==void 0?{displayName:i}:{},...a!==void 0?{description:a}:{},source:T_e(t.params,e.source),...s?{preview:s}:{},rbxm:l,...u?{roblox:u}:{}}),p=TV(e.thumbnail);return{...t.result,data:{asset:d.asset,deduplicated:d.deduplicated,...typeof e.byteLength=="number"?{byteLength:e.byteLength}:{},...typeof e.exportedCount=="number"?{exportedCount:e.exportedCount}:{},...e.source!==void 0?{source:e.source}:{},...p?{thumbnail:p}:{}}}}async function NV(t){if(!t.result.success)return t.result;let e=st(t.result.data),n=st(e?.thumbnail),r;try{r=OV(n)}catch(d){return{...t.result,success:!1,error:d instanceof Error?d.message:String(d)}}if(!n||!r)return{...t.result,success:!1,error:typeof n?.error=="string"?n.error:"Thumbnail payload is missing from Asset Library thumbnail generation result."};let i=Pr(n.width),a=Pr(n.height),o=ye(n.source,128),s=Mm(n.attempts),c={mode:"auto",status:"generated",...i!==void 0?{width:i}:{},...a!==void 0?{height:a}:{},...o?{source:o}:{},...s.length>0?{attempts:s}:{}},l=xO(t.ctx,t.params);if(!l.assetId)throw new Error("assetLibraryAssetId is required for Asset Library thumbnail generation.");let u=await xV({projectSyncRoot:l.projectSyncRoot,scope:l.scope,category:l.category,assetId:l.assetId,preview:r,rbxmThumbnail:c});return{...t.result,data:{asset:u.asset,...i!==void 0?{width:i}:{},...a!==void 0?{height:a}:{},...o?{source:o}:{}}}}function H_e(t){if(t===null||typeof t!="object")return;let e=t.proFallback;if(e===null||typeof e!="object")return;let n=e;if(typeof n.executedCommand!="string")return;let r=Array.isArray(n.alternatives)?n.alternatives.filter(i=>typeof i=="string"):void 0;return{executedCommand:n.executedCommand,...typeof n.requestedCommand=="string"?{requestedCommand:n.requestedCommand}:{},...r?{alternatives:r}:{}}}var Z_e=/^Pro action '[^']+' is blocked in Basic mode\. Basic fallback '([^']+)' failed: (.*)$/s,G_e=/^Pro action '[^']+' is blocked in Basic mode\.(?! Basic fallback ')/,K_e=/instance not found|not found in|parent not found/,J_e=/is required|missing required/,Y_e=/unknown action|unknown command/,X_e=/must be|invalid|cannot/;function Q_e(t){let e=Z_e.exec(t);return e?{fallbackCommand:e[1],reason:e[2]}:null}function exe(t){return G_e.test(t)}function txe(t){let e=t.toLowerCase();return K_e.test(e)?"not_found":J_e.test(e)?"missing_param":Y_e.test(e)?"unknown_action":X_e.test(e)?"validation":"other"}function SO(t){return t.errorType==="bridge_error"||t.errorType==="command_timeout"||t.errorType==="plugin_runtime"||t.errorType==="exception"||t.errorType==="device_blocked"||t.failureOrigin==="bridge"||t.failureOrigin==="plugin_runtime"||t.failureOrigin==="server_exception"||t.failureOrigin==="product_bug"||t.failureOrigin==="unknown"||t.recoverability==="retry"||t.recoverability==="wait_connection"||t.recoverability==="unknown"?"error":"warning"}function zu(t){if(t.resultSuccess){let e=H_e(t.resultData);return e?{kind:"success_fallback",fallbackCommand:e.executedCommand,...e.alternatives?{alternatives:e.alternatives}:{}}:{kind:"success_ok"}}if(!t.resultError)return{kind:"error"};if(t.tier==="pro"){let e=Q_e(t.resultError);if(e)return{kind:"blocked_fallback_failed",fallbackCommand:e.fallbackCommand,blockedDetail:txe(e.reason)};if(exe(t.resultError))return{kind:"blocked_unsupported"}}return t.failureClassification?{kind:SO(t.failureClassification)}:{kind:"error"}}function Se(t,e,n,r,i={}){return{errorType:t,errorDetail:e,failureOrigin:n,recoverability:r,...i}}function nxe(t){let e=t.toLowerCase();return/^\s*compilation error:/.test(e)?Se("execution_failed","compile_error","agent_request","code_fix",{validationStage:"plugin_handler"}):/^\s*result too large:/.test(e)?Se("execution_failed","result_too_large","agent_request","code_fix",{validationStage:"plugin_handler"}):/^\s*execution timed out after/.test(e)?Se("execution_failed","execution_timeout","agent_request","code_fix",{validationStage:"plugin_handler"}):/potentially dangerous infinite loop|blocked in sandbox|access to .* is blocked|forbidden|not allowed|cannot access/.test(e)?Se("execution_failed","blocked_source","roblox_policy","code_fix",{validationStage:"plugin_handler"}):null}function rxe(t){let e=t.toLowerCase();return/startline and endline must be provided together/.test(e)||/startline must be a positive integer/.test(e)||/endline must be a positive integer/.test(e)||/endline must be >= startline/.test(e)?Se("execution_failed","validation","agent_request","fix_params",{validationStage:"schema"}):null}function jV(t){let e=t.toLowerCase();return/upstream_server_down/.test(e)?Se("bridge_error","upstream_down","bridge","wait_connection"):/^http [45]\d\d/.test(e)?Se("bridge_error","http_error","bridge","retry"):/duplicate request\s*id/.test(e)?Se("bridge_error","duplicate_request_id","bridge","code_fix"):/timeout/.test(e)?Se("command_timeout","timeout","bridge","retry"):/econnrefused|socket hang up|econnreset|epipe|network/.test(e)?Se("bridge_error","connection","bridge","wait_connection"):/abort/.test(e)?Se("command_timeout","aborted","bridge","retry"):/runtime error|traceback|attempt to/.test(e)?Se("plugin_runtime","runtime_error","plugin_runtime","code_fix"):/created instance, but failed to set \d+ propert/.test(e)?Se("execution_failed","property_apply_failed","agent_request","fix_params",{validationStage:"plugin_handler",partialSuccess:"true"}):/failed to set property/.test(e)?Se("execution_failed","property_apply_failed","agent_request","fix_params",{validationStage:"plugin_handler"}):/parent(?: instance)? not found/.test(e)?Se("execution_failed","parent_not_found","agent_request","fix_params",{validationStage:"plugin_handler"}):/(?:instance|path|root|source instance|ancestor instance) not found|target\s+(?:path\s+)?(?:['"`][^'"`]+['"`]\s+)?not found|not found in|no synced file found for instance/.test(e)?Se("execution_failed","not_found","user_project_state","fix_params",{validationStage:"plugin_handler"}):/is required|missing required/.test(e)?Se("execution_failed","missing_param","agent_request","fix_params",{validationStage:"schema"}):/invalid classname|invalid class/.test(e)?Se("execution_failed","invalid_class","agent_request","fix_params",{validationStage:"plugin_handler"}):/unknown action|unknown command/.test(e)?Se("execution_failed","unknown_action","agent_request","fix_params",{validationStage:"dispatcher"}):/failed to insert asset/.test(e)?Se("execution_failed","asset_error","roblox_policy","fix_params",{validationStage:"roblox_api"}):/failed to read property|property access denied/.test(e)?Se("execution_failed","property_error","agent_request","fix_params",{validationStage:"plugin_handler"}):/forbidden (?:path|parent path)|exceeds (?:total lines|max(?:imum)?(?: length)?)|is not (?:a|an) /.test(e)?Se("execution_failed","validation","agent_request","fix_params",{validationStage:"plugin_handler"}):/sync controller not available|project sync is not initialized|no active sync place|not found in sync cache/.test(e)?Se("execution_failed","sync_not_ready","user_project_state","wait_connection",{validationStage:"preflight"}):/cannot capture edit-mode screenshot while a playtest is active|play-mode screenshot capture is not supported/.test(e)?Se("execution_failed","unsupported_context","roblox_policy","no_retry",{validationStage:"preflight"}):/editableimage api is not enabled|allow mesh \/ image apis|allow http requests/.test(e)?Se("execution_failed","feature_disabled","roblox_policy","no_retry",{validationStage:"preflight"}):/must be|invalid|cannot/.test(e)?Se("execution_failed","validation","agent_request","fix_params",{validationStage:"plugin_handler"}):Se("execution_failed","other","unknown","unknown")}function Uu(t,e){if(t==="manage_scripts_get_source"){let r=rxe(e);if(r)return r}if(t==="execute_luau"){let r=nxe(e);if(r)return r}let n=jV(e);return t==="execute_luau"&&n.errorDetail==="runtime_error"&&/^\s*runtime error:/i.test(e)?Se("execution_failed","runtime_error","agent_request","code_fix"):n}function MV(t){let n=(t instanceof Error?t.message:String(t)).toLowerCase();return/timeout/.test(n)?Se("command_timeout","timeout","bridge","retry"):/econnrefused|socket hang up|network|econnreset|epipe/.test(n)?Se("bridge_error","connection","bridge","wait_connection"):/eaddrinuse/.test(n)?Se("bridge_error","port_in_use","bridge","no_retry"):Se("exception","unexpected","server_exception","code_fix")}ES();qu();import{randomBytes as Cxe}from"node:crypto";var Pxe=["manage_ui_create_tree","manage_ui_update","manage_ui_delete"],JV=["manage_ui_preview","manage_ui_check"],kxe=["ui_role","style_family","layout_family","device_policy","safe_area_policy","existing_ui_strategy"],Rxe=["screen_job","primary_action","visual_thesis","signature_motif","layout_family","imagery_family","ornamentation_family","composition_family","motion_family","device_policy","quality_priority","primary_view_profile_id","responsive_requirement"];function OS(t){return t&&typeof t=="object"?t:void 0}function OO(t){return typeof t=="number"&&Number.isFinite(t)?t:0}function AS(t){let e=OS(t);if(!e)return;let n={};for(let r of kxe){let i=e[r];typeof i=="string"&&i.trim().length>0&&(n[r]=i)}return Object.keys(n).length>0?n:void 0}function DO(t){let e=AS(t.qualityPlanSummary);if(e)return e;let n=OS(t.contextSummary),r=AS(n?.qualityPlanSummary);if(r)return r;let i=AS(n?.qualityPlan);if(i)return i;let a=AS(n?.quality_plan);if(a)return a}function YV(t){let e=OS(t);if(!e)return;let n={};for(let r of Rxe){let i=e[r];typeof i=="string"&&i.trim().length>0&&(n[r]=i)}return Object.keys(n).length>0?n:void 0}function XV(t,e){return e?{...t??{},...e}:t}function Exe(t){return typeof t=="string"?{snapshotId:t}:t&&typeof t=="object"?{snapshotId:typeof t.snapshotId=="string"?t.snapshotId:null,...t.designCheckSummary!==void 0&&{designCheckSummary:t.designCheckSummary},...t.capturedAt!==void 0&&{capturedAt:t.capturedAt},...t.error!==void 0&&{error:t.error}}:{snapshotId:null,error:"preview unavailable"}}function QV(t,e,n,r,i){if(!e)return;let a=OO(e.priority_high),o=OO(e.priority_medium),s=OO(e.priority_low),c=typeof e.total=="number"&&Number.isFinite(e.total)?e.total:a+o+s,l=n??(typeof e.target=="string"?e.target:void 0),u={source:t,...l!==void 0&&{targetPath:l},...typeof r=="string"&&{snapshotId:r},...i!==void 0&&{capturedAt:i},priority_high:a,priority_medium:o,priority_low:s,total:c,deterministic_status:e.deterministic_status==="failed"?"failed":"completed",visual_status:e.visual_status==="completed"||e.visual_status==="skipped"||e.visual_status==="failed"?e.visual_status:"not_requested",coverage:e.coverage==="structural_and_visual"?"structural_and_visual":"structural_only",skipped_reasons:Array.isArray(e.skipped_reasons)?e.skipped_reasons.filter(d=>typeof d=="string"):[],interaction_status:e.interaction_status,primary_view_context_status:e.primary_view_context_status,responsive_status:e.responsive_status,responsive_profiles_reviewed:e.responsive_profiles_reviewed,viewport_profiles_tested:e.viewport_profiles_tested,primary_visual_status:e.primary_visual_status??"not_requested",primary_visual_verdict:e.primary_visual_verdict,critic_summary:typeof e.critic_summary=="string"?e.critic_summary.trim():void 0,responsive_requirement:e.responsive_requirement};return{...u,...ac(u)}}function e3(t,e){if(!e)return t;if(!t)return e;let n=t.targetPath===e.targetPath?t.targetPath:void 0,r=t.snapshotId===e.snapshotId?t.snapshotId:void 0,i={source:e.source,...n!==void 0&&{targetPath:n},...r!==void 0&&{snapshotId:r},...e.capturedAt!==void 0&&{capturedAt:e.capturedAt},priority_high:t.priority_high+e.priority_high,priority_medium:t.priority_medium+e.priority_medium,priority_low:t.priority_low+e.priority_low,total:t.total+e.total,deterministic_status:t.deterministic_status==="failed"||e.deterministic_status==="failed"?"failed":"completed",visual_status:e.visual_status,coverage:t.coverage==="structural_and_visual"||e.coverage==="structural_and_visual"?"structural_and_visual":"structural_only",skipped_reasons:Array.from(new Set([...t.skipped_reasons,...e.skipped_reasons])),interaction_status:e.coverage_dimensions.interaction.status,primary_view_context_status:e.coverage_dimensions.primary_view_context.status,responsive_status:e.coverage_dimensions.responsive_viewport.status,viewport_profiles_tested:Array.from(new Set([...t.viewport_profiles_tested,...e.viewport_profiles_tested])),primary_visual_status:e.primary_visual_status,primary_visual_verdict:e.primary_visual_verdict??t.primary_visual_verdict,critic_summary:e.critic_summary??t.critic_summary,responsive_requirement:e.responsive_requirement??t.responsive_requirement};return{...i,...ac(i)}}function Txe(t){let e=OS(t);if(e)for(let n of["userMessage","intent","expectedBehavior"]){let r=e[n];if(typeof r=="string"&&r.trim().length>0)return r.trim().slice(0,80)}}function Axe(){let t={source:"unavailable",priority_high:0,priority_medium:0,priority_low:0,total:0,deterministic_status:"failed",visual_status:"not_requested",coverage:"structural_only",skipped_reasons:["design_check_unavailable"],primary_visual_status:"not_requested"};return{...t,...ac(t)}}function t3(t){let e=t.now??Date.now,n=null,r=null,i=u=>`${u}_${e()}_${Cxe(3).toString("hex")}`,a=()=>{r&&(clearTimeout(r),r=null)},o=()=>{a(),r=setTimeout(()=>{c("idle_timeout")},t.idleMs)},s=async u=>{try{return Exe(await t.capturePreview(u))}catch(d){return{snapshotId:null,error:d instanceof Error?d.message:String(d)}}},c=async u=>{if(!n)return;a();let d=n;n=null;let p={},f;for(let b of d.affectedPaths)if(d.afterSnapshotsPathPolicy[b]==="skip")p[b]=null;else{let x=await s(b);p[b]=x.snapshotId,x.snapshotId===null&&d.unavailableEvidence.push({phase:"after",targetPath:b,reason:x.error??"preview unavailable"}),f=e3(f,QV("after_snapshot",x.designCheckSummary,b,x.snapshotId,x.capturedAt))}let m=d.latestVisualReview&&d.latestDesignCheckSummary?d.latestDesignCheckSummary:f??d.latestDesignCheckSummary??Axe(),g={...m,responsive_requirement:d.designContractSummary?.responsive_requirement??m.responsive_requirement},y={...g,...ac(g)},v={requestId:d.requestId,...d.contextId!==void 0&&{contextId:d.contextId},...d.label!==void 0&&{label:d.label},startedAt:d.startedAtIso,closedAt:new Date(e()).toISOString(),closeReason:u,ok:d.ok,affectedPaths:Array.from(d.affectedPaths).sort(),mutationCount:d.mutationCount,beforeSnapshots:d.beforeSnapshots,afterSnapshots:p,childMutationIds:d.childMutationIds,...d.qualityPlanSummary!==void 0&&{qualityPlanSummary:d.qualityPlanSummary},...d.designContractSummary!==void 0&&{designContractSummary:d.designContractSummary},postChangeDesignCheckSummary:y,...d.latestVisualReview!==void 0&&{latestVisualReview:d.latestVisualReview},coverageDimensions:y.coverage_dimensions,viewportProfilesTested:y.viewport_profiles_tested,readiness:y.readiness,...d.unavailableEvidence.length>0&&{unavailableEvidence:d.unavailableEvidence}};await FV(t.placeDir,v)},l=u=>({requestId:i("req"),contextId:u.contextId,label:Txe(u.contextSummary),startedAtIso:new Date(e()).toISOString(),startedAtMs:e(),affectedPaths:new Set,beforeSnapshots:{},afterSnapshotsPathPolicy:{},childMutationIds:[],mutationCount:0,ok:!0,qualityPlanSummary:DO(u),designContractSummary:YV(u.designContractSummary),latestDesignCheckSummary:void 0,latestVisualReview:void 0,unavailableEvidence:[],pendingMutation:void 0});return{async beforeMutation(u){if(JV.includes(u.command)){if(n){let p=i("mut");n.qualityPlanSummary=XV(n.qualityPlanSummary,DO(u)),n.pendingMutation={mutationId:p,startedMs:e(),args:u}}return}if(!Pxe.includes(u.command))return;if(n&&n.contextId!==u.contextId?await c("context_change"):n&&a(),n||(n=l(u)),n.qualityPlanSummary=XV(n.qualityPlanSummary,DO(u)),n.designContractSummary={...n.designContractSummary??{},...YV(u.designContractSummary)??{}},u.targetPath&&!(u.targetPath in n.beforeSnapshots)){if(n.affectedPaths.add(u.targetPath),u.command==="manage_ui_create_tree")n.beforeSnapshots[u.targetPath]=null;else{let p=await s(u.targetPath);n.beforeSnapshots[u.targetPath]=p.snapshotId,p.snapshotId===null&&n.unavailableEvidence.push({phase:"before",targetPath:u.targetPath,reason:p.error??"preview unavailable"})}u.command==="manage_ui_delete"?n.afterSnapshotsPathPolicy[u.targetPath]="skip":u.targetPath in n.afterSnapshotsPathPolicy||(n.afterSnapshotsPathPolicy[u.targetPath]="capture")}let d=i("mut");n.pendingMutation={mutationId:d,startedMs:e(),args:u}},async afterMutation(u){if(!n?.pendingMutation)return;let{mutationId:d,args:p}=n.pendingMutation,f={mutationId:d,requestId:n.requestId,ts:new Date(e()).toISOString(),command:p.command,origin:p.origin,...p.targetPath!==void 0&&{targetPath:p.targetPath},...p.briefId!==void 0&&{briefId:p.briefId},...u.diffSummary!==void 0&&{diffSummary:u.diffSummary},...u.changeDetails!==void 0&&{changeDetails:u.changeDetails},ok:u.ok,...u.error!==void 0&&{error:u.error},durationMs:u.durationMs};if(await qV(t.placeDir,f),n.pendingMutation=void 0,JV.includes(p.command)){let m=QV("check_results",u.designCheckSummary,p.targetPath,u.snapshotId,u.capturedAt);n.latestDesignCheckSummary=e3(n.latestDesignCheckSummary,m),m?.snapshotId&&m.primary_visual_verdict&&m.critic_summary&&(n.latestVisualReview={snapshotId:m.snapshotId,verdict:m.primary_visual_verdict,summary:m.critic_summary});return}if(n.mutationCount++,n.childMutationIds.push(d),u.ok||(n.ok=!1),!n.contextId){await c("legacy_single");return}o()},async flushNow(){n&&await c("explicit")}}}var Oxe=new Set(["available","unavailable","unknown"]),Dxe=Object.freeze({status:"recommended",blocking:!1,can_accept:!0,can_edit:!0,can_skip:!0,allows_custom_answer:!0});function Wn(t){if(!(typeof t!="object"||t===null||Array.isArray(t)))return t}function $O(t){return typeof t=="string"&&Oxe.has(t)?t:"unknown"}function $xe(t){let e=Wn(t);return{imageGeneration:$O(e?.image_generation),localImageOutput:$O(e?.local_image_output),imageReview:$O(e?.image_review)}}function Nxe(t){let e=Wn(t.design_contract),n=Wn(e?.imagery_strategy);if(typeof n?.family=="string")return n.family;if(typeof e?.imagery_family=="string")return e.imagery_family;let r=Wn(t.quality_plan);if(typeof r?.imagery_family=="string")return r.imagery_family;if(Array.isArray(t.candidate_briefs)){let i=Wn(t.candidate_briefs[0]),a=Wn(i?.design_contract);if(typeof a?.imagery_family=="string")return a.imagery_family}return"pictogram_set"}function jxe(t){let e=Wn(t.design_contract);if(Wn(e?.imagery_strategy)?.intent==="required")return!0;if(Array.isArray(t.candidate_briefs)){let r=Wn(t.candidate_briefs[0]),i=Wn(r?.design_contract);return Wn(i?.imagery_strategy)?.intent==="required"}return!1}function Mxe(t){return t==="item_thumbnail"?"item_thumbnail":t==="character_portrait"?"character_portrait":t==="decorative_illustration"?"decorative_illustration":t==="diegetic_surface"?"diegetic_surface":"pictogram"}function Lxe(t){let e=Array.isArray(t.asset_recommendations)?t.asset_recommendations:[];for(let r of e){let i=Wn(r);if(!(!i||typeof i.source!="string")){if(i.source==="user_reference")return{mode:"user_reference",reason:"Use the user-provided image reference before generating another asset.",hasConcreteAsset:!0};if(i.source==="project_asset")return{mode:"project_asset",reason:"Use the reviewed project asset before generating another asset.",hasConcreteAsset:!0};if(i.source==="existing_ui")return{mode:"project_asset",reason:"The existing UI image remains a fallback until the user accepts it for this role.",hasConcreteAsset:!1};if(i.source==="creator_store_search")return{mode:"creator_store",reason:"The Creator Store candidate remains a fallback until the user accepts it.",hasConcreteAsset:!1}}}let n=Wn(t.brief);return Array.isArray(n?.reference_assets)&&n.reference_assets.length>0?{mode:"user_reference",reason:"Use the reference asset already accepted in the brief.",hasConcreteAsset:!0}:{mode:"assetless",reason:"Continue with a coherent primitive pictogram or intentional no-imagery treatment.",hasConcreteAsset:!1}}function zxe(t,e){let n=Nxe(t),r=Mxe(n),i=Lxe(t),a=n==="no_imagery",o=jxe(t)&&!a,s={need:a?"optional":o?"required":"helpful",intended_use:r,fallback_mode:i.mode,fallback_reason:i.reason,resolution_status:a||i.hasConcreteAsset?"resolved":o?"unresolved":"optional",primary_visual_approval_eligible:!o||i.hasConcreteAsset};return a?{...s,status:"not_needed",reason:"The recommended direction intentionally uses no imagery.",requires_generation_approval:!1,requires_upload_approval:!1}:i.hasConcreteAsset?{...s,status:"not_needed",reason:"A concrete asset candidate already exists for the recommended direction.",requires_generation_approval:!1,requires_upload_approval:!1}:e.imageGeneration==="available"&&e.localImageOutput==="available"?{...s,status:"recommended",reason:"The calling agent can generate an image and materialize it as a local file.",question:`Generate a bounded local ${r} image set for this recommended UI direction?`,requires_generation_approval:!0,requires_upload_approval:!0}:e.imageGeneration==="unavailable"||e.localImageOutput==="unavailable"?{...s,status:"unavailable",reason:"This agent environment cannot complete the local generated-image path.",requires_generation_approval:!1,requires_upload_approval:!1}:{...s,status:"unknown",reason:"The calling agent should inspect its callable image tools and local output channel once, then use the fallback if support remains unknown.",requires_generation_approval:!1,requires_upload_approval:!1}}function n3(t,e){let n=Wn(t)??{},r=$xe(e);return{...n,recommendation_policy:Dxe,asset_generation_proposal:zxe(n,r)}}var h3=100,aSe=12e4,oSe=15e3,y3=new Set(["manage_ui_create_tree","manage_ui_update","manage_ui_delete"]);function sSe(t,e){return`License required for internal command ${t}. ${e??"Activate Pro license to use this feature."}`}var cSe={Text:{category:"text",label:"\uD14D\uC2A4\uD2B8"},PlaceholderText:{category:"text",label:"\uD50C\uB808\uC774\uC2A4\uD640\uB354"},TextColor3:{category:"color",label:"\uAE00\uC790\uC0C9"},BackgroundColor3:{category:"color",label:"\uBC30\uACBD\uC0C9"},BorderColor3:{category:"color",label:"\uD14C\uB450\uB9AC\uC0C9"},ImageColor3:{category:"color",label:"\uC774\uBBF8\uC9C0\uC0C9"},Size:{category:"size",label:"\uC0AC\uC774\uC988"},TextSize:{category:"size",label:"\uAE00\uC790 \uD06C\uAE30"},Position:{category:"layout",label:"\uC704\uCE58"},AnchorPoint:{category:"layout",label:"\uC575\uCEE4"},Rotation:{category:"layout",label:"\uD68C\uC804"},LayoutOrder:{category:"layout",label:"\uB808\uC774\uC544\uC6C3 \uC21C\uC11C"},Visible:{category:"state",label:"\uD45C\uC2DC \uC0C1\uD0DC"},Active:{category:"state",label:"\uD65C\uC131 \uC0C1\uD0DC"},Interactable:{category:"state",label:"\uC0C1\uD638\uC791\uC6A9 \uC0C1\uD0DC"},Selectable:{category:"state",label:"\uC120\uD0DD \uAC00\uB2A5"},Enabled:{category:"state",label:"\uD65C\uC131\uD654"},Image:{category:"asset",label:"\uC774\uBBF8\uC9C0"},Texture:{category:"asset",label:"\uD14D\uC2A4\uCC98"},SoundId:{category:"asset",label:"\uC0AC\uC6B4\uB4DC"}},lSe={text:"\uD14D\uC2A4\uD2B8",color:"\uCEEC\uB7EC",size:"\uC0AC\uC774\uC988",layout:"\uB808\uC774\uC544\uC6C3",state:"\uC0C1\uD0DC",asset:"\uC5D0\uC14B",property:"\uC18D\uC131"},uSe=Object.entries(ic).reduce((t,[e,n])=>{for(let r of n.validActions)t[`${e}_${r}`]=e;return t},{});function u3(t){return{toolName:uSe[t]||t,commandName:t}}function d3(t,e){if(typeof t.contextId=="string"||!e||typeof e!="object")return t;let n=e.contextId;return typeof n=="string"?{...t,contextId:n}:t}function DS(t,e){if(t!=="manage_sync_status_current_place")return e;let{placeId:n,...r}=e;return r}function dSe(t,e){let n=e.routing;return{requestId:t,success:!1,error:e.message,errorCode:e.code,routing:n,data:{routing:n}}}async function v3(t,e){let n=t.syncController;if(!n)return null;try{let r=e.placeId,i=n.getDefaultRuntimePlaceId(),a=null;if(typeof r=="number"&&Number.isFinite(r))a=r;else if(typeof r=="string"&&r.trim().length>0){let s=Number.parseInt(r,10);Number.isFinite(s)&&(a=s)}if(a===null&&(a=i),a===null||!Number.isFinite(a))return null;let o=a===i?n.getDefaultRuntimePlaceName():null;return typeof o=="string"&&o.length>0?await n.config.resolvePlaceRoot(a,o):n.config.getPlaceRoot(a)}catch{return null}}function pSe(t){let e=t.tree;if(!e||typeof e!="object")return;let n=e,r=typeof n.name=="string"&&n.name.length>0?n.name:void 0;return r?`${typeof n.parent=="string"&&n.parent.length>0?n.parent:"StarterGui"}.${r}`:void 0}function fSe(t,e){let n=e.targetPath;if(typeof n=="string"&&n.length>0)return n;if(t==="manage_ui_create_tree")return pSe(e)}function mSe(t){let e=cSe[t];if(e)return e;let n=t.toLowerCase();return n.includes("color")?{category:"color",label:"\uC0C9\uC0C1"}:t==="Size"||n.endsWith("size")||n.includes("scale")?{category:"size",label:"\uC0AC\uC774\uC988"}:n.includes("position")||n.includes("anchor")||n.includes("rotation")||n.includes("layout")?{category:"layout",label:"\uB808\uC774\uC544\uC6C3"}:n.includes("visible")||n.includes("active")||n.includes("enabled")||n.includes("selectable")||n.includes("interactable")?{category:"state",label:"\uC0C1\uD0DC"}:n.includes("image")||n.includes("texture")||n.includes("sound")||n.includes("asset")?{category:"asset",label:"\uC5D0\uC14B"}:n.includes("text")||n.includes("placeholder")?{category:"text",label:"\uD14D\uC2A4\uD2B8"}:{category:"property",label:t}}function p3(t,e){return Object.prototype.hasOwnProperty.call(t,e)}function gSe(t){if(!t||typeof t!="object")return new Map;let e=t,n=e.changed_properties??e.changedProperties;if(!Array.isArray(n))return new Map;let r=new Map;for(let i of n){if(!i||typeof i!="object")continue;let a=i,o=a.property;if(typeof o!="string"||o.length===0)continue;let s=p3(a,"before"),c=p3(a,"after");r.set(o,{...s&&{before:a.before},...c&&{after:a.after},hasBefore:s,hasAfter:c})}return r}function b3(t,e){let r=t.changes?.properties;if(!r||typeof r!="object")return;let i=gSe(e),a=Object.entries(r).map(([o,s])=>{let c=mSe(o),l=i.get(o),u={property:o,category:c.category,label:c.label,after:l?.hasAfter?l.after:s};return l?.hasBefore&&(u.before=l.before),u});return a.length>0?a:void 0}function _3(t){if(!t||t.length===0)return;let e=new Map;for(let i of t)e.set(i.category,(e.get(i.category)??0)+1);let r=["text","color","size","layout","state","asset","property"].map(i=>{let a=e.get(i)??0;return a>0?`${lSe[i]} ${a}\uAC1C`:null}).filter(i=>i!==null);return r.length>0?`${r.join(", ")} \uBCC0\uACBD`:void 0}function f3(t,e){if(t==="manage_ui_update"){let n=e.changes,r=_3(b3(e));if(r)return r;let i=n?.properties?Object.keys(n.properties).length:0,a=Array.isArray(n?.addChildren)?n.addChildren.length:0,o=Array.isArray(n?.removeChildren)?n.removeChildren.length:0;return`${i} props, +${a}, -${o}`}if(t==="manage_ui_create_tree")return"tree \uC0DD\uC131";if(t==="manage_ui_delete")return"\uC81C\uAC70\uB428"}function Zm(t){return t&&typeof t=="object"?t:void 0}function $S(t,e){let n=t[e];return typeof n=="number"&&Number.isFinite(n)?n:0}function x3(t){let e=Zm(t),n=Zm(e?.design_check_summary);if(n)return{priority_high:$S(n,"priority_high"),priority_medium:$S(n,"priority_medium"),priority_low:$S(n,"priority_low"),total:$S(n,"total"),...typeof n.scope=="string"&&{scope:n.scope},...typeof n.target=="string"&&{target:n.target},...n.deterministic_status==="completed"||n.deterministic_status==="failed"?{deterministic_status:n.deterministic_status}:{},...n.visual_status==="not_requested"||n.visual_status==="completed"||n.visual_status==="skipped"||n.visual_status==="failed"?{visual_status:n.visual_status}:{},...n.coverage==="structural_only"||n.coverage==="structural_and_visual"?{coverage:n.coverage}:{},...Array.isArray(n.skipped_reasons)?{skipped_reasons:n.skipped_reasons.filter(r=>typeof r=="string")}:{}}}function S3(t){let n=Zm(t)?.snapshot_id;return typeof n=="string"?n:null}function m3(t){if(typeof t=="string"&&t.trim().length>0)return t;if(typeof t=="number"&&Number.isFinite(t)){let e=t<1e10?t*1e3:t;return new Date(e).toISOString()}}function w3(t){let e=Zm(t),n=Zm(e?.meta);return m3(n?.captured_at)??m3(n?.evaluated_at)}function hSe(t,e){let n=t.uiStudioRecorders.get(e);if(n)return n;let r=t3({placeDir:e,idleMs:oSe,capturePreview:async i=>{try{let a=await Rr(t,"manage_ui_preview",{targetPath:i},jS());if(!a.success||!a.data||typeof a.data!="object")return null;let o=x3(a.data),s=w3(a.data);return{snapshotId:S3(a.data),...o!==void 0&&{designCheckSummary:o},...s!==void 0&&{capturedAt:s}}}catch{return null}}});return t.uiStudioRecorders.set(e,r),r}async function ySe(t,e,n){if(!y3.has(e))return null;let r=await v3(t,n);if(!r)return null;let i=hSe(t,r),a=e,o=typeof n.contextId=="string"?n.contextId:void 0,s=n.contextSummary,c=s!==void 0&&typeof s=="object"?s:void 0,l=fSe(a,n),u=typeof n.briefId=="string"?n.briefId:void 0,d=u!==void 0?t.uiStudioDesignContracts.get(r,u):void 0,p={command:a,...o!==void 0&&{contextId:o},...c!==void 0&&{contextSummary:c},...l!==void 0&&{targetPath:l},...u!==void 0&&{briefId:u},...d!==void 0&&{designContractSummary:d},origin:n.__origin==="dashboard"?"dashboard":"ai"};try{return await i.beforeMutation(p),{recorder:i,command:a,params:n,startedAt:Date.now()}}catch(f){return h.debug("UI Studio recorder beforeMutation \uC2E4\uD328 (\uBB34\uC2DC)",{error:f}),null}}async function g3(t,e){if(t)try{let n=t.command==="manage_ui_update"?b3(t.params,e.data):void 0,r=t.command==="manage_ui_update"?_3(n)??f3(t.command,t.params):f3(t.command,t.params),i=x3(e.data),a=S3(e.data),o=w3(e.data);await t.recorder.afterMutation({ok:e.success,durationMs:Date.now()-t.startedAt,...r!==void 0&&{diffSummary:r},...n!==void 0&&{changeDetails:n},...e.error!==void 0&&{error:e.error},...i!==void 0&&{designCheckSummary:i},...a!==null&&{snapshotId:a},...o!==void 0&&{capturedAt:o}})}catch(n){h.debug("UI Studio recorder afterMutation \uC2E4\uD328 (\uBB34\uC2DC)",{error:n})}}async function NS(t,e,n,r,i,a){if(!t.historyManager)return;let o=!i.success&&i.error?Uu(n,i.error):void 0,s=zu({resultSuccess:i.success,resultData:i.data,resultError:i.error,tier:ar(n),...o?{failureClassification:o}:{}});if(i.success){let u=s.kind==="success_fallback"&&i.data&&typeof i.data=="object"?{...i.data,outcomeStatus:"fallback",requestedCommand:n,executedCommand:s.fallbackCommand,...s.alternatives?{alternatives:s.alternatives}:{}}:i.data,d=DS(n,r);i.routing?await t.historyManager.recordSuccess(e,d,u,a,n,void 0,i.routing):await t.historyManager.recordSuccess(e,d,u,a,n);return}if(s.kind==="blocked_unsupported"){await t.historyManager.recordBlockedOutcome(e,DS(n,r),i.error||"Pro action blocked in Basic mode","blocked_unsupported",{executionTimeMs:a,command:n,...i.routing?{routing:i.routing}:{}});return}if(s.kind==="blocked_fallback_failed"){await t.historyManager.recordBlockedOutcome(e,DS(n,r),i.error||"Pro action blocked in Basic mode","blocked_fallback_failed",{executionTimeMs:a,command:n,...s.fallbackCommand?{fallbackCommand:s.fallbackCommand}:{},...s.blockedDetail?{blockedDetail:s.blockedDetail}:{},...i.routing?{routing:i.routing}:{}});return}let c=s.kind==="warning"?t.historyManager.recordWarning.bind(t.historyManager):t.historyManager.recordFailure.bind(t.historyManager),l=DS(n,r);i.routing?await c(e,l,i.error||"Unknown error",a,i.errorCode??o?.errorType.toUpperCase(),n,void 0,i.routing):await c(e,l,i.error||"Unknown error",a,i.errorCode??o?.errorType.toUpperCase(),n)}function MO(t,e,n){let r=t.pendingCommands.get(e)||[];r.length>=h3&&r.shift(),r.push(n),t.pendingCommands.set(e,r)}function vSe(t,e){t.globalPendingCommands.length>=h3&&t.globalPendingCommands.shift(),t.globalPendingCommands.push(e)}function I3(t,e,n){let r=jS(),i={requestId:r,command:e.command,params:e.params,timestamp:Date.now(),queueTimeoutMs:e.queueTimeoutMs,ackedTimeoutMs:e.ackedTimeoutMs,state:$n.QUEUED,targetClientId:n,resolve:()=>{},reject:a=>{h.debug("Auxiliary playtest stop command ended without awaited response",{requestId:r,targetClientId:n,error:a.message})},timeoutId:null};return t.commandQueue.set(r,i),i.timeoutId=setTimeout(()=>{Ix(t,i,i.queueTimeoutMs)},i.queueTimeoutMs),{event:"command",id:r,data:{command:i.command,requestId:r,params:i.params}}}function bSe(t,e,n,r){if(!Em(e.data.command))return;let i=t.commandQueue.get(e.data.requestId);if(!i)return;C3(t,i);let a=n.filter(o=>o.clientId!==r);for(let o of a){let s=I3(t,i,o.clientId);MO(t,o.clientId,s)}a.length>0&&h.info("Fan-out playtest stop command to active plugin clients",{requestId:e.data.requestId,primaryClientId:r,auxiliaryClientIds:a.map(o=>o.clientId)})}function C3(t,e,n){for(let r of Y9)setTimeout(()=>{let a=n?[...new Set(n)]:[...new Set(Un(t).map(o=>o.clientId))];for(let o of a){if(!t.pluginClients.get(o))continue;let c=I3(t,e,o);MO(t,o,c)}h.info("Retry playtest stop command to active plugin clients",{sourceRequestId:e.requestId,delayMs:r,targetClientIds:a}),yu(t)},r).unref?.()}function P3(t){return t==="clientId"||t==="targetAlias"||t==="placeId"}function _Se(t,e,n){if(!n||!Em(e.data.command))return!1;let r=t.commandQueue.get(e.data.requestId)?.routing?.selectionMode;return!P3(r)}function xSe(t,e,n){h.debug("Broadcasting command",{command:e.data.command,requestId:e.data.requestId,targetClientId:n||"all",activeWebsocketClients:Un(t).length});let r=n;if(n){MO(t,n,e);let i=t.commandQueue.get(e.data.requestId),a=i?.routing?.selectionMode;if(i&&Em(e.data.command)&&P3(a))C3(t,i,[n]);else if(_Se(t,e,n)){let o=Un(t).sort((s,c)=>c.lastSeen-s.lastSeen);bSe(t,e,o,n),r=void 0}}else vSe(t,e);yu(t,r)}async function k3(t,e,n){let r=Date.now(),i="",a={};try{let o=e.body;i=o.command??"",a=o.params||{};let s=o.requestId;if(o.instanceId||(t.serverLastCommandAt=Date.now()),o.instanceId){let m=t.mcpInstances.get(o.instanceId);m&&(m.lastCommandAt=Date.now(),m.lastSeen=m.lastCommandAt)}let c=u3(i),l=typeof o.timeout=="number"&&Number.isFinite(o.timeout)&&o.timeout>0?{timeout:o.timeout}:void 0,u=o.instanceId?t.mcpInstances.get(o.instanceId)?.sessionId??t.sessionId:t.sessionId;if(!i){n.status(400).json({error:"Missing command"});return}if(h.debug("Received execute request",{command:i,requestId:s}),i==="manage_camera_play_screenshot"){let m="manage_camera.play_screenshot is not supported. Screenshot capture is available only in Edit mode via manage_camera.screenshot.",g=Date.now()-r;t.historyManager&&await t.historyManager.recordFailure("manage_camera",a,m,g,"UNSUPPORTED_COMMAND",i),n.json({requestId:s,success:!1,error:m});return}if(i==="get_cached_selection"){let m=a.maxAge,g=Rm(t,m!==void 0?m:3e4),y=Date.now()-r;if(!g){let x={requestId:s,success:!0,data:{cached:!1,message:"No cached selection data available. The plugin may not be connected or no selection changes have occurred yet."}};t.historyManager&&await t.historyManager.recordSuccess(c.toolName,a,x.data,y,c.commandName),n.json(x);return}let v=Date.now()-g.timestamp,b={cached:!0,selection:g.selection,count:g.count,timestamp:g.timestamp,age:v};t.historyManager&&await t.historyManager.recordSuccess(c.toolName,a,b,y,c.commandName),n.json({requestId:s,success:!0,data:b});return}if(i==="get_connection_info"){let m=await fS(t),g=Date.now()-r;t.historyManager&&await t.historyManager.recordSuccess(c.toolName,a,m,g,c.commandName),n.json({requestId:s,success:!0,data:m});return}if(gS(i)==="internal"){if(!t.internalCommandExecutor){n.status(503).json({requestId:s,success:!1,error:`Internal command executor is not initialized for command: ${i}`});return}if(ar(i)==="pro"){if(!t.licenseState){n.status(503).json({requestId:s,success:!1,error:`License state manager is not initialized for internal command: ${i}`});return}let b=await t.licenseState.evaluateProAccess();if(!b.allowed){let x=sSe(i,b.reason),I=Date.now()-r;t.historyManager&&await NS(t,c.toolName,c.commandName,a,{success:!1,error:x},I),n.json({requestId:s,success:!1,error:x});return}}let m={...a,__sessionId:u},g=await t.internalCommandExecutor(i,m),y=Date.now()-r,v=d3(m,g.data);t.historyManager&&await NS(t,c.toolName,c.commandName,v,{success:g.success,data:g.data,error:g.error||"Internal command failed",...g.errorCode?{errorCode:g.errorCode}:{},...g.routing?{routing:g.routing}:{}},y),n.json({requestId:s,...g});return}let d=await Rr(t,i,a,s,l),p=Date.now()-r,f={...d3(a,d.data),__sessionId:u};t.historyManager&&await NS(t,c.toolName,c.commandName,f,d,p),n.json(d)}catch(o){let s=Date.now()-r,c=ir(o);if(t.historyManager&&i){let l=u3(i);await t.historyManager.recordFailure(l.toolName,a,c,s,"EXCEPTION",l.commandName)}h.error("Execute request failed",o),n.status(500).json({success:!1,error:c})}}async function R3(t,e,n){let r=Date.now(),i=e.body,a=i.action;if(!a||typeof a!="string"){n.status(400).json({success:!1,error:"Missing required field: action"});return}if(!new Set(["get","set","get_all","set_multiple","get_attr","set_attr","get_all_attrs","delete_attr","add_tag","remove_tag","check_tag","get_tags","get_tagged"]).has(a)){n.status(400).json({success:!1,error:`Unsupported action: ${a}`});return}let s=`manage_properties_${a}`,c=jS(),{action:l,...u}=i;try{t.serverLastCommandAt=Date.now();let d=await Rr(t,s,u,c),p=Date.now()-r;t.historyManager&&await NS(t,"manage_properties",s,u,d,p),n.json(d)}catch(d){let p=Date.now()-r,f=ir(d);t.historyManager&&await t.historyManager.recordFailure("manage_properties",u,f,p,"EXCEPTION",s),h.error("/api/properties \uC694\uCCAD \uCC98\uB9AC \uC2E4\uD328",d),n.status(500).json({success:!1,error:f})}}async function Rr(t,e,n,r,i){if(h.debug("Executing command locally",{command:e,requestId:r}),c5(t,r)){let d=`Duplicate requestId '${r}' for command '${e}'. Generate a unique requestId for each command.`;return h.warn("Duplicate execute request rejected",{command:e,requestId:r}),{requestId:r,success:!1,error:d}}let a;try{a=mS(t,Un(t),n,e)}catch(d){if(d instanceof _n)return h.warn("Command target selection failed",{command:e,requestId:r,errorCode:d.code,routing:d.routing}),dSe(r,d);throw d}let o=y3.has(e)?await ySe(t,e,n):null,s=t.config.requestTimeout,c=i?.timeout??Math.max(t.config.requestTimeout,aSe),l=bO.has(e)?await DV({ctx:t,command:e,params:n}):n,u=new Promise((d,p)=>{let f=Date.now(),m={requestId:r,command:e,params:l,timestamp:f,queueTimeoutMs:s,ackedTimeoutMs:c,state:$n.QUEUED,...a.targetClientId?{targetClientId:a.targetClientId}:{},routing:a.routing,resolve:d,reject:p,timeoutId:null};t.commandQueue.set(r,m),_x(t,a.targetClientId,f),m.timeoutId=setTimeout(()=>{Ix(t,m,s)},s)});return xSe(t,{event:"command",id:jS(),data:{command:e,requestId:r,params:l}},a.targetClientId),u.then(async d=>{let p=d;if(e==="manage_ui_design_brief"&&d.success&&d.data){let f=n3(d.data,n.agentCapabilities);p={...d,data:f};try{let m=await v3(t,n);m&&t.uiStudioDesignContracts.remember(m,f)}catch(m){h.debug("UI Studio Design Contract cache failed",{error:m instanceof Error?m.message:String(m)})}}if(e==="manage_ui_preview"&&d.success&&d.data)try{let{processPreviewResult:f,resolvePreviewPlaceDirFromCtx:m}=await Promise.resolve().then(()=>(jO(),NO)),g=await m(t,n),y=await f("manage_ui_preview",d.data,g);p={...d,data:y.data,...y.mcpContent?{mcpContent:y.mcpContent}:{}}}catch(f){h.warn("preview post-processing failed",{error:f instanceof Error?f.message:String(f)})}if(e==="manage_ui_check"&&d.success&&d.data&&n.visualReview!==void 0)try{let{resolvePreviewPlaceDirFromCtx:f}=await Promise.resolve().then(()=>(jO(),NO)),{processCheckResult:m}=await Promise.resolve().then(()=>(l3(),c3)),g=await f(t,n),y=await m("manage_ui_check",d.data,g,n);p={...p,data:y.data}}catch(f){h.warn("check visual post-processing failed",{error:f instanceof Error?f.message:String(f)})}return _O.has(e)?p=await $V({ctx:t,command:e,params:n,result:p}):e===vO&&(p=await NV({ctx:t,params:n,result:p})),p}).then(async d=>(await g3(o,{success:d.success,...d.data!==void 0&&{data:d.data},...d.error!==void 0&&{error:d.error}}),d),async d=>{throw await g3(o,{success:!1,error:ir(d)}),d})}le();ca();function MS(t,e){let n={};e.provider!==void 0&&(n.provider=e.provider),e.tier!==void 0&&(n.tier=e.tier),e.status!==void 0&&(n.status=e.status),e.canUsePro!==void 0&&(n.canUsePro=e.canUsePro),e.cleared===!0&&(n.cleared=!0),pt(t,"license",n)}function Mi(t,e,n,r){t.status(e).json({success:!1,error:{code:n,message:r}})}function SSe(t){if(typeof t!="string")return;let e=t.trim().toLowerCase();return e.length>0?e:void 0}function LS(t,e){if(e==="plugin")return t;let n={...t};return delete n.sessionToken,n}function Gm(t,e,n,r){let i=SSe(r??e.query.provider)??"auto";return t.licenseState?.supportsProvider(i)===!1?(Mi(n,400,"LICENSE_PROVIDER_UNSUPPORTED",`provider "${i}" is not supported`),null):i}function Km(t,e){return t.licenseState?!0:(Mi(e,503,"LICENSE_NOT_INITIALIZED","License system is not initialized"),!1)}function wSe(t){if(!t||typeof t!="object")return!1;let e=t;return(e.canUsePro===!0||e.canUsePro===!1)&&typeof e.status=="string"&&typeof e.checkedAt=="number"}function Jm(t,e,n,r="plugin"){if(!Km(t,n))return;let i=e.body,a=typeof i?.licenseKey=="string"?i.licenseKey:"";if(!a.trim()){Mi(n,400,"LICENSE_KEY_REQUIRED","licenseKey is required");return}let o=Gm(t,e,n,i?.provider);if(!o)return;let s=typeof i?.pluginClientId=="string"?i.pluginClientId:typeof e.query.clientId=="string"?e.query.clientId:void 0,c=typeof i?.deviceId=="string"?i.deviceId:void 0,l={licenseKey:a,provider:o,clientType:r};s&&(l.pluginClientId=s),c&&(l.deviceId=c),t.licenseState.activateGateway(l).then(u=>{t.analyticsManager?.setTier(u.canUsePro?"pro":"basic"),MS(t,{provider:u.provider,tier:u.canUsePro?"pro":"basic",status:u.status,canUsePro:u.canUsePro}),n.json(LS(u,r))}).catch(u=>{h.warn("License activate failed",{error:u instanceof Error?u.message:"unknown_error"}),Mi(n,502,"LICENSE_ACTIVATE_FAILED",u instanceof Error?u.message:"License activation failed")})}function Ym(t,e,n,r="plugin"){if(!Km(t,n))return;let i=Gm(t,e,n);if(i)try{let a=t.licenseState.getStatus(i);t.analyticsManager?.setTier(a.canUsePro?"pro":"basic"),n.json(LS(a,r))}catch(a){h.warn("License status check failed",{error:a instanceof Error?a.message:"unknown_error"}),Mi(n,502,"LICENSE_STATUS_FAILED",a instanceof Error?a.message:"License status check failed")}}function Xm(t,e,n,r="plugin"){if(!Km(t,n))return;let i=e.body,a=Gm(t,e,n,i?.provider);if(!a)return;let o={provider:a,clientType:r};r==="plugin"&&typeof i?.sessionToken=="string"&&i.sessionToken.trim()&&(o.sessionToken=i.sessionToken.trim()),typeof i?.pluginClientId=="string"&&(o.pluginClientId=i.pluginClientId),typeof i?.deviceId=="string"&&(o.deviceId=i.deviceId),t.licenseState.refreshGateway(o).then(s=>{t.analyticsManager?.setTier(s.canUsePro?"pro":"basic"),MS(t,{provider:s.provider,tier:s.canUsePro?"pro":"basic",status:s.status,canUsePro:s.canUsePro}),n.json(LS(s,r))}).catch(s=>{h.warn("License refresh failed",{error:s instanceof Error?s.message:"unknown_error"}),Mi(n,502,"LICENSE_REFRESH_FAILED",s instanceof Error?s.message:"License refresh failed")})}function Qm(t,e,n,r="plugin"){if(!Km(t,n))return;let i=e.body,a=Gm(t,e,n,i?.provider);a&&t.licenseState.resetGateway({provider:a,clientType:r}).then(o=>{t.analyticsManager?.setTier("basic"),MS(t,{provider:o.provider,tier:"basic",status:o.status,canUsePro:o.canUsePro,cleared:!0}),n.json(LS(o,r))}).catch(o=>{h.warn("License reset failed",{error:o instanceof Error?o.message:"unknown_error"}),Mi(n,502,"LICENSE_RESET_FAILED",o instanceof Error?o.message:"License reset failed")})}function LO(t,e,n){if(!Km(t,n))return;let r=e.body,i=Gm(t,e,n,r?.provider);if(!i)return;if(r?.clientType!=="plugin"){Mi(n,400,"LICENSE_CLIENT_TYPE_INVALID","clientType must be plugin");return}let a=typeof r?.sessionToken=="string"&&r.sessionToken.trim()?r.sessionToken.trim():void 0,o=wSe(r?.snapshot)?r.snapshot:void 0;if(!o&&!a){Mi(n,400,"LICENSE_BOOTSTRAP_REQUIRED","snapshot or sessionToken is required");return}let s={provider:i,clientType:"plugin"};o&&(s.snapshot=o),a&&(s.sessionToken=a),t.licenseState.bootstrap(s).then(c=>{t.analyticsManager?.setTier(c.canUsePro?"pro":"basic"),MS(t,{provider:c.provider,tier:c.canUsePro?"pro":"basic",status:c.status,canUsePro:c.canUsePro}),n.json({ok:!0})}).catch(c=>{h.warn("License bootstrap failed",{error:c instanceof Error?c.message:"unknown_error"}),Mi(n,502,"LICENSE_BOOTSTRAP_FAILED",c instanceof Error?c.message:"License bootstrap failed")})}function E3(t){t.app.post("/license/bootstrap",(e,n)=>LO(t,e,n)),t.app.post("/license/activate",(e,n)=>Jm(t,e,n,"plugin")),t.app.post("/license/refresh",(e,n)=>Xm(t,e,n,"plugin")),t.app.post("/license/reset",(e,n)=>Qm(t,e,n,"plugin")),t.app.get("/license/status",(e,n)=>Ym(t,e,n,"plugin"))}vt();le();import{promises as zS}from"fs";import zO from"path";function ISe(t){let e=t.config.appDataDir??Ke();return zO.join(e,"observability","logs")}async function Wu(t,e,n){let r=e.query.clientId;if(r&&t.pluginClients.has(r)){let i=t.pluginClients.get(r);i.lastSeen=Date.now()}try{let i=e.body;if(!i||!Array.isArray(i.logs)){h.warn("Invalid logs request",{body:i}),n.status(400).json({error:"Invalid request body"});return}let a=ISe(t);await zS.mkdir(a,{recursive:!0});let c=`plugin-${new Date().toISOString().split("T")[0]}.log`,l=zO.join(a,c),u=zO.join(a,"current.log"),d=i.logs.map(p=>`[${new Date(p.timestamp*1e3).toISOString().replace("T"," ").substring(0,19)}] [${p.level}] ${p.message}`).join(`
939
+ `:"","utf8"),Vn.renameSync(r,t)}function T9(t){try{return Vn.readdirSync(t,{withFileTypes:!0}).filter(e=>e.isFile()&&e.name.endsWith(".jsonl")).map(e=>{let n=XA.join(t,e.name);return{filePath:n,modifiedAtMs:Vn.statSync(n).mtimeMs}}).sort((e,n)=>e.modifiedAtMs-n.modifiedAtMs)}catch{return[]}}async function A9(t,e=20){return!Number.isInteger(e)||e<=0?[]:T9(eA(t)).slice(-e).map(r=>r.filePath)}function O9(t){let e=eA(t.appDataDir),n=XA.join(e,Nbe(t.instanceId));return{filePath:n,record(i,a,o={},s){try{let l={...YA(o),schemaVersion:1,timestamp:$be(s),source:i,event:a,pid:t.pid,instanceId:t.instanceId,sessionId:t.sessionId};Vn.mkdirSync(e,{recursive:!0}),Mbe(n,JSON.stringify(l))}catch{}},pruneOldInstanceFiles(){try{let i=T9(e);for(let a of i.slice(0,-20))Vn.rmSync(a.filePath,{force:!0})}catch{}}}}vt();function D9(t,e){let n=Lbe(),r=n.replace(/-/g,"").substring(0,8).toUpperCase(),i=`${r.substring(0,4)}-${r.substring(4,8)}`,a=O9({appDataDir:t.appDataDir??Ke(),pid:process.pid,instanceId:n,sessionId:i});return{config:t,app:e,instanceId:n,sessionId:i,startTime:Date.now(),runtimeDiagnostics:a,baseUrl:`http://${t.httpHost}:${t.httpPort}`,commandQueue:new Map,pendingCommands:new Map,globalPendingCommands:[],totalCommandsProcessed:0,pluginClients:new Map,pluginCommandSessionsByClientId:new Map,pluginCommandClientIdsByProcessToken:new Map,mcpInstances:new Map,cachedSelectionMap:new Map,studioRoutingMode:"recentPriority",pinnedTargetClientId:null,isClientMode:!1,clientModeHealthTimer:null,clientModeConsecutiveHealthFailures:0,clientModeUpstreamReachable:!0,clientModeUpstreamContextCaptureEnabled:!0,clientModeLastHealthSuccessAt:null,clientModeLastHealthFailureAt:null,clientModeLastHealthError:null,shuttingDown:!1,onUpstreamPermanentlyDown:null,clientModeIdleTimeoutMs:t.clientModeIdleTimeoutMs??36e5,clientModeIdleWatchdogTimer:null,shutdownFn:null,historyManager:null,analyticsManager:null,executionContextManager:null,licenseState:null,syncController:null,internalCommandExecutor:null,dashboardFolderPicker:null,assetLibraryOpenCloudServiceFactory:null,projectChangesCleanupScheduler:null,activeSyncOwnerInstanceId:null,activeProjectRoot:null,pendingDashboardSyncRootPin:null,playtestControlCommand:null,dashboardSyncRootSwitchInFlight:!1,uiStudioRecorders:new Map,uiStudioDesignContracts:E9(),aiClientName:"",pluginVersion:"",syncedSessionToken:null,serverLastCommandAt:null}}var $9=Ft(bo(),1);le();function N9(t){let e=$9.default.json({limit:"5mb"});t.app.use((n,r,i)=>{if(n.path.startsWith("/sync/")){i();return}e(n,r,i)}),t.app.use((n,r,i)=>{r.setHeader("Access-Control-Allow-Origin","http://localhost:3002"),r.setHeader("Access-Control-Allow-Methods","GET, POST, OPTIONS"),r.setHeader("Access-Control-Allow-Headers","Content-Type"),i()}),t.app.use((n,r,i)=>{h.debug(`${n.method} ${n.path}`,{ip:n.ip}),i()})}co();import{randomUUID as jS}from"crypto";co();le();function zbe(){let t=process.env.WEPPY_ROBLOX_MCP_VERSION?.trim();return t||null}var Ye=zbe()??"2.14.5";ca();nr();km();Ro();gu();co();Ro();var F9="studio-",Fbe=/^studio-[1-9]\d*$/;function iS(t){return Fbe.test(t)}function q9(t,e){let n=new Set;for(let r of t)e!==void 0&&r.clientId===e||r.targetAlias&&iS(r.targetAlias)&&n.add(r.targetAlias);return n}function qbe(t,e){let n=q9(t,e),r=1;for(;n.has(`${F9}${r}`);)r+=1;return`${F9}${r}`}function aS(t,e){let n=q9(t,e.clientId);return e.targetAlias&&iS(e.targetAlias)&&!n.has(e.targetAlias)||(e.targetAlias=qbe(t,e.clientId)),e.targetAlias}gu();function oS(t){for(let e of t)aS(t,e)}function sS(t){let e={clientId:t.clientId,targetAlias:t.targetAlias??t.clientId.slice(0,8),lastSeen:t.lastSeen,connectedAt:t.connectedAt,transport:"websocket",connectionState:t.commandSessionState??Be.CONNECTED};return t.placeId!==void 0&&(e.placeId=t.placeId),t.placeName!==void 0&&(e.placeName=t.placeName),t.pluginVersion!==void 0&&(e.pluginVersion=t.pluginVersion),t.studioVersion!==void 0&&(e.studioVersion=t.studioVersion),t.lastRoutedAt!==void 0&&(e.lastRoutedAt=t.lastRoutedAt),t.processToken!==void 0&&(e.processToken=t.processToken),t.inFlightRequestId!==void 0&&(e.inFlightRequestId=t.inFlightRequestId),t.studioState!==void 0&&(e.studioState=t.studioState),t.studioStateSource!==void 0&&(e.studioStateSource=t.studioStateSource),t.studioStateUpdatedAt!==void 0&&(e.studioStateUpdatedAt=t.studioStateUpdatedAt),t.playtestMode!==void 0&&(e.playtestMode=t.playtestMode),e}function aO(t){let e=Un(t);return oS(e),pm(e.map(sS),null)}function cS(t){let e=new Set;t.aiClientName&&e.add(t.aiClientName);for(let n of t.mcpInstances.values())n.aiClientName&&e.add(n.aiClientName);return Array.from(e)}function B9(t){let n=Date.now();for(let[r,i]of t.mcpInstances)i.lastSeen&&n-i.lastSeen>15e3&&(t.mcpInstances.delete(r),i.sessionId&&t.executionContextManager?.endSession(i.sessionId),h.debug("Removed stale MCP instance",{instanceId:r,lastSeen:i.lastSeen}))}function V9(t,e,n){let r=e.query.clientId;if(r&&t.pluginClients.has(r)){let i=t.pluginClients.get(r);i.lastSeen=Date.now()}try{let i=e.body;if(!i||!Array.isArray(i.selection)||typeof i.count!="number"){h.warn("Invalid selection update request",{body:i}),n.status(400).json({error:"Invalid request body"});return}let a=r||"unknown",o=Date.now();t.cachedSelectionMap.set(a,{selection:i.selection,count:i.count,timestamp:o,clientId:a}),h.debug("Selection cache updated",{count:i.count,clientId:a,timestamp:o}),n.json({status:"ok",timestamp:o})}catch(i){h.error("Error handling selection update",i),n.status(500).json({error:"Internal server error"})}}function W9(t,e,n){let r=parseInt(e.query.maxAge)||3e4,i=Rm(t,r);i?n.json({cached:!0,...i}):n.json({cached:!1,message:"No cached selection available"})}function Rm(t,e=3e4,n){if(t.cachedSelectionMap.size===0)return null;let r;if(n)r=t.cachedSelectionMap.get(n);else for(let a of t.cachedSelectionMap.values())(!r||a.timestamp>r.timestamp)&&(r=a);if(!r)return null;let i=Date.now()-r.timestamp;return e===0||i<=e?r:null}function oO(t,e){let n=t.pluginClients.get(e.clientId),r=Date.now(),i=[...t.pluginClients.values()].filter(c=>c.clientId===e.clientId||c.commandSessionState!==Be.DISCONNECTED),a=n??{clientId:e.clientId,connectedAt:r,lastSeen:r,commandsProcessed:0,connectionType:"polling"},o=aS(i,a),s={clientId:e.clientId,targetAlias:o,projectName:e.projectName??n?.projectName,placeName:e.placeName??n?.placeName,placeId:e.placeId??n?.placeId,pluginVersion:e.pluginVersion??n?.pluginVersion,studioVersion:e.studioVersion??n?.studioVersion,connectedAt:n?.connectedAt||r,lastSeen:r,commandsProcessed:n?.commandsProcessed||0,connectionType:n?.connectionType||"polling",inFlightRequestId:n?.inFlightRequestId,studioState:n?.studioState,studioStateSource:n?.studioStateSource,studioStateUpdatedAt:n?.studioStateUpdatedAt,playtestMode:n?.playtestMode,...n?.commandSessionState?{commandSessionState:n.commandSessionState}:{},...n?.processToken?{processToken:n.processToken}:{}};return t.pluginClients.set(e.clientId,s),t.syncController&&typeof t.syncController.setCurrentConnectedPlace=="function"&&typeof e.placeId=="number"&&Number.isFinite(e.placeId)&&t.syncController.setCurrentConnectedPlace(e.placeId,e.placeName??null),t.pendingCommands.has(e.clientId)||t.pendingCommands.set(e.clientId,[]),e.pluginVersion&&(t.pluginVersion=e.pluginVersion),typeof s.placeId=="number"&&Number.isFinite(s.placeId)&&Dx(t,s.placeId,s.placeName??null),t.analyticsManager&&(e.pluginVersion&&t.analyticsManager.setPluginVersion(e.pluginVersion),t.analyticsManager.trackPluginConnected()),h.info("Plugin client registered",{clientId:e.clientId,targetAlias:o,projectName:e.projectName,placeName:e.placeName,isReconnect:!!n}),{clientInfo:s,sessionId:t.sessionId,mcpVersion:Ye,mcpInstanceCount:t.mcpInstances.size+1,aiClientNames:cS(t)}}function sO(t,e){let n=t.pluginClients.get(e),r=t.pluginClients.has(e),i=n?.commandSessionState===Be.CONNECTED;if(t.pluginClients.delete(e),t.pendingCommands.delete(e),r&&mu(t,e),r&&t.syncController&&typeof t.syncController.clearCurrentConnectedPlaceIfMatch=="function"&&typeof n?.placeId=="number"&&Number.isFinite(n.placeId)){let a=[...t.pluginClients.values()].filter(o=>typeof o.placeId=="number"&&Number.isFinite(o.placeId)).sort((o,s)=>s.lastSeen-o.lastSeen)[0];a?t.syncController.setCurrentConnectedPlace?.(a.placeId??null,a.placeName??null):t.syncController.clearCurrentConnectedPlaceIfMatch(n.placeId)}return i&&fm(t,e,"disconnected",n),h.info("Plugin client unregistered",{clientId:e,existed:r}),r}function lS(t,e,n){try{let r=e.body;if(!r.clientId){n.status(400).json({error:"Missing clientId"});return}let i=oO(t,{clientId:r.clientId,projectName:r.projectName,placeName:r.placeName,placeId:r.placeId,pluginVersion:r.pluginVersion,studioVersion:r.studioVersion});n.json({status:"ok",clientId:r.clientId,targetAlias:i.clientInfo.targetAlias,serverInstanceId:t.instanceId,sessionId:i.sessionId,mcpVersion:i.mcpVersion,connectedAt:i.clientInfo.connectedAt,aiClientNames:i.aiClientNames,serverStartTime:t.startTime,mcpInstanceCount:i.mcpInstanceCount})}catch(r){h.error("Error registering plugin client",r),n.status(500).json({error:"Internal server error"})}}function uS(t,e,n){let r=e.body?.clientId;if(!r){n.status(400).json({error:"Missing clientId"});return}let i=sO(t,r);n.json({status:"ok",existed:i})}function H9(t,e,n){try{let r=e.body;if(!r.instanceId){n.status(400).json({error:"Missing instanceId"});return}let i=Date.now(),a={instanceId:r.instanceId,...typeof r.sessionId=="string"?{sessionId:r.sessionId}:{},pid:r.pid,connectedAt:i,isServer:!1,lastSeen:i};r.aiClientName&&(a.aiClientName=r.aiClientName),r.cwd&&(a.cwd=r.cwd),"projectRoot"in r&&(a.projectRoot=r.projectRoot),t.mcpInstances.set(r.instanceId,a),pt(t,"mcp_status",{aiClientName:a.aiClientName??"Unknown",instanceId:r.instanceId,status:"registered"}),bu(t,{timestamp:new Date().toISOString(),type:"mcp",status:"registered",instanceId:r.instanceId,message:`MCP registered \u2014 ${a.aiClientName??r.instanceId}`,...a.aiClientName?{aiClientName:a.aiClientName}:{}}),h.info("MCP instance registered (client mode)",{instanceId:r.instanceId,pid:r.pid,cwd:r.cwd}),n.json({status:"ok",instanceId:r.instanceId,serverInstanceId:t.instanceId,sessionId:t.sessionId,mcpVersion:Ye,mcpInstanceCount:t.mcpInstances.size+1})}catch(r){h.error("Error registering MCP instance",r),n.status(500).json({error:"Internal server error"})}}function Z9(t,e,n){let r=e.body?.instanceId;if(!r){n.status(400).json({error:"Missing instanceId"});return}let i=t.mcpInstances.get(r),a=!!i;t.mcpInstances.delete(r),i?.sessionId&&t.executionContextManager?.endSession(i.sessionId),a&&(pt(t,"mcp_status",{aiClientName:i?.aiClientName??"Unknown",instanceId:r,status:"unregistered"}),bu(t,{timestamp:new Date().toISOString(),type:"mcp",status:"unregistered",instanceId:r,message:`MCP unregistered \u2014 ${i?.aiClientName??r}`,...i?.aiClientName?{aiClientName:i.aiClientName}:{}})),h.info("MCP instance unregistered",{instanceId:r,existed:a}),n.json({status:"ok",existed:a})}function G9(t,e,n){let{instanceId:r,aiClientName:i}=e.body;if(r&&i){let a=t.mcpInstances.get(r);a&&(a.aiClientName=i)}n.json({status:"ok"})}function K9(t){let e=3e4,n=Date.now(),r=Zr({appDataDir:t.config.appDataDir});for(let[a,o]of t.pluginClients)n-o.lastSeen>e&&(t.pluginClients.delete(a),t.pendingCommands.delete(a),mu(t,a));B9(t);let i=Un(t);return oS(i),{serverInstanceId:t.instanceId,sessionId:t.sessionId,mcpVersion:Ye,uptime:n-t.startTime,serverStartTime:t.startTime,serverExecutable:process.execPath,serverHost:t.config.httpHost,serverPort:t.config.httpPort,serverPid:process.pid,pluginClients:i.map(sS),studioRoutingMode:t.studioRoutingMode,pinnedTargetClientId:t.pinnedTargetClientId,mcpInstances:[{instanceId:t.instanceId,pid:process.pid,connectedAt:t.startTime,isServer:!0,cwd:process.cwd(),projectRoot:r,lastSeen:n,...t.aiClientName?{aiClientName:t.aiClientName}:{}},...Array.from(t.mcpInstances.values())],mcpInstanceCount:t.mcpInstances.size+1}}function dS(t,e){e.json(K9(t))}function pS(t,e,n){let r=e.query.instanceId;r&&t.mcpInstances.has(r)&&(t.mcpInstances.get(r).lastSeen=Date.now()),B9(t);let i=Un(t);oS(i);let s={...{status:"online",connectedClients:i.length,queuedCommands:b5(t),uptime:Date.now()-t.startTime,version:Ye,enableContextCapture:t.executionContextManager?.isEnabled()??t.config.enableContextCapture??!0,isClientMode:t.isClientMode,shuttingDown:t.shuttingDown,pid:process.pid,sessionId:t.sessionId,nodeVersion:process.version,studioRoutingMode:t.studioRoutingMode,pinnedTargetClientId:t.pinnedTargetClientId},instanceId:t.instanceId,mcpInstanceCount:t.mcpInstances.size+1,aiClientNames:cS(t),pluginVersion:t.pluginVersion||void 0,dashboardSseClients:t.dashboardSseClients?.size??0,websocketClients:i.length,pluginClients:i.map(sS),...t.isClientMode?{upstream:{reachable:t.clientModeUpstreamReachable,consecutiveFailures:t.clientModeConsecutiveHealthFailures,lastSuccessAt:t.clientModeLastHealthSuccessAt,lastFailureAt:t.clientModeLastHealthFailureAt,lastError:t.clientModeLastHealthError,baseUrl:t.baseUrl}}:{}};n.json(s)}function J9(t,e,n,r){let i=e.ip||e.socket.remoteAddress||"";if(!(i==="127.0.0.1"||i==="::1"||i==="::ffff:127.0.0.1"||i==="localhost")){h.warn("Shutdown request rejected from non-localhost",{ip:i}),n.status(403).json({error:"Forbidden: localhost only"});return}h.info("Shutdown request received, initiating graceful shutdown",{requestedBy:i,uptime:Date.now()-t.startTime}),n.json({status:"shutting_down",message:"Server will shutdown gracefully",pid:process.pid}),setTimeout(async()=>{try{await r(),h.info("Graceful shutdown completed"),process.exit(0)}catch(o){h.error("Error during graceful shutdown",o),process.exit(1)}},100)}async function fS(t){if(t.isClientMode)try{let e=await fetch(`${t.baseUrl}/connection-info`);if(e.ok)return await e.json()}catch(e){h.warn("Failed to fetch connection info from server",{error:e})}return K9(t)}Ro();var _t={bridgeRunTest:"manage_studio_run_test_bridge",placeInfo:"system_info_place_info",clearLogs:"manage_logs_clear",createScript:"manage_scripts_create",getLogs:"manage_logs_get",deleteScript:"manage_scripts_delete",canonical:{playStart:"manage_studio_play_start",playStop:"manage_studio_play_stop",playPause:"manage_studio_play_pause",playResume:"manage_studio_play_resume",playStatus:"manage_studio_play_status",runTest:"manage_studio_run_test"}},Vbe=new Set([_t.canonical.runTest]),Wbe=new Set([_t.canonical.playStop]),A8e=new Set([_t.canonical.playStart,_t.canonical.playStop,_t.canonical.playPause,_t.canonical.playResume,_t.canonical.playStatus]);function Di(t){return Vbe.has(t)}function Em(t){return Wbe.has(t)}var N8e=_t.canonical.playStop,Y9=[5e3,15e3];gu();var Hbe=new Set(["manage_assets_export_selection_rbxm","manage_assets_export_path_rbxm","manage_assets_review_model","manage_assets_generate_model","manage_assets_import_rbxm","manage_assets_generate_thumbnail"]),_n=class t extends Error{code;routing;constructor(e,n,r){super(n),this.name="CommandTargetSelectionError",this.code=e,this.routing=r,Object.setPrototypeOf(this,t.prototype)}};function Zbe(t={},e){let n={},r=t.clientId,i=t.targetAlias,a=t.placeId;if(r!==void 0){if(typeof r!="string"||r.trim().length===0)throw new _n("invalid_target_selector","clientId target selector must be a non-empty string",{selectionMode:"clientId",...typeof r=="string"?{requestedClientId:r.trim()}:{}});n.requestedClientId=r.trim()}if(i!==void 0){if(typeof i!="string"||i.trim().length===0)throw new _n("invalid_target_selector","targetAlias target selector must be a non-empty string",{selectionMode:"targetAlias",...typeof i=="string"?{requestedTargetAlias:i.trim()}:{}});n.requestedTargetAlias=i.trim()}if(a!==void 0&&Gbe(e,t)){if(typeof a!="number"||!Number.isFinite(a))throw new _n("invalid_target_selector","placeId target selector must be a finite number",{selectionMode:"placeId"});n.requestedPlaceId=a}return n}function mS(t,e,n={},r){let i=Zbe(n,r),a=V8(e,t.studioRoutingMode==="pinned"?t.pinnedTargetClientId:null);if(i.requestedClientId!==void 0)return Kbe(a,i);if(i.requestedTargetAlias!==void 0)return Jbe(a,i);if(i.requestedPlaceId!==void 0)return Ybe(a,i);if(t.studioRoutingMode==="pinned"&&t.pinnedTargetClientId!==null){let s=a.find(c=>c.clientId===t.pinnedTargetClientId);if(s)return{targetClientId:s.clientId,routing:ni("pinnedTarget",i,s)}}let o=a[0];return o?{targetClientId:o.clientId,routing:ni("recentPriority",i,o)}:{routing:{selectionMode:"globalQueue"}}}function Gbe(t,e){return!t||!Hbe.has(t)?!0:e.scope==="shared"}function Kbe(t,e){let n=t.find(r=>r.clientId===e.requestedClientId);if(!n)throw new _n("target_client_not_found",`Target client not found: ${e.requestedClientId}`,ni("clientId",e));if(e.requestedTargetAlias!==void 0&&n.targetAlias!==e.requestedTargetAlias)throw new _n("target_selector_mismatch",`Target client ${n.clientId} does not match targetAlias ${e.requestedTargetAlias}`,ni("clientId",e,n));return X9("clientId",e,n),{targetClientId:n.clientId,routing:ni("clientId",e,n)}}function Jbe(t,e){let n=t.find(r=>r.targetAlias!==void 0&&iS(r.targetAlias)&&r.targetAlias===e.requestedTargetAlias);if(!n)throw new _n("target_alias_not_found",`Target alias not found: ${e.requestedTargetAlias}`,ni("targetAlias",e));return X9("targetAlias",e,n),{targetClientId:n.clientId,routing:ni("targetAlias",e,n)}}function Ybe(t,e){let n=t.filter(i=>i.placeId===e.requestedPlaceId);if(n.length===0)throw new _n("target_place_not_found",`Target place not found: ${e.requestedPlaceId}`,ni("placeId",e));if(n.length>1)throw new _n("target_place_ambiguous",`Target place is ambiguous: ${e.requestedPlaceId}`,ni("placeId",e));let r=n[0];return{targetClientId:r.clientId,routing:ni("placeId",e,r)}}function X9(t,e,n){if(e.requestedPlaceId!==void 0&&n.placeId!==e.requestedPlaceId)throw new _n("target_selector_mismatch",`Target client ${n.clientId} is not connected to placeId ${e.requestedPlaceId}`,ni(t,e,n))}function ni(t,e,n){let r={selectionMode:t};return e.requestedClientId!==void 0&&(r.requestedClientId=e.requestedClientId),e.requestedTargetAlias!==void 0&&(r.requestedTargetAlias=e.requestedTargetAlias),e.requestedPlaceId!==void 0&&(r.requestedPlaceId=e.requestedPlaceId),n!==void 0&&(r.actualClientId=n.clientId,n.targetAlias!==void 0&&(r.actualTargetAlias=n.targetAlias),n.placeId!==void 0&&(r.actualPlaceId=n.placeId),n.placeName!==void 0&&(r.actualPlaceName=n.placeName)),r}iA();le();Im();var ic={query_instances:{discriminator:"action",validActions:new Set(["get","children","find_child","find_descendant","wait_for_child","class_info","search_name","search_class","search_property","search_tag","file_tree","project_structure","descendants","ancestors"]),allowedParams:{query_instances_get:new Set(["path","sessionDebugId","siblingIndex","placeId","clientId","targetAlias"]),query_instances_children:new Set(["path","sessionDebugId","siblingIndex","recursive","maxDepth","placeId","clientId","targetAlias"]),query_instances_find_child:new Set(["path","childName","placeId","clientId","targetAlias"]),query_instances_find_descendant:new Set(["path","descendantName","placeId","clientId","targetAlias"]),query_instances_wait_for_child:new Set(["path","childName","timeout","placeId","clientId","targetAlias"]),query_instances_class_info:new Set(["className","placeId","clientId","targetAlias"]),query_instances_search_name:new Set(["root","query","caseSensitive","maxResults","placeId","clientId","targetAlias"]),query_instances_search_class:new Set(["className","root","includeSubclasses","maxResults","placeId","clientId","targetAlias"]),query_instances_search_property:new Set(["root","propertyName","propertyValue","maxResults","placeId","clientId","targetAlias"]),query_instances_search_tag:new Set(["root","tag","maxResults","placeId","clientId","targetAlias"]),query_instances_file_tree:new Set(["maxDepth","root","includeServices","placeId","clientId","targetAlias"]),query_instances_project_structure:new Set(["root","depth","placeId","clientId","targetAlias"]),query_instances_descendants:new Set(["path","sessionDebugId","siblingIndex","maxResults","placeId","clientId","targetAlias"]),query_instances_ancestors:new Set(["path","sessionDebugId","siblingIndex","placeId","clientId","targetAlias"])},paramAliases:{query_instances_search_name:{query:"pattern"},query_instances_search_property:{root:"rootPath"},query_instances_search_tag:{root:"rootPath"},query_instances_project_structure:{root:"rootPath"}}},mutate_instances:{discriminator:"action",validActions:new Set(["create","create_with_props","delete","clone","move","rename","pivot","create_tree","mass_create","mass_delete","mass_duplicate","smart_duplicate","scatter"]),allowedParams:{mutate_instances_create:new Set(["className","parent","name","properties","placeId","clientId","targetAlias"]),mutate_instances_create_with_props:new Set(["className","parent","name","properties","placeId","clientId","targetAlias"]),mutate_instances_delete:new Set(["path","sessionDebugId","siblingIndex","placeId","clientId","targetAlias"]),mutate_instances_clone:new Set(["path","sourcePath","sessionDebugId","siblingIndex","targetParent","newName","placeId","clientId","targetAlias"]),mutate_instances_move:new Set(["path","sessionDebugId","siblingIndex","newParent","placeId","clientId","targetAlias"]),mutate_instances_rename:new Set(["path","sessionDebugId","siblingIndex","newName","placeId","clientId","targetAlias"]),mutate_instances_pivot:new Set(["path","sessionDebugId","siblingIndex","position","cframe","offset","placeId","clientId","targetAlias"]),mutate_instances_create_tree:new Set(["parent","tree","placeId","clientId","targetAlias"]),mutate_instances_mass_create:new Set(["instances","placeId","clientId","targetAlias"]),mutate_instances_mass_delete:new Set(["paths","placeId","clientId","targetAlias"]),mutate_instances_mass_duplicate:new Set(["targetParent","paths","placeId","clientId","targetAlias"]),mutate_instances_smart_duplicate:new Set(["path","sessionDebugId","siblingIndex","targetParent","offset","count","placeId","clientId","targetAlias"]),mutate_instances_scatter:new Set(["templatePaths","region","count","seed","maxSlope","avoidWater","alignToNormal","scaleJitter","minSpacing","parentName","placeId","clientId","targetAlias"])},paramAliases:{mutate_instances_clone:{path:"sourcePath"},mutate_instances_smart_duplicate:{spacing:"offset"}}},manage_properties:{discriminator:"action",validActions:new Set(["get","set","get_all","set_multiple","get_attr","set_attr","get_all_attrs","delete_attr","add_tag","remove_tag","check_tag","get_tags","get_tagged","set_calculated","set_relative","mass_set","mass_get","modify_children"]),allowedParams:{manage_properties_get:new Set(["path","property","placeId","clientId","targetAlias"]),manage_properties_set:new Set(["path","property","value","placeId","clientId","targetAlias"]),manage_properties_get_all:new Set(["path","includeReadOnly","placeId","clientId","targetAlias"]),manage_properties_set_multiple:new Set(["path","properties","placeId","clientId","targetAlias"]),manage_properties_get_attr:new Set(["path","attribute","placeId","clientId","targetAlias"]),manage_properties_set_attr:new Set(["path","value","attribute","placeId","clientId","targetAlias"]),manage_properties_get_all_attrs:new Set(["path","placeId","clientId","targetAlias"]),manage_properties_delete_attr:new Set(["path","attribute","placeId","clientId","targetAlias"]),manage_properties_add_tag:new Set(["path","tag","placeId","clientId","targetAlias"]),manage_properties_remove_tag:new Set(["path","tag","placeId","clientId","targetAlias"]),manage_properties_check_tag:new Set(["path","tag","placeId","clientId","targetAlias"]),manage_properties_get_tags:new Set(["path","placeId","clientId","targetAlias"]),manage_properties_get_tagged:new Set(["tagName","root","maxResults","placeId","clientId","targetAlias"]),manage_properties_set_calculated:new Set(["path","expression","variables","propertyName","placeId","clientId","targetAlias"]),manage_properties_set_relative:new Set(["path","value","operation","amount","propertyName","placeId","clientId","targetAlias"]),manage_properties_mass_set:new Set(["paths","propertyName","propertyValue","placeId","clientId","targetAlias"]),manage_properties_mass_get:new Set(["paths","propertyName","placeId","clientId","targetAlias"]),manage_properties_modify_children:new Set(["parentPath","modifications","propertyName","propertyValue","filter","recursive","placeId","clientId","targetAlias"])},paramAliases:{manage_properties_get_tagged:{tagName:"tag",root:"rootPath"},manage_properties_set_relative:{amount:"value"}}},manage_scripts:{discriminator:"action",validActions:new Set(["get_source","set_source","create","delete","edit_replace","edit_insert","edit_delete","search","replace","get_dependencies","validate"]),allowedParams:{manage_scripts_get_source:new Set(["path","startLine","endLine","placeId","clientId","targetAlias"]),manage_scripts_set_source:new Set(["path","source","validate","placeId","clientId","targetAlias"]),manage_scripts_create:new Set(["source","scriptType","parent","name","placeId","clientId","targetAlias"]),manage_scripts_delete:new Set(["path","placeId","clientId","targetAlias"]),manage_scripts_edit_replace:new Set(["path","startLine","endLine","newLines","validate","placeId","clientId","targetAlias"]),manage_scripts_edit_insert:new Set(["path","lines","afterLine","content","validate","placeId","clientId","targetAlias"]),manage_scripts_edit_delete:new Set(["path","startLine","endLine","validate","placeId","clientId","targetAlias"]),manage_scripts_search:new Set(["path","pattern","caseSensitive","wholeWord","usePattern","maxResults","placeId","clientId","targetAlias"]),manage_scripts_replace:new Set(["path","pattern","replacement","usePattern","dryRun","placeId","clientId","targetAlias"]),manage_scripts_get_dependencies:new Set(["path","placeId","clientId","targetAlias"]),manage_scripts_validate:new Set(["source","path","placeId","clientId","targetAlias"])},paramAliases:{manage_scripts_edit_replace:{newLines:"newContent"},manage_scripts_edit_insert:{lines:"content"},manage_scripts_replace:{pattern:"searchPattern"}}},manage_ui:{discriminator:"action",validActions:new Set(["design_brief","create_tree","update","delete","preview","check"]),allowedParams:{manage_ui_design_brief:new Set(["brief","projectContext","agentCapabilities","placeId","clientId","targetAlias"]),manage_ui_create_tree:new Set(["briefId","tree","placeId","clientId","targetAlias"]),manage_ui_update:new Set(["targetPath","changes","briefId","placeId","clientId","targetAlias"]),manage_ui_delete:new Set(["targetPath","placeId","clientId","targetAlias"]),manage_ui_preview:new Set(["targetPath","briefId","viewportMode","profileIds","placeId","clientId","targetAlias"]),manage_ui_check:new Set(["targetPath","briefId","visualReview","viewportMode","profileIds","placeId","clientId","targetAlias"])}},manage_lighting:{discriminator:"action",validActions:new Set(["lighting","atmosphere","sky","terrain_props","time","mood"]),allowedParams:{manage_lighting_lighting:new Set(["properties","placeId","clientId","targetAlias"]),manage_lighting_atmosphere:new Set(["properties","createIfMissing","placeId","clientId","targetAlias"]),manage_lighting_sky:new Set(["properties","createIfMissing","placeId","clientId","targetAlias"]),manage_lighting_terrain_props:new Set(["properties","placeId","clientId","targetAlias"]),manage_lighting_time:new Set(["time","clockTime","placeId","clientId","targetAlias"]),manage_lighting_mood:new Set(["preset","overrides","placeId","clientId","targetAlias"])}},manage_selection:{discriminator:"action",validActions:new Set(["get","set","clear","cached","context","details","add","remove","watch"]),allowedParams:{manage_selection_get:new Set(["placeId","clientId","targetAlias"]),manage_selection_set:new Set(["paths","placeId","clientId","targetAlias"]),manage_selection_clear:new Set(["placeId","clientId","targetAlias"]),manage_selection_cached:new Set(["maxAge"]),manage_selection_context:new Set(["includeSource","includeProperties","includeChildren","placeId","clientId","targetAlias"]),manage_selection_details:new Set(["maxDepth","includeAncestors","placeId","clientId","targetAlias"]),manage_selection_add:new Set(["paths","placeId","clientId","targetAlias"]),manage_selection_remove:new Set(["paths","placeId","clientId","targetAlias"]),manage_selection_watch:new Set(["placeId","clientId","targetAlias"])}},manage_camera:{discriminator:"action",validActions:new Set(["info","focus_path","focus_position","suggest","screenshot"]),allowedParams:{manage_camera_info:new Set(["placeId","clientId","targetAlias"]),manage_camera_focus_path:new Set(["path","distance","duration","offset","respectAutoFocusSetting","placeId","clientId","targetAlias"]),manage_camera_focus_position:new Set(["position","distance","duration","offset","lookAt","respectAutoFocusSetting","placeId","clientId","targetAlias"]),manage_camera_suggest:new Set(["path","placeId","clientId","targetAlias"]),manage_camera_screenshot:new Set(["placeId","clientId","targetAlias"])},paramAliases:{manage_camera_suggest:{path:"targetPath"}}},manage_tween:{discriminator:"action",validActions:new Set(["create","play","pause","cancel"]),allowedParams:{manage_tween_create:new Set(["path","tweenInfo","properties","placeId","clientId","targetAlias"]),manage_tween_play:new Set(["tweenId","placeId","clientId","targetAlias"]),manage_tween_pause:new Set(["tweenId","placeId","clientId","targetAlias"]),manage_tween_cancel:new Set(["tweenId","placeId","clientId","targetAlias"])}},manage_audio:{discriminator:"action",validActions:new Set(["play","stop","pause","resume","set_listener"]),allowedParams:{manage_audio_play:new Set(["path","soundId","volume","looped","playbackSpeed","placeId","clientId","targetAlias"]),manage_audio_stop:new Set(["path","placeId","clientId","targetAlias"]),manage_audio_pause:new Set(["path","placeId","clientId","targetAlias"]),manage_audio_resume:new Set(["path","placeId","clientId","targetAlias"]),manage_audio_set_listener:new Set(["listenerType","listenerPath","placeId","clientId","targetAlias"])}},manage_animation:{discriminator:"action",validActions:new Set(["load","play","stop","get_tracks"]),allowedParams:{manage_animation_load:new Set(["path","animationId","placeId","clientId","targetAlias"]),manage_animation_play:new Set(["path","trackId","speed","fadeTime","weight","priority","placeId","clientId","targetAlias"]),manage_animation_stop:new Set(["path","trackId","fadeTime","placeId","clientId","targetAlias"]),manage_animation_get_tracks:new Set(["path","placeId","clientId","targetAlias"])}},manage_physics:{discriminator:"action",validActions:new Set(["register_group","set_collidable","get_groups"]),allowedParams:{manage_physics_register_group:new Set(["groupName","placeId","clientId","targetAlias"]),manage_physics_set_collidable:new Set(["group1","group2","collidable","placeId","clientId","targetAlias"]),manage_physics_get_groups:new Set(["placeId","clientId","targetAlias"])}},manage_effects:{discriminator:"action",validActions:new Set(["emit","clear","toggle"]),allowedParams:{manage_effects_emit:new Set(["path","count","placeId","clientId","targetAlias"]),manage_effects_clear:new Set(["path","placeId","clientId","targetAlias"]),manage_effects_toggle:new Set(["path","enabled","placeId","clientId","targetAlias"])}},manage_terrain:{discriminator:"action",validActions:new Set(["fill_block","fill_ball","fill_cylinder","fill_wedge","clear_region","clear_bounds","replace_material","colors_get","colors_set","read_voxel","read_voxels","write_voxels","generate","smooth"]),allowedParams:{manage_terrain_fill_block:new Set(["cframe","size","placeId","clientId","targetAlias"]),manage_terrain_fill_ball:new Set(["center","radius","placeId","clientId","targetAlias"]),manage_terrain_fill_cylinder:new Set(["cframe","radius","height","placeId","clientId","targetAlias"]),manage_terrain_fill_wedge:new Set(["cframe","size","placeId","clientId","targetAlias"]),manage_terrain_clear_region:new Set(["region","placeId","clientId","targetAlias"]),manage_terrain_clear_bounds:new Set(["min","max","placeId","clientId","targetAlias"]),manage_terrain_replace_material:new Set(["material","region","sourceMaterial","targetMaterial","placeId","clientId","targetAlias"]),manage_terrain_colors_get:new Set(["material","placeId","clientId","targetAlias"]),manage_terrain_colors_set:new Set(["material","color","placeId","clientId","targetAlias"]),manage_terrain_read_voxel:new Set(["position","placeId","clientId","targetAlias"]),manage_terrain_read_voxels:new Set(["region","resolution","placeId","clientId","targetAlias"]),manage_terrain_write_voxels:new Set(["region","resolution","materials","occupancy","placeId","clientId","targetAlias"]),manage_terrain_generate:new Set(["region","preset","seed","baseHeight","amplitude","frequency","octaves","persistence","waterLevel","edgeBlend","materialPalette","layers","placeId","clientId","targetAlias"]),manage_terrain_smooth:new Set(["region","intensity","placeId","clientId","targetAlias"])}},spatial_query:{discriminator:"action",validActions:new Set(["raycast","find_ground","check_placement","multi_raycast","scan_area","find_flat","find_spawn","analyze_walkable","spatial_map","find_space","bounds","snap_grid","collision"]),allowedParams:{spatial_query_raycast:new Set(["origin","direction","filterType","filterList","filterInstances","ignoreWater","placeId","clientId","targetAlias"]),spatial_query_find_ground:new Set(["maxDistance","position","filterList","filterInstances","offset","placeId","clientId","targetAlias"]),spatial_query_check_placement:new Set(["position","size","filterList","filterInstances","rotation","checkGround","placeId","clientId","targetAlias"]),spatial_query_multi_raycast:new Set(["filterType","filterList","filterInstances","ignoreWater","rays","placeId","clientId","targetAlias"]),spatial_query_scan_area:new Set(["size","filterList","filterInstances","center","resolution","maxResults","placeId","clientId","targetAlias"]),spatial_query_find_flat:new Set(["searchArea","minSize","maxSlope","tolerance","maxResults","placeId","clientId","targetAlias"]),spatial_query_find_spawn:new Set(["searchArea","spawnSize","minSpacing","preferOutdoor","count","placeId","clientId","targetAlias"]),spatial_query_analyze_walkable:new Set(["area","maxSlope","resolution","characterHeight","maxStepHeight","placeId","clientId","targetAlias"]),spatial_query_spatial_map:new Set(["path","rootPath","includeModels","maxResults","placeId","clientId","targetAlias"]),spatial_query_find_space:new Set(["size","searchArea","gridSize","gridSnap","padding","placeId","clientId","targetAlias"]),spatial_query_bounds:new Set(["path","paths","placeId","clientId","targetAlias"]),spatial_query_snap_grid:new Set(["gridSize","path","gridSnap","axes","placeId","clientId","targetAlias"]),spatial_query_collision:new Set(["position","path","ignorePaths","placeId","clientId","targetAlias"])},paramAliases:{spatial_query_spatial_map:{path:"rootPath"}}},manage_assets:{discriminator:"action",validActions:new Set(["insert","info","search","search_insert","insert_free","insert_package","export_selection_json","export_selection_rbxm","export_path_rbxm","review_model","generate_model","upload_asset","import_rbxm","generate_thumbnail"]),allowedParams:{manage_assets_insert:new Set(["assetId","parent","name","position","placeId","clientId","targetAlias"]),manage_assets_info:new Set(["assetId","placeId","clientId","targetAlias"]),manage_assets_search:new Set(["query","maxResults","category","sortType","placeId","clientId","targetAlias"]),manage_assets_search_insert:new Set(["parent","name","query","placeId","clientId","targetAlias"]),manage_assets_insert_free:new Set(["assetId","parent","name","position","placeId","clientId","targetAlias"]),manage_assets_insert_package:new Set(["assetId","parent","name","placeId","clientId","targetAlias"]),manage_assets_export_selection_json:new Set(["format","includeProperties","includeChildren","maxDepth","placeId","clientId","targetAlias"]),manage_assets_export_selection_rbxm:new Set(["contextId","contextSummary","replayMetadata","scope","placeId","category","displayName","description","thumbnailMode","uploadMode","uploadTemporaryAssets","creatorType","creatorId","clientId","targetAlias"]),manage_assets_export_path_rbxm:new Set(["contextId","contextSummary","replayMetadata","scope","placeId","category","sourcePath","displayName","description","thumbnailMode","uploadMode","uploadTemporaryAssets","creatorType","creatorId","clientId","targetAlias"]),manage_assets_review_model:new Set(["contextId","contextSummary","replayMetadata","scope","placeId","category","sourcePath","displayName","description","thumbnailMode","uploadMode","uploadTemporaryAssets","creatorType","creatorId","exportToLibrary","expectedUse","expectedGroups","maxDescendants","maxDepth","readiness","clientId","targetAlias"]),manage_assets_generate_model:new Set(["contextId","contextSummary","replayMetadata","placeId","category","prompt","schemaMode","predefinedSchema","schemaGroups","size","maxTriangles","generateTextures","review","targetParent","name","displayName","expectedUse","expectedGroups","maxDescendants","maxDepth","readiness","anchorMode","clientId","targetAlias"]),manage_assets_upload_asset:new Set(["contextId","contextSummary","replayMetadata","placeId","category","assetType","sourcePath","displayName","description","creatorType","creatorId","clientId","targetAlias"]),manage_assets_import_rbxm:new Set(["contextId","contextSummary","replayMetadata","scope","placeId","category","assetLibraryAssetId","targetParent","name","clientId","targetAlias"]),manage_assets_generate_thumbnail:new Set(["contextId","contextSummary","replayMetadata","scope","placeId","category","assetLibraryAssetId","clientId","targetAlias"])},paramAliases:{manage_assets_search:{maxResults:"limit"}}},manage_open_cloud_assets:{discriminator:"action",validActions:new Set(["preflight","credential_status","capabilities","upload","link","update","info","operation_status"]),allowedParams:{manage_open_cloud_assets_preflight:new Set(["filePath","category","creatorType","creatorId"]),manage_open_cloud_assets_credential_status:new Set([]),manage_open_cloud_assets_capabilities:new Set([]),manage_open_cloud_assets_upload:new Set(["contextId","contextSummary","replayMetadata","filePath","category","scope","placeId","displayName","description","creatorType","creatorId","expectedPrice","waitForOperation","operationPollTimeoutMs","operationPollIntervalMs"]),manage_open_cloud_assets_link:new Set(["contextId","contextSummary","replayMetadata","assetId","filePath","category","scope","placeId","displayName","description"]),manage_open_cloud_assets_update:new Set(["contextId","contextSummary","replayMetadata","assetId","filePath","category","displayName","description","creatorType","creatorId","expectedPrice","updateMask","waitForOperation","operationPollTimeoutMs","operationPollIntervalMs"]),manage_open_cloud_assets_info:new Set(["assetId","readMask"]),manage_open_cloud_assets_operation_status:new Set(["operationId"])}},manage_sync:{discriminator:"action",validActions:new Set(["status_current_place","history","directions","read_file","write_file","progress"]),allowedParams:{manage_sync_status_current_place:new Set([]),manage_sync_history:new Set(["placeId","query"]),manage_sync_directions:new Set(["placeId"]),manage_sync_read_file:new Set(["placeId","instancePath"]),manage_sync_write_file:new Set(["placeId","instancePath","content"]),manage_sync_progress:new Set([])}},workspace_state:{discriminator:"action",validActions:new Set(["sync","snapshot","changes","viewport","clear_history","metadata","scripts","selection_info","clear_cache"]),allowedParams:{workspace_state_sync:new Set(["includeMetadata","placeId","clientId","targetAlias"]),workspace_state_snapshot:new Set(["placeId","clientId","targetAlias"]),workspace_state_changes:new Set(["limit","placeId","clientId","targetAlias"]),workspace_state_viewport:new Set(["includeCameraInfo","includeSelectionBounds","placeId","clientId","targetAlias"]),workspace_state_clear_history:new Set(["placeId","clientId","targetAlias"]),workspace_state_metadata:new Set(["placeId","clientId","targetAlias"]),workspace_state_scripts:new Set(["placeId","clientId","targetAlias"]),workspace_state_selection_info:new Set(["placeId","clientId","targetAlias"]),workspace_state_clear_cache:new Set(["placeId","clientId","targetAlias"])}},manage_logs:{discriminator:"action",validActions:new Set(["get","clear","errors"]),allowedParams:{manage_logs_get:new Set(["level","limit","pattern","since","sinceSeq","placeId","clientId","targetAlias"]),manage_logs_clear:new Set(["placeId","clientId","targetAlias"]),manage_logs_errors:new Set(["limit","placeId","clientId","targetAlias"])},paramAliases:{manage_logs_get:{level:"type"}}},system_info:{discriminator:"action",validActions:new Set(["ping","connection","usage","place_info","services","preflight"]),allowedParams:{system_info_ping:new Set(["message","placeId","clientId","targetAlias"]),system_info_connection:new Set([]),system_info_usage:new Set(["placeId","clientId","targetAlias"]),system_info_place_info:new Set(["placeId","clientId","targetAlias"]),system_info_services:new Set(["placeId","clientId","targetAlias"]),system_info_preflight:new Set(["placeId","clientId","targetAlias"])}},manage_studio:{discriminator:"action",validActions:new Set(["toggle_ui_preview","test_profile_get","test_profile_set","test_profile_reset","experience_language_get","experience_language_set","play_start","play_stop","play_pause","play_resume","play_status","run_test"]),allowedParams:{manage_studio_toggle_ui_preview:new Set(["enabled","placeId","clientId","targetAlias"]),manage_studio_test_profile_get:new Set(["placeId","clientId","targetAlias"]),manage_studio_test_profile_set:new Set(["testProfile","placeId","clientId","targetAlias"]),manage_studio_test_profile_reset:new Set(["placeId","clientId","targetAlias"]),manage_studio_experience_language_get:new Set(["placeId","clientId","targetAlias"]),manage_studio_experience_language_set:new Set(["locale","placeId","clientId","targetAlias"]),manage_studio_play_start:new Set(["mode","testProfile","restoreAfterTest","placeId","clientId","targetAlias"]),manage_studio_play_stop:new Set(["placeId","clientId","targetAlias"]),manage_studio_play_pause:new Set(["placeId","clientId","targetAlias"]),manage_studio_play_resume:new Set(["placeId","clientId","targetAlias"]),manage_studio_play_status:new Set(["placeId","clientId","targetAlias"]),manage_studio_run_test:new Set(["mode","script","test_name","timeout","testProfile","restoreAfterTest","placeId","clientId","targetAlias","contextId","contextSummary","replayMetadata"])}}};var Xbe={manage_scripts_validate:"internal",manage_selection_cached:"internal",manage_open_cloud_assets_preflight:"internal",manage_open_cloud_assets_credential_status:"internal",manage_open_cloud_assets_capabilities:"internal",manage_open_cloud_assets_upload:"internal",manage_open_cloud_assets_link:"internal",manage_open_cloud_assets_update:"internal",manage_open_cloud_assets_info:"internal",manage_open_cloud_assets_operation_status:"internal",manage_sync_status_current_place:"internal",manage_sync_history:"internal",manage_sync_directions:"internal",manage_sync_read_file:"internal",manage_sync_write_file:"internal",manage_sync_progress:"internal",system_info_connection:"internal",system_info_preflight:"internal",manage_studio_experience_language_set:"internal",manage_studio_run_test:"internal"};function gS(t){return Xbe[t]||"plugin"}var Q9=new Set(["batch_execute","execute_luau","extended_call_method","extended_call_methods","extended_get_properties","extended_get_property","extended_set_properties","extended_set_property","manage_animation_get_tracks","manage_animation_load","manage_animation_play","manage_animation_stop","manage_assets_export_path_rbxm","manage_assets_export_selection_json","manage_assets_export_selection_rbxm","manage_assets_generate_model","manage_assets_generate_thumbnail","manage_assets_import_rbxm","manage_assets_info","manage_assets_insert","manage_assets_insert_free","manage_assets_insert_package","manage_assets_review_model","manage_assets_search","manage_assets_search_insert","manage_assets_upload_asset","manage_audio_pause","manage_audio_play","manage_audio_resume","manage_audio_set_listener","manage_audio_stop","manage_camera_screenshot","manage_effects_clear","manage_effects_emit","manage_effects_toggle","manage_lighting_atmosphere","manage_lighting_lighting","manage_lighting_mood","manage_lighting_sky","manage_lighting_terrain_props","manage_lighting_time","manage_open_cloud_assets_capabilities","manage_open_cloud_assets_credential_status","manage_open_cloud_assets_info","manage_open_cloud_assets_link","manage_open_cloud_assets_operation_status","manage_open_cloud_assets_preflight","manage_open_cloud_assets_update","manage_open_cloud_assets_upload","manage_physics_get_groups","manage_physics_register_group","manage_physics_set_collidable","manage_properties_mass_get","manage_properties_mass_set","manage_properties_modify_children","manage_properties_set_calculated","manage_properties_set_relative","manage_scripts_replace","manage_selection_add","manage_selection_context","manage_selection_details","manage_selection_remove","manage_selection_watch","manage_studio_experience_language_get","manage_studio_experience_language_set","manage_studio_play_pause","manage_studio_play_resume","manage_studio_play_start","manage_studio_play_status","manage_studio_play_stop","manage_studio_run_test","manage_studio_test_profile_get","manage_studio_test_profile_reset","manage_studio_test_profile_set","manage_studio_toggle_ui_preview","manage_sync_directions","manage_sync_history","manage_sync_progress","manage_sync_read_file","manage_sync_status_current_place","manage_sync_write_file","manage_terrain_clear_bounds","manage_terrain_clear_region","manage_terrain_colors_get","manage_terrain_colors_set","manage_terrain_fill_ball","manage_terrain_fill_block","manage_terrain_fill_cylinder","manage_terrain_fill_wedge","manage_terrain_generate","manage_terrain_read_voxel","manage_terrain_read_voxels","manage_terrain_replace_material","manage_terrain_smooth","manage_terrain_write_voxels","manage_tween_cancel","manage_tween_create","manage_tween_pause","manage_tween_play","manage_ui_check","manage_ui_create_tree","manage_ui_delete","manage_ui_design_brief","manage_ui_preview","manage_ui_update","mutate_instances_create_tree","mutate_instances_mass_create","mutate_instances_mass_delete","mutate_instances_mass_duplicate","mutate_instances_scatter","mutate_instances_smart_duplicate","query_instances_ancestors","query_instances_descendants","query_instances_file_tree","query_instances_project_structure","query_instances_search_property","query_instances_search_tag","spatial_query_analyze_walkable","spatial_query_bounds","spatial_query_check_placement","spatial_query_collision","spatial_query_find_flat","spatial_query_find_ground","spatial_query_find_space","spatial_query_find_spawn","spatial_query_multi_raycast","spatial_query_raycast","spatial_query_scan_area","spatial_query_snap_grid","spatial_query_spatial_map","system_info_place_info","system_info_services","workspace_state_changes","workspace_state_clear_cache","workspace_state_clear_history","workspace_state_metadata","workspace_state_scripts","workspace_state_selection_info","workspace_state_snapshot","workspace_state_sync","workspace_state_viewport"]),cO=new Set(["system_info_connection","system_info_ping","system_info_preflight","system_info_usage"]);function ar(t){return Q9.has(t)?"pro":"basic"}Ir();hS();import{readFile as __e}from"node:fs/promises";import x_e from"node:path";import{createHash as f_e,randomUUID as fO}from"node:crypto";import{mkdir as Nm,readFile as sV,readdir as cV,rename as lV,rm as m_e,stat as g_e,writeFile as wS}from"node:fs/promises";import Mt from"node:path";import{extname as n_e}from"node:path";import{constants as r_e}from"node:fs";import{access as i_e,stat as a_e}from"node:fs/promises";var Am=20*1024*1024,_S=[{category:"image",assetType:"Image",folder:"images",extensions:[".png",".jpeg",".jpg",".bmp",".tga"],supportsContentUpdate:!1,contentTypes:{".png":"image/png",".jpeg":"image/jpeg",".jpg":"image/jpeg",".bmp":"image/bmp",".tga":"image/tga"}},{category:"decal",assetType:"Decal",folder:"decals",extensions:[".png",".jpeg",".jpg",".bmp",".tga"],supportsContentUpdate:!1,contentTypes:{".png":"image/png",".jpeg":"image/jpeg",".jpg":"image/jpeg",".bmp":"image/bmp",".tga":"image/tga"}},{category:"audio",assetType:"Audio",folder:"audio",extensions:[".mp3",".ogg",".wav",".flac"],supportsContentUpdate:!1,contentTypes:{".mp3":"audio/mpeg",".ogg":"audio/ogg",".wav":"audio/wav",".flac":"audio/flac"}},{category:"mesh",assetType:"Mesh",folder:"meshes",extensions:[".mesh"],supportsContentUpdate:!1,contentTypes:{".mesh":"application/octet-stream"}},{category:"model",assetType:"Model",folder:"models",extensions:[".fbx",".gltf",".glb",".rbxm",".rbxmx"],supportsContentUpdate:!0,contentTypes:{".fbx":"model/fbx",".gltf":"model/gltf+json",".glb":"model/gltf-binary",".rbxm":"model/x-rbxm",".rbxmx":"model/x-rbxm"}},{category:"video",assetType:"Video",folder:"videos",extensions:[".mp4",".mov"],supportsContentUpdate:!1,contentTypes:{".mp4":"video/mp4",".mov":"video/quicktime"}},{category:"animation",assetType:"Animation",folder:"animations",extensions:[".rbxm",".rbxmx"],supportsContentUpdate:!0,contentTypes:{".rbxm":"model/x-rbxm",".rbxmx":"model/x-rbxm"}}],o_e=new Map(_S.map(t=>[t.category,t]));function vS(t){if(!t)throw new Error("Open Cloud asset upload is disabled in WEPPY Dashboard settings.")}function yS(t,e){return t.split(e.apiKey).join("[redacted]")}function bS(t){let e=o_e.get(t);if(!e)throw new Error(`Unsupported asset category: ${t}`);return e}function Nu(t){return bS(t)}async function uO(t,e,n=Am){let r=bS(t),i=n_e(e).toLowerCase(),a=r.contentTypes[i]??null,o=await a_e(e),s=!0;try{await i_e(e,r_e.R_OK)}catch{s=!1}return{category:t,extension:i,contentType:a,formatValid:a!==null,sizeBytes:o.size,sizeValid:o.size<=n,maxFileSizeBytes:n,regularFile:o.isFile(),readable:s}}function nV(t,e){let n=t.creatorType??e.creatorType,r=t.creatorId??e.creatorId;if(!n||!r)throw new Error("creatorType and creatorId are required for Roblox Open Cloud asset upload/update.");return{...t,creatorType:n,creatorId:r}}async function rV(t,e,n){let r=await uO(t.category,e,n);if(!r.formatValid||!r.contentType)throw new Error(`Unsupported file extension ${r.extension||"(none)"} for ${t.category}.`);if(!r.regularFile)throw new Error("Asset path must reference a regular file.");if(!r.readable)throw new Error("Asset file is not readable.");if(!r.sizeValid)throw new Error(`Asset file is too large. Maximum size is ${n} bytes.`);return r.contentType}function iV(t){return typeof t.path=="string"&&t.path.startsWith("operations/")?t.path:null}function aV(t,e,n,r){let i={apiKey:t.apiKey,operationId:e};return n!==void 0&&(i.intervalMs=n),r!==void 0&&(i.timeoutMs=r),i}var $u=class{client;credentialStore;isOpenCloudUploadEnabled;maxFileSizeBytes;constructor(e){this.client=e.client,this.credentialStore=e.credentialStore,this.isOpenCloudUploadEnabled=e.isOpenCloudUploadEnabled,this.maxFileSizeBytes=e.maxFileSizeBytes??Am}getCapabilities(){return _S.map(({contentTypes:e,...n})=>n)}async uploadAsset(e){vS(this.isOpenCloudUploadEnabled());let n=await this.getRequiredCredential(),r=nV(e,n),i=bS(r.category),a=await rV(i,r.filePath,this.maxFileSizeBytes);try{let o={apiKey:n.apiKey,assetType:i.assetType,displayName:r.displayName,description:r.description??"",creatorType:r.creatorType,creatorId:r.creatorId,filePath:r.filePath,contentType:a};r.expectedPrice!==void 0&&(o.expectedPrice=r.expectedPrice);let s=await this.client.createAsset(o);if(r.waitForOperation){let c=iV(s);return c?await this.client.pollOperation(aV(n,c,r.operationPollIntervalMs,r.operationPollTimeoutMs)):s}return s}catch(o){throw new Error(yS(o instanceof Error?o.message:String(o),n))}}async updateAsset(e){vS(this.isOpenCloudUploadEnabled());let n=await this.getRequiredCredential(),r=nV(e,n),i=bS(r.category),a;if(r.filePath){if(!i.supportsContentUpdate)throw new Error(`${i.category} assets do not support content updates.`);a=await rV(i,r.filePath,this.maxFileSizeBytes)}try{let o={apiKey:n.apiKey,assetId:r.assetId,assetType:i.assetType,creatorType:r.creatorType,creatorId:r.creatorId};r.filePath&&(o.filePath=r.filePath),a!==void 0&&(o.contentType=a),r.displayName!==void 0&&(o.displayName=r.displayName),r.description!==void 0&&(o.description=r.description),r.updateMask!==void 0&&(o.updateMask=r.updateMask),r.expectedPrice!==void 0&&(o.expectedPrice=r.expectedPrice);let s=await this.client.updateAsset(o);if(r.waitForOperation){let c=iV(s);return c?await this.client.pollOperation(aV(n,c,r.operationPollIntervalMs,r.operationPollTimeoutMs)):s}return s}catch(o){throw new Error(yS(o instanceof Error?o.message:String(o),n))}}async getAsset(e){let n=await this.getRequiredCredential();try{let r={apiKey:n.apiKey,assetId:e.assetId};return e.readMask!==void 0&&(r.readMask=e.readMask),await this.client.getAsset(r)}catch(r){throw new Error(yS(r instanceof Error?r.message:String(r),n))}}async getOperation(e){let n=await this.getRequiredCredential();try{return await this.client.getOperation({apiKey:n.apiKey,operationId:e.operationId})}catch(r){throw new Error(yS(r instanceof Error?r.message:String(r),n))}}async getRequiredCredential(){let e=await this.credentialStore.getCredentialForUse();if(!e)throw new Error("Configure a Roblox Open Cloud API key in WEPPY Dashboard before using Open Cloud asset upload.");return e}};import oV from"node:fs";import un from"node:path";ox();var s_e=/^asset_(image|decal|audio|mesh|model|video|animation)_\d+_[a-z0-9]+$/;function c_e(t){if(!Number.isInteger(t)||t<0)throw new Error(`Invalid place ID: ${t}`)}function l_e(t,e){try{return oV.statSync(un.join(t,e,".sync-meta.json")).isFile()}catch{return!1}}function u_e(t,e){c_e(e.placeId);let n=`place_${e.placeId}`,r=e.placeName?du(e.placeName):"",i=r?`${n}_${r}`:n,a=[];try{let o=new RegExp(`^place_${e.placeId}(?:_.*)?$`);a=oV.readdirSync(t,{withFileTypes:!0}).filter(s=>s.isDirectory()&&o.test(s.name)).map(s=>s.name).sort()}catch{return i}return r&&a.includes(i)?i:a.find(o=>l_e(t,o))??(a.includes(i)?i:null)??a[0]??i}function dO(t){let e=un.resolve(t.projectSyncRoot),n=Nu(t.category).folder,r=t.scope.kind==="place"?un.join(e,u_e(e,t.scope),"assets",n):un.join(e,"shared-assets",n);return{root:r,inbox:un.join(r,"inbox"),index:un.join(r,".asset-library-index.json")}}function d_e(t){let e=s_e.exec(t);return e?.[1]?e[1]:null}function Om(t,e){let n=d_e(t);return n?e?n===e:!0:!1}function xS(t,e){if(!Om(t,e))throw new Error(`Invalid asset ID: ${t}`)}function $i(t,e){let n=un.relative(un.resolve(t),un.resolve(e));return n===""||!n.startsWith("..")&&!un.isAbsolute(n)}function p_e(t){xS(t.assetId,t.category);let e=dO(t),n=un.resolve(e.root,t.assetId);if(!$i(e.root,n))throw new Error(`Invalid asset path for ${t.assetId}`);return n}function SS(t){let e=p_e(t),n=un.resolve(e,t.relativeFileName);if(!$i(e,n))throw new Error(`Invalid asset file path for ${t.assetId}`);return n}function Dm(t,e){return un.relative(un.resolve(t),un.resolve(e)).split(un.sep).join("/")}var uV=20*1024*1024,h_e=200,pO=8,y_e=512,v_e=120;function dV(t,e){return t.kind!==e.kind?!1:t.kind==="shared"&&e.kind==="shared"?!0:t.kind==="place"&&e.kind==="place"&&t.placeId===e.placeId}function pV(t,e){let n=Mt.extname(t).toLowerCase(),r=Nu(e);if(!r.extensions.includes(n))return null;let i=r.contentTypes[n];return i?{canonicalExt:n,mimeType:i}:null}function mO(t,e,n){if(e!=="image"&&e!=="decal")return!0;let r=Mt.extname(t).toLowerCase();return r===".png"?n.length>=8&&n[0]===137&&n[1]===80&&n[2]===78&&n[3]===71&&n[4]===13&&n[5]===10&&n[6]===26&&n[7]===10:r===".jpg"||r===".jpeg"?n.length>=3&&n[0]===255&&n[1]===216&&n[2]===255:r===".bmp"?n.length>=2&&n[0]===66&&n[1]===77:r===".tga"?n.length>0:!1}function fV(t){return f_e("sha256").update(t).digest("hex")}function gO(t){if(t===void 0||t==="")return"";if(t.length>y_e||t.includes("\0")||t.includes("\\")||Mt.isAbsolute(t))throw new Error(`Invalid Asset Library folder path: ${t}`);let e=t.split("/");if(e.length>pO||e.some(n=>n.length===0||n.length>v_e||n==="."||n===".."))throw new Error(`Invalid Asset Library folder path: ${t}`);return e.join("/")}function IS(t){return t.now?.()??Date.now()}function b_e(t){return(t.randomId?.()??fO().replace(/-/g,"").slice(0,6)).toLowerCase().replace(/[^a-z0-9]/g,"").slice(0,12)||"asset"}function mV(t,e){let n=Math.floor(IS(t)/1e3);for(let r=0;r<20;r++){let i=b_e(t),a=r===0?`asset_${t.category}_${n}_${i}`:`asset_${t.category}_${n}_${i}${r}`;if(!e.has(a))return a}return`asset_${t.category}_${n}_${fO().replace(/-/g,"").slice(0,10)}`}function gV(t){let e=Mt.parse(t).name.trim();return e.length>0?e:t}function hV(t){if(t.mimeType!=="image/png")throw new Error("Asset Library preview must be an image/png thumbnail");if(Mt.basename(t.fileName).toLowerCase()!=="thumbnail.png")throw new Error("Asset Library preview file must be thumbnail.png");if(!mO("thumbnail.png","image",t.content))throw new Error("Asset Library preview is not a valid PNG file");return{fileName:"thumbnail.png",content:t.content}}async function hO(t,e){let n=`${t}.tmp.${fO().slice(0,8)}`;await wS(n,JSON.stringify(e,null,2),"utf8"),await lV(n,t)}async function yV(t,e){try{let n=await sV(Mt.join(e,"asset.json"),"utf8"),r=JSON.parse(n);return!Om(r.id,t.category)||r.category!==t.category||!dV(r.scope,t.scope)?null:(gO(r.folderPath),r)}catch{return null}}async function $m(t,e){let n;try{n=await cV(e.root,{withFileTypes:!0})}catch(i){if(i?.code==="ENOENT")return[];throw i}let r=[];for(let i of n.sort((a,o)=>a.name.localeCompare(o.name))){if(!i.isDirectory()||!Om(i.name,t.category))continue;let a=Mt.join(e.root,i.name),o=await yV(t,a);o&&r.push(o)}return r.sort((i,a)=>a.createdAt.localeCompare(i.createdAt)||a.id.localeCompare(i.id))}async function ju(t,e,n){if(xS(n.id,t.category),n.category!==t.category||!dV(n.scope,t.scope))throw new Error(`Asset metadata does not match library scope/category: ${n.id}`);gO(n.folderPath);let r=Mt.join(e.root,n.id);if(!$i(e.root,r))throw new Error(`Invalid asset path for ${n.id}`);await Nm(r,{recursive:!0}),await hO(Mt.join(r,"asset.json"),n)}async function vV(t,e){await Nm(t.root,{recursive:!0});let n={version:1,generatedAt:new Date().toISOString(),assets:e.map(r=>r.id)};await hO(t.index,n)}function ri(t,e,n){return{fileName:t,reason:e,message:n}}async function bV(t,e=t,n=[]){let r;try{r=await cV(e,{withFileTypes:!0})}catch(a){if(a?.code==="ENOENT")return[];throw a}let i=[];for(let a of r.sort((o,s)=>o.name.localeCompare(s.name))){let o=[...n,a.name],s=Mt.join(e,a.name);if(a.isDirectory()&&!a.isSymbolicLink()&&!a.name.startsWith(".")){let c=o.join("/");if(o.length>pO){i.push({entry:a,sourcePath:s,relativePath:c,folderPath:n.join("/"),skipReason:"maxDepth",skipMessage:`folder depth exceeds ${pO}`});continue}try{gO(c)}catch{i.push({entry:a,sourcePath:s,relativePath:c,folderPath:n.join("/"),skipReason:"unsupportedType",skipMessage:"invalid Asset Library folder path"});continue}i.push(...await bV(t,s,o));continue}i.push({entry:a,sourcePath:s,relativePath:o.join("/"),folderPath:n.join("/")})}return i}async function Ni(t){let e=dO(t);return await Nm(e.inbox,{recursive:!0}),e}async function CS(t){let e=await Ni(t),n=await $m(t,e);return await vV(e,n),n}async function Xt(t,e){xS(e,t.category);let n=await Ni(t),r=Mt.join(n.root,e);if(!$i(n.root,r))throw new Error(`Invalid asset path for ${e}`);let i=await yV(t,r);if(!i)throw new Error(`Asset not found: ${e}`);return i}async function Mu(t){let e=await Ni(t),n=await $m(t,e),r={version:1,generatedAt:new Date().toISOString(),assets:n.map(i=>i.id)};return await hO(e.index,r),r}async function _V(t){let e=await Ni(t),n=await $m(t,e),r=new Set(n.map(p=>p.id)),i=new Set(n.map(p=>p.file.sha256)),a=[],o=[],s=t.maxFileSizeBytes??uV,c=t.maxFilesPerRescan??h_e,l=await bV(e.inbox),u=0;for(let p of l){let{entry:f,sourcePath:m}=p;if(p.skipReason){o.push(ri(p.relativePath,p.skipReason,p.skipMessage??"inbox entry skipped"));continue}if(f.name.startsWith(".")&&!f.isFile()){o.push(ri(p.relativePath,"hidden","hidden or system file"));continue}if(f.isSymbolicLink()){o.push(ri(p.relativePath,"symlink","symlink files are not followed"));continue}if(f.isDirectory()){o.push(ri(p.relativePath,"nestedDirectory","nested directories are not scanned"));continue}if(!f.isFile()){o.push(ri(p.relativePath,"unsupportedType","unsupported inbox entry type"));continue}if(u+=1,u>c){o.push(ri(p.relativePath,"maxFileCount","rescan file count limit exceeded"));continue}if(f.name.startsWith(".")){o.push(ri(p.relativePath,"hidden","hidden or system file"));continue}let g=pV(f.name,t.category);if(!g){o.push(ri(f.name,"unsupportedType",`unsupported ${t.category} extension`));continue}let y=await g_e(m);if(y.size>s){o.push(ri(f.name,"oversized","asset file is larger than the configured limit"));continue}let v=await sV(m);if(!mO(f.name,t.category,v)){o.push(ri(f.name,"invalidSignature","file signature does not match the extension"));continue}let b=fV(v);if(i.has(b)){o.push(ri(f.name,"duplicate","asset content already exists in Asset Library"));continue}let x=mV(t,r);r.add(x),i.add(b);let I=Mt.join(e.root,x),w=`original${g.canonicalExt}`;await Nm(I,{recursive:!0}),await lV(m,Mt.join(I,w));let N=new Date(IS(t)).toISOString(),k={version:1,id:x,category:t.category,scope:t.scope,...p.folderPath?{folderPath:p.folderPath}:{},status:"localOnly",displayName:gV(f.name),description:"",source:{kind:"generated",originalPath:Dm(t.projectSyncRoot,m)},file:{original:w,preview:null,mimeType:g.mimeType,sha256:b,sizeBytes:y.size,width:null,height:null,durationMs:null},roblox:{uploaded:!1},usage:{lastScannedAt:null,scanSource:null,references:[]},createdAt:N,updatedAt:N};await ju(t,e,k),a.push(k)}let d=await $m(t,e);return await vV(e,d),{assets:d,adopted:a,skipped:o,adoptedCount:a.length,skippedCount:o.length}}async function jm(t){let e=await Ni(t),n=pV(t.originalFileName,t.category);if(!n)throw new Error(`Unsupported ${t.category} extension for Asset Library export`);let r=t.maxFileSizeBytes??uV;if(t.content.length>r)throw new Error("asset file is larger than the configured limit");if(!mO(t.originalFileName,t.category,t.content))throw new Error("file signature does not match the extension");let i=await $m(t,e),a=fV(t.content),o=i.find(y=>y.file.sha256===a);if(o)return{asset:o,deduplicated:!0};let s=new Set(i.map(y=>y.id)),c=mV(t,s),l=Mt.join(e.root,c);if(!$i(e.root,l))throw new Error(`Invalid asset path for ${c}`);let u=`original${n.canonicalExt}`;await Nm(l,{recursive:!0}),await wS(Mt.join(l,u),t.content);let d=null;if(t.preview){let y=hV(t.preview);d=y.fileName,await wS(Mt.join(l,y.fileName),y.content)}let p=new Date(IS(t)).toISOString(),f=t.roblox??{uploaded:!1},m=f.uploaded&&f.assetId?"uploaded":"localOnly",g={version:1,id:c,category:t.category,scope:t.scope,status:m,displayName:t.displayName?.trim()||gV(t.originalFileName),description:t.description??"",source:{...t.source,originalPath:Dm(t.projectSyncRoot,Mt.join(l,u))},file:{original:u,preview:d,mimeType:n.mimeType,sha256:a,sizeBytes:t.content.length,width:null,height:null,durationMs:null},roblox:f,usage:{lastScannedAt:null,scanSource:null,references:[]},...t.rbxm?{rbxm:t.rbxm}:{},createdAt:p,updatedAt:p};return await ju(t,e,g),await Mu(t),{asset:g,deduplicated:!1}}async function xV(t){let e=await Ni(t),n=await Xt(t,t.assetId),r=hV(t.preview),i=SS({...t,relativeFileName:r.fileName});await wS(i,r.content);let a={...n,file:{...n.file,preview:r.fileName},...n.rbxm&&t.rbxmThumbnail?{rbxm:{...n.rbxm,thumbnail:t.rbxmThumbnail}}:{},updatedAt:new Date(IS(t)).toISOString()};return await ju(t,e,a),await Mu(t),{asset:a}}async function SV(t,e,n){let r=await Ni(t),i=await Xt(t,e),a={...i,displayName:typeof n.displayName=="string"?n.displayName:i.displayName,description:typeof n.description=="string"?n.description:i.description,source:{...i.source,...n.source?.agent!==void 0?{agent:n.source.agent}:{},...n.source?.contextId!==void 0?{contextId:n.source.contextId}:{},...n.source?.prompt!==void 0?{prompt:n.source.prompt}:{}},updatedAt:new Date().toISOString()};return await ju(t,r,a),await Mu(t),a}async function wV(t,e,n){let r=await Ni(t),a={...await Xt(t,e),usage:n,updatedAt:new Date().toISOString()};return await ju(t,r,a),await Mu(t),a}async function IV(t,e){let n=await Ni(t);await Xt(t,e);let r=Mt.join(n.root,e);if(!$i(n.root,r))throw new Error(`Invalid asset path for ${e}`);return await m_e(r,{recursive:!0}),await Mu(t),{assetId:e,removed:1}}async function ji(t){let e=await Ni(t);return await ju(t,e,t.asset),await Mu(t),t.asset}async function Lu(t){let e=await Xt(t,t.assetId);return SS({...t,relativeFileName:e.file.original})}async function CV(t){let e=await Xt(t,t.assetId);return SS({...t,relativeFileName:e.file.preview??e.file.original})}var S_e="https://create.roblox.com/dashboard/creations/store",w_e="manage_assets_import_rbxm",vO="manage_assets_generate_thumbnail",I_e="manage_assets_review_model";var bO=new Set([w_e,vO]),_O=new Set(["manage_assets_export_selection_rbxm","manage_assets_export_path_rbxm",I_e]),C_e=new Set(["model","animation"]);function st(t){return t&&typeof t=="object"?t:null}function P_e(t){if(typeof t!="string"||!C_e.has(t))throw new Error(`Unsupported Asset Library .rbxm round-trip category: ${String(t??"(missing)")}`);return t}function k_e(t){if(typeof t=="number"&&Number.isInteger(t)&&t>=0)return t;if(typeof t=="string"&&t.trim().length>0){let e=Number.parseInt(t,10);if(Number.isInteger(e)&&e>=0)return e}return null}function PV(t,e){for(let n of t.pluginClients.values())if(!(typeof n.placeId!="number"||!Number.isFinite(n.placeId))&&!(e!==void 0&&n.placeId!==e))return{placeId:n.placeId,...n.placeName?{placeName:n.placeName}:{}};return null}function xO(t,e){let n=ft(t.config.dataDir),r=P_e(e.category),i=typeof e.scope=="string"?e.scope:"place",a=typeof e.assetLibraryAssetId=="string"&&e.assetLibraryAssetId.length>0?e.assetLibraryAssetId:void 0;if(i==="shared")return{projectSyncRoot:n,scope:{kind:"shared"},category:r,...a?{assetId:a}:{}};if(i!=="place")throw new Error(`Invalid Asset Library scope: ${i}`);let o=k_e(e.placeId),s=t.syncController?.getDefaultRuntimePlaceId()??null,c=o??s??PV(t)?.placeId??null;if(c===null)throw new Error("No placeId is available for Asset Library .rbxm round-trip.");let l=PV(t,c);return{projectSyncRoot:n,scope:{kind:"place",placeId:c,...l?.placeName?{placeName:l.placeName}:{}},category:r,...a?{assetId:a}:{}}}function R_e(t){if(x_e.extname(t.file.original).toLowerCase()!==".rbxm")throw new Error(`Asset Library Studio round-trip supports original.rbxm only. Unsupported original file: ${t.file.original}`)}function E_e(t,e){if(typeof t!="string"||t.trim().length===0)throw new Error(`${e} is missing`);return Buffer.from(t,"base64")}function T_e(t,e){let n=st(e),i={kind:n?.kind==="generation"||typeof t.prompt=="string"?"generated":"studioExport",originalPath:"studio:selection"};if(n){let a=typeof n.path=="string"?n.path:typeof n.kind=="string"?n.kind:void 0;a&&(i.originalPath=`studio:${a}`);let o=ye(n.prompt,1e3);o&&(i.prompt=o)}if(!i.prompt){let a=ye(t.prompt,1e3);a&&(i.prompt=a)}return typeof t.contextId=="string"&&(i.contextId=t.contextId),i}function TV(t){let e=st(t);if(!e)return;let n={};typeof e.width=="number"&&(n.width=e.width),typeof e.height=="number"&&(n.height=e.height),typeof e.source=="string"&&(n.source=e.source),typeof e.error=="string"&&(n.error=e.error);let r=Mm(e.attempts);return r.length>0&&(n.attempts=r),Object.keys(n).length>0?n:void 0}function ye(t,e){return typeof t!="string"?null:t.slice(0,e)}function A_e(t){if(typeof t!="string")return null;let e=t.trim();return/^\d+$/.test(e)?e:null}function kV(t){return`rbxassetid://${t}`}function RV(t){return`${S_e}/${t}/configure`}function EV(t){return`assets/${t}`}function Pr(t){return typeof t=="number"&&Number.isFinite(t)?t:void 0}function AV(t){return Array.isArray(t)?t.slice(0,100).flatMap(e=>{let n=st(e);if(!n)return[];let r=ye(n.name,256),i=ye(n.className,128),a=ye(n.path,512);return r===null||i===null||a===null?[]:[{name:r,className:i,path:a}]}):[]}function O_e(t){let e=st(t);if(!e)return{};let n={};for(let[r,i]of Object.entries(e).slice(0,100))typeof i!="number"||!Number.isFinite(i)||i<0||(n[r.slice(0,128)]=Math.floor(i));return n}function D_e(t){return Array.isArray(t)?t.slice(0,200).flatMap(e=>{let n=st(e);if(!n)return[];let r=ye(n.path,512),i=ye(n.property,128),a=ye(n.value,1024);if(r===null||i===null||a===null)return[];let o=ye(n.assetId,64);return[{path:r,property:i,value:a,...o?{assetId:o}:{}}]}):[]}function Mm(t){return Array.isArray(t)?t.slice(0,8).flatMap(e=>{let n=st(e);if(!n)return[];let r=ye(n.method,80),i=n.status==="success"||n.status==="failed"||n.status==="skipped"?n.status:null;if(r===null||i===null)return[];let a=ye(n.message,512);return[{method:r,status:i,...a?{message:a}:{}}]}):[]}function $_e(t,e){let n=t.thumbnailMode==="auto"?"auto":"none";if(n==="none")return{mode:n,status:"skipped",message:"Thumbnail generation disabled"};let r=TV(e),i=st(e),a=typeof i?.pngBase64=="string"&&i.pngBase64.length>0,o=typeof i?.base64Rgba=="string"&&i.base64Rgba.length>0&&i.format==="rgba8"&&typeof i.width=="number"&&typeof i.height=="number";if(r&&(a||o)){let s=Pr(r.width),c=Pr(r.height),l=Mm(i?.attempts);return{mode:n,status:"generated",...s!==void 0?{width:s}:{},...c!==void 0?{height:c}:{},...typeof r.source=="string"?{source:r.source.slice(0,128)}:{},...l.length>0?{attempts:l}:{}}}if(r&&typeof r.error=="string"){let s=Mm(st(e)?.attempts);return{mode:n,status:"failed",message:r.error.slice(0,512),...s.length>0?{attempts:s}:{}}}return{mode:n,status:"skipped",message:"Thumbnail was not returned"}}function N_e(t,e){let n=st(t);if(!n)return e;let r=n.mode==="auto"||n.mode==="none"?n.mode:e.mode,i=n.status==="generated"||n.status==="skipped"||n.status==="failed"?n.status:e.status,a=ye(n.message,512),o=Pr(n.width),s=Pr(n.height),c=ye(n.source,128),l=Mm(n.attempts);return{mode:r,status:i,...a?{message:a}:{},...o!==void 0?{width:o}:{},...s!==void 0?{height:s}:{},...c?{source:c}:{},...l.length>0?{attempts:l}:{}}}function yO(t,e=0){if(e>3)return;if(typeof t=="string")return t.slice(0,512);if(typeof t=="boolean")return t;if(typeof t=="number")return Number.isFinite(t)?t:void 0;if(Array.isArray(t))return t.slice(0,50).flatMap(i=>{let a=yO(i,e+1);return a===void 0?[]:[a]});let n=st(t);if(!n)return;let r={};for(let[i,a]of Object.entries(n).slice(0,50)){let o=yO(a,e+1);o!==void 0&&(r[i.slice(0,128)]=o)}return r}function j_e(t){let e=st(t),n=Pr(e?.x),r=Pr(e?.y),i=Pr(e?.z);if(!(n===void 0||r===void 0||i===void 0))return{x:n,y:r,z:i}}function M_e(t){return Array.isArray(t)?t.slice(0,100).flatMap(e=>{let n=st(e);if(!n)return[];let r=n.severity==="info"||n.severity==="warning"||n.severity==="error"?n.severity:null,i=ye(n.category,80),a=ye(n.code,120),o=ye(n.path,512),s=ye(n.message,512);if(!r||i===null||a===null||o===null||s===null)return[];let c=ye(n.suggestion,512);return[{severity:r,category:i,code:a,path:o,message:s,...c?{suggestion:c}:{}}]}):[]}function L_e(t){let e=st(t);if(!e)return;let n=e.readiness==="ready"||e.readiness==="review"||e.readiness==="blocked"?e.readiness:null;if(!n)return;let r=yO(e.summary),i=ye(e.reviewedAt,64),a=AV(e.roots);return{readiness:n,...i?{reviewedAt:i}:{},...a.length>0?{roots:a}:{},summary:st(r)??{},findings:M_e(e.findings)}}function z_e(t){let e=st(t);if(!e)return;let n={};for(let[r,i]of Object.entries(e).slice(0,16))typeof i=="string"&&(n[r.slice(0,128)]=i.slice(0,256)),typeof i=="number"&&Number.isFinite(i)&&(n[r.slice(0,128)]=i),typeof i=="boolean"&&(n[r.slice(0,128)]=i);return Object.keys(n).length>0?n:void 0}function U_e(t){let e=st(t);if(!e)return;let n=ye(e.provider,120);if(!n)return;let r=ye(e.generatedAt,64),i=ye(e.prompt,1e3),a=e.schemaMode==="predefined"||e.schemaMode==="custom"?e.schemaMode:void 0,o=e.predefinedSchema==="Body1"||e.predefinedSchema==="Car5"?e.predefinedSchema:void 0,s=Array.isArray(e.schemaGroups)?e.schemaGroups.slice(0,50).flatMap(f=>{let m=ye(f,120);return m?[m]:[]}):void 0,c=j_e(e.requestedSize),l=Pr(e.maxTriangles),u=ye(e.targetParent,512),d=ye(e.path,512),p=z_e(e.metadata);return{provider:n,...r?{generatedAt:r}:{},...i?{prompt:i}:{},...a?{schemaMode:a}:{},...o?{predefinedSchema:o}:{},...s&&s.length>0?{schemaGroups:s}:{},...c?{requestedSize:c}:{},...l!==void 0?{maxTriangles:Math.floor(l)}:{},...typeof e.generateTextures=="boolean"?{generateTextures:e.generateTextures}:{},...u?{targetParent:u}:{},...d?{path:d}:{},...p?{metadata:p}:{}}}function F_e(t){return Array.isArray(t)?t.slice(0,100).flatMap(e=>{let n=st(e);if(!n)return[];let r=ye(n.path,512),i=n.assetType==="Mesh"||n.assetType==="Image"||n.assetType==="Model"?n.assetType:null,a=n.status==="uploaded"||n.status==="failed"?n.status:null;if(r===null||i===null||a===null)return[];let o=ye(n.assetId,64),s=ye(n.assetUri,128),c=n.creatorType==="user"||n.creatorType==="group"?n.creatorType:void 0,l=ye(n.creatorId,64),u=ye(n.sourceProperty,128),d=ye(n.uploadedAt,64),p=ye(n.message,512);return[{path:r,assetType:i,status:a,...o?{assetId:o}:{},...s?{assetUri:s}:{},...c?{creatorType:c}:{},...l?{creatorId:l}:{},...u?{sourceProperty:u}:{},...d?{uploadedAt:d}:{},...p?{message:p}:{}}]}):[]}function q_e(t){let e=st(t);if(!e||e.uploaded!==!0)return;let n=A_e(e.assetId);if(!n)return;let r=ye(e.uploadedAt,64)??new Date().toISOString(),i=e.creatorType==="user"||e.creatorType==="group"?e.creatorType:void 0,a=ye(e.creatorId,64);return{uploaded:!0,assetId:n,assetUri:kV(n),assetWebUrl:RV(n),remotePath:EV(n),uploadedAt:r,uploadAttempts:[{startedAt:r,finishedAt:r,status:"uploaded",assetRole:"primary",...i?{creatorType:i}:{},...a?{creatorId:a}:{},assetId:n,assetUri:kV(n),assetWebUrl:RV(n),remotePath:EV(n)}]}}function B_e(t){let e=st(t.value),n=AV(e?.roots),r=O_e(e?.classCounts),i=D_e(e?.resourceReferences),a=L_e(e?.review),o=U_e(e?.generation),s=F_e(e?.studioUploads),c=Pr(e?.exportedCount)??Pr(t.exportedCount)??n.length;return{exportedCount:Math.max(0,Math.floor(c)),roots:n,classCounts:r,resourceReferences:i,thumbnail:N_e(e?.thumbnail,t.fallbackThumbnail),...a?{review:a}:{},...o?{generation:o}:{},...s.length>0?{studioUploads:s}:{}}}function V_e(t){return t.length>=8&&t[0]===137&&t[1]===80&&t[2]===78&&t[3]===71&&t[4]===13&&t[5]===10&&t[6]===26&&t[7]===10}function OV(t){let e=st(t);if(!e)return;let n=null;if(typeof e.pngBase64=="string"&&e.pngBase64.length>0?n=Buffer.from(e.pngBase64,"base64"):typeof e.base64Rgba=="string"&&e.base64Rgba.length>0&&e.format==="rgba8"&&typeof e.width=="number"&&typeof e.height=="number"&&(n=Buffer.from(tV(e.base64Rgba,e.width,e.height),"base64")),!!n){if(!V_e(n))throw new Error("Thumbnail payload is not a valid PNG image.");return{fileName:"thumbnail.png",content:n,mimeType:"image/png"}}}function W_e(t,e){let n=e instanceof Error?e.message:String(e);return t.thumbnail.status!=="generated"?t:{...t,thumbnail:{...t.thumbnail,status:"failed",message:`Thumbnail payload could not be stored: ${n}`.slice(0,512)}}}async function DV(t){if(!bO.has(t.command))return t.params;let e=xO(t.ctx,t.params);if(!e.assetId)throw new Error("assetLibraryAssetId is required for Asset Library .rbxm round-trip.");let n=await Xt(e,e.assetId);R_e(n);let r=await Lu({...e,assetId:n.id}),i=await __e(r);return{...t.params,__assetLibraryRbxmBase64:i.toString("base64"),__assetLibraryOriginalFile:n.file.original}}async function $V(t){if(!_O.has(t.command)||!t.result.success)return t.result;let e=st(t.result.data);if(!e||typeof e.rbxmBase64!="string"||e.rbxmBase64.trim().length===0)return t.result;let n=xO(t.ctx,t.params),r=E_e(e.rbxmBase64,"Asset Library .rbxm export payload"),i=typeof t.params.displayName=="string"?t.params.displayName:void 0,a=typeof t.params.description=="string"?t.params.description:void 0,o=`${i?.trim()||"studio-export"}.rbxm`,s,c=null;try{s=OV(e.thumbnail)}catch(f){c=f,s=void 0}let l=B_e({value:e.rbxm,exportedCount:e.exportedCount,fallbackThumbnail:$_e(t.params,e.thumbnail)});c&&(l=W_e(l,c));let u=q_e(e.roblox),d=await jm({projectSyncRoot:n.projectSyncRoot,scope:n.scope,category:n.category,originalFileName:o,content:r,...i!==void 0?{displayName:i}:{},...a!==void 0?{description:a}:{},source:T_e(t.params,e.source),...s?{preview:s}:{},rbxm:l,...u?{roblox:u}:{}}),p=TV(e.thumbnail);return{...t.result,data:{asset:d.asset,deduplicated:d.deduplicated,...typeof e.byteLength=="number"?{byteLength:e.byteLength}:{},...typeof e.exportedCount=="number"?{exportedCount:e.exportedCount}:{},...e.source!==void 0?{source:e.source}:{},...p?{thumbnail:p}:{}}}}async function NV(t){if(!t.result.success)return t.result;let e=st(t.result.data),n=st(e?.thumbnail),r;try{r=OV(n)}catch(d){return{...t.result,success:!1,error:d instanceof Error?d.message:String(d)}}if(!n||!r)return{...t.result,success:!1,error:typeof n?.error=="string"?n.error:"Thumbnail payload is missing from Asset Library thumbnail generation result."};let i=Pr(n.width),a=Pr(n.height),o=ye(n.source,128),s=Mm(n.attempts),c={mode:"auto",status:"generated",...i!==void 0?{width:i}:{},...a!==void 0?{height:a}:{},...o?{source:o}:{},...s.length>0?{attempts:s}:{}},l=xO(t.ctx,t.params);if(!l.assetId)throw new Error("assetLibraryAssetId is required for Asset Library thumbnail generation.");let u=await xV({projectSyncRoot:l.projectSyncRoot,scope:l.scope,category:l.category,assetId:l.assetId,preview:r,rbxmThumbnail:c});return{...t.result,data:{asset:u.asset,...i!==void 0?{width:i}:{},...a!==void 0?{height:a}:{},...o?{source:o}:{}}}}function H_e(t){if(t===null||typeof t!="object")return;let e=t.proFallback;if(e===null||typeof e!="object")return;let n=e;if(typeof n.executedCommand!="string")return;let r=Array.isArray(n.alternatives)?n.alternatives.filter(i=>typeof i=="string"):void 0;return{executedCommand:n.executedCommand,...typeof n.requestedCommand=="string"?{requestedCommand:n.requestedCommand}:{},...r?{alternatives:r}:{}}}var Z_e=/^Pro action '[^']+' is blocked in Basic mode\. Basic fallback '([^']+)' failed: (.*)$/s,G_e=/^Pro action '[^']+' is blocked in Basic mode\.(?! Basic fallback ')/,K_e=/instance not found|not found in|parent not found/,J_e=/is required|missing required/,Y_e=/unknown action|unknown command/,X_e=/must be|invalid|cannot/;function Q_e(t){let e=Z_e.exec(t);return e?{fallbackCommand:e[1],reason:e[2]}:null}function exe(t){return G_e.test(t)}function txe(t){let e=t.toLowerCase();return K_e.test(e)?"not_found":J_e.test(e)?"missing_param":Y_e.test(e)?"unknown_action":X_e.test(e)?"validation":"other"}function SO(t){return t.errorType==="bridge_error"||t.errorType==="command_timeout"||t.errorType==="plugin_runtime"||t.errorType==="exception"||t.errorType==="device_blocked"||t.failureOrigin==="bridge"||t.failureOrigin==="plugin_runtime"||t.failureOrigin==="server_exception"||t.failureOrigin==="product_bug"||t.failureOrigin==="unknown"||t.recoverability==="retry"||t.recoverability==="wait_connection"||t.recoverability==="unknown"?"error":"warning"}function zu(t){if(t.resultSuccess){let e=H_e(t.resultData);return e?{kind:"success_fallback",fallbackCommand:e.executedCommand,...e.alternatives?{alternatives:e.alternatives}:{}}:{kind:"success_ok"}}if(!t.resultError)return{kind:"error"};if(t.tier==="pro"){let e=Q_e(t.resultError);if(e)return{kind:"blocked_fallback_failed",fallbackCommand:e.fallbackCommand,blockedDetail:txe(e.reason)};if(exe(t.resultError))return{kind:"blocked_unsupported"}}return t.failureClassification?{kind:SO(t.failureClassification)}:{kind:"error"}}function Se(t,e,n,r,i={}){return{errorType:t,errorDetail:e,failureOrigin:n,recoverability:r,...i}}function nxe(t){let e=t.toLowerCase();return/^\s*compilation error:/.test(e)?Se("execution_failed","compile_error","agent_request","code_fix",{validationStage:"plugin_handler"}):/^\s*result too large:/.test(e)?Se("execution_failed","result_too_large","agent_request","code_fix",{validationStage:"plugin_handler"}):/^\s*execution timed out after/.test(e)?Se("execution_failed","execution_timeout","agent_request","code_fix",{validationStage:"plugin_handler"}):/potentially dangerous infinite loop|blocked in sandbox|access to .* is blocked|forbidden|not allowed|cannot access/.test(e)?Se("execution_failed","blocked_source","roblox_policy","code_fix",{validationStage:"plugin_handler"}):null}function rxe(t){let e=t.toLowerCase();return/startline and endline must be provided together/.test(e)||/startline must be a positive integer/.test(e)||/endline must be a positive integer/.test(e)||/endline must be >= startline/.test(e)?Se("execution_failed","validation","agent_request","fix_params",{validationStage:"schema"}):null}function jV(t){let e=t.toLowerCase();return/upstream_server_down/.test(e)?Se("bridge_error","upstream_down","bridge","wait_connection"):/^http [45]\d\d/.test(e)?Se("bridge_error","http_error","bridge","retry"):/duplicate request\s*id/.test(e)?Se("bridge_error","duplicate_request_id","bridge","code_fix"):/timeout/.test(e)?Se("command_timeout","timeout","bridge","retry"):/econnrefused|socket hang up|econnreset|epipe|network/.test(e)?Se("bridge_error","connection","bridge","wait_connection"):/abort/.test(e)?Se("command_timeout","aborted","bridge","retry"):/runtime error|traceback|attempt to/.test(e)?Se("plugin_runtime","runtime_error","plugin_runtime","code_fix"):/created instance, but failed to set \d+ propert/.test(e)?Se("execution_failed","property_apply_failed","agent_request","fix_params",{validationStage:"plugin_handler",partialSuccess:"true"}):/failed to set property/.test(e)?Se("execution_failed","property_apply_failed","agent_request","fix_params",{validationStage:"plugin_handler"}):/parent(?: instance)? not found/.test(e)?Se("execution_failed","parent_not_found","agent_request","fix_params",{validationStage:"plugin_handler"}):/(?:instance|path|root|source instance|ancestor instance) not found|target\s+(?:path\s+)?(?:['"`][^'"`]+['"`]\s+)?not found|not found in|no synced file found for instance/.test(e)?Se("execution_failed","not_found","user_project_state","fix_params",{validationStage:"plugin_handler"}):/is required|missing required/.test(e)?Se("execution_failed","missing_param","agent_request","fix_params",{validationStage:"schema"}):/invalid classname|invalid class/.test(e)?Se("execution_failed","invalid_class","agent_request","fix_params",{validationStage:"plugin_handler"}):/unknown action|unknown command/.test(e)?Se("execution_failed","unknown_action","agent_request","fix_params",{validationStage:"dispatcher"}):/failed to insert asset/.test(e)?Se("execution_failed","asset_error","roblox_policy","fix_params",{validationStage:"roblox_api"}):/failed to read property|property access denied/.test(e)?Se("execution_failed","property_error","agent_request","fix_params",{validationStage:"plugin_handler"}):/forbidden (?:path|parent path)|exceeds (?:total lines|max(?:imum)?(?: length)?)|is not (?:a|an) /.test(e)?Se("execution_failed","validation","agent_request","fix_params",{validationStage:"plugin_handler"}):/sync controller not available|project sync is not initialized|no active sync place|not found in sync cache/.test(e)?Se("execution_failed","sync_not_ready","user_project_state","wait_connection",{validationStage:"preflight"}):/cannot capture edit-mode screenshot while a playtest is active|play-mode screenshot capture is not supported/.test(e)?Se("execution_failed","unsupported_context","roblox_policy","no_retry",{validationStage:"preflight"}):/editableimage api is not enabled|allow mesh \/ image apis|allow http requests/.test(e)?Se("execution_failed","feature_disabled","roblox_policy","no_retry",{validationStage:"preflight"}):/must be|invalid|cannot/.test(e)?Se("execution_failed","validation","agent_request","fix_params",{validationStage:"plugin_handler"}):Se("execution_failed","other","unknown","unknown")}function Uu(t,e){if(t==="manage_scripts_get_source"){let r=rxe(e);if(r)return r}if(t==="execute_luau"){let r=nxe(e);if(r)return r}let n=jV(e);return t==="execute_luau"&&n.errorDetail==="runtime_error"&&/^\s*runtime error:/i.test(e)?Se("execution_failed","runtime_error","agent_request","code_fix"):n}function MV(t){let n=(t instanceof Error?t.message:String(t)).toLowerCase();return/timeout/.test(n)?Se("command_timeout","timeout","bridge","retry"):/econnrefused|socket hang up|network|econnreset|epipe/.test(n)?Se("bridge_error","connection","bridge","wait_connection"):/eaddrinuse/.test(n)?Se("bridge_error","port_in_use","bridge","no_retry"):Se("exception","unexpected","server_exception","code_fix")}ES();qu();import{randomBytes as Cxe}from"node:crypto";var Pxe=["manage_ui_create_tree","manage_ui_update","manage_ui_delete"],JV=["manage_ui_preview","manage_ui_check"],kxe=["ui_role","style_family","layout_family","device_policy","safe_area_policy","existing_ui_strategy"],Rxe=["screen_job","primary_action","visual_thesis","signature_motif","layout_family","imagery_family","ornamentation_family","composition_family","motion_family","device_policy","quality_priority","primary_view_profile_id","responsive_requirement"];function OS(t){return t&&typeof t=="object"?t:void 0}function OO(t){return typeof t=="number"&&Number.isFinite(t)?t:0}function AS(t){let e=OS(t);if(!e)return;let n={};for(let r of kxe){let i=e[r];typeof i=="string"&&i.trim().length>0&&(n[r]=i)}return Object.keys(n).length>0?n:void 0}function DO(t){let e=AS(t.qualityPlanSummary);if(e)return e;let n=OS(t.contextSummary),r=AS(n?.qualityPlanSummary);if(r)return r;let i=AS(n?.qualityPlan);if(i)return i;let a=AS(n?.quality_plan);if(a)return a}function YV(t){let e=OS(t);if(!e)return;let n={};for(let r of Rxe){let i=e[r];typeof i=="string"&&i.trim().length>0&&(n[r]=i)}return Object.keys(n).length>0?n:void 0}function XV(t,e){return e?{...t??{},...e}:t}function Exe(t){return typeof t=="string"?{snapshotId:t}:t&&typeof t=="object"?{snapshotId:typeof t.snapshotId=="string"?t.snapshotId:null,...t.designCheckSummary!==void 0&&{designCheckSummary:t.designCheckSummary},...t.capturedAt!==void 0&&{capturedAt:t.capturedAt},...t.error!==void 0&&{error:t.error}}:{snapshotId:null,error:"preview unavailable"}}function QV(t,e,n,r,i){if(!e)return;let a=OO(e.priority_high),o=OO(e.priority_medium),s=OO(e.priority_low),c=typeof e.total=="number"&&Number.isFinite(e.total)?e.total:a+o+s,l=n??(typeof e.target=="string"?e.target:void 0),u={source:t,...l!==void 0&&{targetPath:l},...typeof r=="string"&&{snapshotId:r},...i!==void 0&&{capturedAt:i},priority_high:a,priority_medium:o,priority_low:s,total:c,deterministic_status:e.deterministic_status==="failed"?"failed":"completed",visual_status:e.visual_status==="completed"||e.visual_status==="skipped"||e.visual_status==="failed"?e.visual_status:"not_requested",coverage:e.coverage==="structural_and_visual"?"structural_and_visual":"structural_only",skipped_reasons:Array.isArray(e.skipped_reasons)?e.skipped_reasons.filter(d=>typeof d=="string"):[],interaction_status:e.interaction_status,primary_view_context_status:e.primary_view_context_status,responsive_status:e.responsive_status,responsive_profiles_reviewed:e.responsive_profiles_reviewed,viewport_profiles_tested:e.viewport_profiles_tested,primary_visual_status:e.primary_visual_status??"not_requested",primary_visual_verdict:e.primary_visual_verdict,critic_summary:typeof e.critic_summary=="string"?e.critic_summary.trim():void 0,responsive_requirement:e.responsive_requirement};return{...u,...ac(u)}}function e3(t,e){if(!e)return t;if(!t)return e;let n=t.targetPath===e.targetPath?t.targetPath:void 0,r=t.snapshotId===e.snapshotId?t.snapshotId:void 0,i={source:e.source,...n!==void 0&&{targetPath:n},...r!==void 0&&{snapshotId:r},...e.capturedAt!==void 0&&{capturedAt:e.capturedAt},priority_high:t.priority_high+e.priority_high,priority_medium:t.priority_medium+e.priority_medium,priority_low:t.priority_low+e.priority_low,total:t.total+e.total,deterministic_status:t.deterministic_status==="failed"||e.deterministic_status==="failed"?"failed":"completed",visual_status:e.visual_status,coverage:t.coverage==="structural_and_visual"||e.coverage==="structural_and_visual"?"structural_and_visual":"structural_only",skipped_reasons:Array.from(new Set([...t.skipped_reasons,...e.skipped_reasons])),interaction_status:e.coverage_dimensions.interaction.status,primary_view_context_status:e.coverage_dimensions.primary_view_context.status,responsive_status:e.coverage_dimensions.responsive_viewport.status,viewport_profiles_tested:Array.from(new Set([...t.viewport_profiles_tested,...e.viewport_profiles_tested])),primary_visual_status:e.primary_visual_status,primary_visual_verdict:e.primary_visual_verdict??t.primary_visual_verdict,critic_summary:e.critic_summary??t.critic_summary,responsive_requirement:e.responsive_requirement??t.responsive_requirement};return{...i,...ac(i)}}function Txe(t){let e=OS(t);if(e)for(let n of["userMessage","intent","expectedBehavior"]){let r=e[n];if(typeof r=="string"&&r.trim().length>0)return r.trim().slice(0,80)}}function Axe(){let t={source:"unavailable",priority_high:0,priority_medium:0,priority_low:0,total:0,deterministic_status:"failed",visual_status:"not_requested",coverage:"structural_only",skipped_reasons:["design_check_unavailable"],primary_visual_status:"not_requested"};return{...t,...ac(t)}}function t3(t){let e=t.now??Date.now,n=null,r=null,i=u=>`${u}_${e()}_${Cxe(3).toString("hex")}`,a=()=>{r&&(clearTimeout(r),r=null)},o=()=>{a(),r=setTimeout(()=>{c("idle_timeout")},t.idleMs)},s=async u=>{try{return Exe(await t.capturePreview(u))}catch(d){return{snapshotId:null,error:d instanceof Error?d.message:String(d)}}},c=async u=>{if(!n)return;a();let d=n;n=null;let p={},f;for(let b of d.affectedPaths)if(d.afterSnapshotsPathPolicy[b]==="skip")p[b]=null;else{let x=await s(b);p[b]=x.snapshotId,x.snapshotId===null&&d.unavailableEvidence.push({phase:"after",targetPath:b,reason:x.error??"preview unavailable"}),f=e3(f,QV("after_snapshot",x.designCheckSummary,b,x.snapshotId,x.capturedAt))}let m=d.latestVisualReview&&d.latestDesignCheckSummary?d.latestDesignCheckSummary:f??d.latestDesignCheckSummary??Axe(),g={...m,responsive_requirement:d.designContractSummary?.responsive_requirement??m.responsive_requirement},y={...g,...ac(g)},v={requestId:d.requestId,...d.contextId!==void 0&&{contextId:d.contextId},...d.label!==void 0&&{label:d.label},startedAt:d.startedAtIso,closedAt:new Date(e()).toISOString(),closeReason:u,ok:d.ok,affectedPaths:Array.from(d.affectedPaths).sort(),mutationCount:d.mutationCount,beforeSnapshots:d.beforeSnapshots,afterSnapshots:p,childMutationIds:d.childMutationIds,...d.qualityPlanSummary!==void 0&&{qualityPlanSummary:d.qualityPlanSummary},...d.designContractSummary!==void 0&&{designContractSummary:d.designContractSummary},postChangeDesignCheckSummary:y,...d.latestVisualReview!==void 0&&{latestVisualReview:d.latestVisualReview},coverageDimensions:y.coverage_dimensions,viewportProfilesTested:y.viewport_profiles_tested,readiness:y.readiness,...d.unavailableEvidence.length>0&&{unavailableEvidence:d.unavailableEvidence}};await FV(t.placeDir,v)},l=u=>({requestId:i("req"),contextId:u.contextId,label:Txe(u.contextSummary),startedAtIso:new Date(e()).toISOString(),startedAtMs:e(),affectedPaths:new Set,beforeSnapshots:{},afterSnapshotsPathPolicy:{},childMutationIds:[],mutationCount:0,ok:!0,qualityPlanSummary:DO(u),designContractSummary:YV(u.designContractSummary),latestDesignCheckSummary:void 0,latestVisualReview:void 0,unavailableEvidence:[],pendingMutation:void 0});return{async beforeMutation(u){if(JV.includes(u.command)){if(n){let p=i("mut");n.qualityPlanSummary=XV(n.qualityPlanSummary,DO(u)),n.pendingMutation={mutationId:p,startedMs:e(),args:u}}return}if(!Pxe.includes(u.command))return;if(n&&n.contextId!==u.contextId?await c("context_change"):n&&a(),n||(n=l(u)),n.qualityPlanSummary=XV(n.qualityPlanSummary,DO(u)),n.designContractSummary={...n.designContractSummary??{},...YV(u.designContractSummary)??{}},u.targetPath&&!(u.targetPath in n.beforeSnapshots)){if(n.affectedPaths.add(u.targetPath),u.command==="manage_ui_create_tree")n.beforeSnapshots[u.targetPath]=null;else{let p=await s(u.targetPath);n.beforeSnapshots[u.targetPath]=p.snapshotId,p.snapshotId===null&&n.unavailableEvidence.push({phase:"before",targetPath:u.targetPath,reason:p.error??"preview unavailable"})}u.command==="manage_ui_delete"?n.afterSnapshotsPathPolicy[u.targetPath]="skip":u.targetPath in n.afterSnapshotsPathPolicy||(n.afterSnapshotsPathPolicy[u.targetPath]="capture")}let d=i("mut");n.pendingMutation={mutationId:d,startedMs:e(),args:u}},async afterMutation(u){if(!n?.pendingMutation)return;let{mutationId:d,args:p}=n.pendingMutation,f={mutationId:d,requestId:n.requestId,ts:new Date(e()).toISOString(),command:p.command,origin:p.origin,...p.targetPath!==void 0&&{targetPath:p.targetPath},...p.briefId!==void 0&&{briefId:p.briefId},...u.diffSummary!==void 0&&{diffSummary:u.diffSummary},...u.changeDetails!==void 0&&{changeDetails:u.changeDetails},ok:u.ok,...u.error!==void 0&&{error:u.error},durationMs:u.durationMs};if(await qV(t.placeDir,f),n.pendingMutation=void 0,JV.includes(p.command)){let m=QV("check_results",u.designCheckSummary,p.targetPath,u.snapshotId,u.capturedAt);n.latestDesignCheckSummary=e3(n.latestDesignCheckSummary,m),m?.snapshotId&&m.primary_visual_verdict&&m.critic_summary&&(n.latestVisualReview={snapshotId:m.snapshotId,verdict:m.primary_visual_verdict,summary:m.critic_summary});return}if(n.mutationCount++,n.childMutationIds.push(d),u.ok||(n.ok=!1),!n.contextId){await c("legacy_single");return}o()},async flushNow(){n&&await c("explicit")}}}var Oxe=new Set(["available","unavailable","unknown"]),Dxe=Object.freeze({status:"recommended",blocking:!1,can_accept:!0,can_edit:!0,can_skip:!0,allows_custom_answer:!0});function Wn(t){if(!(typeof t!="object"||t===null||Array.isArray(t)))return t}function $O(t){return typeof t=="string"&&Oxe.has(t)?t:"unknown"}function $xe(t){let e=Wn(t);return{imageGeneration:$O(e?.image_generation),localImageOutput:$O(e?.local_image_output),imageReview:$O(e?.image_review)}}function Nxe(t){let e=Wn(t.design_contract),n=Wn(e?.imagery_strategy);if(typeof n?.family=="string")return n.family;if(typeof e?.imagery_family=="string")return e.imagery_family;let r=Wn(t.quality_plan);if(typeof r?.imagery_family=="string")return r.imagery_family;if(Array.isArray(t.candidate_briefs)){let i=Wn(t.candidate_briefs[0]),a=Wn(i?.design_contract);if(typeof a?.imagery_family=="string")return a.imagery_family}return"pictogram_set"}function jxe(t){let e=Wn(t.design_contract);if(Wn(e?.imagery_strategy)?.intent==="required")return!0;if(Array.isArray(t.candidate_briefs)){let r=Wn(t.candidate_briefs[0]),i=Wn(r?.design_contract);return Wn(i?.imagery_strategy)?.intent==="required"}return!1}function Mxe(t){return t==="item_thumbnail"?"item_thumbnail":t==="character_portrait"?"character_portrait":t==="decorative_illustration"?"decorative_illustration":t==="diegetic_surface"?"diegetic_surface":"pictogram"}function Lxe(t){let e=Array.isArray(t.asset_recommendations)?t.asset_recommendations:[];for(let r of e){let i=Wn(r);if(!(!i||typeof i.source!="string")){if(i.source==="user_reference")return{mode:"user_reference",reason:"Use the user-provided image reference before generating another asset.",hasConcreteAsset:!0};if(i.source==="project_asset")return{mode:"project_asset",reason:"Use the reviewed project asset before generating another asset.",hasConcreteAsset:!0};if(i.source==="existing_ui")return{mode:"project_asset",reason:"The existing UI image remains a fallback until the user accepts it for this role.",hasConcreteAsset:!1};if(i.source==="creator_store_search")return{mode:"creator_store",reason:"The Creator Store candidate remains a fallback until the user accepts it.",hasConcreteAsset:!1}}}let n=Wn(t.brief);return Array.isArray(n?.reference_assets)&&n.reference_assets.length>0?{mode:"user_reference",reason:"Use the reference asset already accepted in the brief.",hasConcreteAsset:!0}:{mode:"assetless",reason:"Continue with a coherent primitive pictogram or intentional no-imagery treatment.",hasConcreteAsset:!1}}function zxe(t,e){let n=Nxe(t),r=Mxe(n),i=Lxe(t),a=n==="no_imagery",o=jxe(t)&&!a,s={need:a?"optional":o?"required":"helpful",intended_use:r,fallback_mode:i.mode,fallback_reason:i.reason,resolution_status:a||i.hasConcreteAsset?"resolved":o?"unresolved":"optional",primary_visual_approval_eligible:!o||i.hasConcreteAsset};return a?{...s,status:"not_needed",reason:"The recommended direction intentionally uses no imagery.",requires_generation_approval:!1,requires_upload_approval:!1}:i.hasConcreteAsset?{...s,status:"not_needed",reason:"A concrete asset candidate already exists for the recommended direction.",requires_generation_approval:!1,requires_upload_approval:!1}:e.imageGeneration==="available"&&e.localImageOutput==="available"?{...s,status:"recommended",reason:"The calling agent can generate an image and materialize it as a local file.",question:`Generate a bounded local ${r} image set for this recommended UI direction?`,requires_generation_approval:!0,requires_upload_approval:!0}:e.imageGeneration==="unavailable"||e.localImageOutput==="unavailable"?{...s,status:"unavailable",reason:"This agent environment cannot complete the local generated-image path.",requires_generation_approval:!1,requires_upload_approval:!1}:{...s,status:"unknown",reason:"The calling agent should inspect its callable image tools and local output channel once, then use the fallback if support remains unknown.",requires_generation_approval:!1,requires_upload_approval:!1}}function n3(t,e){let n=Wn(t)??{},r=$xe(e);return{...n,recommendation_policy:Dxe,asset_generation_proposal:zxe(n,r)}}var h3=100,aSe=12e4,oSe=15e3,y3=new Set(["manage_ui_create_tree","manage_ui_update","manage_ui_delete"]);function sSe(t,e){return`License required for internal command ${t}. ${e??"Activate Pro license to use this feature."}`}var cSe={Text:{category:"text",label:"\uD14D\uC2A4\uD2B8"},PlaceholderText:{category:"text",label:"\uD50C\uB808\uC774\uC2A4\uD640\uB354"},TextColor3:{category:"color",label:"\uAE00\uC790\uC0C9"},BackgroundColor3:{category:"color",label:"\uBC30\uACBD\uC0C9"},BorderColor3:{category:"color",label:"\uD14C\uB450\uB9AC\uC0C9"},ImageColor3:{category:"color",label:"\uC774\uBBF8\uC9C0\uC0C9"},Size:{category:"size",label:"\uC0AC\uC774\uC988"},TextSize:{category:"size",label:"\uAE00\uC790 \uD06C\uAE30"},Position:{category:"layout",label:"\uC704\uCE58"},AnchorPoint:{category:"layout",label:"\uC575\uCEE4"},Rotation:{category:"layout",label:"\uD68C\uC804"},LayoutOrder:{category:"layout",label:"\uB808\uC774\uC544\uC6C3 \uC21C\uC11C"},Visible:{category:"state",label:"\uD45C\uC2DC \uC0C1\uD0DC"},Active:{category:"state",label:"\uD65C\uC131 \uC0C1\uD0DC"},Interactable:{category:"state",label:"\uC0C1\uD638\uC791\uC6A9 \uC0C1\uD0DC"},Selectable:{category:"state",label:"\uC120\uD0DD \uAC00\uB2A5"},Enabled:{category:"state",label:"\uD65C\uC131\uD654"},Image:{category:"asset",label:"\uC774\uBBF8\uC9C0"},Texture:{category:"asset",label:"\uD14D\uC2A4\uCC98"},SoundId:{category:"asset",label:"\uC0AC\uC6B4\uB4DC"}},lSe={text:"\uD14D\uC2A4\uD2B8",color:"\uCEEC\uB7EC",size:"\uC0AC\uC774\uC988",layout:"\uB808\uC774\uC544\uC6C3",state:"\uC0C1\uD0DC",asset:"\uC5D0\uC14B",property:"\uC18D\uC131"},uSe=Object.entries(ic).reduce((t,[e,n])=>{for(let r of n.validActions)t[`${e}_${r}`]=e;return t},{});function u3(t){return{toolName:uSe[t]||t,commandName:t}}function d3(t,e){if(typeof t.contextId=="string"||!e||typeof e!="object")return t;let n=e.contextId;return typeof n=="string"?{...t,contextId:n}:t}function DS(t,e){if(t!=="manage_sync_status_current_place")return e;let{placeId:n,...r}=e;return r}function dSe(t,e){let n=e.routing;return{requestId:t,success:!1,error:e.message,errorCode:e.code,routing:n,data:{routing:n}}}async function v3(t,e){let n=t.syncController;if(!n)return null;try{let r=e.placeId,i=n.getDefaultRuntimePlaceId(),a=null;if(typeof r=="number"&&Number.isFinite(r))a=r;else if(typeof r=="string"&&r.trim().length>0){let s=Number.parseInt(r,10);Number.isFinite(s)&&(a=s)}if(a===null&&(a=i),a===null||!Number.isFinite(a))return null;let o=a===i?n.getDefaultRuntimePlaceName():null;return typeof o=="string"&&o.length>0?await n.config.resolvePlaceRoot(a,o):n.config.getPlaceRoot(a)}catch{return null}}function pSe(t){let e=t.tree;if(!e||typeof e!="object")return;let n=e,r=typeof n.name=="string"&&n.name.length>0?n.name:void 0;return r?`${typeof n.parent=="string"&&n.parent.length>0?n.parent:"StarterGui"}.${r}`:void 0}function fSe(t,e){let n=e.targetPath;if(typeof n=="string"&&n.length>0)return n;if(t==="manage_ui_create_tree")return pSe(e)}function mSe(t){let e=cSe[t];if(e)return e;let n=t.toLowerCase();return n.includes("color")?{category:"color",label:"\uC0C9\uC0C1"}:t==="Size"||n.endsWith("size")||n.includes("scale")?{category:"size",label:"\uC0AC\uC774\uC988"}:n.includes("position")||n.includes("anchor")||n.includes("rotation")||n.includes("layout")?{category:"layout",label:"\uB808\uC774\uC544\uC6C3"}:n.includes("visible")||n.includes("active")||n.includes("enabled")||n.includes("selectable")||n.includes("interactable")?{category:"state",label:"\uC0C1\uD0DC"}:n.includes("image")||n.includes("texture")||n.includes("sound")||n.includes("asset")?{category:"asset",label:"\uC5D0\uC14B"}:n.includes("text")||n.includes("placeholder")?{category:"text",label:"\uD14D\uC2A4\uD2B8"}:{category:"property",label:t}}function p3(t,e){return Object.prototype.hasOwnProperty.call(t,e)}function gSe(t){if(!t||typeof t!="object")return new Map;let e=t,n=e.changed_properties??e.changedProperties;if(!Array.isArray(n))return new Map;let r=new Map;for(let i of n){if(!i||typeof i!="object")continue;let a=i,o=a.property;if(typeof o!="string"||o.length===0)continue;let s=p3(a,"before"),c=p3(a,"after");r.set(o,{...s&&{before:a.before},...c&&{after:a.after},hasBefore:s,hasAfter:c})}return r}function b3(t,e){let r=t.changes?.properties;if(!r||typeof r!="object")return;let i=gSe(e),a=Object.entries(r).map(([o,s])=>{let c=mSe(o),l=i.get(o),u={property:o,category:c.category,label:c.label,after:l?.hasAfter?l.after:s};return l?.hasBefore&&(u.before=l.before),u});return a.length>0?a:void 0}function _3(t){if(!t||t.length===0)return;let e=new Map;for(let i of t)e.set(i.category,(e.get(i.category)??0)+1);let r=["text","color","size","layout","state","asset","property"].map(i=>{let a=e.get(i)??0;return a>0?`${lSe[i]} ${a}\uAC1C`:null}).filter(i=>i!==null);return r.length>0?`${r.join(", ")} \uBCC0\uACBD`:void 0}function f3(t,e){if(t==="manage_ui_update"){let n=e.changes,r=_3(b3(e));if(r)return r;let i=n?.properties?Object.keys(n.properties).length:0,a=Array.isArray(n?.addChildren)?n.addChildren.length:0,o=Array.isArray(n?.removeChildren)?n.removeChildren.length:0;return`${i} props, +${a}, -${o}`}if(t==="manage_ui_create_tree")return"tree \uC0DD\uC131";if(t==="manage_ui_delete")return"\uC81C\uAC70\uB428"}function Zm(t){return t&&typeof t=="object"?t:void 0}function $S(t,e){let n=t[e];return typeof n=="number"&&Number.isFinite(n)?n:0}function x3(t){let e=Zm(t),n=Zm(e?.design_check_summary);if(n)return{priority_high:$S(n,"priority_high"),priority_medium:$S(n,"priority_medium"),priority_low:$S(n,"priority_low"),total:$S(n,"total"),...typeof n.scope=="string"&&{scope:n.scope},...typeof n.target=="string"&&{target:n.target},...n.deterministic_status==="completed"||n.deterministic_status==="failed"?{deterministic_status:n.deterministic_status}:{},...n.visual_status==="not_requested"||n.visual_status==="completed"||n.visual_status==="skipped"||n.visual_status==="failed"?{visual_status:n.visual_status}:{},...n.coverage==="structural_only"||n.coverage==="structural_and_visual"?{coverage:n.coverage}:{},...Array.isArray(n.skipped_reasons)?{skipped_reasons:n.skipped_reasons.filter(r=>typeof r=="string")}:{}}}function S3(t){let n=Zm(t)?.snapshot_id;return typeof n=="string"?n:null}function m3(t){if(typeof t=="string"&&t.trim().length>0)return t;if(typeof t=="number"&&Number.isFinite(t)){let e=t<1e10?t*1e3:t;return new Date(e).toISOString()}}function w3(t){let e=Zm(t),n=Zm(e?.meta);return m3(n?.captured_at)??m3(n?.evaluated_at)}function hSe(t,e){let n=t.uiStudioRecorders.get(e);if(n)return n;let r=t3({placeDir:e,idleMs:oSe,capturePreview:async i=>{try{let a=await Rr(t,"manage_ui_preview",{targetPath:i},jS());if(!a.success||!a.data||typeof a.data!="object")return null;let o=x3(a.data),s=w3(a.data);return{snapshotId:S3(a.data),...o!==void 0&&{designCheckSummary:o},...s!==void 0&&{capturedAt:s}}}catch{return null}}});return t.uiStudioRecorders.set(e,r),r}async function ySe(t,e,n){if(!y3.has(e))return null;let r=await v3(t,n);if(!r)return null;let i=hSe(t,r),a=e,o=typeof n.contextId=="string"?n.contextId:void 0,s=n.contextSummary,c=s!==void 0&&typeof s=="object"?s:void 0,l=fSe(a,n),u=typeof n.briefId=="string"?n.briefId:void 0,d=u!==void 0?t.uiStudioDesignContracts.get(r,u):void 0,p={command:a,...o!==void 0&&{contextId:o},...c!==void 0&&{contextSummary:c},...l!==void 0&&{targetPath:l},...u!==void 0&&{briefId:u},...d!==void 0&&{designContractSummary:d},origin:n.__origin==="dashboard"?"dashboard":"ai"};try{return await i.beforeMutation(p),{recorder:i,command:a,params:n,startedAt:Date.now()}}catch(f){return h.debug("UI Studio recorder beforeMutation \uC2E4\uD328 (\uBB34\uC2DC)",{error:f}),null}}async function g3(t,e){if(t)try{let n=t.command==="manage_ui_update"?b3(t.params,e.data):void 0,r=t.command==="manage_ui_update"?_3(n)??f3(t.command,t.params):f3(t.command,t.params),i=x3(e.data),a=S3(e.data),o=w3(e.data);await t.recorder.afterMutation({ok:e.success,durationMs:Date.now()-t.startedAt,...r!==void 0&&{diffSummary:r},...n!==void 0&&{changeDetails:n},...e.error!==void 0&&{error:e.error},...i!==void 0&&{designCheckSummary:i},...a!==null&&{snapshotId:a},...o!==void 0&&{capturedAt:o}})}catch(n){h.debug("UI Studio recorder afterMutation \uC2E4\uD328 (\uBB34\uC2DC)",{error:n})}}async function NS(t,e,n,r,i,a){if(!t.historyManager)return;let o=!i.success&&i.error?Uu(n,i.error):void 0,s=zu({resultSuccess:i.success,resultData:i.data,resultError:i.error,tier:ar(n),...o?{failureClassification:o}:{}});if(i.success){let u=s.kind==="success_fallback"&&i.data&&typeof i.data=="object"?{...i.data,outcomeStatus:"fallback",requestedCommand:n,executedCommand:s.fallbackCommand,...s.alternatives?{alternatives:s.alternatives}:{}}:i.data,d=DS(n,r);i.routing?await t.historyManager.recordSuccess(e,d,u,a,n,void 0,i.routing):await t.historyManager.recordSuccess(e,d,u,a,n);return}if(s.kind==="blocked_unsupported"){await t.historyManager.recordBlockedOutcome(e,DS(n,r),i.error||"Pro action blocked in Basic mode","blocked_unsupported",{executionTimeMs:a,command:n,...i.routing?{routing:i.routing}:{}});return}if(s.kind==="blocked_fallback_failed"){await t.historyManager.recordBlockedOutcome(e,DS(n,r),i.error||"Pro action blocked in Basic mode","blocked_fallback_failed",{executionTimeMs:a,command:n,...s.fallbackCommand?{fallbackCommand:s.fallbackCommand}:{},...s.blockedDetail?{blockedDetail:s.blockedDetail}:{},...i.routing?{routing:i.routing}:{}});return}let c=s.kind==="warning"?t.historyManager.recordWarning.bind(t.historyManager):t.historyManager.recordFailure.bind(t.historyManager),l=DS(n,r);i.routing?await c(e,l,i.error||"Unknown error",a,i.errorCode??o?.errorType.toUpperCase(),n,void 0,i.routing):await c(e,l,i.error||"Unknown error",a,i.errorCode??o?.errorType.toUpperCase(),n)}function MO(t,e,n){let r=t.pendingCommands.get(e)||[];r.length>=h3&&r.shift(),r.push(n),t.pendingCommands.set(e,r)}function vSe(t,e){t.globalPendingCommands.length>=h3&&t.globalPendingCommands.shift(),t.globalPendingCommands.push(e)}function I3(t,e,n){let r=jS(),i={requestId:r,command:e.command,params:e.params,timestamp:Date.now(),queueTimeoutMs:e.queueTimeoutMs,ackedTimeoutMs:e.ackedTimeoutMs,state:$n.QUEUED,targetClientId:n,resolve:()=>{},reject:a=>{h.debug("Auxiliary playtest stop command ended without awaited response",{requestId:r,targetClientId:n,error:a.message})},timeoutId:null};return t.commandQueue.set(r,i),i.timeoutId=setTimeout(()=>{Ix(t,i,i.queueTimeoutMs)},i.queueTimeoutMs),{event:"command",id:r,data:{command:i.command,requestId:r,params:i.params}}}function bSe(t,e,n,r){if(!Em(e.data.command))return;let i=t.commandQueue.get(e.data.requestId);if(!i)return;C3(t,i);let a=n.filter(o=>o.clientId!==r);for(let o of a){let s=I3(t,i,o.clientId);MO(t,o.clientId,s)}a.length>0&&h.info("Fan-out playtest stop command to active plugin clients",{requestId:e.data.requestId,primaryClientId:r,auxiliaryClientIds:a.map(o=>o.clientId)})}function C3(t,e,n){for(let r of Y9)setTimeout(()=>{let a=n?[...new Set(n)]:[...new Set(Un(t).map(o=>o.clientId))];for(let o of a){if(!t.pluginClients.get(o))continue;let c=I3(t,e,o);MO(t,o,c)}h.info("Retry playtest stop command to active plugin clients",{sourceRequestId:e.requestId,delayMs:r,targetClientIds:a}),yu(t)},r).unref?.()}function P3(t){return t==="clientId"||t==="targetAlias"||t==="placeId"}function _Se(t,e,n){if(!n||!Em(e.data.command))return!1;let r=t.commandQueue.get(e.data.requestId)?.routing?.selectionMode;return!P3(r)}function xSe(t,e,n){h.debug("Broadcasting command",{command:e.data.command,requestId:e.data.requestId,targetClientId:n||"all",activeWebsocketClients:Un(t).length});let r=n;if(n){MO(t,n,e);let i=t.commandQueue.get(e.data.requestId),a=i?.routing?.selectionMode;if(i&&Em(e.data.command)&&P3(a))C3(t,i,[n]);else if(_Se(t,e,n)){let o=Un(t).sort((s,c)=>c.lastSeen-s.lastSeen);bSe(t,e,o,n),r=void 0}}else vSe(t,e);yu(t,r)}async function k3(t,e,n){let r=Date.now(),i="",a={};try{let o=e.body;i=o.command??"",a=o.params||{};let s=o.requestId;if(o.instanceId||(t.serverLastCommandAt=Date.now()),o.instanceId){let m=t.mcpInstances.get(o.instanceId);m&&(m.lastCommandAt=Date.now(),m.lastSeen=m.lastCommandAt)}let c=u3(i),l=typeof o.timeout=="number"&&Number.isFinite(o.timeout)&&o.timeout>0?{timeout:o.timeout}:void 0,u=o.instanceId?t.mcpInstances.get(o.instanceId)?.sessionId??t.sessionId:t.sessionId;if(!i){n.status(400).json({error:"Missing command"});return}if(h.debug("Received execute request",{command:i,requestId:s}),i==="manage_camera_play_screenshot"){let m="manage_camera.play_screenshot is not supported. Screenshot capture is available only in Edit mode via manage_camera.screenshot.",g=Date.now()-r;t.historyManager&&await t.historyManager.recordFailure("manage_camera",a,m,g,"UNSUPPORTED_COMMAND",i),n.json({requestId:s,success:!1,error:m});return}if(i==="get_cached_selection"){let m=a.maxAge,g=Rm(t,m!==void 0?m:3e4),y=Date.now()-r;if(!g){let x={requestId:s,success:!0,data:{cached:!1,message:"No cached selection data available. The plugin may not be connected or no selection changes have occurred yet."}};t.historyManager&&await t.historyManager.recordSuccess(c.toolName,a,x.data,y,c.commandName),n.json(x);return}let v=Date.now()-g.timestamp,b={cached:!0,selection:g.selection,count:g.count,timestamp:g.timestamp,age:v};t.historyManager&&await t.historyManager.recordSuccess(c.toolName,a,b,y,c.commandName),n.json({requestId:s,success:!0,data:b});return}if(i==="get_connection_info"){let m=await fS(t),g=Date.now()-r;t.historyManager&&await t.historyManager.recordSuccess(c.toolName,a,m,g,c.commandName),n.json({requestId:s,success:!0,data:m});return}if(gS(i)==="internal"){if(!t.internalCommandExecutor){n.status(503).json({requestId:s,success:!1,error:`Internal command executor is not initialized for command: ${i}`});return}if(ar(i)==="pro"){if(!t.licenseState){n.status(503).json({requestId:s,success:!1,error:`License state manager is not initialized for internal command: ${i}`});return}let b=await t.licenseState.evaluateProAccess();if(!b.allowed){let x=sSe(i,b.reason),I=Date.now()-r;t.historyManager&&await NS(t,c.toolName,c.commandName,a,{success:!1,error:x},I),n.json({requestId:s,success:!1,error:x});return}}let m={...a,__sessionId:u},g=await t.internalCommandExecutor(i,m),y=Date.now()-r,v=d3(m,g.data);t.historyManager&&await NS(t,c.toolName,c.commandName,v,{success:g.success,data:g.data,error:g.error||"Internal command failed",...g.errorCode?{errorCode:g.errorCode}:{},...g.routing?{routing:g.routing}:{}},y),n.json({requestId:s,...g});return}let d=await Rr(t,i,a,s,l),p=Date.now()-r,f={...d3(a,d.data),__sessionId:u};t.historyManager&&await NS(t,c.toolName,c.commandName,f,d,p),n.json(d)}catch(o){let s=Date.now()-r,c=ir(o);if(t.historyManager&&i){let l=u3(i);await t.historyManager.recordFailure(l.toolName,a,c,s,"EXCEPTION",l.commandName)}h.error("Execute request failed",o),n.status(500).json({success:!1,error:c})}}async function R3(t,e,n){let r=Date.now(),i=e.body,a=i.action;if(!a||typeof a!="string"){n.status(400).json({success:!1,error:"Missing required field: action"});return}if(!new Set(["get","set","get_all","set_multiple","get_attr","set_attr","get_all_attrs","delete_attr","add_tag","remove_tag","check_tag","get_tags","get_tagged"]).has(a)){n.status(400).json({success:!1,error:`Unsupported action: ${a}`});return}let s=`manage_properties_${a}`,c=jS(),{action:l,...u}=i;try{t.serverLastCommandAt=Date.now();let d=await Rr(t,s,u,c),p=Date.now()-r;t.historyManager&&await NS(t,"manage_properties",s,u,d,p),n.json(d)}catch(d){let p=Date.now()-r,f=ir(d);t.historyManager&&await t.historyManager.recordFailure("manage_properties",u,f,p,"EXCEPTION",s),h.error("/api/properties \uC694\uCCAD \uCC98\uB9AC \uC2E4\uD328",d),n.status(500).json({success:!1,error:f})}}async function Rr(t,e,n,r,i){if(h.debug("Executing command locally",{command:e,requestId:r}),c5(t,r)){let d=`Duplicate requestId '${r}' for command '${e}'. Generate a unique requestId for each command.`;return h.warn("Duplicate execute request rejected",{command:e,requestId:r}),{requestId:r,success:!1,error:d}}let a;try{a=mS(t,Un(t),n,e)}catch(d){if(d instanceof _n)return h.warn("Command target selection failed",{command:e,requestId:r,errorCode:d.code,routing:d.routing}),dSe(r,d);throw d}let o=y3.has(e)?await ySe(t,e,n):null,s=t.config.requestTimeout,c=i?.timeout??Math.max(t.config.requestTimeout,aSe),l=bO.has(e)?await DV({ctx:t,command:e,params:n}):n,u=new Promise((d,p)=>{let f=Date.now(),m={requestId:r,command:e,params:l,timestamp:f,queueTimeoutMs:s,ackedTimeoutMs:c,state:$n.QUEUED,...a.targetClientId?{targetClientId:a.targetClientId}:{},routing:a.routing,resolve:d,reject:p,timeoutId:null};t.commandQueue.set(r,m),_x(t,a.targetClientId,f),m.timeoutId=setTimeout(()=>{Ix(t,m,s)},s)});return xSe(t,{event:"command",id:jS(),data:{command:e,requestId:r,params:l}},a.targetClientId),u.then(async d=>{let p=d;if(e==="manage_ui_design_brief"&&d.success&&d.data){let f=n3(d.data,n.agentCapabilities);p={...d,data:f};try{let m=await v3(t,n);m&&t.uiStudioDesignContracts.remember(m,f)}catch(m){h.debug("UI Studio Design Contract cache failed",{error:m instanceof Error?m.message:String(m)})}}if(e==="manage_ui_preview"&&d.success&&d.data)try{let{processPreviewResult:f,resolvePreviewPlaceDirFromCtx:m}=await Promise.resolve().then(()=>(jO(),NO)),g=await m(t,n),y=await f("manage_ui_preview",d.data,g);p={...d,data:y.data,...y.mcpContent?{mcpContent:y.mcpContent}:{}}}catch(f){h.warn("preview post-processing failed",{error:f instanceof Error?f.message:String(f)})}if(e==="manage_ui_check"&&d.success&&d.data&&n.visualReview!==void 0)try{let{resolvePreviewPlaceDirFromCtx:f}=await Promise.resolve().then(()=>(jO(),NO)),{processCheckResult:m}=await Promise.resolve().then(()=>(l3(),c3)),g=await f(t,n),y=await m("manage_ui_check",d.data,g,n);p={...p,data:y.data}}catch(f){h.warn("check visual post-processing failed",{error:f instanceof Error?f.message:String(f)})}return _O.has(e)?p=await $V({ctx:t,command:e,params:n,result:p}):e===vO&&(p=await NV({ctx:t,params:n,result:p})),p}).then(async d=>(await g3(o,{success:d.success,...d.data!==void 0&&{data:d.data},...d.error!==void 0&&{error:d.error}}),d),async d=>{throw await g3(o,{success:!1,error:ir(d)}),d})}le();ca();function MS(t,e){let n={};e.provider!==void 0&&(n.provider=e.provider),e.tier!==void 0&&(n.tier=e.tier),e.status!==void 0&&(n.status=e.status),e.canUsePro!==void 0&&(n.canUsePro=e.canUsePro),e.cleared===!0&&(n.cleared=!0),pt(t,"license",n)}function Mi(t,e,n,r){t.status(e).json({success:!1,error:{code:n,message:r}})}function SSe(t){if(typeof t!="string")return;let e=t.trim().toLowerCase();return e.length>0?e:void 0}function LS(t,e){if(e==="plugin")return t;let n={...t};return delete n.sessionToken,n}function Gm(t,e,n,r){let i=SSe(r??e.query.provider)??"auto";return t.licenseState?.supportsProvider(i)===!1?(Mi(n,400,"LICENSE_PROVIDER_UNSUPPORTED",`provider "${i}" is not supported`),null):i}function Km(t,e){return t.licenseState?!0:(Mi(e,503,"LICENSE_NOT_INITIALIZED","License system is not initialized"),!1)}function wSe(t){if(!t||typeof t!="object")return!1;let e=t;return(e.canUsePro===!0||e.canUsePro===!1)&&typeof e.status=="string"&&typeof e.checkedAt=="number"}function Jm(t,e,n,r="plugin"){if(!Km(t,n))return;let i=e.body,a=typeof i?.licenseKey=="string"?i.licenseKey:"";if(!a.trim()){Mi(n,400,"LICENSE_KEY_REQUIRED","licenseKey is required");return}let o=Gm(t,e,n,i?.provider);if(!o)return;let s=typeof i?.pluginClientId=="string"?i.pluginClientId:typeof e.query.clientId=="string"?e.query.clientId:void 0,c=typeof i?.deviceId=="string"?i.deviceId:void 0,l={licenseKey:a,provider:o,clientType:r};s&&(l.pluginClientId=s),c&&(l.deviceId=c),t.licenseState.activateGateway(l).then(u=>{t.analyticsManager?.setTier(u.canUsePro?"pro":"basic"),MS(t,{provider:u.provider,tier:u.canUsePro?"pro":"basic",status:u.status,canUsePro:u.canUsePro}),n.json(LS(u,r))}).catch(u=>{h.warn("License activate failed",{error:u instanceof Error?u.message:"unknown_error"}),Mi(n,502,"LICENSE_ACTIVATE_FAILED",u instanceof Error?u.message:"License activation failed")})}function Ym(t,e,n,r="plugin"){if(!Km(t,n))return;let i=Gm(t,e,n);if(i)try{let a=t.licenseState.getStatus(i);t.analyticsManager?.setTier(a.canUsePro?"pro":"basic"),n.json(LS(a,r))}catch(a){h.warn("License status check failed",{error:a instanceof Error?a.message:"unknown_error"}),Mi(n,502,"LICENSE_STATUS_FAILED",a instanceof Error?a.message:"License status check failed")}}function Xm(t,e,n,r="plugin"){if(!Km(t,n))return;let i=e.body,a=Gm(t,e,n,i?.provider);if(!a)return;let o={provider:a,clientType:r};r==="plugin"&&typeof i?.sessionToken=="string"&&i.sessionToken.trim()&&(o.sessionToken=i.sessionToken.trim()),typeof i?.pluginClientId=="string"&&(o.pluginClientId=i.pluginClientId),typeof i?.deviceId=="string"&&(o.deviceId=i.deviceId),t.licenseState.refreshGateway(o).then(s=>{t.analyticsManager?.setTier(s.canUsePro?"pro":"basic"),MS(t,{provider:s.provider,tier:s.canUsePro?"pro":"basic",status:s.status,canUsePro:s.canUsePro}),n.json(LS(s,r))}).catch(s=>{h.warn("License refresh failed",{error:s instanceof Error?s.message:"unknown_error"}),Mi(n,502,"LICENSE_REFRESH_FAILED",s instanceof Error?s.message:"License refresh failed")})}function Qm(t,e,n,r="plugin"){if(!Km(t,n))return;let i=e.body,a=Gm(t,e,n,i?.provider);a&&t.licenseState.resetGateway({provider:a,clientType:r}).then(o=>{t.analyticsManager?.setTier("basic"),MS(t,{provider:o.provider,tier:"basic",status:o.status,canUsePro:o.canUsePro,cleared:!0}),n.json(LS(o,r))}).catch(o=>{h.warn("License reset failed",{error:o instanceof Error?o.message:"unknown_error"}),Mi(n,502,"LICENSE_RESET_FAILED",o instanceof Error?o.message:"License reset failed")})}function LO(t,e,n){if(!Km(t,n))return;let r=e.body,i=Gm(t,e,n,r?.provider);if(!i)return;if(r?.clientType!=="plugin"){Mi(n,400,"LICENSE_CLIENT_TYPE_INVALID","clientType must be plugin");return}let a=typeof r?.sessionToken=="string"&&r.sessionToken.trim()?r.sessionToken.trim():void 0,o=wSe(r?.snapshot)?r.snapshot:void 0;if(!o&&!a){Mi(n,400,"LICENSE_BOOTSTRAP_REQUIRED","snapshot or sessionToken is required");return}let s={provider:i,clientType:"plugin"};o&&(s.snapshot=o),a&&(s.sessionToken=a),t.licenseState.bootstrap(s).then(c=>{t.analyticsManager?.setTier(c.canUsePro?"pro":"basic"),MS(t,{provider:c.provider,tier:c.canUsePro?"pro":"basic",status:c.status,canUsePro:c.canUsePro}),n.json({ok:!0})}).catch(c=>{h.warn("License bootstrap failed",{error:c instanceof Error?c.message:"unknown_error"}),Mi(n,502,"LICENSE_BOOTSTRAP_FAILED",c instanceof Error?c.message:"License bootstrap failed")})}function E3(t){t.app.post("/license/bootstrap",(e,n)=>LO(t,e,n)),t.app.post("/license/activate",(e,n)=>Jm(t,e,n,"plugin")),t.app.post("/license/refresh",(e,n)=>Xm(t,e,n,"plugin")),t.app.post("/license/reset",(e,n)=>Qm(t,e,n,"plugin")),t.app.get("/license/status",(e,n)=>Ym(t,e,n,"plugin"))}vt();le();import{promises as zS}from"fs";import zO from"path";function ISe(t){let e=t.config.appDataDir??Ke();return zO.join(e,"observability","logs")}async function Wu(t,e,n){let r=e.query.clientId;if(r&&t.pluginClients.has(r)){let i=t.pluginClients.get(r);i.lastSeen=Date.now()}try{let i=e.body;if(!i||!Array.isArray(i.logs)){h.warn("Invalid logs request",{body:i}),n.status(400).json({error:"Invalid request body"});return}let a=ISe(t);await zS.mkdir(a,{recursive:!0});let c=`plugin-${new Date().toISOString().split("T")[0]}.log`,l=zO.join(a,c),u=zO.join(a,"current.log"),d=i.logs.map(p=>`[${new Date(p.timestamp*1e3).toISOString().replace("T"," ").substring(0,19)}] [${p.level}] ${p.message}`).join(`
940
940
  `)+`
941
941
  `;await zS.appendFile(l,d,"utf-8");try{let p="";try{p=await zS.readFile(u,"utf-8")}catch{}let m=(p+d).split(`
942
942
  `).slice(-500).join(`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@weppy/roblox-mcp",
3
- "version": "2.14.4",
3
+ "version": "2.14.5",
4
4
  "description": "MCP (Model Context Protocol) server for Roblox Studio integration - enables AI coding agents to interact with Roblox Studio in real-time",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
Binary file