@weppy/roblox-mcp 2.2.2 → 2.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.github/workflows/install-test.yml +108 -0
  3. package/CHANGELOG.md +31 -0
  4. package/README.md +14 -10
  5. package/docs/en/installation/README.md +4 -4
  6. package/docs/en/installation/roblox-explorer.md +13 -3
  7. package/docs/en/installation/roblox-plugin.md +42 -31
  8. package/docs/en/pro-upgrade.md +26 -12
  9. package/docs/en/sync/luau-lsp.md +41 -0
  10. package/docs/en/sync/overview.md +4 -1
  11. package/docs/es/README.md +13 -7
  12. package/docs/es/installation/README.md +4 -4
  13. package/docs/es/pro-upgrade.md +26 -12
  14. package/docs/es/sync/luau-lsp.md +41 -0
  15. package/docs/es/sync/overview.md +4 -1
  16. package/docs/id/README.md +12 -6
  17. package/docs/id/installation/README.md +4 -4
  18. package/docs/id/pro-upgrade.md +26 -12
  19. package/docs/id/sync/luau-lsp.md +41 -0
  20. package/docs/id/sync/overview.md +4 -1
  21. package/docs/installer/assets/index-Bz0amd7x.js +63 -0
  22. package/docs/installer/assets/index-ei4lRUa6.css +1 -0
  23. package/docs/installer/index.html +14 -0
  24. package/docs/installer/manifest.webmanifest +15 -0
  25. package/docs/installer/sw.js +7 -0
  26. package/docs/installer/wrox-icon.png +0 -0
  27. package/docs/ja/README.md +14 -10
  28. package/docs/ja/installation/README.md +3 -3
  29. package/docs/ja/pro-upgrade.md +26 -12
  30. package/docs/ja/sync/luau-lsp.md +41 -0
  31. package/docs/ja/sync/overview.md +4 -1
  32. package/docs/ko/README.md +14 -10
  33. package/docs/ko/installation/README.md +4 -4
  34. package/docs/ko/installation/roblox-explorer.md +13 -3
  35. package/docs/ko/installation/roblox-plugin.md +42 -31
  36. package/docs/ko/pro-upgrade.md +26 -12
  37. package/docs/ko/sync/luau-lsp.md +41 -0
  38. package/docs/ko/sync/overview.md +4 -1
  39. package/docs/pt-br/README.md +13 -7
  40. package/docs/pt-br/installation/README.md +4 -4
  41. package/docs/pt-br/pro-upgrade.md +26 -12
  42. package/docs/pt-br/sync/luau-lsp.md +41 -0
  43. package/docs/pt-br/sync/overview.md +4 -1
  44. package/docs/troubleshooting.md +1 -1
  45. package/install.ps1 +468 -98
  46. package/install.sh +461 -71
  47. package/llms-full.txt +14 -2
  48. package/llms.txt +10 -4
  49. package/package.json +1 -1
  50. package/plugins/weppy-roblox-mcp/.claude-plugin/plugin.json +1 -1
  51. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/{ChangelogDetailPage-D7eMrarv.js → ChangelogDetailPage-ITTDURna.js} +1 -1
  52. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/{ChangelogPage-DFCCRyyK.js → ChangelogPage-DjVot-60.js} +1 -1
  53. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/{ConfirmModal-BmRJ2JXZ.js → ConfirmModal-B1q8BGeA.js} +1 -1
  54. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/ConnectionPage-9bG71eB1.css +1 -0
  55. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/ConnectionPage-D4y36l03.js +1 -0
  56. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/{InfoLabel-CCDWZLC9.js → InfoLabel-COMRAIq0.js} +1 -1
  57. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/{OverviewPage-BHpt3LI2.js → OverviewPage-DojgIxVT.js} +1 -1
  58. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/{PlaytestPage-CNwwI5Ro.js → PlaytestPage-CkEvf6XW.js} +1 -1
  59. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/PropertyDiff-r9iLxfi8.js +6 -0
  60. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/{SettingsPage-CPqQYZPN.js → SettingsPage-CEs6Ob3d.js} +1 -1
  61. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/{StatusBadge-C8VKAPpk.js → StatusBadge-DHhSWmAT.js} +1 -1
  62. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/SyncPage-ifjnfsNg.js +4 -0
  63. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/{TierComparison-7ofkPwj3.js → TierComparison-C29caZ6C.js} +1 -1
  64. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/{TierPromoProgress-SnRUjAPh.js → TierPromoProgress-BdEtTxkK.js} +1 -1
  65. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/{ToolsPage-CrdNh3D9.js → ToolsPage-BOIC0ngW.js} +1 -1
  66. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/index-CQYn3Wfp.js +129 -0
  67. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/{useLiveUptime-BnXeLpOw.js → useLiveUptime-Dco8Aiiz.js} +1 -1
  68. package/plugins/weppy-roblox-mcp/dashboard/dist/index.html +1 -1
  69. package/plugins/weppy-roblox-mcp/dist/index.js +86 -83
  70. package/plugins/weppy-roblox-mcp/roblox-plugin/WeppyRobloxMCP.rbxm +0 -0
  71. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/ConnectionPage-CN3LYLAT.css +0 -1
  72. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/ConnectionPage-CiaCY026.js +0 -1
  73. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/PropertyDiff-DIplDn-J.js +0 -6
  74. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/SyncPage-DTSKbpio.js +0 -4
  75. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/index-DGGmfli1.js +0 -129
