@weppy/roblox-mcp 2.9.2 → 2.9.3
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 +12 -0
- package/dashboard/dist/assets/{AssetsPage-CC3FW3XG.js → AssetsPage-CqgdG2Ni.js} +1 -1
- package/dashboard/dist/assets/{ChangelogDetailPage-B1zg2f56.js → ChangelogDetailPage-DTl_Tw_v.js} +1 -1
- package/dashboard/dist/assets/{ChangelogPage-CbfWdVtL.js → ChangelogPage-BqASaB-l.js} +1 -1
- package/dashboard/dist/assets/{ConfirmModal-BCviiJ3_.js → ConfirmModal-knJOxPTQ.js} +1 -1
- package/dashboard/dist/assets/{ConnectionPage-Dskqof1W.js → ConnectionPage-BkkqcLRE.js} +1 -1
- package/dashboard/dist/assets/{ControlsPage-C_38U6b0.js → ControlsPage-da-JrES8.js} +1 -1
- package/dashboard/dist/assets/{CurrentPlaceScope-CHEqGWYd.js → CurrentPlaceScope-BOfr5n7U.js} +1 -1
- package/dashboard/dist/assets/{GameChangeDetail-DAEU3IYH.js → GameChangeDetail-sTt5o48Z.js} +1 -1
- package/dashboard/dist/assets/{InfoLabel-DCq3Fmko.js → InfoLabel-DwsCwdUw.js} +1 -1
- package/dashboard/dist/assets/{OverviewPage-lOYmwxzd.js → OverviewPage-9cIh9Q5a.js} +1 -1
- package/dashboard/dist/assets/{PageHeader-Do_AQ2vQ.js → PageHeader-DwlcGnaB.js} +1 -1
- package/dashboard/dist/assets/{PlaytestPage-CKcxZyhl.js → PlaytestPage-BeRZc6wz.js} +1 -1
- package/dashboard/dist/assets/SettingsPage-BiCf2ur7.js +1 -0
- package/dashboard/dist/assets/{StatusBadge-DRbLpCd0.js → StatusBadge-CYejTjWf.js} +1 -1
- package/dashboard/dist/assets/{SyncPage-BFsgItgP.js → SyncPage-CHe2NPfN.js} +1 -1
- package/dashboard/dist/assets/{Tabs-CGfFE3L1.js → Tabs-wK2yL-C6.js} +1 -1
- package/dashboard/dist/assets/{ToolsPage-DHhF-Y_W.js → ToolsPage-Cq8crPCz.js} +1 -1
- package/dashboard/dist/assets/{TooltipText-CfI7WgY4.js → TooltipText-LAwR8aaI.js} +1 -1
- package/dashboard/dist/assets/{UiStudioPage-RAd0qXzL.js → UiStudioPage-xZ96a4BR.js} +1 -1
- package/dashboard/dist/assets/{WhatsNewPage-CLnx6v4u.js → WhatsNewPage-B9st_b8H.js} +1 -1
- package/dashboard/dist/assets/{copy-BIZzQcB-.js → copy-DwoEPqC3.js} +1 -1
- package/dashboard/dist/assets/{index-DYezp9b1.js → index-CJJYSnlB.js} +3 -3
- package/dashboard/dist/assets/{sample-requests-CnV4bBG4.js → sample-requests-tNeuJCdB.js} +1 -1
- package/dashboard/dist/assets/{useLiveUptime-BYmnk4Ph.js → useLiveUptime-DM28rhji.js} +1 -1
- package/dashboard/dist/assets/{useSettings-HzhprVq7.js → useSettings-CYVeWZ0i.js} +1 -1
- package/dashboard/dist/index.html +1 -1
- package/dist/index.js +70 -70
- package/package.json +1 -1
- package/roblox-plugin/WeppyRobloxMCP.rbxm +0 -0
- package/dashboard/dist/assets/SettingsPage-C0PubIFP.js +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{r as l,a as P,D as E,e as R,d as $,m as A,j as t,u as D,f as O,h as B,l as H,k as M,T as F}from"./index-
|
|
1
|
+
import{r as l,a as P,D as E,e as R,d as $,m as A,j as t,u as D,f as O,h as B,l as H,k as M,T as F}from"./index-CJJYSnlB.js";import{P as U}from"./PageHeader-DwlcGnaB.js";import{I as _}from"./InfoLabel-DwsCwdUw.js";import{T as b}from"./TooltipText-LAwR8aaI.js";import{C as W}from"./ConfirmModal-knJOxPTQ.js";import{C as S}from"./CurrentPlaceScope-BOfr5n7U.js";import{S as q}from"./StatusBadge-CYejTjWf.js";import"./ConfirmModal.module-NrFlfTWy.js";const G=5e3;function z(){const[e,i]=l.useState(null),[c,o]=l.useState([]),[d,r]=l.useState(!0),[y,w]=l.useState(null),m=l.useRef(null),g=l.useRef(null),p=l.useCallback(async()=>{var u;try{const[T,I]=await Promise.all([P.get("/sync/status"),P.get("/api/dashboard/place-summary")]);i(T);const a=(u=I.places)==null?void 0:u.find(j=>j.isActive);w((a==null?void 0:a.placeDirName)??null)}catch{}},[]),f=l.useCallback(async()=>{try{const u=await P.get("/sync/history",{limit:"30"});o(u.entries??[])}catch{o([])}},[]),x=l.useCallback(async()=>{await Promise.all([p(),f()]),r(!1)},[p,f]),N=l.useCallback(()=>{x()},[x]),n=l.useCallback(async()=>{await P.post("/api/dashboard/sync/history/clear"),o([]),p()},[p]);return l.useEffect(()=>(x(),g.current=setInterval(x,G),()=>{g.current&&clearInterval(g.current)}),[x]),l.useEffect(()=>{const u=new E;m.current=u,u.connect();const T=u.on("sync",()=>{p(),f()});return()=>{T(),u.disconnect(),m.current=null}},[p,f]),{status:e,history:c,loading:d,activePlaceDirName:y,refresh:N,clearHistory:n}}const V="_actions_1j3p3_60",Y="_btn_1j3p3_68",J="_btnPrimary_1j3p3_99",Q="_panel_1j3p3_109",X="_panelIcon_1j3p3_116",Z="_panelTitle_1j3p3_122",K="_panelDesc_1j3p3_131",ee="_benefitList_1j3p3_139",te="_benefitItem_1j3p3_148",h={actions:V,btn:Y,btnPrimary:J,panel:Q,panelIcon:X,panelTitle:Z,panelDesc:K,benefitList:ee,benefitItem:te};function se({icon:e,title:i,description:c,benefits:o,upgradeLabel:d,upgradeHref:r}){const{trackEvent:y}=R(),{pathname:w,search:m}=$(),g=A(w,m);return t.jsxs("div",{className:h.panel,children:[e&&t.jsx("div",{className:h.panelIcon,children:e}),t.jsx("div",{className:h.panelTitle,children:i}),t.jsx("div",{className:h.panelDesc,children:c}),t.jsx("ul",{className:h.benefitList,children:o.map(p=>t.jsx("li",{className:h.benefitItem,children:p},p))}),t.jsx("div",{className:h.actions,children:t.jsx("a",{className:`${h.btn} ${h.btnPrimary}`,href:r,target:"_blank",rel:"noreferrer",onClick:()=>y("dashboard_click_event",{click_target:"upgrade_cta",placement:"tier_panel",...g}),children:d})})]})}const ne="_page_siyu4_2",ie="_card_siyu4_10",ae="_cardHeader_siyu4_17",ce="_clearButton_siyu4_29",oe="_statusRow_siyu4_39",le="_metaItem_siyu4_46",re="_statusGrid_siyu4_52",de="_table_siyu4_71",pe="_directionRail_siyu4_99",ue="_endpointLabel_siyu4_105",ye="_optionRail_siyu4_109",_e="_directionOption_siyu4_115",he="_directionOptionActive_siyu4_129",me="_directionOptionInactive_siyu4_133",ge="_direction_forward_siyu4_139",fe="_direction_bidirectional_siyu4_143",xe="_direction_reverse_siyu4_147",be="_lockBadge_siyu4_152",je="_proBadge_siyu4_160",ve="_forwardBadge_siyu4_174",we="_logContainer_siyu4_187",Te="_logEntry_siyu4_194",Ne="_logTime_siyu4_206",Pe="_logType_siyu4_212",Ie="_logTypeWrite_siyu4_221",Ce="_logTypeUpdate_siyu4_225",Le="_logTypeDelete_siyu4_229",Se="_logTypeIdle_siyu4_233",ke="_logPath_siyu4_237",Re="_logEmpty_siyu4_244",Ee="_overlay_siyu4_251",$e="_overlayTitle_siyu4_261",Ae="_overlayMessage_siyu4_268",De="_checklist_siyu4_274",Oe="_checkItem_siyu4_284",Be="_upgradePanel_siyu4_300",He="_upgradePanelHeader_siyu4_307",Me="_benefitList_siyu4_315",Fe="_benefitItem_siyu4_324",Ue="_upgradeActions_siyu4_339",We="_btn_siyu4_344",qe="_btnPrimary_siyu4_361",Ge="_disabled_siyu4_372",s={page:ne,card:ie,cardHeader:ae,clearButton:ce,statusRow:oe,metaItem:le,statusGrid:re,table:de,directionRail:pe,endpointLabel:ue,optionRail:ye,directionOption:_e,directionOptionActive:he,directionOptionInactive:me,direction_forward:ge,direction_bidirectional:fe,direction_reverse:xe,lockBadge:be,proBadge:je,forwardBadge:ve,logContainer:we,logEntry:Te,logTime:Ne,logType:Pe,logTypeWrite:Ie,logTypeUpdate:Ce,logTypeDelete:Le,logTypeIdle:Se,logPath:ke,logEmpty:Re,overlay:Ee,overlayTitle:$e,overlayMessage:Ae,checklist:De,checkItem:Oe,upgradePanel:Be,upgradePanelHeader:He,benefitList:Me,benefitItem:Fe,upgradeActions:Ue,btn:We,btnPrimary:qe,disabled:Ge},ze=[{key:"forward",symbol:"←"},{key:"bidirectional",symbol:"↔"},{key:"reverse",symbol:"→"}];function Ve(e){const i=new Date(e);return`${String(i.getHours()).padStart(2,"0")}:${String(i.getMinutes()).padStart(2,"0")}`}function Ye(e){switch(e){case"write":return s.logTypeWrite;case"update":return s.logTypeUpdate;case"delete":return s.logTypeDelete;default:return s.logTypeIdle}}function Je(e){switch(e){case"syncing":return"syncing";case"initializing":return"initializing";case"idle":return"idle";default:return"offline"}}function Qe(e,i,c,o){const d=e(`sync.directions.cat.${i}`,i.charAt(0).toUpperCase()+i.slice(1)),r=e("sync.directions.endpoint.local","Local"),y=e("sync.directions.endpoint.studio","Studio");switch(c){case"forward":return[`${d}: ${r} <- ${y}`,e("sync.directions.tooltip.forward.body","Studio changes sync to local files only")].join(`
|
|
2
2
|
`);case"bidirectional":return[`${d}: ${r} <-> ${y}`,e("sync.directions.tooltip.bidirectional.body","Two-way sync between Local and Studio"),o?e("sync.directions.tooltip.proRequired","Pro required in Basic tier"):""].filter(Boolean).join(`
|
|
3
3
|
`);case"reverse":return[`${d}: ${r} -> ${y}`,e("sync.directions.tooltip.reverse.body","Push local file changes to Studio"),o?e("sync.directions.tooltip.proRequired","Pro required in Basic tier"):""].filter(Boolean).join(`
|
|
4
4
|
`);default:return d}}const Xe=["scripts","values","containers","data","services"];function Ze(e,i){return i==="manual"?e("sync.directions.mode.manual","Manual"):i==="auto"?e("sync.directions.mode.auto","Auto"):"-"}function k(...e){const i=e[0]??"",c=i.includes("\\")&&!i.includes("/")?"\\":"/";return e.filter(o=>o.length>0).map((o,d)=>d===0?o.replace(/[\\/]+$/g,""):o.replace(/^[\\/]+|[\\/]+$/g,"")).join(c)}function Ke(e){const i=e.replace(/[\\/]+$/g,""),c=i.split(/[\\/]+/);return c[c.length-1]??i}function et(e,i){const c=Ke(e);return c==="explorer"?e:c===i?k(e,"explorer"):k(e,i,"explorer")}function tt(e,i){return i==="manual"?e("sync.directions.mode.manual.tooltip","Applies sync changes only when you trigger them manually."):i==="auto"?e("sync.directions.mode.auto.tooltip","Applies sync changes automatically when updates arrive."):""}function st(e,i){switch(i){case"write":return e("sync.log.type.write","WRITE");case"update":return e("sync.log.type.update","UPDATE");case"delete":return e("sync.log.type.delete","DELETE");default:return e("sync.log.type.idle","IDLE")}}function nt(e,i){switch(i){case"write":return e("sync.log.type.write.tooltip","A new sync output was written to disk.");case"update":return e("sync.log.type.update.tooltip","An existing synced file or instance was updated.");case"delete":return e("sync.log.type.delete.tooltip","A synced file or instance was removed.");default:return e("sync.log.type.idle.tooltip","A sync event was recorded without a file mutation.")}}function ut(){const{t:e}=D(),{trackEvent:i}=R(),{level:c}=O(),{tier:o,loading:d}=B(),r=z(),{show:y}=H(),[w,m]=l.useState(!1),[g,p]=l.useState(!1),f=!d&&o==="basic",x=c==="disconnected"||c==="serverOnly",N=t.jsx(U,{title:e("page.sync.title","Sync"),description:e("page.sync.description","Monitor Studio to local sync status, direction, apply mode, and recent sync logs."),helpTopicId:"sync",helpState:{connectionLevel:c,tier:o}});if(x)return t.jsxs("div",{className:s.page,children:[N,t.jsx(S,{surface:"sync"}),t.jsx("div",{className:s.card,children:t.jsxs("div",{className:s.overlay,children:[t.jsx("div",{className:s.overlayTitle,children:e("sync.overlay.title","Roblox Studio plugin required")}),t.jsx("div",{className:s.overlayMessage,children:e("sync.overlay.message","Sync status will be available once the Roblox Studio plugin connects.")}),t.jsxs("ul",{className:s.checklist,children:[t.jsx("li",{className:s.checkItem,children:e("sync.overlay.check1","Is Roblox Studio running?")}),t.jsx("li",{className:s.checkItem,children:e("sync.overlay.check2","Is the WEPPY Plugin installed?")})]})]})})]});const n=r.status,u=r.history,T=Je(n==null?void 0:n.state),I=async()=>{p(!0);try{await r.clearHistory(),y(e("toast.clearSuccess","Cleared successfully"),"success"),m(!1)}catch{y(e("toast.clearFailed","Failed to clear data"),"error")}finally{p(!1)}};return t.jsxs("div",{className:s.page,children:[N,t.jsx(S,{surface:"sync"}),t.jsxs("div",{className:s.card,children:[t.jsxs("div",{className:s.cardHeader,children:[t.jsx(b,{text:e("sync.status.title.tooltip","Current Studio and local file sync status for this place."),children:e("sync.status.title","Sync Status")}),f&&t.jsx(b,{text:e("sync.status.forwardOnly.tooltip","Basic tier allows Studio to local forward sync only."),children:t.jsx("span",{className:s.forwardBadge,children:e("sync.status.forwardOnly","Forward Only")})})]}),t.jsxs("div",{className:s.statusRow,children:[t.jsx(q,{status:T}),(n==null?void 0:n.placeName)&&t.jsxs("span",{className:s.metaItem,children:[t.jsx(_,{label:e("sync.status.place","Place"),tooltip:e("sync.status.place.tooltip","Connected Roblox place name and place ID.")}),": ",n.placeName,n.placeId?` (${n.placeId})`:""]})]}),t.jsxs("dl",{className:s.statusGrid,children:[(n==null?void 0:n.syncRoot)&&t.jsxs(t.Fragment,{children:[t.jsx("dt",{children:t.jsx(_,{label:e("sync.status.path","Place Root"),tooltip:e("sync.status.path.tooltip","Local filesystem root currently used for this place sync output.")})}),t.jsx("dd",{children:n.syncRoot})]}),r.activePlaceDirName&&(n==null?void 0:n.syncRoot)&&t.jsxs(t.Fragment,{children:[t.jsx("dt",{children:t.jsx(_,{label:e("sync.status.placePath","Explorer Path"),tooltip:e("sync.status.placePath.tooltip","Explorer files path for the active place.")})}),t.jsx("dd",{children:et(n.syncRoot,r.activePlaceDirName)})]}),(n==null?void 0:n.instanceCount)!=null&&t.jsxs(t.Fragment,{children:[t.jsx("dt",{children:t.jsx(_,{label:e("sync.status.instances","Instances"),tooltip:e("sync.status.instances.tooltip","Total synced Roblox instances tracked in the local mirror.")})}),t.jsx("dd",{children:n.instanceCount})]}),(n==null?void 0:n.scriptCount)!=null&&t.jsxs(t.Fragment,{children:[t.jsx("dt",{children:t.jsx(_,{label:e("sync.status.scripts","Scripts"),tooltip:e("sync.status.scripts.tooltip","Total synced script files currently indexed for this place.")})}),t.jsx("dd",{children:n.scriptCount})]}),(n==null?void 0:n.state)==="syncing"&&t.jsxs(t.Fragment,{children:[t.jsx("dt",{children:t.jsx(_,{label:e("sync.status.state","State"),tooltip:e("sync.status.state.tooltip","Current runtime sync state reported by the server.")})}),t.jsx("dd",{children:e("status.syncing","Syncing")})]})]})]}),(n==null?void 0:n.directions)&&t.jsxs("div",{className:s.card,children:[t.jsx("div",{className:s.cardHeader,children:t.jsx(b,{text:e("sync.directions.title.tooltip","Per-category sync direction and apply behavior between Local and Studio."),children:e("sync.directions.title","Sync Directions")})}),t.jsxs("table",{className:s.table,children:[t.jsx("thead",{children:t.jsxs("tr",{children:[t.jsx("th",{children:t.jsx(_,{label:e("sync.directions.type","Type"),tooltip:e("sync.directions.type.tooltip","Sync category affected by this rule.")})}),t.jsx("th",{children:t.jsx(_,{label:e("sync.directions.direction","Direction"),tooltip:e("sync.directions.direction.tooltip","Whether each category syncs from Studio, to Studio, or both ways.")})}),t.jsx("th",{children:t.jsx(_,{label:e("sync.directions.applyMode","Apply Mode"),tooltip:e("sync.directions.applyMode.tooltip","How incoming sync changes are applied for this category.")})})]})}),t.jsx("tbody",{children:Xe.map(a=>{var L;const j=n.directions[a],C=(L=n.applyModes)==null?void 0:L[a];return t.jsxs("tr",{children:[t.jsx("td",{children:e(`sync.directions.cat.${a}`,a.charAt(0).toUpperCase()+a.slice(1))}),t.jsx("td",{children:t.jsxs("div",{className:s.directionRail,"aria-label":`${a}-direction-rail`,children:[t.jsx(b,{text:e("sync.directions.endpoint.local.tooltip","Local files on disk are always shown on the left side of the direction rail."),children:t.jsx("span",{className:s.endpointLabel,children:e("sync.directions.endpoint.local","Local")})}),t.jsx("span",{className:s.optionRail,children:ze.map(v=>t.jsx(M,{text:Qe(e,a,v.key,f),children:t.jsx("span",{className:`${s.directionOption} ${j===v.key?s.directionOptionActive:s.directionOptionInactive} ${s[`direction_${v.key}`]??""}`,"data-active":j===v.key?"true":"false",children:v.symbol})},v.key))}),t.jsx(b,{text:e("sync.directions.endpoint.studio.tooltip","Roblox Studio is always shown on the right side of the direction rail."),children:t.jsx("span",{className:s.endpointLabel,children:e("sync.directions.endpoint.studio","Studio")})})]})}),t.jsx("td",{children:t.jsx(b,{text:tt(e,C),children:Ze(e,C)})})]},a)})})]})]}),t.jsxs("div",{className:s.card,children:[t.jsxs("div",{className:s.cardHeader,children:[t.jsx("span",{children:e("sync.log.title","Sync Log")}),t.jsx("button",{className:s.clearButton,onClick:()=>{i("dashboard_click_event",{click_target:"sync_clear_log",page:"sync"}),m(!0)},children:e("common.clear","Clear")})]}),t.jsx("div",{className:s.logContainer,children:u.length===0?t.jsx("div",{className:s.logEmpty,children:e("sync.log.empty","No sync events yet")}):u.map((a,j)=>t.jsxs("div",{className:s.logEntry,children:[t.jsx("span",{className:s.logTime,children:Ve(a.timestamp)}),t.jsx(b,{text:nt(e,a.type),children:t.jsx("span",{className:`${s.logType} ${Ye(a.type)}`,children:st(e,a.type)})}),t.jsxs("span",{className:s.logPath,children:[a.path,a.details?` — ${a.details}`:""]})]},j))})]}),f&&t.jsx(se,{title:e("sync.upgrade.title","Explore Full Sync with Pro"),description:e("tier.banner.save","Save AI tokens with Pro!"),benefits:[e("sync.upgrade.benefit1","Bidirectional sync — edit files, auto-apply to Studio"),e("sync.upgrade.benefit2","Reverse sync — push file changes back to Studio"),e("sync.upgrade.benefit3","Full sync history and detailed change log")],upgradeLabel:e("sync.upgrade.buy","View Pro"),upgradeHref:F.sync}),t.jsx(W,{open:w,title:e("sync.clear.title","Clear sync log?"),message:e("sync.clear.message","This permanently removes the stored sync log for the current place."),cancelLabel:e("common.cancel","Cancel"),confirmLabel:e("common.clear","Clear"),loading:g,onCancel:()=>!g&&m(!1),onConfirm:I})]})}export{ut as Component};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{j as s}from"./index-
|
|
1
|
+
import{j as s}from"./index-CJJYSnlB.js";const r="_tabBar_1o4kh_2",_="_tabs_1o4kh_9",d="_actions_1o4kh_14",k="_tab_1o4kh_2",h="_tabActive_1o4kh_39",a={tabBar:r,tabs:_,actions:d,tab:k,tabActive:h};function v({items:n,value:c,onChange:l,ariaLabel:b,className:i,rightActions:e}){return s.jsxs("div",{className:[a.tabBar,i].filter(Boolean).join(" "),role:"tablist","aria-label":b,children:[s.jsx("div",{className:a.tabs,children:n.map(t=>{const o=t.key===c;return s.jsx("button",{type:"button",role:"tab","aria-selected":o,"data-testid":t.testId,className:[a.tab,o?a.tabActive:""].filter(Boolean).join(" "),onClick:()=>l(t.key),children:t.label},t.key)})}),e?s.jsx("div",{className:a.actions,children:e}):null]})}export{v as T};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{j as s,r as n,a as F,D as nt,u as ct,e as dt,l as ut}from"./index-DYezp9b1.js";import{P as pt}from"./PageHeader-Do_AQ2vQ.js";import{T as M}from"./TooltipText-CfI7WgY4.js";import{C as xt}from"./ConfirmModal-BCviiJ3_.js";import{C as ht}from"./CurrentPlaceScope-CHEqGWYd.js";import{T as mt}from"./Tabs-CGfFE3L1.js";import"./ConfirmModal.module-NrFlfTWy.js";const bt="_wrapper_hzgda_2",ft="_table_hzgda_7",gt="_sortable_hzgda_32",_t="_sortArrow_hzgda_41",yt="_clickable_hzgda_52",Ct="_empty_hzgda_57",jt="_expandedRow_hzgda_65",vt="_expandedCell_hzgda_74",T={wrapper:bt,table:ft,sortable:gt,sortArrow:_t,clickable:yt,empty:Ct,expandedRow:jt,expandedCell:vt};function kt({columns:t,data:a,sortBy:b,sortDir:P="asc",onSort:B,onRowClick:i,rowKey:v,emptyMessage:k,expandedKey:E,renderExpandedRow:N}){return s.jsx("div",{className:T.wrapper,children:s.jsxs("table",{className:T.table,children:[s.jsx("thead",{children:s.jsx("tr",{children:t.map(u=>s.jsxs("th",{style:u.width?{width:u.width}:void 0,className:u.sortable?T.sortable:void 0,onClick:u.sortable&&B?()=>B(u.key):void 0,children:[s.jsx("span",{children:u.label}),u.sortable&&b===u.key&&s.jsx("span",{className:T.sortArrow,children:P==="asc"?"▴":"▾"})]},u.key))})}),s.jsx("tbody",{children:a.length===0?s.jsx("tr",{children:s.jsx("td",{colSpan:t.length,className:T.empty,children:k||"No data"})}):a.map((u,R)=>{const L=v?v(u):String(R),x=E!=null&&L===E&&N?N(u):null;return s.jsxs(n.Fragment,{children:[s.jsx("tr",{className:i?T.clickable:void 0,onClick:i?()=>i(u):void 0,children:t.map(C=>s.jsx("td",{children:C.render?C.render(u):String(u[C.key]??"")},C.key))}),x&&s.jsx("tr",{className:T.expandedRow,children:s.jsx("td",{colSpan:t.length,className:T.expandedCell,children:x})})]},L)})})]})})}function St(t){return{...t,sequenceNumber:typeof t.sequenceNumber=="number"?t.sequenceNumber:void 0,executionTimeMs:typeof t.executionTimeMs=="number"?t.executionTimeMs:void 0}}const Tt=50;function Nt(t){if(typeof t=="number")return{placeId:String(t)}}function Z(t,a){return typeof a!="number"?t:`${t}?placeId=${encodeURIComponent(String(a))}`}function wt(t){const a=(t==null?void 0:t.placeId)??null,[b,P]=n.useState(null),[B,i]=n.useState(!0),[v,k]=n.useState([]),[E,N]=n.useState(0),[u,R]=n.useState(!1),[L,y]=n.useState(!0),[x,C]=n.useState(0),[f,I]=n.useState(""),$=n.useRef(null),h=n.useCallback(async()=>{i(!0);try{const c=Nt(a),j=c?await F.get("/api/dashboard/tool-stats",c):await F.get("/api/dashboard/tool-stats");P(j)}catch{}finally{i(!1)}},[a]),_=n.useCallback(async(c,j)=>{y(!0);try{const O={limit:String(Tt),offset:String(c)};j&&(O.tool=j),typeof a=="number"&&(O.placeId=String(a));const A=await F.get("/api/dashboard/history",O);k(A.entries.map(St)),N(A.total),R(A.hasMore)}catch{k([]),N(0),R(!1)}finally{y(!1)}},[a]),U=n.useCallback(()=>{h(),_(x,f)},[_,h,x,f]),V=n.useCallback(async()=>{await F.post(Z("/api/dashboard/tools/history/clear",a)),_(x,f)},[_,x,f,a]),q=n.useCallback(async()=>{await F.post(Z("/api/dashboard/tools/statistics/clear",a)),h()},[h,a]);return n.useEffect(()=>{h()},[h]),n.useEffect(()=>{_(x,f)},[_,x,f]),n.useEffect(()=>{const c=new nt;$.current=c,c.connect();const j=c.on("command",()=>{h(),_(x,f)});return()=>{j(),c.disconnect(),$.current=null}},[_,h,x,f]),{statistics:b,statsLoading:B,history:v,historyTotal:E,historyHasMore:u,historyLoading:L,historyOffset:x,historyToolFilter:f,setHistoryOffset:C,setHistoryToolFilter:I,refresh:U,clearHistory:V,clearStatistics:q}}const Mt="_page_16x6v_2",Pt="_card_16x6v_12",Bt="_cardToolbar_16x6v_19",Et="_sectionTitle_16x6v_27",Rt="_dangerButton_16x6v_33",Lt="_proBadge_16x6v_52",It="_statusOk_16x6v_67",At="_statusFallback_16x6v_76",Ht="_statusUnsupported_16x6v_85",Ot="_statusWarning_16x6v_94",Ft="_statusError_16x6v_103",$t="_tierBasic_16x6v_113",qt="_tierPro_16x6v_117",Dt="_tierMixed_16x6v_122",Wt="_filterRow_16x6v_133",zt="_filterLabel_16x6v_140",Ut="_filterSelect_16x6v_149",Vt="_expandedRow_16x6v_160",Kt="_expandedSection_16x6v_165",Gt="_detailList_16x6v_175",Jt="_detailItem_16x6v_181",Qt="_detailLabel_16x6v_187",Zt="_detailValue_16x6v_192",Xt="_pre_16x6v_197",Yt="_pagination_16x6v_214",te="_pageInfo_16x6v_222",ee="_btn_16x6v_228",se="_tierDistribution_16x6v_251",oe="_tierBarWrap_16x6v_255",ae="_tierBarBasic_16x6v_263",re="_tierBarPro_16x6v_268",le="_tierLabels_16x6v_273",ie="_statsTableWrap_16x6v_282",ne="_statsTable_16x6v_282",ce="_sortableHeader_16x6v_313",de="_sortArrow_16x6v_318",ue="_statsToolRow_16x6v_322",pe="_statsActionRow_16x6v_330",xe="_expandButton_16x6v_334",he="_expandIcon_16x6v_346",me="_actionLabel_16x6v_351",be="_emptyStats_16x6v_358",fe="_summaryLine_16x6v_364",o={page:Mt,card:Pt,cardToolbar:Bt,sectionTitle:Et,dangerButton:Rt,proBadge:Lt,statusOk:It,statusFallback:At,statusUnsupported:Ht,statusWarning:Ot,statusError:Ft,tierBasic:$t,tierPro:qt,tierMixed:Dt,filterRow:Wt,filterLabel:zt,filterSelect:Ut,expandedRow:Vt,expandedSection:Kt,detailList:Gt,detailItem:Jt,detailLabel:Qt,detailValue:Zt,pre:Xt,pagination:Yt,pageInfo:te,btn:ee,tierDistribution:se,tierBarWrap:oe,tierBarBasic:ae,tierBarPro:re,tierLabels:le,statsTableWrap:ie,statsTable:ne,sortableHeader:ce,sortArrow:de,statsToolRow:ue,statsActionRow:pe,expandButton:xe,expandIcon:he,actionLabel:me,emptyStats:be,summaryLine:fe},K=50,ge=new Set(["clientId","placeId","pinnedTarget","recentPriority","globalQueue"]);function _e(t){const a=new Date(t);return`${String(a.getHours()).padStart(2,"0")}:${String(a.getMinutes()).padStart(2,"0")}:${String(a.getSeconds()).padStart(2,"0")}`}function z(t){return typeof t!="number"||!Number.isFinite(t)?"-":t<1e3?`${t}ms`:`${(t/1e3).toFixed(1)}s`}function H(t,a){return a==="pro"?t("tier.pro","Pro"):a==="mixed"?t("tier.mixed","Mixed"):t("tier.basic","Basic")}function tt(t,a){return a!==t&&a.startsWith(`${t}_`)?a.slice(t.length+1):""}function ye(t,a){const b=tt(t,a);return b?`${t}.${b}`:t}function X(t){return typeof t=="string"&&t.length>0?t:void 0}function Ce(t){if(!Array.isArray(t))return;const a=t.filter(b=>typeof b=="string"&&b.length>0);return a.length>0?a:void 0}function je(t){const a=t.result??{};return{requestedCommand:t.requestedCommand??X(a.requestedCommand),executedCommand:t.executedCommand??X(a.executedCommand),alternatives:t.alternatives??Ce(a.alternatives)}}function ve(t,a){switch(t.status){case"fallback":return{label:a("tools.badge.fallback","FALLBACK"),tooltip:a("tools.badge.fallback.tooltip","The requested Pro action succeeded via a Basic fallback."),className:o.statusFallback};case"unsupported":return{label:a("tools.badge.unsupported","UNSUPPORTED"),tooltip:a("tools.badge.unsupported.tooltip","The requested Pro action was blocked and no fallback ran."),className:o.statusUnsupported};case"warning":return{label:a("tools.badge.warn","WARN"),tooltip:a("tools.badge.warn.tooltip","The tool call failed as an expected caller, project, policy, or user-code issue."),className:o.statusWarning};case"error":return{label:a("tools.badge.err","FAILED"),tooltip:a("tools.badge.err.tooltip","The tool run failed."),className:o.statusError};default:return{label:a("tools.status.ok","OK"),tooltip:a("tools.status.ok.tooltip","The tool run completed successfully."),className:o.statusOk}}}function g(t,a){return s.jsxs("div",{className:o.detailItem,children:[s.jsx("span",{className:o.detailLabel,children:t}),s.jsx("span",{className:o.detailValue,children:a})]})}function ke(t){if(!t||typeof t!="object")return;const a=t;if(typeof a.selectionMode=="string"&&ge.has(a.selectionMode))return a}function Y(t){if(!(!t||typeof t!="object"||!("routing"in t)))return ke(t.routing)}function Se(t){return t.routing??Y(t.result)??Y(t.data)}function Te(t,a){return t.requestedClientId?t.requestedClientId:t.requestedPlaceId!==void 0?t.requestedPlaceId:a("tools.history.routing.none","No Studio target named")}function Ne(t){return t.actualPlaceName?`${t.actualPlaceName} · ${t.actualPlaceId??"-"}`:t.actualClientId??"-"}function Ae(){const{t}=ct(),{trackEvent:a,trackPageView:b}=dt(),[P,B]=n.useState(null),i=wt({placeId:P}),{show:v}=ut(),[k,E]=n.useState("history"),[N,u]=n.useState(null),[R,L]=n.useState(null),[y,x]=n.useState(null),[C,f]=n.useState(!1),[I,$]=n.useState("totalCalls"),[h,_]=n.useState("desc"),U=n.useCallback(e=>{$(r=>r===e?(_(l=>l==="asc"?"desc":"asc"),e):(_("desc"),e))},[]),V=n.useMemo(()=>{var r;const e=new Set;return Object.keys(((r=i.statistics)==null?void 0:r.tools)??{}).forEach(l=>e.add(l)),i.history.forEach(l=>{l.tool&&e.add(l.tool)}),i.historyToolFilter&&e.add(i.historyToolFilter),Array.from(e).sort()},[i.history,i.historyToolFilter,i.statistics]),q=n.useMemo(()=>{var e;return(e=i.statistics)!=null&&e.tools?Object.values(i.statistics.tools).map(r=>{var Q;const l=Object.entries(r.commands??{}).map(([p,d])=>({toolName:r.tool,commandName:d.command??p,label:tt(r.tool,d.command??p)||(d.command??p),tier:d.tier,totalCalls:d.totalCalls,successCount:d.successCount,fallbackCount:d.fallbackCount,unsupportedCount:d.unsupportedCount,warningCount:d.warningCount??0,failureCount:d.failureCount,totalExecutionTimeMs:d.totalExecutionTimeMs,avgExecutionTimeMs:d.avgExecutionTimeMs})),m=l.reduce((p,d)=>p+d.totalCalls,0),S=l.reduce((p,d)=>p+d.successCount,0),D=l.reduce((p,d)=>p+d.fallbackCount,0),W=l.reduce((p,d)=>p+d.unsupportedCount,0),rt=l.reduce((p,d)=>p+d.warningCount,0),lt=l.reduce((p,d)=>p+d.failureCount,0),J=l.reduce((p,d)=>p+d.totalExecutionTimeMs,0),it=new Set(l.map(p=>p.tier)).size>1?"mixed":((Q=l[0])==null?void 0:Q.tier)??r.tier;return{toolName:r.tool,tier:it,commands:l,totalCalls:m,successCount:S,fallbackCount:D,unsupportedCount:W,warningCount:rt,failureCount:lt,totalExecutionTimeMs:J,avgExecutionTimeMs:m>0?Math.round(J/m):0}}):[]},[i.statistics]),c=n.useCallback((e,r,l,m)=>s.jsx(M,{text:t(l,m),children:t(e,r)}),[t]),j=n.useMemo(()=>[...q].sort((r,l)=>{const m=r[I],S=l[I];if(typeof m=="number"&&typeof S=="number")return h==="asc"?m-S:S-m;const D=String(m??""),W=String(S??"");return h==="asc"?D.localeCompare(W):W.localeCompare(D)}),[q,I,h]),O=n.useMemo(()=>[{key:"timestamp",label:c("tools.col.time","Time","tools.col.time.tooltip","When the tool run was recorded."),width:"80px",render:e=>_e(e.timestamp)},{key:"toolName",label:c("tools.col.toolAction","Tool.Action","tools.col.toolAction.tooltip","Tool name and action that were executed."),render:e=>s.jsxs("span",{children:[ye(e.tool,e.command),e.tier==="pro"&&s.jsx(M,{text:t("tools.badge.pro.tooltip","This entry used a Pro-only tool or action."),children:s.jsx("span",{className:o.proBadge,children:t("tools.badge.pro","PRO")})})]})},{key:"executionTimeMs",label:c("tools.col.duration","Duration","tools.col.duration.tooltip","How long the tool took to finish."),width:"80px",render:e=>z(e.executionTimeMs)},{key:"status",label:c("tools.col.status","Status","tools.col.status.tooltip","Outcome of the recorded tool run."),width:"120px",render:e=>{const r=ve(e,t);return s.jsx(M,{text:r.tooltip,children:s.jsx("span",{className:r.className,children:r.label})})}},{key:"tier",label:c("tools.col.tier","Tier","tools.col.tier.tooltip","License tier required for the tool or action."),width:"60px",render:e=>s.jsx("span",{className:e.tier==="pro"?o.tierPro:o.tierBasic,children:H(t,e.tier)})}],[t,c]),A=n.useMemo(()=>[{key:"toolName",label:c("tools.col.tool","Tool","tools.col.tool.tooltip","Consolidated tool name in the statistics table."),sortable:!0},{key:"totalCalls",label:c("tools.col.calls","Calls","tools.col.calls.tooltip","Total number of recorded calls for this tool."),sortable:!0,width:"70px"},{key:"successCount",label:c("tools.col.ok","OK","tools.col.ok.tooltip","Number of direct successful runs."),sortable:!0,width:"70px"},{key:"fallbackCount",label:c("tools.col.fallback","FALLBACK","tools.col.fallback.tooltip","Number of runs that succeeded through fallback execution."),sortable:!0,width:"110px"},{key:"unsupportedCount",label:c("tools.col.unsupported","UNSUPPORTED","tools.col.unsupported.tooltip","Number of blocked runs without fallback execution."),sortable:!0,width:"130px"},{key:"warningCount",label:c("tools.col.warn","WARN","tools.col.warn.tooltip","Number of expected failures caused by caller input, project state, Roblox policy, or user code."),sortable:!0,width:"80px"},{key:"failureCount",label:c("tools.col.err","FAILED","tools.col.err.tooltip","Number of runs that failed."),sortable:!0,width:"70px"},{key:"avgExecutionTimeMs",label:c("tools.col.avgTime","Avg Time","tools.col.avgTime.tooltip","Average execution time across recorded calls."),sortable:!0,width:"90px",render:e=>z(e.avgExecutionTimeMs)},{key:"tier",label:c("tools.col.tier","Tier","tools.col.tierStats.tooltip","Basic, Pro, or Mixed summary for the tool statistics row."),sortable:!0,width:"70px",render:e=>s.jsx(M,{text:e.tier==="mixed"?t("tools.tier.mixed.tooltip","This tool includes both Basic and Pro actions."):"",children:s.jsx("span",{className:e.tier==="pro"?o.tierPro:e.tier==="mixed"?o.tierMixed:o.tierBasic,children:H(t,e.tier)})})}],[t,c]),w=n.useMemo(()=>{if(!i.statistics)return null;const e=i.statistics.tierSummary.basic.totalCalls,r=i.statistics.tierSummary.pro.totalCalls,l=e+r;if(l===0)return null;const m=Math.round(e/l*100),S=100-m;return{basic:e,pro:r,basicPct:m,proPct:S}},[i.statistics]),G=n.useCallback(e=>{L(r=>r===e?null:e)},[]),et=n.useCallback(async()=>{if(y){f(!0);try{y==="history"?await i.clearHistory():await i.clearStatistics(),v(t("toast.clearSuccess","Cleared successfully"),"success"),x(null)}catch{v(t("toast.clearFailed","Failed to clear data"),"error")}finally{f(!1)}}},[y,v,t,i]),st=n.useCallback(e=>{const r=e==="history"?"tools_history":"tools_statistics";a("dashboard_click_event",{click_target:e==="history"?"tools_tab_history":"tools_tab_statistics",page:"tools",tab:r}),b({page:"tools",tab:r}),E(e)},[a,b]),ot=n.useCallback(e=>{const r=je(e),l=Se(e);return s.jsxs("div",{className:o.expandedRow,children:[s.jsxs("div",{className:o.expandedSection,children:[s.jsxs("strong",{children:[s.jsx(M,{text:t("tools.detail.params.tooltip","Input parameters passed to this tool run."),children:t("tools.detail.params","Parameters")}),":"]}),s.jsx("pre",{className:o.pre,children:JSON.stringify(e.parameters,null,2)})]}),e.result&&s.jsxs("div",{className:o.expandedSection,children:[s.jsxs("strong",{children:[s.jsx(M,{text:t("tools.detail.result.tooltip","Returned result payload for this tool run."),children:t("tools.detail.result","Result")}),":"]}),s.jsx("pre",{className:o.pre,children:JSON.stringify(e.result,null,2)})]}),l?s.jsxs("div",{className:o.expandedSection,children:[s.jsx("strong",{children:t("tools.history.routing","Routing")}),s.jsxs("div",{className:o.detailList,children:[g(t("tools.history.routing.mode","Mode"),l.selectionMode),g(t("tools.history.routing.requested","Requested"),Te(l,t)),g(t("tools.history.routing.actual","Actual"),Ne(l))]})]}):null,(e.status==="fallback"||e.status==="unsupported"||e.status==="warning"||e.status==="error")&&s.jsx("div",{className:o.expandedSection,children:s.jsxs("div",{className:o.detailList,children:[e.status==="fallback"&&(r==null?void 0:r.requestedCommand)&&g(t("tools.detail.requestedCommand","Requested Command"),r.requestedCommand),e.status==="fallback"&&(r==null?void 0:r.executedCommand)&&g(t("tools.detail.executedCommand","Executed Command"),r.executedCommand),e.status==="fallback"&&(r==null?void 0:r.alternatives)&&g(t("tools.detail.alternatives","Alternatives"),r.alternatives.join(", ")),e.status==="unsupported"&&e.blockedMessage&&g(t("tools.detail.blockedMessage","Blocked Reason"),e.blockedMessage),e.status==="unsupported"&&g(t("tools.detail.noFallback","No Fallback"),t("tools.detail.noFallback.value","No fallback ran.")),e.status==="warning"&&e.warningMessage&&g(t("tools.detail.warningMessage","Warning Message"),e.warningMessage),e.status==="error"&&e.errorMessage&&g(t("tools.detail.errorMessage","Error Message"),e.errorMessage),e.status==="error"&&e.blockedMessage&&g(t("tools.detail.blockedMessage","Blocked Reason"),e.blockedMessage),e.status==="error"&&e.fallbackCommand&&g(t("tools.detail.executedCommand","Executed Command"),e.fallbackCommand)]})})]})},[t]),at=["history","statistics"].map(e=>({key:e,label:t(`tools.tab.${e}`,e.charAt(0).toUpperCase()+e.slice(1))}));return s.jsxs("div",{className:o.page,children:[s.jsx(pt,{title:t("page.tools.title","Tools"),description:t("page.tools.description","Inspect tool history, outcomes, fallback details, and usage statistics."),helpTopicId:"tools"}),s.jsx(ht,{surface:"tools",selectable:!0,selectedPlaceId:P,onSelectedPlaceIdChange:e=>{B(e),i.setHistoryOffset(0)}}),s.jsx(mt,{items:at,value:k,onChange:st}),k==="history"&&s.jsxs("div",{className:o.card,children:[s.jsxs("div",{className:o.cardToolbar,children:[s.jsx("div",{className:o.sectionTitle,children:t("tools.tab.history","History")}),s.jsx("button",{className:o.dangerButton,onClick:()=>{a("dashboard_click_event",{click_target:"tools_clear_history",page:"tools",tab:"tools_history"}),x("history")},children:t("common.clear","Clear")})]}),s.jsx("div",{className:o.filterRow,children:s.jsxs("label",{className:o.filterLabel,children:[t("tools.filter.tool","Tool"),":",s.jsxs("select",{className:o.filterSelect,value:i.historyToolFilter,onChange:e=>{i.setHistoryToolFilter(e.target.value),i.setHistoryOffset(0)},children:[s.jsx("option",{value:"",children:t("tools.filter.all","All")}),V.map(e=>s.jsx("option",{value:e,children:e},e))]})]})}),s.jsx(kt,{columns:O,data:i.history,rowKey:e=>e.id,onRowClick:e=>u(r=>r===e.id?null:e.id),emptyMessage:t("tools.empty.history","No tool history entries for this place"),expandedKey:N,renderExpandedRow:ot}),s.jsxs("div",{className:o.pagination,children:[s.jsx("button",{className:o.btn,disabled:i.historyOffset===0,title:t("tools.page.prev.tooltip","Go to the previous page of tool history results."),onClick:()=>i.setHistoryOffset(Math.max(0,i.historyOffset-K)),children:t("tools.page.prev","Prev")}),s.jsxs("span",{className:o.pageInfo,children:[i.historyOffset+1,"–",Math.min(i.historyOffset+K,i.historyTotal)," / ",i.historyTotal]}),s.jsx("button",{className:o.btn,disabled:!i.historyHasMore,title:t("tools.page.next.tooltip","Go to the next page of tool history results."),onClick:()=>i.setHistoryOffset(i.historyOffset+K),children:t("tools.page.next","Next")})]})]}),k==="statistics"&&s.jsxs("div",{className:o.card,children:[s.jsxs("div",{className:o.cardToolbar,children:[s.jsx("div",{className:o.sectionTitle,children:t("tools.tab.statistics","Statistics")}),s.jsx("button",{className:o.dangerButton,onClick:()=>{a("dashboard_click_event",{click_target:"tools_clear_statistics",page:"tools",tab:"tools_statistics"}),x("statistics")},children:t("common.clear","Clear")})]}),w&&s.jsxs("div",{className:o.tierDistribution,children:[s.jsxs("div",{className:o.tierBarWrap,children:[s.jsx("div",{className:o.tierBarBasic,style:{width:`${w.basicPct}%`}}),s.jsx("div",{className:o.tierBarPro,style:{width:`${w.proPct}%`}})]}),s.jsxs("div",{className:o.tierLabels,children:[s.jsxs("span",{children:[H(t,"basic")," ",w.basicPct,"% (",w.basic,")"]}),s.jsxs("span",{children:[H(t,"pro")," ",w.proPct,"% (",w.pro,")"]})]})]}),s.jsx("div",{className:o.statsTableWrap,children:s.jsxs("table",{className:o.statsTable,children:[s.jsx("thead",{children:s.jsx("tr",{children:A.map(e=>s.jsxs("th",{style:e.width?{width:e.width}:void 0,className:e.sortable?o.sortableHeader:void 0,onClick:e.sortable?()=>U(e.key):void 0,children:[s.jsx("span",{children:e.label}),e.sortable&&I===e.key&&s.jsx("span",{className:o.sortArrow,children:h==="asc"?"▴":"▾"})]},e.key))})}),s.jsx("tbody",{children:j.length===0?s.jsx("tr",{children:s.jsx("td",{colSpan:A.length,className:o.emptyStats,children:t("tools.empty.stats","No tool statistics for this place")})}):j.map(e=>{const r=R===e.toolName;return s.jsxs(n.Fragment,{children:[s.jsxs("tr",{className:o.statsToolRow,onClick:()=>G(e.toolName),children:[s.jsx("td",{children:s.jsxs("button",{type:"button",className:o.expandButton,"aria-expanded":r,"aria-label":`${e.toolName} ${r?t("common.collapse","Collapse"):t("common.expand","Expand")}`,onClick:l=>{l.stopPropagation(),G(e.toolName)},children:[s.jsx("span",{className:o.expandIcon,"aria-hidden":"true",children:r?"▾":"▸"}),s.jsx("span",{children:e.toolName})]})}),s.jsx("td",{children:e.totalCalls}),s.jsx("td",{children:e.successCount}),s.jsx("td",{children:e.fallbackCount}),s.jsx("td",{children:e.unsupportedCount}),s.jsx("td",{children:e.warningCount}),s.jsx("td",{children:e.failureCount}),s.jsx("td",{children:z(e.avgExecutionTimeMs)}),s.jsx("td",{children:s.jsx(M,{text:e.tier==="mixed"?t("tools.tier.mixed.tooltip","This tool includes both Basic and Pro actions."):"",children:s.jsx("span",{className:e.tier==="pro"?o.tierPro:e.tier==="mixed"?o.tierMixed:o.tierBasic,children:H(t,e.tier)})})})]}),r&&e.commands.map(l=>s.jsxs("tr",{className:o.statsActionRow,children:[s.jsx("td",{children:s.jsx("span",{className:o.actionLabel,children:l.label})}),s.jsx("td",{children:l.totalCalls}),s.jsx("td",{children:l.successCount}),s.jsx("td",{children:l.fallbackCount}),s.jsx("td",{children:l.unsupportedCount}),s.jsx("td",{children:l.warningCount}),s.jsx("td",{children:l.failureCount}),s.jsx("td",{children:z(l.avgExecutionTimeMs)}),s.jsx("td",{children:s.jsx("span",{className:l.tier==="pro"?o.tierPro:o.tierBasic,children:H(t,l.tier)})})]},`${e.toolName}:${l.commandName}`))]},e.toolName)})})]})}),i.statistics&&s.jsxs("div",{className:o.summaryLine,children:[t("tools.summary.total","Total"),": ",i.statistics.totalCalls," ",t("tools.summary.calls","calls")," | ",t("tools.summary.sessions","Sessions"),": ",i.statistics.totalSessions]})]}),s.jsx(xt,{open:y!==null,title:y==="history"?t("tools.clear.history.title","Clear history?"):t("tools.clear.statistics.title","Clear statistics?"),message:y==="history"?t("tools.clear.history.message","This permanently removes the current place tools history."):t("tools.clear.statistics.message","This permanently resets the current place tool statistics."),cancelLabel:t("common.cancel","Cancel"),confirmLabel:t("common.clear","Clear"),loading:C,onCancel:()=>!C&&x(null),onConfirm:et})]})}export{Ae as Component};
|
|
1
|
+
import{j as s,r as n,a as F,D as nt,u as ct,e as dt,l as ut}from"./index-CJJYSnlB.js";import{P as pt}from"./PageHeader-DwlcGnaB.js";import{T as M}from"./TooltipText-LAwR8aaI.js";import{C as xt}from"./ConfirmModal-knJOxPTQ.js";import{C as ht}from"./CurrentPlaceScope-BOfr5n7U.js";import{T as mt}from"./Tabs-wK2yL-C6.js";import"./ConfirmModal.module-NrFlfTWy.js";const bt="_wrapper_hzgda_2",ft="_table_hzgda_7",gt="_sortable_hzgda_32",_t="_sortArrow_hzgda_41",yt="_clickable_hzgda_52",Ct="_empty_hzgda_57",jt="_expandedRow_hzgda_65",vt="_expandedCell_hzgda_74",T={wrapper:bt,table:ft,sortable:gt,sortArrow:_t,clickable:yt,empty:Ct,expandedRow:jt,expandedCell:vt};function kt({columns:t,data:a,sortBy:b,sortDir:P="asc",onSort:B,onRowClick:i,rowKey:v,emptyMessage:k,expandedKey:E,renderExpandedRow:N}){return s.jsx("div",{className:T.wrapper,children:s.jsxs("table",{className:T.table,children:[s.jsx("thead",{children:s.jsx("tr",{children:t.map(u=>s.jsxs("th",{style:u.width?{width:u.width}:void 0,className:u.sortable?T.sortable:void 0,onClick:u.sortable&&B?()=>B(u.key):void 0,children:[s.jsx("span",{children:u.label}),u.sortable&&b===u.key&&s.jsx("span",{className:T.sortArrow,children:P==="asc"?"▴":"▾"})]},u.key))})}),s.jsx("tbody",{children:a.length===0?s.jsx("tr",{children:s.jsx("td",{colSpan:t.length,className:T.empty,children:k||"No data"})}):a.map((u,R)=>{const L=v?v(u):String(R),x=E!=null&&L===E&&N?N(u):null;return s.jsxs(n.Fragment,{children:[s.jsx("tr",{className:i?T.clickable:void 0,onClick:i?()=>i(u):void 0,children:t.map(C=>s.jsx("td",{children:C.render?C.render(u):String(u[C.key]??"")},C.key))}),x&&s.jsx("tr",{className:T.expandedRow,children:s.jsx("td",{colSpan:t.length,className:T.expandedCell,children:x})})]},L)})})]})})}function St(t){return{...t,sequenceNumber:typeof t.sequenceNumber=="number"?t.sequenceNumber:void 0,executionTimeMs:typeof t.executionTimeMs=="number"?t.executionTimeMs:void 0}}const Tt=50;function Nt(t){if(typeof t=="number")return{placeId:String(t)}}function Z(t,a){return typeof a!="number"?t:`${t}?placeId=${encodeURIComponent(String(a))}`}function wt(t){const a=(t==null?void 0:t.placeId)??null,[b,P]=n.useState(null),[B,i]=n.useState(!0),[v,k]=n.useState([]),[E,N]=n.useState(0),[u,R]=n.useState(!1),[L,y]=n.useState(!0),[x,C]=n.useState(0),[f,I]=n.useState(""),$=n.useRef(null),h=n.useCallback(async()=>{i(!0);try{const c=Nt(a),j=c?await F.get("/api/dashboard/tool-stats",c):await F.get("/api/dashboard/tool-stats");P(j)}catch{}finally{i(!1)}},[a]),_=n.useCallback(async(c,j)=>{y(!0);try{const O={limit:String(Tt),offset:String(c)};j&&(O.tool=j),typeof a=="number"&&(O.placeId=String(a));const A=await F.get("/api/dashboard/history",O);k(A.entries.map(St)),N(A.total),R(A.hasMore)}catch{k([]),N(0),R(!1)}finally{y(!1)}},[a]),U=n.useCallback(()=>{h(),_(x,f)},[_,h,x,f]),V=n.useCallback(async()=>{await F.post(Z("/api/dashboard/tools/history/clear",a)),_(x,f)},[_,x,f,a]),q=n.useCallback(async()=>{await F.post(Z("/api/dashboard/tools/statistics/clear",a)),h()},[h,a]);return n.useEffect(()=>{h()},[h]),n.useEffect(()=>{_(x,f)},[_,x,f]),n.useEffect(()=>{const c=new nt;$.current=c,c.connect();const j=c.on("command",()=>{h(),_(x,f)});return()=>{j(),c.disconnect(),$.current=null}},[_,h,x,f]),{statistics:b,statsLoading:B,history:v,historyTotal:E,historyHasMore:u,historyLoading:L,historyOffset:x,historyToolFilter:f,setHistoryOffset:C,setHistoryToolFilter:I,refresh:U,clearHistory:V,clearStatistics:q}}const Mt="_page_16x6v_2",Pt="_card_16x6v_12",Bt="_cardToolbar_16x6v_19",Et="_sectionTitle_16x6v_27",Rt="_dangerButton_16x6v_33",Lt="_proBadge_16x6v_52",It="_statusOk_16x6v_67",At="_statusFallback_16x6v_76",Ht="_statusUnsupported_16x6v_85",Ot="_statusWarning_16x6v_94",Ft="_statusError_16x6v_103",$t="_tierBasic_16x6v_113",qt="_tierPro_16x6v_117",Dt="_tierMixed_16x6v_122",Wt="_filterRow_16x6v_133",zt="_filterLabel_16x6v_140",Ut="_filterSelect_16x6v_149",Vt="_expandedRow_16x6v_160",Kt="_expandedSection_16x6v_165",Gt="_detailList_16x6v_175",Jt="_detailItem_16x6v_181",Qt="_detailLabel_16x6v_187",Zt="_detailValue_16x6v_192",Xt="_pre_16x6v_197",Yt="_pagination_16x6v_214",te="_pageInfo_16x6v_222",ee="_btn_16x6v_228",se="_tierDistribution_16x6v_251",oe="_tierBarWrap_16x6v_255",ae="_tierBarBasic_16x6v_263",re="_tierBarPro_16x6v_268",le="_tierLabels_16x6v_273",ie="_statsTableWrap_16x6v_282",ne="_statsTable_16x6v_282",ce="_sortableHeader_16x6v_313",de="_sortArrow_16x6v_318",ue="_statsToolRow_16x6v_322",pe="_statsActionRow_16x6v_330",xe="_expandButton_16x6v_334",he="_expandIcon_16x6v_346",me="_actionLabel_16x6v_351",be="_emptyStats_16x6v_358",fe="_summaryLine_16x6v_364",o={page:Mt,card:Pt,cardToolbar:Bt,sectionTitle:Et,dangerButton:Rt,proBadge:Lt,statusOk:It,statusFallback:At,statusUnsupported:Ht,statusWarning:Ot,statusError:Ft,tierBasic:$t,tierPro:qt,tierMixed:Dt,filterRow:Wt,filterLabel:zt,filterSelect:Ut,expandedRow:Vt,expandedSection:Kt,detailList:Gt,detailItem:Jt,detailLabel:Qt,detailValue:Zt,pre:Xt,pagination:Yt,pageInfo:te,btn:ee,tierDistribution:se,tierBarWrap:oe,tierBarBasic:ae,tierBarPro:re,tierLabels:le,statsTableWrap:ie,statsTable:ne,sortableHeader:ce,sortArrow:de,statsToolRow:ue,statsActionRow:pe,expandButton:xe,expandIcon:he,actionLabel:me,emptyStats:be,summaryLine:fe},K=50,ge=new Set(["clientId","placeId","pinnedTarget","recentPriority","globalQueue"]);function _e(t){const a=new Date(t);return`${String(a.getHours()).padStart(2,"0")}:${String(a.getMinutes()).padStart(2,"0")}:${String(a.getSeconds()).padStart(2,"0")}`}function z(t){return typeof t!="number"||!Number.isFinite(t)?"-":t<1e3?`${t}ms`:`${(t/1e3).toFixed(1)}s`}function H(t,a){return a==="pro"?t("tier.pro","Pro"):a==="mixed"?t("tier.mixed","Mixed"):t("tier.basic","Basic")}function tt(t,a){return a!==t&&a.startsWith(`${t}_`)?a.slice(t.length+1):""}function ye(t,a){const b=tt(t,a);return b?`${t}.${b}`:t}function X(t){return typeof t=="string"&&t.length>0?t:void 0}function Ce(t){if(!Array.isArray(t))return;const a=t.filter(b=>typeof b=="string"&&b.length>0);return a.length>0?a:void 0}function je(t){const a=t.result??{};return{requestedCommand:t.requestedCommand??X(a.requestedCommand),executedCommand:t.executedCommand??X(a.executedCommand),alternatives:t.alternatives??Ce(a.alternatives)}}function ve(t,a){switch(t.status){case"fallback":return{label:a("tools.badge.fallback","FALLBACK"),tooltip:a("tools.badge.fallback.tooltip","The requested Pro action succeeded via a Basic fallback."),className:o.statusFallback};case"unsupported":return{label:a("tools.badge.unsupported","UNSUPPORTED"),tooltip:a("tools.badge.unsupported.tooltip","The requested Pro action was blocked and no fallback ran."),className:o.statusUnsupported};case"warning":return{label:a("tools.badge.warn","WARN"),tooltip:a("tools.badge.warn.tooltip","The tool call failed as an expected caller, project, policy, or user-code issue."),className:o.statusWarning};case"error":return{label:a("tools.badge.err","FAILED"),tooltip:a("tools.badge.err.tooltip","The tool run failed."),className:o.statusError};default:return{label:a("tools.status.ok","OK"),tooltip:a("tools.status.ok.tooltip","The tool run completed successfully."),className:o.statusOk}}}function g(t,a){return s.jsxs("div",{className:o.detailItem,children:[s.jsx("span",{className:o.detailLabel,children:t}),s.jsx("span",{className:o.detailValue,children:a})]})}function ke(t){if(!t||typeof t!="object")return;const a=t;if(typeof a.selectionMode=="string"&&ge.has(a.selectionMode))return a}function Y(t){if(!(!t||typeof t!="object"||!("routing"in t)))return ke(t.routing)}function Se(t){return t.routing??Y(t.result)??Y(t.data)}function Te(t,a){return t.requestedClientId?t.requestedClientId:t.requestedPlaceId!==void 0?t.requestedPlaceId:a("tools.history.routing.none","No Studio target named")}function Ne(t){return t.actualPlaceName?`${t.actualPlaceName} · ${t.actualPlaceId??"-"}`:t.actualClientId??"-"}function Ae(){const{t}=ct(),{trackEvent:a,trackPageView:b}=dt(),[P,B]=n.useState(null),i=wt({placeId:P}),{show:v}=ut(),[k,E]=n.useState("history"),[N,u]=n.useState(null),[R,L]=n.useState(null),[y,x]=n.useState(null),[C,f]=n.useState(!1),[I,$]=n.useState("totalCalls"),[h,_]=n.useState("desc"),U=n.useCallback(e=>{$(r=>r===e?(_(l=>l==="asc"?"desc":"asc"),e):(_("desc"),e))},[]),V=n.useMemo(()=>{var r;const e=new Set;return Object.keys(((r=i.statistics)==null?void 0:r.tools)??{}).forEach(l=>e.add(l)),i.history.forEach(l=>{l.tool&&e.add(l.tool)}),i.historyToolFilter&&e.add(i.historyToolFilter),Array.from(e).sort()},[i.history,i.historyToolFilter,i.statistics]),q=n.useMemo(()=>{var e;return(e=i.statistics)!=null&&e.tools?Object.values(i.statistics.tools).map(r=>{var Q;const l=Object.entries(r.commands??{}).map(([p,d])=>({toolName:r.tool,commandName:d.command??p,label:tt(r.tool,d.command??p)||(d.command??p),tier:d.tier,totalCalls:d.totalCalls,successCount:d.successCount,fallbackCount:d.fallbackCount,unsupportedCount:d.unsupportedCount,warningCount:d.warningCount??0,failureCount:d.failureCount,totalExecutionTimeMs:d.totalExecutionTimeMs,avgExecutionTimeMs:d.avgExecutionTimeMs})),m=l.reduce((p,d)=>p+d.totalCalls,0),S=l.reduce((p,d)=>p+d.successCount,0),D=l.reduce((p,d)=>p+d.fallbackCount,0),W=l.reduce((p,d)=>p+d.unsupportedCount,0),rt=l.reduce((p,d)=>p+d.warningCount,0),lt=l.reduce((p,d)=>p+d.failureCount,0),J=l.reduce((p,d)=>p+d.totalExecutionTimeMs,0),it=new Set(l.map(p=>p.tier)).size>1?"mixed":((Q=l[0])==null?void 0:Q.tier)??r.tier;return{toolName:r.tool,tier:it,commands:l,totalCalls:m,successCount:S,fallbackCount:D,unsupportedCount:W,warningCount:rt,failureCount:lt,totalExecutionTimeMs:J,avgExecutionTimeMs:m>0?Math.round(J/m):0}}):[]},[i.statistics]),c=n.useCallback((e,r,l,m)=>s.jsx(M,{text:t(l,m),children:t(e,r)}),[t]),j=n.useMemo(()=>[...q].sort((r,l)=>{const m=r[I],S=l[I];if(typeof m=="number"&&typeof S=="number")return h==="asc"?m-S:S-m;const D=String(m??""),W=String(S??"");return h==="asc"?D.localeCompare(W):W.localeCompare(D)}),[q,I,h]),O=n.useMemo(()=>[{key:"timestamp",label:c("tools.col.time","Time","tools.col.time.tooltip","When the tool run was recorded."),width:"80px",render:e=>_e(e.timestamp)},{key:"toolName",label:c("tools.col.toolAction","Tool.Action","tools.col.toolAction.tooltip","Tool name and action that were executed."),render:e=>s.jsxs("span",{children:[ye(e.tool,e.command),e.tier==="pro"&&s.jsx(M,{text:t("tools.badge.pro.tooltip","This entry used a Pro-only tool or action."),children:s.jsx("span",{className:o.proBadge,children:t("tools.badge.pro","PRO")})})]})},{key:"executionTimeMs",label:c("tools.col.duration","Duration","tools.col.duration.tooltip","How long the tool took to finish."),width:"80px",render:e=>z(e.executionTimeMs)},{key:"status",label:c("tools.col.status","Status","tools.col.status.tooltip","Outcome of the recorded tool run."),width:"120px",render:e=>{const r=ve(e,t);return s.jsx(M,{text:r.tooltip,children:s.jsx("span",{className:r.className,children:r.label})})}},{key:"tier",label:c("tools.col.tier","Tier","tools.col.tier.tooltip","License tier required for the tool or action."),width:"60px",render:e=>s.jsx("span",{className:e.tier==="pro"?o.tierPro:o.tierBasic,children:H(t,e.tier)})}],[t,c]),A=n.useMemo(()=>[{key:"toolName",label:c("tools.col.tool","Tool","tools.col.tool.tooltip","Consolidated tool name in the statistics table."),sortable:!0},{key:"totalCalls",label:c("tools.col.calls","Calls","tools.col.calls.tooltip","Total number of recorded calls for this tool."),sortable:!0,width:"70px"},{key:"successCount",label:c("tools.col.ok","OK","tools.col.ok.tooltip","Number of direct successful runs."),sortable:!0,width:"70px"},{key:"fallbackCount",label:c("tools.col.fallback","FALLBACK","tools.col.fallback.tooltip","Number of runs that succeeded through fallback execution."),sortable:!0,width:"110px"},{key:"unsupportedCount",label:c("tools.col.unsupported","UNSUPPORTED","tools.col.unsupported.tooltip","Number of blocked runs without fallback execution."),sortable:!0,width:"130px"},{key:"warningCount",label:c("tools.col.warn","WARN","tools.col.warn.tooltip","Number of expected failures caused by caller input, project state, Roblox policy, or user code."),sortable:!0,width:"80px"},{key:"failureCount",label:c("tools.col.err","FAILED","tools.col.err.tooltip","Number of runs that failed."),sortable:!0,width:"70px"},{key:"avgExecutionTimeMs",label:c("tools.col.avgTime","Avg Time","tools.col.avgTime.tooltip","Average execution time across recorded calls."),sortable:!0,width:"90px",render:e=>z(e.avgExecutionTimeMs)},{key:"tier",label:c("tools.col.tier","Tier","tools.col.tierStats.tooltip","Basic, Pro, or Mixed summary for the tool statistics row."),sortable:!0,width:"70px",render:e=>s.jsx(M,{text:e.tier==="mixed"?t("tools.tier.mixed.tooltip","This tool includes both Basic and Pro actions."):"",children:s.jsx("span",{className:e.tier==="pro"?o.tierPro:e.tier==="mixed"?o.tierMixed:o.tierBasic,children:H(t,e.tier)})})}],[t,c]),w=n.useMemo(()=>{if(!i.statistics)return null;const e=i.statistics.tierSummary.basic.totalCalls,r=i.statistics.tierSummary.pro.totalCalls,l=e+r;if(l===0)return null;const m=Math.round(e/l*100),S=100-m;return{basic:e,pro:r,basicPct:m,proPct:S}},[i.statistics]),G=n.useCallback(e=>{L(r=>r===e?null:e)},[]),et=n.useCallback(async()=>{if(y){f(!0);try{y==="history"?await i.clearHistory():await i.clearStatistics(),v(t("toast.clearSuccess","Cleared successfully"),"success"),x(null)}catch{v(t("toast.clearFailed","Failed to clear data"),"error")}finally{f(!1)}}},[y,v,t,i]),st=n.useCallback(e=>{const r=e==="history"?"tools_history":"tools_statistics";a("dashboard_click_event",{click_target:e==="history"?"tools_tab_history":"tools_tab_statistics",page:"tools",tab:r}),b({page:"tools",tab:r}),E(e)},[a,b]),ot=n.useCallback(e=>{const r=je(e),l=Se(e);return s.jsxs("div",{className:o.expandedRow,children:[s.jsxs("div",{className:o.expandedSection,children:[s.jsxs("strong",{children:[s.jsx(M,{text:t("tools.detail.params.tooltip","Input parameters passed to this tool run."),children:t("tools.detail.params","Parameters")}),":"]}),s.jsx("pre",{className:o.pre,children:JSON.stringify(e.parameters,null,2)})]}),e.result&&s.jsxs("div",{className:o.expandedSection,children:[s.jsxs("strong",{children:[s.jsx(M,{text:t("tools.detail.result.tooltip","Returned result payload for this tool run."),children:t("tools.detail.result","Result")}),":"]}),s.jsx("pre",{className:o.pre,children:JSON.stringify(e.result,null,2)})]}),l?s.jsxs("div",{className:o.expandedSection,children:[s.jsx("strong",{children:t("tools.history.routing","Routing")}),s.jsxs("div",{className:o.detailList,children:[g(t("tools.history.routing.mode","Mode"),l.selectionMode),g(t("tools.history.routing.requested","Requested"),Te(l,t)),g(t("tools.history.routing.actual","Actual"),Ne(l))]})]}):null,(e.status==="fallback"||e.status==="unsupported"||e.status==="warning"||e.status==="error")&&s.jsx("div",{className:o.expandedSection,children:s.jsxs("div",{className:o.detailList,children:[e.status==="fallback"&&(r==null?void 0:r.requestedCommand)&&g(t("tools.detail.requestedCommand","Requested Command"),r.requestedCommand),e.status==="fallback"&&(r==null?void 0:r.executedCommand)&&g(t("tools.detail.executedCommand","Executed Command"),r.executedCommand),e.status==="fallback"&&(r==null?void 0:r.alternatives)&&g(t("tools.detail.alternatives","Alternatives"),r.alternatives.join(", ")),e.status==="unsupported"&&e.blockedMessage&&g(t("tools.detail.blockedMessage","Blocked Reason"),e.blockedMessage),e.status==="unsupported"&&g(t("tools.detail.noFallback","No Fallback"),t("tools.detail.noFallback.value","No fallback ran.")),e.status==="warning"&&e.warningMessage&&g(t("tools.detail.warningMessage","Warning Message"),e.warningMessage),e.status==="error"&&e.errorMessage&&g(t("tools.detail.errorMessage","Error Message"),e.errorMessage),e.status==="error"&&e.blockedMessage&&g(t("tools.detail.blockedMessage","Blocked Reason"),e.blockedMessage),e.status==="error"&&e.fallbackCommand&&g(t("tools.detail.executedCommand","Executed Command"),e.fallbackCommand)]})})]})},[t]),at=["history","statistics"].map(e=>({key:e,label:t(`tools.tab.${e}`,e.charAt(0).toUpperCase()+e.slice(1))}));return s.jsxs("div",{className:o.page,children:[s.jsx(pt,{title:t("page.tools.title","Tools"),description:t("page.tools.description","Inspect tool history, outcomes, fallback details, and usage statistics."),helpTopicId:"tools"}),s.jsx(ht,{surface:"tools",selectable:!0,selectedPlaceId:P,onSelectedPlaceIdChange:e=>{B(e),i.setHistoryOffset(0)}}),s.jsx(mt,{items:at,value:k,onChange:st}),k==="history"&&s.jsxs("div",{className:o.card,children:[s.jsxs("div",{className:o.cardToolbar,children:[s.jsx("div",{className:o.sectionTitle,children:t("tools.tab.history","History")}),s.jsx("button",{className:o.dangerButton,onClick:()=>{a("dashboard_click_event",{click_target:"tools_clear_history",page:"tools",tab:"tools_history"}),x("history")},children:t("common.clear","Clear")})]}),s.jsx("div",{className:o.filterRow,children:s.jsxs("label",{className:o.filterLabel,children:[t("tools.filter.tool","Tool"),":",s.jsxs("select",{className:o.filterSelect,value:i.historyToolFilter,onChange:e=>{i.setHistoryToolFilter(e.target.value),i.setHistoryOffset(0)},children:[s.jsx("option",{value:"",children:t("tools.filter.all","All")}),V.map(e=>s.jsx("option",{value:e,children:e},e))]})]})}),s.jsx(kt,{columns:O,data:i.history,rowKey:e=>e.id,onRowClick:e=>u(r=>r===e.id?null:e.id),emptyMessage:t("tools.empty.history","No tool history entries for this place"),expandedKey:N,renderExpandedRow:ot}),s.jsxs("div",{className:o.pagination,children:[s.jsx("button",{className:o.btn,disabled:i.historyOffset===0,title:t("tools.page.prev.tooltip","Go to the previous page of tool history results."),onClick:()=>i.setHistoryOffset(Math.max(0,i.historyOffset-K)),children:t("tools.page.prev","Prev")}),s.jsxs("span",{className:o.pageInfo,children:[i.historyOffset+1,"–",Math.min(i.historyOffset+K,i.historyTotal)," / ",i.historyTotal]}),s.jsx("button",{className:o.btn,disabled:!i.historyHasMore,title:t("tools.page.next.tooltip","Go to the next page of tool history results."),onClick:()=>i.setHistoryOffset(i.historyOffset+K),children:t("tools.page.next","Next")})]})]}),k==="statistics"&&s.jsxs("div",{className:o.card,children:[s.jsxs("div",{className:o.cardToolbar,children:[s.jsx("div",{className:o.sectionTitle,children:t("tools.tab.statistics","Statistics")}),s.jsx("button",{className:o.dangerButton,onClick:()=>{a("dashboard_click_event",{click_target:"tools_clear_statistics",page:"tools",tab:"tools_statistics"}),x("statistics")},children:t("common.clear","Clear")})]}),w&&s.jsxs("div",{className:o.tierDistribution,children:[s.jsxs("div",{className:o.tierBarWrap,children:[s.jsx("div",{className:o.tierBarBasic,style:{width:`${w.basicPct}%`}}),s.jsx("div",{className:o.tierBarPro,style:{width:`${w.proPct}%`}})]}),s.jsxs("div",{className:o.tierLabels,children:[s.jsxs("span",{children:[H(t,"basic")," ",w.basicPct,"% (",w.basic,")"]}),s.jsxs("span",{children:[H(t,"pro")," ",w.proPct,"% (",w.pro,")"]})]})]}),s.jsx("div",{className:o.statsTableWrap,children:s.jsxs("table",{className:o.statsTable,children:[s.jsx("thead",{children:s.jsx("tr",{children:A.map(e=>s.jsxs("th",{style:e.width?{width:e.width}:void 0,className:e.sortable?o.sortableHeader:void 0,onClick:e.sortable?()=>U(e.key):void 0,children:[s.jsx("span",{children:e.label}),e.sortable&&I===e.key&&s.jsx("span",{className:o.sortArrow,children:h==="asc"?"▴":"▾"})]},e.key))})}),s.jsx("tbody",{children:j.length===0?s.jsx("tr",{children:s.jsx("td",{colSpan:A.length,className:o.emptyStats,children:t("tools.empty.stats","No tool statistics for this place")})}):j.map(e=>{const r=R===e.toolName;return s.jsxs(n.Fragment,{children:[s.jsxs("tr",{className:o.statsToolRow,onClick:()=>G(e.toolName),children:[s.jsx("td",{children:s.jsxs("button",{type:"button",className:o.expandButton,"aria-expanded":r,"aria-label":`${e.toolName} ${r?t("common.collapse","Collapse"):t("common.expand","Expand")}`,onClick:l=>{l.stopPropagation(),G(e.toolName)},children:[s.jsx("span",{className:o.expandIcon,"aria-hidden":"true",children:r?"▾":"▸"}),s.jsx("span",{children:e.toolName})]})}),s.jsx("td",{children:e.totalCalls}),s.jsx("td",{children:e.successCount}),s.jsx("td",{children:e.fallbackCount}),s.jsx("td",{children:e.unsupportedCount}),s.jsx("td",{children:e.warningCount}),s.jsx("td",{children:e.failureCount}),s.jsx("td",{children:z(e.avgExecutionTimeMs)}),s.jsx("td",{children:s.jsx(M,{text:e.tier==="mixed"?t("tools.tier.mixed.tooltip","This tool includes both Basic and Pro actions."):"",children:s.jsx("span",{className:e.tier==="pro"?o.tierPro:e.tier==="mixed"?o.tierMixed:o.tierBasic,children:H(t,e.tier)})})})]}),r&&e.commands.map(l=>s.jsxs("tr",{className:o.statsActionRow,children:[s.jsx("td",{children:s.jsx("span",{className:o.actionLabel,children:l.label})}),s.jsx("td",{children:l.totalCalls}),s.jsx("td",{children:l.successCount}),s.jsx("td",{children:l.fallbackCount}),s.jsx("td",{children:l.unsupportedCount}),s.jsx("td",{children:l.warningCount}),s.jsx("td",{children:l.failureCount}),s.jsx("td",{children:z(l.avgExecutionTimeMs)}),s.jsx("td",{children:s.jsx("span",{className:l.tier==="pro"?o.tierPro:o.tierBasic,children:H(t,l.tier)})})]},`${e.toolName}:${l.commandName}`))]},e.toolName)})})]})}),i.statistics&&s.jsxs("div",{className:o.summaryLine,children:[t("tools.summary.total","Total"),": ",i.statistics.totalCalls," ",t("tools.summary.calls","calls")," | ",t("tools.summary.sessions","Sessions"),": ",i.statistics.totalSessions]})]}),s.jsx(xt,{open:y!==null,title:y==="history"?t("tools.clear.history.title","Clear history?"):t("tools.clear.statistics.title","Clear statistics?"),message:y==="history"?t("tools.clear.history.message","This permanently removes the current place tools history."):t("tools.clear.statistics.message","This permanently resets the current place tool statistics."),cancelLabel:t("common.cancel","Cancel"),confirmLabel:t("common.clear","Clear"),loading:C,onCancel:()=>!C&&x(null),onConfirm:et})]})}export{Ae as Component};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{j as r,k as s}from"./index-
|
|
1
|
+
import{j as r,k as s}from"./index-CJJYSnlB.js";function p({text:o,children:t}){return r.jsx(s,{text:o,children:t})}export{p as T};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{i as xe,n as q,q as Le,r as g,u as M,j as t,e as H,R as $e,X as Ee,T as Se,h as He,t as Oe}from"./index-
|
|
1
|
+
import{i as xe,n as q,q as Le,r as g,u as M,j as t,e as H,R as $e,X as Ee,T as Se,h as He,t as Oe}from"./index-CJJYSnlB.js";import{I as G}from"./InfoLabel-DwsCwdUw.js";import{T as y}from"./TooltipText-LAwR8aaI.js";import{D as se,c as oe,e as Fe,g as Ue,h as ze,i as le,j as je,k as qe,l as ce,d as Ve}from"./sample-requests-tNeuJCdB.js";import{T as We}from"./Tabs-wK2yL-C6.js";import{P as Ke}from"./PageHeader-DwlcGnaB.js";import{C as Qe}from"./CurrentPlaceScope-BOfr5n7U.js";/**
|
|
2
2
|
* @license lucide-react v1.8.0 - ISC
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the ISC license.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{u,j as e,G as y,r as N,H as w}from"./index-
|
|
1
|
+
import{u,j as e,G as y,r as N,H as w}from"./index-CJJYSnlB.js";import{P as x}from"./PageHeader-DwlcGnaB.js";const j="_card_f20gt_2",C="_cardUnread_f20gt_15",R="_cardRead_f20gt_20",k="_topRow_f20gt_25",v="_categoryChip_f20gt_32",b="_versionChip_f20gt_45",S="_date_f20gt_57",T="_title_f20gt_65",E="_body_f20gt_74",A="_linkList_f20gt_82",U="_link_f20gt_82",B="_newBadge_f20gt_104",a={card:j,cardUnread:C,cardRead:R,topRow:k,categoryChip:v,versionChip:b,date:S,title:T,body:E,linkList:A,link:U,newBadge:B},L={release:"whatsNew.category.release",notice:"whatsNew.category.notice",deprecation:"whatsNew.category.deprecation",tip:"whatsNew.category.tip"};function f({announcement:s,isNew:p}){const{locale:r,t:o}=u(),i=p?a.cardUnread:a.cardRead,g=s.title[r]??s.title.en,l=s.body[r]??s.body.en,d=s.links??(s.link?[s.link]:[]),h=n=>typeof n=="string"?n:n[r]??n.en;return e.jsxs("div",{className:`${a.card} ${i}`,children:[e.jsxs("div",{className:a.topRow,children:[e.jsx("span",{className:a.categoryChip,children:o(L[s.category])}),s.version&&e.jsx("span",{className:a.versionChip,children:s.version}),p&&e.jsx("span",{className:a.newBadge,children:o("whatsNew.newBadge","NEW")}),e.jsx("span",{className:a.date,children:s.date})]}),e.jsx("h3",{className:a.title,children:g}),e.jsx("p",{className:a.body,children:l}),d.length>0&&e.jsx("div",{className:a.linkList,children:d.map(n=>{const _=h(n.url),t=h(n.label);return e.jsxs("a",{className:a.link,href:_,target:"_blank",rel:"noopener noreferrer",children:["↗"," ",t]},_)})})]})}const $="_page_1talg_2",M="_section_1talg_10",z="_sectionTitle_1talg_16",H="_unreadCount_1talg_28",P="_empty_1talg_43",W="_divider_1talg_51",c={page:$,section:M,sectionTitle:z,unreadCount:H,empty:P,divider:W};function O(){const{t:s}=u(),{readSet:p,markRead:r}=y(),o=N.useMemo(()=>{const t=[];for(const m of w)p.has(m.id)||t.push(m.id);return t},[]),i=N.useRef(o);i.current=o,N.useEffect(()=>()=>{i.current.length>0&&r(i.current)},[]);const g=N.useMemo(()=>new Set(o),[o]),l=w.filter(t=>g.has(t.id)),d=w.filter(t=>!g.has(t.id)),h=l.length>0,n=d.length>0,_=e.jsx(x,{title:s("whatsNew.pageTitle","What's New"),description:s("whatsNew.pageSubtitle","Stay up to date with MCP changes"),helpTopicId:"whatsNew"});return w.length===0?e.jsxs("div",{className:c.page,children:[_,e.jsx("p",{className:c.empty,children:s("whatsNew.empty","No announcements yet")})]}):e.jsxs("div",{className:c.page,children:[_,h&&e.jsxs("section",{className:c.section,children:[e.jsxs("h2",{className:c.sectionTitle,children:[s("whatsNew.unreadSection","Unread"),e.jsx("span",{className:c.unreadCount,children:l.length})]}),l.map(t=>e.jsx(f,{announcement:t,isNew:!0},`unread-${t.id}`))]}),h&&n&&e.jsx("hr",{className:c.divider}),n&&e.jsxs("section",{className:c.section,children:[e.jsx("h2",{className:c.sectionTitle,children:s("whatsNew.allSection","All Announcements")}),d.map(t=>e.jsx(f,{announcement:t,isNew:!1},`all-${t.id}`))]})]})}export{O as Component};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/OverviewPage-
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/OverviewPage-9cIh9Q5a.js","assets/InfoLabel-DwsCwdUw.js","assets/PageHeader-DwlcGnaB.js","assets/PageHeader-2-fusgsY.css","assets/StatusBadge-CYejTjWf.js","assets/StatusBadge-C2zYt5iE.css","assets/TooltipText-LAwR8aaI.js","assets/GameChangeDetail-sTt5o48Z.js","assets/GameChangeDetail-C1XtdYwk.css","assets/useLiveUptime-DM28rhji.js","assets/OverviewPage-Dsfl-NRT.css","assets/ConnectionPage-BkkqcLRE.js","assets/ConfirmModal-knJOxPTQ.js","assets/ConfirmModal.module-NrFlfTWy.js","assets/ConfirmModal-D1kfK31C.css","assets/copy-DwoEPqC3.js","assets/ConnectionPage-D1GWlHZP.css","assets/SyncPage-CHe2NPfN.js","assets/CurrentPlaceScope-BOfr5n7U.js","assets/CurrentPlaceScope-v3pl1mLI.css","assets/SyncPage-COxqxAjv.css","assets/AssetsPage-CqgdG2Ni.js","assets/AssetsPage-Be5aZDhj.css","assets/ChangelogPage-BqASaB-l.js","assets/Tabs-wK2yL-C6.js","assets/Tabs-876h0_zB.css","assets/ChangelogPage-DsP0fTsc.css","assets/PlaytestPage-BeRZc6wz.js","assets/PlaytestPage-DjjsIkke.css","assets/UiStudioPage-xZ96a4BR.js","assets/sample-requests-tNeuJCdB.js","assets/sample-requests-CygerZZ_.css","assets/UiStudioPage-eSinjpOX.css","assets/ToolsPage-Cq8crPCz.js","assets/ToolsPage-Bt9vYA7u.css","assets/ControlsPage-da-JrES8.js","assets/useSettings-CYVeWZ0i.js","assets/useSettings-Bsfu70PT.css","assets/WhatsNewPage-B9st_b8H.js","assets/WhatsNewPage-BIYOEZg3.css","assets/ChangelogDetailPage-DTl_Tw_v.js","assets/ChangelogDetailPage-D6Tqz7ut.css","assets/SettingsPage-BiCf2ur7.js","assets/SettingsPage-DSipzuEo.css"])))=>i.map(i=>d[i]);
|
|
2
2
|
var jh=Object.defineProperty;var Hh=(i,n,r)=>n in i?jh(i,n,{enumerable:!0,configurable:!0,writable:!0,value:r}):i[n]=r;var Io=(i,n,r)=>Hh(i,typeof n!="symbol"?n+"":n,r);function mp(i,n){for(var r=0;r<n.length;r++){const d=n[r];if(typeof d!="string"&&!Array.isArray(d)){for(const u in d)if(u!=="default"&&!(u in i)){const p=Object.getOwnPropertyDescriptor(d,u);p&&Object.defineProperty(i,u,p.get?p:{enumerable:!0,get:()=>d[u]})}}}return Object.freeze(Object.defineProperty(i,Symbol.toStringTag,{value:"Module"}))}(function(){const n=document.createElement("link").relList;if(n&&n.supports&&n.supports("modulepreload"))return;for(const u of document.querySelectorAll('link[rel="modulepreload"]'))d(u);new MutationObserver(u=>{for(const p of u)if(p.type==="childList")for(const g of p.addedNodes)g.tagName==="LINK"&&g.rel==="modulepreload"&&d(g)}).observe(document,{childList:!0,subtree:!0});function r(u){const p={};return u.integrity&&(p.integrity=u.integrity),u.referrerPolicy&&(p.referrerPolicy=u.referrerPolicy),u.crossOrigin==="use-credentials"?p.credentials="include":u.crossOrigin==="anonymous"?p.credentials="omit":p.credentials="same-origin",p}function d(u){if(u.ep)return;u.ep=!0;const p=r(u);fetch(u.href,p)}})();function yp(i){return i&&i.__esModule&&Object.prototype.hasOwnProperty.call(i,"default")?i.default:i}var bl={exports:{}},es={},Pl={exports:{}},xe={};/**
|
|
3
3
|
* @license React
|
|
4
4
|
* react.production.min.js
|
|
@@ -311,7 +311,7 @@ Ceci est un exemple d’aperçu. Passez à Pro pour exécuter des tests de jeu e
|
|
|
311
311
|
*
|
|
312
312
|
* This source code is licensed under the ISC license.
|
|
313
313
|
* See the LICENSE file in the root directory of this source tree.
|
|
314
|
-
*/const pS=[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]],gS=Ke("x",pS),Fp=[{labelKey:"sidebar.overview",route:"/",icon:Yf,minLevel:"disconnected",lazy:()=>Kt(()=>import("./OverviewPage-lOYmwxzd.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10]))},{labelKey:"sidebar.connection",route:"/connection",icon:iS,minLevel:"disconnected",lazy:()=>Kt(()=>import("./ConnectionPage-Dskqof1W.js"),__vite__mapDeps([11,1,2,3,4,5,6,12,13,14,9,15,16]))},{labelKey:"sidebar.sync",route:"/sync",icon:Bp,minLevel:"serverOnly",lazy:()=>Kt(()=>import("./SyncPage-BFsgItgP.js"),__vite__mapDeps([17,2,3,1,6,12,13,14,18,19,4,5,20]))},{labelKey:"sidebar.assets",route:"/assets",icon:oS,minLevel:"serverOnly",lazy:()=>Kt(()=>import("./AssetsPage-CC3FW3XG.js"),__vite__mapDeps([21,12,13,14,2,3,6,15,22]))},{labelKey:"sidebar.changelog",route:"/changelog",icon:qf,minLevel:"serverOnly",lazy:()=>Kt(()=>import("./ChangelogPage-CbfWdVtL.js"),__vite__mapDeps([23,2,3,12,13,14,18,19,6,24,25,26]))},{labelKey:"sidebar.playtest",route:"/playtest",icon:Nf,minLevel:"serverOnly",lazy:()=>Kt(()=>import("./PlaytestPage-CKcxZyhl.js"),__vite__mapDeps([27,2,3,1,18,19,6,12,13,14,28]))},{labelKey:"sidebar.ui_studio",route:"/ui-studio",icon:Wf,minLevel:"serverOnly",lazy:()=>Kt(()=>import("./UiStudioPage-RAd0qXzL.js"),__vite__mapDeps([29,1,6,30,31,24,25,2,3,18,19,32]))},{labelKey:"sidebar.tools",route:"/tools",icon:cS,minLevel:"serverOnly",lazy:()=>Kt(()=>import("./ToolsPage-DHhF-Y_W.js"),__vite__mapDeps([33,2,3,6,12,13,14,18,19,24,25,34]))}],ql=[{labelKey:"sidebar.controls",route:"/controls",icon:Wp,minLevel:"serverOnly",lazy:()=>Kt(()=>import("./ControlsPage-C_38U6b0.js"),__vite__mapDeps([35,2,3,1,13,14,6,36,37,15]))},{labelKey:"sidebar.whatsNew",route:"/whats-new",icon:wf,minLevel:"disconnected",lazy:()=>Kt(()=>import("./WhatsNewPage-CLnx6v4u.js"),__vite__mapDeps([38,2,3,39]))}],jl="https://github.com/hope1026/weppy-roblox-mcp",hS="https://weppyai.com";function Bl(i){return i?/Mac OS X|Macintosh/i.test(i)?"macOS":/Windows NT/i.test(i)?"Windows":/Linux/i.test(i)?"Linux":"":""}function Kp(i){var v,P,C,D,H;const n=Bl(typeof navigator<"u"?navigator.userAgent:""),r=i.status,d=(r==null?void 0:r.version)??"",u=((P=(v=r==null?void 0:r.pluginClients)==null?void 0:v[0])==null?void 0:P.pluginVersion)??"",p=((D=(C=r==null?void 0:r.pluginClients)==null?void 0:C[0])==null?void 0:D.studioVersion)??"",g=d||u||p?[d?`MCP ${d}`:"",u?`Plugin ${u}`:"",p?`Studio ${p}`:""].filter(Boolean).join(" / "):"",y=((H=r==null?void 0:r.aiClientNames)==null?void 0:H[0])??"",h=(r==null?void 0:r.nodeVersion)??"";return{os:n,nodeVersion:h,aiClient:y,pluginVersionLabel:g}}function mS(i){const{os:n,nodeVersion:r,aiClient:d,pluginVersionLabel:u}=Kp(i),p=new URLSearchParams;return p.set("template","bug_report.yml"),n&&p.set("os",n),r&&p.set("node",r),d&&p.set("ai-client",d),u&&p.set("plugin-version",u),p.toString()}function yS(i){const{os:n,nodeVersion:r,aiClient:d,pluginVersionLabel:u}=Kp(i),p=new URLSearchParams;return p.set("template","install_help.yml"),n&&p.set("os",n),r&&p.set("node",r),d&&p.set("ai-client",d),u&&p.set("plugin-version",u),p.toString()}const fS=[{id:"bug",labelKey:"sidebar.help.bug",tooltipKey:"sidebar.help.bug.tooltip",icon:Af,buildUrl:i=>`${jl}/issues/new?${mS(i)}`},{id:"feature",labelKey:"sidebar.help.feature",tooltipKey:"sidebar.help.feature.tooltip",icon:Gf,buildUrl:()=>`${jl}/issues/new?template=feature_request.yml`},{id:"discussions",labelKey:"sidebar.help.discussions",tooltipKey:"sidebar.help.discussions.tooltip",icon:Qf,buildUrl:i=>`${jl}/issues/new?${yS(i)}`},{id:"troubleshooting",labelKey:"sidebar.help.troubleshooting",tooltipKey:"sidebar.help.troubleshooting.tooltip",icon:xf,buildUrl:i=>`${hS}/${i.locale}/docs/troubleshooting/`}];function SS(){const[i,n]=R.useState("basic"),[r,d]=R.useState(0),[u,p]=R.useState(0),[g,y]=R.useState(0),[h,v]=R.useState(!0);R.useEffect(()=>{let C=!1;async function D(){try{return await Np("auto")}catch{return null}}async function H(){var N,te;try{const[K,X]=await Promise.all([D(),Et.get("/api/dashboard/tool-stats").catch(()=>null)]);if(C)return;if(K!=null&&K.tier&&n(K.tier),X!=null&&X.tierSummary){const V=((N=X.tierSummary.basic)==null?void 0:N.totalCalls)??0,he=((te=X.tierSummary.pro)==null?void 0:te.totalCalls)??0;y(V),p(he),d(V+he)}}catch{}finally{C||v(!1)}}H();const B=new Zl;B.connect();const M=B.on("license",()=>{D().then(N=>{!C&&(N!=null&&N.tier)&&n(N.tier)})});return()=>{C=!0,M(),B.disconnect()}},[]);const P=r>0?u/r*100:0;return{tier:i,proUsagePercent:P,totalCalls:r,proCalls:u,basicCalls:g,loading:h}}const vS="https://weppyai.com/plans/";function Ra(i){const n=new URLSearchParams({utm_source:"weppy_dashboard",utm_medium:"app",utm_campaign:"pro_upgrade",utm_content:i});return`${vS}?${n.toString()}`}const bS={sidebarUpgrade:Ra("sidebar_upgrade"),settingsLicense:Ra("settings_license"),sync:Ra("sync_tier_panel"),changelog:Ra("changelog_limit_notice"),playtest:Ra("playtest_sample_banner"),uiStudioAnalysis:Ra("ui_studio_analysis_banner"),uiStudioHistory:Ra("ui_studio_history_banner")},PS=5e3,CS=5;function wS(i){return i.replace(/^\//,"").split("/")[0]||"overview"}function kS(i,n){const r=new URLSearchParams(n);if(i==="ui-studio")return r.get("tab")==="history"?"ui_studio_history":"ui_studio_analysis";if(i==="tools")return"tools_history";if(i==="changelog")return"changelog_all"}function ds(i,n){const r=wS(i);if(n===void 0)return r;const d=kS(r,n);return d?{page:r,tab:d}:{page:r}}let ci=[],np=null;function Yp(){if(ci.length===0)return;const i=ci.splice(0),n=`${zn}/api/dashboard/analytics`,r=JSON.stringify({events:i});fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:r}).catch(()=>{})}function xS(){np||(np=setInterval(Yp,PS))}function rp(i){ci.push(i),xS(),ci.length>=CS&&Yp()}typeof window<"u"&&window.addEventListener("beforeunload",()=>{if(ci.length===0)return;const i=`${zn}/api/dashboard/analytics`,n=JSON.stringify({events:ci.splice(0)});navigator.sendBeacon(i,new Blob([n],{type:"application/json"}))});function us(){const i=R.useCallback((r,d)=>{rp({name:r,params:d})},[]),n=R.useCallback(r=>{rp({name:"dashboard_page_view",params:{...typeof r=="string"?{page:r}:r}})},[]);return{trackEvent:i,trackPageView:n}}const RS="_widget_1q1ab_1",AS="_header_1q1ab_12",IS="_sparkle_1q1ab_18",DS="_title_1q1ab_23",ES="_actions_1q1ab_31",TS="_cta_1q1ab_37",jS="_licenseCta_1q1ab_38",HS="_collapsedGroup_1q1ab_70",US="_collapsed_1q1ab_70",MS="_collapsedSecondary_1q1ab_91",oo={widget:RS,header:AS,sparkle:IS,title:DS,actions:ES,cta:TS,licenseCta:jS,collapsedGroup:HS,collapsed:US,collapsedSecondary:MS};function LS({collapsed:i=!1}){const{tier:n}=SS(),{t:r}=Ho(),{trackEvent:d}=us(),{pathname:u,search:p}=Yt();if(n==="pro")return null;const g=bS.sidebarUpgrade,y="/settings?section=license",h=ds(u,p),v=()=>{d("dashboard_click_event",{click_target:"upgrade_cta",placement:"sidebar_upgrade",...h})},P=()=>{d("dashboard_click_event",{click_target:"license_shortcut",placement:"sidebar_license",...h})};return i?x.jsxs("div",{className:oo.collapsedGroup,children:[x.jsx("a",{href:g,target:"_blank",rel:"noopener noreferrer",className:oo.collapsed,title:r("upgrade.title","View Pro"),"aria-label":r("upgrade.title","View Pro"),onClick:v,children:x.jsx(sp,{size:18,strokeWidth:1.75})}),x.jsx(Ea,{to:y,className:`${oo.collapsed} ${oo.collapsedSecondary}`,title:r("upgrade.licenseShortcut","Enter License"),"aria-label":r("upgrade.licenseShortcut","Enter License"),onClick:P,children:x.jsx(ip,{size:18,strokeWidth:1.75})})]}):x.jsxs("div",{className:oo.widget,children:[x.jsxs("div",{className:oo.header,children:[x.jsx(sp,{size:16,strokeWidth:1.75,className:oo.sparkle}),x.jsx("span",{className:oo.title,children:r("upgrade.tagline","Check Pro features")})]}),x.jsxs("div",{className:oo.actions,children:[x.jsxs("a",{href:g,target:"_blank",rel:"noopener noreferrer",className:oo.cta,onClick:v,children:[r("upgrade.cta","View Pro")," →"]}),x.jsxs(Ea,{to:y,className:oo.licenseCta,onClick:P,children:[x.jsx(ip,{size:14,strokeWidth:1.75,"aria-hidden":"true",focusable:"false"}),x.jsx("span",{children:r("upgrade.licenseShortcut","Enter License")})]})]})]})}const zS="_backdrop_1r5ey_1",_S="_dialog_1r5ey_11",NS="_header_1r5ey_21",OS="_titleBlock_1r5ey_30",qS="_title_1r5ey_30",BS="_subtitle_1r5ey_42",WS="_closeButton_1r5ey_49",FS="_body_1r5ey_67",KS="_statusBox_1r5ey_73",YS="_errorBox_1r5ey_74",VS="_spin_1r5ey_92",GS="_bundleBlock_1r5ey_102",$S="_label_1r5ey_107",XS="_bundleName_1r5ey_115",ZS="_guidanceBox_1r5ey_127",QS="_includedList_1r5ey_143",JS="_includedItem_1r5ey_152",ev="_actions_1r5ey_163",tv="_button_1r5ey_169",ov="_primaryLink_1r5ey_170",av="_hint_1r5ey_206",We={backdrop:zS,dialog:_S,header:NS,titleBlock:OS,title:qS,subtitle:BS,closeButton:WS,body:FS,statusBox:KS,errorBox:YS,spin:VS,bundleBlock:GS,label:$S,bundleName:XS,guidanceBox:ZS,includedList:QS,includedItem:JS,actions:ev,button:tv,primaryLink:ov,hint:av};function Hl(){return typeof navigator<"u"?navigator.userAgent:""}function iv(i){window.open(i,"_blank","noopener,noreferrer")}function sv({open:i,fallbackHref:n,onClose:r}){const{locale:d,t:u}=Ho(),p=R.useId(),[g,y]=R.useState(!1),[h,v]=R.useState(null),[P,C]=R.useState(null),[D,H]=R.useState("idle");if(R.useEffect(()=>{if(!i)return;let V=!1;const he=Hl();return y(!0),v(null),C(null),H("idle"),Et.post("/api/dashboard/support/bug-report",{os:Bl(he),userAgent:he,locale:d}).then(De=>{V||(v(De),y(!1))}).catch(()=>{V||(C(u("bugReportDialog.error","Could not create the diagnostics bundle. You can still open GitHub without diagnostics.")),y(!1))}),()=>{V=!0}},[i,d]),R.useEffect(()=>{if(!i||g)return;function V(he){he.key==="Escape"&&r()}return window.addEventListener("keydown",V),()=>window.removeEventListener("keydown",V)},[i,g,r]),!i)return null;async function B(){if(h)try{H("opening"),await Et.post("/api/dashboard/support/bug-report/reveal",{bundleName:h.bundleName}),H("opened")}catch{H("failed")}}const M=h!==null,N=(h==null?void 0:h.issueUrl)??n,te=(h==null?void 0:h.includedFiles)??[],K=D==="opening"?u("bugReportDialog.reveal.opening","Opening..."):D==="opened"?u("bugReportDialog.reveal.opened","Opened location"):u("bugReportDialog.reveal","Reveal in Finder"),X=x.jsx("div",{className:We.backdrop,onClick:g?void 0:r,children:x.jsxs("section",{className:We.dialog,role:"dialog","aria-modal":"true","aria-labelledby":p,onClick:V=>V.stopPropagation(),children:[x.jsxs("div",{className:We.header,children:[x.jsxs("div",{className:We.titleBlock,children:[x.jsx("h2",{id:p,className:We.title,children:u("bugReportDialog.title","diagnostics.zip can help us investigate")}),x.jsx("p",{className:We.subtitle,children:u("bugReportDialog.subtitle","WEPPY created a diagnostics zip on your computer. It includes Studio, plugin, Sync, and tool logs that can help us understand what happened.")})]}),x.jsx("button",{type:"button",className:We.closeButton,"aria-label":u("bugReportDialog.close","Close"),onClick:r,disabled:g,children:x.jsx(gS,{size:16,strokeWidth:1.75,"aria-hidden":"true"})})]}),x.jsxs("div",{className:We.body,children:[g&&x.jsxs("div",{className:We.statusBox,role:"status",children:[x.jsx(Xf,{className:We.spin,size:18,strokeWidth:1.75,"aria-hidden":"true"}),x.jsx("span",{children:u("bugReportDialog.loading","Preparing diagnostics.zip...")})]}),P&&x.jsxs("div",{className:We.errorBox,role:"alert",children:[x.jsx(Uf,{size:18,strokeWidth:1.75,"aria-hidden":"true"}),x.jsx("span",{children:P})]}),M&&x.jsxs(x.Fragment,{children:[x.jsxs("div",{className:We.guidanceBox,children:[x.jsx("p",{children:u("bugReportDialog.optional","You can submit the bug report without this file, but attaching it usually helps us find the cause faster.")}),x.jsx("p",{children:u("bugReportDialog.attachHow","To attach it, download or reveal the zip, then add it to the Diagnostics ZIP (optional) upload field on GitHub before you submit.")})]}),x.jsxs("div",{className:We.bundleBlock,children:[x.jsx("span",{className:We.label,children:u("bugReportDialog.bundle","Bundle")}),x.jsx("code",{className:We.bundleName,children:h.bundleName})]}),x.jsxs("div",{className:We.bundleBlock,children:[x.jsx("span",{className:We.label,children:u("bugReportDialog.included","Included")}),x.jsx("ul",{className:We.includedList,children:te.length>0?te.map(V=>x.jsx("li",{className:We.includedItem,children:V.label},`${V.label}:${V.archivePath??V.path}`)):x.jsx("li",{className:We.includedItem,children:u("bugReportDialog.included.none","No log files found")})})]}),D==="failed"&&x.jsxs("div",{className:We.errorBox,role:"alert",children:[x.jsx(ap,{size:18,strokeWidth:1.75,"aria-hidden":"true"}),x.jsx("span",{children:u("bugReportDialog.reveal.failed","Could not open the file location.")})]})]}),x.jsxs("div",{className:We.actions,children:[M&&x.jsxs(x.Fragment,{children:[x.jsxs("a",{className:We.primaryLink,href:h.downloadUrl,download:h.bundleName,children:[x.jsx(Tf,{size:16,strokeWidth:1.75,"aria-hidden":"true"}),u("bugReportDialog.download","1. Download diagnostics.zip")]}),x.jsxs("button",{type:"button",className:We.button,onClick:()=>void B(),disabled:D==="opening",children:[x.jsx(ap,{size:16,strokeWidth:1.75,"aria-hidden":"true"}),K]})]}),P&&!M&&x.jsxs("button",{type:"button",className:We.button,onClick:()=>{C(null),y(!0),Et.post("/api/dashboard/support/bug-report",{os:Bl(Hl()),userAgent:Hl(),locale:d}).then(V=>{v(V),y(!1)}).catch(()=>{C(u("bugReportDialog.error","Could not create the diagnostics bundle. You can still open GitHub without diagnostics.")),y(!1)})},children:[x.jsx(Bp,{size:16,strokeWidth:1.75,"aria-hidden":"true"}),u("bugReportDialog.retry","Try again")]}),x.jsxs("button",{type:"button",className:We.button,onClick:()=>iv(N),disabled:g,children:[x.jsx(qp,{size:16,strokeWidth:1.75,"aria-hidden":"true"}),M?u("bugReportDialog.openGithub","2. Open GitHub issue"):u("bugReportDialog.openGithubFallback","Open GitHub without diagnostics")]})]}),x.jsx("p",{className:We.hint,children:u("bugReportDialog.hint","The zip can contain local logs and project context. Review it before attaching if you want to share it.")})]})]})});return typeof document>"u"?X:Hn.createPortal(X,document.body)}const nv="_sidebar_19hyu_2",rv="_brand_19hyu_17",lv="_brandIcon_19hyu_28",dv="_brandText_19hyu_33",uv="_brandTextPro_19hyu_44",cv="_nav_19hyu_50",pv="_spacer_19hyu_57",gv="_navLink_19hyu_63",hv="_active_19hyu_84",mv="_disabled_19hyu_91",yv="_icon_19hyu_102",fv="_label_19hyu_113",Sv="_secondaryDivider_19hyu_120",vv="_secondaryNav_19hyu_127",bv="_secondaryNavEntry_19hyu_134",Pv="_secondaryItemDivider_19hyu_140",Cv="_helpDivider_19hyu_147",wv="_helpGroupTitle_19hyu_154",kv="_helpNav_19hyu_165",xv="_externalIcon_19hyu_172",Je={sidebar:nv,brand:rv,brandIcon:lv,brandText:dv,brandTextPro:uv,nav:cv,spacer:pv,navLink:gv,active:hv,disabled:mv,icon:yv,label:fv,secondaryDivider:Sv,secondaryNav:vv,secondaryNavEntry:bv,secondaryItemDivider:Pv,helpDivider:Cv,helpGroupTitle:wv,helpNav:kv,externalIcon:xv},Rv={bug:"sidebar_help_bug",feature:"sidebar_help_feature",discussions:"sidebar_help_community",troubleshooting:"sidebar_help_troubleshooting"};function Av(){const[i,n]=R.useState(!1);return R.useEffect(()=>{if(typeof window>"u"||!window.matchMedia)return;const r=window.matchMedia("(max-width: 768px)"),d=()=>n(r.matches);return d(),r.addEventListener("change",d),()=>r.removeEventListener("change",d)},[]),i}const lp={disconnected:0,serverOnly:1,studioConnected:2};function Iv(i,n){return lp[i]>=lp[n]}function Dv(i,n){return i==="serverOnly"?n("sidebar.gate.l1","MCP server connection required"):i==="studioConnected"?n("sidebar.gate.l2","Roblox Studio plugin connection required"):""}function dp({item:i}){const{level:n}=_n(),{t:r}=Ho(),d=Iv(n,i.minLevel),u=i.icon,p=x.jsxs(Iy,{to:i.route,end:i.route==="/",className:({isActive:g})=>[Je.navLink,g?Je.active:"",d?"":Je.disabled].filter(Boolean).join(" "),onClick:g=>{d||g.preventDefault()},children:[x.jsx("span",{className:Je.icon,children:x.jsx(u,{size:18,strokeWidth:1.75,"aria-hidden":"true",focusable:"false"})}),x.jsx("span",{className:Je.label,children:r(i.labelKey)})]});return d?p:x.jsx(Ft,{text:Dv(i.minLevel,r),children:p})}function Ev({item:i,ctx:n}){const{t:r}=Ho(),{trackEvent:d}=us(),{pathname:u,search:p}=Yt(),g=i.icon,y=i.buildUrl(n),h=r(i.tooltipKey,""),v=ds(u,p),[P,C]=R.useState(!1),D=x.jsxs("a",{href:y,target:"_blank",rel:"noopener noreferrer",className:Je.navLink,"data-testid":`sidebar-help-${i.id}`,onClick:B=>{d("dashboard_click_event",{click_target:Rv[i.id],placement:"sidebar_help",...v}),i.id==="bug"&&(B.preventDefault(),C(!0))},children:[x.jsx("span",{className:Je.icon,children:x.jsx(g,{size:18,strokeWidth:1.75,"aria-hidden":"true",focusable:"false"})}),x.jsx("span",{className:Je.label,children:r(i.labelKey)}),x.jsx("span",{className:Je.externalIcon,"aria-hidden":"true",children:x.jsx(qp,{size:12,strokeWidth:1.75})})]}),H=h?x.jsx(Ft,{text:h,children:D}):D;return x.jsxs(x.Fragment,{children:[H,i.id==="bug"&&x.jsx(sv,{open:P,fallbackHref:y,onClose:()=>C(!1)})]})}function Tv(){const[i,n]=R.useState("basic"),r=Av(),{status:d}=_n(),{locale:u,t:p}=Ho(),g={locale:u,status:d};return R.useEffect(()=>{let y=!1;async function h(){try{const C=await Np("auto");!y&&(C!=null&&C.tier)&&n(C.tier)}catch{y||n("basic")}}h();const v=new Zl;v.connect();const P=v.on("license",()=>{h()});return()=>{y=!0,P(),v.disconnect()}},[]),x.jsxs("aside",{className:Je.sidebar,children:[x.jsxs("div",{className:Je.brand,children:[x.jsx("span",{className:Je.brandIcon,children:x.jsx(Df,{size:18,strokeWidth:1.75,"aria-hidden":"true",focusable:"false"})}),x.jsx("span",{"data-testid":"sidebar-brand-text",className:[Je.brandText,i==="pro"?Je.brandTextPro:""].filter(Boolean).join(" "),children:"WEPPY"})]}),x.jsx("nav",{className:Je.nav,children:Fp.map(y=>x.jsx(dp,{item:y},y.route))}),x.jsx("div",{className:Je.secondaryDivider}),x.jsx("nav",{className:Je.secondaryNav,children:ql.map((y,h)=>x.jsxs("div",{className:Je.secondaryNavEntry,children:[x.jsx(dp,{item:y}),h<ql.length-1?x.jsx("div",{className:Je.secondaryItemDivider,"data-testid":"sidebar-controls-whats-new-divider","aria-hidden":"true"}):null]},y.route))}),x.jsx("div",{className:Je.helpDivider,"aria-hidden":"true"}),x.jsx("div",{className:Je.helpGroupTitle,"aria-label":p("sidebar.help.group"),children:p("sidebar.help.group")}),x.jsx("nav",{className:Je.helpNav,"aria-label":p("sidebar.help.group"),children:fS.map(y=>x.jsx(Ev,{item:y,ctx:g},y.id))}),x.jsx("div",{className:Je.spacer}),x.jsx(LS,{collapsed:r})]})}async function jv(){return Et.get("/api/dashboard/place-summary")}async function Hv(){return Et.get("/api/dashboard/sync-root")}async function Lb(){return Et.post("/api/dashboard/sync-root/pick")}async function zb(i){return Et.patch("/api/dashboard/sync-root",{projectRoot:i})}const Uv=[{id:"2026-06-18-multi-studio-targets",date:"2026-06-18",title:{en:"One MCP server can control multiple Studio windows",ko:"하나의 MCP로 여러 Studio 창을 조작할 수 있습니다",es:"Un servidor MCP puede controlar varias ventanas de Studio","pt-br":"Um servidor MCP pode controlar várias janelas do Studio",ja:"1つのMCPで複数のStudioウィンドウを操作できます",id:"Satu server MCP dapat mengontrol beberapa jendela Studio",de:"Ein MCP-Server kann mehrere Studio-Fenster steuern","fr-fr":"Un serveur MCP peut contrôler plusieurs fenêtres Studio"},body:{en:`One MCP server can now keep multiple Roblox Studio windows connected as separate Studio targets.
|
|
314
|
+
*/const pS=[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]],gS=Ke("x",pS),Fp=[{labelKey:"sidebar.overview",route:"/",icon:Yf,minLevel:"disconnected",lazy:()=>Kt(()=>import("./OverviewPage-9cIh9Q5a.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10]))},{labelKey:"sidebar.connection",route:"/connection",icon:iS,minLevel:"disconnected",lazy:()=>Kt(()=>import("./ConnectionPage-BkkqcLRE.js"),__vite__mapDeps([11,1,2,3,4,5,6,12,13,14,9,15,16]))},{labelKey:"sidebar.sync",route:"/sync",icon:Bp,minLevel:"serverOnly",lazy:()=>Kt(()=>import("./SyncPage-CHe2NPfN.js"),__vite__mapDeps([17,2,3,1,6,12,13,14,18,19,4,5,20]))},{labelKey:"sidebar.assets",route:"/assets",icon:oS,minLevel:"serverOnly",lazy:()=>Kt(()=>import("./AssetsPage-CqgdG2Ni.js"),__vite__mapDeps([21,12,13,14,2,3,6,15,22]))},{labelKey:"sidebar.changelog",route:"/changelog",icon:qf,minLevel:"serverOnly",lazy:()=>Kt(()=>import("./ChangelogPage-BqASaB-l.js"),__vite__mapDeps([23,2,3,12,13,14,18,19,6,24,25,26]))},{labelKey:"sidebar.playtest",route:"/playtest",icon:Nf,minLevel:"serverOnly",lazy:()=>Kt(()=>import("./PlaytestPage-BeRZc6wz.js"),__vite__mapDeps([27,2,3,1,18,19,6,12,13,14,28]))},{labelKey:"sidebar.ui_studio",route:"/ui-studio",icon:Wf,minLevel:"serverOnly",lazy:()=>Kt(()=>import("./UiStudioPage-xZ96a4BR.js"),__vite__mapDeps([29,1,6,30,31,24,25,2,3,18,19,32]))},{labelKey:"sidebar.tools",route:"/tools",icon:cS,minLevel:"serverOnly",lazy:()=>Kt(()=>import("./ToolsPage-Cq8crPCz.js"),__vite__mapDeps([33,2,3,6,12,13,14,18,19,24,25,34]))}],ql=[{labelKey:"sidebar.controls",route:"/controls",icon:Wp,minLevel:"serverOnly",lazy:()=>Kt(()=>import("./ControlsPage-da-JrES8.js"),__vite__mapDeps([35,2,3,1,13,14,6,36,37,15]))},{labelKey:"sidebar.whatsNew",route:"/whats-new",icon:wf,minLevel:"disconnected",lazy:()=>Kt(()=>import("./WhatsNewPage-B9st_b8H.js"),__vite__mapDeps([38,2,3,39]))}],jl="https://github.com/hope1026/weppy-roblox-mcp",hS="https://weppyai.com";function Bl(i){return i?/Mac OS X|Macintosh/i.test(i)?"macOS":/Windows NT/i.test(i)?"Windows":/Linux/i.test(i)?"Linux":"":""}function Kp(i){var v,P,C,D,H;const n=Bl(typeof navigator<"u"?navigator.userAgent:""),r=i.status,d=(r==null?void 0:r.version)??"",u=((P=(v=r==null?void 0:r.pluginClients)==null?void 0:v[0])==null?void 0:P.pluginVersion)??"",p=((D=(C=r==null?void 0:r.pluginClients)==null?void 0:C[0])==null?void 0:D.studioVersion)??"",g=d||u||p?[d?`MCP ${d}`:"",u?`Plugin ${u}`:"",p?`Studio ${p}`:""].filter(Boolean).join(" / "):"",y=((H=r==null?void 0:r.aiClientNames)==null?void 0:H[0])??"",h=(r==null?void 0:r.nodeVersion)??"";return{os:n,nodeVersion:h,aiClient:y,pluginVersionLabel:g}}function mS(i){const{os:n,nodeVersion:r,aiClient:d,pluginVersionLabel:u}=Kp(i),p=new URLSearchParams;return p.set("template","bug_report.yml"),n&&p.set("os",n),r&&p.set("node",r),d&&p.set("ai-client",d),u&&p.set("plugin-version",u),p.toString()}function yS(i){const{os:n,nodeVersion:r,aiClient:d,pluginVersionLabel:u}=Kp(i),p=new URLSearchParams;return p.set("template","install_help.yml"),n&&p.set("os",n),r&&p.set("node",r),d&&p.set("ai-client",d),u&&p.set("plugin-version",u),p.toString()}const fS=[{id:"bug",labelKey:"sidebar.help.bug",tooltipKey:"sidebar.help.bug.tooltip",icon:Af,buildUrl:i=>`${jl}/issues/new?${mS(i)}`},{id:"feature",labelKey:"sidebar.help.feature",tooltipKey:"sidebar.help.feature.tooltip",icon:Gf,buildUrl:()=>`${jl}/issues/new?template=feature_request.yml`},{id:"discussions",labelKey:"sidebar.help.discussions",tooltipKey:"sidebar.help.discussions.tooltip",icon:Qf,buildUrl:i=>`${jl}/issues/new?${yS(i)}`},{id:"troubleshooting",labelKey:"sidebar.help.troubleshooting",tooltipKey:"sidebar.help.troubleshooting.tooltip",icon:xf,buildUrl:i=>`${hS}/${i.locale}/docs/troubleshooting/`}];function SS(){const[i,n]=R.useState("basic"),[r,d]=R.useState(0),[u,p]=R.useState(0),[g,y]=R.useState(0),[h,v]=R.useState(!0);R.useEffect(()=>{let C=!1;async function D(){try{return await Np("auto")}catch{return null}}async function H(){var N,te;try{const[K,X]=await Promise.all([D(),Et.get("/api/dashboard/tool-stats").catch(()=>null)]);if(C)return;if(K!=null&&K.tier&&n(K.tier),X!=null&&X.tierSummary){const V=((N=X.tierSummary.basic)==null?void 0:N.totalCalls)??0,he=((te=X.tierSummary.pro)==null?void 0:te.totalCalls)??0;y(V),p(he),d(V+he)}}catch{}finally{C||v(!1)}}H();const B=new Zl;B.connect();const M=B.on("license",()=>{D().then(N=>{!C&&(N!=null&&N.tier)&&n(N.tier)})});return()=>{C=!0,M(),B.disconnect()}},[]);const P=r>0?u/r*100:0;return{tier:i,proUsagePercent:P,totalCalls:r,proCalls:u,basicCalls:g,loading:h}}const vS="https://weppyai.com/plans/";function Ra(i){const n=new URLSearchParams({utm_source:"weppy_dashboard",utm_medium:"app",utm_campaign:"pro_upgrade",utm_content:i});return`${vS}?${n.toString()}`}const bS={sidebarUpgrade:Ra("sidebar_upgrade"),settingsLicense:Ra("settings_license"),sync:Ra("sync_tier_panel"),changelog:Ra("changelog_limit_notice"),playtest:Ra("playtest_sample_banner"),uiStudioAnalysis:Ra("ui_studio_analysis_banner"),uiStudioHistory:Ra("ui_studio_history_banner")},PS=5e3,CS=5;function wS(i){return i.replace(/^\//,"").split("/")[0]||"overview"}function kS(i,n){const r=new URLSearchParams(n);if(i==="ui-studio")return r.get("tab")==="history"?"ui_studio_history":"ui_studio_analysis";if(i==="tools")return"tools_history";if(i==="changelog")return"changelog_all"}function ds(i,n){const r=wS(i);if(n===void 0)return r;const d=kS(r,n);return d?{page:r,tab:d}:{page:r}}let ci=[],np=null;function Yp(){if(ci.length===0)return;const i=ci.splice(0),n=`${zn}/api/dashboard/analytics`,r=JSON.stringify({events:i});fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:r}).catch(()=>{})}function xS(){np||(np=setInterval(Yp,PS))}function rp(i){ci.push(i),xS(),ci.length>=CS&&Yp()}typeof window<"u"&&window.addEventListener("beforeunload",()=>{if(ci.length===0)return;const i=`${zn}/api/dashboard/analytics`,n=JSON.stringify({events:ci.splice(0)});navigator.sendBeacon(i,new Blob([n],{type:"application/json"}))});function us(){const i=R.useCallback((r,d)=>{rp({name:r,params:d})},[]),n=R.useCallback(r=>{rp({name:"dashboard_page_view",params:{...typeof r=="string"?{page:r}:r}})},[]);return{trackEvent:i,trackPageView:n}}const RS="_widget_1q1ab_1",AS="_header_1q1ab_12",IS="_sparkle_1q1ab_18",DS="_title_1q1ab_23",ES="_actions_1q1ab_31",TS="_cta_1q1ab_37",jS="_licenseCta_1q1ab_38",HS="_collapsedGroup_1q1ab_70",US="_collapsed_1q1ab_70",MS="_collapsedSecondary_1q1ab_91",oo={widget:RS,header:AS,sparkle:IS,title:DS,actions:ES,cta:TS,licenseCta:jS,collapsedGroup:HS,collapsed:US,collapsedSecondary:MS};function LS({collapsed:i=!1}){const{tier:n}=SS(),{t:r}=Ho(),{trackEvent:d}=us(),{pathname:u,search:p}=Yt();if(n==="pro")return null;const g=bS.sidebarUpgrade,y="/settings?section=license",h=ds(u,p),v=()=>{d("dashboard_click_event",{click_target:"upgrade_cta",placement:"sidebar_upgrade",...h})},P=()=>{d("dashboard_click_event",{click_target:"license_shortcut",placement:"sidebar_license",...h})};return i?x.jsxs("div",{className:oo.collapsedGroup,children:[x.jsx("a",{href:g,target:"_blank",rel:"noopener noreferrer",className:oo.collapsed,title:r("upgrade.title","View Pro"),"aria-label":r("upgrade.title","View Pro"),onClick:v,children:x.jsx(sp,{size:18,strokeWidth:1.75})}),x.jsx(Ea,{to:y,className:`${oo.collapsed} ${oo.collapsedSecondary}`,title:r("upgrade.licenseShortcut","Enter License"),"aria-label":r("upgrade.licenseShortcut","Enter License"),onClick:P,children:x.jsx(ip,{size:18,strokeWidth:1.75})})]}):x.jsxs("div",{className:oo.widget,children:[x.jsxs("div",{className:oo.header,children:[x.jsx(sp,{size:16,strokeWidth:1.75,className:oo.sparkle}),x.jsx("span",{className:oo.title,children:r("upgrade.tagline","Check Pro features")})]}),x.jsxs("div",{className:oo.actions,children:[x.jsxs("a",{href:g,target:"_blank",rel:"noopener noreferrer",className:oo.cta,onClick:v,children:[r("upgrade.cta","View Pro")," →"]}),x.jsxs(Ea,{to:y,className:oo.licenseCta,onClick:P,children:[x.jsx(ip,{size:14,strokeWidth:1.75,"aria-hidden":"true",focusable:"false"}),x.jsx("span",{children:r("upgrade.licenseShortcut","Enter License")})]})]})]})}const zS="_backdrop_1r5ey_1",_S="_dialog_1r5ey_11",NS="_header_1r5ey_21",OS="_titleBlock_1r5ey_30",qS="_title_1r5ey_30",BS="_subtitle_1r5ey_42",WS="_closeButton_1r5ey_49",FS="_body_1r5ey_67",KS="_statusBox_1r5ey_73",YS="_errorBox_1r5ey_74",VS="_spin_1r5ey_92",GS="_bundleBlock_1r5ey_102",$S="_label_1r5ey_107",XS="_bundleName_1r5ey_115",ZS="_guidanceBox_1r5ey_127",QS="_includedList_1r5ey_143",JS="_includedItem_1r5ey_152",ev="_actions_1r5ey_163",tv="_button_1r5ey_169",ov="_primaryLink_1r5ey_170",av="_hint_1r5ey_206",We={backdrop:zS,dialog:_S,header:NS,titleBlock:OS,title:qS,subtitle:BS,closeButton:WS,body:FS,statusBox:KS,errorBox:YS,spin:VS,bundleBlock:GS,label:$S,bundleName:XS,guidanceBox:ZS,includedList:QS,includedItem:JS,actions:ev,button:tv,primaryLink:ov,hint:av};function Hl(){return typeof navigator<"u"?navigator.userAgent:""}function iv(i){window.open(i,"_blank","noopener,noreferrer")}function sv({open:i,fallbackHref:n,onClose:r}){const{locale:d,t:u}=Ho(),p=R.useId(),[g,y]=R.useState(!1),[h,v]=R.useState(null),[P,C]=R.useState(null),[D,H]=R.useState("idle");if(R.useEffect(()=>{if(!i)return;let V=!1;const he=Hl();return y(!0),v(null),C(null),H("idle"),Et.post("/api/dashboard/support/bug-report",{os:Bl(he),userAgent:he,locale:d}).then(De=>{V||(v(De),y(!1))}).catch(()=>{V||(C(u("bugReportDialog.error","Could not create the diagnostics bundle. You can still open GitHub without diagnostics.")),y(!1))}),()=>{V=!0}},[i,d]),R.useEffect(()=>{if(!i||g)return;function V(he){he.key==="Escape"&&r()}return window.addEventListener("keydown",V),()=>window.removeEventListener("keydown",V)},[i,g,r]),!i)return null;async function B(){if(h)try{H("opening"),await Et.post("/api/dashboard/support/bug-report/reveal",{bundleName:h.bundleName}),H("opened")}catch{H("failed")}}const M=h!==null,N=(h==null?void 0:h.issueUrl)??n,te=(h==null?void 0:h.includedFiles)??[],K=D==="opening"?u("bugReportDialog.reveal.opening","Opening..."):D==="opened"?u("bugReportDialog.reveal.opened","Opened location"):u("bugReportDialog.reveal","Reveal in Finder"),X=x.jsx("div",{className:We.backdrop,onClick:g?void 0:r,children:x.jsxs("section",{className:We.dialog,role:"dialog","aria-modal":"true","aria-labelledby":p,onClick:V=>V.stopPropagation(),children:[x.jsxs("div",{className:We.header,children:[x.jsxs("div",{className:We.titleBlock,children:[x.jsx("h2",{id:p,className:We.title,children:u("bugReportDialog.title","diagnostics.zip can help us investigate")}),x.jsx("p",{className:We.subtitle,children:u("bugReportDialog.subtitle","WEPPY created a diagnostics zip on your computer. It includes Studio, plugin, Sync, and tool logs that can help us understand what happened.")})]}),x.jsx("button",{type:"button",className:We.closeButton,"aria-label":u("bugReportDialog.close","Close"),onClick:r,disabled:g,children:x.jsx(gS,{size:16,strokeWidth:1.75,"aria-hidden":"true"})})]}),x.jsxs("div",{className:We.body,children:[g&&x.jsxs("div",{className:We.statusBox,role:"status",children:[x.jsx(Xf,{className:We.spin,size:18,strokeWidth:1.75,"aria-hidden":"true"}),x.jsx("span",{children:u("bugReportDialog.loading","Preparing diagnostics.zip...")})]}),P&&x.jsxs("div",{className:We.errorBox,role:"alert",children:[x.jsx(Uf,{size:18,strokeWidth:1.75,"aria-hidden":"true"}),x.jsx("span",{children:P})]}),M&&x.jsxs(x.Fragment,{children:[x.jsxs("div",{className:We.guidanceBox,children:[x.jsx("p",{children:u("bugReportDialog.optional","You can submit the bug report without this file, but attaching it usually helps us find the cause faster.")}),x.jsx("p",{children:u("bugReportDialog.attachHow","To attach it, download or reveal the zip, then add it to the Diagnostics ZIP (optional) upload field on GitHub before you submit.")})]}),x.jsxs("div",{className:We.bundleBlock,children:[x.jsx("span",{className:We.label,children:u("bugReportDialog.bundle","Bundle")}),x.jsx("code",{className:We.bundleName,children:h.bundleName})]}),x.jsxs("div",{className:We.bundleBlock,children:[x.jsx("span",{className:We.label,children:u("bugReportDialog.included","Included")}),x.jsx("ul",{className:We.includedList,children:te.length>0?te.map(V=>x.jsx("li",{className:We.includedItem,children:V.label},`${V.label}:${V.archivePath??V.path}`)):x.jsx("li",{className:We.includedItem,children:u("bugReportDialog.included.none","No log files found")})})]}),D==="failed"&&x.jsxs("div",{className:We.errorBox,role:"alert",children:[x.jsx(ap,{size:18,strokeWidth:1.75,"aria-hidden":"true"}),x.jsx("span",{children:u("bugReportDialog.reveal.failed","Could not open the file location.")})]})]}),x.jsxs("div",{className:We.actions,children:[M&&x.jsxs(x.Fragment,{children:[x.jsxs("a",{className:We.primaryLink,href:h.downloadUrl,download:h.bundleName,children:[x.jsx(Tf,{size:16,strokeWidth:1.75,"aria-hidden":"true"}),u("bugReportDialog.download","1. Download diagnostics.zip")]}),x.jsxs("button",{type:"button",className:We.button,onClick:()=>void B(),disabled:D==="opening",children:[x.jsx(ap,{size:16,strokeWidth:1.75,"aria-hidden":"true"}),K]})]}),P&&!M&&x.jsxs("button",{type:"button",className:We.button,onClick:()=>{C(null),y(!0),Et.post("/api/dashboard/support/bug-report",{os:Bl(Hl()),userAgent:Hl(),locale:d}).then(V=>{v(V),y(!1)}).catch(()=>{C(u("bugReportDialog.error","Could not create the diagnostics bundle. You can still open GitHub without diagnostics.")),y(!1)})},children:[x.jsx(Bp,{size:16,strokeWidth:1.75,"aria-hidden":"true"}),u("bugReportDialog.retry","Try again")]}),x.jsxs("button",{type:"button",className:We.button,onClick:()=>iv(N),disabled:g,children:[x.jsx(qp,{size:16,strokeWidth:1.75,"aria-hidden":"true"}),M?u("bugReportDialog.openGithub","2. Open GitHub issue"):u("bugReportDialog.openGithubFallback","Open GitHub without diagnostics")]})]}),x.jsx("p",{className:We.hint,children:u("bugReportDialog.hint","The zip can contain local logs and project context. Review it before attaching if you want to share it.")})]})]})});return typeof document>"u"?X:Hn.createPortal(X,document.body)}const nv="_sidebar_19hyu_2",rv="_brand_19hyu_17",lv="_brandIcon_19hyu_28",dv="_brandText_19hyu_33",uv="_brandTextPro_19hyu_44",cv="_nav_19hyu_50",pv="_spacer_19hyu_57",gv="_navLink_19hyu_63",hv="_active_19hyu_84",mv="_disabled_19hyu_91",yv="_icon_19hyu_102",fv="_label_19hyu_113",Sv="_secondaryDivider_19hyu_120",vv="_secondaryNav_19hyu_127",bv="_secondaryNavEntry_19hyu_134",Pv="_secondaryItemDivider_19hyu_140",Cv="_helpDivider_19hyu_147",wv="_helpGroupTitle_19hyu_154",kv="_helpNav_19hyu_165",xv="_externalIcon_19hyu_172",Je={sidebar:nv,brand:rv,brandIcon:lv,brandText:dv,brandTextPro:uv,nav:cv,spacer:pv,navLink:gv,active:hv,disabled:mv,icon:yv,label:fv,secondaryDivider:Sv,secondaryNav:vv,secondaryNavEntry:bv,secondaryItemDivider:Pv,helpDivider:Cv,helpGroupTitle:wv,helpNav:kv,externalIcon:xv},Rv={bug:"sidebar_help_bug",feature:"sidebar_help_feature",discussions:"sidebar_help_community",troubleshooting:"sidebar_help_troubleshooting"};function Av(){const[i,n]=R.useState(!1);return R.useEffect(()=>{if(typeof window>"u"||!window.matchMedia)return;const r=window.matchMedia("(max-width: 768px)"),d=()=>n(r.matches);return d(),r.addEventListener("change",d),()=>r.removeEventListener("change",d)},[]),i}const lp={disconnected:0,serverOnly:1,studioConnected:2};function Iv(i,n){return lp[i]>=lp[n]}function Dv(i,n){return i==="serverOnly"?n("sidebar.gate.l1","MCP server connection required"):i==="studioConnected"?n("sidebar.gate.l2","Roblox Studio plugin connection required"):""}function dp({item:i}){const{level:n}=_n(),{t:r}=Ho(),d=Iv(n,i.minLevel),u=i.icon,p=x.jsxs(Iy,{to:i.route,end:i.route==="/",className:({isActive:g})=>[Je.navLink,g?Je.active:"",d?"":Je.disabled].filter(Boolean).join(" "),onClick:g=>{d||g.preventDefault()},children:[x.jsx("span",{className:Je.icon,children:x.jsx(u,{size:18,strokeWidth:1.75,"aria-hidden":"true",focusable:"false"})}),x.jsx("span",{className:Je.label,children:r(i.labelKey)})]});return d?p:x.jsx(Ft,{text:Dv(i.minLevel,r),children:p})}function Ev({item:i,ctx:n}){const{t:r}=Ho(),{trackEvent:d}=us(),{pathname:u,search:p}=Yt(),g=i.icon,y=i.buildUrl(n),h=r(i.tooltipKey,""),v=ds(u,p),[P,C]=R.useState(!1),D=x.jsxs("a",{href:y,target:"_blank",rel:"noopener noreferrer",className:Je.navLink,"data-testid":`sidebar-help-${i.id}`,onClick:B=>{d("dashboard_click_event",{click_target:Rv[i.id],placement:"sidebar_help",...v}),i.id==="bug"&&(B.preventDefault(),C(!0))},children:[x.jsx("span",{className:Je.icon,children:x.jsx(g,{size:18,strokeWidth:1.75,"aria-hidden":"true",focusable:"false"})}),x.jsx("span",{className:Je.label,children:r(i.labelKey)}),x.jsx("span",{className:Je.externalIcon,"aria-hidden":"true",children:x.jsx(qp,{size:12,strokeWidth:1.75})})]}),H=h?x.jsx(Ft,{text:h,children:D}):D;return x.jsxs(x.Fragment,{children:[H,i.id==="bug"&&x.jsx(sv,{open:P,fallbackHref:y,onClose:()=>C(!1)})]})}function Tv(){const[i,n]=R.useState("basic"),r=Av(),{status:d}=_n(),{locale:u,t:p}=Ho(),g={locale:u,status:d};return R.useEffect(()=>{let y=!1;async function h(){try{const C=await Np("auto");!y&&(C!=null&&C.tier)&&n(C.tier)}catch{y||n("basic")}}h();const v=new Zl;v.connect();const P=v.on("license",()=>{h()});return()=>{y=!0,P(),v.disconnect()}},[]),x.jsxs("aside",{className:Je.sidebar,children:[x.jsxs("div",{className:Je.brand,children:[x.jsx("span",{className:Je.brandIcon,children:x.jsx(Df,{size:18,strokeWidth:1.75,"aria-hidden":"true",focusable:"false"})}),x.jsx("span",{"data-testid":"sidebar-brand-text",className:[Je.brandText,i==="pro"?Je.brandTextPro:""].filter(Boolean).join(" "),children:"WEPPY"})]}),x.jsx("nav",{className:Je.nav,children:Fp.map(y=>x.jsx(dp,{item:y},y.route))}),x.jsx("div",{className:Je.secondaryDivider}),x.jsx("nav",{className:Je.secondaryNav,children:ql.map((y,h)=>x.jsxs("div",{className:Je.secondaryNavEntry,children:[x.jsx(dp,{item:y}),h<ql.length-1?x.jsx("div",{className:Je.secondaryItemDivider,"data-testid":"sidebar-controls-whats-new-divider","aria-hidden":"true"}):null]},y.route))}),x.jsx("div",{className:Je.helpDivider,"aria-hidden":"true"}),x.jsx("div",{className:Je.helpGroupTitle,"aria-label":p("sidebar.help.group"),children:p("sidebar.help.group")}),x.jsx("nav",{className:Je.helpNav,"aria-label":p("sidebar.help.group"),children:fS.map(y=>x.jsx(Ev,{item:y,ctx:g},y.id))}),x.jsx("div",{className:Je.spacer}),x.jsx(LS,{collapsed:r})]})}async function jv(){return Et.get("/api/dashboard/place-summary")}async function Hv(){return Et.get("/api/dashboard/sync-root")}async function Lb(){return Et.post("/api/dashboard/sync-root/pick")}async function zb(i){return Et.patch("/api/dashboard/sync-root",{projectRoot:i})}const Uv=[{id:"2026-06-18-multi-studio-targets",date:"2026-06-18",title:{en:"One MCP server can control multiple Studio windows",ko:"하나의 MCP로 여러 Studio 창을 조작할 수 있습니다",es:"Un servidor MCP puede controlar varias ventanas de Studio","pt-br":"Um servidor MCP pode controlar várias janelas do Studio",ja:"1つのMCPで複数のStudioウィンドウを操作できます",id:"Satu server MCP dapat mengontrol beberapa jendela Studio",de:"Ein MCP-Server kann mehrere Studio-Fenster steuern","fr-fr":"Un serveur MCP peut contrôler plusieurs fenêtres Studio"},body:{en:`One MCP server can now keep multiple Roblox Studio windows connected as separate Studio targets.
|
|
315
315
|
|
|
316
316
|
This is useful for lobby games and multi-place experiences. You can open the lobby place in one Studio window and a gameplay or test place in another, then tell the AI which Studio ID or place ID to use. Requests without a target follow the Dashboard Studio Routing setting: recent-priority or pinned Studio.
|
|
317
317
|
|
|
@@ -603,4 +603,4 @@ Saat memulai UI baru, AI lebih dulu merapikan kebutuhan — tujuan, layar, dan p
|
|
|
603
603
|
|
|
604
604
|
Hasil pemeriksaan, layar yang ditangkap, dan saran perbaikan dapat dilihat langsung di halaman UI Studio pada dashboard.
|
|
605
605
|
|
|
606
|
-
Minta seperti biasa: "Buatkan UI."`},severity:"info",category:"release"}],Jl="weppy-dashboard.whatsNew.readIds";function Vp(){try{const i=localStorage.getItem(Jl);if(!i)return new Set;const n=JSON.parse(i);return Array.isArray(n)?new Set(n.filter(r=>typeof r=="string")):new Set}catch{return new Set}}function Mv(i){try{localStorage.setItem(Jl,JSON.stringify([...i]))}catch{}}let di=Vp(),Gp=di;const Wl=new Set;function $p(){Gp=new Set(di);for(const i of Wl)i()}const Ul={subscribe(i){return Wl.add(i),()=>{Wl.delete(i)}},getSnapshot(){return Gp},markRead(i){let n=!1;for(const r of i)di.has(r)||(di.add(r),n=!0);n&&(Mv(di),$p())}};typeof window<"u"&&window.addEventListener("storage",i=>{i.key===Jl&&(di=Vp(),$p())});function Lv(){const i=R.useSyncExternalStore(Ul.subscribe,Ul.getSnapshot),n=Uv.filter(r=>!i.has(r.id)).length;return{readSet:i,unreadCount:n,markRead:Ul.markRead}}const zv="_header_8mywd_2",_v="_row1_8mywd_17",Nv="_contextGroups_8mywd_25",Ov="_projectGroup_8mywd_33",qv="_studioGroup_8mywd_34",Bv="_groupTitleRow_8mywd_52",Wv="_groupLabel_8mywd_59",Fv="_groupIcon_8mywd_73",Kv="_projectName_8mywd_78",Yv="_placeChips_8mywd_90",Vv="_metaActions_8mywd_99",Gv="_placeChip_8mywd_90",$v="_placeChipStatic_8mywd_122",Xv="_placeChipMuted_8mywd_123",Zv="_placeChipActive_8mywd_127",Qv="_placeChipInactive_8mywd_134",Jv="_placeChipId_8mywd_145",eb="_placeChipClient_8mywd_160",tb="_placeChipState_8mywd_166",ob="_placeChipBadge_8mywd_172",ab="_placeDot_8mywd_180",ib="_placeChipName_8mywd_188",sb="_row2_8mywd_196",nb="_pathRow_8mywd_208",rb="_auxiliaryPath_8mywd_209",lb="_pathLabel_8mywd_221",db="_projectPath_8mywd_232",ub="_changeButton_8mywd_242",cb="_iconButton_8mywd_276",be={header:zv,row1:_v,contextGroups:Nv,projectGroup:Ov,studioGroup:qv,groupTitleRow:Bv,groupLabel:Wv,groupIcon:Fv,projectName:Kv,placeChips:Yv,metaActions:Vv,placeChip:Gv,placeChipStatic:$v,placeChipMuted:Xv,placeChipActive:Zv,placeChipInactive:Qv,placeChipId:Jv,placeChipClient:eb,placeChipState:tb,placeChipBadge:ob,placeDot:ab,placeChipName:ib,row2:sb,pathRow:nb,auxiliaryPath:rb,pathLabel:lb,projectPath:db,changeButton:ub,iconButton:cb},pb="_bellWrapper_tae21_2",gb="_unreadDot_tae21_8",up={bellWrapper:pb,unreadDot:gb};function hb(){const{t:i}=Ho(),{unreadCount:n}=Lv(),{trackEvent:r}=us(),{pathname:d,search:u}=Yt(),p=ds(d,u),g=n>0?`${i("header.whatsNew","What's New")} (${n})`:i("header.whatsNew","What's New");return x.jsx(Ft,{text:i("header.whatsNew.tooltip","What's New"),children:x.jsxs("span",{className:up.bellWrapper,children:[x.jsx(Ea,{to:"/whats-new","aria-label":g,className:be.iconButton,onClick:()=>r("dashboard_click_event",{click_target:"top_header_notification_bell",placement:"top_header",...p}),children:"🔔"}),n>0&&x.jsx("span",{className:up.unreadDot,"data-testid":"unread-dot","aria-hidden":"true"})]})})}function Xp(i,n,r){const d=n==="pinned"?r:null;return[...i].sort((u,p)=>mb(u,p,d))}function _b(i,n,r){return Xp(i,n,r)[0]}function mb(i,n,r){if(r){const h=i.clientId===r,v=n.clientId===r;if(h!==v)return h?-1:1}const d=i.lastRoutedAt,u=n.lastRoutedAt,p=d!==void 0;if(p!==(u!==void 0))return p?-1:1;if(d!==void 0&&u!==void 0&&d!==u)return u-d;const y=(i.connectedAt??0)-(n.connectedAt??0);return y!==0?y:i.clientId.localeCompare(n.clientId)}function cp(i){if(!i)return"";const n=i.split(/[\\/]/).filter(Boolean);return n[n.length-1]??""}function yb(i){var d,u;const n=((d=i==null?void 0:i.mcpInstances)==null?void 0:d.filter(p=>!p.isServer&&p.aiClientName))??[];if(n.length===0){const p=((u=i==null?void 0:i.mcpInstances)==null?void 0:u.find(g=>!!g.aiClientName))??null;return(p==null?void 0:p.projectRoot)??(p==null?void 0:p.cwd)??null}n.sort((p,g)=>(g.lastCommandAt??g.connectedAt)-(p.lastCommandAt??p.connectedAt));const r=n[0];return r.projectRoot??r.cwd??null}function pp(i,n){return i??n}function fb(i){const n=i.replace(/^\//,"").split("/")[0];return n===""||n==="overview"}function Sb(i){return i.replace(/^\//,"").split("/")[0]==="whats-new"}function vb(i){return i.replace(/^\//,"").split("/")[0]||"overview"}function gp(i,n){return Object.entries(n).reduce((r,[d,u])=>r.split(`{${d}}`).join(u||"-"),i)}function bb(){var U,ye;const{pathname:i,search:n}=Yt(),{level:r,status:d}=_n(),{t:u}=Ho(),{trackEvent:p}=us(),[g,y]=R.useState(null),[h,v]=R.useState(null),[P,C]=R.useState(null),[D,H]=R.useState(!1),B=u("header.placeNotConnected","Place not connected"),M=(d==null?void 0:d.studioRoutingMode)??"recentPriority",N=(d==null?void 0:d.pinnedTargetClientId)??null,te=Xp((d==null?void 0:d.pluginClients)??[],M,N),K=te[0],X=fb(i),V=Sb(i),he=ds(i,n);R.useEffect(()=>{let F=!1;async function ie(){if(r==="disconnected"){y(null);return}try{const ue=await Et.get("/connection-info");F||y(ue)}catch{F||y(null)}}return ie(),()=>{F=!0}},[r,d==null?void 0:d.sessionId,d==null?void 0:d.connectedClients]),R.useEffect(()=>{let F=!1;async function ie(){if(r==="disconnected"){v(null),H(!1);return}v(null),H(!1);try{const ue=await Hv();F||(v(ue),H(!1))}catch{F||(v(null),H(!0))}}return ie(),()=>{F=!0}},[X,r,d==null?void 0:d.sessionId,d==null?void 0:d.connectedClients]),R.useEffect(()=>{let F=!1;async function ie(){if(r==="disconnected"){C(null);return}try{const ue=await jv();F||C(ue)}catch{F||C(null)}}return ie(),()=>{F=!0}},[r,d==null?void 0:d.sessionId,d==null?void 0:d.connectedClients]);const De=yb(g)??"",E=r==="disconnected"?"blocked":h?"ready":D?"error":"loading",Z=E==="ready"?(h==null?void 0:h.projectRoot)??"":E==="loading"?u("header.currentProject.loading","Loading project root..."):u("header.currentProject.unavailable","Project root unavailable"),Pe=E==="ready"?(h==null?void 0:h.projectRoot)??"":X?"":De,ce=X||E==="ready"?E==="ready"?cp(Pe)||u("header.unknownProject","Unknown project"):E==="loading"?u("header.currentProject.loading","Loading project root..."):u("header.currentProject.unavailable","Project root unavailable"):cp(Pe)||u("header.unknownProject","Unknown project"),Le=pp((ye=(U=d==null?void 0:d.pluginClients)==null?void 0:U[0])==null?void 0:ye.placeName,B),ve=P!=null&&P.pluginConnected?P.activePlaceId:(P==null?void 0:P.lastActivePlaceId)??null,Te=[...(P==null?void 0:P.places)??[]].sort((F,ie)=>{const ue=F.placeId===ve,Ce=ie.placeId===ve;return ue!==Ce?ue?-1:1:F.isConnected!==ie.isConnected?F.isConnected?-1:1:F.placeName.localeCompare(ie.placeName)}),ze=te.length>0?Te.filter(F=>!te.some(ie=>ie.placeId!==void 0&&ie.placeId===F.placeId)):Te,et=X?E==="loading"?u("header.currentProject.loading.tooltip","Project root information is still loading"):E==="error"?u("header.currentProject.unavailable.tooltip","Current project root information is unavailable"):u("header.currentProject.tooltip","Currently selected project folder"):u("header.currentProject.tooltip","Currently selected project folder"),ot=u("header.manageProjectRoot.tooltip","Open Project Root controls"),_e=u("header.activeStudio.tooltip","Connected Studio targets that MCP can route requests to. Studio Routing changes the priority for requests without a named Studio target."),O=Te.find(F=>F.placeId===ve)??null,de=vb(i),G=h!=null&&h.projectSyncRoot&&O?`${h.projectSyncRoot}/${O.placeDirName}`:null,w=de==="playtest"?O!=null&&O.testsPath?{label:u("header.testFiles.label","Test Files"),value:O.testsPath,tooltip:u("header.testFiles.tooltip","Current playtest files directory for the selected place")}:null:["sync","changelog","ui-studio"].includes(de)&&G?{label:u("header.placeData.label","Place Data"),value:G,tooltip:u("header.placeData.tooltip","Current place data directory")}:null;return x.jsx(x.Fragment,{children:x.jsxs("header",{className:be.header,children:[x.jsxs("div",{className:be.row1,children:[x.jsxs("div",{className:be.contextGroups,children:[x.jsxs("section",{className:be.projectGroup,"aria-label":u("header.projectGroup.label","Project"),children:[x.jsxs("div",{className:be.groupTitleRow,children:[x.jsxs("span",{className:be.groupLabel,children:[x.jsx(zf,{size:14,strokeWidth:1.75,"aria-hidden":"true",focusable:"false",className:be.groupIcon}),u("header.projectGroup.label","Project")]}),x.jsx(Ft,{text:et,children:x.jsx("h1",{className:be.projectName,children:ce})}),x.jsx(Ft,{text:ot,children:x.jsx(Ea,{to:"/controls?section=project-root",className:be.changeButton,onClick:()=>p("dashboard_click_event",{click_target:"project_root_manage",placement:"top_header",...he}),children:u("header.manageProjectRoot","Manage Project Root")})})]}),x.jsxs("div",{className:be.pathRow,children:[x.jsx("span",{className:be.pathLabel,children:u("header.projectRoot.label","Project Root")}),x.jsx("span",{className:be.projectPath,title:Z,children:Z})]})]}),x.jsxs("section",{className:be.studioGroup,"aria-label":u("header.activeStudio.label","Active Studio"),children:[x.jsx(Ft,{text:_e,children:x.jsxs("span",{className:be.groupLabel,children:[x.jsx(eS,{size:14,strokeWidth:1.75,"aria-hidden":"true",focusable:"false",className:be.groupIcon}),u("header.activeStudio.label","Active Studio")]})}),x.jsxs("div",{className:be.placeChips,children:[te.map(F=>{const ie=F.targetAlias,ue=pp(F.placeName,B),Ce=F.connectionState??"connected",ke=te.filter(yo=>yo.placeId!==void 0&&yo.placeId===F.placeId).length>1,je=M==="pinned"&&N===F.clientId?u("connection.routing.pinnedBadge","Pinned"):M==="recentPriority"&&(K==null?void 0:K.clientId)===F.clientId?u("connection.routing.priorityBadge","Priority"):"-",gt=gp(u("header.studioTarget.tooltip","Studio ID: {studioId} · Connection ID: {connectionId} · Place: {placeName} · Place ID: {placeId} · State: {state} · Routing: {routing}"),{studioId:ie,connectionId:F.clientId,placeName:ue,placeId:F.placeId!==void 0?String(F.placeId):"-",state:Ce,routing:je});return x.jsx(Ft,{text:gt,children:x.jsxs("span",{className:`${be.placeChip} ${be.placeChipStatic} ${be.placeChipActive}`,children:[x.jsx("span",{className:be.placeDot,"aria-hidden":"true"}),x.jsx("span",{className:be.placeChipName,children:ue}),F.placeId!==void 0?x.jsx("span",{className:be.placeChipId,children:F.placeId}):null,x.jsx("span",{className:be.placeChipState,children:Ce}),ke?x.jsx("span",{className:be.placeChipClient,children:ie}):null,je!=="-"?x.jsx("span",{className:be.placeChipBadge,children:je}):null]})},F.clientId)}),te.length===0&&ze.length===0?x.jsx(Ft,{text:u("header.activeStudio.emptyTooltip","No Studio plugin is connected. Open Roblox Studio and connect the WEPPY Plugin."),children:x.jsx("span",{className:`${be.placeChip} ${be.placeChipMuted}`,children:x.jsx("span",{className:be.placeChipName,children:Le})})}):ze.map(F=>{const ie=F.placeId===ve,ue=!!(P!=null&&P.pluginConnected)&&F.isConnected,Ce=ue?u("header.places.active","Active"):u("header.places.inactive","Inactive"),ke=gp(u("header.storedPlace.tooltip","Stored project place: {placeName} · Place ID: {placeId} · State: {state}"),{placeName:F.placeName,placeId:String(F.placeId),state:Ce}),je=[be.placeChip,be.placeChipStatic,ie&&ue?be.placeChipActive:be.placeChipInactive].filter(Boolean).join(" ");return x.jsx(Ft,{text:ke,children:x.jsxs("span",{className:je,children:[ie&&ue?x.jsx("span",{className:be.placeDot,"aria-hidden":"true"}):null,x.jsx("span",{className:be.placeChipName,children:F.placeName}),x.jsx("span",{className:be.placeChipId,children:F.placeId})]})},`${F.placeId}:${F.placeDirName}`)})]})]})]}),x.jsxs("div",{className:be.metaActions,children:[!V&&x.jsx(hb,{}),x.jsx(Ft,{text:u("sidebar.controls","Controls"),children:x.jsx(Ea,{to:"/controls","aria-label":u("sidebar.controls","Controls"),className:be.iconButton,onClick:()=>p("dashboard_click_event",{click_target:"top_header_controls",placement:"top_header",...he}),children:x.jsx(Wp,{size:18,strokeWidth:1.75,"aria-hidden":"true",focusable:"false"})})}),x.jsx(Ft,{text:u("sidebar.settings","Settings"),children:x.jsx(Ea,{to:"/settings","aria-label":u("sidebar.settings","Settings"),className:be.iconButton,onClick:()=>p("dashboard_click_event",{click_target:"top_header_settings",placement:"top_header",...he}),children:x.jsx(rS,{size:18,strokeWidth:1.75,"aria-hidden":"true",focusable:"false"})})})]})]}),x.jsx("div",{className:be.row2,"data-testid":"top-header-auxiliary-slot","data-state":w?"visible":"empty","aria-hidden":w?void 0:!0,children:w?x.jsx(Ft,{text:w.tooltip,children:x.jsxs("div",{className:be.auxiliaryPath,children:[x.jsx("span",{className:be.pathLabel,children:w.label}),x.jsx("span",{className:be.projectPath,title:w.value,children:w.value})]})}):null})]})})}const Pb="_layout_ya8ln_2",Cb="_mainShell_ya8ln_8",wb="_content_ya8ln_17",kb="_loading_ya8ln_25",In={layout:Pb,mainShell:Cb,content:wb,loading:kb};function xb(){const{pathname:i,search:n}=Yt(),{trackPageView:r}=us();return R.useEffect(()=>{r(ds(i,n))},[i,n,r]),null}function Rb(){const{t:i}=Ho();return x.jsx("div",{className:In.loading,children:i("common.loading","Loading...")})}function Ab(){return x.jsx(Qy,{children:x.jsx(lf,{children:x.jsxs(qy,{children:[x.jsx(uf,{}),x.jsx(xb,{}),x.jsxs("div",{className:In.layout,children:[x.jsx(Tv,{}),x.jsxs("div",{className:In.mainShell,children:[x.jsx(bb,{}),x.jsx("main",{className:In.content,children:x.jsx(R.Suspense,{fallback:x.jsx(Rb,{}),children:x.jsx(ny,{})})})]})]})]})})})}function hp(i){return i.route==="/"?{index:!0,lazy:i.lazy}:{path:i.route.slice(1),lazy:i.lazy}}const Ib=my([{path:"/",element:x.jsx(Ab,{}),children:[...Fp.map(hp),...ql.map(hp),{path:"changelog/:id",lazy:()=>Kt(()=>import("./ChangelogDetailPage-B1zg2f56.js"),__vite__mapDeps([40,1,7,8,6,41]))},{path:"settings",lazy:()=>Kt(()=>import("./SettingsPage-C0PubIFP.js"),__vite__mapDeps([42,2,3,1,6,36,37,12,13,14,30,31,43]))}]}]);qh.createRoot(document.getElementById("root")).render(x.jsx(wy,{router:Ib}));export{Ta as A,Hb as B,Ub as C,Zl as D,qp as E,Mb as F,Lv as G,Uv as H,Wf as I,Hn as J,Ea as L,eS as M,Tb as N,oS as P,Bp as R,Xy as S,bS as T,gS as X,Et as a,Eb as b,Xl as c,Yt as d,us as e,_n as f,jv as g,SS as h,Ke as i,x as j,Ft as k,df as l,ds as m,zn as n,Tf as o,rS as p,Ly as q,R as r,Xp as s,jb as t,Ho as u,Hv as v,zb as w,Lb as x,_b as y,Np as z};
|
|
606
|
+
Minta seperti biasa: "Buatkan UI."`},severity:"info",category:"release"}],Jl="weppy-dashboard.whatsNew.readIds";function Vp(){try{const i=localStorage.getItem(Jl);if(!i)return new Set;const n=JSON.parse(i);return Array.isArray(n)?new Set(n.filter(r=>typeof r=="string")):new Set}catch{return new Set}}function Mv(i){try{localStorage.setItem(Jl,JSON.stringify([...i]))}catch{}}let di=Vp(),Gp=di;const Wl=new Set;function $p(){Gp=new Set(di);for(const i of Wl)i()}const Ul={subscribe(i){return Wl.add(i),()=>{Wl.delete(i)}},getSnapshot(){return Gp},markRead(i){let n=!1;for(const r of i)di.has(r)||(di.add(r),n=!0);n&&(Mv(di),$p())}};typeof window<"u"&&window.addEventListener("storage",i=>{i.key===Jl&&(di=Vp(),$p())});function Lv(){const i=R.useSyncExternalStore(Ul.subscribe,Ul.getSnapshot),n=Uv.filter(r=>!i.has(r.id)).length;return{readSet:i,unreadCount:n,markRead:Ul.markRead}}const zv="_header_8mywd_2",_v="_row1_8mywd_17",Nv="_contextGroups_8mywd_25",Ov="_projectGroup_8mywd_33",qv="_studioGroup_8mywd_34",Bv="_groupTitleRow_8mywd_52",Wv="_groupLabel_8mywd_59",Fv="_groupIcon_8mywd_73",Kv="_projectName_8mywd_78",Yv="_placeChips_8mywd_90",Vv="_metaActions_8mywd_99",Gv="_placeChip_8mywd_90",$v="_placeChipStatic_8mywd_122",Xv="_placeChipMuted_8mywd_123",Zv="_placeChipActive_8mywd_127",Qv="_placeChipInactive_8mywd_134",Jv="_placeChipId_8mywd_145",eb="_placeChipClient_8mywd_160",tb="_placeChipState_8mywd_166",ob="_placeChipBadge_8mywd_172",ab="_placeDot_8mywd_180",ib="_placeChipName_8mywd_188",sb="_row2_8mywd_196",nb="_pathRow_8mywd_208",rb="_auxiliaryPath_8mywd_209",lb="_pathLabel_8mywd_221",db="_projectPath_8mywd_232",ub="_changeButton_8mywd_242",cb="_iconButton_8mywd_276",be={header:zv,row1:_v,contextGroups:Nv,projectGroup:Ov,studioGroup:qv,groupTitleRow:Bv,groupLabel:Wv,groupIcon:Fv,projectName:Kv,placeChips:Yv,metaActions:Vv,placeChip:Gv,placeChipStatic:$v,placeChipMuted:Xv,placeChipActive:Zv,placeChipInactive:Qv,placeChipId:Jv,placeChipClient:eb,placeChipState:tb,placeChipBadge:ob,placeDot:ab,placeChipName:ib,row2:sb,pathRow:nb,auxiliaryPath:rb,pathLabel:lb,projectPath:db,changeButton:ub,iconButton:cb},pb="_bellWrapper_tae21_2",gb="_unreadDot_tae21_8",up={bellWrapper:pb,unreadDot:gb};function hb(){const{t:i}=Ho(),{unreadCount:n}=Lv(),{trackEvent:r}=us(),{pathname:d,search:u}=Yt(),p=ds(d,u),g=n>0?`${i("header.whatsNew","What's New")} (${n})`:i("header.whatsNew","What's New");return x.jsx(Ft,{text:i("header.whatsNew.tooltip","What's New"),children:x.jsxs("span",{className:up.bellWrapper,children:[x.jsx(Ea,{to:"/whats-new","aria-label":g,className:be.iconButton,onClick:()=>r("dashboard_click_event",{click_target:"top_header_notification_bell",placement:"top_header",...p}),children:"🔔"}),n>0&&x.jsx("span",{className:up.unreadDot,"data-testid":"unread-dot","aria-hidden":"true"})]})})}function Xp(i,n,r){const d=n==="pinned"?r:null;return[...i].sort((u,p)=>mb(u,p,d))}function _b(i,n,r){return Xp(i,n,r)[0]}function mb(i,n,r){if(r){const h=i.clientId===r,v=n.clientId===r;if(h!==v)return h?-1:1}const d=i.lastRoutedAt,u=n.lastRoutedAt,p=d!==void 0;if(p!==(u!==void 0))return p?-1:1;if(d!==void 0&&u!==void 0&&d!==u)return u-d;const y=(i.connectedAt??0)-(n.connectedAt??0);return y!==0?y:i.clientId.localeCompare(n.clientId)}function cp(i){if(!i)return"";const n=i.split(/[\\/]/).filter(Boolean);return n[n.length-1]??""}function yb(i){var d,u;const n=((d=i==null?void 0:i.mcpInstances)==null?void 0:d.filter(p=>!p.isServer&&p.aiClientName))??[];if(n.length===0){const p=((u=i==null?void 0:i.mcpInstances)==null?void 0:u.find(g=>!!g.aiClientName))??null;return(p==null?void 0:p.projectRoot)??(p==null?void 0:p.cwd)??null}n.sort((p,g)=>(g.lastCommandAt??g.connectedAt)-(p.lastCommandAt??p.connectedAt));const r=n[0];return r.projectRoot??r.cwd??null}function pp(i,n){return i??n}function fb(i){const n=i.replace(/^\//,"").split("/")[0];return n===""||n==="overview"}function Sb(i){return i.replace(/^\//,"").split("/")[0]==="whats-new"}function vb(i){return i.replace(/^\//,"").split("/")[0]||"overview"}function gp(i,n){return Object.entries(n).reduce((r,[d,u])=>r.split(`{${d}}`).join(u||"-"),i)}function bb(){var U,ye;const{pathname:i,search:n}=Yt(),{level:r,status:d}=_n(),{t:u}=Ho(),{trackEvent:p}=us(),[g,y]=R.useState(null),[h,v]=R.useState(null),[P,C]=R.useState(null),[D,H]=R.useState(!1),B=u("header.placeNotConnected","Place not connected"),M=(d==null?void 0:d.studioRoutingMode)??"recentPriority",N=(d==null?void 0:d.pinnedTargetClientId)??null,te=Xp((d==null?void 0:d.pluginClients)??[],M,N),K=te[0],X=fb(i),V=Sb(i),he=ds(i,n);R.useEffect(()=>{let F=!1;async function ie(){if(r==="disconnected"){y(null);return}try{const ue=await Et.get("/connection-info");F||y(ue)}catch{F||y(null)}}return ie(),()=>{F=!0}},[r,d==null?void 0:d.sessionId,d==null?void 0:d.connectedClients]),R.useEffect(()=>{let F=!1;async function ie(){if(r==="disconnected"){v(null),H(!1);return}v(null),H(!1);try{const ue=await Hv();F||(v(ue),H(!1))}catch{F||(v(null),H(!0))}}return ie(),()=>{F=!0}},[X,r,d==null?void 0:d.sessionId,d==null?void 0:d.connectedClients]),R.useEffect(()=>{let F=!1;async function ie(){if(r==="disconnected"){C(null);return}try{const ue=await jv();F||C(ue)}catch{F||C(null)}}return ie(),()=>{F=!0}},[r,d==null?void 0:d.sessionId,d==null?void 0:d.connectedClients]);const De=yb(g)??"",E=r==="disconnected"?"blocked":h?"ready":D?"error":"loading",Z=E==="ready"?(h==null?void 0:h.projectRoot)??"":E==="loading"?u("header.currentProject.loading","Loading project root..."):u("header.currentProject.unavailable","Project root unavailable"),Pe=E==="ready"?(h==null?void 0:h.projectRoot)??"":X?"":De,ce=X||E==="ready"?E==="ready"?cp(Pe)||u("header.unknownProject","Unknown project"):E==="loading"?u("header.currentProject.loading","Loading project root..."):u("header.currentProject.unavailable","Project root unavailable"):cp(Pe)||u("header.unknownProject","Unknown project"),Le=pp((ye=(U=d==null?void 0:d.pluginClients)==null?void 0:U[0])==null?void 0:ye.placeName,B),ve=P!=null&&P.pluginConnected?P.activePlaceId:(P==null?void 0:P.lastActivePlaceId)??null,Te=[...(P==null?void 0:P.places)??[]].sort((F,ie)=>{const ue=F.placeId===ve,Ce=ie.placeId===ve;return ue!==Ce?ue?-1:1:F.isConnected!==ie.isConnected?F.isConnected?-1:1:F.placeName.localeCompare(ie.placeName)}),ze=te.length>0?Te.filter(F=>!te.some(ie=>ie.placeId!==void 0&&ie.placeId===F.placeId)):Te,et=X?E==="loading"?u("header.currentProject.loading.tooltip","Project root information is still loading"):E==="error"?u("header.currentProject.unavailable.tooltip","Current project root information is unavailable"):u("header.currentProject.tooltip","Currently selected project folder"):u("header.currentProject.tooltip","Currently selected project folder"),ot=u("header.manageProjectRoot.tooltip","Open Project Root controls"),_e=u("header.activeStudio.tooltip","Connected Studio targets that MCP can route requests to. Studio Routing changes the priority for requests without a named Studio target."),O=Te.find(F=>F.placeId===ve)??null,de=vb(i),G=h!=null&&h.projectSyncRoot&&O?`${h.projectSyncRoot}/${O.placeDirName}`:null,w=de==="playtest"?O!=null&&O.testsPath?{label:u("header.testFiles.label","Test Files"),value:O.testsPath,tooltip:u("header.testFiles.tooltip","Current playtest files directory for the selected place")}:null:["sync","changelog","ui-studio"].includes(de)&&G?{label:u("header.placeData.label","Place Data"),value:G,tooltip:u("header.placeData.tooltip","Current place data directory")}:null;return x.jsx(x.Fragment,{children:x.jsxs("header",{className:be.header,children:[x.jsxs("div",{className:be.row1,children:[x.jsxs("div",{className:be.contextGroups,children:[x.jsxs("section",{className:be.projectGroup,"aria-label":u("header.projectGroup.label","Project"),children:[x.jsxs("div",{className:be.groupTitleRow,children:[x.jsxs("span",{className:be.groupLabel,children:[x.jsx(zf,{size:14,strokeWidth:1.75,"aria-hidden":"true",focusable:"false",className:be.groupIcon}),u("header.projectGroup.label","Project")]}),x.jsx(Ft,{text:et,children:x.jsx("h1",{className:be.projectName,children:ce})}),x.jsx(Ft,{text:ot,children:x.jsx(Ea,{to:"/controls?section=project-root",className:be.changeButton,onClick:()=>p("dashboard_click_event",{click_target:"project_root_manage",placement:"top_header",...he}),children:u("header.manageProjectRoot","Manage Project Root")})})]}),x.jsxs("div",{className:be.pathRow,children:[x.jsx("span",{className:be.pathLabel,children:u("header.projectRoot.label","Project Root")}),x.jsx("span",{className:be.projectPath,title:Z,children:Z})]})]}),x.jsxs("section",{className:be.studioGroup,"aria-label":u("header.activeStudio.label","Active Studio"),children:[x.jsx(Ft,{text:_e,children:x.jsxs("span",{className:be.groupLabel,children:[x.jsx(eS,{size:14,strokeWidth:1.75,"aria-hidden":"true",focusable:"false",className:be.groupIcon}),u("header.activeStudio.label","Active Studio")]})}),x.jsxs("div",{className:be.placeChips,children:[te.map(F=>{const ie=F.targetAlias,ue=pp(F.placeName,B),Ce=F.connectionState??"connected",ke=te.filter(yo=>yo.placeId!==void 0&&yo.placeId===F.placeId).length>1,je=M==="pinned"&&N===F.clientId?u("connection.routing.pinnedBadge","Pinned"):M==="recentPriority"&&(K==null?void 0:K.clientId)===F.clientId?u("connection.routing.priorityBadge","Priority"):"-",gt=gp(u("header.studioTarget.tooltip","Studio ID: {studioId} · Connection ID: {connectionId} · Place: {placeName} · Place ID: {placeId} · State: {state} · Routing: {routing}"),{studioId:ie,connectionId:F.clientId,placeName:ue,placeId:F.placeId!==void 0?String(F.placeId):"-",state:Ce,routing:je});return x.jsx(Ft,{text:gt,children:x.jsxs("span",{className:`${be.placeChip} ${be.placeChipStatic} ${be.placeChipActive}`,children:[x.jsx("span",{className:be.placeDot,"aria-hidden":"true"}),x.jsx("span",{className:be.placeChipName,children:ue}),F.placeId!==void 0?x.jsx("span",{className:be.placeChipId,children:F.placeId}):null,x.jsx("span",{className:be.placeChipState,children:Ce}),ke?x.jsx("span",{className:be.placeChipClient,children:ie}):null,je!=="-"?x.jsx("span",{className:be.placeChipBadge,children:je}):null]})},F.clientId)}),te.length===0&&ze.length===0?x.jsx(Ft,{text:u("header.activeStudio.emptyTooltip","No Studio plugin is connected. Open Roblox Studio and connect the WEPPY Plugin."),children:x.jsx("span",{className:`${be.placeChip} ${be.placeChipMuted}`,children:x.jsx("span",{className:be.placeChipName,children:Le})})}):ze.map(F=>{const ie=F.placeId===ve,ue=!!(P!=null&&P.pluginConnected)&&F.isConnected,Ce=ue?u("header.places.active","Active"):u("header.places.inactive","Inactive"),ke=gp(u("header.storedPlace.tooltip","Stored project place: {placeName} · Place ID: {placeId} · State: {state}"),{placeName:F.placeName,placeId:String(F.placeId),state:Ce}),je=[be.placeChip,be.placeChipStatic,ie&&ue?be.placeChipActive:be.placeChipInactive].filter(Boolean).join(" ");return x.jsx(Ft,{text:ke,children:x.jsxs("span",{className:je,children:[ie&&ue?x.jsx("span",{className:be.placeDot,"aria-hidden":"true"}):null,x.jsx("span",{className:be.placeChipName,children:F.placeName}),x.jsx("span",{className:be.placeChipId,children:F.placeId})]})},`${F.placeId}:${F.placeDirName}`)})]})]})]}),x.jsxs("div",{className:be.metaActions,children:[!V&&x.jsx(hb,{}),x.jsx(Ft,{text:u("sidebar.controls","Controls"),children:x.jsx(Ea,{to:"/controls","aria-label":u("sidebar.controls","Controls"),className:be.iconButton,onClick:()=>p("dashboard_click_event",{click_target:"top_header_controls",placement:"top_header",...he}),children:x.jsx(Wp,{size:18,strokeWidth:1.75,"aria-hidden":"true",focusable:"false"})})}),x.jsx(Ft,{text:u("sidebar.settings","Settings"),children:x.jsx(Ea,{to:"/settings","aria-label":u("sidebar.settings","Settings"),className:be.iconButton,onClick:()=>p("dashboard_click_event",{click_target:"top_header_settings",placement:"top_header",...he}),children:x.jsx(rS,{size:18,strokeWidth:1.75,"aria-hidden":"true",focusable:"false"})})})]})]}),x.jsx("div",{className:be.row2,"data-testid":"top-header-auxiliary-slot","data-state":w?"visible":"empty","aria-hidden":w?void 0:!0,children:w?x.jsx(Ft,{text:w.tooltip,children:x.jsxs("div",{className:be.auxiliaryPath,children:[x.jsx("span",{className:be.pathLabel,children:w.label}),x.jsx("span",{className:be.projectPath,title:w.value,children:w.value})]})}):null})]})})}const Pb="_layout_ya8ln_2",Cb="_mainShell_ya8ln_8",wb="_content_ya8ln_17",kb="_loading_ya8ln_25",In={layout:Pb,mainShell:Cb,content:wb,loading:kb};function xb(){const{pathname:i,search:n}=Yt(),{trackPageView:r}=us();return R.useEffect(()=>{r(ds(i,n))},[i,n,r]),null}function Rb(){const{t:i}=Ho();return x.jsx("div",{className:In.loading,children:i("common.loading","Loading...")})}function Ab(){return x.jsx(Qy,{children:x.jsx(lf,{children:x.jsxs(qy,{children:[x.jsx(uf,{}),x.jsx(xb,{}),x.jsxs("div",{className:In.layout,children:[x.jsx(Tv,{}),x.jsxs("div",{className:In.mainShell,children:[x.jsx(bb,{}),x.jsx("main",{className:In.content,children:x.jsx(R.Suspense,{fallback:x.jsx(Rb,{}),children:x.jsx(ny,{})})})]})]})]})})})}function hp(i){return i.route==="/"?{index:!0,lazy:i.lazy}:{path:i.route.slice(1),lazy:i.lazy}}const Ib=my([{path:"/",element:x.jsx(Ab,{}),children:[...Fp.map(hp),...ql.map(hp),{path:"changelog/:id",lazy:()=>Kt(()=>import("./ChangelogDetailPage-DTl_Tw_v.js"),__vite__mapDeps([40,1,7,8,6,41]))},{path:"settings",lazy:()=>Kt(()=>import("./SettingsPage-BiCf2ur7.js"),__vite__mapDeps([42,2,3,1,6,36,37,12,13,14,30,31,43]))}]}]);qh.createRoot(document.getElementById("root")).render(x.jsx(wy,{router:Ib}));export{Ta as A,Hb as B,Ub as C,Zl as D,qp as E,Mb as F,Lv as G,Uv as H,Wf as I,Hn as J,Ea as L,eS as M,Tb as N,oS as P,Bp as R,Xy as S,bS as T,gS as X,Et as a,Eb as b,Xl as c,Yt as d,us as e,_n as f,jv as g,SS as h,Ke as i,x as j,Ft as k,df as l,ds as m,zn as n,Tf as o,rS as p,Ly as q,R as r,Xp as s,jb as t,Ho as u,Hv as v,zb as w,Lb as x,_b as y,Np as z};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{n as P,q as v,u as G,r as d,j as n}from"./index-DYezp9b1.js";async function u(t,e){const r=await fetch(`${P}${t}`,e);if(!r.ok){let a=null;try{a=await r.json()}catch{}throw new v(r.status,(a==null?void 0:a.message)??r.statusText,(a==null?void 0:a.error)??null,a)}return r.json()}function S(t){return{headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}}function Q(t){return u(`/api/ui-studio/usage?placeId=${t}`)}function J(t,e={}){const r=new URLSearchParams({placeId:String(t)});for(const[a,s]of Object.entries(e))s!=null&&r.set(a,String(s));return u(`/api/ui-studio/requests?${r}`)}function V(t,e){return u(`/api/ui-studio/requests/${encodeURIComponent(e)}?placeId=${t}`)}function X(t,e){return u("/api/ui-studio/requests",{method:"DELETE",...S({placeId:t,...e})})}function ee(t,e){return u(`/api/ui-studio/snapshots/${encodeURIComponent(e)}?placeId=${t}`,{method:"DELETE"})}function te(t,e){return u("/api/ui-studio/snapshots",{method:"DELETE",...S({placeId:t,...e})})}function ae(t,e){const r=new URLSearchParams({placeId:String(t)});if(e)for(const[a,s]of Object.entries(e))s!=null&&r.set(`preview.${a}`,String(s));return u(`/api/ui-studio/cleanup?${r}`)}function re(t,e){return u("/api/ui-studio/cleanup",{method:"PUT",...S({placeId:t,...e})})}function se(t){return u(`/api/ui-studio/cleanup/run?placeId=${t}`,{method:"POST"})}function ie(t,e){return u("/api/ui-studio/run",{method:"POST",...S({action:t,params:e})})}const D="_overlay_1mkpg_4",A="_dialog_1mkpg_15",C="_title_1mkpg_28",E="_titleDanger_1mkpg_37",x="_message_1mkpg_42",U="_cascadeRow_1mkpg_50",H="_actions_1mkpg_69",Z="_cancelBtn_1mkpg_77",R="_confirmBtn_1mkpg_99",w="_confirmBtnDanger_1mkpg_122",L="_busySpinner_1mkpg_129",o={overlay:D,dialog:A,title:C,titleDanger:E,message:x,cascadeRow:U,actions:H,cancelBtn:Z,confirmBtn:R,confirmBtnDanger:w,busySpinner:L};function oe({title:t,message:e,danger:r=!1,cascadeOption:a,confirmLabel:s,busy:i=!1,onConfirm:T,onClose:p}){const{t:g}=G(),[_,h]=d.useState(!1),b=d.useRef(null),y=d.useRef(null);d.useEffect(()=>{var m;(m=b.current)==null||m.focus()},[]),d.useEffect(()=>{const m=l=>{if(l.key==="Escape"&&!i&&!_){p();return}if(l.key==="Tab"&&y.current){const f=Array.from(y.current.querySelectorAll('button:not([disabled]), input:not([disabled]), [tabindex]:not([tabindex="-1"])'));if(f.length===0)return;const q=f[0],I=f[f.length-1];l.shiftKey&&document.activeElement===q?(l.preventDefault(),I.focus()):!l.shiftKey&&document.activeElement===I&&(l.preventDefault(),q.focus())}};return document.addEventListener("keydown",m),()=>document.removeEventListener("keydown",m)},[i,_,p]);const k=async()=>{if(!(_||i)){h(!0);try{await T()}finally{h(!1)}}},B=()=>{!i&&!_&&p()},c=i||_,M=s??g("common.delete","삭제");return n.jsx("div",{className:o.overlay,role:"presentation",onClick:B,children:n.jsxs("div",{ref:y,className:o.dialog,role:"dialog","aria-modal":"true","aria-labelledby":"delete-confirm-title",onClick:m=>m.stopPropagation(),children:[n.jsx("h2",{id:"delete-confirm-title",className:`${o.title} ${r?o.titleDanger:""}`,children:t}),n.jsx("p",{className:o.message,children:e}),a&&n.jsxs("label",{className:o.cascadeRow,children:[n.jsx("input",{type:"checkbox",checked:a.checked,onChange:m=>a.onChange(m.target.checked),disabled:c}),a.label]}),n.jsxs("div",{className:o.actions,children:[n.jsx("button",{ref:b,className:o.cancelBtn,onClick:p,disabled:c,type:"button",children:g("common.cancel","취소")}),n.jsxs("button",{className:`${o.confirmBtn} ${r?o.confirmBtnDanger:""}`,onClick:()=>void k(),disabled:c,type:"button",children:[c&&n.jsx("span",{className:o.busySpinner,"aria-hidden":"true"}),M]})]})]})})}const j="/dashboard/assets/ui-studio-sample-DrNTD6yi.png",ne=j,ue={requestCount:6,mutationCount:22,snapshotCount:8,historyBytes:12e3,snapshotBytes:48e4,totalBytes:492e3},me={mode:"off",cascadeSnapshots:!0},z={sample_req_1:"uiStudio.sample.history.request1.label",sample_req_2:"uiStudio.sample.history.request2.label",sample_req_3:"uiStudio.sample.history.request3.label",sample_req_4:"uiStudio.sample.history.request4.label",sample_req_5:"uiStudio.sample.history.request5.label",sample_req_6:"uiStudio.sample.history.request6.label"},O={sample_mut_1_1:"uiStudio.sample.history.request1.mutation1.diff",sample_mut_1_2:"uiStudio.sample.history.request1.mutation2.diff",sample_mut_1_3:"uiStudio.sample.history.request1.mutation3.diff",sample_mut_1_4:"uiStudio.sample.history.request1.mutation4.diff",sample_mut_1_5:"uiStudio.sample.history.request1.mutation5.diff",sample_mut_2_1:"uiStudio.sample.history.request2.mutation1.diff",sample_mut_2_2:"uiStudio.sample.history.request2.mutation2.diff",sample_mut_2_3:"uiStudio.sample.history.request2.mutation3.diff",sample_mut_2_4:"uiStudio.sample.history.request2.mutation4.diff",sample_mut_3_1:"uiStudio.sample.history.request3.mutation1.diff",sample_mut_3_2:"uiStudio.sample.history.request3.mutation2.diff",sample_mut_4_1:"uiStudio.sample.history.request4.mutation1.diff",sample_mut_4_2:"uiStudio.sample.history.request4.mutation2.diff",sample_mut_4_3:"uiStudio.sample.history.request4.mutation3.diff",sample_mut_4_4:"uiStudio.sample.history.request4.mutation4.diff",sample_mut_4_5:"uiStudio.sample.history.request4.mutation5.diff",sample_mut_4_6:"uiStudio.sample.history.request4.mutation6.diff",sample_mut_5_1:"uiStudio.sample.history.request5.mutation1.diff",sample_mut_6_1:"uiStudio.sample.history.request6.mutation1.diff",sample_mut_6_2:"uiStudio.sample.history.request6.mutation2.diff",sample_mut_6_3:"uiStudio.sample.history.request6.mutation3.diff",sample_mut_6_4:"uiStudio.sample.history.request6.mutation4.diff"},N={BackgroundColor3:"uiStudio.sample.history.detail.backgroundColor",AnchorPoint:"uiStudio.sample.history.detail.anchorPoint",Position:"uiStudio.sample.history.detail.position",Size:"uiStudio.sample.history.detail.size",TextColor3:"uiStudio.sample.history.detail.textColor",TextSize:"uiStudio.sample.history.detail.textSize",BorderSizePixel:"uiStudio.sample.history.detail.borderSize",BorderColor3:"uiStudio.sample.history.detail.borderColor"},$={sample_mut_6_3:"uiStudio.sample.history.request6.mutation3.error",sample_mut_6_4:"uiStudio.sample.history.request6.mutation4.error"},K=[{requestId:"sample_req_1",label:"HUD 레이아웃 초기 생성",startedAt:"2026-05-03T09:12:00.000Z",closedAt:"2026-05-03T09:12:04.321Z",closeReason:"explicit",ok:!0,affectedPaths:["StarterGui.HUD"],mutationCount:5,beforeSnapshots:{"StarterGui.HUD":null},afterSnapshots:{"StarterGui.HUD":"sample_snap_1"},childMutationIds:["sample_mut_1_1","sample_mut_1_2","sample_mut_1_3","sample_mut_1_4","sample_mut_1_5"]},{requestId:"sample_req_2",label:"Inventory 모달 디자인 업데이트",startedAt:"2026-05-03T10:04:18.000Z",closedAt:"2026-05-03T10:04:22.817Z",closeReason:"idle_timeout",ok:!0,affectedPaths:["StarterGui.Inventory.Modal","StarterGui.Inventory.Modal.Header"],mutationCount:4,beforeSnapshots:{"StarterGui.Inventory.Modal":"sample_snap_1","StarterGui.Inventory.Modal.Header":"sample_snap_1"},afterSnapshots:{"StarterGui.Inventory.Modal":"sample_snap_2","StarterGui.Inventory.Modal.Header":"sample_snap_2"},childMutationIds:["sample_mut_2_1","sample_mut_2_2","sample_mut_2_3","sample_mut_2_4"]},{requestId:"sample_req_3",label:"HUD HealthBar 색상 수정",startedAt:"2026-05-03T11:30:55.000Z",closedAt:"2026-05-03T11:30:57.102Z",closeReason:"context_change",ok:!0,affectedPaths:["StarterGui.HUD.HealthBar"],mutationCount:2,beforeSnapshots:{"StarterGui.HUD.HealthBar":"sample_snap_2"},afterSnapshots:{"StarterGui.HUD.HealthBar":"sample_snap_3"},childMutationIds:["sample_mut_3_1","sample_mut_3_2"]},{requestId:"sample_req_4",label:"Inventory 탭 버튼 터치 타겟 확대",startedAt:"2026-05-03T13:22:11.000Z",closedAt:"2026-05-03T13:22:14.500Z",closeReason:"explicit",ok:!0,affectedPaths:["StarterGui.Inventory.TabBar.TabAll","StarterGui.Inventory.TabBar.TabWeapon","StarterGui.Inventory.TabBar.TabArmor"],mutationCount:6,beforeSnapshots:{"StarterGui.Inventory.TabBar.TabAll":"sample_snap_3","StarterGui.Inventory.TabBar.TabWeapon":"sample_snap_3","StarterGui.Inventory.TabBar.TabArmor":"sample_snap_3"},afterSnapshots:{"StarterGui.Inventory.TabBar.TabAll":"sample_snap_4","StarterGui.Inventory.TabBar.TabWeapon":"sample_snap_4","StarterGui.Inventory.TabBar.TabArmor":"sample_snap_4"},childMutationIds:["sample_mut_4_1","sample_mut_4_2","sample_mut_4_3","sample_mut_4_4","sample_mut_4_5","sample_mut_4_6"]},{requestId:"sample_req_5",label:"Settings 팝업 삭제",startedAt:"2026-05-03T14:45:33.000Z",closedAt:"2026-05-03T14:45:34.290Z",closeReason:"legacy_single",ok:!0,affectedPaths:["StarterGui.Settings"],mutationCount:1,beforeSnapshots:{"StarterGui.Settings":"sample_snap_4"},afterSnapshots:{"StarterGui.Settings":null},childMutationIds:["sample_mut_5_1"]},{requestId:"sample_req_6",label:"HUD 미니맵 컴포넌트 추가",startedAt:"2026-05-03T16:08:47.000Z",closedAt:"2026-05-03T16:08:51.776Z",closeReason:"server_restart",ok:!1,affectedPaths:["StarterGui.HUD.Minimap"],mutationCount:4,beforeSnapshots:{"StarterGui.HUD.Minimap":null},afterSnapshots:{"StarterGui.HUD.Minimap":"sample_snap_5"},childMutationIds:["sample_mut_6_1","sample_mut_6_2","sample_mut_6_3","sample_mut_6_4"]}],Y={sample_req_1:[{mutationId:"sample_mut_1_1",requestId:"sample_req_1",ts:"2026-05-03T09:12:00.500Z",command:"manage_ui_create_tree",origin:"ai",targetPath:"StarterGui.HUD",diffSummary:"Frame + HealthBar + StaminaBar 생성",ok:!0,durationMs:312},{mutationId:"sample_mut_1_2",requestId:"sample_req_1",ts:"2026-05-03T09:12:01.000Z",command:"manage_ui_update",origin:"ai",targetPath:"StarterGui.HUD.HealthBar",diffSummary:"BackgroundColor3 → Color3.new(0.2,0.8,0.2)",changeDetails:[{property:"BackgroundColor3",category:"color",label:"배경색",before:{r:36,g:42,b:52},after:{r:51,g:204,b:51}}],ok:!0,durationMs:84},{mutationId:"sample_mut_1_3",requestId:"sample_req_1",ts:"2026-05-03T09:12:01.500Z",command:"manage_ui_update",origin:"ai",targetPath:"StarterGui.HUD.StaminaBar",diffSummary:"BackgroundColor3 → Color3.new(0.1,0.6,1.0)",ok:!0,durationMs:76},{mutationId:"sample_mut_1_4",requestId:"sample_req_1",ts:"2026-05-03T09:12:02.000Z",command:"manage_ui_update",origin:"ai",targetPath:"StarterGui.HUD",diffSummary:"AnchorPoint, Position, Size 설정",changeDetails:[{property:"AnchorPoint",category:"layout",label:"앵커",before:{x:.5,y:.5},after:{x:0,y:0}},{property:"Position",category:"layout",label:"위치",before:{xScale:.5,xOffset:0,yScale:.5,yOffset:0},after:{xScale:0,xOffset:16,yScale:0,yOffset:16}},{property:"Size",category:"size",label:"사이즈",before:{xScale:0,xOffset:240,yScale:0,yOffset:64},after:{xScale:0,xOffset:320,yScale:0,yOffset:80}}],ok:!0,durationMs:91},{mutationId:"sample_mut_1_5",requestId:"sample_req_1",ts:"2026-05-03T09:12:02.500Z",command:"manage_ui_preview",origin:"ai",targetPath:"StarterGui.HUD",diffSummary:"화면 캡처 저장 완료",ok:!0,durationMs:1521}],sample_req_2:[{mutationId:"sample_mut_2_1",requestId:"sample_req_2",ts:"2026-05-03T10:04:18.500Z",command:"manage_ui_update",origin:"ai",targetPath:"StarterGui.Inventory.Modal.Header",diffSummary:"BackgroundColor3 어둡게 조정 (대비 개선)",ok:!0,durationMs:102},{mutationId:"sample_mut_2_2",requestId:"sample_req_2",ts:"2026-05-03T10:04:19.000Z",command:"manage_ui_update",origin:"ai",targetPath:"StarterGui.Inventory.Modal.Header.Title",diffSummary:"TextColor3 → Color3.new(1,1,1), TextSize 16→18",changeDetails:[{property:"TextColor3",category:"color",label:"글자색",before:{r:212,g:222,b:238},after:{r:255,g:255,b:255}},{property:"TextSize",category:"size",label:"글자 크기",before:16,after:18}],ok:!0,durationMs:88},{mutationId:"sample_mut_2_3",requestId:"sample_req_2",ts:"2026-05-03T10:04:19.500Z",command:"manage_ui_update",origin:"ai",targetPath:"StarterGui.Inventory.Modal",diffSummary:"BorderSizePixel 0→2, BorderColor3 설정",changeDetails:[{property:"BorderSizePixel",category:"size",label:"테두리 크기",before:0,after:2},{property:"BorderColor3",category:"color",label:"테두리색",before:{r:86,g:99,b:122},after:{r:255,g:255,b:255}}],ok:!0,durationMs:95},{mutationId:"sample_mut_2_4",requestId:"sample_req_2",ts:"2026-05-03T10:04:20.000Z",command:"manage_ui_preview",origin:"ai",targetPath:"StarterGui.Inventory.Modal",diffSummary:"화면 캡처 저장 완료",ok:!0,durationMs:1802}],sample_req_3:[{mutationId:"sample_mut_3_1",requestId:"sample_req_3",ts:"2026-05-03T11:30:55.500Z",command:"manage_ui_update",origin:"ai",targetPath:"StarterGui.HUD.HealthBar",diffSummary:"BackgroundColor3 → Color3.new(0.9,0.2,0.2) (빨간 계열)",ok:!0,durationMs:80},{mutationId:"sample_mut_3_2",requestId:"sample_req_3",ts:"2026-05-03T11:30:56.000Z",command:"manage_ui_preview",origin:"ai",targetPath:"StarterGui.HUD.HealthBar",diffSummary:"화면 캡처 저장 완료",ok:!0,durationMs:1102}],sample_req_4:[{mutationId:"sample_mut_4_1",requestId:"sample_req_4",ts:"2026-05-03T13:22:11.300Z",command:"manage_ui_update",origin:"ai",targetPath:"StarterGui.Inventory.TabBar.TabAll",diffSummary:"Size {0,64},{0,32} → {0,64},{0,44}",ok:!0,durationMs:78},{mutationId:"sample_mut_4_2",requestId:"sample_req_4",ts:"2026-05-03T13:22:11.700Z",command:"manage_ui_update",origin:"ai",targetPath:"StarterGui.Inventory.TabBar.TabWeapon",diffSummary:"Size {0,64},{0,32} → {0,64},{0,44}",ok:!0,durationMs:71},{mutationId:"sample_mut_4_3",requestId:"sample_req_4",ts:"2026-05-03T13:22:12.100Z",command:"manage_ui_update",origin:"ai",targetPath:"StarterGui.Inventory.TabBar.TabArmor",diffSummary:"Size {0,64},{0,32} → {0,64},{0,44}",ok:!0,durationMs:73},{mutationId:"sample_mut_4_4",requestId:"sample_req_4",ts:"2026-05-03T13:22:12.500Z",command:"manage_ui_update",origin:"ai",targetPath:"StarterGui.Inventory.TabBar.TabConsume",diffSummary:"Size {0,64},{0,32} → {0,64},{0,44}",ok:!0,durationMs:70},{mutationId:"sample_mut_4_5",requestId:"sample_req_4",ts:"2026-05-03T13:22:12.900Z",command:"manage_ui_update",origin:"ai",targetPath:"StarterGui.Inventory.TabBar.TabMisc",diffSummary:"Size {0,64},{0,32} → {0,64},{0,44}",ok:!0,durationMs:72},{mutationId:"sample_mut_4_6",requestId:"sample_req_4",ts:"2026-05-03T13:22:13.300Z",command:"manage_ui_preview",origin:"ai",targetPath:"StarterGui.Inventory.TabBar.TabAll",diffSummary:"화면 캡처 저장 완료",ok:!0,durationMs:1200}],sample_req_5:[{mutationId:"sample_mut_5_1",requestId:"sample_req_5",ts:"2026-05-03T14:45:33.500Z",command:"manage_ui_delete",origin:"ai",targetPath:"StarterGui.Settings",diffSummary:"ScreenGui 제거 (Settings 전용 UI)",ok:!0,durationMs:290}],sample_req_6:[{mutationId:"sample_mut_6_1",requestId:"sample_req_6",ts:"2026-05-03T16:08:47.500Z",command:"manage_ui_create_tree",origin:"ai",targetPath:"StarterGui.HUD.Minimap",diffSummary:"Frame + MapImage + PlayerDot 생성 시도",ok:!0,durationMs:340},{mutationId:"sample_mut_6_2",requestId:"sample_req_6",ts:"2026-05-03T16:08:48.200Z",command:"manage_ui_update",origin:"ai",targetPath:"StarterGui.HUD.Minimap",diffSummary:"Size, Position, BackgroundTransparency 설정",ok:!0,durationMs:84},{mutationId:"sample_mut_6_3",requestId:"sample_req_6",ts:"2026-05-03T16:08:48.900Z",command:"manage_ui_update",origin:"ai",targetPath:"StarterGui.HUD.Minimap.MapImage",diffSummary:"ImageLabel 설정 중 서버 재시작으로 중단",ok:!1,error:"server_restart: connection lost",durationMs:700},{mutationId:"sample_mut_6_4",requestId:"sample_req_6",ts:"2026-05-03T16:08:49.700Z",command:"manage_ui_preview",origin:"ai",targetPath:"StarterGui.HUD.Minimap",diffSummary:"불완전 화면 캡처 저장",ok:!1,error:"partial snapshot: missing layers",durationMs:876}]};function F(t,e){var s;const r=O[e.mutationId],a=$[e.mutationId];return{...e,diffSummary:e.diffSummary&&r?t(r,e.diffSummary):e.diffSummary,error:e.error&&a?t(a,e.error):e.error,changeDetails:(s=e.changeDetails)==null?void 0:s.map(i=>({...i,label:t(N[i.property]??"",i.label)}))}}function le(t){const e=K.map(a=>({...a,label:a.label?t(z[a.requestId]??"",a.label):a.label})),r=Object.fromEntries(Object.entries(Y).map(([a,s])=>[a,s.map(i=>F(t,i))]));return{requests:e,mutationsByRequest:r}}export{oe as D,ue as S,Q as a,me as b,ie as c,X as d,ee as e,ae as f,j as g,te as h,J as i,V as j,le as k,ne as l,se as r,re as s};
|
|
1
|
+
import{n as P,q as v,u as G,r as d,j as n}from"./index-CJJYSnlB.js";async function u(t,e){const r=await fetch(`${P}${t}`,e);if(!r.ok){let a=null;try{a=await r.json()}catch{}throw new v(r.status,(a==null?void 0:a.message)??r.statusText,(a==null?void 0:a.error)??null,a)}return r.json()}function S(t){return{headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}}function Q(t){return u(`/api/ui-studio/usage?placeId=${t}`)}function J(t,e={}){const r=new URLSearchParams({placeId:String(t)});for(const[a,s]of Object.entries(e))s!=null&&r.set(a,String(s));return u(`/api/ui-studio/requests?${r}`)}function V(t,e){return u(`/api/ui-studio/requests/${encodeURIComponent(e)}?placeId=${t}`)}function X(t,e){return u("/api/ui-studio/requests",{method:"DELETE",...S({placeId:t,...e})})}function ee(t,e){return u(`/api/ui-studio/snapshots/${encodeURIComponent(e)}?placeId=${t}`,{method:"DELETE"})}function te(t,e){return u("/api/ui-studio/snapshots",{method:"DELETE",...S({placeId:t,...e})})}function ae(t,e){const r=new URLSearchParams({placeId:String(t)});if(e)for(const[a,s]of Object.entries(e))s!=null&&r.set(`preview.${a}`,String(s));return u(`/api/ui-studio/cleanup?${r}`)}function re(t,e){return u("/api/ui-studio/cleanup",{method:"PUT",...S({placeId:t,...e})})}function se(t){return u(`/api/ui-studio/cleanup/run?placeId=${t}`,{method:"POST"})}function ie(t,e){return u("/api/ui-studio/run",{method:"POST",...S({action:t,params:e})})}const D="_overlay_1mkpg_4",A="_dialog_1mkpg_15",C="_title_1mkpg_28",E="_titleDanger_1mkpg_37",x="_message_1mkpg_42",U="_cascadeRow_1mkpg_50",H="_actions_1mkpg_69",Z="_cancelBtn_1mkpg_77",R="_confirmBtn_1mkpg_99",w="_confirmBtnDanger_1mkpg_122",L="_busySpinner_1mkpg_129",o={overlay:D,dialog:A,title:C,titleDanger:E,message:x,cascadeRow:U,actions:H,cancelBtn:Z,confirmBtn:R,confirmBtnDanger:w,busySpinner:L};function oe({title:t,message:e,danger:r=!1,cascadeOption:a,confirmLabel:s,busy:i=!1,onConfirm:T,onClose:p}){const{t:g}=G(),[_,h]=d.useState(!1),b=d.useRef(null),y=d.useRef(null);d.useEffect(()=>{var m;(m=b.current)==null||m.focus()},[]),d.useEffect(()=>{const m=l=>{if(l.key==="Escape"&&!i&&!_){p();return}if(l.key==="Tab"&&y.current){const f=Array.from(y.current.querySelectorAll('button:not([disabled]), input:not([disabled]), [tabindex]:not([tabindex="-1"])'));if(f.length===0)return;const q=f[0],I=f[f.length-1];l.shiftKey&&document.activeElement===q?(l.preventDefault(),I.focus()):!l.shiftKey&&document.activeElement===I&&(l.preventDefault(),q.focus())}};return document.addEventListener("keydown",m),()=>document.removeEventListener("keydown",m)},[i,_,p]);const k=async()=>{if(!(_||i)){h(!0);try{await T()}finally{h(!1)}}},B=()=>{!i&&!_&&p()},c=i||_,M=s??g("common.delete","삭제");return n.jsx("div",{className:o.overlay,role:"presentation",onClick:B,children:n.jsxs("div",{ref:y,className:o.dialog,role:"dialog","aria-modal":"true","aria-labelledby":"delete-confirm-title",onClick:m=>m.stopPropagation(),children:[n.jsx("h2",{id:"delete-confirm-title",className:`${o.title} ${r?o.titleDanger:""}`,children:t}),n.jsx("p",{className:o.message,children:e}),a&&n.jsxs("label",{className:o.cascadeRow,children:[n.jsx("input",{type:"checkbox",checked:a.checked,onChange:m=>a.onChange(m.target.checked),disabled:c}),a.label]}),n.jsxs("div",{className:o.actions,children:[n.jsx("button",{ref:b,className:o.cancelBtn,onClick:p,disabled:c,type:"button",children:g("common.cancel","취소")}),n.jsxs("button",{className:`${o.confirmBtn} ${r?o.confirmBtnDanger:""}`,onClick:()=>void k(),disabled:c,type:"button",children:[c&&n.jsx("span",{className:o.busySpinner,"aria-hidden":"true"}),M]})]})]})})}const j="/dashboard/assets/ui-studio-sample-DrNTD6yi.png",ne=j,ue={requestCount:6,mutationCount:22,snapshotCount:8,historyBytes:12e3,snapshotBytes:48e4,totalBytes:492e3},me={mode:"off",cascadeSnapshots:!0},z={sample_req_1:"uiStudio.sample.history.request1.label",sample_req_2:"uiStudio.sample.history.request2.label",sample_req_3:"uiStudio.sample.history.request3.label",sample_req_4:"uiStudio.sample.history.request4.label",sample_req_5:"uiStudio.sample.history.request5.label",sample_req_6:"uiStudio.sample.history.request6.label"},O={sample_mut_1_1:"uiStudio.sample.history.request1.mutation1.diff",sample_mut_1_2:"uiStudio.sample.history.request1.mutation2.diff",sample_mut_1_3:"uiStudio.sample.history.request1.mutation3.diff",sample_mut_1_4:"uiStudio.sample.history.request1.mutation4.diff",sample_mut_1_5:"uiStudio.sample.history.request1.mutation5.diff",sample_mut_2_1:"uiStudio.sample.history.request2.mutation1.diff",sample_mut_2_2:"uiStudio.sample.history.request2.mutation2.diff",sample_mut_2_3:"uiStudio.sample.history.request2.mutation3.diff",sample_mut_2_4:"uiStudio.sample.history.request2.mutation4.diff",sample_mut_3_1:"uiStudio.sample.history.request3.mutation1.diff",sample_mut_3_2:"uiStudio.sample.history.request3.mutation2.diff",sample_mut_4_1:"uiStudio.sample.history.request4.mutation1.diff",sample_mut_4_2:"uiStudio.sample.history.request4.mutation2.diff",sample_mut_4_3:"uiStudio.sample.history.request4.mutation3.diff",sample_mut_4_4:"uiStudio.sample.history.request4.mutation4.diff",sample_mut_4_5:"uiStudio.sample.history.request4.mutation5.diff",sample_mut_4_6:"uiStudio.sample.history.request4.mutation6.diff",sample_mut_5_1:"uiStudio.sample.history.request5.mutation1.diff",sample_mut_6_1:"uiStudio.sample.history.request6.mutation1.diff",sample_mut_6_2:"uiStudio.sample.history.request6.mutation2.diff",sample_mut_6_3:"uiStudio.sample.history.request6.mutation3.diff",sample_mut_6_4:"uiStudio.sample.history.request6.mutation4.diff"},N={BackgroundColor3:"uiStudio.sample.history.detail.backgroundColor",AnchorPoint:"uiStudio.sample.history.detail.anchorPoint",Position:"uiStudio.sample.history.detail.position",Size:"uiStudio.sample.history.detail.size",TextColor3:"uiStudio.sample.history.detail.textColor",TextSize:"uiStudio.sample.history.detail.textSize",BorderSizePixel:"uiStudio.sample.history.detail.borderSize",BorderColor3:"uiStudio.sample.history.detail.borderColor"},$={sample_mut_6_3:"uiStudio.sample.history.request6.mutation3.error",sample_mut_6_4:"uiStudio.sample.history.request6.mutation4.error"},K=[{requestId:"sample_req_1",label:"HUD 레이아웃 초기 생성",startedAt:"2026-05-03T09:12:00.000Z",closedAt:"2026-05-03T09:12:04.321Z",closeReason:"explicit",ok:!0,affectedPaths:["StarterGui.HUD"],mutationCount:5,beforeSnapshots:{"StarterGui.HUD":null},afterSnapshots:{"StarterGui.HUD":"sample_snap_1"},childMutationIds:["sample_mut_1_1","sample_mut_1_2","sample_mut_1_3","sample_mut_1_4","sample_mut_1_5"]},{requestId:"sample_req_2",label:"Inventory 모달 디자인 업데이트",startedAt:"2026-05-03T10:04:18.000Z",closedAt:"2026-05-03T10:04:22.817Z",closeReason:"idle_timeout",ok:!0,affectedPaths:["StarterGui.Inventory.Modal","StarterGui.Inventory.Modal.Header"],mutationCount:4,beforeSnapshots:{"StarterGui.Inventory.Modal":"sample_snap_1","StarterGui.Inventory.Modal.Header":"sample_snap_1"},afterSnapshots:{"StarterGui.Inventory.Modal":"sample_snap_2","StarterGui.Inventory.Modal.Header":"sample_snap_2"},childMutationIds:["sample_mut_2_1","sample_mut_2_2","sample_mut_2_3","sample_mut_2_4"]},{requestId:"sample_req_3",label:"HUD HealthBar 색상 수정",startedAt:"2026-05-03T11:30:55.000Z",closedAt:"2026-05-03T11:30:57.102Z",closeReason:"context_change",ok:!0,affectedPaths:["StarterGui.HUD.HealthBar"],mutationCount:2,beforeSnapshots:{"StarterGui.HUD.HealthBar":"sample_snap_2"},afterSnapshots:{"StarterGui.HUD.HealthBar":"sample_snap_3"},childMutationIds:["sample_mut_3_1","sample_mut_3_2"]},{requestId:"sample_req_4",label:"Inventory 탭 버튼 터치 타겟 확대",startedAt:"2026-05-03T13:22:11.000Z",closedAt:"2026-05-03T13:22:14.500Z",closeReason:"explicit",ok:!0,affectedPaths:["StarterGui.Inventory.TabBar.TabAll","StarterGui.Inventory.TabBar.TabWeapon","StarterGui.Inventory.TabBar.TabArmor"],mutationCount:6,beforeSnapshots:{"StarterGui.Inventory.TabBar.TabAll":"sample_snap_3","StarterGui.Inventory.TabBar.TabWeapon":"sample_snap_3","StarterGui.Inventory.TabBar.TabArmor":"sample_snap_3"},afterSnapshots:{"StarterGui.Inventory.TabBar.TabAll":"sample_snap_4","StarterGui.Inventory.TabBar.TabWeapon":"sample_snap_4","StarterGui.Inventory.TabBar.TabArmor":"sample_snap_4"},childMutationIds:["sample_mut_4_1","sample_mut_4_2","sample_mut_4_3","sample_mut_4_4","sample_mut_4_5","sample_mut_4_6"]},{requestId:"sample_req_5",label:"Settings 팝업 삭제",startedAt:"2026-05-03T14:45:33.000Z",closedAt:"2026-05-03T14:45:34.290Z",closeReason:"legacy_single",ok:!0,affectedPaths:["StarterGui.Settings"],mutationCount:1,beforeSnapshots:{"StarterGui.Settings":"sample_snap_4"},afterSnapshots:{"StarterGui.Settings":null},childMutationIds:["sample_mut_5_1"]},{requestId:"sample_req_6",label:"HUD 미니맵 컴포넌트 추가",startedAt:"2026-05-03T16:08:47.000Z",closedAt:"2026-05-03T16:08:51.776Z",closeReason:"server_restart",ok:!1,affectedPaths:["StarterGui.HUD.Minimap"],mutationCount:4,beforeSnapshots:{"StarterGui.HUD.Minimap":null},afterSnapshots:{"StarterGui.HUD.Minimap":"sample_snap_5"},childMutationIds:["sample_mut_6_1","sample_mut_6_2","sample_mut_6_3","sample_mut_6_4"]}],Y={sample_req_1:[{mutationId:"sample_mut_1_1",requestId:"sample_req_1",ts:"2026-05-03T09:12:00.500Z",command:"manage_ui_create_tree",origin:"ai",targetPath:"StarterGui.HUD",diffSummary:"Frame + HealthBar + StaminaBar 생성",ok:!0,durationMs:312},{mutationId:"sample_mut_1_2",requestId:"sample_req_1",ts:"2026-05-03T09:12:01.000Z",command:"manage_ui_update",origin:"ai",targetPath:"StarterGui.HUD.HealthBar",diffSummary:"BackgroundColor3 → Color3.new(0.2,0.8,0.2)",changeDetails:[{property:"BackgroundColor3",category:"color",label:"배경색",before:{r:36,g:42,b:52},after:{r:51,g:204,b:51}}],ok:!0,durationMs:84},{mutationId:"sample_mut_1_3",requestId:"sample_req_1",ts:"2026-05-03T09:12:01.500Z",command:"manage_ui_update",origin:"ai",targetPath:"StarterGui.HUD.StaminaBar",diffSummary:"BackgroundColor3 → Color3.new(0.1,0.6,1.0)",ok:!0,durationMs:76},{mutationId:"sample_mut_1_4",requestId:"sample_req_1",ts:"2026-05-03T09:12:02.000Z",command:"manage_ui_update",origin:"ai",targetPath:"StarterGui.HUD",diffSummary:"AnchorPoint, Position, Size 설정",changeDetails:[{property:"AnchorPoint",category:"layout",label:"앵커",before:{x:.5,y:.5},after:{x:0,y:0}},{property:"Position",category:"layout",label:"위치",before:{xScale:.5,xOffset:0,yScale:.5,yOffset:0},after:{xScale:0,xOffset:16,yScale:0,yOffset:16}},{property:"Size",category:"size",label:"사이즈",before:{xScale:0,xOffset:240,yScale:0,yOffset:64},after:{xScale:0,xOffset:320,yScale:0,yOffset:80}}],ok:!0,durationMs:91},{mutationId:"sample_mut_1_5",requestId:"sample_req_1",ts:"2026-05-03T09:12:02.500Z",command:"manage_ui_preview",origin:"ai",targetPath:"StarterGui.HUD",diffSummary:"화면 캡처 저장 완료",ok:!0,durationMs:1521}],sample_req_2:[{mutationId:"sample_mut_2_1",requestId:"sample_req_2",ts:"2026-05-03T10:04:18.500Z",command:"manage_ui_update",origin:"ai",targetPath:"StarterGui.Inventory.Modal.Header",diffSummary:"BackgroundColor3 어둡게 조정 (대비 개선)",ok:!0,durationMs:102},{mutationId:"sample_mut_2_2",requestId:"sample_req_2",ts:"2026-05-03T10:04:19.000Z",command:"manage_ui_update",origin:"ai",targetPath:"StarterGui.Inventory.Modal.Header.Title",diffSummary:"TextColor3 → Color3.new(1,1,1), TextSize 16→18",changeDetails:[{property:"TextColor3",category:"color",label:"글자색",before:{r:212,g:222,b:238},after:{r:255,g:255,b:255}},{property:"TextSize",category:"size",label:"글자 크기",before:16,after:18}],ok:!0,durationMs:88},{mutationId:"sample_mut_2_3",requestId:"sample_req_2",ts:"2026-05-03T10:04:19.500Z",command:"manage_ui_update",origin:"ai",targetPath:"StarterGui.Inventory.Modal",diffSummary:"BorderSizePixel 0→2, BorderColor3 설정",changeDetails:[{property:"BorderSizePixel",category:"size",label:"테두리 크기",before:0,after:2},{property:"BorderColor3",category:"color",label:"테두리색",before:{r:86,g:99,b:122},after:{r:255,g:255,b:255}}],ok:!0,durationMs:95},{mutationId:"sample_mut_2_4",requestId:"sample_req_2",ts:"2026-05-03T10:04:20.000Z",command:"manage_ui_preview",origin:"ai",targetPath:"StarterGui.Inventory.Modal",diffSummary:"화면 캡처 저장 완료",ok:!0,durationMs:1802}],sample_req_3:[{mutationId:"sample_mut_3_1",requestId:"sample_req_3",ts:"2026-05-03T11:30:55.500Z",command:"manage_ui_update",origin:"ai",targetPath:"StarterGui.HUD.HealthBar",diffSummary:"BackgroundColor3 → Color3.new(0.9,0.2,0.2) (빨간 계열)",ok:!0,durationMs:80},{mutationId:"sample_mut_3_2",requestId:"sample_req_3",ts:"2026-05-03T11:30:56.000Z",command:"manage_ui_preview",origin:"ai",targetPath:"StarterGui.HUD.HealthBar",diffSummary:"화면 캡처 저장 완료",ok:!0,durationMs:1102}],sample_req_4:[{mutationId:"sample_mut_4_1",requestId:"sample_req_4",ts:"2026-05-03T13:22:11.300Z",command:"manage_ui_update",origin:"ai",targetPath:"StarterGui.Inventory.TabBar.TabAll",diffSummary:"Size {0,64},{0,32} → {0,64},{0,44}",ok:!0,durationMs:78},{mutationId:"sample_mut_4_2",requestId:"sample_req_4",ts:"2026-05-03T13:22:11.700Z",command:"manage_ui_update",origin:"ai",targetPath:"StarterGui.Inventory.TabBar.TabWeapon",diffSummary:"Size {0,64},{0,32} → {0,64},{0,44}",ok:!0,durationMs:71},{mutationId:"sample_mut_4_3",requestId:"sample_req_4",ts:"2026-05-03T13:22:12.100Z",command:"manage_ui_update",origin:"ai",targetPath:"StarterGui.Inventory.TabBar.TabArmor",diffSummary:"Size {0,64},{0,32} → {0,64},{0,44}",ok:!0,durationMs:73},{mutationId:"sample_mut_4_4",requestId:"sample_req_4",ts:"2026-05-03T13:22:12.500Z",command:"manage_ui_update",origin:"ai",targetPath:"StarterGui.Inventory.TabBar.TabConsume",diffSummary:"Size {0,64},{0,32} → {0,64},{0,44}",ok:!0,durationMs:70},{mutationId:"sample_mut_4_5",requestId:"sample_req_4",ts:"2026-05-03T13:22:12.900Z",command:"manage_ui_update",origin:"ai",targetPath:"StarterGui.Inventory.TabBar.TabMisc",diffSummary:"Size {0,64},{0,32} → {0,64},{0,44}",ok:!0,durationMs:72},{mutationId:"sample_mut_4_6",requestId:"sample_req_4",ts:"2026-05-03T13:22:13.300Z",command:"manage_ui_preview",origin:"ai",targetPath:"StarterGui.Inventory.TabBar.TabAll",diffSummary:"화면 캡처 저장 완료",ok:!0,durationMs:1200}],sample_req_5:[{mutationId:"sample_mut_5_1",requestId:"sample_req_5",ts:"2026-05-03T14:45:33.500Z",command:"manage_ui_delete",origin:"ai",targetPath:"StarterGui.Settings",diffSummary:"ScreenGui 제거 (Settings 전용 UI)",ok:!0,durationMs:290}],sample_req_6:[{mutationId:"sample_mut_6_1",requestId:"sample_req_6",ts:"2026-05-03T16:08:47.500Z",command:"manage_ui_create_tree",origin:"ai",targetPath:"StarterGui.HUD.Minimap",diffSummary:"Frame + MapImage + PlayerDot 생성 시도",ok:!0,durationMs:340},{mutationId:"sample_mut_6_2",requestId:"sample_req_6",ts:"2026-05-03T16:08:48.200Z",command:"manage_ui_update",origin:"ai",targetPath:"StarterGui.HUD.Minimap",diffSummary:"Size, Position, BackgroundTransparency 설정",ok:!0,durationMs:84},{mutationId:"sample_mut_6_3",requestId:"sample_req_6",ts:"2026-05-03T16:08:48.900Z",command:"manage_ui_update",origin:"ai",targetPath:"StarterGui.HUD.Minimap.MapImage",diffSummary:"ImageLabel 설정 중 서버 재시작으로 중단",ok:!1,error:"server_restart: connection lost",durationMs:700},{mutationId:"sample_mut_6_4",requestId:"sample_req_6",ts:"2026-05-03T16:08:49.700Z",command:"manage_ui_preview",origin:"ai",targetPath:"StarterGui.HUD.Minimap",diffSummary:"불완전 화면 캡처 저장",ok:!1,error:"partial snapshot: missing layers",durationMs:876}]};function F(t,e){var s;const r=O[e.mutationId],a=$[e.mutationId];return{...e,diffSummary:e.diffSummary&&r?t(r,e.diffSummary):e.diffSummary,error:e.error&&a?t(a,e.error):e.error,changeDetails:(s=e.changeDetails)==null?void 0:s.map(i=>({...i,label:t(N[i.property]??"",i.label)}))}}function le(t){const e=K.map(a=>({...a,label:a.label?t(z[a.requestId]??"",a.label):a.label})),r=Object.fromEntries(Object.entries(Y).map(([a,s])=>[a,s.map(i=>F(t,i))]));return{requests:e,mutationsByRequest:r}}export{oe as D,ue as S,Q as a,me as b,ie as c,X as d,ee as e,ae as f,j as g,te as h,J as i,V as j,le as k,ne as l,se as r,re as s};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as a}from"./index-
|
|
1
|
+
import{r as a}from"./index-CJJYSnlB.js";function c(t){const r=Math.max(0,Math.floor(t/1e3)),n=Math.floor(r/3600),o=Math.floor(r%3600/60),e=Math.floor(r%60);return`${String(n).padStart(2,"0")}:${String(o).padStart(2,"0")}:${String(e).padStart(2,"0")}`}const s=1e3;function i(t){const[r,n]=a.useState(t??null);return a.useEffect(()=>{if(t==null){n(null);return}const o=Date.now();n(t);const e=window.setInterval(()=>{n(t+(Date.now()-o))},s);return()=>{window.clearInterval(e)}},[t]),r}export{c as f,i as u};
|