@weppy/roblox-mcp 2.14.0 → 2.14.1
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 +7 -0
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/roblox-plugin/WeppyRobloxMCP.rbxm +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -34,6 +34,13 @@ All notable changes to this project will be documented in this file.
|
|
|
34
34
|
|
|
35
35
|
|
|
36
36
|
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
## [2.14.1] - 2026-08-21
|
|
40
|
+
|
|
41
|
+
### Bug Fixes
|
|
42
|
+
|
|
43
|
+
- **Complete one-line installs when an MCP config file is blank** — `install.sh` and `install.ps1` now treat empty or whitespace-only Antigravity shared config files as a fresh configuration, register WEPPY normally, and preserve valid existing settings. Malformed non-empty JSON still stops instead of being overwritten, and no manual file cleanup is required. Thanks to `@jaumnp` for reporting the issue.
|
|
37
44
|
|
|
38
45
|
## [2.14.0] - 2026-08-20
|
|
39
46
|
|
package/dist/index.js
CHANGED
|
@@ -884,7 +884,7 @@ ${y9}
|
|
|
884
884
|
`)}
|
|
885
885
|
`,"utf8")>Pbe;)n.shift();let r=`${t}.${process.pid}.tmp`;Vn.writeFileSync(r,n.length>0?`${n.join(`
|
|
886
886
|
`)}
|
|
887
|
-
`:"","utf8"),Vn.renameSync(r,t)}function k9(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 R9(t,e=20){return!Number.isInteger(e)||e<=0?[]:k9(QT(t)).slice(-e).map(r=>r.filePath)}function E9(t){let e=QT(t.appDataDir),n=XA.join(e,Tbe(t.instanceId));return{filePath:n,record(i,a,o={},s){try{let l={...YA(o),schemaVersion:1,timestamp:Ebe(s),source:i,event:a,pid:t.pid,instanceId:t.instanceId,sessionId:t.sessionId};Vn.mkdirSync(e,{recursive:!0}),Obe(n,JSON.stringify(l))}catch{}},pruneOldInstanceFiles(){try{let i=k9(e);for(let a of i.slice(0,-20))Vn.rmSync(a.filePath,{force:!0})}catch{}}}}vt();function T9(t,e){let n=Dbe(),r=n.replace(/-/g,"").substring(0,8).toUpperCase(),i=`${r.substring(0,4)}-${r.substring(4,8)}`,a=E9({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:P9(),aiClientName:"",pluginVersion:"",syncedSessionToken:null,serverLastCommandAt:null}}var A9=Ft(bo(),1);le();function O9(t){let e=A9.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 $S}from"crypto";co();le();function $be(){let t=process.env.WEPPY_ROBLOX_MCP_VERSION?.trim();return t||null}var Ye=$be()??"2.14.0";ca();nr();Pm();Ro();fu();co();Ro();var L9="studio-",jbe=/^studio-[1-9]\d*$/;function nS(t){return jbe.test(t)}function z9(t,e){let n=new Set;for(let r of t)e!==void 0&&r.clientId===e||r.targetAlias&&nS(r.targetAlias)&&n.add(r.targetAlias);return n}function Mbe(t,e){let n=z9(t,e),r=1;for(;n.has(`${L9}${r}`);)r+=1;return`${L9}${r}`}function rS(t,e){let n=z9(t,e.clientId);return e.targetAlias&&nS(e.targetAlias)&&!n.has(e.targetAlias)||(e.targetAlias=Mbe(t,e.clientId)),e.targetAlias}fu();function iS(t){for(let e of t)rS(t,e)}function aS(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 iS(e),dm(e.map(aS),null)}function oS(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 U9(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 F9(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 q9(t,e,n){let r=parseInt(e.query.maxAge)||3e4,i=km(t,r);i?n.json({cached:!0,...i}):n.json({cached:!1,message:"No cached selection available"})}function km(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=rS(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)&&Ax(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:oS(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&&pu(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&&pm(t,e,"disconnected",n),h.info("Plugin client unregistered",{clientId:e,existed:r}),r}function sS(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 cS(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 B9(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"}),vu(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 V9(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"}),vu(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 W9(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 H9(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),pu(t,a));U9(t);let i=Un(t);return iS(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(aS),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 lS(t,e){e.json(H9(t))}function uS(t,e,n){let r=e.query.instanceId;r&&t.mcpInstances.has(r)&&(t.mcpInstances.get(r).lastSeen=Date.now()),U9(t);let i=Un(t);iS(i);let s={...{status:"online",connectedClients:i.length,queuedCommands:y5(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:oS(t),pluginVersion:t.pluginVersion||void 0,dashboardSseClients:t.dashboardSseClients?.size??0,websocketClients:i.length,pluginClients:i.map(aS),...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 Z9(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 dS(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 H9(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"}},zbe=new Set([_t.canonical.runTest]),Ube=new Set([_t.canonical.playStop]),k8e=new Set([_t.canonical.playStart,_t.canonical.playStop,_t.canonical.playPause,_t.canonical.playResume,_t.canonical.playStatus]);function Di(t){return zbe.has(t)}function Rm(t){return Ube.has(t)}var A8e=_t.canonical.playStop,G9=[5e3,15e3];fu();var Fbe=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 qbe(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&&Bbe(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 pS(t,e,n={},r){let i=qbe(n,r),a=V8(e,t.studioRoutingMode==="pinned"?t.pinnedTargetClientId:null);if(i.requestedClientId!==void 0)return Vbe(a,i);if(i.requestedTargetAlias!==void 0)return Wbe(a,i);if(i.requestedPlaceId!==void 0)return Hbe(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 Bbe(t,e){return!t||!Fbe.has(t)?!0:e.scope==="shared"}function Vbe(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 K9("clientId",e,n),{targetClientId:n.clientId,routing:ni("clientId",e,n)}}function Wbe(t,e){let n=t.find(r=>r.targetAlias!==void 0&&nS(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 K9("targetAlias",e,n),{targetClientId:n.clientId,routing:ni("targetAlias",e,n)}}function Hbe(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 K9(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}rA();le();wm();var nc={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 Zbe={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 fS(t){return Zbe[t]||"plugin"}var J9=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 J9.has(t)?"pro":"basic"}Ir();mS();import{readFile as g_e}from"node:fs/promises";import h_e from"node:path";import{createHash as c_e,randomUUID as fO}from"node:crypto";import{mkdir as $m,readFile as iV,readdir as aV,rename as oV,rm as l_e,stat as u_e,writeFile as xS}from"node:fs/promises";import Mt from"node:path";import{extname as Ybe}from"node:path";import{constants as Xbe}from"node:fs";import{access as Qbe,stat as e_e}from"node:fs/promises";var Tm=20*1024*1024,vS=[{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"}}],t_e=new Map(vS.map(t=>[t.category,t]));function hS(t){if(!t)throw new Error("Open Cloud asset upload is disabled in WEPPY Dashboard settings.")}function gS(t,e){return t.split(e.apiKey).join("[redacted]")}function yS(t){let e=t_e.get(t);if(!e)throw new Error(`Unsupported asset category: ${t}`);return e}function $u(t){return yS(t)}async function uO(t,e,n=Tm){let r=yS(t),i=Ybe(e).toLowerCase(),a=r.contentTypes[i]??null,o=await e_e(e),s=!0;try{await Qbe(e,Xbe.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 Q9(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 eV(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 tV(t){return typeof t.path=="string"&&t.path.startsWith("operations/")?t.path:null}function nV(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 Du=class{client;credentialStore;isOpenCloudUploadEnabled;maxFileSizeBytes;constructor(e){this.client=e.client,this.credentialStore=e.credentialStore,this.isOpenCloudUploadEnabled=e.isOpenCloudUploadEnabled,this.maxFileSizeBytes=e.maxFileSizeBytes??Tm}getCapabilities(){return vS.map(({contentTypes:e,...n})=>n)}async uploadAsset(e){hS(this.isOpenCloudUploadEnabled());let n=await this.getRequiredCredential(),r=Q9(e,n),i=yS(r.category),a=await eV(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=tV(s);return c?await this.client.pollOperation(nV(n,c,r.operationPollIntervalMs,r.operationPollTimeoutMs)):s}return s}catch(o){throw new Error(gS(o instanceof Error?o.message:String(o),n))}}async updateAsset(e){hS(this.isOpenCloudUploadEnabled());let n=await this.getRequiredCredential(),r=Q9(e,n),i=yS(r.category),a;if(r.filePath){if(!i.supportsContentUpdate)throw new Error(`${i.category} assets do not support content updates.`);a=await eV(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=tV(s);return c?await this.client.pollOperation(nV(n,c,r.operationPollIntervalMs,r.operationPollTimeoutMs)):s}return s}catch(o){throw new Error(gS(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(gS(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(gS(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 rV from"node:fs";import un from"node:path";ix();var n_e=/^asset_(image|decal|audio|mesh|model|video|animation)_\d+_[a-z0-9]+$/;function r_e(t){if(!Number.isInteger(t)||t<0)throw new Error(`Invalid place ID: ${t}`)}function i_e(t,e){try{return rV.statSync(un.join(t,e,".sync-meta.json")).isFile()}catch{return!1}}function a_e(t,e){r_e(e.placeId);let n=`place_${e.placeId}`,r=e.placeName?lu(e.placeName):"",i=r?`${n}_${r}`:n,a=[];try{let o=new RegExp(`^place_${e.placeId}(?:_.*)?$`);a=rV.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=>i_e(t,o))??(a.includes(i)?i:null)??a[0]??i}function dO(t){let e=un.resolve(t.projectSyncRoot),n=$u(t.category).folder,r=t.scope.kind==="place"?un.join(e,a_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 o_e(t){let e=n_e.exec(t);return e?.[1]?e[1]:null}function Am(t,e){let n=o_e(t);return n?e?n===e:!0:!1}function bS(t,e){if(!Am(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 s_e(t){bS(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 _S(t){let e=s_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 Om(t,e){return un.relative(un.resolve(t),un.resolve(e)).split(un.sep).join("/")}var sV=20*1024*1024,d_e=200,pO=8,p_e=512,f_e=120;function cV(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 lV(t,e){let n=Mt.extname(t).toLowerCase(),r=$u(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 uV(t){return c_e("sha256").update(t).digest("hex")}function gO(t){if(t===void 0||t==="")return"";if(t.length>p_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>f_e||n==="."||n===".."))throw new Error(`Invalid Asset Library folder path: ${t}`);return e.join("/")}function SS(t){return t.now?.()??Date.now()}function m_e(t){return(t.randomId?.()??fO().replace(/-/g,"").slice(0,6)).toLowerCase().replace(/[^a-z0-9]/g,"").slice(0,12)||"asset"}function dV(t,e){let n=Math.floor(SS(t)/1e3);for(let r=0;r<20;r++){let i=m_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 pV(t){let e=Mt.parse(t).name.trim();return e.length>0?e:t}function fV(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 xS(n,JSON.stringify(e,null,2),"utf8"),await oV(n,t)}async function mV(t,e){try{let n=await iV(Mt.join(e,"asset.json"),"utf8"),r=JSON.parse(n);return!Am(r.id,t.category)||r.category!==t.category||!cV(r.scope,t.scope)?null:(gO(r.folderPath),r)}catch{return null}}async function Dm(t,e){let n;try{n=await aV(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()||!Am(i.name,t.category))continue;let a=Mt.join(e.root,i.name),o=await mV(t,a);o&&r.push(o)}return r.sort((i,a)=>a.createdAt.localeCompare(i.createdAt)||a.id.localeCompare(i.id))}async function Nu(t,e,n){if(bS(n.id,t.category),n.category!==t.category||!cV(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 $m(r,{recursive:!0}),await hO(Mt.join(r,"asset.json"),n)}async function gV(t,e){await $m(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 hV(t,e=t,n=[]){let r;try{r=await aV(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 hV(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 $m(e.inbox,{recursive:!0}),e}async function wS(t){let e=await Ni(t),n=await Dm(t,e);return await gV(e,n),n}async function Xt(t,e){bS(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 mV(t,r);if(!i)throw new Error(`Asset not found: ${e}`);return i}async function ju(t){let e=await Ni(t),n=await Dm(t,e),r={version:1,generatedAt:new Date().toISOString(),assets:n.map(i=>i.id)};return await hO(e.index,r),r}async function yV(t){let e=await Ni(t),n=await Dm(t,e),r=new Set(n.map(p=>p.id)),i=new Set(n.map(p=>p.file.sha256)),a=[],o=[],s=t.maxFileSizeBytes??sV,c=t.maxFilesPerRescan??d_e,l=await hV(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=lV(f.name,t.category);if(!g){o.push(ri(f.name,"unsupportedType",`unsupported ${t.category} extension`));continue}let y=await u_e(m);if(y.size>s){o.push(ri(f.name,"oversized","asset file is larger than the configured limit"));continue}let v=await iV(m);if(!mO(f.name,t.category,v)){o.push(ri(f.name,"invalidSignature","file signature does not match the extension"));continue}let b=uV(v);if(i.has(b)){o.push(ri(f.name,"duplicate","asset content already exists in Asset Library"));continue}let x=dV(t,r);r.add(x),i.add(b);let I=Mt.join(e.root,x),w=`original${g.canonicalExt}`;await $m(I,{recursive:!0}),await oV(m,Mt.join(I,w));let N=new Date(SS(t)).toISOString(),k={version:1,id:x,category:t.category,scope:t.scope,...p.folderPath?{folderPath:p.folderPath}:{},status:"localOnly",displayName:pV(f.name),description:"",source:{kind:"generated",originalPath:Om(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 Nu(t,e,k),a.push(k)}let d=await Dm(t,e);return await gV(e,d),{assets:d,adopted:a,skipped:o,adoptedCount:a.length,skippedCount:o.length}}async function Nm(t){let e=await Ni(t),n=lV(t.originalFileName,t.category);if(!n)throw new Error(`Unsupported ${t.category} extension for Asset Library export`);let r=t.maxFileSizeBytes??sV;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 Dm(t,e),a=uV(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=dV(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 $m(l,{recursive:!0}),await xS(Mt.join(l,u),t.content);let d=null;if(t.preview){let y=fV(t.preview);d=y.fileName,await xS(Mt.join(l,y.fileName),y.content)}let p=new Date(SS(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()||pV(t.originalFileName),description:t.description??"",source:{...t.source,originalPath:Om(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 Nu(t,e,g),await ju(t),{asset:g,deduplicated:!1}}async function vV(t){let e=await Ni(t),n=await Xt(t,t.assetId),r=fV(t.preview),i=_S({...t,relativeFileName:r.fileName});await xS(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(SS(t)).toISOString()};return await Nu(t,e,a),await ju(t),{asset:a}}async function bV(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 Nu(t,r,a),await ju(t),a}async function _V(t,e,n){let r=await Ni(t),a={...await Xt(t,e),usage:n,updatedAt:new Date().toISOString()};return await Nu(t,r,a),await ju(t),a}async function xV(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 l_e(r,{recursive:!0}),await ju(t),{assetId:e,removed:1}}async function ji(t){let e=await Ni(t);return await Nu(t,e,t.asset),await ju(t),t.asset}async function Mu(t){let e=await Xt(t,t.assetId);return _S({...t,relativeFileName:e.file.original})}async function SV(t){let e=await Xt(t,t.assetId);return _S({...t,relativeFileName:e.file.preview??e.file.original})}var y_e="https://create.roblox.com/dashboard/creations/store",v_e="manage_assets_import_rbxm",vO="manage_assets_generate_thumbnail",b_e="manage_assets_review_model";var bO=new Set([v_e,vO]),_O=new Set(["manage_assets_export_selection_rbxm","manage_assets_export_path_rbxm",b_e]),__e=new Set(["model","animation"]);function st(t){return t&&typeof t=="object"?t:null}function x_e(t){if(typeof t!="string"||!__e.has(t))throw new Error(`Unsupported Asset Library .rbxm round-trip category: ${String(t??"(missing)")}`);return t}function S_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 wV(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=x_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=S_e(e.placeId),s=t.syncController?.getDefaultRuntimePlaceId()??null,c=o??s??wV(t)?.placeId??null;if(c===null)throw new Error("No placeId is available for Asset Library .rbxm round-trip.");let l=wV(t,c);return{projectSyncRoot:n,scope:{kind:"place",placeId:c,...l?.placeName?{placeName:l.placeName}:{}},category:r,...a?{assetId:a}:{}}}function w_e(t){if(h_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 I_e(t,e){if(typeof t!="string"||t.trim().length===0)throw new Error(`${e} is missing`);return Buffer.from(t,"base64")}function C_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 kV(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=jm(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 P_e(t){if(typeof t!="string")return null;let e=t.trim();return/^\d+$/.test(e)?e:null}function IV(t){return`rbxassetid://${t}`}function CV(t){return`${y_e}/${t}/configure`}function PV(t){return`assets/${t}`}function Pr(t){return typeof t=="number"&&Number.isFinite(t)?t:void 0}function RV(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 k_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 R_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 jm(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_e(t,e){let n=t.thumbnailMode==="auto"?"auto":"none";if(n==="none")return{mode:n,status:"skipped",message:"Thumbnail generation disabled"};let r=kV(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=jm(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=jm(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 T_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=jm(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 A_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 O_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 D_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=RV(e.roots);return{readiness:n,...i?{reviewedAt:i}:{},...a.length>0?{roots:a}:{},summary:st(r)??{},findings:O_e(e.findings)}}function $_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 N_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=A_e(e.requestedSize),l=Pr(e.maxTriangles),u=ye(e.targetParent,512),d=ye(e.path,512),p=$_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 j_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 M_e(t){let e=st(t);if(!e||e.uploaded!==!0)return;let n=P_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:IV(n),assetWebUrl:CV(n),remotePath:PV(n),uploadedAt:r,uploadAttempts:[{startedAt:r,finishedAt:r,status:"uploaded",assetRole:"primary",...i?{creatorType:i}:{},...a?{creatorId:a}:{},assetId:n,assetUri:IV(n),assetWebUrl:CV(n),remotePath:PV(n)}]}}function L_e(t){let e=st(t.value),n=RV(e?.roots),r=k_e(e?.classCounts),i=R_e(e?.resourceReferences),a=D_e(e?.review),o=N_e(e?.generation),s=j_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:T_e(e?.thumbnail,t.fallbackThumbnail),...a?{review:a}:{},...o?{generation:o}:{},...s.length>0?{studioUploads:s}:{}}}function z_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 EV(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(X9(e.base64Rgba,e.width,e.height),"base64")),!!n){if(!z_e(n))throw new Error("Thumbnail payload is not a valid PNG image.");return{fileName:"thumbnail.png",content:n,mimeType:"image/png"}}}function U_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 TV(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);w_e(n);let r=await Mu({...e,assetId:n.id}),i=await g_e(r);return{...t.params,__assetLibraryRbxmBase64:i.toString("base64"),__assetLibraryOriginalFile:n.file.original}}async function AV(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=I_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=EV(e.thumbnail)}catch(f){c=f,s=void 0}let l=L_e({value:e.rbxm,exportedCount:e.exportedCount,fallbackThumbnail:E_e(t.params,e.thumbnail)});c&&(l=U_e(l,c));let u=M_e(e.roblox),d=await Nm({projectSyncRoot:n.projectSyncRoot,scope:n.scope,category:n.category,originalFileName:o,content:r,...i!==void 0?{displayName:i}:{},...a!==void 0?{description:a}:{},source:C_e(t.params,e.source),...s?{preview:s}:{},rbxm:l,...u?{roblox:u}:{}}),p=kV(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 OV(t){if(!t.result.success)return t.result;let e=st(t.result.data),n=st(e?.thumbnail),r;try{r=EV(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=jm(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 vV({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 F_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 q_e=/^Pro action '[^']+' is blocked in Basic mode\. Basic fallback '([^']+)' failed: (.*)$/s,B_e=/^Pro action '[^']+' is blocked in Basic mode\.(?! Basic fallback ')/,V_e=/instance not found|not found in|parent not found/,W_e=/is required|missing required/,H_e=/unknown action|unknown command/,Z_e=/must be|invalid|cannot/;function G_e(t){let e=q_e.exec(t);return e?{fallbackCommand:e[1],reason:e[2]}:null}function K_e(t){return B_e.test(t)}function J_e(t){let e=t.toLowerCase();return V_e.test(e)?"not_found":W_e.test(e)?"missing_param":H_e.test(e)?"unknown_action":Z_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 Lu(t){if(t.resultSuccess){let e=F_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=G_e(t.resultError);if(e)return{kind:"blocked_fallback_failed",fallbackCommand:e.fallbackCommand,blockedDetail:J_e(e.reason)};if(K_e(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 Y_e(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 X_e(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 DV(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 zu(t,e){if(t==="manage_scripts_get_source"){let r=X_e(e);if(r)return r}if(t==="execute_luau"){let r=Y_e(e);if(r)return r}let n=DV(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 $V(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")}kS();Fu();import{randomBytes as _xe}from"node:crypto";var xxe=["manage_ui_create_tree","manage_ui_update","manage_ui_delete"],ZV=["manage_ui_preview","manage_ui_check"],Sxe=["ui_role","style_family","layout_family","device_policy","safe_area_policy","existing_ui_strategy"],wxe=["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 TS(t){return t&&typeof t=="object"?t:void 0}function OO(t){return typeof t=="number"&&Number.isFinite(t)?t:0}function ES(t){let e=TS(t);if(!e)return;let n={};for(let r of Sxe){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=ES(t.qualityPlanSummary);if(e)return e;let n=TS(t.contextSummary),r=ES(n?.qualityPlanSummary);if(r)return r;let i=ES(n?.qualityPlan);if(i)return i;let a=ES(n?.quality_plan);if(a)return a}function GV(t){let e=TS(t);if(!e)return;let n={};for(let r of wxe){let i=e[r];typeof i=="string"&&i.trim().length>0&&(n[r]=i)}return Object.keys(n).length>0?n:void 0}function KV(t,e){return e?{...t??{},...e}:t}function Ixe(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 JV(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,...rc(u)}}function YV(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,...rc(i)}}function Cxe(t){let e=TS(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 Pxe(){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,...rc(t)}}function XV(t){let e=t.now??Date.now,n=null,r=null,i=u=>`${u}_${e()}_${_xe(3).toString("hex")}`,a=()=>{r&&(clearTimeout(r),r=null)},o=()=>{a(),r=setTimeout(()=>{c("idle_timeout")},t.idleMs)},s=async u=>{try{return Ixe(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=YV(f,JV("after_snapshot",x.designCheckSummary,b,x.snapshotId,x.capturedAt))}let m=d.latestVisualReview&&d.latestDesignCheckSummary?d.latestDesignCheckSummary:f??d.latestDesignCheckSummary??Pxe(),g={...m,responsive_requirement:d.designContractSummary?.responsive_requirement??m.responsive_requirement},y={...g,...rc(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 LV(t.placeDir,v)},l=u=>({requestId:i("req"),contextId:u.contextId,label:Cxe(u.contextSummary),startedAtIso:new Date(e()).toISOString(),startedAtMs:e(),affectedPaths:new Set,beforeSnapshots:{},afterSnapshotsPathPolicy:{},childMutationIds:[],mutationCount:0,ok:!0,qualityPlanSummary:DO(u),designContractSummary:GV(u.designContractSummary),latestDesignCheckSummary:void 0,latestVisualReview:void 0,unavailableEvidence:[],pendingMutation:void 0});return{async beforeMutation(u){if(ZV.includes(u.command)){if(n){let p=i("mut");n.qualityPlanSummary=KV(n.qualityPlanSummary,DO(u)),n.pendingMutation={mutationId:p,startedMs:e(),args:u}}return}if(!xxe.includes(u.command))return;if(n&&n.contextId!==u.contextId?await c("context_change"):n&&a(),n||(n=l(u)),n.qualityPlanSummary=KV(n.qualityPlanSummary,DO(u)),n.designContractSummary={...n.designContractSummary??{},...GV(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 zV(t.placeDir,f),n.pendingMutation=void 0,ZV.includes(p.command)){let m=JV("check_results",u.designCheckSummary,p.targetPath,u.snapshotId,u.capturedAt);n.latestDesignCheckSummary=YV(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 kxe=new Set(["available","unavailable","unknown"]),Rxe=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"&&kxe.has(t)?t:"unknown"}function Exe(t){let e=Wn(t);return{imageGeneration:$O(e?.image_generation),localImageOutput:$O(e?.local_image_output),imageReview:$O(e?.image_review)}}function Txe(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 Axe(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 Oxe(t){return t==="item_thumbnail"?"item_thumbnail":t==="character_portrait"?"character_portrait":t==="decorative_illustration"?"decorative_illustration":t==="diegetic_surface"?"diegetic_surface":"pictogram"}function Dxe(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 $xe(t,e){let n=Txe(t),r=Oxe(n),i=Dxe(t),a=n==="no_imagery",o=Axe(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 QV(t,e){let n=Wn(t)??{},r=Exe(e);return{...n,recommendation_policy:Rxe,asset_generation_proposal:$xe(n,r)}}var f3=100,eSe=12e4,tSe=15e3,m3=new Set(["manage_ui_create_tree","manage_ui_update","manage_ui_delete"]);function nSe(t,e){return`License required for internal command ${t}. ${e??"Activate Pro license to use this feature."}`}var rSe={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"}},iSe={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"},aSe=Object.entries(nc).reduce((t,[e,n])=>{for(let r of n.validActions)t[`${e}_${r}`]=e;return t},{});function s3(t){return{toolName:aSe[t]||t,commandName:t}}function c3(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 AS(t,e){if(t!=="manage_sync_status_current_place")return e;let{placeId:n,...r}=e;return r}function oSe(t,e){let n=e.routing;return{requestId:t,success:!1,error:e.message,errorCode:e.code,routing:n,data:{routing:n}}}async function g3(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 sSe(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 cSe(t,e){let n=e.targetPath;if(typeof n=="string"&&n.length>0)return n;if(t==="manage_ui_create_tree")return sSe(e)}function lSe(t){let e=rSe[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 l3(t,e){return Object.prototype.hasOwnProperty.call(t,e)}function uSe(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=l3(a,"before"),c=l3(a,"after");r.set(o,{...s&&{before:a.before},...c&&{after:a.after},hasBefore:s,hasAfter:c})}return r}function h3(t,e){let r=t.changes?.properties;if(!r||typeof r!="object")return;let i=uSe(e),a=Object.entries(r).map(([o,s])=>{let c=lSe(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 y3(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?`${iSe[i]} ${a}\uAC1C`:null}).filter(i=>i!==null);return r.length>0?`${r.join(", ")} \uBCC0\uACBD`:void 0}function u3(t,e){if(t==="manage_ui_update"){let n=e.changes,r=y3(h3(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 Hm(t){return t&&typeof t=="object"?t:void 0}function OS(t,e){let n=t[e];return typeof n=="number"&&Number.isFinite(n)?n:0}function v3(t){let e=Hm(t),n=Hm(e?.design_check_summary);if(n)return{priority_high:OS(n,"priority_high"),priority_medium:OS(n,"priority_medium"),priority_low:OS(n,"priority_low"),total:OS(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 b3(t){let n=Hm(t)?.snapshot_id;return typeof n=="string"?n:null}function d3(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 _3(t){let e=Hm(t),n=Hm(e?.meta);return d3(n?.captured_at)??d3(n?.evaluated_at)}function dSe(t,e){let n=t.uiStudioRecorders.get(e);if(n)return n;let r=XV({placeDir:e,idleMs:tSe,capturePreview:async i=>{try{let a=await Rr(t,"manage_ui_preview",{targetPath:i},$S());if(!a.success||!a.data||typeof a.data!="object")return null;let o=v3(a.data),s=_3(a.data);return{snapshotId:b3(a.data),...o!==void 0&&{designCheckSummary:o},...s!==void 0&&{capturedAt:s}}}catch{return null}}});return t.uiStudioRecorders.set(e,r),r}async function pSe(t,e,n){if(!m3.has(e))return null;let r=await g3(t,n);if(!r)return null;let i=dSe(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=cSe(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 p3(t,e){if(t)try{let n=t.command==="manage_ui_update"?h3(t.params,e.data):void 0,r=t.command==="manage_ui_update"?y3(n)??u3(t.command,t.params):u3(t.command,t.params),i=v3(e.data),a=b3(e.data),o=_3(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 DS(t,e,n,r,i,a){if(!t.historyManager)return;let o=!i.success&&i.error?zu(n,i.error):void 0,s=Lu({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=AS(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,AS(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,AS(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=AS(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>=f3&&r.shift(),r.push(n),t.pendingCommands.set(e,r)}function fSe(t,e){t.globalPendingCommands.length>=f3&&t.globalPendingCommands.shift(),t.globalPendingCommands.push(e)}function x3(t,e,n){let r=$S(),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(()=>{Sx(t,i,i.queueTimeoutMs)},i.queueTimeoutMs),{event:"command",id:r,data:{command:i.command,requestId:r,params:i.params}}}function mSe(t,e,n,r){if(!Rm(e.data.command))return;let i=t.commandQueue.get(e.data.requestId);if(!i)return;S3(t,i);let a=n.filter(o=>o.clientId!==r);for(let o of a){let s=x3(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 S3(t,e,n){for(let r of G9)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=x3(t,e,o);MO(t,o,c)}h.info("Retry playtest stop command to active plugin clients",{sourceRequestId:e.requestId,delayMs:r,targetClientIds:a}),hu(t)},r).unref?.()}function w3(t){return t==="clientId"||t==="targetAlias"||t==="placeId"}function gSe(t,e,n){if(!n||!Rm(e.data.command))return!1;let r=t.commandQueue.get(e.data.requestId)?.routing?.selectionMode;return!w3(r)}function hSe(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&&Rm(e.data.command)&&w3(a))S3(t,i,[n]);else if(gSe(t,e,n)){let o=Un(t).sort((s,c)=>c.lastSeen-s.lastSeen);mSe(t,e,o,n),r=void 0}}else fSe(t,e);hu(t,r)}async function I3(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=s3(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=km(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 dS(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(fS(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=nSe(i,b.reason),I=Date.now()-r;t.historyManager&&await DS(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=c3(m,g.data);t.historyManager&&await DS(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={...c3(a,d.data),__sessionId:u};t.historyManager&&await DS(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=s3(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 C3(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=$S(),{action:l,...u}=i;try{t.serverLastCommandAt=Date.now();let d=await Rr(t,s,u,c),p=Date.now()-r;t.historyManager&&await DS(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}),s5(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=pS(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}),oSe(r,d);throw d}let o=m3.has(e)?await pSe(t,e,n):null,s=t.config.requestTimeout,c=i?.timeout??Math.max(t.config.requestTimeout,eSe),l=bO.has(e)?await TV({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),vx(t,a.targetClientId,f),m.timeoutId=setTimeout(()=>{Sx(t,m,s)},s)});return hSe(t,{event:"command",id:$S(),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=QV(d.data,n.agentCapabilities);p={...d,data:f};try{let m=await g3(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(()=>(o3(),a3)),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 AV({ctx:t,command:e,params:n,result:p}):e===vO&&(p=await OV({ctx:t,params:n,result:p})),p}).then(async d=>(await p3(o,{success:d.success,...d.data!==void 0&&{data:d.data},...d.error!==void 0&&{error:d.error}}),d),async d=>{throw await p3(o,{success:!1,error:ir(d)}),d})}le();ca();function NS(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 ySe(t){if(typeof t!="string")return;let e=t.trim().toLowerCase();return e.length>0?e:void 0}function jS(t,e){if(e==="plugin")return t;let n={...t};return delete n.sessionToken,n}function Zm(t,e,n,r){let i=ySe(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 Gm(t,e){return t.licenseState?!0:(Mi(e,503,"LICENSE_NOT_INITIALIZED","License system is not initialized"),!1)}function vSe(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 Km(t,e,n,r="plugin"){if(!Gm(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=Zm(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"),NS(t,{provider:u.provider,tier:u.canUsePro?"pro":"basic",status:u.status,canUsePro:u.canUsePro}),n.json(jS(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 Jm(t,e,n,r="plugin"){if(!Gm(t,n))return;let i=Zm(t,e,n);if(i)try{let a=t.licenseState.getStatus(i);t.analyticsManager?.setTier(a.canUsePro?"pro":"basic"),n.json(jS(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 Ym(t,e,n,r="plugin"){if(!Gm(t,n))return;let i=e.body,a=Zm(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"),NS(t,{provider:s.provider,tier:s.canUsePro?"pro":"basic",status:s.status,canUsePro:s.canUsePro}),n.json(jS(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 Xm(t,e,n,r="plugin"){if(!Gm(t,n))return;let i=e.body,a=Zm(t,e,n,i?.provider);a&&t.licenseState.resetGateway({provider:a,clientType:r}).then(o=>{t.analyticsManager?.setTier("basic"),NS(t,{provider:o.provider,tier:"basic",status:o.status,canUsePro:o.canUsePro,cleared:!0}),n.json(jS(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(!Gm(t,n))return;let r=e.body,i=Zm(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=vSe(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"),NS(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 P3(t){t.app.post("/license/bootstrap",(e,n)=>LO(t,e,n)),t.app.post("/license/activate",(e,n)=>Km(t,e,n,"plugin")),t.app.post("/license/refresh",(e,n)=>Ym(t,e,n,"plugin")),t.app.post("/license/reset",(e,n)=>Xm(t,e,n,"plugin")),t.app.get("/license/status",(e,n)=>Jm(t,e,n,"plugin"))}vt();le();import{promises as MS}from"fs";import zO from"path";function bSe(t){let e=t.config.appDataDir??Ke();return zO.join(e,"observability","logs")}async function Vu(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=bSe(t);await MS.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(`
|
|
887
|
+
`:"","utf8"),Vn.renameSync(r,t)}function k9(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 R9(t,e=20){return!Number.isInteger(e)||e<=0?[]:k9(QT(t)).slice(-e).map(r=>r.filePath)}function E9(t){let e=QT(t.appDataDir),n=XA.join(e,Tbe(t.instanceId));return{filePath:n,record(i,a,o={},s){try{let l={...YA(o),schemaVersion:1,timestamp:Ebe(s),source:i,event:a,pid:t.pid,instanceId:t.instanceId,sessionId:t.sessionId};Vn.mkdirSync(e,{recursive:!0}),Obe(n,JSON.stringify(l))}catch{}},pruneOldInstanceFiles(){try{let i=k9(e);for(let a of i.slice(0,-20))Vn.rmSync(a.filePath,{force:!0})}catch{}}}}vt();function T9(t,e){let n=Dbe(),r=n.replace(/-/g,"").substring(0,8).toUpperCase(),i=`${r.substring(0,4)}-${r.substring(4,8)}`,a=E9({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:P9(),aiClientName:"",pluginVersion:"",syncedSessionToken:null,serverLastCommandAt:null}}var A9=Ft(bo(),1);le();function O9(t){let e=A9.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 $S}from"crypto";co();le();function $be(){let t=process.env.WEPPY_ROBLOX_MCP_VERSION?.trim();return t||null}var Ye=$be()??"2.14.1";ca();nr();Pm();Ro();fu();co();Ro();var L9="studio-",jbe=/^studio-[1-9]\d*$/;function nS(t){return jbe.test(t)}function z9(t,e){let n=new Set;for(let r of t)e!==void 0&&r.clientId===e||r.targetAlias&&nS(r.targetAlias)&&n.add(r.targetAlias);return n}function Mbe(t,e){let n=z9(t,e),r=1;for(;n.has(`${L9}${r}`);)r+=1;return`${L9}${r}`}function rS(t,e){let n=z9(t,e.clientId);return e.targetAlias&&nS(e.targetAlias)&&!n.has(e.targetAlias)||(e.targetAlias=Mbe(t,e.clientId)),e.targetAlias}fu();function iS(t){for(let e of t)rS(t,e)}function aS(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 iS(e),dm(e.map(aS),null)}function oS(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 U9(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 F9(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 q9(t,e,n){let r=parseInt(e.query.maxAge)||3e4,i=km(t,r);i?n.json({cached:!0,...i}):n.json({cached:!1,message:"No cached selection available"})}function km(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=rS(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)&&Ax(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:oS(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&&pu(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&&pm(t,e,"disconnected",n),h.info("Plugin client unregistered",{clientId:e,existed:r}),r}function sS(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 cS(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 B9(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"}),vu(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 V9(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"}),vu(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 W9(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 H9(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),pu(t,a));U9(t);let i=Un(t);return iS(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(aS),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 lS(t,e){e.json(H9(t))}function uS(t,e,n){let r=e.query.instanceId;r&&t.mcpInstances.has(r)&&(t.mcpInstances.get(r).lastSeen=Date.now()),U9(t);let i=Un(t);iS(i);let s={...{status:"online",connectedClients:i.length,queuedCommands:y5(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:oS(t),pluginVersion:t.pluginVersion||void 0,dashboardSseClients:t.dashboardSseClients?.size??0,websocketClients:i.length,pluginClients:i.map(aS),...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 Z9(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 dS(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 H9(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"}},zbe=new Set([_t.canonical.runTest]),Ube=new Set([_t.canonical.playStop]),k8e=new Set([_t.canonical.playStart,_t.canonical.playStop,_t.canonical.playPause,_t.canonical.playResume,_t.canonical.playStatus]);function Di(t){return zbe.has(t)}function Rm(t){return Ube.has(t)}var A8e=_t.canonical.playStop,G9=[5e3,15e3];fu();var Fbe=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 qbe(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&&Bbe(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 pS(t,e,n={},r){let i=qbe(n,r),a=V8(e,t.studioRoutingMode==="pinned"?t.pinnedTargetClientId:null);if(i.requestedClientId!==void 0)return Vbe(a,i);if(i.requestedTargetAlias!==void 0)return Wbe(a,i);if(i.requestedPlaceId!==void 0)return Hbe(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 Bbe(t,e){return!t||!Fbe.has(t)?!0:e.scope==="shared"}function Vbe(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 K9("clientId",e,n),{targetClientId:n.clientId,routing:ni("clientId",e,n)}}function Wbe(t,e){let n=t.find(r=>r.targetAlias!==void 0&&nS(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 K9("targetAlias",e,n),{targetClientId:n.clientId,routing:ni("targetAlias",e,n)}}function Hbe(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 K9(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}rA();le();wm();var nc={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 Zbe={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 fS(t){return Zbe[t]||"plugin"}var J9=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 J9.has(t)?"pro":"basic"}Ir();mS();import{readFile as g_e}from"node:fs/promises";import h_e from"node:path";import{createHash as c_e,randomUUID as fO}from"node:crypto";import{mkdir as $m,readFile as iV,readdir as aV,rename as oV,rm as l_e,stat as u_e,writeFile as xS}from"node:fs/promises";import Mt from"node:path";import{extname as Ybe}from"node:path";import{constants as Xbe}from"node:fs";import{access as Qbe,stat as e_e}from"node:fs/promises";var Tm=20*1024*1024,vS=[{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"}}],t_e=new Map(vS.map(t=>[t.category,t]));function hS(t){if(!t)throw new Error("Open Cloud asset upload is disabled in WEPPY Dashboard settings.")}function gS(t,e){return t.split(e.apiKey).join("[redacted]")}function yS(t){let e=t_e.get(t);if(!e)throw new Error(`Unsupported asset category: ${t}`);return e}function $u(t){return yS(t)}async function uO(t,e,n=Tm){let r=yS(t),i=Ybe(e).toLowerCase(),a=r.contentTypes[i]??null,o=await e_e(e),s=!0;try{await Qbe(e,Xbe.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 Q9(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 eV(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 tV(t){return typeof t.path=="string"&&t.path.startsWith("operations/")?t.path:null}function nV(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 Du=class{client;credentialStore;isOpenCloudUploadEnabled;maxFileSizeBytes;constructor(e){this.client=e.client,this.credentialStore=e.credentialStore,this.isOpenCloudUploadEnabled=e.isOpenCloudUploadEnabled,this.maxFileSizeBytes=e.maxFileSizeBytes??Tm}getCapabilities(){return vS.map(({contentTypes:e,...n})=>n)}async uploadAsset(e){hS(this.isOpenCloudUploadEnabled());let n=await this.getRequiredCredential(),r=Q9(e,n),i=yS(r.category),a=await eV(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=tV(s);return c?await this.client.pollOperation(nV(n,c,r.operationPollIntervalMs,r.operationPollTimeoutMs)):s}return s}catch(o){throw new Error(gS(o instanceof Error?o.message:String(o),n))}}async updateAsset(e){hS(this.isOpenCloudUploadEnabled());let n=await this.getRequiredCredential(),r=Q9(e,n),i=yS(r.category),a;if(r.filePath){if(!i.supportsContentUpdate)throw new Error(`${i.category} assets do not support content updates.`);a=await eV(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=tV(s);return c?await this.client.pollOperation(nV(n,c,r.operationPollIntervalMs,r.operationPollTimeoutMs)):s}return s}catch(o){throw new Error(gS(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(gS(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(gS(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 rV from"node:fs";import un from"node:path";ix();var n_e=/^asset_(image|decal|audio|mesh|model|video|animation)_\d+_[a-z0-9]+$/;function r_e(t){if(!Number.isInteger(t)||t<0)throw new Error(`Invalid place ID: ${t}`)}function i_e(t,e){try{return rV.statSync(un.join(t,e,".sync-meta.json")).isFile()}catch{return!1}}function a_e(t,e){r_e(e.placeId);let n=`place_${e.placeId}`,r=e.placeName?lu(e.placeName):"",i=r?`${n}_${r}`:n,a=[];try{let o=new RegExp(`^place_${e.placeId}(?:_.*)?$`);a=rV.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=>i_e(t,o))??(a.includes(i)?i:null)??a[0]??i}function dO(t){let e=un.resolve(t.projectSyncRoot),n=$u(t.category).folder,r=t.scope.kind==="place"?un.join(e,a_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 o_e(t){let e=n_e.exec(t);return e?.[1]?e[1]:null}function Am(t,e){let n=o_e(t);return n?e?n===e:!0:!1}function bS(t,e){if(!Am(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 s_e(t){bS(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 _S(t){let e=s_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 Om(t,e){return un.relative(un.resolve(t),un.resolve(e)).split(un.sep).join("/")}var sV=20*1024*1024,d_e=200,pO=8,p_e=512,f_e=120;function cV(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 lV(t,e){let n=Mt.extname(t).toLowerCase(),r=$u(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 uV(t){return c_e("sha256").update(t).digest("hex")}function gO(t){if(t===void 0||t==="")return"";if(t.length>p_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>f_e||n==="."||n===".."))throw new Error(`Invalid Asset Library folder path: ${t}`);return e.join("/")}function SS(t){return t.now?.()??Date.now()}function m_e(t){return(t.randomId?.()??fO().replace(/-/g,"").slice(0,6)).toLowerCase().replace(/[^a-z0-9]/g,"").slice(0,12)||"asset"}function dV(t,e){let n=Math.floor(SS(t)/1e3);for(let r=0;r<20;r++){let i=m_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 pV(t){let e=Mt.parse(t).name.trim();return e.length>0?e:t}function fV(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 xS(n,JSON.stringify(e,null,2),"utf8"),await oV(n,t)}async function mV(t,e){try{let n=await iV(Mt.join(e,"asset.json"),"utf8"),r=JSON.parse(n);return!Am(r.id,t.category)||r.category!==t.category||!cV(r.scope,t.scope)?null:(gO(r.folderPath),r)}catch{return null}}async function Dm(t,e){let n;try{n=await aV(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()||!Am(i.name,t.category))continue;let a=Mt.join(e.root,i.name),o=await mV(t,a);o&&r.push(o)}return r.sort((i,a)=>a.createdAt.localeCompare(i.createdAt)||a.id.localeCompare(i.id))}async function Nu(t,e,n){if(bS(n.id,t.category),n.category!==t.category||!cV(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 $m(r,{recursive:!0}),await hO(Mt.join(r,"asset.json"),n)}async function gV(t,e){await $m(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 hV(t,e=t,n=[]){let r;try{r=await aV(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 hV(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 $m(e.inbox,{recursive:!0}),e}async function wS(t){let e=await Ni(t),n=await Dm(t,e);return await gV(e,n),n}async function Xt(t,e){bS(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 mV(t,r);if(!i)throw new Error(`Asset not found: ${e}`);return i}async function ju(t){let e=await Ni(t),n=await Dm(t,e),r={version:1,generatedAt:new Date().toISOString(),assets:n.map(i=>i.id)};return await hO(e.index,r),r}async function yV(t){let e=await Ni(t),n=await Dm(t,e),r=new Set(n.map(p=>p.id)),i=new Set(n.map(p=>p.file.sha256)),a=[],o=[],s=t.maxFileSizeBytes??sV,c=t.maxFilesPerRescan??d_e,l=await hV(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=lV(f.name,t.category);if(!g){o.push(ri(f.name,"unsupportedType",`unsupported ${t.category} extension`));continue}let y=await u_e(m);if(y.size>s){o.push(ri(f.name,"oversized","asset file is larger than the configured limit"));continue}let v=await iV(m);if(!mO(f.name,t.category,v)){o.push(ri(f.name,"invalidSignature","file signature does not match the extension"));continue}let b=uV(v);if(i.has(b)){o.push(ri(f.name,"duplicate","asset content already exists in Asset Library"));continue}let x=dV(t,r);r.add(x),i.add(b);let I=Mt.join(e.root,x),w=`original${g.canonicalExt}`;await $m(I,{recursive:!0}),await oV(m,Mt.join(I,w));let N=new Date(SS(t)).toISOString(),k={version:1,id:x,category:t.category,scope:t.scope,...p.folderPath?{folderPath:p.folderPath}:{},status:"localOnly",displayName:pV(f.name),description:"",source:{kind:"generated",originalPath:Om(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 Nu(t,e,k),a.push(k)}let d=await Dm(t,e);return await gV(e,d),{assets:d,adopted:a,skipped:o,adoptedCount:a.length,skippedCount:o.length}}async function Nm(t){let e=await Ni(t),n=lV(t.originalFileName,t.category);if(!n)throw new Error(`Unsupported ${t.category} extension for Asset Library export`);let r=t.maxFileSizeBytes??sV;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 Dm(t,e),a=uV(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=dV(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 $m(l,{recursive:!0}),await xS(Mt.join(l,u),t.content);let d=null;if(t.preview){let y=fV(t.preview);d=y.fileName,await xS(Mt.join(l,y.fileName),y.content)}let p=new Date(SS(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()||pV(t.originalFileName),description:t.description??"",source:{...t.source,originalPath:Om(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 Nu(t,e,g),await ju(t),{asset:g,deduplicated:!1}}async function vV(t){let e=await Ni(t),n=await Xt(t,t.assetId),r=fV(t.preview),i=_S({...t,relativeFileName:r.fileName});await xS(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(SS(t)).toISOString()};return await Nu(t,e,a),await ju(t),{asset:a}}async function bV(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 Nu(t,r,a),await ju(t),a}async function _V(t,e,n){let r=await Ni(t),a={...await Xt(t,e),usage:n,updatedAt:new Date().toISOString()};return await Nu(t,r,a),await ju(t),a}async function xV(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 l_e(r,{recursive:!0}),await ju(t),{assetId:e,removed:1}}async function ji(t){let e=await Ni(t);return await Nu(t,e,t.asset),await ju(t),t.asset}async function Mu(t){let e=await Xt(t,t.assetId);return _S({...t,relativeFileName:e.file.original})}async function SV(t){let e=await Xt(t,t.assetId);return _S({...t,relativeFileName:e.file.preview??e.file.original})}var y_e="https://create.roblox.com/dashboard/creations/store",v_e="manage_assets_import_rbxm",vO="manage_assets_generate_thumbnail",b_e="manage_assets_review_model";var bO=new Set([v_e,vO]),_O=new Set(["manage_assets_export_selection_rbxm","manage_assets_export_path_rbxm",b_e]),__e=new Set(["model","animation"]);function st(t){return t&&typeof t=="object"?t:null}function x_e(t){if(typeof t!="string"||!__e.has(t))throw new Error(`Unsupported Asset Library .rbxm round-trip category: ${String(t??"(missing)")}`);return t}function S_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 wV(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=x_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=S_e(e.placeId),s=t.syncController?.getDefaultRuntimePlaceId()??null,c=o??s??wV(t)?.placeId??null;if(c===null)throw new Error("No placeId is available for Asset Library .rbxm round-trip.");let l=wV(t,c);return{projectSyncRoot:n,scope:{kind:"place",placeId:c,...l?.placeName?{placeName:l.placeName}:{}},category:r,...a?{assetId:a}:{}}}function w_e(t){if(h_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 I_e(t,e){if(typeof t!="string"||t.trim().length===0)throw new Error(`${e} is missing`);return Buffer.from(t,"base64")}function C_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 kV(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=jm(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 P_e(t){if(typeof t!="string")return null;let e=t.trim();return/^\d+$/.test(e)?e:null}function IV(t){return`rbxassetid://${t}`}function CV(t){return`${y_e}/${t}/configure`}function PV(t){return`assets/${t}`}function Pr(t){return typeof t=="number"&&Number.isFinite(t)?t:void 0}function RV(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 k_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 R_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 jm(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_e(t,e){let n=t.thumbnailMode==="auto"?"auto":"none";if(n==="none")return{mode:n,status:"skipped",message:"Thumbnail generation disabled"};let r=kV(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=jm(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=jm(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 T_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=jm(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 A_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 O_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 D_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=RV(e.roots);return{readiness:n,...i?{reviewedAt:i}:{},...a.length>0?{roots:a}:{},summary:st(r)??{},findings:O_e(e.findings)}}function $_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 N_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=A_e(e.requestedSize),l=Pr(e.maxTriangles),u=ye(e.targetParent,512),d=ye(e.path,512),p=$_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 j_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 M_e(t){let e=st(t);if(!e||e.uploaded!==!0)return;let n=P_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:IV(n),assetWebUrl:CV(n),remotePath:PV(n),uploadedAt:r,uploadAttempts:[{startedAt:r,finishedAt:r,status:"uploaded",assetRole:"primary",...i?{creatorType:i}:{},...a?{creatorId:a}:{},assetId:n,assetUri:IV(n),assetWebUrl:CV(n),remotePath:PV(n)}]}}function L_e(t){let e=st(t.value),n=RV(e?.roots),r=k_e(e?.classCounts),i=R_e(e?.resourceReferences),a=D_e(e?.review),o=N_e(e?.generation),s=j_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:T_e(e?.thumbnail,t.fallbackThumbnail),...a?{review:a}:{},...o?{generation:o}:{},...s.length>0?{studioUploads:s}:{}}}function z_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 EV(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(X9(e.base64Rgba,e.width,e.height),"base64")),!!n){if(!z_e(n))throw new Error("Thumbnail payload is not a valid PNG image.");return{fileName:"thumbnail.png",content:n,mimeType:"image/png"}}}function U_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 TV(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);w_e(n);let r=await Mu({...e,assetId:n.id}),i=await g_e(r);return{...t.params,__assetLibraryRbxmBase64:i.toString("base64"),__assetLibraryOriginalFile:n.file.original}}async function AV(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=I_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=EV(e.thumbnail)}catch(f){c=f,s=void 0}let l=L_e({value:e.rbxm,exportedCount:e.exportedCount,fallbackThumbnail:E_e(t.params,e.thumbnail)});c&&(l=U_e(l,c));let u=M_e(e.roblox),d=await Nm({projectSyncRoot:n.projectSyncRoot,scope:n.scope,category:n.category,originalFileName:o,content:r,...i!==void 0?{displayName:i}:{},...a!==void 0?{description:a}:{},source:C_e(t.params,e.source),...s?{preview:s}:{},rbxm:l,...u?{roblox:u}:{}}),p=kV(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 OV(t){if(!t.result.success)return t.result;let e=st(t.result.data),n=st(e?.thumbnail),r;try{r=EV(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=jm(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 vV({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 F_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 q_e=/^Pro action '[^']+' is blocked in Basic mode\. Basic fallback '([^']+)' failed: (.*)$/s,B_e=/^Pro action '[^']+' is blocked in Basic mode\.(?! Basic fallback ')/,V_e=/instance not found|not found in|parent not found/,W_e=/is required|missing required/,H_e=/unknown action|unknown command/,Z_e=/must be|invalid|cannot/;function G_e(t){let e=q_e.exec(t);return e?{fallbackCommand:e[1],reason:e[2]}:null}function K_e(t){return B_e.test(t)}function J_e(t){let e=t.toLowerCase();return V_e.test(e)?"not_found":W_e.test(e)?"missing_param":H_e.test(e)?"unknown_action":Z_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 Lu(t){if(t.resultSuccess){let e=F_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=G_e(t.resultError);if(e)return{kind:"blocked_fallback_failed",fallbackCommand:e.fallbackCommand,blockedDetail:J_e(e.reason)};if(K_e(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 Y_e(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 X_e(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 DV(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 zu(t,e){if(t==="manage_scripts_get_source"){let r=X_e(e);if(r)return r}if(t==="execute_luau"){let r=Y_e(e);if(r)return r}let n=DV(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 $V(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")}kS();Fu();import{randomBytes as _xe}from"node:crypto";var xxe=["manage_ui_create_tree","manage_ui_update","manage_ui_delete"],ZV=["manage_ui_preview","manage_ui_check"],Sxe=["ui_role","style_family","layout_family","device_policy","safe_area_policy","existing_ui_strategy"],wxe=["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 TS(t){return t&&typeof t=="object"?t:void 0}function OO(t){return typeof t=="number"&&Number.isFinite(t)?t:0}function ES(t){let e=TS(t);if(!e)return;let n={};for(let r of Sxe){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=ES(t.qualityPlanSummary);if(e)return e;let n=TS(t.contextSummary),r=ES(n?.qualityPlanSummary);if(r)return r;let i=ES(n?.qualityPlan);if(i)return i;let a=ES(n?.quality_plan);if(a)return a}function GV(t){let e=TS(t);if(!e)return;let n={};for(let r of wxe){let i=e[r];typeof i=="string"&&i.trim().length>0&&(n[r]=i)}return Object.keys(n).length>0?n:void 0}function KV(t,e){return e?{...t??{},...e}:t}function Ixe(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 JV(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,...rc(u)}}function YV(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,...rc(i)}}function Cxe(t){let e=TS(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 Pxe(){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,...rc(t)}}function XV(t){let e=t.now??Date.now,n=null,r=null,i=u=>`${u}_${e()}_${_xe(3).toString("hex")}`,a=()=>{r&&(clearTimeout(r),r=null)},o=()=>{a(),r=setTimeout(()=>{c("idle_timeout")},t.idleMs)},s=async u=>{try{return Ixe(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=YV(f,JV("after_snapshot",x.designCheckSummary,b,x.snapshotId,x.capturedAt))}let m=d.latestVisualReview&&d.latestDesignCheckSummary?d.latestDesignCheckSummary:f??d.latestDesignCheckSummary??Pxe(),g={...m,responsive_requirement:d.designContractSummary?.responsive_requirement??m.responsive_requirement},y={...g,...rc(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 LV(t.placeDir,v)},l=u=>({requestId:i("req"),contextId:u.contextId,label:Cxe(u.contextSummary),startedAtIso:new Date(e()).toISOString(),startedAtMs:e(),affectedPaths:new Set,beforeSnapshots:{},afterSnapshotsPathPolicy:{},childMutationIds:[],mutationCount:0,ok:!0,qualityPlanSummary:DO(u),designContractSummary:GV(u.designContractSummary),latestDesignCheckSummary:void 0,latestVisualReview:void 0,unavailableEvidence:[],pendingMutation:void 0});return{async beforeMutation(u){if(ZV.includes(u.command)){if(n){let p=i("mut");n.qualityPlanSummary=KV(n.qualityPlanSummary,DO(u)),n.pendingMutation={mutationId:p,startedMs:e(),args:u}}return}if(!xxe.includes(u.command))return;if(n&&n.contextId!==u.contextId?await c("context_change"):n&&a(),n||(n=l(u)),n.qualityPlanSummary=KV(n.qualityPlanSummary,DO(u)),n.designContractSummary={...n.designContractSummary??{},...GV(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 zV(t.placeDir,f),n.pendingMutation=void 0,ZV.includes(p.command)){let m=JV("check_results",u.designCheckSummary,p.targetPath,u.snapshotId,u.capturedAt);n.latestDesignCheckSummary=YV(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 kxe=new Set(["available","unavailable","unknown"]),Rxe=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"&&kxe.has(t)?t:"unknown"}function Exe(t){let e=Wn(t);return{imageGeneration:$O(e?.image_generation),localImageOutput:$O(e?.local_image_output),imageReview:$O(e?.image_review)}}function Txe(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 Axe(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 Oxe(t){return t==="item_thumbnail"?"item_thumbnail":t==="character_portrait"?"character_portrait":t==="decorative_illustration"?"decorative_illustration":t==="diegetic_surface"?"diegetic_surface":"pictogram"}function Dxe(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 $xe(t,e){let n=Txe(t),r=Oxe(n),i=Dxe(t),a=n==="no_imagery",o=Axe(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 QV(t,e){let n=Wn(t)??{},r=Exe(e);return{...n,recommendation_policy:Rxe,asset_generation_proposal:$xe(n,r)}}var f3=100,eSe=12e4,tSe=15e3,m3=new Set(["manage_ui_create_tree","manage_ui_update","manage_ui_delete"]);function nSe(t,e){return`License required for internal command ${t}. ${e??"Activate Pro license to use this feature."}`}var rSe={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"}},iSe={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"},aSe=Object.entries(nc).reduce((t,[e,n])=>{for(let r of n.validActions)t[`${e}_${r}`]=e;return t},{});function s3(t){return{toolName:aSe[t]||t,commandName:t}}function c3(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 AS(t,e){if(t!=="manage_sync_status_current_place")return e;let{placeId:n,...r}=e;return r}function oSe(t,e){let n=e.routing;return{requestId:t,success:!1,error:e.message,errorCode:e.code,routing:n,data:{routing:n}}}async function g3(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 sSe(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 cSe(t,e){let n=e.targetPath;if(typeof n=="string"&&n.length>0)return n;if(t==="manage_ui_create_tree")return sSe(e)}function lSe(t){let e=rSe[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 l3(t,e){return Object.prototype.hasOwnProperty.call(t,e)}function uSe(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=l3(a,"before"),c=l3(a,"after");r.set(o,{...s&&{before:a.before},...c&&{after:a.after},hasBefore:s,hasAfter:c})}return r}function h3(t,e){let r=t.changes?.properties;if(!r||typeof r!="object")return;let i=uSe(e),a=Object.entries(r).map(([o,s])=>{let c=lSe(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 y3(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?`${iSe[i]} ${a}\uAC1C`:null}).filter(i=>i!==null);return r.length>0?`${r.join(", ")} \uBCC0\uACBD`:void 0}function u3(t,e){if(t==="manage_ui_update"){let n=e.changes,r=y3(h3(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 Hm(t){return t&&typeof t=="object"?t:void 0}function OS(t,e){let n=t[e];return typeof n=="number"&&Number.isFinite(n)?n:0}function v3(t){let e=Hm(t),n=Hm(e?.design_check_summary);if(n)return{priority_high:OS(n,"priority_high"),priority_medium:OS(n,"priority_medium"),priority_low:OS(n,"priority_low"),total:OS(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 b3(t){let n=Hm(t)?.snapshot_id;return typeof n=="string"?n:null}function d3(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 _3(t){let e=Hm(t),n=Hm(e?.meta);return d3(n?.captured_at)??d3(n?.evaluated_at)}function dSe(t,e){let n=t.uiStudioRecorders.get(e);if(n)return n;let r=XV({placeDir:e,idleMs:tSe,capturePreview:async i=>{try{let a=await Rr(t,"manage_ui_preview",{targetPath:i},$S());if(!a.success||!a.data||typeof a.data!="object")return null;let o=v3(a.data),s=_3(a.data);return{snapshotId:b3(a.data),...o!==void 0&&{designCheckSummary:o},...s!==void 0&&{capturedAt:s}}}catch{return null}}});return t.uiStudioRecorders.set(e,r),r}async function pSe(t,e,n){if(!m3.has(e))return null;let r=await g3(t,n);if(!r)return null;let i=dSe(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=cSe(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 p3(t,e){if(t)try{let n=t.command==="manage_ui_update"?h3(t.params,e.data):void 0,r=t.command==="manage_ui_update"?y3(n)??u3(t.command,t.params):u3(t.command,t.params),i=v3(e.data),a=b3(e.data),o=_3(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 DS(t,e,n,r,i,a){if(!t.historyManager)return;let o=!i.success&&i.error?zu(n,i.error):void 0,s=Lu({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=AS(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,AS(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,AS(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=AS(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>=f3&&r.shift(),r.push(n),t.pendingCommands.set(e,r)}function fSe(t,e){t.globalPendingCommands.length>=f3&&t.globalPendingCommands.shift(),t.globalPendingCommands.push(e)}function x3(t,e,n){let r=$S(),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(()=>{Sx(t,i,i.queueTimeoutMs)},i.queueTimeoutMs),{event:"command",id:r,data:{command:i.command,requestId:r,params:i.params}}}function mSe(t,e,n,r){if(!Rm(e.data.command))return;let i=t.commandQueue.get(e.data.requestId);if(!i)return;S3(t,i);let a=n.filter(o=>o.clientId!==r);for(let o of a){let s=x3(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 S3(t,e,n){for(let r of G9)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=x3(t,e,o);MO(t,o,c)}h.info("Retry playtest stop command to active plugin clients",{sourceRequestId:e.requestId,delayMs:r,targetClientIds:a}),hu(t)},r).unref?.()}function w3(t){return t==="clientId"||t==="targetAlias"||t==="placeId"}function gSe(t,e,n){if(!n||!Rm(e.data.command))return!1;let r=t.commandQueue.get(e.data.requestId)?.routing?.selectionMode;return!w3(r)}function hSe(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&&Rm(e.data.command)&&w3(a))S3(t,i,[n]);else if(gSe(t,e,n)){let o=Un(t).sort((s,c)=>c.lastSeen-s.lastSeen);mSe(t,e,o,n),r=void 0}}else fSe(t,e);hu(t,r)}async function I3(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=s3(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=km(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 dS(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(fS(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=nSe(i,b.reason),I=Date.now()-r;t.historyManager&&await DS(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=c3(m,g.data);t.historyManager&&await DS(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={...c3(a,d.data),__sessionId:u};t.historyManager&&await DS(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=s3(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 C3(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=$S(),{action:l,...u}=i;try{t.serverLastCommandAt=Date.now();let d=await Rr(t,s,u,c),p=Date.now()-r;t.historyManager&&await DS(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}),s5(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=pS(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}),oSe(r,d);throw d}let o=m3.has(e)?await pSe(t,e,n):null,s=t.config.requestTimeout,c=i?.timeout??Math.max(t.config.requestTimeout,eSe),l=bO.has(e)?await TV({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),vx(t,a.targetClientId,f),m.timeoutId=setTimeout(()=>{Sx(t,m,s)},s)});return hSe(t,{event:"command",id:$S(),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=QV(d.data,n.agentCapabilities);p={...d,data:f};try{let m=await g3(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(()=>(o3(),a3)),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 AV({ctx:t,command:e,params:n,result:p}):e===vO&&(p=await OV({ctx:t,params:n,result:p})),p}).then(async d=>(await p3(o,{success:d.success,...d.data!==void 0&&{data:d.data},...d.error!==void 0&&{error:d.error}}),d),async d=>{throw await p3(o,{success:!1,error:ir(d)}),d})}le();ca();function NS(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 ySe(t){if(typeof t!="string")return;let e=t.trim().toLowerCase();return e.length>0?e:void 0}function jS(t,e){if(e==="plugin")return t;let n={...t};return delete n.sessionToken,n}function Zm(t,e,n,r){let i=ySe(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 Gm(t,e){return t.licenseState?!0:(Mi(e,503,"LICENSE_NOT_INITIALIZED","License system is not initialized"),!1)}function vSe(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 Km(t,e,n,r="plugin"){if(!Gm(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=Zm(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"),NS(t,{provider:u.provider,tier:u.canUsePro?"pro":"basic",status:u.status,canUsePro:u.canUsePro}),n.json(jS(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 Jm(t,e,n,r="plugin"){if(!Gm(t,n))return;let i=Zm(t,e,n);if(i)try{let a=t.licenseState.getStatus(i);t.analyticsManager?.setTier(a.canUsePro?"pro":"basic"),n.json(jS(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 Ym(t,e,n,r="plugin"){if(!Gm(t,n))return;let i=e.body,a=Zm(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"),NS(t,{provider:s.provider,tier:s.canUsePro?"pro":"basic",status:s.status,canUsePro:s.canUsePro}),n.json(jS(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 Xm(t,e,n,r="plugin"){if(!Gm(t,n))return;let i=e.body,a=Zm(t,e,n,i?.provider);a&&t.licenseState.resetGateway({provider:a,clientType:r}).then(o=>{t.analyticsManager?.setTier("basic"),NS(t,{provider:o.provider,tier:"basic",status:o.status,canUsePro:o.canUsePro,cleared:!0}),n.json(jS(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(!Gm(t,n))return;let r=e.body,i=Zm(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=vSe(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"),NS(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 P3(t){t.app.post("/license/bootstrap",(e,n)=>LO(t,e,n)),t.app.post("/license/activate",(e,n)=>Km(t,e,n,"plugin")),t.app.post("/license/refresh",(e,n)=>Ym(t,e,n,"plugin")),t.app.post("/license/reset",(e,n)=>Xm(t,e,n,"plugin")),t.app.get("/license/status",(e,n)=>Jm(t,e,n,"plugin"))}vt();le();import{promises as MS}from"fs";import zO from"path";function bSe(t){let e=t.config.appDataDir??Ke();return zO.join(e,"observability","logs")}async function Vu(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=bSe(t);await MS.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(`
|
|
888
888
|
`)+`
|
|
889
889
|
`;await MS.appendFile(l,d,"utf-8");try{let p="";try{p=await MS.readFile(u,"utf-8")}catch{}let m=(p+d).split(`
|
|
890
890
|
`).slice(-500).join(`
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@weppy/roblox-mcp",
|
|
3
|
-
"version": "2.14.
|
|
3
|
+
"version": "2.14.1",
|
|
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
|