@@ -1 +0,0 @@
1
- ._container_1h084_2{max-height:200px;overflow-y:auto;font-family:var(--font-code);font-size:12px;line-height:1.6;padding:8px 12px;background:var(--bg-secondary);border-radius:4px}._entry_1h084_14{display:flex;gap:8px;white-space:nowrap}._timestamp_1h084_21{color:var(--text-muted);flex-shrink:0}._message_1h084_27{color:var(--text-primary);overflow:hidden;text-overflow:ellipsis}._warn_1h084_34 ._message_1h084_27{color:var(--warning)}._error_1h084_39 ._message_1h084_27{color:var(--error)}._empty_1h084_44{color:var(--text-muted);font-style:italic;padding:8px 0}._page_12byi_2{display:flex;flex-direction:column;gap:16px;max-width:820px}._card_12byi_10{background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius);padding:16px 20px}._disabled_12byi_18{opacity:.4;pointer-events:none}._cardHeader_12byi_24{font-family:var(--font-label);font-weight:500;font-size:11px;text-transform:uppercase;letter-spacing:.05em;color:var(--text-secondary);margin-bottom:12px;display:flex;align-items:center;justify-content:space-between}._clearButton_12byi_37{border:1px solid rgba(209,84,84,.5);background:#d154541f;color:#f4c1c1;border-radius:8px;padding:6px 12px;cursor:pointer}._serverGrid_12byi_47{display:grid;grid-template-columns:auto 1fr;gap:4px 16px;font-family:var(--font-code);font-size:13px}._serverGrid_12byi_47 dt{color:var(--text-muted)}._serverGrid_12byi_47 dd{color:var(--text-primary);margin:0}._statusRow_12byi_65{display:flex;align-items:center;gap:16px;margin-bottom:12px}._metaItem_12byi_72{font-family:var(--font-code);font-size:12px;color:var(--text-secondary)}._table_12byi_79{width:100%;border-collapse:collapse;font-family:var(--font-code);font-size:12px}._table_12byi_79 th{text-align:left;color:var(--text-muted);font-weight:400;padding:4px 8px 4px 0;border-bottom:1px solid var(--border)}._table_12byi_79 td{padding:6px 8px 6px 0;color:var(--text-primary)}._table_12byi_79 tr:hover td{background:var(--accent-dim)}._toggleBtn_12byi_104{background:none;border:none;color:var(--text-secondary);cursor:pointer;font-size:12px;padding:0 4px;transition:color var(--transition)}._toggleBtn_12byi_104:hover{color:var(--accent)}._disconnected_12byi_119{text-align:center;padding:32px 16px}._disconnected_12byi_119 h3{color:var(--error);font-size:16px;margin:0 0 8px}._disconnected_12byi_119 p{color:var(--text-secondary);font-size:13px;margin:0 0 4px}._disconnectedActions_12byi_136{display:flex;gap:8px;justify-content:center;margin-top:16px}._btn_12byi_143{font-family:var(--font-label);font-size:12px;padding:6px 14px;border-radius:4px;border:1px solid var(--border);background:var(--bg-secondary);color:var(--text-primary);cursor:pointer;transition:background var(--transition),border-color var(--transition)}._btn_12byi_143:hover{border-color:var(--accent);background:var(--accent-dim)}._emptyRow_12byi_161{color:var(--text-muted);font-style:italic}
@@ -1 +0,0 @@
1
- import{u as $,r,j as e,d as R,a as N,D as I,i as L,T as M}from"./index-DGGmfli1.js";import{I as a}from"./InfoLabel-CCDWZLC9.js";import{S as A}from"./StatusBadge-C8VKAPpk.js";import{C as E}from"./ConfirmModal-BmRJ2JXZ.js";import{u as P,f as k}from"./useLiveUptime-BnXeLpOw.js";const T="_container_1h084_2",H="_entry_1h084_14",B="_timestamp_1h084_21",D="_message_1h084_27",F="_warn_1h084_34",U="_error_1h084_39",G="_empty_1h084_44",v={container:T,entry:H,timestamp:B,message:D,warn:F,error:U,empty:G};function O(n){const t=new Date(n);return Number.isNaN(t.getTime())?n:`${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}`}function V({entries:n}){const{t}=$(),c=r.useRef(null);return r.useEffect(()=>{const l=c.current;l&&(l.scrollTop=l.scrollHeight)},[n.length]),e.jsx("div",{ref:c,className:v.container,children:n.length===0?e.jsx("div",{className:v.empty,children:t("connection.log.empty","No events yet")}):n.map((l,u)=>e.jsxs("div",{className:`${v.entry} ${l.type?v[l.type]:""}`,children:[e.jsx("span",{className:v.timestamp,children:O(l.timestamp)}),e.jsx("span",{className:v.message,children:l.message})]},u))})}const S=50;function q(){const n=new Date;return`${String(n.getHours()).padStart(2,"0")}:${String(n.getMinutes()).padStart(2,"0")}`}function X(){const{level:n,status:t,error:c}=R(),[l,u]=r.useState(null),[y,h]=r.useState([]),g=r.useRef(null),_=r.useCallback((i,f)=>{h(d=>{const p=[...d,{timestamp:q(),message:i,type:f}];return p.length>S?p.slice(-S):p})},[]),x=r.useCallback(async()=>{try{const i=await N.get("/connection-info");u(i)}catch{u(null)}},[]),j=r.useCallback(async()=>{try{const i=await N.get("/api/dashboard/connection-log");h(i.entries??[])}catch{h([])}},[]),C=r.useCallback(async()=>{await N.post("/api/dashboard/connection-log/clear"),h([])},[]);return r.useEffect(()=>{n!=="disconnected"&&t&&x(),j()},[n,t,x,j]),r.useEffect(()=>{const i=new I;g.current=i,i.connect();const f=i.on("connection",p=>{const m=p,b=m.status==="connected"?"connected":"disconnected";_(`Plugin ${b} — ${m.clientId}`,m.status==="connected"?"info":"warn")}),d=i.on("mcp_status",p=>{const m=p,b=m.status==="registered"?"registered":"unregistered";_(`MCP ${b} — ${m.aiClientName}`,m.status==="registered"?"info":"warn"),x()});return()=>{f(),d(),i.disconnect(),g.current=null}},[_,x]),{status:t,connectionInfo:l,connectionLog:y,level:n,error:c,clearConnectionLog:C}}const z="_page_12byi_2",J="_card_12byi_10",K="_disabled_12byi_18",Q="_cardHeader_12byi_24",W="_clearButton_12byi_37",Y="_serverGrid_12byi_47",Z="_statusRow_12byi_65",ee="_table_12byi_79",ne="_toggleBtn_12byi_104",te="_disconnected_12byi_119",se="_disconnectedActions_12byi_136",ce="_btn_12byi_143",oe="_emptyRow_12byi_161",s={page:z,card:J,disabled:K,cardHeader:Q,clearButton:W,serverGrid:Y,statusRow:Z,table:ee,toggleBtn:ne,disconnected:te,disconnectedActions:se,btn:ce,emptyRow:oe};function w(n,t){const c=Math.max(0,Math.floor((Date.now()-n)/1e3));return c<60?`${c}${t("connection.time.secondsAgo","s ago")}`:c<3600?`${Math.floor(c/60)}${t("connection.time.minutesAgo","m ago")}`:`${Math.floor(c/3600)}${t("connection.time.hoursAgo","h ago")}`}function pe(){var b;const{t:n}=$(),{status:t,connectionInfo:c,connectionLog:l,level:u,clearConnectionLog:y}=X(),{show:h}=L(),[g,_]=r.useState(!0),[x,j]=r.useState(!1),[C,i]=r.useState(!1),f=P(t==null?void 0:t.uptime),d=u==="disconnected",p=d?"offline":"online",m=async()=>{i(!0);try{await y(),h(n("toast.clearSuccess","Cleared successfully"),"success"),j(!1)}catch{h(n("toast.clearFailed","Failed to clear data"),"error")}finally{i(!1)}};return e.jsxs("div",{className:s.page,children:[e.jsxs("div",{className:s.card,children:[e.jsx("div",{className:s.cardHeader,children:n("connection.server.title","Server Status")}),d?e.jsxs("div",{className:s.disconnected,children:[e.jsx("h3",{children:n("level.l0.title")}),e.jsx("p",{children:n("level.l0.message")}),e.jsx("p",{children:n("common.reconnecting")}),e.jsxs("div",{className:s.disconnectedActions,children:[e.jsx("button",{className:s.btn,onClick:()=>window.location.reload(),children:n("connection.reconnect","Reconnect")}),e.jsx("button",{className:s.btn,onClick:()=>{window.location.hash="#/settings"},children:n("connection.checkSettings","Check Settings")})]})]}):e.jsxs(e.Fragment,{children:[e.jsx("div",{className:s.statusRow,children:e.jsx(A,{status:p})}),e.jsxs("dl",{className:s.serverGrid,children:[(t==null?void 0:t.version)&&e.jsxs(e.Fragment,{children:[e.jsx("dt",{children:e.jsx(a,{label:n("connection.server.version","Version"),tooltip:n("connection.server.version.tooltip","Installed MCP server version")})}),e.jsx("dd",{children:e.jsx(M,{text:n("connection.server.version.tooltip","Installed MCP server version"),children:`v${t.version}`})})]}),(t==null?void 0:t.pid)!=null&&e.jsxs(e.Fragment,{children:[e.jsx("dt",{children:e.jsx(a,{label:n("connection.server.pid","PID"),tooltip:n("connection.server.pid.tooltip","Operating system process identifier")})}),e.jsx("dd",{children:t.pid})]}),(t==null?void 0:t.uptime)!=null&&e.jsxs(e.Fragment,{children:[e.jsx("dt",{children:e.jsx(a,{label:n("connection.server.uptime","Uptime"),tooltip:n("connection.server.uptime.tooltip","Time elapsed since the MCP server started")})}),e.jsx("dd",{children:k(f??t.uptime)})]}),(t==null?void 0:t.sessionId)&&e.jsxs(e.Fragment,{children:[e.jsx("dt",{children:e.jsx(a,{label:n("connection.server.session","Session"),tooltip:n("connection.server.session.tooltip","Current MCP session identifier")})}),e.jsx("dd",{children:t.sessionId.slice(0,8)})]}),(c==null?void 0:c.serverExecutable)&&e.jsxs(e.Fragment,{children:[e.jsx("dt",{children:e.jsx(a,{label:n("connection.server.exec","Exec"),tooltip:n("connection.server.exec.tooltip","Executable path used to launch the MCP server")})}),e.jsx("dd",{children:c.serverExecutable})]})]})]})]}),e.jsxs("div",{className:`${s.card} ${d?s.disabled:""}`,children:[e.jsxs("div",{className:s.cardHeader,children:[e.jsxs("span",{children:[n("connection.agents.title","AI Agents")," ","(",(c==null?void 0:c.mcpInstanceCount)??0,")"]}),e.jsx("button",{className:s.toggleBtn,onClick:()=>_(o=>!o),"aria-label":g?n("common.collapse","Collapse"):n("common.expand","Expand"),children:g?"▾":"▸"})]}),g&&e.jsxs("table",{className:s.table,children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{children:n("connection.agents.name","Agent")}),e.jsx("th",{children:e.jsx(a,{label:n("connection.server.pid","PID"),tooltip:n("connection.server.pid.tooltip","Operating system process identifier")})}),e.jsx("th",{children:e.jsx(a,{label:n("connection.agents.projectRoot","Project Root"),tooltip:n("connection.agents.projectRoot.tooltip","Authoritative project root for sync ownership")})}),e.jsx("th",{children:n("connection.agents.connected","Connected")})]})}),e.jsx("tbody",{children:c!=null&&c.mcpInstances&&c.mcpInstances.length>0?c.mcpInstances.map(o=>e.jsxs("tr",{children:[e.jsx("td",{children:o.aiClientName??n("connection.agents.unknown","Unknown")}),e.jsx("td",{children:o.pid}),e.jsx("td",{children:o.projectRoot??o.cwd??n("connection.agents.projectRoot.unresolved","Unresolved")}),e.jsx("td",{children:w(o.connectedAt,n)})]},o.instanceId)):e.jsx("tr",{children:e.jsx("td",{colSpan:4,className:s.emptyRow,children:n("connection.agents.none","No agents connected")})})})]})]}),e.jsxs("div",{className:`${s.card} ${d?s.disabled:""}`,children:[e.jsxs("div",{className:s.cardHeader,children:[n("connection.plugins.title","Plugins")," ","(",((b=t==null?void 0:t.pluginClients)==null?void 0:b.length)??0,")"]}),e.jsxs("table",{className:s.table,children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{children:n("connection.plugins.place","Place")}),e.jsx("th",{children:e.jsx(a,{label:n("connection.plugins.clientId","Client ID"),tooltip:n("connection.plugins.clientId.tooltip","Unique plugin client identifier for this Studio connection")})}),e.jsx("th",{children:e.jsx(a,{label:n("connection.plugins.lastSeen","Last Seen"),tooltip:n("connection.plugins.lastSeen.tooltip","Most recent heartbeat received from the plugin")})}),e.jsx("th",{children:e.jsx(a,{label:n("connection.plugins.version","Ver"),tooltip:n("connection.plugins.version.tooltip","Installed plugin version reported by Studio")})})]})}),e.jsx("tbody",{children:t!=null&&t.pluginClients&&t.pluginClients.length>0?t.pluginClients.map(o=>e.jsxs("tr",{children:[e.jsx("td",{children:o.placeName??o.projectName??"-"}),e.jsx("td",{children:o.clientId.slice(0,10)}),e.jsx("td",{children:w(o.lastSeen,n)}),e.jsx("td",{children:o.pluginVersion??"-"})]},o.clientId)):e.jsx("tr",{children:e.jsx("td",{colSpan:4,className:s.emptyRow,children:n("connection.plugins.none","No plugins connected")})})})]})]}),e.jsxs("div",{className:`${s.card} ${d?s.disabled:""}`,children:[e.jsxs("div",{className:s.cardHeader,children:[e.jsx("span",{children:n("connection.log.title","Connection Log")}),e.jsx("button",{className:s.clearButton,onClick:()=>j(!0),children:n("common.clear","Clear")})]}),e.jsx(V,{entries:l})]}),e.jsx(E,{open:x,title:n("connection.clear.title","Clear connection log?"),message:n("connection.clear.message","This permanently removes the stored connection log for the current project."),cancelLabel:n("common.cancel","Cancel"),confirmLabel:n("common.clear","Clear"),loading:C,onCancel:()=>!C&&j(!1),onConfirm:m})]})}export{pe as Component};
@@ -1,6 +0,0 @@
1
- import{u as f,r as h,j as n}from"./index-DGGmfli1.js";const _="_container_uv8oc_2",p="_header_uv8oc_10",N="_modeBtn_uv8oc_18",x="_modeBtnActive_uv8oc_33",v="_unifiedView_uv8oc_40",j="_diffLine_uv8oc_46",y="_lineNum_uv8oc_55",g="_lineContent_uv8oc_64",C="_lineAdded_uv8oc_68",B="_lineRemoved_uv8oc_73",V="_lineContext_uv8oc_78",w="_sideBySide_uv8oc_83",L="_sidePane_uv8oc_90",$="_sideLabel_uv8oc_100",b="_sideContent_uv8oc_112",A="_empty_uv8oc_117",e={container:_,header:p,modeBtn:N,modeBtnActive:x,unifiedView:v,diffLine:j,lineNum:y,lineContent:g,lineAdded:C,lineRemoved:B,lineContext:V,sideBySide:w,sidePane:L,sideLabel:$,sideContent:b,empty:A};function S(t,c){const d=t.split(`
2
- `),l=c.split(`
3
- `),a=[],m=Math.max(d.length,l.length);let s=0,i=0;for(;(s<d.length||i<l.length)&&(s<d.length&&i<l.length?d[s]===l[i]?(a.push({type:"context",content:d[s],lineNum:i+1}),s++,i++):(a.push({type:"removed",content:d[s],lineNum:s+1}),s++,s<d.length&&d[s]===l[i]?(a.push({type:"added",content:l[i],lineNum:i+1}),i++):i<l.length&&(a.push({type:"added",content:l[i],lineNum:i+1}),i++)):s<d.length?(a.push({type:"removed",content:d[s],lineNum:s+1}),s++):i<l.length&&(a.push({type:"added",content:l[i],lineNum:i+1}),i++),!(a.length>m*3)););return a}function E({before:t,after:c}){const{t:d}=f(),[l,a]=h.useState("unified"),m=h.useMemo(()=>S(t??"",c??""),[t,c]);if(!t&&!c)return n.jsx("div",{className:e.container,children:n.jsx("div",{className:e.empty,children:d("changelog.diff.empty","No diff available")})});if(!t&&c){const s=c.split(`
4
- `);return n.jsx("div",{className:e.container,children:n.jsx("div",{className:e.unifiedView,children:s.map((i,u)=>n.jsxs("div",{className:`${e.diffLine} ${e.lineAdded}`,children:[n.jsx("span",{className:e.lineNum,children:u+1}),n.jsxs("span",{className:e.lineContent,children:["+ ",i]})]},u))})})}return n.jsxs("div",{className:e.container,children:[n.jsxs("div",{className:e.header,children:[n.jsx("button",{className:`${e.modeBtn} ${l==="unified"?e.modeBtnActive:""}`,onClick:()=>a("unified"),children:d("changelog.diff.unified","Unified")}),n.jsx("button",{className:`${e.modeBtn} ${l==="side-by-side"?e.modeBtnActive:""}`,onClick:()=>a("side-by-side"),children:d("changelog.diff.sideBySide","Side by Side")})]}),l==="unified"?n.jsx("div",{className:e.unifiedView,children:m.map((s,i)=>n.jsxs("div",{className:`${e.diffLine} ${s.type==="added"?e.lineAdded:s.type==="removed"?e.lineRemoved:e.lineContext}`,children:[n.jsx("span",{className:e.lineNum,children:s.lineNum??""}),n.jsxs("span",{className:e.lineContent,children:[s.type==="added"?"+ ":s.type==="removed"?"- ":" ",s.content]})]},i))}):n.jsxs("div",{className:e.sideBySide,children:[n.jsxs("div",{className:e.sidePane,children:[n.jsx("div",{className:e.sideLabel,children:d("changelog.diff.before","Before")}),n.jsx("div",{className:e.sideContent,children:(t??"").split(`
5
- `).map((s,i)=>n.jsxs("div",{className:`${e.diffLine} ${e.lineContext}`,children:[n.jsx("span",{className:e.lineNum,children:i+1}),n.jsx("span",{className:e.lineContent,children:s})]},i))})]}),n.jsxs("div",{className:e.sidePane,children:[n.jsx("div",{className:e.sideLabel,children:d("changelog.diff.after","After")}),n.jsx("div",{className:e.sideContent,children:(c??"").split(`
6
- `).map((s,i)=>n.jsxs("div",{className:`${e.diffLine} ${e.lineContext}`,children:[n.jsx("span",{className:e.lineNum,children:i+1}),n.jsx("span",{className:e.lineContent,children:s})]},i))})]})]})]})}const P="_container_8lpbs_2",R="_oldValue_8lpbs_11",D="_arrow_8lpbs_17",k="_newValue_8lpbs_22",o={container:P,oldValue:R,arrow:D,newValue:k};function r(t){return t==null?"nil":typeof t=="string"?`"${t}"`:typeof t=="object"?JSON.stringify(t):String(t)}function J({before:t,after:c}){const d=t!=null,l=c!=null;return!d&&!l?null:d?l?n.jsxs("div",{className:o.container,children:[n.jsx("span",{className:o.oldValue,children:r(t)}),n.jsx("span",{className:o.arrow,children:"→"}),n.jsx("span",{className:o.newValue,children:r(c)})]}):n.jsx("div",{className:o.container,children:n.jsx("span",{className:o.oldValue,children:r(t)})}):n.jsx("div",{className:o.container,children:n.jsx("span",{className:o.newValue,children:r(c)})})}export{E as D,J as P};
@@ -1,4 +0,0 @@
1
- import{r as o,a as T,D as R,u as I,k as L,l as k,j as e,d as P,i as O,T as f,m as E}from"./index-DGGmfli1.js";import{I as w}from"./InfoLabel-CCDWZLC9.js";import{C as $}from"./ConfirmModal-BmRJ2JXZ.js";import{S as A}from"./StatusBadge-C8VKAPpk.js";import{D as B,a as D,u as H,T as M}from"./TierComparison-7ofkPwj3.js";import{t as l}from"./TierPromo.module-CAoUYgIx.js";const U=5e3;function F(){const[t,n]=o.useState(null),[_,u]=o.useState([]),[c,y]=o.useState(!0),h=o.useRef(null),g=o.useRef(null),r=o.useCallback(async()=>{try{const p=await T.get("/sync/status");n(p)}catch{}},[]),m=o.useCallback(async()=>{try{const p=await T.get("/sync/history",{limit:"30"});u(p.entries??[])}catch{u([])}},[]),d=o.useCallback(async()=>{await Promise.all([r(),m()]),y(!1)},[r,m]),b=o.useCallback(()=>{d()},[d]),a=o.useCallback(async()=>{await T.post("/api/dashboard/sync/history/clear"),u([]),r()},[r]);return o.useEffect(()=>(d(),g.current=setInterval(d,U),()=>{g.current&&clearInterval(g.current)}),[d]),o.useEffect(()=>{const p=new R;h.current=p,p.connect();const v=p.on("sync",()=>{r(),m()});return()=>{v(),p.disconnect(),h.current=null}},[r,m]),{status:t,history:_,loading:c,refresh:b,clearHistory:a}}function W({icon:t,title:n,description:_,benefits:u,upgradeLabel:c,upgradeHref:y}){const{t:h}=I(),[g,r]=o.useState(!1),{trackEvent:m}=L(),{pathname:d}=k(),b=d.replace(/^\//,"").split("/")[0]||"overview";return e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:l.panel,children:[t&&e.jsx("div",{className:l.panelIcon,children:t}),e.jsx("div",{className:l.panelTitle,children:n}),e.jsx("div",{className:l.panelDesc,children:_}),e.jsx("ul",{className:l.benefitList,children:u.map(a=>e.jsx("li",{className:l.benefitItem,children:a},a))}),e.jsx("div",{className:l.panelDiscountWrap,children:e.jsx(B,{variant:"centered"})}),e.jsxs("div",{className:l.actions,children:[e.jsx("button",{className:`${l.btn} ${l.btnOutline}`,onClick:()=>{m("dashboard_tier_toggle",{page:b}),r(!0)},children:h("tier.compare","Basic vs Pro")}),e.jsx("a",{className:`${l.btn} ${l.btnPrimary}`,href:y,target:"_blank",rel:"noreferrer",onClick:()=>m("dashboard_upgrade_click",{page:b}),children:c})]})]}),g&&e.jsx(D,{onClose:()=>r(!1)})]})}const q="_page_1warw_2",G="_card_1warw_10",z="_cardHeader_1warw_17",V="_clearButton_1warw_29",X="_statusRow_1warw_39",Y="_metaItem_1warw_46",J="_statusGrid_1warw_52",Q="_table_1warw_71",Z="_directionRail_1warw_99",K="_endpointLabel_1warw_105",ee="_optionRail_1warw_109",te="_directionOption_1warw_115",se="_directionOptionActive_1warw_129",ae="_directionOptionInactive_1warw_133",ne="_direction_forward_1warw_139",ie="_direction_bidirectional_1warw_143",oe="_direction_reverse_1warw_147",ce="_lockBadge_1warw_152",re="_proBadge_1warw_160",le="_forwardBadge_1warw_174",de="_logContainer_1warw_187",pe="_logEntry_1warw_194",ue="_logTime_1warw_206",ye="_logType_1warw_212",he="_logTypeWrite_1warw_221",me="_logTypeUpdate_1warw_225",ge="_logTypeDelete_1warw_229",we="_logTypeIdle_1warw_233",_e="_logPath_1warw_237",fe="_logEmpty_1warw_244",xe="_overlay_1warw_251",be="_overlayTitle_1warw_261",je="_overlayMessage_1warw_268",ve="_checklist_1warw_274",Te="_checkItem_1warw_284",Ne="_upgradePanel_1warw_300",Ce="_upgradePanelHeader_1warw_307",Ie="_benefitList_1warw_315",Se="_benefitItem_1warw_324",Re="_upgradeActions_1warw_339",Le="_btn_1warw_344",ke="_btnPrimary_1warw_361",Pe="_disabled_1warw_372",s={page:q,card:G,cardHeader:z,clearButton:V,statusRow:X,metaItem:Y,statusGrid:J,table:Q,directionRail:Z,endpointLabel:K,optionRail:ee,directionOption:te,directionOptionActive:se,directionOptionInactive:ae,direction_forward:ne,direction_bidirectional:ie,direction_reverse:oe,lockBadge:ce,proBadge:re,forwardBadge:le,logContainer:de,logEntry:pe,logTime:ue,logType:ye,logTypeWrite:he,logTypeUpdate:me,logTypeDelete:ge,logTypeIdle:we,logPath:_e,logEmpty:fe,overlay:xe,overlayTitle:be,overlayMessage:je,checklist:ve,checkItem:Te,upgradePanel:Ne,upgradePanelHeader:Ce,benefitList:Ie,benefitItem:Se,upgradeActions:Re,btn:Le,btnPrimary:ke,disabled:Pe},Oe=[{key:"forward",symbol:"←"},{key:"bidirectional",symbol:"↔"},{key:"reverse",symbol:"→"}];function Ee(t){const n=new Date(t);return`${String(n.getHours()).padStart(2,"0")}:${String(n.getMinutes()).padStart(2,"0")}`}function $e(t){switch(t){case"write":return s.logTypeWrite;case"update":return s.logTypeUpdate;case"delete":return s.logTypeDelete;default:return s.logTypeIdle}}function Ae(t){switch(t){case"syncing":return"syncing";case"initializing":return"initializing";case"idle":return"idle";default:return"offline"}}function Be(t,n,_,u){const c=t(`sync.directions.cat.${n}`,n.charAt(0).toUpperCase()+n.slice(1)),y=t("sync.directions.endpoint.local","Local"),h=t("sync.directions.endpoint.studio","Studio");switch(_){case"forward":return[`${c}: ${y} <- ${h}`,t("sync.directions.tooltip.forward.body","Studio changes sync to local files only")].join(`
2
- `);case"bidirectional":return[`${c}: ${y} <-> ${h}`,t("sync.directions.tooltip.bidirectional.body","Two-way sync between Local and Studio"),u?t("sync.directions.tooltip.proRequired","Pro required in Basic tier"):""].filter(Boolean).join(`
3
- `);case"reverse":return[`${c}: ${y} -> ${h}`,t("sync.directions.tooltip.reverse.body","Push local file changes to Studio"),u?t("sync.directions.tooltip.proRequired","Pro required in Basic tier"):""].filter(Boolean).join(`
4
- `);default:return c}}const De=["scripts","values","containers","data","services"];function He(t,n){return n==="manual"?t("sync.directions.mode.manual","Manual"):n==="auto"?t("sync.directions.mode.auto","Auto"):"-"}function Me(t,n){return n==="manual"?t("sync.directions.mode.manual.tooltip","Applies sync changes only when you trigger them manually."):n==="auto"?t("sync.directions.mode.auto.tooltip","Applies sync changes automatically when updates arrive."):""}function Ue(t,n){switch(n){case"write":return t("sync.log.type.write","WRITE");case"update":return t("sync.log.type.update","UPDATE");case"delete":return t("sync.log.type.delete","DELETE");default:return t("sync.log.type.idle","IDLE")}}function Fe(t,n){switch(n){case"write":return t("sync.log.type.write.tooltip","A new sync output was written to disk.");case"update":return t("sync.log.type.update.tooltip","An existing synced file or instance was updated.");case"delete":return t("sync.log.type.delete.tooltip","A synced file or instance was removed.");default:return t("sync.log.type.idle.tooltip","A sync event was recorded without a file mutation.")}}function Ye(){const{t}=I(),{level:n}=P(),{tier:_,loading:u}=H(),c=F(),{show:y}=O(),[h,g]=o.useState(!1),[r,m]=o.useState(!1),d=!u&&_==="basic";if(n==="disconnected"||n==="serverOnly")return e.jsx("div",{className:s.page,children:e.jsx("div",{className:s.card,children:e.jsxs("div",{className:s.overlay,children:[e.jsx("div",{className:s.overlayTitle,children:t("sync.overlay.title","Roblox Studio plugin required")}),e.jsx("div",{className:s.overlayMessage,children:t("sync.overlay.message","Sync status will be available once the Roblox Studio plugin connects.")}),e.jsxs("ul",{className:s.checklist,children:[e.jsx("li",{className:s.checkItem,children:t("sync.overlay.check1","Is Roblox Studio running?")}),e.jsx("li",{className:s.checkItem,children:t("sync.overlay.check2","Is the WROX Plugin installed?")}),e.jsx("li",{className:s.checkItem,children:t("sync.overlay.check3","Are HTTP Requests enabled in Studio settings?")})]})]})})});const a=c.status,p=c.history,v=Ae(a==null?void 0:a.state),S=async()=>{m(!0);try{await c.clearHistory(),y(t("toast.clearSuccess","Cleared successfully"),"success"),g(!1)}catch{y(t("toast.clearFailed","Failed to clear data"),"error")}finally{m(!1)}};return e.jsxs("div",{className:s.page,children:[e.jsxs("div",{className:s.card,children:[e.jsxs("div",{className:s.cardHeader,children:[e.jsx(f,{text:t("sync.status.title.tooltip","Current Studio and local file sync status for this place."),children:t("sync.status.title","Sync Status")}),d&&e.jsx(f,{text:t("sync.status.forwardOnly.tooltip","Basic tier allows Studio to local forward sync only."),children:e.jsx("span",{className:s.forwardBadge,children:t("sync.status.forwardOnly","Forward Only")})})]}),e.jsxs("div",{className:s.statusRow,children:[e.jsx(A,{status:v}),(a==null?void 0:a.placeName)&&e.jsxs("span",{className:s.metaItem,children:[e.jsx(w,{label:t("sync.status.place","Place"),tooltip:t("sync.status.place.tooltip","Connected Roblox place name and place ID.")}),": ",a.placeName,a.placeId?` (${a.placeId})`:""]})]}),e.jsxs("dl",{className:s.statusGrid,children:[(a==null?void 0:a.syncRoot)&&e.jsxs(e.Fragment,{children:[e.jsx("dt",{children:e.jsx(w,{label:t("sync.status.path","Path"),tooltip:t("sync.status.path.tooltip","Local filesystem root currently used for sync output.")})}),e.jsx("dd",{children:a.syncRoot})]}),(a==null?void 0:a.instanceCount)!=null&&e.jsxs(e.Fragment,{children:[e.jsx("dt",{children:e.jsx(w,{label:t("sync.status.instances","Instances"),tooltip:t("sync.status.instances.tooltip","Total synced Roblox instances tracked in the local mirror.")})}),e.jsx("dd",{children:a.instanceCount})]}),(a==null?void 0:a.scriptCount)!=null&&e.jsxs(e.Fragment,{children:[e.jsx("dt",{children:e.jsx(w,{label:t("sync.status.scripts","Scripts"),tooltip:t("sync.status.scripts.tooltip","Total synced script files currently indexed for this place.")})}),e.jsx("dd",{children:a.scriptCount})]}),(a==null?void 0:a.state)==="syncing"&&e.jsxs(e.Fragment,{children:[e.jsx("dt",{children:e.jsx(w,{label:t("sync.status.state","State"),tooltip:t("sync.status.state.tooltip","Current runtime sync state reported by the server.")})}),e.jsx("dd",{children:t("status.syncing","Syncing")})]})]})]}),(a==null?void 0:a.directions)&&e.jsxs("div",{className:s.card,children:[e.jsx("div",{className:s.cardHeader,children:e.jsx(f,{text:t("sync.directions.title.tooltip","Per-category sync direction and apply behavior between Local and Studio."),children:t("sync.directions.title","Sync Directions")})}),e.jsxs("table",{className:s.table,children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{children:e.jsx(w,{label:t("sync.directions.type","Type"),tooltip:t("sync.directions.type.tooltip","Sync category affected by this rule.")})}),e.jsx("th",{children:e.jsx(w,{label:t("sync.directions.direction","Direction"),tooltip:t("sync.directions.direction.tooltip","Whether each category syncs from Studio, to Studio, or both ways.")})}),e.jsx("th",{children:e.jsx(w,{label:t("sync.directions.applyMode","Apply Mode"),tooltip:t("sync.directions.applyMode.tooltip","How incoming sync changes are applied for this category.")})})]})}),e.jsx("tbody",{children:De.map(i=>{var C;const j=a.directions[i],N=(C=a.applyModes)==null?void 0:C[i];return e.jsxs("tr",{children:[e.jsx("td",{children:t(`sync.directions.cat.${i}`,i.charAt(0).toUpperCase()+i.slice(1))}),e.jsx("td",{children:e.jsxs("div",{className:s.directionRail,"aria-label":`${i}-direction-rail`,children:[e.jsx(f,{text:t("sync.directions.endpoint.local.tooltip","Local files on disk are always shown on the left side of the direction rail."),children:e.jsx("span",{className:s.endpointLabel,children:t("sync.directions.endpoint.local","Local")})}),e.jsx("span",{className:s.optionRail,children:Oe.map(x=>e.jsx(E,{text:Be(t,i,x.key,d),children:e.jsx("span",{className:`${s.directionOption} ${j===x.key?s.directionOptionActive:s.directionOptionInactive} ${s[`direction_${x.key}`]??""}`,"data-active":j===x.key?"true":"false",children:x.symbol})},x.key))}),e.jsx(f,{text:t("sync.directions.endpoint.studio.tooltip","Roblox Studio is always shown on the right side of the direction rail."),children:e.jsx("span",{className:s.endpointLabel,children:t("sync.directions.endpoint.studio","Studio")})})]})}),e.jsx("td",{children:e.jsx(f,{text:Me(t,N),children:He(t,N)})})]},i)})})]})]}),e.jsxs("div",{className:s.card,children:[e.jsxs("div",{className:s.cardHeader,children:[e.jsx("span",{children:t("sync.log.title","Sync Log")}),e.jsx("button",{className:s.clearButton,onClick:()=>g(!0),children:t("common.clear","Clear")})]}),e.jsx("div",{className:s.logContainer,children:p.length===0?e.jsx("div",{className:s.logEmpty,children:t("sync.log.empty","No sync events yet")}):p.map((i,j)=>e.jsxs("div",{className:s.logEntry,children:[e.jsx("span",{className:s.logTime,children:Ee(i.timestamp)}),e.jsx(f,{text:Fe(t,i.type),children:e.jsx("span",{className:`${s.logType} ${$e(i.type)}`,children:Ue(t,i.type)})}),e.jsxs("span",{className:s.logPath,children:[i.path,i.details?` — ${i.details}`:""]})]},j))})]}),d&&e.jsx(W,{title:t("sync.upgrade.title","Unlock Full Sync with Pro"),description:t("tier.banner.save","Save AI tokens with Pro!"),benefits:[t("sync.upgrade.benefit1","Bidirectional sync — edit files, auto-apply to Studio"),t("sync.upgrade.benefit2","Reverse sync — push file changes back to Studio"),t("sync.upgrade.benefit3","Full sync history and detailed change log")],upgradeLabel:t("sync.upgrade.buy","Upgrade to Pro"),upgradeHref:M.sync}),e.jsx($,{open:h,title:t("sync.clear.title","Clear sync log?"),message:t("sync.clear.message","This permanently removes the stored sync log for the current place."),cancelLabel:t("common.cancel","Cancel"),confirmLabel:t("common.clear","Clear"),loading:r,onCancel:()=>!r&&g(!1),onConfirm:S})]})}export{Ye as Component};